Skip to content

fix: prevent stale WebSocket handlers from corrupting reconnection state#38

Merged
wizzomafizzo merged 1 commit intomainfrom
fix/websocket-reconnect-stale-handlers
Feb 7, 2026
Merged

fix: prevent stale WebSocket handlers from corrupting reconnection state#38
wizzomafizzo merged 1 commit intomainfrom
fix/websocket-reconnect-stale-handlers

Conversation

@wizzomafizzo
Copy link
Member

Summary

  • Fixes app getting stuck in permanent "reconnecting" state after resuming from background
  • createWebSocket() now closes old WebSocket (nulling handlers) before creating a new one, preventing stale onclose callbacks from scheduling duplicate reconnection timers
  • pauseHeartbeat() now clears reconnectTimer, preventing background reconnection loops when the WebSocket dies while backgrounded
  • scheduleReconnect() is blocked when heartbeatPaused is true, so onclose events during pause can't start new reconnection cycles
  • Pong timeout uses closeWebSocket() to null handlers before close, preventing onclose from triggering a duplicate handleDisconnection()
  • Extracts closeWebSocket() helper reused in createWebSocket(), cleanup(), and pong timeout

Three bugs caused the app to get stuck in permanent "reconnecting" state
after resuming from background:

1. createWebSocket() replaced this.ws without cleaning up old handlers.
   Stale onclose callbacks would fire on the transport, scheduling
   duplicate reconnection timers and leaking WebSocket instances.

2. pauseHeartbeat() didn't clear reconnectTimer, allowing background
   reconnection loops when the WebSocket died while the app was
   backgrounded.

3. Pong timeout called ws.close() then handleDisconnection(), but the
   subsequent onclose event triggered handleDisconnection() again,
   creating parallel reconnection paths.

Extract closeWebSocket() helper to null handlers before closing,
reused in createWebSocket(), cleanup(), and pong timeout.
@codecov
Copy link

codecov bot commented Feb 7, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@wizzomafizzo wizzomafizzo merged commit eb03b98 into main Feb 7, 2026
2 checks passed
@wizzomafizzo wizzomafizzo deleted the fix/websocket-reconnect-stale-handlers branch February 7, 2026 07:42
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