From 86cada4cffc0b9a3be8265a9e62d6f146901d1a0 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Sat, 29 Aug 2026 19:57:01 +0800 Subject: [PATCH] feat!: remove signal crate --- Cargo.lock | 10 --- Cargo.toml | 12 ++- crates/clash-verge-signal/Cargo.toml | 13 ---- crates/clash-verge-signal/src/lib.rs | 96 ------------------------ crates/clash-verge-signal/src/unix.rs | 73 ------------------ crates/clash-verge-signal/src/windows.rs | 83 -------------------- src-tauri/Cargo.toml | 10 ++- src-tauri/src/feat/window.rs | 4 +- src-tauri/src/lib.rs | 1 - src-tauri/src/utils/resolve/mod.rs | 6 -- 10 files changed, 16 insertions(+), 292 deletions(-) delete mode 100644 crates/clash-verge-signal/Cargo.toml delete mode 100644 crates/clash-verge-signal/src/lib.rs delete mode 100644 crates/clash-verge-signal/src/unix.rs delete mode 100644 crates/clash-verge-signal/src/windows.rs diff --git a/Cargo.lock b/Cargo.lock index 1ec0adf66..850792304 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1119,7 +1119,6 @@ dependencies = [ "clash-verge-limiter", "clash-verge-logging", "clash-verge-media-unlock", - "clash-verge-signal", "clash_verge_logger", "clash_verge_service_ipc", "compact_str", @@ -1234,15 +1233,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "clash-verge-signal" -version = "0.1.0" -dependencies = [ - "clash-verge-logging", - "log", - "tokio", -] - [[package]] name = "clash_verge_logger" version = "0.2.2" diff --git a/Cargo.toml b/Cargo.toml index 72fe7b772..61aac3b72 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,7 +4,6 @@ members = [ "crates/clash-verge-draft", "crates/clash-verge-media-unlock", "crates/clash-verge-logging", - "crates/clash-verge-signal", "crates/tauri-plugin-clash-verge-sysinfo", "crates/clash-verge-i18n", "crates/clash-verge-limiter", @@ -50,7 +49,6 @@ split-debuginfo = "unpacked" clash-verge-draft = { path = "crates/clash-verge-draft" } clash-verge-media-unlock = { path = "crates/clash-verge-media-unlock" } clash-verge-logging = { path = "crates/clash-verge-logging" } -clash-verge-signal = { path = "crates/clash-verge-signal" } clash-verge-i18n = { path = "crates/clash-verge-i18n" } clash-verge-limiter = { path = "crates/clash-verge-limiter" } tauri-plugin-clash-verge-sysinfo = { path = "crates/tauri-plugin-clash-verge-sysinfo" } @@ -70,7 +68,13 @@ tokio = { version = "1.53.1", features = [ flexi_logger = "0.31.10" log = "0.4.33" regex = "1.13.1" -reqwest = { version = "0.13.4", features = ["json", "cookies", "gzip", "rustls", "form"] } +reqwest = { version = "0.13.4", features = [ + "json", + "cookies", + "gzip", + "rustls", + "form", +] } rust_iso3166 = "0.2.0" smartstring = { version = "1.0.1" } @@ -92,7 +96,7 @@ windows-sys = { version = "0.61.2", features = [ "Win32_Security_Authorization", "Win32_Storage_FileSystem", "Win32_System_Threading", - "Win32_System_JobObjects" + "Win32_System_JobObjects", ] } # ********************************* diff --git a/crates/clash-verge-signal/Cargo.toml b/crates/clash-verge-signal/Cargo.toml deleted file mode 100644 index f8a03ac48..000000000 --- a/crates/clash-verge-signal/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -name = "clash-verge-signal" -version = "0.1.0" -edition = "2024" -rust-version = "1.91" - -[dependencies] -clash-verge-logging = { workspace = true } -log = { workspace = true } -tokio = { workspace = true, features = ["signal"] } - -[lints] -workspace = true diff --git a/crates/clash-verge-signal/src/lib.rs b/crates/clash-verge-signal/src/lib.rs deleted file mode 100644 index 60511d960..000000000 --- a/crates/clash-verge-signal/src/lib.rs +++ /dev/null @@ -1,96 +0,0 @@ -use std::sync::{ - OnceLock, - atomic::{AtomicBool, Ordering}, -}; - -use clash_verge_logging::{Type, logging}; - -#[cfg(unix)] -mod unix; -#[cfg(windows)] -mod windows; - -pub(crate) static RUNTIME: OnceLock> = OnceLock::new(); -pub(crate) static SHUTDOWN_LATCH: ShutdownLatch = ShutdownLatch::new(); - -#[derive(Clone, Copy, Debug, Eq, PartialEq)] -pub enum ShutdownOutcome { - Committed, - Canceled, -} - -pub(crate) struct ShutdownLatch { - is_cleaning_up: AtomicBool, -} - -impl ShutdownLatch { - const fn new() -> Self { - Self { - is_cleaning_up: AtomicBool::new(false), - } - } - - fn try_begin(&self) -> bool { - self.is_cleaning_up - .compare_exchange(false, true, Ordering::AcqRel, Ordering::Acquire) - .is_ok() - } - - fn finish(&self, outcome: ShutdownOutcome) { - if matches!(outcome, ShutdownOutcome::Canceled) { - self.is_cleaning_up.store(false, Ordering::Release); - } - } -} - -pub fn register(f: F) -where - F: Fn() -> Fut + Send + Sync + 'static, - Fut: Future + Send + 'static, -{ - RUNTIME.get_or_init(|| match tokio::runtime::Runtime::new() { - Ok(rt) => Some(rt), - Err(e) => { - logging!( - info, - Type::SystemSignal, - "register shutdown signal failed, create tokio runtime error: {}", - e - ); - None - } - }); - - #[cfg(unix)] - unix::register(f); - - #[cfg(windows)] - windows::register(f); -} - -#[cfg(test)] -mod tests { - use super::{ShutdownLatch, ShutdownOutcome}; - - #[test] - fn canceled_shutdown_releases_latch_and_permits_next_attempt() { - let latch = ShutdownLatch::new(); - - assert!(latch.try_begin()); - assert!(!latch.try_begin()); - - latch.finish(ShutdownOutcome::Canceled); - - assert!(latch.try_begin()); - } - - #[test] - fn committed_shutdown_retains_latch_and_suppresses_repeats() { - let latch = ShutdownLatch::new(); - - assert!(latch.try_begin()); - latch.finish(ShutdownOutcome::Committed); - - assert!(!latch.try_begin()); - } -} diff --git a/crates/clash-verge-signal/src/unix.rs b/crates/clash-verge-signal/src/unix.rs deleted file mode 100644 index 1bba1e833..000000000 --- a/crates/clash-verge-signal/src/unix.rs +++ /dev/null @@ -1,73 +0,0 @@ -use clash_verge_logging::{Type, logging}; -use tokio::signal::unix::{SignalKind, signal}; - -use crate::{RUNTIME, SHUTDOWN_LATCH, ShutdownOutcome}; - -pub fn register(f: F) -where - F: Fn() -> Fut + Send + Sync + 'static, - Fut: Future + Send + 'static, -{ - if let Some(Some(rt)) = RUNTIME.get() { - rt.spawn(async move { - let mut sigterm = match signal(SignalKind::terminate()) { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register SIGTERM: {}", e); - return; - } - }; - let mut sigint = match signal(SignalKind::interrupt()) { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register SIGINT: {}", e); - return; - } - }; - let mut sighup = match signal(SignalKind::hangup()) { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register SIGHUP: {}", e); - return; - } - }; - - loop { - let signal_name; - tokio::select! { - _ = sigterm.recv() => { - signal_name = "SIGTERM"; - } - _ = sigint.recv() => { - signal_name = "SIGINT"; - } - _ = sighup.recv() => { - signal_name = "SIGHUP"; - } - else => { - break; - } - } - - if !SHUTDOWN_LATCH.try_begin() { - logging!( - info, - Type::SystemSignal, - "Already shutting down, ignoring repeated signal: {}", - signal_name - ); - continue; - } - logging!(info, Type::SystemSignal, "Caught signal {}", signal_name); - - SHUTDOWN_LATCH.finish(f().await); - } - }); - } else { - logging!( - error, - Type::SystemSignal, - "register shutdown signal failed, RUNTIME is not available" - ); - } -} diff --git a/crates/clash-verge-signal/src/windows.rs b/crates/clash-verge-signal/src/windows.rs deleted file mode 100644 index 836a59c35..000000000 --- a/crates/clash-verge-signal/src/windows.rs +++ /dev/null @@ -1,83 +0,0 @@ -use clash_verge_logging::{Type, logging}; -use tokio::signal::windows; - -use crate::{RUNTIME, SHUTDOWN_LATCH, ShutdownOutcome}; - -pub fn register(f: F) -where - F: Fn() -> Fut + Send + Sync + 'static, - Fut: Future + Send + 'static, -{ - if let Some(Some(rt)) = RUNTIME.get() { - rt.spawn(async move { - let mut ctrl_c = match windows::ctrl_c() { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register Ctrl+C: {}", e); - return; - } - }; - - let mut ctrl_close = match windows::ctrl_close() { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register Ctrl+Close: {}", e); - return; - } - }; - - let mut ctrl_shutdown = match windows::ctrl_shutdown() { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register Ctrl+Shutdown: {}", e); - return; - } - }; - - let mut ctrl_logoff = match windows::ctrl_logoff() { - Ok(s) => s, - Err(e) => { - logging!(error, Type::SystemSignal, "Failed to register Ctrl+Logoff: {}", e); - return; - } - }; - - loop { - let signal_name; - tokio::select! { - _ = ctrl_c.recv() => { - signal_name = "Ctrl+C"; - } - _ = ctrl_close.recv() => { - signal_name = "Ctrl+Close"; - } - _ = ctrl_shutdown.recv() => { - signal_name = "Ctrl+Shutdown"; - } - _ = ctrl_logoff.recv() => { - signal_name = "Ctrl+Logoff"; - } - } - - if !SHUTDOWN_LATCH.try_begin() { - logging!( - info, - Type::SystemSignal, - "Already shutting down, ignoring repeated signal: {}", - signal_name - ); - continue; - } - logging!(info, Type::SystemSignal, "Caught Windows signal: {}", signal_name); - - SHUTDOWN_LATCH.finish(f().await); - } - }); - } else { - logging!( - error, - Type::SystemSignal, - "register shutdown signal failed, RUNTIME is not available" - ); - } -} diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 077f22938..e1bf49648 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -17,7 +17,10 @@ crate-type = ["staticlib", "cdylib", "rlib"] [features] default = ["custom-protocol"] custom-protocol = ["tauri/custom-protocol"] -verge-dev = ["clash_verge_logger/color", "clash_verge_service_ipc/development-channel"] +verge-dev = [ + "clash_verge_logger/color", + "clash_verge_service_ipc/development-channel", +] dev-sidecar = ["verge-dev"] tauri-dev = [] tokio-trace = ["console-subscriber"] @@ -34,7 +37,6 @@ tauri-build = { version = "2.6.3", features = [] } clash-verge-draft = { workspace = true } clash-verge-media-unlock = { workspace = true } clash-verge-logging = { workspace = true } -clash-verge-signal = { workspace = true } clash-verge-i18n = { workspace = true } clash-verge-limiter = { workspace = true } tauri-plugin-clash-verge-sysinfo = { workspace = true } @@ -60,7 +62,9 @@ bitflags = { workspace = true } socket2 = { workspace = true } warp = { version = "0.4.3", features = ["server"] } open = "5.4.1" -rfd = { version = "0.16.0", default-features = false, features = ["common-controls-v6"] } +rfd = { version = "0.16.0", default-features = false, features = [ + "common-controls-v6", +] } dunce = "1.0.5" nanoid = "0.5" chrono = { workspace = true } diff --git a/src-tauri/src/feat/window.rs b/src-tauri/src/feat/window.rs index 5190e13f6..b17e7f3b8 100644 --- a/src-tauri/src/feat/window.rs +++ b/src-tauri/src/feat/window.rs @@ -110,7 +110,7 @@ pub async fn open_or_close_dashboard() { logging!(info, Type::Window, "Window toggle result: {result:?}"); } -pub async fn quit() -> clash_verge_signal::ShutdownOutcome { +pub async fn quit() { logging!(debug, Type::System, "启动退出流程"); // 设置退出标志 handle::Handle::global().set_is_exiting(); @@ -133,13 +133,11 @@ pub async fn quit() -> clash_verge_signal::ShutdownOutcome { "app_quit::core_stop_failed", cleanup_result.stop_error.unwrap_or_default(), ); - return clash_verge_signal::ShutdownOutcome::Canceled; } utils::server::shutdown_embedded_server(); let app_handle = handle::Handle::app_handle(); app_handle.exit(if cleanup_result.all_success { 0 } else { 1 }); - clash_verge_signal::ShutdownOutcome::Committed } pub async fn clean_async() -> CleanupResult { diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 2e50c0508..60d156fa4 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -302,7 +302,6 @@ pub fn run() -> std::process::ExitCode { if let Err(panic) = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { resolve::resolve_setup_async(); resolve::resolve_setup_sync(); - resolve::init_signal(); logging!(info, Type::Setup, "初始化已启动"); })) { log_setup_panic("window-core", panic); diff --git a/src-tauri/src/utils/resolve/mod.rs b/src-tauri/src/utils/resolve/mod.rs index 0c749288c..c0e27d945 100644 --- a/src-tauri/src/utils/resolve/mod.rs +++ b/src-tauri/src/utils/resolve/mod.rs @@ -18,7 +18,6 @@ use crate::{ utils::{init, server, window_manager::WindowManager}, }; use clash_verge_logging::{Type, logging, logging_error}; -use clash_verge_signal; pub mod dns; mod scheme; @@ -179,11 +178,6 @@ async fn init_silent_updater() { logging!(info, Type::Setup, "Silent updater initialized"); } -pub(crate) fn init_signal() { - logging!(info, Type::Setup, "Initializing signal handlers..."); - clash_verge_signal::register(feat::quit); -} - async fn init_work_config() { logging_error!(Type::Setup, init::init_config().await); }