24 个版本 (13 个破坏性更新)

0.14.1 2024 年 8 月 14 日
0.14.0 2024 年 6 月 26 日
0.13.1 2024 年 5 月 8 日
0.12.0 2024 年 3 月 20 日
0.3.0 2023 年 6 月 17 日

#100 in WebSocket

Download history 2474/week @ 2024-05-03 2061/week @ 2024-05-10 2277/week @ 2024-05-17 2519/week @ 2024-05-24 2944/week @ 2024-05-31 3037/week @ 2024-06-07 2681/week @ 2024-06-14 2211/week @ 2024-06-21 1927/week @ 2024-06-28 2176/week @ 2024-07-05 2677/week @ 2024-07-12 2620/week @ 2024-07-19 3108/week @ 2024-07-26 2970/week @ 2024-08-02 2869/week @ 2024-08-09 2771/week @ 2024-08-16

12,229 每月下载量
5 个 Crates 中使用 (通过 socketioxide)

MIT 许可证

165KB
3.5K SLoC

Engineioxide 为 socketioxide 承担了繁重的工作,它是一个 Rust 的 socket.io 服务器实现,可与 tower 堆栈集成。

您仍然可以将 engineioxide 作为独立的 crate 与 engine.io 客户端通信。

支持的协议

您可以通过功能标志启用对其他 engine.io 协议实现的支持。默认情况下启用最新协议版本(v4)。

要添加对 v3 协议版本的支持,请相应地调整您的依赖配置

[dependencies]
# Enables the `v3` protocol (`v4` is always enabled, as it's the default).
engineioxide = { version = "0.3.0", features = ["v3"] }

功能标志

  • v3: 启用 engine.io v3 协议
  • tracing: 使用 tracing crate 启用跟踪日志

使用 axum 的基本示例

use bytes::Bytes;
use engineioxide::layer::EngineIoLayer;
use engineioxide::handler::EngineIoHandler;
use engineioxide::{Socket, DisconnectReason, Str};
use std::sync::atomic::{AtomicUsize, Ordering};
use std::sync::{Arc, Mutex};
use axum::routing::get;
// Global state, with axum it must be clonable
#[derive(Debug, Default, Clone)]
struct MyHandler {
    user_cnt: Arc<AtomicUsize>,
}

// Socket state
#[derive(Debug, Default)]
struct SocketState {
    id: Mutex<String>,
}

impl EngineIoHandler for MyHandler {
    type Data = SocketState;

    fn on_connect(self: Arc<Self>, socket: Arc<Socket<SocketState>>) {
        let cnt = self.user_cnt.fetch_add(1, Ordering::Relaxed) + 1;
        socket.emit(cnt.to_string()).ok();
    }
    fn on_disconnect(&self,
        socket: Arc<Socket<SocketState>>,
        reason: DisconnectReason
    ) {
        let cnt = self.user_cnt.fetch_sub(1, Ordering::Relaxed) - 1;
        socket.emit(cnt.to_string()).ok();
    }
    fn on_message(&self, msg: Str, socket: Arc<Socket<SocketState>>) {
        *socket.data.id.lock().unwrap() = msg.into(); // bind a provided user id to a socket
    }
    fn on_binary(&self, data: Bytes, socket: Arc<Socket<SocketState>>) { }
}

// Create a new engineio layer
let layer = EngineIoLayer::new(Arc::new(MyHandler::default()));

let app = axum::Router::<()>::new()
    .route("/", get(|| async { "Hello, World!" }))
    .layer(layer);

// Spawn the axum server

依赖项

~6–16MB
~200K SLoC