use std::collections::HashMap;
use crate::caps::PEX_DEFAULT_INTERVAL;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum RecvPhase {
AwaitingHandshake,
AwaitingSnapshot,
Streaming,
}
#[derive(Debug, Clone)]
pub struct LinkState {
pub handshake_sent: bool,
pub snapshot_sent: bool,
pub told: HashMap<String, u64>,
pub last_data_send_ms: Option<u64>,
pub send_jitter_ms: u64,
pub self_interval_secs: u32,
pub last_backoff_applied_ms: Option<u64>,
pub phase: RecvPhase,
pub remote_declared_secs: Option<u32>,
pub last_arrival_ms: Option<u64>,
pub strikes: u32,
pub muted: bool,
pub received: HashMap<String, u64>,
}
impl LinkState {
#[must_use]
pub fn new(self_interval_secs: u32) -> Self {
LinkState {
handshake_sent: false,
snapshot_sent: false,
told: HashMap::new(),
last_data_send_ms: None,
send_jitter_ms: 0,
self_interval_secs,
last_backoff_applied_ms: None,
phase: RecvPhase::AwaitingHandshake,
remote_declared_secs: None,
last_arrival_ms: None,
strikes: 0,
muted: false,
received: HashMap::new(),
}
}
}
impl Default for LinkState {
fn default() -> Self {
LinkState::new(PEX_DEFAULT_INTERVAL)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fresh_link_starts_awaiting_handshake() {
let l = LinkState::new(60);
assert_eq!(l.phase, RecvPhase::AwaitingHandshake);
assert!(!l.handshake_sent);
assert!(!l.snapshot_sent);
assert!(!l.muted);
assert_eq!(l.strikes, 0);
assert!(l.told.is_empty());
assert!(l.received.is_empty());
assert_eq!(l.self_interval_secs, 60);
assert_eq!(l.last_backoff_applied_ms, None);
}
#[test]
fn default_uses_default_interval() {
assert_eq!(
LinkState::default().self_interval_secs,
PEX_DEFAULT_INTERVAL
);
}
}