turn_rs/router/
mod.rs

1pub mod channels;
2pub mod interfaces;
3pub mod nodes;
4pub mod nonces;
5pub mod ports;
6
7#[rustfmt::skip]
8use crate::Observer;
9use self::{
10    channels::Channels,
11    interfaces::{Interface, Interfaces},
12    nodes::Nodes,
13    nonces::Nonces,
14    ports::Ports,
15};
16
17use std::{net::SocketAddr, sync::Arc, thread, time::Duration};
18
19/// Router State Tree.
20///
21/// this state management example maintains the status of all
22/// nodes in the current service and adds a node grouping model.
23/// it is necessary to specify a group for each node.
24///
25/// The state between groups is isolated. However,
26/// it should be noted that the node key only supports
27/// long-term valid passwords,does not support short-term
28/// valid passwords.
29pub struct Router {
30    realm: String,
31    observer: Arc<dyn Observer>,
32    ports: Ports,
33    nonces: Nonces,
34    nodes: Nodes,
35    channels: Channels,
36    interfaces: Interfaces,
37}
38
39impl Router {
40    /// create a router.
41    ///
42    /// # Examples
43    ///
44    /// ```
45    /// use std::sync::Arc;
46    /// use turn_rs::router::*;
47    /// use turn_rs::*;
48    ///
49    /// struct ObserverTest;
50    /// impl Observer for ObserverTest {}
51    ///
52    /// Router::new("test".to_string(), Arc::new(ObserverTest));
53    /// ```
54    pub fn new(realm: String, observer: Arc<dyn Observer>) -> Arc<Self> {
55        let this = Arc::new(Self {
56            interfaces: Interfaces::default(),
57            channels: Channels::default(),
58            nonces: Nonces::default(),
59            ports: Ports::default(),
60            nodes: Nodes::default(),
61            observer,
62            realm,
63        });
64
65        let this_ = Arc::downgrade(&this);
66        thread::spawn(move || {
67            while let Some(this) = this_.upgrade() {
68                thread::sleep(Duration::from_secs(60));
69                this.nodes.get_deaths().iter().for_each(|a| {
70                    this.remove(a);
71                });
72
73                this.channels.get_deaths().iter().for_each(|c| {
74                    this.channels.remove(*c);
75                });
76            }
77        });
78
79        this
80    }
81
82    /// get router capacity.
83    ///
84    /// # Examples
85    ///
86    /// ```
87    /// use std::sync::Arc;
88    /// use turn_rs::router::*;
89    /// use turn_rs::*;
90    ///
91    /// struct ObserverTest;
92    /// impl Observer for ObserverTest {}
93    ///
94    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
95    /// assert_eq!(router.capacity(), 16383);
96    /// ```
97    pub fn capacity(&self) -> usize {
98        self.ports.capacity()
99    }
100
101    /// get router allocate size.
102    ///
103    /// # Examples
104    ///
105    /// ```
106    /// use std::sync::Arc;
107    /// use turn_rs::router::*;
108    /// use turn_rs::*;
109    ///
110    /// struct ObserverTest;
111    /// impl Observer for ObserverTest {}
112    ///
113    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
114    /// assert_eq!(router.len(), 0);
115    /// ```
116    pub fn len(&self) -> usize {
117        self.ports.len()
118    }
119
120    /// get router allocate size is empty.
121    ///
122    /// # Examples
123    ///
124    /// ```
125    /// use std::sync::Arc;
126    /// use turn_rs::router::*;
127    /// use turn_rs::*;
128    ///
129    /// struct ObserverTest;
130    /// impl Observer for ObserverTest {}
131    ///
132    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
133    /// assert_eq!(router.is_empty(), true);
134    /// ```
135    pub fn is_empty(&self) -> bool {
136        self.ports.len() == 0
137    }
138
139    /// get addr interface.
140    ///
141    /// # Examples
142    ///
143    /// ```
144    /// use std::net::SocketAddr;
145    /// use std::sync::Arc;
146    /// use turn_rs::router::*;
147    /// use turn_rs::*;
148    ///
149    /// struct ObserverTest;
150    ///
151    /// impl Observer for ObserverTest {
152    ///     fn get_password_blocking(
153    ///         &self,
154    ///         _: &SocketAddr,
155    ///         _: &str,
156    ///     ) -> Option<String> {
157    ///         Some("test".to_string())
158    ///     }
159    /// }
160    ///
161    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
162    /// let secret = [
163    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
164    ///     239,
165    /// ];
166    ///
167    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
168    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
169    ///
170    /// assert_eq!(key.as_slice(), &secret);
171    ///
172    /// let interface = router.get_interface(&addr).unwrap();
173    /// assert_eq!(interface.addr, addr);
174    /// ```
175    pub fn get_interface(&self, addr: &SocketAddr) -> Option<Arc<Interface>> {
176        self.interfaces.get_ref(addr)
177    }
178
179    /// get user list.
180    ///
181    /// # Examples
182    ///
183    /// ```
184    /// use std::net::SocketAddr;
185    /// use std::sync::Arc;
186    /// use turn_rs::router::*;
187    /// use turn_rs::*;
188    ///
189    /// struct ObserverTest;
190    ///
191    /// impl Observer for ObserverTest {
192    ///     fn get_password_blocking(
193    ///         &self,
194    ///         _: &SocketAddr,
195    ///         _: &str,
196    ///     ) -> Option<String> {
197    ///         Some("test".to_string())
198    ///     }
199    /// }
200    ///
201    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
202    /// let secret = [
203    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
204    ///     239,
205    /// ];
206    ///
207    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
208    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
209    ///
210    /// assert_eq!(key.as_slice(), &secret);
211    ///
212    /// let users = router.get_users(0, 10);
213    /// assert_eq!(users.as_slice(), &[("test".to_string(), vec![addr])]);
214    /// ```
215    pub fn get_users(&self, skip: usize, limit: usize) -> Vec<(String, Vec<SocketAddr>)> {
216        self.nodes.get_users(skip, limit)
217    }
218
219    /// get node.
220    ///
221    /// # Examples
222    ///
223    /// ```
224    /// use std::net::SocketAddr;
225    /// use std::sync::Arc;
226    /// use turn_rs::router::*;
227    /// use turn_rs::*;
228    ///
229    /// struct ObserverTest;
230    ///
231    /// impl Observer for ObserverTest {
232    ///     fn get_password_blocking(
233    ///         &self,
234    ///         _: &SocketAddr,
235    ///         _: &str,
236    ///     ) -> Option<String> {
237    ///         Some("test".to_string())
238    ///     }
239    /// }
240    ///
241    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
242    /// let secret = [
243    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
244    ///     239,
245    /// ];
246    ///
247    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
248    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
249    ///
250    /// assert_eq!(key.as_slice(), &secret);
251    ///
252    /// let node = router.get_node(&addr).unwrap();
253    /// assert_eq!(node.username.as_str(), "test");
254    /// assert_eq!(node.password.as_str(), "test");
255    /// assert_eq!(node.secret.as_slice(), &secret);
256    /// assert_eq!(node.channels, vec![]);
257    /// assert_eq!(node.ports, vec![]);
258    /// ```
259    pub fn get_node(&self, addr: &SocketAddr) -> Option<nodes::Node> {
260        self.nodes.get_node(addr)
261    }
262
263    /// get node bound list.
264    ///
265    /// # Examples
266    ///
267    /// ```
268    /// use std::net::SocketAddr;
269    /// use std::sync::Arc;
270    /// use turn_rs::router::*;
271    /// use turn_rs::*;
272    ///
273    /// struct ObserverTest;
274    ///
275    /// impl Observer for ObserverTest {
276    ///     fn get_password_blocking(
277    ///         &self,
278    ///         _: &SocketAddr,
279    ///         _: &str,
280    ///     ) -> Option<String> {
281    ///         Some("test".to_string())
282    ///     }
283    /// }
284    ///
285    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
286    /// let secret = [
287    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
288    ///     239,
289    /// ];
290    ///
291    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
292    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
293    ///
294    /// assert_eq!(key.as_slice(), &secret);
295    ///
296    /// let ret = router.get_node_addrs("test");
297    /// assert_eq!(ret, vec![addr]);
298    /// ```
299    pub fn get_node_addrs(&self, username: &str) -> Vec<SocketAddr> {
300        self.nodes.get_addrs(username)
301    }
302
303    /// get the nonce of the node SocketAddr.
304    ///
305    /// # Examples
306    ///
307    /// ```
308    /// use std::net::SocketAddr;
309    /// use std::sync::Arc;
310    /// use turn_rs::router::*;
311    /// use turn_rs::*;
312    ///
313    /// struct ObserverTest;
314    ///
315    /// impl Observer for ObserverTest {
316    ///     fn get_password_blocking(
317    ///         &self,
318    ///         _: &SocketAddr,
319    ///         _: &str,
320    ///     ) -> Option<String> {
321    ///         Some("test".to_string())
322    ///     }
323    /// }
324    ///
325    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
326    /// let secret = [
327    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
328    ///     239,
329    /// ];
330    ///
331    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
332    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
333    ///
334    /// assert_eq!(key.as_slice(), &secret);
335    ///
336    /// let nonce = router.get_nonce(&addr);
337    /// assert_eq!(nonce.len(), 16);
338    /// ```
339    pub fn get_nonce(&self, addr: &SocketAddr) -> Arc<String> {
340        self.nonces.get(addr)
341    }
342
343    /// get the password of the node SocketAddr.
344    ///
345    /// require remote control service to distribute keys.
346    ///
347    /// # Examples
348    ///
349    /// ```
350    /// use std::net::SocketAddr;
351    /// use std::sync::Arc;
352    /// use turn_rs::router::*;
353    /// use turn_rs::*;
354    ///
355    /// struct ObserverTest;
356    ///
357    /// impl Observer for ObserverTest {
358    ///     fn get_password_blocking(
359    ///         &self,
360    ///         _: &SocketAddr,
361    ///         _: &str,
362    ///     ) -> Option<String> {
363    ///         Some("test".to_string())
364    ///     }
365    /// }
366    ///
367    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
368    /// let secret = [
369    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
370    ///     239,
371    /// ];
372    ///
373    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
374    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
375    ///
376    /// assert_eq!(key.as_slice(), &secret);
377    /// ```
378    pub fn get_key_block(
379        &self,
380        addr: &SocketAddr,
381        interface: &SocketAddr,
382        external: &SocketAddr,
383        username: &str,
384    ) -> Option<Arc<[u8; 16]>> {
385        let key = self.nodes.get_secret(addr);
386        if key.is_some() {
387            return key;
388        }
389
390        let pwd = self.observer.get_password_blocking(addr, username)?;
391        let key = self.nodes.insert(addr, &self.realm, username, &pwd)?;
392        self.interfaces.insert(*addr, *interface, *external);
393        Some(key)
394    }
395
396    /// get the password of the node SocketAddr.
397    ///
398    /// require remote control service to distribute keys.
399    pub async fn get_key(
400        &self,
401        addr: &SocketAddr,
402        interface: &SocketAddr,
403        external: &SocketAddr,
404        username: &str,
405    ) -> Option<Arc<[u8; 16]>> {
406        let key = self.nodes.get_secret(addr);
407        if key.is_some() {
408            return key;
409        }
410
411        let pwd = self.observer.get_password(addr, username).await?;
412        let key = self.nodes.insert(addr, &self.realm, username, &pwd)?;
413        self.interfaces.insert(*addr, *interface, *external);
414        Some(key)
415    }
416
417    /// obtain the peer address bound to the current
418    /// node according to the channel number.
419    ///
420    /// # Examples
421    ///
422    /// ```
423    /// use std::net::SocketAddr;
424    /// use std::sync::Arc;
425    /// use turn_rs::router::*;
426    /// use turn_rs::*;
427    ///
428    /// struct ObserverTest;
429    ///
430    /// impl Observer for ObserverTest {
431    ///     fn get_password_blocking(
432    ///         &self,
433    ///         _: &SocketAddr,
434    ///         _: &str,
435    ///     ) -> Option<String> {
436    ///         Some("test".to_string())
437    ///     }
438    /// }
439    ///
440    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
441    /// let secret = [
442    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
443    ///     239,
444    /// ];
445    ///
446    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
447    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
448    ///
449    /// assert_eq!(key.as_slice(), &secret);
450    ///
451    /// let port = router.alloc_port(&addr).unwrap();
452    /// assert!(router.bind_port(&addr, port).is_some());
453    /// assert_eq!(router.get_port_bound(port), Some(addr));
454    /// ```
455    pub fn get_channel_bound(&self, addr: &SocketAddr, channel: u16) -> Option<SocketAddr> {
456        self.channels.get_bound(addr, channel)
457    }
458
459    /// obtain the peer address bound to the current
460    /// node according to the port number.
461    ///
462    /// # Examples
463    ///
464    /// ```
465    /// use std::net::SocketAddr;
466    /// use std::sync::Arc;
467    /// use turn_rs::router::*;
468    /// use turn_rs::*;
469    ///
470    /// struct ObserverTest;
471    ///
472    /// impl Observer for ObserverTest {
473    ///     fn get_password_blocking(
474    ///         &self,
475    ///         _: &SocketAddr,
476    ///         _: &str,
477    ///     ) -> Option<String> {
478    ///         Some("test".to_string())
479    ///     }
480    /// }
481    ///
482    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
483    /// let secret = [
484    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
485    ///     239,
486    /// ];
487    ///
488    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
489    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
490    ///
491    /// assert_eq!(key.as_slice(), &secret);
492    ///
493    /// let port = router.alloc_port(&addr).unwrap();
494    /// assert!(router.bind_port(&addr, port).is_some());
495    /// assert_eq!(router.get_port_bound(port), Some(addr));
496    /// ```
497    pub fn get_port_bound(&self, port: u16) -> Option<SocketAddr> {
498        self.ports.get(port)
499    }
500
501    /// get node the port.
502    ///
503    /// # Examples
504    ///
505    /// ```
506    /// use std::net::SocketAddr;
507    /// use std::sync::Arc;
508    /// use turn_rs::router::*;
509    /// use turn_rs::*;
510    ///
511    /// struct ObserverTest;
512    ///
513    /// impl Observer for ObserverTest {
514    ///     fn get_password_blocking(
515    ///         &self,
516    ///         _: &SocketAddr,
517    ///         _: &str,
518    ///     ) -> Option<String> {
519    ///         Some("test".to_string())
520    ///     }
521    /// }
522    ///
523    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
524    /// let peer = "127.0.0.1:8081".parse::<SocketAddr>().unwrap();
525    /// let secret = [
526    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
527    ///     239,
528    /// ];
529    ///
530    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
531    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
532    ///
533    /// assert_eq!(key.as_slice(), &secret);
534    ///
535    /// let port = router.alloc_port(&addr).unwrap();
536    /// assert!(router.bind_port(&addr, port).is_some());
537    /// assert!(router.bind_port(&peer, port).is_some());
538    /// assert_eq!(router.get_bound_port(&addr, &peer), Some(port));
539    /// ```
540    pub fn get_bound_port(&self, addr: &SocketAddr, peer: &SocketAddr) -> Option<u16> {
541        self.ports.get_bound(addr, peer)
542    }
543
544    /// alloc a port from State.
545    ///
546    /// In all cases, the server SHOULD only allocate ports from the range
547    /// 49152 - 65535 (the Dynamic and/or Private Port range [PORT-NUMBERS]),
548    /// unless the TURN server application knows, through some means not
549    /// specified here, that other applications running on the same host as
550    /// the TURN server application will not be impacted by allocating ports
551    /// outside this range.  This condition can often be satisfied by running
552    /// the TURN server application on a dedicated machine and/or by
553    /// arranging that any other applications on the machine allocate ports
554    /// before the TURN server application starts.  In any case, the TURN
555    /// server SHOULD NOT allocate ports in the range 0 - 1023 (the Well-
556    /// Known Port range) to discourage clients from using TURN to run
557    /// standard services.
558    ///
559    ///   NOTE: The use of randomized port assignments to avoid certain
560    ///   types of attacks is described in [RFC6056].  It is RECOMMENDED
561    ///   that a TURN server implement a randomized port assignment
562    ///   algorithm from [RFC6056].  This is especially applicable to
563    ///   servers that choose to pre-allocate a number of ports from the
564    ///   underlying OS and then later assign them to allocations; for
565    ///   example, a server may choose this technique to implement the
566    ///   EVEN-PORT attribute.
567    ///
568    /// The server determines the initial value of the time-to-expiry field
569    /// as follows.  If the request contains a LIFETIME attribute, then the
570    /// server computes the minimum of the client's proposed lifetime and the
571    /// server's maximum allowed lifetime.  If this computed value is greater
572    /// than the default lifetime, then the server uses the computed lifetime
573    /// as the initial value of the time-to-expiry field.  Otherwise, the
574    /// server uses the default lifetime.  It is RECOMMENDED that the server
575    /// use a maximum allowed lifetime value of no more than 3600 seconds (1
576    /// hour).  Servers that implement allocation quotas or charge users for
577    /// allocations in some way may wish to use a smaller maximum allowed
578    /// lifetime (perhaps as small as the default lifetime) to more quickly
579    /// remove orphaned allocations (that is, allocations where the
580    /// corresponding client has crashed or terminated, or the client
581    /// connection has been lost for some reason).  Also, note that the time-
582    /// to-expiry is recomputed with each successful Refresh request, and
583    /// thus, the value computed here applies only until the first refresh.
584    ///
585    /// # Examples
586    ///
587    /// ```
588    /// use std::net::SocketAddr;
589    /// use std::sync::Arc;
590    /// use turn_rs::router::*;
591    /// use turn_rs::*;
592    ///
593    /// struct ObserverTest;
594    ///
595    /// impl Observer for ObserverTest {
596    ///     fn get_password_blocking(
597    ///         &self,
598    ///         _: &SocketAddr,
599    ///         _: &str,
600    ///     ) -> Option<String> {
601    ///         Some("test".to_string())
602    ///     }
603    /// }
604    ///
605    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
606    /// let secret = [
607    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
608    ///     239,
609    /// ];
610    ///
611    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
612    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
613    ///
614    /// assert_eq!(key.as_slice(), &secret);
615    /// assert!(router.alloc_port(&addr).is_some());
616    /// ```
617    pub fn alloc_port(&self, addr: &SocketAddr) -> Option<u16> {
618        let port = self.ports.alloc(addr)?;
619        self.nodes.push_port(addr, port);
620        Some(port)
621    }
622
623    /// bind port for State.
624    ///
625    /// A server need not do anything special to implement
626    /// idempotency of CreatePermission requests over UDP using the
627    /// "stateless stack approach".  Retransmitted CreatePermission
628    /// requests will simply refresh the permissions.
629    ///
630    /// # Examples
631    ///
632    /// ```
633    /// use std::net::SocketAddr;
634    /// use std::sync::Arc;
635    /// use turn_rs::router::*;
636    /// use turn_rs::*;
637    ///
638    /// struct ObserverTest;
639    ///
640    /// impl Observer for ObserverTest {
641    ///     fn get_password_blocking(
642    ///         &self,
643    ///         _: &SocketAddr,
644    ///         _: &str,
645    ///     ) -> Option<String> {
646    ///         Some("test".to_string())
647    ///     }
648    /// }
649    ///
650    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
651    /// let secret = [
652    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
653    ///     239,
654    /// ];
655    ///
656    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
657    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
658    ///
659    /// assert_eq!(key.as_slice(), &secret);
660    ///
661    /// let port = router.alloc_port(&addr).unwrap();
662    /// assert!(router.bind_port(&addr, port).is_some());
663    /// ```
664    pub fn bind_port(&self, addr: &SocketAddr, port: u16) -> Option<()> {
665        self.ports.bound(addr, port)
666    }
667
668    /// bind channel number for State.
669    ///
670    /// A server need not do anything special to implement
671    /// idempotency of ChannelBind requests over UDP using the
672    /// "stateless stack approach".  Retransmitted ChannelBind requests
673    /// will simply refresh the channel binding and the corresponding
674    /// permission.  Furthermore, the client must wait 5 minutes before
675    /// binding a previously bound channel number or peer address to a
676    /// different channel, eliminating the possibility that the
677    /// transaction would initially fail but succeed on a
678    /// retransmission.
679    ///
680    /// # Examples
681    ///
682    /// ```
683    /// use std::net::SocketAddr;
684    /// use std::sync::Arc;
685    /// use turn_rs::router::*;
686    /// use turn_rs::*;
687    ///
688    /// struct ObserverTest;
689    ///
690    /// impl Observer for ObserverTest {
691    ///     fn get_password_blocking(
692    ///         &self,
693    ///         _: &SocketAddr,
694    ///         _: &str,
695    ///     ) -> Option<String> {
696    ///         Some("test".to_string())
697    ///     }
698    /// }
699    ///
700    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
701    /// let secret = [
702    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
703    ///     239,
704    /// ];
705    ///
706    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
707    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
708    ///
709    /// assert_eq!(key.as_slice(), &secret);
710    ///
711    /// let port = router.alloc_port(&addr).unwrap();
712    /// assert!(router.bind_channel(&addr, port, 0x4000).is_some());
713    /// ```
714    pub fn bind_channel(&self, addr: &SocketAddr, port: u16, channel: u16) -> Option<()> {
715        let source = self.ports.get(port)?;
716        self.channels.insert(addr, channel, &source)?;
717        self.nodes.push_channel(addr, channel)?;
718        Some(())
719    }
720
721    /// refresh node lifetime.
722    ///
723    /// The server computes a value called the "desired lifetime" as follows:
724    /// if the request contains a LIFETIME attribute and the attribute value
725    /// is zero, then the "desired lifetime" is zero.  Otherwise, if the
726    /// request contains a LIFETIME attribute, then the server computes the
727    /// minimum of the client's requested lifetime and the server's maximum
728    /// allowed lifetime.  If this computed value is greater than the default
729    /// lifetime, then the "desired lifetime" is the computed value.
730    /// Otherwise, the "desired lifetime" is the default lifetime.
731    ///
732    /// Subsequent processing depends on the "desired lifetime" value:
733    ///
734    /// * If the "desired lifetime" is zero, then the request succeeds and the
735    ///   allocation is deleted.
736    ///
737    /// * If the "desired lifetime" is non-zero, then the request succeeds and
738    ///   the allocation's time-to-expiry is set to the "desired lifetime".
739    ///
740    /// If the request succeeds, then the server sends a success response
741    /// containing:
742    ///
743    /// * A LIFETIME attribute containing the current value of the time-to-
744    ///   expiry timer.
745    ///
746    /// NOTE: A server need not do anything special to implement
747    /// idempotency of Refresh requests over UDP using the "stateless
748    /// stack approach".  Retransmitted Refresh requests with a non-
749    /// zero "desired lifetime" will simply refresh the allocation.  A
750    /// retransmitted Refresh request with a zero "desired lifetime"
751    /// will cause a 437 (Allocation Mismatch) response if the
752    /// allocation has already been deleted, but the client will treat
753    /// this as equivalent to a success response (see below).
754    ///
755    /// # Examples
756    ///
757    /// ```
758    /// use std::net::SocketAddr;
759    /// use std::sync::Arc;
760    /// use turn_rs::router::*;
761    /// use turn_rs::*;
762    ///
763    /// struct ObserverTest;
764    ///
765    /// impl Observer for ObserverTest {
766    ///     fn get_password_blocking(
767    ///         &self,
768    ///         _: &SocketAddr,
769    ///         _: &str,
770    ///     ) -> Option<String> {
771    ///         Some("test".to_string())
772    ///     }
773    /// }
774    ///
775    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
776    /// let secret = [
777    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
778    ///     239,
779    /// ];
780    ///
781    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
782    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
783    ///
784    /// assert_eq!(key.as_slice(), &secret);
785    /// router.refresh(&addr, 0);
786    ///
787    /// assert!(router.get_node(&addr).is_none());
788    /// ```
789    pub fn refresh(&self, addr: &SocketAddr, delay: u32) {
790        if delay > 0 {
791            self.nodes.set_lifetime(addr, delay);
792        } else {
793            self.remove(addr);
794        }
795    }
796
797    /// remove a node.
798    ///
799    /// # Examples
800    ///
801    /// ```
802    /// use std::net::SocketAddr;
803    /// use std::sync::Arc;
804    /// use turn_rs::router::*;
805    /// use turn_rs::*;
806    ///
807    /// struct ObserverTest;
808    ///
809    /// impl Observer for ObserverTest {
810    ///     fn get_password_blocking(
811    ///         &self,
812    ///         _: &SocketAddr,
813    ///         _: &str,
814    ///     ) -> Option<String> {
815    ///         Some("test".to_string())
816    ///     }
817    /// }
818    ///
819    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
820    /// let secret = [
821    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
822    ///     239,
823    /// ];
824    ///
825    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
826    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
827    ///
828    /// assert_eq!(key.as_slice(), &secret);
829    /// assert!(router.remove(&addr).is_some());
830    /// assert!(router.get_node(&addr).is_none());
831    /// ```
832    pub fn remove(&self, addr: &SocketAddr) -> Option<()> {
833        let node = self.nodes.remove(addr)?;
834        self.ports.remove(addr, &node.ports);
835        for c in node.channels {
836            self.channels.remove(c);
837        }
838
839        self.nonces.remove(addr);
840        self.interfaces.remove(addr);
841        self.observer.abort(addr, &node.username);
842        Some(())
843    }
844
845    /// remove a node from username.
846    ///
847    /// # Examples
848    ///
849    /// ```
850    /// use std::net::SocketAddr;
851    /// use std::sync::Arc;
852    /// use turn_rs::router::*;
853    /// use turn_rs::*;
854    ///
855    /// struct ObserverTest;
856    ///
857    /// impl Observer for ObserverTest {
858    ///     fn get_password_blocking(
859    ///         &self,
860    ///         _: &SocketAddr,
861    ///         _: &str,
862    ///     ) -> Option<String> {
863    ///         Some("test".to_string())
864    ///     }
865    /// }
866    ///
867    /// let addr = "127.0.0.1:8080".parse::<SocketAddr>().unwrap();
868    /// let secret = [
869    ///     174, 238, 187, 253, 117, 209, 73, 157, 36, 56, 143, 91, 155, 16, 224,
870    ///     239,
871    /// ];
872    ///
873    /// let router = Router::new("test".to_string(), Arc::new(ObserverTest));
874    /// let key = router.get_key_block(&addr, &addr, &addr, "test").unwrap();
875    ///
876    /// assert_eq!(key.as_slice(), &secret);
877    /// router.remove_from_user("test");
878    ///
879    /// assert!(router.get_node(&addr).is_none());
880    /// ```
881    pub fn remove_from_user(&self, u: &str) {
882        for addr in self.nodes.get_addrs(u) {
883            self.remove(&addr);
884        }
885    }
886}