]> git.lizzy.rs Git - connect-rs.git/blob - src/lib.rs
better handling of stream/sink closing
[connect-rs.git] / src / lib.rs
1 mod reader;
2 pub mod schema;
3 pub mod tcp;
4 pub mod tls;
5 mod writer;
6
7 pub use crate::reader::ConnectionReader;
8 pub use crate::writer::ConnectionWriter;
9 use async_std::net::SocketAddr;
10 use futures::{AsyncRead, AsyncWrite};
11 pub use futures::{SinkExt, StreamExt};
12
13 pub struct Connection {
14     local_addr: SocketAddr,
15     peer_addr: SocketAddr,
16     reader: ConnectionReader,
17     writer: ConnectionWriter,
18 }
19
20 #[allow(dead_code)]
21 impl Connection {
22     pub(crate) fn new(
23         local_addr: SocketAddr,
24         peer_addr: SocketAddr,
25         read_stream: Box<dyn AsyncRead + Send + Sync + Unpin>,
26         write_stream: Box<dyn AsyncWrite + Send + Sync + Unpin>,
27     ) -> Self {
28         Self {
29             local_addr,
30             peer_addr,
31             reader: ConnectionReader::new(local_addr, peer_addr, read_stream),
32             writer: ConnectionWriter::new(local_addr, peer_addr, write_stream),
33         }
34     }
35
36     pub fn local_addr(&self) -> SocketAddr {
37         self.local_addr.clone()
38     }
39
40     pub fn peer_addr(&self) -> SocketAddr {
41         self.peer_addr.clone()
42     }
43
44     pub fn split(self) -> (ConnectionReader, ConnectionWriter) {
45         (self.reader, self.writer)
46     }
47
48     pub fn join(reader: ConnectionReader, writer: ConnectionWriter) -> Self {
49         Self {
50             local_addr: reader.local_addr(),
51             peer_addr: reader.peer_addr(),
52             reader,
53             writer,
54         }
55     }
56
57     pub fn reader(&mut self) -> &mut ConnectionReader {
58         &mut self.reader
59     }
60
61     pub fn writer(&mut self) -> &mut ConnectionWriter {
62         &mut self.writer
63     }
64
65     pub async fn close(self) -> SocketAddr {
66         let peer_addr = self.peer_addr();
67         let (reader, writer) = self.split();
68
69         drop(reader);
70
71         // writer.close().await;
72         drop(writer);
73
74         return peer_addr;
75     }
76 }