feat(award): 增加评分功能
This commit is contained in:
@@ -8,6 +8,7 @@ export interface IpInfoResponse {
|
||||
|
||||
export interface BatchMeasurementResponse {
|
||||
measurementId: string
|
||||
tracerouteId?: string | null
|
||||
}
|
||||
|
||||
export interface BatchResultResponse {
|
||||
@@ -16,19 +17,37 @@ export interface BatchResultResponse {
|
||||
nodeId: string
|
||||
latency: number | null
|
||||
success: boolean
|
||||
stats?: {
|
||||
min: number
|
||||
max: number
|
||||
loss: number
|
||||
}
|
||||
}>
|
||||
resolvedAddress?: string
|
||||
ipInfo?: IpInfo | null
|
||||
}
|
||||
|
||||
export interface TracerouteResponse {
|
||||
status: 'pending' | 'finished'
|
||||
totalHops?: number
|
||||
uniqueAsns?: number
|
||||
hasOptimizedRoute?: boolean
|
||||
detectedPremiumAsns?: number[]
|
||||
}
|
||||
|
||||
export interface SavedNodeResult {
|
||||
nodeId: string
|
||||
latency: number | null
|
||||
success: boolean
|
||||
stats?: { min: number; max: number; loss: number }
|
||||
}
|
||||
|
||||
export interface SaveResultRequest {
|
||||
type: 'single' | 'compare'
|
||||
input: { target: string } | { leftTarget: string; rightTarget: string }
|
||||
results: Array<{ nodeId: string; latency: number | null; success: boolean }> | {
|
||||
left: Array<{ nodeId: string; latency: number | null; success: boolean }>
|
||||
right: Array<{ nodeId: string; latency: number | null; success: boolean }>
|
||||
}
|
||||
results: SavedNodeResult[] | { left: SavedNodeResult[]; right: SavedNodeResult[] }
|
||||
ipInfo?: IpInfo | { left: IpInfo | null; right: IpInfo | null } | null
|
||||
traceroute?: TracerouteStats | { left: TracerouteStats | null; right: TracerouteStats | null } | null
|
||||
}
|
||||
|
||||
export interface SaveResultResponse {
|
||||
@@ -39,11 +58,9 @@ export interface SaveResultResponse {
|
||||
export interface SavedResultData {
|
||||
type: 'single' | 'compare'
|
||||
input: { target: string } | { leftTarget: string; rightTarget: string }
|
||||
results: Array<{ nodeId: string; latency: number | null; success: boolean }> | {
|
||||
left: Array<{ nodeId: string; latency: number | null; success: boolean }>
|
||||
right: Array<{ nodeId: string; latency: number | null; success: boolean }>
|
||||
}
|
||||
results: SavedNodeResult[] | { left: SavedNodeResult[]; right: SavedNodeResult[] }
|
||||
ipInfo?: IpInfo | { left: IpInfo | null; right: IpInfo | null } | null
|
||||
traceroute?: TracerouteStats | { left: TracerouteStats | null; right: TracerouteStats | null } | null
|
||||
createdAt: string
|
||||
}
|
||||
|
||||
@@ -54,9 +71,17 @@ export async function fetchUserIp(): Promise<string> {
|
||||
return data.ip
|
||||
}
|
||||
|
||||
export interface TracerouteStats {
|
||||
totalHops: number
|
||||
uniqueAsns: number
|
||||
hasOptimizedRoute: boolean
|
||||
detectedPremiumAsns?: number[]
|
||||
}
|
||||
|
||||
export interface TestResult {
|
||||
resolvedAddress?: string
|
||||
ipInfo?: IpInfo | null
|
||||
traceroute?: TracerouteStats | null
|
||||
}
|
||||
|
||||
export async function testAllNodes(
|
||||
@@ -80,7 +105,7 @@ export async function testAllNodes(
|
||||
return {}
|
||||
}
|
||||
|
||||
const { measurementId }: BatchMeasurementResponse = await res.json()
|
||||
const { measurementId, tracerouteId }: BatchMeasurementResponse = await res.json()
|
||||
|
||||
for (const node of TEST_NODES) {
|
||||
onProgress({ nodeId: node.id, latency: null, status: 'testing' })
|
||||
@@ -116,7 +141,8 @@ export async function testAllNodes(
|
||||
onProgress({
|
||||
nodeId: result.nodeId,
|
||||
latency: result.latency,
|
||||
status: 'success'
|
||||
status: 'success',
|
||||
stats: result.stats
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -127,7 +153,8 @@ export async function testAllNodes(
|
||||
onProgress({
|
||||
nodeId: result.nodeId,
|
||||
latency: result.latency,
|
||||
status: result.success ? 'success' : 'failed'
|
||||
status: result.success ? 'success' : 'failed',
|
||||
stats: result.stats
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -135,7 +162,28 @@ export async function testAllNodes(
|
||||
}
|
||||
}
|
||||
|
||||
return { resolvedAddress, ipInfo }
|
||||
// Fetch traceroute results if available
|
||||
let traceroute: TracerouteStats | null = null
|
||||
if (tracerouteId) {
|
||||
try {
|
||||
const trRes = await fetch(`${API_BASE}/latency/traceroute/${tracerouteId}`)
|
||||
if (trRes.ok) {
|
||||
const trData: TracerouteResponse = await trRes.json()
|
||||
if (trData.status === 'finished' && trData.totalHops !== undefined) {
|
||||
traceroute = {
|
||||
totalHops: trData.totalHops,
|
||||
uniqueAsns: trData.uniqueAsns ?? 0,
|
||||
hasOptimizedRoute: trData.hasOptimizedRoute ?? false,
|
||||
detectedPremiumAsns: trData.detectedPremiumAsns
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch {
|
||||
// Traceroute is optional, ignore errors
|
||||
}
|
||||
}
|
||||
|
||||
return { resolvedAddress, ipInfo, traceroute }
|
||||
}
|
||||
|
||||
export async function saveResult(data: SaveResultRequest): Promise<SaveResultResponse> {
|
||||
|
||||
Reference in New Issue
Block a user