11import SafeEventEmitter from '@metamask/safe-event-emitter' ;
2+ import {
3+ hasProperty ,
4+ JsonRpcError ,
5+ JsonRpcRequest ,
6+ JsonRpcResponse ,
7+ } from '@metamask/utils' ;
28import { errorCodes , EthereumRpcError , serializeError } from 'eth-rpc-errors' ;
39
4- type Maybe < T > = Partial < T > | null | undefined ;
5-
6- export type Json =
7- | boolean
8- | number
9- | string
10- | null
11- | { [ property : string ] : Json }
12- | Json [ ] ;
13-
14- /**
15- * A String specifying the version of the JSON-RPC protocol.
16- * MUST be exactly "2.0".
17- */
18- export type JsonRpcVersion = '2.0' ;
19-
20- /**
21- * An identifier established by the Client that MUST contain a String, Number,
22- * or NULL value if included. If it is not included it is assumed to be a
23- * notification. The value SHOULD normally not be Null and Numbers SHOULD
24- * NOT contain fractional parts.
25- */
26- export type JsonRpcId = number | string | null ;
27-
28- export interface JsonRpcError {
29- code : number ;
30- message : string ;
31- data ?: unknown ;
32- stack ?: string ;
33- }
34-
35- export interface JsonRpcRequest < T > {
36- jsonrpc : JsonRpcVersion ;
37- method : string ;
38- id : JsonRpcId ;
39- params ?: T ;
40- }
41-
42- export interface JsonRpcNotification < T > {
43- jsonrpc : JsonRpcVersion ;
44- method : string ;
45- params ?: T ;
46- }
47-
48- interface JsonRpcResponseBase {
49- jsonrpc : JsonRpcVersion ;
50- id : JsonRpcId ;
51- }
52-
53- export interface JsonRpcSuccess < T > extends JsonRpcResponseBase {
54- result : Maybe < T > ;
55- }
56-
57- export interface JsonRpcFailure extends JsonRpcResponseBase {
58- error : JsonRpcError ;
59- }
60-
61- export type JsonRpcResponse < T > = JsonRpcSuccess < T > | JsonRpcFailure ;
62-
63- export interface PendingJsonRpcResponse < T > extends JsonRpcResponseBase {
64- result ?: T ;
65- error ?: Error | JsonRpcError ;
66- }
10+ export type PendingJsonRpcResponse < Result > = Omit <
11+ JsonRpcResponse < Result > ,
12+ 'error' | 'result'
13+ > & {
14+ result ?: Result ;
15+ error ?: JsonRpcError ;
16+ } ;
6717
6818export type JsonRpcEngineCallbackError = Error | JsonRpcError | null ;
6919
@@ -79,9 +29,9 @@ export type JsonRpcEngineEndCallback = (
7929 error ?: JsonRpcEngineCallbackError ,
8030) => void ;
8131
82- export type JsonRpcMiddleware < T , U > = (
83- req : JsonRpcRequest < T > ,
84- res : PendingJsonRpcResponse < U > ,
32+ export type JsonRpcMiddleware < Params , Result > = (
33+ req : JsonRpcRequest < Params > ,
34+ res : PendingJsonRpcResponse < Result > ,
8535 next : JsonRpcEngineNextCallback ,
8636 end : JsonRpcEngineEndCallback ,
8737) => void ;
@@ -103,7 +53,7 @@ export class JsonRpcEngine extends SafeEventEmitter {
10353 *
10454 * @param middleware - The middleware function to add.
10555 */
106- push < T , U > ( middleware : JsonRpcMiddleware < T , U > ) : void {
56+ push < Params , Result > ( middleware : JsonRpcMiddleware < Params , Result > ) : void {
10757 this . _middleware . push ( middleware as JsonRpcMiddleware < unknown , unknown > ) ;
10858 }
10959
@@ -113,9 +63,9 @@ export class JsonRpcEngine extends SafeEventEmitter {
11363 * @param request - The request to handle.
11464 * @param callback - An error-first callback that will receive the response.
11565 */
116- handle < T , U > (
117- request : JsonRpcRequest < T > ,
118- callback : ( error : unknown , response : JsonRpcResponse < U > ) => void ,
66+ handle < Params , Result > (
67+ request : JsonRpcRequest < Params > ,
68+ callback : ( error : unknown , response : JsonRpcResponse < Result > ) => void ,
11969 ) : void ;
12070
12171 /**
@@ -125,9 +75,9 @@ export class JsonRpcEngine extends SafeEventEmitter {
12575 * @param callback - An error-first callback that will receive the array of
12676 * responses.
12777 */
128- handle < T , U > (
129- requests : JsonRpcRequest < T > [ ] ,
130- callback : ( error : unknown , responses : JsonRpcResponse < U > [ ] ) => void ,
78+ handle < Params , Result > (
79+ requests : JsonRpcRequest < Params > [ ] ,
80+ callback : ( error : unknown , responses : JsonRpcResponse < Result > [ ] ) => void ,
13181 ) : void ;
13282
13383 /**
@@ -136,15 +86,19 @@ export class JsonRpcEngine extends SafeEventEmitter {
13686 * @param request - The JSON-RPC request to handle.
13787 * @returns The JSON-RPC response.
13888 */
139- handle < T , U > ( request : JsonRpcRequest < T > ) : Promise < JsonRpcResponse < U > > ;
89+ handle < Params , Result > (
90+ request : JsonRpcRequest < Params > ,
91+ ) : Promise < JsonRpcResponse < Result > > ;
14092
14193 /**
14294 * Handle an array of JSON-RPC requests, and return an array of responses.
14395 *
14496 * @param request - The JSON-RPC requests to handle.
14597 * @returns An array of JSON-RPC responses.
14698 */
147- handle < T , U > ( requests : JsonRpcRequest < T > [ ] ) : Promise < JsonRpcResponse < U > [ ] > ;
99+ handle < Params , Result > (
100+ requests : JsonRpcRequest < Params > [ ] ,
101+ ) : Promise < JsonRpcResponse < Result > [ ] > ;
148102
149103 handle ( req : unknown , callback ?: any ) {
150104 if ( callback && typeof callback !== 'function' ) {
@@ -487,7 +441,7 @@ export class JsonRpcEngine extends SafeEventEmitter {
487441 res : PendingJsonRpcResponse < unknown > ,
488442 isComplete : boolean ,
489443 ) : void {
490- if ( ! ( 'result' in res ) && ! ( 'error' in res ) ) {
444+ if ( ! hasProperty ( res , 'result' ) && ! hasProperty ( res , 'error' ) ) {
491445 throw new EthereumRpcError (
492446 errorCodes . rpc . internal ,
493447 `JsonRpcEngine: Response has no error or result for request:\n${ jsonify (
0 commit comments