Route Handler · 投递与流式连接
Webhook 与 SSE 可靠性实验台
分别模拟“外部系统推送一次请求”和“浏览器保持一条事件流”,观察验签、去重、快速确认、续传、心跳与清理的边界。
全部为客户端本地模拟
不会发送网络请求
不会发送网络请求
构造一次 Webhook 投递
签名必须基于原始正文校验,不能先 JSON.parse。
投递状态
HTTP 响应等待投递
持久化 Delivery ID1 条
队列待消费0 条
后台业务序号期待事件 2
Webhook 生命周期
HTTP 快速确认与后台慢任务是两条不同时间线。
request.text()
○ 未执行读取原始正文。
HMAC 验签
○ 未执行在 JSON.parse 之前。
Schema 验证
○ 未执行验签后再解析字段。
持久化去重
○ 未执行数据库唯一约束。
写入队列
○ 未执行慢任务脱离请求。
快速返回 2xx
○ 未执行不等待后台消费。
后台消费者(worker)
○ 未执行异步处理与重试。
原始请求体
模拟 request.text()等待投递。
快速响应
与慢任务解耦—
尚未响应
有效新事件会先入队,再立即返回 2xx。
持久化去重与队列
真实系统使用数据库唯一约束- delivery-seen-001(已处理)
队列
- 队列为空
结构化日志
仅 request_id / delivery_id / status / action / duration_ms- 等待生成日志
Webhook 一键挑战
控制一条 SSE 连接
手动触发事件和心跳,没有自动播放或真实网络连接。
连接游标
连接状态未连接
Last-Event-ID无
待续传事件0 条
cleanup 次数0
SSE 生命周期
建立连接
○ 未执行Content-Type: text/event-stream。
发送事件帧
○ 未执行id / event / data / retry。
心跳注释
○ 未执行保持链路,不推进游标。
断线续传
○ 未执行读取 Last-Event-ID。
取消与 cleanup
○ 未执行request.signal abort 后清理资源。
线上事件帧
每个事件以空行结束: 尚未连接 retry: 3000
服务端事件历史
断线期间仍可积压- 尚未产生事件