From 817d68546e5c34acc13b908ceb618c06da8bb1ba Mon Sep 17 00:00:00 2001 From: Tunglies Date: Wed, 5 Mar 2025 10:58:54 +0800 Subject: [PATCH] feat(mihomo): refactor MihomoManager for global access and improve proxy retrieval (#2906) --- src-tauri/src/cmd/proxy.rs | 19 +++++-------- src-tauri/src/crate_mihomo_api/src/lib.rs | 4 +++ src-tauri/src/module/mihomo.rs | 33 +++++++++++++++++++++++ src-tauri/src/module/mod.rs | 3 ++- 4 files changed, 46 insertions(+), 13 deletions(-) create mode 100644 src-tauri/src/module/mihomo.rs diff --git a/src-tauri/src/cmd/proxy.rs b/src-tauri/src/cmd/proxy.rs index d896dfe8..d9874845 100644 --- a/src-tauri/src/cmd/proxy.rs +++ b/src-tauri/src/cmd/proxy.rs @@ -1,21 +1,16 @@ use super::CmdResult; -use crate::core; -use mihomo_api; +use crate::module::mihomo::MihomoManager; #[tauri::command] pub async fn get_proxies() -> CmdResult { - let (mihomo_server, headers) = core::clash_api::clash_client_info().unwrap(); - let mihomo = mihomo_api::MihomoManager::new(mihomo_server, headers); - Ok(mihomo.refresh_proxies().await.unwrap().get_proxies()) + let mannager = MihomoManager::global(); + mannager.refresh_proxies().await.unwrap(); + Ok(mannager.get_proxies()) } #[tauri::command] pub async fn get_providers_proxies() -> CmdResult { - let (mihomo_server, headers) = core::clash_api::clash_client_info().unwrap(); - let mihomo = mihomo_api::MihomoManager::new(mihomo_server, headers); - Ok(mihomo - .refresh_providers_proxies() - .await - .unwrap() - .get_providers_proxies()) + let mannager = MihomoManager::global(); + mannager.refresh_providers_proxies().await.unwrap(); + Ok(mannager.get_providers_proxies()) } diff --git a/src-tauri/src/crate_mihomo_api/src/lib.rs b/src-tauri/src/crate_mihomo_api/src/lib.rs index 6c4b36a7..3106a7f3 100644 --- a/src-tauri/src/crate_mihomo_api/src/lib.rs +++ b/src-tauri/src/crate_mihomo_api/src/lib.rs @@ -28,6 +28,10 @@ impl MihomoManager { data.providers_proxies = providers_proxies; } + pub fn get_mihomo_server(&self) -> String { + self.mihomo_server.clone() + } + pub fn get_proxies(&self) -> serde_json::Value { let data = self.data.lock().unwrap(); data.proxies.clone() diff --git a/src-tauri/src/module/mihomo.rs b/src-tauri/src/module/mihomo.rs new file mode 100644 index 00000000..3089116e --- /dev/null +++ b/src-tauri/src/module/mihomo.rs @@ -0,0 +1,33 @@ +use crate::core::clash_api; +use mihomo_api; +use once_cell::sync::{Lazy, OnceCell}; +use std::sync::Mutex; + +pub struct MihomoManager { + mihomo: Mutex>, +} + +impl MihomoManager { + fn __global() -> &'static MihomoManager { + static INSTANCE: Lazy = Lazy::new(|| MihomoManager { + mihomo: Mutex::new(OnceCell::new()), + }); + &INSTANCE + } + + pub fn global() -> mihomo_api::MihomoManager { + let instance = MihomoManager::__global(); + let (current_server, headers) = clash_api::clash_client_info().unwrap(); + + let lock = instance.mihomo.lock().unwrap(); + if let Some(mihomo) = lock.get() { + if mihomo.get_mihomo_server() == current_server { + return mihomo.clone(); + } + } + + lock.set(mihomo_api::MihomoManager::new(current_server, headers)) + .ok(); + lock.get().unwrap().clone() + } +} diff --git a/src-tauri/src/module/mod.rs b/src-tauri/src/module/mod.rs index f146b310..9b6f1f38 100644 --- a/src-tauri/src/module/mod.rs +++ b/src-tauri/src/module/mod.rs @@ -1 +1,2 @@ -pub mod sysinfo; \ No newline at end of file +pub mod sysinfo; +pub mod mihomo; \ No newline at end of file