Server-Sent Events for Go
Some event driven patterns require direct access to the client upon connect/disconnect. Original repo doesn't provide any potential access to these and seems to be not that much maintained. I didn't find any reasonably good implementations across other forks, so why not contributing myself or with your help :)
Server-sent events is a method of continuously sending data from a server to the browser, rather than repeatedly requesting it, replacing the "long polling way".
It's supported by all major browsers and for IE/Edge you can use a polyfill.
go-sse
is a small library to create a Server-Sent Events server in Go and works with Go 1.9+.
- Multiple channels (isolated)
- Broadcast message to all channels
- Custom headers (useful for CORS)
Last-Event-ID
support (resend lost messages)- Follow SSE specification
- Compatible with multiple Go frameworks
go get github.com/nfwsncked/go-sse
Server side:
package main
import (
"log"
"net/http"
"strconv"
"time"
"github.com/nfwsncked/go-sse"
)
func main() {
// Create SSE server
s := sse.NewServer(nil)
defer s.Shutdown()
// Configure the route
http.Handle("/events/", s)
// Send messages every 5 seconds
go func() {
for {
s.SendMessage("/events/my-channel", sse.SimpleMessage(time.Now().Format("2006/02/01/ 15:04:05")))
time.Sleep(5 * time.Second)
}
}()
log.Println("Listening at :3000")
http.ListenAndServe(":3000", nil)
}
Client side (JavaScript):
e = new EventSource('/events/my-channel');
e.onmessage = function(event) {
console.log(event.data);
};
More examples available here.
MIT