WebAssembly 运行时
WebAssembly 运行时
Section titled “WebAssembly 运行时”WASM 运行时是一项实验性扩展。配置已稳定,但运行时内部实现可能在版本间发生变化。
Wippy 将 WebAssembly 模块作为一等注册表条目运行,与 Lua 代码并行。WASM 函数和进程在同一调度器内执行,共享相同的安全模型,并通过函数注册表与 Lua 互操作。
| Kind | 描述 |
|---|---|
function.wat | 在 YAML 中以内联 WebAssembly Text 格式定义的函数 |
function.wasm | 从文件系统条目加载的预编译 WASM 二进制文件 |
process.wasm | 作为进程执行的 WASM 二进制文件(CLI 命令或长期运行) |
- WASM 模块在
_index.yaml中声明为注册表条目 - 启动时,模块被编译并放入工作池
- Lua(或其他 WASM)代码通过
funcs.call()调用它们 - 参数和返回值在 Lua 表和 WIT 类型之间自动映射
- 异步操作(I/O、sleep、HTTP)通过调度器 yield,与 Lua 相同
Wippy 支持带有 WIT(WebAssembly Interface Types)的 WebAssembly 组件模型。组件模块在宿主和客户端之间获得完整的类型映射:
- Record 映射为带有命名字段的 Lua 表
- List 映射为 Lua 数组
- Result 映射为
(value, error)返回元组 - 基本类型(
s32、f64、string等)直接映射
原始/核心 WASM 模块也支持显式 WIT 签名。
从 Lua 调用 WASM
Section titled “从 Lua 调用 WASM”WASM 函数的调用方式与注册表中的其他函数相同:
local funcs = require("funcs")
-- No argumentslocal result, err = funcs.call("myns:answer_wat")
-- With argumentslocal result, err = funcs.call("myns:compute", 6, 7)
-- With complex datalocal users = { {id = 1, name = "Alice", tags = {"admin"}, active = true}, {id = 2, name = "Bob", tags = {"user"}, active = false},}local transformed, err = funcs.call("myns:transform_users", users)WASM 执行默认继承调用者的安全上下文:
- 继承 Actor 身份
- 继承作用域
- 继承请求上下文
宿主能力通过显式导入选择性启用。每个条目精确声明所需的 WASI 接口(wasi:cli、wasi:filesystem 等),限制模块的访问范围。