sse

package
v0.5.2 Latest Latest
Warning

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

Go to latest
Published: Nov 1, 2025 License: MIT Imports: 12 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type Client

type Client struct {
	// contains filtered or unexported fields
}

Client SSE 客户端

func NewSSEClient

func NewSSEClient() *Client

func (*Client) Connect

func (c *Client) Connect(ctx context.Context, url string, opts ...ConnectOption) (<-chan Event, <-chan error, func(), error)

Connect 建立SSE连接并解析事件 返回:事件通道、错误通道、取消函数

type ConnectOption

type ConnectOption func(*connectOption)

func WithBody

func WithBody(body io.Reader) ConnectOption

func WithHeaders

func WithHeaders(headers map[string]string) ConnectOption

func WithMethod

func WithMethod(method string) ConnectOption

type Event

type Event struct {
	ID    string          // 来自 id: 行
	Event string          // 来自 event: 行;若缺失则默认为 "message";若payload含 event 字段则覆盖
	Data  json.RawMessage // 来自 data: 多行拼接后的完整JSON字符串
	Retry int             // 来自 retry: 行(毫秒)
}

Event 表示一个解析后的SSE事件 兼容:标准SSE与payload内含event的风格

type Writer

type Writer struct {
	// contains filtered or unexported fields
}

Writer 用于向客户端发送 Server-Sent Events(SSE)数据流。 封装了 http.ResponseWriter 与 http.Flusher,提供线程安全、带缓冲刷新、 符合 W3C SSE 规范的事件写入能力。

主要特性:

  1. 自动设置 SSE 所需的响应头(Content-Type: text/event-stream 等)。
  2. 提供多种写入方法:事件(event)、数据(data)、注释(comment)、 重连间隔(retry)、事件 ID(id)等,支持链式调用与立即刷新。
  3. 所有写入方法最终都会调用底层 ResponseWriter,并可通过 Flush() 立即 将缓冲数据推送到客户端,实现低延迟实时推送。
  4. 支持带 ID 的消息,用于客户端断线后通过 Last-Event-ID 恢复数据流。
  5. 支持多行 data 的规范拆分,确保 JSON 中的换行不会破坏 SSE 格式。

使用示例:

w, err := sse.NewSSEWriter(rw)
if err != nil {
    http.Error(rw, err.Error(), http.StatusInternalServerError)
    return
}
defer w.Flush() // 确保最后残留数据立即推送

// 发送一个带事件名与 ID 的 JSON 消息
if err := w.WriteEvent("message", map[string]string{"msg": "hello"}, "1"); err != nil {
    log.Printf("write event failed: %v", err)
    return
}

// 立即刷新到客户端
w.Flush()

注意事项:

  • 必须在响应开始前调用 NewSSEWriter,否则无法设置响应头。
  • 写入完成后务必调用 Flush(),避免数据滞留在缓冲区。
  • 若客户端不支持 Flusher,NewSSEWriter 会返回错误,需提前处理。

func NewSSEWriter

func NewSSEWriter(w http.ResponseWriter) (*Writer, error)

NewSSEWriter 创建并初始化一个 SSE Writer 实例。 该函数会检查传入的 http.ResponseWriter 是否支持 http.Flusher 接口, 若不支持则返回错误;若支持,则设置 SSE 所需的响应头(如 Content-Type、Cache-Control 等), 并返回一个可用于向客户端推送 Server-Sent Events 的 Writer。

func (*Writer) Flush

func (w *Writer) Flush()

Flush 刷新缓冲区,将所有待发送数据立即推送到客户端。 本方法应在每次写入完成后调用,确保客户端及时接收事件。

func (*Writer) WriteComment

func (w *Writer) WriteComment(comment string) error

WriteComment 注释心跳或备注(SSE注释行),每条消息以空行结束

func (*Writer) WriteCommentAndFlush

func (w *Writer) WriteCommentAndFlush(comment string) error

func (*Writer) WriteData

func (w *Writer) WriteData(payload any) error

WriteData 仅写入data

func (*Writer) WriteDataAndFlush

func (w *Writer) WriteDataAndFlush(payload any) error

func (*Writer) WriteDataLines

func (w *Writer) WriteDataLines(payload any) error

WriteDataLines 写入多行data(当JSON包含换行时更规范)

func (*Writer) WriteDataLinesAndFlush

func (w *Writer) WriteDataLinesAndFlush(payload any) error

func (*Writer) WriteDataWithID

func (w *Writer) WriteDataWithID(payload any, id string) error

WriteDataWithID 仅写入data且可选id

func (*Writer) WriteDataWithIDAndFlush

func (w *Writer) WriteDataWithIDAndFlush(payload any, id string) error

func (*Writer) WriteEvent

func (w *Writer) WriteEvent(event string, payload any, id string) error

WriteEvent 写入标准SSE事件

func (*Writer) WriteEventAndFlush

func (w *Writer) WriteEventAndFlush(event string, payload any, id string) error

func (*Writer) WriteID

func (w *Writer) WriteID(id string) error

WriteID 仅写入id一条消息(用于同步Last-Event-ID游标)

func (*Writer) WriteIDAndFlush

func (w *Writer) WriteIDAndFlush(id string) error

func (*Writer) WriteRetry

func (w *Writer) WriteRetry(ms int) error

WriteRetry 设置浏览器自动重连的间隔(毫秒)

func (*Writer) WriteRetryAndFlush

func (w *Writer) WriteRetryAndFlush(ms int) error

Jump to

Keyboard shortcuts

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