6 个版本
0.5.2-beta.0 | 2021 年 4 月 18 日 |
---|---|
0.5.1-beta.0 | 2021 年 4 月 17 日 |
0.4.7-beta.0 | 2021 年 1 月 29 日 |
#23 in #plugin-system
每月 40 次下载
用于 valor_bin
40KB
808 行
Valiu Open Runtime
一个基于插件的系统,允许在单个 API(最初仅支持 HTTP)下组合多个独立开发的 Javascript、WebAssembly 或原生模块。"插件" 是简单的消息处理程序,可以在本地或网页中运行,并建议使用对网页友好的依赖项,例如遵循 Web Worker API,这样相同的文件可以在服务器和浏览器中不变地运行(拦截来自服务器的 HTTP 调用)。
"插件" 系统
无论编译为原生库、WASM 或 JavaScript 模块,插件都实现了 Vlugin
接口,允许接收兼容的消息,如 HTTP 请求,并通过另一个消息(如 HTTP 响应)进行回应。
遵循 Web Worker API 时,你会发现它的功能强大到足以完成大多数任务,你可以编写访问各种操作系统 API 的原生插件或仅访问 DOM 的网页插件(例如),但建议你只访问 Workers 可用的功能以最大化可移植性。有许多强大的 API,如 fetch
、IndexDB
或 WebSocket
,可满足大多数常见需求,对于更复杂的服务,你可以考虑使用类似 CouchDB 的 HTTP 通信数据库,或考虑在 区块链 或类似 IPFS 的分布式存储中持久化状态。首选的方式无疑是编写使用可以编译为 WASM 的依赖项的 Rust 插件,例如 Surf(一个使用 fetch
的 HTTP 客户端,在编译为 WASM 时使用,而在本地编译时使用性能良好的后端)。
插件类型
Rust(WASM) | JS | Rust(Native) | WASI | |
---|---|---|---|---|
服务器 | ⚠️ | ⚠️ | ✅ | ❓ |
浏览器 | ⚠️ | ⚠️ | ✖️ | ❓ |
⚠️ 注意 使用本地插件时,它们使用
extern "Rust"
ABI,这是不稳定的,因此您的插件和运行时应该使用相同的rustc
版本编译。此外,只加载您信任的本地插件,不要公开插件注册API,因为它可能具有潜在的不安全性。
编写插件
Rust插件
要获得最佳性能和支持,建议使用Rust创建插件。使用 #[vlugin]
宏可以方便地定义插件,通过简单的顶层函数,它会处理生成 Vlugin
trait 实现,并导出一个实例化您的插件(无论编译为WASM还是本地库)的工厂函数。
use valor::*;
#[vlugin]
pub async fn on_request(_req: http::Request) -> http::Response {
"OK response from a plugin".into()
}
对于稍微复杂的需求,请查看示例 with state。
JS插件
⚠️ 这还在进行中,还没有辅助工具,服务器(将由Deno提供支持)还没有支持。
运行插件
本地
使用 valor_bin
运行一个服务器,该服务器可以自动注册在 JSON文件 中定义的插件,或者启用 /_plugins
端点以动态注册插件。例如,LD_LIBRARY_PATH=plugins/ cargo run -- -p plugins.json -w
。本地插件将在系统库路径中搜索,在示例中设置为编译插件的路径。
依赖项
~5.5–9MB
~183K SLoC