Package httpsse implements HTTP server sent events, for the Go programming language.
Find a file
2026-03-02 00:45:46 -08:00
internal dealt with potential flush error 2026-03-01 20:35:40 -08:00
client.go client 2024-08-06 11:49:55 -07:00
contenttype.go httpsse.ContentType 2024-08-04 11:10:09 -07:00
dial.go added context 2026-03-02 00:45:46 -08:00
errors.go dealt with more errors 2026-03-01 23:11:44 -08:00
event.go corrected doc 2026-03-01 18:36:52 -08:00
eventreader.go made it so can get access to the (potentially) separate "data" fields 2024-08-06 15:36:48 -07:00
eventsetter.go made it so can get access to the (potentially) separate "data" fields 2024-08-06 15:36:48 -07:00
eventwriter.go codeberg 2025-09-03 20:32:45 -07:00
field.go made it so can get access to the (potentially) separate "data" fields 2024-08-06 15:36:48 -07:00
go.mod codeberg 2025-09-03 20:32:45 -07:00
go.sum codeberg 2025-09-03 20:20:26 -07:00
heartbeat.go dealt with more errors 2026-03-01 23:11:44 -08:00
LICENSE initial commits 2024-08-01 18:57:14 -07:00
newroute.go error handling 2026-03-01 20:47:52 -08:00
readevent.go codeberg 2025-09-03 20:32:45 -07:00
readevent_test.go made it so can get access to the (potentially) separate "data" fields 2024-08-06 15:36:48 -07:00
README.md docs correction 2026-02-24 17:33:03 -08:00
route.go route 2024-08-06 11:10:19 -07:00

go-httpsse

Package httpsse implements HTTP server-sent events, for the Go programming language.

As defined by: https://html.spec.whatwg.org/multipage/server-sent-events.html

Documention

Online documentation, which includes examples, can be found at: http://godoc.org/codeberg.org/reiver/go-httpsse

GoDoc

Examples

Here is an example HTTP SSE server:

package main

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

	"codeberg.org/reiver/go-httpsse"
)

func main() {
	var handler http.Handler = http.HandlerFunc(ServeHTTP)

	err := http.ListenAndServe(":8080", handler)
	if nil != err {
		panic(err)
	}
}

func ServeHTTP(responsewriter http.ResponseWriter, request *http.Request) {

	var route httpsse.Route = httpsse.NewRoute()

	// Send a heartbeat comment every 4.567 seconds.
	httpsse.HeartBeat(4567 * time.Millisecond, route)

	// Spawn this into its own go-routine.
	//
	// Having the things writing to the route run in a different go-routine is important
	// so that the call doesn't block before route.ServeHTTP() is called.
	go loop(route)

	route.ServeHTTP(responsewriter, request)
}

// This function isn't important for this example.
//
// Your own functions would do something useful.
func loop(route httpsse.Route) {
	for {
		err := route.PublishEvent(func(eventwriter httpsse.EventWriter)error{

			if nil == eventwriter {
				panic("nil event-writer")
			}

			var eventName string = "status"
			var eventID string = fmt.Sprintf("status-%d", time.Now().Unix())
			var eventData string = "Hello world!"

			eventwriter.WriteEvent(eventName)
			eventwriter.WriteID(eventID)
			eventwriter.WriteData(eventData)

			return nil
		})
		if nil != err {
			fmt.Printf("PUBLISH-EVENT-ERROR: %s \n", err)
		}

		time.Sleep(2351 * time.Millisecond)
	}
}

Here is an example HTTP SSE client:

package main

import (
	"fmt"

	"codeberg.org/reiver/go-httpsse"
)

func main() {
	const url string = "http://example.com/api/streaming" // REPLACE THIS WITH THE ACTUAL URL.

	client, err := httpsse.DialURL(url)
	if nil != err {
		fmt.Printf("ERROR: had problem dialing %q: %s \n", url, err)
		return
	}
	if nil == client {
		fmt.Println("ERROR: nil client")
		return
	}

	for client.Next() {
		var event httpsse.Event
		err := client.Decode(&event)
		if nil != err {
			fmt.Printf("ERROR: had problem trying to decode the event: %s", err)
			continue
		}

		// You would probably do something useful once you had the event.
		fmt.Println("EVENT:\n", event)
	}
	if err := client.Err(); nil != err {
		fmt.Printf("CLIENT-ERROR: %s", err)
		return
	}
}

Import

To import package httpsse use import code like the follownig:

import "codeberg.org/reiver/go-httpsse"

Installation

To install package httpsse do the following:

GOPROXY=direct go get codeberg.org/reiver/go-httpsse

Author

Package httpsse was written by Charles Iliya Krempeaux