From f76782aeeb06c6336eea1cc80fa6895c8e47e3e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tam=C3=A1s=20Benke?= Date: Mon, 18 Jun 2018 12:00:13 +0200 Subject: [PATCH] Extend easer with the wsgw adapters (WebSocket server and WebSockets <-> NATS forwarding) --- dist/adapters/webServer/index.js | 2 +- dist/index.js | 12 +- dist/webServerCli.js | 45 ++++- dist/webServerCli.spec.js | 38 +++- package-lock.json | 326 ++++++++++++++++++++++++++++++- package.json | 2 + src/adapters/webServer/index.js | 2 +- src/index.js | 13 +- src/webServerCli.js | 40 +++- src/webServerCli.spec.js | 37 +++- 10 files changed, 492 insertions(+), 25 deletions(-) diff --git a/dist/adapters/webServer/index.js b/dist/adapters/webServer/index.js index 5f8625e..13d273d 100644 --- a/dist/adapters/webServer/index.js +++ b/dist/adapters/webServer/index.js @@ -102,7 +102,7 @@ var startup = function startup(container, next) { // Call next setup function with the context extension next(null, { webServer: { - server: server + server: httpInstance } }); }); diff --git a/dist/index.js b/dist/index.js index a387b74..ad1a32b 100644 --- a/dist/index.js +++ b/dist/index.js @@ -24,6 +24,8 @@ var _encpwd = require('./adapters/encpwd/'); var _encpwd2 = _interopRequireDefault(_encpwd); +var _npacWsgwAdapters = require('npac-wsgw-adapters'); + var _webServer = require('./adapters/webServer/'); var _webServer2 = _interopRequireDefault(_webServer); @@ -87,7 +89,7 @@ var startWebServer = exports.startWebServer = function startWebServer() { var cb = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; - var defaults = _lodash2.default.merge({}, _config2.default, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults); + var defaults = _lodash2.default.merge({}, _config2.default, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults, _npacWsgwAdapters.wsServer.defaults, _npacWsgwAdapters.wsPdmsGw.defaults); // Use CLI to gain additional parameters, and command to execute @@ -103,13 +105,13 @@ var startWebServer = exports.startWebServer = function startWebServer() { var appAdapters = []; var appTerminators = []; if (config.webServer.usePdms) { - appAdapters = [_npac2.default.mergeConfig(config), _npac2.default.addLogger, _npacPdmsHemeraAdapter2.default.startup, _webServer2.default.startup]; + appAdapters = [_npac2.default.mergeConfig(config), _npac2.default.addLogger, _npacPdmsHemeraAdapter2.default.startup, _webServer2.default.startup, _npacWsgwAdapters.wsServer.startup, _npacWsgwAdapters.wsPdmsGw.startup]; - appTerminators = [_webServer2.default.shutdown, _npacPdmsHemeraAdapter2.default.shutdown]; + appTerminators = [_npacWsgwAdapters.wsPdmsGw.shutdown, _npacWsgwAdapters.wsServer.shutdown, _webServer2.default.shutdown, _npacPdmsHemeraAdapter2.default.shutdown]; } else { - appAdapters = [_npac2.default.mergeConfig(config), _npac2.default.addLogger, _webServer2.default.startup]; + appAdapters = [_npac2.default.mergeConfig(config), _npac2.default.addLogger, _webServer2.default.startup, _npacWsgwAdapters.wsServer.startup]; - appTerminators = [_webServer2.default.shutdown]; + appTerminators = [_npacWsgwAdapters.wsServer.shutdown, _webServer2.default.shutdown]; } // Define the jobs to execute: hand over the command got by the CLI. diff --git a/dist/webServerCli.js b/dist/webServerCli.js index 868ab02..9afcf79 100644 --- a/dist/webServerCli.js +++ b/dist/webServerCli.js @@ -1,8 +1,11 @@ -#!/usr/bin/env node - -/*jshint node: true */ 'use strict'; +var _lodash = require('lodash'); + +var _lodash2 = _interopRequireDefault(_lodash); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + var yargs = require('yargs'); var parse = function parse(defaults) { @@ -41,6 +44,28 @@ var parse = function parse(defaults) { desc: "NATS server URI used by the pdms adapter.", type: 'string', default: defaults.pdms.natsUri + }) + // WebSocket related parameters + .option("forward", { + alias: "f", + desc: "Forwards messages among inbound and outbound topics", + type: 'boolean', + default: defaults.wsServer.forwardTopics + }).option("forwarderEvent", { + alias: "e", + desc: "The name of the event the server is listen to forward the incoming messages", + type: 'string', + default: defaults.wsServer.forwarderEvent + }).option("inbound", { + alias: "i", + desc: "Comma separated list of inbound NATS topics to forward through websocket", + type: 'string', + default: "" + }).option("outbound", { + alias: "o", + desc: "Comma separated list of outbound NATS topics to forward towards from websocket", + type: 'string', + default: "" }).demandOption([]).showHelpOnFail(false, 'Specify --help for available options').help().parse(processArgv.slice(2)); var results = { @@ -56,6 +81,20 @@ var parse = function parse(defaults) { usePdms: argv.usePdms, useCompression: argv.useCompression }, + wsServer: { + forwardTopics: argv.forward, + forwarderEvent: argv.forwarderEvent + }, + wsPdmsGw: { + topics: { + inbound: argv.inbound != "" ? _lodash2.default.map(argv.inbound.split(','), function (t) { + return t.trim(); + }) : [], + outbound: argv.outbound != "" ? _lodash2.default.map(argv.outbound.split(','), function (t) { + return t.trim(); + }) : [] + } + }, pdms: { natsUri: argv.natsUri } diff --git a/dist/webServerCli.spec.js b/dist/webServerCli.spec.js index bdb1f2e..547650f 100644 --- a/dist/webServerCli.spec.js +++ b/dist/webServerCli.spec.js @@ -10,6 +10,8 @@ var _npacPdmsHemeraAdapter = require('npac-pdms-hemera-adapter'); var _npacPdmsHemeraAdapter2 = _interopRequireDefault(_npacPdmsHemeraAdapter); +var _npacWsgwAdapters = require('npac-wsgw-adapters'); + var _webServer = require('./adapters/webServer/'); var _webServer2 = _interopRequireDefault(_webServer); @@ -33,7 +35,7 @@ describe('webServerCli', function () { it('webServer without pdms', function (done) { var processArgv = ['node', 'src/index.js', // 'server', '-p', "3008", '-c', 'config.yml', '-r', '/tmp/restApi', '-s']; - var defaults = _lodash2.default.merge({}, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults); + var defaults = _lodash2.default.merge({}, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults, _npacWsgwAdapters.wsServer.defaults, _npacWsgwAdapters.wsPdmsGw.defaults); var expected = { command: { name: 'server', @@ -47,6 +49,16 @@ describe('webServerCli', function () { usePdms: false, useCompression: true }, + wsServer: { + forwardTopics: false, + forwarderEvent: "message" + }, + wsPdmsGw: { + topics: { + inbound: [], + outbound: [] + } + }, pdms: { natsUri: "nats://demo.nats.io:4222" } @@ -60,7 +72,7 @@ describe('webServerCli', function () { it('webServer with pdms, default NATS server', function (done) { var processArgv = ['node', 'src/index.js', // 'server', '-p', "3008", '-c', 'config.yml', '-r', '/tmp/restApi', '-u']; - var defaults = _lodash2.default.merge({}, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults); + var defaults = _lodash2.default.merge({}, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults, _npacWsgwAdapters.wsServer.defaults, _npacWsgwAdapters.wsPdmsGw.defaults); var expected = { command: { name: 'server', @@ -74,6 +86,16 @@ describe('webServerCli', function () { usePdms: true, useCompression: false }, + wsServer: { + forwardTopics: false, + forwarderEvent: "message" + }, + wsPdmsGw: { + topics: { + inbound: [], + outbound: [] + } + }, pdms: { natsUri: "nats://demo.nats.io:4222" } @@ -87,7 +109,7 @@ describe('webServerCli', function () { it('webServer with pdms, NATS server on localhost', function (done) { var processArgv = ['node', 'src/index.js', // 'server', '-p', "3008", '-c', 'config.yml', '-r', '/tmp/restApi', '-u', '-n', 'nats://localhost:4222']; - var defaults = _lodash2.default.merge({}, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults); + var defaults = _lodash2.default.merge({}, _webServer2.default.defaults, _npacPdmsHemeraAdapter2.default.defaults, _npacWsgwAdapters.wsServer.defaults, _npacWsgwAdapters.wsPdmsGw.defaults); var expected = { command: { name: 'server', @@ -101,6 +123,16 @@ describe('webServerCli', function () { usePdms: true, useCompression: false }, + wsServer: { + forwardTopics: false, + forwarderEvent: "message" + }, + wsPdmsGw: { + topics: { + inbound: [], + outbound: [] + } + }, pdms: { natsUri: "nats://localhost:4222" } diff --git a/package-lock.json b/package-lock.json index 53515b6..6769051 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,11 @@ } } }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=" + }, "ajv": { "version": "5.5.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", @@ -248,6 +253,11 @@ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, "arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -291,6 +301,11 @@ "dev": true, "optional": true }, + "async-limiter": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz", + "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==" + }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", @@ -1147,6 +1162,11 @@ "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", "dev": true }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1175,6 +1195,16 @@ } } }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=" + }, + "base64id": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-1.0.0.tgz", + "integrity": "sha1-R2iMuZu2gE8OBtPnY7HDLlfY5rY=" + }, "basic-auth": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.4.tgz", @@ -1216,6 +1246,14 @@ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", "dev": true }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + } + }, "big.js": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", @@ -1293,6 +1331,11 @@ } } }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -1440,6 +1483,11 @@ "callsites": "0.2.0" } }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + }, "callsites": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", @@ -1980,11 +2028,20 @@ "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", "dev": true }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, "component-emitter": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=" + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" }, "compressible": { "version": "2.0.13", @@ -2490,6 +2547,69 @@ } } }, + "engine.io": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.2.0.tgz", + "integrity": "sha512-mRbgmAtQ4GAlKwuPnnAvXXwdPhEx+jkc0OBCLrXuD/CRvwNK3AxRSnqK4FSqmAMRRHryVJP8TopOvmEaA64fKw==", + "requires": { + "accepts": "1.3.4", + "base64id": "1.0.0", + "cookie": "0.3.1", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "ws": "3.3.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-client": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz", + "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==", + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "3.1.0", + "engine.io-parser": "2.1.2", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "3.3.3", + "xmlhttprequest-ssl": "1.5.5", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "engine.io-parser": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz", + "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "0.0.7", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary2": "1.0.3" + } + }, "env-variable": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/env-variable/-/env-variable-0.0.3.tgz", @@ -4946,6 +5066,26 @@ "ansi-regex": "2.1.1" } }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=" + }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -5149,6 +5289,11 @@ "repeating": "2.0.1" } }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", @@ -6848,6 +6993,35 @@ "yargs": "10.0.3" } }, + "npac-wsgw-adapters": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npac-wsgw-adapters/-/npac-wsgw-adapters-1.1.1.tgz", + "integrity": "sha512-F2eg+8feiifQ5YmGL1EgJQP59z2mGTynnN+PgS9wp+tvgCCXY3WR9cRXxj0isNCSkSWreRtbHRX0+HRSKvuDPw==", + "requires": { + "datafile": "3.2.0", + "lodash": "4.17.4", + "npac": "2.0.2", + "npac-pdms-hemera-adapter": "1.4.1", + "rxjs": "6.2.1", + "socket.io": "2.1.1", + "yargs": "10.0.3" + }, + "dependencies": { + "npac-pdms-hemera-adapter": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npac-pdms-hemera-adapter/-/npac-pdms-hemera-adapter-1.4.1.tgz", + "integrity": "sha512-p1jX4+WSy7wX1WHf5I5U3upuq+ex89Ox/bzTlLdTvc2VULxld9H9Yuvsk7PEnAlrP2IYqnJ7b+qR7n4hMruZ5w==", + "requires": { + "datafile": "3.2.0", + "lodash": "4.17.4", + "nats": "0.8.4", + "nats-hemera": "5.4.2", + "npac": "2.0.2", + "yargs": "10.0.3" + } + } + } + }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", @@ -6892,6 +7066,11 @@ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, "object-copy": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", @@ -7226,6 +7405,22 @@ "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", "dev": true }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "requires": { + "better-assert": "1.0.2" + } + }, "parseurl": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", @@ -8150,6 +8345,14 @@ "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", "dev": true }, + "rxjs": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.2.1.tgz", + "integrity": "sha512-OwMxHxmnmHTUpgO+V7dZChf3Tixf4ih95cmXjzzadULziVl/FKhHScGLj4goEw9weePVOH2Q0+GcCBUhKCZc/g==", + "requires": { + "tslib": "1.9.2" + } + }, "safe-buffer": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", @@ -8511,6 +8714,90 @@ "hoek": "4.2.0" } }, + "socket.io": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.1.1.tgz", + "integrity": "sha512-rORqq9c+7W0DAK3cleWNSyfv/qKXV99hV4tZe+gGLfBECw3XEhBy7x85F3wypA9688LKjtwO9pX9L33/xQI8yA==", + "requires": { + "debug": "3.1.0", + "engine.io": "3.2.0", + "has-binary2": "1.0.3", + "socket.io-adapter": "1.1.1", + "socket.io-client": "2.1.1", + "socket.io-parser": "3.2.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.1.tgz", + "integrity": "sha1-KoBeihTWNyEk3ZFZrUUC+MsH8Gs=" + }, + "socket.io-client": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz", + "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==", + "requires": { + "backo2": "1.0.2", + "base64-arraybuffer": "0.1.5", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "3.1.0", + "engine.io-client": "3.2.1", + "has-binary2": "1.0.3", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "socket.io-parser": "3.2.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + } + } + }, + "socket.io-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz", + "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==", + "requires": { + "component-emitter": "1.2.1", + "debug": "3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=" + } + } + }, "sorted-array-functions": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/sorted-array-functions/-/sorted-array-functions-1.1.0.tgz", @@ -8971,6 +9258,11 @@ "resolved": "https://registry.npmjs.org/tinysonic/-/tinysonic-1.3.0.tgz", "integrity": "sha512-wAKKbTqVn32VxH8PoxNbZ1oCu9IDeyMuQbmdljPfw3D2qGKUe1+88XNhOUfp90pO61Wv66yWZFEpnkawTnSm6w==" }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + }, "to-fast-properties": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", @@ -9119,6 +9411,11 @@ "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.1.0.tgz", "integrity": "sha1-KsOHyMS9BL0mxh34kaYHn4WS/hA=" }, + "tslib": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.2.tgz", + "integrity": "sha512-AVP5Xol3WivEr7hnssHDsaM+lVrVXWUvd1cfXTRkTj80b//6g2wIFEH6hZG0muGZRnHGrfttpdzRk3YlBkWjKw==" + }, "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", @@ -9235,6 +9532,11 @@ "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=" }, + "ultron": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", + "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" + }, "unc-path-regex": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -9744,6 +10046,16 @@ "mkdirp": "0.5.1" } }, + "ws": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", + "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", + "requires": { + "async-limiter": "1.0.0", + "safe-buffer": "5.1.1", + "ultron": "1.1.1" + } + }, "xmlcreate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/xmlcreate/-/xmlcreate-1.0.2.tgz", @@ -9755,6 +10067,11 @@ "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=" }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=" + }, "xtend": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", @@ -9804,6 +10121,11 @@ "requires": { "camelcase": "4.1.0" } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=" } } } diff --git a/package.json b/package.json index 04fee49..2cff062 100644 --- a/package.json +++ b/package.json @@ -43,6 +43,7 @@ "morgan": "~1.7.0", "npac": "^2.0.2", "npac-pdms-hemera-adapter": "^1.2.0", + "npac-wsgw-adapters": "^1.1.1", "passport": "~0.3.2", "passport-facebook": "~2.1.1", "passport-google-oauth": "~1.0.0", @@ -90,6 +91,7 @@ "build": "babel src --presets babel-preset-es2015 --out-dir dist && cp -r src/adapters/webServer/config/defaults dist/adapters/webServer/config/", "lint": "eslint src/**.js", "test": "cross-env NODE_ENV=test mocha --recursive --compilers js:babel-register --timeout 15000 'src/**/*.spec.js'", + "test-single": "cross-env NODE_ENV=test mocha --recursive --compilers js:babel-register --timeout 15000 $1", "test:watch": "npm test -- --watch", "coverage": "NODE_ENV=test istanbul cover _mocha -- recursive --compilers js:babel-register --timeout 15000 'src/**/*.spec.js'", "coveralls": "NODE_ENV=test istanbul cover _mocha --report lcovonly -- recursive --compilers js:babel-register --timeout 15000 'src/**/*.spec.js' -R spec && cat ./coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js && rm -rf ./coverage", diff --git a/src/adapters/webServer/index.js b/src/adapters/webServer/index.js index bf79fdc..587000c 100644 --- a/src/adapters/webServer/index.js +++ b/src/adapters/webServer/index.js @@ -65,7 +65,7 @@ const startup = (container, next) => { // Call next setup function with the context extension next(null, { webServer: { - server: server + server: httpInstance } }) }) diff --git a/src/index.js b/src/index.js index 15b3621..b1c9822 100644 --- a/src/index.js +++ b/src/index.js @@ -6,6 +6,7 @@ import encpwdCli from './encpwdCli' import webServerCli from './webServerCli' import pdms from 'npac-pdms-hemera-adapter' import encpwd from './adapters/encpwd/' +import { wsServer, wsPdmsGw } from 'npac-wsgw-adapters' import webServer from './adapters/webServer/' import npac from 'npac' import _ from 'lodash' @@ -49,7 +50,7 @@ export const startEncpwd = (argv=process.argv, cb=null) => { export const startWebServer = (argv=process.argv, cb=null) => { - const defaults = _.merge({}, appDefaults, webServer.defaults, pdms.defaults) + const defaults = _.merge({}, appDefaults, webServer.defaults, pdms.defaults, wsServer.defaults, wsPdmsGw.defaults) // Use CLI to gain additional parameters, and command to execute const { cliConfig/*, command*/ } = webServerCli.parse(defaults, argv) @@ -65,10 +66,14 @@ export const startWebServer = (argv=process.argv, cb=null) => { npac.mergeConfig(config), npac.addLogger, pdms.startup, - webServer.startup + webServer.startup, + wsServer.startup, + wsPdmsGw.startup ] appTerminators = [ + wsPdmsGw.shutdown, + wsServer.shutdown, webServer.shutdown, pdms.shutdown ] @@ -76,10 +81,12 @@ export const startWebServer = (argv=process.argv, cb=null) => { appAdapters = [ npac.mergeConfig(config), npac.addLogger, - webServer.startup + webServer.startup, + wsServer.startup ] appTerminators = [ + wsServer.shutdown, webServer.shutdown ] } diff --git a/src/webServerCli.js b/src/webServerCli.js index f403b53..924ae55 100644 --- a/src/webServerCli.js +++ b/src/webServerCli.js @@ -1,7 +1,4 @@ -#!/usr/bin/env node -/*jshint node: true */ -'use strict'; - +import _ from 'lodash' const yargs = require('yargs') const parse = (defaults, processArgv=process.argv) => { @@ -44,6 +41,31 @@ const parse = (defaults, processArgv=process.argv) => { type: 'string', default: defaults.pdms.natsUri }) + // WebSocket related parameters + .option("forward", { + alias: "f", + desc: "Forwards messages among inbound and outbound topics", + type: 'boolean', + default: defaults.wsServer.forwardTopics + }) + .option("forwarderEvent", { + alias: "e", + desc: "The name of the event the server is listen to forward the incoming messages", + type: 'string', + default: defaults.wsServer.forwarderEvent + }) + .option("inbound", { + alias: "i", + desc: "Comma separated list of inbound NATS topics to forward through websocket", + type: 'string', + default: "" + }) + .option("outbound", { + alias: "o", + desc: "Comma separated list of outbound NATS topics to forward towards from websocket", + type: 'string', + default: "" + }) .demandOption([]) .showHelpOnFail(false, 'Specify --help for available options') .help() @@ -63,6 +85,16 @@ const parse = (defaults, processArgv=process.argv) => { usePdms: argv.usePdms, useCompression: argv.useCompression }, + wsServer: { + forwardTopics: argv.forward, + forwarderEvent: argv.forwarderEvent + }, + wsPdmsGw: { + topics: { + inbound: argv.inbound != "" ? _.map(argv.inbound.split(','), t => t.trim()) : [], + outbound: argv.outbound != "" ? _.map(argv.outbound.split(','), t => t.trim()) : [] + } + }, pdms: { natsUri: argv.natsUri } diff --git a/src/webServerCli.spec.js b/src/webServerCli.spec.js index 9c4c51f..831371f 100644 --- a/src/webServerCli.spec.js +++ b/src/webServerCli.spec.js @@ -1,6 +1,7 @@ import _ from 'lodash' import { expect } from 'chai' import pdms from 'npac-pdms-hemera-adapter' +import { wsServer, wsPdmsGw } from 'npac-wsgw-adapters' import webServer from './adapters/webServer/' import webServerCli from './webServerCli' @@ -22,7 +23,7 @@ describe('webServerCli', () => { '-r', '/tmp/restApi', '-s' ] - const defaults = _.merge({}, webServer.defaults, pdms.defaults) + const defaults = _.merge({}, webServer.defaults, pdms.defaults, wsServer.defaults, wsPdmsGw.defaults) const expected = { command: { name: 'server', @@ -36,6 +37,16 @@ describe('webServerCli', () => { usePdms: false, useCompression: true }, + wsServer: { + forwardTopics: false, + forwarderEvent: "message" + }, + wsPdmsGw: { + topics: { + inbound: [], + outbound: [] + } + }, pdms: { natsUri: "nats://demo.nats.io:4222" } @@ -54,7 +65,7 @@ describe('webServerCli', () => { '-r', '/tmp/restApi', '-u' ] - const defaults = _.merge({}, webServer.defaults, pdms.defaults) + const defaults = _.merge({}, webServer.defaults, pdms.defaults, wsServer.defaults, wsPdmsGw.defaults) const expected = { command: { name: 'server', @@ -68,6 +79,16 @@ describe('webServerCli', () => { usePdms: true, useCompression: false }, + wsServer: { + forwardTopics: false, + forwarderEvent: "message" + }, + wsPdmsGw: { + topics: { + inbound: [], + outbound: [] + } + }, pdms: { natsUri: "nats://demo.nats.io:4222" } @@ -87,7 +108,7 @@ describe('webServerCli', () => { '-u', '-n', 'nats://localhost:4222' ] - const defaults = _.merge({}, webServer.defaults, pdms.defaults) + const defaults = _.merge({}, webServer.defaults, pdms.defaults, wsServer.defaults, wsPdmsGw.defaults) const expected = { command: { name: 'server', @@ -101,6 +122,16 @@ describe('webServerCli', () => { usePdms: true, useCompression: false }, + wsServer: { + forwardTopics: false, + forwarderEvent: "message" + }, + wsPdmsGw: { + topics: { + inbound: [], + outbound: [] + } + }, pdms: { natsUri: "nats://localhost:4222" }