mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-01-29 00:35:38 +08:00
perf: async config handling with optimized port lookup and save logic
This commit is contained in:
@@ -67,6 +67,8 @@
|
|||||||
- 重构了原来的 IP 信息请求重试机制,采用轮询检测,解决了 Network Error 和超时问题
|
- 重构了原来的 IP 信息请求重试机制,采用轮询检测,解决了 Network Error 和超时问题
|
||||||
- 对轮询检测机制进行了优化,引入洗牌算法来增强随机性。
|
- 对轮询检测机制进行了优化,引入洗牌算法来增强随机性。
|
||||||
- 对获取系统信息的流程进行了优化,并添加了去重检测机制,确保剔除重复的信息
|
- 对获取系统信息的流程进行了优化,并添加了去重检测机制,确保剔除重复的信息
|
||||||
|
- 优化窗口状态初始化逻辑和添加缺失的权限设置
|
||||||
|
- 异步化配置:优化端口查找和配置保存逻辑
|
||||||
|
|
||||||
## v2.2.3
|
## v2.2.3
|
||||||
|
|
||||||
|
|||||||
@@ -13,11 +13,11 @@ use parking_lot::{Mutex, RwLock};
|
|||||||
use percent_encoding::percent_decode_str;
|
use percent_encoding::percent_decode_str;
|
||||||
use serde_yaml::Mapping;
|
use serde_yaml::Mapping;
|
||||||
use std::{
|
use std::{
|
||||||
net::TcpListener,
|
|
||||||
sync::Arc,
|
sync::Arc,
|
||||||
time::{Duration, Instant},
|
time::{Duration, Instant},
|
||||||
};
|
};
|
||||||
use tauri::{AppHandle, Emitter, Manager};
|
use tauri::{AppHandle, Emitter, Manager};
|
||||||
|
use tokio::net::TcpListener;
|
||||||
|
|
||||||
use tauri::Url;
|
use tauri::Url;
|
||||||
//#[cfg(not(target_os = "linux"))]
|
//#[cfg(not(target_os = "linux"))]
|
||||||
@@ -123,8 +123,8 @@ pub fn reset_ui_ready() {
|
|||||||
logging!(info, Type::Window, true, "UI就绪状态已重置");
|
logging!(info, Type::Window, true, "UI就绪状态已重置");
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn find_unused_port() -> Result<u16> {
|
pub async fn find_unused_port() -> Result<u16> {
|
||||||
match TcpListener::bind("127.0.0.1:0") {
|
match TcpListener::bind("127.0.0.1:0").await {
|
||||||
Ok(listener) => {
|
Ok(listener) => {
|
||||||
let port = listener.local_addr()?.port();
|
let port = listener.local_addr()?.port();
|
||||||
Ok(port)
|
Ok(port)
|
||||||
@@ -156,7 +156,15 @@ pub async fn resolve_setup_async(app_handle: &AppHandle) {
|
|||||||
|
|
||||||
logging_error!(Type::Setup, true, init::startup_script().await);
|
logging_error!(Type::Setup, true, init::startup_script().await);
|
||||||
|
|
||||||
logging_error!(Type::System, true, resolve_random_port_config());
|
if let Err(err) = resolve_random_port_config().await {
|
||||||
|
logging!(
|
||||||
|
error,
|
||||||
|
Type::System,
|
||||||
|
true,
|
||||||
|
"Failed to resolve random port config: {}",
|
||||||
|
err
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
logging!(trace, Type::Config, true, "初始化配置...");
|
logging!(trace, Type::Config, true, "初始化配置...");
|
||||||
logging_error!(Type::Config, true, Config::init_config().await);
|
logging_error!(Type::Config, true, Config::init_config().await);
|
||||||
@@ -444,7 +452,7 @@ pub async fn resolve_scheme(param: String) -> Result<()> {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn resolve_random_port_config() -> Result<()> {
|
async fn resolve_random_port_config() -> Result<()> {
|
||||||
let verge_config = Config::verge();
|
let verge_config = Config::verge();
|
||||||
let clash_config = Config::clash();
|
let clash_config = Config::clash();
|
||||||
let enable_random_port = verge_config.latest().enable_random_port.unwrap_or(false);
|
let enable_random_port = verge_config.latest().enable_random_port.unwrap_or(false);
|
||||||
@@ -455,21 +463,34 @@ fn resolve_random_port_config() -> Result<()> {
|
|||||||
.unwrap_or(clash_config.data().get_mixed_port());
|
.unwrap_or(clash_config.data().get_mixed_port());
|
||||||
|
|
||||||
let port = if enable_random_port {
|
let port = if enable_random_port {
|
||||||
find_unused_port().unwrap_or(default_port)
|
find_unused_port().await.unwrap_or(default_port)
|
||||||
} else {
|
} else {
|
||||||
default_port
|
default_port
|
||||||
};
|
};
|
||||||
|
|
||||||
verge_config.data().patch_config(IVerge {
|
let port_to_save = port;
|
||||||
verge_mixed_port: Some(port),
|
|
||||||
..IVerge::default()
|
tokio::task::spawn_blocking(move || {
|
||||||
});
|
let verge_config_accessor = Config::verge();
|
||||||
verge_config.data().save_file()?;
|
let mut verge_data = verge_config_accessor.data();
|
||||||
|
verge_data.patch_config(IVerge {
|
||||||
|
verge_mixed_port: Some(port_to_save),
|
||||||
|
..IVerge::default()
|
||||||
|
});
|
||||||
|
verge_data.save_file()
|
||||||
|
})
|
||||||
|
.await??; // First ? for spawn_blocking error, second for save_file Result
|
||||||
|
|
||||||
|
tokio::task::spawn_blocking(move || {
|
||||||
|
let clash_config_accessor = Config::clash(); // Extend lifetime of the accessor
|
||||||
|
let mut clash_data = clash_config_accessor.data(); // Access within blocking task, made mutable
|
||||||
|
let mut mapping = Mapping::new();
|
||||||
|
mapping.insert("mixed-port".into(), port_to_save.into());
|
||||||
|
clash_data.patch_config(mapping);
|
||||||
|
clash_data.save_config()
|
||||||
|
})
|
||||||
|
.await??;
|
||||||
|
|
||||||
let mut mapping = Mapping::new();
|
|
||||||
mapping.insert("mixed-port".into(), port.into());
|
|
||||||
clash_config.data().patch_config(mapping);
|
|
||||||
clash_config.data().save_config()?;
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user