Initial commit
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…
Reference in New Issue