use async_native_tls::TlsStream; use fast_socks5::client::Socks5Stream; use std::pin::Pin; use std::time::Duration; use tokio::io::{AsyncBufRead, AsyncRead, AsyncWrite, BufStream, BufWriter}; use tokio_io_timeout::TimeoutStream; pub(crate) trait SessionStream: AsyncRead + AsyncWrite + Unpin + Send + Sync + std::fmt::Debug { /// Change the read timeout on the session stream. fn set_read_timeout(&mut self, timeout: Option); } impl SessionStream for Box { fn set_read_timeout(&mut self, timeout: Option) { self.as_mut().set_read_timeout(timeout); } } impl SessionStream for TlsStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout); } } impl SessionStream for BufStream { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout); } } impl SessionStream for BufWriter { fn set_read_timeout(&mut self, timeout: Option) { self.get_mut().set_read_timeout(timeout); } } impl SessionStream for Pin>> { fn set_read_timeout(&mut self, timeout: Option) { self.as_mut().set_read_timeout_pinned(timeout); } } impl SessionStream for Socks5Stream { fn set_read_timeout(&mut self, timeout: Option) { self.get_socket_mut().set_read_timeout(timeout) } } /// Session stream with a read buffer. pub(crate) trait SessionBufStream: SessionStream + AsyncBufRead {} impl SessionBufStream for T {}