From 3a8179a99aaa8c9c7bf31405ff11eb63407ebcfd Mon Sep 17 00:00:00 2001 From: ElnuDev Date: Mon, 17 Jul 2023 09:46:32 -0700 Subject: [PATCH] Implement Server-Sent Events --- main.go | 29 +++++++++++++++++++++++++++++ static/index.html | 3 +++ 2 files changed, 32 insertions(+) diff --git a/main.go b/main.go index 66d57fe..7420502 100644 --- a/main.go +++ b/main.go @@ -5,6 +5,7 @@ import ( "html/template" "log" "net/http" + "time" ) type handler = func(http.ResponseWriter, *http.Request) @@ -27,10 +28,38 @@ func generateClick() handler { ) } +func generateSseHandler(handler func(http.ResponseWriter, *http.Request)) handler { + return 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.WriteHeader(http.StatusOK) + handler(w, r) + } +} + +func generateCounter() handler { + return generateSseHandler(func(w http.ResponseWriter, r *http.Request) { + tick := time.Tick(500 * time.Millisecond) + ctx := r.Context() + outer: + for i := 0; ; i++ { + select { + case <-ctx.Done(): + break outer + case <-tick: + fmt.Fprintf(w, "event: count\ndata: %d\n\n", i) + w.(http.Flusher).Flush() + } + } + }) +} + func main() { http.Handle("/", http.FileServer(http.Dir("static"))) http.HandleFunc("/api/click1", generateClick()) http.HandleFunc("/api/click2", generateClick()) http.HandleFunc("/api/click3", generateClick()) + http.HandleFunc("/api/counter", generateCounter()) log.Fatal(http.ListenAndServe(":3333", nil)) } diff --git a/static/index.html b/static/index.html index e223af2..d9c8890 100644 --- a/static/index.html +++ b/static/index.html @@ -7,6 +7,9 @@ +
+
+