package httputil import ( "fmt" "net/http" ) func HandleSSE(handler func(broadcast, single chan<- string)) http.Handler { broadcast := make(chan string) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/event-stream") w.Header().Set("Cache-Control", "no-cache") w.Header().Set("Connection", "keep-alive") w.Header().Set("Access-Control-Allow-Origin", "*") client := make(chan string) defer func() { close(client) }() go handler(broadcast, client) flusher, _ := w.(http.Flusher) for { select { case message := <-broadcast: fmt.Fprintf(w, "%s\n", message) flusher.Flush() case message := <-client: fmt.Fprintf(w, "%s\n", message) flusher.Flush() case <-r.Context().Done(): return } } }) }