Skip to content

Commit 9183a6e

Browse files
committed
WIP: refactor: Migrate create-network-client
1 parent df7ff54 commit 9183a6e

File tree

1 file changed

+70
-48
lines changed

1 file changed

+70
-48
lines changed

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

Lines changed: 70 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -17,14 +17,16 @@ import {
1717
providerFromEngine,
1818
providerFromMiddleware,
1919
} from '@metamask/eth-json-rpc-provider';
20+
import { asV2Middleware, JsonRpcEngine } from '@metamask/json-rpc-engine';
2021
import {
21-
createAsyncMiddleware,
2222
createScaffoldMiddleware,
23-
JsonRpcEngine,
24-
mergeMiddleware,
25-
} from '@metamask/json-rpc-engine';
26-
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
27-
import type { Hex, Json, JsonRpcParams } from '@metamask/utils';
23+
JsonRpcEngineV2,
24+
} from '@metamask/json-rpc-engine/v2';
25+
import type {
26+
JsonRpcMiddleware,
27+
MiddlewareContext,
28+
} from '@metamask/json-rpc-engine/v2';
29+
import type { Hex, Json, JsonRpcRequest } from '@metamask/utils';
2830
import type { Logger } from 'loglevel';
2931

3032
import type { NetworkControllerMessenger } from './NetworkController';
@@ -50,6 +52,12 @@ export type NetworkClient = {
5052
destroy: () => void;
5153
};
5254

55+
type RpcApiMiddleware = JsonRpcMiddleware<
56+
JsonRpcRequest,
57+
Json,
58+
MiddlewareContext<{ origin: string }>
59+
>;
60+
5361
/**
5462
* Create a JSON RPC network client for a specific network.
5563
*
@@ -137,16 +145,23 @@ export function createNetworkClient({
137145
});
138146
});
139147

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

164+
// TODO:next Need eth-json-rpc-provider V2 migration
150165
const rpcProvider = providerFromMiddleware(rpcApiMiddleware);
151166

152167
const blockTracker = createBlockTracker({
@@ -170,10 +185,11 @@ export function createNetworkClient({
170185
rpcApiMiddleware,
171186
});
172187

173-
const engine = new JsonRpcEngine();
174-
175-
engine.push(networkMiddleware);
188+
const engine = JsonRpcEngineV2.create({
189+
middleware: [networkMiddleware],
190+
});
176191

192+
// TODO:next Need eth-json-rpc-provider V2 migration
177193
const provider = providerFromEngine(engine);
178194

179195
const destroy = () => {
@@ -241,17 +257,19 @@ function createInfuraNetworkMiddleware({
241257
blockTracker: PollingBlockTracker;
242258
network: InfuraNetworkType;
243259
rpcProvider: SafeEventEmitterProvider;
244-
rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;
260+
rpcApiMiddleware: RpcApiMiddleware;
245261
}) {
246-
return mergeMiddleware([
247-
createNetworkAndChainIdMiddleware({ network }),
248-
createBlockCacheMiddleware({ blockTracker }),
249-
createInflightCacheMiddleware(),
250-
createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
251-
createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
252-
createBlockTrackerInspectorMiddleware({ blockTracker }),
253-
rpcApiMiddleware,
254-
]);
262+
return JsonRpcEngineV2.create({
263+
middleware: [
264+
createNetworkAndChainIdMiddleware({ network }),
265+
createBlockCacheMiddleware({ blockTracker }),
266+
createInflightCacheMiddleware(),
267+
createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),
268+
createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),
269+
createBlockTrackerInspectorMiddleware({ blockTracker }),
270+
rpcApiMiddleware,
271+
],
272+
}).asMiddleware();
255273
}
256274

257275
/**
@@ -275,11 +293,10 @@ function createNetworkAndChainIdMiddleware({
275293

276294
const createChainIdMiddleware = (
277295
chainId: Hex,
278-
): JsonRpcMiddleware<JsonRpcParams, Json> => {
279-
return (req, res, next, end) => {
280-
if (req.method === 'eth_chainId') {
281-
res.result = chainId;
282-
return end();
296+
): JsonRpcMiddleware<JsonRpcRequest, Json> => {
297+
return ({ request, next }) => {
298+
if (request.method === 'eth_chainId') {
299+
return chainId;
283300
}
284301
return next();
285302
};
@@ -301,21 +318,23 @@ function createCustomNetworkMiddleware({
301318
}: {
302319
blockTracker: PollingBlockTracker;
303320
chainId: Hex;
304-
rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;
305-
}): JsonRpcMiddleware<JsonRpcParams, Json> {
321+
rpcApiMiddleware: RpcApiMiddleware;
322+
}) {
306323
const testMiddlewares = process.env.IN_TEST
307324
? [createEstimateGasDelayTestMiddleware()]
308325
: [];
309326

310-
return mergeMiddleware([
311-
...testMiddlewares,
312-
createChainIdMiddleware(chainId),
313-
createBlockRefRewriteMiddleware({ blockTracker }),
314-
createBlockCacheMiddleware({ blockTracker }),
315-
createInflightCacheMiddleware(),
316-
createBlockTrackerInspectorMiddleware({ blockTracker }),
317-
rpcApiMiddleware,
318-
]);
327+
return JsonRpcEngineV2.create({
328+
middleware: [
329+
...testMiddlewares,
330+
createChainIdMiddleware(chainId),
331+
createBlockRefRewriteMiddleware({ blockTracker }),
332+
createBlockCacheMiddleware({ blockTracker }),
333+
createInflightCacheMiddleware(),
334+
createBlockTrackerInspectorMiddleware({ blockTracker }),
335+
rpcApiMiddleware,
336+
],
337+
}).asMiddleware();
319338
}
320339

321340
/**
@@ -324,11 +343,14 @@ function createCustomNetworkMiddleware({
324343
*
325344
* @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
326345
*/
327-
function createEstimateGasDelayTestMiddleware() {
328-
return createAsyncMiddleware(async (req, _, next) => {
329-
if (req.method === 'eth_estimateGas') {
346+
function createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<
347+
JsonRpcRequest,
348+
Json
349+
> {
350+
return async ({ request, next }) => {
351+
if (request.method === 'eth_estimateGas') {
330352
await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
331353
}
332354
return next();
333-
});
355+
};
334356
}

0 commit comments

Comments
 (0)