use std::net::SocketAddr;
use tokio::net::TcpStream;
mod listener;
mod session;
pub(crate) use listener::Listener;
pub(crate) use listener::ListenerMessage;
pub(crate) use session::Session;
pub(crate) use session::SessionMessage;
pub(crate) type NetworkPort = u16;
pub enum NetworkStream {
Raw {
peer_addr: SocketAddr,
local_addr: SocketAddr,
stream: TcpStream,
},
TlsServer {
peer_addr: SocketAddr,
local_addr: SocketAddr,
stream: tokio_rustls::server::TlsStream<TcpStream>,
},
TlsClient {
peer_addr: SocketAddr,
local_addr: SocketAddr,
stream: tokio_rustls::client::TlsStream<TcpStream>,
},
External {
peer_label: Option<String>,
local_label: Option<String>,
reader: BoxRead,
writer: BoxWrite,
},
}
impl NetworkStream {
pub(crate) fn peer_addr(&self) -> SocketAddr {
match self {
Self::Raw { peer_addr, .. } => *peer_addr,
Self::TlsServer { peer_addr, .. } => *peer_addr,
Self::TlsClient { peer_addr, .. } => *peer_addr,
Self::External { .. } => SocketAddr::from(([0, 0, 0, 0], 0)),
}
}
pub(crate) fn local_addr(&self) -> SocketAddr {
match self {
Self::Raw { local_addr, .. } => *local_addr,
Self::TlsServer { local_addr, .. } => *local_addr,
Self::TlsClient { local_addr, .. } => *local_addr,
Self::External { .. } => SocketAddr::from(([0, 0, 0, 0], 0)),
}
}
}
impl std::fmt::Debug for NetworkStream {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut wip = f.debug_struct("NetworkStream");
match self {
Self::Raw {
peer_addr,
local_addr,
..
} => {
_ = wip
.field("mode", &"Raw")
.field("peer_addr", peer_addr)
.field("local_addr", local_addr);
}
Self::TlsServer {
peer_addr,
local_addr,
..
} => {
_ = wip
.field("mode", &"TlsServer")
.field("peer_addr", peer_addr)
.field("local_addr", local_addr);
}
Self::TlsClient {
peer_addr,
local_addr,
..
} => {
_ = wip
.field("mode", &"TlsClient")
.field("peer_addr", peer_addr)
.field("local_addr", local_addr);
}
Self::External {
peer_label,
local_label,
..
} => {
_ = wip
.field("mode", &"External")
.field("peer_label", peer_label)
.field("local_label", local_label);
}
}
wip.finish()
}
}
#[derive(Clone)]
pub enum IncomingEncryptionMode {
Raw,
Tls(tokio_rustls::TlsAcceptor),
}
impl std::fmt::Debug for IncomingEncryptionMode {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut wip = f.debug_struct("IncomingEncryptionMode");
match &self {
Self::Raw => {
_ = wip.field("mode", &"Raw");
}
Self::Tls(config) => {
_ = wip.field("mode", &"Tls").field("config", &config.config());
}
}
wip.finish()
}
}
pub type BoxRead = Box<dyn tokio::io::AsyncRead + Unpin + Send + 'static>;
pub type BoxWrite = Box<dyn tokio::io::AsyncWrite + Unpin + Send + 'static>;
pub trait ClusterBidiStream: Send + 'static {
fn split(self: Box<Self>) -> (BoxRead, BoxWrite);
fn peer_label(&self) -> Option<String> {
None
}
fn local_label(&self) -> Option<String> {
None
}
}