Skip to content

Commit 10b12ec

Browse files
refactor: migrate SelectedNetworkController to @metamask/messenger (#6500)
## Explanation <!-- Thanks for your contribution! Take a moment to answer these questions so that reviewers have the information they need to properly understand your changes: * What is the current state of things and why does it need to change? * What is the solution your changes offer and how does it work? * Are there any changes whose purpose might not obvious to those unfamiliar with the domain? * If your primary goal was to update one package but you found you had to update another one along the way, why did you do so? * If you had to upgrade a dependency, why did you do so? --> This PR migrates `SelectedNetworkController ` to the new `@metamask/messenger` message bus, as opposed to the one exported from `@metamask/base-controller`. ## References <!-- Are there any issues that this pull request is tied to? Are there other links that reviewers should consult to understand these changes better? Are there client or consumer pull requests to adopt any breaking changes? For example: * Fixes #12345 * Related to #67890 --> * Related to #5626 ## 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 communicated my changes to consumers by [updating changelogs for packages I've changed](https://github.com/MetaMask/core/tree/main/docs/contributing.md#updating-changelogs), highlighting breaking changes as necessary - [ ] I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Migrates SelectedNetworkController to the new @metamask/messenger API, updates action/event typing via base-controller/next, renames metadata flag, and updates tests/config/docs accordingly. > > - **SelectedNetworkController**: > - Migrate to `@metamask/messenger` `Messenger`; replace `messagingSystem` calls and handlers with `messenger`. > - Adopt `@metamask/base-controller/next` types (`ControllerGetStateAction`, `ControllerStateChangeEvent`). > - Update action/event/messenger types; keep `get/setNetworkClientIdForDomain` behavior and subscriptions. > - Rename state metadata `anonymous` -> `includeInDebugSnapshot`. > - **Middleware/Tests**: > - Refactor tests to construct a root messenger and delegate the controller namespace; update middleware tests to use the new messenger. > - **Package/Config/Docs**: > - Add dependency `@metamask/messenger` and reference it in `tsconfig` project refs. > - Update `CHANGELOG.md` with BREAKING changes (new messenger; metadata rename). > - Refresh README dependency graph to show `selected_network_controller --> messenger` (and related edge additions). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 3d1dc50. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> Co-authored-by: Michele Esposito <michele@esposito.codes>
1 parent bf60e5e commit 10b12ec

File tree

9 files changed

+204
-141
lines changed

9 files changed

+204
-141
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,7 @@ linkStyle default opacity:0.5
325325
seedless_onboarding_controller --> keyring_controller;
326326
selected_network_controller --> base_controller;
327327
selected_network_controller --> json_rpc_engine;
328+
selected_network_controller --> messenger;
328329
selected_network_controller --> network_controller;
329330
selected_network_controller --> permission_controller;
330331
shield_controller --> base_controller;

packages/selected-network-controller/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
### Changed
11+
12+
- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6500](https://github.com/MetaMask/core/pull/6500))
13+
- Previously, `SelectedNetworkController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
14+
- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6500](https://github.com/MetaMask/core/pull/6500))
15+
1016
## [24.0.2]
1117

1218
### Changed

packages/selected-network-controller/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
"dependencies": {
5050
"@metamask/base-controller": "^8.4.2",
5151
"@metamask/json-rpc-engine": "^10.1.1",
52+
"@metamask/messenger": "^0.3.0",
5253
"@metamask/swappable-obj-proxy": "^2.3.0",
5354
"@metamask/utils": "^11.8.1"
5455
},

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

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
import type { RestrictedMessenger } from '@metamask/base-controller';
2-
import { BaseController } from '@metamask/base-controller';
1+
import {
2+
BaseController,
3+
type ControllerGetStateAction,
4+
type ControllerStateChangeEvent,
5+
} from '@metamask/base-controller/next';
6+
import type { Messenger } from '@metamask/messenger';
37
import type {
48
BlockTrackerProxy,
59
NetworkClientId,
@@ -16,15 +20,14 @@ import type {
1620
} from '@metamask/permission-controller';
1721
import { createEventEmitterProxy } from '@metamask/swappable-obj-proxy';
1822
import type { Hex } from '@metamask/utils';
19-
import type { Patch } from 'immer';
2023

21-
export const controllerName = 'SelectedNetworkController';
24+
const controllerName = 'SelectedNetworkController';
2225

2326
const stateMetadata = {
2427
domains: {
2528
includeInStateLogs: true,
2629
persist: true,
27-
anonymous: false,
30+
includeInDebugSnapshot: false,
2831
usedInUi: true,
2932
},
3033
};
@@ -51,15 +54,17 @@ export type SelectedNetworkControllerState = {
5154
domains: Record<Domain, NetworkClientId>;
5255
};
5356

54-
export type SelectedNetworkControllerStateChangeEvent = {
55-
type: typeof SelectedNetworkControllerEventTypes.stateChange;
56-
payload: [SelectedNetworkControllerState, Patch[]];
57-
};
57+
export type SelectedNetworkControllerStateChangeEvent =
58+
ControllerStateChangeEvent<
59+
typeof controllerName,
60+
SelectedNetworkControllerState
61+
>;
5862

59-
export type SelectedNetworkControllerGetSelectedNetworkStateAction = {
60-
type: typeof SelectedNetworkControllerActionTypes.getState;
61-
handler: () => SelectedNetworkControllerState;
62-
};
63+
export type SelectedNetworkControllerGetSelectedNetworkStateAction =
64+
ControllerGetStateAction<
65+
typeof controllerName,
66+
SelectedNetworkControllerState
67+
>;
6368

6469
export type SelectedNetworkControllerGetNetworkClientIdForDomainAction = {
6570
type: typeof SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain;
@@ -76,7 +81,7 @@ export type SelectedNetworkControllerActions =
7681
| SelectedNetworkControllerGetNetworkClientIdForDomainAction
7782
| SelectedNetworkControllerSetNetworkClientIdForDomainAction;
7883

79-
export type AllowedActions =
84+
type AllowedActions =
8085
| NetworkControllerGetNetworkClientByIdAction
8186
| NetworkControllerGetSelectedNetworkClientAction
8287
| NetworkControllerGetStateAction
@@ -86,16 +91,14 @@ export type AllowedActions =
8691
export type SelectedNetworkControllerEvents =
8792
SelectedNetworkControllerStateChangeEvent;
8893

89-
export type AllowedEvents =
94+
type AllowedEvents =
9095
| NetworkControllerStateChangeEvent
9196
| PermissionControllerStateChange;
9297

93-
export type SelectedNetworkControllerMessenger = RestrictedMessenger<
98+
export type SelectedNetworkControllerMessenger = Messenger<
9499
typeof controllerName,
95100
SelectedNetworkControllerActions | AllowedActions,
96-
SelectedNetworkControllerEvents | AllowedEvents,
97-
AllowedActions['type'],
98-
AllowedEvents['type']
101+
SelectedNetworkControllerEvents | AllowedEvents
99102
>;
100103

101104
export type SelectedNetworkControllerOptions = {
@@ -123,7 +126,7 @@ export class SelectedNetworkController extends BaseController<
123126
* Construct a SelectedNetworkController controller.
124127
*
125128
* @param options - The controller options.
126-
* @param options.messenger - The restricted messenger for the EncryptionPublicKey controller.
129+
* @param options.messenger - The messenger for the SelectedNetworkController controller.
127130
* @param options.state - The controllers initial state.
128131
* @param options.domainProxyMap - A map for storing domain-specific proxies that are held in memory only during use.
129132
*/
@@ -142,18 +145,18 @@ export class SelectedNetworkController extends BaseController<
142145
this.#registerMessageHandlers();
143146

144147
// 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)
145-
this.messagingSystem
148+
this.messenger
146149
.call('PermissionController:getSubjectNames')
147150
.filter((domain) => this.state.domains[domain] === undefined)
148151
.forEach((domain) =>
149152
this.setNetworkClientIdForDomain(
150153
domain,
151-
this.messagingSystem.call('NetworkController:getState')
154+
this.messenger.call('NetworkController:getState')
152155
.selectedNetworkClientId,
153156
),
154157
);
155158

156-
this.messagingSystem.subscribe(
159+
this.messenger.subscribe(
157160
'PermissionController:stateChange',
158161
(_, patches) => {
159162
patches.forEach(({ op, path }) => {
@@ -164,7 +167,7 @@ export class SelectedNetworkController extends BaseController<
164167
if (op === 'add' && this.state.domains[domain] === undefined) {
165168
this.setNetworkClientIdForDomain(
166169
domain,
167-
this.messagingSystem.call('NetworkController:getState')
170+
this.messenger.call('NetworkController:getState')
168171
.selectedNetworkClientId,
169172
);
170173
} else if (
@@ -178,7 +181,7 @@ export class SelectedNetworkController extends BaseController<
178181
},
179182
);
180183

181-
this.messagingSystem.subscribe(
184+
this.messenger.subscribe(
182185
'NetworkController:stateChange',
183186
(
184187
{ selectedNetworkClientId, networkConfigurationsByChainId },
@@ -242,11 +245,11 @@ export class SelectedNetworkController extends BaseController<
242245
}
243246

244247
#registerMessageHandlers(): void {
245-
this.messagingSystem.registerActionHandler(
248+
this.messenger.registerActionHandler(
246249
SelectedNetworkControllerActionTypes.getNetworkClientIdForDomain,
247250
this.getNetworkClientIdForDomain.bind(this),
248251
);
249-
this.messagingSystem.registerActionHandler(
252+
this.messenger.registerActionHandler(
250253
SelectedNetworkControllerActionTypes.setNetworkClientIdForDomain,
251254
this.setNetworkClientIdForDomain.bind(this),
252255
);
@@ -256,7 +259,7 @@ export class SelectedNetworkController extends BaseController<
256259
domain: Domain,
257260
networkClientId: NetworkClientId,
258261
) {
259-
const networkClient = this.messagingSystem.call(
262+
const networkClient = this.messenger.call(
260263
'NetworkController:getNetworkClientById',
261264
networkClientId,
262265
);
@@ -279,7 +282,7 @@ export class SelectedNetworkController extends BaseController<
279282
* @param domain - The domain for which to unset the network client ID.
280283
*/
281284
#unsetNetworkClientIdForDomain(domain: Domain) {
282-
const globallySelectedNetworkClient = this.messagingSystem.call(
285+
const globallySelectedNetworkClient = this.messenger.call(
283286
'NetworkController:getSelectedNetworkClient',
284287
);
285288
const networkProxy = this.#domainProxyMap.get(domain);
@@ -297,10 +300,7 @@ export class SelectedNetworkController extends BaseController<
297300
}
298301

299302
#domainHasPermissions(domain: Domain): boolean {
300-
return this.messagingSystem.call(
301-
'PermissionController:hasPermissions',
302-
domain,
303-
);
303+
return this.messenger.call('PermissionController:hasPermissions', domain);
304304
}
305305

306306
setNetworkClientIdForDomain(
@@ -324,7 +324,7 @@ export class SelectedNetworkController extends BaseController<
324324

325325
getNetworkClientIdForDomain(domain: Domain): NetworkClientId {
326326
const { selectedNetworkClientId: metamaskSelectedNetworkClientId } =
327-
this.messagingSystem.call('NetworkController:getState');
327+
this.messenger.call('NetworkController:getState');
328328

329329
return this.state.domains[domain] ?? metamaskSelectedNetworkClientId;
330330
}
@@ -338,7 +338,7 @@ export class SelectedNetworkController extends BaseController<
338338
getProviderAndBlockTracker(domain: Domain): NetworkProxy {
339339
// If the domain is 'metamask', return the NetworkController's globally selected network client proxy
340340
if (domain === METAMASK_DOMAIN) {
341-
const networkClient = this.messagingSystem.call(
341+
const networkClient = this.messenger.call(
342342
'NetworkController:getSelectedNetworkClient',
343343
);
344344
if (networkClient === undefined) {
@@ -352,12 +352,12 @@ export class SelectedNetworkController extends BaseController<
352352
let networkClient;
353353
if (this.#domainHasPermissions(domain)) {
354354
const networkClientId = this.getNetworkClientIdForDomain(domain);
355-
networkClient = this.messagingSystem.call(
355+
networkClient = this.messenger.call(
356356
'NetworkController:getNetworkClientById',
357357
networkClientId,
358358
);
359359
} else {
360-
networkClient = this.messagingSystem.call(
360+
networkClient = this.messenger.call(
361361
'NetworkController:getSelectedNetworkClient',
362362
);
363363
if (networkClient === undefined) {

0 commit comments

Comments
 (0)