Skip to content

fix: prevent WebSocket reconnection storm on IM token expiry#136

Closed
Jerry-Xin wants to merge 0 commit intodmwork-org:mainfrom
Jerry-Xin:fix/ws-reconnect-storm
Closed

fix: prevent WebSocket reconnection storm on IM token expiry#136
Jerry-Xin wants to merge 0 commit intodmwork-org:mainfrom
Jerry-Xin:fix/ws-reconnect-storm

Conversation

@Jerry-Xin
Copy link
Copy Markdown
Collaborator

Closes #135

Changes

socket.ts (3 changes)

  1. Stale WS close guardif (this.ws !== ws) return prevents old WebSocket close events from triggering phantom reconnects
  2. Exponential backoff with jitter — replaced fixed 3s delay with min(3000 × 2^attempts, 60000) plus ±25% random jitter
  3. Reset backoff on CONNACK successreconnectAttempts = 0 after successful connection

channel.ts (3 changes)

  1. Time-based cooldown — replaced hasRefreshedToken boolean with 60s cooldown (lastTokenRefreshAt + TOKEN_REFRESH_COOLDOWN_MS)
  2. Removed reset in onConnected — no longer resets the refresh guard on every successful connect
  3. Stagger delay + shutdown guard — random 0-5s delay before reconnect after token refresh, with if (stopped) return to prevent reconnection during shutdown

Tests

  • socket.test.ts — 5 new tests (backoff progression, delay cap, stale WS guard, reconnect counter reset)
  • channel.test.ts — 5 new tests (cooldown allow/block/expire, failure keeps cooldown, stagger bounds)

All 204 tests pass (194 existing + 10 new).

@Jerry-Xin Jerry-Xin closed this Mar 30, 2026
@Jerry-Xin Jerry-Xin force-pushed the fix/ws-reconnect-storm branch from 82578b0 to 305b00a Compare March 30, 2026 15:50
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.

fix: WebSocket reconnection storm on IM token expiry

1 participant