From 5a0fed9c93653f666e7b3293498ae2d2259cc907 Mon Sep 17 00:00:00 2001
From: GyDi <zzzgydi@gmail.com>
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<String>,
+) -> CmdResult<clash_api::DelayRes> {
+    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<String>) -> Result<DelayRes> {
+    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::<DelayRes>().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<void>("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));
-- 
GitLab