package v2 import ( "fmt" "net/http" "time" "github.com/go-chi/chi/v5" ) type EventsHandler struct{} func NewEventsHandler() *EventsHandler { return &EventsHandler{} } func (h *EventsHandler) Routes() chi.Router { r := chi.NewRouter() r.Get("/", h.stream) return r } func (h *EventsHandler) stream(w http.ResponseWriter, r *http.Request) { flusher, ok := w.(http.Flusher) if !ok { http.Error(w, "streaming not supported", http.StatusInternalServerError) return } w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("X-Accel-Buffering", "no") w.WriteHeader(http.StatusOK) flusher.Flush() ticker := time.NewTicker(30 * time.Second) defer ticker.Stop() for { select { case <-r.Context().Done(): return case <-ticker.C: fmt.Fprintf(w, ": keepalive\n\n") flusher.Flush() } } }