经云工 Worker Loader 与内存文件系统宿主,把已编译的文件式豫言程序放进 Dynamic Worker 隔离运行一次。
源码浏览已生成;不能解析的文件以纯文本展示,不表示通过类型检查。
# 隔离运行云工适配
把公共[隔离运行接口](../../../豫言操作系统接口/隔离运行/规范.汉语.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 里用同一接口运行站点程序。
# 隔离运行云工适配
此适配以 Cloudflare Dynamic Worker Loader 实公约之[隔离运行](../../../豫言操作系统接口/隔离运行/规范.文言.md)。诸术悉以豫言书于 `云工宿主`句柄桥之上,宿主惟增二通用原语:`豫言_云工_隔离运行客按号取`(同旧之 `云工动态按号取`,惟子工之模块易为文件式程序之入口)及其安全之式 `豫言_云工_隔离运行客按号取安全`(宿主之败归于值,不使 JS 之异越 Wasm 之界;适配惟用安全之式),并 `豫言_云工_解Base64安全`(`atob`)。
- **参与摘**:豫言先验运行器名、范围(一至一百二十八字节、无控制之字)、摘要之式、程之 Base64 文与入之大,以宿主之 `云工解Base64安全` 解程,复以 `云工密码摘要` 重算其 SHA-256 而较传入之摘,不符则抛「运行产物摘要不匹配」,Base64 非法或解后逾限则抛「运行产物无效」。
- **隔离体**:`LOADER.get(范围:摘要, …)`:同范围同摘之运,共已编之子工;异范围永不共。子工由构建器书入 `动态资源.mjs` 之二模块成之:`隔离运行客.mjs`(入口)与 `编译宿主.mjs`(浏览器编器宿主之内存文件系与 `执行模块`),并程序 Wasm 与值桥 Wasm。无外发之网、无绑定、算时一千毫秒、子请求为零。旧构建器之产物缺此二模块者,取器败而转「隔离运行失败:缺少动态 Worker 模块源码:…」。取器之败(运行器名未授、绑定不存在、限额无效)一律经安全之式转为可捕之豫言异「隔离运行失败:…」,不中止当前之事。
- **调**:入之 UTF-8 字节经 `云工字节成句柄` 为 Request 之体(不经 JSON 转义),POST 于子工入口;子入口析而验 `args` 与 `files`,运程序,惟收 `/数据/` 与 `/响应/` 之文(严格 UTF-8,至多二百五十六件、合一 MiB),返 `{ok,stdout,stderr,exitCode,files}`。状态二百则豫言原样返其文;四百(入无效)与他状态转为豫言异「隔离运行输入无效」「隔离运行失败」;子工自抛异(如平台之算时限触发)、读响应败,亦转「隔离运行失败」。用毕悉释宿主句柄(成败二途皆释,一事之内连运数千次不竭句柄表)。
- **算时**:算时之限一千毫秒,平台执之;宿主执行器之五秒墙钟察,惟程序回调宿主之检点时方行,今文件式之程无检点。**本地 workerd 不执算时之限**,死循环之程恒占算力,本地验测不得运之(云端由平台止之)。
- **所不为**:不编、不存状、不供网;久存之数,客置于入之 `files`,复自出之 `files` 取之。
验:`一致性验证/` 于真本地 workerd(Miniflare 之 `workerLoaders`)以豫言所编之文件式探针程序与云端项目核心 Wasm 运行十二项:返与文之筛、径之规整、程序自败乃返值、文之件数与字节数与 UTF-8 之限、诸参违规与摘要不符、未授之运行器、入违规与非 Wasm、Base64 之宽容、一事之内连运千次不竭句柄、跨范围相隔、第二真程序,并以假加载器核隔离体之标识、模块、限额与请求体。云仓之公开站点验收(`应用/豫言云工作台/验收/公开站点豫言验收.mjs`)另于真 workerd 以同一接口运站点之程序。