Documentation
¶
Overview ¶
Package sse 提供 Server-Sent Events 的轻量封装,屏蔽 SSE 在 Go 里的常见坑: 自动设置流式响应头、解除本连接的写超时(避免被 server WriteTimeout 掐断)、 每条事件后自动 flush(穿透 otelhttp / compress 等包装链)、客户端断开时结束。
Index ¶
Constants ¶
const DefaultWriteTimeout = 30 * time.Second
DefaultWriteTimeout 是单次事件写入的默认截止时间。慢/死客户端导致单次 写入超过该时长即返回错误、结束流,避免 goroutine 被无限钉死。 它是“每次写入”而非“整条连接”的超时,每次 Send 都会重置,因此不会掐断长连接。
Variables ¶
This section is empty.
Functions ¶
func Broadcast ¶
func Broadcast(b *stream.Broadcaster[Event], opts ...Option) http.HandlerFunc
Broadcast 返回一个 SSE handler:每个连接订阅 b,并把广播来的事件逐条推送给客户端。 连接断开(r.Context() 取消)时自动退订。配合 stream.Broadcaster 可实现 “一个事件源推给 N 个 SSE 连接”。
bc := stream.New[sse.Event](stream.WithBufferSize(64))
mux.Handle("/events", sse.Broadcast(bc))
// 业务侧产生事件:bc.Publish(sse.Event{Event: "msg", Data: "..."})
func Handler ¶
Handler 把 fn 包装成一个 SSE 的 http.HandlerFunc:
- 设置 Content-Type: text/event-stream 等响应头
- 每次写入设置滚动写超时(默认 30s,见 WithWriteTimeout),慢/死客户端不会钉死 goroutine
- 每条事件后自动 flush
- fn 返回或客户端断开(r.Context() 取消)时结束
fn 接收完整的 *http.Request,可照常读取 query、header(如断线重连的 Last-Event-ID)、path 通配符、body 等;取消信号通过 r.Context() 获取。 fn 在请求 goroutine 中执行;若从其它 goroutine 推送,可安全并发调用 Sink(内部有锁)。
sse.Handler(func(r *http.Request, sink sse.Sink) error {
topic := r.URL.Query().Get("topic")
lastID := r.Header.Get("Last-Event-ID") // 断点续传
ctx := r.Context()
...
})
Types ¶
type Event ¶
type Event struct {
// ID 事件 ID(可选)。设置后客户端断线重连会带上 Last-Event-ID,可用于断点续传。
ID string
// Event 事件类型(可选)。客户端可用 addEventListener(type) 订阅。
Event string
// Data 事件数据。可含换行,会被自动拆成多行 data: 字段。
Data string
// Retry 客户端断线后的重连等待(毫秒,可选,>0 才发送)。
Retry int
}
Event 是一条 Server-Sent Event。
type Option ¶
type Option func(*config)
Option 配置 Handler。
func WithWriteTimeout ¶
WithWriteTimeout 设置单次事件写入的截止时间,默认 DefaultWriteTimeout(30s)。 传 0 表示不限制(清除写超时;此时慢客户端可能长时间占用 goroutine,慎用)。