直至正文
豫言包府
← 众包

豫言操作系统隔离运行 0.1.0

豫言 · 库

把已编译的文件式豫言程序放进 Dynamic Worker 隔离运行一次:无网络、无平台绑定、限算时,取回标准输出与约定目录的输出文件。

隔离运行公约 0.1.0

此包使客置一已编之文件式程序于与己全隔之室,运行一次,取其标准出、标准误与约定目录之文。文件式程序者,豫言编器为文件式宿主(浏览器编器宿主、节点宿主)所出之 WasmGC 程序:读写内存文件系,用命令行参数与标准出,不识网、平台之绑定与操作系。云工作台以之运用户站点之程序;凡运不可信而由人或器所编之豫言程序者,皆可用之。此乃云工专用之能,用 Worker Loader 绑定,应用之许须授 LOADER 绑定之名。

术

运行隔离程序 运行器名 范围 产物摘要 程序 输入,返字符串。

| 参 | 义 | | --- | --- | | 运行器名 | 应用之许 LOADER 列中所授之绑定名;未授则抛豫言之异 | | 范围 | 隔离缓存之分区名,一至一百二十八字节,不得含控制之字。同(范围,产物摘要,宿主资源版)之运,可共一隔离体;异范围永不共。云工宿主之运行资源(子入口与内存文件系之宿主)随构建而定,同一次部署之内其版不变,故隔离体之标识即「范围:产物摘要」 | | 产物摘要 | 解码后程序字节之 SHA-256,六十四位小写十六进制。宿主运前重算而较之,不符则抛「运行产物摘要不匹配」(防存储损坏或被易) | | 程序 | 编译产物之 Base64 文(标准字母表,宽容 ASCII 空白与缺省之填充,同 JS 之 atob),长一至四百一十九万四千三百零四字,解码后至多三百一十四万五千七百二十八字节,须为有效 Wasm。用 Base64 者,以产物恒以 JSON 文存与传也 | | 输入 | JSON 文,至多一百五十七万二千八百六十四字节:{"args":[…字符串],"files":{"路径":"文"}}。args 缺则空列,须为字符串列;files 缺则空对象,值须为字符串,路径依 / 规整(去 .、折 ..、补首 /) |

室

  • 每运皆新程序实例、新内存文件系,运与运之间不留任何状;同(范围,摘要,宿主资源版)惟共已编之模块,不共其数。久存之数,当由客置于输入之 files,复自输出之 files 取之。
  • 无外发之网、无平台绑定、无环境变量、子请求为零;算时之限一千毫秒(宿主可减不可增);标准出与标准误合至多六万五千五百三十六字节,逾则程序败(ok 为假而带 error)。
  • 算时之限,平台执之:逾算时之限,则平台止其隔离体,客得败而不得程序之返值,运行隔离程序 抛「隔离运行失败:…」。宿主之执行器虽另设五秒墙钟之察,然惟程序回调宿主之检点时方行;今编器为文件式所出之程序无检点,故死循环之程全赖平台之算时限以止之。本地 workerd 不执算时之限(已验:死循环之程恒占算力而不返),本地验测不得运死循环之程。
  • 标准入为空;命令行之程序名为 /程序.wasm,当前目录为 /。

返

返 JSON 文:{"ok":爻,"stdout":文,"stderr":文,"exitCode":整数,"files":{路径:文},"error"?:文}。

  • ok:程序以退出码零终。exitCode 为程序之退出码;程序因运行之误(陷阱、出逾限、未捕之豫言异、宿主检点逾时)而终,则 ok 为假、exitCode 为一,而带 error 以说其故(未捕之豫言异于宿主表为 illegal cast,出逾限为「输出超过 64 KB」)。程序之败乃返值,非异;已书于标准出与标准误者,仍于 stdout、stderr 返之(逾限之一书除外)。
  • files:惟含运毕时内存文件系中以 /数据/、/响应/ 起首之文(输入所予而程序未改之 /数据/… 亦在其中),各依严格 UTF-8 解为文;至多二百五十六件,合至多一百零四万八千五百七十六字节(以字节计);逾限,或有文非有效 UTF-8,则整运判为接口之败(抛豫言异「隔离运行失败:500:…」)。他径(含输入之 /请求/…)不返。
  • 输入或程序违规(摘要不符、越限、args 类型误、非有效 Wasm)、运行器未授、隔离体之造或用败,皆抛可捕之豫言异,其消息明其故(见下「败之情形」)。宿主之败一律走可捕之异,不得中止当前之事。

败之情形

| 情形 | 类与消息 | | --- | --- | | 运行器名非一至一百二十八字节;范围非一至一百二十八字节或含控制之字;产物摘要非六十四位小写十六进制;程序文长不在一至四百一十九万四千三百零四;输入逾一百五十七万二千八百六十四字节 | 违规,可捕,消息依次为 运行器名无效、隔离范围无效、产物摘要无效、运行产物无效、运行输入超过上限 | | 程序文非有效 Base64 | 违规:运行产物无效:不是有效的 Base64 | | 解码后字节之 SHA-256 与产物摘要不符 | 违规:运行产物摘要不匹配 | | 运行器名不在应用许可之 LOADER 列;绑定不存在;隔离体之造败;解码后非有效 Wasm;隔离体崩溃或逾平台之限 | 可捕:隔离运行失败:<故>(未授则故为 未授权的LOADER绑定:<名>,非有效 Wasm 则为 动态 Worker 程序不是有效 Wasm) | | 输入非有效 JSON,args 非字符串列,files 非路径至文之对象 | 违规:隔离运行输入无效:<故> | | 出文逾二百五十六件或合逾一百零四万八千五百七十六字节,或有文非有效 UTF-8 | 接口之败:隔离运行失败:500:<故> | | 程序自身之败(退出码非零、陷阱、未捕之豫言异、出逾六万五千五百三十六字节) | 非异:返值 ok 为假 |

一致性样例

设程序甲读 /请求/路径.txt(无则视为空),书 /数据/记录.txt、/响应/正文.txt、/其他/密.txt 各一行,并于标准出印一行“你好”。以输入 {"args":["echo"],"files":{"/请求/路径.txt":"/x","/数据/旧.txt":"旧"}} 运之:

  • 返 ok 为真、exitCode 为零、stdout 为“你好”加换行;files 恰含 /数据/旧.txt、/数据/记录.txt、/响应/正文.txt,不含 /其他/密.txt 与诸 /请求/…。
  • 程序以退出码三终:返 ok 为假、exitCode 为三、无 error(返值,非抛异)。未捕之豫言异:ok 为假、exitCode 为一、error 非空。于标准出书六万五千五百三十七字节:ok 为假、error 为「输出超过 64 KB」。
  • 书二百五十六件 /数据/ 文(各一字节)悉返;书二百五十七件则抛「隔离运行失败:500:运行数据超过上限」。书一文合恰一百零四万八千五百七十六字节则返,多一字节则抛同异。书一非有效 UTF-8 之文,抛「隔离运行失败:500:…」。
  • 摘要多一位、含大写、或与程序不符,分别抛「产物摘要无效」「产物摘要无效」「运行产物摘要不匹配」;程序文含 @ 则抛「运行产物无效:不是有效的 Base64」;范围为空、一百二十九字节、含控制字,抛「隔离范围无效」,一百二十八字节则可;运行器名未授则抛「隔离运行失败:未授权的LOADER绑定:…」,运行器名为空则抛「运行器名无效」。
  • 输入为「不是JSON」、{"args":[1]}、{"files":{"/a":1}},分别抛「隔离运行输入无效:…」;非 Wasm 之字节(摘要无误)抛「隔离运行失败:动态 Worker 程序不是有效 Wasm」。
  • 于同一事中连运一千次(含一千次尽败之情形)皆正常而毕,不竭宿主之句柄表。同(范围,摘要)得同一隔离体之标识,范围异则标识异。

界

此包不含编译,程序须已编。不供多次调用间共享之存、网或定时之能。异宿主可以异隔离之术实现(Dynamic Worker、进程沙箱、WebAssembly 独立实例),惟须合上述之室与限,且于同程序同输入,所返 stdout、stderr、exitCode 与 files 相同。

所赖

观包之制

上传之记

今修订:1 ·

  1. 修订 1
    取 ZIP

包之层级

父:豫言操作系统接口

无子包。