diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..8c8b239 --- /dev/null +++ b/.gitignore @@ -0,0 +1,77 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variables file +.env + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# next.js build output +.next + +# nuxt.js build output +.nuxt + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless + +# FuseBox cache +.fusebox/ + diff --git a/index.js b/index.js new file mode 100644 index 0000000..baaacb5 --- /dev/null +++ b/index.js @@ -0,0 +1,8 @@ +var Cloudevent = require('./lib/cloudevent.js'); +//var Spec_0_1 = require('./lib/spec_0_1.js'); +//var Spec_0_2 = require('./lib/spec_0_2.js'); + +module.exports = Cloudevent; +//module.exports.Spec_0_1 = Spec_0_1; +//module.exports.Spec_0_2 = Spec_0_2; + diff --git a/lib/cloudevent.js b/lib/cloudevent.js new file mode 100644 index 0000000..d7214d2 --- /dev/null +++ b/lib/cloudevent.js @@ -0,0 +1,57 @@ +var Spec_0_1 = require('./specs/spec_0_1.js'); +var Spec_0_2 = require('./specs/spec_0_2.js'); +var JSONFormatter_0_1 = require('./formats/json_0_1.js'); + +/* + * Class created using the Builder Design Pattern. + * + * https://en.wikipedia.org/wiki/Builder_pattern + */ +function Cloudevent(_spec, _formatter){ + this.spec = (_spec) ? new _spec(Cloudevent) : new Spec_0_1(Cloudevent); + this.formatter = (_formatter) ? _formatter : new JSONFormatter_0_1(); +} + +/* + * To format the payload using the formatter + */ +Cloudevent.prototype.format = function(){ + // Check the constraints + this.spec.check(); + + // Then, format + return this.formatter.format(this.spec.payload); +} + +Cloudevent.prototype.toString = function(){ + return this.formatter.toString(this.spec.payload); +} + +Cloudevent.prototype.type = function(type){ + this.spec.type(type); + return this; +} + +Cloudevent.prototype.source = function(_source){ + this.spec.source(_source); + return this; +} + +/* + * Export the specs + */ +Cloudevent.specs = { + '0.1': Spec_0_1, + '0.2': Spec_0_2 +}; + +/* + * Export the formats + */ +Cloudevent.formats = { + 'json' : JSONFormatter_0_1, + 'json0.1': JSONFormatter_0_1 +}; + +module.exports = Cloudevent; + diff --git a/lib/formats/json_0_1.js b/lib/formats/json_0_1.js new file mode 100644 index 0000000..7f0ca46 --- /dev/null +++ b/lib/formats/json_0_1.js @@ -0,0 +1,14 @@ + +function JSONFormatter(){ + +} + +JSONFormatter.prototype.format = function(payload){ + return payload; +} + +JSONFormatter.prototype.toString = function(payload){ + return JSON.stringify(payload); +} + +module.exports = JSONFormatter; diff --git a/lib/specs/spec_0_1.js b/lib/specs/spec_0_1.js new file mode 100644 index 0000000..3d87770 --- /dev/null +++ b/lib/specs/spec_0_1.js @@ -0,0 +1,52 @@ +var uuid = require('uuid/v4'); + +function Spec_0_1(_caller){ + this.payload = { + cloudEventsVersion: '0.1', + eventID: uuid() + }; + + /* + * Used to inject backward compatibility functions or attributes. + */ + this.caller = _caller; + + /* + * Inject the method to set the version related to data attribute. + */ + this.caller.prototype.eventTypeVersion = function(_version){ + this.spec.eventTypeVersion(_version); + } +} + +/* + * Check the constraints. + * + * throw an error if do not pass. + */ +Spec_0_1.prototype.check = function() { + +} + +Spec_0_1.prototype.type = function(_type){ + this.payload['eventType'] = _type; + return this; +} + +Spec_0_1.prototype.eventTypeVersion = function(version){ + this.payload['eventTypeVersion'] = version; + return this; +} + +Spec_0_1.prototype.source = function(_source){ + this.payload['source'] = _source; + return this; +} + +Spec_0_1.prototype.id = function(_id){ + this.payload['eventID'] = _id; + return this; +} + +module.exports = Spec_0_1; + diff --git a/lib/specs/spec_0_2.js b/lib/specs/spec_0_2.js new file mode 100644 index 0000000..01b53a8 --- /dev/null +++ b/lib/specs/spec_0_2.js @@ -0,0 +1,33 @@ +var uuid = require('uuid/v4'); + +function Spec_0_2(){ + this.payload = { + specversion: '0.2', + id: uuid() + }; +} + +/* + * Check the spec constraints. + */ +Spec_0_2.prototype.check = function(){ + +} + +Spec_0_2.prototype.type = function(_type){ + this.payload['type'] = _type; + return this; +} + +Spec_0_2.prototype.source = function(_source){ + this.payload['source'] = _source; + return this; +} + +Spec_0_2.prototype.id = function(_id){ + this.payload['id'] = _id; + return this; +} + +module.exports = Spec_0_2; + diff --git a/package.json b/package.json new file mode 100644 index 0000000..93c5621 --- /dev/null +++ b/package.json @@ -0,0 +1,36 @@ +{ + "name": "cloudevents", + "version": "0.0.1", + "description": "CloudEvents SDK for JavaScript", + "main": "index.js", + "scripts": { + "test": "./node_modules/.bin/mocha -C test/*.js" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/cloudevents/sdk-javascript.git" + }, + "keywords": [ + "events", + "cloudevents", + "sdk" + ], + "author": "cloudevents.io", + "contributors": { + "name": "Fábio José de Moraes", + "email": "fabiojose@gmail.com", + "url": "https://github.com/fabiojose" + }, + "license": "Apache-2.0", + "bugs": { + "url": "https://github.com/cloudevents/sdk-javascript/issues" + }, + "homepage": "https://github.com/cloudevents/sdk-javascript#readme", + "dependencies": { + "uuid": "3.3.2" + }, + "devDependencies": { + "chai": "4.2.0", + "mocha": "5.2.0" + } +} diff --git a/test/cloudevent_spec_0_1.js b/test/cloudevent_spec_0_1.js new file mode 100644 index 0000000..af391bf --- /dev/null +++ b/test/cloudevent_spec_0_1.js @@ -0,0 +1,39 @@ +var expect = require("chai").expect; +var Cloudevent = require("../index.js"); + +var cloudevent = new Cloudevent() + .type("com.github.pull.create") + .source("urn:event:from:myapi/resourse/123"); + +describe("CloudEvents Spec 0.1 - JavaScript SDK", () => { + + describe("JSON Format", () => { + + describe("Required context attributes", () => { + it("requires 'eventType'", () => { + expect(cloudevent.format()).to.have.property('eventType'); + }); + + it("requires 'cloudEventsVersion'", () => { + expect(cloudevent.format()).to.have.property('cloudEventsVersion'); + }); + + it("requires 'source'", () => { + expect(cloudevent.format()).to.have.property('source'); + }); + + it("requires 'eventID'", () => { + expect(cloudevent.format()).to.have.property('eventID'); + }); + }); + + describe("Backward compatibility", () => { + it("should have 'eventTypeVersion'", () => { + cloudevent.eventTypeVersion("1.0"); + expect(cloudevent.format()).to.have.property('eventTypeVersion'); + }); + }); + + }); + +}); diff --git a/test/cloudevent_spec_0_2.js b/test/cloudevent_spec_0_2.js new file mode 100644 index 0000000..a94faa1 --- /dev/null +++ b/test/cloudevent_spec_0_2.js @@ -0,0 +1,32 @@ +var expect = require("chai").expect; +var Cloudevent = require("../index.js"); + +var cloudevent = new Cloudevent(Cloudevent.specs['0.2']) + .type("com.github.pull.create") + .source("urn:event:from:myapi/resourse/123"); + +describe("CloudEvents Spec 0.2 - JavaScript SDK", () => { + + describe("JSON Format", () => { + + describe("Required context attributes", () => { + it("requires 'type'", () => { + expect(cloudevent.format()).to.have.property('type'); + }); + + it("requires 'specversion'", () => { + expect(cloudevent.format()).to.have.property('specversion'); + }); + + it("requires 'source'", () => { + expect(cloudevent.format()).to.have.property('source'); + }); + + it("requires 'id'", () => { + expect(cloudevent.format()).to.have.property('id'); + }); + }); + + }); + +});