mirror of
https://github.com/farion1231/cc-switch.git
synced 2026-07-30 02:14:43 +08:00
feat(proxy): sync UI when failover succeeds
Add FailoverSwitchManager to handle provider switching after successful failover. This ensures the UI reflects the actual provider in use: - Create failover_switch.rs with deduplication and async switching logic - Pass AppHandle through ProxyService -> ProxyServer -> RequestForwarder - Update is_current in database when failover succeeds - Emit provider-switched event for frontend refresh - Update tray menu and live backup synchronously The switching runs asynchronously via tokio::spawn to avoid blocking API responses while still providing immediate UI feedback.
This commit is contained in:
@@ -17,6 +17,8 @@ use tokio::sync::RwLock;
|
||||
pub struct ProxyService {
|
||||
db: Arc<Database>,
|
||||
server: Arc<RwLock<Option<ProxyServer>>>,
|
||||
/// AppHandle,用于传递给 ProxyServer 以支持故障转移时的 UI 更新
|
||||
app_handle: Arc<RwLock<Option<tauri::AppHandle>>>,
|
||||
}
|
||||
|
||||
impl ProxyService {
|
||||
@@ -24,9 +26,17 @@ impl ProxyService {
|
||||
Self {
|
||||
db,
|
||||
server: Arc::new(RwLock::new(None)),
|
||||
app_handle: Arc::new(RwLock::new(None)),
|
||||
}
|
||||
}
|
||||
|
||||
/// 设置 AppHandle(在应用初始化时调用)
|
||||
pub fn set_app_handle(&self, handle: tauri::AppHandle) {
|
||||
futures::executor::block_on(async {
|
||||
*self.app_handle.write().await = Some(handle);
|
||||
});
|
||||
}
|
||||
|
||||
/// 启动代理服务器
|
||||
pub async fn start(&self) -> Result<ProxyServerInfo, String> {
|
||||
// 1. 获取配置
|
||||
@@ -45,7 +55,8 @@ impl ProxyService {
|
||||
}
|
||||
|
||||
// 4. 创建并启动服务器
|
||||
let server = ProxyServer::new(config.clone(), self.db.clone());
|
||||
let app_handle = self.app_handle.read().await.clone();
|
||||
let server = ProxyServer::new(config.clone(), self.db.clone(), app_handle);
|
||||
let info = server
|
||||
.start()
|
||||
.await
|
||||
@@ -682,7 +693,8 @@ impl ProxyService {
|
||||
.map_err(|e| format!("重启前停止代理服务器失败: {e}"))?;
|
||||
}
|
||||
|
||||
let new_server = ProxyServer::new(new_config, self.db.clone());
|
||||
let app_handle = self.app_handle.read().await.clone();
|
||||
let new_server = ProxyServer::new(new_config, self.db.clone(), app_handle);
|
||||
new_server
|
||||
.start()
|
||||
.await
|
||||
|
||||
Reference in New Issue
Block a user