6 个版本

0.3.2 2024年5月30日
0.3.1 2024年1月2日
0.3.0 2023年4月26日
0.2.0 2022年1月3日
0.1.1 2021年12月9日

#1463HTTP 服务器

Download history 1/week @ 2024-04-19 70/week @ 2024-05-24 65/week @ 2024-05-31 7/week @ 2024-06-07 3/week @ 2024-06-14

每月下载量 313

MIT/Apache

245KB
2K SLoC

欢迎来到 Trillium!

📖 指南 📖

指南提供了架构概述和 Trillium Crates 的连接情况。

📑 Rust 文档 📑

Rust 文档是了解 Trillium 的各个 Crates 和特定接口的最佳方式。




法律

许可协议为以下之一

任选其一。

除非您明确声明,否则根据 Apache-2.0 许可协议定义,您有意提交的任何贡献,包括在作品中的包含,都将根据上述双重许可,没有额外的条款或条件。


lib.rs:

trillium.rs 的 phoenix 通道实现

通道是一种将事件以软实时方式分发给已连接的 WebSocket 客户端的方法,包括基于主题订阅的扇出。

根据 phoenix 文档

一些可能的用例包括

  • 聊天室和消息应用的 API
  • 突发新闻,如“进球了”或“地震即将来临”
  • 在地图上跟踪火车、卡车或比赛参与者
  • 多人游戏中的事件
  • 监控传感器和控制灯光
  • 通知浏览器页面上的 CSS 或 JavaScript 已更改(这在开发中很有用)
  • 在概念上,通道很简单。

首先,客户端使用 WebSockets 连接到服务器。一旦连接,它们就会加入一个或多个主题。例如,为了与公共聊天室进行交互,客户端可以加入名为 public_chat 的主题,为了接收具有 ID 7 的产品的更新,他们可能需要加入名为 product_updates:7 的主题。

客户端可以向它们加入的主题推送消息,也可以从它们接收消息。反过来,通道服务器从其连接的客户端接收消息,也可以向它们推送消息。

与 phoenix 通道的已知差异

不支持长轮询

Phoenix通道支持长轮询传输以及WebSocket。由于大多数现代浏览器和HTTP客户端都支持WebSocket,因此,当前版本中,trillium通道是专门基于它们构建的。设计应该足够灵活,以便在必要时支持长轮询。

暂不支持多服务器同步

Phoenix通道支持运行多个服务器节点并在它们之间分发所有广播消息。在未来的修订中,这将很容易添加到trillium通道中,但当前的实现不会在服务器之间同步消息。然而,在此期间,您可以使用Channel::broadcaster来返回一个ChannelBroadcaster,该广播器可以用于使用适合您应用程序和部署的任何分发机制在服务器之间发布和订阅消息。在trillium仓库中打开一个讨论,以了解这可能如何适用于您。

事件路由由用户代码处理

Phoenix通道有一个注册不同主题的通道处理器的概念,因此实现可能涉及为rooms:*注册一个RoomChannel。Trillium通道目前不提供这种路由/匹配行为,但最终可能会提供。

简单示例:聊天应用

use trillium_channels::{channel, ChannelConn, ChannelEvent, ChannelHandler};

struct ChatChannel;
#[trillium::async_trait]
impl ChannelHandler for ChatChannel {
async fn join_channel(&self, conn: ChannelConn<'_>, event: ChannelEvent) {
match event.topic() {
"rooms:lobby" => {
conn.allow_join(&event, &()).await;
conn.broadcast(("rooms:lobby", "user:entered"));
}

_ => {}
}
}

async fn incoming_message(&self, conn: ChannelConn<'_>, event: ChannelEvent) {
match (event.topic(), event.event()) {
("rooms:lobby", "new:msg") => conn.broadcast(event),
_ => {}
}
}
}

// fn main() {
//     trillium_smol::run(channel(ChatChannel));
// }

有关使用来自phoenix聊天示例的前端功能的完整功能示例,请参阅channels/examples/channels.rs。

依赖关系

~8–16MB
~255K SLoC