1
1
import SafeEventEmitter from '@metamask/safe-event-emitter' ;
2
+ import {
3
+ hasProperty ,
4
+ JsonRpcError ,
5
+ JsonRpcRequest ,
6
+ JsonRpcResponse ,
7
+ } from '@metamask/utils' ;
2
8
import { errorCodes , EthereumRpcError , serializeError } from 'eth-rpc-errors' ;
3
9
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
+ } ;
67
17
68
18
export type JsonRpcEngineCallbackError = Error | JsonRpcError | null ;
69
19
@@ -79,9 +29,9 @@ export type JsonRpcEngineEndCallback = (
79
29
error ?: JsonRpcEngineCallbackError ,
80
30
) => void ;
81
31
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 > ,
85
35
next : JsonRpcEngineNextCallback ,
86
36
end : JsonRpcEngineEndCallback ,
87
37
) => void ;
@@ -103,7 +53,7 @@ export class JsonRpcEngine extends SafeEventEmitter {
103
53
*
104
54
* @param middleware - The middleware function to add.
105
55
*/
106
- push < T , U > ( middleware : JsonRpcMiddleware < T , U > ) : void {
56
+ push < Params , Result > ( middleware : JsonRpcMiddleware < Params , Result > ) : void {
107
57
this . _middleware . push ( middleware as JsonRpcMiddleware < unknown , unknown > ) ;
108
58
}
109
59
@@ -113,9 +63,9 @@ export class JsonRpcEngine extends SafeEventEmitter {
113
63
* @param request - The request to handle.
114
64
* @param callback - An error-first callback that will receive the response.
115
65
*/
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 ,
119
69
) : void ;
120
70
121
71
/**
@@ -125,9 +75,9 @@ export class JsonRpcEngine extends SafeEventEmitter {
125
75
* @param callback - An error-first callback that will receive the array of
126
76
* responses.
127
77
*/
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 ,
131
81
) : void ;
132
82
133
83
/**
@@ -136,15 +86,19 @@ export class JsonRpcEngine extends SafeEventEmitter {
136
86
* @param request - The JSON-RPC request to handle.
137
87
* @returns The JSON-RPC response.
138
88
*/
139
- handle < T , U > ( request : JsonRpcRequest < T > ) : Promise < JsonRpcResponse < U > > ;
89
+ handle < Params , Result > (
90
+ request : JsonRpcRequest < Params > ,
91
+ ) : Promise < JsonRpcResponse < Result > > ;
140
92
141
93
/**
142
94
* Handle an array of JSON-RPC requests, and return an array of responses.
143
95
*
144
96
* @param request - The JSON-RPC requests to handle.
145
97
* @returns An array of JSON-RPC responses.
146
98
*/
147
- handle < T , U > ( requests : JsonRpcRequest < T > [ ] ) : Promise < JsonRpcResponse < U > [ ] > ;
99
+ handle < Params , Result > (
100
+ requests : JsonRpcRequest < Params > [ ] ,
101
+ ) : Promise < JsonRpcResponse < Result > [ ] > ;
148
102
149
103
handle ( req : unknown , callback ?: any ) {
150
104
if ( callback && typeof callback !== 'function' ) {
@@ -487,7 +441,7 @@ export class JsonRpcEngine extends SafeEventEmitter {
487
441
res : PendingJsonRpcResponse < unknown > ,
488
442
isComplete : boolean ,
489
443
) : void {
490
- if ( ! ( 'result' in res ) && ! ( 'error' in res ) ) {
444
+ if ( ! hasProperty ( res , 'result' ) && ! hasProperty ( res , 'error' ) ) {
491
445
throw new EthereumRpcError (
492
446
errorCodes . rpc . internal ,
493
447
`JsonRpcEngine: Response has no error or result for request:\n${ jsonify (
0 commit comments