JavaScript/TypeScript SDK for CloudEvents
Go to file
Lance Ball 3a063d7245
fix: support mTLS in 1.0 Binary and Structured emitters
This commit modifies both of the 1.0 emitters so that they may
accept typed objects as a part of the configuration. When using
mTLS in Node, you need to provide an `Agent` to the underlying
HTTP handler. In this case, Axios will pass this object along to
Node.js when it is provided.

Fixes: https://github.com/cloudevents/sdk-javascript/issues/48

Signed-off-by: Lance Ball <lball@redhat.com>
2020-04-08 16:13:57 -04:00
examples Set the version of sdk to 1.0.0 2019-11-06 11:22:04 -03:00
ext Json schema for spec v1 2019-10-29 08:55:42 -03:00
http/unmarshaller Export of http unmarshaller 0.2 2019-06-20 21:45:49 -03:00
lib fix: support mTLS in 1.0 Binary and Structured emitters 2020-04-08 16:13:57 -04:00
test fix: support mTLS in 1.0 Binary and Structured emitters 2020-04-08 16:13:57 -04:00
v1 fix: support mTLS in 1.0 Binary and Structured emitters 2020-04-08 16:13:57 -04:00
v02 Fix the unmarshaller import 2019-08-05 15:10:29 -03:00
v03 Exporting the HTTPUnmarshaller 2019-08-05 09:22:15 -03:00
.gitignore Ignore package-lock 2019-10-29 20:49:43 -03:00
.npmignore Igore files for npm publish 2019-06-16 20:53:55 -03:00
.travis.yml Fixing the coverage issue when PR 2019-06-26 12:49:29 -03:00
CHANGELOG.md Document the removal of Unmarshallers 2019-11-06 10:50:04 -03:00
CONTRIBUTING.md Add changelog too 2019-08-22 09:14:09 -03:00
LICENSE Initial commit 2018-09-20 15:54:57 -04:00
OLDOCS.md Old examples of old spevs 2019-11-06 10:49:35 -03:00
README.md add helpful text to README 2020-01-28 18:53:23 +00:00
index.js double quotes 2018-12-15 11:19:48 -02:00
package.json Set version to 1.0.0 2019-11-06 11:36:09 -03:00

README.md

licence Codacy Badge Codacy Badge Build Status downloads npm version dependencies vulnerabilities

sdk-javascript

Official CloudEvents' SDK for JavaScript.

CloudEvents logo

Status

This SDK is still considered a work in progress, therefore things might (and will) break with every update.

This SDK current supports the following versions of CloudEvents:

  • v1.0

Checkout the changelog to see what's going on!

Contributing

Before create an awesome PR, please read our guidelines.

Examples

To see working examples, point to examples.

📰 Newsletter 📰

all the API developed before, for 0.1, 0.2 and 0.3, works as the same.

Checkout the new expressive additions.

Use typed CloudEvents in your Typescript project

There is full example: typescript-ex

import Cloudevent, {
  event,
  StructuredHTTPEmitter,
  BinaryHTTPEmitter,

  StructuredHTTPReceiver,
  BinaryHTTPReceiver
} from 'cloudevents-sdk/v1';

let myevent: Cloudevent = event()
  .source('/source')
  .type('type')
  .dataContentType('text/plain')
  .dataschema('http://d.schema.com/my.json')
  .subject('cha.json')
  .data('my-data')
  .addExtension("my-ext", "0x600");

// . . .

Versioning

Before Spec reaches 1.0

  • 0.x.p: where x relates to spec version and p relates to fixes, releases and breaking changes

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 v0.3 v1.0
CloudEvents yes yes yes yes
HTTP Transport Binding - Structured yes yes yes yes
HTTP Transport Binding - Binary yes yes yes yes
JSON Event Format yes yes yes yes

What we can do

What v0.1 v0.2 v0.3 v1.0
Create events yes yes yes yes
Emit Structured events over HTTP yes yes yes yes
Emit Binary events over HTTP yes yes yes yes
JSON Event Format yes yes yes yes
Receive Structured events over HTTP no yes yes yes
Receive Binary events over HTTP no yes yes yes

How to use

If you want old examples, they are here

Usage

const v1 = require("cloudevents-sdk/v1");

/*
 * Creating an event
 */
let myevent = v1.event()
  .type("com.github.pull.create")
  .source("urn:event:from:myapi/resourse/123");

Formatting

const v1 = require("cloudevents-sdk/v1");

/*
 * Creating an event
 */
let myevent = v1.event()
  .type("com.github.pull.create")
  .source("urn:event:from:myapi/resourse/123");

/*
 * Format the payload and return it
 */
let formatted = myevent.format();

Emitting

const v1 = require("cloudevents-sdk/v1");

/*
 * Creating an event
 */
let myevent = v1.event()
  .type("com.github.pull.create")
  .source("urn:event:from:myapi/resourse/123");

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

// The binding instance
let binding = new v1.StructuredHTTPEmitter(config);

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

  }).catch(err => {
    // Deal with errors
    console.error(err);
  });

Receiving Events

You can choose any framework for port binding. But, use the StructuredHTTPReceiver or BinaryHTTPReceiver to process the HTTP Payload and HTTP Headers, extracting the CloudEvents.

😃 Checkout the full working example: here.

// some parts were removed //

const v1 = require("cloudevents-sdk/v1");

const receiver = new v1.StructuredHTTPReceiver();

// some parts were removed //

app.post("/", (req, res) => {
  try {
    let myevent = receiver.parse(req.body, req.headers);

    // TODO use the event

    res.status(201).send("Event Accepted");

  } catch(err) {
    // TODO deal with errors
    console.error(err);
    res.status(415)
          .header("Content-Type", "application/json")
          .send(JSON.stringify(err));
  }
});

Repository Structure

├── index.js
├── ext
├── lib
│   ├── bindings
│   │   └── http
│   ├── cloudevent.js
│   ├── formats
│   │   └── json
│   └── specs
├── LICENSE
├── package.json
├── README.md
  • index.js: library exports
  • ext: external stuff, e.g, Cloud Events JSONSchema
  • 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/formats/: 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(Object)

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

Parser classes

Every Parser class must implement these methods to work properly.

/*
 * The default constructor with Parser as decorator
 */
Parser(Parser)

/*
 * Try to parse the payload to some event format
 */
Object Parser.parse(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.
 * @throws Error when it is an invalid event
 */
Spec.check()

/*
 * Checks if the argument pass through the spec constraints
 * @throws Error when it is an invalid event
 */
Spec.check(Object)

Binding classes

Every Binding class must implement these methods to work properly.

Emitter Binding

Following we have the signature for the binding to emit Cloudevents.

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

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

Receiver Binding

Following we have the signature for the binding to receive Cloudevents.

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

/*
 * Checks if some Object and a Map of headers
 * follows the binding definition, throwing an error if did not follow
 */
Receiver.check(Object, Map)

/*
 * Checks and parse as Cloudevent
 */
Cloudevent Receiver.parse(Object, Map)

See how to implement the method injection here

Learn about Builder Design Pattern

Check out the produced event payload using this tool

Community

  • There are bi-weekly calls immediately following the Serverless/CloudEvents call at 9am PT (US Pacific). Which means they will typically start at 10am PT, but if the other call ends early then the SDK call will start early as well. See the CloudEvents meeting minutes to determine which week will have the call.
  • Slack: #cloudeventssdk channel under CNCF's Slack workspace.
  • Contact for additional information: Fabio José (@fabiojose on slack).