use std::sync::Arc;
use parking_lot::RwLock;
use crate::config::PtyConfig;
use crate::pty::{PtyManager, PtySessionInfo, PtySize};
pub type SharedPtyConfig = Arc<RwLock<PtyConfig>>;
pub struct PtyApi {
pub manager: Arc<PtyManager>,
pub config: SharedPtyConfig,
}
impl PtyApi {
pub fn new(config: SharedPtyConfig) -> Self {
let manager = Arc::new(PtyManager::new(Arc::clone(&config)));
Self { manager, config }
}
pub fn config_snapshot(&self) -> PtyConfig {
self.config.read().clone()
}
pub fn is_enabled(&self) -> bool {
self.config.read().enabled
}
pub fn open(
&self,
principal: &str,
shell: Option<String>,
size: PtySize,
) -> Result<crate::pty::PtySessionId, crate::pty::PtyError> {
let s = self.manager.open(principal, shell, size)?;
Ok(s.id.clone())
}
pub fn attach(
&self,
principal: &str,
session_id: &str,
) -> Result<crate::pty::PtySessionId, crate::pty::PtyError> {
let s = self.manager.attach(principal, session_id)?;
Ok(s.id.clone())
}
pub fn write(&self, session_id: &str, bytes: &[u8]) -> Result<(), crate::pty::PtyError> {
self.manager.write(session_id, bytes)
}
pub fn resize(
&self,
session_id: &str,
cols: u16,
rows: u16,
) -> Result<(), crate::pty::PtyError> {
self.manager.resize(session_id, cols, rows)
}
pub fn try_clone_reader(
&self,
session_id: &str,
) -> Result<Box<dyn std::io::Read + Send>, crate::pty::PtyError> {
self.manager.try_clone_reader(session_id)
}
pub fn mark_attached(&self, session_id: &str) -> bool {
self.manager.mark_attached(session_id)
}
pub fn mark_detached(&self, session_id: &str) -> bool {
self.manager.mark_detached(session_id)
}
pub fn close(&self, session_id: &str) -> Result<(), crate::pty::PtyError> {
self.manager.close(session_id)
}
pub fn list_sessions(&self, principal: &str) -> Vec<PtySessionInfo> {
self.manager.list_sessions(principal)
}
pub fn start_gc(&self) -> tokio::task::JoinHandle<()> {
Arc::clone(&self.manager).start_gc()
}
}