v0.4.3 : anti-buffering SSE (Cloudflare) - fin des derniers messages en retard au refresh

Le chat E2E d'app.ajean.link traverse Cloudflare (ajean.link, proxy orange) qui
bufferise le flux SSE par lots : la queue du replay arrivait 20-30s apres le reste,
de facon intermittente (surtout Safari iOS). Corrige par la technique standard :
padding d'amorcage en tete de flux + padding sur caught_up (force le flush de la
queue), Cache-Control: no-transform (interdit a Cloudflare de bufferiser/compresser),
et heartbeat 15s->4s (borne le pire cas).
This commit is contained in:
nathaninline committed 2026-07-22 09:15:15 +02:00
1 parent 7d104e3213
commit 51c2c2d80f
7 files changed
+25 -8

No files matched your search

+4 -2
View File
@@ -830,7 +830,9 @@ func sseHeartbeat(w http.ResponseWriter, flusher http.Flusher) (*sync.Mutex, fun
mu := &sync.Mutex{}
done := make(chan struct{})
go func() {
t := time.NewTicker(15 * time.Second)
// 4 s (et non 15) : borne le temps qu'un dernier bout de flux peut rester
// coincé dans un buffer proxy (Cloudflare) faute d'octets pour le pousser.
t := time.NewTicker(4 * time.Second)
defer t.Stop()
for {
select {
@@ -907,7 +909,7 @@ func handleChat(w http.ResponseWriter, r *http.Request) {
return
}
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Cache-Control", "no-cache, no-transform")
w.Header().Set("X-Accel-Buffering", "no")
flusher, _ := w.(http.Flusher)
mu, stop := sseHeartbeat(w, flusher)