ssb_boxstream/
duplex.rs

1use crate::read::BoxReader;
2use crate::write::BoxWriter;
3use core::pin::Pin;
4use core::task::{Context, Poll};
5use futures_io::{self as io, AsyncRead, AsyncWrite};
6use ssb_crypto::secretbox::{Key, Nonce};
7
8pub struct BoxStream<R, W> {
9    reader: BoxReader<R, Vec<u8>>,
10    writer: BoxWriter<W, Vec<u8>>,
11}
12
13impl<R, W> BoxStream<R, W>
14where
15    R: AsyncRead + Unpin + 'static,
16    W: AsyncWrite + Unpin + 'static,
17{
18    pub fn new(
19        r: R,
20        w: W,
21        r_key: Key,
22        r_nonce: Nonce,
23        w_key: Key,
24        w_nonce: Nonce,
25    ) -> BoxStream<R, W> {
26        BoxStream {
27            reader: BoxReader::new(r, r_key, r_nonce),
28            writer: BoxWriter::new(w, w_key, w_nonce),
29        }
30    }
31
32    pub fn split(self) -> (BoxReader<R, Vec<u8>>, BoxWriter<W, Vec<u8>>) {
33        let BoxStream { reader, writer } = self;
34        (reader, writer)
35    }
36}
37
38impl<R, W> AsyncRead for BoxStream<R, W>
39where
40    R: Unpin + AsyncRead + 'static,
41    W: Unpin + AsyncWrite + 'static,
42{
43    fn poll_read(
44        mut self: Pin<&mut Self>,
45        cx: &mut Context,
46        buf: &mut [u8],
47    ) -> Poll<Result<usize, io::Error>> {
48        Pin::new(&mut self.reader).poll_read(cx, buf)
49    }
50}
51
52impl<R, W> AsyncWrite for BoxStream<R, W>
53where
54    R: Unpin + AsyncRead + 'static,
55    W: Unpin + AsyncWrite + 'static,
56{
57    fn poll_write(
58        mut self: Pin<&mut Self>,
59        cx: &mut Context,
60        buf: &[u8],
61    ) -> Poll<Result<usize, io::Error>> {
62        Pin::new(&mut self.writer).poll_write(cx, buf)
63    }
64
65    fn poll_flush(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), io::Error>> {
66        Pin::new(&mut self.writer).poll_flush(cx)
67    }
68
69    fn poll_close(mut self: Pin<&mut Self>, cx: &mut Context) -> Poll<Result<(), io::Error>> {
70        Pin::new(&mut self.writer).poll_close(cx)
71    }
72}