use common::{ClientMessage, PeerId, SessionResponse};
use tokio::sync::mpsc;
#[derive(Debug, Clone)]
pub(crate) enum PeerMessage {
GetClientState {
requested_by: PeerId,
sender: mpsc::Sender<SessionResponse>,
},
PeerJoined(PeerId),
PeerLeft(PeerId),
Relay(ClientMessage),
#[allow(dead_code)]
RelayMany(Vec<ClientMessage>),
}
impl PeerMessage {
#[inline]
pub fn get_client_state(
requested_by: PeerId,
sender: mpsc::Sender<SessionResponse>,
) -> Self {
Self::GetClientState { requested_by, sender }
}
#[inline]
pub fn peer_left(peer_by: PeerId) -> Self {
Self::PeerLeft(peer_by)
}
#[inline]
pub fn peer_joined(peer_by: PeerId) -> Self {
Self::PeerJoined(peer_by)
}
#[inline]
pub fn relay(client_msg: ClientMessage) -> Self {
Self::Relay(client_msg)
}
#[inline]
#[allow(dead_code)]
pub fn relay_many(client_msgs: Vec<ClientMessage>) -> Self {
assert!(!client_msgs.is_empty());
debug_assert!({
let sent_by = client_msgs[0].sent_by();
client_msgs.iter().all(|msg| msg.sent_by() == sent_by)
});
Self::RelayMany(client_msgs)
}
#[inline]
pub fn sent_by(&self) -> PeerId {
match self {
Self::GetClientState { requested_by, .. } => *requested_by,
Self::PeerJoined(peer_by) => *peer_by,
Self::PeerLeft(peer_by) => *peer_by,
Self::Relay(client_msg) => client_msg.sent_by(),
Self::RelayMany(client_msgs) => client_msgs[0].sent_by(),
}
}
}