持久频道云工适配
频道。豫 以豫言书于云工宿主库之具名广播、可读流读取器与 Promise 之上,不增宿主 JavaScript 一字。其行[持久频道公约](../../../豫言操作系统接口/持久频道/规范.文言.md) 0.1.0:订、保序而发、限时而候、撤、闭与订数。
所以行之
- 宿主之频道:每逻辑频道对宿主广播
持久频道:<名>(其前缀使之与应用直用云工广播新流之频道不相通)。宿主广播属宿主对象,即同一 Durable Object 实例:注册表随对象而存,被逐则失;每实例至多六十四频道,每频道至多二百五十六读者,单块六十四 KiB,每读者积压一 MiB。 - 帧:讯文之 UTF-8 字节原样为一块而发,不加头,故文之额即宿主之六十四 KiB;控制帧以字节
0xFF(合法 UTF-8 绝不以之起首)起首:FF 02为探帧,FF 01加因文为闭帧。发时拒以0xFF起首之文。 - 订数与订限:宿主无“数订”之原语,本适配向频道发一探帧,以宿主所返之所达数为订数(订者读得探帧即略之,余时按已用者重算,故探不使候久或暂)。
订阅持久频道先探,至二百五十六则抛可捕之豫言异;频道数逾六十四不可先知,由宿主拒之(宿主报误,不可捕)。 - 候与逾时:向订之读取器发
read(),以Promise.allSettled裹之(不生未处理之拒),与scheduler.wait计时(自有之 AbortController,毕即撤)作Promise.race;逾时不弃尚未成之读承诺,下次候续用之,故不失讯。所读之字节经云工句柄取字节取出即释其柄,每候皆释临时之柄(宿主每事句柄之限四千零九十六,一订之内收发数千条已验)。 - 闭:先向诸订发闭帧(带因),后闭宿主频道,订者读尽所排之讯而得状态二。积压为宿主所断者,订之读以误告终,适配映之为“订阅积压超过 1 MiB,已被断开”。
- 登记簿与订阅柄:每 Wasm 实例内一订阅登记簿(柄、读取器号、待读承诺号、终态、终因)。订阅柄为“实例标记:读取器句柄号”,实例标记取
crypto.randomUUID()之首十三字,他事持之则得豫言之异。撤用云工调用方法安全调cancel(纵流已因积压而误,亦不使宿主之异穿出),并释读取器之柄;终不调releaseLock。 - 惟可用于持久对象之事:事类须以
durable-起首,否则抛可捕之豫言异(宿主原语于非持久对象之事自报不可捕之误)。 - 内部诸辅助之名皆以
持久频道内起首。
部署之要
一、全局 scheduler.wait:Workers 自具;Node 宿主以 node:timers/promises 之 scheduler 垫片经 创建云工宿主({全局}) 授之,见 一致性验证/工具.mjs 之 造全局。
二、事之限:阻候可逾每事墙钟之限(默认三十秒),然醒后下一调宿主即败;需更久之候与转之循环者,于应用目录置 执行配置.json(至多十五分钟)。
本地 workerd 之实测(Wrangler 4.129.0,兼容日 2026-09-10,同一持久对象实例上诸并发 durable-fetch,真实 HTTP 与真实 D1)
- 跨请求订与发、三订者按序各得百条、逾时之精(三百毫秒而得于二百九十至七百毫秒间,探不改其久暂)、闭而先交后终、六十四 KiB 之讯与零长之讯(空文),皆正;订限二百五十六与积压断之因文皆正;一订之内收发三千条不尽宿主句柄;先订后放之窗去重,于真实 D1 恰各一次。
- 客断之后持久对象内之事续行:订者之事于客去后犹为频道之讯所唤,其书先二次仍返零,第三次返一,而后应用撤订(订数归零)。阻候之时(无书)断不唤何物,惟讯至或逾时至方复行——故长联之转,赖心跳与周期之逾时。
- 订不随事毕而收:
订阅不取消之试验路由订后径返,订数仍一;一专属实例中有六十四此类频道之后,再订新频道得 HTTP 500(宿主拒:云工广播频道达到上限)。此可使实例六十四频道之额永尽(直至对象被逐),事因三十秒之限或平台取消而早终者亦然。 - 云端(Cloudflare 边缘)之行待验。
宿主改动之请(致宿主壳之守者;此适配不改宿主 JS)
一、事毕,收尾流之写器与读取器:详见[网页事件流适配说明](../网页事件流/说明.文言.md)“宿主改动之请”之 收尾流 补丁;读取器一律 cancel(),订即被收,本适配之订登记(读取器句柄)正在补丁所扫之内。补丁宿主上持久频道之一致性验证尽通过,“事毕订当自收”之测由待办转通过。
二、(可选,更稳)增二原语,令限成可捕之异而免探帧:豫言_云工_广播新流安全(名) → [爻, 流号或误文](订数与频道数逾限转为返值)与 豫言_云工_广播订阅数(名) → 整数(读 广播频道 中该频道今有之读者数,不生一帧)。适配届时可改用之,接口不变。
一致性验证
一致性验证/ 含试验应用 持久频道一致性应用(实 Wasm)、Node 测试 持久频道一致性.test.mjs(同一宿主对象上并发诸 durable-fetch 以拟同一持久对象之诸事:跨事订与发、多订者、多发者保序、逾时与探、零超时、闭、撤、无效与他事之订阅柄、二百五十六与六十四之限、积压断、万条之讯、文字之则、频道名之则、非持久对象之事、实例相隔、先订后放去重之范)、组合范例 服务商连接缩影应用(以二包复 AI 服务商连接持久对象:/connect 事件流带心跳、/dispatch 与 /chunk 乃他事、新联代旧联)及其测试,并有真实 workerd 复验之驱动。复行之法见该目录说明。