JavaScript/TypeScript SDK for CloudEvents
Go to file
Fabio José a770b19922 Merge branch 'develop' 2019-05-24 09:38:00 -03:00
ext Add schemaurl def 2019-01-21 09:11:26 -02:00
lib Merge branch 'develop' 2019-05-24 09:21:15 -03:00
test Merge branch 'develop' 2019-05-24 09:21:15 -03:00
.gitignore Ignore .swp vim files 2019-01-19 23:45:27 -02:00
.travis.yml Add coverage again 2019-05-24 09:23:00 -03:00
LICENSE Initial commit 2018-09-20 15:54:57 -04:00
README.md Just 'fixes' word 2019-05-24 09:34:39 -03:00
index.js double quotes 2018-12-15 11:19:48 -02:00
package.json Set version to 0.2.1 2019-05-24 09:37:43 -03:00

README.md

Codacy Badge Codacy Badge Build Status

sdk-javascript

Official CloudEvents' SDK for JavaScript.

CloudEvents logo

Versioning

Before Spec reaches 1.0

  • 0.x.p: where x relates to spec version and p relates to fixes, see semver.

After Spec reaches 1.0__

  • x.M.p: where x relates to spec version, M relates to minor and p relates to fixes. See semver

Installation

This CloudEvents SDK requires nodejs 6.11+

Nodejs

npm install cloudevents-sdk

Specification Support

These are the supported specifications by this version.

Specifications v0.1 v0.2
CloudEvents yes yes
HTTP Transport Binding - Structured yes yes
HTTP Transport Binding - Binary yes yes
JSON Event Format yes yes

How to use

The Cloudevent constructor arguments.


/*
 * spec  : if is null, set the spec 0.1 impl
 * format: if is null, set the JSON Format 0.1 impl
 */
Cloudevent(spec, format);

Usage

var Cloudevent = require("cloudevents-sdk");

/*
 * Constructs a default instance with:
 *   - Spec 0.1
 *   - JSON Format 0.1
 */
var cloudevent01 = new Cloudevent();

/*
 * Implemented using Builder Design Pattern
 */
cloudevent01
  .type("com.github.pull.create")
  .source("urn:event:from:myapi/resourse/123");

/*
 * Backward compatibility to spec 0.1 by injecting methods from spec implementation 
 * to Cloudevent
 */
cloudevent01
 .eventTypeVersion("1.0");

/*
 * Constructs an instance with:
 *   - Spec 0.2
 *   - JSON Format 0.1
 */
var cloudevent02 = new Cloudevent(Cloudevent.specs["0.2"]);

/*
 * Different specs, but the same API.
 */
cloudevent02
  .type("com.github.pull.create")
  .source("urn:event:from:myapi/resourse/123");

Formatting

var Cloudevent = require("cloudevents-sdk");

/*
 * Creates an instance with default spec and format
 */
var cloudevent = 
  new Cloudevent()
        .type("com.github.pull.create")
        .source("urn:event:from:myapi/resourse/123");

/*
 * Format the payload and return it
 */
var formatted = cloudevent.format();

Emitting

var Cloudevent = require("cloudevents-sdk");

// The event
var cloudevent = new Cloudevent()
                       .type("com.github.pull.create")
                       .source("urn:event:from:myapi/resourse/123");

// The binding configuration using POST
var config = {
  method: "POST",
  url   : "https://myserver.com"
};

/*
 * To use HTTP Binary:
 *   Cloudevent.bindings["http-binary0.2"](config);
 */

// The binding instance
var binding = Cloudevent.bindings["http-structured0.1"](config);

// Emit the event using Promise
binding.emit(cloudevent)
  .then(response => {
    // Treat the response
    console.log(response.data);

  }).catch(err => {
    // Treat the error
    console.error(err);
  });

Repository Structure

├── index.js
├── lib
│   ├── bindings
│   │   └── http
│   ├── cloudevent.js
│   ├── format
│   └── specs
├── LICENSE
├── package.json
├── README.md
  • index.js: library exports
  • lib/bindings: every binding implementation goes here
  • lib/bindings/http: every http binding implementation goes here
  • lib/cloudevent.js: implementation of Cloudevent, an interface
  • lib/format/: every format implementation goes here
  • lib/specs/: every spec implementation goes here

Unit Testing

The unit test checks the result of formatted payload and the constraints.


npm test

The API

Cloudevent class


/*
 * Format the payload and return an Object.
 */
Object Cloudevent.format()

/*
 * Format the payload as String.
 */
String Cloudevent.toString()

Formatter classes

Every formatter class must implement these methods to work properly.


/*
 * Format the Cloudevent payload argument and return an Object.
 */
Object Formatter.format(payload)

/*
 * Format the Cloudevent payload as String.
 */
String Formatter.toString(payload)

Spec classes

Every Spec class must implement these methods to work properly.


/*
 * The constructor must receives the Cloudevent type.
 */
Spec(Cloudevent)

/*
 * Checks the spec constraints, throwing an error if do not pass.
 */
Spec.check()

Binding classes

Every Binding class must implement these methods to work properly.


/*
 * The constructor must receives the map of configurations.
 */
Binding(config)

/*
 * Emits the event using an instance of Cloudevent.
 */
Binding.emit(cloudevent)

See how to implement the method injection here

Learn about Builder Design Pattern

Check out the produced event payload using this tool