MCPcopy Index your code
hub / github.com/Totodore/socketioxide

github.com/Totodore/socketioxide @socketioxide-v0.18.4

Chat with this repo
repository ↗ · DeepWiki ↗ · release socketioxide-v0.18.4 ↗ · + Follow
1,965 symbols 5,651 edges 199 files 350 documented · 18%
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

Socketioxide 🚀🦀

Shows Anuraghazra's GitHub Stats.

A socket.io server implementation in Rust that integrates with the Tower ecosystem and the Tokio stack. It integrates with any server framework based on tower like Axum, Warp, Salvo, Viz or Hyper. Add any other tower based middleware on top of socketioxide such as CORS, authorization, compression, etc with tower-http.

Crates.io Documentation CI

Features

Examples

Chat app 💬 (see full example here)

io.ns("/", |s: SocketRef| {
    s.on("new message", |s: SocketRef, Data::<String>(msg)| {
        let username = s.extensions.get::<Username>().unwrap().clone();
        let msg = Res::Message {
            username,
            message: msg,
        };
        s.broadcast().emit("new message", msg).ok();
    });

    s.on(
        "add user",
        |s: SocketRef, Data::<String>(username), user_cnt: State<UserCnt>| {
            if s.extensions.get::<Username>().is_some() {
                return;
            }
            let num_users = user_cnt.add_user();
            s.extensions.insert(Username(username.clone()));
            s.emit("login", Res::Login { num_users }).ok();

            let res = Res::UserEvent {
                num_users,
                username: Username(username),
            };
            s.broadcast().emit("user joined", res).ok();
        },
    );

    s.on("typing", |s: SocketRef| {
        let username = s.extensions.get::<Username>().unwrap().clone();
        s.broadcast()
            .emit("typing", Res::Username { username })
            .ok();
    });

    s.on("stop typing", |s: SocketRef| {
        let username = s.extensions.get::<Username>().unwrap().clone();
        s.broadcast()
            .emit("stop typing", Res::Username { username })
            .ok();
    });

    s.on_disconnect(|s: SocketRef, user_cnt: State<UserCnt>| {
        if let Some(username) = s.extensions.get::<Username>() {
            let num_users = user_cnt.remove_user();
            let res = Res::UserEvent {
                num_users,
                username: username.clone(),
            };
            s.broadcast().emit("user left", res).ok();
        }
    });
});

Echo implementation with Axum 🏓

use axum::routing::get;
use serde_json::Value;
use socketioxide::{
    extract::{AckSender, Bin, Data, SocketRef},
    SocketIo,
};
use tracing::info;
use tracing_subscriber::FmtSubscriber;

fn on_connect(socket: SocketRef, Data(data): Data<Value>) {
    info!("Socket.IO connected: {:?} {:?}", socket.ns(), socket.id);
    socket.emit("auth", data).ok();

    socket.on(
        "message",
        |socket: SocketRef, Data::<Value>(data), Bin(bin)| {
            info!("Received event: {:?} {:?}", data, bin);
            socket.bin(bin).emit("message-back", data).ok();
        },
    );

    socket.on(
        "message-with-ack",
        |Data::<Value>(data), ack: AckSender, Bin(bin)| {
            info!("Received event: {:?} {:?}", data, bin);
            ack.bin(bin).send(data).ok();
        },
    );
}

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    tracing::subscriber::set_global_default(FmtSubscriber::default())?;

    let (layer, io) = SocketIo::new_layer();

    io.ns("/", on_connect);
    io.ns("/custom", on_connect);

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

    info!("Starting server");

    let listener = tokio::net::TcpListener::bind("0.0.0.0:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();

    Ok(())
}

Other examples are available in the example folder

Contributions and Feedback / Questions

Any contribution is welcome, feel free to open an issue or a PR. If you want to contribute but don't know where to start, you can check the issues.

If you have any question or feedback, please open a thread on the discussions page.

License 🔐

This project is licensed under the MIT license.

Extension points exported contracts — how you extend this code

RoomParam (Interface)
A trait for types that can be used as a room parameter. [`String`], [`Vec `], [`Vec<&str>`], [`&'static str`](st [10 implementers]
crates/socketioxide-core/src/adapter/mod.rs
Driver (Interface)
The driver trait can be used to support different pub/sub backends. It must share handlers/connection between its clones [5 …
crates/socketioxide-redis/src/drivers/mod.rs
EngineIoHandler (Interface)
The [`EngineIoHandler`] trait can be implemented on any struct to handle socket events A `Data` associated type can be [4 …
crates/engineioxide/src/handler.rs
FromDisconnectParts (Interface)
(no doc) [10 implementers]
crates/socketioxide/src/handler/disconnect.rs
Driver (Interface)
The driver trait can be used to support different LISTEN/NOTIFY backends. It must share handlers/connection between its [3 …
crates/socketioxide-postgres/src/drivers/mod.rs
Driver (Interface)
The driver trait can be used to support different MongoDB backends. It must share handlers/connection between its clones [2 …
crates/socketioxide-mongodb/src/drivers/mod.rs
Parse (Interface)
All socket.io parser should implement this trait. Parsers should be stateless. [4 implementers]
crates/socketioxide-core/src/parser.rs
FromConnectParts (Interface)
(no doc) [11 implementers]
crates/socketioxide/src/handler/connect.rs

Core symbols most depended-on inside this repo

ns
called by 192
crates/socketioxide/src/io.rs
send
called by 183
crates/socketioxide/src/ack.rs
clone
called by 173
crates/socketioxide/src/io.rs
on
called by 126
crates/socketioxide/src/socket.rs
emit
called by 116
crates/socketioxide/src/io.rs
waitForMessage
called by 114
e2e/socketioxide/test-suites/utils.ts
len
called by 92
crates/socketioxide-core/src/lib.rs
new_dummy_sock
called by 75
crates/socketioxide/src/io.rs

Shape

Method 977
Function 718
Class 196
Enum 49
Interface 25

Languages

Rust98%
TypeScript2%

Modules by API surface

crates/socketioxide-core/src/adapter/mod.rs75 symbols
crates/parser-common/src/value/de.rs75 symbols
crates/socketioxide-postgres/src/lib.rs65 symbols
crates/socketioxide-core/src/parser.rs64 symbols
crates/socketioxide/src/io.rs62 symbols
crates/socketioxide-redis/src/lib.rs61 symbols
crates/socketioxide-mongodb/src/lib.rs50 symbols
crates/socketioxide/src/socket.rs48 symbols
crates/parser-msgpack/src/lib.rs47 symbols
crates/parser-msgpack/src/de.rs47 symbols
crates/parser-common/src/value/ser.rs39 symbols
crates/parser-msgpack/src/value/de.rs37 symbols

Datastores touched

(mongodb)Database · 1 repos
socketioDatabase · 1 repos

For agents

$ claude mcp add socketioxide \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact