fix: provider proxy delay check (#7456)

* refactor(proxy): support delay testing for provider-based proxies

* style: remove debug console logs

* docs: update changelog

* feat(services): merge provider nodes into records in calcuProxies

---------

Co-authored-by: Tunglies <tunglies.dev@outlook.com>
This commit is contained in:
oomeow
2026-07-11 05:24:41 +00:00
committed by GitHub
co-authored by Tunglies
parent e8cefa8b07
commit 562828e14d
9 changed files with 73 additions and 87 deletions
+2 -19
View File
@@ -11,7 +11,7 @@ import {
useRef,
useState,
} from 'react'
import { delayGroup, healthcheckProxyProvider } from 'tauri-plugin-mihomo-api'
import { delayGroup } from 'tauri-plugin-mihomo-api'
import {
BaseEmpty,
@@ -97,29 +97,12 @@ function useProxyRenderState(
debugLog(`[ProxyGroups] 找到代理数量: ${proxies.length}`)
const providers = new Set(
proxies.map((p) => p!.provider!).filter(Boolean),
)
if (providers.size) {
debugLog(`[ProxyGroups] 发现提供者,数量: ${providers.size}`)
Promise.allSettled(
[...providers].map((p) => healthcheckProxyProvider(p)),
).then(() => {
debugLog(`[ProxyGroups] 提供者健康检查完成`)
onProxies()
})
}
const names = proxies.filter((p) => !p!.provider).map((p) => p!.name)
debugLog(`[ProxyGroups] 过滤后需要测试的代理数量: ${names.length}`)
const url = delayManager.getUrl(groupName)
debugLog(`[ProxyGroups] 测试URL: ${url}, 超时: ${timeout}ms`)
try {
await Promise.race([
delayManager.checkListDelay(names, groupName, timeout),
delayManager.checkListDelay(proxies, groupName, timeout),
delayGroup(groupName, url, timeout).then((result) => {
debugLog(
`[ProxyGroups] getGroupProxyDelays返回结果数量:`,
+3 -7
View File
@@ -159,8 +159,7 @@ export const ProxyItemMini = (props: Props) => {
<BaseLoading />
</Widget>
)}
{!proxy.provider && delayValue !== -2 && (
// provider 的节点不支持检测
{delayValue !== -2 && (
<Widget
className="the-check"
onClick={(e) => {
@@ -182,16 +181,13 @@ export const ProxyItemMini = (props: Props) => {
<Widget
className="the-delay"
onClick={(e) => {
if (proxy.provider) return
e.preventDefault()
e.stopPropagation()
onDelay()
onDelay(proxy.provider)
}}
sx={({ palette }) => ({
color: delayManager.formatDelayColor(delayValue, timeout),
...(!proxy.provider
? { ':hover': { bgcolor: alpha(palette.primary.main, 0.15) } }
: {}),
':hover': { bgcolor: alpha(palette.primary.main, 0.15) },
})}
>
{delayManager.formatDelay(delayValue, timeout)}
+6 -10
View File
@@ -7,8 +7,8 @@ import {
ListItemIcon,
ListItemText,
styled,
SxProps,
Theme,
type SxProps,
type Theme,
} from '@mui/material'
import { BaseLoading } from '@/components/base'
@@ -125,14 +125,13 @@ export const ProxyItem = (props: Props) => {
</Widget>
)}
{!proxy.provider && delayValue !== -2 && (
// provider 的节点不支持检测
{delayValue !== -2 && (
<Widget
className="the-check"
onClick={(e) => {
e.preventDefault()
e.stopPropagation()
onDelay()
onDelay(proxy.provider)
}}
sx={({ palette }) => ({
display: 'none', // hover 时显示
@@ -148,16 +147,13 @@ export const ProxyItem = (props: Props) => {
<Widget
className="the-delay"
onClick={(e) => {
if (proxy.provider) return
e.preventDefault()
e.stopPropagation()
onDelay()
onDelay(proxy.provider)
}}
sx={({ palette }) => ({
color: delayManager.formatDelayColor(delayValue, timeout),
...(!proxy.provider
? { ':hover': { bgcolor: alpha(palette.primary.main, 0.15) } }
: {}),
':hover': { bgcolor: alpha(palette.primary.main, 0.15) },
})}
>
{delayManager.formatDelay(delayValue, timeout)}
+2 -3
View File
@@ -158,12 +158,11 @@ export const useRenderList = (
const calculateDelays = async () => {
try {
const timeout = verge?.default_latency_timeout || 10000
const proxyNames = allProxies.map((proxy) => proxy.name)
debugLog(`[ChainMode] 开始计算 ${proxyNames.length} 个节点的延迟`)
debugLog(`[ChainMode] 开始计算 ${allProxies.length} 个节点的延迟`)
// 使用 delayManager 计算延迟,每个节点计算完成后会自动触发监听器刷新界面
delayManager.checkListDelay(proxyNames, 'chain-mode', timeout)
delayManager.checkListDelay(allProxies, 'chain-mode', timeout)
} catch (error) {
console.error('Failed to calculate delays for chain mode:', error)
}