fix: validate SSE event data before parsing

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Dorian
2026-03-08 21:49:30 +00:00
co-authored by Claude Opus 4.6
parent 7de503a487
commit 94910820f8
+20 -8
View File
@@ -401,32 +401,41 @@ function connectSSE() {
addSSEListener(eventSource, 'spectator_count', (e) => {
try {
if (!e.data) return
const data = JSON.parse(e.data)
spectatorCount.value = data.count || 0
} catch { /* ignore */ }
if (typeof data.count === 'number') spectatorCount.value = data.count
} catch (err) {
console.warn('[SSE] spectator_count parse error:', err)
}
})
addSSEListener(eventSource, 'ping', (e) => {
try {
if (e.data) {
if (!e.data) return
const data = JSON.parse(e.data)
if (data.spectators !== undefined) spectatorCount.value = data.spectators
if (typeof data.spectators === 'number') spectatorCount.value = data.spectators
} catch (err) {
console.warn('[SSE] ping parse error:', err)
}
} catch { /* ignore */ }
})
addSSEListener(eventSource, 'reaction', (e) => {
try {
if (!e.data) return
const data = JSON.parse(e.data)
if (data.emoji && data.counts) {
if (typeof data.emoji === 'string' && data.counts) {
spawnLiveReactionEmoji(data.emoji)
}
} catch { /* ignore */ }
} catch (err) {
console.warn('[SSE] reaction parse error:', err)
}
})
addSSEListener(eventSource, 'round_start', (e) => {
try {
if (!e.data) return
const data = JSON.parse(e.data)
if (!data.challenge || !data.round) return
currentChallengeInfo.value = { type: data.challenge.type, label: data.challenge.label }
liveLogItems.value.push({
type: 'challenge',
@@ -436,12 +445,13 @@ function connectSSE() {
})
scrollLiveLog()
} catch (err) {
console.warn('[FightPage] SSE round_start parse failed:', err)
console.warn('[SSE] round_start parse error:', err)
}
})
addSSEListener(eventSource, 'human_challenge', async (e) => {
try {
if (!e.data) return
const sseData = JSON.parse(e.data)
if (myBot.value) {
const res = await fetch(`/api/fights/${fightId.value}/challenge/${myBot.value.id}`)
@@ -469,6 +479,7 @@ function connectSSE() {
addSSEListener(eventSource, 'round_end', (e) => {
try {
if (!e.data) return
const data = JSON.parse(e.data)
if (data.spectators !== undefined) spectatorCount.value = data.spectators
handleRoundEnd(data).catch(() => {})
@@ -479,6 +490,7 @@ function connectSSE() {
addSSEListener(eventSource, 'fight_end', (e) => {
try {
if (!e.data) return
const data = JSON.parse(e.data)
if (data.spectators !== undefined) spectatorCount.value = data.spectators
handleFightEnd(data).catch(() => {})