release / release (push) Successful in 29s
判定按状态码白名单而不是只认 200:探测不带鉴权,OpenAI 回 401、Anthropic 回 405 才是正常应答,说明 TLS 握手、路由、目标服务全都正常。清单和白名单照 sub2api 的 代理质量检查抄来。 失败文案不照抄 Bun:本机端口没人监听时它给的是「Unable to connect. Is the computer able to access the url?」,把矛头指向目标网址,而真正的原因在本机。 对话框留在 InboundDetail 而不是提到 RouterPage——它不写配置文件也不改内核状态, 不需要走那条 commit 链路。firstPort 挪进 shared/inbounds.ts,两个页面都要用它了。
41 lines
1.4 KiB
TypeScript
41 lines
1.4 KiB
TypeScript
/**
|
|
* 仪表盘页的数据整理。
|
|
*
|
|
* 「拿到内核数据之后怎么摆」的纯逻辑,放在这里而不是 DashboardPage.vue 的
|
|
* computed 里,才能被 bun test 直接测到。流量窗口和每路吞吐的聚合在
|
|
* shared/telemetry.ts——那些是采集层的事,跨页面共用。
|
|
*/
|
|
|
|
/** 内核运行模式在界面上怎么念。不在表里的原样显示,不猜它的意思。 */
|
|
export function modeLabel(mode: unknown): string {
|
|
switch (mode) {
|
|
case 'rule':
|
|
return '规则'
|
|
case 'global':
|
|
return '全局'
|
|
case 'direct':
|
|
return '直连'
|
|
default:
|
|
return typeof mode === 'string' && mode ? mode : '—'
|
|
}
|
|
}
|
|
|
|
/** 一个监听中的代理端口。name 用配置键原词,和路由页legacy 入站的命名一致。 */
|
|
export interface KernelPort {
|
|
name: string
|
|
port: number
|
|
}
|
|
|
|
const PORT_KEYS = ['port', 'socks-port', 'mixed-port', 'redir-port', 'tproxy-port'] as const
|
|
|
|
/** 从内核 /configs 的运行时设置里挑出正在监听的代理端口。0 和缺省都表示没启用。 */
|
|
export function kernelPorts(configs: Record<string, unknown>): KernelPort[] {
|
|
const result: KernelPort[] = []
|
|
for (const key of PORT_KEYS) {
|
|
const raw = configs[key]
|
|
const port = typeof raw === 'number' ? raw : Number(raw)
|
|
if (Number.isFinite(port) && port > 0) result.push({ name: key, port })
|
|
}
|
|
return result
|
|
}
|