Skip to main content

Crate auto_socket

Crate auto_socket 

Source
Expand description

§auto_socket

auto_socket automatically registers Socketioxide events and resolves handler objects with auto-di.

§Installation

[dependencies]
auto-di = "0.6"
auto_socket = "0.1"
axum = "0.8"
socketioxide = "0.18"
tokio = { version = "1", features = ["full"] }

§DI-managed socket handler

use auto_di::singleton;
use auto_socket::auto_socket;
use socketioxide::extract::{Data, SocketRef};

struct ChatSocket;

#[singleton]
#[auto_socket("/chat")]
impl ChatSocket {
    fn new() -> Self {
        Self
    }

    #[on("message")]
    async fn message(&self, socket: SocketRef, Data(message): Data<String>) {
        let _ = socket.emit("message", &message);
    }
}

§Standalone event

The namespace is optional and defaults to /:

use auto_socket::on;
use socketioxide::extract::SocketRef;

#[on("ping")]
async fn ping(socket: SocketRef) {
    let _ = socket.emit("pong", &"ok");
}

#[on("message", namespace = "/chat")]
async fn chat_message(_socket: SocketRef) {}

§Module event group

use auto_socket::auto_socket;

#[auto_socket("/room")]
mod room_events {
    use socketioxide::extract::{Data, SocketRef};

    #[on("join")]
    async fn join(_socket: SocketRef, Data(_room): Data<String>) {}
}

Only inline modules are supported.

§Start with Axum

Call register_global after creating SocketIo and before serving the application:

use axum::Router;
use socketioxide::SocketIo;
use tokio::net::TcpListener;

#[tokio::main]
async fn main() {
    let (layer, io) = SocketIo::new_layer();
    auto_socket::register_global(&io)
        .await
        .expect("failed to register socket handlers");

    let app = Router::new().layer(layer);
    let listener = TcpListener::bind("127.0.0.1:3000").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

Registrations sharing a namespace are grouped so Socketioxide installs each namespace once. Handler objects are singleton values resolved by auto-di.

§License

MIT

Functions§

register
Resolves socket handler objects and registers each namespace exactly once.
register_global
Registers all socket handlers using auto-di’s global container.

Attribute Macros§

auto_socket
Declares an auto-di managed socket event handler group for one namespace.
on
Registers a standalone Socketioxide event handler.