UNPKG

@metamask/eth-json-rpc-provider

Version:

Create an Ethereum provider using a JSON-RPC engine or middleware

1 lines 5.99 kB
{"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"]}