From 9a0703676bf7bd24614cb7a8b213ff5e3d1ebf28 Mon Sep 17 00:00:00 2001 From: Tunglies <77394545+Tunglies@users.noreply.github.com> Date: Thu, 29 Jan 2026 23:54:58 +0800 Subject: [PATCH] fix: update IPC version, improve service IPC handling --- Cargo.lock | 52 +++++++++++++++++------------------ src-tauri/Cargo.toml | 2 +- src-tauri/src/core/service.rs | 51 ++++++++++++++++++++++++---------- 3 files changed, 63 insertions(+), 42 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 33c63e666..bbc4fef73 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1084,18 +1084,18 @@ dependencies = [ [[package]] name = "clap" -version = "4.5.54" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e6ff9dcd79cff5cd969a17a545d79e84ab086e444102a591e288a8aa3ce394" +checksum = "3e34525d5bbbd55da2bb745d34b36121baac88d07619a9a09cfcf4a6c0832785" dependencies = [ "clap_builder", ] [[package]] name = "clap_builder" -version = "4.5.54" +version = "4.5.55" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa42cf4d2b7a41bc8f663a7cab4031ebafa1bf3875705bfaf8466dc60ab52c00" +checksum = "59a20016a20a3da95bef50ec7238dbd09baeef4311dcdd38ec15aba69812fb61" dependencies = [ "anstyle", "clap_lex", @@ -1233,8 +1233,8 @@ dependencies = [ [[package]] name = "clash_verge_service_ipc" -version = "2.1.2" -source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#dc7238ef3a8d8b6b87e5e140a008f2e2d66ef262" +version = "2.1.3" +source = "git+https://github.com/clash-verge-rev/clash-verge-service-ipc#a486e7df6ac3d641014085f43bd08e99ff09b5a2" dependencies = [ "anyhow", "compact_str", @@ -1360,7 +1360,7 @@ dependencies = [ "futures-core", "prost 0.14.3", "prost-types 0.14.3", - "tonic 0.14.2", + "tonic 0.14.3", "tonic-prost", "tracing-core", ] @@ -1385,7 +1385,7 @@ dependencies = [ "thread_local", "tokio", "tokio-stream", - "tonic 0.14.2", + "tonic 0.14.3", "tracing", "tracing-core", "tracing-subscriber", @@ -3449,9 +3449,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.64" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -5254,7 +5254,7 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67eabc2ef2a60eb7faa00097bd1ffdb5bd28e62bf39990626a582201b7a754e5" dependencies = [ - "siphasher 1.0.1", + "siphasher 1.0.2", ] [[package]] @@ -5263,7 +5263,7 @@ version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" dependencies = [ - "siphasher 1.0.1", + "siphasher 1.0.2", ] [[package]] @@ -6289,7 +6289,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml", - "siphasher 1.0.1", + "siphasher 1.0.2", "toml 0.8.23", "triomphe", ] @@ -6973,9 +6973,9 @@ checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" [[package]] name = "siphasher" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +checksum = "b2aa850e253778c88a04c3d7323b043aeda9d3e30d5971937c1855769763678e" [[package]] name = "slab" @@ -8413,9 +8413,9 @@ dependencies = [ [[package]] name = "tonic" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7613188ce9f7df5bfe185db26c5814347d110db17920415cf2fbcad85e7203" +checksum = "a286e33f82f8a1ee2df63f4fa35c0becf4a85a0cb03091a15fd7bf0b402dc94a" dependencies = [ "async-trait", "axum 0.8.8", @@ -8455,13 +8455,13 @@ dependencies = [ [[package]] name = "tonic-prost" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66bd50ad6ce1252d87ef024b3d64fe4c3cf54a86fb9ef4c631fdd0ded7aeaa67" +checksum = "d6c55a2d6a14174563de34409c9f92ff981d006f56da9c6ecd40d9d4a31500b0" dependencies = [ "bytes", "prost 0.14.3", - "tonic 0.14.2", + "tonic 0.14.3", ] [[package]] @@ -8724,9 +8724,9 @@ dependencies = [ [[package]] name = "typed-path" -version = "0.12.1" +version = "0.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e43ffa54726cdc9ea78392023ffe9fe9cf9ac779e1c6fcb0d23f9862e3879d20" +checksum = "3015e6ce46d5ad8751e4a772543a30c7511468070e98e64e20165f8f81155b64" [[package]] name = "typeid" @@ -10167,18 +10167,18 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71ddd76bcebeed25db614f82bf31a9f4222d3fbba300e6fb6c00afa26cbd4d9d" +checksum = "fdea86ddd5568519879b8187e1cf04e24fce28f7fe046ceecbce472ff19a2572" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.34" +version = "0.8.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8187381b52e32220d50b255276aa16a084ec0a9017a0ca2152a1f55c539758d" +checksum = "0c15e1b46eff7c6c91195752e0eeed8ef040e391cdece7c25376957d5f15df22" dependencies = [ "proc-macro2", "quote", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 666a2e99c..a4b0bcd32 100755 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -98,7 +98,7 @@ tauri-plugin-devtools = { version = "2.0.1" } tauri-plugin-mihomo = { git = "https://github.com/clash-verge-rev/tauri-plugin-mihomo" } clash_verge_logger = { git = "https://github.com/clash-verge-rev/clash-verge-logger" } async-trait = "0.1.89" -clash_verge_service_ipc = { version = "2.1.2", features = [ +clash_verge_service_ipc = { version = "2.1.3", features = [ "client", ], git = "https://github.com/clash-verge-rev/clash-verge-service-ipc" } arc-swap = "1.8.0" diff --git a/src-tauri/src/core/service.rs b/src-tauri/src/core/service.rs index df07e83d4..6d8d5a8bc 100644 --- a/src-tauri/src/core/service.rs +++ b/src-tauri/src/core/service.rs @@ -3,7 +3,7 @@ use crate::{ core::{logger::Logger, tray::Tray}, utils::dirs, }; -use anyhow::{Context as _, Result, bail}; +use anyhow::{Context as _, Result, anyhow, bail}; use clash_verge_logging::{Type, logging, logging_error}; use clash_verge_service_ipc::CoreConfig; use compact_str::CompactString; @@ -14,7 +14,7 @@ use std::{ process::Command as StdCommand, time::Duration, }; -use tokio::sync::Mutex; +use tokio::{sync::Mutex, time::sleep}; #[derive(Debug, Clone, PartialEq, Eq)] pub enum ServiceStatus { @@ -336,10 +336,7 @@ pub(super) async fn start_with_existing_service(config_file: &PathBuf) -> Result pub(super) async fn run_core_by_service(config_file: &PathBuf) -> Result<()> { logging!(info, Type::Service, "正在尝试通过服务启动核心"); - let mut manager = SERVICE_MANAGER.lock().await; - let status = manager.check_service_comprehensive().await; - manager.handle_service_status(&status).await?; - drop(manager); + SERVICE_MANAGER.lock().await.refresh().await?; logging!(info, Type::Service, "服务已运行且版本匹配,直接使用"); start_with_existing_service(config_file).await @@ -395,13 +392,37 @@ pub async fn is_service_available() -> Result<()> { Ok(()) } -/// 等待一会,再检查服务是否正在运行 -/// TODO 使用 tokio select 之类机制并结合 timeout 实现更优雅的等待机制,期望等待文件出现,再尝试连接 pub async fn wait_and_check_service_available(status: &mut ServiceManager) -> Result<()> { - status.0 = ServiceStatus::Unavailable("Waiting for service to be available".into()); - clash_verge_service_ipc::connect().await?; - status.0 = ServiceStatus::Ready; - Ok(()) + wait_for_service_ipc(status, "Waiting for service to be available").await +} + +async fn wait_for_service_ipc(status: &mut ServiceManager, reason: &str) -> Result<()> { + status.0 = ServiceStatus::Unavailable(reason.into()); + let config = ServiceManager::config(); + let mut attempts = 0u32; + let mut last_err = anyhow!("service not ready"); + + loop { + if Path::new(clash_verge_service_ipc::IPC_PATH).exists() { + match clash_verge_service_ipc::connect().await { + Ok(_) => { + status.0 = ServiceStatus::Ready; + return Ok(()); + } + Err(e) => last_err = e, + } + } else { + last_err = anyhow!("IPC path not ready"); + } + + if attempts >= config.max_retries as u32 { + break; + } + attempts += 1; + sleep(config.retry_delay).await; + } + + Err(last_err) } pub fn is_service_ipc_path_exists() -> bool { @@ -415,9 +436,9 @@ impl ServiceManager { pub const fn config() -> clash_verge_service_ipc::IpcConfig { clash_verge_service_ipc::IpcConfig { - default_timeout: Duration::from_millis(100), - retry_delay: Duration::from_millis(200), - max_retries: 6, + default_timeout: Duration::from_millis(150), + retry_delay: Duration::from_millis(250), + max_retries: 20, } }