From 453c2307163c93208b4a9dc030006a77cb59b97a Mon Sep 17 00:00:00 2001 From: GyDi <zzzgydi@gmail.com> Date: Sat, 14 Jan 2023 11:45:47 +0800 Subject: [PATCH] feat: recover core after panic, close #353 --- src-tauri/src/core/core.rs | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src-tauri/src/core/core.rs b/src-tauri/src/core/core.rs index e4e090e..cfce65e 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")] -- GitLab