diff --git a/README.md b/README.md index 0b377cff988..cef3fe83ed5 100644 --- a/README.md +++ b/README.md @@ -216,6 +216,7 @@ linkStyle default opacity:0.5 earn_controller --> transaction_controller; eip_5792_middleware --> transaction_controller; eip_5792_middleware --> keyring_controller; + eip_7702_internal_rpc_middleware --> controller_utils; eip1193_permission_middleware --> chain_agnostic_permission; eip1193_permission_middleware --> controller_utils; eip1193_permission_middleware --> json_rpc_engine; @@ -298,6 +299,7 @@ linkStyle default opacity:0.5 profile_sync_controller --> address_book_controller; profile_sync_controller --> keyring_controller; rate_limit_controller --> base_controller; + rate_limit_controller --> messenger; remote_feature_flag_controller --> base_controller; remote_feature_flag_controller --> controller_utils; sample_controllers --> base_controller; diff --git a/eslint-warning-thresholds.json b/eslint-warning-thresholds.json index f5a52c63e63..968b2d19d5c 100644 --- a/eslint-warning-thresholds.json +++ b/eslint-warning-thresholds.json @@ -408,9 +408,7 @@ "@typescript-eslint/prefer-readonly": 1 }, "packages/rate-limit-controller/src/RateLimitController.ts": { - "jsdoc/check-tag-names": 4, - "jsdoc/require-returns": 1, - "jsdoc/tag-lines": 3 + "jsdoc/check-tag-names": 4 }, "packages/remote-feature-flag-controller/src/client-config-api-service/client-config-api-service.test.ts": { "import-x/order": 1, diff --git a/packages/rate-limit-controller/CHANGELOG.md b/packages/rate-limit-controller/CHANGELOG.md index eb01b8821cd..c8277cf5053 100644 --- a/packages/rate-limit-controller/CHANGELOG.md +++ b/packages/rate-limit-controller/CHANGELOG.md @@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Changed + +- **BREAKING:** Use new `Messenger` from `@metamask/messenger` ([#6503](https://github.com/MetaMask/core/pull/6503)) + - Previously, `RateLimitController` accepted a `RestrictedMessenger` instance from `@metamask/base-controller`. +- **BREAKING:** Metadata property `anonymous` renamed to `includeInDebugSnapshot` ([#6503](https://github.com/MetaMask/core/pull/6503)) + ## [6.1.1] ### Changed diff --git a/packages/rate-limit-controller/package.json b/packages/rate-limit-controller/package.json index ce39a239cc4..b7f3e4aa107 100644 --- a/packages/rate-limit-controller/package.json +++ b/packages/rate-limit-controller/package.json @@ -48,6 +48,7 @@ }, "dependencies": { "@metamask/base-controller": "^8.4.2", + "@metamask/messenger": "^0.3.0", "@metamask/rpc-errors": "^7.0.2", "@metamask/utils": "^11.8.1" }, diff --git a/packages/rate-limit-controller/src/RateLimitController.test.ts b/packages/rate-limit-controller/src/RateLimitController.test.ts index 7bb31f0641b..3f7fc1ba528 100644 --- a/packages/rate-limit-controller/src/RateLimitController.test.ts +++ b/packages/rate-limit-controller/src/RateLimitController.test.ts @@ -1,12 +1,16 @@ -import { Messenger, deriveStateFromMetadata } from '@metamask/base-controller'; - -import type { - RateLimitControllerActions, - RateLimitControllerEvents, -} from './RateLimitController'; +import { deriveStateFromMetadata } from '@metamask/base-controller/next'; +import { + Messenger, + MOCK_ANY_NAMESPACE, + type MessengerActions, + type MessengerEvents, + type MockAnyNamespace, +} from '@metamask/messenger'; + +import type { RateLimitMessenger } from './RateLimitController'; import { RateLimitController } from './RateLimitController'; -const name = 'RateLimitController'; +const controllerName = 'RateLimitController'; const implementations = { apiWithoutCustomLimit: { @@ -21,29 +25,48 @@ const implementations = { type RateLimitedApis = typeof implementations; +type AllRateLimitControllerActions = MessengerActions< + RateLimitMessenger +>; + +type AllRateLimitControllerEvents = MessengerEvents< + RateLimitMessenger +>; + +type RootMessenger = Messenger< + MockAnyNamespace, + AllRateLimitControllerActions, + AllRateLimitControllerEvents +>; + /** - * Constructs an unrestricted messenger. + * Creates and returns a root messenger for testing * - * @returns An unrestricted messenger. + * @returns A messenger instance */ -function getUnrestrictedMessenger() { - return new Messenger< - RateLimitControllerActions, - RateLimitControllerEvents - >(); +function getRootMessenger(): RootMessenger { + return new Messenger({ + namespace: MOCK_ANY_NAMESPACE, + }); } /** - * Constructs a restricted messenger. + * Constructs a messenger for the RateLimitController. * - * @param messenger - An optional unrestricted messenger - * @returns A restricted messenger. + * @param rootMessenger - An optional root messenger + * @returns A messenger for the RateLimitController. */ -function getRestrictedMessenger(messenger = getUnrestrictedMessenger()) { - return messenger.getRestricted({ - name, - allowedActions: [], - allowedEvents: [], +function getMessenger( + rootMessenger = getRootMessenger(), +): RateLimitMessenger { + return new Messenger< + typeof controllerName, + AllRateLimitControllerActions, + AllRateLimitControllerEvents, + RootMessenger + >({ + namespace: controllerName, + parent: rootMessenger, }); } @@ -62,8 +85,8 @@ describe('RateLimitController', () => { }); it('action: RateLimitController:call', async () => { - const unrestricted = getUnrestrictedMessenger(); - const messenger = getRestrictedMessenger(unrestricted); + const rootMessenger = getRootMessenger(); + const messenger = getMessenger(rootMessenger); // Registers action handlers new RateLimitController({ @@ -72,7 +95,7 @@ describe('RateLimitController', () => { }); expect( - await unrestricted.call( + await rootMessenger.call( 'RateLimitController:call', origin, 'apiWithoutCustomLimit', @@ -88,7 +111,7 @@ describe('RateLimitController', () => { }); it('uses apiWithoutCustomLimit method', async () => { - const messenger = getRestrictedMessenger(); + const messenger = getMessenger(); const controller = new RateLimitController({ implementations, @@ -105,7 +128,7 @@ describe('RateLimitController', () => { }); it('returns false if rate-limited', async () => { - const messenger = getRestrictedMessenger(); + const messenger = getMessenger(); const controller = new RateLimitController({ implementations, messenger, @@ -154,7 +177,7 @@ describe('RateLimitController', () => { }); it('rate limit is reset after timeout', async () => { - const messenger = getRestrictedMessenger(); + const messenger = getMessenger(); const controller = new RateLimitController({ implementations, messenger, @@ -198,7 +221,7 @@ describe('RateLimitController', () => { }); it('timeout is only applied once per window', async () => { - const messenger = getRestrictedMessenger(); + const messenger = getMessenger(); const controller = new RateLimitController({ implementations, messenger, @@ -225,14 +248,14 @@ describe('RateLimitController', () => { it('includes expected state in debug snapshots', () => { const controller = new RateLimitController({ implementations, - messenger: getRestrictedMessenger(), + messenger: getMessenger(), }); expect( deriveStateFromMetadata( controller.state, controller.metadata, - 'anonymous', + 'includeInDebugSnapshot', ), ).toMatchInlineSnapshot(`Object {}`); }); @@ -240,7 +263,7 @@ describe('RateLimitController', () => { it('includes expected state in state logs', () => { const controller = new RateLimitController({ implementations, - messenger: getRestrictedMessenger(), + messenger: getMessenger(), }); expect( @@ -255,7 +278,7 @@ describe('RateLimitController', () => { it('persists expected state', () => { const controller = new RateLimitController({ implementations, - messenger: getRestrictedMessenger(), + messenger: getMessenger(), }); expect( @@ -270,7 +293,7 @@ describe('RateLimitController', () => { it('exposes expected state to UI', () => { const controller = new RateLimitController({ implementations, - messenger: getRestrictedMessenger(), + messenger: getMessenger(), }); expect( diff --git a/packages/rate-limit-controller/src/RateLimitController.ts b/packages/rate-limit-controller/src/RateLimitController.ts index 768c677a8c7..404539193bf 100644 --- a/packages/rate-limit-controller/src/RateLimitController.ts +++ b/packages/rate-limit-controller/src/RateLimitController.ts @@ -1,15 +1,15 @@ -import type { - ActionConstraint, - RestrictedMessenger, - ControllerGetStateAction, - ControllerStateChangeEvent, -} from '@metamask/base-controller'; -import { BaseController } from '@metamask/base-controller'; +import { + BaseController, + type ControllerGetStateAction, + type ControllerStateChangeEvent, +} from '@metamask/base-controller/next'; +import type { Messenger, ActionConstraint } from '@metamask/messenger'; import { rpcErrors } from '@metamask/rpc-errors'; import { getKnownPropertyNames } from '@metamask/utils'; /** * A rate-limited API endpoint. + * * @property method - The method that is rate-limited. * @property rateLimitTimeout - The time window in which the rate limit is applied (in ms). * @property rateLimitCount - The amount of calls an origin can make in the rate limit time window. @@ -27,6 +27,7 @@ export type RateLimitedApiMap = Record; /** * A map of rate-limited API types to the number of requests made in a given interval for each origin and api type combination. + * * @template RateLimitedApis - A {@link RateLimitedApiMap} containing the rate-limited API endpoints that is used by the {@link RateLimitController}. */ export type RateLimitedRequests = @@ -34,6 +35,7 @@ export type RateLimitedRequests = /** * The state of the {@link RateLimitController}. + * * @template RateLimitedApis - A {@link RateLimitedApiMap} containing the rate-limited API endpoints that is used by the {@link RateLimitController}. * @property requests - An object containing the number of requests made in a given interval for each origin and api type combination. */ @@ -41,20 +43,26 @@ export type RateLimitState = { requests: RateLimitedRequests; }; -const name = 'RateLimitController'; +const controllerName = 'RateLimitController'; export type RateLimitControllerStateChangeEvent< RateLimitedApis extends RateLimitedApiMap, -> = ControllerStateChangeEvent>; +> = ControllerStateChangeEvent< + typeof controllerName, + RateLimitState +>; export type RateLimitControllerGetStateAction< RateLimitedApis extends RateLimitedApiMap, -> = ControllerGetStateAction>; +> = ControllerGetStateAction< + typeof controllerName, + RateLimitState +>; export type RateLimitControllerCallApiAction< RateLimitedApis extends RateLimitedApiMap, > = { - type: `${typeof name}:call`; + type: `${typeof controllerName}:call`; handler: RateLimitController['call']; }; @@ -69,19 +77,17 @@ export type RateLimitControllerEvents< > = RateLimitControllerStateChangeEvent; export type RateLimitMessenger = - RestrictedMessenger< - typeof name, + Messenger< + typeof controllerName, RateLimitControllerActions, - RateLimitControllerEvents, - never, - never + RateLimitControllerEvents >; const metadata = { requests: { includeInStateLogs: false, persist: false, - anonymous: false, + includeInDebugSnapshot: false, usedInUi: false, }, }; @@ -92,7 +98,7 @@ const metadata = { export class RateLimitController< RateLimitedApis extends RateLimitedApiMap, > extends BaseController< - typeof name, + typeof controllerName, RateLimitState, RateLimitMessenger > { @@ -131,7 +137,7 @@ export class RateLimitController< >((acc, key) => ({ ...acc, [key]: {} }), {} as never), }; super({ - name, + name: controllerName, metadata, messenger, state: { ...defaultState, ...state }, @@ -140,8 +146,8 @@ export class RateLimitController< this.rateLimitTimeout = rateLimitTimeout; this.rateLimitCount = rateLimitCount; - this.messagingSystem.registerActionHandler( - `${name}:call`, + this.messenger.registerActionHandler( + `${controllerName}:call`, ( origin: string, type: keyof RateLimitedApis, @@ -156,6 +162,7 @@ export class RateLimitController< * @param origin - The requesting origin. * @param type - The type of API call to make. * @param args - Arguments for the API call. + * @returns The result of the API call. */ async call( origin: string, diff --git a/packages/rate-limit-controller/tsconfig.build.json b/packages/rate-limit-controller/tsconfig.build.json index e5fd7422b9a..931c4d6594b 100644 --- a/packages/rate-limit-controller/tsconfig.build.json +++ b/packages/rate-limit-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/rate-limit-controller/tsconfig.json b/packages/rate-limit-controller/tsconfig.json index 34354c4b09d..68c3ddfc2cd 100644 --- a/packages/rate-limit-controller/tsconfig.json +++ b/packages/rate-limit-controller/tsconfig.json @@ -3,6 +3,6 @@ "compilerOptions": { "baseUrl": "./" }, - "references": [{ "path": "../base-controller" }], + "references": [{ "path": "../base-controller" }, { "path": "../messenger" }], "include": ["../../types", "./src"] } diff --git a/yarn.lock b/yarn.lock index f67c9bc6cb0..91949e7b07f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4574,6 +4574,7 @@ __metadata: dependencies: "@metamask/auto-changelog": "npm:^3.4.4" "@metamask/base-controller": "npm:^8.4.2" + "@metamask/messenger": "npm:^0.3.0" "@metamask/rpc-errors": "npm:^7.0.2" "@metamask/utils": "npm:^11.8.1" "@types/jest": "npm:^27.4.1"