use bevy::{
ecs::schedule::States,
prelude::Resource,
utils::{hashbrown::HashMap, HashSet},
};
use bevy_matchbox::prelude::PeerId;
use instant::Duration;
use std::net::SocketAddr;
#[derive(Debug, Default, Clone, Eq, PartialEq, Hash, States)]
pub enum RtcServerStatus {
#[default]
NotReady,
Ready,
}
#[derive(Resource)]
pub struct RtcServerState {
pub(crate) addr: SocketAddr,
pub(crate) peer_id: Option<PeerId>,
pub(crate) peers: HashSet<PeerId>,
pub(crate) latencies: HashMap<PeerId, Option<Duration>>,
pub(crate) smoothed_latencies: HashMap<PeerId, Option<Duration>>,
}
impl RtcServerState {
pub(crate) fn new(addr: SocketAddr) -> Self {
Self {
addr,
peer_id: None,
peers: HashSet::new(),
latencies: HashMap::new(),
smoothed_latencies: HashMap::new(),
}
}
pub fn addr(&self) -> SocketAddr {
self.addr
}
pub fn peer_id(&self) -> Option<PeerId> {
self.peer_id
}
pub fn peers(&self) -> impl Iterator<Item = PeerId> + '_ {
self.peers.iter().copied()
}
pub fn iter_latencies(&self) -> impl Iterator<Item = (PeerId, Duration)> + '_ {
self.latencies
.iter()
.filter_map(|(p, l)| l.map(|l| (p, l)))
.map(|(p, l)| (*p, l))
}
pub fn iter_smoothed_latencies(&self) -> impl Iterator<Item = (PeerId, Duration)> + '_ {
self.smoothed_latencies
.iter()
.filter_map(|(p, l)| l.map(|l| (p, l)))
.map(|(p, l)| (*p, l))
}
pub fn get_latency_for(&self, peer_id: PeerId) -> Option<Duration> {
*self.latencies.get(&peer_id)?
}
pub fn get_smoothed_latency_for(&self, peer_id: PeerId) -> Option<Duration> {
*self.smoothed_latencies.get(&peer_id)?
}
}