@metamask/selected-network-controller 20.0.1 → 21.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 CHANGED
@@ -7,6 +7,26 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [21.0.0]
11
+
12
+ ### Added
13
+
14
+ - **BREAKING:** The `SelectedNetworkController` constructor now expects both `useRequestQueuePreference` and `onPreferencesStateChange` options ([#5065](https://github.com/MetaMask/core/pull/5065))
15
+ - These were previously removed in 20.0.0, but have been re-added for compatibility with Mobile.
16
+
17
+ ### Changed
18
+
19
+ - Bump `@metamask/base-controller` from `^7.0.0` to `^7.1.1` ([#5079](https://github.com/MetaMask/core/pull/5079)), [#5135](https://github.com/MetaMask/core/pull/5135))
20
+ - Bump `@metamask/json-rpc-engine` from `^10.0.1` to `^10.0.2` ([#5082](https://github.com/MetaMask/core/pull/5082))
21
+ - Bump `@metamask/utils` from `^10.0.0` to `^11.0.1` ([#5080](https://github.com/MetaMask/core/pull/5080))
22
+ - This upgrade is not a breaking change because this package does not use `generateRandomMnemonic`.
23
+
24
+ ## [20.0.2]
25
+
26
+ ### Changed
27
+
28
+ - Bump `swappable-obj-proxy` from `^2.2.0` to `^2.3.0` ([#5036](https://github.com/MetaMask/core/pull/5036))
29
+
10
30
  ## [20.0.1]
11
31
 
12
32
  ### Fixed
@@ -317,7 +337,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
317
337
 
318
338
  - Initial Release ([#1643](https://github.com/MetaMask/core/pull/1643))
319
339
 
320
- [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@20.0.1...HEAD
340
+ [Unreleased]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@21.0.0...HEAD
341
+ [21.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@20.0.2...@metamask/selected-network-controller@21.0.0
342
+ [20.0.2]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@20.0.1...@metamask/selected-network-controller@20.0.2
321
343
  [20.0.1]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@20.0.0...@metamask/selected-network-controller@20.0.1
322
344
  [20.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@19.0.0...@metamask/selected-network-controller@20.0.0
323
345
  [19.0.0]: https://github.com/MetaMask/core/compare/@metamask/selected-network-controller@18.0.2...@metamask/selected-network-controller@19.0.0
@@ -10,7 +10,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
10
10
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
11
11
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
12
12
  };
13
- var _SelectedNetworkController_instances, _SelectedNetworkController_domainProxyMap, _SelectedNetworkController_registerMessageHandlers, _SelectedNetworkController_setNetworkClientIdForDomain, _SelectedNetworkController_unsetNetworkClientIdForDomain, _SelectedNetworkController_domainHasPermissions;
13
+ var _SelectedNetworkController_instances, _SelectedNetworkController_domainProxyMap, _SelectedNetworkController_useRequestQueuePreference, _SelectedNetworkController_registerMessageHandlers, _SelectedNetworkController_setNetworkClientIdForDomain, _SelectedNetworkController_unsetNetworkClientIdForDomain, _SelectedNetworkController_domainHasPermissions, _SelectedNetworkController_resetAllPermissionedDomains;
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.SelectedNetworkController = exports.SelectedNetworkControllerEventTypes = exports.SelectedNetworkControllerActionTypes = exports.METAMASK_DOMAIN = exports.controllerName = void 0;
16
16
  const base_controller_1 = require("@metamask/base-controller");
@@ -44,9 +44,11 @@ class SelectedNetworkController extends base_controller_1.BaseController {
44
44
  * @param options - The controller options.
45
45
  * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
46
46
  * @param options.state - The controllers initial state.
47
+ * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
48
+ * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
47
49
  * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
48
50
  */
49
- constructor({ messenger, state = getDefaultState(), domainProxyMap, }) {
51
+ constructor({ messenger, state = getDefaultState(), useRequestQueuePreference, onPreferencesStateChange, domainProxyMap, }) {
50
52
  super({
51
53
  name: exports.controllerName,
52
54
  metadata: stateMetadata,
@@ -55,6 +57,8 @@ class SelectedNetworkController extends base_controller_1.BaseController {
55
57
  });
56
58
  _SelectedNetworkController_instances.add(this);
57
59
  _SelectedNetworkController_domainProxyMap.set(this, void 0);
60
+ _SelectedNetworkController_useRequestQueuePreference.set(this, void 0);
61
+ __classPrivateFieldSet(this, _SelectedNetworkController_useRequestQueuePreference, useRequestQueuePreference, "f");
58
62
  __classPrivateFieldSet(this, _SelectedNetworkController_domainProxyMap, domainProxyMap, "f");
59
63
  __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_registerMessageHandlers).call(this);
60
64
  // 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)
@@ -107,8 +111,26 @@ class SelectedNetworkController extends base_controller_1.BaseController {
107
111
  });
108
112
  }
109
113
  });
114
+ onPreferencesStateChange(({ useRequestQueue }) => {
115
+ if (__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f") !== useRequestQueue) {
116
+ if (!useRequestQueue) {
117
+ // Loop through all domains and points each domain's proxy
118
+ // to the NetworkController's own proxy of the globally selected networkClient
119
+ Object.keys(this.state.domains).forEach((domain) => {
120
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_unsetNetworkClientIdForDomain).call(this, domain);
121
+ });
122
+ }
123
+ else {
124
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_resetAllPermissionedDomains).call(this);
125
+ }
126
+ __classPrivateFieldSet(this, _SelectedNetworkController_useRequestQueuePreference, useRequestQueue, "f");
127
+ }
128
+ });
110
129
  }
111
130
  setNetworkClientIdForDomain(domain, networkClientId) {
131
+ if (!__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f")) {
132
+ return;
133
+ }
112
134
  if (domain === exports.METAMASK_DOMAIN) {
113
135
  throw new Error(`NetworkClientId for domain "${exports.METAMASK_DOMAIN}" cannot be set on the SelectedNetworkController`);
114
136
  }
@@ -122,6 +144,9 @@ class SelectedNetworkController extends base_controller_1.BaseController {
122
144
  }
123
145
  getNetworkClientIdForDomain(domain) {
124
146
  const { selectedNetworkClientId: metamaskSelectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
147
+ if (!__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f")) {
148
+ return metamaskSelectedNetworkClientId;
149
+ }
125
150
  return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;
126
151
  }
127
152
  /**
@@ -143,15 +168,16 @@ class SelectedNetworkController extends base_controller_1.BaseController {
143
168
  let networkProxy = __classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").get(domain);
144
169
  if (networkProxy === undefined) {
145
170
  let networkClient;
146
- if (__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
171
+ if (__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f") &&
172
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
147
173
  const networkClientId = this.getNetworkClientIdForDomain(domain);
148
174
  networkClient = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
149
175
  }
150
176
  else {
151
177
  networkClient = this.messagingSystem.call('NetworkController:getSelectedNetworkClient');
152
- }
153
- if (networkClient === undefined) {
154
- throw new Error('Selected network not initialized');
178
+ if (networkClient === undefined) {
179
+ throw new Error('Selected network not initialized');
180
+ }
155
181
  }
156
182
  networkProxy = {
157
183
  provider: (0, swappable_obj_proxy_1.createEventEmitterProxy)(networkClient.provider),
@@ -165,7 +191,7 @@ class SelectedNetworkController extends base_controller_1.BaseController {
165
191
  }
166
192
  }
167
193
  exports.SelectedNetworkController = SelectedNetworkController;
168
- _SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkController_instances = new WeakSet(), _SelectedNetworkController_registerMessageHandlers = function _SelectedNetworkController_registerMessageHandlers() {
194
+ _SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkController_useRequestQueuePreference = new WeakMap(), _SelectedNetworkController_instances = new WeakSet(), _SelectedNetworkController_registerMessageHandlers = function _SelectedNetworkController_registerMessageHandlers() {
169
195
  this.messagingSystem.registerActionHandler(exports.SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain, this.getNetworkClientIdForDomain.bind(this));
170
196
  this.messagingSystem.registerActionHandler(exports.SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain, this.setNetworkClientIdForDomain.bind(this));
171
197
  }, _SelectedNetworkController_setNetworkClientIdForDomain = function _SelectedNetworkController_setNetworkClientIdForDomain(domain, networkClientId) {
@@ -193,5 +219,15 @@ _SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkContr
193
219
  });
194
220
  }, _SelectedNetworkController_domainHasPermissions = function _SelectedNetworkController_domainHasPermissions(domain) {
195
221
  return this.messagingSystem.call('PermissionController:hasPermissions', domain);
222
+ }, _SelectedNetworkController_resetAllPermissionedDomains = function _SelectedNetworkController_resetAllPermissionedDomains() {
223
+ __classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").forEach((_, domain) => {
224
+ const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
225
+ // can't use public setNetworkClientIdForDomain because it will throw an error
226
+ // rather than simply skip if the domain doesn't have permissions which can happen
227
+ // in this case since proxies are added for each site the user visits
228
+ if (__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
229
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_setNetworkClientIdForDomain).call(this, domain, selectedNetworkClientId);
230
+ }
231
+ });
196
232
  };
197
233
  //# sourceMappingURL=SelectedNetworkController.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectedNetworkController.cjs","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n BlockTrackerProxy,\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n ProviderProxy,\n} from '@metamask/network-controller';\nimport type {\n PermissionControllerStateChange,\n GetSubjects as PermissionControllerGetSubjectsAction,\n HasPermissions as PermissionControllerHasPermissions,\n} from '@metamask/permission-controller';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { Hex } from '@metamask/utils';\nimport type { Patch } from 'immer';\n\nexport const controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({ domains: {} });\n\n// npm and local are currently the only valid prefixes for snap domains\n// TODO: eventually we maybe want to pull this in from snaps-utils to ensure it stays in sync\n// For now it seems like overkill to add a dependency for this one constant\n// https://github.com/MetaMask/snaps/blob/2beee7803bfe9e540788a3558b546b9f55dc3cb4/packages/snaps-utils/src/types.ts#L120\nconst snapsPrefixes = ['npm:', 'local:'] as const;\n\nexport type Domain = string;\n\nexport const METAMASK_DOMAIN = 'metamask' as const;\n\nexport const SelectedNetworkControllerActionTypes = {\n getState: `${controllerName}:getState` as const,\n getNetworkClientIdForDomain:\n `${controllerName}:getNetworkClientIdForDomain` as const,\n setNetworkClientIdForDomain:\n `${controllerName}:setNetworkClientIdForDomain` as const,\n};\n\nexport const SelectedNetworkControllerEventTypes = {\n stateChange: `${controllerName}:stateChange` as const,\n};\n\nexport type SelectedNetworkControllerState = {\n domains: Record<Domain, NetworkClientId>;\n};\n\nexport type SelectedNetworkControllerStateChangeEvent = {\n type: typeof SelectedNetworkControllerEventTypes.stateChange;\n payload: [SelectedNetworkControllerState, Patch[]];\n};\n\nexport type SelectedNetworkControllerGetSelectedNetworkStateAction = {\n type: typeof SelectedNetworkControllerActionTypes.getState;\n handler: () => SelectedNetworkControllerState;\n};\n\nexport type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;\n handler: SelectedNetworkController['getNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: SelectedNetworkController['setNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerActions =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetSelectedNetworkClientAction\n | NetworkControllerGetStateAction\n | PermissionControllerHasPermissions\n | PermissionControllerGetSubjectsAction;\n\nexport type SelectedNetworkControllerEvents =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | NetworkControllerStateChangeEvent\n | PermissionControllerStateChange;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerActions | AllowedActions,\n SelectedNetworkControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport type SelectedNetworkControllerOptions = {\n state?: SelectedNetworkControllerState;\n messenger: SelectedNetworkControllerMessenger;\n domainProxyMap: Map<Domain, NetworkProxy>;\n};\n\nexport type NetworkProxy = {\n provider: ProviderProxy;\n blockTracker: BlockTrackerProxy;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseController<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\n> {\n #domainProxyMap: Map<Domain, NetworkProxy>;\n\n /**\n * Construct a SelectedNetworkController controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.\n * @param options.state - The controllers initial state.\n * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.\n */\n constructor({\n messenger,\n state = getDefaultState(),\n domainProxyMap,\n }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state,\n });\n this.#domainProxyMap = domainProxyMap;\n this.#registerMessageHandlers();\n\n // 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)\n this.messagingSystem\n .call('PermissionController:getSubjectNames')\n .filter((domain) => this.state.domains[domain] === undefined)\n .forEach((domain) =>\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'PermissionController:stateChange',\n (_, patches) => {\n patches.forEach(({ op, path }) => {\n const isChangingSubject =\n path[0] === 'subjects' && path[1] !== undefined;\n if (isChangingSubject && typeof path[1] === 'string') {\n const domain = path[1];\n if (op === 'add' && this.state.domains[domain] === undefined) {\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n );\n } else if (\n op === 'remove' &&\n this.state.domains[domain] !== undefined\n ) {\n this.#unsetNetworkClientIdForDomain(domain);\n }\n }\n });\n },\n );\n\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (\n { selectedNetworkClientId, networkConfigurationsByChainId },\n patches,\n ) => {\n const patch = patches.find(\n ({ op, path }) =>\n (op === 'replace' || op === 'remove') &&\n path[0] === 'networkConfigurationsByChainId',\n );\n\n if (patch) {\n const networkClientIdToChainId = Object.values(\n networkConfigurationsByChainId,\n ).reduce((acc, network) => {\n network.rpcEndpoints.forEach(\n ({ networkClientId }) => (acc[networkClientId] = network.chainId),\n );\n return acc;\n }, {} as Record<string, Hex>);\n\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n const chainIdForDomain =\n networkClientIdToChainId[networkClientIdForDomain];\n\n if (patch.op === 'remove' && !chainIdForDomain) {\n // If the network was removed, fall back to the globally selected network\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n } else if (patch.op === 'replace') {\n // If the network was updated, redirect to the network's default endpoint\n\n const updatedChainId = patch.path[1] as Hex;\n if (!chainIdForDomain || chainIdForDomain === updatedChainId) {\n const network =\n networkConfigurationsByChainId[updatedChainId];\n\n const { networkClientId: defaultNetworkClientId } =\n network.rpcEndpoints[network.defaultRpcEndpointIndex];\n\n if (networkClientIdForDomain !== defaultNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n defaultNetworkClientId,\n );\n }\n }\n }\n },\n );\n }\n },\n );\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n }\n\n #setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n // This needs to happen before getProviderAndBlockTracker,\n // otherwise we may be referencing a network client ID that no longer exists.\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n\n const networkProxy = this.getProviderAndBlockTracker(domain);\n networkProxy.provider.setTarget(networkClient.provider);\n networkProxy.blockTracker.setTarget(networkClient.blockTracker);\n }\n\n /**\n * This method is used when a domain is removed from the PermissionsController.\n * It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.\n *\n * @param domain - The domain for which to unset the network client ID.\n */\n #unsetNetworkClientIdForDomain(domain: Domain) {\n const globallySelectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n const networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy && globallySelectedNetworkClient) {\n networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);\n networkProxy.blockTracker.setTarget(\n globallySelectedNetworkClient.blockTracker,\n );\n } else if (networkProxy) {\n this.#domainProxyMap.delete(domain);\n }\n this.update((state) => {\n delete state.domains[domain];\n });\n }\n\n #domainHasPermissions(domain: Domain): boolean {\n return this.messagingSystem.call(\n 'PermissionController:hasPermissions',\n domain,\n );\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n if (domain === METAMASK_DOMAIN) {\n throw new Error(\n `NetworkClientId for domain \"${METAMASK_DOMAIN}\" cannot be set on the SelectedNetworkController`,\n );\n }\n\n if (snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {\n return;\n }\n\n if (!this.#domainHasPermissions(domain)) {\n throw new Error(\n 'NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions',\n );\n }\n\n this.#setNetworkClientIdForDomain(domain, networkClientId);\n }\n\n getNetworkClientIdForDomain(domain: Domain): NetworkClientId {\n const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @param domain - the domain for the provider\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(domain: Domain): NetworkProxy {\n // If the domain is 'metamask' or a snap, return the NetworkController's globally selected network client proxy\n if (\n domain === METAMASK_DOMAIN ||\n snapsPrefixes.some((prefix) => domain.startsWith(prefix))\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n return networkClient;\n }\n\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (this.#domainHasPermissions(domain)) {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n }\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n\n networkProxy = {\n provider: createEventEmitterProxy(networkClient.provider),\n blockTracker: createEventEmitterProxy(networkClient.blockTracker, {\n eventFilter: 'skipInternal',\n }),\n };\n this.#domainProxyMap.set(domain, networkProxy);\n }\n return networkProxy;\n }\n}\n"]}
1
+ {"version":3,"file":"SelectedNetworkController.cjs","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n BlockTrackerProxy,\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n ProviderProxy,\n} from '@metamask/network-controller';\nimport type {\n PermissionControllerStateChange,\n GetSubjects as PermissionControllerGetSubjectsAction,\n HasPermissions as PermissionControllerHasPermissions,\n} from '@metamask/permission-controller';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { Hex } from '@metamask/utils';\nimport type { Patch } from 'immer';\n\nexport const controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({ domains: {} });\n\n// npm and local are currently the only valid prefixes for snap domains\n// TODO: eventually we maybe want to pull this in from snaps-utils to ensure it stays in sync\n// For now it seems like overkill to add a dependency for this one constant\n// https://github.com/MetaMask/snaps/blob/2beee7803bfe9e540788a3558b546b9f55dc3cb4/packages/snaps-utils/src/types.ts#L120\nconst snapsPrefixes = ['npm:', 'local:'] as const;\n\nexport type Domain = string;\n\nexport const METAMASK_DOMAIN = 'metamask' as const;\n\nexport const SelectedNetworkControllerActionTypes = {\n getState: `${controllerName}:getState` as const,\n getNetworkClientIdForDomain:\n `${controllerName}:getNetworkClientIdForDomain` as const,\n setNetworkClientIdForDomain:\n `${controllerName}:setNetworkClientIdForDomain` as const,\n};\n\nexport const SelectedNetworkControllerEventTypes = {\n stateChange: `${controllerName}:stateChange` as const,\n};\n\nexport type SelectedNetworkControllerState = {\n domains: Record<Domain, NetworkClientId>;\n};\n\nexport type SelectedNetworkControllerStateChangeEvent = {\n type: typeof SelectedNetworkControllerEventTypes.stateChange;\n payload: [SelectedNetworkControllerState, Patch[]];\n};\n\nexport type SelectedNetworkControllerGetSelectedNetworkStateAction = {\n type: typeof SelectedNetworkControllerActionTypes.getState;\n handler: () => SelectedNetworkControllerState;\n};\n\nexport type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;\n handler: SelectedNetworkController['getNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: SelectedNetworkController['setNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerActions =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetSelectedNetworkClientAction\n | NetworkControllerGetStateAction\n | PermissionControllerHasPermissions\n | PermissionControllerGetSubjectsAction;\n\nexport type SelectedNetworkControllerEvents =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | NetworkControllerStateChangeEvent\n | PermissionControllerStateChange;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerActions | AllowedActions,\n SelectedNetworkControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport type SelectedNetworkControllerOptions = {\n state?: SelectedNetworkControllerState;\n messenger: SelectedNetworkControllerMessenger;\n useRequestQueuePreference: boolean;\n onPreferencesStateChange: (\n listener: (preferencesState: { useRequestQueue: boolean }) => void,\n ) => void;\n domainProxyMap: Map<Domain, NetworkProxy>;\n};\n\nexport type NetworkProxy = {\n provider: ProviderProxy;\n blockTracker: BlockTrackerProxy;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseController<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\n> {\n #domainProxyMap: Map<Domain, NetworkProxy>;\n\n #useRequestQueuePreference: boolean;\n\n /**\n * Construct a SelectedNetworkController controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.\n * @param options.state - The controllers initial state.\n * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.\n * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.\n * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.\n */\n constructor({\n messenger,\n state = getDefaultState(),\n useRequestQueuePreference,\n onPreferencesStateChange,\n domainProxyMap,\n }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state,\n });\n this.#useRequestQueuePreference = useRequestQueuePreference;\n this.#domainProxyMap = domainProxyMap;\n this.#registerMessageHandlers();\n\n // 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)\n this.messagingSystem\n .call('PermissionController:getSubjectNames')\n .filter((domain) => this.state.domains[domain] === undefined)\n .forEach((domain) =>\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'PermissionController:stateChange',\n (_, patches) => {\n patches.forEach(({ op, path }) => {\n const isChangingSubject =\n path[0] === 'subjects' && path[1] !== undefined;\n if (isChangingSubject && typeof path[1] === 'string') {\n const domain = path[1];\n if (op === 'add' && this.state.domains[domain] === undefined) {\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n );\n } else if (\n op === 'remove' &&\n this.state.domains[domain] !== undefined\n ) {\n this.#unsetNetworkClientIdForDomain(domain);\n }\n }\n });\n },\n );\n\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (\n { selectedNetworkClientId, networkConfigurationsByChainId },\n patches,\n ) => {\n const patch = patches.find(\n ({ op, path }) =>\n (op === 'replace' || op === 'remove') &&\n path[0] === 'networkConfigurationsByChainId',\n );\n\n if (patch) {\n const networkClientIdToChainId = Object.values(\n networkConfigurationsByChainId,\n ).reduce((acc, network) => {\n network.rpcEndpoints.forEach(\n ({ networkClientId }) => (acc[networkClientId] = network.chainId),\n );\n return acc;\n }, {} as Record<string, Hex>);\n\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n const chainIdForDomain =\n networkClientIdToChainId[networkClientIdForDomain];\n\n if (patch.op === 'remove' && !chainIdForDomain) {\n // If the network was removed, fall back to the globally selected network\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n } else if (patch.op === 'replace') {\n // If the network was updated, redirect to the network's default endpoint\n\n const updatedChainId = patch.path[1] as Hex;\n if (!chainIdForDomain || chainIdForDomain === updatedChainId) {\n const network =\n networkConfigurationsByChainId[updatedChainId];\n\n const { networkClientId: defaultNetworkClientId } =\n network.rpcEndpoints[network.defaultRpcEndpointIndex];\n\n if (networkClientIdForDomain !== defaultNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n defaultNetworkClientId,\n );\n }\n }\n }\n },\n );\n }\n },\n );\n\n onPreferencesStateChange(({ useRequestQueue }) => {\n if (this.#useRequestQueuePreference !== useRequestQueue) {\n if (!useRequestQueue) {\n // Loop through all domains and points each domain's proxy\n // to the NetworkController's own proxy of the globally selected networkClient\n Object.keys(this.state.domains).forEach((domain) => {\n this.#unsetNetworkClientIdForDomain(domain);\n });\n } else {\n this.#resetAllPermissionedDomains();\n }\n this.#useRequestQueuePreference = useRequestQueue;\n }\n });\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n }\n\n #setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n // This needs to happen before getProviderAndBlockTracker,\n // otherwise we may be referencing a network client ID that no longer exists.\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n\n const networkProxy = this.getProviderAndBlockTracker(domain);\n networkProxy.provider.setTarget(networkClient.provider);\n networkProxy.blockTracker.setTarget(networkClient.blockTracker);\n }\n\n /**\n * This method is used when a domain is removed from the PermissionsController.\n * It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.\n *\n * @param domain - The domain for which to unset the network client ID.\n */\n #unsetNetworkClientIdForDomain(domain: Domain) {\n const globallySelectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n const networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy && globallySelectedNetworkClient) {\n networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);\n networkProxy.blockTracker.setTarget(\n globallySelectedNetworkClient.blockTracker,\n );\n } else if (networkProxy) {\n this.#domainProxyMap.delete(domain);\n }\n this.update((state) => {\n delete state.domains[domain];\n });\n }\n\n #domainHasPermissions(domain: Domain): boolean {\n return this.messagingSystem.call(\n 'PermissionController:hasPermissions',\n domain,\n );\n }\n\n // Loop through all domains and for those with permissions it points that domain's proxy\n // to an unproxied instance of the globally selected network client.\n // NOT the NetworkController's proxy of the globally selected networkClient\n #resetAllPermissionedDomains() {\n this.#domainProxyMap.forEach((_: NetworkProxy, domain: string) => {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n // can't use public setNetworkClientIdForDomain because it will throw an error\n // rather than simply skip if the domain doesn't have permissions which can happen\n // in this case since proxies are added for each site the user visits\n if (this.#domainHasPermissions(domain)) {\n this.#setNetworkClientIdForDomain(domain, selectedNetworkClientId);\n }\n });\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n if (!this.#useRequestQueuePreference) {\n return;\n }\n\n if (domain === METAMASK_DOMAIN) {\n throw new Error(\n `NetworkClientId for domain \"${METAMASK_DOMAIN}\" cannot be set on the SelectedNetworkController`,\n );\n }\n\n if (snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {\n return;\n }\n\n if (!this.#domainHasPermissions(domain)) {\n throw new Error(\n 'NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions',\n );\n }\n\n this.#setNetworkClientIdForDomain(domain, networkClientId);\n }\n\n getNetworkClientIdForDomain(domain: Domain): NetworkClientId {\n const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n if (!this.#useRequestQueuePreference) {\n return metamaskSelectedNetworkClientId;\n }\n return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @param domain - the domain for the provider\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(domain: Domain): NetworkProxy {\n // If the domain is 'metamask' or a snap, return the NetworkController's globally selected network client proxy\n if (\n domain === METAMASK_DOMAIN ||\n snapsPrefixes.some((prefix) => domain.startsWith(prefix))\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n return networkClient;\n }\n\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (\n this.#useRequestQueuePreference &&\n this.#domainHasPermissions(domain)\n ) {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n }\n networkProxy = {\n provider: createEventEmitterProxy(networkClient.provider),\n blockTracker: createEventEmitterProxy(networkClient.blockTracker, {\n eventFilter: 'skipInternal',\n }),\n };\n this.#domainProxyMap.set(domain, networkProxy);\n }\n return networkProxy;\n }\n}\n"]}
@@ -41,6 +41,10 @@ export type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<t
41
41
  export type SelectedNetworkControllerOptions = {
42
42
  state?: SelectedNetworkControllerState;
43
43
  messenger: SelectedNetworkControllerMessenger;
44
+ useRequestQueuePreference: boolean;
45
+ onPreferencesStateChange: (listener: (preferencesState: {
46
+ useRequestQueue: boolean;
47
+ }) => void) => void;
44
48
  domainProxyMap: Map<Domain, NetworkProxy>;
45
49
  };
46
50
  export type NetworkProxy = {
@@ -58,9 +62,11 @@ export declare class SelectedNetworkController extends BaseController<typeof con
58
62
  * @param options - The controller options.
59
63
  * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
60
64
  * @param options.state - The controllers initial state.
65
+ * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
66
+ * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
61
67
  * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
62
68
  */
63
- constructor({ messenger, state, domainProxyMap, }: SelectedNetworkControllerOptions);
69
+ constructor({ messenger, state, useRequestQueuePreference, onPreferencesStateChange, domainProxyMap, }: SelectedNetworkControllerOptions);
64
70
  setNetworkClientIdForDomain(domain: Domain, networkClientId: NetworkClientId): void;
65
71
  getNetworkClientIdForDomain(domain: Domain): NetworkClientId;
66
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SelectedNetworkController.d.cts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectedNetworkController.d.cts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,10 @@ export type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<t
41
41
  export type SelectedNetworkControllerOptions = {
42
42
  state?: SelectedNetworkControllerState;
43
43
  messenger: SelectedNetworkControllerMessenger;
44
+ useRequestQueuePreference: boolean;
45
+ onPreferencesStateChange: (listener: (preferencesState: {
46
+ useRequestQueue: boolean;
47
+ }) => void) => void;
44
48
  domainProxyMap: Map<Domain, NetworkProxy>;
45
49
  };
46
50
  export type NetworkProxy = {
@@ -58,9 +62,11 @@ export declare class SelectedNetworkController extends BaseController<typeof con
58
62
  * @param options - The controller options.
59
63
  * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
60
64
  * @param options.state - The controllers initial state.
65
+ * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
66
+ * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
61
67
  * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
62
68
  */
63
- constructor({ messenger, state, domainProxyMap, }: SelectedNetworkControllerOptions);
69
+ constructor({ messenger, state, useRequestQueuePreference, onPreferencesStateChange, domainProxyMap, }: SelectedNetworkControllerOptions);
64
70
  setNetworkClientIdForDomain(domain: Domain, networkClientId: NetworkClientId): void;
65
71
  getNetworkClientIdForDomain(domain: Domain): NetworkClientId;
66
72
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"SelectedNetworkController.d.mts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectedNetworkController.d.mts","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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"}
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
9
9
  if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
10
  return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
11
  };
12
- var _SelectedNetworkController_instances, _SelectedNetworkController_domainProxyMap, _SelectedNetworkController_registerMessageHandlers, _SelectedNetworkController_setNetworkClientIdForDomain, _SelectedNetworkController_unsetNetworkClientIdForDomain, _SelectedNetworkController_domainHasPermissions;
12
+ var _SelectedNetworkController_instances, _SelectedNetworkController_domainProxyMap, _SelectedNetworkController_useRequestQueuePreference, _SelectedNetworkController_registerMessageHandlers, _SelectedNetworkController_setNetworkClientIdForDomain, _SelectedNetworkController_unsetNetworkClientIdForDomain, _SelectedNetworkController_domainHasPermissions, _SelectedNetworkController_resetAllPermissionedDomains;
13
13
  import { BaseController } from "@metamask/base-controller";
14
14
  import { createEventEmitterProxy } from "@metamask/swappable-obj-proxy";
15
15
  export const controllerName = 'SelectedNetworkController';
@@ -41,9 +41,11 @@ export class SelectedNetworkController extends BaseController {
41
41
  * @param options - The controller options.
42
42
  * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.
43
43
  * @param options.state - The controllers initial state.
44
+ * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.
45
+ * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.
44
46
  * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
45
47
  */
46
- constructor({ messenger, state = getDefaultState(), domainProxyMap, }) {
48
+ constructor({ messenger, state = getDefaultState(), useRequestQueuePreference, onPreferencesStateChange, domainProxyMap, }) {
47
49
  super({
48
50
  name: controllerName,
49
51
  metadata: stateMetadata,
@@ -52,6 +54,8 @@ export class SelectedNetworkController extends BaseController {
52
54
  });
53
55
  _SelectedNetworkController_instances.add(this);
54
56
  _SelectedNetworkController_domainProxyMap.set(this, void 0);
57
+ _SelectedNetworkController_useRequestQueuePreference.set(this, void 0);
58
+ __classPrivateFieldSet(this, _SelectedNetworkController_useRequestQueuePreference, useRequestQueuePreference, "f");
55
59
  __classPrivateFieldSet(this, _SelectedNetworkController_domainProxyMap, domainProxyMap, "f");
56
60
  __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_registerMessageHandlers).call(this);
57
61
  // 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)
@@ -104,8 +108,26 @@ export class SelectedNetworkController extends BaseController {
104
108
  });
105
109
  }
106
110
  });
111
+ onPreferencesStateChange(({ useRequestQueue }) => {
112
+ if (__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f") !== useRequestQueue) {
113
+ if (!useRequestQueue) {
114
+ // Loop through all domains and points each domain's proxy
115
+ // to the NetworkController's own proxy of the globally selected networkClient
116
+ Object.keys(this.state.domains).forEach((domain) => {
117
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_unsetNetworkClientIdForDomain).call(this, domain);
118
+ });
119
+ }
120
+ else {
121
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_resetAllPermissionedDomains).call(this);
122
+ }
123
+ __classPrivateFieldSet(this, _SelectedNetworkController_useRequestQueuePreference, useRequestQueue, "f");
124
+ }
125
+ });
107
126
  }
108
127
  setNetworkClientIdForDomain(domain, networkClientId) {
128
+ if (!__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f")) {
129
+ return;
130
+ }
109
131
  if (domain === METAMASK_DOMAIN) {
110
132
  throw new Error(`NetworkClientId for domain "${METAMASK_DOMAIN}" cannot be set on the SelectedNetworkController`);
111
133
  }
@@ -119,6 +141,9 @@ export class SelectedNetworkController extends BaseController {
119
141
  }
120
142
  getNetworkClientIdForDomain(domain) {
121
143
  const { selectedNetworkClientId: metamaskSelectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
144
+ if (!__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f")) {
145
+ return metamaskSelectedNetworkClientId;
146
+ }
122
147
  return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;
123
148
  }
124
149
  /**
@@ -140,15 +165,16 @@ export class SelectedNetworkController extends BaseController {
140
165
  let networkProxy = __classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").get(domain);
141
166
  if (networkProxy === undefined) {
142
167
  let networkClient;
143
- if (__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
168
+ if (__classPrivateFieldGet(this, _SelectedNetworkController_useRequestQueuePreference, "f") &&
169
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
144
170
  const networkClientId = this.getNetworkClientIdForDomain(domain);
145
171
  networkClient = this.messagingSystem.call('NetworkController:getNetworkClientById', networkClientId);
146
172
  }
147
173
  else {
148
174
  networkClient = this.messagingSystem.call('NetworkController:getSelectedNetworkClient');
149
- }
150
- if (networkClient === undefined) {
151
- throw new Error('Selected network not initialized');
175
+ if (networkClient === undefined) {
176
+ throw new Error('Selected network not initialized');
177
+ }
152
178
  }
153
179
  networkProxy = {
154
180
  provider: createEventEmitterProxy(networkClient.provider),
@@ -161,7 +187,7 @@ export class SelectedNetworkController extends BaseController {
161
187
  return networkProxy;
162
188
  }
163
189
  }
164
- _SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkController_instances = new WeakSet(), _SelectedNetworkController_registerMessageHandlers = function _SelectedNetworkController_registerMessageHandlers() {
190
+ _SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkController_useRequestQueuePreference = new WeakMap(), _SelectedNetworkController_instances = new WeakSet(), _SelectedNetworkController_registerMessageHandlers = function _SelectedNetworkController_registerMessageHandlers() {
165
191
  this.messagingSystem.registerActionHandler(SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain, this.getNetworkClientIdForDomain.bind(this));
166
192
  this.messagingSystem.registerActionHandler(SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain, this.setNetworkClientIdForDomain.bind(this));
167
193
  }, _SelectedNetworkController_setNetworkClientIdForDomain = function _SelectedNetworkController_setNetworkClientIdForDomain(domain, networkClientId) {
@@ -189,5 +215,15 @@ _SelectedNetworkController_domainProxyMap = new WeakMap(), _SelectedNetworkContr
189
215
  });
190
216
  }, _SelectedNetworkController_domainHasPermissions = function _SelectedNetworkController_domainHasPermissions(domain) {
191
217
  return this.messagingSystem.call('PermissionController:hasPermissions', domain);
218
+ }, _SelectedNetworkController_resetAllPermissionedDomains = function _SelectedNetworkController_resetAllPermissionedDomains() {
219
+ __classPrivateFieldGet(this, _SelectedNetworkController_domainProxyMap, "f").forEach((_, domain) => {
220
+ const { selectedNetworkClientId } = this.messagingSystem.call('NetworkController:getState');
221
+ // can't use public setNetworkClientIdForDomain because it will throw an error
222
+ // rather than simply skip if the domain doesn't have permissions which can happen
223
+ // in this case since proxies are added for each site the user visits
224
+ if (__classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_domainHasPermissions).call(this, domain)) {
225
+ __classPrivateFieldGet(this, _SelectedNetworkController_instances, "m", _SelectedNetworkController_setNetworkClientIdForDomain).call(this, domain, selectedNetworkClientId);
226
+ }
227
+ });
192
228
  };
193
229
  //# sourceMappingURL=SelectedNetworkController.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"SelectedNetworkController.mjs","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n BlockTrackerProxy,\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n ProviderProxy,\n} from '@metamask/network-controller';\nimport type {\n PermissionControllerStateChange,\n GetSubjects as PermissionControllerGetSubjectsAction,\n HasPermissions as PermissionControllerHasPermissions,\n} from '@metamask/permission-controller';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { Hex } from '@metamask/utils';\nimport type { Patch } from 'immer';\n\nexport const controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({ domains: {} });\n\n// npm and local are currently the only valid prefixes for snap domains\n// TODO: eventually we maybe want to pull this in from snaps-utils to ensure it stays in sync\n// For now it seems like overkill to add a dependency for this one constant\n// https://github.com/MetaMask/snaps/blob/2beee7803bfe9e540788a3558b546b9f55dc3cb4/packages/snaps-utils/src/types.ts#L120\nconst snapsPrefixes = ['npm:', 'local:'] as const;\n\nexport type Domain = string;\n\nexport const METAMASK_DOMAIN = 'metamask' as const;\n\nexport const SelectedNetworkControllerActionTypes = {\n getState: `${controllerName}:getState` as const,\n getNetworkClientIdForDomain:\n `${controllerName}:getNetworkClientIdForDomain` as const,\n setNetworkClientIdForDomain:\n `${controllerName}:setNetworkClientIdForDomain` as const,\n};\n\nexport const SelectedNetworkControllerEventTypes = {\n stateChange: `${controllerName}:stateChange` as const,\n};\n\nexport type SelectedNetworkControllerState = {\n domains: Record<Domain, NetworkClientId>;\n};\n\nexport type SelectedNetworkControllerStateChangeEvent = {\n type: typeof SelectedNetworkControllerEventTypes.stateChange;\n payload: [SelectedNetworkControllerState, Patch[]];\n};\n\nexport type SelectedNetworkControllerGetSelectedNetworkStateAction = {\n type: typeof SelectedNetworkControllerActionTypes.getState;\n handler: () => SelectedNetworkControllerState;\n};\n\nexport type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;\n handler: SelectedNetworkController['getNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: SelectedNetworkController['setNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerActions =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetSelectedNetworkClientAction\n | NetworkControllerGetStateAction\n | PermissionControllerHasPermissions\n | PermissionControllerGetSubjectsAction;\n\nexport type SelectedNetworkControllerEvents =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | NetworkControllerStateChangeEvent\n | PermissionControllerStateChange;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerActions | AllowedActions,\n SelectedNetworkControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport type SelectedNetworkControllerOptions = {\n state?: SelectedNetworkControllerState;\n messenger: SelectedNetworkControllerMessenger;\n domainProxyMap: Map<Domain, NetworkProxy>;\n};\n\nexport type NetworkProxy = {\n provider: ProviderProxy;\n blockTracker: BlockTrackerProxy;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseController<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\n> {\n #domainProxyMap: Map<Domain, NetworkProxy>;\n\n /**\n * Construct a SelectedNetworkController controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.\n * @param options.state - The controllers initial state.\n * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.\n */\n constructor({\n messenger,\n state = getDefaultState(),\n domainProxyMap,\n }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state,\n });\n this.#domainProxyMap = domainProxyMap;\n this.#registerMessageHandlers();\n\n // 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)\n this.messagingSystem\n .call('PermissionController:getSubjectNames')\n .filter((domain) => this.state.domains[domain] === undefined)\n .forEach((domain) =>\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'PermissionController:stateChange',\n (_, patches) => {\n patches.forEach(({ op, path }) => {\n const isChangingSubject =\n path[0] === 'subjects' && path[1] !== undefined;\n if (isChangingSubject && typeof path[1] === 'string') {\n const domain = path[1];\n if (op === 'add' && this.state.domains[domain] === undefined) {\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n );\n } else if (\n op === 'remove' &&\n this.state.domains[domain] !== undefined\n ) {\n this.#unsetNetworkClientIdForDomain(domain);\n }\n }\n });\n },\n );\n\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (\n { selectedNetworkClientId, networkConfigurationsByChainId },\n patches,\n ) => {\n const patch = patches.find(\n ({ op, path }) =>\n (op === 'replace' || op === 'remove') &&\n path[0] === 'networkConfigurationsByChainId',\n );\n\n if (patch) {\n const networkClientIdToChainId = Object.values(\n networkConfigurationsByChainId,\n ).reduce((acc, network) => {\n network.rpcEndpoints.forEach(\n ({ networkClientId }) => (acc[networkClientId] = network.chainId),\n );\n return acc;\n }, {} as Record<string, Hex>);\n\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n const chainIdForDomain =\n networkClientIdToChainId[networkClientIdForDomain];\n\n if (patch.op === 'remove' && !chainIdForDomain) {\n // If the network was removed, fall back to the globally selected network\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n } else if (patch.op === 'replace') {\n // If the network was updated, redirect to the network's default endpoint\n\n const updatedChainId = patch.path[1] as Hex;\n if (!chainIdForDomain || chainIdForDomain === updatedChainId) {\n const network =\n networkConfigurationsByChainId[updatedChainId];\n\n const { networkClientId: defaultNetworkClientId } =\n network.rpcEndpoints[network.defaultRpcEndpointIndex];\n\n if (networkClientIdForDomain !== defaultNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n defaultNetworkClientId,\n );\n }\n }\n }\n },\n );\n }\n },\n );\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n }\n\n #setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n // This needs to happen before getProviderAndBlockTracker,\n // otherwise we may be referencing a network client ID that no longer exists.\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n\n const networkProxy = this.getProviderAndBlockTracker(domain);\n networkProxy.provider.setTarget(networkClient.provider);\n networkProxy.blockTracker.setTarget(networkClient.blockTracker);\n }\n\n /**\n * This method is used when a domain is removed from the PermissionsController.\n * It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.\n *\n * @param domain - The domain for which to unset the network client ID.\n */\n #unsetNetworkClientIdForDomain(domain: Domain) {\n const globallySelectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n const networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy && globallySelectedNetworkClient) {\n networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);\n networkProxy.blockTracker.setTarget(\n globallySelectedNetworkClient.blockTracker,\n );\n } else if (networkProxy) {\n this.#domainProxyMap.delete(domain);\n }\n this.update((state) => {\n delete state.domains[domain];\n });\n }\n\n #domainHasPermissions(domain: Domain): boolean {\n return this.messagingSystem.call(\n 'PermissionController:hasPermissions',\n domain,\n );\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n if (domain === METAMASK_DOMAIN) {\n throw new Error(\n `NetworkClientId for domain \"${METAMASK_DOMAIN}\" cannot be set on the SelectedNetworkController`,\n );\n }\n\n if (snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {\n return;\n }\n\n if (!this.#domainHasPermissions(domain)) {\n throw new Error(\n 'NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions',\n );\n }\n\n this.#setNetworkClientIdForDomain(domain, networkClientId);\n }\n\n getNetworkClientIdForDomain(domain: Domain): NetworkClientId {\n const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @param domain - the domain for the provider\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(domain: Domain): NetworkProxy {\n // If the domain is 'metamask' or a snap, return the NetworkController's globally selected network client proxy\n if (\n domain === METAMASK_DOMAIN ||\n snapsPrefixes.some((prefix) => domain.startsWith(prefix))\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n return networkClient;\n }\n\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (this.#domainHasPermissions(domain)) {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n }\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n\n networkProxy = {\n provider: createEventEmitterProxy(networkClient.provider),\n blockTracker: createEventEmitterProxy(networkClient.blockTracker, {\n eventFilter: 'skipInternal',\n }),\n };\n this.#domainProxyMap.set(domain, networkProxy);\n }\n return networkProxy;\n }\n}\n"]}
1
+ {"version":3,"file":"SelectedNetworkController.mjs","sourceRoot":"","sources":["../src/SelectedNetworkController.ts"],"names":[],"mappings":"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","sourcesContent":["import type { RestrictedControllerMessenger } from '@metamask/base-controller';\nimport { BaseController } from '@metamask/base-controller';\nimport type {\n BlockTrackerProxy,\n NetworkClientId,\n NetworkControllerGetNetworkClientByIdAction,\n NetworkControllerGetSelectedNetworkClientAction,\n NetworkControllerGetStateAction,\n NetworkControllerStateChangeEvent,\n ProviderProxy,\n} from '@metamask/network-controller';\nimport type {\n PermissionControllerStateChange,\n GetSubjects as PermissionControllerGetSubjectsAction,\n HasPermissions as PermissionControllerHasPermissions,\n} from '@metamask/permission-controller';\nimport { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';\nimport type { Hex } from '@metamask/utils';\nimport type { Patch } from 'immer';\n\nexport const controllerName = 'SelectedNetworkController';\n\nconst stateMetadata = {\n domains: { persist: true, anonymous: false },\n};\n\nconst getDefaultState = () => ({ domains: {} });\n\n// npm and local are currently the only valid prefixes for snap domains\n// TODO: eventually we maybe want to pull this in from snaps-utils to ensure it stays in sync\n// For now it seems like overkill to add a dependency for this one constant\n// https://github.com/MetaMask/snaps/blob/2beee7803bfe9e540788a3558b546b9f55dc3cb4/packages/snaps-utils/src/types.ts#L120\nconst snapsPrefixes = ['npm:', 'local:'] as const;\n\nexport type Domain = string;\n\nexport const METAMASK_DOMAIN = 'metamask' as const;\n\nexport const SelectedNetworkControllerActionTypes = {\n getState: `${controllerName}:getState` as const,\n getNetworkClientIdForDomain:\n `${controllerName}:getNetworkClientIdForDomain` as const,\n setNetworkClientIdForDomain:\n `${controllerName}:setNetworkClientIdForDomain` as const,\n};\n\nexport const SelectedNetworkControllerEventTypes = {\n stateChange: `${controllerName}:stateChange` as const,\n};\n\nexport type SelectedNetworkControllerState = {\n domains: Record<Domain, NetworkClientId>;\n};\n\nexport type SelectedNetworkControllerStateChangeEvent = {\n type: typeof SelectedNetworkControllerEventTypes.stateChange;\n payload: [SelectedNetworkControllerState, Patch[]];\n};\n\nexport type SelectedNetworkControllerGetSelectedNetworkStateAction = {\n type: typeof SelectedNetworkControllerActionTypes.getState;\n handler: () => SelectedNetworkControllerState;\n};\n\nexport type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;\n handler: SelectedNetworkController['getNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerSetNetworkClientIdForDomainAction = {\n type: typeof SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain;\n handler: SelectedNetworkController['setNetworkClientIdForDomain'];\n};\n\nexport type SelectedNetworkControllerActions =\n | SelectedNetworkControllerGetSelectedNetworkStateAction\n | SelectedNetworkControllerGetNetworkClientIdForDomainAction\n | SelectedNetworkControllerSetNetworkClientIdForDomainAction;\n\nexport type AllowedActions =\n | NetworkControllerGetNetworkClientByIdAction\n | NetworkControllerGetSelectedNetworkClientAction\n | NetworkControllerGetStateAction\n | PermissionControllerHasPermissions\n | PermissionControllerGetSubjectsAction;\n\nexport type SelectedNetworkControllerEvents =\n SelectedNetworkControllerStateChangeEvent;\n\nexport type AllowedEvents =\n | NetworkControllerStateChangeEvent\n | PermissionControllerStateChange;\n\nexport type SelectedNetworkControllerMessenger = RestrictedControllerMessenger<\n typeof controllerName,\n SelectedNetworkControllerActions | AllowedActions,\n SelectedNetworkControllerEvents | AllowedEvents,\n AllowedActions['type'],\n AllowedEvents['type']\n>;\n\nexport type SelectedNetworkControllerOptions = {\n state?: SelectedNetworkControllerState;\n messenger: SelectedNetworkControllerMessenger;\n useRequestQueuePreference: boolean;\n onPreferencesStateChange: (\n listener: (preferencesState: { useRequestQueue: boolean }) => void,\n ) => void;\n domainProxyMap: Map<Domain, NetworkProxy>;\n};\n\nexport type NetworkProxy = {\n provider: ProviderProxy;\n blockTracker: BlockTrackerProxy;\n};\n\n/**\n * Controller for getting and setting the network for a particular domain.\n */\nexport class SelectedNetworkController extends BaseController<\n typeof controllerName,\n SelectedNetworkControllerState,\n SelectedNetworkControllerMessenger\n> {\n #domainProxyMap: Map<Domain, NetworkProxy>;\n\n #useRequestQueuePreference: boolean;\n\n /**\n * Construct a SelectedNetworkController controller.\n *\n * @param options - The controller options.\n * @param options.messenger - The restricted controller messenger for the EncryptionPublicKey controller.\n * @param options.state - The controllers initial state.\n * @param options.useRequestQueuePreference - A boolean indicating whether to use the request queue preference.\n * @param options.onPreferencesStateChange - A callback that is called when the preference state changes.\n * @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.\n */\n constructor({\n messenger,\n state = getDefaultState(),\n useRequestQueuePreference,\n onPreferencesStateChange,\n domainProxyMap,\n }: SelectedNetworkControllerOptions) {\n super({\n name: controllerName,\n metadata: stateMetadata,\n messenger,\n state,\n });\n this.#useRequestQueuePreference = useRequestQueuePreference;\n this.#domainProxyMap = domainProxyMap;\n this.#registerMessageHandlers();\n\n // 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)\n this.messagingSystem\n .call('PermissionController:getSubjectNames')\n .filter((domain) => this.state.domains[domain] === undefined)\n .forEach((domain) =>\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n ),\n );\n\n this.messagingSystem.subscribe(\n 'PermissionController:stateChange',\n (_, patches) => {\n patches.forEach(({ op, path }) => {\n const isChangingSubject =\n path[0] === 'subjects' && path[1] !== undefined;\n if (isChangingSubject && typeof path[1] === 'string') {\n const domain = path[1];\n if (op === 'add' && this.state.domains[domain] === undefined) {\n this.setNetworkClientIdForDomain(\n domain,\n this.messagingSystem.call('NetworkController:getState')\n .selectedNetworkClientId,\n );\n } else if (\n op === 'remove' &&\n this.state.domains[domain] !== undefined\n ) {\n this.#unsetNetworkClientIdForDomain(domain);\n }\n }\n });\n },\n );\n\n this.messagingSystem.subscribe(\n 'NetworkController:stateChange',\n (\n { selectedNetworkClientId, networkConfigurationsByChainId },\n patches,\n ) => {\n const patch = patches.find(\n ({ op, path }) =>\n (op === 'replace' || op === 'remove') &&\n path[0] === 'networkConfigurationsByChainId',\n );\n\n if (patch) {\n const networkClientIdToChainId = Object.values(\n networkConfigurationsByChainId,\n ).reduce((acc, network) => {\n network.rpcEndpoints.forEach(\n ({ networkClientId }) => (acc[networkClientId] = network.chainId),\n );\n return acc;\n }, {} as Record<string, Hex>);\n\n Object.entries(this.state.domains).forEach(\n ([domain, networkClientIdForDomain]) => {\n const chainIdForDomain =\n networkClientIdToChainId[networkClientIdForDomain];\n\n if (patch.op === 'remove' && !chainIdForDomain) {\n // If the network was removed, fall back to the globally selected network\n this.setNetworkClientIdForDomain(\n domain,\n selectedNetworkClientId,\n );\n } else if (patch.op === 'replace') {\n // If the network was updated, redirect to the network's default endpoint\n\n const updatedChainId = patch.path[1] as Hex;\n if (!chainIdForDomain || chainIdForDomain === updatedChainId) {\n const network =\n networkConfigurationsByChainId[updatedChainId];\n\n const { networkClientId: defaultNetworkClientId } =\n network.rpcEndpoints[network.defaultRpcEndpointIndex];\n\n if (networkClientIdForDomain !== defaultNetworkClientId) {\n this.setNetworkClientIdForDomain(\n domain,\n defaultNetworkClientId,\n );\n }\n }\n }\n },\n );\n }\n },\n );\n\n onPreferencesStateChange(({ useRequestQueue }) => {\n if (this.#useRequestQueuePreference !== useRequestQueue) {\n if (!useRequestQueue) {\n // Loop through all domains and points each domain's proxy\n // to the NetworkController's own proxy of the globally selected networkClient\n Object.keys(this.state.domains).forEach((domain) => {\n this.#unsetNetworkClientIdForDomain(domain);\n });\n } else {\n this.#resetAllPermissionedDomains();\n }\n this.#useRequestQueuePreference = useRequestQueue;\n }\n });\n }\n\n #registerMessageHandlers(): void {\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,\n this.getNetworkClientIdForDomain.bind(this),\n );\n this.messagingSystem.registerActionHandler(\n SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,\n this.setNetworkClientIdForDomain.bind(this),\n );\n }\n\n #setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n\n // This needs to happen before getProviderAndBlockTracker,\n // otherwise we may be referencing a network client ID that no longer exists.\n this.update((state) => {\n state.domains[domain] = networkClientId;\n });\n\n const networkProxy = this.getProviderAndBlockTracker(domain);\n networkProxy.provider.setTarget(networkClient.provider);\n networkProxy.blockTracker.setTarget(networkClient.blockTracker);\n }\n\n /**\n * This method is used when a domain is removed from the PermissionsController.\n * It will remove re-point the network proxy to the globally selected network in the domainProxyMap or, if no globally selected network client is available, delete the proxy.\n *\n * @param domain - The domain for which to unset the network client ID.\n */\n #unsetNetworkClientIdForDomain(domain: Domain) {\n const globallySelectedNetworkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n const networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy && globallySelectedNetworkClient) {\n networkProxy.provider.setTarget(globallySelectedNetworkClient.provider);\n networkProxy.blockTracker.setTarget(\n globallySelectedNetworkClient.blockTracker,\n );\n } else if (networkProxy) {\n this.#domainProxyMap.delete(domain);\n }\n this.update((state) => {\n delete state.domains[domain];\n });\n }\n\n #domainHasPermissions(domain: Domain): boolean {\n return this.messagingSystem.call(\n 'PermissionController:hasPermissions',\n domain,\n );\n }\n\n // Loop through all domains and for those with permissions it points that domain's proxy\n // to an unproxied instance of the globally selected network client.\n // NOT the NetworkController's proxy of the globally selected networkClient\n #resetAllPermissionedDomains() {\n this.#domainProxyMap.forEach((_: NetworkProxy, domain: string) => {\n const { selectedNetworkClientId } = this.messagingSystem.call(\n 'NetworkController:getState',\n );\n // can't use public setNetworkClientIdForDomain because it will throw an error\n // rather than simply skip if the domain doesn't have permissions which can happen\n // in this case since proxies are added for each site the user visits\n if (this.#domainHasPermissions(domain)) {\n this.#setNetworkClientIdForDomain(domain, selectedNetworkClientId);\n }\n });\n }\n\n setNetworkClientIdForDomain(\n domain: Domain,\n networkClientId: NetworkClientId,\n ) {\n if (!this.#useRequestQueuePreference) {\n return;\n }\n\n if (domain === METAMASK_DOMAIN) {\n throw new Error(\n `NetworkClientId for domain \"${METAMASK_DOMAIN}\" cannot be set on the SelectedNetworkController`,\n );\n }\n\n if (snapsPrefixes.some((prefix) => domain.startsWith(prefix))) {\n return;\n }\n\n if (!this.#domainHasPermissions(domain)) {\n throw new Error(\n 'NetworkClientId for domain cannot be called with a domain that has not yet been granted permissions',\n );\n }\n\n this.#setNetworkClientIdForDomain(domain, networkClientId);\n }\n\n getNetworkClientIdForDomain(domain: Domain): NetworkClientId {\n const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =\n this.messagingSystem.call('NetworkController:getState');\n if (!this.#useRequestQueuePreference) {\n return metamaskSelectedNetworkClientId;\n }\n return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;\n }\n\n /**\n * Accesses the provider and block tracker for the currently selected network.\n *\n * @param domain - the domain for the provider\n * @returns The proxy and block tracker proxies.\n */\n getProviderAndBlockTracker(domain: Domain): NetworkProxy {\n // If the domain is 'metamask' or a snap, return the NetworkController's globally selected network client proxy\n if (\n domain === METAMASK_DOMAIN ||\n snapsPrefixes.some((prefix) => domain.startsWith(prefix))\n ) {\n const networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n return networkClient;\n }\n\n let networkProxy = this.#domainProxyMap.get(domain);\n if (networkProxy === undefined) {\n let networkClient;\n if (\n this.#useRequestQueuePreference &&\n this.#domainHasPermissions(domain)\n ) {\n const networkClientId = this.getNetworkClientIdForDomain(domain);\n networkClient = this.messagingSystem.call(\n 'NetworkController:getNetworkClientById',\n networkClientId,\n );\n } else {\n networkClient = this.messagingSystem.call(\n 'NetworkController:getSelectedNetworkClient',\n );\n if (networkClient === undefined) {\n throw new Error('Selected network not initialized');\n }\n }\n networkProxy = {\n provider: createEventEmitterProxy(networkClient.provider),\n blockTracker: createEventEmitterProxy(networkClient.blockTracker, {\n eventFilter: 'skipInternal',\n }),\n };\n this.#domainProxyMap.set(domain, networkProxy);\n }\n return networkProxy;\n }\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metamask/selected-network-controller",
3
- "version": "20.0.1",
3
+ "version": "21.0.0",
4
4
  "description": "Provides an interface to the currently selected networkClientId for a given domain",
5
5
  "keywords": [
6
6
  "MetaMask",
@@ -47,15 +47,15 @@
47
47
  "test:watch": "NODE_OPTIONS=--experimental-vm-modules jest --watch"
48
48
  },
49
49
  "dependencies": {
50
- "@metamask/base-controller": "^7.0.2",
51
- "@metamask/json-rpc-engine": "^10.0.1",
52
- "@metamask/swappable-obj-proxy": "^2.2.0",
53
- "@metamask/utils": "^10.0.0"
50
+ "@metamask/base-controller": "^7.1.1",
51
+ "@metamask/json-rpc-engine": "^10.0.2",
52
+ "@metamask/swappable-obj-proxy": "^2.3.0",
53
+ "@metamask/utils": "^11.0.1"
54
54
  },
55
55
  "devDependencies": {
56
56
  "@metamask/auto-changelog": "^3.4.4",
57
- "@metamask/network-controller": "^22.1.0",
58
- "@metamask/permission-controller": "^11.0.4",
57
+ "@metamask/network-controller": "^22.1.1",
58
+ "@metamask/permission-controller": "^11.0.5",
59
59
  "@types/jest": "^27.4.1",
60
60
  "deepmerge": "^4.2.2",
61
61
  "immer": "^9.0.6",