sse

package
v0.1.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 19, 2026 License: Apache-2.0 Imports: 7 Imported by: 0

Documentation

Overview

Package sse 提供 Server-Sent Events 的轻量封装,屏蔽 SSE 在 Go 里的常见坑: 自动设置流式响应头、解除本连接的写超时(避免被 server WriteTimeout 掐断)、 每条事件后自动 flush(穿透 otelhttp / compress 等包装链)、客户端断开时结束。

Index

Constants

View Source
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

func Handler(fn func(r *http.Request, sink Sink) error, opts ...Option) http.HandlerFunc

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

func WithWriteTimeout(d time.Duration) Option

WithWriteTimeout 设置单次事件写入的截止时间,默认 DefaultWriteTimeout(30s)。 传 0 表示不限制(清除写超时;此时慢客户端可能长时间占用 goroutine,慎用)。

type Sink

type Sink interface {
	// Send 发送一条事件并立即 flush。客户端已断开时返回错误。
	Send(Event) error
	// Comment 发送一条注释行(": text"),客户端会忽略,常用于心跳保活。
	Comment(text string) error
}

Sink 用于在 handler 中向客户端推送事件。并发安全。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL