授权服务云工适配
使用当前 Worker Request 和宿主许可中的 SERVICE 绑定。标头逐名过滤,转发正文时保留原始流;返回的原生 Response 只通过私有临时句柄交给豫言应用,业务路由仍由应用决定。
0.3.0 新增带正文请求与增量读取,全部用豫言写在云工宿主库之上,不增加宿主 JavaScript:
- 请求:正文经字节句柄交给
Request(不经 JSON 转义),标头由Headers构造,redirect: manual,中断信号用AbortSignal.timeout;发请求用服务绑定的fetch取得 Promise 句柄后经云工请求候回应安全等待,失败与期满成为返回值。 - 读取状态表:适配在本次事件的 Wasm 实例内保存“响应柄→读取状态”(读取器、解码器、余块、信号、结局、待出文字),事件结束随实例消失。
请求授权服务与请求授权服务带正文签发的柄都登记入表;表中没有的柄一律拒绝。 - 增量读取:首次读取时才创建读取器;有信号则经恒等
TransformStream的pipeThrough(…, {signal})接管正文流,期满时读取失败且对上游流执行取消;无正文的响应直接进入已读尽。每次读取一段原始字节(上游块过大时用subarray留余块),交给宿主的流式TextDecoder(BOM 去掉,非法序列成 U+FFFD,跨段拼接),再按码点边界切出不超过最大字节的文字,余文留作待出文字。 - 有限整读:先看
Content-Length,再循环读取累计,超限即取消;结果以文字段拼接。 - 取消:经读取器(或尚无读取器时经正文流)
cancel,幂等。 - 句柄卫生:每块的字节句柄、请求期的
Headers、Request、正文句柄都及时释放,终态时释放读取器、解码器、信号句柄;同一事件内可连续处理上千次请求。
一致性验证见 一致性验证/(含试验应用、真实 Wasm 加 Node 测试,及在私有暂存里复跑的说明)。已知平台前提:pipeThrough 的 signal 选项与 AbortSignal.timeout 需为宿主运行时所支持(Node 与 workerd 均支持);宿主的事件时限(创建豫言实例 默认 30 秒)短于所给超时时,以先到者为准。