use crate::envelope::{WireEnvelope, ENVELOPE_SCHEMA_VERSION};
use std::collections::VecDeque;
#[derive(Default)]
pub struct OutboundQueue {
queue: VecDeque<WireEnvelope>,
cap: Option<usize>,
dropped_since_last_drain: usize,
}
impl OutboundQueue {
pub fn new() -> Self {
Self::default()
}
pub fn with_cap(cap: Option<usize>) -> Self {
Self {
queue: VecDeque::new(),
cap,
dropped_since_last_drain: 0,
}
}
pub fn set_cap(&mut self, cap: Option<usize>) {
self.cap = cap;
}
pub fn push(&mut self, mut env: WireEnvelope) {
if env.schema_version == 0 {
env.schema_version = ENVELOPE_SCHEMA_VERSION;
}
if let Some(cap) = self.cap {
while self.queue.len() >= cap {
self.queue.pop_front();
self.dropped_since_last_drain += 1;
}
}
self.queue.push_back(env);
}
pub fn drain_all(&mut self) -> Vec<WireEnvelope> {
self.queue.drain(..).collect()
}
pub fn take_dropped_count(&mut self) -> usize {
std::mem::take(&mut self.dropped_since_last_drain)
}
pub fn len(&self) -> usize {
self.queue.len()
}
pub fn is_empty(&self) -> bool {
self.queue.is_empty()
}
pub fn iter_for_snapshot(&self) -> impl Iterator<Item = &WireEnvelope> {
self.queue.iter()
}
}