Files
clash-verge-rev/src/hooks/use-traffic-data.ts
T

64 lines
1.9 KiB
TypeScript

import { MihomoWebSocket, Traffic } from 'tauri-plugin-mihomo-api'
import { useMihomoWsSubscription } from './use-mihomo-ws-subscription'
import { useTrafficMonitorEnhanced } from './use-traffic-monitor'
const FALLBACK_TRAFFIC: Traffic = { up: 0, down: 0, upTotal: 0, downTotal: 0 }
const DUPLICATE_TRAFFIC_WINDOW_MS = 50
let lastTrafficSignature = ''
let lastTrafficTimestamp = 0
const shouldSkipDuplicateTraffic = (traffic: Traffic) => {
const now = Date.now()
const signature = `${traffic.up}:${traffic.down}:${traffic.upTotal}:${traffic.downTotal}`
if (
signature === lastTrafficSignature &&
now - lastTrafficTimestamp <= DUPLICATE_TRAFFIC_WINDOW_MS
) {
return true
}
lastTrafficSignature = signature
lastTrafficTimestamp = now
return false
}
export const useTrafficData = (options?: { enabled?: boolean }) => {
const enabled = options?.enabled ?? true
const {
graphData: { appendData },
} = useTrafficMonitorEnhanced({ subscribe: false, enabled })
const { response, refresh } = useMihomoWsSubscription<ITrafficItem>({
storageKey: 'mihomo_traffic_date',
buildSubscriptKey: (date) => (enabled ? `getClashTraffic-${date}` : null),
fallbackData: FALLBACK_TRAFFIC,
connect: () => MihomoWebSocket.connect_traffic(),
throttleMs: 200,
setupHandlers: ({ next, scheduleReconnect }) => ({
handleMessage: (data) => {
if (data.startsWith('Websocket error')) {
next(data, FALLBACK_TRAFFIC)
void scheduleReconnect()
return
}
try {
const parsed = JSON.parse(data) as Traffic
if (shouldSkipDuplicateTraffic(parsed)) {
return
}
appendData(parsed)
next(null, parsed)
} catch (error) {
next(error, FALLBACK_TRAFFIC)
}
},
}),
})
return { response, refreshGetClashTraffic: refresh }
}