Skip to content

Commit 319bcfc

Browse files
jiexiadonesky1Gudahtt
authored
Refactor: Expose SelectedNetworkController proxies map in the constructor params (#4104)
## Explanation In a [preceding PR](#4063), the SelectedNetworkController will start to keep proxy instances for all domains seen without a way to remove them when they become stale. This PR exposes the private proxies cache map as a constructor param which will enable callers to implement their own cache invalidation strategies without needing to concern the SelectedNetworkController of the implementation details themselves. This is needed because Mobile and Extension will need to follow different cache invalidation strategies. This PR should be merged before #4063 ## References Fixes: #4062 See: #4063 ## Changelog ### `@metamask/selected-network-controller` - **BREAKING**: `SelectedNetworkController` now expects the `domainProxyMap` param which is a `Map` of `Domain` to `NetworkProxy` - **ADDED**: exports the `Domain` type ## Checklist - [ ] I've updated the test suite for new or updated code as appropriate - [ ] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate - [ ] I've highlighted breaking changes using the "BREAKING" category above as appropriate --------- Co-authored-by: Alex Donesky <adonesky@gmail.com> Co-authored-by: Mark Stacey <markjstacey@gmail.com>
1 parent 8f4c698 commit 319bcfc

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

packages/selected-network-controller/src/SelectedNetworkController.ts

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ const stateMetadata = {
2424

2525
const getDefaultState = () => ({ domains: {} });
2626

27-
type Domain = string;
27+
export type Domain = string;
2828

2929
export const METAMASK_DOMAIN = 'metamask' as const;
3030

@@ -96,6 +96,7 @@ export type SelectedNetworkControllerOptions = {
9696
state?: SelectedNetworkControllerState;
9797
messenger: SelectedNetworkControllerMessenger;
9898
getUseRequestQueue: GetUseRequestQueue;
99+
domainProxyMap: Map<Domain, NetworkProxy>;
99100
};
100101

101102
export type NetworkProxy = {
@@ -111,7 +112,7 @@ export class SelectedNetworkController extends BaseController<
111112
SelectedNetworkControllerState,
112113
SelectedNetworkControllerMessenger
113114
> {
114-
#proxies = new Map<Domain, NetworkProxy>();
115+
#domainProxyMap: Map<Domain, NetworkProxy>;
115116

116117
#getUseRequestQueue: GetUseRequestQueue;
117118

@@ -122,11 +123,13 @@ export class SelectedNetworkController extends BaseController<
122123
* @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
123124
* @param options.state - The controllers initial state.
124125
* @param options.getUseRequestQueue - feature flag for perDappNetwork & request queueing features
126+
* @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
125127
*/
126128
constructor({
127129
messenger,
128130
state = getDefaultState(),
129131
getUseRequestQueue,
132+
domainProxyMap,
130133
}: SelectedNetworkControllerOptions) {
131134
super({
132135
name: controllerName,
@@ -135,6 +138,7 @@ export class SelectedNetworkController extends BaseController<
135138
state,
136139
});
137140
this.#getUseRequestQueue = getUseRequestQueue;
141+
this.#domainProxyMap = domainProxyMap;
138142
this.#registerMessageHandlers();
139143

140144
// this is fetching all the dapp permissions from the PermissionsController and looking for any domains that are not in domains state in this controller. Then we take any missing domains and add them to state here, setting it with the globally selected networkClientId (fetched from the NetworkController)
@@ -218,9 +222,9 @@ export class SelectedNetworkController extends BaseController<
218222
'NetworkController:getNetworkClientById',
219223
networkClientId,
220224
);
221-
const networkProxy = this.#proxies.get(domain);
225+
const networkProxy = this.#domainProxyMap.get(domain);
222226
if (networkProxy === undefined) {
223-
this.#proxies.set(domain, {
227+
this.#domainProxyMap.set(domain, {
224228
provider: createEventEmitterProxy(networkClient.provider),
225229
blockTracker: createEventEmitterProxy(networkClient.blockTracker, {
226230
eventFilter: 'skipInternal',
@@ -289,7 +293,7 @@ export class SelectedNetworkController extends BaseController<
289293
'NetworkClientId has not been set for the requested domain',
290294
);
291295
}
292-
let networkProxy = this.#proxies.get(domain);
296+
let networkProxy = this.#domainProxyMap.get(domain);
293297
if (networkProxy === undefined) {
294298
const networkClient = this.messagingSystem.call(
295299
'NetworkController:getNetworkClientById',
@@ -301,7 +305,7 @@ export class SelectedNetworkController extends BaseController<
301305
eventFilter: 'skipInternal',
302306
}),
303307
};
304-
this.#proxies.set(domain, networkProxy);
308+
this.#domainProxyMap.set(domain, networkProxy);
305309
}
306310

307311
return networkProxy;

packages/selected-network-controller/src/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ export type {
99
SelectedNetworkControllerMessenger,
1010
SelectedNetworkControllerOptions,
1111
NetworkProxy,
12+
Domain,
1213
} from './SelectedNetworkController';
1314
export {
1415
SelectedNetworkControllerActionTypes,

packages/selected-network-controller/tests/SelectedNetworkController.test.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import type {
99
SelectedNetworkControllerEvents,
1010
SelectedNetworkControllerMessenger,
1111
SelectedNetworkControllerState,
12+
Domain,
13+
NetworkProxy,
1214
} from '../src/SelectedNetworkController';
1315
import {
1416
SelectedNetworkController,
@@ -92,11 +94,13 @@ const setup = ({
9294
getSubjectNames = [],
9395
state,
9496
getUseRequestQueue = () => false,
97+
domainProxyMap = new Map<Domain, NetworkProxy>(),
9598
}: {
9699
hasPermissions?: boolean;
97100
state?: SelectedNetworkControllerState;
98101
getSubjectNames?: string[];
99102
getUseRequestQueue?: GetUseRequestQueue;
103+
domainProxyMap?: Map<Domain, NetworkProxy>;
100104
} = {}) => {
101105
const mockProviderProxy = {
102106
setTarget: jest.fn(),
@@ -143,6 +147,7 @@ const setup = ({
143147
messenger: selectedNetworkControllerMessenger,
144148
state,
145149
getUseRequestQueue,
150+
domainProxyMap,
146151
});
147152
return {
148153
controller,

0 commit comments

Comments
 (0)