turn_rs/router/
interfaces.rs

1use super::ports::capacity;
2
3use std::net::SocketAddr;
4use std::sync::{Arc, RwLock};
5
6use ahash::AHashMap;
7
8#[derive(Clone, Copy, Debug)]
9pub struct Interface {
10    pub addr: SocketAddr,
11    pub external: SocketAddr,
12}
13
14pub struct Interfaces {
15    map: RwLock<AHashMap<SocketAddr, Arc<Interface>>>,
16}
17
18impl Default for Interfaces {
19    fn default() -> Self {
20        Self {
21            map: RwLock::new(AHashMap::with_capacity(capacity())),
22        }
23    }
24}
25
26impl Interfaces {
27    /// add interface from addr.
28    ///
29    /// # Examples
30    ///
31    /// ```
32    /// use std::net::SocketAddr;
33    /// use turn_rs::router::interfaces::*;
34    ///
35    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
36    /// let interface = "127.0.0.1:8081".parse::<SocketAddr>().unwrap();
37    /// let interfaces = Interfaces::default();
38    ///
39    /// interfaces.insert(addr, interface, interface);
40    /// let ret = interfaces.get(&addr).unwrap();
41    /// assert_eq!(ret.addr, interface);
42    /// assert_eq!(ret.external, interface);
43    /// ```
44    pub fn insert(&self, addr: SocketAddr, interface: SocketAddr, external: SocketAddr) {
45        self.map.write().unwrap().insert(
46            addr,
47            Arc::new(Interface {
48                addr: interface,
49                external,
50            }),
51        );
52    }
53
54    /// get interface from addr.
55    ///
56    /// # Examples
57    ///
58    /// ```
59    /// use std::net::SocketAddr;
60    /// use turn_rs::router::interfaces::*;
61    ///
62    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
63    /// let interface = "127.0.0.1:8081".parse::<SocketAddr>().unwrap();
64    /// let interfaces = Interfaces::default();
65    ///
66    /// interfaces.insert(addr, interface, interface);
67    /// let ret = interfaces.get(&addr).unwrap();
68    /// assert_eq!(ret.addr, interface);
69    /// assert_eq!(ret.external, interface);
70    /// ```
71    pub fn get(&self, addr: &SocketAddr) -> Option<Interface> {
72        self.map
73            .read()
74            .unwrap()
75            .get(addr)
76            .map(|item| *item.as_ref())
77    }
78
79    /// get interface ref from addr.
80    ///
81    /// # Examples
82    ///
83    /// ```
84    /// use std::net::SocketAddr;
85    /// use std::sync::Arc;
86    /// use turn_rs::router::interfaces::*;
87    ///
88    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
89    /// let interface = "127.0.0.1:8081".parse::<SocketAddr>().unwrap();
90    /// let interfaces = Interfaces::default();
91    ///
92    /// interfaces.insert(addr, interface, interface);
93    /// let ret = interfaces.get_ref(&addr).unwrap();
94    /// assert_eq!(ret.addr, interface);
95    /// assert_eq!(ret.external, interface);
96    /// ```
97    pub fn get_ref(&self, addr: &SocketAddr) -> Option<Arc<Interface>> {
98        self.map.read().unwrap().get(addr).cloned()
99    }
100
101    /// remove interface from addr.
102    ///
103    /// # Examples
104    ///
105    /// ```
106    /// use std::net::SocketAddr;
107    /// use std::sync::Arc;
108    /// use turn_rs::router::interfaces::*;
109    ///
110    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
111    /// let interface = "127.0.0.1:8081".parse::<SocketAddr>().unwrap();
112    /// let interfaces = Interfaces::default();
113    ///
114    /// interfaces.insert(addr, interface, interface);
115    /// let ret = interfaces.get(&addr).unwrap();
116    /// assert_eq!(ret.addr, interface);
117    /// assert_eq!(ret.external, interface);
118    ///
119    /// interfaces.remove(&addr);
120    ///
121    /// let ret = interfaces.get(&addr);
122    /// assert!(ret.is_none());
123    /// ```
124    pub fn remove(&self, addr: &SocketAddr) {
125        self.map.write().unwrap().remove(addr);
126    }
127}