{"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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"}