Skip to content

refactor!: Add consolidated legacy method middleware#8583

Draft
rekmarks wants to merge 8 commits intomainfrom
rekm/v2-permitted-handlers
Draft

refactor!: Add consolidated legacy method middleware#8583
rekmarks wants to merge 8 commits intomainfrom
rekm/v2-permitted-handlers

Conversation

@rekmarks
Copy link
Copy Markdown
Member

@rekmarks rekmarks commented Apr 24, 2026

Explanation

This PR consolidates the bespoke makeMethodMiddlewareMaker implementations from the MetaMask extension and mobile clients into a single legacy createMethodMiddleware exported from @metamask/json-rpc-engine, and removes the unused permitted method handlers from @metamask/permission-controller.

@metamask/json-rpc-engine

  • Adds a legacy createMethodMiddleware that builds a JsonRpcEngine middleware from a record of method handlers keyed by method name. It validates handler hooks against the union of hookNames declared by the handlers (rejecting both missing and extraneous hooks) and dispatches incoming requests by method.
  • Handlers may now declare actionNames and receive a per-handler delegated Messenger as the sixth argument to implementation, mirroring the v2 createMethodMiddleware. The legacy and v2 versions now share their hook selection / validation and messenger delegation utilities.
  • The legacy export is deprecated in favor of the v2 createMethodMiddleware. It exists only to give the extension and mobile clients a consolidated migration target before they move to JsonRpcEngineV2.

@metamask/permission-controller (BREAKING)

  • Removes the permitted RPC method handler modules (getPermissions, requestPermissions, revokePermissions) and the related permissionRpcMethods and PermittedHandlerExport exports. These were unused in practice. Replacement types are available in @metamask/json-rpc-engine@10.3.0.

References

Related to the ongoing migration to JsonRpcEngineV2.

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
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

rekmarks and others added 3 commits April 24, 2026 13:32
Add `createMethodMiddlewareFactory` to the legacy (v1) surface,
consolidating the near-identical `makeMethodMiddlewareMaker`
implementations from metamask-extension and metamask-mobile. The new
export is deprecated in favor of the v2 `createMethodMiddleware`.

Extract `selectHooks` and `assertExpectedHooks` into a shared
`hookUtils.ts` module used by both v1 and v2. v2 now performs the same
strict missing/extraneous hook validation as v1 at middleware
construction time.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@rekmarks rekmarks changed the title refactor!: Consolidate legacy method middleware implementation refactor!: Add consolidated legacy method middleware Apr 24, 2026
@rekmarks
Copy link
Copy Markdown
Member Author

@cursor review

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

✅ Bugbot reviewed your changes and found no new issues!

Comment @cursor review or bugbot run to trigger another review on this PR

Reviewed by Cursor Bugbot for commit be9aaca. Configure here.

Comment thread packages/permission-controller/CHANGELOG.md Outdated
Comment thread packages/json-rpc-engine/src/v2/index.ts
Comment thread packages/json-rpc-engine/src/createMethodMiddleware.ts Outdated
Comment thread packages/json-rpc-engine/src/createMethodMiddleware.test.ts Outdated
rekmarks and others added 4 commits April 27, 2026 09:50
…thod middleware

Allow `Messenger<string, never>` in the no-actions branch of
`CreateMethodMiddlewareFactoryOptions` so callers may still pass a
no-op root messenger when handlers declare no actions.

Pre-select hooks per handler at curried-call time and store them on a
`ResolvedHandler` entry, mirroring v2's dispatch shape and removing
`selectHooks` from the per-request path.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@rekmarks
Copy link
Copy Markdown
Member Author

@metamaskbot publish-preview

@github-actions
Copy link
Copy Markdown
Contributor

Preview builds have been published. Learn how to use preview builds in other projects.

Expand for full list of packages and versions.
@metamask-previews/account-tree-controller@7.1.0-preview-dc38a2562
@metamask-previews/accounts-controller@37.2.0-preview-dc38a2562
@metamask-previews/address-book-controller@7.1.1-preview-dc38a2562
@metamask-previews/ai-controllers@0.6.3-preview-dc38a2562
@metamask-previews/analytics-controller@1.0.1-preview-dc38a2562
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-dc38a2562
@metamask-previews/announcement-controller@8.1.0-preview-dc38a2562
@metamask-previews/app-metadata-controller@2.0.1-preview-dc38a2562
@metamask-previews/approval-controller@9.0.1-preview-dc38a2562
@metamask-previews/assets-controller@6.1.0-preview-dc38a2562
@metamask-previews/assets-controllers@104.3.0-preview-dc38a2562
@metamask-previews/authenticated-user-storage@1.0.0-preview-dc38a2562
@metamask-previews/base-controller@9.1.0-preview-dc38a2562
@metamask-previews/base-data-service@0.1.1-preview-dc38a2562
@metamask-previews/bridge-controller@70.2.0-preview-dc38a2562
@metamask-previews/bridge-status-controller@71.0.0-preview-dc38a2562
@metamask-previews/build-utils@3.0.4-preview-dc38a2562
@metamask-previews/chain-agnostic-permission@1.5.0-preview-dc38a2562
@metamask-previews/chomp-api-service@1.0.0-preview-dc38a2562
@metamask-previews/claims-controller@0.5.0-preview-dc38a2562
@metamask-previews/client-controller@1.0.1-preview-dc38a2562
@metamask-previews/compliance-controller@2.0.0-preview-dc38a2562
@metamask-previews/composable-controller@12.0.1-preview-dc38a2562
@metamask-previews/config-registry-controller@0.2.0-preview-dc38a2562
@metamask-previews/connectivity-controller@0.2.0-preview-dc38a2562
@metamask-previews/controller-utils@11.20.0-preview-dc38a2562
@metamask-previews/core-backend@6.2.1-preview-dc38a2562
@metamask-previews/delegation-controller@3.0.0-preview-dc38a2562
@metamask-previews/earn-controller@12.0.0-preview-dc38a2562
@metamask-previews/eip-5792-middleware@3.0.3-preview-dc38a2562
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-dc38a2562
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-dc38a2562
@metamask-previews/ens-controller@19.1.1-preview-dc38a2562
@metamask-previews/eth-block-tracker@15.0.1-preview-dc38a2562
@metamask-previews/eth-json-rpc-middleware@23.1.2-preview-dc38a2562
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-dc38a2562
@metamask-previews/foundryup@1.0.1-preview-dc38a2562
@metamask-previews/gas-fee-controller@26.1.1-preview-dc38a2562
@metamask-previews/gator-permissions-controller@4.0.0-preview-dc38a2562
@metamask-previews/geolocation-controller@0.1.2-preview-dc38a2562
@metamask-previews/json-rpc-engine@10.2.4-preview-dc38a2562
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-dc38a2562
@metamask-previews/keyring-controller@25.2.0-preview-dc38a2562
@metamask-previews/logging-controller@8.0.1-preview-dc38a2562
@metamask-previews/message-manager@14.1.1-preview-dc38a2562
@metamask-previews/messenger@1.1.1-preview-dc38a2562
@metamask-previews/messenger-cli@0.2.0-preview-dc38a2562
@metamask-previews/money-account-balance-service@0.2.0-preview-dc38a2562
@metamask-previews/money-account-controller@0.1.0-preview-dc38a2562
@metamask-previews/money-account-upgrade-controller@1.0.0-preview-dc38a2562
@metamask-previews/multichain-account-service@8.0.1-preview-dc38a2562
@metamask-previews/multichain-api-middleware@2.0.0-preview-dc38a2562
@metamask-previews/multichain-network-controller@3.0.6-preview-dc38a2562
@metamask-previews/multichain-transactions-controller@7.0.4-preview-dc38a2562
@metamask-previews/name-controller@9.1.1-preview-dc38a2562
@metamask-previews/network-controller@30.0.1-preview-dc38a2562
@metamask-previews/network-enablement-controller@5.0.2-preview-dc38a2562
@metamask-previews/notification-services-controller@23.1.0-preview-dc38a2562
@metamask-previews/passkey-controller@0.0.0-preview-dc38a2562
@metamask-previews/permission-controller@12.3.0-preview-dc38a2562
@metamask-previews/permission-log-controller@5.1.0-preview-dc38a2562
@metamask-previews/perps-controller@4.0.0-preview-dc38a2562
@metamask-previews/phishing-controller@17.1.1-preview-dc38a2562
@metamask-previews/polling-controller@16.0.4-preview-dc38a2562
@metamask-previews/preferences-controller@23.1.0-preview-dc38a2562
@metamask-previews/profile-metrics-controller@3.1.3-preview-dc38a2562
@metamask-previews/profile-sync-controller@28.0.2-preview-dc38a2562
@metamask-previews/ramps-controller@13.2.0-preview-dc38a2562
@metamask-previews/rate-limit-controller@7.0.1-preview-dc38a2562
@metamask-previews/react-data-query@0.2.0-preview-dc38a2562
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-dc38a2562
@metamask-previews/sample-controllers@4.0.4-preview-dc38a2562
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-dc38a2562
@metamask-previews/selected-network-controller@26.1.0-preview-dc38a2562
@metamask-previews/shield-controller@5.1.1-preview-dc38a2562
@metamask-previews/signature-controller@39.2.0-preview-dc38a2562
@metamask-previews/social-controllers@2.1.0-preview-dc38a2562
@metamask-previews/storage-service@1.0.1-preview-dc38a2562
@metamask-previews/subscription-controller@6.1.2-preview-dc38a2562
@metamask-previews/transaction-controller@64.4.0-preview-dc38a2562
@metamask-previews/transaction-pay-controller@19.3.0-preview-dc38a2562
@metamask-previews/user-operation-controller@41.2.0-preview-dc38a2562

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants