Files
flvx/vite-frontend/src/pages/tunnel/diagnosis.ts
T
sagitchu cdcdfd8ff0 fix: use custom probe targets for diagnostics
Move custom probe target controls into the tunnel advanced settings and reuse the configured target in tunnel diagnosis output.
2026-05-02 14:23:51 +08:00

93 lines
1.9 KiB
TypeScript

export interface DiagnosisEntry {
success?: boolean;
diagnosing?: boolean;
description: string;
nodeName: string;
nodeId: string;
targetIp: string;
targetPort?: number;
message?: string;
averageTime?: number;
packetLoss?: number;
fromChainType?: number;
fromInx?: number;
toChainType?: number;
toInx?: number;
}
export interface DiagnosisResult {
tunnelName: string;
tunnelType: string;
timestamp: number;
results: DiagnosisEntry[];
}
export interface DiagnosisFallbackInput {
tunnelName: string;
tunnelType: number;
description: string;
message: string;
targetIp?: string;
targetPort?: number;
}
export const buildDiagnosisFallbackResult = ({
tunnelName,
tunnelType,
description,
message,
targetIp = "-",
targetPort = 443,
}: DiagnosisFallbackInput): DiagnosisResult => {
return {
tunnelName,
tunnelType: tunnelType === 1 ? "端口转发" : "隧道转发",
timestamp: Date.now(),
results: [
{
success: false,
description,
nodeName: "-",
nodeId: "-",
targetIp,
targetPort,
message,
},
],
};
};
export const getDiagnosisQualityDisplay = (
averageTime?: number,
packetLoss?: number,
): {
text: string;
color: "success" | "primary" | "warning" | "danger";
} | null => {
if (averageTime === undefined || packetLoss === undefined) {
return null;
}
if (averageTime < 30 && packetLoss === 0) {
return { text: "🚀 优秀", color: "success" };
}
if (averageTime < 50 && packetLoss === 0) {
return { text: "✨ 很好", color: "success" };
}
if (averageTime < 100 && packetLoss < 1) {
return { text: "👍 良好", color: "primary" };
}
if (averageTime < 150 && packetLoss < 2) {
return { text: "😐 一般", color: "warning" };
}
if (averageTime < 200 && packetLoss < 5) {
return { text: "😟 较差", color: "warning" };
}
return { text: "😵 很差", color: "danger" };
};