Skip to content

Commit 546952f

Browse files
committed
refactor: Migrate create-network-client
1 parent f504d46 commit 546952f

File tree

4 files changed

+76
-58
lines changed

4 files changed

+76
-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: 70 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,19 @@ 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+
JsonRpcServer,
22+
} from '@metamask/json-rpc-engine/v2';
23+
import type {
24+
JsonRpcMiddleware,
25+
MiddlewareContext,
26+
} from '@metamask/json-rpc-engine/v2';
27+
import type { Hex, Json, JsonRpcRequest } from '@metamask/utils';
2728
import type { Logger } from 'loglevel';
2829

2930
import type { NetworkControllerMessenger } from './NetworkController';
@@ -49,6 +50,12 @@ export type NetworkClient = {
4950
destroy: () => void;
5051
};
5152

53+
type RpcApiMiddleware = JsonRpcMiddleware<
54+
JsonRpcRequest,
55+
Json,
56+
MiddlewareContext<{ origin: string }>
57+
>;
58+
5259
/**
5360
* Create a JSON RPC network client for a specific network.
5461
*
@@ -136,17 +143,21 @@ export function createNetworkClient({
136143
});
137144
});
138145

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

149-
const rpcProvider = providerFromMiddleware(rpcApiMiddleware);
160+
const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);
150161

151162
const blockTracker = createBlockTracker({
152163
networkClientType: configuration.type,
@@ -169,11 +180,9 @@ export function createNetworkClient({
169180
rpcApiMiddleware,
170181
});
171182

172-
const engine = new JsonRpcEngine();
173-
174-
engine.push(networkMiddleware);
175-
176-
const provider = new InternalProvider({ engine });
183+
const provider = new InternalProvider({
184+
server: new JsonRpcServer({ middleware: [networkMiddleware] }),
185+
});
177186

178187
const destroy = () => {
179188
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
@@ -240,17 +249,19 @@ function createInfuraNetworkMiddleware({
240249
blockTracker: PollingBlockTracker;
241250
network: InfuraNetworkType;
242251
rpcProvider: InternalProvider;
243-
rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;
252+
rpcApiMiddleware: RpcApiMiddleware;
244253
}) {
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-
]);
254+
return JsonRpcEngineV2.create({
255+
middleware: [
256+
createNetworkAndChainIdMiddleware({ network }),
257+
createBlockCacheMiddleware({ blockTracker }),
258+
createInflightCacheMiddleware(),
259+
createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
260+
createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
261+
createBlockTrackerInspectorMiddleware({ blockTracker }),
262+
rpcApiMiddleware,
263+
],
264+
}).asMiddleware();
254265
}
255266

256267
/**
@@ -272,11 +283,10 @@ function createNetworkAndChainIdMiddleware({
272283

273284
const createChainIdMiddleware = (
274285
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();
286+
): JsonRpcMiddleware<JsonRpcRequest, Json> => {
287+
return ({ request, next }) => {
288+
if (request.method === 'eth_chainId') {
289+
return chainId;
280290
}
281291
return next();
282292
};
@@ -298,21 +308,23 @@ function createCustomNetworkMiddleware({
298308
}: {
299309
blockTracker: PollingBlockTracker;
300310
chainId: Hex;
301-
rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;
302-
}): JsonRpcMiddleware<JsonRpcParams, Json> {
311+
rpcApiMiddleware: RpcApiMiddleware;
312+
}) {
303313
const testMiddlewares = process.env.IN_TEST
304314
? [createEstimateGasDelayTestMiddleware()]
305315
: [];
306316

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

318330
/**
@@ -321,11 +333,14 @@ function createCustomNetworkMiddleware({
321333
*
322334
* @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
323335
*/
324-
function createEstimateGasDelayTestMiddleware() {
325-
return createAsyncMiddleware(async (req, _, next) => {
326-
if (req.method === 'eth_estimateGas') {
336+
function createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<
337+
JsonRpcRequest,
338+
Json
339+
> {
340+
return async ({ request, next }) => {
341+
if (request.method === 'eth_estimateGas') {
327342
await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
328343
}
329344
return next();
330-
});
345+
};
331346
}

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

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

0 commit comments

Comments
 (0)