use ggrs::{Message, PlayerType};
use matchbox_protocol::PeerId;
use crate::{Packet, WebRtcChannel, WebRtcSocket};
impl WebRtcSocket {
pub fn players(&mut self) -> Vec<PlayerType<PeerId>> {
let Some(our_id) = self.id() else {
return vec![PlayerType::Local];
};
let mut ids: Vec<_> = self
.connected_peers()
.chain(std::iter::once(our_id))
.collect();
ids.sort();
ids.into_iter()
.map(|id| {
if id == our_id {
PlayerType::Local
} else {
PlayerType::Remote(id)
}
})
.collect()
}
}
fn build_packet(msg: &Message) -> Packet {
bincode::serde::encode_to_vec(msg, bincode::config::standard())
.expect("failed to serialize ggrs packet")
.into_boxed_slice()
}
fn deserialize_packet(message: (PeerId, Packet)) -> (PeerId, Message) {
(
message.0,
bincode::serde::decode_from_slice(&message.1, bincode::config::standard())
.expect("failed to deserialize ggrs packet")
.0,
)
}
impl ggrs::NonBlockingSocket<PeerId> for WebRtcChannel {
fn send_to(&mut self, msg: &Message, addr: &PeerId) {
if self.config().max_retransmits != Some(0) || self.config().ordered {
log::warn!(
"Sending GGRS traffic over reliable or ordered channel ({:?}), which may reduce performance.\
You should use an unreliable and unordered channel instead.",
self.config()
);
}
self.send(build_packet(msg), *addr);
}
fn receive_all_messages(&mut self) -> Vec<(PeerId, Message)> {
self.receive().into_iter().map(deserialize_packet).collect()
}
}