From 44fccfd44adf24df58ba1bc297d0c9f658470402 Mon Sep 17 00:00:00 2001 From: joelchu Date: Tue, 24 Mar 2020 20:29:37 +0800 Subject: [PATCH 1/4] move the final resolver related methods into the folder --- packages/ws-server-core/package.json | 2 +- .../src/handles/get-socket-handler.js | 17 +++- .../src/handles/handle-nsp-resolvers.js | 83 ++++++++++++------- packages/ws-server-core/src/resolver/index.js | 6 ++ .../src/resolver/resolve-socket-method.js | 13 ++- .../{share => resolver}/resolver-methods.js | 0 6 files changed, 82 insertions(+), 39 deletions(-) rename packages/ws-server-core/src/{share => resolver}/resolver-methods.js (100%) diff --git a/packages/ws-server-core/package.json b/packages/ws-server-core/package.json index d90f381a..fb8a990c 100644 --- a/packages/ws-server-core/package.json +++ b/packages/ws-server-core/package.json @@ -33,7 +33,7 @@ "debug": "^4.1.1", "esm": "^3.2.25", "fs-extra": "^9.0.0", - "jsonql-constants": "^2.0.11", + "jsonql-constants": "^2.0.12", "jsonql-errors": "^1.2.1", "jsonql-params-validator": "^1.6.2", "jsonql-resolver": "^1.2.2", diff --git a/packages/ws-server-core/src/handles/get-socket-handler.js b/packages/ws-server-core/src/handles/get-socket-handler.js index b780cf07..effa09aa 100644 --- a/packages/ws-server-core/src/handles/get-socket-handler.js +++ b/packages/ws-server-core/src/handles/get-socket-handler.js @@ -32,6 +32,9 @@ function matchResolverByNamespace(resolverName, namespace, nspGroup) { return false } + + + /** * This is the generic methods that will be wrap inside the on.message (for ws) * all it takes it how to delivery the message back @@ -48,6 +51,9 @@ function getSocketHandler(config, ws, deliverFn, req, connectedNamespace, payloa const nspGroup = config.nspInfo[NSP_GROUP] const resolverName = getResolverFromPayload(payload) const args = payload[resolverName] + // break up from previous setup so we get a cache version + const nspHandlerFn = handleNspResolver(deliverFn, ws, config) + // it might be the special internal event? switch (true) { case resolverName === INTERCOM_RESOLVER_NAME: @@ -64,9 +70,14 @@ function getSocketHandler(config, ws, deliverFn, req, connectedNamespace, payloa // just return an error return handleUnknownPayload(deliverFn, resolverName, args) } - - handleNspResolvers(deliverFn, ws, resolverName, args, contractParam.params, config, userdata) - + // we change the interface a bit + return nspHandlerFn( + connectedNamespace, + resolverName, + args.args, + contractParam.params, + userdata + ) } } diff --git a/packages/ws-server-core/src/handles/handle-nsp-resolvers.js b/packages/ws-server-core/src/handles/handle-nsp-resolvers.js index 35271ba0..28edf9fb 100644 --- a/packages/ws-server-core/src/handles/handle-nsp-resolvers.js +++ b/packages/ws-server-core/src/handles/handle-nsp-resolvers.js @@ -2,46 +2,65 @@ // @TODO this property still not create correctly // const { TIMESTAMP_PARAM_NAME } = require('jsonql-constants') // get the resolver to handle the request -const { validateInput, deliverMsg, handleError } = require('../share/resolver-methods') -const { resolveSocketMethod } = require('../share/resolve-socket-method') +const { + validateInput, + deliverMsg, + handleError, + resolveSocketMethod +} = require('../resolver') + const { getRainbowDebug } = require('../share/helpers') const debug = getRainbowDebug('handles:handle-nsp-resolver', 'x') +// for caching +let nspHandlerFn /** - * handle resolvers + * We pass those params that is not change once it's set to this method + * Then we get back the actual handler that will return the resolver to take the call + * * @param {function} deliverFn the final delivery message method * @param {object} ws the socket instance get add to the resolver as property - * @param {string} resolverName name of resolver - * @param {*} args from payload - * @param {object} params from contract.json * @param {object} opts configuration - * @param {object} userdata userdata - * @return {promise} resolve the result + * @return {function} */ -const handleNspResolvers = (deliverFn, ws, resolverName, args, params, opts, userdata) => { - debug('handleNspResolvers', resolverName, args, params) - // debug('TIMESTAMP_PARAM_NAME', json[TIMESTAMP_PARAM_NAME], TIMESTAMP_PARAM_NAME) - // const ts = json[TIMESTAMP_PARAM_NAME] // keep this for use later - // @NOTE the args is in {args: [ value ]} structure and we only need the value - return validateInput(args.args, params) - .then(_args => resolveSocketMethod( - deliverFn, - resolverName, - _args, // this is the clean value from validateAsync - opts, - ws, - userdata +function handleNspResolver(deliverFn, ws, opts) { + // check the cache method first + if (typeof nspHandlerFn === 'function') { + return nspHandlerFn + } + + /** + * @param {string} resolverName name of resolver + * @param {*} args from payload + * @param {object} params from contract.json + * @param {object} userdata userdata + * @return {promise} resolve the result + */ + nspHandlerFn = function nspHandlerAction(namespace, resolverName, args, params, userdata) { + + return validateInput(args, params) + .then(_args => resolveSocketMethod( + namespace, + resolverName, + deliverFn, + _args, // this is the clean value from validateAsync + opts, + ws, + userdata + ) ) - ) - .then(result => { - debug(`${resolverName} return result`, result) - return deliverMsg(deliverFn, resolverName, result) - }) - .catch(err => { - // By the time the error gets here already become JsonqlError??? - // rdebug('in the catch', err) - handleError(deliverFn, resolverName, err) - }) + .then(result => { + debug(`${resolverName} return result`, result) + return deliverMsg(deliverFn, resolverName, result) + }) + .catch(err => { + // By the time the error gets here already become JsonqlError??? + // rdebug('in the catch', err) + handleError(deliverFn, resolverName, err) + }) + } + + return nspHandlerFn } -module.exports = { handleNspResolvers } +module.exports = { handleNspResolver } diff --git a/packages/ws-server-core/src/resolver/index.js b/packages/ws-server-core/src/resolver/index.js index 6715167f..4490ca71 100644 --- a/packages/ws-server-core/src/resolver/index.js +++ b/packages/ws-server-core/src/resolver/index.js @@ -1,3 +1,9 @@ // all these methods were in the share folder before // now all group under the resolver because they are all related to resolver +const { + validateInput, + deliverMsg, + handleError, + deliverIntercomMsg +} = require('./resolver-methods') \ No newline at end of file diff --git a/packages/ws-server-core/src/resolver/resolve-socket-method.js b/packages/ws-server-core/src/resolver/resolve-socket-method.js index 31ed229a..d994cb1d 100644 --- a/packages/ws-server-core/src/resolver/resolve-socket-method.js +++ b/packages/ws-server-core/src/resolver/resolve-socket-method.js @@ -4,10 +4,12 @@ const { CACHE_STORE_PROP_KEY } = require('jsonql-constants') const { JsonqlResolverAppError } = require('jsonql-errors') -const { getResolver } = require('jsonql-resolver') -const { getRainbowDebug } = require('../share/helpers') + +const { getCompleteSocketResolver } = require('jsonql-resolver') + const { addProperty } = require('./add-property') +const { getRainbowDebug } = require('../share/helpers') const debug = getRainbowDebug('share:resolve-method') /** @@ -21,7 +23,12 @@ const debug = getRainbowDebug('share:resolve-method') * @return {promise} depends on the contract */ const resolveSocketMethod = function(deliverFn, resolverName, args, opts, ws, userdata) { - debug('resolverSocketMethod') + // resolverName, opts, key = null, store = null + + + + + const { contract } = opts // @TODO add a cache method to store the constructed resolver const fn = getResolver(resolverName, SOCKET_NAME, contract, opts) diff --git a/packages/ws-server-core/src/share/resolver-methods.js b/packages/ws-server-core/src/resolver/resolver-methods.js similarity index 100% rename from packages/ws-server-core/src/share/resolver-methods.js rename to packages/ws-server-core/src/resolver/resolver-methods.js -- Gitee From af77f80e59dae8c963c04b6a07a0b2c09002fa23 Mon Sep 17 00:00:00 2001 From: joelchu Date: Tue, 24 Mar 2020 21:38:13 +0800 Subject: [PATCH 2/4] change add-property to get-injectors --- .../src/handles/get-socket-handler.js | 3 -- .../src/handles/handle-hello.js | 2 +- .../src/handles/handle-init-ping.js | 2 +- .../src/handles/handle-unknown-payload.js | 2 +- .../{add-property.js => get-injectors.js} | 5 ++- packages/ws-server-core/src/resolver/index.js | 11 ++++++- .../src/resolver/resolve-socket-method.js | 31 ++++++++++--------- .../src/resolver/resolver-methods.js | 9 +++--- .../src/resolver/setup-send-method.js | 2 +- 9 files changed, 40 insertions(+), 27 deletions(-) rename packages/ws-server-core/src/resolver/{add-property.js => get-injectors.js} (97%) diff --git a/packages/ws-server-core/src/handles/get-socket-handler.js b/packages/ws-server-core/src/handles/get-socket-handler.js index effa09aa..bd0f5669 100644 --- a/packages/ws-server-core/src/handles/get-socket-handler.js +++ b/packages/ws-server-core/src/handles/get-socket-handler.js @@ -32,9 +32,6 @@ function matchResolverByNamespace(resolverName, namespace, nspGroup) { return false } - - - /** * This is the generic methods that will be wrap inside the on.message (for ws) * all it takes it how to delivery the message back diff --git a/packages/ws-server-core/src/handles/handle-hello.js b/packages/ws-server-core/src/handles/handle-hello.js index 5e60d066..a82447a2 100644 --- a/packages/ws-server-core/src/handles/handle-hello.js +++ b/packages/ws-server-core/src/handles/handle-hello.js @@ -1,5 +1,5 @@ // create a hello world method to test the installation -const { deliverMsg } = require('../share/resolver-methods') +const { deliverMsg } = require('../resolver/resolver-methods') const { HELLO_FN, HELLO } = require('jsonql-constants') function handleHello(deliverFn, connectedNamespace, userdata) { diff --git a/packages/ws-server-core/src/handles/handle-init-ping.js b/packages/ws-server-core/src/handles/handle-init-ping.js index 18fbbcf9..3488822e 100644 --- a/packages/ws-server-core/src/handles/handle-init-ping.js +++ b/packages/ws-server-core/src/handles/handle-init-ping.js @@ -11,7 +11,7 @@ const { CSRF_HEADER_KEY, SOCKET_PING_EVENT_NAME } = require('jsonql-constants') -const { deliverIntercomMsg } = require('../share/resolver-methods') +const { deliverIntercomMsg } = require('../resolver/resolver-methods') const { getDebug } = require('../share/helpers') const debug = getDebug('handles:init-ping') /** diff --git a/packages/ws-server-core/src/handles/handle-unknown-payload.js b/packages/ws-server-core/src/handles/handle-unknown-payload.js index 5d065699..c687639c 100644 --- a/packages/ws-server-core/src/handles/handle-unknown-payload.js +++ b/packages/ws-server-core/src/handles/handle-unknown-payload.js @@ -1,6 +1,6 @@ const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') -const { handleError } = require('../share/resolver-methods') +const { handleError } = require('../resolver/resolver-methods') const { ERROR_KEY } = require('jsonql-constants') /** diff --git a/packages/ws-server-core/src/resolver/add-property.js b/packages/ws-server-core/src/resolver/get-injectors.js similarity index 97% rename from packages/ws-server-core/src/resolver/add-property.js rename to packages/ws-server-core/src/resolver/get-injectors.js index 98c77d73..0a91166f 100644 --- a/packages/ws-server-core/src/resolver/add-property.js +++ b/packages/ws-server-core/src/resolver/get-injectors.js @@ -45,4 +45,7 @@ const addProperty = (deliverFn, fn, resolverName, ws, userdata, opts) => { }) } -module.exports = { addProperty } + + + +module.exports = { getInjectors } diff --git a/packages/ws-server-core/src/resolver/index.js b/packages/ws-server-core/src/resolver/index.js index 4490ca71..78df5f6a 100644 --- a/packages/ws-server-core/src/resolver/index.js +++ b/packages/ws-server-core/src/resolver/index.js @@ -6,4 +6,13 @@ const { deliverMsg, handleError, deliverIntercomMsg -} = require('./resolver-methods') \ No newline at end of file +} = require('./resolver-methods') +const { resolveSocketMethod } = require('./resolver-methods') + +module.exports = { + validateInput, + deliverMsg, + handleError, + deliverIntercomMsg, + resolveSocketMethod +} \ No newline at end of file diff --git a/packages/ws-server-core/src/resolver/resolve-socket-method.js b/packages/ws-server-core/src/resolver/resolve-socket-method.js index d994cb1d..c3e2ed1a 100644 --- a/packages/ws-server-core/src/resolver/resolve-socket-method.js +++ b/packages/ws-server-core/src/resolver/resolve-socket-method.js @@ -4,36 +4,39 @@ const { CACHE_STORE_PROP_KEY } = require('jsonql-constants') const { JsonqlResolverAppError } = require('jsonql-errors') - const { getCompleteSocketResolver } = require('jsonql-resolver') - -const { addProperty } = require('./add-property') - +const { getInjectors } = require('./get-injectors') const { getRainbowDebug } = require('../share/helpers') const debug = getRainbowDebug('share:resolve-method') /** * similiar to the one in Koa-middleware without the ctx - * @param {function} deliverFn framework specific method + * @param {string} namespace connected namespace * @param {string} resolverName name to call + * @param {function} deliverFn framework specific method * @param {array} args arguments * @param {object} opts for search later * @param {object} ws the WebSocket instance * @param {object} [userdata=false] userdata * @return {promise} depends on the contract */ -const resolveSocketMethod = function(deliverFn, resolverName, args, opts, ws, userdata) { +const resolveSocketMethod = function( + namespace, + resolverName, + deliverFn, + args, // this is the clean value from validateAsync + opts, + ws, + userdata) { // resolverName, opts, key = null, store = null - + const key = [namespace, resolverName].join('-') + const store = opts[CACHE_STORE_PROP_KEY] + const actionFn = getCompleteSocketResolver(resolverName, opts, key, store) + const injectorFns = getInjectors() + const args = [] - - - const { contract } = opts - // @TODO add a cache method to store the constructed resolver - const fn = getResolver(resolverName, SOCKET_NAME, contract, opts) - - return addProperty(deliverFn, fn, resolverName, ws, userdata, opts) + return Promise.resolve(actionFn(injectorFns, args)) .then(resolver => { try { return Reflect.apply(resolver, null, args) diff --git a/packages/ws-server-core/src/resolver/resolver-methods.js b/packages/ws-server-core/src/resolver/resolver-methods.js index 3109b8b3..1b8f7f02 100644 --- a/packages/ws-server-core/src/resolver/resolver-methods.js +++ b/packages/ws-server-core/src/resolver/resolver-methods.js @@ -2,7 +2,7 @@ // const { JsonqlValidationError } = require('jsonql-errors') const { packError } = require('jsonql-utils') const { isNotEmpty, validateAsync } = require('jsonql-params-validator') -const { getRainbowDebug, createWsReply } = require('./helpers') +const { getRainbowDebug, createWsReply } = require('../share/helpers') const { INTERCOM_RESOLVER_NAME, ACKNOWLEDGE_REPLY_TYPE, @@ -64,16 +64,17 @@ function handleError(deliverFn, resolverName, err) { /** * The final step to delivery the message - * @param {function} deliverFn framework specific method to delivery + * @param {function} deliverFn framework specific method to delivery * @param {string} resolverName that perform this method * @param {*} result from the resolver process - * @return {void} + * @param {string} type what type of message + * @return {promise} resolve the final result */ function deliverMsg(deliverFn, resolverName, result, type = ACKNOWLEDGE_REPLY_TYPE) { return Promise .resolve(result) - .then(result => handleResult(deliverFn, resolverName, result, type)) + .then(result => handleResult(deliverFn, resolverName, result, type)) } /** diff --git a/packages/ws-server-core/src/resolver/setup-send-method.js b/packages/ws-server-core/src/resolver/setup-send-method.js index 82ff7cd2..ec6ff363 100644 --- a/packages/ws-server-core/src/resolver/setup-send-method.js +++ b/packages/ws-server-core/src/resolver/setup-send-method.js @@ -1,6 +1,6 @@ const { SEND_MSG_FN_NAME, EMIT_REPLY_TYPE } = require('jsonql-constants') const { objDefineProps } = require('jsonql-utils') -const { deliverMsg } = require('../share/resolver-methods') +const { deliverMsg } = require('./resolver-methods') const { nil, getRainbowDebug } = require('../share/helpers') const debug = getRainbowDebug('create-send-method', 'x') -- Gitee From c278849576c1d20cf5ccbd3c9ddc7f0662c864a5 Mon Sep 17 00:00:00 2001 From: joelchu Date: Tue, 24 Mar 2020 22:26:41 +0800 Subject: [PATCH 3/4] start setting up the inter communication event type --- packages/constants/package.json | 2 +- packages/constants/prop.js | 3 +- packages/constants/socket.js | 3 + packages/ws-server-core/src/options/index.js | 1 - .../src/resolver/get-injectors.js | 110 +++++++++++++----- .../src/resolver/resolve-socket-method.js | 4 +- .../src/resolver/setup-on-method.js | 36 +++++- .../src/resolver/setup-send-method.js | 3 +- 8 files changed, 122 insertions(+), 40 deletions(-) diff --git a/packages/constants/package.json b/packages/constants/package.json index 1f22f4e3..073e0f88 100755 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-constants", - "version": "2.0.12", + "version": "2.0.13", "description": "All the share constants for jsonql modules", "main": "main.js", "module": "index.js", diff --git a/packages/constants/prop.js b/packages/constants/prop.js index b871f24a..0744a21f 100644 --- a/packages/constants/prop.js +++ b/packages/constants/prop.js @@ -102,4 +102,5 @@ export const ENABLE_SPLIT_TASK_PROP_KEY = 'enableSplitTask' export const CONNECTED_PROP_KEY = 'connected' // share naming to id the cache store object -export const CACHE_STORE_PROP_KEY = 'cacheStore' \ No newline at end of file +export const CACHE_STORE_PROP_KEY = 'cacheStore' +export const EVENT_EMITTER_PROP_KEY = 'eventEmitter' \ No newline at end of file diff --git a/packages/constants/socket.js b/packages/constants/socket.js index 0ba76834..dda8b17d 100644 --- a/packages/constants/socket.js +++ b/packages/constants/socket.js @@ -67,6 +67,9 @@ export const EMIT_REPLY_TYPE = 'emit_reply' // this is a new event for a may be feature export const EMIT_SEND_TYPE = 'emit_send' export const ACKNOWLEDGE_REPLY_TYPE = 'emit_acknowledge' +// this is for inter communication +export const INTER_EMIT_SEND_TYPE = 'inter_emit_send' +export const INTER_EMIT_REPLY_TYPE = 'inter_emit_reply' export const NSP_GROUP = 'nspGroup' export const PUBLIC_NAMESPACE = 'publicNamespace' diff --git a/packages/ws-server-core/src/options/index.js b/packages/ws-server-core/src/options/index.js index a893b103..c9b1ca5a 100644 --- a/packages/ws-server-core/src/options/index.js +++ b/packages/ws-server-core/src/options/index.js @@ -8,7 +8,6 @@ const { getNodeCache, isNodeCache } = require('@jsonql/security') - const { checkConfig, checkConfigAsync, diff --git a/packages/ws-server-core/src/resolver/get-injectors.js b/packages/ws-server-core/src/resolver/get-injectors.js index 0a91166f..09c8c97c 100644 --- a/packages/ws-server-core/src/resolver/get-injectors.js +++ b/packages/ws-server-core/src/resolver/get-injectors.js @@ -6,46 +6,94 @@ const { const { injectToFn } = require('jsonql-utils') const { provideUserdata } = require('@jsonql/security') const { injectNodeClient } = require('jsonql-resolver') - +const { setupOnMethod } = require('./setup-on-method') const { setupSendMethod } = require('./setup-send-method') const { getDebug } = require('../share/helpers') const debug = getDebug(`share:addProperty`) +/* + This method change from injecting the property via the promise chain + to organize injectors to fns for the resolver method to work with + */ + /** - * using the serverType to provide different addProperty method to this - * change to return a promise on 1.4.4 - * @param {function} deliverFn framework specific method - * @param {function} fn the resolver function - * @param {string} resolverName resolver name - * @param {object} ws the different context object - * @param {object|boolean} userdata false when there is none - * @param {object} opts configuration added in 1.4.4 for the client configs - * @return {function} the applied function + * We just pass the whole lot, use some then passing them back with additonal prop to the resolver + * @param {*} fn + * @param {*} deliverFn + * @param {*} resolverName + * @param {*} ws + * @param {*} userdata + * @param {*} opts + * @return {array} params for the next chain call */ -const addProperty = (deliverFn, fn, resolverName, ws, userdata, opts) => { - return Promise - .resolve(injectToFn(fn, SOCKET_NAME, ws)) // @0.6.2 use a generic name `socket` - // define the send method - .then(resolver => { - return setupSendMethod(deliverFn, resolver, resolverName) - }) - .then(resolver => { - debug(`addProperty ---> userdata --->`, userdata) - return userdata ? provideUserdata(resolver, userdata) : resolver - }) - .then(resolver => { - if (opts[INIT_CLIENT_PROP_KEY] && opts[INIT_CLIENT_PROP_KEY].then) { - debug(`using INIT_CLIENT_PROP_KEY to add clients to the resolver`) - return opts[INIT_CLIENT_PROP_KEY] - .then(clients => injectNodeClient(resolver, clients)) - } - // @TODO what if we run this standalone and we want to inject clients to it? - return resolver - }) -} +const injectWsProp = (fn, deliverFn, resolverName, ws, userdata, opts) => [ + injectToFn(fn, SOCKET_NAME, ws), + deliverFn, + resolverName, + ws, + userdata, + opts +] +const injectUserdata = (fn, deliverFn, resolverName, ws, userdata, opts) => [ + userdata ? provideUserdata(fn, userdata) : fn, + deliverFn, + resolverName, + ws, + userdata, + opts +] +const injectSendFn = (fn, deliverFn, resolverName, ws, userdata, opts) => [ + setupSendMethod(deliverFn, resolver, resolverName, opts), + deliverFn, + resolverName, + ws, + userdata, + opts +] +const injectOnFn = (deliverFn, resolverName, ws, userdata, opts) => [ + setupOnMethod(deliverFn, resolver, resolverName, opts), + deliverFn, + resolverName, + ws, + userdata, + opts +] + +/** + * This is the last in the chain, and we just return the resolver itself + * @param {*} deliverFn + * @param {*} resolverName + * @param {*} ws + * @param {*} userdata + * @param {*} opts + * @return {function} resolver with all the props added + */ +const injectClient = (deliverFn, resolverName, ws, userdata, opts) => { + if (opts[INIT_CLIENT_PROP_KEY] && opts[INIT_CLIENT_PROP_KEY].then) { + debug(`using INIT_CLIENT_PROP_KEY to add clients to the resolver`) + return opts[INIT_CLIENT_PROP_KEY] + .then(clients => injectNodeClient(resolver, clients)) + } + + return resolver +} + + +/** + * @return {array} list of injectors + */ +const getInjectors = () => { + return [ + injectWsProp, + injectUserdata, + injectSendFn, + injectOnFn, + injectClient + ] +} module.exports = { getInjectors } diff --git a/packages/ws-server-core/src/resolver/resolve-socket-method.js b/packages/ws-server-core/src/resolver/resolve-socket-method.js index c3e2ed1a..2a54ae15 100644 --- a/packages/ws-server-core/src/resolver/resolve-socket-method.js +++ b/packages/ws-server-core/src/resolver/resolve-socket-method.js @@ -32,9 +32,9 @@ const resolveSocketMethod = function( const key = [namespace, resolverName].join('-') const store = opts[CACHE_STORE_PROP_KEY] const actionFn = getCompleteSocketResolver(resolverName, opts, key, store) - + const injectorFns = getInjectors() - const args = [] + const args = [ deliverFn, resolverName, ws, userdata, opts ] return Promise.resolve(actionFn(injectorFns, args)) .then(resolver => { diff --git a/packages/ws-server-core/src/resolver/setup-on-method.js b/packages/ws-server-core/src/resolver/setup-on-method.js index d5344825..db884010 100644 --- a/packages/ws-server-core/src/resolver/setup-on-method.js +++ b/packages/ws-server-core/src/resolver/setup-on-method.js @@ -1,7 +1,37 @@ // this is brand new resolver.on method to listen to the message +const { SEND_ON_FN_NAME, EMIT_REPLY_TYPE } = require('jsonql-constants') +const { objDefineProps } = require('jsonql-utils') +const { deliverMsg } = require('./resolver-methods') +const { nil, getRainbowDebug } = require('../share/helpers') +const debug = getRainbowDebug('create-send-method', 'x') - - +/** + * @TODO setup a new resolver.on method that can listen to reply message also + * This will serve as the new inter communication method as well + * when call with just a cb resolver.on(cb) it listen to the client + * when call with resolver.on(resolverName, cb) then it will become the inter communication tool + * @param {*} deliverFn + * @param {*} resolver + * @param {*} resolverName + * @return {function} resolver + */ function setupOnMethod(deliverFn, resolver, resolverName) { + return objDefineProps( + resolver, + SEND_ON_FN_NAME, + nil, + function sendHandler() { + // @NOTE we don't need to validate here, if we need to in the future, + // we should validate it against the return params + return function sendOnback(...args) { + + debug('onCallback', args) + + // deliverMsg(deliverFn, resolverName, args, EMIT_REPLY_TYPE) + } + } + ) +} + -} \ No newline at end of file +module.exports = { setupOnMethod } \ No newline at end of file diff --git a/packages/ws-server-core/src/resolver/setup-send-method.js b/packages/ws-server-core/src/resolver/setup-send-method.js index ec6ff363..9d58e897 100644 --- a/packages/ws-server-core/src/resolver/setup-send-method.js +++ b/packages/ws-server-core/src/resolver/setup-send-method.js @@ -10,9 +10,10 @@ const debug = getRainbowDebug('create-send-method', 'x') * @param {function} deliveryFn framework specific to deliver message to client * @param {function} resolver the function itself * @param {string} resolverName the name of this resolver + * @param {object} opts configuration * @return {function} resolver with a `send` method property */ -const setupSendMethod = function(deliverFn, resolver, resolverName) { +const setupSendMethod = function(deliverFn, resolver, resolverName, opts) { return objDefineProps( resolver, SEND_MSG_FN_NAME, -- Gitee From cca82edeba8d86de7aa892ad4e4766ae95b822d4 Mon Sep 17 00:00:00 2001 From: joelchu Date: Tue, 24 Mar 2020 22:27:02 +0800 Subject: [PATCH 4/4] jsonql-constants 2.0.12 --- packages/constants/README.md | 3 +++ packages/constants/browser.js | 3 +++ packages/constants/constants.json | 3 +++ packages/constants/index.js | 6 +++++- packages/constants/main.js | 3 +++ 5 files changed, 17 insertions(+), 1 deletion(-) diff --git a/packages/constants/README.md b/packages/constants/README.md index 2e792d41..40f9fea8 100755 --- a/packages/constants/README.md +++ b/packages/constants/README.md @@ -171,6 +171,7 @@ Please consult the detail break down below. - ENABLE_SPLIT_TASK_PROP_KEY - CONNECTED_PROP_KEY - CACHE_STORE_PROP_KEY +- EVENT_EMITTER_PROP_KEY ### SOCKET @@ -202,6 +203,8 @@ Please consult the detail break down below. - EMIT_REPLY_TYPE - EMIT_SEND_TYPE - ACKNOWLEDGE_REPLY_TYPE +- INTER_EMIT_SEND_TYPE +- INTER_EMIT_REPLY_TYPE - NSP_GROUP - PUBLIC_NAMESPACE - JS_WS_SOCKET_IO_NAME diff --git a/packages/constants/browser.js b/packages/constants/browser.js index bdd87640..ccd312a9 100644 --- a/packages/constants/browser.js +++ b/packages/constants/browser.js @@ -172,6 +172,7 @@ var jsonqlConstants = { "ENABLE_SPLIT_TASK_PROP_KEY": "enableSplitTask", "CONNECTED_PROP_KEY": "connected", "CACHE_STORE_PROP_KEY": "cacheStore", + "EVENT_EMITTER_PROP_KEY": "eventEmitter", "SOCKET_PING_EVENT_NAME": "__ping__", "SWITCH_USER_EVENT_NAME": "__switch__", "LOGIN_EVENT_NAME": "__login__", @@ -208,6 +209,8 @@ var jsonqlConstants = { "EMIT_REPLY_TYPE": "emit_reply", "EMIT_SEND_TYPE": "emit_send", "ACKNOWLEDGE_REPLY_TYPE": "emit_acknowledge", + "INTER_EMIT_SEND_TYPE": "inter_emit_send", + "INTER_EMIT_REPLY_TYPE": "inter_emit_reply", "NSP_GROUP": "nspGroup", "PUBLIC_NAMESPACE": "publicNamespace", "JS_WS_SOCKET_IO_NAME": "socket.io", diff --git a/packages/constants/constants.json b/packages/constants/constants.json index 59eaca79..8136611f 100644 --- a/packages/constants/constants.json +++ b/packages/constants/constants.json @@ -172,6 +172,7 @@ "ENABLE_SPLIT_TASK_PROP_KEY": "enableSplitTask", "CONNECTED_PROP_KEY": "connected", "CACHE_STORE_PROP_KEY": "cacheStore", + "EVENT_EMITTER_PROP_KEY": "eventEmitter", "SOCKET_PING_EVENT_NAME": "__ping__", "SWITCH_USER_EVENT_NAME": "__switch__", "LOGIN_EVENT_NAME": "__login__", @@ -208,6 +209,8 @@ "EMIT_REPLY_TYPE": "emit_reply", "EMIT_SEND_TYPE": "emit_send", "ACKNOWLEDGE_REPLY_TYPE": "emit_acknowledge", + "INTER_EMIT_SEND_TYPE": "inter_emit_send", + "INTER_EMIT_REPLY_TYPE": "inter_emit_reply", "NSP_GROUP": "nspGroup", "PUBLIC_NAMESPACE": "publicNamespace", "JS_WS_SOCKET_IO_NAME": "socket.io", diff --git a/packages/constants/index.js b/packages/constants/index.js index 16fe46fc..5a40f845 100644 --- a/packages/constants/index.js +++ b/packages/constants/index.js @@ -247,7 +247,8 @@ export const ENABLE_SPLIT_TASK_PROP_KEY = 'enableSplitTask' export const CONNECTED_PROP_KEY = 'connected' // share naming to id the cache store object -export const CACHE_STORE_PROP_KEY = 'cacheStore' /* socket.js */ +export const CACHE_STORE_PROP_KEY = 'cacheStore' +export const EVENT_EMITTER_PROP_KEY = 'eventEmitter' /* socket.js */ // the constants file is gettig too large // we need to split up and group the related constant in one file @@ -318,6 +319,9 @@ export const EMIT_REPLY_TYPE = 'emit_reply' // this is a new event for a may be feature export const EMIT_SEND_TYPE = 'emit_send' export const ACKNOWLEDGE_REPLY_TYPE = 'emit_acknowledge' +// this is for inter communication +export const INTER_EMIT_SEND_TYPE = 'inter_emit_send' +export const INTER_EMIT_REPLY_TYPE = 'inter_emit_reply' export const NSP_GROUP = 'nspGroup' export const PUBLIC_NAMESPACE = 'publicNamespace' diff --git a/packages/constants/main.js b/packages/constants/main.js index bb059e78..dfa27981 100644 --- a/packages/constants/main.js +++ b/packages/constants/main.js @@ -172,6 +172,7 @@ module.exports = { "ENABLE_SPLIT_TASK_PROP_KEY": "enableSplitTask", "CONNECTED_PROP_KEY": "connected", "CACHE_STORE_PROP_KEY": "cacheStore", + "EVENT_EMITTER_PROP_KEY": "eventEmitter", "SOCKET_PING_EVENT_NAME": "__ping__", "SWITCH_USER_EVENT_NAME": "__switch__", "LOGIN_EVENT_NAME": "__login__", @@ -208,6 +209,8 @@ module.exports = { "EMIT_REPLY_TYPE": "emit_reply", "EMIT_SEND_TYPE": "emit_send", "ACKNOWLEDGE_REPLY_TYPE": "emit_acknowledge", + "INTER_EMIT_SEND_TYPE": "inter_emit_send", + "INTER_EMIT_REPLY_TYPE": "inter_emit_reply", "NSP_GROUP": "nspGroup", "PUBLIC_NAMESPACE": "publicNamespace", "JS_WS_SOCKET_IO_NAME": "socket.io", -- Gitee