@metamask/eth-json-rpc-provider
Version: 
Create an Ethereum provider using a JSON-RPC engine or middleware
1 lines • 5.99 kB
Source Map (JSON)
{"version":3,"file":"safe-event-emitter-provider.cjs","sourceRoot":"","sources":["../src/safe-event-emitter-provider.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AACA,qDAAoD;AACpD,sFAA4D;AAQ5D,+BAAoC;AAYpC;;;;;GAKG;AACH,SAAgB,qCAAqC,CAGnD,cAAsC;IAEtC,MAAM,EAAE,EAAE,GAAG,IAAA,SAAM,GAAE,EAAE,OAAO,GAAG,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,cAAc,CAAC;IAC1E,OAAO,MAAM;QACX,CAAC,CAAC;YACE,EAAE;YACF,OAAO;YACP,MAAM;YACN,MAAM;SACP;QACH,CAAC,CAAC;YACE,EAAE;YACF,OAAO;YACP,MAAM;SACP,CAAC;AACR,CAAC;AAlBD,sFAkBC;AAED;;;;;GAKG;AACH,MAAa,wBAAyB,SAAQ,4BAAgB;IAG5D;;;;;OAKG;IACH,YAAY,EAAE,MAAM,EAA6B;QAC/C,KAAK,EAAE,CAAC;QATV,mDAAuB;QA4CvB;;;;;;;;;WASG;QACH,cAAS,GAAG,CACV,cAAsC;QACtC,gCAAgC;QAChC,8DAA8D;QAC9D,QAAqD,EACrD,EAAE;YACF,MAAM,cAAc,GAClB,qCAAqC,CAAC,cAAc,CAAC,CAAC;YACxD,uBAAA,IAAI,wCAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC;QAEF;;;;;;;;;WASG;QACH,SAAI,GAAG,CACL,cAAsC;QACtC,gCAAgC;QAChC,8DAA8D;QAC9D,QAAqD,EACrD,EAAE;YACF,IAAI,OAAO,QAAQ,KAAK,UAAU,EAAE;gBAClC,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;aAC5D;YACD,MAAM,cAAc,GAClB,qCAAqC,CAAC,cAAc,CAAC,CAAC;YACxD,uBAAA,IAAI,wCAAQ,CAAC,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QAChD,CAAC,CAAC;QA7EA,uBAAA,IAAI,oCAAW,MAAM,MAAA,CAAC;IACxB,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CACX,cAAsC;QAEtC,MAAM,cAAc,GAClB,qCAAqC,CAAC,cAAc,CAAC,CAAC;QACxD,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,wCAAQ,CAAC,MAAM,CAGxC,cAAc,CAAC,CAAC;QAElB,IAAI,QAAQ,IAAI,QAAQ,EAAE;YACxB,OAAO,QAAQ,CAAC,MAAM,CAAC;SACxB;QAED,MAAM,KAAK,GAAG,IAAI,yBAAY,CAC5B,QAAQ,CAAC,KAAK,CAAC,IAAI,EACnB,QAAQ,CAAC,KAAK,CAAC,OAAO,EACtB,QAAQ,CAAC,KAAK,CAAC,IAAI,CACpB,CAAC;QACF,IAAI,OAAO,IAAI,QAAQ,CAAC,KAAK,EAAE;YAC7B,KAAK,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;SACpC;QACD,MAAM,KAAK,CAAC;IACd,CAAC;CA8CF;AAzFD,4DAyFC","sourcesContent":["import type { JsonRpcEngine } from '@metamask/json-rpc-engine';\nimport { JsonRpcError } from '@metamask/rpc-errors';\nimport SafeEventEmitter from '@metamask/safe-event-emitter';\nimport type {\n  Json,\n  JsonRpcId,\n  JsonRpcParams,\n  JsonRpcRequest,\n  JsonRpcVersion2,\n} from '@metamask/utils';\nimport { v4 as uuidV4 } from 'uuid';\n\n/**\n * A JSON-RPC request conforming to the EIP-1193 specification.\n */\ntype Eip1193Request<Params extends JsonRpcParams> = {\n  id?: JsonRpcId;\n  jsonrpc?: JsonRpcVersion2;\n  method: string;\n  params?: Params;\n};\n\n/**\n * Converts an EIP-1193 request to a JSON-RPC request.\n *\n * @param eip1193Request - The EIP-1193 request to convert.\n * @returns The corresponding JSON-RPC request.\n */\nexport function convertEip1193RequestToJsonRpcRequest<\n  Params extends JsonRpcParams,\n>(\n  eip1193Request: Eip1193Request<Params>,\n): JsonRpcRequest<Params | Record<never, never>> {\n  const { id = uuidV4(), jsonrpc = '2.0', method, params } = eip1193Request;\n  return params\n    ? {\n        id,\n        jsonrpc,\n        method,\n        params,\n      }\n    : {\n        id,\n        jsonrpc,\n        method,\n      };\n}\n\n/**\n * An Ethereum provider.\n *\n * This provider loosely follows conventions that pre-date EIP-1193.\n * It is not compliant with any Ethereum provider standard.\n */\nexport class SafeEventEmitterProvider extends SafeEventEmitter {\n  #engine: JsonRpcEngine;\n\n  /**\n   * Construct a SafeEventEmitterProvider from a JSON-RPC engine.\n   *\n   * @param options - Options.\n   * @param options.engine - The JSON-RPC engine used to process requests.\n   */\n  constructor({ engine }: { engine: JsonRpcEngine }) {\n    super();\n    this.#engine = engine;\n  }\n\n  /**\n   * Send a provider request asynchronously.\n   *\n   * @param eip1193Request - The request to send.\n   * @returns The JSON-RPC response.\n   */\n  async request<Params extends JsonRpcParams, Result extends Json>(\n    eip1193Request: Eip1193Request<Params>,\n  ): Promise<Result> {\n    const jsonRpcRequest =\n      convertEip1193RequestToJsonRpcRequest(eip1193Request);\n    const response = await this.#engine.handle<\n      Params | Record<never, never>,\n      Result\n    >(jsonRpcRequest);\n\n    if ('result' in response) {\n      return response.result;\n    }\n\n    const error = new JsonRpcError(\n      response.error.code,\n      response.error.message,\n      response.error.data,\n    );\n    if ('stack' in response.error) {\n      error.stack = response.error.stack;\n    }\n    throw error;\n  }\n\n  /**\n   * Send a provider request asynchronously.\n   *\n   * This method serves the same purpose as `request`. It only exists for\n   * legacy reasons.\n   *\n   * @param eip1193Request - The request to send.\n   * @param callback - A function that is called upon the success or failure of the request.\n   * @deprecated Please use `request` instead.\n   */\n  sendAsync = <Params extends JsonRpcParams>(\n    eip1193Request: Eip1193Request<Params>,\n    // TODO: Replace `any` with type\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    callback: (error: unknown, providerRes?: any) => void,\n  ) => {\n    const jsonRpcRequest =\n      convertEip1193RequestToJsonRpcRequest(eip1193Request);\n    this.#engine.handle(jsonRpcRequest, callback);\n  };\n\n  /**\n   * Send a provider request asynchronously.\n   *\n   * This method serves the same purpose as `request`. It only exists for\n   * legacy reasons.\n   *\n   * @param eip1193Request - The request to send.\n   * @param callback - A function that is called upon the success or failure of the request.\n   * @deprecated Please use `request` instead.\n   */\n  send = <Params extends JsonRpcParams>(\n    eip1193Request: Eip1193Request<Params>,\n    // TODO: Replace `any` with type\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    callback: (error: unknown, providerRes?: any) => void,\n  ) => {\n    if (typeof callback !== 'function') {\n      throw new Error('Must provide callback to \"send\" method.');\n    }\n    const jsonRpcRequest =\n      convertEip1193RequestToJsonRpcRequest(eip1193Request);\n    this.#engine.handle(jsonRpcRequest, callback);\n  };\n}\n"]}