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

已删除 valor-lib

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

0.3.4 2020年11月25日

#45 in #plugin-system


用于 valor-native

GPL-3.0-or-later

18KB
166

Valibre开放运行时

一个基于插件的系统,允许运行处理HTTP API请求的JavaScript、WebAssembly或本地模块。插件应遵循WebWorker API,以便相同的文件可以在服务器环境以及网页浏览器中(拦截来自服务工作者)不变地运行。

插件系统

由于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提供支持)。

由于它在工作者中运行,您将监听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