Skip to content

Commit 649175d

Browse files
committed
stash
1 parent d7a775e commit 649175d

File tree

10 files changed

+97
-63
lines changed

10 files changed

+97
-63
lines changed
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
export * from './provider-from-engine';
22
export * from './provider-from-middleware';
3-
export type { SafeEventEmitterProvider } from './safe-event-emitter-provider';
3+
export { SafeEventEmitterProvider } from './safe-event-emitter-provider';

packages/network-controller/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@
3535
"@metamask/eth-json-rpc-middleware": "^11.0.2",
3636
"@metamask/eth-json-rpc-provider": "^2.2.0",
3737
"@metamask/eth-query": "^3.0.1",
38+
"@metamask/json-rpc-engine": "^7.1.1",
3839
"@metamask/swappable-obj-proxy": "^2.1.0",
3940
"@metamask/utils": "^8.1.0",
4041
"async-mutex": "^0.2.6",

packages/network-controller/src/NetworkController.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ import {
88
NetworkType,
99
isSafeChainId,
1010
} from '@metamask/controller-utils';
11-
import EthQuery from '@metamask/eth-query';
11+
import EthQuery, { type Provider } from '@metamask/eth-query';
1212
import { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';
13-
import type { SwappableProxy } from '@metamask/swappable-obj-proxy';
13+
import type {
14+
EventEmitterLike,
15+
SwappableProxy,
16+
} from '@metamask/swappable-obj-proxy';
1417
import type { Hex } from '@metamask/utils';
1518
import {
1619
assertIsStrictHexString,
@@ -32,7 +35,6 @@ import { projectLogger, createModuleLogger } from './logger';
3235
import { NetworkClientType } from './types';
3336
import type {
3437
BlockTracker,
35-
Provider,
3638
CustomNetworkClientConfiguration,
3739
InfuraNetworkClientConfiguration,
3840
NetworkClientConfiguration,
@@ -357,7 +359,9 @@ export type BlockTrackerProxy = SwappableProxy<
357359
* selected network can change without consumers needing to refresh the object
358360
* reference to that network.)
359361
*/
360-
export type ProviderProxy = SwappableProxy<ProxyWithAccessibleTarget<Provider>>;
362+
export type ProviderProxy =
363+
| SwappableProxy<ProxyWithAccessibleTarget<Provider>>
364+
| SwappableProxy<EventEmitterLike>;
361365

362366
export type NetworkControllerStateChangeEvent = {
363367
type: `NetworkController:stateChange`;

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

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import type { NetworkClient } from './create-network-client';
2-
import { createNetworkClient } from './create-network-client';
31
import type {
4-
BlockTracker,
5-
NetworkClientConfiguration,
62
Provider,
7-
} from './types';
3+
ProviderSendAsyncCallback,
4+
SendAsyncPayload,
5+
} from '@metamask/eth-query';
6+
7+
import type { NetworkClient } from './create-network-client';
8+
import { createNetworkClient } from './create-network-client';
9+
import type { BlockTracker, NetworkClientConfiguration } from './types';
810

911
/**
1012
* The name of the method on both the provider and block tracker proxy which can
@@ -90,10 +92,13 @@ export function createAutoManagedNetworkClient<
9092
// Ensure that the method on the provider is called with `this` as
9193
// the target, *not* the proxy (which happens by default) —
9294
// this allows private properties to be accessed
93-
return function (this: unknown, ...args: any[]) {
94-
// @ts-expect-error We don't care that `this` may not be compatible
95-
// with the signature of the method being called, as technically
96-
// it can be anything.
95+
return function (
96+
this: unknown,
97+
...args: [
98+
payload: SendAsyncPayload<unknown>,
99+
callback: ProviderSendAsyncCallback<unknown>,
100+
]
101+
) {
97102
return value.apply(this === receiver ? provider : this, args);
98103
};
99104
}

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

Lines changed: 27 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -10,26 +10,23 @@ import {
1010
createFetchMiddleware,
1111
createRetryOnEmptyMiddleware,
1212
} from '@metamask/eth-json-rpc-middleware';
13-
import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';
1413
import {
14+
type SafeEventEmitterProvider,
1515
providerFromEngine,
1616
providerFromMiddleware,
1717
} from '@metamask/eth-json-rpc-provider';
18-
import type { Hex } from '@metamask/utils';
19-
import { PollingBlockTracker } from 'eth-block-tracker';
18+
import type { Provider } from '@metamask/eth-query';
2019
import {
2120
createAsyncMiddleware,
2221
createScaffoldMiddleware,
2322
JsonRpcEngine,
2423
mergeMiddleware,
25-
} from 'json-rpc-engine';
26-
import type { JsonRpcMiddleware } from 'json-rpc-engine';
27-
28-
import type {
29-
BlockTracker,
30-
NetworkClientConfiguration,
31-
Provider,
32-
} from './types';
24+
} from '@metamask/json-rpc-engine';
25+
import type { JsonRpcMiddleware } from '@metamask/json-rpc-engine';
26+
import type { Hex, Json, JsonRpcParams } from '@metamask/utils';
27+
import { PollingBlockTracker } from 'eth-block-tracker';
28+
29+
import type { BlockTracker, NetworkClientConfiguration } from './types';
3330
import { NetworkClientType } from './types';
3431

3532
const SECOND = 1000;
@@ -56,19 +53,21 @@ export function createNetworkClient(
5653
): NetworkClient {
5754
const rpcApiMiddleware =
5855
networkConfig.type === NetworkClientType.Infura
59-
? createInfuraMiddleware({
56+
? createInfuraMiddleware<JsonRpcParams, Json>({
6057
network: networkConfig.network,
6158
projectId: networkConfig.infuraProjectId,
6259
maxAttempts: 5,
6360
source: 'metamask',
6461
})
65-
: createFetchMiddleware({
62+
: createFetchMiddleware<JsonRpcParams, Json>({
6663
btoa: global.btoa,
6764
fetch: global.fetch,
6865
rpcUrl: networkConfig.rpcUrl,
6966
});
7067

71-
const rpcProvider = providerFromMiddleware(rpcApiMiddleware);
68+
const rpcProvider = providerFromMiddleware<JsonRpcParams, Json>(
69+
rpcApiMiddleware,
70+
);
7271

7372
const blockTrackerOpts =
7473
// eslint-disable-next-line n/no-process-env
@@ -82,13 +81,13 @@ export function createNetworkClient(
8281

8382
const networkMiddleware =
8483
networkConfig.type === NetworkClientType.Infura
85-
? createInfuraNetworkMiddleware({
84+
? createInfuraNetworkMiddleware<JsonRpcParams, Json>({
8685
blockTracker,
8786
network: networkConfig.network,
8887
rpcProvider,
8988
rpcApiMiddleware,
9089
})
91-
: createCustomNetworkMiddleware({
90+
: createCustomNetworkMiddleware<JsonRpcParams, Json>({
9291
blockTracker,
9392
chainId: networkConfig.chainId,
9493
rpcApiMiddleware,
@@ -117,7 +116,10 @@ export function createNetworkClient(
117116
* @param args.rpcApiMiddleware - Additional middleware.
118117
* @returns The collection of middleware that makes up the Infura client.
119118
*/
120-
function createInfuraNetworkMiddleware({
119+
function createInfuraNetworkMiddleware<
120+
Params extends JsonRpcParams | unknown = JsonRpcParams,
121+
Result extends Json[] | Record<string, Json> | unknown = unknown,
122+
>({
121123
blockTracker,
122124
network,
123125
rpcProvider,
@@ -126,7 +128,7 @@ function createInfuraNetworkMiddleware({
126128
blockTracker: PollingBlockTracker;
127129
network: InfuraNetworkType;
128130
rpcProvider: SafeEventEmitterProvider;
129-
rpcApiMiddleware: JsonRpcMiddleware<unknown, unknown>;
131+
rpcApiMiddleware: JsonRpcMiddleware<Params, Result>;
130132
}) {
131133
return mergeMiddleware([
132134
createNetworkAndChainIdMiddleware({ network }),
@@ -156,9 +158,9 @@ function createNetworkAndChainIdMiddleware({
156158
});
157159
}
158160

159-
const createChainIdMiddleware = (
161+
const createChainIdMiddleware = <Params = unknown>(
160162
chainId: Hex,
161-
): JsonRpcMiddleware<unknown, unknown> => {
163+
): JsonRpcMiddleware<Params, `0x${string}`> => {
162164
return (req, res, next, end) => {
163165
if (req.method === 'eth_chainId') {
164166
res.result = chainId;
@@ -177,14 +179,17 @@ const createChainIdMiddleware = (
177179
* @param args.rpcApiMiddleware - Additional middleware.
178180
* @returns The collection of middleware that makes up the Infura client.
179181
*/
180-
function createCustomNetworkMiddleware({
182+
function createCustomNetworkMiddleware<
183+
Params extends JsonRpcParams | unknown = unknown,
184+
Result extends Json[] | Record<string, Json> | unknown = unknown,
185+
>({
181186
blockTracker,
182187
chainId,
183188
rpcApiMiddleware,
184189
}: {
185190
blockTracker: PollingBlockTracker;
186191
chainId: Hex;
187-
rpcApiMiddleware: any;
192+
rpcApiMiddleware: JsonRpcMiddleware<Params, Result>;
188193
}) {
189194
// eslint-disable-next-line n/no-process-env
190195
const testMiddlewares = process.env.IN_TEST
Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
export * from './NetworkController';
22
export * from './constants';
3-
export type { BlockTracker, Provider } from './types';
4-
export type { NetworkClientConfiguration } from './types';
5-
export { NetworkClientType } from './types';
3+
export type {
4+
BlockTracker,
5+
NetworkClientConfiguration,
6+
NetworkClientType,
7+
} from './types';

packages/network-controller/src/types.ts

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import type { InfuraNetworkType } from '@metamask/controller-utils';
2-
import type { SafeEventEmitterProvider } from '@metamask/eth-json-rpc-provider';
32
import type { Hex } from '@metamask/utils';
43
import type { PollingBlockTracker } from 'eth-block-tracker';
54

6-
export type Provider = SafeEventEmitterProvider;
7-
85
export type BlockTracker = PollingBlockTracker;
96

107
/**

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

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import {
77
NetworkType,
88
toHex,
99
} from '@metamask/controller-utils';
10+
import type { Provider } from '@metamask/eth-query';
1011
import assert from 'assert';
1112
import { ethErrors } from 'eth-rpc-errors';
1213
import type { Patch } from 'immer';
@@ -27,10 +28,8 @@ import type {
2728
ProviderConfig,
2829
} from '../src/NetworkController';
2930
import { NetworkController } from '../src/NetworkController';
30-
import type { Provider } from '../src/types';
3131
import { NetworkClientType } from '../src/types';
32-
import type { FakeProviderStub } from './fake-provider';
33-
import { FakeProvider } from './fake-provider';
32+
import { FakeProvider, type FakeProviderStub } from './fake-provider';
3433

3534
jest.mock('../src/create-network-client');
3635

@@ -978,9 +977,10 @@ describe('NetworkController', () => {
978977
provider,
979978
);
980979
const response1 = await promisifiedSendAsync1({
981-
id: '1',
980+
id: 1,
982981
jsonrpc: '2.0',
983982
method: 'test',
983+
params: [],
984984
});
985985
expect(response1.result).toBe('test response 1');
986986

@@ -989,9 +989,10 @@ describe('NetworkController', () => {
989989
provider,
990990
);
991991
const response2 = await promisifiedSendAsync2({
992-
id: '2',
992+
id: 2,
993993
jsonrpc: '2.0',
994994
method: 'test',
995+
params: [],
995996
});
996997
expect(response2.result).toBe('test response 2');
997998
},
@@ -1072,9 +1073,10 @@ describe('NetworkController', () => {
10721073
provider,
10731074
);
10741075
const response1 = await promisifiedSendAsync1({
1075-
id: '1',
1076+
id: 1,
10761077
jsonrpc: '2.0',
10771078
method: 'test',
1079+
params: [],
10781080
});
10791081
expect(response1.result).toBe('test response 1');
10801082

@@ -1083,9 +1085,10 @@ describe('NetworkController', () => {
10831085
provider,
10841086
);
10851087
const response2 = await promisifiedSendAsync2({
1086-
id: '2',
1088+
id: 2,
10871089
jsonrpc: '2.0',
10881090
method: 'test',
1091+
params: [],
10891092
});
10901093
expect(response2.result).toBe('test response 2');
10911094
},
@@ -4948,9 +4951,10 @@ describe('NetworkController', () => {
49484951
provider,
49494952
);
49504953
const response = await promisifiedSendAsync({
4951-
id: '1',
4954+
id: 1,
49524955
jsonrpc: '2.0',
49534956
method: 'test',
4957+
params: [],
49544958
});
49554959
expect(response.result).toBe('test response');
49564960
},
@@ -5431,10 +5435,10 @@ describe('NetworkController', () => {
54315435
// We only care about the first state change, because it
54325436
// happens before networkDidChange
54335437
count: 1,
5434-
operation: () => {
5438+
operation: async () => {
54355439
// Intentionally not awaited because we want to check state
54365440
// while this operation is in-progress
5437-
controller.rollbackToPreviousProvider();
5441+
await controller.rollbackToPreviousProvider();
54385442
},
54395443
beforeResolving: () => {
54405444
expect(
@@ -5502,9 +5506,10 @@ describe('NetworkController', () => {
55025506
provider,
55035507
);
55045508
const response = await promisifiedSendAsync({
5505-
id: '1',
5509+
id: 1,
55065510
jsonrpc: '2.0',
55075511
method: 'test',
5512+
params: [],
55085513
});
55095514
expect(response.result).toBe('test response');
55105515
},

0 commit comments

Comments
 (0)