From cb418b33623b34fb17b016d9289fc0e93648bd1d Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 19:50:22 +0800 Subject: [PATCH 01/19] remap all the handles --- packages/ws-server-core/index.js | 18 ++-- .../ws-server-core/src/handles/handle-nsp.js | 83 ------------------- packages/ws-server-core/src/handles/index.js | 10 +-- .../src/core/{handles => }/handle-nsp.js | 0 .../src/core/handles/handle-intercom.js | 16 ---- .../src/core/handles/handle-logout.js | 15 ---- .../core/handles/handle-standalone-login.js | 10 --- .../core/handles/handle-unknown-payload.js | 17 ---- packages/ws-server/src/core/handles/index.js | 16 ---- packages/ws-server/src/core/modules.js | 29 ++++--- packages/ws-server/src/core/ws-setup.js | 27 +++--- 11 files changed, 49 insertions(+), 192 deletions(-) delete mode 100644 packages/ws-server-core/src/handles/handle-nsp.js rename packages/ws-server/src/core/{handles => }/handle-nsp.js (100%) delete mode 100644 packages/ws-server/src/core/handles/handle-intercom.js delete mode 100644 packages/ws-server/src/core/handles/handle-logout.js delete mode 100644 packages/ws-server/src/core/handles/handle-standalone-login.js delete mode 100644 packages/ws-server/src/core/handles/handle-unknown-payload.js delete mode 100644 packages/ws-server/src/core/handles/index.js diff --git a/packages/ws-server-core/index.js b/packages/ws-server-core/index.js index 315ccdfc..22cb4b6c 100644 --- a/packages/ws-server-core/index.js +++ b/packages/ws-server-core/index.js @@ -27,11 +27,16 @@ const { prepareUserdata } = require('./src/share/helpers') -const { interComEventHandler } = require('./src/share/inter-com-handler') // const debug = getDebug('main') // also report the constants const jsonqlWsCoreConstants = require('./src/options/constants') +const { + handleInterCom, + handleLogout, + handleStandaloneLogin, + handleUnknownPayload +} = require('./src/handles') // export every bits out then the downstream build as they want module.exports = { @@ -52,14 +57,17 @@ module.exports = { getRainbowDebug, // this method just getting export to the top level to determine if there is a socket server checkSocketServerType, - // bunch of properties + // bunch of properties wsServerDefaultOptions, wsServerConstProps, - // this is just bunch of constants for use in other places + // this is just bunch of constants for use in other places jsonqlWsCoreConstants, - // the actual methods that create the server + // the actual methods that create the server jsonqlWsServerCore, jsonqlWsServerCoreAction, // @0.6.0 - interComEventHandler + handleInterCom, + handleLogout, + handleStandaloneLogin, + handleUnknownPayload } diff --git a/packages/ws-server-core/src/handles/handle-nsp.js b/packages/ws-server-core/src/handles/handle-nsp.js deleted file mode 100644 index e7602964..00000000 --- a/packages/ws-server-core/src/handles/handle-nsp.js +++ /dev/null @@ -1,83 +0,0 @@ -// take out the code from ws-setup -// @TODO -const { packError } = require('jsonql-utils') -const { isNotEmpty, validateAsync } = require('jsonql-params-validator') -const { - getDebug, - createWsReply, - resolveMethod -} = require('../modules') -const { - ACKNOWLEDGE_REPLY_TYPE, - ERROR_TYPE, - TIMESTAMP_PARAM_NAME -} = require('jsonql-constants') - -const debug = getDebug('handle-nsp') - -/** - * handle resolvers - * @param {object} ws WebSocket instance - * @param {object} payload args array - * @param {string} resolverName name of resolver - * @param {object} params from contract.json - * @param {object} opts configuration - * @param {object} userdata userdata - */ -const fnHandler = (ws, payload, resolverName, params, opts, userdata) => { - // debug('fnHandler', resolverName, params) - // need to figure out a way to create a cb using the ws - // perhaps a ws.socket.id or some kind? - const cb = data => { - ws.send(data) - } - // @NOTE the params.params is from the contract - return validateAsync(payload.args, params.params, true) - .then(args => resolveMethod( - resolverName, - args, // this is the clean value from validateAsync - params, - opts, - ws, - userdata - ) - ) - .then(result => { - debug('result', result) - // decide if we need to call the cb or not here - if (isNotEmpty(result)) { - cb(createWsReply(ACKNOWLEDGE_REPLY_TYPE, resolverName, result)) - } - }) - .catch(err => { - debug('CATCH RESOLVER ERROR', err) - cb(createWsReply(ERROR_TYPE, resolverName, packError(err))) - }) -} - -/** - * The default single nsp mapping to resolver - * @param {object} ws websocket socket instance - * @param {object} json data send from client - * @param {object} socketFns contract - * @param {object} opts configuration - * @param {*} [userdata=false] userdata if any - * @return {void} nothing - */ -const handleNsp = (ws, json, socketFns, opts, userdata = false) => { - debug('TIMESTAMP_PARAM_NAME', json[TIMESTAMP_PARAM_NAME], TIMESTAMP_PARAM_NAME) - // const ts = json[TIMESTAMP_PARAM_NAME] // keep this for use later - for (let resolverName in json) { - if (resolverName !== TIMESTAMP_PARAM_NAME) { // dirty hack for now - // dirty hack - debug('connection call', resolverName) - let payload = json[resolverName] - let params = socketFns[resolverName] - // we need to use the decoded token --> userdata - // and pass to the resolver - fnHandler(ws, payload, resolverName, params, opts, userdata) - } - } -} - -module.exports = { handleNsp } \ No newline at end of file diff --git a/packages/ws-server-core/src/handles/index.js b/packages/ws-server-core/src/handles/index.js index 3ed093e5..b798baf3 100644 --- a/packages/ws-server-core/src/handles/index.js +++ b/packages/ws-server-core/src/handles/index.js @@ -1,16 +1,14 @@ -// All these methods move from the ws-server +// All these methods move from the ws-server // we need to make them all generic const { handleInterCom } = require('./handle-intercom') const { handleLogout } = require('./handle-logout') const { handleStandaloneLogin } = require('./handle-standalone-login') const { handleUnknownPayload } = require('./handle-unknown-payload') -// ONLY this one is framework specific --> even this one can modify to be universal -const { handleNsp } = require('./handle-nsp') + module.exports = { handleInterCom, handleLogout, handleStandaloneLogin, - handleUnknownPayload, - handleNsp -} \ No newline at end of file + handleUnknownPayload +} diff --git a/packages/ws-server/src/core/handles/handle-nsp.js b/packages/ws-server/src/core/handle-nsp.js similarity index 100% rename from packages/ws-server/src/core/handles/handle-nsp.js rename to packages/ws-server/src/core/handle-nsp.js diff --git a/packages/ws-server/src/core/handles/handle-intercom.js b/packages/ws-server/src/core/handles/handle-intercom.js deleted file mode 100644 index 80fc7be2..00000000 --- a/packages/ws-server/src/core/handles/handle-intercom.js +++ /dev/null @@ -1,16 +0,0 @@ -const { getDebug } = require('../modules') -const debug = getDebug('handle-intercome') -/** - * @TODO - * @param {*} ws - * @param {*} req - * @param {*} json - * @param {*} socketFns - * @param {*} opts - * @param {*} userdata - */ -function handleInterCom(ws, req, json, socketFns, opts, userdata) { - debug(`handleIntercom called`, json) -} - -module.exports = { handleInterCom } \ No newline at end of file diff --git a/packages/ws-server/src/core/handles/handle-logout.js b/packages/ws-server/src/core/handles/handle-logout.js deleted file mode 100644 index d5e2f03d..00000000 --- a/packages/ws-server/src/core/handles/handle-logout.js +++ /dev/null @@ -1,15 +0,0 @@ -const { getDebug } = require('../modules') -const debug = getDebug('handle-intercome') -const WS_EXIT_ID = 1 - -/** - * This will change based on the WS spec - * @TODO - * @param {object} ws socket - */ -function handleLogout(ws, req, json, opts) { - debug(`handleLogout called`, json) - ws.close(WS_EXIT_ID, LOGOUT_NAME) -} - -module.exports = { handleLogout } \ No newline at end of file diff --git a/packages/ws-server/src/core/handles/handle-standalone-login.js b/packages/ws-server/src/core/handles/handle-standalone-login.js deleted file mode 100644 index 37ec19ed..00000000 --- a/packages/ws-server/src/core/handles/handle-standalone-login.js +++ /dev/null @@ -1,10 +0,0 @@ -const { getDebug } = require('../modules') -const debug = getDebug('handle-intercome') -/** - * @TODO - */ -function handleStandaloneLogin(ws, req, json, opts) { - debug(`handleStanealoneLogin called`, json) -} - -module.exports = { handleStandaloneLogin } \ No newline at end of file diff --git a/packages/ws-server/src/core/handles/handle-unknown-payload.js b/packages/ws-server/src/core/handles/handle-unknown-payload.js deleted file mode 100644 index cdc11ed9..00000000 --- a/packages/ws-server/src/core/handles/handle-unknown-payload.js +++ /dev/null @@ -1,17 +0,0 @@ -const { getDebug } = require('../modules') -const debug = getDebug('handle-intercome') - -/** - * @TODO - * @param {*} ws - * @param {*} req - * @param {*} json - * @param {*} socketFns - * @param {*} opts - * @param {*} userdata - */ -function handleUnknownPayload(ws, req, json, socketFns, opts, userdata) { - debug(`Handle unknown payload called`, json) -} - -module.exports = { handleUnknownPayload } \ No newline at end of file diff --git a/packages/ws-server/src/core/handles/index.js b/packages/ws-server/src/core/handles/index.js deleted file mode 100644 index 46a27e2c..00000000 --- a/packages/ws-server/src/core/handles/index.js +++ /dev/null @@ -1,16 +0,0 @@ -// @TODO all these should moved to the ws-server-core -// they are all share methods -const { handleInterCom } = require('./handle-intercom') -const { handleLogout } = require('./handle-logout') -const { handleStandaloneLogin } = require('./handle-standalone-login') -const { handleUnknownPayload } = require('./handle-unknown-payload') -// ONLY this one is framework specific --> even this one can modify to be universal -const { handleNsp } = require('./handle-nsp') - -module.exports = { - handleInterCom, - handleLogout, - handleStandaloneLogin, - handleUnknownPayload, - handleNsp -} \ No newline at end of file diff --git a/packages/ws-server/src/core/modules.js b/packages/ws-server/src/core/modules.js index 17dc57b1..341aa92d 100644 --- a/packages/ws-server/src/core/modules.js +++ b/packages/ws-server/src/core/modules.js @@ -1,5 +1,5 @@ -// keep all the import from ws-server-core in one place -// for easy switching to debug +// keep all the import from ws-server-core in one place +// for easy switching to debug const WebSocket = require('ws') const { checkSocketServerType, @@ -7,7 +7,7 @@ const { jsonqlWsServerCoreAction, wsServerDefaultOptions, wsServerConstProps, - getNamespace, + getNamespace, getDebug, getRainbowDebug, @@ -18,8 +18,12 @@ const { isUserdata, prepareUserdata, - SOCKET_STATE_KEY -} = require('../../../ws-server-core') //require('jsonql-ws-server-core') + SOCKET_STATE_KEY, + handleInterCom, + handleLogout, + handleStandaloneLogin, + handleUnknownPayload +} = require('../../../ws-server-core') //require('jsonql-ws-server-core') module.exports = { WebSocket, @@ -29,17 +33,22 @@ module.exports = { jsonqlWsServerCoreAction, wsServerDefaultOptions, wsServerConstProps, - getNamespace, - + getNamespace, + getDebug, getRainbowDebug, createWsReply, resolveMethod, - + getUserdata, isUserdata, prepareUserdata, - SOCKET_STATE_KEY -} \ No newline at end of file + SOCKET_STATE_KEY, + + handleInterCom, + handleLogout, + handleStandaloneLogin, + handleUnknownPayload +} diff --git a/packages/ws-server/src/core/ws-setup.js b/packages/ws-server/src/core/ws-setup.js index 37783a20..5b98543b 100644 --- a/packages/ws-server/src/core/ws-setup.js +++ b/packages/ws-server/src/core/ws-setup.js @@ -4,7 +4,7 @@ const { groupByNamespace } = require('jsonql-utils') const { LOGOUT_EVENT_NAME, SA_LOGIN_EVENT_NAME, - INTER_COM_EVENT_NAME + INTER_COM_EVENT_NAME } = require('jsonql-constants') const { getDebug, @@ -16,23 +16,22 @@ const { handleInterCom, handleLogout, handleStandaloneLogin, - handleUnknownPayload, - handleNsp -} = require('./handles') - + handleUnknownPayload +} = require('./modules') +const { handleNsp } = require('./handle-nsp') const debug = getDebug('ws-setup') const rdebug = getRainbowDebug('ws-setup') /** - * We might want to send just a simple message back with a string - * instead of a full payload - * @param {string} data send from client - * + * We might want to send just a simple message back with a string + * instead of a full payload + * @param {string} data send from client + * */ const getPayload = data => { try { return JSON.parse(data) } catch(e) { - return data + return data } } @@ -59,12 +58,12 @@ const wsSetup = (opts, nspObj) => { // so the data is wrap inside the resolverName ws.on('message', data => { let json = getPayload(data) - + debug('called with: ', json) - + if (nspSet) { let methodsInNsp = nspSet[namespace] - + debug('nspSet', namespace, methodsInNsp) for (let resolverName in json) { @@ -89,7 +88,7 @@ const wsSetup = (opts, nspObj) => { } } } else { // just public nsp - // the bug is here but how come the client disconnect and reconnect can affect + // the bug is here but how come the client disconnect and reconnect can affect // the server setup? debug(`using public nsp`, namespace) -- Gitee From 3dbd1c4b271d0c5dcb5a4aa7c7e3e19263898128 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 19:56:10 +0800 Subject: [PATCH 02/19] remove the old inter-com-handler --- .../src/share/inter-com-handler.js | 44 ------------------- packages/ws-server/src/utils.js | 26 ++++++----- 2 files changed, 14 insertions(+), 56 deletions(-) delete mode 100644 packages/ws-server-core/src/share/inter-com-handler.js diff --git a/packages/ws-server-core/src/share/inter-com-handler.js b/packages/ws-server-core/src/share/inter-com-handler.js deleted file mode 100644 index d1948dab..00000000 --- a/packages/ws-server-core/src/share/inter-com-handler.js +++ /dev/null @@ -1,44 +0,0 @@ - -const { getDebug } = require('./helpers') -const debug = getDebug('inter-com-handler') -const fsx = require('fs-extra') - -/** - * Find the intercom handler and return it - * OK since the two event disconnect and switch user are in fact user related - * Therefore we could put them under socket/auth folder also the socket related - * login / logout can also put in there. @TODO - * @param {object} opts configuration - * @return {boolean|function} false on not found, or the actual function call - */ -function getHandler(opts) { - const { interComEventHandlerPath } = opts - // this is up to how the developer supply this option - if (interComEventHandlerPath !== null && fsx.existsSync(interComEventHandlerPath)) { - // @TODO we should use the getResolver method to search for the handler instead - return require(interComEventHandlerPath) - } - // just return a dummy - return () => {} -} - -/** - * This will be the new intercom event handler - * we expect the user to pass an absolute path to the file that is - * going to handle this type of events - * then whenever it gets call, it will get take over by this function - * @param {string} evtType the type of the intercom event - * @param {object} opts the configuration - * @param {array} args whatever argument we received - * @return {void} - */ -function interComEventHandler(evtType, opts, args) { - const handler = getHandler(opts) - - // just debug for the time being - debug(`Hear this ${evtName}`, args) - // also call the developer supply methods, add the eventName before the args - Reflect.apply(handler, null, [evtType].concat(args)) -} - -module.exports = { interComEventHandler } \ No newline at end of file diff --git a/packages/ws-server/src/utils.js b/packages/ws-server/src/utils.js index 389a536d..d48a8ea4 100644 --- a/packages/ws-server/src/utils.js +++ b/packages/ws-server/src/utils.js @@ -1,39 +1,41 @@ -// this is ws specific so we put them here +// this is ws specific so we put them here const { WebSocket, getDebug } = require('./core/modules') const colors = require('colors/safe') function debug(str, ...args) { let db = getDebug('internal') Reflect.apply(db, null, [colors.rainbow(str+'')].concat(args)) -} +} /** - * what the name said + * what the name said * @param {object} wss the websocket - * @param {string} data things to broadcast + * @param {string} data things to broadcast + * @param {boolean} me send to myself or not */ -function broadcast(wss, data) { +function broadcast(wss, data, me = false) { wss.clients.forEach(function each(client) { + // @TODO add the me bit if (client.readyState === WebSocket.OPEN) { - // need to package the data first + // @TODO need to package the data first client.send(data) } }) } /** - * get ip via the request object + * get ip via the request object * @param {object} req request object - * @return {string} or null? + * @return {string} or null? */ function getReqIp(req) { return req.connection.remoteAddress } /** - * Get the ip via the x-forward-for header via nginx - * @param {object} req request object - * @return {string} or null? + * Get the ip via the x-forward-for header via nginx + * @param {object} req request object + * @return {string} or null? */ function getIpFromNginx(req) { return req.headers['x-forwarded-for'].split(/\s*,\s*/)[0] @@ -44,4 +46,4 @@ module.exports = { broadcast, getReqIp, getIpFromNginx -} \ No newline at end of file +} -- Gitee From 736e6336aa03773fd5fc65d9396e303bd67656ce Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 20:33:31 +0800 Subject: [PATCH 03/19] rename the nspSet to nspGroup because this is what it is --- packages/utils/package.json | 2 +- packages/utils/src/namespace.js | 16 ++-- packages/ws-server-core/package.json | 2 +- .../src/handles/handle-intercom.js | 18 ++--- .../src/handles/handle-logout.js | 6 +- .../src/handles/handle-standalone-login.js | 6 +- .../src/handles/handle-unknown-payload.js | 18 ++--- packages/ws-server-core/src/share/helpers.js | 54 ++++++------- packages/ws-server/package.json | 3 +- packages/ws-server/src/core/handle-nsp.js | 12 +-- .../ws-server/src/core/ws-create-server.js | 14 ++-- packages/ws-server/src/core/ws-setup.js | 18 ++--- packages/ws-server/tests/ws-jwt-auth.test.js | 79 ++++++++++--------- 13 files changed, 123 insertions(+), 125 deletions(-) diff --git a/packages/utils/package.json b/packages/utils/package.json index 4e2d8c93..1804be17 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-utils", - "version": "1.0.1", + "version": "1.0.2", "description": "This is a jsonql dependency module, not for generate use.", "main": "main.js", "module": "index.js", diff --git a/packages/utils/src/namespace.js b/packages/utils/src/namespace.js index 2249fa8e..1daf90e6 100644 --- a/packages/utils/src/namespace.js +++ b/packages/utils/src/namespace.js @@ -24,18 +24,18 @@ export function groupByNamespace(contract, fallback = false) { } throw new JsonqlError('groupByNamespace', SOCKET_NOT_FOUND_ERR) } - let nspSet = {} + let nspGroup = {} let size = 0 let publicNamespace for (let resolverName in socket) { let params = socket[resolverName] let { namespace } = params if (namespace) { - if (!nspSet[namespace]) { + if (!nspGroup[namespace]) { ++size; - nspSet[namespace] = {} + nspGroup[namespace] = {} } - nspSet[namespace][resolverName] = params + nspGroup[namespace][resolverName] = params if (!publicNamespace) { if (params[PUBLIC_KEY]) { publicNamespace = namespace @@ -43,20 +43,20 @@ export function groupByNamespace(contract, fallback = false) { } } } - return { size, nspSet, publicNamespace } + return { size, nspGroup, publicNamespace } } /** * @NOTE ported from jsonql-ws-client * Got to make sure the connection order otherwise * it will hang - * @param {object} nspSet contract + * @param {object} nspGroup contract * @param {string} publicNamespace like the name said * @return {array} namespaces in order */ -export function getNamespaceInOrder(nspSet, publicNamespace) { +export function getNamespaceInOrder(nspGroup, publicNamespace) { let names = [] // need to make sure the order! - for (let namespace in nspSet) { + for (let namespace in nspGroup) { if (namespace === publicNamespace) { names[1] = namespace } else { diff --git a/packages/ws-server-core/package.json b/packages/ws-server-core/package.json index 3e28717d..90360c27 100644 --- a/packages/ws-server-core/package.json +++ b/packages/ws-server-core/package.json @@ -32,7 +32,7 @@ "jsonql-jwt": "^1.3.9", "jsonql-params-validator": "^1.5.2", "jsonql-resolver": "^1.1.1", - "jsonql-utils": "^1.0.0", + "jsonql-utils": "^1.0.1", "lodash": "^4.17.15" }, "devDependencies": { diff --git a/packages/ws-server-core/src/handles/handle-intercom.js b/packages/ws-server-core/src/handles/handle-intercom.js index 80fc7be2..c5acae20 100644 --- a/packages/ws-server-core/src/handles/handle-intercom.js +++ b/packages/ws-server-core/src/handles/handle-intercom.js @@ -1,16 +1,16 @@ -const { getDebug } = require('../modules') +const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') /** - * @TODO - * @param {*} ws - * @param {*} req - * @param {*} json - * @param {*} socketFns - * @param {*} opts - * @param {*} userdata + * @TODO + * @param {*} ws + * @param {*} req + * @param {*} json + * @param {*} socketFns + * @param {*} opts + * @param {*} userdata */ function handleInterCom(ws, req, json, socketFns, opts, userdata) { debug(`handleIntercom called`, json) } -module.exports = { handleInterCom } \ No newline at end of file +module.exports = { handleInterCom } diff --git a/packages/ws-server-core/src/handles/handle-logout.js b/packages/ws-server-core/src/handles/handle-logout.js index d5e2f03d..9964965b 100644 --- a/packages/ws-server-core/src/handles/handle-logout.js +++ b/packages/ws-server-core/src/handles/handle-logout.js @@ -1,10 +1,10 @@ -const { getDebug } = require('../modules') +const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') const WS_EXIT_ID = 1 /** * This will change based on the WS spec - * @TODO + * @TODO * @param {object} ws socket */ function handleLogout(ws, req, json, opts) { @@ -12,4 +12,4 @@ function handleLogout(ws, req, json, opts) { ws.close(WS_EXIT_ID, LOGOUT_NAME) } -module.exports = { handleLogout } \ No newline at end of file +module.exports = { handleLogout } diff --git a/packages/ws-server-core/src/handles/handle-standalone-login.js b/packages/ws-server-core/src/handles/handle-standalone-login.js index 37ec19ed..7c66b04a 100644 --- a/packages/ws-server-core/src/handles/handle-standalone-login.js +++ b/packages/ws-server-core/src/handles/handle-standalone-login.js @@ -1,10 +1,10 @@ -const { getDebug } = require('../modules') +const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') /** - * @TODO + * @TODO */ function handleStandaloneLogin(ws, req, json, opts) { debug(`handleStanealoneLogin called`, json) } -module.exports = { handleStandaloneLogin } \ No newline at end of file +module.exports = { handleStandaloneLogin } 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 cdc11ed9..14770e79 100644 --- a/packages/ws-server-core/src/handles/handle-unknown-payload.js +++ b/packages/ws-server-core/src/handles/handle-unknown-payload.js @@ -1,17 +1,17 @@ -const { getDebug } = require('../modules') +const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') /** - * @TODO - * @param {*} ws - * @param {*} req - * @param {*} json - * @param {*} socketFns - * @param {*} opts - * @param {*} userdata + * @TODO + * @param {*} ws + * @param {*} req + * @param {*} json + * @param {*} socketFns + * @param {*} opts + * @param {*} userdata */ function handleUnknownPayload(ws, req, json, socketFns, opts, userdata) { debug(`Handle unknown payload called`, json) } -module.exports = { handleUnknownPayload } \ No newline at end of file +module.exports = { handleUnknownPayload } diff --git a/packages/ws-server-core/src/share/helpers.js b/packages/ws-server-core/src/share/helpers.js index 8b4813d1..baee5169 100644 --- a/packages/ws-server-core/src/share/helpers.js +++ b/packages/ws-server-core/src/share/helpers.js @@ -8,22 +8,22 @@ const { SOCKET_CLIENT_ID_KEY, SOCKET_CLIENT_TS_KEY } = require('jsonql-constants') -const { - JsonqlError, - clientErrorsHandler +const { + JsonqlError, + clientErrorsHandler } = require('jsonql-errors') -const { - toJson, - isObjectHasKey, +const { + toJson, + isObjectHasKey, isFunc, chainFns, - objDefineProps, - objHasProp + objDefineProps, + objHasProp } = require('jsonql-utils') const { isString } = require('jsonql-params-validator') -const { - MODULE_NAME, +const { + MODULE_NAME, SOCKET_STATE_KEY } = require('../options/constants') // create debug @@ -36,16 +36,16 @@ const WS_KEYS = [ WS_REPLY_TYPE, WS_EVT_NAME, WS_DATA_NAME ] /** * Create the debug instance - * @param {string} name + * @param {string} name * @return {function} the debug method */ const getDebug = name => debug(MODULE_NAME).extend(name) /** - * Create a rainbow effect debug on the first string - * help to id where the hell things coming from - * @param {string} name the extended name - * @return {function} the debug function + * Create a rainbow effect debug on the first string + * help to id where the hell things coming from + * @param {string} name the extended name + * @return {function} the debug function */ const getRainbowDebug = name => { const fn = getDebug(name) @@ -108,26 +108,24 @@ const extractWsPayload = payload => { throw new JsonqlError('payload can not decoded', payload) } - - // just an empty method for addProperty getter const nil = function() { return false } /** - * Should this be elsewhere because this is - * get the userdata via the decoded jwt from the request object - * @TODO we need to create a hook that let developer to plug in their own - * implementation in the future, + * Should this be elsewhere because this is + * get the userdata via the decoded jwt from the request object + * @TODO we need to create a hook that let developer to plug in their own + * implementation in the future, * therefore they could store this in a database or whatever * @param {object} req the request object * @return {object} userdata */ function getUserdata(req) { debug(`check what is missing`, req[SOCKET_STATE_KEY]) - return req && req[SOCKET_STATE_KEY] && req[SOCKET_STATE_KEY].userdata - ? req[SOCKET_STATE_KEY].userdata + return req && req[SOCKET_STATE_KEY] && req[SOCKET_STATE_KEY].userdata + ? req[SOCKET_STATE_KEY].userdata : false } @@ -135,7 +133,7 @@ function getUserdata(req) { * Inject extra properties to the userdata object * @param {object} userdata the decoded userdata from the token string * @param {string} client_id the client_id issue by the socket server - * @return {object} userdata injected with new properties + * @return {object} userdata injected with new properties */ function prepareUserdata(userdata, client_id) { const fn1 = () => objDefineProps(userdata, SOCKET_CLIENT_ID_KEY, client_id) @@ -144,9 +142,9 @@ function prepareUserdata(userdata, client_id) { } /** - * check if an object is our userdata + * check if an object is our userdata * @param {*} userdata - * @return {boolean} true + * @return {boolean} true */ function isUserdata(userdata) { if (userdata !== false && typeof userdata === 'object') { @@ -160,9 +158,9 @@ function isUserdata(userdata) { module.exports = { getDebug, getRainbowDebug, - + createWsReply, - getNamespace, + extractWsPayload, getUserdata, diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index 2fa20673..6bcbc8ff 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -29,8 +29,9 @@ "dependencies": { "colors": "^1.4.0", "debug": "^4.1.1", + "jsonql-utils": "^1.0.1", "jsonql-ws-server-core": "^0.6.0", - "ws": "^7.2.1" + "ws": "^7.2.2" }, "devDependencies": { "ava": "^3.5.0", diff --git a/packages/ws-server/src/core/handle-nsp.js b/packages/ws-server/src/core/handle-nsp.js index f7ca24aa..eb983f57 100644 --- a/packages/ws-server/src/core/handle-nsp.js +++ b/packages/ws-server/src/core/handle-nsp.js @@ -1,12 +1,12 @@ -// take out the code from ws-setup -// @TODO +// take out the code from ws-setup +// @TODO const { packError } = require('jsonql-utils') const { isNotEmpty, validateAsync } = require('jsonql-params-validator') const { getDebug, createWsReply, resolveMethod -} = require('../modules') +} = require('./modules') const { ACKNOWLEDGE_REPLY_TYPE, ERROR_TYPE, @@ -43,7 +43,7 @@ const fnHandler = (ws, payload, resolverName, params, opts, userdata) => { ) ) .then(result => { - + debug('resolver return result', result) // decide if we need to call the cb or not here @@ -71,7 +71,7 @@ const handleNsp = (ws, json, socketFns, opts, userdata = false) => { // const ts = json[TIMESTAMP_PARAM_NAME] // keep this for use later for (let resolverName in json) { if (resolverName !== TIMESTAMP_PARAM_NAME) { // dirty hack for now - + debug('connection call', resolverName) let payload = json[resolverName] @@ -83,4 +83,4 @@ const handleNsp = (ws, json, socketFns, opts, userdata = false) => { } } -module.exports = { handleNsp } \ No newline at end of file +module.exports = { handleNsp } diff --git a/packages/ws-server/src/core/ws-create-server.js b/packages/ws-server/src/core/ws-create-server.js index 4cc149db..1997881f 100644 --- a/packages/ws-server/src/core/ws-create-server.js +++ b/packages/ws-server/src/core/ws-create-server.js @@ -3,9 +3,9 @@ const url = require('url') const { WebSocket } = require('./modules') // need to move the method back here const { createVerifyClient } = require('./verify-client') -const { getNamespace, getDebug } = require('./modules') +const { getNamespace } = require('jsonql-utils') +const { getDebug } = require('./modules') const debug = getDebug('ws-setup') - /** * Get the WS namespace instance to handle the call * @param {array} namespace string @@ -15,7 +15,7 @@ const debug = getDebug('ws-setup') const generateWss = (namespace, config) => { let verifyClient if (config.enableAuth) { - // @TODO should disable this secret + // @TODO should disable this secret // let key = config.secret ? config.secret : config.publicKey verifyClient = createVerifyClient(config.publicKey) } @@ -26,8 +26,8 @@ const generateWss = (namespace, config) => { opt.verifyClient = verifyClient } // How do we pass more options here - return { - [name]: new WebSocket.Server(opt) + return { + [name]: new WebSocket.Server(opt) } }) .reduce((last, next) => Object.assign(last, next), {}) @@ -70,7 +70,7 @@ function wsCreateServer(config, server) { // we will always call it via a namespace server.on('upgrade', function upgrade(req, socket, head) { const pathname = getPath(req) - + debug('Hear the upgrade event', pathname) let srv = false @@ -89,7 +89,7 @@ function wsCreateServer(config, server) { } */ }) - // add one more listener here to check out what's wrong with the server + // add one more listener here to check out what's wrong with the server server.on('error', function(err) { debug(`ws server.on error`, err) }) diff --git a/packages/ws-server/src/core/ws-setup.js b/packages/ws-server/src/core/ws-setup.js index 5b98543b..9d20fdf8 100644 --- a/packages/ws-server/src/core/ws-setup.js +++ b/packages/ws-server/src/core/ws-setup.js @@ -21,11 +21,12 @@ const { const { handleNsp } = require('./handle-nsp') const debug = getDebug('ws-setup') const rdebug = getRainbowDebug('ws-setup') + /** * We might want to send just a simple message back with a string * instead of a full payload * @param {string} data send from client - * + * @return {object} the decoded json */ const getPayload = data => { try { @@ -41,10 +42,10 @@ const getPayload = data => { * @return {object} nspObj itself with addtional properties */ const wsSetup = (opts, nspObj) => { - let nspInfo = {}; + let nspInfo = {} const socketFns = opts.contract.socket if (opts.enableAuth) { - nspInfo = groupByNamespace(socketFns, true) + nspInfo = groupByNamespace(opts.contract) // should not FALLBACK! } rdebug('nspInfo', nspInfo) @@ -52,20 +53,14 @@ const wsSetup = (opts, nspObj) => { for (let namespace in nspObj) { let userdata nspObj[namespace].on('connection', (ws, req) => { - // the data part is different again - // because there are only two events type in ws - // send --> message - // so the data is wrap inside the resolverName + // @TODO need to redo here the nspSet can be empty??? ws.on('message', data => { let json = getPayload(data) - debug('called with: ', json) if (nspSet) { let methodsInNsp = nspSet[namespace] - - debug('nspSet', namespace, methodsInNsp) - + // debug('nspSet', namespace, methodsInNsp) for (let resolverName in json) { switch (true) { case resolverName === LOGOUT_EVENT_NAME: @@ -81,6 +76,7 @@ const wsSetup = (opts, nspObj) => { debug(`call get userdata`, req[SOCKET_STATE_KEY]) userdata = getUserdata(req) } + // this parameter is problematic too handleNsp(ws, json, socketFns, opts, userdata) break default: diff --git a/packages/ws-server/tests/ws-jwt-auth.test.js b/packages/ws-server/tests/ws-jwt-auth.test.js index fbdd0d58..0bffeef2 100644 --- a/packages/ws-server/tests/ws-jwt-auth.test.js +++ b/packages/ws-server/tests/ws-jwt-auth.test.js @@ -92,56 +92,63 @@ test.cb.skip('It should able to connect to the private namespace', t => { }) }) -// @NOTE when we run this in serial, it could hang up. +// @NOTE when we run this in serial, it could hang up. // Also if a 401 happens, does it mean the server die? or the client die (of course) // what about the other clients? Should we reconnect them? so many question at the moment test.cb(`first try to connect to the private without login and see what happens`, t => { - t.plan(3) + + const plan = 1 + t.plan(plan) let ctn = 0 - let authClient = wsNodeClient(baseUrl + 'private') - // this is useful we could add this to the client to handle the error - authClient.on('error', err => { - debug(rainbow(`Got error`), err) - t.pass(`Expect to get an error`) // (1) - // t.end() - }) - // next try to connect to the public again and see what happen - let pClient = t.context.client_public - /** - * Very important observation - * When a private nsp is not connect (or fail the connection for whatever reason) - * the public one is available to connect and received calls - */ - pClient.on('open', () => { - pClient.send( createPayload('availableToEveryone') ) - }) + if (plan === 3) { + let authClient = wsNodeClient(baseUrl + 'private') + // this is useful we could add this to the client to handle the error + authClient.on('error', err => { + debug(rainbow(`Got error`), err) + t.pass(`Expect to get an error`) // (1) + // t.end() + }) + } + + if (plan === 2) { + // next try to connect to the public again and see what happen + let pClient = t.context.client_public + /** + * Very important observation + * When a private nsp is not connect (or fail the connection for whatever reason) + * the public one is available to connect and received calls + */ + pClient.on('open', () => { + pClient.send( createPayload('availableToEveryone') ) + }) - pClient.on('message', data => { - let json = extractWsPayload(data) - debug(rainbow('reply'), json) + pClient.on('message', data => { + let json = extractWsPayload(data) + debug(rainbow('reply'), json) - t.truthy(json.data, `Expect to get respond from the public nsp`) // (2) - // t.end() - }) + t.truthy(json.data, `Expect to get respond from the public nsp`) // (2) + // t.end() + }) - pClient.on('error', err => { - debug(rainbow('public client error'), err) - }) + pClient.on('error', err => { + debug(rainbow('public client error'), err) + }) + } setTimeout(() => { - // now we try to login again - // @BUG there is bug here somewhere we can connect to the private channel + // now we try to login again + // @BUG there is bug here somewhere we can connect to the private channel // but the userdata is empty??? authClient = wsNodeClient(baseUrl + 'private', t.context.token1) authClient.on('message', data => { - ++ctn + ++ctn let json = extractWsPayload(data) - + debug(rainbow(ctn+''), json) - t.truthy(json.data) // 3 + t.truthy(json.data) // 3 authClient.close() @@ -154,8 +161,4 @@ test.cb(`first try to connect to the private without login and see what happens` }, 500) - - - - -}) \ No newline at end of file +}) -- Gitee From f4d136eaeb39eef2c123c34d2ee4761e9511af44 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 21:07:54 +0800 Subject: [PATCH 04/19] rename and move around test --- packages/utils/package.json | 2 +- packages/utils/tests/client-utils.test.js | 11 +----- .../tests/{fn.test.js => namespace.test.js} | 36 +++++++------------ 3 files changed, 14 insertions(+), 35 deletions(-) rename packages/utils/tests/{fn.test.js => namespace.test.js} (39%) diff --git a/packages/utils/package.json b/packages/utils/package.json index 1804be17..0e69be73 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -25,7 +25,7 @@ "test:define": "DEBUG=jsonql* ava ./tests/define-property.test.js", "test:params": "DEBUG=jsonql* ava ./tests/params-api.test.js", "test:chain": "DEBUG=jsonql-utils* ava ./tests/chain-fn.test.js", - "test:fn": "DEBUG=jsonql-utils* ava ./tests/fn.test.js", + "test:ns": "DEBUG=jsonql-utils* ava ./tests/namespace.test.js", "test:config": "DEBUG=jsonql-utils* ava ./tests/config.test.js" }, "keywords": [ diff --git a/packages/utils/tests/client-utils.test.js b/packages/utils/tests/client-utils.test.js index ea0760f9..271a67c0 100644 --- a/packages/utils/tests/client-utils.test.js +++ b/packages/utils/tests/client-utils.test.js @@ -1,25 +1,16 @@ // testing the client utils methods const test = require('ava') -const { groupByNamespace, chainPromises, VERSION } = require('../main') +const { chainPromises, VERSION } = require('../main') const { join } = require('path') const fsx = require('fs-extra') const pkg = fsx.readJsonSync(join(__dirname, '..', 'package.json')) -const contract = fsx.readJsonSync(join(__dirname, 'fixtures', 'contract.json')) test(`It should have the version field`, t => { t.is(VERSION, pkg.version) }) -test('It should able to give me two list from the contract', t => { - const { size, nspSet, publicNamespace } = groupByNamespace(contract) - - t.is(size, 2) - t.is(publicNamespace, 'jsonql/public') - -}) - test.cb('The promises should be resolve one after the other even the early one resolve in a timer', t => { t.plan(3) const results = ['first', 'second', 'third'] diff --git a/packages/utils/tests/fn.test.js b/packages/utils/tests/namespace.test.js similarity index 39% rename from packages/utils/tests/fn.test.js rename to packages/utils/tests/namespace.test.js index 576d8e9f..fc454a26 100644 --- a/packages/utils/tests/fn.test.js +++ b/packages/utils/tests/namespace.test.js @@ -2,10 +2,15 @@ const test = require('ava') const utilFns = require('../main') const { merge } = require('lodash-es') -const { preConfigCheck, postConfigCheck } = require('../src/old/pre-config-check') -const { CHECKED_KEY } = require('jsonql-constants') const debug = require('debug')('jsonql-utils:test:fn') +const { groupByNamespace } = utilFns +const { join } = require('path') +const fsx = require('fs-extra') + +const contract = fsx.readJsonSync(join(__dirname, 'fixtures', 'contract.json')) + + test.before(t => { t.context.opts = {name: 'some name'} @@ -16,33 +21,16 @@ test.before(t => { test(`It should have certain functions in the export`, t => { - t.truthy(utilFns.groupByNamespace) + t.truthy(utilFns.toArray) t.false(utilFns.isNotEmpty(' ')) }) -test(`It should able to see if the opts has been or not`, t => { - const fn = preConfigCheck(t.context.opts, t.context.constProps, t.context.checkOptionsFn) - const checkedOptions = fn({}) - t.truthy(utilFns.objHasProp(checkedOptions, CHECKED_KEY)) -}) - -test(`Should able to call the next method when the CHECKED_KEY is not presented`, async t => { - - const next = (a, b, c) => merge({me: 'yes'}, a, b, c) - - const fn1 = postConfigCheck(t.context.opts, t.context.constProps, next) - const result1 = await fn1({y: 1}) - - t.truthy(result1.me) - t.truthy(utilFns.objHasProp(result1, CHECKED_KEY)) - - delete result1.name - - const result2 = await fn1(result1) - debug(result2) +test('It should able to give me two list from the contract', t => { + const { size, nspGroup, publicNamespace } = groupByNamespace(contract) - t.falsy(result2.name) + t.is(size, 2) + t.is(publicNamespace, 'jsonql/public') }) -- Gitee From bfd126ae30845a91a8a38467abc7b7f0e64383b5 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 21:15:05 +0800 Subject: [PATCH 05/19] remove the fallback option from groupByNamespace --- packages/utils/browser.js | 2 +- packages/utils/main.js | 2 +- packages/utils/src/namespace.js | 15 +++++---------- packages/utils/tests/namespace.test.js | 8 +++++--- 4 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/utils/browser.js b/packages/utils/browser.js index 5c02c21a..b695710f 100644 --- a/packages/utils/browser.js +++ b/packages/utils/browser.js @@ -1,2 +1,2 @@ -!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((t=t||self).jsonqlUtils={})}(this,(function(t){"use strict";var r=Array.isArray,e="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},n="object"==typeof e&&e&&e.Object===Object&&e,o="object"==typeof self&&self&&self.Object===Object&&self,u=n||o||Function("return this")(),i=u.Symbol,a=Object.prototype,c=a.hasOwnProperty,f=a.toString,s=i?i.toStringTag:void 0;var l=Object.prototype.toString;var p=i?i.toStringTag:void 0;function v(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":p&&p in Object(t)?function(t){var r=c.call(t,s),e=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=f.call(t);return n&&(r?t[s]=e:delete t[s]),o}(t):function(t){return l.call(t)}(t)}var d,y,h=(d=Object.getPrototypeOf,y=Object,function(t){return d(y(t))});function g(t){return null!=t&&"object"==typeof t}var b=Function.prototype,_=Object.prototype,j=b.toString,m=_.hasOwnProperty,O=j.call(Object);function w(t){if(!g(t)||"[object Object]"!=v(t))return!1;var r=h(t);if(null===r)return!0;var e=m.call(r,"constructor")&&r.constructor;return"function"==typeof e&&e instanceof e&&j.call(e)==O}var S=i?i.prototype:void 0,P=S?S.toString:void 0;function A(t){if("string"==typeof t)return t;if(r(t))return function(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var u=Array(o);++n-1;);return e}(o,u),function(t,r){for(var e=t.length;e--&&z(r,t[e],0)>-1;);return e}(o,u)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},V=function(t){return r(t)?t:[t]},G=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function H(t,r){return t===r||t!=t&&r!=r}function L(t,r){for(var e=t.length;e--;)if(H(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=L(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function X(t){if(!Z(t))return!1;var r=v(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var Y,tt=u["__core-js_shared__"],rt=(Y=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||""))?"Symbol(src)_1."+Y:"";var et=Function.prototype.toString;var nt=/^\[object .+?Constructor\]$/,ot=Function.prototype,ut=Object.prototype,it=ot.toString,at=ut.hasOwnProperty,ct=RegExp("^"+it.call(at).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ft(t){return!(!Z(t)||function(t){return!!rt&&rt in t}(t))&&(X(t)?ct:nt).test(function(t){if(null!=t){try{return et.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ft(e)?e:void 0}var lt=st(u,"Map"),pt=st(Object,"create");var vt=Object.prototype.hasOwnProperty;var dt=Object.prototype.hasOwnProperty;function yt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Bt(t){return null!=t&&Ut(t.length)&&!X(t)}var $t="object"==typeof t&&t&&!t.nodeType&&t,Dt=$t&&"object"==typeof module&&module&&!module.nodeType&&module,It=Dt&&Dt.exports===$t?u.Buffer:void 0,Qt=(It?It.isBuffer:void 0)||function(){return!1},Vt={};Vt["[object Float32Array]"]=Vt["[object Float64Array]"]=Vt["[object Int8Array]"]=Vt["[object Int16Array]"]=Vt["[object Int32Array]"]=Vt["[object Uint8Array]"]=Vt["[object Uint8ClampedArray]"]=Vt["[object Uint16Array]"]=Vt["[object Uint32Array]"]=!0,Vt["[object Arguments]"]=Vt["[object Array]"]=Vt["[object ArrayBuffer]"]=Vt["[object Boolean]"]=Vt["[object DataView]"]=Vt["[object Date]"]=Vt["[object Error]"]=Vt["[object Function]"]=Vt["[object Map]"]=Vt["[object Number]"]=Vt["[object Object]"]=Vt["[object RegExp]"]=Vt["[object Set]"]=Vt["[object String]"]=Vt["[object WeakMap]"]=!1;var Gt="object"==typeof t&&t&&!t.nodeType&&t,Ht=Gt&&"object"==typeof module&&module&&!module.nodeType&&module,Lt=Ht&&Ht.exports===Gt&&n.process,Kt=function(){try{var t=Ht&&Ht.require&&Ht.require("util").types;return t||Lt&&Lt.binding&&Lt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Zt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return g(t)&&Ut(t.length)&&!!Vt[v(t)]};function Xt(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var Yt=Object.prototype.hasOwnProperty;function tr(t,r,e){var n=t[r];Yt.call(t,r)&&H(n,e)&&(void 0!==e||r in t)||jt(t,r,e)}var rr=/^(?:0|[1-9]\d*)$/;function er(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&rr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(dr);function gr(t,r){return hr(function(t,r,e){return r=vr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,u=vr(n.length-r,0),i=Array(u);++o1?r[n-1]:void 0,u=n>2?r[2]:void 0;for(o=br.length>3&&"function"==typeof o?(n--,o):void 0,u&&function(t,r,e){if(!Z(e))return!1;var n=typeof r;return!!("number"==n?Bt(e)&&er(r,e.length):"string"==n&&r in e)&&H(e[r],t)}(r[0],r[1],u)&&(o=n<3?void 0:o,n=1),t=Object(t);++e0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,V(t))}),Reflect.apply(t,null,e))}},t.chainProcessPromises=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return t.then((function(t){return r(t)}))}),Reflect.apply(t,null,e))}},t.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):_r(t,e)}))}))}),Promise.resolve(!1===r?[]:w(r)?r:{}))},t.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},t.createMutation=Mr,t.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Mr(t,r,e,n))},t.createQuery=Cr,t.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(Cr(t,r,e))},t.dasherize=function(t){return I(t).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},t.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Ar("Unknown "+r+" to extract argument from!")}},t.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Sr(e,r);return n}catch(t){throw new Sr(e,t)}},t.extractSocketPart=Nr,t.formatPayload=xr,t.getCallMethod=function(t){switch(!0){case t===mr[0]:return"query";case t===mr[1]:return"mutation";default:return!1}},t.getConfigValue=function(t,r){return r&&w(r)&&t in r?r[t]:void 0},t.getMutationFromArgs=Br,t.getMutationFromPayload=function(t){var r=Ur(t,Br);if(!1!==r)return r;throw new Pr("[getMutationArgs] Payload is malformed!",t)},t.getNameFromPayload=Jr,t.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Or].join("/"),[r,wr].join("/")]:[r]},t.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},t.getQueryFromArgs=Rr,t.getQueryFromPayload=function(t){var r=Ur(t,Rr);if(!1!==r)return r;throw new Pr("[getQueryArgs] Payload is malformed!",t)},t.groupByNamespace=function(t,r){void 0===r&&(r=!1);var e=Nr(t);if(!1===e){if(r)return t;throw new JsonqlError("groupByNamespace","socket not found in contract!")}var n,o={},u=0;for(var i in e){var a=e[i],c=a.namespace;c&&(o[c]||(++u,o[c]={}),o[c][i]=a,n||a[Or]&&(n=c))}return{size:u,nspSet:o,publicNamespace:n}},t.inArray=Q,t.injectToFn=function(t,r,e,n){void 0===n&&(n=!1);var o=jr(t,r);return!1===n&&void 0!==o||Object.defineProperty(t,r,{value:e,writable:n}),t},t.isContract=function(t){return!!function(t){return w(t)&&(G(t,"query")||G(t,"mutation")||G(t,"socket"))}(t)&&t},t.isFunc=function(t){if("function"==typeof t)return!0;console.error("Expect to be Function type! Got "+typeof t)},t.isJsonqlErrorObj=$r,t.isNotEmpty=function(t){return void 0!==t&&!1!==t&&null!==t&&""!==I(t)},t.isObjectHasKey=G,t.logger=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];try{window&&window.DEBUG&&Reflect.apply(console.log,console,t)}catch(t){}},t.objDefineProps=function(t,r,e,n){return void 0===n&&(n=null),void 0===Object.getOwnPropertyDescriptor(t,r)&&Object.defineProperty(t,r,{set:e,get:null===n?function(){return null}:n}),t},t.objHasProp=jr,t.packError=function(t,r,e,n){var o;void 0===r&&(r="JsonqlError"),void 0===e&&(e=0),void 0===n&&(n="");var u={detail:t,className:r,statusCode:e,message:n};return JSON.stringify(((o={}).error=$r(t)||u,o.TS=Tr(),o))},t.packResult=function(t,e){void 0===e&&(e=!1);var n={};return n.data=t,e&&r(e)&&(e.push(Tr()),n.TS=e),JSON.stringify(n)},t.resultHandler=function(t){return G(t,"data")&&!G(t,"error")?t.data:t},t.timestamp=Tr,t.toArray=V,t.toJson=function(t){return"string"==typeof t?function(t){try{return JSON.parse(t)}catch(r){return t}}(t):JSON.parse(JSON.stringify(t))},t.toPayload=kr,t.urlParams=zr,Object.defineProperty(t,"__esModule",{value:!0})})); +!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((t=t||self).jsonqlUtils={})}(this,(function(t){"use strict";var r=Array.isArray,e="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},n="object"==typeof e&&e&&e.Object===Object&&e,o="object"==typeof self&&self&&self.Object===Object&&self,u=n||o||Function("return this")(),i=u.Symbol,a=Object.prototype,c=a.hasOwnProperty,f=a.toString,s=i?i.toStringTag:void 0;var l=Object.prototype.toString;var p=i?i.toStringTag:void 0;function v(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":p&&p in Object(t)?function(t){var r=c.call(t,s),e=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=f.call(t);return n&&(r?t[s]=e:delete t[s]),o}(t):function(t){return l.call(t)}(t)}var d,y,h=(d=Object.getPrototypeOf,y=Object,function(t){return d(y(t))});function g(t){return null!=t&&"object"==typeof t}var b=Function.prototype,_=Object.prototype,j=b.toString,m=_.hasOwnProperty,O=j.call(Object);function w(t){if(!g(t)||"[object Object]"!=v(t))return!1;var r=h(t);if(null===r)return!0;var e=m.call(r,"constructor")&&r.constructor;return"function"==typeof e&&e instanceof e&&j.call(e)==O}var S=i?i.prototype:void 0,P=S?S.toString:void 0;function A(t){if("string"==typeof t)return t;if(r(t))return function(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var u=Array(o);++n-1;);return e}(o,u),function(t,r){for(var e=t.length;e--&&z(r,t[e],0)>-1;);return e}(o,u)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},G=function(t){return r(t)?t:[t]},V=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function H(t,r){return t===r||t!=t&&r!=r}function L(t,r){for(var e=t.length;e--;)if(H(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=L(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function X(t){if(!Z(t))return!1;var r=v(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var Y,tt=u["__core-js_shared__"],rt=(Y=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||""))?"Symbol(src)_1."+Y:"";var et=Function.prototype.toString;var nt=/^\[object .+?Constructor\]$/,ot=Function.prototype,ut=Object.prototype,it=ot.toString,at=ut.hasOwnProperty,ct=RegExp("^"+it.call(at).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ft(t){return!(!Z(t)||function(t){return!!rt&&rt in t}(t))&&(X(t)?ct:nt).test(function(t){if(null!=t){try{return et.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ft(e)?e:void 0}var lt=st(u,"Map"),pt=st(Object,"create");var vt=Object.prototype.hasOwnProperty;var dt=Object.prototype.hasOwnProperty;function yt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Bt(t){return null!=t&&Ut(t.length)&&!X(t)}var $t="object"==typeof t&&t&&!t.nodeType&&t,Dt=$t&&"object"==typeof module&&module&&!module.nodeType&&module,It=Dt&&Dt.exports===$t?u.Buffer:void 0,Qt=(It?It.isBuffer:void 0)||function(){return!1},Gt={};Gt["[object Float32Array]"]=Gt["[object Float64Array]"]=Gt["[object Int8Array]"]=Gt["[object Int16Array]"]=Gt["[object Int32Array]"]=Gt["[object Uint8Array]"]=Gt["[object Uint8ClampedArray]"]=Gt["[object Uint16Array]"]=Gt["[object Uint32Array]"]=!0,Gt["[object Arguments]"]=Gt["[object Array]"]=Gt["[object ArrayBuffer]"]=Gt["[object Boolean]"]=Gt["[object DataView]"]=Gt["[object Date]"]=Gt["[object Error]"]=Gt["[object Function]"]=Gt["[object Map]"]=Gt["[object Number]"]=Gt["[object Object]"]=Gt["[object RegExp]"]=Gt["[object Set]"]=Gt["[object String]"]=Gt["[object WeakMap]"]=!1;var Vt="object"==typeof t&&t&&!t.nodeType&&t,Ht=Vt&&"object"==typeof module&&module&&!module.nodeType&&module,Lt=Ht&&Ht.exports===Vt&&n.process,Kt=function(){try{var t=Ht&&Ht.require&&Ht.require("util").types;return t||Lt&&Lt.binding&&Lt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Zt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return g(t)&&Ut(t.length)&&!!Gt[v(t)]};function Xt(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var Yt=Object.prototype.hasOwnProperty;function tr(t,r,e){var n=t[r];Yt.call(t,r)&&H(n,e)&&(void 0!==e||r in t)||jt(t,r,e)}var rr=/^(?:0|[1-9]\d*)$/;function er(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&rr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(dr);function gr(t,r){return hr(function(t,r,e){return r=vr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,u=vr(n.length-r,0),i=Array(u);++o1?r[n-1]:void 0,u=n>2?r[2]:void 0;for(o=br.length>3&&"function"==typeof o?(n--,o):void 0,u&&function(t,r,e){if(!Z(e))return!1;var n=typeof r;return!!("number"==n?Bt(e)&&er(r,e.length):"string"==n&&r in e)&&H(e[r],t)}(r[0],r[1],u)&&(o=n<3?void 0:o,n=1),t=Object(t);++e0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,G(t))}),Reflect.apply(t,null,e))}},t.chainProcessPromises=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return t.then((function(t){return r(t)}))}),Reflect.apply(t,null,e))}},t.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):_r(t,e)}))}))}),Promise.resolve(!1===r?[]:w(r)?r:{}))},t.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},t.createMutation=Mr,t.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Mr(t,r,e,n))},t.createQuery=Cr,t.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(Cr(t,r,e))},t.dasherize=function(t){return I(t).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},t.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Ar("Unknown "+r+" to extract argument from!")}},t.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Sr(e,r);return n}catch(t){throw new Sr(e,t)}},t.extractSocketPart=Nr,t.formatPayload=xr,t.getCallMethod=function(t){switch(!0){case t===mr[0]:return"query";case t===mr[1]:return"mutation";default:return!1}},t.getConfigValue=function(t,r){return r&&w(r)&&t in r?r[t]:void 0},t.getMutationFromArgs=Br,t.getMutationFromPayload=function(t){var r=Ur(t,Br);if(!1!==r)return r;throw new Pr("[getMutationArgs] Payload is malformed!",t)},t.getNameFromPayload=Jr,t.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Or].join("/"),[r,wr].join("/")]:[r]},t.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},t.getQueryFromArgs=Rr,t.getQueryFromPayload=function(t){var r=Ur(t,Rr);if(!1!==r)return r;throw new Pr("[getQueryArgs] Payload is malformed!",t)},t.groupByNamespace=function(t,r){void 0===r&&(r=!1);var e=Nr(t);if(!1===e){if(r)return t;throw new JsonqlError("groupByNamespace","socket not found in contract!")}var n,o={},u=0;for(var i in e){var a=e[i],c=a.namespace;c&&(o[c]||(++u,o[c]={}),o[c][i]=a,n||a[Or]&&(n=c))}return{size:u,nspGroup:o,publicNamespace:n}},t.inArray=Q,t.injectToFn=function(t,r,e,n){void 0===n&&(n=!1);var o=jr(t,r);return!1===n&&void 0!==o||Object.defineProperty(t,r,{value:e,writable:n}),t},t.isContract=function(t){return!!function(t){return w(t)&&(V(t,"query")||V(t,"mutation")||V(t,"socket"))}(t)&&t},t.isFunc=function(t){if("function"==typeof t)return!0;console.error("Expect to be Function type! Got "+typeof t)},t.isJsonqlErrorObj=$r,t.isNotEmpty=function(t){return void 0!==t&&!1!==t&&null!==t&&""!==I(t)},t.isObjectHasKey=V,t.logger=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];try{window&&window.DEBUG&&Reflect.apply(console.log,console,t)}catch(t){}},t.objDefineProps=function(t,r,e,n){return void 0===n&&(n=null),void 0===Object.getOwnPropertyDescriptor(t,r)&&Object.defineProperty(t,r,{set:e,get:null===n?function(){return null}:n}),t},t.objHasProp=jr,t.packError=function(t,r,e,n){var o;void 0===r&&(r="JsonqlError"),void 0===e&&(e=0),void 0===n&&(n="");var u={detail:t,className:r,statusCode:e,message:n};return JSON.stringify(((o={}).error=$r(t)||u,o.TS=Tr(),o))},t.packResult=function(t,e){void 0===e&&(e=!1);var n={};return n.data=t,e&&r(e)&&(e.push(Tr()),n.TS=e),JSON.stringify(n)},t.resultHandler=function(t){return V(t,"data")&&!V(t,"error")?t.data:t},t.timestamp=Tr,t.toArray=G,t.toJson=function(t){return"string"==typeof t?function(t){try{return JSON.parse(t)}catch(r){return t}}(t):JSON.parse(JSON.stringify(t))},t.toPayload=kr,t.urlParams=zr,Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=browser.js.map diff --git a/packages/utils/main.js b/packages/utils/main.js index 260f1774..642e9e76 100644 --- a/packages/utils/main.js +++ b/packages/utils/main.js @@ -1,2 +1,2 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,r=(t=require("fs"))&&"object"==typeof t&&"default"in t?t.default:t,e=require("path"),n=Array.isArray,o="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},i="object"==typeof o&&o&&o.Object===Object&&o,u="object"==typeof self&&self&&self.Object===Object&&self,a=i||u||Function("return this")(),f=a.Symbol,s=Object.prototype,c=s.hasOwnProperty,h=s.toString,p=f?f.toStringTag:void 0;var l=Object.prototype.toString;var g=f?f.toStringTag:void 0;function y(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":g&&g in Object(t)?function(t){var r=c.call(t,p),e=t[p];try{t[p]=void 0;var n=!0}catch(t){}var o=h.call(t);return n&&(r?t[p]=e:delete t[p]),o}(t):function(t){return l.call(t)}(t)}var v,d,b=(v=Object.getPrototypeOf,d=Object,function(t){return v(d(t))});function w(t){return null!=t&&"object"==typeof t}var _=Function.prototype,m=Object.prototype,A=_.toString,E=m.hasOwnProperty,j=A.call(Object);function P(t){if(!w(t)||"[object Object]"!=y(t))return!1;var r=b(t);if(null===r)return!0;var e=E.call(r,"constructor")&&r.constructor;return"function"==typeof e&&e instanceof e&&A.call(e)==j}var x=f?f.prototype:void 0,O=x?x.toString:void 0;function R(t){if("string"==typeof t)return t;if(n(t))return function(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(o);++n-1;);return e}(o,i),function(t,r){for(var e=t.length;e--&&U(r,t[e],0)>-1;);return e}(o,i)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},V=function(t){return n(t)?t:[t]},H=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function G(t,r){return t===r||t!=t&&r!=r}function Z(t,r){for(var e=t.length;e--;)if(G(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=Z(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function tt(t){if(!X(t))return!1;var r=y(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var rt,et=a["__core-js_shared__"],nt=(rt=/[^.]+$/.exec(et&&et.keys&&et.keys.IE_PROTO||""))?"Symbol(src)_1."+rt:"";var ot=Function.prototype.toString;var it=/^\[object .+?Constructor\]$/,ut=Function.prototype,at=Object.prototype,ft=ut.toString,st=at.hasOwnProperty,ct=RegExp("^"+ft.call(st).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ht(t){return!(!X(t)||function(t){return!!nt&&nt in t}(t))&&(tt(t)?ct:it).test(function(t){if(null!=t){try{return ot.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function pt(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ht(e)?e:void 0}var lt=pt(a,"Map"),gt=pt(Object,"create");var yt=Object.prototype.hasOwnProperty;var vt=Object.prototype.hasOwnProperty;function dt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Ft(t){return null!=t&&zt(t.length)&&!tt(t)}var qt="object"==typeof exports&&exports&&!exports.nodeType&&exports,Jt=qt&&"object"==typeof module&&module&&!module.nodeType&&module,$t=Jt&&Jt.exports===qt?a.Buffer:void 0,Qt=($t?$t.isBuffer:void 0)||function(){return!1},Vt={};Vt["[object Float32Array]"]=Vt["[object Float64Array]"]=Vt["[object Int8Array]"]=Vt["[object Int16Array]"]=Vt["[object Int32Array]"]=Vt["[object Uint8Array]"]=Vt["[object Uint8ClampedArray]"]=Vt["[object Uint16Array]"]=Vt["[object Uint32Array]"]=!0,Vt["[object Arguments]"]=Vt["[object Array]"]=Vt["[object ArrayBuffer]"]=Vt["[object Boolean]"]=Vt["[object DataView]"]=Vt["[object Date]"]=Vt["[object Error]"]=Vt["[object Function]"]=Vt["[object Map]"]=Vt["[object Number]"]=Vt["[object Object]"]=Vt["[object RegExp]"]=Vt["[object Set]"]=Vt["[object String]"]=Vt["[object WeakMap]"]=!1;var Ht="object"==typeof exports&&exports&&!exports.nodeType&&exports,Gt=Ht&&"object"==typeof module&&module&&!module.nodeType&&module,Zt=Gt&&Gt.exports===Ht&&i.process,Kt=function(){try{var t=Gt&&Gt.require&&Gt.require("util").types;return t||Zt&&Zt.binding&&Zt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Xt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return w(t)&&zt(t.length)&&!!Vt[y(t)]};function tr(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var rr=Object.prototype.hasOwnProperty;function er(t,r,e){var n=t[r];rr.call(t,r)&&G(n,e)&&(void 0!==e||r in t)||At(t,r,e)}var nr=/^(?:0|[1-9]\d*)$/;function or(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&nr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(vr);function wr(t,r){return br(function(t,r,e){return r=yr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=yr(n.length-r,0),u=Array(i);++o1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=_r.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!X(e))return!1;var n=typeof r;return!!("number"==n?Ft(e)&&or(r,e.length):"string"==n&&r in e)&&G(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++e>18&63]+Vr[o>>12&63]+Vr[o>>6&63]+Vr[63&o]);return i.join("")}function Xr(t){var r;Zr||Kr();for(var e=t.length,n=e%3,o="",i=[],u=0,a=e-n;ua?a:u+16383));return 1===n?(r=t[e-1],o+=Vr[r>>2],o+=Vr[r<<4&63],o+="=="):2===n&&(r=(t[e-2]<<8)+t[e-1],o+=Vr[r>>10],o+=Vr[r>>4&63],o+=Vr[r<<2&63],o+="="),i.push(o),i.join("")}function te(t,r,e,n,o){var i,u,a=8*o-n-1,f=(1<>1,c=-7,h=e?o-1:0,p=e?-1:1,l=t[r+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[r+h],h+=p,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=n;c>0;u=256*u+t[r+h],h+=p,c-=8);if(0===i)i=1-s;else{if(i===f)return u?NaN:1/0*(l?-1:1);u+=Math.pow(2,n),i-=s}return(l?-1:1)*u*Math.pow(2,i-n)}function re(t,r,e,n,o,i){var u,a,f,s=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:i-1,g=n?1:-1,y=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(a=isNaN(r)?1:0,u=c):(u=Math.floor(Math.log(r)/Math.LN2),r*(f=Math.pow(2,-u))<1&&(u--,f*=2),(r+=u+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(u++,f/=2),u+h>=c?(a=0,u=c):u+h>=1?(a=(r*f-1)*Math.pow(2,o),u+=h):(a=r*Math.pow(2,h-1)*Math.pow(2,o),u=0));o>=8;t[e+l]=255&a,l+=g,a/=256,o-=8);for(u=u<0;t[e+l]=255&u,l+=g,u/=256,s-=8);t[e+l-g]|=128*y}var ee={}.toString,ne=Array.isArray||function(t){return"[object Array]"==ee.call(t)};function oe(){return ue.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function ie(t,r){if(oe()=oe())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+oe().toString(16)+" bytes");return 0|t}function pe(t){return!(null==t||!t._isBuffer)}function le(t,r){if(pe(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var e=t.length;if(0===e)return 0;for(var n=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return ke(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return Le(t).length;default:if(n)return ke(t).length;r=(""+r).toLowerCase(),n=!0}}function ge(t,r,e){var n=!1;if((void 0===r||r<0)&&(r=0),r>this.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return Re(this,r,e);case"utf8":case"utf-8":return Pe(this,r,e);case"ascii":return xe(this,r,e);case"latin1":case"binary":return Oe(this,r,e);case"base64":return je(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Se(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function ye(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function ve(t,r,e,n,o){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=o?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(o)return-1;e=t.length-1}else if(e<0){if(!o)return-1;e=0}if("string"==typeof r&&(r=ue.from(r,n)),pe(r))return 0===r.length?-1:de(t,r,e,n,o);if("number"==typeof r)return r&=255,ue.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):de(t,[r],e,n,o);throw new TypeError("val must be string, number or Buffer")}function de(t,r,e,n,o){var i,u=1,a=t.length,f=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;u=2,a/=2,f/=2,e/=2}function s(t,r){return 1===u?t[r]:t.readUInt16BE(r*u)}if(o){var c=-1;for(i=e;ia&&(e=a-f),i=e;i>=0;i--){for(var h=!0,p=0;po&&(n=o):n=o;var i=r.length;if(i%2!=0)throw new TypeError("Invalid hex string");n>i/2&&(n=i/2);for(var u=0;u>8,o=e%256,i.push(o),i.push(n);return i}(r,t.length-e),t,e,n)}function je(t,r,e){return 0===r&&e===t.length?Xr(t):Xr(t.slice(r,e))}function Pe(t,r,e){e=Math.min(t.length,e);for(var n=[],o=r;o239?4:s>223?3:s>191?2:1;if(o+h<=e)switch(h){case 1:s<128&&(c=s);break;case 2:128==(192&(i=t[o+1]))&&(f=(31&s)<<6|63&i)>127&&(c=f);break;case 3:i=t[o+1],u=t[o+2],128==(192&i)&&128==(192&u)&&(f=(15&s)<<12|(63&i)<<6|63&u)>2047&&(f<55296||f>57343)&&(c=f);break;case 4:i=t[o+1],u=t[o+2],a=t[o+3],128==(192&i)&&128==(192&u)&&128==(192&a)&&(f=(15&s)<<18|(63&i)<<12|(63&u)<<6|63&a)>65535&&f<1114112&&(c=f)}null===c?(c=65533,h=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),o+=h}return function(t){var r=t.length;if(r<=4096)return String.fromCharCode.apply(String,t);var e="",n=0;for(;n0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),""},ue.prototype.compare=function(t,r,e,n,o){if(!pe(t))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),r<0||e>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&r>=e)return 0;if(n>=o)return-1;if(r>=e)return 1;if(this===t)return 0;for(var i=(o>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),a=Math.min(i,u),f=this.slice(n,o),s=t.slice(r,e),c=0;co)&&(e=o),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return be(this,t,r,e);case"utf8":case"utf-8":return we(this,t,r,e);case"ascii":return _e(this,t,r,e);case"latin1":case"binary":return me(this,t,r,e);case"base64":return Ae(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ee(this,t,r,e);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},ue.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function xe(t,r,e){var n="";e=Math.min(t.length,e);for(var o=r;on)&&(e=n);for(var o="",i=r;ie)throw new RangeError("Trying to access beyond buffer length")}function Ue(t,r,e,n,o,i){if(!pe(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>o||rt.length)throw new RangeError("Index out of range")}function Be(t,r,e,n){r<0&&(r=65535+r+1);for(var o=0,i=Math.min(t.length-e,2);o>>8*(n?o:1-o)}function Ie(t,r,e,n){r<0&&(r=4294967295+r+1);for(var o=0,i=Math.min(t.length-e,4);o>>8*(n?o:3-o)&255}function Ne(t,r,e,n,o,i){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Ce(t,r,e,n,o){return o||Ne(t,0,e,4),re(t,r,e,n,23,4),e+4}function Ye(t,r,e,n,o){return o||Ne(t,0,e,8),re(t,r,e,n,52,8),e+8}ue.prototype.slice=function(t,r){var e,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r0&&(o*=256);)n+=this[t+--r]*o;return n},ue.prototype.readUInt8=function(t,r){return r||Te(t,1,this.length),this[t]},ue.prototype.readUInt16LE=function(t,r){return r||Te(t,2,this.length),this[t]|this[t+1]<<8},ue.prototype.readUInt16BE=function(t,r){return r||Te(t,2,this.length),this[t]<<8|this[t+1]},ue.prototype.readUInt32LE=function(t,r){return r||Te(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ue.prototype.readUInt32BE=function(t,r){return r||Te(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ue.prototype.readIntLE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=this[t],o=1,i=0;++i=(o*=128)&&(n-=Math.pow(2,8*r)),n},ue.prototype.readIntBE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=r,o=1,i=this[t+--n];n>0&&(o*=256);)i+=this[t+--n]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*r)),i},ue.prototype.readInt8=function(t,r){return r||Te(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ue.prototype.readInt16LE=function(t,r){r||Te(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt16BE=function(t,r){r||Te(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt32LE=function(t,r){return r||Te(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ue.prototype.readInt32BE=function(t,r){return r||Te(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ue.prototype.readFloatLE=function(t,r){return r||Te(t,4,this.length),te(this,t,!0,23,4)},ue.prototype.readFloatBE=function(t,r){return r||Te(t,4,this.length),te(this,t,!1,23,4)},ue.prototype.readDoubleLE=function(t,r){return r||Te(t,8,this.length),te(this,t,!0,52,8)},ue.prototype.readDoubleBE=function(t,r){return r||Te(t,8,this.length),te(this,t,!1,52,8)},ue.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r|=0,e|=0,n)||Ue(this,t,r,e,Math.pow(2,8*e)-1,0);var o=1,i=0;for(this[r]=255&t;++i=0&&(i*=256);)this[r+o]=t/i&255;return r+e},ue.prototype.writeUInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,255,0),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[r]=255&t,r+1},ue.prototype.writeUInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeUInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeUInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t):Ie(this,t,r,!0),r+4},ue.prototype.writeUInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=0,u=1,a=0;for(this[r]=255&t;++i>0)-a&255;return r+e},ue.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=e-1,u=1,a=0;for(this[r+i]=255&t;--i>=0&&(u*=256);)t<0&&0===a&&0!==this[r+i+1]&&(a=1),this[r+i]=(t/u>>0)-a&255;return r+e},ue.prototype.writeInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,127,-128),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[r]=255&t,r+1},ue.prototype.writeInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24):Ie(this,t,r,!0),r+4},ue.prototype.writeInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeFloatLE=function(t,r,e){return Ce(this,t,r,!0,e)},ue.prototype.writeFloatBE=function(t,r,e){return Ce(this,t,r,!1,e)},ue.prototype.writeDoubleLE=function(t,r,e){return Ye(this,t,r,!0,e)},ue.prototype.writeDoubleBE=function(t,r,e){return Ye(this,t,r,!1,e)},ue.prototype.copy=function(t,r,e,n){if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--o)t[o+r]=this[o+e];else if(i<1e3||!ue.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(i=r;i55295&&e<57344){if(!o){if(e>56319){(r-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(r-=3)>-1&&i.push(239,191,189);continue}o=e;continue}if(e<56320){(r-=3)>-1&&i.push(239,191,189),o=e;continue}e=65536+(o-55296<<10|e-56320)}else o&&(r-=3)>-1&&i.push(239,191,189);if(o=null,e<128){if((r-=1)<0)break;i.push(e)}else if(e<2048){if((r-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function Le(t){return function(t){var r,e,n,o,i,u;Zr||Kr();var a=t.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");i="="===t[a-2]?2:"="===t[a-1]?1:0,u=new Gr(3*a/4-i),n=i>0?a-4:a;var f=0;for(r=0,e=0;r>16&255,u[f++]=o>>8&255,u[f++]=255&o;return 2===i?(o=Hr[t.charCodeAt(r)]<<2|Hr[t.charCodeAt(r+1)]>>4,u[f++]=255&o):1===i&&(o=Hr[t.charCodeAt(r)]<<10|Hr[t.charCodeAt(r+1)]<<4|Hr[t.charCodeAt(r+2)]>>2,u[f++]=o>>8&255,u[f++]=255&o),u}(function(t){if((t=function(t){if(t.trim)return t.trim();return t.replace(/^\s+|\s+$/g,"")}(t).replace(Me,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ze(t,r,e,n){for(var o=0;o=r.length||o>=t.length);++o)r[o+e]=t[o];return o}function Fe(t){return null!=t&&(!!t._isBuffer||qe(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&qe(t.slice(0,0))}(t))}function qe(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var Je=function(t,r){if(r instanceof Error){var e={};return Object.getOwnPropertyNames(r).forEach((function(t){e[t]=r[t]})),e}return r};var $e=function(t,r){try{var e=t.headers.accept.split(",");return r?e.filter((function(t){return t===r})):e}catch(t){return[]}},Qe=function(t,r){return!!$e(t,r).length},Ve=function(t,r){return t.path===r.jsonqlPath};exports.VERSION="1.0.1",exports.buff=function(t,r){return void 0===r&&(r="base64"),Fe(t)?t:new ue.from(t,r)},exports.cacheBurst=Cr,exports.cacheBurstUrl=function(t){return Nr(t,Cr())},exports.chainFns=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,V(t))}),Reflect.apply(t,null,e))}},exports.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):mr(t,e)}))}))}),Promise.resolve(!1===r?[]:P(r)?r:{}))},exports.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},exports.createMutation=Fr,exports.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Fr(t,r,e,n))},exports.createQuery=zr,exports.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(zr(t,r,e))},exports.dasherize=Ir,exports.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Tr("Unknown "+r+" to extract argument from!")}},exports.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Rr(e,r);return n}catch(t){throw new Rr(e,t)}},exports.extractSocketPart=Ur,exports.findFromContract=function(t,e,n){return!!(n[t]&&n[t][e]&&n[t][e].file&&r.existsSync(n[t][e].file))&&n[t][e].file},exports.formatPayload=Dr,exports.getCallMethod=function(t){switch(!0){case t===jr[0]:return"query";case t===jr[1]:return"mutation";default:return!1}},exports.getConfigValue=function(t,r){return r&&P(r)&&t in r?r[t]:void 0},exports.getDocLen=function(t){return ue.byteLength(t,"utf8")},exports.getMutationFromArgs=$r,exports.getMutationFromPayload=function(t){var r=Jr(t,$r);if(!1!==r)return r;throw new Sr("[getMutationArgs] Payload is malformed!",t)},exports.getNameFromPayload=kr,exports.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Pr].join("/"),[r,xr].join("/")]:[r]},exports.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},exports.getPathToFn=function(t,n,o){var i=o.resolverDir,u=Ir(t),a=[];o.contract&&o.contract[n]&&o.contract[n].path&&a.push(o.contract[n].path),a.push(e.join(i,n,u,[Or,Er].join("."))),a.push(e.join(i,n,[u,Er].join(".")));for(var f=a.length,s=0;s=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(o);++n-1;);return e}(o,i),function(t,r){for(var e=t.length;e--&&U(r,t[e],0)>-1;);return e}(o,i)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},V=function(t){return n(t)?t:[t]},H=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function G(t,r){return t===r||t!=t&&r!=r}function Z(t,r){for(var e=t.length;e--;)if(G(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=Z(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function tt(t){if(!X(t))return!1;var r=y(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var rt,et=a["__core-js_shared__"],nt=(rt=/[^.]+$/.exec(et&&et.keys&&et.keys.IE_PROTO||""))?"Symbol(src)_1."+rt:"";var ot=Function.prototype.toString;var it=/^\[object .+?Constructor\]$/,ut=Function.prototype,at=Object.prototype,ft=ut.toString,st=at.hasOwnProperty,ct=RegExp("^"+ft.call(st).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ht(t){return!(!X(t)||function(t){return!!nt&&nt in t}(t))&&(tt(t)?ct:it).test(function(t){if(null!=t){try{return ot.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function pt(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ht(e)?e:void 0}var lt=pt(a,"Map"),gt=pt(Object,"create");var yt=Object.prototype.hasOwnProperty;var vt=Object.prototype.hasOwnProperty;function dt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Ft(t){return null!=t&&zt(t.length)&&!tt(t)}var qt="object"==typeof exports&&exports&&!exports.nodeType&&exports,Jt=qt&&"object"==typeof module&&module&&!module.nodeType&&module,$t=Jt&&Jt.exports===qt?a.Buffer:void 0,Qt=($t?$t.isBuffer:void 0)||function(){return!1},Vt={};Vt["[object Float32Array]"]=Vt["[object Float64Array]"]=Vt["[object Int8Array]"]=Vt["[object Int16Array]"]=Vt["[object Int32Array]"]=Vt["[object Uint8Array]"]=Vt["[object Uint8ClampedArray]"]=Vt["[object Uint16Array]"]=Vt["[object Uint32Array]"]=!0,Vt["[object Arguments]"]=Vt["[object Array]"]=Vt["[object ArrayBuffer]"]=Vt["[object Boolean]"]=Vt["[object DataView]"]=Vt["[object Date]"]=Vt["[object Error]"]=Vt["[object Function]"]=Vt["[object Map]"]=Vt["[object Number]"]=Vt["[object Object]"]=Vt["[object RegExp]"]=Vt["[object Set]"]=Vt["[object String]"]=Vt["[object WeakMap]"]=!1;var Ht="object"==typeof exports&&exports&&!exports.nodeType&&exports,Gt=Ht&&"object"==typeof module&&module&&!module.nodeType&&module,Zt=Gt&&Gt.exports===Ht&&i.process,Kt=function(){try{var t=Gt&&Gt.require&&Gt.require("util").types;return t||Zt&&Zt.binding&&Zt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Xt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return w(t)&&zt(t.length)&&!!Vt[y(t)]};function tr(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var rr=Object.prototype.hasOwnProperty;function er(t,r,e){var n=t[r];rr.call(t,r)&&G(n,e)&&(void 0!==e||r in t)||At(t,r,e)}var nr=/^(?:0|[1-9]\d*)$/;function or(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&nr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(vr);function wr(t,r){return br(function(t,r,e){return r=yr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=yr(n.length-r,0),u=Array(i);++o1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=_r.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!X(e))return!1;var n=typeof r;return!!("number"==n?Ft(e)&&or(r,e.length):"string"==n&&r in e)&&G(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++e>18&63]+Vr[o>>12&63]+Vr[o>>6&63]+Vr[63&o]);return i.join("")}function Xr(t){var r;Zr||Kr();for(var e=t.length,n=e%3,o="",i=[],u=0,a=e-n;ua?a:u+16383));return 1===n?(r=t[e-1],o+=Vr[r>>2],o+=Vr[r<<4&63],o+="=="):2===n&&(r=(t[e-2]<<8)+t[e-1],o+=Vr[r>>10],o+=Vr[r>>4&63],o+=Vr[r<<2&63],o+="="),i.push(o),i.join("")}function te(t,r,e,n,o){var i,u,a=8*o-n-1,f=(1<>1,c=-7,h=e?o-1:0,p=e?-1:1,l=t[r+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[r+h],h+=p,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=n;c>0;u=256*u+t[r+h],h+=p,c-=8);if(0===i)i=1-s;else{if(i===f)return u?NaN:1/0*(l?-1:1);u+=Math.pow(2,n),i-=s}return(l?-1:1)*u*Math.pow(2,i-n)}function re(t,r,e,n,o,i){var u,a,f,s=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:i-1,g=n?1:-1,y=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(a=isNaN(r)?1:0,u=c):(u=Math.floor(Math.log(r)/Math.LN2),r*(f=Math.pow(2,-u))<1&&(u--,f*=2),(r+=u+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(u++,f/=2),u+h>=c?(a=0,u=c):u+h>=1?(a=(r*f-1)*Math.pow(2,o),u+=h):(a=r*Math.pow(2,h-1)*Math.pow(2,o),u=0));o>=8;t[e+l]=255&a,l+=g,a/=256,o-=8);for(u=u<0;t[e+l]=255&u,l+=g,u/=256,s-=8);t[e+l-g]|=128*y}var ee={}.toString,ne=Array.isArray||function(t){return"[object Array]"==ee.call(t)};function oe(){return ue.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function ie(t,r){if(oe()=oe())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+oe().toString(16)+" bytes");return 0|t}function pe(t){return!(null==t||!t._isBuffer)}function le(t,r){if(pe(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var e=t.length;if(0===e)return 0;for(var n=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return ke(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return Le(t).length;default:if(n)return ke(t).length;r=(""+r).toLowerCase(),n=!0}}function ge(t,r,e){var n=!1;if((void 0===r||r<0)&&(r=0),r>this.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return Re(this,r,e);case"utf8":case"utf-8":return Pe(this,r,e);case"ascii":return xe(this,r,e);case"latin1":case"binary":return Oe(this,r,e);case"base64":return je(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Se(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function ye(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function ve(t,r,e,n,o){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=o?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(o)return-1;e=t.length-1}else if(e<0){if(!o)return-1;e=0}if("string"==typeof r&&(r=ue.from(r,n)),pe(r))return 0===r.length?-1:de(t,r,e,n,o);if("number"==typeof r)return r&=255,ue.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):de(t,[r],e,n,o);throw new TypeError("val must be string, number or Buffer")}function de(t,r,e,n,o){var i,u=1,a=t.length,f=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;u=2,a/=2,f/=2,e/=2}function s(t,r){return 1===u?t[r]:t.readUInt16BE(r*u)}if(o){var c=-1;for(i=e;ia&&(e=a-f),i=e;i>=0;i--){for(var h=!0,p=0;po&&(n=o):n=o;var i=r.length;if(i%2!=0)throw new TypeError("Invalid hex string");n>i/2&&(n=i/2);for(var u=0;u>8,o=e%256,i.push(o),i.push(n);return i}(r,t.length-e),t,e,n)}function je(t,r,e){return 0===r&&e===t.length?Xr(t):Xr(t.slice(r,e))}function Pe(t,r,e){e=Math.min(t.length,e);for(var n=[],o=r;o239?4:s>223?3:s>191?2:1;if(o+h<=e)switch(h){case 1:s<128&&(c=s);break;case 2:128==(192&(i=t[o+1]))&&(f=(31&s)<<6|63&i)>127&&(c=f);break;case 3:i=t[o+1],u=t[o+2],128==(192&i)&&128==(192&u)&&(f=(15&s)<<12|(63&i)<<6|63&u)>2047&&(f<55296||f>57343)&&(c=f);break;case 4:i=t[o+1],u=t[o+2],a=t[o+3],128==(192&i)&&128==(192&u)&&128==(192&a)&&(f=(15&s)<<18|(63&i)<<12|(63&u)<<6|63&a)>65535&&f<1114112&&(c=f)}null===c?(c=65533,h=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),o+=h}return function(t){var r=t.length;if(r<=4096)return String.fromCharCode.apply(String,t);var e="",n=0;for(;n0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),""},ue.prototype.compare=function(t,r,e,n,o){if(!pe(t))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),r<0||e>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&r>=e)return 0;if(n>=o)return-1;if(r>=e)return 1;if(this===t)return 0;for(var i=(o>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),a=Math.min(i,u),f=this.slice(n,o),s=t.slice(r,e),c=0;co)&&(e=o),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return be(this,t,r,e);case"utf8":case"utf-8":return we(this,t,r,e);case"ascii":return _e(this,t,r,e);case"latin1":case"binary":return me(this,t,r,e);case"base64":return Ae(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ee(this,t,r,e);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},ue.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function xe(t,r,e){var n="";e=Math.min(t.length,e);for(var o=r;on)&&(e=n);for(var o="",i=r;ie)throw new RangeError("Trying to access beyond buffer length")}function Ue(t,r,e,n,o,i){if(!pe(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>o||rt.length)throw new RangeError("Index out of range")}function Be(t,r,e,n){r<0&&(r=65535+r+1);for(var o=0,i=Math.min(t.length-e,2);o>>8*(n?o:1-o)}function Ie(t,r,e,n){r<0&&(r=4294967295+r+1);for(var o=0,i=Math.min(t.length-e,4);o>>8*(n?o:3-o)&255}function Ne(t,r,e,n,o,i){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Ce(t,r,e,n,o){return o||Ne(t,0,e,4),re(t,r,e,n,23,4),e+4}function Ye(t,r,e,n,o){return o||Ne(t,0,e,8),re(t,r,e,n,52,8),e+8}ue.prototype.slice=function(t,r){var e,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r0&&(o*=256);)n+=this[t+--r]*o;return n},ue.prototype.readUInt8=function(t,r){return r||Te(t,1,this.length),this[t]},ue.prototype.readUInt16LE=function(t,r){return r||Te(t,2,this.length),this[t]|this[t+1]<<8},ue.prototype.readUInt16BE=function(t,r){return r||Te(t,2,this.length),this[t]<<8|this[t+1]},ue.prototype.readUInt32LE=function(t,r){return r||Te(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ue.prototype.readUInt32BE=function(t,r){return r||Te(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ue.prototype.readIntLE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=this[t],o=1,i=0;++i=(o*=128)&&(n-=Math.pow(2,8*r)),n},ue.prototype.readIntBE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=r,o=1,i=this[t+--n];n>0&&(o*=256);)i+=this[t+--n]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*r)),i},ue.prototype.readInt8=function(t,r){return r||Te(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ue.prototype.readInt16LE=function(t,r){r||Te(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt16BE=function(t,r){r||Te(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt32LE=function(t,r){return r||Te(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ue.prototype.readInt32BE=function(t,r){return r||Te(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ue.prototype.readFloatLE=function(t,r){return r||Te(t,4,this.length),te(this,t,!0,23,4)},ue.prototype.readFloatBE=function(t,r){return r||Te(t,4,this.length),te(this,t,!1,23,4)},ue.prototype.readDoubleLE=function(t,r){return r||Te(t,8,this.length),te(this,t,!0,52,8)},ue.prototype.readDoubleBE=function(t,r){return r||Te(t,8,this.length),te(this,t,!1,52,8)},ue.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r|=0,e|=0,n)||Ue(this,t,r,e,Math.pow(2,8*e)-1,0);var o=1,i=0;for(this[r]=255&t;++i=0&&(i*=256);)this[r+o]=t/i&255;return r+e},ue.prototype.writeUInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,255,0),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[r]=255&t,r+1},ue.prototype.writeUInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeUInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeUInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t):Ie(this,t,r,!0),r+4},ue.prototype.writeUInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=0,u=1,a=0;for(this[r]=255&t;++i>0)-a&255;return r+e},ue.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=e-1,u=1,a=0;for(this[r+i]=255&t;--i>=0&&(u*=256);)t<0&&0===a&&0!==this[r+i+1]&&(a=1),this[r+i]=(t/u>>0)-a&255;return r+e},ue.prototype.writeInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,127,-128),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[r]=255&t,r+1},ue.prototype.writeInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24):Ie(this,t,r,!0),r+4},ue.prototype.writeInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeFloatLE=function(t,r,e){return Ce(this,t,r,!0,e)},ue.prototype.writeFloatBE=function(t,r,e){return Ce(this,t,r,!1,e)},ue.prototype.writeDoubleLE=function(t,r,e){return Ye(this,t,r,!0,e)},ue.prototype.writeDoubleBE=function(t,r,e){return Ye(this,t,r,!1,e)},ue.prototype.copy=function(t,r,e,n){if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--o)t[o+r]=this[o+e];else if(i<1e3||!ue.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(i=r;i55295&&e<57344){if(!o){if(e>56319){(r-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(r-=3)>-1&&i.push(239,191,189);continue}o=e;continue}if(e<56320){(r-=3)>-1&&i.push(239,191,189),o=e;continue}e=65536+(o-55296<<10|e-56320)}else o&&(r-=3)>-1&&i.push(239,191,189);if(o=null,e<128){if((r-=1)<0)break;i.push(e)}else if(e<2048){if((r-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function Le(t){return function(t){var r,e,n,o,i,u;Zr||Kr();var a=t.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");i="="===t[a-2]?2:"="===t[a-1]?1:0,u=new Gr(3*a/4-i),n=i>0?a-4:a;var f=0;for(r=0,e=0;r>16&255,u[f++]=o>>8&255,u[f++]=255&o;return 2===i?(o=Hr[t.charCodeAt(r)]<<2|Hr[t.charCodeAt(r+1)]>>4,u[f++]=255&o):1===i&&(o=Hr[t.charCodeAt(r)]<<10|Hr[t.charCodeAt(r+1)]<<4|Hr[t.charCodeAt(r+2)]>>2,u[f++]=o>>8&255,u[f++]=255&o),u}(function(t){if((t=function(t){if(t.trim)return t.trim();return t.replace(/^\s+|\s+$/g,"")}(t).replace(Me,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ze(t,r,e,n){for(var o=0;o=r.length||o>=t.length);++o)r[o+e]=t[o];return o}function Fe(t){return null!=t&&(!!t._isBuffer||qe(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&qe(t.slice(0,0))}(t))}function qe(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var Je=function(t,r){if(r instanceof Error){var e={};return Object.getOwnPropertyNames(r).forEach((function(t){e[t]=r[t]})),e}return r};var $e=function(t,r){try{var e=t.headers.accept.split(",");return r?e.filter((function(t){return t===r})):e}catch(t){return[]}},Qe=function(t,r){return!!$e(t,r).length},Ve=function(t,r){return t.path===r.jsonqlPath};exports.VERSION="1.0.2",exports.buff=function(t,r){return void 0===r&&(r="base64"),Fe(t)?t:new ue.from(t,r)},exports.cacheBurst=Cr,exports.cacheBurstUrl=function(t){return Nr(t,Cr())},exports.chainFns=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,V(t))}),Reflect.apply(t,null,e))}},exports.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):mr(t,e)}))}))}),Promise.resolve(!1===r?[]:P(r)?r:{}))},exports.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},exports.createMutation=Fr,exports.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Fr(t,r,e,n))},exports.createQuery=zr,exports.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(zr(t,r,e))},exports.dasherize=Ir,exports.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Tr("Unknown "+r+" to extract argument from!")}},exports.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Rr(e,r);return n}catch(t){throw new Rr(e,t)}},exports.extractSocketPart=Ur,exports.findFromContract=function(t,e,n){return!!(n[t]&&n[t][e]&&n[t][e].file&&r.existsSync(n[t][e].file))&&n[t][e].file},exports.formatPayload=Dr,exports.getCallMethod=function(t){switch(!0){case t===jr[0]:return"query";case t===jr[1]:return"mutation";default:return!1}},exports.getConfigValue=function(t,r){return r&&P(r)&&t in r?r[t]:void 0},exports.getDocLen=function(t){return ue.byteLength(t,"utf8")},exports.getMutationFromArgs=$r,exports.getMutationFromPayload=function(t){var r=Jr(t,$r);if(!1!==r)return r;throw new Sr("[getMutationArgs] Payload is malformed!",t)},exports.getNameFromPayload=kr,exports.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Pr].join("/"),[r,xr].join("/")]:[r]},exports.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},exports.getPathToFn=function(t,n,o){var i=o.resolverDir,u=Ir(t),a=[];o.contract&&o.contract[n]&&o.contract[n].path&&a.push(o.contract[n].path),a.push(e.join(i,n,u,[Or,Er].join("."))),a.push(e.join(i,n,[u,Er].join(".")));for(var f=a.length,s=0;s resolvers * 2. the size of the object (1 all private, 2 mixed public with private) * 3. which namespace is public */ -export function groupByNamespace(contract, fallback = false) { +export function groupByNamespace(contract) { let socket = extractSocketPart(contract) if (socket === false) { - if (fallback) { - return contract; // just return the whole contract - } throw new JsonqlError('groupByNamespace', SOCKET_NOT_FOUND_ERR) } let nspGroup = {} @@ -32,14 +28,13 @@ export function groupByNamespace(contract, fallback = false) { let { namespace } = params if (namespace) { if (!nspGroup[namespace]) { - ++size; + ++size nspGroup[namespace] = {} } nspGroup[namespace][resolverName] = params - if (!publicNamespace) { - if (params[PUBLIC_KEY]) { - publicNamespace = namespace - } + // get the public namespace + if (!publicNamespace && params[PUBLIC_KEY]) { + publicNamespace = namespace } } } diff --git a/packages/utils/tests/namespace.test.js b/packages/utils/tests/namespace.test.js index fc454a26..1ef08424 100644 --- a/packages/utils/tests/namespace.test.js +++ b/packages/utils/tests/namespace.test.js @@ -2,7 +2,7 @@ const test = require('ava') const utilFns = require('../main') const { merge } = require('lodash-es') -const debug = require('debug')('jsonql-utils:test:fn') +const debug = require('debug')('jsonql-utils:test:ns') const { groupByNamespace } = utilFns const { join } = require('path') @@ -18,8 +18,6 @@ test.before(t => { t.context.checkOptionsFn = (a, b, c) => merge({}, a, b, c) }) - - test(`It should have certain functions in the export`, t => { t.truthy(utilFns.toArray) @@ -30,7 +28,11 @@ test(`It should have certain functions in the export`, t => { test('It should able to give me two list from the contract', t => { const { size, nspGroup, publicNamespace } = groupByNamespace(contract) + debug(nspGroup) + t.is(size, 2) t.is(publicNamespace, 'jsonql/public') + + }) -- Gitee From 9b838b37adb4ee4e15e8b210cf6b3ae41f1c9a97 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 21:15:31 +0800 Subject: [PATCH 06/19] jsonql-utils 1.0.2 --- packages/utils/browser.js | 2 +- packages/utils/main.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/utils/browser.js b/packages/utils/browser.js index b695710f..0e015648 100644 --- a/packages/utils/browser.js +++ b/packages/utils/browser.js @@ -1,2 +1,2 @@ -!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((t=t||self).jsonqlUtils={})}(this,(function(t){"use strict";var r=Array.isArray,e="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},n="object"==typeof e&&e&&e.Object===Object&&e,o="object"==typeof self&&self&&self.Object===Object&&self,u=n||o||Function("return this")(),i=u.Symbol,a=Object.prototype,c=a.hasOwnProperty,f=a.toString,s=i?i.toStringTag:void 0;var l=Object.prototype.toString;var p=i?i.toStringTag:void 0;function v(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":p&&p in Object(t)?function(t){var r=c.call(t,s),e=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=f.call(t);return n&&(r?t[s]=e:delete t[s]),o}(t):function(t){return l.call(t)}(t)}var d,y,h=(d=Object.getPrototypeOf,y=Object,function(t){return d(y(t))});function g(t){return null!=t&&"object"==typeof t}var b=Function.prototype,_=Object.prototype,j=b.toString,m=_.hasOwnProperty,O=j.call(Object);function w(t){if(!g(t)||"[object Object]"!=v(t))return!1;var r=h(t);if(null===r)return!0;var e=m.call(r,"constructor")&&r.constructor;return"function"==typeof e&&e instanceof e&&j.call(e)==O}var S=i?i.prototype:void 0,P=S?S.toString:void 0;function A(t){if("string"==typeof t)return t;if(r(t))return function(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var u=Array(o);++n-1;);return e}(o,u),function(t,r){for(var e=t.length;e--&&z(r,t[e],0)>-1;);return e}(o,u)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},G=function(t){return r(t)?t:[t]},V=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function H(t,r){return t===r||t!=t&&r!=r}function L(t,r){for(var e=t.length;e--;)if(H(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=L(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function X(t){if(!Z(t))return!1;var r=v(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var Y,tt=u["__core-js_shared__"],rt=(Y=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||""))?"Symbol(src)_1."+Y:"";var et=Function.prototype.toString;var nt=/^\[object .+?Constructor\]$/,ot=Function.prototype,ut=Object.prototype,it=ot.toString,at=ut.hasOwnProperty,ct=RegExp("^"+it.call(at).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ft(t){return!(!Z(t)||function(t){return!!rt&&rt in t}(t))&&(X(t)?ct:nt).test(function(t){if(null!=t){try{return et.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ft(e)?e:void 0}var lt=st(u,"Map"),pt=st(Object,"create");var vt=Object.prototype.hasOwnProperty;var dt=Object.prototype.hasOwnProperty;function yt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Bt(t){return null!=t&&Ut(t.length)&&!X(t)}var $t="object"==typeof t&&t&&!t.nodeType&&t,Dt=$t&&"object"==typeof module&&module&&!module.nodeType&&module,It=Dt&&Dt.exports===$t?u.Buffer:void 0,Qt=(It?It.isBuffer:void 0)||function(){return!1},Gt={};Gt["[object Float32Array]"]=Gt["[object Float64Array]"]=Gt["[object Int8Array]"]=Gt["[object Int16Array]"]=Gt["[object Int32Array]"]=Gt["[object Uint8Array]"]=Gt["[object Uint8ClampedArray]"]=Gt["[object Uint16Array]"]=Gt["[object Uint32Array]"]=!0,Gt["[object Arguments]"]=Gt["[object Array]"]=Gt["[object ArrayBuffer]"]=Gt["[object Boolean]"]=Gt["[object DataView]"]=Gt["[object Date]"]=Gt["[object Error]"]=Gt["[object Function]"]=Gt["[object Map]"]=Gt["[object Number]"]=Gt["[object Object]"]=Gt["[object RegExp]"]=Gt["[object Set]"]=Gt["[object String]"]=Gt["[object WeakMap]"]=!1;var Vt="object"==typeof t&&t&&!t.nodeType&&t,Ht=Vt&&"object"==typeof module&&module&&!module.nodeType&&module,Lt=Ht&&Ht.exports===Vt&&n.process,Kt=function(){try{var t=Ht&&Ht.require&&Ht.require("util").types;return t||Lt&&Lt.binding&&Lt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Zt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return g(t)&&Ut(t.length)&&!!Gt[v(t)]};function Xt(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var Yt=Object.prototype.hasOwnProperty;function tr(t,r,e){var n=t[r];Yt.call(t,r)&&H(n,e)&&(void 0!==e||r in t)||jt(t,r,e)}var rr=/^(?:0|[1-9]\d*)$/;function er(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&rr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(dr);function gr(t,r){return hr(function(t,r,e){return r=vr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,u=vr(n.length-r,0),i=Array(u);++o1?r[n-1]:void 0,u=n>2?r[2]:void 0;for(o=br.length>3&&"function"==typeof o?(n--,o):void 0,u&&function(t,r,e){if(!Z(e))return!1;var n=typeof r;return!!("number"==n?Bt(e)&&er(r,e.length):"string"==n&&r in e)&&H(e[r],t)}(r[0],r[1],u)&&(o=n<3?void 0:o,n=1),t=Object(t);++e0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,G(t))}),Reflect.apply(t,null,e))}},t.chainProcessPromises=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return t.then((function(t){return r(t)}))}),Reflect.apply(t,null,e))}},t.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):_r(t,e)}))}))}),Promise.resolve(!1===r?[]:w(r)?r:{}))},t.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},t.createMutation=Mr,t.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Mr(t,r,e,n))},t.createQuery=Cr,t.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(Cr(t,r,e))},t.dasherize=function(t){return I(t).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},t.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Ar("Unknown "+r+" to extract argument from!")}},t.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Sr(e,r);return n}catch(t){throw new Sr(e,t)}},t.extractSocketPart=Nr,t.formatPayload=xr,t.getCallMethod=function(t){switch(!0){case t===mr[0]:return"query";case t===mr[1]:return"mutation";default:return!1}},t.getConfigValue=function(t,r){return r&&w(r)&&t in r?r[t]:void 0},t.getMutationFromArgs=Br,t.getMutationFromPayload=function(t){var r=Ur(t,Br);if(!1!==r)return r;throw new Pr("[getMutationArgs] Payload is malformed!",t)},t.getNameFromPayload=Jr,t.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Or].join("/"),[r,wr].join("/")]:[r]},t.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},t.getQueryFromArgs=Rr,t.getQueryFromPayload=function(t){var r=Ur(t,Rr);if(!1!==r)return r;throw new Pr("[getQueryArgs] Payload is malformed!",t)},t.groupByNamespace=function(t,r){void 0===r&&(r=!1);var e=Nr(t);if(!1===e){if(r)return t;throw new JsonqlError("groupByNamespace","socket not found in contract!")}var n,o={},u=0;for(var i in e){var a=e[i],c=a.namespace;c&&(o[c]||(++u,o[c]={}),o[c][i]=a,n||a[Or]&&(n=c))}return{size:u,nspGroup:o,publicNamespace:n}},t.inArray=Q,t.injectToFn=function(t,r,e,n){void 0===n&&(n=!1);var o=jr(t,r);return!1===n&&void 0!==o||Object.defineProperty(t,r,{value:e,writable:n}),t},t.isContract=function(t){return!!function(t){return w(t)&&(V(t,"query")||V(t,"mutation")||V(t,"socket"))}(t)&&t},t.isFunc=function(t){if("function"==typeof t)return!0;console.error("Expect to be Function type! Got "+typeof t)},t.isJsonqlErrorObj=$r,t.isNotEmpty=function(t){return void 0!==t&&!1!==t&&null!==t&&""!==I(t)},t.isObjectHasKey=V,t.logger=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];try{window&&window.DEBUG&&Reflect.apply(console.log,console,t)}catch(t){}},t.objDefineProps=function(t,r,e,n){return void 0===n&&(n=null),void 0===Object.getOwnPropertyDescriptor(t,r)&&Object.defineProperty(t,r,{set:e,get:null===n?function(){return null}:n}),t},t.objHasProp=jr,t.packError=function(t,r,e,n){var o;void 0===r&&(r="JsonqlError"),void 0===e&&(e=0),void 0===n&&(n="");var u={detail:t,className:r,statusCode:e,message:n};return JSON.stringify(((o={}).error=$r(t)||u,o.TS=Tr(),o))},t.packResult=function(t,e){void 0===e&&(e=!1);var n={};return n.data=t,e&&r(e)&&(e.push(Tr()),n.TS=e),JSON.stringify(n)},t.resultHandler=function(t){return V(t,"data")&&!V(t,"error")?t.data:t},t.timestamp=Tr,t.toArray=G,t.toJson=function(t){return"string"==typeof t?function(t){try{return JSON.parse(t)}catch(r){return t}}(t):JSON.parse(JSON.stringify(t))},t.toPayload=kr,t.urlParams=zr,Object.defineProperty(t,"__esModule",{value:!0})})); +!function(t,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports):"function"==typeof define&&define.amd?define(["exports"],r):r((t=t||self).jsonqlUtils={})}(this,(function(t){"use strict";var r=Array.isArray,e="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},n="object"==typeof e&&e&&e.Object===Object&&e,o="object"==typeof self&&self&&self.Object===Object&&self,u=n||o||Function("return this")(),i=u.Symbol,a=Object.prototype,c=a.hasOwnProperty,f=a.toString,s=i?i.toStringTag:void 0;var l=Object.prototype.toString;var p=i?i.toStringTag:void 0;function v(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":p&&p in Object(t)?function(t){var r=c.call(t,s),e=t[s];try{t[s]=void 0;var n=!0}catch(t){}var o=f.call(t);return n&&(r?t[s]=e:delete t[s]),o}(t):function(t){return l.call(t)}(t)}var d,y,h=(d=Object.getPrototypeOf,y=Object,function(t){return d(y(t))});function g(t){return null!=t&&"object"==typeof t}var b=Function.prototype,_=Object.prototype,j=b.toString,m=_.hasOwnProperty,O=j.call(Object);function w(t){if(!g(t)||"[object Object]"!=v(t))return!1;var r=h(t);if(null===r)return!0;var e=m.call(r,"constructor")&&r.constructor;return"function"==typeof e&&e instanceof e&&j.call(e)==O}var S=i?i.prototype:void 0,P=S?S.toString:void 0;function A(t){if("string"==typeof t)return t;if(r(t))return function(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var u=Array(o);++n-1;);return e}(o,u),function(t,r){for(var e=t.length;e--&&z(r,t[e],0)>-1;);return e}(o,u)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},G=function(t){return r(t)?t:[t]},V=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function H(t,r){return t===r||t!=t&&r!=r}function L(t,r){for(var e=t.length;e--;)if(H(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=L(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function X(t){if(!Z(t))return!1;var r=v(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var Y,tt=u["__core-js_shared__"],rt=(Y=/[^.]+$/.exec(tt&&tt.keys&&tt.keys.IE_PROTO||""))?"Symbol(src)_1."+Y:"";var et=Function.prototype.toString;var nt=/^\[object .+?Constructor\]$/,ot=Function.prototype,ut=Object.prototype,it=ot.toString,at=ut.hasOwnProperty,ct=RegExp("^"+it.call(at).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ft(t){return!(!Z(t)||function(t){return!!rt&&rt in t}(t))&&(X(t)?ct:nt).test(function(t){if(null!=t){try{return et.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function st(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ft(e)?e:void 0}var lt=st(u,"Map"),pt=st(Object,"create");var vt=Object.prototype.hasOwnProperty;var dt=Object.prototype.hasOwnProperty;function yt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Bt(t){return null!=t&&Ut(t.length)&&!X(t)}var $t="object"==typeof t&&t&&!t.nodeType&&t,Dt=$t&&"object"==typeof module&&module&&!module.nodeType&&module,It=Dt&&Dt.exports===$t?u.Buffer:void 0,Qt=(It?It.isBuffer:void 0)||function(){return!1},Gt={};Gt["[object Float32Array]"]=Gt["[object Float64Array]"]=Gt["[object Int8Array]"]=Gt["[object Int16Array]"]=Gt["[object Int32Array]"]=Gt["[object Uint8Array]"]=Gt["[object Uint8ClampedArray]"]=Gt["[object Uint16Array]"]=Gt["[object Uint32Array]"]=!0,Gt["[object Arguments]"]=Gt["[object Array]"]=Gt["[object ArrayBuffer]"]=Gt["[object Boolean]"]=Gt["[object DataView]"]=Gt["[object Date]"]=Gt["[object Error]"]=Gt["[object Function]"]=Gt["[object Map]"]=Gt["[object Number]"]=Gt["[object Object]"]=Gt["[object RegExp]"]=Gt["[object Set]"]=Gt["[object String]"]=Gt["[object WeakMap]"]=!1;var Vt="object"==typeof t&&t&&!t.nodeType&&t,Ht=Vt&&"object"==typeof module&&module&&!module.nodeType&&module,Lt=Ht&&Ht.exports===Vt&&n.process,Kt=function(){try{var t=Ht&&Ht.require&&Ht.require("util").types;return t||Lt&&Lt.binding&&Lt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Zt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return g(t)&&Ut(t.length)&&!!Gt[v(t)]};function Xt(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var Yt=Object.prototype.hasOwnProperty;function tr(t,r,e){var n=t[r];Yt.call(t,r)&&H(n,e)&&(void 0!==e||r in t)||jt(t,r,e)}var rr=/^(?:0|[1-9]\d*)$/;function er(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&rr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(dr);function gr(t,r){return hr(function(t,r,e){return r=vr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,u=vr(n.length-r,0),i=Array(u);++o1?r[n-1]:void 0,u=n>2?r[2]:void 0;for(o=br.length>3&&"function"==typeof o?(n--,o):void 0,u&&function(t,r,e){if(!Z(e))return!1;var n=typeof r;return!!("number"==n?Bt(e)&&er(r,e.length):"string"==n&&r in e)&&H(e[r],t)}(r[0],r[1],u)&&(o=n<3?void 0:o,n=1),t=Object(t);++e0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,G(t))}),Reflect.apply(t,null,e))}},t.chainProcessPromises=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return t.then((function(t){return r(t)}))}),Reflect.apply(t,null,e))}},t.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):_r(t,e)}))}))}),Promise.resolve(!1===r?[]:w(r)?r:{}))},t.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},t.createMutation=Mr,t.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Mr(t,r,e,n))},t.createQuery=Cr,t.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(Cr(t,r,e))},t.dasherize=function(t){return I(t).replace(/([A-Z])/g,"-$1").replace(/[-_\s]+/g,"-").toLowerCase()},t.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Ar("Unknown "+r+" to extract argument from!")}},t.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Sr(e,r);return n}catch(t){throw new Sr(e,t)}},t.extractSocketPart=Nr,t.formatPayload=xr,t.getCallMethod=function(t){switch(!0){case t===mr[0]:return"query";case t===mr[1]:return"mutation";default:return!1}},t.getConfigValue=function(t,r){return r&&w(r)&&t in r?r[t]:void 0},t.getMutationFromArgs=Br,t.getMutationFromPayload=function(t){var r=Ur(t,Br);if(!1!==r)return r;throw new Pr("[getMutationArgs] Payload is malformed!",t)},t.getNameFromPayload=Jr,t.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Or].join("/"),[r,wr].join("/")]:[r]},t.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},t.getQueryFromArgs=Rr,t.getQueryFromPayload=function(t){var r=Ur(t,Rr);if(!1!==r)return r;throw new Pr("[getQueryArgs] Payload is malformed!",t)},t.groupByNamespace=function(t){var r=Nr(t);if(!1===r)throw new JsonqlError("groupByNamespace","socket not found in contract!");var e,n={},o=0;for(var u in r){var i=r[u],a=i.namespace;a&&(n[a]||(++o,n[a]={}),n[a][u]=i,!e&&i[Or]&&(e=a))}return{size:o,nspGroup:n,publicNamespace:e}},t.inArray=Q,t.injectToFn=function(t,r,e,n){void 0===n&&(n=!1);var o=jr(t,r);return!1===n&&void 0!==o||Object.defineProperty(t,r,{value:e,writable:n}),t},t.isContract=function(t){return!!function(t){return w(t)&&(V(t,"query")||V(t,"mutation")||V(t,"socket"))}(t)&&t},t.isFunc=function(t){if("function"==typeof t)return!0;console.error("Expect to be Function type! Got "+typeof t)},t.isJsonqlErrorObj=$r,t.isNotEmpty=function(t){return void 0!==t&&!1!==t&&null!==t&&""!==I(t)},t.isObjectHasKey=V,t.logger=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];try{window&&window.DEBUG&&Reflect.apply(console.log,console,t)}catch(t){}},t.objDefineProps=function(t,r,e,n){return void 0===n&&(n=null),void 0===Object.getOwnPropertyDescriptor(t,r)&&Object.defineProperty(t,r,{set:e,get:null===n?function(){return null}:n}),t},t.objHasProp=jr,t.packError=function(t,r,e,n){var o;void 0===r&&(r="JsonqlError"),void 0===e&&(e=0),void 0===n&&(n="");var u={detail:t,className:r,statusCode:e,message:n};return JSON.stringify(((o={}).error=$r(t)||u,o.TS=Tr(),o))},t.packResult=function(t,e){void 0===e&&(e=!1);var n={};return n.data=t,e&&r(e)&&(e.push(Tr()),n.TS=e),JSON.stringify(n)},t.resultHandler=function(t){return V(t,"data")&&!V(t,"error")?t.data:t},t.timestamp=Tr,t.toArray=G,t.toJson=function(t){return"string"==typeof t?function(t){try{return JSON.parse(t)}catch(r){return t}}(t):JSON.parse(JSON.stringify(t))},t.toPayload=kr,t.urlParams=zr,Object.defineProperty(t,"__esModule",{value:!0})})); //# sourceMappingURL=browser.js.map diff --git a/packages/utils/main.js b/packages/utils/main.js index 642e9e76..ac3b64e0 100644 --- a/packages/utils/main.js +++ b/packages/utils/main.js @@ -1,2 +1,2 @@ -"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t,r=(t=require("fs"))&&"object"==typeof t&&"default"in t?t.default:t,e=require("path"),n=Array.isArray,o="undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},i="object"==typeof o&&o&&o.Object===Object&&o,u="object"==typeof self&&self&&self.Object===Object&&self,a=i||u||Function("return this")(),f=a.Symbol,s=Object.prototype,c=s.hasOwnProperty,h=s.toString,p=f?f.toStringTag:void 0;var l=Object.prototype.toString;var g=f?f.toStringTag:void 0;function y(t){return null==t?void 0===t?"[object Undefined]":"[object Null]":g&&g in Object(t)?function(t){var r=c.call(t,p),e=t[p];try{t[p]=void 0;var n=!0}catch(t){}var o=h.call(t);return n&&(r?t[p]=e:delete t[p]),o}(t):function(t){return l.call(t)}(t)}var v,d,b=(v=Object.getPrototypeOf,d=Object,function(t){return v(d(t))});function w(t){return null!=t&&"object"==typeof t}var _=Function.prototype,m=Object.prototype,A=_.toString,E=m.hasOwnProperty,j=A.call(Object);function P(t){if(!w(t)||"[object Object]"!=y(t))return!1;var r=b(t);if(null===r)return!0;var e=E.call(r,"constructor")&&r.constructor;return"function"==typeof e&&e instanceof e&&A.call(e)==j}var x=f?f.prototype:void 0,O=x?x.toString:void 0;function R(t){if("string"==typeof t)return t;if(n(t))return function(t,r){for(var e=-1,n=null==t?0:t.length,o=Array(n);++e=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(o);++n-1;);return e}(o,i),function(t,r){for(var e=t.length;e--&&U(r,t[e],0)>-1;);return e}(o,i)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},V=function(t){return n(t)?t:[t]},H=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function G(t,r){return t===r||t!=t&&r!=r}function Z(t,r){for(var e=t.length;e--;)if(G(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=Z(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function tt(t){if(!X(t))return!1;var r=y(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var rt,et=a["__core-js_shared__"],nt=(rt=/[^.]+$/.exec(et&&et.keys&&et.keys.IE_PROTO||""))?"Symbol(src)_1."+rt:"";var ot=Function.prototype.toString;var it=/^\[object .+?Constructor\]$/,ut=Function.prototype,at=Object.prototype,ft=ut.toString,st=at.hasOwnProperty,ct=RegExp("^"+ft.call(st).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ht(t){return!(!X(t)||function(t){return!!nt&&nt in t}(t))&&(tt(t)?ct:it).test(function(t){if(null!=t){try{return ot.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function pt(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ht(e)?e:void 0}var lt=pt(a,"Map"),gt=pt(Object,"create");var yt=Object.prototype.hasOwnProperty;var vt=Object.prototype.hasOwnProperty;function dt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Ft(t){return null!=t&&zt(t.length)&&!tt(t)}var qt="object"==typeof exports&&exports&&!exports.nodeType&&exports,Jt=qt&&"object"==typeof module&&module&&!module.nodeType&&module,$t=Jt&&Jt.exports===qt?a.Buffer:void 0,Qt=($t?$t.isBuffer:void 0)||function(){return!1},Vt={};Vt["[object Float32Array]"]=Vt["[object Float64Array]"]=Vt["[object Int8Array]"]=Vt["[object Int16Array]"]=Vt["[object Int32Array]"]=Vt["[object Uint8Array]"]=Vt["[object Uint8ClampedArray]"]=Vt["[object Uint16Array]"]=Vt["[object Uint32Array]"]=!0,Vt["[object Arguments]"]=Vt["[object Array]"]=Vt["[object ArrayBuffer]"]=Vt["[object Boolean]"]=Vt["[object DataView]"]=Vt["[object Date]"]=Vt["[object Error]"]=Vt["[object Function]"]=Vt["[object Map]"]=Vt["[object Number]"]=Vt["[object Object]"]=Vt["[object RegExp]"]=Vt["[object Set]"]=Vt["[object String]"]=Vt["[object WeakMap]"]=!1;var Ht="object"==typeof exports&&exports&&!exports.nodeType&&exports,Gt=Ht&&"object"==typeof module&&module&&!module.nodeType&&module,Zt=Gt&&Gt.exports===Ht&&i.process,Kt=function(){try{var t=Gt&&Gt.require&&Gt.require("util").types;return t||Zt&&Zt.binding&&Zt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Xt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return w(t)&&zt(t.length)&&!!Vt[y(t)]};function tr(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var rr=Object.prototype.hasOwnProperty;function er(t,r,e){var n=t[r];rr.call(t,r)&&G(n,e)&&(void 0!==e||r in t)||At(t,r,e)}var nr=/^(?:0|[1-9]\d*)$/;function or(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&nr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(vr);function wr(t,r){return br(function(t,r,e){return r=yr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=yr(n.length-r,0),u=Array(i);++o1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=_r.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!X(e))return!1;var n=typeof r;return!!("number"==n?Ft(e)&&or(r,e.length):"string"==n&&r in e)&&G(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++e>18&63]+Vr[o>>12&63]+Vr[o>>6&63]+Vr[63&o]);return i.join("")}function Xr(t){var r;Zr||Kr();for(var e=t.length,n=e%3,o="",i=[],u=0,a=e-n;ua?a:u+16383));return 1===n?(r=t[e-1],o+=Vr[r>>2],o+=Vr[r<<4&63],o+="=="):2===n&&(r=(t[e-2]<<8)+t[e-1],o+=Vr[r>>10],o+=Vr[r>>4&63],o+=Vr[r<<2&63],o+="="),i.push(o),i.join("")}function te(t,r,e,n,o){var i,u,a=8*o-n-1,f=(1<>1,c=-7,h=e?o-1:0,p=e?-1:1,l=t[r+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[r+h],h+=p,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=n;c>0;u=256*u+t[r+h],h+=p,c-=8);if(0===i)i=1-s;else{if(i===f)return u?NaN:1/0*(l?-1:1);u+=Math.pow(2,n),i-=s}return(l?-1:1)*u*Math.pow(2,i-n)}function re(t,r,e,n,o,i){var u,a,f,s=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:i-1,g=n?1:-1,y=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(a=isNaN(r)?1:0,u=c):(u=Math.floor(Math.log(r)/Math.LN2),r*(f=Math.pow(2,-u))<1&&(u--,f*=2),(r+=u+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(u++,f/=2),u+h>=c?(a=0,u=c):u+h>=1?(a=(r*f-1)*Math.pow(2,o),u+=h):(a=r*Math.pow(2,h-1)*Math.pow(2,o),u=0));o>=8;t[e+l]=255&a,l+=g,a/=256,o-=8);for(u=u<0;t[e+l]=255&u,l+=g,u/=256,s-=8);t[e+l-g]|=128*y}var ee={}.toString,ne=Array.isArray||function(t){return"[object Array]"==ee.call(t)};function oe(){return ue.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function ie(t,r){if(oe()=oe())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+oe().toString(16)+" bytes");return 0|t}function pe(t){return!(null==t||!t._isBuffer)}function le(t,r){if(pe(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var e=t.length;if(0===e)return 0;for(var n=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return ke(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return Le(t).length;default:if(n)return ke(t).length;r=(""+r).toLowerCase(),n=!0}}function ge(t,r,e){var n=!1;if((void 0===r||r<0)&&(r=0),r>this.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return Re(this,r,e);case"utf8":case"utf-8":return Pe(this,r,e);case"ascii":return xe(this,r,e);case"latin1":case"binary":return Oe(this,r,e);case"base64":return je(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Se(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function ye(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function ve(t,r,e,n,o){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=o?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(o)return-1;e=t.length-1}else if(e<0){if(!o)return-1;e=0}if("string"==typeof r&&(r=ue.from(r,n)),pe(r))return 0===r.length?-1:de(t,r,e,n,o);if("number"==typeof r)return r&=255,ue.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):de(t,[r],e,n,o);throw new TypeError("val must be string, number or Buffer")}function de(t,r,e,n,o){var i,u=1,a=t.length,f=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;u=2,a/=2,f/=2,e/=2}function s(t,r){return 1===u?t[r]:t.readUInt16BE(r*u)}if(o){var c=-1;for(i=e;ia&&(e=a-f),i=e;i>=0;i--){for(var h=!0,p=0;po&&(n=o):n=o;var i=r.length;if(i%2!=0)throw new TypeError("Invalid hex string");n>i/2&&(n=i/2);for(var u=0;u>8,o=e%256,i.push(o),i.push(n);return i}(r,t.length-e),t,e,n)}function je(t,r,e){return 0===r&&e===t.length?Xr(t):Xr(t.slice(r,e))}function Pe(t,r,e){e=Math.min(t.length,e);for(var n=[],o=r;o239?4:s>223?3:s>191?2:1;if(o+h<=e)switch(h){case 1:s<128&&(c=s);break;case 2:128==(192&(i=t[o+1]))&&(f=(31&s)<<6|63&i)>127&&(c=f);break;case 3:i=t[o+1],u=t[o+2],128==(192&i)&&128==(192&u)&&(f=(15&s)<<12|(63&i)<<6|63&u)>2047&&(f<55296||f>57343)&&(c=f);break;case 4:i=t[o+1],u=t[o+2],a=t[o+3],128==(192&i)&&128==(192&u)&&128==(192&a)&&(f=(15&s)<<18|(63&i)<<12|(63&u)<<6|63&a)>65535&&f<1114112&&(c=f)}null===c?(c=65533,h=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),o+=h}return function(t){var r=t.length;if(r<=4096)return String.fromCharCode.apply(String,t);var e="",n=0;for(;n0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),""},ue.prototype.compare=function(t,r,e,n,o){if(!pe(t))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),r<0||e>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&r>=e)return 0;if(n>=o)return-1;if(r>=e)return 1;if(this===t)return 0;for(var i=(o>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),a=Math.min(i,u),f=this.slice(n,o),s=t.slice(r,e),c=0;co)&&(e=o),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return be(this,t,r,e);case"utf8":case"utf-8":return we(this,t,r,e);case"ascii":return _e(this,t,r,e);case"latin1":case"binary":return me(this,t,r,e);case"base64":return Ae(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ee(this,t,r,e);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},ue.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function xe(t,r,e){var n="";e=Math.min(t.length,e);for(var o=r;on)&&(e=n);for(var o="",i=r;ie)throw new RangeError("Trying to access beyond buffer length")}function Ue(t,r,e,n,o,i){if(!pe(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>o||rt.length)throw new RangeError("Index out of range")}function Be(t,r,e,n){r<0&&(r=65535+r+1);for(var o=0,i=Math.min(t.length-e,2);o>>8*(n?o:1-o)}function Ie(t,r,e,n){r<0&&(r=4294967295+r+1);for(var o=0,i=Math.min(t.length-e,4);o>>8*(n?o:3-o)&255}function Ne(t,r,e,n,o,i){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Ce(t,r,e,n,o){return o||Ne(t,0,e,4),re(t,r,e,n,23,4),e+4}function Ye(t,r,e,n,o){return o||Ne(t,0,e,8),re(t,r,e,n,52,8),e+8}ue.prototype.slice=function(t,r){var e,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r0&&(o*=256);)n+=this[t+--r]*o;return n},ue.prototype.readUInt8=function(t,r){return r||Te(t,1,this.length),this[t]},ue.prototype.readUInt16LE=function(t,r){return r||Te(t,2,this.length),this[t]|this[t+1]<<8},ue.prototype.readUInt16BE=function(t,r){return r||Te(t,2,this.length),this[t]<<8|this[t+1]},ue.prototype.readUInt32LE=function(t,r){return r||Te(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ue.prototype.readUInt32BE=function(t,r){return r||Te(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ue.prototype.readIntLE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=this[t],o=1,i=0;++i=(o*=128)&&(n-=Math.pow(2,8*r)),n},ue.prototype.readIntBE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=r,o=1,i=this[t+--n];n>0&&(o*=256);)i+=this[t+--n]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*r)),i},ue.prototype.readInt8=function(t,r){return r||Te(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ue.prototype.readInt16LE=function(t,r){r||Te(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt16BE=function(t,r){r||Te(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt32LE=function(t,r){return r||Te(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ue.prototype.readInt32BE=function(t,r){return r||Te(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ue.prototype.readFloatLE=function(t,r){return r||Te(t,4,this.length),te(this,t,!0,23,4)},ue.prototype.readFloatBE=function(t,r){return r||Te(t,4,this.length),te(this,t,!1,23,4)},ue.prototype.readDoubleLE=function(t,r){return r||Te(t,8,this.length),te(this,t,!0,52,8)},ue.prototype.readDoubleBE=function(t,r){return r||Te(t,8,this.length),te(this,t,!1,52,8)},ue.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r|=0,e|=0,n)||Ue(this,t,r,e,Math.pow(2,8*e)-1,0);var o=1,i=0;for(this[r]=255&t;++i=0&&(i*=256);)this[r+o]=t/i&255;return r+e},ue.prototype.writeUInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,255,0),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[r]=255&t,r+1},ue.prototype.writeUInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeUInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeUInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t):Ie(this,t,r,!0),r+4},ue.prototype.writeUInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=0,u=1,a=0;for(this[r]=255&t;++i>0)-a&255;return r+e},ue.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=e-1,u=1,a=0;for(this[r+i]=255&t;--i>=0&&(u*=256);)t<0&&0===a&&0!==this[r+i+1]&&(a=1),this[r+i]=(t/u>>0)-a&255;return r+e},ue.prototype.writeInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,127,-128),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[r]=255&t,r+1},ue.prototype.writeInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24):Ie(this,t,r,!0),r+4},ue.prototype.writeInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeFloatLE=function(t,r,e){return Ce(this,t,r,!0,e)},ue.prototype.writeFloatBE=function(t,r,e){return Ce(this,t,r,!1,e)},ue.prototype.writeDoubleLE=function(t,r,e){return Ye(this,t,r,!0,e)},ue.prototype.writeDoubleBE=function(t,r,e){return Ye(this,t,r,!1,e)},ue.prototype.copy=function(t,r,e,n){if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--o)t[o+r]=this[o+e];else if(i<1e3||!ue.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(i=r;i55295&&e<57344){if(!o){if(e>56319){(r-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(r-=3)>-1&&i.push(239,191,189);continue}o=e;continue}if(e<56320){(r-=3)>-1&&i.push(239,191,189),o=e;continue}e=65536+(o-55296<<10|e-56320)}else o&&(r-=3)>-1&&i.push(239,191,189);if(o=null,e<128){if((r-=1)<0)break;i.push(e)}else if(e<2048){if((r-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function Le(t){return function(t){var r,e,n,o,i,u;Zr||Kr();var a=t.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");i="="===t[a-2]?2:"="===t[a-1]?1:0,u=new Gr(3*a/4-i),n=i>0?a-4:a;var f=0;for(r=0,e=0;r>16&255,u[f++]=o>>8&255,u[f++]=255&o;return 2===i?(o=Hr[t.charCodeAt(r)]<<2|Hr[t.charCodeAt(r+1)]>>4,u[f++]=255&o):1===i&&(o=Hr[t.charCodeAt(r)]<<10|Hr[t.charCodeAt(r+1)]<<4|Hr[t.charCodeAt(r+2)]>>2,u[f++]=o>>8&255,u[f++]=255&o),u}(function(t){if((t=function(t){if(t.trim)return t.trim();return t.replace(/^\s+|\s+$/g,"")}(t).replace(Me,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ze(t,r,e,n){for(var o=0;o=r.length||o>=t.length);++o)r[o+e]=t[o];return o}function Fe(t){return null!=t&&(!!t._isBuffer||qe(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&qe(t.slice(0,0))}(t))}function qe(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var Je=function(t,r){if(r instanceof Error){var e={};return Object.getOwnPropertyNames(r).forEach((function(t){e[t]=r[t]})),e}return r};var $e=function(t,r){try{var e=t.headers.accept.split(",");return r?e.filter((function(t){return t===r})):e}catch(t){return[]}},Qe=function(t,r){return!!$e(t,r).length},Ve=function(t,r){return t.path===r.jsonqlPath};exports.VERSION="1.0.2",exports.buff=function(t,r){return void 0===r&&(r="base64"),Fe(t)?t:new ue.from(t,r)},exports.cacheBurst=Cr,exports.cacheBurstUrl=function(t){return Nr(t,Cr())},exports.chainFns=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,V(t))}),Reflect.apply(t,null,e))}},exports.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):mr(t,e)}))}))}),Promise.resolve(!1===r?[]:P(r)?r:{}))},exports.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},exports.createMutation=Fr,exports.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Fr(t,r,e,n))},exports.createQuery=zr,exports.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(zr(t,r,e))},exports.dasherize=Ir,exports.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Tr("Unknown "+r+" to extract argument from!")}},exports.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Rr(e,r);return n}catch(t){throw new Rr(e,t)}},exports.extractSocketPart=Ur,exports.findFromContract=function(t,e,n){return!!(n[t]&&n[t][e]&&n[t][e].file&&r.existsSync(n[t][e].file))&&n[t][e].file},exports.formatPayload=Dr,exports.getCallMethod=function(t){switch(!0){case t===jr[0]:return"query";case t===jr[1]:return"mutation";default:return!1}},exports.getConfigValue=function(t,r){return r&&P(r)&&t in r?r[t]:void 0},exports.getDocLen=function(t){return ue.byteLength(t,"utf8")},exports.getMutationFromArgs=$r,exports.getMutationFromPayload=function(t){var r=Jr(t,$r);if(!1!==r)return r;throw new Sr("[getMutationArgs] Payload is malformed!",t)},exports.getNameFromPayload=kr,exports.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Pr].join("/"),[r,xr].join("/")]:[r]},exports.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},exports.getPathToFn=function(t,n,o){var i=o.resolverDir,u=Ir(t),a=[];o.contract&&o.contract[n]&&o.contract[n].path&&a.push(o.contract[n].path),a.push(e.join(i,n,u,[Or,Er].join("."))),a.push(e.join(i,n,[u,Er].join(".")));for(var f=a.length,s=0;s=n?t:function(t,r,e){var n=-1,o=t.length;r<0&&(r=-r>o?0:o+r),(e=e>o?o:e)<0&&(e+=o),o=r>e?0:e-r>>>0,r>>>=0;for(var i=Array(o);++n-1;);return e}(o,i),function(t,r){for(var e=t.length;e--&&U(r,t[e],0)>-1;);return e}(o,i)+1).join("")}var Q=function(t,r){return!!t.filter((function(t){return t===r})).length},V=function(t){return n(t)?t:[t]},H=function(t,r){try{var e=Object.keys(t);return Q(e,r)}catch(t){return!1}};function G(t,r){return t===r||t!=t&&r!=r}function Z(t,r){for(var e=t.length;e--;)if(G(t[e][0],r))return e;return-1}var K=Array.prototype.splice;function W(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1},W.prototype.set=function(t,r){var e=this.__data__,n=Z(e,t);return n<0?(++this.size,e.push([t,r])):e[n][1]=r,this};function tt(t){if(!X(t))return!1;var r=y(t);return"[object Function]"==r||"[object GeneratorFunction]"==r||"[object AsyncFunction]"==r||"[object Proxy]"==r}var rt,et=a["__core-js_shared__"],nt=(rt=/[^.]+$/.exec(et&&et.keys&&et.keys.IE_PROTO||""))?"Symbol(src)_1."+rt:"";var ot=Function.prototype.toString;var it=/^\[object .+?Constructor\]$/,ut=Function.prototype,at=Object.prototype,ft=ut.toString,st=at.hasOwnProperty,ct=RegExp("^"+ft.call(st).replace(/[\\^$.*+?()[\]{}|]/g,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function ht(t){return!(!X(t)||function(t){return!!nt&&nt in t}(t))&&(tt(t)?ct:it).test(function(t){if(null!=t){try{return ot.call(t)}catch(t){}try{return t+""}catch(t){}}return""}(t))}function pt(t,r){var e=function(t,r){return null==t?void 0:t[r]}(t,r);return ht(e)?e:void 0}var lt=pt(a,"Map"),gt=pt(Object,"create");var yt=Object.prototype.hasOwnProperty;var vt=Object.prototype.hasOwnProperty;function dt(t){var r=-1,e=null==t?0:t.length;for(this.clear();++r-1&&t%1==0&&t<=9007199254740991}function Ft(t){return null!=t&&zt(t.length)&&!tt(t)}var qt="object"==typeof exports&&exports&&!exports.nodeType&&exports,Jt=qt&&"object"==typeof module&&module&&!module.nodeType&&module,$t=Jt&&Jt.exports===qt?a.Buffer:void 0,Qt=($t?$t.isBuffer:void 0)||function(){return!1},Vt={};Vt["[object Float32Array]"]=Vt["[object Float64Array]"]=Vt["[object Int8Array]"]=Vt["[object Int16Array]"]=Vt["[object Int32Array]"]=Vt["[object Uint8Array]"]=Vt["[object Uint8ClampedArray]"]=Vt["[object Uint16Array]"]=Vt["[object Uint32Array]"]=!0,Vt["[object Arguments]"]=Vt["[object Array]"]=Vt["[object ArrayBuffer]"]=Vt["[object Boolean]"]=Vt["[object DataView]"]=Vt["[object Date]"]=Vt["[object Error]"]=Vt["[object Function]"]=Vt["[object Map]"]=Vt["[object Number]"]=Vt["[object Object]"]=Vt["[object RegExp]"]=Vt["[object Set]"]=Vt["[object String]"]=Vt["[object WeakMap]"]=!1;var Ht="object"==typeof exports&&exports&&!exports.nodeType&&exports,Gt=Ht&&"object"==typeof module&&module&&!module.nodeType&&module,Zt=Gt&&Gt.exports===Ht&&i.process,Kt=function(){try{var t=Gt&&Gt.require&&Gt.require("util").types;return t||Zt&&Zt.binding&&Zt.binding("util")}catch(t){}}(),Wt=Kt&&Kt.isTypedArray,Xt=Wt?function(t){return function(r){return t(r)}}(Wt):function(t){return w(t)&&zt(t.length)&&!!Vt[y(t)]};function tr(t,r){if(("constructor"!==r||"function"!=typeof t[r])&&"__proto__"!=r)return t[r]}var rr=Object.prototype.hasOwnProperty;function er(t,r,e){var n=t[r];rr.call(t,r)&&G(n,e)&&(void 0!==e||r in t)||At(t,r,e)}var nr=/^(?:0|[1-9]\d*)$/;function or(t,r){var e=typeof t;return!!(r=null==r?9007199254740991:r)&&("number"==e||"symbol"!=e&&nr.test(t))&&t>-1&&t%1==0&&t0){if(++r>=800)return arguments[0]}else r=0;return t.apply(void 0,arguments)}}(vr);function wr(t,r){return br(function(t,r,e){return r=yr(void 0===r?t.length-1:r,0),function(){for(var n=arguments,o=-1,i=yr(n.length-r,0),u=Array(i);++o1?r[n-1]:void 0,i=n>2?r[2]:void 0;for(o=_r.length>3&&"function"==typeof o?(n--,o):void 0,i&&function(t,r,e){if(!X(e))return!1;var n=typeof r;return!!("number"==n?Ft(e)&&or(r,e.length):"string"==n&&r in e)&&G(e[r],t)}(r[0],r[1],i)&&(o=n<3?void 0:o,n=1),t=Object(t);++e>18&63]+Vr[o>>12&63]+Vr[o>>6&63]+Vr[63&o]);return i.join("")}function Xr(t){var r;Zr||Kr();for(var e=t.length,n=e%3,o="",i=[],u=0,a=e-n;ua?a:u+16383));return 1===n?(r=t[e-1],o+=Vr[r>>2],o+=Vr[r<<4&63],o+="=="):2===n&&(r=(t[e-2]<<8)+t[e-1],o+=Vr[r>>10],o+=Vr[r>>4&63],o+=Vr[r<<2&63],o+="="),i.push(o),i.join("")}function te(t,r,e,n,o){var i,u,a=8*o-n-1,f=(1<>1,c=-7,h=e?o-1:0,p=e?-1:1,l=t[r+h];for(h+=p,i=l&(1<<-c)-1,l>>=-c,c+=a;c>0;i=256*i+t[r+h],h+=p,c-=8);for(u=i&(1<<-c)-1,i>>=-c,c+=n;c>0;u=256*u+t[r+h],h+=p,c-=8);if(0===i)i=1-s;else{if(i===f)return u?NaN:1/0*(l?-1:1);u+=Math.pow(2,n),i-=s}return(l?-1:1)*u*Math.pow(2,i-n)}function re(t,r,e,n,o,i){var u,a,f,s=8*i-o-1,c=(1<>1,p=23===o?Math.pow(2,-24)-Math.pow(2,-77):0,l=n?0:i-1,g=n?1:-1,y=r<0||0===r&&1/r<0?1:0;for(r=Math.abs(r),isNaN(r)||r===1/0?(a=isNaN(r)?1:0,u=c):(u=Math.floor(Math.log(r)/Math.LN2),r*(f=Math.pow(2,-u))<1&&(u--,f*=2),(r+=u+h>=1?p/f:p*Math.pow(2,1-h))*f>=2&&(u++,f/=2),u+h>=c?(a=0,u=c):u+h>=1?(a=(r*f-1)*Math.pow(2,o),u+=h):(a=r*Math.pow(2,h-1)*Math.pow(2,o),u=0));o>=8;t[e+l]=255&a,l+=g,a/=256,o-=8);for(u=u<0;t[e+l]=255&u,l+=g,u/=256,s-=8);t[e+l-g]|=128*y}var ee={}.toString,ne=Array.isArray||function(t){return"[object Array]"==ee.call(t)};function oe(){return ue.TYPED_ARRAY_SUPPORT?2147483647:1073741823}function ie(t,r){if(oe()=oe())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+oe().toString(16)+" bytes");return 0|t}function pe(t){return!(null==t||!t._isBuffer)}function le(t,r){if(pe(t))return t.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(t)||t instanceof ArrayBuffer))return t.byteLength;"string"!=typeof t&&(t=""+t);var e=t.length;if(0===e)return 0;for(var n=!1;;)switch(r){case"ascii":case"latin1":case"binary":return e;case"utf8":case"utf-8":case void 0:return ke(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*e;case"hex":return e>>>1;case"base64":return Le(t).length;default:if(n)return ke(t).length;r=(""+r).toLowerCase(),n=!0}}function ge(t,r,e){var n=!1;if((void 0===r||r<0)&&(r=0),r>this.length)return"";if((void 0===e||e>this.length)&&(e=this.length),e<=0)return"";if((e>>>=0)<=(r>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return Re(this,r,e);case"utf8":case"utf-8":return Pe(this,r,e);case"ascii":return xe(this,r,e);case"latin1":case"binary":return Oe(this,r,e);case"base64":return je(this,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Se(this,r,e);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}function ye(t,r,e){var n=t[r];t[r]=t[e],t[e]=n}function ve(t,r,e,n,o){if(0===t.length)return-1;if("string"==typeof e?(n=e,e=0):e>2147483647?e=2147483647:e<-2147483648&&(e=-2147483648),e=+e,isNaN(e)&&(e=o?0:t.length-1),e<0&&(e=t.length+e),e>=t.length){if(o)return-1;e=t.length-1}else if(e<0){if(!o)return-1;e=0}if("string"==typeof r&&(r=ue.from(r,n)),pe(r))return 0===r.length?-1:de(t,r,e,n,o);if("number"==typeof r)return r&=255,ue.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?o?Uint8Array.prototype.indexOf.call(t,r,e):Uint8Array.prototype.lastIndexOf.call(t,r,e):de(t,[r],e,n,o);throw new TypeError("val must be string, number or Buffer")}function de(t,r,e,n,o){var i,u=1,a=t.length,f=r.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||r.length<2)return-1;u=2,a/=2,f/=2,e/=2}function s(t,r){return 1===u?t[r]:t.readUInt16BE(r*u)}if(o){var c=-1;for(i=e;ia&&(e=a-f),i=e;i>=0;i--){for(var h=!0,p=0;po&&(n=o):n=o;var i=r.length;if(i%2!=0)throw new TypeError("Invalid hex string");n>i/2&&(n=i/2);for(var u=0;u>8,o=e%256,i.push(o),i.push(n);return i}(r,t.length-e),t,e,n)}function je(t,r,e){return 0===r&&e===t.length?Xr(t):Xr(t.slice(r,e))}function Pe(t,r,e){e=Math.min(t.length,e);for(var n=[],o=r;o239?4:s>223?3:s>191?2:1;if(o+h<=e)switch(h){case 1:s<128&&(c=s);break;case 2:128==(192&(i=t[o+1]))&&(f=(31&s)<<6|63&i)>127&&(c=f);break;case 3:i=t[o+1],u=t[o+2],128==(192&i)&&128==(192&u)&&(f=(15&s)<<12|(63&i)<<6|63&u)>2047&&(f<55296||f>57343)&&(c=f);break;case 4:i=t[o+1],u=t[o+2],a=t[o+3],128==(192&i)&&128==(192&u)&&128==(192&a)&&(f=(15&s)<<18|(63&i)<<12|(63&u)<<6|63&a)>65535&&f<1114112&&(c=f)}null===c?(c=65533,h=1):c>65535&&(c-=65536,n.push(c>>>10&1023|55296),c=56320|1023&c),n.push(c),o+=h}return function(t){var r=t.length;if(r<=4096)return String.fromCharCode.apply(String,t);var e="",n=0;for(;n0&&(t=this.toString("hex",0,50).match(/.{2}/g).join(" "),this.length>50&&(t+=" ... ")),""},ue.prototype.compare=function(t,r,e,n,o){if(!pe(t))throw new TypeError("Argument must be a Buffer");if(void 0===r&&(r=0),void 0===e&&(e=t?t.length:0),void 0===n&&(n=0),void 0===o&&(o=this.length),r<0||e>t.length||n<0||o>this.length)throw new RangeError("out of range index");if(n>=o&&r>=e)return 0;if(n>=o)return-1;if(r>=e)return 1;if(this===t)return 0;for(var i=(o>>>=0)-(n>>>=0),u=(e>>>=0)-(r>>>=0),a=Math.min(i,u),f=this.slice(n,o),s=t.slice(r,e),c=0;co)&&(e=o),t.length>0&&(e<0||r<0)||r>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var i=!1;;)switch(n){case"hex":return be(this,t,r,e);case"utf8":case"utf-8":return we(this,t,r,e);case"ascii":return _e(this,t,r,e);case"latin1":case"binary":return me(this,t,r,e);case"base64":return Ae(this,t,r,e);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return Ee(this,t,r,e);default:if(i)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),i=!0}},ue.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};function xe(t,r,e){var n="";e=Math.min(t.length,e);for(var o=r;on)&&(e=n);for(var o="",i=r;ie)throw new RangeError("Trying to access beyond buffer length")}function Ue(t,r,e,n,o,i){if(!pe(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(r>o||rt.length)throw new RangeError("Index out of range")}function Be(t,r,e,n){r<0&&(r=65535+r+1);for(var o=0,i=Math.min(t.length-e,2);o>>8*(n?o:1-o)}function Ie(t,r,e,n){r<0&&(r=4294967295+r+1);for(var o=0,i=Math.min(t.length-e,4);o>>8*(n?o:3-o)&255}function Ne(t,r,e,n,o,i){if(e+n>t.length)throw new RangeError("Index out of range");if(e<0)throw new RangeError("Index out of range")}function Ce(t,r,e,n,o){return o||Ne(t,0,e,4),re(t,r,e,n,23,4),e+4}function Ye(t,r,e,n,o){return o||Ne(t,0,e,8),re(t,r,e,n,52,8),e+8}ue.prototype.slice=function(t,r){var e,n=this.length;if((t=~~t)<0?(t+=n)<0&&(t=0):t>n&&(t=n),(r=void 0===r?n:~~r)<0?(r+=n)<0&&(r=0):r>n&&(r=n),r0&&(o*=256);)n+=this[t+--r]*o;return n},ue.prototype.readUInt8=function(t,r){return r||Te(t,1,this.length),this[t]},ue.prototype.readUInt16LE=function(t,r){return r||Te(t,2,this.length),this[t]|this[t+1]<<8},ue.prototype.readUInt16BE=function(t,r){return r||Te(t,2,this.length),this[t]<<8|this[t+1]},ue.prototype.readUInt32LE=function(t,r){return r||Te(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},ue.prototype.readUInt32BE=function(t,r){return r||Te(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},ue.prototype.readIntLE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=this[t],o=1,i=0;++i=(o*=128)&&(n-=Math.pow(2,8*r)),n},ue.prototype.readIntBE=function(t,r,e){t|=0,r|=0,e||Te(t,r,this.length);for(var n=r,o=1,i=this[t+--n];n>0&&(o*=256);)i+=this[t+--n]*o;return i>=(o*=128)&&(i-=Math.pow(2,8*r)),i},ue.prototype.readInt8=function(t,r){return r||Te(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},ue.prototype.readInt16LE=function(t,r){r||Te(t,2,this.length);var e=this[t]|this[t+1]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt16BE=function(t,r){r||Te(t,2,this.length);var e=this[t+1]|this[t]<<8;return 32768&e?4294901760|e:e},ue.prototype.readInt32LE=function(t,r){return r||Te(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},ue.prototype.readInt32BE=function(t,r){return r||Te(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},ue.prototype.readFloatLE=function(t,r){return r||Te(t,4,this.length),te(this,t,!0,23,4)},ue.prototype.readFloatBE=function(t,r){return r||Te(t,4,this.length),te(this,t,!1,23,4)},ue.prototype.readDoubleLE=function(t,r){return r||Te(t,8,this.length),te(this,t,!0,52,8)},ue.prototype.readDoubleBE=function(t,r){return r||Te(t,8,this.length),te(this,t,!1,52,8)},ue.prototype.writeUIntLE=function(t,r,e,n){(t=+t,r|=0,e|=0,n)||Ue(this,t,r,e,Math.pow(2,8*e)-1,0);var o=1,i=0;for(this[r]=255&t;++i=0&&(i*=256);)this[r+o]=t/i&255;return r+e},ue.prototype.writeUInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,255,0),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),this[r]=255&t,r+1},ue.prototype.writeUInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeUInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,65535,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeUInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r+3]=t>>>24,this[r+2]=t>>>16,this[r+1]=t>>>8,this[r]=255&t):Ie(this,t,r,!0),r+4},ue.prototype.writeUInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,4294967295,0),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeIntLE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=0,u=1,a=0;for(this[r]=255&t;++i>0)-a&255;return r+e},ue.prototype.writeIntBE=function(t,r,e,n){if(t=+t,r|=0,!n){var o=Math.pow(2,8*e-1);Ue(this,t,r,e,o-1,-o)}var i=e-1,u=1,a=0;for(this[r+i]=255&t;--i>=0&&(u*=256);)t<0&&0===a&&0!==this[r+i+1]&&(a=1),this[r+i]=(t/u>>0)-a&255;return r+e},ue.prototype.writeInt8=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,1,127,-128),ue.TYPED_ARRAY_SUPPORT||(t=Math.floor(t)),t<0&&(t=255+t+1),this[r]=255&t,r+1},ue.prototype.writeInt16LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8):Be(this,t,r,!0),r+2},ue.prototype.writeInt16BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,2,32767,-32768),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>8,this[r+1]=255&t):Be(this,t,r,!1),r+2},ue.prototype.writeInt32LE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),ue.TYPED_ARRAY_SUPPORT?(this[r]=255&t,this[r+1]=t>>>8,this[r+2]=t>>>16,this[r+3]=t>>>24):Ie(this,t,r,!0),r+4},ue.prototype.writeInt32BE=function(t,r,e){return t=+t,r|=0,e||Ue(this,t,r,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),ue.TYPED_ARRAY_SUPPORT?(this[r]=t>>>24,this[r+1]=t>>>16,this[r+2]=t>>>8,this[r+3]=255&t):Ie(this,t,r,!1),r+4},ue.prototype.writeFloatLE=function(t,r,e){return Ce(this,t,r,!0,e)},ue.prototype.writeFloatBE=function(t,r,e){return Ce(this,t,r,!1,e)},ue.prototype.writeDoubleLE=function(t,r,e){return Ye(this,t,r,!0,e)},ue.prototype.writeDoubleBE=function(t,r,e){return Ye(this,t,r,!1,e)},ue.prototype.copy=function(t,r,e,n){if(e||(e=0),n||0===n||(n=this.length),r>=t.length&&(r=t.length),r||(r=0),n>0&&n=this.length)throw new RangeError("sourceStart out of bounds");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-r=0;--o)t[o+r]=this[o+e];else if(i<1e3||!ue.TYPED_ARRAY_SUPPORT)for(o=0;o>>=0,e=void 0===e?this.length:e>>>0,t||(t=0),"number"==typeof t)for(i=r;i55295&&e<57344){if(!o){if(e>56319){(r-=3)>-1&&i.push(239,191,189);continue}if(u+1===n){(r-=3)>-1&&i.push(239,191,189);continue}o=e;continue}if(e<56320){(r-=3)>-1&&i.push(239,191,189),o=e;continue}e=65536+(o-55296<<10|e-56320)}else o&&(r-=3)>-1&&i.push(239,191,189);if(o=null,e<128){if((r-=1)<0)break;i.push(e)}else if(e<2048){if((r-=2)<0)break;i.push(e>>6|192,63&e|128)}else if(e<65536){if((r-=3)<0)break;i.push(e>>12|224,e>>6&63|128,63&e|128)}else{if(!(e<1114112))throw new Error("Invalid code point");if((r-=4)<0)break;i.push(e>>18|240,e>>12&63|128,e>>6&63|128,63&e|128)}}return i}function Le(t){return function(t){var r,e,n,o,i,u;Zr||Kr();var a=t.length;if(a%4>0)throw new Error("Invalid string. Length must be a multiple of 4");i="="===t[a-2]?2:"="===t[a-1]?1:0,u=new Gr(3*a/4-i),n=i>0?a-4:a;var f=0;for(r=0,e=0;r>16&255,u[f++]=o>>8&255,u[f++]=255&o;return 2===i?(o=Hr[t.charCodeAt(r)]<<2|Hr[t.charCodeAt(r+1)]>>4,u[f++]=255&o):1===i&&(o=Hr[t.charCodeAt(r)]<<10|Hr[t.charCodeAt(r+1)]<<4|Hr[t.charCodeAt(r+2)]>>2,u[f++]=o>>8&255,u[f++]=255&o),u}(function(t){if((t=function(t){if(t.trim)return t.trim();return t.replace(/^\s+|\s+$/g,"")}(t).replace(Me,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function ze(t,r,e,n){for(var o=0;o=r.length||o>=t.length);++o)r[o+e]=t[o];return o}function Fe(t){return null!=t&&(!!t._isBuffer||qe(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&qe(t.slice(0,0))}(t))}function qe(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}var Je=function(t,r){if(r instanceof Error){var e={};return Object.getOwnPropertyNames(r).forEach((function(t){e[t]=r[t]})),e}return r};var $e=function(t,r){try{var e=t.headers.accept.split(",");return r?e.filter((function(t){return t===r})):e}catch(t){return[]}},Qe=function(t,r){return!!$e(t,r).length},Ve=function(t,r){return t.path===r.jsonqlPath};exports.VERSION="1.0.2",exports.buff=function(t,r){return void 0===r&&(r="base64"),Fe(t)?t:new ue.from(t,r)},exports.cacheBurst=Cr,exports.cacheBurstUrl=function(t){return Nr(t,Cr())},exports.chainFns=function(t){for(var r=[],e=arguments.length-1;e-- >0;)r[e]=arguments[e+1];return function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];return r.reduce((function(t,r){return Reflect.apply(r,null,V(t))}),Reflect.apply(t,null,e))}},exports.chainPromises=function(t,r){return void 0===r&&(r=!1),t.reduce((function(t,e){return t.then((function(t){return e.then((function(e){return!1===r?t.concat([e]):mr(t,e)}))}))}),Promise.resolve(!1===r?[]:P(r)?r:{}))},exports.createEvt=function(){for(var t=[],r=arguments.length;r--;)t[r]=arguments[r];return t.join("_")},exports.createMutation=Fr,exports.createMutationStr=function(t,r,e,n){return void 0===e&&(e={}),void 0===n&&(n=!1),JSON.stringify(Fr(t,r,e,n))},exports.createQuery=zr,exports.createQueryStr=function(t,r,e){return void 0===r&&(r=[]),void 0===e&&(e=!1),JSON.stringify(zr(t,r,e))},exports.dasherize=Ir,exports.extractArgsFromPayload=function(t,r){switch(r){case"query":return t.args;case"mutation":return[t.payload,t.condition];default:throw new Tr("Unknown "+r+" to extract argument from!")}},exports.extractParamsFromContract=function(t,r,e){try{var n=t[r][e];if(!n)throw new Rr(e,r);return n}catch(t){throw new Rr(e,t)}},exports.extractSocketPart=Ur,exports.findFromContract=function(t,e,n){return!!(n[t]&&n[t][e]&&n[t][e].file&&r.existsSync(n[t][e].file))&&n[t][e].file},exports.formatPayload=Dr,exports.getCallMethod=function(t){switch(!0){case t===jr[0]:return"query";case t===jr[1]:return"mutation";default:return!1}},exports.getConfigValue=function(t,r){return r&&P(r)&&t in r?r[t]:void 0},exports.getDocLen=function(t){return ue.byteLength(t,"utf8")},exports.getMutationFromArgs=$r,exports.getMutationFromPayload=function(t){var r=Jr(t,$r);if(!1!==r)return r;throw new Sr("[getMutationArgs] Payload is malformed!",t)},exports.getNameFromPayload=kr,exports.getNamespace=function(t){var r="jsonql";return t.enableAuth?[[r,Pr].join("/"),[r,xr].join("/")]:[r]},exports.getNamespaceInOrder=function(t,r){var e=[];for(var n in t)n===r?e[1]=n:e[0]=n;return e},exports.getPathToFn=function(t,n,o){var i=o.resolverDir,u=Ir(t),a=[];o.contract&&o.contract[n]&&o.contract[n].path&&a.push(o.contract[n].path),a.push(e.join(i,n,u,[Or,Er].join("."))),a.push(e.join(i,n,[u,Er].join(".")));for(var f=a.length,s=0;s Date: Sun, 8 Mar 2020 21:18:26 +0800 Subject: [PATCH 07/19] clean up the ws-server-core --- packages/ws-server-core/package.json | 2 +- .../ws-server-core/src/share/namespace.js | 81 ------------------- 2 files changed, 1 insertion(+), 82 deletions(-) delete mode 100644 packages/ws-server-core/src/share/namespace.js diff --git a/packages/ws-server-core/package.json b/packages/ws-server-core/package.json index 90360c27..9674ee72 100644 --- a/packages/ws-server-core/package.json +++ b/packages/ws-server-core/package.json @@ -32,7 +32,7 @@ "jsonql-jwt": "^1.3.9", "jsonql-params-validator": "^1.5.2", "jsonql-resolver": "^1.1.1", - "jsonql-utils": "^1.0.1", + "jsonql-utils": "^1.0.2", "lodash": "^4.17.15" }, "devDependencies": { diff --git a/packages/ws-server-core/src/share/namespace.js b/packages/ws-server-core/src/share/namespace.js deleted file mode 100644 index fcf82d20..00000000 --- a/packages/ws-server-core/src/share/namespace.js +++ /dev/null @@ -1,81 +0,0 @@ -// this is move back from jsonql-utils -// because this is very socket specific - -/** - * @BUG we should check the socket part instead of expect the downstream to read the menu! - * We only need this when the enableAuth is true otherwise there is only one namespace - * @param {object} contract the socket part of the contract file - * @param {boolean} [fallback=false] this is a fall back option for old code - * @return {object} 1. remap the contract using the namespace --> resolvers - * 2. the size of the object (1 all private, 2 mixed public with private) - * 3. which namespace is public - */ -function groupByNamespace(contract, fallback = false) { - let socket = extractSocketPart(contract) - if (socket === false) { - if (fallback) { - return contract; // just return the whole contract - } - throw new JsonqlError(`socket not found in contract!`) - } - let nspSet = {} - let size = 0 - let publicNamespace - for (let resolverName in socket) { - let params = socket[resolverName] - let { namespace } = params - if (namespace) { - if (!nspSet[namespace]) { - ++size; - nspSet[namespace] = {} - } - nspSet[namespace][resolverName] = params - if (!publicNamespace) { - if (params.public) { - publicNamespace = namespace - } - } - } - } - return { size, nspSet, publicNamespace } -} - -/** - * @NOTE ported from jsonql-ws-client - * Got to make sure the connection order otherwise - * it will hang - * @param {object} nspSet contract - * @param {string} publicNamespace like the name said - * @return {array} namespaces in order - */ -function getNamespaceInOrder(nspSet, publicNamespace) { - let names = [] // need to make sure the order! - for (let namespace in nspSet) { - if (namespace === publicNamespace) { - names[1] = namespace - } else { - names[0] = namespace - } - } - return names -} - -/** - * @TODO this might change, what if we want to do room with ws - * 1. there will only be max two namespace - * 2. when it's normal we will have the stock path as namespace - * 3. when enableAuth then we will have two, one is jsonql/public + private - * @param {object} config options - * @return {array} of namespace(s) - */ -const getNamespace = function(config) { - const base = JSONQL_PATH - if (config.enableAuth) { - // the public come first - return [ - [ base , config.publicNamespace].join('/'), - [ base , config.privateNamespace].join('/') - ] - } - return [ base ] -} \ No newline at end of file -- Gitee From b7523b21fee507b929909063c8bcf017352c94dc Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 21:27:29 +0800 Subject: [PATCH 08/19] update nspSet to nspGroup and working correctly --- packages/ws-server/package.json | 2 +- packages/ws-server/src/core/ws-setup.js | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index 6bcbc8ff..d64ceda2 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -29,7 +29,7 @@ "dependencies": { "colors": "^1.4.0", "debug": "^4.1.1", - "jsonql-utils": "^1.0.1", + "jsonql-utils": "^1.0.2", "jsonql-ws-server-core": "^0.6.0", "ws": "^7.2.2" }, diff --git a/packages/ws-server/src/core/ws-setup.js b/packages/ws-server/src/core/ws-setup.js index 9d20fdf8..c95ac142 100644 --- a/packages/ws-server/src/core/ws-setup.js +++ b/packages/ws-server/src/core/ws-setup.js @@ -49,18 +49,18 @@ const wsSetup = (opts, nspObj) => { } rdebug('nspInfo', nspInfo) - let { publicNamespace, nspSet } = nspInfo + let { publicNamespace, nspGroup } = nspInfo for (let namespace in nspObj) { let userdata nspObj[namespace].on('connection', (ws, req) => { - // @TODO need to redo here the nspSet can be empty??? + // @TODO need to redo here the nspGroup can be empty??? ws.on('message', data => { let json = getPayload(data) debug('called with: ', json) - if (nspSet) { - let methodsInNsp = nspSet[namespace] - // debug('nspSet', namespace, methodsInNsp) + if (nspGroup) { + let methodsInNsp = nspGroup[namespace] + // debug('nspGroup', namespace, methodsInNsp) for (let resolverName in json) { switch (true) { case resolverName === LOGOUT_EVENT_NAME: -- Gitee From 8debfe09a6816ae0d82b4e32f191c42f1551605a Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 22:29:34 +0800 Subject: [PATCH 09/19] fix all the jwt related kinda problems for now --- .../ws-server/src/core/ws-create-server.js | 37 +++++++------ packages/ws-server/src/core/ws-setup.js | 3 +- packages/ws-server/tests/ws-jwt-auth.test.js | 53 ++++++------------- 3 files changed, 37 insertions(+), 56 deletions(-) diff --git a/packages/ws-server/src/core/ws-create-server.js b/packages/ws-server/src/core/ws-create-server.js index 1997881f..a9b30de0 100644 --- a/packages/ws-server/src/core/ws-create-server.js +++ b/packages/ws-server/src/core/ws-create-server.js @@ -6,23 +6,25 @@ const { createVerifyClient } = require('./verify-client') const { getNamespace } = require('jsonql-utils') const { getDebug } = require('./modules') const debug = getDebug('ws-setup') +const colors = require('colors/safe') + /** * Get the WS namespace instance to handle the call - * @param {array} namespace string * @param {object} config configuration * @return {array} of nsps */ -const generateWss = (namespace, config) => { +const generateNsp = config => { + const namespaces = getNamespace(config) let verifyClient if (config.enableAuth) { // @TODO should disable this secret // let key = config.secret ? config.secret : config.publicKey verifyClient = createVerifyClient(config.publicKey) } - return namespace + return namespaces .map((name, i) => { let opt = Object.assign({}, config.serverInitOption, { noServer: true }) - if (i>0) { + if (i > 0) { opt.verifyClient = verifyClient } // How do we pass more options here @@ -48,7 +50,7 @@ const getPath = req => { * @param {string} path of path name to compare * @return {object} ws */ -const getWssByPath = (nsps, path) => { +const getNspByPath = (nsps, path) => { for (let name in nsps) { if (nsps[path]) { return nsps[path] @@ -63,31 +65,28 @@ const getWssByPath = (nsps, path) => { * @return {object} ws server instance with namespace as key */ function wsCreateServer(config, server) { - // debug('got config here', config); - const namespace = getNamespace(config) - // debug('namespace', namespace) - const nsps = generateWss(namespace, config) + + const nsps = generateNsp(config) // we will always call it via a namespace server.on('upgrade', function upgrade(req, socket, head) { const pathname = getPath(req) - debug('Hear the upgrade event', pathname) + debug('Hear the upgrade event', colors.yellow(pathname)) - let srv = false - if ((srv = getWssByPath(nsps, pathname)) !== false) { - srv.handleUpgrade(req, socket, head, function done(ws) { - debug('found a srv to handle the call') - srv.emit('connection', ws, req) + let wss = false + if ((wss = getNspByPath(nsps, pathname)) !== false) { + wss.handleUpgrade(req, socket, head, function done(ws) { + debug('found a wss to handle the call') + wss.emit('connection', ws, req) }) } /* @1.4.11 we dont' destroy the connection any more because during init the client there might not be a call - here to get handle + here to get handle */ else { - debug('Unhandled socket destroy') - socket.destroy() + debug(colors.red('Unhandled socket')) + // socket.destroy() } - */ }) // add one more listener here to check out what's wrong with the server server.on('error', function(err) { diff --git a/packages/ws-server/src/core/ws-setup.js b/packages/ws-server/src/core/ws-setup.js index c95ac142..f6857e4b 100644 --- a/packages/ws-server/src/core/ws-setup.js +++ b/packages/ws-server/src/core/ws-setup.js @@ -47,12 +47,13 @@ const wsSetup = (opts, nspObj) => { if (opts.enableAuth) { nspInfo = groupByNamespace(opts.contract) // should not FALLBACK! } - rdebug('nspInfo', nspInfo) + // rdebug('nspInfo', nspInfo) let { publicNamespace, nspGroup } = nspInfo for (let namespace in nspObj) { let userdata nspObj[namespace].on('connection', (ws, req) => { + rdebug(namespace, 'connected') // @TODO need to redo here the nspGroup can be empty??? ws.on('message', data => { let json = getPayload(data) diff --git a/packages/ws-server/tests/ws-jwt-auth.test.js b/packages/ws-server/tests/ws-jwt-auth.test.js index 0bffeef2..e0dd55ac 100644 --- a/packages/ws-server/tests/ws-jwt-auth.test.js +++ b/packages/ws-server/tests/ws-jwt-auth.test.js @@ -50,7 +50,7 @@ test.after(t => { }) -test.cb.skip('It should able to connect to public namespace without a token', t => { +test.cb('It should able to connect to public namespace without a token', t => { // connect to the private channel t.plan(2) @@ -72,7 +72,7 @@ test.cb.skip('It should able to connect to public namespace without a token', t }) -test.cb.skip('It should able to connect to the private namespace', t => { +test.cb('It should able to connect to the private namespace', t => { t.plan(2) let client = t.context.client_private @@ -97,68 +97,49 @@ test.cb.skip('It should able to connect to the private namespace', t => { // what about the other clients? Should we reconnect them? so many question at the moment test.cb(`first try to connect to the private without login and see what happens`, t => { - const plan = 1 + const plan = 3 t.plan(plan) let ctn = 0 - if (plan === 3) { - let authClient = wsNodeClient(baseUrl + 'private') - // this is useful we could add this to the client to handle the error - authClient.on('error', err => { - debug(rainbow(`Got error`), err) - t.pass(`Expect to get an error`) // (1) - // t.end() - }) - } + // crash out the client + let authClient = wsNodeClient(baseUrl + 'private') + // this is useful we could add this to the client to handle the error + authClient.on('error', err => { + debug(rainbow(`Got error`), err) + t.truthy(err, `Expect to get an error`) // (1) + }) + - if (plan === 2) { // next try to connect to the public again and see what happen - let pClient = t.context.client_public - /** - * Very important observation - * When a private nsp is not connect (or fail the connection for whatever reason) - * the public one is available to connect and received calls - */ + let pClient = wsNodeClient(baseUrl + 'public') pClient.on('open', () => { + debug(rainbow(`onopen`)) pClient.send( createPayload('availableToEveryone') ) }) - pClient.on('message', data => { let json = extractWsPayload(data) - debug(rainbow('reply'), json) - - t.truthy(json.data, `Expect to get respond from the public nsp`) // (2) - // t.end() + debug(rainbow('PUBLIC reply'), json) + t.truthy(json.data, `Expect to get respond from the public nsp`) }) - pClient.on('error', err => { debug(rainbow('public client error'), err) }) - } + + setTimeout(() => { - // now we try to login again - // @BUG there is bug here somewhere we can connect to the private channel - // but the userdata is empty??? authClient = wsNodeClient(baseUrl + 'private', t.context.token1) - authClient.on('message', data => { ++ctn let json = extractWsPayload(data) - debug(rainbow(ctn+''), json) - t.truthy(json.data) // 3 - authClient.close() - t.end() }) - authClient.on('open', () => { authClient.send( createPayload('secretChatroom', 'la', 'na') ) }) - }, 500) }) -- Gitee From 6b68a347acd51727c9dc6363429e6d9bc2fac375 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 22:49:19 +0800 Subject: [PATCH 10/19] Mark all the TODO --- packages/ws-server-core/package.json | 2 +- packages/ws-server-core/src/handles/handle-intercom.js | 2 +- packages/ws-server-core/src/handles/handle-logout.js | 2 +- .../ws-server-core/src/handles/handle-standalone-login.js | 8 ++++++++ .../ws-server-core/src/handles/handle-unknown-payload.js | 2 +- 5 files changed, 12 insertions(+), 4 deletions(-) diff --git a/packages/ws-server-core/package.json b/packages/ws-server-core/package.json index 9674ee72..86bd6cc5 100644 --- a/packages/ws-server-core/package.json +++ b/packages/ws-server-core/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-ws-server-core", - "version": "0.6.0", + "version": "0.6.1", "description": "This is the core module that drive the Jsonql WS Socket server, not for direct use.", "main": "index.js", "files": [ diff --git a/packages/ws-server-core/src/handles/handle-intercom.js b/packages/ws-server-core/src/handles/handle-intercom.js index c5acae20..b346447f 100644 --- a/packages/ws-server-core/src/handles/handle-intercom.js +++ b/packages/ws-server-core/src/handles/handle-intercom.js @@ -1,7 +1,7 @@ const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') /** - * @TODO + * @TODO handle the intercom event disconnect / switch-user (future feature) * @param {*} ws * @param {*} req * @param {*} json diff --git a/packages/ws-server-core/src/handles/handle-logout.js b/packages/ws-server-core/src/handles/handle-logout.js index 9964965b..55500df6 100644 --- a/packages/ws-server-core/src/handles/handle-logout.js +++ b/packages/ws-server-core/src/handles/handle-logout.js @@ -4,7 +4,7 @@ const WS_EXIT_ID = 1 /** * This will change based on the WS spec - * @TODO + * @TODO handle the client logout event, it will send back one last message before exit * @param {object} ws socket */ function handleLogout(ws, req, json, opts) { diff --git a/packages/ws-server-core/src/handles/handle-standalone-login.js b/packages/ws-server-core/src/handles/handle-standalone-login.js index 7c66b04a..6df98b0e 100644 --- a/packages/ws-server-core/src/handles/handle-standalone-login.js +++ b/packages/ws-server-core/src/handles/handle-standalone-login.js @@ -1,10 +1,18 @@ + +const { getResolver } = require('jsonql-resolver') const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') +const { SOCKET_AUTH_DIR } = require('../options/constants') + /** + * When standalone:true and there is a login method in the folder + * then we will use that resolver to deal with the login over socket * @TODO */ function handleStandaloneLogin(ws, req, json, opts) { debug(`handleStanealoneLogin called`, json) + + } module.exports = { handleStandaloneLogin } 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 14770e79..1eb0650b 100644 --- a/packages/ws-server-core/src/handles/handle-unknown-payload.js +++ b/packages/ws-server-core/src/handles/handle-unknown-payload.js @@ -2,7 +2,7 @@ const { getDebug } = require('../share/helpers') const debug = getDebug('handle-intercome') /** - * @TODO + * @TODO not sure what to do with this one, perhaps just log it * @param {*} ws * @param {*} req * @param {*} json -- Gitee From bb3ab2172d0ec2b3703e4df92c8efc35dbf04ae7 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 8 Mar 2020 23:04:22 +0800 Subject: [PATCH 11/19] jsonql-ws-server to 1.6.4 --- packages/ws-server/package.json | 2 +- packages/ws-server/src/core/modules.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index d64ceda2..5f08c218 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -30,7 +30,7 @@ "colors": "^1.4.0", "debug": "^4.1.1", "jsonql-utils": "^1.0.2", - "jsonql-ws-server-core": "^0.6.0", + "jsonql-ws-server-core": "^0.6.1", "ws": "^7.2.2" }, "devDependencies": { diff --git a/packages/ws-server/src/core/modules.js b/packages/ws-server/src/core/modules.js index 341aa92d..ef532383 100644 --- a/packages/ws-server/src/core/modules.js +++ b/packages/ws-server/src/core/modules.js @@ -23,7 +23,7 @@ const { handleLogout, handleStandaloneLogin, handleUnknownPayload -} = require('../../../ws-server-core') //require('jsonql-ws-server-core') +} = require('jsonql-ws-server-core') // require('../../../ws-server-core') module.exports = { WebSocket, -- Gitee From 669357c9604c560927c7c1a74d63ad8c222e175a Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 08:58:19 +0800 Subject: [PATCH 12/19] updating and adding more features --- packages/ws-client-core/package.json | 8 ++++---- packages/ws-client-core/tests/event.test.js | 14 ------------- packages/ws-client-core/tests/evt.test.js | 11 ++++++++++ packages/ws-client-core/tests/tbd.test.js | 15 +++++--------- .../ws-server-core/src/share/add-property.js | 8 ++------ .../ws-server-core/src/share/create-send.js | 20 +++++++++++++++++++ .../src/share/resolve-method.js | 20 +++++-------------- packages/ws-server/package.json | 3 ++- packages/ws-server/src/core/handle-nsp.js | 4 ---- .../fixtures/resolvers/socket/cause-error.js | 3 ++- .../fixtures/resolvers/socket/ws-handler.js | 2 +- .../ws-server/tests/ws-connect-es6.test.js | 17 +--------------- packages/ws-server/tests/ws-connect.test.js | 1 - 13 files changed, 53 insertions(+), 73 deletions(-) create mode 100644 packages/ws-client-core/tests/evt.test.js create mode 100644 packages/ws-server-core/src/share/create-send.js diff --git a/packages/ws-client-core/package.json b/packages/ws-client-core/package.json index b518efeb..87e185cc 100644 --- a/packages/ws-client-core/package.json +++ b/packages/ws-client-core/package.json @@ -54,19 +54,19 @@ }, "dependencies": { "@to1source/event": "^1.0.0", - "jsonql-constants": "^1.9.6", + "jsonql-constants": "^1.9.7", "jsonql-errors": "^1.1.10", "jsonql-params-validator": "^1.5.2", - "jsonql-utils": "^1.0.0" + "jsonql-utils": "^1.0.2" }, "devDependencies": { "ava": "^3.5.0", "esm": "^3.2.25", "fs-extra": "^8.1.0", "jsonql-contract": "^1.8.7", - "jsonql-ws-server": "^1.6.3", + "jsonql-ws-server": "^1.6.4", "kefir": "^3.8.6", - "ws": "^7.2.1" + "ws": "^7.2.2" }, "repository": { "type": "git", diff --git a/packages/ws-client-core/tests/event.test.js b/packages/ws-client-core/tests/event.test.js index b7083224..73c4829c 100644 --- a/packages/ws-client-core/tests/event.test.js +++ b/packages/ws-client-core/tests/event.test.js @@ -17,15 +17,11 @@ test.before(t => { test(`Check why the ee not showing anything`, t => { const ee = getEventEmitter({ log: debug }) - ee.$on('something', value => { return value + 1 }) - ee.$trigger('something', 1) - t.is(ee.$done, 2) - }) @@ -45,21 +41,15 @@ test.cb(`It should able to trigger multiple callback`, t => { debug(++ctn) t.is(value, 1) t.end() - }) - evt.$trigger('something', 1) - }) test.cb(`Test the object getter to return a function to create a new on interface`, t => { - t.plan(1) - const setter = function(value) { console.log(value) } - const getter = function() { return function(value, callback) { // console.log(value, callback) @@ -68,17 +58,13 @@ test.cb(`Test the object getter to return a function to create a new on interfac } } } - let obj = {} obj = objDefineProps(obj, 'on', setter, getter) - obj.on('yes', function cb(value) { t.is('yes', value, 'yes is the value') t.end() }) }) - - // 1 test(`Test another way to pass parameters to the getter then try to get a value back`, t => { const setter = function(value) { diff --git a/packages/ws-client-core/tests/evt.test.js b/packages/ws-client-core/tests/evt.test.js new file mode 100644 index 00000000..8aeff418 --- /dev/null +++ b/packages/ws-client-core/tests/evt.test.js @@ -0,0 +1,11 @@ +// testing the event, especially the switching to stimulate +// the pre-login / post-login situation +const test = require('ava') +const Event = require('@to1source/event') +const debug = require('debug') +const logger = debug('jsonql-ws-client:test:evt:logger') +const db = debug('jsonql-ws-client:test:evt') + +test.before(t => { + t.context.evt = new Event({ logger }) +}) diff --git a/packages/ws-client-core/tests/tbd.test.js b/packages/ws-client-core/tests/tbd.test.js index 51a6088f..25c9dd30 100644 --- a/packages/ws-client-core/tests/tbd.test.js +++ b/packages/ws-client-core/tests/tbd.test.js @@ -1,10 +1,9 @@ -// mocking the client generator -// and only test the internal -// espcially debug the event system +// mocking the client generator +// and only test the internal +// espcially debug the event system const test = require('ava') const { mockClient, log } = require('./fixtures/lib/mock-client') - const { ON_ERROR_FN_NAME, ON_READY_FN_NAME @@ -15,8 +14,8 @@ test.before(async t => { }) test.cb(`We should able to get a list of event register via the eventEmitter`, t => { - - const client = t.context.client + + const client = t.context.client t.plan(2) //log('show client', client) @@ -38,7 +37,3 @@ test.cb(`We should able to get a list of event register via the eventEmitter`, t } }) - - - - diff --git a/packages/ws-server-core/src/share/add-property.js b/packages/ws-server-core/src/share/add-property.js index 9ba733bc..ceb2130a 100644 --- a/packages/ws-server-core/src/share/add-property.js +++ b/packages/ws-server-core/src/share/add-property.js @@ -9,6 +9,7 @@ const { const { objDefineProps, injectToFn } = require('jsonql-utils') const { provideUserdata } = require('jsonql-jwt') const { injectNodeClient } = require('jsonql-resolver') +const { createSend } = require('./create-send') const { nil, createWsReply, getDebug } = require('../share/helpers') const debug = getDebug(`addProperty`) @@ -27,12 +28,7 @@ const addProperty = (fn, resolverName, ws, userdata, opts) => { .resolve(injectToFn(fn, JS_WS_NAME, ws)) // define the send method .then(resolver => { - // @NOTE this will add a `send` function to this resolver - debug(`add ${SEND_MSG_FN_NAME} to ${resolverName}`) - return objDefineProps(resolver, SEND_MSG_FN_NAME, function(prop) { - // @TODO should this get validate as well? - ws.send(createWsReply(EMIT_REPLY_TYPE, resolverName, prop)) - }, nil) + return createSend(resolver) }) .then(resolver => { debug(`addProperty ---> userdata --->`, userdata) diff --git a/packages/ws-server-core/src/share/create-send.js b/packages/ws-server-core/src/share/create-send.js new file mode 100644 index 00000000..9f21dffc --- /dev/null +++ b/packages/ws-server-core/src/share/create-send.js @@ -0,0 +1,20 @@ +const { SEND_MSG_FN_NAME } = require('jsonql-constants') +const { objDefineProps } = require('jsonql-utils') +const { nil } = require('./helpers') + +/** + * It was just a simple resolverName.send setter + * Now we make it full feature, also it should pair with a `receive` method? + * @param {function} resolver the function itself + */ +const createSend = function(resolverName, args, params, opts, ws) { + // @NOTE this will add a `send` function to this resolver + debug(`add ${SEND_MSG_FN_NAME} to ${resolverName}`) + return objDefineProps(resolver, SEND_MSG_FN_NAME, function(prop) { + // @TODO should this get validate as well? + ws.send(createWsReply(EMIT_REPLY_TYPE, resolverName, prop)) + }, nil) +} + + +module.exports = { createSend } diff --git a/packages/ws-server-core/src/share/resolve-method.js b/packages/ws-server-core/src/share/resolve-method.js index 7c85b0bf..5f4702ea 100644 --- a/packages/ws-server-core/src/share/resolve-method.js +++ b/packages/ws-server-core/src/share/resolve-method.js @@ -1,22 +1,9 @@ // search for the resolver location -/* - JsonqlAuthorisationError, - JsonqlResolverNotFoundError, - JsonqlValidationError, - JsonqlError, - finalCatch -*/ const { JsonqlResolverAppError } = require('jsonql-errors') -/* -DEFAULT_RESOLVER_IMPORT_FILE_NAME, - MODULE_TYPE -*/ const { SOCKET_NAME } = require('jsonql-constants') const { getResolver } = require('jsonql-resolver') - const { getRainbowDebug } = require('./helpers') const { addProperty } = require('./add-property') - const debug = getRainbowDebug('resolve-method') /** @@ -33,7 +20,7 @@ const resolveMethod = function(resolverName, args, params, opts, ws, userdata = debug('wsServerCore.resolveMethod', params) // check what is this then decided what to do later debug(`resolveMethod userdata`, userdata) // the contract is always part of the options here - const { contract } = opts + const { contract } = opts const fn = getResolver(resolverName, SOCKET_NAME, contract, opts) return addProperty(fn, resolverName, ws, userdata, opts) @@ -48,4 +35,7 @@ const resolveMethod = function(resolverName, args, params, opts, ws, userdata = } // we only need to export one method -module.exports = { resolveMethod } +module.exports = { + resolveMethod, + createSendMethod +} diff --git a/packages/ws-server/package.json b/packages/ws-server/package.json index 5f08c218..87f004ba 100755 --- a/packages/ws-server/package.json +++ b/packages/ws-server/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-ws-server", - "version": "1.6.4", + "version": "1.6.5", "description": "Setup WebSocket server for the jsonql to run on the same host, automatic generate public / private channel using contract", "main": "index.js", "files": [ @@ -31,6 +31,7 @@ "debug": "^4.1.1", "jsonql-utils": "^1.0.2", "jsonql-ws-server-core": "^0.6.1", + "nanoid": "^2.1.11", "ws": "^7.2.2" }, "devDependencies": { diff --git a/packages/ws-server/src/core/handle-nsp.js b/packages/ws-server/src/core/handle-nsp.js index eb983f57..a1d60ba9 100644 --- a/packages/ws-server/src/core/handle-nsp.js +++ b/packages/ws-server/src/core/handle-nsp.js @@ -43,9 +43,7 @@ const fnHandler = (ws, payload, resolverName, params, opts, userdata) => { ) ) .then(result => { - debug('resolver return result', result) - // decide if we need to call the cb or not here if (isNotEmpty(result)) { cb(createWsReply(ACKNOWLEDGE_REPLY_TYPE, resolverName, result)) @@ -71,9 +69,7 @@ const handleNsp = (ws, json, socketFns, opts, userdata = false) => { // const ts = json[TIMESTAMP_PARAM_NAME] // keep this for use later for (let resolverName in json) { if (resolverName !== TIMESTAMP_PARAM_NAME) { // dirty hack for now - debug('connection call', resolverName) - let payload = json[resolverName] let params = socketFns[resolverName] // we need to use the decoded token --> userdata diff --git a/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js b/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js index 6b9278c3..2bdbc796 100644 --- a/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js +++ b/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js @@ -4,6 +4,7 @@ * @param {string} msg a message * @return {string} a message but here we throw an error */ -module.exports = function(msg) { +module.exports = function causeError(msg) { + causeError.send = 'something else' throw new Error(msg) } diff --git a/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js b/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js index 0a6a10e0..9e9ff26c 100644 --- a/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js +++ b/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js @@ -8,7 +8,7 @@ */ module.exports = function wsHandler(msg, timestamp) { - wsHandler.send = 'I am sending a message back from ws'; + wsHandler.send = 'I am sending a message back from ws' return new Promise(resolver => { setTimeout(() => { diff --git a/packages/ws-server/tests/ws-connect-es6.test.js b/packages/ws-server/tests/ws-connect-es6.test.js index fa4f1224..45f19e3a 100644 --- a/packages/ws-server/tests/ws-connect-es6.test.js +++ b/packages/ws-server/tests/ws-connect-es6.test.js @@ -42,31 +42,24 @@ test.cb('Grouping all ES6 test together as one because the way ws reponse to on. t.plan(9) // connect to the server let client = t.context.client - client.on('open', () => { - client.send( createPayload('wsHandler', msg + ' 1st', Date.now()) ) - client.send( createPayload('chatroom', msg + ' 2nd', Date.now()) ) - setTimeout(() => { client.send( createPayload('causeError', msg + ' 3nd') ) }, 500) }) - let i = 0 - const shouldEnd = (ctn, t) => { if (ctn > 2) { t.end() } } - // wait for reply client.on('message', (data) => { // (1) t.is(true , t.context.io[JSONQL_PATH] !== undefined) - let json; + let json try { json = extractWsPayload(data) debug('on message received: ', json) @@ -93,15 +86,7 @@ test.cb('Grouping all ES6 test together as one because the way ws reponse to on. shouldEnd(++i, t) } } catch(e) { - debug('error', e) - /* - let { data } = error; - t.true(data.error.className === 'JsonqlResolverAppError' && data.error.message === 'causeError') - t.is(data.error.type, ERROR_TYPE) - t.truthy(data.error, 'causeError should have error field') - */ - t.end() } }) diff --git a/packages/ws-server/tests/ws-connect.test.js b/packages/ws-server/tests/ws-connect.test.js index 5849ec05..6ddb28a2 100644 --- a/packages/ws-server/tests/ws-connect.test.js +++ b/packages/ws-server/tests/ws-connect.test.js @@ -28,7 +28,6 @@ test.before(async t => { t.context.io = io t.context.server = app t.context.server.listen(port) - t.context.client = wsNodeClient(`ws://localhost:${port}/${JSONQL_PATH}`) }) -- Gitee From c5208a849aad015f126134d120ceca2df2a0f770 Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 09:03:31 +0800 Subject: [PATCH 13/19] add a nginx cross site header example --- packages/constants/module.js | 4 +++- packages/koa/tests/helpers/nginx.txt | 9 +++++++++ packages/koa/ts/README.md | 5 ----- packages/ws-server-core/src/share/create-send.js | 6 +++++- 4 files changed, 17 insertions(+), 7 deletions(-) create mode 100644 packages/koa/tests/helpers/nginx.txt delete mode 100644 packages/koa/ts/README.md diff --git a/packages/constants/module.js b/packages/constants/module.js index 4a3bb53c..22613c16 100644 --- a/packages/constants/module.js +++ b/packages/constants/module.js @@ -23,7 +23,7 @@ export const DEFAULT_TYPE = 'any' // export const PUBLIC_FILE_NAME = 'public-contract.json' // @TODO remove once all changed export const DEFAULT_CONTRACT_FILE_NAME = 'contract.json' export const PUBLIC_CONTRACT_FILE_NAME = 'public-contract.json' -// this is for the ES6 module import and export @TODO remove later +// this is for the ES6 module import and export @TODO remove later export const DEFAULT_RESOLVER_LIST_FILE_NAME = 'resolver.js' export const DEFAULT_RESOLVER_IMPORT_FILE_NAME = 'import.js' @@ -226,3 +226,5 @@ export const FORBIDDEN_STATUS = 403 export const NOT_FOUND_STATUS = 404 // just whatever export const DEFAULT_PORT_NUM = 6557 +// headers +export const CSRF_HEADER_KEY = 'X-CSRFToken' diff --git a/packages/koa/tests/helpers/nginx.txt b/packages/koa/tests/helpers/nginx.txt new file mode 100644 index 00000000..f436640c --- /dev/null +++ b/packages/koa/tests/helpers/nginx.txt @@ -0,0 +1,9 @@ +location / { + add_header Access-Control-Allow-Origin *; + add_header Access-Control-Allow-Methods 'GET, POST, OPTIONS'; + add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; + + if ($request_method = 'OPTIONS') { + return 204; + } +} diff --git a/packages/koa/ts/README.md b/packages/koa/ts/README.md deleted file mode 100644 index 2761d5e3..00000000 --- a/packages/koa/ts/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Typescript port - -There was an idea to port this into Typescript but later on, I found it completely pointless and waste of time. -Since Typescript running from node.js is NOT real language. Instead we move our focus onto deno.js instead, -which Typescript is support natively diff --git a/packages/ws-server-core/src/share/create-send.js b/packages/ws-server-core/src/share/create-send.js index 9f21dffc..9e7a5c89 100644 --- a/packages/ws-server-core/src/share/create-send.js +++ b/packages/ws-server-core/src/share/create-send.js @@ -10,7 +10,11 @@ const { nil } = require('./helpers') const createSend = function(resolverName, args, params, opts, ws) { // @NOTE this will add a `send` function to this resolver debug(`add ${SEND_MSG_FN_NAME} to ${resolverName}`) - return objDefineProps(resolver, SEND_MSG_FN_NAME, function(prop) { + return objDefineProps( + resolver, + SEND_MSG_FN_NAME, + nil, + function (prop) { // @TODO should this get validate as well? ws.send(createWsReply(EMIT_REPLY_TYPE, resolverName, prop)) }, nil) -- Gitee From fabb2cd5e2ef50e3dc9bf4b33c3a9e95cde5d206 Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 09:23:30 +0800 Subject: [PATCH 14/19] create skeleton createSend --- packages/constants/module.js | 1 + packages/constants/package.json | 2 +- .../ws-client-core/src/utils/process-contract.js | 4 +++- packages/ws-client-core/tests/evt.test.js | 3 +++ packages/ws-server-core/src/share/create-send.js | 16 ++++++++++------ .../fixtures/resolvers/socket/cause-error.js | 2 +- .../fixtures/resolvers/socket/ws-handler.js | 6 +++--- 7 files changed, 22 insertions(+), 12 deletions(-) diff --git a/packages/constants/module.js b/packages/constants/module.js index 22613c16..42b57f94 100644 --- a/packages/constants/module.js +++ b/packages/constants/module.js @@ -228,3 +228,4 @@ export const NOT_FOUND_STATUS = 404 export const DEFAULT_PORT_NUM = 6557 // headers export const CSRF_HEADER_KEY = 'X-CSRFToken' +export const ORIGIN_HEADER_KEYS = ['origin'] diff --git a/packages/constants/package.json b/packages/constants/package.json index bcd1bbe5..4acef190 100755 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-constants", - "version": "1.9.7", + "version": "1.9.8", "description": "All the share constants for jsonql tools", "main": "main.js", "module": "module.js", diff --git a/packages/ws-client-core/src/utils/process-contract.js b/packages/ws-client-core/src/utils/process-contract.js index 92f81ca5..674b9231 100644 --- a/packages/ws-client-core/src/utils/process-contract.js +++ b/packages/ws-client-core/src/utils/process-contract.js @@ -29,7 +29,9 @@ export default function processContract(opts) { return groupByNamespace(contract) } return { - [NSP_SET]: { [JSONQL_PATH]: getResolverList(contract) }, + [NSP_SET]: { + [JSONQL_PATH]: getResolverList(contract) + }, [PUBLIC_NAMESPACE]: JSONQL_PATH } } diff --git a/packages/ws-client-core/tests/evt.test.js b/packages/ws-client-core/tests/evt.test.js index 8aeff418..18c58d84 100644 --- a/packages/ws-client-core/tests/evt.test.js +++ b/packages/ws-client-core/tests/evt.test.js @@ -9,3 +9,6 @@ const db = debug('jsonql-ws-client:test:evt') test.before(t => { t.context.evt = new Event({ logger }) }) + + +test.todo(`Testing the switch over callback binding`) diff --git a/packages/ws-server-core/src/share/create-send.js b/packages/ws-server-core/src/share/create-send.js index 9e7a5c89..ba4ac3eb 100644 --- a/packages/ws-server-core/src/share/create-send.js +++ b/packages/ws-server-core/src/share/create-send.js @@ -1,6 +1,7 @@ const { SEND_MSG_FN_NAME } = require('jsonql-constants') const { objDefineProps } = require('jsonql-utils') -const { nil } = require('./helpers') +const { nil, getDebug } = require('./helpers') +const debug = getDebug('create-send') /** * It was just a simple resolverName.send setter @@ -14,11 +15,14 @@ const createSend = function(resolverName, args, params, opts, ws) { resolver, SEND_MSG_FN_NAME, nil, - function (prop) { - // @TODO should this get validate as well? - ws.send(createWsReply(EMIT_REPLY_TYPE, resolverName, prop)) - }, nil) + function sendHandler() { + return function sendCallback(...args) { + // now do the same as resolver + // ws.send(createWsReply(EMIT_REPLY_TYPE, resolverName, prop)) + debug('sendCallback', args) + } + } + ) } - module.exports = { createSend } diff --git a/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js b/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js index 2bdbc796..c49b9ab0 100644 --- a/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js +++ b/packages/ws-server/tests/fixtures/resolvers/socket/cause-error.js @@ -5,6 +5,6 @@ * @return {string} a message but here we throw an error */ module.exports = function causeError(msg) { - causeError.send = 'something else' + causeError.send('something else') throw new Error(msg) } diff --git a/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js b/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js index 9e9ff26c..7831c9cb 100644 --- a/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js +++ b/packages/ws-server/tests/fixtures/resolvers/socket/ws-handler.js @@ -7,12 +7,12 @@ * @return {string} msg + time lapsed */ module.exports = function wsHandler(msg, timestamp) { - - wsHandler.send = 'I am sending a message back from ws' + const ts = Date.now() + wsHandler.send('I am sending a message back from ws', ts) return new Promise(resolver => { setTimeout(() => { - resolver(msg + ' - ' +(Date.now() - timestamp)) + resolver(msg + ' - ' +(ts - timestamp)) }, 1000) }) } -- Gitee From a647c1542f78aa1a67c78a0fced81a3ee4b6e4eb Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 10:26:15 +0800 Subject: [PATCH 15/19] verify which way should go, when using setter is going to throw error, only getter --- packages/constants/module.js | 3 +- packages/ws-server-core/index.js | 2 + packages/ws-server-core/package.json | 5 ++- packages/ws-server-core/src/index.js | 14 +++--- .../ws-server-core/src/options/constants.js | 8 +++- packages/ws-server-core/tests/create.test.js | 30 +++++++++++++ packages/ws-server/src/core/verify-client.js | 43 +++++++++++++++---- .../ws-server/src/core/ws-create-server.js | 14 ++---- 8 files changed, 90 insertions(+), 29 deletions(-) create mode 100644 packages/ws-server-core/tests/create.test.js diff --git a/packages/constants/module.js b/packages/constants/module.js index 42b57f94..a5848275 100644 --- a/packages/constants/module.js +++ b/packages/constants/module.js @@ -74,7 +74,6 @@ export const VALIDATOR_NAME = 'validator' export const DISCONNECT_FN_NAME = 'disconnect' export const SWITCH_USER_FN_NAME = 'switch-user' - export const AUTH_HEADER = 'Authorization' export const AUTH_CHECK_HEADER = 'authorization' // this is for checking so it must be lowercase export const BEARER = 'Bearer' @@ -144,11 +143,13 @@ export const SOCKET_CLIENT_TS_KEY = '__socket_client_ts_key__' // connection, the following new event @1.9.2 will correct this edge case // although it should never happens, but in some edge case might want to // disconnect from the current server, then re-establish connection later +export const CONNECTED_EVENT_NAME = '__connected__' export const DISCONNECT_EVENT_NAME = '__disconnect__' // group the inter communcation event name in one then for the server // to create a handler to handle this kind of event export const INTER_COM_EVENT_NAME = '__inter_com__' export const INTER_COM_EVENT_NAMES = [ + CONNECTED_EVENT_NAME, SWITCH_USER_EVENT_NAME, DISCONNECT_EVENT_NAME ] diff --git a/packages/ws-server-core/index.js b/packages/ws-server-core/index.js index 22cb4b6c..33309010 100644 --- a/packages/ws-server-core/index.js +++ b/packages/ws-server-core/index.js @@ -2,6 +2,7 @@ // which is completely useless for us if there is no namespace const { SOCKET_STATE_KEY, + NO_TOKEN_ERR_MSG, // rename them wsServerDefaultOptions, wsServerConstProps, @@ -41,6 +42,7 @@ const { // export every bits out then the downstream build as they want module.exports = { SOCKET_STATE_KEY, + NO_TOKEN_ERR_MSG, // for the server to use addProperty, getContract, diff --git a/packages/ws-server-core/package.json b/packages/ws-server-core/package.json index 86bd6cc5..8c029c35 100644 --- a/packages/ws-server-core/package.json +++ b/packages/ws-server-core/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-ws-server-core", - "version": "0.6.1", + "version": "0.6.2", "description": "This is the core module that drive the Jsonql WS Socket server, not for direct use.", "main": "index.js", "files": [ @@ -10,7 +10,8 @@ "scripts": { "test": "ava", "prepare": "npm run test", - "test:object": "DEBUG=jsonql-ws-server* ava ./tests/object.test.js", + "test:object": "DEBUG=jsonql-ws-server* ava ./tests/object.test.js", + "test:create": "DEBUG=jsonql-ws-server* ava ./tests/create.test.js", "contract": "node ./node_modules/jsonql-contract/cmd.js configFile ./tests/fixtures/contract-config.js" }, "keywords": [ diff --git a/packages/ws-server-core/src/index.js b/packages/ws-server-core/src/index.js index 99ebf266..24502d55 100644 --- a/packages/ws-server-core/src/index.js +++ b/packages/ws-server-core/src/index.js @@ -1,15 +1,16 @@ // re-export here const { - SOCKET_STATE_KEY + SOCKET_STATE_KEY, + NO_TOKEN_ERR_MSG } = require('./options/constants') -const { +const { initWsServerOption, checkSocketServerType, - wsServerCheckConfiguration, - wsDefaultOptions, - wsConstProps + wsServerCheckConfiguration, + wsDefaultOptions, + wsConstProps } = require('./options') -const { +const { jsonqlWsServerCoreAction, jsonqlWsServerCore } = require('./core') @@ -19,6 +20,7 @@ const wsServerConstProps = wsConstProps // re-export module.exports = { SOCKET_STATE_KEY, + NO_TOKEN_ERR_MSG, // rename them wsServerDefaultOptions, wsServerConstProps, diff --git a/packages/ws-server-core/src/options/constants.js b/packages/ws-server-core/src/options/constants.js index f09447a0..5522a669 100644 --- a/packages/ws-server-core/src/options/constants.js +++ b/packages/ws-server-core/src/options/constants.js @@ -14,7 +14,7 @@ const SOCKET_AUTH_DIR = join(SOCKET_NAME, AUTH_TYPE) // short hand const SOCKET_IO = JS_WS_SOCKET_IO_NAME const WS = JS_WS_NAME -const AVAILABLE_SERVERS = [SOCKET_IO, WS] +const AVAILABLE_SERVERS = [ SOCKET_IO, WS ] // just message const SOCKET_NOT_DEFINE_ERR = 'socket is not define in the contract file!' @@ -26,6 +26,8 @@ const MODULE_NAME = 'jsonql-ws-server-core' const CONTRACT_NOT_FOUND_ERR = `No contract presented!` +const NO_TOKEN_ERR_MSG = `No token!` + module.exports = { SOCKET_IO, WS, @@ -36,5 +38,7 @@ module.exports = { MODULE_NAME, CONTRACT_NOT_FOUND_ERR, SOCKET_AUTH_DIR, - SOCKET_STATE_KEY + SOCKET_STATE_KEY, + + NO_TOKEN_ERR_MSG } diff --git a/packages/ws-server-core/tests/create.test.js b/packages/ws-server-core/tests/create.test.js new file mode 100644 index 00000000..5dc6dfe3 --- /dev/null +++ b/packages/ws-server-core/tests/create.test.js @@ -0,0 +1,30 @@ +// test the different between using a setter or getter to set property +const test = require('ava') +const { objDefineProps } = require('jsonql-utils') +const { SEND_MSG_FN_NAME } = require('jsonql-constants') +const { nil, getDebug } = require('../src/share/helpers') +const debug = getDebug('test:create') + +test(`Create a setter as function to an object`, t => { + + let obj = {} + + obj = objDefineProps(obj, SEND_MSG_FN_NAME, nil, function sendHandler() { + return function sendCallback(...args) { + return args + .filter(v => typeof v === 'string') + .reduce((a, b) => { + if (a==='') { + return b + } + return [a, b].join(' ') + }, '') + } + }) + + const result = obj[SEND_MSG_FN_NAME]('I', 'am', 'a', 7, 'cat') + + debug(result) + + t.is(result,'I am a cat') +}) diff --git a/packages/ws-server/src/core/verify-client.js b/packages/ws-server/src/core/verify-client.js index b1c69df8..f5069bf0 100644 --- a/packages/ws-server/src/core/verify-client.js +++ b/packages/ws-server/src/core/verify-client.js @@ -9,7 +9,7 @@ const { SOCKET_STATE_KEY } = require('./modules') const { debug } = require('../utils') /* -old method keep for reference +old method keep for reference const params = query.split('&') return params.filter(param => ( param.indexOf(TOKEN_PARAM_NAME) > -1 @@ -31,14 +31,34 @@ function getTokenFromQuery(uri) { return false } +/** + * We need to check the origin from the header to make sure it's match + * @param {object} req request object + */ +function checkHeaders(req) { + debug('headers', req.headers) + return true +} + +/** + * Just output the key of this object and see what is inside + * + */ +function peek(info) { + for (let key in info) { + debug('info key', key) + } +} + /** * provide the necessary param to create the verifyClient function + * @param {object} opts need to add this because from now on we will always verifyClient * @param {string|buffer} publicKey for decoding * @param {object} [jwtOptions={}] optional pass to the jwtDecode * @param {function|boolean} [failCallback=false] if the token is invalid * @return {function} verifyClient method */ -function createVerifyClient(publicKey, jwtOptions = {}, failCallback = false) { +function createVerifyClient(opts, publicKey, jwtOptions = {}, failCallback = false) { const cb = failCallback === false ? msg => { console.error('verifyClient error:', msg) } : failCallback @@ -48,15 +68,22 @@ function createVerifyClient(publicKey, jwtOptions = {}, failCallback = false) { * @param {function} done a callback to pass or fail the login */ return function verifyClient(info, done) { - const uri = info.req.url + peek(info) + const req = info.req + if (!checkHeaders(req)) { + cb('Header check failed') + return done(false) + } + const uri = req.url const token = getTokenFromQuery(uri) + if (token) { debug(`Got a token`, token) try { const payload = jwtDecode(token, publicKey, jwtOptions) debug(`verifyClient decoded with result:`, payload) - + if (!info.req[SOCKET_STATE_KEY]) { info.req[SOCKET_STATE_KEY] = {} } @@ -64,10 +91,10 @@ function createVerifyClient(publicKey, jwtOptions = {}, failCallback = false) { info.req[SOCKET_STATE_KEY].userdata = payload return done(payload) } catch(e) { - done(false) cb({e, token, uri}) + done(false) } - } + } // @BUG error then what todo? cb('no token!') done(false) @@ -75,14 +102,14 @@ function createVerifyClient(publicKey, jwtOptions = {}, failCallback = false) { } /* -another example +another example server.on('upgrade', function upgrade(request, socket, head) { authenticate(request, (err, client) => { if (err || !client) { socket.destroy(); return; } - + wss.handleUpgrade(request, socket, head, function done(ws) { wss.emit('connection', ws, request, client); }); diff --git a/packages/ws-server/src/core/ws-create-server.js b/packages/ws-server/src/core/ws-create-server.js index a9b30de0..f067d25b 100644 --- a/packages/ws-server/src/core/ws-create-server.js +++ b/packages/ws-server/src/core/ws-create-server.js @@ -15,18 +15,12 @@ const colors = require('colors/safe') */ const generateNsp = config => { const namespaces = getNamespace(config) - let verifyClient - if (config.enableAuth) { - // @TODO should disable this secret - // let key = config.secret ? config.secret : config.publicKey - verifyClient = createVerifyClient(config.publicKey) - } + // @1.6.5 always add verifyClient from now on + const verifyClient = createVerifyClient(opts, config.publicKey) + return namespaces .map((name, i) => { - let opt = Object.assign({}, config.serverInitOption, { noServer: true }) - if (i > 0) { - opt.verifyClient = verifyClient - } + const opt = Object.assign({}, config.serverInitOption, { noServer: true, verifyClient }) // How do we pass more options here return { [name]: new WebSocket.Server(opt) -- Gitee From 62feafd8d6171a64503c512ead6f8a6164220534 Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 10:29:31 +0800 Subject: [PATCH 16/19] rename to create-verify-client because this is what it is --- .../src/core/{verify-client.js => create-verify-client.js} | 0 packages/ws-server/src/core/ws-create-server.js | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) rename packages/ws-server/src/core/{verify-client.js => create-verify-client.js} (100%) diff --git a/packages/ws-server/src/core/verify-client.js b/packages/ws-server/src/core/create-verify-client.js similarity index 100% rename from packages/ws-server/src/core/verify-client.js rename to packages/ws-server/src/core/create-verify-client.js diff --git a/packages/ws-server/src/core/ws-create-server.js b/packages/ws-server/src/core/ws-create-server.js index f067d25b..39a93264 100644 --- a/packages/ws-server/src/core/ws-create-server.js +++ b/packages/ws-server/src/core/ws-create-server.js @@ -2,7 +2,7 @@ const url = require('url') const { WebSocket } = require('./modules') // need to move the method back here -const { createVerifyClient } = require('./verify-client') +const { createVerifyClient } = require('./create-verify-client') const { getNamespace } = require('jsonql-utils') const { getDebug } = require('./modules') const debug = getDebug('ws-setup') @@ -17,7 +17,7 @@ const generateNsp = config => { const namespaces = getNamespace(config) // @1.6.5 always add verifyClient from now on const verifyClient = createVerifyClient(opts, config.publicKey) - + return namespaces .map((name, i) => { const opt = Object.assign({}, config.serverInitOption, { noServer: true, verifyClient }) -- Gitee From d135956e448374462fa67ad74630294b35bda0eb Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 10:36:20 +0800 Subject: [PATCH 17/19] move the create-verify-client once again into security folder because we are going to have a few more of these kind of functions --- .../{ => security}/create-verify-client.js | 33 +++++++++++++------ packages/ws-server/src/core/security/index.js | 6 ++++ .../ws-server/src/core/ws-create-server.js | 2 +- 3 files changed, 30 insertions(+), 11 deletions(-) rename packages/ws-server/src/core/{ => security}/create-verify-client.js (80%) create mode 100644 packages/ws-server/src/core/security/index.js diff --git a/packages/ws-server/src/core/create-verify-client.js b/packages/ws-server/src/core/security/create-verify-client.js similarity index 80% rename from packages/ws-server/src/core/create-verify-client.js rename to packages/ws-server/src/core/security/create-verify-client.js index f5069bf0..84812df4 100644 --- a/packages/ws-server/src/core/create-verify-client.js +++ b/packages/ws-server/src/core/security/create-verify-client.js @@ -33,9 +33,11 @@ function getTokenFromQuery(uri) { /** * We need to check the origin from the header to make sure it's match + * @param {object} opts configuration options * @param {object} req request object + * @return {boolean} false when fail check */ -function checkHeaders(req) { +function checkHeaders(opts, req) { debug('headers', req.headers) return true } @@ -50,18 +52,25 @@ function peek(info) { } } +/** + * Nicer way to provide a default value to the cb param below + * @param {string} msg to show + * @return {void} + */ +const localCb = msg => { + console.error('verifyClient error:', msg) +} + /** * provide the necessary param to create the verifyClient function * @param {object} opts need to add this because from now on we will always verifyClient * @param {string|buffer} publicKey for decoding * @param {object} [jwtOptions={}] optional pass to the jwtDecode - * @param {function|boolean} [failCallback=false] if the token is invalid + * @param {function|boolean} [cb=false] if the token is invalid * @return {function} verifyClient method */ -function createVerifyClient(opts, publicKey, jwtOptions = {}, failCallback = false) { - const cb = failCallback === false ? msg => { - console.error('verifyClient error:', msg) - } : failCallback +function createVerifyClient(opts, publicKey, jwtOptions = {}, cb = localCb) { + const { enableAuth } = opts /** * pass this as part of the option to the WebSocket at init time * @param {object} info we use the info.req.url to extract the token @@ -70,10 +79,14 @@ function createVerifyClient(opts, publicKey, jwtOptions = {}, failCallback = fal return function verifyClient(info, done) { peek(info) const req = info.req - if (!checkHeaders(req)) { + if (!checkHeaders(opts, req)) { cb('Header check failed') return done(false) } + if (!enableAuth) { + return done(true) // job done here + } + // auth features const uri = req.url const token = getTokenFromQuery(uri) @@ -102,7 +115,9 @@ function createVerifyClient(opts, publicKey, jwtOptions = {}, failCallback = fal } /* -another example +another example from ws npm page +This one is using the express session + server.on('upgrade', function upgrade(request, socket, head) { authenticate(request, (err, client) => { if (err || !client) { @@ -115,8 +130,6 @@ server.on('upgrade', function upgrade(request, socket, head) { }); }); }); - - */ diff --git a/packages/ws-server/src/core/security/index.js b/packages/ws-server/src/core/security/index.js new file mode 100644 index 00000000..6c59efa1 --- /dev/null +++ b/packages/ws-server/src/core/security/index.js @@ -0,0 +1,6 @@ +const { createVerifyClient } = require('./create-verify-client') + + +module.exports = { + createVerifyClient +} diff --git a/packages/ws-server/src/core/ws-create-server.js b/packages/ws-server/src/core/ws-create-server.js index 39a93264..5a42756c 100644 --- a/packages/ws-server/src/core/ws-create-server.js +++ b/packages/ws-server/src/core/ws-create-server.js @@ -2,7 +2,7 @@ const url = require('url') const { WebSocket } = require('./modules') // need to move the method back here -const { createVerifyClient } = require('./create-verify-client') +const { createVerifyClient } = require('./security') const { getNamespace } = require('jsonql-utils') const { getDebug } = require('./modules') const debug = getDebug('ws-setup') -- Gitee From 8b85b3382092454b8adbae1ee7e8d876ddb03889 Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 11:17:02 +0800 Subject: [PATCH 18/19] rename break up the nsp to resolvers handler --- .../src/handles/handle-nsp-resolvers.js | 32 ++++++++++++ packages/ws-server-core/src/handles/index.js | 5 +- .../ws-server-core/src/share/add-property.js | 6 +-- .../ws-server-core/src/share/create-send.js | 8 ++- .../ws-server-core/src/share/get-resolver.js | 49 +++++++++++++++++++ 5 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 packages/ws-server-core/src/handles/handle-nsp-resolvers.js create mode 100644 packages/ws-server-core/src/share/get-resolver.js diff --git a/packages/ws-server-core/src/handles/handle-nsp-resolvers.js b/packages/ws-server-core/src/handles/handle-nsp-resolvers.js new file mode 100644 index 00000000..acddb9fd --- /dev/null +++ b/packages/ws-server-core/src/handles/handle-nsp-resolvers.js @@ -0,0 +1,32 @@ +// make this more generic and share it to create resolver for each nsp +const { getResolver } = require('../share/get-resolver') +// @TODO this property still not create correctly +const { TIMESTAMP_PARAM_NAME } = require('jsonql-constants') +const { getDebug } = require('./modules') +const debug = getDebug('handle-nsp') + +/** + * The default single nsp mapping to resolver + * @param {function} deliverFn the final delivery message method + * @param {object} json data send from client + * @param {object} socketFns contract + * @param {object} opts configuration + * @param {*} [userdata=false] userdata if any + * @return {void} nothing + */ +const handleNspResolvers = (deliverFn, json, socketFns, opts, userdata = false) => { + debug('TIMESTAMP_PARAM_NAME', json[TIMESTAMP_PARAM_NAME], TIMESTAMP_PARAM_NAME) + // const ts = json[TIMESTAMP_PARAM_NAME] // keep this for use later + for (let resolverName in json) { + if (resolverName !== TIMESTAMP_PARAM_NAME) { // dirty hack for now + debug('connection call', resolverName) + let payload = json[resolverName] + let params = socketFns[resolverName] + // we need to use the decoded token --> userdata + // and pass to the resolver + getResolver(deliverFn, payload, resolverName, params, opts, userdata) + } + } +} + +module.exports = { handleNspResolvers } diff --git a/packages/ws-server-core/src/handles/index.js b/packages/ws-server-core/src/handles/index.js index b798baf3..ce6a5289 100644 --- a/packages/ws-server-core/src/handles/index.js +++ b/packages/ws-server-core/src/handles/index.js @@ -4,11 +4,12 @@ const { handleInterCom } = require('./handle-intercom') const { handleLogout } = require('./handle-logout') const { handleStandaloneLogin } = require('./handle-standalone-login') const { handleUnknownPayload } = require('./handle-unknown-payload') - +const { handleNspResolvers } = require('./handle-nsp-resolvers') module.exports = { handleInterCom, handleLogout, handleStandaloneLogin, - handleUnknownPayload + handleUnknownPayload, + handleNspResolvers // @0.6.2 rename from handleNsp make more sense } diff --git a/packages/ws-server-core/src/share/add-property.js b/packages/ws-server-core/src/share/add-property.js index ceb2130a..c45f5ccb 100644 --- a/packages/ws-server-core/src/share/add-property.js +++ b/packages/ws-server-core/src/share/add-property.js @@ -2,7 +2,7 @@ const { EMIT_REPLY_TYPE, SEND_MSG_FN_NAME, - JS_WS_NAME, + SOCKET_NAME, INIT_CLIENT_PROP_KEY } = require('jsonql-constants') // @BUG it's weird this file is not here but no error was throw @@ -25,10 +25,10 @@ const debug = getDebug(`addProperty`) */ const addProperty = (fn, resolverName, ws, userdata, opts) => { return Promise - .resolve(injectToFn(fn, JS_WS_NAME, ws)) + .resolve(injectToFn(fn, SOCKET_NAME, ws)) // @0.6.2 use a generic name `socket` // define the send method .then(resolver => { - return createSend(resolver) + return createSend(resolver, resolverName, ws, opts) }) .then(resolver => { debug(`addProperty ---> userdata --->`, userdata) diff --git a/packages/ws-server-core/src/share/create-send.js b/packages/ws-server-core/src/share/create-send.js index ba4ac3eb..e1f36f8a 100644 --- a/packages/ws-server-core/src/share/create-send.js +++ b/packages/ws-server-core/src/share/create-send.js @@ -7,8 +7,14 @@ const debug = getDebug('create-send') * It was just a simple resolverName.send setter * Now we make it full feature, also it should pair with a `receive` method? * @param {function} resolver the function itself + * @param {string} resolverName the name of this resolver + * @param {object} ws the socket instance + * @param {object} opts configuration + * @return {function} resolver with a `send` method property */ -const createSend = function(resolverName, args, params, opts, ws) { +const createSend = function(resolver, resolverName, ws, opts) { + const params = opts.contract.socket[resolverName] + // @NOTE this will add a `send` function to this resolver debug(`add ${SEND_MSG_FN_NAME} to ${resolverName}`) return objDefineProps( diff --git a/packages/ws-server-core/src/share/get-resolver.js b/packages/ws-server-core/src/share/get-resolver.js new file mode 100644 index 00000000..43d38541 --- /dev/null +++ b/packages/ws-server-core/src/share/get-resolver.js @@ -0,0 +1,49 @@ +// get the resolver to handle the request +const { packError } = require('jsonql-utils') +const { isNotEmpty, validateAsync } = require('jsonql-params-validator') +const { + getDebug, + createWsReply, + resolveMethod +} = require('./modules') +const { + ACKNOWLEDGE_REPLY_TYPE, + ERROR_TYPE, + TIMESTAMP_PARAM_NAME +} = require('jsonql-constants') + +/** + * handle resolvers + * @param {function} deliverFn the final delivery message method + * @param {object} payload args array + * @param {string} resolverName name of resolver + * @param {object} params from contract.json + * @param {object} opts configuration + * @param {object} userdata userdata + */ +const getResolver = (deliverFn, payload, resolverName, params, opts, userdata) => { + // @NOTE the params.params is from the contract + return validateAsync(payload.args, params.params, true) + .then(args => resolveMethod( + resolverName, + args, // this is the clean value from validateAsync + params, + opts, + ws, + userdata + ) + ) + .then(result => { + debug('resolver return result', result) + // decide if we need to call the cb or not here + if (isNotEmpty(result)) { + deliverFn(createWsReply(ACKNOWLEDGE_REPLY_TYPE, resolverName, result)) + } + }) + .catch(err => { + debug('CATCH RESOLVER ERROR', err) + deliverFn(createWsReply(ERROR_TYPE, resolverName, packError(err))) + }) +} + +module.exports = { getResolver } -- Gitee From 1e2d4d57ce1f291af3b7360522152ba6bd79f52a Mon Sep 17 00:00:00 2001 From: joelchu Date: Mon, 9 Mar 2020 11:22:35 +0800 Subject: [PATCH 19/19] jsonql-constants to 1.9.8 --- packages/constants/README.md | 4 +++ packages/constants/constants.json | 9 ++++++- packages/constants/main.js | 9 ++++++- packages/constants/module.js | 5 ++-- packages/utils/src/regex.js | 1 + packages/ws-server-core/src/options/props.js | 26 ++++++++++---------- 6 files changed, 37 insertions(+), 17 deletions(-) create mode 100644 packages/utils/src/regex.js diff --git a/packages/constants/README.md b/packages/constants/README.md index ce46057e..183d1061 100755 --- a/packages/constants/README.md +++ b/packages/constants/README.md @@ -98,6 +98,7 @@ non-javascript to develop your tool. You can also use the included `constants.js - RECONNECT_EVENT_NAME - SOCKET_CLIENT_ID_KEY - SOCKET_CLIENT_TS_KEY +- CONNECTED_EVENT_NAME - DISCONNECT_EVENT_NAME - INTER_COM_EVENT_NAME - INTER_COM_EVENT_NAMES @@ -155,6 +156,9 @@ non-javascript to develop your tool. You can also use the included `constants.js - FORBIDDEN_STATUS - NOT_FOUND_STATUS - DEFAULT_PORT_NUM +- CSRF_HEADER_KEY +- ORIGIN_HEADER_KEYS +- WILD_CARD_CHAR --- diff --git a/packages/constants/constants.json b/packages/constants/constants.json index d079f615..998b6f1b 100644 --- a/packages/constants/constants.json +++ b/packages/constants/constants.json @@ -125,9 +125,11 @@ "RECONNECT_EVENT_NAME": "__reconnect__", "SOCKET_CLIENT_ID_KEY": "__socket_client_id_key__", "SOCKET_CLIENT_TS_KEY": "__socket_client_ts_key__", + "CONNECTED_EVENT_NAME": "__connected__", "DISCONNECT_EVENT_NAME": "__disconnect__", "INTER_COM_EVENT_NAME": "__inter_com__", "INTER_COM_EVENT_NAMES": [ + "__connected__", "__switch__", "__disconnect__" ], @@ -197,5 +199,10 @@ "UNAUTHORIZED_STATUS": 401, "FORBIDDEN_STATUS": 403, "NOT_FOUND_STATUS": 404, - "DEFAULT_PORT_NUM": 6557 + "DEFAULT_PORT_NUM": 6557, + "CSRF_HEADER_KEY": "X-CSRF-Token", + "ORIGIN_HEADER_KEYS": [ + "Origin" + ], + "WILD_CARD_CHAR": "*" } diff --git a/packages/constants/main.js b/packages/constants/main.js index 9e511446..af0a6da2 100644 --- a/packages/constants/main.js +++ b/packages/constants/main.js @@ -125,9 +125,11 @@ module.exports = { "RECONNECT_EVENT_NAME": "__reconnect__", "SOCKET_CLIENT_ID_KEY": "__socket_client_id_key__", "SOCKET_CLIENT_TS_KEY": "__socket_client_ts_key__", + "CONNECTED_EVENT_NAME": "__connected__", "DISCONNECT_EVENT_NAME": "__disconnect__", "INTER_COM_EVENT_NAME": "__inter_com__", "INTER_COM_EVENT_NAMES": [ + "__connected__", "__switch__", "__disconnect__" ], @@ -197,5 +199,10 @@ module.exports = { "UNAUTHORIZED_STATUS": 401, "FORBIDDEN_STATUS": 403, "NOT_FOUND_STATUS": 404, - "DEFAULT_PORT_NUM": 6557 + "DEFAULT_PORT_NUM": 6557, + "CSRF_HEADER_KEY": "X-CSRF-Token", + "ORIGIN_HEADER_KEYS": [ + "Origin" + ], + "WILD_CARD_CHAR": "*" } \ No newline at end of file diff --git a/packages/constants/module.js b/packages/constants/module.js index a5848275..12fc8ae0 100644 --- a/packages/constants/module.js +++ b/packages/constants/module.js @@ -228,5 +228,6 @@ export const NOT_FOUND_STATUS = 404 // just whatever export const DEFAULT_PORT_NUM = 6557 // headers -export const CSRF_HEADER_KEY = 'X-CSRFToken' -export const ORIGIN_HEADER_KEYS = ['origin'] +export const CSRF_HEADER_KEY = 'X-CSRF-Token' +export const ORIGIN_HEADER_KEYS = ['Origin'] +export const WILD_CARD_CHAR = '*' diff --git a/packages/utils/src/regex.js b/packages/utils/src/regex.js new file mode 100644 index 00000000..6fb551e7 --- /dev/null +++ b/packages/utils/src/regex.js @@ -0,0 +1 @@ +// port couple regex methods from the @to1source/event diff --git a/packages/ws-server-core/src/options/props.js b/packages/ws-server-core/src/options/props.js index 8433da17..9dbb7a5c 100644 --- a/packages/ws-server-core/src/options/props.js +++ b/packages/ws-server-core/src/options/props.js @@ -1,33 +1,33 @@ -// break out from the index.js to keep property in one place -// and methods in another +// break out from the index.js to keep property in one place +// and methods in another const { join } = require('path') const { createConfig } = require('jsonql-params-validator') const { isFunc } = require('../share/helpers') const { HSA_ALGO, - + ENUM_KEY, ALIAS_KEY, PUBLIC_KEY, PRIVATE_KEY, CHECKER_KEY, - + ANY_TYPE, STRING_TYPE, BOOLEAN_TYPE, NUMBER_TYPE, - OBJECT_TYPE, + OBJECT_TYPE, IO_HANDSHAKE_LOGIN, IO_ROUNDTRIP_LOGIN, - + DEFAULT_RESOLVER_DIR, DEFAULT_CONTRACT_DIR, DEFAULT_KEYS_DIR, - + SOCKET_TYPE_KEY, SOCKET_TYPE_SERVER_ALIAS, - + DISCONNECT_FN_NAME, SWITCH_USER_FN_NAME, LOGIN_NAME, @@ -69,11 +69,11 @@ const wsBaseOptions = { socketIoAuthType: createConfig(false, [STRING_TYPE], { [ENUM_KEY]: [IO_HANDSHAKE_LOGIN, IO_ROUNDTRIP_LOGIN] }), - // check the origin if we can - allowOrgin: createConfig(() => true, [ANY_TYPE], {[CHECKER_KEY]: isFunc}), + // check the origin if we can + allowOrgin: createConfig(['*'], [ARRAY_TYPE]), serverInitOption: createConfig({}, [OBJECT_TYPE]) } -// we have to create a standlone prop to check if the user pass the socket server config first +// we have to create a standlone prop to check if the user pass the socket server config first const socketAppProps = { [SOCKET_TYPE_KEY]: createConfig(SOCKET_IO, [STRING_TYPE], { [ALIAS_KEY]: SOCKET_TYPE_SERVER_ALIAS @@ -93,7 +93,7 @@ const wsConstProps = { } module.exports = { - wsDefaultOptions, + wsDefaultOptions, wsConstProps, socketAppProps -} \ No newline at end of file +} -- Gitee