Initial commit

main
Drew Bednar 6 days ago
parent d6810bf2cb
commit a3265bf763

@ -1,3 +1,25 @@
# learning_sse # learning_sse
Learning Server Side Events Learning Server Side Events.
The magic is in setting the `Content Type` header to `text/event-stream`, writing the response in the from of `data: %s \n\n`, and flushing the content of the WriteResponse buffer manually. This is necessary because by default Go will implicitly flush the buffer only once the Handler has returned.
```
func SSEHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
tokens := strings.Split("Hey there Drew. I hope you enjoy The Alters!", " ")
for _, token := range tokens {
w.Write([]byte(fmt.Sprintf("data: %s \n\n", token)))
w.(http.Flusher).Flush()
time.Sleep(time.Millisecond * 420)
}
}
```
Use `go run main.go` and try curling the the sse endpoint.
```
curl http://0.0.0.0:8888/sse
```

@ -0,0 +1,3 @@
module git.runcible.io/androiddrew/learning_sse
go 1.21.0

@ -0,0 +1,47 @@
package main
import (
"context"
"fmt"
"io"
"log/slog"
"net/http"
"os"
"strings"
"time"
)
func SSEHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/event-stream")
tokens := strings.Split("Hey there Drew. I hope you enjoy The Alters!", " ")
for _, token := range tokens {
w.Write([]byte(fmt.Sprintf("data: %s \n\n", token)))
w.(http.Flusher).Flush()
time.Sleep(time.Millisecond * 420)
}
}
func routes() http.Handler {
mux := http.NewServeMux()
mux.HandleFunc("/sse", SSEHandler)
return mux
}
func run(ctx context.Context, w io.Writer, args []string) error {
addr := fmt.Sprintf("%s:%d", "0.0.0.0", 8888)
srv := &http.Server{
Addr: addr,
Handler: routes(),
}
slog.Info("Listing on: http://0.0.0.0:8888")
return srv.ListenAndServe()
}
func main() {
ctx := context.Background()
if err := run(ctx, os.Stdout, os.Args); err != nil {
slog.Error("an error occurred", "error", err)
}
}
Loading…
Cancel
Save