Skip to content

feat(messenger): add delegateAll with exhaustive type checking#8338

Draft
cryptodev-2s wants to merge 5 commits intomainfrom
add-messenger-delegate-all
Draft

feat(messenger): add delegateAll with exhaustive type checking#8338
cryptodev-2s wants to merge 5 commits intomainfrom
add-messenger-delegate-all

Conversation

@cryptodev-2s
Copy link
Copy Markdown
Contributor

Explanation

Messenger.delegate() accepts a partial list of actions/events without compile-time enforcement that all required items are present. This means missing a delegation (e.g., a newly added AllowedAction) silently compiles and only fails at runtime.

delegateAll() wraps delegate() with a RequireExhaustive branded intersection type that produces a clear TypeScript error showing exactly which actions or events are missing from the list. Own-namespace actions of the delegatee are automatically excluded from the check.

Example error when an action is missing:

Property '__missing' is missing in type '[...]'
  but required in type '{ __missing: "KeyringController:signTypedMessage" }'.

References

Changelog

@metamask/messenger

  • Added: delegateAll() method — strict alternative to delegate() that requires all external actions and events to be listed
  • Added: MessengerNamespace<M> utility type — extracts the namespace string literal from a Messenger type
  • Added: RequireExhaustive<Required, Provided> utility type — validates tuple exhaustiveness at compile time

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

@cryptodev-2s
Copy link
Copy Markdown
Contributor 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.0.0-preview-c6e356a6a
@metamask-previews/accounts-controller@37.1.1-preview-c6e356a6a
@metamask-previews/address-book-controller@7.1.1-preview-c6e356a6a
@metamask-previews/ai-controllers@0.6.3-preview-c6e356a6a
@metamask-previews/analytics-controller@1.0.1-preview-c6e356a6a
@metamask-previews/analytics-data-regulation-controller@0.0.0-preview-c6e356a6a
@metamask-previews/announcement-controller@8.1.0-preview-c6e356a6a
@metamask-previews/app-metadata-controller@2.0.1-preview-c6e356a6a
@metamask-previews/approval-controller@9.0.1-preview-c6e356a6a
@metamask-previews/assets-controller@3.2.1-preview-c6e356a6a
@metamask-previews/assets-controllers@103.0.0-preview-c6e356a6a
@metamask-previews/base-controller@9.0.1-preview-c6e356a6a
@metamask-previews/base-data-service@0.1.1-preview-c6e356a6a
@metamask-previews/bridge-controller@69.2.3-preview-c6e356a6a
@metamask-previews/bridge-status-controller@70.0.3-preview-c6e356a6a
@metamask-previews/build-utils@3.0.4-preview-c6e356a6a
@metamask-previews/chain-agnostic-permission@1.5.0-preview-c6e356a6a
@metamask-previews/claims-controller@0.5.0-preview-c6e356a6a
@metamask-previews/client-controller@1.0.1-preview-c6e356a6a
@metamask-previews/compliance-controller@1.0.2-preview-c6e356a6a
@metamask-previews/composable-controller@12.0.1-preview-c6e356a6a
@metamask-previews/config-registry-controller@0.2.0-preview-c6e356a6a
@metamask-previews/connectivity-controller@0.2.0-preview-c6e356a6a
@metamask-previews/controller-utils@11.19.0-preview-c6e356a6a
@metamask-previews/core-backend@6.2.1-preview-c6e356a6a
@metamask-previews/delegation-controller@2.1.0-preview-c6e356a6a
@metamask-previews/earn-controller@11.2.1-preview-c6e356a6a
@metamask-previews/eip-5792-middleware@3.0.2-preview-c6e356a6a
@metamask-previews/eip-7702-internal-rpc-middleware@0.1.0-preview-c6e356a6a
@metamask-previews/eip1193-permission-middleware@1.0.3-preview-c6e356a6a
@metamask-previews/ens-controller@19.1.1-preview-c6e356a6a
@metamask-previews/eth-block-tracker@15.0.1-preview-c6e356a6a
@metamask-previews/eth-json-rpc-middleware@23.1.1-preview-c6e356a6a
@metamask-previews/eth-json-rpc-provider@6.0.1-preview-c6e356a6a
@metamask-previews/foundryup@1.0.1-preview-c6e356a6a
@metamask-previews/gas-fee-controller@26.1.1-preview-c6e356a6a
@metamask-previews/gator-permissions-controller@3.0.0-preview-c6e356a6a
@metamask-previews/geolocation-controller@0.1.2-preview-c6e356a6a
@metamask-previews/json-rpc-engine@10.2.4-preview-c6e356a6a
@metamask-previews/json-rpc-middleware-stream@8.0.8-preview-c6e356a6a
@metamask-previews/keyring-controller@25.1.1-preview-c6e356a6a
@metamask-previews/logging-controller@8.0.1-preview-c6e356a6a
@metamask-previews/message-manager@14.1.1-preview-c6e356a6a
@metamask-previews/messenger@1.0.0-preview-c6e356a6a
@metamask-previews/multichain-account-service@8.0.1-preview-c6e356a6a
@metamask-previews/multichain-api-middleware@2.0.0-preview-c6e356a6a
@metamask-previews/multichain-network-controller@3.0.6-preview-c6e356a6a
@metamask-previews/multichain-transactions-controller@7.0.4-preview-c6e356a6a
@metamask-previews/name-controller@9.1.1-preview-c6e356a6a
@metamask-previews/network-controller@30.0.1-preview-c6e356a6a
@metamask-previews/network-enablement-controller@5.0.1-preview-c6e356a6a
@metamask-previews/notification-services-controller@23.0.1-preview-c6e356a6a
@metamask-previews/permission-controller@12.3.0-preview-c6e356a6a
@metamask-previews/permission-log-controller@5.1.0-preview-c6e356a6a
@metamask-previews/perps-controller@2.0.0-preview-c6e356a6a
@metamask-previews/phishing-controller@17.1.0-preview-c6e356a6a
@metamask-previews/polling-controller@16.0.4-preview-c6e356a6a
@metamask-previews/preferences-controller@23.1.0-preview-c6e356a6a
@metamask-previews/profile-metrics-controller@3.1.2-preview-c6e356a6a
@metamask-previews/profile-sync-controller@28.0.2-preview-c6e356a6a
@metamask-previews/ramps-controller@12.1.0-preview-c6e356a6a
@metamask-previews/rate-limit-controller@7.0.1-preview-c6e356a6a
@metamask-previews/react-data-query@0.2.0-preview-c6e356a6a
@metamask-previews/remote-feature-flag-controller@4.2.0-preview-c6e356a6a
@metamask-previews/sample-controllers@4.0.4-preview-c6e356a6a
@metamask-previews/seedless-onboarding-controller@9.1.0-preview-c6e356a6a
@metamask-previews/selected-network-controller@26.1.0-preview-c6e356a6a
@metamask-previews/shield-controller@5.1.0-preview-c6e356a6a
@metamask-previews/signature-controller@39.1.2-preview-c6e356a6a
@metamask-previews/social-controllers@0.0.0-preview-c6e356a6a
@metamask-previews/storage-service@1.0.1-preview-c6e356a6a
@metamask-previews/subscription-controller@6.1.1-preview-c6e356a6a
@metamask-previews/transaction-controller@63.3.1-preview-c6e356a6a
@metamask-previews/transaction-pay-controller@19.0.0-preview-c6e356a6a
@metamask-previews/user-operation-controller@41.1.1-preview-c6e356a6a

`delegate` accepts partial action/event lists without compile-time
enforcement that all required items are present. `delegateAll` uses
a branded intersection type to produce a clear TS error showing
exactly which actions or events are missing.
@cryptodev-2s cryptodev-2s force-pushed the add-messenger-delegate-all branch from 5bd4a95 to f0e25c9 Compare March 30, 2026 17:44
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.

1 participant