diff --git a/packages/remote-feature-flag-controller/CHANGELOG.md b/packages/remote-feature-flag-controller/CHANGELOG.md index db0d7087d04..917d29f3903 100644 --- a/packages/remote-feature-flag-controller/CHANGELOG.md +++ b/packages/remote-feature-flag-controller/CHANGELOG.md @@ -7,6 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6502](https://github.com/MetaMask/core/pull/6502)) + - Previously, `RemoteFeatureFlagController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. + ## [1.9.0] ### Added diff --git a/packages/remote-feature-flag-controller/package.json b/packages/remote-feature-flag-controller/package.json index 799b069e261..0419988ba91 100644 --- a/packages/remote-feature-flag-controller/package.json +++ b/packages/remote-feature-flag-controller/package.json @@ -49,6 +49,7 @@ "dependencies": { "@metamask/base-controller": "^8.4.1", "@metamask/controller-utils": "^11.14.1", + "@metamask/messenger": "^0.3.0", "@metamask/utils": "^11.8.1", "uuid": "^8.3.2" }, diff --git a/packages/remote-feature-flag-controller/src/index.ts b/packages/remote-feature-flag-controller/src/index.ts index 420a92b9c68..9906d3bc04d 100644 --- a/packages/remote-feature-flag-controller/src/index.ts +++ b/packages/remote-feature-flag-controller/src/index.ts @@ -1,5 +1,6 @@ export { RemoteFeatureFlagController } from './remote-feature-flag-controller'; export type { + RemoteFeatureFlagControllerState, RemoteFeatureFlagControllerMessenger, RemoteFeatureFlagControllerActions, RemoteFeatureFlagControllerGetStateAction, @@ -13,9 +14,6 @@ export { EnvironmentType, } from './remote-feature-flag-controller-types'; -export type { - RemoteFeatureFlagControllerState, - FeatureFlags, -} from './remote-feature-flag-controller-types'; +export type { FeatureFlags } from './remote-feature-flag-controller-types'; export { ClientConfigApiService } from './client-config-api-service/client-config-api-service'; export { generateDeterministicRandomNumber } from './utils/user-segmentation-utils'; diff --git a/packages/remote-feature-flag-controller/src/remote-feature-flag-controller-types.ts b/packages/remote-feature-flag-controller/src/remote-feature-flag-controller-types.ts index 1b7d5343b8d..7d3c0833ea9 100644 --- a/packages/remote-feature-flag-controller/src/remote-feature-flag-controller-types.ts +++ b/packages/remote-feature-flag-controller/src/remote-feature-flag-controller-types.ts @@ -46,17 +46,3 @@ export type ServiceResponse = { remoteFeatureFlags: FeatureFlags; cacheTimestamp: number | null; }; - -/** - * Describes the shape of the state object for the {@link RemoteFeatureFlagController}. - */ -export type RemoteFeatureFlagControllerState = { - /** - * The collection of feature flags and their respective values, which can be objects. - */ - remoteFeatureFlags: FeatureFlags; - /** - * The timestamp of the last successful feature flag cache. - */ - cacheTimestamp: number; -}; diff --git a/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.test.ts b/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.test.ts index 5cd5daa1aca..e9a2439955b 100644 --- a/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.test.ts +++ b/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.test.ts @@ -1,20 +1,26 @@ -import { Messenger, deriveStateFromMetadata } from '@metamask/base-controller'; +import { deriveStateFromMetadata } from '@metamask/base-controller/next'; +import { + Messenger, + MOCK_ANY_NAMESPACE, + type MessengerActions, + type MessengerEvents, + type MockAnyNamespace, +} from '@metamask/messenger'; import type { AbstractClientConfigApiService } from './client-config-api-service/abstract-client-config-api-service'; import { RemoteFeatureFlagController, - controllerName, DEFAULT_CACHE_DURATION, getDefaultRemoteFeatureFlagControllerState, } from './remote-feature-flag-controller'; import type { - RemoteFeatureFlagControllerActions, RemoteFeatureFlagControllerMessenger, RemoteFeatureFlagControllerState, - RemoteFeatureFlagControllerStateChangeEvent, } from './remote-feature-flag-controller'; import type { FeatureFlags } from './remote-feature-flag-controller-types'; +const controllerName = 'RemoteFeatureFlagController'; + const MOCK_FLAGS: FeatureFlags = { feature1: true, feature2: { chrome: '<109' }, @@ -350,7 +356,7 @@ describe('RemoteFeatureFlagController', () => { deriveStateFromMetadata( controller.state, controller.metadata, - 'anonymous', + 'includeInDebugSnapshot', ), ).toMatchInlineSnapshot(` Object { @@ -412,31 +418,44 @@ describe('RemoteFeatureFlagController', () => { }); }); -type RootAction = RemoteFeatureFlagControllerActions; -type RootEvent = RemoteFeatureFlagControllerStateChangeEvent; +type AllRemoteFeatureFlagControllerActions = + MessengerActions; + +type AllRemoteFeatureFlagControllerEvents = + MessengerEvents; + +type RootMessenger = Messenger< + MockAnyNamespace, + AllRemoteFeatureFlagControllerActions, + AllRemoteFeatureFlagControllerEvents +>; /** * Creates and returns a root messenger for testing * * @returns A messenger instance */ -function getRootMessenger(): Messenger { - return new Messenger(); +function getRootMessenger(): RootMessenger { + return new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); } /** - * Creates a restricted messenger for testing + * Creates a messenger for the RemoteFeatureFlagController * - * @param rootMessenger - The root messenger to restrict - * @returns A restricted messenger instance + * @returns A messenger instance */ -function getMessenger( - rootMessenger = getRootMessenger(), -): RemoteFeatureFlagControllerMessenger { - return rootMessenger.getRestricted({ - name: controllerName, - allowedActions: [], - allowedEvents: [], +function getMessenger(): RemoteFeatureFlagControllerMessenger { + const rootMessenger = getRootMessenger(); + return new Messenger< + typeof controllerName, + AllRemoteFeatureFlagControllerActions, + AllRemoteFeatureFlagControllerEvents, + RootMessenger + >({ + namespace: controllerName, + parent: rootMessenger, }); } diff --git a/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.ts b/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.ts index d12797ce148..ce846a35927 100644 --- a/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.ts +++ b/packages/remote-feature-flag-controller/src/remote-feature-flag-controller.ts @@ -1,9 +1,9 @@ -import { BaseController } from '@metamask/base-controller'; -import type { - ControllerGetStateAction, - ControllerStateChangeEvent, - RestrictedMessenger, -} from '@metamask/base-controller'; +import { + BaseController, + type ControllerGetStateAction, + type ControllerStateChangeEvent, +} from '@metamask/base-controller/next'; +import type { Messenger } from '@metamask/messenger'; import type { AbstractClientConfigApiService } from './client-config-api-service/abstract-client-config-api-service'; import type { @@ -18,7 +18,7 @@ import { // === GENERAL === -export const controllerName = 'RemoteFeatureFlagController'; +const controllerName = 'RemoteFeatureFlagController'; export const DEFAULT_CACHE_DURATION = 24 * 60 * 60 * 1000; // 1 day // === STATE === @@ -32,13 +32,13 @@ const remoteFeatureFlagControllerMetadata = { remoteFeatureFlags: { includeInStateLogs: true, persist: true, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: true, }, cacheTimestamp: { includeInStateLogs: true, persist: true, - anonymous: true, + includeInDebugSnapshot: true, usedInUi: false, }, }; @@ -63,8 +63,6 @@ export type RemoteFeatureFlagControllerActions = | RemoteFeatureFlagControllerGetStateAction | RemoteFeatureFlagControllerUpdateRemoteFeatureFlagsAction; -export type AllowedActions = never; - export type RemoteFeatureFlagControllerStateChangeEvent = ControllerStateChangeEvent< typeof controllerName, @@ -74,14 +72,10 @@ export type RemoteFeatureFlagControllerStateChangeEvent = export type RemoteFeatureFlagControllerEvents = RemoteFeatureFlagControllerStateChangeEvent; -export type AllowedEvents = never; - -export type RemoteFeatureFlagControllerMessenger = RestrictedMessenger< +export type RemoteFeatureFlagControllerMessenger = Messenger< typeof controllerName, - RemoteFeatureFlagControllerActions | AllowedActions, - RemoteFeatureFlagControllerEvents | AllowedEvents, - AllowedActions['type'], - AllowedEvents['type'] + RemoteFeatureFlagControllerActions, + RemoteFeatureFlagControllerEvents >; /** diff --git a/packages/remote-feature-flag-controller/tsconfig.build.json b/packages/remote-feature-flag-controller/tsconfig.build.json index e5fd7422b9a..931c4d6594b 100644 --- a/packages/remote-feature-flag-controller/tsconfig.build.json +++ b/packages/remote-feature-flag-controller/tsconfig.build.json @@ -5,6 +5,9 @@ "outDir": "./dist", "rootDir": "./src" }, - "references": [{ "path": "../base-controller/tsconfig.build.json" }], + "references": [ + { "path": "../base-controller/tsconfig.build.json" }, + { "path": "../messenger/tsconfig.build.json" } + ], "include": ["../../types", "./src"] } diff --git a/packages/remote-feature-flag-controller/tsconfig.json b/packages/remote-feature-flag-controller/tsconfig.json index 831cc7b8670..68c3ddfc2cd 100644 --- a/packages/remote-feature-flag-controller/tsconfig.json +++ b/packages/remote-feature-flag-controller/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "baseUrl": "./" }, - "references": [{ "path": "../../packages/base-controller" }], + "references": [{ "path": "../base-controller" }, { "path": "../messenger" }], "include": ["../../types", "./src"] } diff --git a/yarn.lock b/yarn.lock index 5d09b848de7..f58421ee92f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4573,6 +4573,7 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^8.4.1" "@metamask/controller-utils": "npm:^11.14.1" + "@metamask/messenger": "npm:^0.3.0" "@metamask/utils": "npm:^11.8.1" "@types/jest": "npm:^27.4.1" deepmerge: "npm:^4.2.2"