Crate tagged_channels

Crate tagged_channels 

Source
Expand description

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

// 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.

Structs§

ChannelGuard
A guard to clean up channel resources when the receiver is dropped
ChannelsInner
Inner part of the manager
GuardedReceiver
A wrapper around Receiver to clean up resources on Drop
TaggedChannels
Channels manager