fix: proxy group ipv6 test failed (#996)

This commit is contained in:
YetAnotherZephyruso 2024-09-12 17:24:55 +08:00 committed by GitHub
parent 1ed63e94fe
commit c43b84b114
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 80 additions and 79 deletions

View File

@ -1,8 +1,7 @@
import { useProxies } from '~/signals'
import { proxyIPv6SupportMap } from '~/signals/ipv6'
export const IPv6Support = (props: { name?: string }) => {
const { getNowProxyNodeName } = useProxies()
const { getNowProxyNodeName, proxyIPv6SupportMap } = useProxies()
const support = createMemo(() => {
return proxyIPv6SupportMap()[getNowProxyNodeName(props.name || '')]

View File

@ -1,71 +0,0 @@
import { makePersisted } from '@solid-primitives/storage'
import { proxyGroupLatencyTestAPI, proxyLatencyTestAPI } from '~/apis'
import {
latencyQualityMap,
latencyTestTimeoutDuration,
urlForIPv6SupportTest,
} from './config'
export const [proxyIPv6SupportMap, setProxyIPv6SupportMap] = makePersisted(
createSignal<Record<string, boolean>>({}),
{
name: 'proxyIPv6SupportMap',
storage: localStorage,
},
)
export const proxyIPv6SupportTest = async (
proxyName: string,
provider: string,
) => {
const urlForTest = urlForIPv6SupportTest()
if (!urlForTest || urlForTest.length === 0) {
setProxyIPv6SupportMap({})
return
}
let support = false
try {
const { delay } = await proxyLatencyTestAPI(
proxyName,
provider,
urlForTest,
latencyTestTimeoutDuration(),
)
support = delay > latencyQualityMap().NOT_CONNECTED
} catch {
support = false
}
setProxyIPv6SupportMap((supportMap) => ({
...supportMap,
[proxyName]: support,
}))
}
export const proxyGroupIPv6SupportTest = async (proxyGroupName: string) => {
const urlForTest = urlForIPv6SupportTest()
if (!urlForTest || urlForTest.length === 0) {
setProxyIPv6SupportMap({})
return
}
const newLatencyMap = await proxyGroupLatencyTestAPI(
proxyGroupName,
urlForTest,
latencyTestTimeoutDuration(),
)
const newSupportMap = Object.fromEntries(
Object.entries(newLatencyMap).map(([k, v]) => [
k,
v > latencyQualityMap().NOT_CONNECTED,
]),
)
setProxyIPv6SupportMap((supportMap) => ({
...supportMap,
...newSupportMap,
}))
}

View File

@ -1,3 +1,4 @@
import { makePersisted } from '@solid-primitives/storage'
import {
closeSingleConnectionAPI,
fetchProxiesAPI,
@ -19,12 +20,6 @@ import {
urlForLatencyTest,
} from '~/signals'
import type { Proxy, ProxyNode, ProxyProvider } from '~/types'
import {
proxyGroupIPv6SupportTest,
proxyIPv6SupportMap,
proxyIPv6SupportTest,
setProxyIPv6SupportMap,
} from './ipv6'
type ProxyInfo = {
name: string
@ -66,6 +61,14 @@ const [proxyNodeMap, setProxyNodeMap] = createSignal<Record<string, ProxyInfo>>(
{},
)
const [proxyIPv6SupportMap, setProxyIPv6SupportMap] = makePersisted(
createSignal<Record<string, boolean>>({}),
{
name: 'proxyIPv6SupportMap',
storage: localStorage,
},
)
const getLatencyFromProxy = (
proxy: Pick<Proxy, 'extra' | 'history'>,
url: string,
@ -217,6 +220,75 @@ export const useProxies = () => {
})
}
const proxyIPv6SupportTest = async (proxyName: string, provider: string) => {
const urlForTest = urlForIPv6SupportTest()
if (!urlForTest || urlForTest.length === 0) {
setProxyIPv6SupportMap({})
return
}
let support = false
try {
const { delay } = await proxyLatencyTestAPI(
proxyName,
provider,
urlForTest,
latencyTestTimeoutDuration(),
)
support = delay > latencyQualityMap().NOT_CONNECTED
} catch {
support = false
}
setProxyIPv6SupportMap((supportMap) => ({
...supportMap,
[proxyName]: support,
}))
}
const proxyGroupIPv6SupportTest = async (proxyGroupName: string) => {
const urlForTest = urlForIPv6SupportTest()
if (!urlForTest || urlForTest.length === 0) {
setProxyIPv6SupportMap({})
return
}
try {
const newLatencyMap = await proxyGroupLatencyTestAPI(
proxyGroupName,
urlForTest,
latencyTestTimeoutDuration(),
)
const newSupportMap = Object.fromEntries(
Object.entries(newLatencyMap).map(([nodeName, latency]) => [
getNowProxyNodeName(nodeName),
latency > latencyQualityMap().NOT_CONNECTED,
]),
)
setProxyIPv6SupportMap((supportMap) => ({
...supportMap,
...newSupportMap,
}))
} catch {
const allNodes = proxies().find((p) => p.name === proxyGroupName)?.all
if (!allNodes) {
return
}
setProxyIPv6SupportMap((proxyIPv6SupportMap) => ({
...proxyIPv6SupportMap,
...Object.fromEntries(
allNodes.map((name) => [getNowProxyNodeName(name), false]),
),
}))
}
}
const updateProviderByProviderName = (providerName: string) =>
setUpdatingMap(providerName, async () => {
try {
@ -305,5 +377,6 @@ export const useProxies = () => {
getNowProxyNodeName,
getLatencyByName,
isProxyGroup,
proxyIPv6SupportMap,
}
}