订阅线路的类型、延迟和测速都改走 provider 接口
404 不是 bug。内核的 /proxies 只返回全局名字表(内置出站、自有线路、策略组),
订阅线路不在里面——跟「订阅线路不能被入站直接引用」是同一条约束,我没想到它同样
适用于运行时接口。所以 /proxies/{订阅线路}/delay 一律 404,而订阅线路的卡片也一直
没有协议和延迟,因为那些数据同样查不到。
现在运行时状态从两处合成:/proxies 给内置出站和策略组,/providers/proxies 给订阅线路
(它返回的线路本来就带完整的协议和延迟历史)。测速按线路归属选接口,订阅线路走
{订阅}/{线路}/healthcheck。实测该接口对同一条线路返回 200 和 325 毫秒。
This commit is contained in:
+36
-15
@@ -12,6 +12,8 @@ import IconUnfold from '~icons/ri/sidebar-unfold-line'
|
||||
const snapshot = ref<ConfigSnapshot | null>(null)
|
||||
const kernel = ref<{ online: boolean; version?: string }>({ online: false })
|
||||
const providerLines = ref<string[]>([])
|
||||
/** 订阅线路 → 它所属的订阅名。测延迟时要用它选对接口 */
|
||||
const lineProvider = ref<Record<string, string>>({})
|
||||
const runtime = ref<Record<string, ProxyInfo>>({})
|
||||
const needsToken = ref(!getToken())
|
||||
const loadError = ref('')
|
||||
@@ -36,7 +38,6 @@ async function load() {
|
||||
needsToken.value = false
|
||||
// 订阅里有哪些线路只有运行中的内核知道,配置文件里只有一个订阅地址。
|
||||
// 拿不到不算错误——界面照常能编辑,只是订阅线路那一档不可选。
|
||||
providerLines.value = status.online ? await readProviderLines() : []
|
||||
runtime.value = status.online ? await readRuntime() : {}
|
||||
} catch (error) {
|
||||
if (error instanceof ApiError && error.unauthorized) {
|
||||
@@ -50,25 +51,44 @@ async function load() {
|
||||
}
|
||||
}
|
||||
|
||||
/** 只取真正的订阅。内核会给每个用了 proxies 的策略组造一个内部 provider,那些不是订阅。 */
|
||||
async function readProviderLines(): Promise<string[]> {
|
||||
/**
|
||||
* 出站的运行时状态:协议类型、策略组当前选中了谁、最近一次延迟。
|
||||
*
|
||||
* 要读两处。/proxies 只包含内核全局名字表里的东西——内置出站、自有线路、策略组;
|
||||
* 订阅线路不在那张表上,它们的类型和延迟只能从 /providers/proxies 拿。
|
||||
* 两边合成一张表,界面上就不用关心某个名字是从哪来的了。
|
||||
*
|
||||
* 顺带记下每条订阅线路属于哪个订阅:测它的延迟必须从所属订阅进去。
|
||||
*/
|
||||
async function readRuntime(): Promise<Record<string, ProxyInfo>> {
|
||||
const merged: Record<string, ProxyInfo> = {}
|
||||
const lines: string[] = []
|
||||
const owner: Record<string, string> = {}
|
||||
|
||||
try {
|
||||
Object.assign(merged, (await api.proxies()).proxies)
|
||||
} catch {
|
||||
// 拿不到就当没有,界面照常显示,只是没有延迟数字
|
||||
}
|
||||
|
||||
try {
|
||||
const { providers } = await api.providers()
|
||||
return Object.values(providers)
|
||||
.filter((p) => p.vehicleType !== 'Compatible')
|
||||
.flatMap((p) => p.proxies.map((line) => line.name))
|
||||
for (const [name, provider] of Object.entries(providers)) {
|
||||
// 内核会给每个用了 proxies 的策略组造一个内部 provider,那些不是订阅
|
||||
if (provider.vehicleType === 'Compatible') continue
|
||||
for (const line of provider.proxies) {
|
||||
merged[line.name] = line
|
||||
lines.push(line.name)
|
||||
owner[line.name] = name
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
return []
|
||||
// 同上
|
||||
}
|
||||
}
|
||||
|
||||
/** 出站的运行时状态:协议类型、策略组当前选中了谁、最近一次延迟。 */
|
||||
async function readRuntime(): Promise<Record<string, ProxyInfo>> {
|
||||
try {
|
||||
return (await api.proxies()).proxies
|
||||
} catch {
|
||||
return {}
|
||||
}
|
||||
providerLines.value = lines
|
||||
lineProvider.value = owner
|
||||
return merged
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -162,6 +182,7 @@ const current = computed(() => NAV.find((n) => n.key === active.value))
|
||||
:revision="snapshot.revision"
|
||||
:kernel-online="kernel.online"
|
||||
:provider-lines="providerLines"
|
||||
:line-provider="lineProvider"
|
||||
:runtime="runtime"
|
||||
@changed="load"
|
||||
@optimistic-select="optimisticSelect"
|
||||
|
||||
Reference in New Issue
Block a user