diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index e4e090e84439d3839269b6cd7ac557ed253054ea..cfce65e5a264ad40a9f6b73dde2ce5b1c0437830 100644 --- a/src-tauri/src/core/core.rs +++ b/src-tauri/src/core/core.rs @@ -161,6 +161,7 @@ impl CoreManager { let mut sidecar = self.sidecar.lock(); *sidecar = Some(cmd_child); + drop(sidecar); tauri::async_runtime::spawn(async move { while let Some(event) = rx.recv().await { @@ -181,6 +182,7 @@ impl CoreManager { } CommandEvent::Terminated(_) => { log::info!(target: "app", "clash core terminated"); + let _ = CoreManager::global().recover_core(); break; } _ => {} @@ -191,6 +193,37 @@ impl CoreManager { Ok(()) } + /// é‡å¯å†…æ ¸ + pub fn recover_core(&'static self) -> Result<()> { + // æœåŠ¡æ¨¡å¼ä¸ç®¡ + #[cfg(target_os = "windows")] + if *self.use_service_mode.lock() { + return Ok(()); + } + + // 清空原æ¥çš„sidecar值 + if let Some(sidecar) = self.sidecar.lock().take() { + let _ = sidecar.kill(); + } + + tauri::async_runtime::spawn(async move { + // 6秒之åŽå†æŸ¥çœ‹æœåŠ¡æ˜¯å¦æ£å¸¸ (时间éšä¾¿æžçš„) + // terminated å¯èƒ½æ˜¯åˆ‡æ¢å†…æ ¸ (切æ¢å†…æ ¸å·²ç»æœ‰500ms的延迟) + sleep(Duration::from_millis(6666)).await; + + if self.sidecar.lock().is_none() { + log::info!(target: "app", "recover clash core"); + + // é‡æ–°å¯åŠ¨app + if let Err(_) = self.run_core().await { + let _ = self.recover_core(); + } + } + }); + + Ok(()) + } + /// åœæ¢æ ¸å¿ƒè¿è¡Œ pub fn stop_core(&self) -> Result<()> { #[cfg(target_os = "windows")]