Prechádzať zdrojové kódy

feat: increase the concurrency of latency test

GyDi 1 rok pred
rodič
commit
5a0fed9c93

+ 11 - 0
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::*;

+ 23 - 0
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() };

+ 2 - 0
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")]

+ 1 - 1
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();

+ 5 - 0
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() {

+ 3 - 3
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));