use crate::{crypto::tls::TlsSession, dc, stateless_reset, transport};
use alloc::vec::Vec;
pub trait Endpoint: 'static + Send {
const ENABLED: bool = true;
type Path: Path;
fn new_path(&mut self, connection_info: &dc::ConnectionInfo) -> Option<Self::Path>;
fn on_possible_secret_control_packet(
&mut self,
datagram_info: &dc::DatagramInfo,
payload: &mut [u8],
) -> bool;
fn mtu_probing_complete_support(&self) -> bool {
true
}
}
pub trait Path: 'static + Send {
fn on_path_secrets_ready(
&mut self,
session: &impl TlsSession,
) -> Result<Vec<stateless_reset::Token>, transport::Error>;
fn on_peer_stateless_reset_tokens<'a>(
&mut self,
stateless_reset_tokens: impl Iterator<Item = &'a stateless_reset::Token>,
);
fn on_dc_handshake_complete(&mut self);
fn on_mtu_updated(&mut self, mtu: u16);
fn on_secret(
&mut self,
secret: alloc::boxed::Box<dyn core::any::Any + Send + 'static>,
) -> Result<Vec<stateless_reset::Token>, transport::Error>;
}
impl<P: Path> Path for Option<P> {
#[inline]
fn on_path_secrets_ready(
&mut self,
session: &impl TlsSession,
) -> Result<Vec<stateless_reset::Token>, transport::Error> {
if let Some(path) = self {
path.on_path_secrets_ready(session)
} else {
Ok(Vec::default())
}
}
#[inline]
fn on_peer_stateless_reset_tokens<'a>(
&mut self,
stateless_reset_tokens: impl Iterator<Item = &'a stateless_reset::Token>,
) {
if let Some(path) = self {
path.on_peer_stateless_reset_tokens(stateless_reset_tokens)
}
}
#[inline]
fn on_dc_handshake_complete(&mut self) {
if let Some(path) = self {
path.on_dc_handshake_complete()
}
}
#[inline]
fn on_mtu_updated(&mut self, max_datagram_size: u16) {
if let Some(path) = self {
path.on_mtu_updated(max_datagram_size)
}
}
fn on_secret(
&mut self,
secret: alloc::boxed::Box<dyn core::any::Any + Send + 'static>,
) -> Result<Vec<stateless_reset::Token>, transport::Error> {
if let Some(path) = self {
path.on_secret(secret)
} else {
Ok(Vec::default())
}
}
}