use std::time::{Duration, Instant};
use quiche::ConnectionId;
pub(crate) fn min_of_some<T: Ord>(v1: Option<T>, v2: Option<T>) -> Option<T> {
match (v1, v2) {
(Some(a), Some(b)) => Some(a.min(b)),
(Some(v), _) | (_, Some(v)) => Some(v),
(None, None) => None,
}
}
pub(crate) fn delay_send(
conn: &quiche::Connection,
now: Instant,
release_timer_threshold: Duration,
send_done: bool,
) -> Option<Instant> {
let release_time = conn
.get_next_release_time()
.and_then(|release| release.time(now));
let release_time = if send_done {
min_of_some(conn.timeout_instant(), release_time)
} else {
if release_time.is_some() {
min_of_some(conn.timeout_instant(), release_time)
} else {
None
}
};
let release_time = release_time.filter(|time| {
time.checked_duration_since(now).unwrap_or_default() > release_timer_threshold
});
log::trace!(
"id={}, next_release_time={:?}",
conn.trace_id(),
release_time
);
release_time
}
pub(crate) fn release_time(
conn: &quiche::Connection,
now: Instant,
release_timer_threshold: Duration,
) -> Option<Instant> {
conn.get_next_release_time()
.and_then(|release| release.time(now))
.filter(|time| {
time.checked_duration_since(now).unwrap_or_default() > release_timer_threshold
})
}
pub(crate) fn random_conn_id() -> ConnectionId<'static> {
let mut buf = vec![0; 20];
boring::rand::rand_bytes(&mut buf).unwrap();
ConnectionId::from_vec(buf)
}