编译运行公约 0.1.0
此包使客于宿主之隔绝编室,编多文之豫言项目为 WasmGC 程序,并于编时逐一取其阶段之告与编器之出。此乃“云端编译之务”之核:请求之验、限额、应答之形与流式之报,皆客以豫言决之;宿主惟司一事,曰“行豫言之编器”——内存文件系、标准库之资、编器 Wasm 与 Binaryen 之组装。所成之物乃文件式 WasmGC 程序,可径授[隔离运行公约](../隔离运行/规范.文言.md)运之:本包 读取编译产物Base64 所返,正其程序之参。此乃云工专用之能:宿主以外壳于进程中固定之编资运编器,客之许须授一 COMPILE 绑定之名。
运之制
拉取之式。一运之始终:启动编译运行 得运行号 → 循环 读取编译运行事件 阻候下一事,至得终止之事 → 按需 读取编译产物 或 读取编译产物Base64 → 结束编译运行 释之。运行号乃宿主所生、不可猜之字符串,客不得自造。运行号惟启之之事有效:别事所得之号(纵字同)一律使调用抛可捕之豫言异,不误操他事之运(同网页事件流之流柄;亦以 Worker 之类宿主不许一事之异步工作续于他事也)。故一编之启、读事、取产物与终,须皆在同一事内。事依发生之序而出;宿主可边编边出,亦可编毕一并出,公约不承诺出之时,客不得恃“先见过程之事、后见编毕”之序。
术
启动编译运行 编译器名 请求,返运行号。
| 参 | 义 |
| --- | --- |
| 编译器名 | 客之许 COMPILE 列中所授之绑定名,一至一百二十八字节,不含控制之字;未授或绑定不存则本事失败 |
| 请求 | JSON 文,至多二百零九万七千一百五十二字节:{"files":{"路径":"文",…},"entry":"路径"},余字段不问 |
请求之则:files 乃路径至文之对象,含一至二百五十六件,值皆字符串,诸内容合至多二十六万二千一百四十四 UTF-8 字节;每路径至多二百五十六 UTF-16 码元,不含反斜线与 U+0000 至 U+001F 之控制字,不以 / 起,依 / 分段后每段非空且非 .、..。entry 缺或为 null 则取 入口。豫,须为合规之路径而在 files 中。违一则,或未终之运已有八(宿主忙),皆抛可捕之豫言异,辞为中文而明其故,不生运;绑定未授则使本事失败。成则即返,编于宿主中行。
读取编译运行事件 编译器名 运行号 等待毫秒,返(状态,事 JSON 文)。
- 阻候此运之下一事。等待毫秒须在一至六万,越则抛异。
- 状态
0:得一事,文为其 JSON(每事乃一 JSON 对象,见下节)。 - 状态
1:等待毫秒已满而无新事,运仍行,事文为空。客可因而写心跳、察己之限或续候。 - 状态
2:运已终而诸事已尽(终止之事已于前某次以状态零交付),或读者候时运被结束编译运行所终;事文为空。 - 同一运同一时至多一候者;运行号无效(空、过长、含控制字)、不属当前事、未知或已结束,抛可捕之豫言异。
读取编译产物 编译器名 运行号,返字节串:编成(终止之事乃带 artifact 之 finished)之 WasmGC 程序原字节,至多八百三十八万八千六百零八字节,可含零字节。运未终、编败、宿主故或运已结束,抛可捕之豫言异。读取编译产物Base64 返同一产物之 Base64 文(标准字母表,带 = 之填充,无换行),前提与败同上。二术于 结束编译运行 之前可重复用,其果同。
结束编译运行 编译器名 运行号 终运而释宿主之资(事之队、产物之字节),返单位值。幂等:运行号未知或已结束不为错。未始编之运不复编;已在编之运不可断,宿主弃其后果。既结束,再以此号读事或产物则抛可捕之豫言异;正候事之读者立得状态二。运行号不属当前事者亦抛异(幂等惟对本事内已结束或未知之号)。客当于一切路径(含出错)终己所启之运,否则运留于宿主至五分钟存活之期满而为宿主所收;事异退所遗之运,既不永占并发之额(并发之额惟计未终之运),亦不无限而积(见限额)。
事
事文乃一 JSON 对象,以 type 别其类。宿主可增新之过程事类,客遇不识之类当置之而不为错。
| type | 字段 | 义 |
| --- | --- | --- |
| stage | label:中文阶段之告;可带 phase(compile) | 编所至之阶,依所实行之步而发。至少有“正在加载标准库与项目文件”“正在执行豫言编译器”,其后编器组装 Wasm 时又有“正在组装 Wasm(N 字符)” |
| output | phase(compile)、stream(stdout 或 stderr)、text | 编器所写出之一段,原样,不截,不并行 |
| diagnostic | text | 编器异终时之诊(最近所读之文件与错误之栈),惟败时有之 |
| finished | result:{"ok":爻,"stdout":文,"stderr":文,"exitCode":整数,"error"?:文};artifact(惟成时):{"format":"wasmgc","bytes":整数,"sha256":六十四位小写十六进制} | 终止之事:编器已行毕。ok 为真,当且仅当退出码为零;stdout、stderr 乃诸出之全,等于依序拼诸同名 output 事之 text。编败(语法误、类型误、出逾限、逾时)乃 finished 而 ok 为假,无 artifact,error 与 stderr 明其故 |
| failed | error:中文之因 | 终止之事:宿主之故,编器未给其果(标准库之资不可用、文件系逾限、产物逾八 MiB 等) |
每运恰有一终止之事,恒为最后一事。artifact.sha256 乃产物字节之 SHA-256;bytes 乃其字节数。
编室
- 标准之境:每运皆于全新之内存文件系中行,预置宿主固定版之标准库资;包上下文由宿主固定:包
豫言/标准库,及所有者访客、名云项目、依标准库之项目包。项目之文置于项目包之目录(宿主内部之径/用户程序/)下,entry相对之;项目若含云项目。包。豫则用之,否则宿主置一空描述。编之目标固定为 WasmGC。客不得择编器之版、目标、包上下文或标准库。 - 无外能:编时无网、无原生进程、无环境变量、无宿主之文件;运与运之间不遗任何用户之文与产物,任一运亦读不到前运所写。
- 限额:编器之出(
stdout与stderr合)至多二百零九万七千一百五十二字节,逾则编败;一编之墙钟期限由宿主定(云工宿主为九十秒,编器调宿主原语时察之);产物至多八百三十八万八千六百零八字节;事文合至多一千六百七十七万七千二百一十六字节(逾者过程之事为宿主所弃,终止之事不弃)。同一宿主进程中未终(候或编中)之运至多八,逾则启动编译运行抛异;既终而待读之运另留至多三十二,逾则弃其最旧;诸运自创至多存活五分钟。编阶段串行(同一时唯一份编文件系副本),后者先候。 - 同版之编器与标准库,于同一项目,
ok、exitCode与产物字节当同;编器之志行带墙钟之时戳,故stderr之文不可逐字节而较。
败之分
- 违规(可捕之豫言异):请求不合规、逾限、并运过多、编译器名不合规、等待毫秒越界、运行号无效或不属当前事、运行号未知或已结束、同一运已有候者、产物不可用。异之辞为中文,明其故。
- 绑定未授或不存:使本事失败(宿主之误,客不可捕),与他云工公约同;此乃部署配置之事,非运时之业务情形。
- 编败:乃返值(
finished而ok为假),非异。 - 宿主之故:乃
failed之事,非异。
一致之例
- 入口
寻观「标准库」之书。寻观「云项目」之「问候」之书。「打印行」于「问候」。、问候。豫(以『你好,多文件』为问候)与云项目。包。豫三文:事序以stage(正在加载标准库与项目文件)、stage(正在执行豫言编译器)始,若干output之后恰有一finished(ok为真、exitCode为零)与artifact;再读事得状态二;读取编译产物之字节以 Wasm 魔数始而长等于artifact.bytes,SHA-256 等于artifact.sha256;读取编译产物Base64解码后与字节同;stdout、stderr等于对应output之text依序所拼。 - 入口之文为
此语不成立。:finished、ok为假、无artifact;读取编译产物抛异;stderr或error言及入口之文。 - 请求
{"files":{"../逃逸。豫":""}}、{"files":{}}、{"files":{"入口。豫":1}}、入口之文二十六万二千一百四十五字节、文名含反斜线或以/起、entry不在files中:启动编译运行皆抛异,宿主中不生运。 - 先后启两运而其文不同:各自之产物与事不相扰;后者读不到前者所写之任何文(同一径之次项目不见前项目之他文)。
- 事尽后再读:状态二;
结束编译运行后再读事、再读产物:抛异;重复结束:不为错。 - 阻候时别有并发之读者:抛异,不扰原候者;等待毫秒为零或六万零一:抛异。
- 于他事中用启之之事所返之运行号(读事、取产物、终):抛异,原事中之运不受扰。
界
此包惟司编:不运产物(用隔离运行公约)、不解不托 HTTP、不存任何状、不供网、不解包(惟标准库与项目自己之文)、不对外承诺编译之缓存。宿主可以异术实现(云工以 Worker 内之 WasmGC 编器与静态 Binaryen,他宿主可用进程沙箱或容器),惟须合上述之境、限与事之义。COMPILE 乃云工许可之种名;他宿主各以其授权之法,公约惟求“编译器名由客给,由宿主核”。