diff --git a/eslint-warning-thresholds.json b/eslint-warning-thresholds.json index 44a46f64a62..ab26feb4397 100644 --- a/eslint-warning-thresholds.json +++ b/eslint-warning-thresholds.json @@ -338,8 +338,7 @@ }, "packages/remote-feature-flag-controller/src/remote-feature-flag-controller.ts": { "@typescript-eslint/prefer-readonly": 1, - "jsdoc/check-tag-names": 2, - "prettier/prettier": 1 + "jsdoc/check-tag-names": 2 }, "packages/remote-feature-flag-controller/src/utils/user-segmentation-utils.ts": { "jsdoc/tag-lines": 2 diff --git a/packages/remote-feature-flag-controller/CHANGELOG.md b/packages/remote-feature-flag-controller/CHANGELOG.md index f994b0eacdb..f22a7ce5081 100644 --- a/packages/remote-feature-flag-controller/CHANGELOG.md +++ b/packages/remote-feature-flag-controller/CHANGELOG.md @@ -9,6 +9,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### 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`. - Bump `@metamask/base-controller` from `^8.0.1` to `^8.3.0` ([#6284](https://github.com/MetaMask/core/pull/6284), [#6355](https://github.com/MetaMask/core/pull/6355), [#6465](https://github.com/MetaMask/core/pull/6465)) - Bump `@metamask/controller-utils` from `^11.11.0` to `^11.12.0` ([#6303](https://github.com/MetaMask/core/pull/6303)) diff --git a/packages/remote-feature-flag-controller/package.json b/packages/remote-feature-flag-controller/package.json index bb78c12e246..44925eaaded 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.3.0", "@metamask/controller-utils": "^11.12.0", + "@metamask/messenger": "^0.2.0", "@metamask/utils": "^11.4.2", "uuid": "^8.3.2" }, 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 56fed8f1e8e..fe2b75f59df 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 @@ -1,4 +1,4 @@ -import type { ControllerGetStateAction } from '@metamask/base-controller'; +import type { ControllerGetStateAction } from '@metamask/base-controller/next'; import type { Json } from '@metamask/utils'; // Define accepted values for client, distribution, and environment 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 f440b2d1081..d8bc7979e57 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,19 +1,24 @@ -import { Messenger } from '@metamask/base-controller'; +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 { RemoteFeatureFlagControllerMessenger } from './remote-feature-flag-controller'; import type { - RemoteFeatureFlagControllerActions, - RemoteFeatureFlagControllerMessenger, + FeatureFlags, RemoteFeatureFlagControllerState, - RemoteFeatureFlagControllerStateChangeEvent, -} from './remote-feature-flag-controller'; -import type { FeatureFlags } from './remote-feature-flag-controller-types'; +} from './remote-feature-flag-controller-types'; + +const controllerName = 'RemoteFeatureFlagController'; const MOCK_FLAGS: FeatureFlags = { feature1: true, @@ -343,31 +348,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 dc1f60c99f1..56aca3ae1fc 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,15 +1,16 @@ -import type { - ControllerGetStateAction, - ControllerStateChangeEvent, - RestrictedMessenger, -} from '@metamask/base-controller'; -import { BaseController } from '@metamask/base-controller'; +import { + BaseController, + 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 { FeatureFlags, ServiceResponse, FeatureFlagScopeValue, + RemoteFeatureFlagControllerState, + RemoteFeatureFlagControllerGetStateAction, } from './remote-feature-flag-controller-types'; import { generateDeterministicRandomNumber, @@ -18,16 +19,11 @@ import { // === GENERAL === -export const controllerName = 'RemoteFeatureFlagController'; +const controllerName = 'RemoteFeatureFlagController'; export const DEFAULT_CACHE_DURATION = 24 * 60 * 60 * 1000; // 1 day // === STATE === -export type RemoteFeatureFlagControllerState = { - remoteFeatureFlags: FeatureFlags; - cacheTimestamp: number; -}; - const remoteFeatureFlagControllerMetadata = { remoteFeatureFlags: { persist: true, anonymous: true }, cacheTimestamp: { persist: true, anonymous: true }, @@ -35,12 +31,6 @@ const remoteFeatureFlagControllerMetadata = { // === MESSENGER === -export type RemoteFeatureFlagControllerGetStateAction = - ControllerGetStateAction< - typeof controllerName, - RemoteFeatureFlagControllerState - >; - export type RemoteFeatureFlagControllerGetRemoteFeatureFlagAction = { type: `${typeof controllerName}:updateRemoteFeatureFlags`; handler: RemoteFeatureFlagController['updateRemoteFeatureFlags']; @@ -49,8 +39,6 @@ export type RemoteFeatureFlagControllerGetRemoteFeatureFlagAction = { export type RemoteFeatureFlagControllerActions = RemoteFeatureFlagControllerGetStateAction; -export type AllowedActions = never; - export type RemoteFeatureFlagControllerStateChangeEvent = ControllerStateChangeEvent< typeof controllerName, @@ -60,14 +48,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 >; /** @@ -192,7 +176,8 @@ export class RemoteFeatureFlagController extends BaseController< * @private */ async #updateCache(remoteFeatureFlags: FeatureFlags) { - const processedRemoteFeatureFlags = await this.#processRemoteFeatureFlags(remoteFeatureFlags); + const processedRemoteFeatureFlags = + await this.#processRemoteFeatureFlags(remoteFeatureFlags); this.update(() => { return { remoteFeatureFlags: processedRemoteFeatureFlags, diff --git a/yarn.lock b/yarn.lock index 8bd5c3e5e8f..720cae6ccc3 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4336,6 +4336,7 @@ __metadata: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^8.3.0" "@metamask/controller-utils": "npm:^11.12.0" + "@metamask/messenger": "npm:^0.2.0" "@metamask/utils": "npm:^11.4.2" "@types/jest": "npm:^27.4.1" deepmerge: "npm:^4.2.2"