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}