编译运行云工适配
映公共[编译运行公约](../../../豫言操作系统接口/编译运行/规范.文言.md)于 Cloudflare Worker:以豫言书于云工宿主句柄桥之上(编译。豫),不增宿主原语,亦不改 `宿主.mjs`;真行豫言编器者,乃新增之宿主 JavaScript 模块[宿主/云工/编译运行.mjs](../../宿主/云工/编译运行.mjs)(“居于操作系统之 JS”),由平台外壳置于 Worker 之 env。
构
- 运行器(宿主 JS):
宿主/云工/编译运行.mjs出创建编译运行器工厂({binaryen, 编译模块, 桥模块, 取标准库资料?}),返一函数(资产绑定) → 运行器。运行器借浏览器编器宿主(宿主/浏览器/编译器/宿主.mjs之内存文件系统、执行模块与组装.mjs之创建组装器,与本模块同处操作系统目录,相对之位不易)。不解 HTTP,不定应答之形,惟司:验请求(与公约同则,防客之误)→ 排队 → 每运新造内存文件系,预置标准库.json.gz之资(进程内缓存“加载之诺”)→ 写/包上下文与/用户程序/*→ 以执行模块行编器 Wasm(Binaryen 组装之回调)→ 排阶段与出为事之队 → 成则读/程序.wasm、算 SHA-256。术:启动、读事件、取产物、取产物Base64、结束(另有诊断之运行数)。 - 适配(豫言):
编译。豫由云工绑定句柄 COMPILE <绑定名>得运行器之对象柄(许可 `COMPILE` 列授之,绑定名由客传入,与 D1、R2 等绑定同制),复以云工调用方法安全调其术:宿主之败(含 Promise 之拒)转为可捕之豫言异,辞冠“编译运行:”;产物字节以Uint8Array柄返,经云工句柄取字节读出即释;每调之后释运行器之柄。适配自验编译器名(一至一百二十八字节、无控制字)、运行号、请求之大(不逾二百零九万七千一百五十二字节)与等待毫秒(一至六万)。 - 运行号惟启之之事有效:适配所返之运行号乃“事标:宿主运行号”,事标者,每 Wasm 实例(每事)一生之随机前缀(同网页事件流之流柄则);他事用之,抛“运行号不属于当前事件”。此亦宿主平台之硬约:Worker 不许一请求所启之异步工作续于他请求(本适配一致性验证初以公约五术各为一 HTTP 端点,编译因而永不启,
读取编译运行事件恒返状态一——此则之所由来也)。 - 外壳之接:应用之许
{"COMPILE":["COMPILER_RUNTIME"]};外壳于调应用之前置运行器于env(代码见汉语版)。编器 Wasm 与 Binaryen 之 Wasm 须由外壳静态导入(Workers 不许运行时自字节编 Wasm),故留于平台外壳之侧;ASSETS绑定供标准库.json.gz(约二点六 MiB,解压 JSON 约五十七 MiB,不于豫言中解析)。云仓之用法见应用/云端编译服务/编译外壳.mjs。
限(运行器强制,与公约同)
请求不逾二 MiB、文件一至二百五十六、路径之则、内容合不逾二十六万二千一百四十四字节、产物不逾八 MiB、事文合不逾十六 MiB(逾者过程之事弃,终止之事不弃)、编器之出不逾二 MiB 与编期九十秒(由 执行模块 强制)、未终之运不逾八、既终待读之运不逾三十二(弃最旧)、运存活不逾五分钟、等待毫秒一至六万。编阶段串行(同一时唯一份五十七 MiB 之编文件系副本),编毕即释文件系,惟留产物字节。
已验
一致性验证在`一致性验证/`:真豫言 Wasm(试验应用)+ 真运行器 + 真编器与标准库,于 Node 进程内与本地 workerd(Miniflare)各行同一组十二景,另有二项惟 Node 进程内之测试(未授权之绑定、无残留之运)与六项惟 Node 内可行之运行器级测试,凡三十二项皆过。又于云仓 应用/云端编译服务/ 之黑盒测试 测试/编译.test.mjs(七项)对整个服务皆过,并与旧 JS 之实现作逐请求之差分。
异于旧者
- 请求体非有效 JSON、为空或逾二 MiB 时,四百之
error文乃宿主适配之中文辞(“入站 JSON 正文无效:…”“入站 JSON 正文超过 2 MiB”),不复为 JS 引擎之原辞;逾二 MiB 之请求,旧实现掐断其连接,今回洁净之四百。 - 单一 Worker 进程中同时候或编之运逾八,则第九请求得五百零三(辞“编译运行过多”);旧实现无此限,尽排队。
- 诊断事中之错误栈含宿主模块之径,两版有异。
- 输入宽容之度(应用层,缘豫言 JSON 解析与宿主结果桥之限):请求体之余字段含指数记数(如
1e29)或嵌套逾三十二层者答四百(旧受之);以 UTF-8 BOM 起首之请求体改受之(旧答四百)。真调用方(云端项目 DO)惟发files、entry、includeArtifact,不受其扰。
未验与待办
- Cloudflare 边缘之真内存(一百二十八 MiB 之限)与 CPU 之表现:本地 workerd 不强制;本机 RSS 之较,未见泄漏,峰值与旧实现同量级。
- 真流式:编器 Wasm 同步而行,独占 isolate,事实待编毕方能送出(旧实现亦然:应答头与诸行同时至);公约已为拉取式,宿主日后让出事件循环即可实时;届时应用改用可选内容种类之流式应答(
网页事件流今固定为text/event-stream,可增 0.2.0 之术开始入站文字流回应)。 - 本地
wrangler dev于八路并发压测重复数次后崩溃而退(旧实现同然),不碍单请求之正确;生产未见。