mod routes;
use std::collections::HashMap;
use std::sync::{Arc, Mutex};
use std::time::Duration;
use axum::Router;
use crate::export::{Broadcaster, Config};
const RESOLVE_TIMEOUT: Duration = Duration::from_secs(5);
#[derive(Clone)]
pub struct Server {
inner: Arc<Inner>,
}
struct Inner {
origin: moq_net::OriginConsumer,
config: Config,
broadcasters: Mutex<HashMap<String, Arc<Broadcaster>>>,
}
impl Server {
pub fn new(origin: moq_net::OriginConsumer, config: Config) -> Self {
Self {
inner: Arc::new(Inner {
origin,
config,
broadcasters: Mutex::new(HashMap::new()),
}),
}
}
pub fn router(&self) -> Router {
routes::router(self.clone())
}
pub(crate) async fn broadcaster(&self, name: &str) -> Option<Arc<Broadcaster>> {
if let Some(existing) = self.inner.broadcasters.lock().unwrap().get(name).cloned() {
return Some(existing);
}
let broadcast = tokio::time::timeout(RESOLVE_TIMEOUT, self.inner.origin.announced_broadcast(name))
.await
.ok()
.flatten()?;
let mut broadcasters = self.inner.broadcasters.lock().unwrap();
let broadcaster = broadcasters
.entry(name.to_string())
.or_insert_with(|| Broadcaster::new(broadcast, self.inner.config.clone()));
Some(broadcaster.clone())
}
}