隔离运行云工适配
把公共[隔离运行接口](../../../豫言操作系统接口/隔离运行/规范.汉语.md)映射到 Cloudflare Dynamic Worker Loader。全部逻辑用豫言写在 云工宿主的句柄桥之上,宿主只多两个通用原语:豫言_云工_隔离运行客按号取(等同已有的 云工动态按号取,只是子 Worker 的模块换成文件式程序的入口)及其安全变体 豫言_云工_隔离运行客按号取安全(宿主失败作为值返回,不让 JS 异常越过 Wasm 边界;适配只用安全变体),外加 豫言_云工_解Base64安全(atob)。
- 参数与摘要:豫言先检查运行器名、范围(1 至 128 字节、无控制字符)、摘要格式、程序 Base64 文字与输入的大小,用宿主的
云工解Base64安全解码程序,再用云工密码摘要重算它的 SHA-256 与传入的摘要比较,不符抛出「运行产物摘要不匹配」,Base64 非法或解码后越限抛出「运行产物无效」。 - 隔离体:
LOADER.get(范围:摘要, …):同一范围与摘要的运行复用已编译的子 Worker,不同范围永不共用。子 Worker 由构建器写入动态资源.mjs的两个模块组成:隔离运行客.mjs(入口)与编译宿主.mjs(浏览器编译器宿主的内存文件系统和执行模块),外加程序 Wasm 与值桥 Wasm。无网络出站、无绑定、CPU 1000 毫秒、子请求 0。旧构建器产物缺这两个模块时,取器失败并转成「隔离运行失败:缺少动态 Worker 模块源码:…」。取器失败(运行器名未授权、绑定不存在、限额无效)一律经安全变体转成可捕获的豫言异常「隔离运行失败:…」,不会中止当前事件。 - 调用:输入的 UTF-8 字节经
云工字节成句柄成为 Request 的请求体(不经 JSON 转义),向子 Worker 入口 POST;子入口解析并检查args与files,运行程序,只收集/数据/与/响应/的文件(严格 UTF-8,至多 256 个、合计 1 MiB),返回{ok,stdout,stderr,exitCode,files}。状态 200 时豫言原样返回响应文字;400(输入无效)与其他状态转成豫言异常「隔离运行输入无效」「隔离运行失败」;子 Worker 抛出异常(例如平台的 CPU 限额触发)、读取响应失败,也转「隔离运行失败」。用毕释放所有宿主句柄(成败两条路径都释放,单事件里连续运行数千次不耗尽句柄表)。 - 算时:CPU 限额 1000 毫秒由平台强制;宿主执行器的 5 秒墙钟检查只在程序回调宿主检查点时才起作用,当前文件式目标的程序没有检查点。本地 workerd 不强制 CPU 限额,死循环程序会一直占用 CPU,本地测试不得运行死循环程序(云端由平台终止)。
- 不做的事:不编译、不保存状态、不提供网络;持久数据由调用者放进输入
files,再从输出files取回。
验证:一致性验证/ 在真实本地 workerd(Miniflare 的 workerLoaders)里用一个豫言编译的文件式探针程序与云端项目核心 Wasm 运行 12 项:返回与文件筛选、路径规整、程序自身失败是返回值、文件个数与字节数与 UTF-8 限额、各类参数违规与摘要不符、未授权的运行器、输入违规与非 Wasm、Base64 宽容、单事件一千次运行不耗尽句柄、跨范围隔离、第二个真实程序、以及用假加载器核对隔离体标识、模块、限额和请求体。云仓的公开站点验收(应用/豫言云工作台/验收/公开站点豫言验收.mjs)另在真实 workerd 里用同一接口运行站点程序。