use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct Peer {
pub id: String,
#[serde(default)]
pub meta: Option<serde_json::Value>,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
#[serde(tag = "type")]
#[serde(rename_all = "camelCase")]
pub enum OutgoingMessage {
#[serde(rename_all = "camelCase")]
Welcome { peer_id: String },
PeerStatusChanged(PeerStatus),
#[serde(rename_all = "camelCase")]
StartSession { peer_id: String, session_id: String },
#[serde(rename_all = "camelCase")]
SessionStarted { peer_id: String, session_id: String },
EndSession(EndSessionMessage),
Peer(PeerMessage),
#[serde(rename_all = "camelCase")]
List { producers: Vec<Peer> },
#[serde(rename_all = "camelCase")]
Error { details: String },
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
#[serde(rename_all = "camelCase")]
pub enum PeerRole {
Producer,
Listener,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Default, Clone)]
#[serde(rename_all = "camelCase")]
pub struct PeerStatus {
pub roles: Vec<PeerRole>,
pub meta: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(default)]
pub peer_id: Option<String>,
}
impl PeerStatus {
pub fn producing(&self) -> bool {
self.roles.iter().any(|t| matches!(t, PeerRole::Producer))
}
pub fn listening(&self) -> bool {
self.roles.iter().any(|t| matches!(t, PeerRole::Listener))
}
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "camelCase")]
pub struct StartSessionMessage {
pub peer_id: String,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
#[serde(tag = "type")]
#[serde(rename_all = "camelCase")]
pub enum SdpMessage {
#[serde(rename_all = "camelCase")]
Offer {
sdp: String,
},
#[serde(rename_all = "camelCase")]
Answer {
sdp: String,
},
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq, Clone)]
#[serde(rename_all = "camelCase")]
pub enum PeerMessageInner {
#[serde(rename_all = "camelCase")]
Ice {
candidate: String,
sdp_m_line_index: u32,
},
Sdp(SdpMessage),
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct PeerMessage {
pub session_id: String,
#[serde(flatten)]
pub peer_message: PeerMessageInner,
}
#[derive(Serialize, Deserialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct EndSessionMessage {
pub session_id: String,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(tag = "type")]
#[serde(rename_all = "camelCase")]
pub enum IncomingMessage {
NewPeer,
SetPeerStatus(PeerStatus),
StartSession(StartSessionMessage),
EndSession(EndSessionMessage),
Peer(PeerMessage),
List,
}