fix: SSE reconnection with exponential backoff (BUG-F1)
SSE now always attempts reconnection when fight isn't finished, regardless of isLive.value. Uses exponential backoff (1s, 2s, 4s, max 8s). Moved sseRetries to outer scope to persist across reconnects. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.6
parent
370d8643b7
commit
e5ed856df9
@@ -36,6 +36,7 @@ export function useFightPolling(fightId: Ref<string>) {
|
||||
let pollHandle: ReturnType<typeof setInterval> | null = null
|
||||
let pollCount = 0
|
||||
let eventSource: EventSource | null = null
|
||||
let sseRetries = 0
|
||||
const sseListeners: SSEListenerEntry[] = []
|
||||
|
||||
// --- Load fight data ---
|
||||
@@ -182,17 +183,18 @@ export function useFightPolling(fightId: Ref<string>) {
|
||||
}
|
||||
})
|
||||
|
||||
let sseRetries = 0
|
||||
eventSource.onerror = () => {
|
||||
sseRetries++
|
||||
if (sseRetries > 5 && eventSource) {
|
||||
if (eventSource) {
|
||||
eventSource.close()
|
||||
eventSource = null
|
||||
const delay = Math.min(1000 * 2 ** (sseRetries - 5), 10000)
|
||||
setTimeout(() => {
|
||||
if (isLive.value && !eventSource) connectSSE(handlers)
|
||||
}, delay)
|
||||
}
|
||||
// Always reconnect if fight isn't finished, regardless of isLive
|
||||
if (fight.value?.status === 'finished') return
|
||||
const delay = Math.min(1000 * 2 ** (sseRetries - 1), 8000) // 1s, 2s, 4s, 8s max
|
||||
setTimeout(() => {
|
||||
if (!eventSource && fight.value?.status !== 'finished') connectSSE(handlers)
|
||||
}, delay)
|
||||
}
|
||||
eventSource.onopen = () => { sseRetries = 0 }
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user