use crate::{
path::secret,
psk::io::{
HandshakeQueueConfig, Result, DEFAULT_IDLE_TIMEOUT, DEFAULT_MAX_DATA, DEFAULT_MTU,
DEFAULT_PTO_JITTER_PERCENTAGE,
},
};
use s2n_quic::{
provider::{event::Subscriber as Sub, tls::Provider as Prov},
server::Name,
};
use std::{net::SocketAddr, time::Duration};
use super::Provider;
pub struct Builder<
Event: s2n_quic::provider::event::Subscriber = s2n_quic::provider::event::default::Subscriber,
> {
#[allow(dead_code)]
pub(crate) event_subscriber: Event,
pub(crate) data_window: u64,
pub(crate) mtu: u16,
pub(crate) max_idle_timeout: Duration,
pub(crate) pto_jitter_percentage: u8,
pub(crate) handshake_queue: HandshakeQueueConfig,
}
impl Default for Builder<s2n_quic::provider::event::default::Subscriber> {
fn default() -> Self {
Self {
event_subscriber: Default::default(),
data_window: DEFAULT_MAX_DATA,
mtu: DEFAULT_MTU,
max_idle_timeout: DEFAULT_IDLE_TIMEOUT,
pto_jitter_percentage: DEFAULT_PTO_JITTER_PERCENTAGE,
handshake_queue: Default::default(),
}
}
}
impl<Event: s2n_quic::provider::event::Subscriber> Builder<Event> {
pub fn with_event_subscriber<E: s2n_quic::provider::event::Subscriber>(
self,
event_subscriber: E,
) -> Builder<E> {
Builder {
event_subscriber,
data_window: self.data_window,
mtu: self.mtu,
max_idle_timeout: self.max_idle_timeout,
pto_jitter_percentage: self.pto_jitter_percentage,
handshake_queue: self.handshake_queue,
}
}
pub fn with_data_window(mut self, data_window: u64) -> Self {
self.data_window = data_window;
self
}
pub fn with_mtu(mut self, mtu: u16) -> Self {
self.mtu = mtu;
self
}
pub fn with_max_idle_timeout(mut self, timeout: Duration) -> Self {
self.max_idle_timeout = timeout;
self
}
pub fn with_pto_jitter_percentage(mut self, pto_jitter_percentage: u8) -> Self {
self.pto_jitter_percentage = pto_jitter_percentage;
self
}
pub fn with_success_jitter(mut self, period: Duration) -> Self {
self.handshake_queue.success_jitter = period;
self
}
#[doc(hidden)]
pub fn with_handshake_start_limit(mut self, limit: usize) -> Self {
self.handshake_queue.start_limit = limit;
self
}
#[doc(hidden)]
pub fn with_handshake_inflight_limit(mut self, limit: usize) -> Self {
self.handshake_queue.inflight_limit = limit;
self
}
pub fn start<
TlsProvider: Prov + Send + Sync + 'static,
Subscriber: Sub + Send + Sync + 'static,
>(
self,
addr: SocketAddr,
map: secret::Map,
tls_materials_provider: TlsProvider,
subscriber: Subscriber,
server_name: Name,
) -> Result<Provider> {
Provider::new::<TlsProvider, Subscriber, Event>(
addr,
map,
tls_materials_provider,
subscriber,
self,
server_name,
)
}
}