use std::{num::NonZeroUsize, time::Duration};
use super::fragment_overhead;
#[derive(Clone, Copy, Debug)]
pub struct FragmentationConfig {
pub fragment_payload_cap: NonZeroUsize,
pub max_message_size: NonZeroUsize,
pub reassembly_timeout: Duration,
}
const ENVELOPE_GUARD_BYTES: usize = 32;
impl FragmentationConfig {
#[must_use]
pub fn for_frame_budget(
frame_budget: usize,
max_message_size: NonZeroUsize,
reassembly_timeout: Duration,
) -> Option<Self> {
let overhead = fragment_overhead().get();
if frame_budget <= overhead {
return None;
}
let available = frame_budget.saturating_sub(overhead + ENVELOPE_GUARD_BYTES);
if available == 0 {
return None;
}
Some(Self {
fragment_payload_cap: NonZeroUsize::new(available)?,
max_message_size,
reassembly_timeout,
})
}
#[must_use]
pub fn encoded_fragment_ceiling(&self) -> usize {
self.fragment_payload_cap.get() + fragment_overhead().get()
}
}