Documentation
¶
Overview ¶
Package sserelay 提供原始字节级 SSE relay:从 io.Reader 增量读取 SSE 帧, 原样转发给 http.ResponseWriter,自适应批量 Flush,并以 Observer 旁路暴露 事件信息(仅用于 usage 提取,不参与转发决策)。
Index ¶
Constants ¶
This section is empty.
Variables ¶
This section is empty.
Functions ¶
func InferEventName ¶
InferEventName 从 data-only 帧的 data 载荷推断事件名(顶层 "type" 字符串 值):帧首 `{"type":"` 锚定命中 → 值区间直接切片返回(零分配——Observer 每帧调用;解码器/反序列化对字符串结果必物化分配,字节直取;照 internal/billing/image_usage.go eventTypeIs 先例;值内 \ 转义跳过并以裸 字节返回——类型值恒无转义 ASCII,等价比较语义)。锚定不匹配(非首键/ 冒号后空白/前导空白/type 非字符串/null/畸形帧)→ 回退 json.Unmarshal 全量 解码(兼容——行为与旧 EventName 推断一致)。无 type / type 为空串 / 非 JSON → nil。返回切片:锚定路径指向输入字节(仅调用期间有效——调用方不得 跨帧保留);回退路径为本次分配。
Types ¶
type Config ¶
type Config struct {
FlushBytes int // 缓冲达到该值立即 flush;0 时默认 4096
FlushInterval time.Duration // 从 relay 启动起以固定间隔触发 timer flush(仅 pending > 0 时实际 flush);0 时默认 1ms
Observer Observer
// Mapper 可选的逐帧转换器(协议转换 W5):nil = 原样转发(热路径零开销,
// 单帧一次 nil 判定)。非 nil 时每帧先经 Mapper 变换再写出;Observer 仍见
// 原始帧(用量提取不因转换失真)。drop=true → 帧丢弃不写出。映射帧字节
// 生命周期仅限本帧:Mapper 返回后 relay 立即写出,调用方可复用缓冲。
Mapper func(Event) (frame []byte, drop bool)
}
type Event ¶
type Event struct {
Raw []byte // 完整原始帧(含结尾空行)
Event []byte // event: 字段值;data-only 帧为空
Data []byte // 合并后的 data: payload(多行以 \n 连接)
}
Event 是一次 SSE 事件的旁路视图。 Raw/Event/Data 均指向 relay 内部复用的缓冲,仅在本次 Observer 回调期间有效; 消费方不得跨帧保留这些切片(下一帧会复用同一批缓冲)。
Click to show internal directories.
Click to hide internal directories.