From 298e2975c285cbe42f82a71ffaccac0ad2e12d1f Mon Sep 17 00:00:00 2001 From: joelchu Date: Sat, 9 Nov 2019 09:21:06 +0800 Subject: [PATCH 1/5] add checking for initContract from the host server config --- packages/@jsonql/koa/package.json | 4 ++-- packages/ws-server/package.json | 10 +++++----- packages/ws-server/src/check-options/index.js | 3 ++- packages/ws-server/src/share/get-contract.js | 5 +++++ 4 files changed, 14 insertions(+), 8 deletions(-) diff --git a/packages/@jsonql/koa/package.json b/packages/@jsonql/koa/package.json index b235f893..517a026b 100644 --- a/packages/@jsonql/koa/package.json +++ b/packages/@jsonql/koa/package.json @@ -49,8 +49,8 @@ "dependencies": { "debug": "^4.1.1", "fs-extra": "^8.1.0", - "jsonql-constants": "^1.8.9", - "jsonql-koa": "^1.4.3", + "jsonql-constants": "^1.8.10", + "jsonql-koa": "^1.4.4", "jsonql-params-validator": "^1.4.11", "koa": "^2.11.0", "koa-bodyparser": "^4.2.1", diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index f9aab9d2..1a269c05 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-ws-server", - "version": "1.3.6", + "version": "1.3.7", "description": "Setup WebSocket server for the jsonql to run on the same host, automatic generate public / private channel using contract", "main": "index.js", "files": [ @@ -32,18 +32,18 @@ "debug": "^4.1.1", "esm": "^3.2.25", "fs-extra": "^8.1.0", - "jsonql-constants": "^1.8.9", - "jsonql-errors": "^1.1.3", + "jsonql-constants": "^1.8.10", + "jsonql-errors": "^1.1.5", "jsonql-jwt": "^1.3.3", "jsonql-params-validator": "^1.4.11", "jsonql-resolver": "^0.9.4", - "jsonql-utils": "^0.8.1", + "jsonql-utils": "^0.8.3", "lodash": "^4.17.15", "ws": "^7.2.0" }, "devDependencies": { "ava": "^2.4.0", - "jsonql-contract": "^1.7.21", + "jsonql-contract": "^1.8.4", "open": "^7.0.0" }, "ava": { diff --git a/packages/ws-server/src/check-options/index.js b/packages/ws-server/src/check-options/index.js index f7c4af83..d8c3999c 100644 --- a/packages/ws-server/src/check-options/index.js +++ b/packages/ws-server/src/check-options/index.js @@ -72,7 +72,8 @@ const constProps = { privateKey: false, secret: false, publicNamespace: PUBLIC_KEY, - privateNamespace: PRIVATE_KEY + privateNamespace: PRIVATE_KEY, + initContract: false // this is from the koa middleware } /** diff --git a/packages/ws-server/src/share/get-contract.js b/packages/ws-server/src/share/get-contract.js index 6d34396f..b607ac27 100644 --- a/packages/ws-server/src/share/get-contract.js +++ b/packages/ws-server/src/share/get-contract.js @@ -34,6 +34,11 @@ function getContractFromFile(config) { return new Promise((resolver, rejecter) => { c = readContract(contractDir) if (!c) { + if (config.initContract && config.initContract.then) { + // this is a pending promise + return config.initContract.then(resolver) + } + /* the last fallback */ setTimeout(() => { c = readContract(contractDir) if (c) { -- Gitee From da15dd6c2ef665a6e3bfa4b3f5fb0c051593f660 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sat, 9 Nov 2019 11:13:21 +0800 Subject: [PATCH 2/5] several breaking changes to the ws server export --- packages/@jsonql/koa/package.json | 2 +- packages/ws-server/index.js | 6 +++++- packages/ws-server/package.json | 2 +- .../ws-server/src/{check-options => options}/index.js | 8 ++++++-- 4 files changed, 13 insertions(+), 5 deletions(-) rename packages/ws-server/src/{check-options => options}/index.js (93%) diff --git a/packages/@jsonql/koa/package.json b/packages/@jsonql/koa/package.json index 517a026b..13dedd74 100644 --- a/packages/@jsonql/koa/package.json +++ b/packages/@jsonql/koa/package.json @@ -58,7 +58,7 @@ "yargs": "^14.2.0" }, "optionalDependencies": { - "jsonql-ws-server": "^1.3.6" + "jsonql-ws-server": "^1.3.7" }, "bin": { "jsonql-koa-cli": "./cli.js" diff --git a/packages/ws-server/index.js b/packages/ws-server/index.js index 794fb0e5..df6d15ec 100644 --- a/packages/ws-server/index.js +++ b/packages/ws-server/index.js @@ -13,7 +13,7 @@ const debug = getDebug('main') * @param {object} config.server this is the http/s server that required to bind to the socket to run on the same connection * @return {mixed} return the undelying socket server instance for further use */ -module.exports = function jsonqlWsServer(config, server) { +function jsonqlWsServer(config, server) { // @TODO check the options return checkOptions(config) .then(opts => { @@ -25,3 +25,7 @@ module.exports = function jsonqlWsServer(config, server) { throw new JsonqlError('jsonqlWsServer', err) }) } + +// breaking change we export it as a name module + +module.exports = { jsonqlWsServer } diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index 1a269c05..89d3414d 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-ws-server", - "version": "1.3.7", + "version": "1.3.8", "description": "Setup WebSocket server for the jsonql to run on the same host, automatic generate public / private channel using contract", "main": "index.js", "files": [ diff --git a/packages/ws-server/src/check-options/index.js b/packages/ws-server/src/options/index.js similarity index 93% rename from packages/ws-server/src/check-options/index.js rename to packages/ws-server/src/options/index.js index d8c3999c..7a7a18e1 100644 --- a/packages/ws-server/src/check-options/index.js +++ b/packages/ws-server/src/options/index.js @@ -73,14 +73,14 @@ const constProps = { secret: false, publicNamespace: PUBLIC_KEY, privateNamespace: PRIVATE_KEY, - initContract: false // this is from the koa middleware + initContract: false // this is from the koa middleware } /** * @param {object} config user supply * @return {object} promise resolve the opts */ -module.exports = function(config) { +function checkConfig(config) { return checkConfigAsync(config, defaultOptions, constProps) .then(getContract) // processing the key @@ -98,3 +98,7 @@ module.exports = function(config) { return opts; }) } + +// breaking change export as name also the options for merge with the upstream server + +module.exports = { } -- Gitee From 68ac8bd0c1861925cb14f6eb419bda5011a06dd6 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sat, 9 Nov 2019 11:23:55 +0800 Subject: [PATCH 3/5] update the fixtures for testing jsonql-ws-server --- packages/ws-server/README.md | 25 ++++++++++++++++++- packages/ws-server/index.js | 13 +++++++--- packages/ws-server/package.json | 2 +- packages/ws-server/src/index.js | 8 ++++-- packages/ws-server/src/options/index.js | 2 +- .../tests/fixtures/browser-test-setup.js | 4 +-- .../ws-server/tests/fixtures/full-setup.js | 4 +-- packages/ws-server/tests/fixtures/server.js | 4 +-- 8 files changed, 47 insertions(+), 15 deletions(-) diff --git a/packages/ws-server/README.md b/packages/ws-server/README.md index ff6b9b4c..cb88b651 100644 --- a/packages/ws-server/README.md +++ b/packages/ws-server/README.md @@ -6,12 +6,35 @@ This is not mean to use as standalone server (although you can) This is included as optional dependencies as one of the following module: -- [@jsonql/koa](https://npmjs.com/package/@jsonql/koa) complete Node server side setup with Koa +- [@jsonql/koa](https://npmjs.com/package/@jsonql/koa) complete Node server side setup with Koa - @jsonql/express (in development) Please check our main documentation site at [jsonql.org](https://jsonql.js.org) for further information +## Note + +The module can work as a standalone WebSocket server. + +```js +const http = require('http') +const fsx = require('fs-extra') +const { jsonqlWsServer } = require('jsonql-ws-server') +const server = http.createServer() +// when using this as standalone, you need to include the contract from somewhere +const config = { + contract: fsx.readJsonSync('path/to/public.json') +} +// init +jsonqlWsServer(config, server) + .then(() => { + // start up the server + server.listen(PORT) + }) +``` + +But this is not recommended. + --- [NEWBRAN LTD UK](https://newbran.ch) diff --git a/packages/ws-server/index.js b/packages/ws-server/index.js index df6d15ec..d94ffa43 100644 --- a/packages/ws-server/index.js +++ b/packages/ws-server/index.js @@ -1,6 +1,12 @@ // Not going to use the koa-socket-2 due to it's lack of support namespace // which is completely useless for us if there is no namespace -const { checkOptions, wsSetup, wsCreateServer } = require('./src') +const { + checkConfig, + wsServerDefaultOptions, + wsServerConstProps, + wsSetup, + wsCreateServer +} = require('./src') const { getDebug } = require('./src/share/helpers') const { JsonqlError } = require('jsonql-errors') const debug = getDebug('main') @@ -15,7 +21,7 @@ const debug = getDebug('main') */ function jsonqlWsServer(config, server) { // @TODO check the options - return checkOptions(config) + return checkConfig(config) .then(opts => { const nspObj = wsCreateServer(opts, server) return Reflect.apply(wsSetup, null, [opts, nspObj]) @@ -27,5 +33,4 @@ function jsonqlWsServer(config, server) { } // breaking change we export it as a name module - -module.exports = { jsonqlWsServer } +module.exports = { jsonqlWsServer, wsServerDefaultOptions, wsServerConstProps } diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index 89d3414d..a8a3e322 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-ws-server", - "version": "1.3.8", + "version": "1.4.0", "description": "Setup WebSocket server for the jsonql to run on the same host, automatic generate public / private channel using contract", "main": "index.js", "files": [ diff --git a/packages/ws-server/src/index.js b/packages/ws-server/src/index.js index baf1739a..d40e3f95 100644 --- a/packages/ws-server/src/index.js +++ b/packages/ws-server/src/index.js @@ -1,10 +1,14 @@ // re-export here const { wsSetup, wsCreateServer } = require('./core') -const checkOptions = require('./check-options') +const { checkConfig, defaultOptions, } = require('./options') // re-export module.exports = { - checkOptions, + // rename them + wsServerDefaultOptions: defaultOptions, + wsServerConstProps: constProps, + // rest of the exports + checkConfig, wsSetup, wsCreateServer } diff --git a/packages/ws-server/src/options/index.js b/packages/ws-server/src/options/index.js index 7a7a18e1..8f1a6fe3 100644 --- a/packages/ws-server/src/options/index.js +++ b/packages/ws-server/src/options/index.js @@ -101,4 +101,4 @@ function checkConfig(config) { // breaking change export as name also the options for merge with the upstream server -module.exports = { } +module.exports = { checkConfig, defaultOptions, constProps } diff --git a/packages/ws-server/tests/fixtures/browser-test-setup.js b/packages/ws-server/tests/fixtures/browser-test-setup.js index bdf92d6c..62c1eca0 100644 --- a/packages/ws-server/tests/fixtures/browser-test-setup.js +++ b/packages/ws-server/tests/fixtures/browser-test-setup.js @@ -19,9 +19,9 @@ console.log(app['jsonql'].onConnection) default_io.on('chat message', function(msg){ console.info('got a message', msg); if (msg === 'terminate') { - clearTimeout(timer); + clearTimeout(timer) } - default_io.emit('chat message', msg); + default_io.emit('chat message', msg) }) // hijack the connnection for all channels diff --git a/packages/ws-server/tests/fixtures/full-setup.js b/packages/ws-server/tests/fixtures/full-setup.js index efb15c7c..e3dc0121 100644 --- a/packages/ws-server/tests/fixtures/full-setup.js +++ b/packages/ws-server/tests/fixtures/full-setup.js @@ -5,7 +5,7 @@ const { getDebug } = require('../../lib/share/helpers') const debug = getDebug('test:full-setup') const resolverDir = join(__dirname, 'resolvers') -const wsServer = require('../../index') +const { jsonqlWsServer } = require('../../index') const http = require('http') // start @@ -22,7 +22,7 @@ module.exports = function(_config = {}) { } const opts = Object.assign(config, _config) return new Promise(resolver => { - wsServer(opts, server) + jsonqlWsServer(opts, server) .then(io => { debug('socket setup completed') resolver({ diff --git a/packages/ws-server/tests/fixtures/server.js b/packages/ws-server/tests/fixtures/server.js index 28997b95..1e253252 100644 --- a/packages/ws-server/tests/fixtures/server.js +++ b/packages/ws-server/tests/fixtures/server.js @@ -8,7 +8,7 @@ const { JSONQL_PATH } = require('jsonql-constants') const resolverDir = join(__dirname, 'resolvers') const contractDir = join(__dirname, 'contract') -const wsServer = require('../../index') +const { jsonqlWsServer } = require('../../index') // start const server = http.createServer(function(req, res) { @@ -20,7 +20,7 @@ const server = http.createServer(function(req, res) { module.exports = function(extra = {}) { // extra.contract = extra.contract || contract; return new Promise(resolver => { - wsServer( + jsonqlWsServer( Object.assign({ resolverDir, contractDir, -- Gitee From 63432cd00ac76b2d3bdc2ac98b827485e22beb76 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sat, 9 Nov 2019 11:24:54 +0800 Subject: [PATCH 4/5] add back the missing constProps --- packages/ws-server/src/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/ws-server/src/index.js b/packages/ws-server/src/index.js index d40e3f95..142ea0b7 100644 --- a/packages/ws-server/src/index.js +++ b/packages/ws-server/src/index.js @@ -1,6 +1,6 @@ // re-export here const { wsSetup, wsCreateServer } = require('./core') -const { checkConfig, defaultOptions, } = require('./options') +const { checkConfig, defaultOptions, constProps } = require('./options') // re-export module.exports = { -- Gitee From a86820d378e69bf54ba058e6ea36da1e7fd2d509 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sat, 9 Nov 2019 17:14:28 +0800 Subject: [PATCH 5/5] change the preConfigCheck method to accept the other options --- packages/@jsonql/koa/package.json | 2 +- packages/koa/index.js | 15 ++++----------- packages/koa/package.json | 2 +- packages/koa/src/options/index.js | 17 +++++++++++++++++ packages/koa/tests/config.test.js | 2 +- 5 files changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/@jsonql/koa/package.json b/packages/@jsonql/koa/package.json index 13dedd74..05a56909 100644 --- a/packages/@jsonql/koa/package.json +++ b/packages/@jsonql/koa/package.json @@ -58,7 +58,7 @@ "yargs": "^14.2.0" }, "optionalDependencies": { - "jsonql-ws-server": "^1.3.7" + "jsonql-ws-server": "^1.4.0" }, "bin": { "jsonql-koa-cli": "./cli.js" diff --git a/packages/koa/index.js b/packages/koa/index.js index 494992ec..99e4751d 100644 --- a/packages/koa/index.js +++ b/packages/koa/index.js @@ -14,11 +14,11 @@ import { publicMethodMiddleware, initMiddleware } from './src/middlewares' -import { configCheck } from './src/options' +import { configCheck, preConfigCheck } from './src/options' import { getDebug } from './src/utils' const debug = getDebug('main') // main -export function jsonqlKoa(config = {}) { +function jsonqlKoa(config = {}) { // first check the config const opts = configCheck(config) debug('[jsonql-koa] init opts', opts) @@ -46,12 +46,5 @@ export function jsonqlKoa(config = {}) { return compose(middlewares) } -/** - * We export an extra interface to the config check because when we hook up the - * ws server, there is a problem with waiting for the contract - * @param {object} config configuration - * @return {object} checked configuration - */ -export function preConfigCheck(config) { - return configCheck(config) -} +// export these two now +export { jsonqlKoa, preConfigCheck } diff --git a/packages/koa/package.json b/packages/koa/package.json index 395a750b..24dbe4a9 100644 --- a/packages/koa/package.json +++ b/packages/koa/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-koa", - "version": "1.4.4", + "version": "1.4.5", "description": "jsonql Koa middleware", "main": "main.js", "module": "index.js", diff --git a/packages/koa/src/options/index.js b/packages/koa/src/options/index.js index 41aeea7c..cacb9620 100644 --- a/packages/koa/src/options/index.js +++ b/packages/koa/src/options/index.js @@ -87,3 +87,20 @@ export function configCheck(config = {}) { // return opts; return injectToFn(opts, CHECKED_KEY, now) } + +/** + * new methods for when using it combine with the jsonql-ws-server + * @param {object} wsDefaultOptions from the other config + * @param {object} wsConstProps from the other config + * @param {object} config supply by the user + */ +export function preConfigCheck(wsDefaultOptions, wsConstProps, config = {}) { + const _defaultOptions = _.merge({}, appProps, wsDefaultOptions) + const _constProps = _.merge({}, wsConstProps, constProps) + const now = Date.now() + + const fn = chainFns(checkConfig, applyGetContract, applyAuthOptions) + const opts = fn(config, _defaultOptions, _constProps) + // return opts; + return injectToFn(opts, CHECKED_KEY, now) +} diff --git a/packages/koa/tests/config.test.js b/packages/koa/tests/config.test.js index 35bec24d..6dea537d 100644 --- a/packages/koa/tests/config.test.js +++ b/packages/koa/tests/config.test.js @@ -56,7 +56,7 @@ test('It should have privateKey and publicKey when set useJwt = true', async t = }) test(`It should now have an extra property __checked__`, t => { - const opts = preConfigCheck() + const opts = preConfigCheck({}, {}) debug(opts[CHECKED_KEY]) t.truthy(opts[CHECKED_KEY]) }) -- Gitee