use std::future::Future;
use bytes::Bytes;
pub trait QuinnConn: Clone + Send + Sync {
type AddrType: std::fmt::Debug;
type SockAddrType: std::fmt::Debug;
fn open_bi(&self) -> anapaya_quinn::OpenBi<'_>;
fn accept_bi(&self) -> anapaya_quinn::AcceptBi<'_>;
fn read_datagram(&self) -> anapaya_quinn::ReadDatagram<'_>;
fn send_datagram(&self, data: Bytes) -> Result<(), anapaya_quinn::SendDatagramError>;
fn send_datagram_wait(&self, data: Bytes) -> anapaya_quinn::SendDatagram<'_>;
fn closed(&self) -> impl Future<Output = anapaya_quinn::ConnectionError> + Send;
fn close_reason(&self) -> Option<anapaya_quinn::ConnectionError>;
fn close(&self, error_code: anapaya_quinn::VarInt, reason: &[u8]);
fn max_datagram_size(&self) -> Option<usize>;
fn datagram_send_buffer_space(&self) -> usize;
fn remote_address(&self) -> Self::SockAddrType;
fn local_ip(&self) -> Option<Self::AddrType>;
fn stable_id(&self) -> usize;
fn stats(&self) -> anapaya_quinn::ConnectionStats;
}
#[derive(Clone)]
pub struct ScionQuinnConn {
pub(crate) inner: anapaya_quinn::Connection,
pub(crate) local_addr: Option<scion_proto::address::ScionAddr>,
pub(crate) remote_addr: scion_proto::address::SocketAddr,
}
impl QuinnConn for ScionQuinnConn {
type AddrType = scion_proto::address::ScionAddr;
type SockAddrType = scion_proto::address::SocketAddr;
fn open_bi(&self) -> anapaya_quinn::OpenBi<'_> {
self.inner.open_bi()
}
fn accept_bi(&self) -> anapaya_quinn::AcceptBi<'_> {
self.inner.accept_bi()
}
fn read_datagram(&self) -> anapaya_quinn::ReadDatagram<'_> {
self.inner.read_datagram()
}
fn send_datagram(&self, data: Bytes) -> Result<(), anapaya_quinn::SendDatagramError> {
self.inner.send_datagram(data)
}
fn send_datagram_wait(&self, data: Bytes) -> anapaya_quinn::SendDatagram<'_> {
self.inner.send_datagram_wait(data)
}
async fn closed(&self) -> anapaya_quinn::ConnectionError {
self.inner.closed().await
}
fn close_reason(&self) -> Option<anapaya_quinn::ConnectionError> {
self.inner.close_reason()
}
fn close(&self, error_code: anapaya_quinn::VarInt, reason: &[u8]) {
self.inner.close(error_code, reason)
}
fn max_datagram_size(&self) -> Option<usize> {
self.inner.max_datagram_size()
}
fn datagram_send_buffer_space(&self) -> usize {
self.inner.datagram_send_buffer_space()
}
fn remote_address(&self) -> Self::SockAddrType {
self.remote_addr
}
fn local_ip(&self) -> Option<Self::AddrType> {
self.local_addr
}
fn stable_id(&self) -> usize {
self.inner.stable_id()
}
fn stats(&self) -> anapaya_quinn::ConnectionStats {
self.inner.stats()
}
}
impl QuinnConn for anapaya_quinn::Connection {
type AddrType = std::net::IpAddr;
type SockAddrType = std::net::SocketAddr;
fn open_bi(&self) -> anapaya_quinn::OpenBi<'_> {
self.open_bi()
}
fn accept_bi(&self) -> anapaya_quinn::AcceptBi<'_> {
self.accept_bi()
}
fn read_datagram(&self) -> anapaya_quinn::ReadDatagram<'_> {
self.read_datagram()
}
fn send_datagram(&self, data: Bytes) -> Result<(), anapaya_quinn::SendDatagramError> {
self.send_datagram(data)
}
fn send_datagram_wait(&self, data: Bytes) -> anapaya_quinn::SendDatagram<'_> {
self.send_datagram_wait(data)
}
fn closed(&self) -> impl Future<Output = anapaya_quinn::ConnectionError> + Send {
self.closed()
}
fn close_reason(&self) -> Option<anapaya_quinn::ConnectionError> {
self.close_reason()
}
fn close(&self, error_code: anapaya_quinn::VarInt, reason: &[u8]) {
self.close(error_code, reason);
}
fn max_datagram_size(&self) -> Option<usize> {
self.max_datagram_size()
}
fn datagram_send_buffer_space(&self) -> usize {
self.datagram_send_buffer_space()
}
fn remote_address(&self) -> Self::SockAddrType {
self.remote_address()
}
fn local_ip(&self) -> Option<Self::AddrType> {
self.local_ip()
}
fn stable_id(&self) -> usize {
self.stable_id()
}
fn stats(&self) -> anapaya_quinn::ConnectionStats {
self.stats()
}
}