use std::collections::BTreeMap;
use serde::Serialize;
use crate::emulator::Button;
use crate::stats::StatsReport;
#[derive(Serialize, Clone)]
pub struct LatencyEntry {
pub label: String,
pub ms: u32,
}
#[derive(Serialize)]
pub struct Status {
pub buttons: Vec<Button>,
pub latency: BTreeMap<String, Vec<LatencyEntry>>,
pub stats: StatsReport,
#[serde(skip_serializing_if = "Option::is_none")]
pub location: Option<String>,
}
pub struct StatusPublisher {
producer: moq_json::Producer<Status>,
}
impl StatusPublisher {
pub fn new(broadcast: &mut moq_net::BroadcastProducer) -> anyhow::Result<Self> {
let track = moq_net::Track {
name: "status".to_string(),
priority: 10,
};
let producer = broadcast.create_track(track)?;
Ok(Self {
producer: moq_json::Producer::new(producer, moq_json::Config::default()),
})
}
pub fn publish(&mut self, status: &Status) {
if let Err(err) = self.producer.update(status) {
tracing::warn!(%err, "failed to publish status");
}
}
}