#plugin #http-api #browser #plugin-system #server #run-time #running

已删除 valor-rs

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

0.3.3 2020年11月24日
0.2.0-alpha 2020年10月29日

#44 in #plugin-system

GPL-3.0-or-later

18KB
166 代码行

Valibre开放运行时

一个基于插件的系统,允许运行处理HTTP API请求的JavaScript、WebAssembly或本地模块。插件预计将遵循WebWorker API,以便相同的文件可以在服务器环境中以及在网络浏览器中(拦截来自服务工作者的HTTP调用)运行而不做任何更改。

插件系统

由于Web Worker API功能强大且易于使用,即我们仅通过onmessage回调接收异步消息,并使用postMessage()函数向宿主返回响应,因此非常适合作为我们插件的基础。例如,由于工作者的性质是在其自己的线程中执行,我们可以有长时间运行的阻塞任务。还包含各种高级API,如fetchIndexDBWebSocket等,这些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提供支持)。

因为它在Worker中运行,所以您将监听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
~123K SLoC