Skip to content

Commit 7baa5d9

Browse files
FrederikBoldingMrtenzmikespositocryptodev-2s
authored
refactor: base controller migration (#3611)
Closes #3315. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Replaces RestrictedMessenger with @metamask/messenger across packages, renames metadata flag, and updates deps/tests and controller wiring with breaking API changes. > > - **Core refactor (breaking)**: > - Replace `RestrictedMessenger` with `@metamask/messenger` `Messenger` across `snaps-controllers`, `snaps-rpc-methods`, `snaps-simulation`, and `snaps-utils`. > - Rename metadata `anonymous` to `includeInDebugSnapshot` in controllers; update persistence and debug snapshot handling. > - Switch all `messagingSystem.*` calls to `messenger.*` (`subscribe`, `unsubscribe`, `registerActionHandler`, `call`, `publish`). > - Update controller constructor types and exported messengers (e.g., `CronjobControllerMessenger`, `SnapInsightsControllerMessenger`, `SnapInterfaceControllerMessenger`, `MultichainRouterMessenger`, `ExecutionServiceMessenger`, `WebSocketServiceMessenger`). > - `snaps-rpc-methods`: `handleSnapInstall` now takes `messenger` (was `messagingSystem`). > - Export `WithSnapKeyringFunction` from `MultichainRouter`. > - **Dependency updates**: > - Bump `@metamask/approval-controller` → `^8.0.0`, `@metamask/base-controller` → `^9.0.0`, `@metamask/permission-controller` → `^12.0.0`; add `@metamask/messenger` where needed; remove `@metamask/base-controller` in some packages. > - **Tests and mocks**: > - Update test utilities to use `Messenger` delegation; adapt expectations from `rootMessenger.call` to `controllerMessenger.call`. > - Adjust mocks/enums (e.g., `PhishingDetectorResultType`), add JSON-RPC `id/jsonrpc` fields, and origin constants. > - **Misc**: > - Minor API and typing tweaks (e.g., persistence via `deriveStateFromMetadata`, WebSocket mock fixes). > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit b53fe57. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY --> --------- Co-authored-by: Maarten Zuidhoorn <[email protected]> Co-authored-by: Michele Esposito <[email protected]> Co-authored-by: Salah-Eddine Saakoun <[email protected]>
1 parent 98d7c04 commit 7baa5d9

39 files changed

+679
-651
lines changed

packages/snaps-controllers/CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ 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` ([#3611](https://github.com/MetaMask/snaps/pull/3611))
13+
- Previously, `SnapController`, `CronjobController`, `SnapInsightsController`, `SnapInterfaceController`, `MultichainRouter`, `ExecutionService` and `WebSocketService` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
14+
- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#3611](https://github.com/MetaMask/snaps/pull/3611))
15+
- Bump `@metamask/approval-controller` from `^7.2.0` to `^8.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611))
16+
- Bump `@metamask/base-controller` from `^8.4.1` to `^9.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611))
17+
- Bump `@metamask/permission-controller` from `^11.0.6` to `^12.0.0`(([#3611](https://github.com/MetaMask/snaps/pull/3611))
18+
1019
## [15.0.2]
1120

1221
### Fixed
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
2-
"branches": 95.23,
3-
"functions": 99,
4-
"lines": 98.74,
5-
"statements": 98.58
2+
"branches": 94.87,
3+
"functions": 98.03,
4+
"lines": 98.63,
5+
"statements": 98.43
66
}

packages/snaps-controllers/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,13 +79,14 @@
7979
"test:watch": "jest --watch"
8080
},
8181
"dependencies": {
82-
"@metamask/approval-controller": "^7.2.0",
83-
"@metamask/base-controller": "^8.4.1",
82+
"@metamask/approval-controller": "^8.0.0",
83+
"@metamask/base-controller": "^9.0.0",
8484
"@metamask/json-rpc-engine": "^10.1.0",
8585
"@metamask/json-rpc-middleware-stream": "^8.0.8",
8686
"@metamask/key-tree": "^10.1.1",
87+
"@metamask/messenger": "^0.3.0",
8788
"@metamask/object-multiplex": "^2.1.0",
88-
"@metamask/permission-controller": "^11.0.6",
89+
"@metamask/permission-controller": "^12.0.0",
8990
"@metamask/phishing-controller": "^13.1.0",
9091
"@metamask/post-message-stream": "^10.0.0",
9192
"@metamask/rpc-errors": "^7.0.3",

packages/snaps-controllers/src/cronjob/CronjobController.test.ts

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,14 @@ describe('CronjobController', () => {
7272

7373
cronjobController.register(MOCK_SNAP_ID);
7474

75-
expect(rootMessenger.call).toHaveBeenCalledWith(
75+
expect(controllerMessenger.call).toHaveBeenCalledWith(
7676
'PermissionController:getPermissions',
7777
MOCK_SNAP_ID,
7878
);
7979

8080
jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute));
8181

82-
expect(rootMessenger.call).toHaveBeenNthCalledWith(
82+
expect(controllerMessenger.call).toHaveBeenNthCalledWith(
8383
2,
8484
'SnapController:handleRequest',
8585
{
@@ -121,14 +121,14 @@ describe('CronjobController', () => {
121121

122122
cronjobController.register(MOCK_SNAP_ID);
123123

124-
expect(rootMessenger.call).toHaveBeenCalledWith(
124+
expect(controllerMessenger.call).toHaveBeenCalledWith(
125125
'PermissionController:getPermissions',
126126
MOCK_SNAP_ID,
127127
);
128128

129129
jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute));
130130

131-
expect(rootMessenger.call).toHaveBeenNthCalledWith(
131+
expect(controllerMessenger.call).toHaveBeenNthCalledWith(
132132
2,
133133
'SnapController:handleRequest',
134134
{
@@ -162,7 +162,7 @@ describe('CronjobController', () => {
162162

163163
jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute));
164164

165-
expect(rootMessenger.call).not.toHaveBeenCalledWith(
165+
expect(controllerMessenger.call).not.toHaveBeenCalledWith(
166166
'SnapController:handleRequest',
167167
{
168168
snapId: MOCK_SNAP_ID,
@@ -212,7 +212,7 @@ describe('CronjobController', () => {
212212

213213
jest.advanceTimersByTime(inMilliseconds(24, Duration.Hour));
214214

215-
expect(rootMessenger.call).toHaveBeenCalledWith(
215+
expect(controllerMessenger.call).toHaveBeenCalledWith(
216216
'SnapController:handleRequest',
217217
{
218218
snapId: MOCK_SNAP_ID,
@@ -263,7 +263,7 @@ describe('CronjobController', () => {
263263
cronjobController.init();
264264

265265
await new Promise((resolve) => originalProcessNextTick(resolve));
266-
expect(rootMessenger.call).toHaveBeenCalledWith(
266+
expect(controllerMessenger.call).toHaveBeenCalledWith(
267267
'SnapController:handleRequest',
268268
{
269269
snapId: MOCK_SNAP_ID,
@@ -312,13 +312,13 @@ describe('CronjobController', () => {
312312
cronjobController.register(MOCK_SNAP_ID);
313313
jest.runOnlyPendingTimers();
314314

315-
expect(rootMessenger.call).toHaveBeenCalledTimes(1);
316-
expect(rootMessenger.call).toHaveBeenCalledWith(
315+
expect(controllerMessenger.call).toHaveBeenCalledTimes(1);
316+
expect(controllerMessenger.call).toHaveBeenCalledWith(
317317
'PermissionController:getPermissions',
318318
MOCK_SNAP_ID,
319319
);
320320

321-
expect(rootMessenger.call).not.toHaveBeenCalledWith(
321+
expect(controllerMessenger.call).not.toHaveBeenCalledWith(
322322
'SnapController:handleRequest',
323323
{
324324
snapId: MOCK_SNAP_ID,
@@ -360,18 +360,18 @@ describe('CronjobController', () => {
360360
cronjobController.register(MOCK_SNAP_ID);
361361

362362
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
363-
expect(rootMessenger.call).toHaveBeenCalledTimes(1);
364-
expect(rootMessenger.call).toHaveBeenCalledWith(
363+
expect(controllerMessenger.call).toHaveBeenCalledTimes(1);
364+
expect(controllerMessenger.call).toHaveBeenCalledWith(
365365
'PermissionController:getPermissions',
366366
MOCK_SNAP_ID,
367367
);
368368

369369
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
370-
expect(rootMessenger.call).toHaveBeenCalledTimes(1);
370+
expect(controllerMessenger.call).toHaveBeenCalledTimes(1);
371371

372372
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
373-
expect(rootMessenger.call).toHaveBeenCalledTimes(2);
374-
expect(rootMessenger.call).toHaveBeenNthCalledWith(
373+
expect(controllerMessenger.call).toHaveBeenCalledTimes(2);
374+
expect(controllerMessenger.call).toHaveBeenNthCalledWith(
375375
2,
376376
'SnapController:handleRequest',
377377
{
@@ -451,7 +451,7 @@ describe('CronjobController', () => {
451451

452452
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
453453

454-
expect(rootMessenger.call).toHaveBeenCalledWith(
454+
expect(controllerMessenger.call).toHaveBeenCalledWith(
455455
'SnapController:handleRequest',
456456
{
457457
snapId: MOCK_SNAP_ID,
@@ -514,7 +514,7 @@ describe('CronjobController', () => {
514514

515515
jest.advanceTimersByTime(inMilliseconds(1, Duration.Minute));
516516

517-
expect(rootMessenger.call).toHaveBeenNthCalledWith(
517+
expect(controllerMessenger.call).toHaveBeenNthCalledWith(
518518
2,
519519
'SnapController:handleRequest',
520520
{
@@ -528,7 +528,7 @@ describe('CronjobController', () => {
528528
},
529529
);
530530

531-
expect(rootMessenger.call).toHaveBeenCalledTimes(2);
531+
expect(controllerMessenger.call).toHaveBeenCalledTimes(2);
532532

533533
cronjobController.destroy();
534534
});
@@ -623,8 +623,8 @@ describe('CronjobController', () => {
623623

624624
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
625625

626-
expect(rootMessenger.call).toHaveBeenCalledTimes(3);
627-
expect(rootMessenger.call).toHaveBeenNthCalledWith(
626+
expect(controllerMessenger.call).toHaveBeenCalledTimes(3);
627+
expect(controllerMessenger.call).toHaveBeenNthCalledWith(
628628
2,
629629
'SnapController:handleRequest',
630630
{
@@ -638,7 +638,7 @@ describe('CronjobController', () => {
638638
},
639639
);
640640

641-
expect(rootMessenger.call).toHaveBeenNthCalledWith(
641+
expect(controllerMessenger.call).toHaveBeenNthCalledWith(
642642
3,
643643
'SnapController:handleRequest',
644644
{
@@ -817,8 +817,8 @@ describe('CronjobController', () => {
817817

818818
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
819819

820-
expect(rootMessenger.call).toHaveBeenCalledTimes(1);
821-
expect(rootMessenger.call).toHaveBeenCalledWith(
820+
expect(controllerMessenger.call).toHaveBeenCalledTimes(1);
821+
expect(controllerMessenger.call).toHaveBeenCalledWith(
822822
'PermissionController:getPermissions',
823823
MOCK_SNAP_ID,
824824
);
@@ -905,7 +905,7 @@ describe('CronjobController', () => {
905905

906906
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
907907

908-
expect(rootMessenger.call).toHaveBeenCalledWith(
908+
expect(controllerMessenger.call).toHaveBeenCalledWith(
909909
'SnapController:handleRequest',
910910
{
911911
snapId: MOCK_SNAP_ID,
@@ -1111,7 +1111,7 @@ describe('CronjobController', () => {
11111111

11121112
jest.advanceTimersByTime(inMilliseconds(1, Duration.Day));
11131113

1114-
expect(rootMessenger.call).toHaveBeenCalledWith(
1114+
expect(controllerMessenger.call).toHaveBeenCalledWith(
11151115
'SnapController:handleRequest',
11161116
{
11171117
snapId: MOCK_SNAP_ID,

packages/snaps-controllers/src/cronjob/CronjobController.ts

Lines changed: 22 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import type {
2-
RestrictedMessenger,
32
ControllerGetStateAction,
43
ControllerStateChangeEvent,
54
} from '@metamask/base-controller';
65
import { BaseController } from '@metamask/base-controller';
6+
import type { Messenger } from '@metamask/messenger';
77
import type { GetPermissions } from '@metamask/permission-controller';
88
import {
99
getCronjobCaveatJobs,
@@ -83,12 +83,10 @@ export type CronjobControllerEvents =
8383
| SnapEnabled
8484
| SnapDisabled;
8585

86-
export type CronjobControllerMessenger = RestrictedMessenger<
86+
export type CronjobControllerMessenger = Messenger<
8787
typeof controllerName,
8888
CronjobControllerActions,
89-
CronjobControllerEvents,
90-
CronjobControllerActions['type'],
91-
CronjobControllerEvents['type']
89+
CronjobControllerEvents
9290
>;
9391

9492
export const DAILY_TIMEOUT = inMilliseconds(24, Duration.Hour);
@@ -181,7 +179,7 @@ export class CronjobController extends BaseController<
181179
events: {
182180
includeInStateLogs: false,
183181
persist: false,
184-
anonymous: false,
182+
includeInDebugSnapshot: false,
185183
usedInUi: false,
186184
},
187185
},
@@ -196,49 +194,47 @@ export class CronjobController extends BaseController<
196194
this.#timers = new Map();
197195
this.#stateManager = stateManager;
198196

199-
this.messagingSystem.subscribe(
197+
this.messenger.subscribe(
200198
'SnapController:snapInstalled',
201199
this.#handleSnapInstalledEvent,
202200
);
203201

204-
this.messagingSystem.subscribe(
202+
this.messenger.subscribe(
205203
'SnapController:snapUninstalled',
206204
this.#handleSnapUninstalledEvent,
207205
);
208206

209-
this.messagingSystem.subscribe(
207+
this.messenger.subscribe(
210208
'SnapController:snapEnabled',
211209
this.#handleSnapEnabledEvent,
212210
);
213211

214-
this.messagingSystem.subscribe(
212+
this.messenger.subscribe(
215213
'SnapController:snapDisabled',
216214
this.#handleSnapDisabledEvent,
217215
);
218216

219-
this.messagingSystem.subscribe(
217+
this.messenger.subscribe(
220218
'SnapController:snapUpdated',
221219
this.#handleSnapUpdatedEvent,
222220
);
223221

224-
this.messagingSystem.registerActionHandler(
225-
`${controllerName}:init`,
226-
(...args) => this.init(...args),
222+
this.messenger.registerActionHandler(`${controllerName}:init`, (...args) =>
223+
this.init(...args),
227224
);
228225

229-
this.messagingSystem.registerActionHandler(
226+
this.messenger.registerActionHandler(
230227
`${controllerName}:schedule`,
231228
(...args) => this.schedule(...args),
232229
);
233230

234-
this.messagingSystem.registerActionHandler(
231+
this.messenger.registerActionHandler(
235232
`${controllerName}:cancel`,
236233
(...args) => this.cancel(...args),
237234
);
238235

239-
this.messagingSystem.registerActionHandler(
240-
`${controllerName}:get`,
241-
(...args) => this.get(...args),
236+
this.messenger.registerActionHandler(`${controllerName}:get`, (...args) =>
237+
this.get(...args),
242238
);
243239
}
244240

@@ -336,27 +332,27 @@ export class CronjobController extends BaseController<
336332
destroy() {
337333
super.destroy();
338334

339-
this.messagingSystem.unsubscribe(
335+
this.messenger.unsubscribe(
340336
'SnapController:snapInstalled',
341337
this.#handleSnapInstalledEvent,
342338
);
343339

344-
this.messagingSystem.unsubscribe(
340+
this.messenger.unsubscribe(
345341
'SnapController:snapUninstalled',
346342
this.#handleSnapUninstalledEvent,
347343
);
348344

349-
this.messagingSystem.unsubscribe(
345+
this.messenger.unsubscribe(
350346
'SnapController:snapEnabled',
351347
this.#handleSnapEnabledEvent,
352348
);
353349

354-
this.messagingSystem.unsubscribe(
350+
this.messenger.unsubscribe(
355351
'SnapController:snapDisabled',
356352
this.#handleSnapDisabledEvent,
357353
);
358354

359-
this.messagingSystem.unsubscribe(
355+
this.messenger.unsubscribe(
360356
'SnapController:snapUpdated',
361357
this.#handleSnapUpdatedEvent,
362358
);
@@ -473,7 +469,7 @@ export class CronjobController extends BaseController<
473469
* @param event - The event to execute.
474470
*/
475471
#execute(event: InternalBackgroundEvent) {
476-
this.messagingSystem
472+
this.messenger
477473
.call('SnapController:handleRequest', {
478474
snapId: event.snapId,
479475
origin: METAMASK_ORIGIN,
@@ -529,7 +525,7 @@ export class CronjobController extends BaseController<
529525
* @returns Array of cronjob specifications.
530526
*/
531527
#getSnapCronjobs(snapId: SnapId): SchedulableBackgroundEvent[] {
532-
const permissions = this.messagingSystem.call(
528+
const permissions = this.messenger.call(
533529
'PermissionController:getPermissions',
534530
snapId,
535531
);

0 commit comments

Comments
 (0)