Skip to content

Commit bfb8cbb

Browse files
authored
refactor: migrate GatorPermissionsController to @metamask/messenger (#6461)
## 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 `GatorPermissionsController` 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 `GatorPermissionsController` to `@metamask/messenger`, updates Base Controller imports/metadata, refactors tests, and wires package/graph updates. > > - **Breaking changes**: > - Move from `RestrictedMessenger` (via `@metamask/base-controller`) to `Messenger` from `@metamask/messenger` in `GatorPermissionsController` and tests. > - Rename state metadata key `anonymous` to `includeInDebugSnapshot`; switch imports to `@metamask/base-controller/next`. > - **Controller** (`packages/gator-permissions-controller/src/GatorPermissionsController.ts`): > - Replace `messagingSystem` usages with `messenger` (`registerActionHandler`, `call`). > - Update `GatorPermissionsControllerMessenger` type to use `Messenger`. > - Preserve state shape; keep getters/actions; no behavior change beyond messenger plumbing. > - **Tests** (`packages/gator-permissions-controller/src/GatorPermissionsController.test.ts`): > - Refactor to new `Messenger` types/utilities; introduce root/delegated messenger setup; update metadata tests to `includeInDebugSnapshot`. > - **Package config**: > - Add dependency `@metamask/messenger` and TypeScript project references to `packages/messenger`. > - **Docs/graph**: > - Update README dependency graph to show `base_controller --> messenger` and `gator_permissions_controller --> messenger`; add `eip_7702_internal_rpc_middleware` edge. > - **Changelog**: > - Note breaking migration to `@metamask/messenger` and metadata rename under Unreleased. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 15b0e0c. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent ff928bc commit bfb8cbb

File tree

8 files changed

+110
-77
lines changed

8 files changed

+110
-77
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ linkStyle default opacity:0.5
250250
gas_fee_controller --> polling_controller;
251251
gas_fee_controller --> network_controller;
252252
gator_permissions_controller --> base_controller;
253+
gator_permissions_controller --> messenger;
253254
json_rpc_middleware_stream --> json_rpc_engine;
254255
keyring_controller --> base_controller;
255256
logging_controller --> base_controller;

packages/gator-permissions-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` ([#6461](https://github.com/MetaMask/core/pull/6461))
13+
- Previously, `GatorPermissionsController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`.
14+
- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6461](https://github.com/MetaMask/core/pull/6461))
15+
1016
## [0.2.2]
1117

1218
### Changed

packages/gator-permissions-controller/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
"@metamask/base-controller": "^8.4.2",
5252
"@metamask/delegation-core": "^0.2.0",
5353
"@metamask/delegation-deployments": "^0.12.0",
54+
"@metamask/messenger": "^0.3.0",
5455
"@metamask/snaps-sdk": "^9.0.0",
5556
"@metamask/snaps-utils": "^11.0.0",
5657
"@metamask/utils": "^11.8.1"

packages/gator-permissions-controller/src/GatorPermissionsController.test.ts

Lines changed: 59 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import type { AccountSigner } from '@metamask/7715-permission-types';
2-
import { Messenger, deriveStateFromMetadata } from '@metamask/base-controller';
2+
import { deriveStateFromMetadata } from '@metamask/base-controller/next';
33
import {
44
createTimestampTerms,
55
createNativeTokenStreamingTerms,
@@ -9,6 +9,13 @@ import {
99
CHAIN_ID,
1010
DELEGATOR_CONTRACTS,
1111
} from '@metamask/delegation-deployments';
12+
import {
13+
MOCK_ANY_NAMESPACE,
14+
Messenger,
15+
type MessengerActions,
16+
type MessengerEvents,
17+
type MockAnyNamespace,
18+
} from '@metamask/messenger';
1219
import type { HandleSnapRequest, HasSnap } from '@metamask/snaps-controllers';
1320
import type { SnapId } from '@metamask/snaps-sdk';
1421
import { hexToBigInt, numberToHex, type Hex } from '@metamask/utils';
@@ -30,10 +37,6 @@ import type {
3037
StoredGatorPermission,
3138
PermissionTypesWithCustom,
3239
} from './types';
33-
import type {
34-
ExtractAvailableAction,
35-
ExtractAvailableEvent,
36-
} from '../../base-controller/tests/helpers';
3740

3841
const MOCK_CHAIN_ID_1: Hex = '0xaa36a7';
3942
const MOCK_CHAIN_ID_2: Hex = '0x1';
@@ -83,7 +86,7 @@ describe('GatorPermissionsController', () => {
8386
describe('constructor', () => {
8487
it('creates GatorPermissionsController with default state', () => {
8588
const controller = new GatorPermissionsController({
86-
messenger: getMessenger(),
89+
messenger: getGatorPermissionsControllerMessenger(),
8790
});
8891

8992
expect(controller.state.isGatorPermissionsEnabled).toBe(false);
@@ -113,7 +116,7 @@ describe('GatorPermissionsController', () => {
113116
};
114117

115118
const controller = new GatorPermissionsController({
116-
messenger: getMessenger(),
119+
messenger: getGatorPermissionsControllerMessenger(),
117120
state: customState,
118121
});
119122

@@ -128,7 +131,7 @@ describe('GatorPermissionsController', () => {
128131

129132
it('creates GatorPermissionsController with default config', () => {
130133
const controller = new GatorPermissionsController({
131-
messenger: getMessenger(),
134+
messenger: getGatorPermissionsControllerMessenger(),
132135
});
133136

134137
expect(controller.permissionsProviderSnapId).toBe(
@@ -140,7 +143,7 @@ describe('GatorPermissionsController', () => {
140143

141144
it('isFetchingGatorPermissions is false on initialization', () => {
142145
const controller = new GatorPermissionsController({
143-
messenger: getMessenger(),
146+
messenger: getGatorPermissionsControllerMessenger(),
144147
state: {
145148
isFetchingGatorPermissions: true,
146149
},
@@ -153,7 +156,7 @@ describe('GatorPermissionsController', () => {
153156
describe('disableGatorPermissions', () => {
154157
it('disables gator permissions successfully', async () => {
155158
const controller = new GatorPermissionsController({
156-
messenger: getMessenger(),
159+
messenger: getGatorPermissionsControllerMessenger(),
157160
});
158161

159162
await controller.enableGatorPermissions();
@@ -177,7 +180,7 @@ describe('GatorPermissionsController', () => {
177180
describe('fetchAndUpdateGatorPermissions', () => {
178181
it('fetches and updates gator permissions successfully', async () => {
179182
const controller = new GatorPermissionsController({
180-
messenger: getMessenger(),
183+
messenger: getGatorPermissionsControllerMessenger(),
181184
});
182185

183186
await controller.enableGatorPermissions();
@@ -224,7 +227,7 @@ describe('GatorPermissionsController', () => {
224227

225228
it('throws error when gator permissions are not enabled', async () => {
226229
const controller = new GatorPermissionsController({
227-
messenger: getMessenger(),
230+
messenger: getGatorPermissionsControllerMessenger(),
228231
});
229232

230233
await controller.disableGatorPermissions();
@@ -240,7 +243,7 @@ describe('GatorPermissionsController', () => {
240243
});
241244

242245
const controller = new GatorPermissionsController({
243-
messenger: getMessenger(rootMessenger),
246+
messenger: getGatorPermissionsControllerMessenger(rootMessenger),
244247
});
245248

246249
await controller.enableGatorPermissions();
@@ -262,7 +265,7 @@ describe('GatorPermissionsController', () => {
262265
});
263266

264267
const controller = new GatorPermissionsController({
265-
messenger: getMessenger(rootMessenger),
268+
messenger: getGatorPermissionsControllerMessenger(rootMessenger),
266269
});
267270

268271
await controller.enableGatorPermissions();
@@ -286,7 +289,7 @@ describe('GatorPermissionsController', () => {
286289
});
287290

288291
const controller = new GatorPermissionsController({
289-
messenger: getMessenger(rootMessenger),
292+
messenger: getGatorPermissionsControllerMessenger(rootMessenger),
290293
});
291294

292295
await controller.enableGatorPermissions();
@@ -302,7 +305,7 @@ describe('GatorPermissionsController', () => {
302305
describe('gatorPermissionsMap getter tests', () => {
303306
it('returns parsed gator permissions map', () => {
304307
const controller = new GatorPermissionsController({
305-
messenger: getMessenger(),
308+
messenger: getGatorPermissionsControllerMessenger(),
306309
});
307310

308311
const { gatorPermissionsMap } = controller;
@@ -340,7 +343,7 @@ describe('GatorPermissionsController', () => {
340343
};
341344

342345
const controller = new GatorPermissionsController({
343-
messenger: getMessenger(),
346+
messenger: getGatorPermissionsControllerMessenger(),
344347
state: {
345348
gatorPermissionsMapSerialized: JSON.stringify(mockState),
346349
},
@@ -354,7 +357,7 @@ describe('GatorPermissionsController', () => {
354357

355358
describe('message handlers tests', () => {
356359
it('registers all message handlers', () => {
357-
const messenger = getMessenger();
360+
const messenger = getGatorPermissionsControllerMessenger();
358361
const mockRegisterActionHandler = jest.spyOn(
359362
messenger,
360363
'registerActionHandler',
@@ -382,7 +385,7 @@ describe('GatorPermissionsController', () => {
382385
describe('enableGatorPermissions', () => {
383386
it('enables gator permissions successfully', async () => {
384387
const controller = new GatorPermissionsController({
385-
messenger: getMessenger(),
388+
messenger: getGatorPermissionsControllerMessenger(),
386389
});
387390

388391
await controller.enableGatorPermissions();
@@ -394,21 +397,21 @@ describe('GatorPermissionsController', () => {
394397
describe('metadata', () => {
395398
it('includes expected state in debug snapshots', () => {
396399
const controller = new GatorPermissionsController({
397-
messenger: getMessenger(),
400+
messenger: getGatorPermissionsControllerMessenger(),
398401
});
399402

400403
expect(
401404
deriveStateFromMetadata(
402405
controller.state,
403406
controller.metadata,
404-
'anonymous',
407+
'includeInDebugSnapshot',
405408
),
406409
).toMatchInlineSnapshot(`Object {}`);
407410
});
408411

409412
it('includes expected state in state logs', () => {
410413
const controller = new GatorPermissionsController({
411-
messenger: getMessenger(),
414+
messenger: getGatorPermissionsControllerMessenger(),
412415
});
413416

414417
expect(
@@ -429,7 +432,7 @@ describe('GatorPermissionsController', () => {
429432

430433
it('persists expected state', () => {
431434
const controller = new GatorPermissionsController({
432-
messenger: getMessenger(),
435+
messenger: getGatorPermissionsControllerMessenger(),
433436
});
434437

435438
expect(
@@ -448,7 +451,7 @@ describe('GatorPermissionsController', () => {
448451

449452
it('exposes expected state to UI', () => {
450453
const controller = new GatorPermissionsController({
451-
messenger: getMessenger(),
454+
messenger: getGatorPermissionsControllerMessenger(),
452455
});
453456

454457
expect(
@@ -484,7 +487,7 @@ describe('GatorPermissionsController', () => {
484487

485488
beforeEach(() => {
486489
controller = new GatorPermissionsController({
487-
messenger: getMessenger(),
490+
messenger: getGatorPermissionsControllerMessenger(),
488491
});
489492
});
490493

@@ -693,15 +696,23 @@ describe('GatorPermissionsController', () => {
693696
/**
694697
* The union of actions that the root messenger allows.
695698
*/
696-
type RootAction = ExtractAvailableAction<GatorPermissionsControllerMessenger>;
699+
type AllGatorPermissionsControllerActions =
700+
MessengerActions<GatorPermissionsControllerMessenger>;
697701

698702
/**
699703
* The union of events that the root messenger allows.
700704
*/
701-
type RootEvent = ExtractAvailableEvent<GatorPermissionsControllerMessenger>;
705+
type AllGatorPermissionsControllerEvents =
706+
MessengerEvents<GatorPermissionsControllerMessenger>;
707+
708+
type RootMessenger = Messenger<
709+
MockAnyNamespace,
710+
AllGatorPermissionsControllerActions,
711+
AllGatorPermissionsControllerEvents
712+
>;
702713

703714
/**
704-
* Constructs the unrestricted messenger. This can be used to call actions and
715+
* Constructs the root messenger. This can be used to call actions and
705716
* publish events within the tests for this controller.
706717
*
707718
* @param args - The arguments to this function.
@@ -725,8 +736,10 @@ function getRootMessenger({
725736
}: {
726737
snapControllerHandleRequestActionHandler?: HandleSnapRequest['handler'];
727738
snapControllerHasActionHandler?: HasSnap['handler'];
728-
} = {}): Messenger<RootAction, RootEvent> {
729-
const rootMessenger = new Messenger<RootAction, RootEvent>();
739+
} = {}): RootMessenger {
740+
const rootMessenger: RootMessenger = new Messenger({
741+
namespace: MOCK_ANY_NAMESPACE,
742+
});
730743

731744
rootMessenger.registerActionHandler(
732745
'SnapController:handleRequest',
@@ -740,18 +753,27 @@ function getRootMessenger({
740753
}
741754

742755
/**
743-
* Constructs the messenger which is restricted to relevant SampleGasPricesController
756+
* Constructs the messenger supporting relevant SampleGasPricesController
744757
* actions and events.
745758
*
746759
* @param rootMessenger - The root messenger to restrict.
747-
* @returns The restricted messenger.
760+
* @returns The controller messenger.
748761
*/
749-
function getMessenger(
762+
function getGatorPermissionsControllerMessenger(
750763
rootMessenger = getRootMessenger(),
751764
): GatorPermissionsControllerMessenger {
752-
return rootMessenger.getRestricted({
753-
name: 'GatorPermissionsController',
754-
allowedActions: ['SnapController:handleRequest', 'SnapController:has'],
755-
allowedEvents: [],
765+
const gatorPermissionsControllerMessenger = new Messenger<
766+
'GatorPermissionsController',
767+
AllGatorPermissionsControllerActions,
768+
AllGatorPermissionsControllerEvents,
769+
RootMessenger
770+
>({
771+
namespace: 'GatorPermissionsController',
772+
parent: rootMessenger,
773+
});
774+
rootMessenger.delegate({
775+
messenger: gatorPermissionsControllerMessenger,
776+
actions: ['SnapController:handleRequest', 'SnapController:has'],
756777
});
778+
return gatorPermissionsControllerMessenger;
757779
}

0 commit comments

Comments
 (0)