deltachat/net/
session.rs

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    /// Change the read timeout on the session stream.
11    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
62/// Session stream with a read buffer.
63pub(crate) trait SessionBufStream: SessionStream + AsyncBufRead {}
64
65impl<T: SessionStream + AsyncBufRead> SessionBufStream for T {}