rtc_turn/client/
proto.rs

1use crate::client::relay::Relay;
2use crate::client::{Client, Event};
3use shared::TaggedBytesMut;
4use shared::error::Error;
5use std::net::SocketAddr;
6use std::time::Instant;
7
8impl sansio::Protocol<TaggedBytesMut, TaggedBytesMut, ()> for Client {
9    type Rout = ();
10    type Wout = TaggedBytesMut;
11    type Eout = Event;
12    type Error = Error;
13    type Time = Instant;
14
15    fn handle_read(&mut self, msg: TaggedBytesMut) -> Result<(), Self::Error> {
16        self.handle_inbound(&msg.message[..], msg.transport.peer_addr)
17    }
18
19    fn poll_read(&mut self) -> Option<Self::Rout> {
20        None
21    }
22
23    fn handle_write(&mut self, _msg: TaggedBytesMut) -> Result<(), Self::Error> {
24        Ok(())
25    }
26
27    fn poll_write(&mut self) -> Option<Self::Wout> {
28        while let Some(transmit) = self.tr_map.poll_transmit() {
29            self.transmits.push_back(transmit);
30        }
31        self.transmits.pop_front()
32    }
33
34    fn poll_event(&mut self) -> Option<Self::Eout> {
35        while let Some(event) = self.tr_map.poll_event() {
36            self.events.push_back(event);
37        }
38        self.events.pop_front()
39    }
40
41    fn handle_timeout(&mut self, now: Instant) -> Result<(), Self::Error> {
42        self.tr_map.handle_timeout(now);
43
44        #[allow(clippy::map_clone)]
45        let relayed_addrs: Vec<SocketAddr> = self.relays.keys().map(|key| *key).collect();
46        for relayed_addr in relayed_addrs {
47            let mut relay = Relay {
48                relayed_addr,
49                client: self,
50            };
51            relay.handle_timeout(now);
52        }
53
54        Ok(())
55    }
56
57    fn poll_timeout(&mut self) -> Option<Instant> {
58        let mut eto = None;
59        if let Some(to) = self.tr_map.poll_timout()
60            && (eto.is_none() || to < *eto.as_ref().unwrap())
61        {
62            eto = Some(to);
63        }
64
65        #[allow(clippy::map_clone)]
66        let relayed_addrs: Vec<SocketAddr> = self.relays.keys().map(|key| *key).collect();
67        for relayed_addr in relayed_addrs {
68            let relay = Relay {
69                relayed_addr,
70                client: self,
71            };
72            if let Some(to) = relay.poll_timeout()
73                && (eto.is_none() || to < *eto.as_ref().unwrap())
74            {
75                eto = Some(to);
76            }
77        }
78
79        eto
80    }
81
82    fn close(&mut self) -> Result<(), Self::Error> {
83        self.tr_map.delete_all();
84        Ok(())
85    }
86}