tagged-channels

Crates.iotagged-channels
lib.rstagged-channels
version0.1.0
created_at2023-02-20 15:19:09.183487+00
updated_at2025-05-20 10:06:53.192972+00
descriptionTag channels and message using tags (WebSockets, SSE users management)
homepage
repositoryhttps://github.com/imbolc/tagged-channels
max_upload_size
id789861
size49,147
Imbolc (imbolc)

documentation

README

License Crates.io Docs.rs

tagged-channels

This library makes it easy to tag (WebSocket, SSE, ...) channels with e.g. user-id and then send events to all the channels opened by a particular user. It's framework agnostic, but for now has only an axum example. If you're using it with another framework, consider PR-ing an adapted example.

Usage

# use serde::{Deserialize, Serialize};
# use tagged_channels::TaggedChannels;
# tokio_test::block_on(async {
// We're going to tag channels
#[derive(Clone, Eq, Hash, PartialEq)]
enum Tag {
    UserId(i32),
    IsAdmin,
}

// Events we're going to send
#[derive(Deserialize, Serialize)]
#[serde(tag = "_type")]
enum Message {
    Ping,
}

// Create the manager
let mut manager = TaggedChannels::<Message, Tag>::new();

// Message to user#1
manager.send_by_tag(&Tag::UserId(1), Message::Ping).await;

// Message to all admins
manager.send_by_tag(&Tag::IsAdmin, Message::Ping).await;

// Message to everyone
manager.broadcast(Message::Ping).await;

// Connect and tag the channel as belonging to the user#1 who is an admin
let mut channel = manager.create_channel([Tag::UserId(1), Tag::IsAdmin]);

// Receive events coming from the channel
while let Some(event) = channel.recv().await {
    // send the event through WebSocket or SSE
}
# })

Look at the full axum example for detail.

Contributing

Please run.pre-commit.sh before sending a PR, it will check everything.

License

This project is licensed under the MIT license.

Commit count: 17

cargo fmt