Skip to content

Commit edba9a9

Browse files
FrederikBoldinglegobeat
authored andcommitted
Use metamask/json-rpc-engine and metamask/rpc-errors
1 parent 5a671e5 commit edba9a9

14 files changed

+103
-98
lines changed

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,15 @@
3737
"test:watch": "jest --watch"
3838
},
3939
"dependencies": {
40+
"@metamask/json-rpc-engine": "^7.0.0",
4041
"@metamask/object-multiplex": "^1.1.0",
4142
"@metamask/rpc-errors": "^5.1.1",
4243
"@metamask/safe-event-emitter": "^3.0.0",
44+
"@metamask/utils": "^6.2.0",
4345
"detect-browser": "^5.2.0",
4446
"extension-port-stream": "^2.0.1",
4547
"fast-deep-equal": "^3.1.3",
4648
"is-stream": "^2.0.0",
47-
"json-rpc-engine": "^6.1.0",
4849
"json-rpc-middleware-stream": "^4.2.1",
4950
"pump": "^3.0.0",
5051
"webextension-polyfill": "^0.10.0"

src/BaseProvider.ts

Lines changed: 17 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
1+
import { JsonRpcEngine, JsonRpcMiddleware } from '@metamask/json-rpc-engine';
2+
import { rpcErrors, JsonRpcError } from '@metamask/rpc-errors';
13
import SafeEventEmitter from '@metamask/safe-event-emitter';
2-
import { ethErrors, EthereumRpcError } from 'eth-rpc-errors';
3-
import dequal from 'fast-deep-equal';
44
import {
5-
JsonRpcEngine,
65
JsonRpcRequest,
76
JsonRpcId,
8-
JsonRpcVersion,
7+
JsonRpcVersion2,
98
JsonRpcSuccess,
10-
JsonRpcMiddleware,
11-
} from 'json-rpc-engine';
9+
JsonRpcParams,
10+
Json,
11+
} from '@metamask/utils';
12+
import dequal from 'fast-deep-equal';
1213

1314
import messages from './messages';
1415
import {
@@ -20,7 +21,7 @@ import {
2021

2122
export type UnvalidatedJsonRpcRequest = {
2223
id?: JsonRpcId;
23-
jsonrpc?: JsonRpcVersion;
24+
jsonrpc?: JsonRpcVersion2;
2425
method: string;
2526
params?: unknown;
2627
};
@@ -37,10 +38,10 @@ export type BaseProviderOptions = {
3738
maxEventListeners?: number;
3839

3940
/**
40-
* `json-rpc-engine` middleware. The middleware will be inserted in the given
41+
* `@metamask/json-rpc-engine` middleware. The middleware will be inserted in the given
4142
* order immediately after engine initialization.
4243
*/
43-
rpcMiddleware?: JsonRpcMiddleware<unknown, unknown>[];
44+
rpcMiddleware?: JsonRpcMiddleware<JsonRpcParams, Json>[];
4445
};
4546

4647
export type RequestArguments = {
@@ -169,7 +170,7 @@ export abstract class BaseProvider extends SafeEventEmitter {
169170
*/
170171
async request<T>(args: RequestArguments): Promise<Maybe<T>> {
171172
if (!args || typeof args !== 'object' || Array.isArray(args)) {
172-
throw ethErrors.rpc.invalidRequest({
173+
throw rpcErrors.invalidRequest({
173174
message: messages.errors.invalidRequestArgs(),
174175
data: args,
175176
});
@@ -178,7 +179,7 @@ export abstract class BaseProvider extends SafeEventEmitter {
178179
const { method, params } = args;
179180

180181
if (typeof method !== 'string' || method.length === 0) {
181-
throw ethErrors.rpc.invalidRequest({
182+
throw rpcErrors.invalidRequest({
182183
message: messages.errors.invalidRequestMethod(),
183184
data: args,
184185
});
@@ -189,7 +190,7 @@ export abstract class BaseProvider extends SafeEventEmitter {
189190
!Array.isArray(params) &&
190191
(typeof params !== 'object' || params === null)
191192
) {
192-
throw ethErrors.rpc.invalidRequest({
193+
throw rpcErrors.invalidRequest({
193194
message: messages.errors.invalidRequestParams(),
194195
data: args,
195196
});
@@ -285,15 +286,9 @@ export abstract class BaseProvider extends SafeEventEmitter {
285286
callback(error, response);
286287
};
287288
}
288-
return this._rpcEngine.handle(
289-
payload as JsonRpcRequest<unknown>,
290-
callbackWrapper,
291-
);
289+
return this._rpcEngine.handle(payload as JsonRpcRequest, callbackWrapper);
292290
}
293-
return this._rpcEngine.handle(
294-
payload as JsonRpcRequest<unknown>[],
295-
callbackWrapper,
296-
);
291+
return this._rpcEngine.handle(payload as JsonRpcRequest[], callbackWrapper);
297292
}
298293

299294
/**
@@ -331,13 +326,13 @@ export abstract class BaseProvider extends SafeEventEmitter {
331326

332327
let error;
333328
if (isRecoverable) {
334-
error = new EthereumRpcError(
329+
error = new JsonRpcError(
335330
1013, // Try again later
336331
errorMessage ?? messages.errors.disconnected(),
337332
);
338333
this._log.debug(error);
339334
} else {
340-
error = new EthereumRpcError(
335+
error = new JsonRpcError(
341336
1011, // Internal error
342337
errorMessage ?? messages.errors.permanentlyDisconnected(),
343338
);

src/MetaMaskInpageProvider.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { JsonRpcRequest } from 'json-rpc-engine';
1+
import { JsonRpcRequest } from '@metamask/utils';
22

33
import messages from './messages';
44
import {
@@ -58,7 +58,7 @@ async function getInitializedProvider({
5858
onMethodCalled?: {
5959
substream: string;
6060
method: string;
61-
callback: (data: JsonRpcRequest<unknown>) => void;
61+
callback: (data: JsonRpcRequest) => void;
6262
}[];
6363
} = {}): Promise<InitializedProviderDetails> {
6464
const onWrite = jest.fn();

src/MetaMaskInpageProvider.ts

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import { ethErrors } from 'eth-rpc-errors';
2-
import type { JsonRpcRequest, JsonRpcResponse } from 'json-rpc-engine';
1+
import { rpcErrors } from '@metamask/rpc-errors';
2+
import type { Json, JsonRpcRequest, JsonRpcResponse } from '@metamask/utils';
33
import type { Duplex } from 'stream';
44

5-
import type { UnvalidatedJsonRpcRequest } from './BaseProvider';
5+
import { UnvalidatedJsonRpcRequest } from './BaseProvider';
66
import messages from './messages';
77
import { sendSiteMetadata } from './siteMetadata';
88
import {
@@ -22,7 +22,7 @@ export type SendSyncJsonRpcRequest = {
2222
| 'eth_coinbase'
2323
| 'eth_uninstallFilter'
2424
| 'net_version';
25-
} & JsonRpcRequest<unknown>;
25+
} & JsonRpcRequest;
2626

2727
type WarningEventName = keyof SentWarningsState['events'];
2828

@@ -171,8 +171,8 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider {
171171
* @param callback - The callback function.
172172
*/
173173
sendAsync(
174-
payload: JsonRpcRequest<unknown>,
175-
callback: (error: Error | null, result?: JsonRpcResponse<unknown>) => void,
174+
payload: JsonRpcRequest,
175+
callback: (error: Error | null, result?: JsonRpcResponse<Json>) => void,
176176
): void {
177177
this._rpcRequest(payload, callback);
178178
}
@@ -283,7 +283,10 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider {
283283
* @returns A Promise that resolves with the JSON-RPC response object for the
284284
* request.
285285
*/
286-
send<T>(method: string, params?: T[]): Promise<JsonRpcResponse<T>>;
286+
send<T extends Json>(
287+
method: string,
288+
params?: T[],
289+
): Promise<JsonRpcResponse<T>>;
287290

288291
/**
289292
* Submits an RPC request per the given JSON-RPC request object.
@@ -293,8 +296,8 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider {
293296
* @param callback - An error-first callback that will receive the JSON-RPC
294297
* response object.
295298
*/
296-
send<T>(
297-
payload: JsonRpcRequest<unknown>,
299+
send<T extends Json>(
300+
payload: JsonRpcRequest,
298301
callback: (error: Error | null, result?: JsonRpcResponse<T>) => void,
299302
): void;
300303

@@ -306,7 +309,7 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider {
306309
* @param payload - A JSON-RPC request object.
307310
* @returns A JSON-RPC response object.
308311
*/
309-
send<T>(payload: SendSyncJsonRpcRequest): JsonRpcResponse<T>;
312+
send<T extends Json>(payload: SendSyncJsonRpcRequest): JsonRpcResponse<T>;
310313

311314
// eslint-disable-next-line @typescript-eslint/promise-function-async
312315
send(methodOrPayload: unknown, callbackOrArgs?: unknown): unknown {
@@ -335,7 +338,7 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider {
335338
typeof callbackOrArgs === 'function'
336339
) {
337340
return this._rpcRequest(
338-
methodOrPayload as JsonRpcRequest<unknown>,
341+
methodOrPayload as JsonRpcRequest,
339342
callbackOrArgs as (...args: unknown[]) => void,
340343
);
341344
}
@@ -412,7 +415,7 @@ export class MetaMaskInpageProvider extends AbstractStreamProvider {
412415
*/
413416
requestBatch: async (requests: UnvalidatedJsonRpcRequest[]) => {
414417
if (!Array.isArray(requests)) {
415-
throw ethErrors.rpc.invalidRequest({
418+
throw rpcErrors.invalidRequest({
416419
message:
417420
'Batch requests must be made with an array of request objects.',
418421
data: requests,

src/StreamProvider.test.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { JsonRpcMiddleware } from 'json-rpc-engine';
1+
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
2+
import { Json, JsonRpcParams } from '@metamask/utils';
23

34
import messages from './messages';
45
import { StreamProvider } from './StreamProvider';
@@ -15,7 +16,7 @@ const mockStreamName = 'mock-stream';
1516
* @returns A tuple containing the StreamProvider instance and the mock stream.
1617
*/
1718
function getStreamProvider(
18-
rpcMiddleware: JsonRpcMiddleware<unknown, unknown>[] = [],
19+
rpcMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>[] = [],
1920
) {
2021
const mockStream = new MockConnectionStream();
2122
const streamProvider = new StreamProvider(mockStream, {

src/StreamProvider.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1+
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
12
import ObjectMultiplex from '@metamask/object-multiplex';
23
import SafeEventEmitter from '@metamask/safe-event-emitter';
4+
import { Json, JsonRpcParams } from '@metamask/utils';
35
import { duplex as isDuplex } from 'is-stream';
4-
import type { JsonRpcMiddleware } from 'json-rpc-engine';
56
import { createStreamMiddleware } from 'json-rpc-middleware-stream';
67
import pump from 'pump';
78
import type { Duplex } from 'stream';
@@ -23,7 +24,7 @@ export type StreamProviderOptions = {
2324

2425
export type JsonRpcConnection = {
2526
events: SafeEventEmitter;
26-
middleware: JsonRpcMiddleware<unknown, unknown>;
27+
middleware: JsonRpcMiddleware<JsonRpcParams, Json>;
2728
stream: Duplex;
2829
};
2930

src/extension-provider/createExternalExtensionProvider.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { JsonRpcRequest } from 'json-rpc-engine';
1+
import type { JsonRpcRequest } from '@metamask/utils';
22

33
import { createExternalExtensionProvider } from './createExternalExtensionProvider';
44
import config from './external-extension-config.json';
@@ -49,7 +49,7 @@ async function getInitializedProvider({
4949
onMethodCalled?: {
5050
substream: string;
5151
method: string;
52-
callback: (data: JsonRpcRequest<unknown>) => void;
52+
callback: (data: JsonRpcRequest) => void;
5353
}[];
5454
} = {}): Promise<InitializedExtensionProviderDetails> {
5555
const onWrite = jest.fn();

src/middleware/createRpcWarningMiddleware.test.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import { JsonRpcEngine, JsonRpcFailure, JsonRpcSuccess } from 'json-rpc-engine';
1+
import { JsonRpcEngine } from '@metamask/json-rpc-engine';
2+
import { Json, JsonRpcFailure, JsonRpcSuccess } from '@metamask/utils';
23

34
import { createRpcWarningMiddleware } from './createRpcWarningMiddleware';
45
import messages from '../messages';
@@ -89,7 +90,7 @@ describe('createRpcWarningMiddleware', () => {
8990
jsonrpc: '2.0',
9091
id: 1,
9192
method,
92-
})) as JsonRpcSuccess<unknown>;
93+
})) as JsonRpcSuccess<Json>;
9394

9495
expect(response.result).toBe('success!');
9596
});
@@ -138,7 +139,7 @@ describe('createRpcWarningMiddleware', () => {
138139
id: 1,
139140
method,
140141
params,
141-
})) as JsonRpcSuccess<unknown>;
142+
})) as JsonRpcSuccess<Json>;
142143

143144
expect(response.result).toBe('success!');
144145
});

src/middleware/createRpcWarningMiddleware.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
import type { JsonRpcMiddleware, JsonRpcRequest } from 'json-rpc-engine';
1+
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
2+
import type { Json, JsonRpcParams, JsonRpcRequest } from '@metamask/utils';
23

34
import { ERC1155, ERC721 } from '../constants';
45
import messages from '../messages';
@@ -12,7 +13,7 @@ import type { ConsoleLike } from '../utils';
1213
*/
1314
export function createRpcWarningMiddleware(
1415
log: ConsoleLike,
15-
): JsonRpcMiddleware<unknown, unknown> {
16+
): JsonRpcMiddleware<JsonRpcParams, Json> {
1617
const sentWarnings = {
1718
ethDecryptDeprecation: false,
1819
ethGetEncryptionPublicKeyDeprecation: false,

src/siteMetadata.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { JsonRpcEngine } from 'json-rpc-engine';
1+
import { JsonRpcEngine } from '@metamask/json-rpc-engine';
22

33
import messages from './messages';
44
import { ConsoleLike, NOOP } from './utils';

0 commit comments

Comments
 (0)