refactor(proxy): enhance proxy state management and refresh logic

This commit is contained in:
Tunglies
2025-06-05 20:10:28 +08:00
parent 44f085604a
commit 80f550d67e
5 changed files with 45 additions and 84 deletions

View File

@@ -7,16 +7,40 @@ use std::{
use tauri::Manager;
const PROVIDERS_REFRESH_INTERVAL: Duration = Duration::from_secs(3);
const PROXIES_REFRESH_INTERVAL: Duration = Duration::from_secs(1);
#[tauri::command]
pub async fn get_proxies() -> CmdResult<serde_json::Value> {
let manager = MihomoManager::global();
manager
.refresh_proxies()
.await
.map(|_| manager.get_proxies())
.or_else(|_| Ok(manager.get_proxies()))
let app_handle = handle::Handle::global().app_handle().unwrap();
let cmd_proxy_state = app_handle.state::<Mutex<CmdProxyState>>();
let should_refresh = {
let mut state = cmd_proxy_state.lock().unwrap();
let now = Instant::now();
if now.duration_since(state.last_refresh_time) > PROXIES_REFRESH_INTERVAL {
state.need_refresh = true;
state.last_refresh_time = now;
}
state.need_refresh
};
if should_refresh {
let proxies = manager.get_refresh_proxies().await?;
{
let mut state = cmd_proxy_state.lock().unwrap();
state.proxies = proxies;
state.need_refresh = false;
}
log::debug!(target: "app", "proxies刷新成功");
}
let proxies = {
let state = cmd_proxy_state.lock().unwrap();
state.proxies.clone()
};
Ok(proxies)
}
#[tauri::command]
@@ -36,14 +60,12 @@ pub async fn get_providers_proxies() -> CmdResult<serde_json::Value> {
if should_refresh {
let manager = MihomoManager::global();
if let Err(e) = manager.refresh_providers_proxies().await {
log::warn!(target: "app", "providers_proxies刷新失败: {}", e);
return Err(e.into());
let providers = manager.get_providers_proxies().await?;
{
let mut state = cmd_proxy_state.lock().unwrap();
state.providers_proxies = providers;
state.need_refresh = false;
}
let mut state = cmd_proxy_state.lock().unwrap();
state.providers_proxies = manager.get_providers_proxies().clone();
state.need_refresh = false;
log::debug!(target: "app", "providers_proxies刷新成功");
}

View File

@@ -1,6 +1,7 @@
pub struct CmdProxyState {
pub last_refresh_time: std::time::Instant,
pub need_refresh: bool,
pub proxies: serde_json::Value,
pub providers_proxies: serde_json::Value,
}
@@ -9,6 +10,7 @@ impl Default for CmdProxyState {
Self {
last_refresh_time: std::time::Instant::now(),
need_refresh: true,
proxies: serde_json::Value::Null,
providers_proxies: serde_json::Value::Null,
}
}