node package manager
Love JavaScript? Your insights can make it even better. Take the 2017 JavaScript Ecosystem Survey »

backstage-functions

Build Status Coverage Status

Backstage Functions

Backstage Functions is an Open Source Serverless Plataform able to store and execute JavaScript code.

Run local via Docker

Requirements

  • Docker 1.12+
  • Docker compose 1.8+

Download docker-compose.yml

mkdir functions
cd functions
curl 'https://raw.githubusercontent.com/backstage/functions/master/docker-compose.yml' > docker-compose.yml

Run

docker-compose up

Run local without Docker

Requirements

  • Redis 3.0+
  • NodeJS 6.6.0

Download the project

git clone https://github.com/backstage/functions.git
cd functions

Setup

make setup

Run

make run

How to use

Create function

function main(req, res) {
  const name = (req.body && req.body.name) || "World"
  res.send({ say: `Hello ${name}!` })
}

Send the function as curl to /functions/:namespace/:name

curl -i -XPUT http://localhost:8100/functions/example/hello-world \
    -H 'content-type: application/json' \
    -d '{"code":"function main(req, res) {\n  const name = (req.body && req.body.name) || \"World\"\n  res.send({ say: `Hello ${name}!` })\n}\n"}'

Run the function send a PUT request to /functions/:namespace/:name/run:

curl -i -H 'content-type: application/json' -XPUT http://localhost:8100/functions/example/hello-world/run

Results in something like:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 22
ETag: W/"16-soBGetwJPBLt8CqWpBQu+A"
Date: Tue, 11 Oct 2016 16:51:04 GMT
Connection: keep-alive
 
{"say":"Hello World!"}

If one pass an object at the request payload with name the payload is executed

curl -i -XPUT http://localhost:8100/functions/example/hello-world/run \
    -H 'content-type: application/json' \
    -d '{"name": "Pedro"}'

Results in something like:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8
Content-Length: 22
ETag: W/"16-Ino2/umXaZ3xVEhoqyS8aA"
Date: Tue, 11 Oct 2016 17:13:11 GMT
Connection: keep-alive
 
{"say":"Hello Pedro!"}