fix: 防止 SSE 客户端 done 事件触发两次

This commit is contained in:
2026-06-19 22:39:31 +08:00
parent ba46b1479b
commit 96c4e7d88a
+6 -2
View File
@@ -41,6 +41,7 @@ const SSE = {
const decoder = new TextDecoder(); const decoder = new TextDecoder();
let buffer = ''; let buffer = '';
let currentEvent = ''; let currentEvent = '';
let doneReceived = false;
while (true) { while (true) {
const { done, value } = await reader.read(); const { done, value } = await reader.read();
@@ -62,6 +63,9 @@ const SSE = {
data = raw; data = raw;
} }
// Track explicit done event from backend
if (currentEvent === 'done') doneReceived = true;
// Call the matching handler // Call the matching handler
if (currentEvent && handlers[currentEvent]) { if (currentEvent && handlers[currentEvent]) {
handlers[currentEvent](data); handlers[currentEvent](data);
@@ -70,8 +74,8 @@ const SSE = {
} }
} }
// Stream ended // Stream ended — only fire done if backend didn't send an explicit one
if (handlers.done) handlers.done(); if (handlers.done && !doneReceived) handlers.done();
} catch (err) { } catch (err) {
if (err.name === 'AbortError') return; if (err.name === 'AbortError') return;
if (handlers.error) handlers.error({ message: err.message }); if (handlers.error) handlers.error({ message: err.message });