From e0ba0e32ba598a17f2d9addc922b8b07e6b92945 Mon Sep 17 00:00:00 2001 From: joelchu Date: Thu, 5 Sep 2019 10:21:12 +0100 Subject: [PATCH 1/2] add prepare script so we dont need to manually run the build for jsonql-constants everytime --- packages/constants/package.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/constants/package.json b/packages/constants/package.json index a45f205d..3ca9661c 100755 --- a/packages/constants/package.json +++ b/packages/constants/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-constants", - "version": "1.8.1", + "version": "1.8.2", "description": "All the share constants for json:ql tools", "main": "main.js", "module": "module.js", @@ -10,8 +10,8 @@ "constants.json" ], "scripts": { - "build:cjs": "node -r esm module.js", - "build": "node ./build.js" + "build": "node ./build.js", + "prepare": "npm run build" }, "keywords": [ "jsonql", -- Gitee From fb86b2d85e40ad34408df502463f5d369c07816e Mon Sep 17 00:00:00 2001 From: joelchu Date: Thu, 5 Sep 2019 13:38:05 +0100 Subject: [PATCH 2/2] replace the repetitive code with the function from jsonql-utils --- packages/constants/module.js | 2 +- packages/utils/es.js | 3 +- packages/utils/package.json | 2 +- packages/utils/src/generic.js | 23 --- packages/utils/src/obj-define-props.js | 29 +++- packages/ws-client/src/generator.js | 179 ++++++++-------------- packages/ws-client/src/utils/get-debug.js | 2 +- packages/ws-client/src/utils/index.js | 11 +- 8 files changed, 99 insertions(+), 152 deletions(-) diff --git a/packages/constants/module.js b/packages/constants/module.js index f147e753..4dee6e4d 100644 --- a/packages/constants/module.js +++ b/packages/constants/module.js @@ -16,7 +16,7 @@ export const DEFAULT_HEADER = { 'Content-Type': [ CONTENT_TYPE, CHARSET ].join(';') } -export const INDEX = 'index'; +// export const INDEX = 'index'; use INDEX_KEY instead export const DEFAULT_TYPE = 'any'; // contract file names // export const DEFAULT_FILE_NAME = 'contract.json'; // @TODO remove once all changed diff --git a/packages/utils/es.js b/packages/utils/es.js index efc4dba4..6bb1331f 100644 --- a/packages/utils/es.js +++ b/packages/utils/es.js @@ -15,7 +15,6 @@ import { inArray, toArray, isKeyInObject, - injectToFn, createEvt, timestamp, urlParams, @@ -54,7 +53,7 @@ import { getNameFromPayload } from './src/params-api' import { buff } from './src/jwt' -import { objDefineProps } from './src/obj-define-props' +import { injectToFn, objDefineProps } from './src/obj-define-props' // alias const isContract = checkIsContract; // exports diff --git a/packages/utils/package.json b/packages/utils/package.json index 13ea4b34..d5852565 100644 --- a/packages/utils/package.json +++ b/packages/utils/package.json @@ -1,6 +1,6 @@ { "name": "jsonql-utils", - "version": "0.4.1", + "version": "0.4.2", "description": "This is a jsonql dependency module, not for generate use.", "main": "main.js", "module": "es.js", diff --git a/packages/utils/src/generic.js b/packages/utils/src/generic.js index 0201c98f..1b9aa11d 100644 --- a/packages/utils/src/generic.js +++ b/packages/utils/src/generic.js @@ -31,29 +31,6 @@ export const isKeyInObject = function(obj, key) { return inArray(keys, key) } -/** - * After the user login we will use this Object.define add a new property - * to the resolver with the decoded user data - * @param {function} resolver target resolver - * @param {string} name the name of the object to get inject also for checking - * @param {object} data to inject into the function static interface - * @param {boolean} [overwrite=false] if we want to overwrite the existing data - * @return {function} added property resolver - */ -export function injectToFn(resolver, name, data, overwrite = false) { - let check = Object.getOwnPropertyDescriptor(resolver, name) - if (ovewrite === false && check !== undefined) { - return resolver; - } - - Object.defineProperty(resolver, name, { - value: data, - writable: false // make this immutatble - }) - - return resolver; -} - /** * create a event name * @param {string[]} args diff --git a/packages/utils/src/obj-define-props.js b/packages/utils/src/obj-define-props.js index 1fb0783a..e2815ee5 100644 --- a/packages/utils/src/obj-define-props.js +++ b/packages/utils/src/obj-define-props.js @@ -4,15 +4,38 @@ * @param {object} obj to get injected * @param {string} name of the property * @param {function} setter for set - * @param {function} getter for get + * @param {function} [getter=null] for get default return null fn * @return {object} the injected obj */ -export function provideSetGet(obj, name, setter, getter) { +export function objDefineProps(obj, name, setter, getter = null) { if (Object.getOwnPropertyDescriptor(obj, name) === undefined) { Object.defineProperty(obj, name, { set: setter, - get: getter + get: getter === null ? function() { return null; } : getter }) } return obj } + +/** + * After the user login we will use this Object.define add a new property + * to the resolver with the decoded user data + * @param {function} resolver target resolver + * @param {string} name the name of the object to get inject also for checking + * @param {object} data to inject into the function static interface + * @param {boolean} [overwrite=false] if we want to overwrite the existing data + * @return {function} added property resolver + */ +export function injectToFn(resolver, name, data, overwrite = false) { + let check = Object.getOwnPropertyDescriptor(resolver, name) + if (ovewrite === false && check !== undefined) { + return resolver; + } + + Object.defineProperty(resolver, name, { + value: data, + writable: false // make this immutatble + }) + + return resolver; +} diff --git a/packages/ws-client/src/generator.js b/packages/ws-client/src/generator.js index 72ad566a..ef752d04 100644 --- a/packages/ws-client/src/generator.js +++ b/packages/ws-client/src/generator.js @@ -30,6 +30,8 @@ import { READY_PROP_NAME, LOGOUT_EVENT_NAME } from 'jsonql-constants' +const { injectToFn, objDefineProps } from 'jsonql-utils' + import { getDebug, constants, createEvt, toArray } from './utils' const { EMIT_EVT, NOT_ALLOW_OP, UNKNOWN_RESULT, MY_NAMESPACE } = constants; const debugFn = getDebug('generator') @@ -108,12 +110,12 @@ function actionCall(ee, namespace, resolverName, args = []) { * @return {void} nothing */ function respondHandler(data, resolver, rejecter) { - if (isKeyInObject(data, 'error')) { - debugFn('rejecter called', data.error) - rejecter(data.error) - } else if (isKeyInObject(data, 'data')) { - debugFn('resolver called', data.data) - resolver(data.data) + if (isKeyInObject(data, ERROR_KEY)) { + debugFn('rejecter called', data[ERROR_KEY]) + rejecter(data[ERROR_KEY]) + } else if (isKeyInObject(data, DATA_KEY)) { + debugFn('resolver called', data[DATA_KEY]) + resolver(data[DATA_KEY]) } else { debugFn('UNKNOWN_RESULT', data) rejecter({message: UNKNOWN_RESULT, error: data}) @@ -131,91 +133,58 @@ function respondHandler(data, resolver, rejecter) { */ const setupResolver = (namespace, resolverName, params, fn, ee) => { // also need to setup a getter to get back the namespace of this resolver - if (Object.getOwnPropertyDescriptor(fn, MY_NAMESPACE) === undefined) { - Object.defineProperty(fn, MY_NAMESPACE, { - value: namespace, - writeable: false - }) - } + let _fn = injectToFn(fn, MY_NAMESPACE, namespace) // onResult handler - if (Object.getOwnPropertyDescriptor(fn, RESULT_PROP_NAME) === undefined) { - Object.defineProperty(fn, RESULT_PROP_NAME, { - set: function(resultCallback) { - if (typeof resultCallback === 'function') { - ee.$only( - createEvt(namespace, resolverName, RESULT_PROP_NAME), - function resultHandler(result) { - respondHandler(result, resultCallback, (error) => { - ee.$trigger(createEvt(namespace, resolverName, ERROR_PROP_NAME), error) - }) - } - ) - } - }, - get: function() { - return null; - } - }) - } - // we do need to add the send prop back because it's the only way to deal with - // bi-directional data stream - if (Object.getOwnPropertyDescriptor(fn, MESSAGE_PROP_NAME) === undefined) { - Object.defineProperty(fn, MESSAGE_PROP_NAME, { - set: function(messageCallback) { - // we expect this to be a function - if (typeof messageCallback === 'function') { - // did that add to the callback - let onMessageCallback = (args) => { - respondHandler(args, messageCallback, (error) => { + _fn = objDefineProps(_fn, RESULT_PROP_NAME, function(resultCallback) { + if (typeof resultCallback === 'function') { + ee.$only( + createEvt(namespace, resolverName, RESULT_PROP_NAME), + function resultHandler(result) { + respondHandler(result, resultCallback, (error) => { ee.$trigger(createEvt(namespace, resolverName, ERROR_PROP_NAME), error) }) } - // register the handler for this message event - ee.$only(createEvt(namespace, resolverName, MESSAGE_PROP_NAME), onMessageCallback) - } - }, - get: function() { - return null; // just return nothing + ) } }) - } - // add an ERROR_PROP_NAME handler - if (Object.getOwnPropertyDescriptor(fn, ERROR_PROP_NAME) === undefined) { - Object.defineProperty(fn, ERROR_PROP_NAME, { - set: function(resolverErrorHandler) { - if (typeof resolverErrorHandler === 'function') { - // please note ERROR_PROP_NAME can add multiple listners - ee.$only(createEvt(namespace, resolverName, ERROR_PROP_NAME), resolverErrorHandler) - } - }, - get: function() { - return null; + // we do need to add the send prop back because it's the only way to deal with + // bi-directional data stream + _fn = objDefineProps(_fn, MESSAGE_PROP_NAME, function(messageCallback) { + // we expect this to be a function + if (typeof messageCallback === 'function') { + // did that add to the callback + let onMessageCallback = (args) => { + respondHandler(args, messageCallback, (error) => { + ee.$trigger(createEvt(namespace, resolverName, ERROR_PROP_NAME), error) + }) } - }) - } + // register the handler for this message event + ee.$only(createEvt(namespace, resolverName, MESSAGE_PROP_NAME), onMessageCallback) + } + }) + // add an ERROR_PROP_NAME handler + _fn = objDefineProps(_fn, ERROR_PROP_NAME, function(resolverErrorHandler) { + if (typeof resolverErrorHandler === 'function') { + // please note ERROR_PROP_NAME can add multiple listners + ee.$only(createEvt(namespace, resolverName, ERROR_PROP_NAME), resolverErrorHandler) + } + }) // pairing with the server vesrion SEND_MSG_PROP_NAME - if (Object.getOwnPropertyDescriptor(fn, SEND_MSG_PROP_NAME) === undefined) { - Object.defineProperty(fn, SEND_MSG_PROP_NAME, { - set: function(messagePayload) { - const result = validateSync(toArray(messagePayload), params.params, true) - // here is the different we don't throw erro instead we trigger an - // onError - if (result[ERROR_KEY] && result[ERROR_KEY].length) { - ee.$call( - createEvt(namespace, resolverName, ERROR_PROP_NAME), - [JsonqlValidationError(resolverName, result[ERROR_KEY])] - ) - } else { - // there is no return only an action call - actionCall(ee, namespace, resolverName, result[DATA_KEY]) - } - }, - get: function() { - return null; // just return nothing - } - }) - } - return fn; + _fn = objDefineProps(_fn, SEND_MSG_PROP_NAME, function(messagePayload) { + const result = validateSync(toArray(messagePayload), params.params, true) + // here is the different we don't throw erro instead we trigger an + // onError + if (result[ERROR_KEY] && result[ERROR_KEY].length) { + ee.$call( + createEvt(namespace, resolverName, ERROR_PROP_NAME), + [JsonqlValidationError(resolverName, result[ERROR_KEY])] + ) + } else { + // there is no return only an action call + actionCall(ee, namespace, resolverName, result[DATA_KEY]) + } + }) + return _fn; } /** @@ -230,23 +199,16 @@ const createNamespaceErrorHandler = (obj, ee, nspSet) => { // using the onError as name // @TODO we should follow the convention earlier // make this a setter for the obj itself - if (Object.getOwnPropertyDescriptor(obj, ERROR_PROP_NAME) === undefined) { - Object.defineProperty(obj, ERROR_PROP_NAME, { - set: function(namespaceErrorHandler) { - if (typeof namespaceErrorHandler === 'function') { - // please note ERROR_PROP_NAME can add multiple listners - for (let namespace in nspSet) { - // this one is very tricky, we need to make sure the trigger is calling - // with the namespace as well as the error - ee.$on(createEvt(namespace, ERROR_PROP_NAME), namespaceErrorHandler) - } - } - }, - get: function() { - return null; + objDefineProps(obj, ERROR_PROP_NAME, function(namespaceErrorHandler) { + if (typeof namespaceErrorHandler === 'function') { + // please note ERROR_PROP_NAME can add multiple listners + for (let namespace in nspSet) { + // this one is very tricky, we need to make sure the trigger is calling + // with the namespace as well as the error + ee.$on(createEvt(namespace, ERROR_PROP_NAME), namespaceErrorHandler) } - }) - } + } + }) } /** @@ -257,19 +219,12 @@ const createNamespaceErrorHandler = (obj, ee, nspSet) => { * @return {void} */ const createOnReadyhandler = (obj, ee, nspSet) => { - if (Object.getOwnPropertyDescriptor(obj, READY_PROP_NAME) === undefined) { - Object.defineProperty(obj, READY_PROP_NAME, { - set: function(onReadyCallback) { - if (typeof onReadyCallback === 'function') { - // reduce it down to just one flat level - let result = ee.$on(READY_PROP_NAME, onReadyCallback) - } - }, - get: function() { - return null; - } - }) - } + objDefineProps(obj, READY_PROP_NAME, function(onReadyCallback) { + if (typeof onReadyCallback === 'function') { + // reduce it down to just one flat level + let result = ee.$on(READY_PROP_NAME, onReadyCallback) + } + }) } /** diff --git a/packages/ws-client/src/utils/get-debug.js b/packages/ws-client/src/utils/get-debug.js index fec2517d..d6615dcf 100644 --- a/packages/ws-client/src/utils/get-debug.js +++ b/packages/ws-client/src/utils/get-debug.js @@ -1,4 +1,4 @@ - +// not using the jsonql-utils version import debug from 'debug' /** * Try to normalize it to use between browser and node diff --git a/packages/ws-client/src/utils/index.js b/packages/ws-client/src/utils/index.js index 479c442b..f412c93b 100644 --- a/packages/ws-client/src/utils/index.js +++ b/packages/ws-client/src/utils/index.js @@ -8,15 +8,8 @@ import getDebug from './get-debug' import processContract from './process-contract' import { isArray } from 'jsonql-params-validator' - -const toArray = (arg) => isArray(arg) ? arg : [arg]; - -/** - * very simple tool to create the event name - * @param {string} [...args] spread - * @return {string} join by _ - */ -const createEvt = (...args) => args.join('_') +// moved to jsonql-utils +import { toArray, createEvt } from 'jsonql-utils' /** * Unbind the event -- Gitee