fix: update IPC version, improve service IPC handling

This commit is contained in:
Tunglies 2026-01-29 23:54:58 +08:00
parent 95281632a1
commit 9a0703676b
No known key found for this signature in database
GPG Key ID: B9B01B389469B3E8
3 changed files with 63 additions and 42 deletions

52
Cargo.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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,
}
}