传输规范
A@UI 当前支持的传输格式为 SSE (Server-Sent Events)。
SSE 格式
每条 A@UI 命令以一行 data: <json> 发送,以 \n\n 结尾。命令流以 data: [DONE] 标记结束。
data: {"type":"render","component":"SearchBox","params":{"placeholder":"搜索项目"}}
data: {"type":"update","widgetId":"widget-1","params":{"value":"Mercury"}}
data: [DONE]
流解析行为
consumeAAtUIStream() 按以下规则解析 SSE 流:
- 逐行读取,过滤空行。
- 只处理以
data:开头的行,其他行静默跳过。 data:后的空白会被 trim。- 遇到
[DONE]立即返回,不再处理后续数据。 - 每个
data:行的 payload 会被JSON.parse()解析:- 解析成功 → 校验命令结构 → 合法则 dispatch,不合法则通过
onError通道暴露 - 解析失败 → 通过
onError通道暴露,附带原始 payload
- 解析成功 → 校验命令结构 → 合法则 dispatch,不合法则通过
- 流结束后如果缓冲区有残留内容,通过
onError暴露 "trailing partial SSE frame"。
缓冲区处理
解析器内部维护一个行缓冲区,处理 data: 行被分割在多段 chunk 中的情况:
let buffer = '';
// 每次 chunk 到达时追加,按行分割
buffer += chunk;
const lines = buffer.split(/\r?\n/);
buffer = lines.pop() ?? ''; // 最后一段可能不完整,留在缓冲中
WebSocket 与 HTTP Polling
WebSocket 和 HTTP Polling 是计划中的传输方式,当前尚未实现具体的前端运行时消费逻辑。如果通过其他方式将合法命令送入 Runtime API,Runtime 自身不关心字节来源。
参考
packages/a-at-ui/src/runtime/vue/stream.ts— SSE 流解析实现packages/a-at-ui/src/runtime/vue/adapter.ts—dispatch()和handleError()接口