//! 代理服务业务逻辑层 //! //! 提供代理服务器的启动、停止和配置管理 use crate::database::Database; use crate::proxy::server::ProxyServer; use crate::proxy::types::*; use std::sync::Arc; use tokio::sync::RwLock; #[derive(Clone)] pub struct ProxyService { db: Arc, server: Arc>>, } impl ProxyService { pub fn new(db: Arc) -> Self { Self { db, server: Arc::new(RwLock::new(None)), } } /// 启动代理服务器 pub async fn start(&self) -> Result { // 1. 获取配置 let config = self .db .get_proxy_config() .await .map_err(|e| format!("获取代理配置失败: {e}"))?; // 2. 检查是否启用 if !config.enabled { return Err("代理服务未启用,请先在设置中启用".to_string()); } // 3. 检查是否已在运行 if self.server.read().await.is_some() { return Err("代理服务已在运行中".to_string()); } // 4. 创建并启动服务器 let server = ProxyServer::new(config, self.db.clone()); let info = server .start() .await .map_err(|e| format!("启动代理服务器失败: {e}"))?; // 5. 保存服务器实例 *self.server.write().await = Some(server); log::info!("代理服务器已启动: {}:{}", info.address, info.port); Ok(info) } /// 停止代理服务器 pub async fn stop(&self) -> Result<(), String> { if let Some(server) = self.server.write().await.take() { server .stop() .await .map_err(|e| format!("停止代理服务器失败: {e}"))?; log::info!("代理服务器已停止"); Ok(()) } else { Err("代理服务器未运行".to_string()) } } /// 获取服务器状态 pub async fn get_status(&self) -> Result { if let Some(server) = self.server.read().await.as_ref() { Ok(server.get_status().await) } else { // 服务器未运行时返回默认状态 Ok(ProxyStatus { running: false, ..Default::default() }) } } /// 获取代理配置 pub async fn get_config(&self) -> Result { self.db .get_proxy_config() .await .map_err(|e| format!("获取代理配置失败: {e}")) } /// 更新代理配置 pub async fn update_config(&self, config: &ProxyConfig) -> Result<(), String> { // 记录旧配置用于判定是否需要重启 let previous = self .db .get_proxy_config() .await .map_err(|e| format!("获取代理配置失败: {e}"))?; // 保存到数据库 self.db .update_proxy_config(config.clone()) .await .map_err(|e| format!("保存代理配置失败: {e}"))?; // 检查服务器当前状态 let mut server_guard = self.server.write().await; if server_guard.is_none() { return Ok(()); } // 如果关闭代理,直接停止 if !config.enabled { if let Some(server) = server_guard.take() { server .stop() .await .map_err(|e| format!("停止代理服务器失败: {e}"))?; log::info!("代理配置禁用了服务,已自动停止代理服务器"); } return Ok(()); } let require_restart = config.listen_address != previous.listen_address || config.listen_port != previous.listen_port; if require_restart { if let Some(server) = server_guard.take() { server .stop() .await .map_err(|e| format!("重启前停止代理服务器失败: {e}"))?; } let new_server = ProxyServer::new(config.clone(), self.db.clone()); new_server .start() .await .map_err(|e| format!("重启代理服务器失败: {e}"))?; *server_guard = Some(new_server); log::info!("代理配置已更新,服务器已自动重启应用最新配置"); } else if let Some(server) = server_guard.as_ref() { server.apply_runtime_config(config).await; log::info!("代理配置已实时应用,无需重启代理服务器"); } Ok(()) } /// 检查服务器是否正在运行 pub async fn is_running(&self) -> bool { self.server.read().await.is_some() } }