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}