#wasm-plugin #guest #scotch #plugin-system #size #api

scotch-guest

Scotch guest API 用于创建 WASM 插件

1 个不稳定版本

0.1.0 2023年1月26日

#840WebAssembly

MIT 许可证

7KB
152

Scotch

使用 Rust 创建 WASM 插件的库。Scotch 允许您在 WASM 插件中的函数间传递复杂类型。它通过在主机和客机环境之间编码和解码复杂类型来实现这一点。编码和解码由 bincode@2.0.0-rc.2 处理,因此您的类型需要实现 bincode::Encodebincode::Decode 特性。

无头模式

您可以通过禁用默认功能来启用无头模式。这应该会减少主机二进制文件的大小。在无头模式下,您无法编译 wasm 字节码,需要依赖序列化的插件。请参阅 WasmPluginBuilder::from_serializedWasmPluginBuilder::from_serialized_compressedWasmPlugin::serializeWasmPlugin::serialize_compress。带有 *_compress*_compressed 的函数使用 flate2 crate 来压缩/解压缩插件,要使用它们,您需要启用 flate2 功能。

安装

# In your main application
[dependenices]
scotch-host = "0.1"

# In your plugins
[dependencies]
scotch-guest = "0.1"

示例应用

// Define functions that your plugin exports.
#[scotch_host::guest_functions]
extern "C" {
    // To pass complex types you use references to them, not owned types.
    // The name must match with the name of the plugin function.
    pub fn add_up_list(nums: &Vec<i32>) -> i32;
}

// Create your plugin
let plugin = WasmPlugin::builder()
    .with_state(0)
    // PLUGIN_BYTES is a slice of your wasm plugin.
    .from_binary(PLUGIN_BYTES)?
    // This call caches exports of your plugin.
    .with_exports(make_exports![add_up_list])
    .finish()?;

// Call the function
let sum = plugin.function_unwrap::<add_up_list>()(&vec![1, 2, 3, 4, 5])?;
assert_eq!(sum, 15);

示例插件

// This is required.
scotch_guest::export_alloc!();

// Functions marked with `guest_function` will be exposed to the host.
// All complex types such as Vec, String, user-defined types must be passed by immutable reference.
#[scotch_guest::guest_function]
fn add_up_list(items: &Vec<i32>) -> i32 {
    items.iter().sum::<i32>()
}

更完整的示例可以在这里找到

计划中的功能

  • 使用 proc macros 改进代码生成。
  • 可变引用。
  • WASI 支持。

依赖

~1.5MB
~41K SLoC