use hyper::body::Bytes;
use tokio::net::UdpSocket;
use crate::server::H3Acceptor;
use quiche_h3::H3QuicheAcceptor as InnerAcceptor;
use quiche_h3::H3QuicheServerConfig;
pub struct H3QuicheAcceptor {
inner: InnerAcceptor,
}
impl H3QuicheAcceptor {
pub fn new(socket: UdpSocket, config: &H3QuicheServerConfig) -> Result<Self, crate::Error> {
let mut acceptors = InnerAcceptor::bind([socket], config)?;
let inner = acceptors.pop().ok_or_else(|| {
crate::Error::from("quiche_h3::H3QuicheAcceptor::bind returned no acceptor")
})?;
Ok(Self { inner })
}
pub fn endpoint(&self) -> quiche_h3::H3QuicheEndpoint {
self.inner.endpoint()
}
}
impl H3Acceptor for H3QuicheAcceptor {
type CONN = quiche_h3::Connection<Bytes>;
type OS = quiche_h3::StreamOpener<Bytes>;
type SS = quiche_h3::H3SendStream<Bytes>;
type RS = quiche_h3::H3RecvStream<Bytes>;
type BS = quiche_h3::H3Stream<Bytes>;
async fn accept(&mut self) -> Result<Option<Self::CONN>, crate::Error> {
self.inner.accept().await
}
}