#![cfg(not(target_arch = "wasm32"))]
use crate::channel::handshake::Handshake;
use crate::io::TcpListener;
use crate::io::TcpStream;
use crate::io::ToSocketAddrs;
use crate::Channel;
use crate::Result;
use backoff::ExponentialBackoff;
use derive_more::{From, Into};
#[derive(From, Into)]
#[into(owned, ref, ref_mut)]
#[repr(transparent)]
pub struct Tcp(TcpListener);
impl Tcp {
#[inline]
pub async fn bind(addrs: impl ToSocketAddrs) -> Result<Self> {
let listener = TcpListener::bind(addrs).await?;
Ok(Tcp(listener))
}
#[inline]
pub async fn next(&self) -> Result<Handshake> {
let (stream, _) = self.0.accept().await?;
Ok(Handshake::from(Channel::from_raw(
stream,
Default::default(),
Default::default(),
)))
}
pub async fn connect_no_backoff(
addrs: impl ToSocketAddrs + std::fmt::Debug,
) -> Result<Handshake> {
let stream = TcpStream::connect(&addrs).await?;
Ok(Handshake::from(Channel::from_raw(
stream,
Default::default(),
Default::default(),
)))
}
#[inline]
pub async fn connect(addrs: impl ToSocketAddrs + std::fmt::Debug) -> Result<Handshake> {
let hs = backoff::future::retry(ExponentialBackoff::default(), || async {
let stream = TcpStream::connect(&addrs).await?;
Ok(Handshake::from(Channel::from_raw(
stream,
Default::default(),
Default::default(),
)))
})
.await?;
Ok(hs)
}
}