fix: SSE 心跳直接写 w+flush(事件密集/队列满仍保活长连接)

- 原心跳经 writeCh 发送, 事件密集时队列满被 drop, 远程 nginx 网关长时间无字节导致 504/半开
- 改为主循环直接 Fprintf(w, ": heartbeat\n\n") + Flush, 绕过 writeCh, 保证 15s 恒有心跳
- 对应 pi-desktop: GUI 回复丢失(SSE 3分钟被 ERR_INCOMPLETE_CHUNKED_ENCODING 切断)
This commit is contained in:
JianFeeeee
2026-08-18 09:12:52 +08:00
parent 653dd34299
commit 707a01a2dd

View File

@ -1291,10 +1291,12 @@ func (h *Handler) handleChatEvents(w http.ResponseWriter, r *http.Request) {
case <-done:
return
case <-ticker.C:
select {
case writeCh <- ": heartbeat":
default:
// 心跳直接写 w 并 flush绕过 writeCh事件密集/队列满时也能保活长连接,
// 避免远程 nginx 网关因长时间无字节而 504/半开)。
if _, err := fmt.Fprintf(w, ": heartbeat\n\n"); err != nil {
return
}
flusher.Flush()
}
}
}