UNPKG

@bitrix24/b24jssdk

Version:

Bitrix24 REST API JavaScript SDK

1 lines 12.1 kB
{"version":3,"file":"json-rpc.mjs","sources":["../../../src/pullClient/json-rpc.ts"],"sourcesContent":["import type { RpcCommand, RpcCommandResult, TypeRpcResponseAwaiters, JsonRpcRequest, RpcRequest, TypeConnector, TypeJsonRpcConfig, TypePullClientMessageBatch } from '../types/pull'\nimport type { LoggerInterface } from '../logger'\nimport { LoggerFactory } from '../logger'\nimport { ErrorNotConnected, ErrorTimeout } from './errors'\nimport { Type } from '../tools/type'\nimport { Text } from '../tools/text'\nimport { ListRpcError } from '../types/pull'\n\nconst JSON_RPC_VERSION = '2.0'\n\nexport class JsonRpc {\n private _logger: LoggerInterface\n\n private _connector: TypeConnector\n private _idCounter: number = 0\n\n private _handlers: Record<string, (params: any) => RpcCommandResult> = {}\n\n private _rpcResponseAwaiters: Map<number, TypeRpcResponseAwaiters> = new Map()\n\n constructor(options: TypeJsonRpcConfig) {\n this._logger = LoggerFactory.createNullLogger()\n this._connector = options.connector\n\n if (Type.isPlainObject(options.handlers)) {\n for (const method in options.handlers) {\n this.handle(method, options.handlers[method]!)\n }\n }\n }\n\n setLogger(logger: LoggerInterface): void {\n this._logger = logger\n }\n\n getLogger(): LoggerInterface {\n return this._logger\n }\n\n /**\n * @param {string} method\n * @param {function} handler\n */\n handle(method: string, handler: (params: any) => RpcCommandResult) {\n this._handlers[method] = handler\n }\n\n /**\n * Sends RPC command to the server.\n *\n * @param {string} method Method name\n * @param {object} params\n * @param {int} timeout\n * @returns {Promise}\n */\n async executeOutgoingRpcCommand(\n method: string,\n params: object,\n timeout: number = 5\n ): Promise<any> {\n return new Promise((resolve, reject) => {\n const request = this.createRequest(method, params)\n\n if (!this._connector.send(JSON.stringify(request))) {\n reject(new ErrorNotConnected('websocket is not connected'))\n }\n\n const timeoutHandler = setTimeout(() => {\n this._rpcResponseAwaiters.delete(request.id)\n reject(new ErrorTimeout('no response'))\n }, timeout * 1_000)\n\n this._rpcResponseAwaiters.set(request.id, {\n resolve,\n reject,\n timeout: timeoutHandler\n } as unknown as TypeRpcResponseAwaiters)\n })\n }\n\n /**\n * Executes array or rpc commands.\n * Returns an array of promises, each promise will be resolved individually.\n *\n * @param {JsonRpcRequest[]} batch\n * @returns {Promise[]}\n */\n // @ts-expect-error When we rewrite it to something more modern, then we'll remove this\n private executeOutgoingRpcBatch(batch: JsonRpcRequest[]): Promise<any>[] {\n const requests: RpcRequest[] = []\n const promises: Promise<any>[] = []\n\n // eslint-disable-next-line\n\t\tbatch.forEach(({ method, params, id }) => {\n const request = this.createRequest(method, params, id)\n requests.push(request)\n promises.push(\n new Promise((resolve, reject) =>\n this._rpcResponseAwaiters.set(request.id, {\n resolve,\n reject\n } as TypeRpcResponseAwaiters)\n )\n )\n })\n\n this._connector.send(JSON.stringify(requests))\n return promises\n }\n\n private processRpcResponse(response: RpcCommandResult): void {\n if (\n 'id' in response\n && this._rpcResponseAwaiters.has(Number(response.id))\n ) {\n const awaiter = this._rpcResponseAwaiters.get(Number(response.id))\n if (awaiter) {\n if ('result' in response) {\n awaiter.resolve(response.result)\n } else if ('error' in response) {\n awaiter.reject(response?.error || 'error')\n } else {\n awaiter.reject('wrong response structure')\n }\n\n clearTimeout(awaiter.timeout)\n this._rpcResponseAwaiters.delete(Number(response.id))\n }\n\n return\n }\n\n this.getLogger().error(`${Text.getDateForLog()}: Pull: Received rpc response with unknown id`, { response })\n }\n\n parseJsonRpcMessage(\n message: string\n ): RpcCommandResult[] | RpcCommandResult {\n let decoded\n try {\n decoded = JSON.parse(message)\n } catch (error) {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: Could not decode json rpc message`,\n { error }\n )\n\n return []\n }\n\n if (Type.isArray(decoded)) {\n return this.executeIncomingRpcBatch(decoded)\n } else if (Type.isJsonRpcRequest(decoded)) {\n return this.executeIncomingRpcCommand(decoded)\n } else if (Type.isJsonRpcResponse(decoded)) {\n this.processRpcResponse(decoded)\n return []\n } else {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: unknown rpc packet`,\n { decoded }\n )\n }\n\n return []\n }\n\n /**\n * Executes RPC command, received from the server\n *\n * @param {string} method\n * @param {object} params\n * @returns {object} RpcCommandResult\n */\n private executeIncomingRpcCommand({\n method,\n params\n }: RpcCommand): RpcCommandResult {\n if (method in this._handlers) {\n return this._handlers[method]!.call(this, params || {})\n }\n\n return {\n jsonrpc: JSON_RPC_VERSION,\n error: ListRpcError.MethodNotFound\n } as RpcCommandResult\n }\n\n private executeIncomingRpcBatch(batch: RpcCommand[]): RpcCommandResult[] {\n const result: RpcCommandResult[] = []\n\n for (const command of batch) {\n if ('jsonrpc' in command) {\n if ('method' in command) {\n const commandResult = this.executeIncomingRpcCommand(command)\n if (commandResult) {\n commandResult['jsonrpc'] = JSON_RPC_VERSION\n commandResult['id'] = command['id']\n\n result.push(commandResult)\n }\n } else {\n this.processRpcResponse(command)\n }\n } else {\n this.getLogger().error(\n `${Text.getDateForLog()}: Pull: unknown rpc command in batch`,\n { command }\n )\n\n result.push({\n jsonrpc: JSON_RPC_VERSION,\n error: ListRpcError.InvalidRequest\n } as RpcCommandResult)\n }\n }\n\n return result\n }\n\n private nextId(): number {\n return ++this._idCounter\n }\n\n public createPublishRequest(\n messageBatch: TypePullClientMessageBatch[]\n ): RpcRequest[] {\n return messageBatch.map(message => this.createRequest('publish', message))\n }\n\n private createRequest(method: string, params: any, id?: number): RpcRequest {\n if (!id) {\n id = this.nextId()\n }\n\n return {\n jsonrpc: JSON_RPC_VERSION,\n method,\n params,\n id\n } as RpcRequest\n }\n}\n"],"names":[],"mappings":"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"}