订阅线路的类型、延迟和测速都改走 provider 接口

404 不是 bug。内核的 /proxies 只返回全局名字表(内置出站、自有线路、策略组),
订阅线路不在里面——跟「订阅线路不能被入站直接引用」是同一条约束,我没想到它同样
适用于运行时接口。所以 /proxies/{订阅线路}/delay 一律 404,而订阅线路的卡片也一直
没有协议和延迟,因为那些数据同样查不到。

现在运行时状态从两处合成:/proxies 给内置出站和策略组,/providers/proxies 给订阅线路
(它返回的线路本来就带完整的协议和延迟历史)。测速按线路归属选接口,订阅线路走
{订阅}/{线路}/healthcheck。实测该接口对同一条线路返回 200 和 325 毫秒。
This commit is contained in:
im0o
2026-08-10 13:41:42 +08:00
parent 71adcd60ef
commit 860da5d28f
4 changed files with 75 additions and 32 deletions
+11 -1
View File
@@ -22,6 +22,14 @@ import type { Env } from './env.ts'
*/
const DELAY_PATH = /^\/(proxies|group)\/.+\/delay$/
/**
* 订阅线路的健康检查。
*
* 订阅线路不在内核的全局名字表里,所以 /proxies/{名字}/delay 对它们一律 404——
* 要测只能从它所属的订阅进去。整条订阅测用 {订阅}/healthcheck,单条用 {订阅}/{线路}/healthcheck。
*/
const HEALTHCHECK_PATH = /^\/providers\/proxies\/[^/]+(\/[^/]+)?\/healthcheck$/
/** 允许透传的管理接口路径。白名单而不是黑名单——多开一个口子要有意为之。 */
const READABLE_KERNEL_PATHS = new Set([
'/version',
@@ -124,7 +132,9 @@ export function createRouter(env: Env, token: string) {
if (path.startsWith('/api/kernel/') && req.method === 'GET') {
const target = path.slice('/api/kernel'.length)
if (!READABLE_KERNEL_PATHS.has(target) && !DELAY_PATH.test(target)) {
const allowed =
READABLE_KERNEL_PATHS.has(target) || DELAY_PATH.test(target) || HEALTHCHECK_PATH.test(target)
if (!allowed) {
return json({ error: `不允许透传这个路径:${target}` }, 403)
}
const upstream = await proxyGet(env, target + url.search)