rtc_ice/agent/
agent_proto.rs

1use super::*;
2
3impl sansio::Protocol<TransportMessage<BytesMut>, (), ()> for Agent {
4    type Rout = TransportMessage<BytesMut>;
5    type Wout = TransportMessage<BytesMut>;
6    type Eout = Event;
7    type Error = Error;
8    type Time = Instant;
9
10    fn handle_read(&mut self, msg: TransportMessage<BytesMut>) -> Result<()> {
11        if let Some(local_index) =
12            self.find_local_candidate(msg.transport.local_addr, msg.transport.transport_protocol)
13        {
14            self.handle_inbound_candidate_msg(local_index, msg)
15        } else {
16            warn!(
17                "[{}]: Discarded message, not a valid local candidate from {:?}:{}",
18                self.get_name(),
19                msg.transport.transport_protocol,
20                msg.transport.local_addr,
21            );
22            Err(Error::ErrUnhandledStunpacket)
23        }
24    }
25
26    fn poll_read(&mut self) -> Option<Self::Rout> {
27        None
28    }
29
30    fn handle_write(&mut self, _msg: ()) -> std::result::Result<(), Self::Error> {
31        Ok(())
32    }
33
34    fn poll_write(&mut self) -> Option<Self::Wout> {
35        self.write_outs.pop_front()
36    }
37
38    fn handle_event(&mut self, _evt: ()) -> std::result::Result<(), Self::Error> {
39        Ok(())
40    }
41
42    fn poll_event(&mut self) -> Option<Self::Eout> {
43        self.event_outs.pop_front()
44    }
45
46    fn handle_timeout(&mut self, now: Self::Time) -> std::result::Result<(), Self::Error> {
47        if self.ufrag_pwd.remote_credentials.is_some()
48            && self.last_checking_time + self.get_timeout_interval() <= now
49        {
50            self.contact(now);
51        }
52        Ok(())
53    }
54
55    fn poll_timeout(&mut self) -> Option<Self::Time> {
56        if self.ufrag_pwd.remote_credentials.is_some() {
57            Some(self.last_checking_time + self.get_timeout_interval())
58        } else {
59            None
60        }
61    }
62
63    fn close(&mut self) -> std::result::Result<(), Self::Error> {
64        self.set_selected_pair(None);
65        self.delete_all_candidates(false);
66        self.update_connection_state(ConnectionState::Closed);
67
68        Ok(())
69    }
70}