0.3.4 |
|
---|
#45 in #plugin-system
用于 valor-native
18KB
166 行
Valibre开放运行时
一个基于插件的系统,允许运行处理HTTP API请求的JavaScript、WebAssembly或本地模块。插件应遵循WebWorker API,以便相同的文件可以在服务器环境以及网页浏览器中(拦截来自服务工作者)不变地运行。
插件系统
由于Web Worker API功能强大且易于使用,即我们只通过onmessage
回调接收异步消息,并使用postMessage()
函数向主机回答,非常适合作为我们插件的基础。例如,由于工作者的性质是在其自己的线程中执行,我们可以有长时间运行的阻塞任务。它还提供各种高级API,如fetch
、IndexDB
和WebSocket
等,这些API满足大多数常见需求。这就是为什么即使是本地的Rust插件,也建议只使用可以编译为WASM并在工作者上下文中运行的可依赖项。
插件类型
Rust(WASM Worker) | JS(Worker) | Rust(Native) | WASI | |
---|---|---|---|---|
服务器 | ⚠️ | ⚠️ | ✅ | ❓ |
浏览器 | ⚠️ | ⚠️ | ✖️ | ❓ |
处理HTTP请求
Rust插件
要获得最佳性能和支持,建议使用Rust创建插件。只需包含辅助宏和类型,并声明您的处理器。
use valor::*;
#[vlugin]
fn my_handler(req: Request) -> Response {
"OK response from a plugin".into()
}
根据编译目标,它将适应使用浏览器的内置WASM编译器或以本地方式在服务器上运行。
JS插件
⚠️ 这还是一个正在进行中的工作,还没有助手,服务器上也没有支持(将由Deno提供支持)。
由于它在工作者中运行,您将监听message
事件,接收类似以下请求的消息
const request = {
url: 'some/url',
method: 'GET',
headers: [['x-request-id', '123abc']], // list of headers
body: null, // or an ArrayBuffer
}
响应将如下所示
postMessage({
status: 200,
headers: [['x-correlation-id', '123abc']],
body: null, // or an ArrayBuffer
})
依赖项
~5.5MB
~124K SLoC