Server-Sent Events in Go

Server-sent events (SSE) is a technology where a browser receives automatic updates from a server via HTTP connection. It is not websockets. Learn more.

The chat and the charts data is provided in realtime using the SSE implementation of Gin Framework.

Nick Message
Join the SSE real-time chat

◼︎ Users
◼︎ Inbound messages / sec
◼︎ Outbound messages / sec

Realtime server Go stats

Memory usage

◼︎ Heap bytes
◼︎ Stack bytes

Allocations per second

◼︎ Mallocs / sec
◼︎ Frees / sec

MIT Open Sourced

Server-side (Go)

func streamRoom(c *gin.Context) {
    roomid := c.ParamValue("roomid")
    listener := openListener(roomid)
    statsTicker := time.NewTicker(1 * time.Second)
    defer closeListener(roomid, listener)
    defer statsTicker.Stop()

    c.Stream(func(w io.Writer) bool {
        select {
        case msg := <-listener:
            c.SSEvent("message", msg)
        case <-statsTicker.C:
            c.SSEvent("stats", Stats())
        }
        return true
    })
}

Client-side (JS)

function StartSSE(roomid) {
    var source = new EventSource('/stream/'+roomid);
    source.addEventListener('message', newChatMessage, false);
    source.addEventListener('stats', stats, false);
}

SSE package

import "github.com/manucorporat/sse"

func httpHandler(w http.ResponseWriter, req *http.Request) {
    // data can be a primitive like a string, an integer or a float
    sse.Encode(w, sse.Event{
        Event: "message",
        Data:  "some data\nmore data",
    })

    // also a complex type, like a map, a struct or a slice
    sse.Encode(w, sse.Event{
        Id:    "124",
        Event: "message",
        Data: map[string]interface{}{
            "user":    "manu",
            "date":    time.Now().Unix(),
            "content": "hi!",
        },
    })
}
event: message
data: some data\\nmore data

id: 124
event: message
data: {"content":"hi!","date":1431540810,"user":"manu"}