use std::collections::{HashMap, HashSet, VecDeque};
use super::{
scheduler::{PauseReason, Tracker},
ConnectionEvents,
};
pub struct Graveyard {
connections: HashMap<String, SavedState>,
}
impl Graveyard {
pub fn new() -> Graveyard {
Graveyard {
connections: HashMap::new(),
}
}
pub fn retrieve(&mut self, id: &str) -> Option<SavedState> {
self.connections.remove(id)
}
pub fn save_state(
&mut self,
mut tracker: Tracker,
subscriptions: HashSet<String>,
metrics: ConnectionEvents,
unacked_pubrels: VecDeque<u16>,
) {
tracker.pause(PauseReason::Busy);
let id = tracker.id.clone();
let session_state = SessionState {
tracker,
subscriptions,
unacked_pubrels,
};
self.connections.insert(
id,
SavedState {
session_state: Some(session_state),
metrics,
},
);
}
pub fn save_metrics(&mut self, id: String, metrics: ConnectionEvents) {
self.connections.insert(
id,
SavedState {
session_state: None,
metrics,
},
);
}
}
#[derive(Debug)]
pub struct SavedState {
pub session_state: Option<SessionState>,
pub metrics: ConnectionEvents,
}
#[derive(Debug)]
pub struct SessionState {
pub tracker: Tracker,
pub subscriptions: HashSet<String>,
pub unacked_pubrels: VecDeque<u16>,
}