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}