Skip to content

Commit 981e9a2

Browse files
authored
refactor(mobile-platform): remove duplicate messenger types (#32050)
## **Description** Apply the messenger type refactoring from PR #31467 to the messenger files owned by `@MetaMask/mobile-platform`. This is the final team in a series of per-team PRs (see #31969, #31971, #31973, #31974, #31977, #31978, #31979, #31980, #32005). The refactoring: - Narrows `rootMessenger` parameters from the unnarrowed `RootMessenger` to `RootMessenger<MessengerActions<X>, MessengerEvents<X>>`, making callers' requirements explicit in the type signature. - Simplifies 4-param `new Messenger<N, A, E, Root>({...})` constructors to typed variable declarations (`const messenger: XMessenger = new Messenger({...})`), letting TypeScript infer the generic arguments. - Converts `ReturnType<typeof getXInitMessenger>` type aliases to explicit `Messenger<'Namespace', Actions, Events>` types. - Removes re-exports of package types from two messenger files (`ClientControllerMessenger`, `GeolocationControllerActions/Events`) — callers should import directly from the package. Three files (`account-tracker-controller-messenger`, `multichain-routing-service-messenger`, `snap-account-service-messenger`) have package-defined action types that do not extend `GlobalActions` (the same structural mismatch as `SnapInterfaceControllerMessenger`). These use `Messenger<'Root', A, E>` directly in the parameter type to bypass the `extends GlobalActions` constraint on the `RootMessenger` type alias while still providing equivalent narrowing. ## **Changelog** CHANGELOG entry: null ## **Related issues** Refs: #31467 ## **Manual testing steps** N/A — type-only changes; no runtime behaviour altered. ## **Screenshots/Recordings** ### **Before** N/A ### **After** N/A ## **Pre-merge author checklist** - [x] I've followed [MetaMask Contributor Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile Coding Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md). - [x] I've completed the PR template to the best of my ability - [x] I've included tests if applicable - [x] I've documented my code using [JSDoc](https://jsdoc.app/) format if applicable - [x] I've applied the right labels on the PR (see [labeling guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)). Not required for external contributors. #### Performance checks (if applicable) - [ ] I've tested on Android - [ ] I've tested with a power user scenario - [ ] I've instrumented key operations with Sentry traces for production performance metrics ## **Pre-merge reviewer checklist** - [ ] I've manually tested the PR (e.g. pull and build branch, run the app, test code being changed). - [ ] I confirm that this PR addresses all acceptance criteria described in the ticket it closes and includes the necessary testing evidence such as recordings and or screenshots. <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Low Risk** > Compile-time-only changes across messenger wiring; delegate action/event lists are unchanged, so runtime Engine behavior should be unaffected aside from stricter TypeScript at call sites. > > **Overview** > Applies the messenger typing refactor from #31467 across **mobile-platform** Engine messenger factories: callers must pass a **narrowed** `rootMessenger` (`RootMessenger<MessengerActions<X>, MessengerEvents<X>>` or equivalent) instead of an unnarrowed root, and child messengers are created via **typed** `const messenger: XMessenger = new Messenger({...})` rather than four-parameter `new Messenger<...>` generics. > > **Init messenger** type aliases move from `ReturnType<typeof getXInitMessenger>` to explicit `Messenger<'Namespace', Actions, Events>`. Several factories that previously took **`RootExtendedMessenger`** now take **`RootMessenger`** with the same delegate wiring. **`ClientControllerMessenger`** and **Geolocation** action/event re-exports are removed from messenger modules (import from packages instead). Messenger tests import **`RootMessenger`** from `../types` instead of ad-hoc `ExtendedMessenger` / local root types. > > **Exceptions:** `account-tracker-controller-messenger`, `multichain-routing-service-messenger`, and `snap-account-service-messenger` narrow the root parameter with `Messenger<'Root', Actions, Events>` where package action types do not satisfy `GlobalActions` on the `RootMessenger` alias. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 2d73fd3. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent 069f0cb commit 981e9a2

49 files changed

Lines changed: 465 additions & 577 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

app/core/Engine/messengers/account-tracker-controller-messenger.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
MessengerEvents,
55
} from '@metamask/messenger';
66
import { AccountTrackerControllerMessenger } from '@metamask/assets-controllers';
7-
import { RootMessenger } from '../types';
87

98
/**
109
* Get the AccountTrackerControllerMessenger for the AccountTrackerController.
@@ -13,14 +12,13 @@ import { RootMessenger } from '../types';
1312
* @returns The AccountTrackerControllerMessenger.
1413
*/
1514
export function getAccountTrackerControllerMessenger(
16-
rootMessenger: RootMessenger,
17-
): AccountTrackerControllerMessenger {
18-
const messenger = new Messenger<
19-
'AccountTrackerController',
15+
rootMessenger: Messenger<
16+
'Root',
2017
MessengerActions<AccountTrackerControllerMessenger>,
21-
MessengerEvents<AccountTrackerControllerMessenger>,
22-
RootMessenger
23-
>({
18+
MessengerEvents<AccountTrackerControllerMessenger>
19+
>,
20+
): AccountTrackerControllerMessenger {
21+
const messenger: AccountTrackerControllerMessenger = new Messenger({
2422
namespace: 'AccountTrackerController',
2523
parent: rootMessenger,
2624
});

app/core/Engine/messengers/address-book-controller-messenger.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@ import { RootMessenger } from '../types';
1313
* @returns The AddressBookControllerMessenger.
1414
*/
1515
export function getAddressBookControllerMessenger(
16-
rootMessenger: RootMessenger,
17-
): AddressBookControllerMessenger {
18-
const messenger = new Messenger<
19-
'AddressBookController',
16+
rootMessenger: RootMessenger<
2017
MessengerActions<AddressBookControllerMessenger>,
21-
MessengerEvents<AddressBookControllerMessenger>,
22-
RootMessenger
23-
>({
18+
MessengerEvents<AddressBookControllerMessenger>
19+
>,
20+
): AddressBookControllerMessenger {
21+
const messenger: AddressBookControllerMessenger = new Messenger({
2422
namespace: 'AddressBookController',
2523
parent: rootMessenger,
2624
});

app/core/Engine/messengers/analytics-controller-messenger.ts

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,22 +14,22 @@ import { RootMessenger } from '../types';
1414
* @returns The AnalyticsControllerMessenger.
1515
*/
1616
export function getAnalyticsControllerMessenger(
17-
rootMessenger: RootMessenger,
18-
): AnalyticsControllerMessenger {
19-
const messenger = new Messenger<
20-
'AnalyticsController',
17+
rootMessenger: RootMessenger<
2118
MessengerActions<AnalyticsControllerMessenger>,
22-
MessengerEvents<AnalyticsControllerMessenger>,
23-
RootMessenger
24-
>({
19+
MessengerEvents<AnalyticsControllerMessenger>
20+
>,
21+
): AnalyticsControllerMessenger {
22+
const messenger: AnalyticsControllerMessenger = new Messenger({
2523
namespace: 'AnalyticsController',
2624
parent: rootMessenger,
2725
});
2826
return messenger;
2927
}
3028

31-
export type AnalyticsControllerInitMessenger = ReturnType<
32-
typeof getAnalyticsControllerInitMessenger
29+
export type AnalyticsControllerInitMessenger = Messenger<
30+
'AnalyticsControllerInit',
31+
never,
32+
AccountsControllerChangeEvent
3333
>;
3434

3535
/**
@@ -41,14 +41,12 @@ export type AnalyticsControllerInitMessenger = ReturnType<
4141
* @returns The AnalyticsControllerInitMessenger.
4242
*/
4343
export function getAnalyticsControllerInitMessenger(
44-
rootMessenger: RootMessenger,
45-
) {
46-
const messenger = new Messenger<
47-
'AnalyticsControllerInit',
48-
never,
49-
AccountsControllerChangeEvent,
50-
RootMessenger
51-
>({
44+
rootMessenger: RootMessenger<
45+
MessengerActions<AnalyticsControllerInitMessenger>,
46+
MessengerEvents<AnalyticsControllerInitMessenger>
47+
>,
48+
): AnalyticsControllerInitMessenger {
49+
const messenger: AnalyticsControllerInitMessenger = new Messenger({
5250
namespace: 'AnalyticsControllerInit',
5351
parent: rootMessenger,
5452
});

app/core/Engine/messengers/app-metadata-controller-messenger/index.ts

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,25 +4,23 @@ import {
44
MessengerEvents,
55
} from '@metamask/messenger';
66
import { AppMetadataControllerMessenger } from '@metamask/app-metadata-controller';
7-
import { RootExtendedMessenger, RootMessenger } from '../../types';
7+
import { RootMessenger } from '../../types';
88

99
/**
1010
* Get the AppMetadataControllerMessenger for the AppMetadataController.
1111
*
12-
* @param rootExtendedMessenger - The root extended messenger.
12+
* @param rootMessenger - The root messenger.
1313
* @returns The AppMetadataControllerMessenger.
1414
*/
1515
export function getAppMetadataControllerMessenger(
16-
rootExtendedMessenger: RootExtendedMessenger,
17-
): AppMetadataControllerMessenger {
18-
const messenger = new Messenger<
19-
'AppMetadataController',
16+
rootMessenger: RootMessenger<
2017
MessengerActions<AppMetadataControllerMessenger>,
21-
MessengerEvents<AppMetadataControllerMessenger>,
22-
RootMessenger
23-
>({
18+
MessengerEvents<AppMetadataControllerMessenger>
19+
>,
20+
): AppMetadataControllerMessenger {
21+
const messenger: AppMetadataControllerMessenger = new Messenger({
2422
namespace: 'AppMetadataController',
25-
parent: rootExtendedMessenger,
23+
parent: rootMessenger,
2624
});
2725
return messenger;
2826
}

app/core/Engine/messengers/assets-contract-controller-messenger.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,12 @@ import { AssetsContractControllerMessenger } from '@metamask/assets-controllers'
1414
* @returns The AssetsContractControllerMessenger.
1515
*/
1616
export function getAssetsContractControllerMessenger(
17-
rootMessenger: RootMessenger,
18-
): AssetsContractControllerMessenger {
19-
const messenger = new Messenger<
20-
'AssetsContractController',
17+
rootMessenger: RootMessenger<
2118
MessengerActions<AssetsContractControllerMessenger>,
22-
MessengerEvents<AssetsContractControllerMessenger>,
23-
RootMessenger
24-
>({
19+
MessengerEvents<AssetsContractControllerMessenger>
20+
>,
21+
): AssetsContractControllerMessenger {
22+
const messenger: AssetsContractControllerMessenger = new Messenger({
2523
namespace: 'AssetsContractController',
2624
parent: rootMessenger,
2725
});

app/core/Engine/messengers/assets-controller/assets-controller-messenger.ts

Lines changed: 28 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,26 @@ import { AuthenticationController } from '@metamask/profile-sync-controller';
88
import type { PreferencesControllerGetStateAction } from '@metamask/preferences-controller';
99
import type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';
1010
import type { AnalyticsControllerActions } from '@metamask/analytics-controller';
11-
import { RootExtendedMessenger, RootMessenger } from '../../types';
11+
import { RootMessenger } from '../../types';
1212

1313
/**
1414
* Get the messenger for the AssetsController. This is scoped to the
1515
* actions and events that the AssetsController is allowed to handle.
1616
*
17-
* @param rootExtendedMessenger - The root extended messenger.
17+
* @param rootMessenger - The root messenger.
1818
* @returns The AssetsControllerMessenger.
1919
*/
2020
export function getAssetsControllerMessenger(
21-
rootExtendedMessenger: RootExtendedMessenger,
22-
): AssetsControllerMessenger {
23-
const messenger = new Messenger<
24-
'AssetsController',
21+
rootMessenger: RootMessenger<
2522
MessengerActions<AssetsControllerMessenger>,
26-
MessengerEvents<AssetsControllerMessenger>,
27-
RootMessenger
28-
>({
23+
MessengerEvents<AssetsControllerMessenger>
24+
>,
25+
): AssetsControllerMessenger {
26+
const messenger: AssetsControllerMessenger = new Messenger({
2927
namespace: 'AssetsController',
30-
parent: rootExtendedMessenger,
28+
parent: rootMessenger,
3129
});
32-
rootExtendedMessenger.delegate({
30+
rootMessenger.delegate({
3331
actions: [
3432
'AccountTreeController:getAccountsFromSelectedAccountGroup',
3533
'NetworkEnablementController:getState',
@@ -67,34 +65,37 @@ export function getAssetsControllerMessenger(
6765
return messenger;
6866
}
6967

70-
export type AssetsControllerInitMessenger = ReturnType<
71-
typeof getAssetsControllerInitMessenger
68+
type AssetsControllerInitMessengerActions =
69+
| AuthenticationController.AuthenticationControllerGetBearerTokenAction
70+
| PreferencesControllerGetStateAction
71+
| RemoteFeatureFlagControllerGetStateAction
72+
| AnalyticsControllerActions;
73+
74+
export type AssetsControllerInitMessenger = Messenger<
75+
'AssetsControllerInit',
76+
AssetsControllerInitMessengerActions,
77+
never
7278
>;
7379

7480
/**
7581
* Get the messenger for the AssetsController initialization. This is scoped to the
7682
* actions and events that the AssetsController is allowed to handle during
7783
* initialization.
7884
*
79-
* @param rootExtendedMessenger - The root extended messenger.
85+
* @param rootMessenger - The root messenger.
8086
* @returns The AssetsControllerInitMessenger.
8187
*/
8288
export function getAssetsControllerInitMessenger(
83-
rootExtendedMessenger: RootExtendedMessenger,
84-
) {
85-
const messenger = new Messenger<
86-
'AssetsControllerInit',
87-
| AuthenticationController.AuthenticationControllerGetBearerTokenAction
88-
| PreferencesControllerGetStateAction
89-
| RemoteFeatureFlagControllerGetStateAction
90-
| AnalyticsControllerActions,
91-
never,
92-
RootMessenger
93-
>({
89+
rootMessenger: RootMessenger<
90+
MessengerActions<AssetsControllerInitMessenger>,
91+
MessengerEvents<AssetsControllerInitMessenger>
92+
>,
93+
): AssetsControllerInitMessenger {
94+
const messenger: AssetsControllerInitMessenger = new Messenger({
9495
namespace: 'AssetsControllerInit',
95-
parent: rootExtendedMessenger,
96+
parent: rootMessenger,
9697
});
97-
rootExtendedMessenger.delegate({
98+
rootMessenger.delegate({
9899
actions: [
99100
'AuthenticationController:getBearerToken',
100101
'PreferencesController:getState',

app/core/Engine/messengers/authenticated-user-storage-service-messenger.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,14 +13,12 @@ import type { RootMessenger } from '../types';
1313
* @returns The AuthenticatedUserStorageMessenger.
1414
*/
1515
export function getAuthenticatedUserStorageServiceMessenger(
16-
rootMessenger: RootMessenger,
17-
): AuthenticatedUserStorageMessenger {
18-
const serviceMessenger = new Messenger<
19-
'AuthenticatedUserStorageService',
16+
rootMessenger: RootMessenger<
2017
MessengerActions<AuthenticatedUserStorageMessenger>,
21-
MessengerEvents<AuthenticatedUserStorageMessenger>,
22-
RootMessenger
23-
>({
18+
MessengerEvents<AuthenticatedUserStorageMessenger>
19+
>,
20+
): AuthenticatedUserStorageMessenger {
21+
const serviceMessenger: AuthenticatedUserStorageMessenger = new Messenger({
2422
namespace: 'AuthenticatedUserStorageService',
2523
parent: rootMessenger,
2624
});

app/core/Engine/messengers/bridge-controller-messenger/index.ts

Lines changed: 21 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { BridgeControllerMessenger } from '@metamask/bridge-controller';
22
import { AnalyticsControllerActions } from '@metamask/analytics-controller';
33
import type { RemoteFeatureFlagControllerGetStateAction } from '@metamask/remote-feature-flag-controller';
4-
import { RootExtendedMessenger, RootMessenger } from '../../types';
4+
import { RootMessenger } from '../../types';
55
import {
66
Messenger,
77
MessengerActions,
@@ -11,22 +11,20 @@ import {
1111
/**
1212
* Get the BridgeControllerMessenger for the BridgeController.
1313
*
14-
* @param rootExtendedMessenger - The base controller messenger.
14+
* @param rootMessenger - The root messenger.
1515
* @returns The BridgeControllerMessenger.
1616
*/
1717
export function getBridgeControllerMessenger(
18-
rootExtendedMessenger: RootExtendedMessenger,
19-
): BridgeControllerMessenger {
20-
const messenger = new Messenger<
21-
'BridgeController',
18+
rootMessenger: RootMessenger<
2219
MessengerActions<BridgeControllerMessenger>,
23-
MessengerEvents<BridgeControllerMessenger>,
24-
RootMessenger
25-
>({
20+
MessengerEvents<BridgeControllerMessenger>
21+
>,
22+
): BridgeControllerMessenger {
23+
const messenger: BridgeControllerMessenger = new Messenger({
2624
namespace: 'BridgeController',
27-
parent: rootExtendedMessenger,
25+
parent: rootMessenger,
2826
});
29-
rootExtendedMessenger.delegate({
27+
rootMessenger.delegate({
3028
actions: [
3129
'AccountsController:getAccountByAddress',
3230
'SnapController:handleRequest',
@@ -49,31 +47,26 @@ type BridgeControllerInitMessengerActions =
4947
| AnalyticsControllerActions
5048
| RemoteFeatureFlagControllerGetStateAction;
5149

50+
export type BridgeControllerInitMessenger = Messenger<
51+
'BridgeControllerInit',
52+
BridgeControllerInitMessengerActions,
53+
never
54+
>;
55+
5256
/**
5357
* Get the BridgeControllerInitMessenger for the BridgeController.
5458
* This messenger is used during controller initialization to call other controllers.
5559
*
5660
* @param rootMessenger - The root messenger.
5761
* @returns The BridgeControllerInitMessenger.
5862
*/
59-
export type BridgeControllerInitMessenger = ReturnType<
60-
typeof getBridgeControllerInitMessenger
61-
>;
62-
6363
export function getBridgeControllerInitMessenger(
64-
rootMessenger: RootMessenger,
65-
): Messenger<
66-
'BridgeControllerInit',
67-
BridgeControllerInitMessengerActions,
68-
never,
69-
RootMessenger
70-
> {
71-
const messenger = new Messenger<
72-
'BridgeControllerInit',
73-
BridgeControllerInitMessengerActions,
74-
never,
75-
RootMessenger
76-
>({
64+
rootMessenger: RootMessenger<
65+
MessengerActions<BridgeControllerInitMessenger>,
66+
MessengerEvents<BridgeControllerInitMessenger>
67+
>,
68+
): BridgeControllerInitMessenger {
69+
const messenger: BridgeControllerInitMessenger = new Messenger({
7770
namespace: 'BridgeControllerInit',
7871
parent: rootMessenger,
7972
});

app/core/Engine/messengers/bridge-status-controller-messenger/index.ts

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { BridgeStatusControllerMessenger } from '@metamask/bridge-status-controller';
2-
import { RootExtendedMessenger, RootMessenger } from '../../types';
2+
import { RootMessenger } from '../../types';
33
import {
44
Messenger,
55
MessengerActions,
@@ -9,22 +9,20 @@ import {
99
/**
1010
* Get the BridgeControllerMessenger for the BridgeController.
1111
*
12-
* @param rootExtendedMessenger - The base controller messenger.
12+
* @param rootMessenger - The root messenger.
1313
* @returns The BridgeControllerMessenger.
1414
*/
1515
export function getBridgeStatusControllerMessenger(
16-
rootExtendedMessenger: RootExtendedMessenger,
17-
): BridgeStatusControllerMessenger {
18-
const messenger = new Messenger<
19-
'BridgeStatusController',
16+
rootMessenger: RootMessenger<
2017
MessengerActions<BridgeStatusControllerMessenger>,
21-
MessengerEvents<BridgeStatusControllerMessenger>,
22-
RootMessenger
23-
>({
18+
MessengerEvents<BridgeStatusControllerMessenger>
19+
>,
20+
): BridgeStatusControllerMessenger {
21+
const messenger: BridgeStatusControllerMessenger = new Messenger({
2422
namespace: 'BridgeStatusController',
25-
parent: rootExtendedMessenger,
23+
parent: rootMessenger,
2624
});
27-
rootExtendedMessenger.delegate({
25+
rootMessenger.delegate({
2826
actions: [
2927
'AccountsController:getAccountByAddress',
3028
'NetworkController:getNetworkClientById',

0 commit comments

Comments
 (0)