diff --git a/broker/sse.go b/broker/sse.go index 0679f83..a40692d 100644 --- a/broker/sse.go +++ b/broker/sse.go @@ -57,7 +57,7 @@ func (broker *Broker) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.Header().Set("Access-Control-Allow-Credentials", "true") ctx := r.Context() // browser can close sse on its own; ping every 2s to prevent - heartbeat := time.NewTicker(2 * time.Second) + heartbeat := time.NewTicker(8 * time.Second) defer heartbeat.Stop() for { select { @@ -67,13 +67,20 @@ func (broker *Broker) ServeHTTP(w http.ResponseWriter, r *http.Request) { return case event := <-broker.Notifier: broker.log.Debug("got event", "event", event) - _, err := fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event.EventName, event.Payload) - if err != nil { - broker.log.Error("failed to write event", "error", err) - // Client disconnected - return + for i := 0; i < 10; i++ { // Repeat 3 times + _, err := fmt.Fprintf(w, "event: %s\ndata: %s\n\n", event.EventName, event.Payload) + if err != nil { + broker.log.Error("write failed", "error", err) + return + } + w.(http.Flusher).Flush() + // Short delay between sends (non-blocking) + select { + case <-time.After(20 * time.Millisecond): // Adjust delay as needed + case <-ctx.Done(): + return + } } - w.(http.Flusher).Flush() case <-heartbeat.C: // Send SSE heartbeat comment if _, err := fmt.Fprint(w, ":\n\n"); err != nil { diff --git a/components/room.html b/components/room.html index c459bd1..cdcfa3f 100644 --- a/components/room.html +++ b/components/room.html @@ -53,7 +53,7 @@