@ibm-functions/composer
Composer is a new programming model from IBM
Research for composing IBM Cloud
Functions, built on Apache
OpenWhisk. With Composer,
developers can build even more serverless applications including using it for
IoT, with workflow orchestration, conversation services, and devops automation,
to name a few examples.
Programming compositions for IBM Cloud Functions is supported by a new developer
tool called IBM Cloud Shell, or just
Shell. Shell offers a CLI and graphical interface for fast, incremental,
iterative, and local development of serverless applications. While we recommend
using Shell, Shell is not required to work with compositions. Compositions may
be managed using a combination of the Composer compose shell
script (for deployment) and the OpenWhisk
CLI (for configuration,
invocation, and life-cycle management).
In contrast to earlier releases of Composer, a REDIS server is not required to
run compositions. Composer now synthesizes OpenWhisk conductor
actions
to implement compositions. Compositions have all the attributes and capabilities
of an action (e.g., default parameters, limits, blocking invocation, web
export).
This repository includes:
Composer and Shell are currently available as IBM Research previews. As
Composer and Shell continue to evolve, it may be necessary to redeploy existing
compositions to take advantage of new capabilities. However existing
compositions should continue to run fine without redeployment.
Installation
To install the composer
module use the Node Package Manager:
npm -g install @ibm-functions/composer
We recommend to install the module globally (with -g
option) so the compose
command is added to the path. Otherwise, it can be found in the bin
folder of
the module installation.
Example
A composition is typically defined by means of a Javascript file as illustrated
in samples/demo.js:
composer.if(
composer.action('authenticate', { action: function main({ password }) { return { value: password === 'abc123' } } }),
composer.action('success', { action: function main() { return { message: 'success' } } }),
composer.action('failure', { action: function main() { return { message: 'failure' } } }))
Composer offers traditional control-flow concepts as methods. These methods
are called combinators. This example composition composes three actions named
authenticate
, success
, and failure
using the composer.if
combinator,
which implements the usual conditional construct. It take three actions (or
compositions) as parameters. It invokes the first one and, depending on the
result of this invocation, invokes either the second or third action.
This composition includes the definitions of the three composed actions. If the
actions are defined and deployed elsewhere, the composition code can be shorten
to:
composer.if('authenticate', 'success', 'failure')
To deploy this composition use the compose
command:
compose demo.js --deploy demo
The compose
command synthesizes and deploy an action named demo
that
implements the composition. It also deploys the composed actions if definitions
are provided for them.
The demo
composition may be invoked like any action, for instance using the
OpenWhisk CLI:
wsk action invoke demo -r -p password passw0rd
{
"message": "failure"
}
Getting started
Videos
Blog posts
Contributions
We are looking forward to your feedback and criticism. We encourage you to join
us on slack. File bugs and we will squash them.
We welcome contributions to Composer and Shell. See
CONTRIBUTING.md.