use std::time::Duration;
use super::msg::MAX_MSG_LENGTH;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[non_exhaustive]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum PortsExhausted {
Fail,
Wait(Option<Duration>),
}
#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Cfg {
pub connection_timeout: Option<Duration>,
pub max_ports: u32,
pub ports_exhausted: PortsExhausted,
pub max_data_size: usize,
pub max_received_ports: usize,
pub chunk_size: u32,
pub receive_buffer: u32,
pub shared_send_queue: usize,
pub transport_send_queue: usize,
pub transport_receive_queue: usize,
pub connect_queue: u16,
pub flush_delay: Duration,
#[doc(hidden)]
pub _non_exhaustive: (),
}
impl Default for Cfg {
fn default() -> Self {
Self {
connection_timeout: Some(Duration::from_secs(60)),
max_ports: 16_384,
ports_exhausted: PortsExhausted::Wait(Some(Duration::from_secs(60))),
max_data_size: 524_288,
max_received_ports: 128,
chunk_size: 16_384,
receive_buffer: 524_288,
shared_send_queue: 16,
transport_send_queue: 16,
transport_receive_queue: 16,
connect_queue: 128,
flush_delay: Duration::from_millis(20),
_non_exhaustive: (),
}
}
}
impl Cfg {
pub(crate) fn check(&self) {
if self.max_ports > 2u32.pow(31) {
panic!("maximum ports must not exceed 2^31");
}
if self.chunk_size < 4 {
panic!("chunk size must be at least 4");
}
if self.receive_buffer < 4 {
panic!("receive buffer must be at least 4 bytes");
}
if self.shared_send_queue == 0 {
panic!("shared send queue length must not be zero");
}
if self.transport_send_queue == 0 {
panic!("transport send queue length must not be zero");
}
if self.transport_receive_queue == 0 {
panic!("transport receive queue length must not be zero");
}
if self.connect_queue == 0 {
panic!("connect queue length must not be zero");
}
}
pub fn max_frame_length(&self) -> u32 {
(MAX_MSG_LENGTH as u32).checked_add(self.chunk_size).expect("maximum frame size exceeds u32::MAX")
}
pub fn balanced() -> Self {
Self::default()
}
pub fn compact() -> Self {
Self {
shared_send_queue: 1,
transport_receive_queue: 1,
transport_send_queue: 1,
receive_buffer: 16_384,
chunk_size: 4096,
..Default::default()
}
}
pub fn throughput() -> Self {
Self {
shared_send_queue: 64,
transport_receive_queue: 64,
transport_send_queue: 64,
receive_buffer: 1_048_576,
chunk_size: 32_768,
..Default::default()
}
}
}