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:
Dorian
2026-03-12 23:02:10 +00:00
co-authored by Claude Opus 4.6
parent 370d8643b7
commit e5ed856df9
2 changed files with 116 additions and 6 deletions
+8 -6
View File
@@ -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 }
}