From b2a2b8222f1afa649abe54673c5a548a3f35a9c9 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 15 Mar 2020 00:02:33 +0800 Subject: [PATCH 1/2] finalize on how to deal with the intercom event --- packages/constants/module.js | 57 +++++++++++++++---- packages/constants/package.json | 2 +- packages/utils/src/params-api.js | 9 +-- packages/ws-server-core/package.json | 3 +- .../src/handles/get-socket-handler.js | 7 +++ .../src/handles/handle-init-ping.js | 28 +++++++++ .../src/handles/handle-intercom.js | 4 +- 7 files changed, 92 insertions(+), 18 deletions(-) create mode 100644 packages/ws-server-core/src/handles/handle-init-ping.js diff --git a/packages/constants/module.js b/packages/constants/module.js index 044997d6..291e782a 100644 --- a/packages/constants/module.js +++ b/packages/constants/module.js @@ -38,14 +38,22 @@ export const QUERY_NAME = 'query' export const MUTATION_NAME = 'mutation' export const SOCKET_NAME = 'socket' export const CONTRACT_NAME = 'contract' -export const RESOLVER_TYPES = [QUERY_NAME, MUTATION_NAME, SOCKET_NAME] +export const RESOLVER_TYPES = [ + QUERY_NAME, + MUTATION_NAME, + SOCKET_NAME +] // for calling the mutation export const PAYLOAD_PARAM_NAME = 'payload' // @TODO shortern them export const CONDITION_PARAM_NAME = 'condition' export const RESOLVER_PARAM_NAME = 'resolverName' export const QUERY_ARG_NAME = 'args' export const TIMESTAMP_PARAM_NAME = 'TS' -export const MUTATION_ARGS = [RESOLVER_PARAM_NAME, PAYLOAD_PARAM_NAME, CONDITION_PARAM_NAME] +export const MUTATION_ARGS = [ + RESOLVER_PARAM_NAME, + PAYLOAD_PARAM_NAME, + CONDITION_PARAM_NAME +] // new jsonp export const JSONP_CALLBACK_NAME = 'jsonqlJsonpCallback' @@ -98,7 +106,10 @@ export const DEFAULT_KEYS_DIR = 'keys' export const CJS_TYPE = 'cjs' export const ES_TYPE = 'es' export const TS_TYPE = 'ts' -export const ACCEPTED_JS_TYPES = [CJS_TYPE, ES_TYPE] // not accept this TS_TYPE at the moment +export const ACCEPTED_JS_TYPES = [ + CJS_TYPE, + ES_TYPE +] // not accept this TS_TYPE at the moment export const OR_SEPERATOR = '|' @@ -112,7 +123,14 @@ export const ANY_TYPE = 'any' export const NUMBER_TYPE = 'number' export const NUMBER_TYPES = ['int', 'integer', 'float', 'double', 'decimal'] // supported types -export const SUPPORTED_TYPES = [NUMBER_TYPE, STRING_TYPE, BOOLEAN_TYPE, ARRAY_TYPE, OBJECT_TYPE, ANY_TYPE] +export const SUPPORTED_TYPES = [ + NUMBER_TYPE, + STRING_TYPE, + BOOLEAN_TYPE, + ARRAY_TYPE, + OBJECT_TYPE, + ANY_TYPE +] export const ARRAY_TS_TYPE_LFT = 'Array<' export const ARRAY_TYPE_LFT = 'array.<' @@ -120,7 +138,10 @@ export const ARRAY_TYPE_RGT = '>' // for contract cli export const RETURN_AS_FILE = 'file' export const RETURN_AS_JSON = 'json' -export const RETURN_AS_ENUM = [RETURN_AS_FILE, RETURN_AS_JSON] +export const RETURN_AS_ENUM = [ + RETURN_AS_FILE, + RETURN_AS_JSON +] export const NO_ERROR_MSG = 'No message' export const NO_STATUS_CODE = -1 @@ -147,9 +168,12 @@ export const SOCKET_CLIENT_TS_KEY = '__socket_client_ts_key__' // disconnect from the current server, then re-establish connection later export const CONNECTED_EVENT_NAME = '__connected__' export const DISCONNECT_EVENT_NAME = '__disconnect__' +// instead of using an event name in place of resolverName in the param +// we use this internal resolverName instead, and in type using the event names +export const INTERCOM_RESOLVER_NAME = '__intercom__' // 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_NAME = '__inter_com__' export const INTER_COM_EVENT_NAMES = [ CONNECTED_EVENT_NAME, SWITCH_USER_EVENT_NAME, @@ -159,7 +183,11 @@ export const INTER_COM_EVENT_NAMES = [ export const WS_REPLY_TYPE = '__reply__' export const WS_EVT_NAME = '__event__' export const WS_DATA_NAME = '__data__' -export const WS_IS_REPLY_KEYS = [WS_REPLY_TYPE, WS_EVT_NAME, WS_DATA_NAME] +export const WS_IS_REPLY_KEYS = [ + WS_REPLY_TYPE, + WS_EVT_NAME, + WS_DATA_NAME +] // this is somewhat vague about what is suppose to do export const EMIT_REPLY_TYPE = 'emit_reply' export const ACKNOWLEDGE_REPLY_TYPE = 'acknowledge_reply' @@ -204,17 +232,26 @@ export const NOT_LOGIN_ERR_MSG = 'NOT LOGIN' export const BASE64_FORMAT = 'base64' export const HEX_FORMAT = 'hex' export const UTF8_FORMAT = 'utf8' -export const RSA_FORMATS = [BASE64_FORMAT, HEX_FORMAT] +export const RSA_FORMATS = [ + BASE64_FORMAT, + HEX_FORMAT +] export const RSA_ALGO = 'RS256' export const HSA_ALGO = 'HS256' -export const JWT_SUPPORT_ALGOS = [RSA_ALGO, HSA_ALGO] +export const JWT_SUPPORT_ALGOS = [ + RSA_ALGO, + HSA_ALGO +] export const RSA_PRIVATE_KEY_HEADER = 'BEGIN RSA PRIVATE KEY' export const RSA_MIN_MODULE_LEN = 1024 export const RSA_MAX_MODULE_LEN = 4096 export const TOKEN_PARAM_NAME = 'token' export const IO_ROUNDTRIP_LOGIN = 'roundtip' export const IO_HANDSHAKE_LOGIN = 'handshake' -export const IO_LOGIN_METHODS = [IO_ROUNDTRIP_LOGIN, IO_HANDSHAKE_LOGIN] +export const IO_LOGIN_METHODS = [ + IO_ROUNDTRIP_LOGIN, + IO_HANDSHAKE_LOGIN +] export const PEM_EXT = 'pem' export const PUBLIC_KEY_NAME = 'publicKey' diff --git a/packages/constants/package.json b/packages/constants/package.json index fc3408f9..a1c0a216 100755 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-constants", - "version": "1.9.10", + "version": "1.9.11", "description": "All the share constants for jsonql tools", "main": "main.js", "module": "module.js", diff --git a/packages/utils/src/params-api.js b/packages/utils/src/params-api.js index 7817c0a4..28c52fe2 100644 --- a/packages/utils/src/params-api.js +++ b/packages/utils/src/params-api.js @@ -8,11 +8,12 @@ import { QUERY_ARG_NAME, TIMESTAMP_PARAM_NAME } from 'jsonql-constants' + import JsonqlValidationError from 'jsonql-errors/src/validation-error' import isArray from 'lodash-es/isArray' -import isPlainObject from 'lodash-es/isPlainObject' import isString from 'lodash-es/isString' +import isPlainObject from 'lodash-es/isPlainObject' import { timestamp } from './timestamp' import { parseJson } from './generic' @@ -63,7 +64,7 @@ export function getResolverFromPayload(payload) { * @return {string} name */ export function getNameFromPayload(payload) { - console.error(`This method is going to be deprectead in the next release, please use getResolverFromPayload instead`) + console.error(`This method is going to be deprecated in the next release, please use getResolverFromPayload instead`) return Object.keys(payload)[0] } @@ -90,7 +91,7 @@ export function createQuery(resolverName, args = [], jsonp = false) { if (isString(resolverName) && isArray(args)) { let payload = formatPayload(args) if (jsonp === true) { - return payload; + return payload } return createDeliverable(resolverName, payload) } @@ -208,7 +209,7 @@ export function getMutationFromPayload(payload) { const result = processPayload(payload, getMutationFromArgs) if (result !== false) { - return result; + return result } throw new JsonqlValidationError('[getMutationArgs] Payload is malformed!', payload) } diff --git a/packages/ws-server-core/package.json b/packages/ws-server-core/package.json index 2fed94d9..980f64cd 100644 --- a/packages/ws-server-core/package.json +++ b/packages/ws-server-core/package.json @@ -36,7 +36,8 @@ "jsonql-params-validator": "^1.5.3", "jsonql-resolver": "^1.1.2", "jsonql-utils": "^1.1.3", - "lodash": "^4.17.15" + "lodash": "^4.17.15", + "nanoid": "^2.1.11" }, "devDependencies": { "ava": "^3.5.0", diff --git a/packages/ws-server-core/src/handles/get-socket-handler.js b/packages/ws-server-core/src/handles/get-socket-handler.js index 334683ac..1c47d9cb 100644 --- a/packages/ws-server-core/src/handles/get-socket-handler.js +++ b/packages/ws-server-core/src/handles/get-socket-handler.js @@ -2,13 +2,16 @@ const { LOGOUT_EVENT_NAME, SA_LOGIN_EVENT_NAME, INTER_COM_EVENT_NAME, + SOCKET_PING_EVENT_NAME, NSP_GROUP } = require('jsonql-constants') const { getResolverFromPayload } = require('jsonql-utils') +const { handleInitPing } = require('./handle-init-ping') const { handleInterCom } = require('./handle-intercom') const { handleLogout } = require('./handle-logout') const { handleStandaloneLogin } = require('./handle-standalone-login') const { handleNspResolvers } = require('./handle-nsp-resolvers') + const { getRainbowDebug } = require('../share/helpers') const debug = getRainbowDebug('handles:get-socket-handler', 'whatever') @@ -49,6 +52,10 @@ function getSocketHandler(config, ws, deliverFn, req, connectedNamespace, payloa const args = payload[resolverName] // it might be the special internal event? switch (true) { + case resolverName === SOCKET_PING_EVENT_NAME: + + return handleInitPing(deliverFn, req, config) + case resolverName === LOGOUT_EVENT_NAME: debug('getSocketHandler:logout') // we don't need to send anything back @TBC do we need the config diff --git a/packages/ws-server-core/src/handles/handle-init-ping.js b/packages/ws-server-core/src/handles/handle-init-ping.js new file mode 100644 index 00000000..1d779bb4 --- /dev/null +++ b/packages/ws-server-core/src/handles/handle-init-ping.js @@ -0,0 +1,28 @@ +// we add this new event to deal with a confirmation of login problem +// when a client first connect to the server, it will issue a ping event +// as soon as, then it will received a CSRF token, and all subsequence connection +// will be using this token + +// @TODO need to add hook that control the issue of CSRF token, and validation of the token +// e.g. allow the user to store the token in a Redis, and subsequenely check it + +const nanoid = require('nanoid') +const { CSRF_HEADER_KEY, SOCKET_PING_EVENT_NAME } = require('jsonql-constants') +const { deliverMsg } = require('../share/resolver-methods') +/** + * @TODO handle the intercom event disconnect / switch-user (future feature) + * @param {function} deliveryFn framework specific to send out message + * @param {object} req request object + * @param {object} config configuration + * @return {void} + */ +function handleInitPing(deliverFn, req, config) { + debug(`handleIntercom called`, json) + const token = nanoid() + // @TODO add hook to process this token + + deliverMsg(deliverFn, SOCKET_PING_EVENT_NAME, {[CSRF_HEADER_KEY]: token}) + +} + +module.exports = { handleInitPing } \ No newline at end of file diff --git a/packages/ws-server-core/src/handles/handle-intercom.js b/packages/ws-server-core/src/handles/handle-intercom.js index 593cd749..047198bf 100644 --- a/packages/ws-server-core/src/handles/handle-intercom.js +++ b/packages/ws-server-core/src/handles/handle-intercom.js @@ -27,7 +27,7 @@ function handleSwitchUser() { /** * @TODO handle the intercom event disconnect / switch-user (future feature) - * @param {function} deliveryFn framework specific to send out message + * @param {function} deliverFn framework specific to send out message * @param {*} ws * @param {*} req * @param {*} json @@ -35,7 +35,7 @@ function handleSwitchUser() { * @param {*} opts * @param {*} userdata */ -function handleInterCom(deliveryFn, req, json, socketFns, opts, userdata) { +function handleInterCom(deliverFn, req, json, socketFns, opts, userdata) { debug(`handleIntercom called`, json) } -- Gitee From 8d90b0c2ff42aa615625b62279dc63f89dda4627 Mon Sep 17 00:00:00 2001 From: joelchu Date: Sun, 15 Mar 2020 00:02:58 +0800 Subject: [PATCH 2/2] jsonql-constants 1.9.11 --- packages/constants/README.md | 2 +- packages/constants/constants.json | 2 +- packages/constants/main.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/constants/README.md b/packages/constants/README.md index dfa4332c..0d8e5757 100755 --- a/packages/constants/README.md +++ b/packages/constants/README.md @@ -102,7 +102,7 @@ non-javascript to develop your tool. You can also use the included `constants.js - SOCKET_CLIENT_TS_KEY - CONNECTED_EVENT_NAME - DISCONNECT_EVENT_NAME -- INTER_COM_EVENT_NAME +- INTERCOM_RESOLVER_NAME - INTER_COM_EVENT_NAMES - WS_REPLY_TYPE - WS_EVT_NAME diff --git a/packages/constants/constants.json b/packages/constants/constants.json index c0d9844f..93112558 100644 --- a/packages/constants/constants.json +++ b/packages/constants/constants.json @@ -129,7 +129,7 @@ "SOCKET_CLIENT_TS_KEY": "__socket_client_ts_key__", "CONNECTED_EVENT_NAME": "__connected__", "DISCONNECT_EVENT_NAME": "__disconnect__", - "INTER_COM_EVENT_NAME": "__inter_com__", + "INTERCOM_RESOLVER_NAME": "__intercom__", "INTER_COM_EVENT_NAMES": [ "__connected__", "__switch__", diff --git a/packages/constants/main.js b/packages/constants/main.js index fc49c787..765ea418 100644 --- a/packages/constants/main.js +++ b/packages/constants/main.js @@ -129,7 +129,7 @@ module.exports = { "SOCKET_CLIENT_TS_KEY": "__socket_client_ts_key__", "CONNECTED_EVENT_NAME": "__connected__", "DISCONNECT_EVENT_NAME": "__disconnect__", - "INTER_COM_EVENT_NAME": "__inter_com__", + "INTERCOM_RESOLVER_NAME": "__intercom__", "INTER_COM_EVENT_NAMES": [ "__connected__", "__switch__", -- Gitee