@metamask/network-controller 25.0.0 → 27.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -1
- package/dist/NetworkController.cjs +83 -114
- package/dist/NetworkController.cjs.map +1 -1
- package/dist/NetworkController.d.cts +136 -27
- package/dist/NetworkController.d.cts.map +1 -1
- package/dist/NetworkController.d.mts +136 -27
- package/dist/NetworkController.d.mts.map +1 -1
- package/dist/NetworkController.mjs +84 -115
- package/dist/NetworkController.mjs.map +1 -1
- package/dist/constants.cjs +18 -10
- package/dist/constants.cjs.map +1 -1
- package/dist/constants.d.cts +18 -10
- package/dist/constants.d.cts.map +1 -1
- package/dist/constants.d.mts +18 -10
- package/dist/constants.d.mts.map +1 -1
- package/dist/constants.mjs +18 -10
- package/dist/constants.mjs.map +1 -1
- package/dist/create-auto-managed-network-client.cjs +4 -3
- package/dist/create-auto-managed-network-client.cjs.map +1 -1
- package/dist/create-auto-managed-network-client.d.cts +5 -2
- package/dist/create-auto-managed-network-client.d.cts.map +1 -1
- package/dist/create-auto-managed-network-client.d.mts +5 -2
- package/dist/create-auto-managed-network-client.d.mts.map +1 -1
- package/dist/create-auto-managed-network-client.mjs +4 -3
- package/dist/create-auto-managed-network-client.mjs.map +1 -1
- package/dist/create-network-client.cjs +177 -78
- package/dist/create-network-client.cjs.map +1 -1
- package/dist/create-network-client.d.cts +5 -2
- package/dist/create-network-client.d.cts.map +1 -1
- package/dist/create-network-client.d.mts +5 -2
- package/dist/create-network-client.d.mts.map +1 -1
- package/dist/create-network-client.mjs +178 -79
- package/dist/create-network-client.mjs.map +1 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/rpc-service/rpc-service-chain.cjs +247 -39
- package/dist/rpc-service/rpc-service-chain.cjs.map +1 -1
- package/dist/rpc-service/rpc-service-chain.d.cts +108 -27
- package/dist/rpc-service/rpc-service-chain.d.cts.map +1 -1
- package/dist/rpc-service/rpc-service-chain.d.mts +108 -27
- package/dist/rpc-service/rpc-service-chain.d.mts.map +1 -1
- package/dist/rpc-service/rpc-service-chain.mjs +247 -39
- package/dist/rpc-service/rpc-service-chain.mjs.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.cjs.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.d.cts +16 -6
- package/dist/rpc-service/rpc-service-requestable.d.cts.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.d.mts +16 -6
- package/dist/rpc-service/rpc-service-requestable.d.mts.map +1 -1
- package/dist/rpc-service/rpc-service-requestable.mjs.map +1 -1
- package/dist/rpc-service/rpc-service.cjs +68 -34
- package/dist/rpc-service/rpc-service.cjs.map +1 -1
- package/dist/rpc-service/rpc-service.d.cts +33 -24
- package/dist/rpc-service/rpc-service.d.cts.map +1 -1
- package/dist/rpc-service/rpc-service.d.mts +33 -24
- package/dist/rpc-service/rpc-service.d.mts.map +1 -1
- package/dist/rpc-service/rpc-service.mjs +69 -35
- package/dist/rpc-service/rpc-service.mjs.map +1 -1
- package/dist/rpc-service/shared.cjs.map +1 -1
- package/dist/rpc-service/shared.d.cts +25 -3
- package/dist/rpc-service/shared.d.cts.map +1 -1
- package/dist/rpc-service/shared.d.mts +25 -3
- package/dist/rpc-service/shared.d.mts.map +1 -1
- package/dist/rpc-service/shared.mjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +6 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.mts +6 -2
- package/dist/types.d.mts.map +1 -1
- package/dist/types.mjs.map +1 -1
- package/package.json +13 -11
|
@@ -6,7 +6,9 @@ const eth_block_tracker_1 = require("@metamask/eth-block-tracker");
|
|
|
6
6
|
const eth_json_rpc_infura_1 = require("@metamask/eth-json-rpc-infura");
|
|
7
7
|
const eth_json_rpc_middleware_1 = require("@metamask/eth-json-rpc-middleware");
|
|
8
8
|
const eth_json_rpc_provider_1 = require("@metamask/eth-json-rpc-provider");
|
|
9
|
+
const eth_json_rpc_provider_2 = require("@metamask/eth-json-rpc-provider");
|
|
9
10
|
const json_rpc_engine_1 = require("@metamask/json-rpc-engine");
|
|
11
|
+
const v2_1 = require("@metamask/json-rpc-engine/v2");
|
|
10
12
|
const rpc_service_chain_1 = require("./rpc-service/rpc-service-chain.cjs");
|
|
11
13
|
const types_1 = require("./types.cjs");
|
|
12
14
|
const SECOND = 1000;
|
|
@@ -14,6 +16,8 @@ const SECOND = 1000;
|
|
|
14
16
|
* Create a JSON RPC network client for a specific network.
|
|
15
17
|
*
|
|
16
18
|
* @param args - The arguments.
|
|
19
|
+
* @param args.id - The ID that will be assigned to the new network client in
|
|
20
|
+
* the registry.
|
|
17
21
|
* @param args.configuration - The network configuration.
|
|
18
22
|
* @param args.getRpcServiceOptions - Factory for constructing RPC service
|
|
19
23
|
* options. See {@link NetworkControllerOptions.getRpcServiceOptions}.
|
|
@@ -28,62 +32,32 @@ const SECOND = 1000;
|
|
|
28
32
|
* @param args.logger - A `loglevel` logger.
|
|
29
33
|
* @returns The network client.
|
|
30
34
|
*/
|
|
31
|
-
function createNetworkClient({ configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, isRpcFailoverEnabled, logger, }) {
|
|
35
|
+
function createNetworkClient({ id, configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, isRpcFailoverEnabled, logger, }) {
|
|
32
36
|
const primaryEndpointUrl = configuration.type === types_1.NetworkClientType.Infura
|
|
33
37
|
? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`
|
|
34
38
|
: configuration.rpcUrl;
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
39
|
+
const rpcServiceChain = createRpcServiceChain({
|
|
40
|
+
id,
|
|
41
|
+
primaryEndpointUrl,
|
|
42
|
+
configuration,
|
|
43
|
+
getRpcServiceOptions,
|
|
44
|
+
messenger,
|
|
45
|
+
isRpcFailoverEnabled,
|
|
41
46
|
logger,
|
|
42
|
-
})));
|
|
43
|
-
rpcServiceChain.onBreak(({ endpointUrl, failoverEndpointUrl, ...rest }) => {
|
|
44
|
-
let error;
|
|
45
|
-
if ('error' in rest) {
|
|
46
|
-
error = rest.error;
|
|
47
|
-
}
|
|
48
|
-
else if ('value' in rest) {
|
|
49
|
-
error = rest.value;
|
|
50
|
-
}
|
|
51
|
-
messenger.publish('NetworkController:rpcEndpointUnavailable', {
|
|
52
|
-
chainId: configuration.chainId,
|
|
53
|
-
endpointUrl,
|
|
54
|
-
failoverEndpointUrl,
|
|
55
|
-
error,
|
|
56
|
-
});
|
|
57
|
-
});
|
|
58
|
-
rpcServiceChain.onDegraded(({ endpointUrl, ...rest }) => {
|
|
59
|
-
let error;
|
|
60
|
-
if ('error' in rest) {
|
|
61
|
-
error = rest.error;
|
|
62
|
-
}
|
|
63
|
-
else if ('value' in rest) {
|
|
64
|
-
error = rest.value;
|
|
65
|
-
}
|
|
66
|
-
messenger.publish('NetworkController:rpcEndpointDegraded', {
|
|
67
|
-
chainId: configuration.chainId,
|
|
68
|
-
endpointUrl,
|
|
69
|
-
error,
|
|
70
|
-
});
|
|
71
|
-
});
|
|
72
|
-
rpcServiceChain.onRetry(({ endpointUrl, attempt }) => {
|
|
73
|
-
messenger.publish('NetworkController:rpcEndpointRequestRetried', {
|
|
74
|
-
endpointUrl,
|
|
75
|
-
attempt,
|
|
76
|
-
});
|
|
77
47
|
});
|
|
78
|
-
|
|
79
|
-
|
|
48
|
+
let rpcApiMiddleware;
|
|
49
|
+
if (configuration.type === types_1.NetworkClientType.Infura) {
|
|
50
|
+
rpcApiMiddleware = (0, json_rpc_engine_1.asV2Middleware)((0, eth_json_rpc_infura_1.createInfuraMiddleware)({
|
|
80
51
|
rpcService: rpcServiceChain,
|
|
81
52
|
options: {
|
|
82
53
|
source: 'metamask',
|
|
83
54
|
},
|
|
84
|
-
})
|
|
85
|
-
|
|
86
|
-
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
rpcApiMiddleware = (0, eth_json_rpc_middleware_1.createFetchMiddleware)({ rpcService: rpcServiceChain });
|
|
59
|
+
}
|
|
60
|
+
const rpcProvider = (0, eth_json_rpc_provider_2.providerFromMiddlewareV2)(rpcApiMiddleware);
|
|
87
61
|
const blockTracker = createBlockTracker({
|
|
88
62
|
networkClientType: configuration.type,
|
|
89
63
|
endpointUrl: primaryEndpointUrl,
|
|
@@ -102,9 +76,11 @@ function createNetworkClient({ configuration, getRpcServiceOptions, getBlockTrac
|
|
|
102
76
|
chainId: configuration.chainId,
|
|
103
77
|
rpcApiMiddleware,
|
|
104
78
|
});
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
79
|
+
const provider = new eth_json_rpc_provider_1.InternalProvider({
|
|
80
|
+
engine: v2_1.JsonRpcEngineV2.create({
|
|
81
|
+
middleware: [networkMiddleware],
|
|
82
|
+
}),
|
|
83
|
+
});
|
|
108
84
|
const destroy = () => {
|
|
109
85
|
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
110
86
|
// eslint-disable-next-line @typescript-eslint/no-floating-promises
|
|
@@ -113,6 +89,128 @@ function createNetworkClient({ configuration, getRpcServiceOptions, getBlockTrac
|
|
|
113
89
|
return { configuration, provider, blockTracker, destroy };
|
|
114
90
|
}
|
|
115
91
|
exports.createNetworkClient = createNetworkClient;
|
|
92
|
+
/**
|
|
93
|
+
* Creates an RPC service chain, which represents the primary endpoint URL for
|
|
94
|
+
* the network as well as its failover URLs.
|
|
95
|
+
*
|
|
96
|
+
* @param args - The arguments.
|
|
97
|
+
* @param args.id - The ID that will be assigned to the new network client in
|
|
98
|
+
* the registry.
|
|
99
|
+
* @param args.primaryEndpointUrl - The primary endpoint URL.
|
|
100
|
+
* @param args.configuration - The network configuration.
|
|
101
|
+
* @param args.getRpcServiceOptions - Factory for constructing RPC service
|
|
102
|
+
* options. See {@link NetworkControllerOptions.getRpcServiceOptions}.
|
|
103
|
+
* @param args.messenger - The network controller messenger.
|
|
104
|
+
* @param args.isRpcFailoverEnabled - Whether or not requests sent to the
|
|
105
|
+
* primary RPC endpoint for this network should be automatically diverted to
|
|
106
|
+
* provided failover endpoints if the primary is unavailable. This effectively
|
|
107
|
+
* causes the `failoverRpcUrls` property of the network client configuration
|
|
108
|
+
* to be honored or ignored.
|
|
109
|
+
* @param args.logger - A `loglevel` logger.
|
|
110
|
+
* @returns The RPC service chain.
|
|
111
|
+
*/
|
|
112
|
+
function createRpcServiceChain({ id, primaryEndpointUrl, configuration, getRpcServiceOptions, messenger, isRpcFailoverEnabled, logger, }) {
|
|
113
|
+
const availableEndpointUrls = isRpcFailoverEnabled
|
|
114
|
+
? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]
|
|
115
|
+
: [primaryEndpointUrl];
|
|
116
|
+
const rpcServiceConfigurations = availableEndpointUrls.map((endpointUrl) => ({
|
|
117
|
+
...getRpcServiceOptions(endpointUrl),
|
|
118
|
+
endpointUrl,
|
|
119
|
+
logger,
|
|
120
|
+
}));
|
|
121
|
+
/**
|
|
122
|
+
* Extracts the error from Cockatiel's `FailureReason` type received in
|
|
123
|
+
* circuit breaker event handlers.
|
|
124
|
+
*
|
|
125
|
+
* The `FailureReason` object can have two possible shapes:
|
|
126
|
+
* - `{ error: Error }` - When the RPC service throws an error (the common
|
|
127
|
+
* case for RPC failures).
|
|
128
|
+
* - `{ value: T }` - When the RPC service returns a value that the retry
|
|
129
|
+
* filter policy considers a failure.
|
|
130
|
+
*
|
|
131
|
+
* @param value - The event data object from the circuit breaker event
|
|
132
|
+
* listener (after destructuring known properties like `endpointUrl`). This
|
|
133
|
+
* represents Cockatiel's `FailureReason` type.
|
|
134
|
+
* @returns The error or failure value, or `undefined` if neither property
|
|
135
|
+
* exists (which shouldn't happen in practice unless the circuit breaker is
|
|
136
|
+
* manually isolated).
|
|
137
|
+
*/
|
|
138
|
+
const getError = (value) => {
|
|
139
|
+
if ('error' in value) {
|
|
140
|
+
return value.error;
|
|
141
|
+
}
|
|
142
|
+
else if ('value' in value) {
|
|
143
|
+
return value.value;
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
};
|
|
147
|
+
const rpcServiceChain = new rpc_service_chain_1.RpcServiceChain([
|
|
148
|
+
rpcServiceConfigurations[0],
|
|
149
|
+
...rpcServiceConfigurations.slice(1),
|
|
150
|
+
]);
|
|
151
|
+
rpcServiceChain.onBreak((data) => {
|
|
152
|
+
const error = getError(data);
|
|
153
|
+
if (error === undefined) {
|
|
154
|
+
// This error shouldn't happen in practice because we never call `.isolate`
|
|
155
|
+
// on the circuit breaker policy, but we need to appease TypeScript.
|
|
156
|
+
throw new Error('Could not make request to endpoint.');
|
|
157
|
+
}
|
|
158
|
+
messenger.publish('NetworkController:rpcEndpointChainUnavailable', {
|
|
159
|
+
chainId: configuration.chainId,
|
|
160
|
+
networkClientId: id,
|
|
161
|
+
error,
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
rpcServiceChain.onServiceBreak(({ endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, ...rest }) => {
|
|
165
|
+
const error = getError(rest);
|
|
166
|
+
if (error === undefined) {
|
|
167
|
+
// This error shouldn't happen in practice because we never call `.isolate`
|
|
168
|
+
// on the circuit breaker policy, but we need to appease TypeScript.
|
|
169
|
+
throw new Error('Could not make request to endpoint.');
|
|
170
|
+
}
|
|
171
|
+
messenger.publish('NetworkController:rpcEndpointUnavailable', {
|
|
172
|
+
chainId: configuration.chainId,
|
|
173
|
+
networkClientId: id,
|
|
174
|
+
primaryEndpointUrl: primaryEndpointUrlFromEvent,
|
|
175
|
+
endpointUrl,
|
|
176
|
+
error,
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
rpcServiceChain.onDegraded((data) => {
|
|
180
|
+
const error = getError(data);
|
|
181
|
+
messenger.publish('NetworkController:rpcEndpointChainDegraded', {
|
|
182
|
+
chainId: configuration.chainId,
|
|
183
|
+
networkClientId: id,
|
|
184
|
+
error,
|
|
185
|
+
});
|
|
186
|
+
});
|
|
187
|
+
rpcServiceChain.onServiceDegraded(({ endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, ...rest }) => {
|
|
188
|
+
const error = getError(rest);
|
|
189
|
+
messenger.publish('NetworkController:rpcEndpointDegraded', {
|
|
190
|
+
chainId: configuration.chainId,
|
|
191
|
+
networkClientId: id,
|
|
192
|
+
primaryEndpointUrl: primaryEndpointUrlFromEvent,
|
|
193
|
+
endpointUrl,
|
|
194
|
+
error,
|
|
195
|
+
});
|
|
196
|
+
});
|
|
197
|
+
rpcServiceChain.onAvailable(() => {
|
|
198
|
+
messenger.publish('NetworkController:rpcEndpointChainAvailable', {
|
|
199
|
+
chainId: configuration.chainId,
|
|
200
|
+
networkClientId: id,
|
|
201
|
+
});
|
|
202
|
+
});
|
|
203
|
+
rpcServiceChain.onServiceRetry(({ attempt, endpointUrl, primaryEndpointUrl: primaryEndpointUrlFromEvent, }) => {
|
|
204
|
+
messenger.publish('NetworkController:rpcEndpointRetried', {
|
|
205
|
+
chainId: configuration.chainId,
|
|
206
|
+
networkClientId: id,
|
|
207
|
+
primaryEndpointUrl: primaryEndpointUrlFromEvent,
|
|
208
|
+
endpointUrl,
|
|
209
|
+
attempt,
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
return rpcServiceChain;
|
|
213
|
+
}
|
|
116
214
|
/**
|
|
117
215
|
* Create the block tracker for the network.
|
|
118
216
|
*
|
|
@@ -146,15 +244,17 @@ function createBlockTracker({ networkClientType, endpointUrl, getOptions, provid
|
|
|
146
244
|
* @returns The collection of middleware that makes up the Infura client.
|
|
147
245
|
*/
|
|
148
246
|
function createInfuraNetworkMiddleware({ blockTracker, network, rpcProvider, rpcApiMiddleware, }) {
|
|
149
|
-
return
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
247
|
+
return v2_1.JsonRpcEngineV2.create({
|
|
248
|
+
middleware: [
|
|
249
|
+
createNetworkAndChainIdMiddleware({ network }),
|
|
250
|
+
(0, eth_json_rpc_middleware_1.createBlockCacheMiddleware)({ blockTracker }),
|
|
251
|
+
(0, eth_json_rpc_middleware_1.createInflightCacheMiddleware)(),
|
|
252
|
+
(0, eth_json_rpc_middleware_1.createBlockRefMiddleware)({ blockTracker, provider: rpcProvider }),
|
|
253
|
+
(0, eth_json_rpc_middleware_1.createRetryOnEmptyMiddleware)({ blockTracker, provider: rpcProvider }),
|
|
254
|
+
(0, eth_json_rpc_middleware_1.createBlockTrackerInspectorMiddleware)({ blockTracker }),
|
|
255
|
+
rpcApiMiddleware,
|
|
256
|
+
],
|
|
257
|
+
}).asMiddleware();
|
|
158
258
|
}
|
|
159
259
|
/**
|
|
160
260
|
* Creates static method middleware.
|
|
@@ -164,17 +264,14 @@ function createInfuraNetworkMiddleware({ blockTracker, network, rpcProvider, rpc
|
|
|
164
264
|
* @returns The middleware that implements the eth_chainId method.
|
|
165
265
|
*/
|
|
166
266
|
function createNetworkAndChainIdMiddleware({ network, }) {
|
|
167
|
-
return (0,
|
|
168
|
-
// TODO: Either fix this lint violation or explain why it's necessary to ignore.
|
|
169
|
-
// eslint-disable-next-line @typescript-eslint/naming-convention
|
|
267
|
+
return (0, v2_1.createScaffoldMiddleware)({
|
|
170
268
|
eth_chainId: controller_utils_1.ChainId[network],
|
|
171
269
|
});
|
|
172
270
|
}
|
|
173
271
|
const createChainIdMiddleware = (chainId) => {
|
|
174
|
-
return (
|
|
175
|
-
if (
|
|
176
|
-
|
|
177
|
-
return end();
|
|
272
|
+
return ({ request, next }) => {
|
|
273
|
+
if (request.method === 'eth_chainId') {
|
|
274
|
+
return chainId;
|
|
178
275
|
}
|
|
179
276
|
return next();
|
|
180
277
|
};
|
|
@@ -192,15 +289,17 @@ function createCustomNetworkMiddleware({ blockTracker, chainId, rpcApiMiddleware
|
|
|
192
289
|
const testMiddlewares = process.env.IN_TEST
|
|
193
290
|
? [createEstimateGasDelayTestMiddleware()]
|
|
194
291
|
: [];
|
|
195
|
-
return
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
292
|
+
return v2_1.JsonRpcEngineV2.create({
|
|
293
|
+
middleware: [
|
|
294
|
+
...testMiddlewares,
|
|
295
|
+
createChainIdMiddleware(chainId),
|
|
296
|
+
(0, eth_json_rpc_middleware_1.createBlockRefRewriteMiddleware)({ blockTracker }),
|
|
297
|
+
(0, eth_json_rpc_middleware_1.createBlockCacheMiddleware)({ blockTracker }),
|
|
298
|
+
(0, eth_json_rpc_middleware_1.createInflightCacheMiddleware)(),
|
|
299
|
+
(0, eth_json_rpc_middleware_1.createBlockTrackerInspectorMiddleware)({ blockTracker }),
|
|
300
|
+
rpcApiMiddleware,
|
|
301
|
+
],
|
|
302
|
+
}).asMiddleware();
|
|
204
303
|
}
|
|
205
304
|
/**
|
|
206
305
|
* For use in tests only.
|
|
@@ -209,11 +308,11 @@ function createCustomNetworkMiddleware({ blockTracker, chainId, rpcApiMiddleware
|
|
|
209
308
|
* @returns The middleware for delaying gas estimation calls by 2 seconds when in test.
|
|
210
309
|
*/
|
|
211
310
|
function createEstimateGasDelayTestMiddleware() {
|
|
212
|
-
return
|
|
213
|
-
if (
|
|
311
|
+
return async ({ request, next }) => {
|
|
312
|
+
if (request.method === 'eth_estimateGas') {
|
|
214
313
|
await new Promise((resolve) => setTimeout(resolve, SECOND * 2));
|
|
215
314
|
}
|
|
216
315
|
return next();
|
|
217
|
-
}
|
|
316
|
+
};
|
|
218
317
|
}
|
|
219
318
|
//# sourceMappingURL=create-network-client.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-network-client.cjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type { InfuraNetworkType } from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\nimport type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';\nimport {\n providerFromEngine,\n providerFromMiddleware,\n} from '@metamask/eth-json-rpc-provider';\nimport {\n createAsyncMiddleware,\n createScaffoldMiddleware,\n JsonRpcEngine,\n mergeMiddleware,\n} from '@metamask/json-rpc-engine';\nimport type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';\nimport type { Hex, Json, JsonRpcParams } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type { NetworkControllerMessenger } from './NetworkController';\nimport type { RpcServiceOptions } from './rpc-service/rpc-service';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param args - The arguments.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.getBlockTrackerOptions - Factory for constructing block tracker\n * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The network client.\n */\nexport function createNetworkClient({\n configuration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): NetworkClient {\n const primaryEndpointUrl =\n configuration.type === NetworkClientType.Infura\n ? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`\n : configuration.rpcUrl;\n const availableEndpointUrls = isRpcFailoverEnabled\n ? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]\n : [primaryEndpointUrl];\n const rpcServiceChain = new RpcServiceChain(\n availableEndpointUrls.map((endpointUrl) => ({\n ...getRpcServiceOptions(endpointUrl),\n endpointUrl,\n logger,\n })),\n );\n rpcServiceChain.onBreak(({ endpointUrl, failoverEndpointUrl, ...rest }) => {\n let error: unknown;\n if ('error' in rest) {\n error = rest.error;\n } else if ('value' in rest) {\n error = rest.value;\n }\n\n messenger.publish('NetworkController:rpcEndpointUnavailable', {\n chainId: configuration.chainId,\n endpointUrl,\n failoverEndpointUrl,\n error,\n });\n });\n rpcServiceChain.onDegraded(({ endpointUrl, ...rest }) => {\n let error: unknown;\n if ('error' in rest) {\n error = rest.error;\n } else if ('value' in rest) {\n error = rest.value;\n }\n\n messenger.publish('NetworkController:rpcEndpointDegraded', {\n chainId: configuration.chainId,\n endpointUrl,\n error,\n });\n });\n rpcServiceChain.onRetry(({ endpointUrl, attempt }) => {\n messenger.publish('NetworkController:rpcEndpointRequestRetried', {\n endpointUrl,\n attempt,\n });\n });\n\n const rpcApiMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraMiddleware({\n rpcService: rpcServiceChain,\n options: {\n source: 'metamask',\n },\n })\n : createFetchMiddleware({ rpcService: rpcServiceChain });\n\n const rpcProvider = providerFromMiddleware(rpcApiMiddleware);\n\n const blockTracker = createBlockTracker({\n networkClientType: configuration.type,\n endpointUrl: primaryEndpointUrl,\n getOptions: getBlockTrackerOptions,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: configuration.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: configuration.chainId,\n rpcApiMiddleware,\n });\n\n const engine = new JsonRpcEngine();\n\n engine.push(networkMiddleware);\n\n const provider = providerFromEngine(engine);\n\n const destroy = () => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n blockTracker.destroy();\n };\n\n return { configuration, provider, blockTracker, destroy };\n}\n\n/**\n * Create the block tracker for the network.\n *\n * @param args - The arguments.\n * @param args.networkClientType - The type of the network client (\"infura\" or\n * \"custom\").\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.getOptions - Factory for the block tracker options.\n * @param args.provider - The EIP-1193 provider for the network's JSON-RPC\n * middleware stack.\n * @returns The created block tracker.\n */\nfunction createBlockTracker({\n networkClientType,\n endpointUrl,\n getOptions,\n provider,\n}: {\n networkClientType: NetworkClientType;\n endpointUrl: string;\n getOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n provider: SafeEventEmitterProvider;\n}) {\n const testOptions =\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? { pollingInterval: SECOND }\n : {};\n\n return new PollingBlockTracker({\n ...testOptions,\n ...getOptions(endpointUrl),\n provider,\n });\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: SafeEventEmitterProvider;\n rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;\n}) {\n return mergeMiddleware([\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}) {\n return createScaffoldMiddleware({\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/naming-convention\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcParams, Json> => {\n return (req, res, next, end) => {\n if (req.method === 'eth_chainId') {\n res.result = chainId;\n return end();\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: JsonRpcMiddleware<JsonRpcParams, Json>;\n}): JsonRpcMiddleware<JsonRpcParams, Json> {\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return mergeMiddleware([\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ]);\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware() {\n return createAsyncMiddleware(async (req, _, next) => {\n if (req.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"create-network-client.cjs","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n CockatielFailureReason,\n InfuraNetworkType,\n} from '@metamask/controller-utils';\nimport { ChainId } from '@metamask/controller-utils';\nimport type { PollingBlockTrackerOptions } from '@metamask/eth-block-tracker';\nimport { PollingBlockTracker } from '@metamask/eth-block-tracker';\nimport { createInfuraMiddleware } from '@metamask/eth-json-rpc-infura';\nimport {\n createBlockCacheMiddleware,\n createBlockRefMiddleware,\n createBlockRefRewriteMiddleware,\n createBlockTrackerInspectorMiddleware,\n createInflightCacheMiddleware,\n createFetchMiddleware,\n createRetryOnEmptyMiddleware,\n} from '@metamask/eth-json-rpc-middleware';\nimport { InternalProvider } from '@metamask/eth-json-rpc-provider';\nimport { providerFromMiddlewareV2 } from '@metamask/eth-json-rpc-provider';\nimport { asV2Middleware } from '@metamask/json-rpc-engine';\nimport {\n createScaffoldMiddleware,\n JsonRpcEngineV2,\n} from '@metamask/json-rpc-engine/v2';\nimport type {\n JsonRpcMiddleware,\n MiddlewareContext,\n} from '@metamask/json-rpc-engine/v2';\nimport type { Hex, Json, JsonRpcRequest } from '@metamask/utils';\nimport type { Logger } from 'loglevel';\n\nimport type {\n NetworkClientId,\n NetworkControllerMessenger,\n} from './NetworkController';\nimport type { RpcServiceOptions } from './rpc-service/rpc-service';\nimport { RpcServiceChain } from './rpc-service/rpc-service-chain';\nimport type {\n BlockTracker,\n NetworkClientConfiguration,\n Provider,\n} from './types';\nimport { NetworkClientType } from './types';\n\nconst SECOND = 1000;\n\n/**\n * The pair of provider / block tracker that can be used to interface with the\n * network and respond to new activity.\n */\nexport type NetworkClient = {\n configuration: NetworkClientConfiguration;\n provider: Provider;\n blockTracker: BlockTracker;\n destroy: () => void;\n};\n\ntype RpcApiMiddleware = JsonRpcMiddleware<\n JsonRpcRequest,\n Json,\n MiddlewareContext<{ origin: string }>\n>;\n\n/**\n * Create a JSON RPC network client for a specific network.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.getBlockTrackerOptions - Factory for constructing block tracker\n * options. See {@link NetworkControllerOptions.getBlockTrackerOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The network client.\n */\nexport function createNetworkClient({\n id,\n configuration,\n getRpcServiceOptions,\n getBlockTrackerOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n getBlockTrackerOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}): NetworkClient {\n const primaryEndpointUrl =\n configuration.type === NetworkClientType.Infura\n ? `https://${configuration.network}.infura.io/v3/${configuration.infuraProjectId}`\n : configuration.rpcUrl;\n const rpcServiceChain = createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n });\n\n let rpcApiMiddleware: RpcApiMiddleware;\n if (configuration.type === NetworkClientType.Infura) {\n rpcApiMiddleware = asV2Middleware(\n createInfuraMiddleware({\n rpcService: rpcServiceChain,\n options: {\n source: 'metamask',\n },\n }),\n );\n } else {\n rpcApiMiddleware = createFetchMiddleware({ rpcService: rpcServiceChain });\n }\n\n const rpcProvider = providerFromMiddlewareV2(rpcApiMiddleware);\n\n const blockTracker = createBlockTracker({\n networkClientType: configuration.type,\n endpointUrl: primaryEndpointUrl,\n getOptions: getBlockTrackerOptions,\n provider: rpcProvider,\n });\n\n const networkMiddleware =\n configuration.type === NetworkClientType.Infura\n ? createInfuraNetworkMiddleware({\n blockTracker,\n network: configuration.network,\n rpcProvider,\n rpcApiMiddleware,\n })\n : createCustomNetworkMiddleware({\n blockTracker,\n chainId: configuration.chainId,\n rpcApiMiddleware,\n });\n\n const provider: Provider = new InternalProvider({\n engine: JsonRpcEngineV2.create({\n middleware: [networkMiddleware],\n }),\n });\n\n const destroy = () => {\n // TODO: Either fix this lint violation or explain why it's necessary to ignore.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n blockTracker.destroy();\n };\n\n return { configuration, provider, blockTracker, destroy };\n}\n\n/**\n * Creates an RPC service chain, which represents the primary endpoint URL for\n * the network as well as its failover URLs.\n *\n * @param args - The arguments.\n * @param args.id - The ID that will be assigned to the new network client in\n * the registry.\n * @param args.primaryEndpointUrl - The primary endpoint URL.\n * @param args.configuration - The network configuration.\n * @param args.getRpcServiceOptions - Factory for constructing RPC service\n * options. See {@link NetworkControllerOptions.getRpcServiceOptions}.\n * @param args.messenger - The network controller messenger.\n * @param args.isRpcFailoverEnabled - Whether or not requests sent to the\n * primary RPC endpoint for this network should be automatically diverted to\n * provided failover endpoints if the primary is unavailable. This effectively\n * causes the `failoverRpcUrls` property of the network client configuration\n * to be honored or ignored.\n * @param args.logger - A `loglevel` logger.\n * @returns The RPC service chain.\n */\nfunction createRpcServiceChain({\n id,\n primaryEndpointUrl,\n configuration,\n getRpcServiceOptions,\n messenger,\n isRpcFailoverEnabled,\n logger,\n}: {\n id: NetworkClientId;\n primaryEndpointUrl: string;\n configuration: NetworkClientConfiguration;\n getRpcServiceOptions: (\n rpcEndpointUrl: string,\n ) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;\n messenger: NetworkControllerMessenger;\n isRpcFailoverEnabled: boolean;\n logger?: Logger;\n}) {\n const availableEndpointUrls: [string, ...string[]] = isRpcFailoverEnabled\n ? [primaryEndpointUrl, ...(configuration.failoverRpcUrls ?? [])]\n : [primaryEndpointUrl];\n const rpcServiceConfigurations = availableEndpointUrls.map((endpointUrl) => ({\n ...getRpcServiceOptions(endpointUrl),\n endpointUrl,\n logger,\n }));\n\n /**\n * Extracts the error from Cockatiel's `FailureReason` type received in\n * circuit breaker event handlers.\n *\n * The `FailureReason` object can have two possible shapes:\n * - `{ error: Error }` - When the RPC service throws an error (the common\n * case for RPC failures).\n * - `{ value: T }` - When the RPC service returns a value that the retry\n * filter policy considers a failure.\n *\n * @param value - The event data object from the circuit breaker event\n * listener (after destructuring known properties like `endpointUrl`). This\n * represents Cockatiel's `FailureReason` type.\n * @returns The error or failure value, or `undefined` if neither property\n * exists (which shouldn't happen in practice unless the circuit breaker is\n * manually isolated).\n */\n const getError = (\n value: CockatielFailureReason<unknown> | Record<never, never>,\n ) => {\n if ('error' in value) {\n return value.error;\n } else if ('value' in value) {\n return value.value;\n }\n return undefined;\n };\n\n const rpcServiceChain = new RpcServiceChain([\n rpcServiceConfigurations[0],\n ...rpcServiceConfigurations.slice(1),\n ]);\n\n rpcServiceChain.onBreak((data) => {\n const error = getError(data);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointChainUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n });\n });\n\n rpcServiceChain.onServiceBreak(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n ...rest\n }) => {\n const error = getError(rest);\n\n if (error === undefined) {\n // This error shouldn't happen in practice because we never call `.isolate`\n // on the circuit breaker policy, but we need to appease TypeScript.\n throw new Error('Could not make request to endpoint.');\n }\n\n messenger.publish('NetworkController:rpcEndpointUnavailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n });\n },\n );\n\n rpcServiceChain.onDegraded((data) => {\n const error = getError(data);\n messenger.publish('NetworkController:rpcEndpointChainDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n error,\n });\n });\n\n rpcServiceChain.onServiceDegraded(\n ({\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n ...rest\n }) => {\n const error = getError(rest);\n messenger.publish('NetworkController:rpcEndpointDegraded', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n error,\n });\n },\n );\n\n rpcServiceChain.onAvailable(() => {\n messenger.publish('NetworkController:rpcEndpointChainAvailable', {\n chainId: configuration.chainId,\n networkClientId: id,\n });\n });\n\n rpcServiceChain.onServiceRetry(\n ({\n attempt,\n endpointUrl,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n }) => {\n messenger.publish('NetworkController:rpcEndpointRetried', {\n chainId: configuration.chainId,\n networkClientId: id,\n primaryEndpointUrl: primaryEndpointUrlFromEvent,\n endpointUrl,\n attempt,\n });\n },\n );\n\n return rpcServiceChain;\n}\n\n/**\n * Create the block tracker for the network.\n *\n * @param args - The arguments.\n * @param args.networkClientType - The type of the network client (\"infura\" or\n * \"custom\").\n * @param args.endpointUrl - The URL of the endpoint.\n * @param args.getOptions - Factory for the block tracker options.\n * @param args.provider - The EIP-1193 provider for the network's JSON-RPC\n * middleware stack.\n * @returns The created block tracker.\n */\nfunction createBlockTracker({\n networkClientType,\n endpointUrl,\n getOptions,\n provider,\n}: {\n networkClientType: NetworkClientType;\n endpointUrl: string;\n getOptions: (\n rpcEndpointUrl: string,\n ) => Omit<PollingBlockTrackerOptions, 'provider'>;\n provider: InternalProvider;\n}) {\n const testOptions =\n process.env.IN_TEST && networkClientType === NetworkClientType.Custom\n ? { pollingInterval: SECOND }\n : {};\n\n return new PollingBlockTracker({\n ...testOptions,\n ...getOptions(endpointUrl),\n provider,\n });\n}\n\n/**\n * Create middleware for infura.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.network - The Infura network to use.\n * @param args.rpcProvider - The RPC provider to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createInfuraNetworkMiddleware({\n blockTracker,\n network,\n rpcProvider,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n network: InfuraNetworkType;\n rpcProvider: InternalProvider;\n rpcApiMiddleware: RpcApiMiddleware;\n}) {\n return JsonRpcEngineV2.create({\n middleware: [\n createNetworkAndChainIdMiddleware({ network }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockRefMiddleware({ blockTracker, provider: rpcProvider }),\n createRetryOnEmptyMiddleware({ blockTracker, provider: rpcProvider }),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * Creates static method middleware.\n *\n * @param args - The Arguments.\n * @param args.network - The Infura network to use.\n * @returns The middleware that implements the eth_chainId method.\n */\nfunction createNetworkAndChainIdMiddleware({\n network,\n}: {\n network: InfuraNetworkType;\n}) {\n return createScaffoldMiddleware({\n eth_chainId: ChainId[network],\n });\n}\n\nconst createChainIdMiddleware = (\n chainId: Hex,\n): JsonRpcMiddleware<JsonRpcRequest, Json> => {\n return ({ request, next }) => {\n if (request.method === 'eth_chainId') {\n return chainId;\n }\n return next();\n };\n};\n\n/**\n * Creates custom middleware.\n *\n * @param args - The arguments.\n * @param args.blockTracker - The block tracker to use.\n * @param args.chainId - The chain id to use.\n * @param args.rpcApiMiddleware - Additional middleware.\n * @returns The collection of middleware that makes up the Infura client.\n */\nfunction createCustomNetworkMiddleware({\n blockTracker,\n chainId,\n rpcApiMiddleware,\n}: {\n blockTracker: PollingBlockTracker;\n chainId: Hex;\n rpcApiMiddleware: RpcApiMiddleware;\n}) {\n const testMiddlewares = process.env.IN_TEST\n ? [createEstimateGasDelayTestMiddleware()]\n : [];\n\n return JsonRpcEngineV2.create({\n middleware: [\n ...testMiddlewares,\n createChainIdMiddleware(chainId),\n createBlockRefRewriteMiddleware({ blockTracker }),\n createBlockCacheMiddleware({ blockTracker }),\n createInflightCacheMiddleware(),\n createBlockTrackerInspectorMiddleware({ blockTracker }),\n rpcApiMiddleware,\n ],\n }).asMiddleware();\n}\n\n/**\n * For use in tests only.\n * Adds a delay to `eth_estimateGas` calls.\n *\n * @returns The middleware for delaying gas estimation calls by 2 seconds when in test.\n */\nfunction createEstimateGasDelayTestMiddleware(): JsonRpcMiddleware<\n JsonRpcRequest,\n Json\n> {\n return async ({ request, next }) => {\n if (request.method === 'eth_estimateGas') {\n await new Promise((resolve) => setTimeout(resolve, SECOND * 2));\n }\n return next();\n };\n}\n"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PollingBlockTrackerOptions } from "@metamask/eth-block-tracker";
|
|
2
2
|
import type { Logger } from "loglevel";
|
|
3
|
-
import type { NetworkControllerMessenger } from "./NetworkController.cjs";
|
|
3
|
+
import type { NetworkClientId, NetworkControllerMessenger } from "./NetworkController.cjs";
|
|
4
4
|
import type { RpcServiceOptions } from "./rpc-service/rpc-service.cjs";
|
|
5
5
|
import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.cjs";
|
|
6
6
|
/**
|
|
@@ -17,6 +17,8 @@ export type NetworkClient = {
|
|
|
17
17
|
* Create a JSON RPC network client for a specific network.
|
|
18
18
|
*
|
|
19
19
|
* @param args - The arguments.
|
|
20
|
+
* @param args.id - The ID that will be assigned to the new network client in
|
|
21
|
+
* the registry.
|
|
20
22
|
* @param args.configuration - The network configuration.
|
|
21
23
|
* @param args.getRpcServiceOptions - Factory for constructing RPC service
|
|
22
24
|
* options. See {@link NetworkControllerOptions.getRpcServiceOptions}.
|
|
@@ -31,7 +33,8 @@ export type NetworkClient = {
|
|
|
31
33
|
* @param args.logger - A `loglevel` logger.
|
|
32
34
|
* @returns The network client.
|
|
33
35
|
*/
|
|
34
|
-
export declare function createNetworkClient({ configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, isRpcFailoverEnabled, logger, }: {
|
|
36
|
+
export declare function createNetworkClient({ id, configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, isRpcFailoverEnabled, logger, }: {
|
|
37
|
+
id: NetworkClientId;
|
|
35
38
|
configuration: NetworkClientConfiguration;
|
|
36
39
|
getRpcServiceOptions: (rpcEndpointUrl: string) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;
|
|
37
40
|
getBlockTrackerOptions: (rpcEndpointUrl: string) => Omit<PollingBlockTrackerOptions, 'provider'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-network-client.d.cts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-network-client.d.cts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAwB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA4B;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AAEnE,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC;IAChE,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { PollingBlockTrackerOptions } from "@metamask/eth-block-tracker";
|
|
2
2
|
import type { Logger } from "loglevel";
|
|
3
|
-
import type { NetworkControllerMessenger } from "./NetworkController.mjs";
|
|
3
|
+
import type { NetworkClientId, NetworkControllerMessenger } from "./NetworkController.mjs";
|
|
4
4
|
import type { RpcServiceOptions } from "./rpc-service/rpc-service.mjs";
|
|
5
5
|
import type { BlockTracker, NetworkClientConfiguration, Provider } from "./types.mjs";
|
|
6
6
|
/**
|
|
@@ -17,6 +17,8 @@ export type NetworkClient = {
|
|
|
17
17
|
* Create a JSON RPC network client for a specific network.
|
|
18
18
|
*
|
|
19
19
|
* @param args - The arguments.
|
|
20
|
+
* @param args.id - The ID that will be assigned to the new network client in
|
|
21
|
+
* the registry.
|
|
20
22
|
* @param args.configuration - The network configuration.
|
|
21
23
|
* @param args.getRpcServiceOptions - Factory for constructing RPC service
|
|
22
24
|
* options. See {@link NetworkControllerOptions.getRpcServiceOptions}.
|
|
@@ -31,7 +33,8 @@ export type NetworkClient = {
|
|
|
31
33
|
* @param args.logger - A `loglevel` logger.
|
|
32
34
|
* @returns The network client.
|
|
33
35
|
*/
|
|
34
|
-
export declare function createNetworkClient({ configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, isRpcFailoverEnabled, logger, }: {
|
|
36
|
+
export declare function createNetworkClient({ id, configuration, getRpcServiceOptions, getBlockTrackerOptions, messenger, isRpcFailoverEnabled, logger, }: {
|
|
37
|
+
id: NetworkClientId;
|
|
35
38
|
configuration: NetworkClientConfiguration;
|
|
36
39
|
getRpcServiceOptions: (rpcEndpointUrl: string) => Omit<RpcServiceOptions, 'failoverService' | 'endpointUrl'>;
|
|
37
40
|
getBlockTrackerOptions: (rpcEndpointUrl: string) => Omit<PollingBlockTrackerOptions, 'provider'>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-network-client.d.mts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"create-network-client.d.mts","sourceRoot":"","sources":["../src/create-network-client.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,0BAA0B,EAAE,oCAAoC;AAwB9E,OAAO,KAAK,EAAE,MAAM,EAAE,iBAAiB;AAEvC,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,gCAA4B;AAC7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,sCAAkC;AAEnE,OAAO,KAAK,EACV,YAAY,EACZ,0BAA0B,EAC1B,QAAQ,EACT,oBAAgB;AAKjB;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG;IAC1B,aAAa,EAAE,0BAA0B,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,YAAY,EAAE,YAAY,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,CAAC;AAQF;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,EAAE,EACF,aAAa,EACb,oBAAoB,EACpB,sBAAsB,EACtB,SAAS,EACT,oBAAoB,EACpB,MAAM,GACP,EAAE;IACD,EAAE,EAAE,eAAe,CAAC;IACpB,aAAa,EAAE,0BAA0B,CAAC;IAC1C,oBAAoB,EAAE,CACpB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,iBAAiB,EAAE,iBAAiB,GAAG,aAAa,CAAC,CAAC;IAChE,sBAAsB,EAAE,CACtB,cAAc,EAAE,MAAM,KACnB,IAAI,CAAC,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAClD,SAAS,EAAE,0BAA0B,CAAC;IACtC,oBAAoB,EAAE,OAAO,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB,GAAG,aAAa,CAiEhB"}
|