mod _impl {
type Error = Box<dyn std::error::Error + Send + Sync>;
use crate::{
VERSION,
message::BtpPackage,
socket::{BtpConfig, BtpSocket},
};
use std::{net::SocketAddr, time::Duration};
use tokio::{
net::{TcpStream, lookup_host},
spawn,
task::JoinHandle,
time::sleep,
};
#[cfg(feature = "tls")]
use rustls::pki_types::ServerName;
#[cfg(feature = "tls")]
use tokio_rustls::{TlsConnector, client::TlsStream};
impl BtpSocket<TcpStream, SocketAddr> {
pub async fn connect(
conf: BtpConfig,
) -> Result<
(
BtpSocket<TcpStream, SocketAddr>,
JoinHandle<Result<(), Error>>,
),
Error,
> {
let sock_addr = lookup_host(&conf.addr)
.await?
.next()
.ok_or("Couldn't find the IP address of the host")?;
let sock = TcpStream::connect(&conf.addr).await.unwrap();
let mut btp_socket = BtpSocket::from(sock, conf, sock_addr);
let clone = btp_socket.copy();
let okier: tokio::task::JoinHandle<Result<(), Error>> =
spawn(BtpSocket::attach_okier(clone));
Ok((btp_socket, okier))
}
async fn attach_okier(mut self) -> Result<(), Error> {
loop {
self.write(BtpPackage::okie(VERSION)).await?;
sleep(Duration::from_secs(20)).await;
}
}
pub async fn connect_without_okie_dokie(
conf: BtpConfig,
) -> Result<BtpSocket<TcpStream, SocketAddr>, Error> {
let sock_addr = lookup_host(&conf.addr)
.await?
.next()
.ok_or("Couldn't find the IP address of the host")?;
let sock = TcpStream::connect(&conf.addr).await.unwrap();
Ok(BtpSocket::from(sock, conf, sock_addr))
}
#[cfg(feature = "tls")]
pub async fn connect_tls(
connector: TlsConnector,
conf: BtpConfig,
) -> Result<BtpSocket<TlsStream<TcpStream>, SocketAddr>, Error> {
let sock_addr = lookup_host(&conf.addr)
.await?
.next()
.ok_or("Couldn't find the IP address of the host")?;
let server_name = ServerName::IpAddress(sock_addr.ip().into());
let sock = TcpStream::connect(&conf.addr).await.unwrap();
let tls_connection = connector.connect(server_name, sock).await?;
Ok(BtpSocket::from(tls_connection, conf, sock_addr))
}
}
}