use std::{collections::HashSet, result::Result, sync::Arc};
use bytes::Buf;
use tokio::sync::mpsc;
use crate::{
config::Config,
connection::ConnectionInner,
error::ConnectionError,
quic::{self},
shared_state::SharedState,
};
use super::connection::Connection;
pub fn builder() -> Builder {
Builder::new()
}
pub struct Builder {
pub(crate) config: Config,
}
impl Builder {
pub(super) fn new() -> Self {
Builder {
config: Default::default(),
}
}
#[doc(hidden)]
#[cfg(test)]
pub fn send_settings(&mut self, value: bool) -> &mut Self {
self.config.send_settings = value;
self
}
pub fn max_field_section_size(&mut self, value: u64) -> &mut Self {
self.config.settings.max_field_section_size = value;
self
}
#[inline]
pub fn send_grease(&mut self, value: bool) -> &mut Self {
self.config.send_grease = value;
self
}
#[inline]
pub fn enable_webtransport(&mut self, value: bool) -> &mut Self {
self.config.settings.enable_webtransport = value;
self
}
pub fn enable_extended_connect(&mut self, value: bool) -> &mut Self {
self.config.settings.enable_extended_connect = value;
self
}
pub fn max_webtransport_sessions(&mut self, value: u64) -> &mut Self {
self.config.settings.max_webtransport_sessions = value;
self
}
pub fn enable_datagram(&mut self, value: bool) -> &mut Self {
self.config.settings.enable_datagram = value;
self
}
}
impl Builder {
pub async fn build<C, B>(&self, conn: C) -> Result<Connection<C, B>, ConnectionError>
where
C: quic::Connection<B>,
B: Buf,
{
let (sender, receiver) = mpsc::unbounded_channel();
let shared = SharedState::default();
Ok(Connection {
inner: ConnectionInner::new(conn, Arc::new(shared), self.config).await?,
max_field_section_size: self.config.settings.max_field_section_size,
request_end_send: sender,
request_end_recv: receiver,
ongoing_streams: HashSet::new(),
sent_closing: None,
recv_closing: None,
last_accepted_stream: None,
})
}
}