#plugin-system #worker #api #run-time #browser #http-api #native

no-std valor_core

作为 HTTP API 运行的服务器和浏览器中的插件运行时

6 个版本

0.5.2-beta.02021 年 4 月 18 日
0.5.1-beta.02021 年 4 月 17 日
0.4.7-beta.02021 年 1 月 29 日

#23 in #plugin-system

每月 40 次下载
用于 valor_bin

GPL-3.0-or-later

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,如 fetchIndexDBWebSocket,可满足大多数常见需求,对于更复杂的服务,你可以考虑使用类似 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