Extism Plug-in

PumpBin使用Extism实现插件系统.

注意: Extism的主要用例之一是构建可扩展的软件和插件. 您希望能够从用户那里执行任意, 不受信任的代码? Extism使这样做既安全又实用.

PumpBin Extism Plug-in输入输出均是字节流, 并使用json序列化, Plug-in需要将输入字节流反序列化成json, 将json输出序列化成字节流. 在rust中使用serde_json的示例如下:

#[derive(Debug, Serialize, Deserialize)]
pub struct Input {
    ...
}

#[derive(Debug, Serialize, Deserialize)]
pub struct Output {
    ...
}

#[plugin_fn]
pub fn extism_plugin(input: Vec<u8>) -> FnResult<Vec<u8>> {
    let input = serde_json::from_slice::<Input>(input.as_slice())?;
    ...
    let output = Output { ... };
    Ok(serde_json::to_vec(&output)?)
}

常见错误

如果Plug-in中有任何代码涉及syscalls, 则需要编译为启用wasi模块. 比如生成随机数, 网络访问等等. (推荐直接编译为启用wasi模块, 避免错误, rust中为wasm32-wasi target)

Extism官网有使用各种语言开发Plug-in的详细教程, 下面是PumpBin Extism Plug-in的API文档.

以remote结尾的是Remote类型Plugin特有的Extism Plug-in.