use std::collections::VecDeque;
use std::sync::{Arc, Mutex as StdMutex};
use bytes::Bytes;
use portable_pty::{Child, MasterPty};
use tokio::sync::{broadcast, mpsc, Mutex};
use crate::graph::TerminalGraphHandles;
use crate::types::SessionMeta;
pub(crate) const OUT_BROADCAST_CAPACITY: usize = 256;
pub(crate) const IN_MPSC_CAPACITY: usize = 64;
pub(crate) struct Session {
pub(crate) meta: SessionMeta,
pub(crate) out_anchor: broadcast::Receiver<Bytes>,
pub(crate) replay: Arc<StdMutex<VecDeque<Bytes>>>,
pub(crate) in_tx: mpsc::Sender<Bytes>,
pub(crate) master: Arc<Mutex<Box<dyn MasterPty + Send>>>,
pub(crate) child: Arc<Mutex<Box<dyn Child + Send + Sync>>>,
pub(crate) graph_handles: Option<TerminalGraphHandles>,
}
impl Session {
pub(crate) fn attach_snapshot(&self) -> (Vec<Bytes>, broadcast::Receiver<Bytes>) {
let buf = self.replay.lock().expect("replay mutex poisoned");
let snapshot: Vec<Bytes> = buf.iter().cloned().collect();
let rx = self.out_anchor.resubscribe();
(snapshot, rx)
}
}