servo_media_streams/
registry.rs

1use super::MediaStream;
2use std::collections::HashMap;
3use std::sync::{Arc, LazyLock, Mutex};
4use uuid::Uuid;
5
6type RegisteredMediaStream = Arc<Mutex<dyn MediaStream>>;
7
8static MEDIA_STREAMS_REGISTRY: LazyLock<Mutex<HashMap<MediaStreamId, RegisteredMediaStream>>> = LazyLock::new(|| {
9    Mutex::new(HashMap::new())
10});
11
12#[derive(Clone, Copy, Hash, Eq, PartialEq)]
13pub struct MediaStreamId(Uuid);
14impl MediaStreamId {
15    pub fn new() -> MediaStreamId {
16        Self { 0: Uuid::new_v4() }
17    }
18
19    pub fn id(self) -> Uuid {
20        self.0
21    }
22}
23
24pub fn register_stream(stream: Arc<Mutex<dyn MediaStream>>) -> MediaStreamId {
25    let id = MediaStreamId::new();
26    stream.lock().unwrap().set_id(id.clone());
27    MEDIA_STREAMS_REGISTRY
28        .lock()
29        .unwrap()
30        .insert(id.clone(), stream);
31    id
32}
33
34pub fn unregister_stream(stream: &MediaStreamId) {
35    MEDIA_STREAMS_REGISTRY.lock().unwrap().remove(stream);
36}
37
38pub fn get_stream(stream: &MediaStreamId) -> Option<Arc<Mutex<dyn MediaStream>>> {
39    MEDIA_STREAMS_REGISTRY.lock().unwrap().get(stream).cloned()
40}