use tauri::State; use crate::modules::cloudflared::{CloudflaredConfig, CloudflaredManager, CloudflaredStatus}; use std::sync::Arc; use tokio::sync::RwLock; /// Cloudflared服务状态管理 #[derive(Clone)] pub struct CloudflaredState { pub manager: Arc>>, } impl CloudflaredState { pub fn new() -> Self { Self { manager: Arc::new(RwLock::new(None)), } } /// 确保管理器已初始化 pub async fn ensure_manager(&self) -> Result<(), String> { let mut lock = self.manager.write().await; if lock.is_none() { let data_dir = crate::modules::account::get_data_dir()?; *lock = Some(CloudflaredManager::new(&data_dir)); } Ok(()) } } /// 检查cloudflared是否已安装 #[tauri::command] pub async fn cloudflared_check( state: State<'_, CloudflaredState>, ) -> Result { state.ensure_manager().await?; let lock = state.manager.read().await; if let Some(manager) = lock.as_ref() { let (installed, version) = manager.check_installed().await; Ok(CloudflaredStatus { installed, version, running: false, url: None, error: None, }) } else { Err("Manager not initialized".to_string()) } } /// 安装cloudflared #[tauri::command] pub async fn cloudflared_install( state: State<'_, CloudflaredState>, ) -> Result { state.ensure_manager().await?; let lock = state.manager.read().await; if let Some(manager) = lock.as_ref() { manager.install().await } else { Err("Manager not initialized".to_string()) } } /// 启动cloudflared隧道 #[tauri::command] pub async fn cloudflared_start( state: State<'_, CloudflaredState>, config: CloudflaredConfig, ) -> Result { state.ensure_manager().await?; let lock = state.manager.read().await; if let Some(manager) = lock.as_ref() { manager.start(config).await } else { Err("Manager not initialized".to_string()) } } /// 停止cloudflared隧道 #[tauri::command] pub async fn cloudflared_stop( state: State<'_, CloudflaredState>, ) -> Result { state.ensure_manager().await?; let lock = state.manager.read().await; if let Some(manager) = lock.as_ref() { manager.stop().await } else { Err("Manager not initialized".to_string()) } } /// 获取cloudflared状态 #[tauri::command] pub async fn cloudflared_get_status( state: State<'_, CloudflaredState>, ) -> Result { state.ensure_manager().await?; let lock = state.manager.read().await; if let Some(manager) = lock.as_ref() { let (installed, version) = manager.check_installed().await; let mut status = manager.get_status().await; status.installed = installed; status.version = version; if !installed { status.running = false; status.url = None; } Ok(status) } else { Ok(CloudflaredStatus::default()) } }