Skip to content

Commit 17e48a4

Browse files
authored
Release/638.0.0 (#6923)
## Explanation This PR releases **@metamask/[email protected]** with significant improvements to WebSocket reconnection reliability and robustness for real-time balance updates. ### Current State & Problems Addressed The previous WebSocket implementation had several reliability issues: 1. **Duplicate reconnection timers** could be created when multiple events triggered reconnects simultaneously, leading to memory leaks and inflated reconnect attempt counters 2. **Rapid reconnection loops** could occur when the server accepted connections but immediately closed them 3. **Race conditions** in reconnection scheduling could bypass exponential backoff, causing aggressive retry behavior 4. **Manual subscription cleanup** was fragile when recovering from subscription issues or orphaned subscriptions ### Solution This release introduces robust reconnection logic with the following improvements: #### 1. **Idempotent Reconnection Scheduling** - Prevents duplicate reconnection timers from being created - Checks if a reconnect is already scheduled before creating a new timer - Eliminates memory leaks from orphaned timers - Prevents unnecessary growth of reconnect attempt counters #### 2. **Stable Connection Timer** - Connection must remain stable for 10 seconds before resetting reconnect attempts - Prevents rapid reconnection loops when server accepts then immediately closes connections - Provides grace period for connection stability before declaring success #### 3. **Force Reconnection Method** - New `forceReconnection()` public API for controlled subscription state cleanup - Performs a controlled disconnect-then-reconnect sequence with exponential backoff - Useful for recovering from subscription/unsubscription issues and cleaning up orphaned subscriptions - Exposed via `BackendWebSocketService:forceReconnection` messenger action #### 4. **Improved Error Handling** - Always schedules reconnect on connection failure (exponential backoff prevents aggressive retries) - Removes redundant schedule calls from error paths - Better logging throughout for easier debugging #### 5. **Better State Management** - `disconnect()` now properly resets reconnect attempts counter - Fixed race condition in `connect()` that could bypass exponential backoff - More predictable state transitions ### Technical Details **Reconnection Behavior:** - Uses Cockatiel's exponential backoff with decorrelated jitter to prevent thundering herd - Initial delay: 1000ms, max delay: 30000ms - Backoff sequence resets only after 10 seconds of stable connection - Automatic reconnect on unexpected disconnects, stays disconnected on manual disconnects **Breaking Changes:** - `AccountActivityService` messenger allowed actions updated: removed `BackendWebSocketService:disconnect`, added `BackendWebSocketService:forceReconnection` ### Impact This improves the reliability of real-time balance updates across MetaMask Extension and Mobile by: - ✅ Preventing connection thrashing and resource exhaustion - ✅ Providing graceful recovery from network instability - ✅ Eliminating memory leaks from reconnection logic - ✅ Offering controlled subscription cleanup via `forceReconnection()` - ✅ Enabling better monitoring with improved logging ## References - Related to the broader WebSocket balance update initiative for MetaMask Mobile - Fixes #6861 - WebSocket reconnection improvements ## Checklist - [x] I've updated the test suite for new or updated code as appropriate - [x] I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate - [x] I've communicated my changes to consumers by updating changelogs for packages I've changed, highlighting breaking changes as necessary - [ ] I've prepared draft pull requests for clients and consumer packages to resolve any breaking changes (MetaMask Extension and Mobile updated) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > Releases `@metamask/[email protected]` with robust WebSocket reconnection and updates dependent packages/peer deps (`assets-controllers@83`, `bridge-controller@55`, `bridge-status-controller@55`); bumps monorepo version to 638.0.0. > > - **Core Backend** > - Release `@metamask/[email protected]` with improved, idempotent WS reconnection, stable-connection timer, `forceReconnection()` API, logging and error‑handling tweaks. > - BREAKING: `AccountActivityService` messenger actions updated (remove `disconnect`, add `BackendWebSocketService:forceReconnection`). > - **Assets** > - `@metamask/[email protected]`: BREAKING peer dep bump to `@metamask/core-backend@^3.0.0`. > - **Bridge** > - `@metamask/[email protected]`: BREAKING peer/dev dep bump to `@metamask/assets-controllers@^83.0.0`. > - `@metamask/[email protected]`: BREAKING peer/dev dep bump to `@metamask/bridge-controller@^55.0.0`. > - **Monorepo** > - Bump root version to `638.0.0`; update changelogs and package versions accordingly. > > <sup>Written by [Cursor Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit 54996e2. This will update automatically on new commits. Configure [here](https://cursor.com/dashboard?tab=bugbot).</sup> <!-- /CURSOR_SUMMARY -->
1 parent d385649 commit 17e48a4

File tree

10 files changed

+40
-25
lines changed

10 files changed

+40
-25
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/core-monorepo",
3-
"version": "637.0.0",
3+
"version": "638.0.0",
44
"private": true,
55
"description": "Monorepo for packages shared between MetaMask clients",
66
"repository": {

packages/assets-controllers/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [83.0.0]
11+
1012
### Changed
1113

14+
- **BREAKING:** Bump peer dependency `@metamask/core-backend` from `^2.0.0` to `^3.0.0` ([#6923](https://github.com/MetaMask/core/pull/6923))
1215
- Bump `@metamask/base-controller` from `^8.4.1` to `^8.4.2` ([#6917](https://github.com/MetaMask/core/pull/6917))
1316

1417
### Fixed
@@ -2154,7 +2157,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
21542157
21552158
- Use Ethers for AssetsContractController ([#845](https://github.com/MetaMask/core/pull/845))
21562159
2157-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
2160+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
2161+
[83.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
21582162
[82.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
21592163
[81.0.1]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
21602164
[81.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]

packages/assets-controllers/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/assets-controllers",
3-
"version": "82.0.0",
3+
"version": "83.0.0",
44
"description": "Controllers which manage interactions involving ERC-20, ERC-721, and ERC-1155 tokens (including NFTs)",
55
"keywords": [
66
"MetaMask",
@@ -84,7 +84,7 @@
8484
"@metamask/accounts-controller": "^33.1.1",
8585
"@metamask/approval-controller": "^7.2.0",
8686
"@metamask/auto-changelog": "^3.4.4",
87-
"@metamask/core-backend": "^2.1.0",
87+
"@metamask/core-backend": "^3.0.0",
8888
"@metamask/ethjs-provider-http": "^0.3.0",
8989
"@metamask/keyring-controller": "^23.1.1",
9090
"@metamask/keyring-internal-api": "^9.0.0",
@@ -115,7 +115,7 @@
115115
"@metamask/account-tree-controller": "^1.0.0",
116116
"@metamask/accounts-controller": "^33.0.0",
117117
"@metamask/approval-controller": "^7.0.0",
118-
"@metamask/core-backend": "^2.0.0",
118+
"@metamask/core-backend": "^3.0.0",
119119
"@metamask/keyring-controller": "^23.0.0",
120120
"@metamask/network-controller": "^24.0.0",
121121
"@metamask/permission-controller": "^11.0.0",

packages/bridge-controller/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [55.0.0]
11+
1012
### Changed
1113

14+
- **BREAKING:** Bump peer dependency `@metamask/assets-controllers` from `^82.0.0` to `^83.0.0` ([#6923](https://github.com/MetaMask/core/pull/6923))
1215
- Bump `@metamask/base-controller` from `^8.4.1` to `^8.4.2` ([#6917](https://github.com/MetaMask/core/pull/6917))
1316

1417
## [54.0.0]
@@ -760,7 +763,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
760763

761764
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
762765

763-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
766+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
767+
[55.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
764768
[54.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
765769
[53.1.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
766770
[53.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]

packages/bridge-controller/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/bridge-controller",
3-
"version": "54.0.0",
3+
"version": "55.0.0",
44
"description": "Manages bridge-related quote fetching functionality for MetaMask",
55
"keywords": [
66
"MetaMask",
@@ -66,7 +66,7 @@
6666
},
6767
"devDependencies": {
6868
"@metamask/accounts-controller": "^33.1.1",
69-
"@metamask/assets-controllers": "^82.0.0",
69+
"@metamask/assets-controllers": "^83.0.0",
7070
"@metamask/auto-changelog": "^3.4.4",
7171
"@metamask/eth-json-rpc-provider": "^5.0.1",
7272
"@metamask/network-controller": "^24.3.0",
@@ -87,7 +87,7 @@
8787
},
8888
"peerDependencies": {
8989
"@metamask/accounts-controller": "^33.0.0",
90-
"@metamask/assets-controllers": "^82.0.0",
90+
"@metamask/assets-controllers": "^83.0.0",
9191
"@metamask/network-controller": "^24.0.0",
9292
"@metamask/remote-feature-flag-controller": "^1.6.0",
9393
"@metamask/snaps-controllers": "^14.0.0",

packages/bridge-status-controller/CHANGELOG.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [55.0.0]
11+
1012
### Changed
1113

14+
- **BREAKING:** Bump peer dependency `@metamask/bridge-controller` from `^54.0.0` to `^55.0.0` ([#6923](https://github.com/MetaMask/core/pull/6923))
1215
- Bump `@metamask/base-controller` from `^8.4.1` to `^8.4.2` ([#6917](https://github.com/MetaMask/core/pull/6917))
1316

1417
## [54.0.0]
@@ -701,7 +704,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
701704

702705
- Initial release ([#5317](https://github.com/MetaMask/core/pull/5317))
703706

704-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
707+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
708+
[55.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
705709
[54.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
706710
[53.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
707711
[52.1.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]

packages/bridge-status-controller/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/bridge-status-controller",
3-
"version": "54.0.0",
3+
"version": "55.0.0",
44
"description": "Manages bridge-related status fetching functionality for MetaMask",
55
"keywords": [
66
"MetaMask",
@@ -58,7 +58,7 @@
5858
"devDependencies": {
5959
"@metamask/accounts-controller": "^33.1.1",
6060
"@metamask/auto-changelog": "^3.4.4",
61-
"@metamask/bridge-controller": "^54.0.0",
61+
"@metamask/bridge-controller": "^55.0.0",
6262
"@metamask/gas-fee-controller": "^24.1.0",
6363
"@metamask/network-controller": "^24.3.0",
6464
"@metamask/snaps-controllers": "^14.0.1",
@@ -76,7 +76,7 @@
7676
},
7777
"peerDependencies": {
7878
"@metamask/accounts-controller": "^33.0.0",
79-
"@metamask/bridge-controller": "^54.0.0",
79+
"@metamask/bridge-controller": "^55.0.0",
8080
"@metamask/gas-fee-controller": "^24.0.0",
8181
"@metamask/network-controller": "^24.0.0",
8282
"@metamask/snaps-controllers": "^14.0.0",

packages/core-backend/CHANGELOG.md

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
77

88
## [Unreleased]
99

10+
## [3.0.0]
11+
1012
### Added
1113

1214
- Add `forceReconnection()` method to `BackendWebSocketService` for controlled subscription state cleanup ([#6861](https://github.com/MetaMask/core/pull/6861))
@@ -21,7 +23,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2123

2224
- Bump `@metamask/base-controller` from `^8.4.1` to `^8.4.2` ([#6917](https://github.com/MetaMask/core/pull/6917))
2325
- Update `AccountActivityService` to use new `forceReconnection()` method instead of manually calling disconnect/connect ([#6861](https://github.com/MetaMask/core/pull/6861))
24-
- **BREAKING:** Update allowed actions for `AccountActivityService` messenger: remove `BackendWebSocketService:disconnect`, add `BackendWebSocketService:forceConnect` ([#6861](https://github.com/MetaMask/core/pull/6861))
26+
- **BREAKING:** Update allowed actions for `AccountActivityService` messenger: remove `BackendWebSocketService:disconnect`, add `BackendWebSocketService:forceReconnection` ([#6861](https://github.com/MetaMask/core/pull/6861))
2527
- Improve reconnection scheduling in `BackendWebSocketService` to be idempotent ([#6861](https://github.com/MetaMask/core/pull/6861))
2628
- Prevents duplicate reconnection timers and inflated attempt counters
2729
- Scheduler checks if reconnect is already scheduled before creating new timer
@@ -112,7 +114,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
112114
- **Type definitions** - Comprehensive TypeScript types for transactions, balances, WebSocket messages, and service configurations
113115
- **Logging infrastructure** - Structured logging with module-specific loggers for debugging and monitoring
114116

115-
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
117+
[Unreleased]: https://github.com/MetaMask/core/compare/@metamask/[email protected]
118+
[3.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
116119
[2.1.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
117120
[2.0.0]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]
118121
[1.0.1]: https://github.com/MetaMask/core/compare/@metamask/[email protected]...@metamask/[email protected]

packages/core-backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@metamask/core-backend",
3-
"version": "2.1.0",
3+
"version": "3.0.0",
44
"description": "Core backend services for MetaMask",
55
"keywords": [
66
"MetaMask",

yarn.lock

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2737,7 +2737,7 @@ __metadata:
27372737
languageName: unknown
27382738
linkType: soft
27392739

2740-
"@metamask/assets-controllers@npm:^82.0.0, @metamask/assets-controllers@workspace:packages/assets-controllers":
2740+
"@metamask/assets-controllers@npm:^83.0.0, @metamask/assets-controllers@workspace:packages/assets-controllers":
27412741
version: 0.0.0-use.local
27422742
resolution: "@metamask/assets-controllers@workspace:packages/assets-controllers"
27432743
dependencies:
@@ -2757,7 +2757,7 @@ __metadata:
27572757
"@metamask/base-controller": "npm:^8.4.2"
27582758
"@metamask/contract-metadata": "npm:^2.4.0"
27592759
"@metamask/controller-utils": "npm:^11.14.1"
2760-
"@metamask/core-backend": "npm:^2.1.0"
2760+
"@metamask/core-backend": "npm:^3.0.0"
27612761
"@metamask/eth-query": "npm:^4.0.0"
27622762
"@metamask/ethjs-provider-http": "npm:^0.3.0"
27632763
"@metamask/keyring-api": "npm:^21.0.0"
@@ -2806,7 +2806,7 @@ __metadata:
28062806
"@metamask/account-tree-controller": ^1.0.0
28072807
"@metamask/accounts-controller": ^33.0.0
28082808
"@metamask/approval-controller": ^7.0.0
2809-
"@metamask/core-backend": ^2.0.0
2809+
"@metamask/core-backend": ^3.0.0
28102810
"@metamask/keyring-controller": ^23.0.0
28112811
"@metamask/network-controller": ^24.0.0
28122812
"@metamask/permission-controller": ^11.0.0
@@ -2888,7 +2888,7 @@ __metadata:
28882888
languageName: unknown
28892889
linkType: soft
28902890

2891-
"@metamask/bridge-controller@npm:^54.0.0, @metamask/bridge-controller@workspace:packages/bridge-controller":
2891+
"@metamask/bridge-controller@npm:^55.0.0, @metamask/bridge-controller@workspace:packages/bridge-controller":
28922892
version: 0.0.0-use.local
28932893
resolution: "@metamask/bridge-controller@workspace:packages/bridge-controller"
28942894
dependencies:
@@ -2898,7 +2898,7 @@ __metadata:
28982898
"@ethersproject/contracts": "npm:^5.7.0"
28992899
"@ethersproject/providers": "npm:^5.7.0"
29002900
"@metamask/accounts-controller": "npm:^33.1.1"
2901-
"@metamask/assets-controllers": "npm:^82.0.0"
2901+
"@metamask/assets-controllers": "npm:^83.0.0"
29022902
"@metamask/auto-changelog": "npm:^3.4.4"
29032903
"@metamask/base-controller": "npm:^8.4.2"
29042904
"@metamask/controller-utils": "npm:^11.14.1"
@@ -2929,7 +2929,7 @@ __metadata:
29292929
uuid: "npm:^8.3.2"
29302930
peerDependencies:
29312931
"@metamask/accounts-controller": ^33.0.0
2932-
"@metamask/assets-controllers": ^82.0.0
2932+
"@metamask/assets-controllers": ^83.0.0
29332933
"@metamask/network-controller": ^24.0.0
29342934
"@metamask/remote-feature-flag-controller": ^1.6.0
29352935
"@metamask/snaps-controllers": ^14.0.0
@@ -2944,7 +2944,7 @@ __metadata:
29442944
"@metamask/accounts-controller": "npm:^33.1.1"
29452945
"@metamask/auto-changelog": "npm:^3.4.4"
29462946
"@metamask/base-controller": "npm:^8.4.2"
2947-
"@metamask/bridge-controller": "npm:^54.0.0"
2947+
"@metamask/bridge-controller": "npm:^55.0.0"
29482948
"@metamask/controller-utils": "npm:^11.14.1"
29492949
"@metamask/gas-fee-controller": "npm:^24.1.0"
29502950
"@metamask/network-controller": "npm:^24.3.0"
@@ -2967,7 +2967,7 @@ __metadata:
29672967
uuid: "npm:^8.3.2"
29682968
peerDependencies:
29692969
"@metamask/accounts-controller": ^33.0.0
2970-
"@metamask/bridge-controller": ^54.0.0
2970+
"@metamask/bridge-controller": ^55.0.0
29712971
"@metamask/gas-fee-controller": ^24.0.0
29722972
"@metamask/network-controller": ^24.0.0
29732973
"@metamask/snaps-controllers": ^14.0.0
@@ -3083,7 +3083,7 @@ __metadata:
30833083
languageName: unknown
30843084
linkType: soft
30853085

3086-
"@metamask/core-backend@npm:^2.1.0, @metamask/core-backend@workspace:packages/core-backend":
3086+
"@metamask/core-backend@npm:^3.0.0, @metamask/core-backend@workspace:packages/core-backend":
30873087
version: 0.0.0-use.local
30883088
resolution: "@metamask/core-backend@workspace:packages/core-backend"
30893089
dependencies:

0 commit comments

Comments
 (0)