跳转至

http.sse

Server-Sent Events(P4-C):事件流写面 + 客户端读侧 形态(与 http/parse.ct 头注同源,皆发射面已证形态): ① 零 use 纯模块:不 import std.net(加载器栈式查环把跨模块菱形 use 误判 环 —— divergences (g) E5020;本波实测加码:同父多子共享任一叶子同样 E5020/同名合并 E5030 ⇒ http 的 use 图必须是严格互斥树,见 client.ct 头注)。IO 粘合(事件串经 net 写道落 socket)由消费方一行 client_write_str 承担;本文件只出【串面写 + 增量读状态机】。 ② 写面 = sse_event_str:WHATWG HTML §server-sent-events 序列化 —— id:(有则)/ retry:(有则)/ event:(有则;空 = 默认 "message")/ data: 每逻辑行一条(多行 data 按 '\n' 拆,逐行剥尾 '\r')/ 空行派发。 字段顺序对解析方不敏感(spec 按行处理);取 id 前置惯例。 ③ 读面 = sse_step 可重入状态机(chunk_step 契约同款):src[pos..n) 进、 SseRet 出;rc = 1 派发(name/data/id 三槽;name 空 → "message";data 已去尾 LF)/ 0 需要更多(consumed = 未竟行起点距 pos 位移 —— 已落袋 行段照计,整行回卷重扫,无半行状态)/ -1 协议错(err 槽:1 非法字节、 2 行超限)。逐行处理(与 WHATWG 处理模型一致):空行派发但 data 空则 不派发(spec:空 data 缓冲 = 无事件);注释行(':' 起头)忽略; event/data/id/retry 之外字段名忽略;值域仅一冒号后单空格剥除; retry 记录不消费(v1:重连定时客户端侧无消费面,登记)。 ④ 字节道进(/I64[] 每字节一条 lane);Str 出(事件文本域,printable ASCII 32..126 + HTAB;C8 约束下经本模块 95 字表切片构建,表含 { } 转义 —— JSON 载荷常见面)。非 ASCII 载荷本波不收(登记;text/event- stream 为 UTF-8 文本域,宽字节面随 Str 构建面放宽同波)。 ⑤ 压缩互斥:permessage/content 编码不与此面交互(P4 登记面);无闭包、 无 Drop 局部、无方法调用,while 体仅标量局部((f)/(g) 纪律)。

pub struct

struct SseSt

状态:name/data/id 跨调用携带(data 以 '\n' 逐行累积,派发时去尾);
phase 恒 0(无跨行半扫状态 —— 回卷契约不需要相)。

Field Type
name Str
data Str
id Str

struct SseRet

Field Type
rc I64
err I64
consumed I64
name Str
data Str
id Str
st SseSt

pub fn

Signature Returns Description
sse_event_str(event: Str, data: Str, id: Str, retry: Str) Str 单行 data 拆行 + 剥尾 CR 后拼 data: 行序列;末尾派发空行。
id / retry / event 空串 = 省略该行(event 省略 = 接收方默认 "message")。
sse_st_new() SseSt —
sst_name(st: SseSt) Str 公开 getter((h) 缺口绕行:成员访问不出本模块)
sst_data(st: SseSt) Str —
sst_id(st: SseSt) Str —
sret_rc(r: SseRet) I64 —
sret_err(r: SseRet) I64 —
sret_consumed(r: SseRet) I64 —
sret_name(r: SseRet) Str —
sret_data(r: SseRet) Str —
sret_id(r: SseRet) Str —
sret_st(r: SseRet) SseSt —
sse_step(src: &[I64], n: I64, pos: I64, st: SseSt) SseRet 一步:自 pos 扫描;完整行即时处理(行内循环),空行派发(data 非空)或
吞弃;输入尽则 rc=0(回卷至未竟行起点)。行值段出 Str;域外字节 → -1。