WASI 扩展的原生后台进程

WASI 扩展的原生后台进程

WASI 扩展的原生后台进程

功能

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

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

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

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

这是 WASI 沙箱之外的原生进程权限,只应交给可信扩展和可执行程序。路径声明校验

列出的文件,但不能约束原生程序的任意行为。FFmpeg 由视频扩展选择,宿主不包含

媒体专用逻辑。

语法

manifest 声明 "permissions": ["process", "fs_read", "fs_write"]

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

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

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

视频任务

请求字段

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

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

原生执行保留操作系统账号权限;BT 进程本身也必须允许进程能力及请求的文件系统能力。

返回值

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

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

字段类型必有默认值含义 / 范围
stateStringqueuedrunningsucceededfailedcancelledtimed_out
stdoutstderrString空串每个流最后 1 MiB;非法 UTF-8 使用替换字符。
stdout_truncatedstderr_truncatedBoolfalse先前字节超出保留尾部容量。
exit_codeInt 或 JSON nullnull可用时为进程退出码;运行中或无数字退出码时为 null。
elapsed_msInt0提交后经过的毫秒数,终态冻结。

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 指令不增加工作。