1use fast_socks5::client::Socks5Stream;
2use std::pin::Pin;
3use std::time::Duration;
4use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, BufStream, BufWriter};
5use tokio_io_timeout::TimeoutStream;
6
7pub(crate) trait SessionStream:
8 AsyncRead + AsyncWrite + Unpin + Send + Sync + std::fmt::Debug
9{
10 fn set_read_timeout(&mut self, timeout: Option<Duration>);
12}
13
14impl SessionStream for Box<dyn SessionStream> {
15 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
16 self.as_mut().set_read_timeout(timeout);
17 }
18}
19impl<T: SessionStream> SessionStream for async_native_tls::TlsStream<T> {
20 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
21 self.get_mut().set_read_timeout(timeout);
22 }
23}
24impl<T: SessionStream> SessionStream for tokio_rustls::client::TlsStream<T> {
25 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
26 self.get_mut().0.set_read_timeout(timeout);
27 }
28}
29impl<T: SessionStream> SessionStream for BufStream<T> {
30 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
31 self.get_mut().set_read_timeout(timeout);
32 }
33}
34impl<T: SessionStream> SessionStream for BufWriter<T> {
35 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
36 self.get_mut().set_read_timeout(timeout);
37 }
38}
39impl<T: AsyncRead + AsyncWrite + Send + Sync + std::fmt::Debug> SessionStream
40 for Pin<Box<TimeoutStream<T>>>
41{
42 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
43 self.as_mut().set_read_timeout_pinned(timeout);
44 }
45}
46impl<T: SessionStream> SessionStream for Socks5Stream<T> {
47 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
48 self.get_socket_mut().set_read_timeout(timeout)
49 }
50}
51impl<T: SessionStream> SessionStream for shadowsocks::ProxyClientStream<T> {
52 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
53 self.get_mut().set_read_timeout(timeout)
54 }
55}
56impl<T: SessionStream> SessionStream for async_imap::DeflateStream<T> {
57 fn set_read_timeout(&mut self, timeout: Option<Duration>) {
58 self.get_mut().set_read_timeout(timeout)
59 }
60}
61
62pub(crate) trait SessionBufStream: SessionStream + AsyncBufRead {}
64
65impl<T: SessionStream + AsyncBufRead> SessionBufStream for T {}