Skip to content

Commit 864be84

Browse files
committed
refactor: Migrate create-network-client
1 parent 4e8d03e commit 864be84

File tree

4 files changed

+77
-58
lines changed

4 files changed

+77
-58
lines changed

packages/eth-json-rpc-middleware/src/providerAsMiddleware.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';
1+
import type { InternalProvider } from '@metamask/eth-json-rpc-provider';
22
import { JsonRpcEngine } from '@metamask/json-rpc-engine';
33
import { JsonRpcEngineV2 } from '@metamask/json-rpc-engine/v2';
44
import type { Json } from '@metamask/utils';
@@ -10,10 +10,10 @@ import {
1010
} from './providerAsMiddleware';
1111
import { createRequest } from '../test/util/helpers';
1212

13-
const createMockProvider = (result: Json): SafeEventEmitterProvider =>
13+
const createMockProvider = (result: Json): InternalProvider =>
1414
({
1515
request: jest.fn().mockResolvedValue(result),
16-
}) as unknown as SafeEventEmitterProvider;
16+
}) as unknown as InternalProvider;
1717

1818
describe('providerAsMiddleware', () => {
1919
it('forwards requests to the provider and returns the result', async () => {

packages/network-controller/src/NetworkController.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2446,6 +2446,8 @@ export class NetworkController extends BaseController<
24462446
*
24472447
* In-progress requests will not be aborted.
24482448
*/
2449+
// We're intentionally changing the signature of an extended method.
2450+
// eslint-disable-next-line @typescript-eslint/no-misused-promises
24492451
async destroy() {
24502452
await this.#blockTrackerProxy?.destroy();
24512453
}

packages/network-controller/src/create-network-client.ts

Lines changed: 71 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,18 @@ import {
1212
createFetchMiddleware,
1313
createRetryOnEmptyMiddleware,
1414
} from '@metamask/eth-json-rpc-middleware';
15+
import { InternalProvider } from '@metamask/eth-json-rpc-provider';
16+
import { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider';
17+
import { asV2Middleware } from '@metamask/json-rpc-engine';
1518
import {
16-
InternalProvider,
17-
providerFromMiddleware,
18-
} from '@metamask/eth-json-rpc-provider';
19-
import {
20-
createAsyncMiddleware,
2119
createScaffoldMiddleware,
22-
JsonRpcEngine,
23-
mergeMiddleware,
24-
} from '@metamask/json-rpc-engine';
25-
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
26-
import type { Hex, Json, JsonRpcParams } from '@metamask/utils';
20+
JsonRpcEngineV2,
21+
} from '@metamask/json-rpc-engine/v2';
22+
import type {
23+
JsonRpcMiddleware,
24+
MiddlewareContext,
25+
} from '@metamask/json-rpc-engine/v2';
26+
import type { Hex, Json, JsonRpcRequest } from '@metamask/utils';
2727
import type { Logger } from 'loglevel';
2828

2929
import type { NetworkControllerMessenger } from './NetworkController';
@@ -49,6 +49,12 @@ export type NetworkClient = {
4949
destroy: () => void;
5050
};
5151

52+
type RpcApiMiddleware = JsonRpcMiddleware<
53+
JsonRpcRequest,
54+
Json,
55+
MiddlewareContext<{ origin: string }>
56+
>;
57+
5258
/**
5359
* Create a JSON RPC network client for a specific network.
5460
*
@@ -136,17 +142,21 @@ export function createNetworkClient({
136142
});
137143
});
138144

139-
const rpcApiMiddleware =
140-
configuration.type === NetworkClientType.Infura
141-
? createInfuraMiddleware({
142-
rpcService: rpcServiceChain,
143-
options: {
144-
source: 'metamask',
145-
},
146-
})
147-
: createFetchMiddleware({ rpcService: rpcServiceChain });
145+
let rpcApiMiddleware: RpcApiMiddleware;
146+
if (configuration.type === NetworkClientType.Infura) {
147+
rpcApiMiddleware = asV2Middleware(
148+
createInfuraMiddleware({
149+
rpcService: rpcServiceChain,
150+
options: {
151+
source: 'metamask',
152+
},
153+
}),
154+
) as unknown as RpcApiMiddleware;
155+
} else {
156+
rpcApiMiddleware = createFetchMiddleware({ rpcService: rpcServiceChain });
157+
}
148158

149-
const rpcProvider = providerFromMiddleware(rpcApiMiddleware);
159+
const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);
150160

151161
const blockTracker = createBlockTracker({
152162
networkClientType: configuration.type,
@@ -169,11 +179,11 @@ export function createNetworkClient({
169179
rpcApiMiddleware,
170180
});
171181

172-
const engine = new JsonRpcEngine();
173-
174-
engine.push(networkMiddleware);
175-
176-
const provider: Provider = new InternalProvider({ engine });
182+
const provider: Provider = new InternalProvider({
183+
engine: JsonRpcEngineV2.create({
184+
middleware: [networkMiddleware],
185+
}),
186+
});
177187

178188
const destroy = () => {
179189
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
@@ -240,17 +250,19 @@ function createInfuraNetworkMiddleware({
240250
blockTracker: PollingBlockTracker;
241251
network: InfuraNetworkType;
242252
rpcProvider: InternalProvider;
243-
rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;
253+
rpcApiMiddleware: RpcApiMiddleware;
244254
}) {
245-
return mergeMiddleware([
246-
createNetworkAndChainIdMiddleware({ network }),
247-
createBlockCacheMiddleware({ blockTracker }),
248-
createInflightCacheMiddleware(),
249-
createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
250-
createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
251-
createBlockTrackerInspectorMiddleware({ blockTracker }),
252-
rpcApiMiddleware,
253-
]);
255+
return JsonRpcEngineV2.create({
256+
middleware: [
257+
createNetworkAndChainIdMiddleware({ network }),
258+
createBlockCacheMiddleware({ blockTracker }),
259+
createInflightCacheMiddleware(),
260+
createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
261+
createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
262+
createBlockTrackerInspectorMiddleware({ blockTracker }),
263+
rpcApiMiddleware,
264+
],
265+
}).asMiddleware();
254266
}
255267

256268
/**
@@ -272,11 +284,10 @@ function createNetworkAndChainIdMiddleware({
272284

273285
const createChainIdMiddleware = (
274286
chainId: Hex,
275-
): JsonRpcMiddleware<JsonRpcParams, Json> => {
276-
return (req, res, next, end) => {
277-
if (req.method === 'eth_chainId') {
278-
res.result = chainId;
279-
return end();
287+
): JsonRpcMiddleware<JsonRpcRequest, Json> => {
288+
return ({ request, next }) => {
289+
if (request.method === 'eth_chainId') {
290+
return chainId;
280291
}
281292
return next();
282293
};
@@ -298,21 +309,23 @@ function createCustomNetworkMiddleware({
298309
}: {
299310
blockTracker: PollingBlockTracker;
300311
chainId: Hex;
301-
rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;
302-
}): JsonRpcMiddleware<JsonRpcParams, Json> {
312+
rpcApiMiddleware: RpcApiMiddleware;
313+
}) {
303314
const testMiddlewares = process.env.IN_TEST
304315
? [createEstimateGasDelayTestMiddleware()]
305316
: [];
306317

307-
return mergeMiddleware([
308-
...testMiddlewares,
309-
createChainIdMiddleware(chainId),
310-
createBlockRefRewriteMiddleware({ blockTracker }),
311-
createBlockCacheMiddleware({ blockTracker }),
312-
createInflightCacheMiddleware(),
313-
createBlockTrackerInspectorMiddleware({ blockTracker }),
314-
rpcApiMiddleware,
315-
]);
318+
return JsonRpcEngineV2.create({
319+
middleware: [
320+
...testMiddlewares,
321+
createChainIdMiddleware(chainId),
322+
createBlockRefRewriteMiddleware({ blockTracker }),
323+
createBlockCacheMiddleware({ blockTracker }),
324+
createInflightCacheMiddleware(),
325+
createBlockTrackerInspectorMiddleware({ blockTracker }),
326+
rpcApiMiddleware,
327+
],
328+
}).asMiddleware();
316329
}
317330

318331
/**
@@ -321,11 +334,14 @@ function createCustomNetworkMiddleware({
321334
*
322335
* @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
323336
*/
324-
function createEstimateGasDelayTestMiddleware() {
325-
return createAsyncMiddleware(async (req, _, next) => {
326-
if (req.method === 'eth_estimateGas') {
337+
function createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<
338+
JsonRpcRequest,
339+
Json
340+
> {
341+
return async ({ request, next }) => {
342+
if (request.method === 'eth_estimateGas') {
327343
await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
328344
}
329345
return next();
330-
});
346+
};
331347
}

packages/network-controller/tests/NetworkController.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16804,6 +16804,7 @@ async function waitForPublishedEvents<E extends NetworkControllerEvents>({
1680416804
if (interestingEventPayloads.length === expectedNumberOfEvents) {
1680516805
resolve(interestingEventPayloads);
1680616806
} else {
16807+
// eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors
1680716808
reject(
1680816809
new Error(
1680916810
`Expected to receive ${expectedNumberOfEvents} ${String(eventType)} event(s), but received ${

0 commit comments

Comments
 (0)