Initial commit
parent
d6810bf2cb
commit
a3265bf763
@ -1,3 +1,25 @@
|
||||
# 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…
Reference in New Issue