//! SSH session commands for the main window (terminal). use super::{envelope, main_core, text, CommandResult}; use crate::core::app::CoreSlot; use serde_json::{json, Value}; use tauri::{State, Webview}; #[tauri::command] pub async fn core_ssh_list(webview: Webview, slot: State<'_, CoreSlot>) -> CommandResult { Ok(Value::Array(main_core(&webview, &slot)?.services.sessions.list())) } #[tauri::command] pub async fn core_ssh_connect(webview: Webview, slot: State<'_, CoreSlot>, payload: Option) -> CommandResult { let core = main_core(&webview, &slot)?; let payload = super::payload(payload); Ok(envelope(core.services.sessions.connect(&payload).await, "SSH_OPERATION_FAILED", None)) } #[tauri::command] pub async fn core_ssh_trust_host_key(webview: Webview, slot: State<'_, CoreSlot>, payload: Option) -> CommandResult { let core = main_core(&webview, &slot)?; let payload = super::payload(payload); Ok(envelope(core.services.sessions.trust_pending(&payload), "SSH_OPERATION_FAILED", None)) } #[tauri::command] pub async fn core_ssh_disconnect(webview: Webview, slot: State<'_, CoreSlot>, payload: Option) -> CommandResult { let core = main_core(&webview, &slot)?; let payload = super::payload(payload); Ok(envelope(Ok(core.services.sessions.disconnect(text(&payload, "sessionId"), "user").await), "SSH_OPERATION_FAILED", None)) } #[tauri::command] pub async fn core_ssh_resize(webview: Webview, slot: State<'_, CoreSlot>, payload: Option) -> CommandResult { let core = main_core(&webview, &slot)?; let payload = super::payload(payload); Ok(envelope(core.services.sessions.resize(text(&payload, "sessionId"), payload.get("cols"), payload.get("rows")), "SSH_OPERATION_FAILED", None)) } /// Synchronous on purpose: Tauri runs sync commands in IPC order, so keystrokes stay ordered. #[tauri::command] pub fn core_ssh_input(webview: Webview, slot: State<'_, CoreSlot>, payload: Option) -> CommandResult { let core = main_core(&webview, &slot)?; let payload = super::payload(payload); let data = payload.get("data").map(|d| d.as_str().map(str::to_string).unwrap_or_else(|| if d.is_null() { String::new() } else { d.to_string() })).unwrap_or_default(); if let Err(error) = core.services.sessions.write(text(&payload, "sessionId"), &data) { core.logger.warn("IPC event was rejected.", json!({ "channel": "ssh:input", "message": error.message, "code": error.code })); } Ok(Value::Null) }