feat: increase the concurrency of latency test

This commit is contained in:
GyDi 2023-11-01 20:52:38 +08:00
parent 1f1e743912
commit 5a0fed9c93
6 changed files with 45 additions and 4 deletions

View File

@ -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::*;

View File

@ -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() };

View File

@ -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")]

View File

@ -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();

View File

@ -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() {

View File

@ -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));