use super::*;
#[derive(Clone)]
pub struct ActiveStream {
pub metadata: StreamMetadata,
pub publisher_id: u64,
pub media_tx: broadcast::Sender<MediaPacket>,
}
pub struct StreamRegistry {
streams: RwLock<HashMap<String, ActiveStream>>,
}
impl StreamRegistry {
#[must_use]
pub fn new() -> Self {
Self {
streams: RwLock::new(HashMap::new()),
}
}
pub async fn register_stream(
&self,
key: String,
metadata: StreamMetadata,
publisher_id: u64,
) -> NetResult<broadcast::Sender<MediaPacket>> {
let mut streams = self.streams.write().await;
if streams.contains_key(&key) {
return Err(NetError::invalid_state(format!(
"Stream already exists: {key}"
)));
}
let (tx, _rx) = broadcast::channel(1000);
let active_stream = ActiveStream {
metadata,
publisher_id,
media_tx: tx.clone(),
};
streams.insert(key, active_stream);
Ok(tx)
}
pub async fn unregister_stream(&self, key: &str) {
let mut streams = self.streams.write().await;
streams.remove(key);
}
pub async fn get_stream(&self, key: &str) -> Option<ActiveStream> {
let streams = self.streams.read().await;
streams.get(key).cloned()
}
pub async fn stream_count(&self) -> usize {
let streams = self.streams.read().await;
streams.len()
}
}
impl Default for StreamRegistry {
fn default() -> Self {
Self::new()
}
}