1 use async_channel::{Receiver, Sender};
5 use async_tls::TlsConnector;
6 use futures_util::io::AsyncReadExt;
9 use crate::registry::StitchRegistry;
10 use crate::StitchNetClient;
11 use crate::{channel_factory, StitchMessage};
12 use async_std::sync::{Arc, Condvar, Mutex};
14 impl StitchNetClient {
15 pub fn tls_client<A: ToSocketAddrs + std::fmt::Display>(
18 connector: TlsConnector,
20 Self::tls_client_with_bound(ip_addrs, domain, connector, None)
23 pub fn tls_client_with_bound<A: ToSocketAddrs + std::fmt::Display>(
26 connector: TlsConnector,
29 let stream = task::block_on(TcpStream::connect(&ip_addrs))?;
30 stream.set_nodelay(true)?;
31 info!("Established client TCP connection to {}", ip_addrs);
33 Self::tls_client_from_parts(stream, domain, connector, channel_factory(cap))
36 pub fn tls_client_from_parts(
39 connector: TlsConnector,
40 (tls_write_sender, tls_write_receiver): (Sender<StitchMessage>, Receiver<StitchMessage>),
42 let local_addr = stream.local_addr()?;
43 let peer_addr = stream.peer_addr()?;
45 let encrypted_stream = task::block_on(connector.connect(domain, stream))?;
46 let (read_stream, write_stream) = encrypted_stream.split();
47 info!("Completed TLS handshake with {}", peer_addr);
49 let registry: StitchRegistry = crate::registry::new();
50 let read_readiness = Arc::new((Mutex::new(false), Condvar::new()));
51 let write_readiness = Arc::new((Mutex::new(false), Condvar::new()));
53 let read_task = task::spawn(crate::tasks::read_from_stream(
56 read_readiness.clone(),
59 let write_task = task::spawn(crate::tasks::write_to_stream(
60 tls_write_receiver.clone(),
62 write_readiness.clone(),
69 stream_writer_chan: (tls_write_sender, tls_write_receiver),