Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/trieloff/universal-serverless
https://github.com/trieloff/universal-serverless
Last synced: 27 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/trieloff/universal-serverless
- Owner: trieloff
- License: apache-2.0
- Created: 2020-11-17T12:57:02.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2020-11-24T18:18:53.000Z (almost 4 years ago)
- Last Synced: 2024-10-07T17:50:35.835Z (about 1 month ago)
- Language: JavaScript
- Size: 51.8 KB
- Stars: 0
- Watchers: 3
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Universal Serverless Experiment
> Is write once, run everywhere possible for serverless computing?
This experiment tries to do two things:
1. create a package that can be deployed to as many serverless platforms as possible
2. provide adapter code so that all serverless platforms can execute one single, platform-agnostic functionWith following limitations:
- Assumes that the runtime is node.js (version 10+)
- The only supported trigger is HTTP
- None of the outbound platform APIs will be abstractedCompared to other approaches like [Serverless `@multicloud`](https://github.com/serverless/multicloud) this project:
- does not require any code changes to adapt code from one runtime to another
- does not depend on a framework## Try it
```bash
$ curl https://serverless.project-helix.dev/hello
```You will get the same function results, from a randomly selected runtime.
## Supported Runtimes
- Apache OpenWhisk
- AWS Lambda
- Azure Functions
- Google Cloud Functions## API
```javascript
// we use the fetch API, and node-fetch is a good approximation
const { Response } = require("node-fetch");module.exports.main = async function(request, context) {
let body = "hello world!\n\n";
try {
body += JSON.stringify(context, null, " ");
} catch {
body += context.toString();
}
body += "\n" + request.url;
body += "\n" + request.method;
body += "\n" + request.headers.get('user-agent');
body += "\n" + await request.text();
return new Response(body, {
status: 201,
headers: {
'Content-Type': 'text/plain',
'X-Generator': 'hello world'
}
});
}
```### `request`
Is a [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object.
### `context`
Is an object with following properties:
- `runtime.name`: name of the runtime, e.g. `aws-lambda`
- `runtime.region`: where the function is executed, e.g. `us-east1` – the names are not consistent across runtimes
- `func.name`: name of the function, e.g. `hello`
- `func.version`: version of the function, e.g. `0.0.53` – the versioning schemes are not consistent across runtimes
- `func.app`: name of the application, project, namespace, or other container of the function
- `invocation.id`: a request ID as generated by the runtime. Formats differ dramatically
- `invocation.deadline`: timestamp (milliseconds till epoch) when the runtime will terminate the execution and time out. Not available for Azure
- `env`: environment variables and other runtime-managed parameters (e.g. default parameters in OpenWhisk)### `return`
Return something that looks like a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Request) object.
We honor: `status`, `headers`, `body`# Known Limitations
- no unit or integration tests, no CI
# Next Steps
- A service that deploys function from a zip file
# Developing
```bash
# create a zip file
$ sh build.sh# deploy it everywhere
$ sh deploy.sh# fetch the results
$ sh test.sh
```