From 5a0fed9c93653f666e7b3293498ae2d2259cc907 Mon Sep 17 00:00:00 2001 From: GyDi Date: Wed, 1 Nov 2023 20:52:38 +0800 Subject: [PATCH] feat: increase the concurrency of latency test --- src-tauri/src/cmds.rs | 11 +++++++++++ src-tauri/src/core/clash_api.rs | 23 +++++++++++++++++++++++ src-tauri/src/main.rs | 2 ++ src/services/api.ts | 2 +- src/services/cmds.ts | 5 +++++ src/services/delay.ts | 6 +++--- 6 files changed, 45 insertions(+), 4 deletions(-) diff --git a/src-tauri/src/cmds.rs b/src-tauri/src/cmds.rs index 2e3ca84..4b42ebe 100644 --- a/src-tauri/src/cmds.rs +++ b/src-tauri/src/cmds.rs @@ -229,6 +229,17 @@ pub fn open_web_url(url: String) -> CmdResult<()> { wrap_err!(open::that(url)) } +#[tauri::command] +pub async fn clash_api_get_proxy_delay( + name: String, + url: Option, +) -> CmdResult { + match clash_api::get_proxy_delay(name, url).await { + Ok(res) => Ok(res), + Err(err) => Err(format!("{}", err.to_string())), + } +} + #[cfg(windows)] pub mod service { use super::*; diff --git a/src-tauri/src/core/clash_api.rs b/src-tauri/src/core/clash_api.rs index 4714371..5dafcf6 100644 --- a/src-tauri/src/core/clash_api.rs +++ b/src-tauri/src/core/clash_api.rs @@ -1,6 +1,7 @@ use crate::config::Config; use anyhow::{bail, Result}; use reqwest::header::HeaderMap; +use serde::{Deserialize, Serialize}; use serde_yaml::Mapping; use std::collections::HashMap; @@ -36,6 +37,28 @@ pub async fn patch_configs(config: &Mapping) -> Result<()> { Ok(()) } +#[derive(Default, Debug, Clone, Deserialize, Serialize)] +pub struct DelayRes { + delay: u64, +} + +/// GET /proxies/{name}/delay +/// 获取代理延迟 +pub async fn get_proxy_delay(name: String, test_url: Option) -> Result { + let (url, headers) = clash_client_info()?; + let url = format!("{url}/proxies/{name}/delay"); + let test_url = test_url.unwrap_or("http://www.gstatic.com/generate_204".into()); + + let client = reqwest::ClientBuilder::new().no_proxy().build()?; + let builder = client + .get(&url) + .headers(headers) + .query(&[("timeout", "10000"), ("url", &test_url)]); + let response = builder.send().await?; + + Ok(response.json::().await?) +} + /// 根据clash info获取clash服务地址和请求头 fn clash_client_info() -> Result<(String, HeaderMap)> { let client = { Config::clash().data().get_client_info() }; diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 59903db..0c20bec 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -66,6 +66,8 @@ fn main() -> std::io::Result<()> { cmds::service::check_service, cmds::service::install_service, cmds::service::uninstall_service, + // clash api + cmds::clash_api_get_proxy_delay ]); #[cfg(target_os = "macos")] diff --git a/src/services/api.ts b/src/services/api.ts index 263f90e..c9ded07 100644 --- a/src/services/api.ts +++ b/src/services/api.ts @@ -65,7 +65,7 @@ export const getRules = async () => { /// Get Proxy delay export const getProxyDelay = async (name: string, url?: string) => { const params = { - timeout: 5000, + timeout: 10000, url: url || "http://www.gstatic.com/generate_204", }; const instance = await getAxios(); diff --git a/src/services/cmds.ts b/src/services/cmds.ts index 2bd857e..02ee72a 100644 --- a/src/services/cmds.ts +++ b/src/services/cmds.ts @@ -153,6 +153,11 @@ export async function openWebUrl(url: string) { return invoke("open_web_url", { url }); } +export async function cmdGetProxyDelay(name: string, url?: string) { + name = encodeURIComponent(name); + return invoke<{ delay: number }>("clash_api_get_proxy_delay", { name, url }); +} + /// service mode export async function checkService() { diff --git a/src/services/delay.ts b/src/services/delay.ts index 91e4ab8..9b18776 100644 --- a/src/services/delay.ts +++ b/src/services/delay.ts @@ -1,4 +1,4 @@ -import { getProxyDelay } from "./api"; +import { cmdGetProxyDelay } from "./cmds"; const hashKey = (name: string, group: string) => `${group ?? ""}::${name}`; @@ -74,7 +74,7 @@ class DelayManager { try { const url = this.getUrl(group); - const result = await getProxyDelay(name, url); + const result = await cmdGetProxyDelay(name, url); delay = result.delay; } catch { delay = 1e6; // error @@ -84,7 +84,7 @@ class DelayManager { return delay; } - async checkListDelay(nameList: string[], group: string, concurrency = 6) { + async checkListDelay(nameList: string[], group: string, concurrency = 36) { const names = nameList.filter(Boolean); // 设置正在延迟测试中 names.forEach((name) => this.setDelay(name, group, -2));