Trait trillium_channels::ChannelHandler
source · [−]pub trait ChannelHandler: Sized + Send + Sync + 'static {
fn join_channel<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait;
fn connect<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
{ ... }
fn leave_channel<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
{ ... }
fn incoming_message<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
{ ... }
fn disconnect<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>
where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
{ ... }
}
Expand description
Trait for you to implement in order to define a Channel
.
Example
This simple example represents a simple chat server that’s compatible with the phoenix chat example – see channels/examples/channels.rs in this repo for a runnable example.
The only behavior we need to implement:
- allow users to join the lobby channel
- broadcast to all users when a new user has joined the lobby
- broadcast all messages sent to the lobby channel to all users subscribed to the lobby channel.
use trillium_channels::{channel, ChannelConn, ChannelEvent, ChannelHandler};
struct ChatChannel;
#[trillium::async_trait]
impl ChannelHandler for ChatChannel {
async fn join_channel(&self, conn: ChannelConn<'_>, event: ChannelEvent) {
match event.topic() {
"rooms:lobby" => {
conn.allow_join(&event, &()).await;
conn.broadcast(("rooms:lobby", "user:entered"));
}
_ => {}
}
}
async fn incoming_message(&self, conn: ChannelConn<'_>, event: ChannelEvent) {
match (event.topic(), event.event()) {
("rooms:lobby", "new:msg") => conn.broadcast(event),
_ => {}
}
}
}
// fn main() {
// trillium_smol::run(channel(ChatChannel));
// }
Required Methods
sourcefn join_channel<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn join_channel<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
join_channel
is called when a websocket client sends a
phx_join
event. There is no default implementation to ensure
that you implement the appropriate access control logic for your
application. If you want clients to be able to connect to any
channel they request, use this definition:
async fn join_channel(&self, conn: ChannelConn<'_>, event: ChannelEvent) {
conn.allow_join(&event, &()).await;
}
Provided Methods
sourcefn connect<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn connect<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
connect
is called once when each websocket client is connected. The default implementation does nothing.
sourcefn leave_channel<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn leave_channel<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
leave_channel
is called when a websocket client sends a
phx_leave
event. The default implementation is to allow the user
to leave that channel.
sourcefn incoming_message<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn incoming_message<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>,
event: ChannelEvent
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
incoming_message
is called once for each ChannelEvent
sent
from a client. The default implementation does nothing.
sourcefn disconnect<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
fn disconnect<'life0, 'life1, 'async_trait>(
&'life0 self,
conn: ChannelConn<'life1>
) -> Pin<Box<dyn Future<Output = ()> + Send + 'async_trait>>where
'life0: 'async_trait,
'life1: 'async_trait,
Self: 'async_trait,
disconnect
is called when the websocket client ceases to be
connected, either gracefully or abruptly.