19个版本 (破坏性)
0.15.0 | 2023年12月20日 |
---|---|
0.14.0 | 2022年4月24日 |
0.13.0 | 2022年1月31日 |
0.12.0 | 2021年9月6日 |
0.2.0 | 2017年9月17日 |
#79 in HTTP服务器
每月765次下载
67KB
987 行
bui-backend
bui-backend - 使用Tokio的浏览器用户界面(BUIs)
此库允许应用程序提供浏览器用户界面(BUI)。浏览器成为您的GUI。API基于futures并主动将状态推送到浏览器。资产可以从文件系统提供或捆绑在可执行文件中。服务器提供“逃生口”,允许服务器-客户端在bui-backend之外进行通信。演示包括使用seed框架的Rust Web Assembly(wasm)前端和一个纯JavaScript前端。共同使用这些,您可以以单个文件的形式发布用Rust编写的应用程序,具有基于浏览器的UI。
其工作原理是服务器运行一个HTTP服务器(基于hyper),浏览器连接到该服务器。初始页面告诉浏览器打开到服务器发送事件端点的连接,服务器随后可以将更新推送到浏览器。此外,服务器在另一个端点上监听POST回调。所有数据都编码为JSON。
功能
- 使用
async-change-tracker
类型来确保服务器状态更改主动发送到所有连接的前端。 - 为了保持简单,服务器状态与所有连接的客户端共享。
- 会话密钥(每个浏览器)和连接密钥(每个标签页)得到维护,并允许使用预先建立的流式事件来控制通信。(这是根据某些用例的需要,从bui-backend抽象中“逃脱”的一种方法。)
- 使用异步Rust编写,使用async/await。
- 使用Serde JSON。
- 编译时选择将服务文件打包到可执行文件中(使用
bundle_files
功能)或从磁盘读取文件(使用serve_files
)。
示例
有一个示例,其中前端使用 Rust 网页汇编和 seed 框架以及纯 JavaScript 编写。(使用 bui-demo
与 frontend_seed
,或 frontend_js
功能。)
潜在改进
- 添加包含用户登录的示例。
- 在状态改变时发送最小差异,可能通过改进
async-change-tracker
实现。 - 实现更复杂的状态共享,允许部分视图和最小更新。
- 使用
ReadableStream
而不是Server Sent Events
。 - 添加作为服务器端事件替代的 WebSocket 传输选项。
- 您的想法在这里。
安全警告
由于其本质,程序监听并响应来自网络的客户端连接。如果您将程序暴露在不信任的网络连接中,请确保您编写的任何回调处理程序中的代码在处理恶意输入时是安全的。
本存储库中的其他 crates
codegen
- 为 bui-backend 提供编译时代码生成支持。bui-demo
- 具有 Rust 和 JavaScript 前端示例程序。
许可证
以下任一许可证下发行
- Apache License,版本 2.0,(./LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(./LICENSE-MIT 或 http://opensource.org/licenses/MIT),根据您的选择。
贡献
除非您明确声明,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,包括但不限于本作品,都应按上述方式双重许可,而不附加任何其他条款或条件。
行为准则
与 bui-backend 互动的任何人,包括但不限于本 GitHub 存储库,都应遵循我们的 行为准则。
运营概述
HTTP responses
& event stream
+--server----------+ +--------------> +--web-browser-------------------------+
|app binary written| | frontend, optionally in written |
|with bui_backend | <--------------+ | in rust with support from bui_backend|
+------------------+ HTTP requests +--------------------------------------+
示例
有关完整示例,请参阅 示例。
用法
此示例假定您在应用程序二进制文件所在的 crate 中具有以下文件系统布局,该二进制文件将运行 web 服务器
.
├── build.rs # Bundles frontend files or specifies serving from disk.
├── Cargo.toml # Normal Cargo.toml manifest file.
├── frontend_js # Your frontend files are in this directory. bui_backend
│ ├── index.html # also includes some assistance for writing frontends
│ └── js # in rust, such as automatic serialization.
│ └── main.js
└── src # The source for your application binary is here.
└── main.rs
在此示例中,我们假设您在 frontend_js
目录中具有要服务的文件(例如 index.html
)。您必须创建一个 build.rs
文件,该文件将
- 如果您使用默认编译功能或指定了
bundle_files
cargo 功能(推荐用于部署),则将此目录中的文件编译到您的应用程序的二进制文件中; - 如果您使用
serve_files
cargo 功能(推荐用于前端开发),则尝试在运行时访问此目录中的文件; - 或者如果您没有指定
bundle_files
和serve_files
中的任何一个,则抛出编译时错误。
在您的后端应用程序的 Cargo.toml
文件中添加以下行
[dependencies]
bui-backend = "0.7"
bui-backend-types = "0.7"
[build-dependencies]
bui-backend-codegen = "0.1.4"
现在,这是示例 build.rs
文件
extern crate bui_backend_codegen;
fn main() {
bui_backend_codegen::codegen("frontend_js", "public.rs").expect("codegen failed");
}
最后,在您的 main.rs
文件中
// Include the files to be served and define `fn get_default_config()`.
include!(concat!(env!("OUT_DIR"), "/public.rs")); // Despite slash, this works on Windows.
构建文档
RUSTDOCFLAGS='--cfg=docsrs -Dwarnings' cargo +nightly doc --open --features "bui-backend-types/uuid-v4"
测试
cargo +nightly test --features "bui-backend-types/uuid-v4"
重新生成 README.md
cargo readme > README.md
许可证:MIT/Apache-2.0
依赖项
~9–20MB
~312K SLoC