fix spurious WebSocket reconnect killing active sessions

When send() was called while the socket was still CONNECTING (state 0,
not yet OPEN), it queued the message and scheduled a reconnect after 1
second. The socket then connected successfully, but 1 second later the
scheduled reconnect fired and closed the working session (code 1005),
disrupting any in-flight requests (e.g. get_bars).

Two fixes:
1. Don't schedule a reconnect when the socket is CONNECTING — it is
   already in the process of connecting, no reconnect needed.
2. Cancel any pending reconnect timer in onopen — if a timer was
   already scheduled before the connection succeeded, clear it.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-04-01 22:43:02 -04:00
parent 5b78ecb041
commit bc9520f1b1

View File

@@ -70,6 +70,11 @@ class WebSocketManager {
this.ws.onopen = () => { this.ws.onopen = () => {
console.log('[WebSocket] Connected successfully') console.log('[WebSocket] Connected successfully')
// Cancel any pending reconnect timer — we're already connected
if (this.reconnectTimeout) {
clearTimeout(this.reconnectTimeout)
this.reconnectTimeout = null
}
this.isConnected.value = true this.isConnected.value = true
this.isAuthenticated.value = false // Wait for 'connected' message from server this.isAuthenticated.value = false // Wait for 'connected' message from server
this.reconnectAttempts = 0 // Reset reconnection counter this.reconnectAttempts = 0 // Reset reconnection counter
@@ -149,8 +154,8 @@ class WebSocketManager {
} else { } else {
console.log('[WebSocket] Queuing message (not connected yet):', message.type, '- Queue size:', this.messageQueue.length + 1) console.log('[WebSocket] Queuing message (not connected yet):', message.type, '- Queue size:', this.messageQueue.length + 1)
this.messageQueue.push(message) this.messageQueue.push(message)
// Trigger reconnection if not already in progress // Only schedule reconnect if socket is CLOSED/undefined — not when it's still CONNECTING
if (this.token && !this.reconnectTimeout) { if (this.token && !this.reconnectTimeout && this.ws?.readyState !== WebSocket.CONNECTING) {
this.scheduleReconnect() this.scheduleReconnect()
} }
} }