Skip to content

Conversation

@cryptodev-2s
Copy link
Contributor

@cryptodev-2s cryptodev-2s commented Jan 14, 2026

Explanation

This PR introduces a new @metamask/connectivity-controller package that provides a centralized way to track and manage device internet connectivity status across MetaMask clients (extension and mobile).

What is the current state of things and why does it need to change?

  • Have a single source of truth for connectivity state
  • Share connectivity status across controllers and UI components
  • Test connectivity-related functionality in isolation
  • Maintain consistent behavior across platforms

What is the solution your changes offer and how does it work?

The ConnectivityController is a platform-agnostic controller that:

  • Stores the current connectivity status (online or offline) in its state
  • Uses a service injection pattern where platform-specific ConnectivityService implementations are injected at construction time
  • Subscribes to connectivity changes from the service and automatically updates its state
  • Emits stateChange events when connectivity status changes, allowing other controllers and UI components to react accordingly

The controller is designed to work with different service implementations:

  • Mobile: NetInfoConnectivityService using @react-native-community/netinfo
  • Extension (same context): BrowserConnectivityService using browser APIs

Are there any changes whose purpose might not be obvious to those unfamiliar with the domain?

  • The connectivityStatus field in state is prefixed with "connectivity" to avoid conflicts when state is flattened in Redux
  • The state is configured with persist: false since connectivity status is ephemeral and should not be restored from storage

References

Fixes: https://consensyssoftware.atlassian.net/browse/WPC-210

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

Note

Introduce a new, platform-agnostic controller to track device connectivity with adapter-driven status updates.

  • New package @metamask/connectivity-controller exposing ConnectivityController, CONNECTIVITY_STATUSES, and ConnectivityAdapter interface
  • Controller initializes from adapter getStatus() and updates state on onConnectivityChange, with non-persistent connectivityStatus metadata
  • Comprehensive tests for initialization and status change handling; 100% coverage config
  • Added package docs (README, CHANGELOG, LICENSE) and build/test configs (tsconfig, typedoc, jest)
  • Monorepo integration: README package list/graph, CODEOWNERS, teams.json, tsconfig references, and yarn.lock entry

Written by Cursor Bugbot for commit 16c51b5. This will update automatically on new commits. Configure here.

@cryptodev-2s cryptodev-2s force-pushed the feature/add-connectivity-controller branch from b14162d to daa5333 Compare January 14, 2026 12:14
@cryptodev-2s cryptodev-2s force-pushed the feature/add-connectivity-controller branch from daa5333 to 5e51275 Compare January 14, 2026 12:24
@cryptodev-2s cryptodev-2s marked this pull request as ready for review January 14, 2026 13:46
@cryptodev-2s cryptodev-2s requested a review from a team as a code owner January 14, 2026 13:46
@cryptodev-2s
Copy link
Contributor Author

@metamaskbot publish-preview

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-9e00b40b",
  "@metamask-previews/accounts-controller": "35.0.1-preview-9e00b40b",
  "@metamask-previews/address-book-controller": "7.0.1-preview-9e00b40b",
  "@metamask-previews/analytics-controller": "1.0.0-preview-9e00b40b",
  "@metamask-previews/announcement-controller": "8.0.0-preview-9e00b40b",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-9e00b40b",
  "@metamask-previews/approval-controller": "8.0.0-preview-9e00b40b",
  "@metamask-previews/assets-controller": "0.0.0-preview-9e00b40b",
  "@metamask-previews/assets-controllers": "95.1.0-preview-9e00b40b",
  "@metamask-previews/base-controller": "9.0.0-preview-9e00b40b",
  "@metamask-previews/bridge-controller": "64.4.1-preview-9e00b40b",
  "@metamask-previews/bridge-status-controller": "64.4.2-preview-9e00b40b",
  "@metamask-previews/build-utils": "3.0.4-preview-9e00b40b",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-9e00b40b",
  "@metamask-previews/claims-controller": "0.4.1-preview-9e00b40b",
  "@metamask-previews/composable-controller": "12.0.0-preview-9e00b40b",
  "@metamask-previews/connectivity-controller": "0.0.0-preview-9e00b40b",
  "@metamask-previews/controller-utils": "11.18.0-preview-9e00b40b",
  "@metamask-previews/core-backend": "5.0.0-preview-9e00b40b",
  "@metamask-previews/delegation-controller": "2.0.0-preview-9e00b40b",
  "@metamask-previews/earn-controller": "11.0.0-preview-9e00b40b",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-9e00b40b",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-9e00b40b",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-9e00b40b",
  "@metamask-previews/ens-controller": "19.0.1-preview-9e00b40b",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-9e00b40b",
  "@metamask-previews/eth-block-tracker": "15.0.0-preview-9e00b40b",
  "@metamask-previews/eth-json-rpc-middleware": "22.0.1-preview-9e00b40b",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-9e00b40b",
  "@metamask-previews/foundryup": "1.0.1-preview-9e00b40b",
  "@metamask-previews/gas-fee-controller": "26.0.1-preview-9e00b40b",
  "@metamask-previews/gator-permissions-controller": "0.8.0-preview-9e00b40b",
  "@metamask-previews/json-rpc-engine": "10.2.0-preview-9e00b40b",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-9e00b40b",
  "@metamask-previews/keyring-controller": "25.0.0-preview-9e00b40b",
  "@metamask-previews/logging-controller": "7.0.1-preview-9e00b40b",
  "@metamask-previews/message-manager": "14.1.0-preview-9e00b40b",
  "@metamask-previews/messenger": "0.3.0-preview-9e00b40b",
  "@metamask-previews/multichain-account-service": "5.0.0-preview-9e00b40b",
  "@metamask-previews/multichain-api-middleware": "1.2.5-preview-9e00b40b",
  "@metamask-previews/multichain-network-controller": "3.0.1-preview-9e00b40b",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-9e00b40b",
  "@metamask-previews/name-controller": "9.0.0-preview-9e00b40b",
  "@metamask-previews/network-controller": "28.0.0-preview-9e00b40b",
  "@metamask-previews/network-enablement-controller": "4.0.0-preview-9e00b40b",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-9e00b40b",
  "@metamask-previews/permission-controller": "12.2.0-preview-9e00b40b",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-9e00b40b",
  "@metamask-previews/phishing-controller": "16.1.0-preview-9e00b40b",
  "@metamask-previews/polling-controller": "16.0.1-preview-9e00b40b",
  "@metamask-previews/preferences-controller": "22.0.0-preview-9e00b40b",
  "@metamask-previews/profile-metrics-controller": "2.0.0-preview-9e00b40b",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-9e00b40b",
  "@metamask-previews/ramps-controller": "3.0.0-preview-9e00b40b",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-9e00b40b",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-9e00b40b",
  "@metamask-previews/sample-controllers": "4.0.1-preview-9e00b40b",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-9e00b40b",
  "@metamask-previews/selected-network-controller": "26.0.1-preview-9e00b40b",
  "@metamask-previews/shield-controller": "4.1.0-preview-9e00b40b",
  "@metamask-previews/signature-controller": "38.0.1-preview-9e00b40b",
  "@metamask-previews/storage-service": "0.0.1-preview-9e00b40b",
  "@metamask-previews/subscription-controller": "5.4.0-preview-9e00b40b",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-9e00b40b",
  "@metamask-previews/transaction-controller": "62.9.1-preview-9e00b40b",
  "@metamask-previews/transaction-pay-controller": "11.0.1-preview-9e00b40b",
  "@metamask-previews/user-operation-controller": "41.0.1-preview-9e00b40b"
}

…CTIVITY_STATUSES

- Rename ConnectivityStatus constant to CONNECTIVITY_STATUSES
- Export ConnectivityStatus as a type instead of enum
- Update all references to use CONNECTIVITY_STATUSES
- Export CONNECTIVITY_STATUSES from index
@cryptodev-2s
Copy link
Contributor Author

@metamaskbot publish-preview

@cryptodev-2s cryptodev-2s requested a review from mcmire January 14, 2026 22:02
@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.0.0-preview-85ecacba",
  "@metamask-previews/accounts-controller": "35.0.1-preview-85ecacba",
  "@metamask-previews/address-book-controller": "7.0.1-preview-85ecacba",
  "@metamask-previews/analytics-controller": "1.0.0-preview-85ecacba",
  "@metamask-previews/announcement-controller": "8.0.0-preview-85ecacba",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-85ecacba",
  "@metamask-previews/approval-controller": "8.0.0-preview-85ecacba",
  "@metamask-previews/assets-controller": "0.0.0-preview-85ecacba",
  "@metamask-previews/assets-controllers": "95.2.0-preview-85ecacba",
  "@metamask-previews/base-controller": "9.0.0-preview-85ecacba",
  "@metamask-previews/bridge-controller": "64.5.0-preview-85ecacba",
  "@metamask-previews/bridge-status-controller": "64.4.2-preview-85ecacba",
  "@metamask-previews/build-utils": "3.0.4-preview-85ecacba",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-85ecacba",
  "@metamask-previews/claims-controller": "0.4.1-preview-85ecacba",
  "@metamask-previews/composable-controller": "12.0.0-preview-85ecacba",
  "@metamask-previews/connectivity-controller": "0.0.0-preview-85ecacba",
  "@metamask-previews/controller-utils": "11.18.0-preview-85ecacba",
  "@metamask-previews/core-backend": "5.0.0-preview-85ecacba",
  "@metamask-previews/delegation-controller": "2.0.0-preview-85ecacba",
  "@metamask-previews/earn-controller": "11.0.0-preview-85ecacba",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-85ecacba",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-85ecacba",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-85ecacba",
  "@metamask-previews/ens-controller": "19.0.1-preview-85ecacba",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-85ecacba",
  "@metamask-previews/eth-block-tracker": "15.0.0-preview-85ecacba",
  "@metamask-previews/eth-json-rpc-middleware": "22.0.1-preview-85ecacba",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-85ecacba",
  "@metamask-previews/foundryup": "1.0.1-preview-85ecacba",
  "@metamask-previews/gas-fee-controller": "26.0.1-preview-85ecacba",
  "@metamask-previews/gator-permissions-controller": "0.8.0-preview-85ecacba",
  "@metamask-previews/json-rpc-engine": "10.2.0-preview-85ecacba",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-85ecacba",
  "@metamask-previews/keyring-controller": "25.0.0-preview-85ecacba",
  "@metamask-previews/logging-controller": "7.0.1-preview-85ecacba",
  "@metamask-previews/message-manager": "14.1.0-preview-85ecacba",
  "@metamask-previews/messenger": "0.3.0-preview-85ecacba",
  "@metamask-previews/multichain-account-service": "5.0.0-preview-85ecacba",
  "@metamask-previews/multichain-api-middleware": "1.2.5-preview-85ecacba",
  "@metamask-previews/multichain-network-controller": "3.0.1-preview-85ecacba",
  "@metamask-previews/multichain-transactions-controller": "7.0.0-preview-85ecacba",
  "@metamask-previews/name-controller": "9.0.0-preview-85ecacba",
  "@metamask-previews/network-controller": "28.0.0-preview-85ecacba",
  "@metamask-previews/network-enablement-controller": "4.0.0-preview-85ecacba",
  "@metamask-previews/notification-services-controller": "21.0.0-preview-85ecacba",
  "@metamask-previews/permission-controller": "12.2.0-preview-85ecacba",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-85ecacba",
  "@metamask-previews/phishing-controller": "16.1.0-preview-85ecacba",
  "@metamask-previews/polling-controller": "16.0.1-preview-85ecacba",
  "@metamask-previews/preferences-controller": "22.0.0-preview-85ecacba",
  "@metamask-previews/profile-metrics-controller": "2.0.0-preview-85ecacba",
  "@metamask-previews/profile-sync-controller": "27.0.0-preview-85ecacba",
  "@metamask-previews/ramps-controller": "3.0.0-preview-85ecacba",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-85ecacba",
  "@metamask-previews/remote-feature-flag-controller": "4.0.0-preview-85ecacba",
  "@metamask-previews/sample-controllers": "4.0.1-preview-85ecacba",
  "@metamask-previews/seedless-onboarding-controller": "7.1.0-preview-85ecacba",
  "@metamask-previews/selected-network-controller": "26.0.1-preview-85ecacba",
  "@metamask-previews/shield-controller": "4.1.0-preview-85ecacba",
  "@metamask-previews/signature-controller": "38.0.1-preview-85ecacba",
  "@metamask-previews/storage-service": "0.0.1-preview-85ecacba",
  "@metamask-previews/subscription-controller": "5.4.0-preview-85ecacba",
  "@metamask-previews/token-search-discovery-controller": "4.0.0-preview-85ecacba",
  "@metamask-previews/transaction-controller": "62.9.1-preview-85ecacba",
  "@metamask-previews/transaction-pay-controller": "11.0.1-preview-85ecacba",
  "@metamask-previews/user-operation-controller": "41.0.1-preview-85ecacba"
}

Copy link
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

Last round of feedback, I think. Everything else looks good beyond this.

@cryptodev-2s cryptodev-2s requested a review from mcmire January 14, 2026 23:17
Copy link
Contributor

@mcmire mcmire left a comment

Choose a reason for hiding this comment

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

This looks great!

@cryptodev-2s cryptodev-2s added this pull request to the merge queue Jan 15, 2026
Merged via the queue into main with commit 8257977 Jan 15, 2026
294 checks passed
@cryptodev-2s cryptodev-2s deleted the feature/add-connectivity-controller branch January 15, 2026 14:05
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.

3 participants