WASI 扩展的原生后台进程

WASI 扩展的原生后台进程

WASI 扩展的原生后台进程

功能

Rust SDK 的可选 host-process feature 向扩展实现提供

bt_extension_sdk::host_process::request(json)。它使用参数数组启动原生程序并立即

返回,轮询返回有界输出和状态,不等待进程完成。此能力要求本次更新后的 BT 宿主;

旧版 1.1.4 二进制不提供该导入。

这项宿主能力运行在 WASI 沙箱之外,并在 BT 构建包含它时统一提供给所有扩展。

原生程序继承操作系统账号权限。路径声明只校验任务拥有和清理的文件,不能约束

原生程序的任意行为,因此安装扩展即表示信任其代码。FFmpeg 由视频扩展选择,

宿主不包含媒体专用逻辑。

语法

不需要 manifest 权限声明。SDK 导入

bts_host.process_request(i32, i32, i32, i32) -> i32,请求为 UTF-8 JSON,

响应信封为 {ok: value} 或 {error: message}。SDK 解包为

Result<String, String>。这是扩展作者接口;BT 应用通常使用

视频任务。

请求字段

字段类型必填默认值范围 / 含义
opString是无spawn、poll、cancel、close。
programStringspawn 时无非空可执行文件路径或 PATH 名称,不隐式调用 shell。
argsArray[String]spawn 时无最多 256 个参数;整个请求 JSON 最多 64 KiB。
timeout_msInt否600001–300000;包含启动时间,由 worker 自动执行超时。
read_pathsArray[String]否[]已存在的项目相对路径,作为任务拥有关系元数据保留。
write_pathsArray[String]否[]父目录已存在的项目相对输出。
cleanup_pathsArray[String]否[]调用者以 create-new 方式预留的自有空普通文件;失败、取消或超时且进程回收后删除。
idInt非 spawn 时无当前扩展实例中存在的正整数任务 ID。
discard_outputBool否false仅 close:原子安排删除自有 cleanup_paths,包括 worker 刚刚成功的情况;普通 close 保留成功输出。

所列路径拒绝父目录跳转和规范化后超出项目根的路径。可执行程序的工作目录是项目根。

原生执行保留操作系统账号权限;可选的 BT 进程级策略必须允许进程能力,并在请求列出

路径时允许文件系统能力。

返回值

spawn 返回 {id: Int}。close 立即移除句柄并返回 {closed: true};取消和进程

回收继续在 worker 内完成。poll 和 cancel 返回以下字段:

字段类型必有默认值含义 / 范围
stateString是无queued、running、succeeded、failed、cancelled、timed_out。
stdout、stderrString是空串每个流最后 1 MiB;非法 UTF-8 使用替换字符。
stdout_truncated、stderr_truncatedBool是false先前字节超出保留尾部容量。
exit_codeInt 或 JSON null是null可用时为进程退出码;运行中或无数字退出码时为 null。
elapsed_msInt是0提交后经过的毫秒数,终态冻结。

BT 示例

资源与平台注意事项

每实例最多四个活动进程和 32 个保留句柄;整个宿主进程跨实例最多 32 个活动进程。

容量满时立即拒绝新任务。关闭运行中的句柄后,直到 worker 回收进程才释放活动额度,

不存在无界等待队列。每个输出流最多保留 1 MiB;WASM SDK 复用 16 MiB 响应缓冲,

以容纳 JSON 转义。关闭所有句柄后释放对应输出存储。

Windows 使用隐藏子进程及关闭即终止的独立 Job Object;Unix 在正常取消时使用独立

进程组。原生程序不得故意逃离其进程组或 Job。Unix 宿主异常终止时不保证后代清理。

本地验收覆盖 Windows x64;Unix 代码需要目标平台验证。销毁 Store 会请求取消其

子进程。成功输出在 close 后保留。

Web 请求脚本已有 BT 有界 blocking pool 隔离。媒体命令运行在专用有界 worker 内;

应用每个请求只轮询一次,不在请求内 sleep 等待。无关 VM 指令不增加工作。