1use anyhow::Result;
2use fast_socks5::client::Socks5Stream;
3use std::net::SocketAddr;
4use std::pin::Pin;
5use std::time::Duration;
6use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, BufStream, BufWriter};
7use tokio::net::TcpStream;
8use tokio_io_timeout::TimeoutStream;
9
10pub(crate) trait SessionStream:
11 AsyncRead + AsyncWrite + Unpin + Send + Sync + std::fmt::Debug
12{
13 fn set_read_timeout(&mut self, timeout: Option<Duration>);
15
16 fn peer_addr(&self) -> Result<SocketAddr>;
18}
19
20impl SessionStream for Box<dyn SessionStream> {
21 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
22 self.as_mut().set_read_timeout(timeout);
23 }
24
25 fn peer_addr(&self) -> Result<SocketAddr> {
26 self.as_ref().peer_addr()
27 }
28}
29impl<T: SessionStream> SessionStream for async_native_tls::TlsStream<T> {
30 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
31 self.get_mut().set_read_timeout(timeout);
32 }
33
34 fn peer_addr(&self) -> Result<SocketAddr> {
35 self.get_ref().peer_addr()
36 }
37}
38impl<T: SessionStream> SessionStream for tokio_rustls::client::TlsStream<T> {
39 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
40 self.get_mut().0.set_read_timeout(timeout);
41 }
42 fn peer_addr(&self) -> Result<SocketAddr> {
43 self.get_ref().0.peer_addr()
44 }
45}
46impl<T: SessionStream> SessionStream for BufStream<T> {
47 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
48 self.get_mut().set_read_timeout(timeout);
49 }
50
51 fn peer_addr(&self) -> Result<SocketAddr> {
52 self.get_ref().peer_addr()
53 }
54}
55impl<T: SessionStream> SessionStream for BufWriter<T> {
56 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
57 self.get_mut().set_read_timeout(timeout);
58 }
59
60 fn peer_addr(&self) -> Result<SocketAddr> {
61 self.get_ref().peer_addr()
62 }
63}
64impl SessionStream for Pin<Box<TimeoutStream<TcpStream>>> {
65 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
66 self.as_mut().set_read_timeout_pinned(timeout);
67 }
68
69 fn peer_addr(&self) -> Result<SocketAddr> {
70 Ok(self.get_ref().peer_addr()?)
71 }
72}
73impl<T: SessionStream> SessionStream for Socks5Stream<T> {
74 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
75 self.get_socket_mut().set_read_timeout(timeout)
76 }
77
78 fn peer_addr(&self) -> Result<SocketAddr> {
79 self.get_socket_ref().peer_addr()
80 }
81}
82impl<T: SessionStream> SessionStream for shadowsocks::ProxyClientStream<T> {
83 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
84 self.get_mut().set_read_timeout(timeout)
85 }
86
87 fn peer_addr(&self) -> Result<SocketAddr> {
88 self.get_ref().peer_addr()
89 }
90}
91impl<T: SessionStream> SessionStream for async_imap::DeflateStream<T> {
92 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
93 self.get_mut().set_read_timeout(timeout)
94 }
95
96 fn peer_addr(&self) -> Result<SocketAddr> {
97 self.get_ref().peer_addr()
98 }
99}
100
101pub(crate) trait SessionBufStream: SessionStream + AsyncBufRead {}
103
104impl<T: SessionStream + AsyncBufRead> SessionBufStream for T {}