Skip to content

euskadi31/go-sse

Repository files navigation

Server Sent Events for Go Last release Documentation

Go Report Card

Branch Status Coverage
master Build Status Coveralls

Golang Server Sent Events server

Example

Server

package main

import (
	"fmt"
	"log"
	"net/http"
	"strconv"
	"time"

	"github.com/euskadi31/go-sse"
)

func main() {
	serve := sse.NewServer(func(rw sse.ResponseWriter, r *http.Request) {
		tickChan := time.NewTicker(time.Second * 2).C

		// recovery
		lastID := r.Header.Get(sse.LastEventID)
		if lastID != "" {
			log.Printf("Recovery with ID: %s\n", lastID)
		}

		for {
			select {
			case t := <-tickChan:
				eventString := fmt.Sprintf("the time is %v", t)

				log.Println("Send event...")

				rw.Send(&sse.MessageEvent{
					ID:   strconv.Itoa(int(t.Unix())),
					Data: []byte(eventString),
				})
			case <-r.Context().Done():
				log.Println("Done")

				return
			}
		}
	})

	serve.SetRetry(time.Second * 5)

	http.Handle("/events", serve)

	log.Panic(http.ListenAndServe(":1337", nil))
}

Client

var client = new EventSource("http://localhost:1337/events");

client.onmessage = (msg) => {
    console.log(msg);
};

License

go-sse is licensed under the MIT license.