diff --git a/web/src/lib/components/mihomo/mihomo-overview-charts.svelte b/web/src/lib/components/mihomo/mihomo-overview-charts.svelte index 0115c75..18849d4 100644 --- a/web/src/lib/components/mihomo/mihomo-overview-charts.svelte +++ b/web/src/lib/components/mihomo/mihomo-overview-charts.svelte @@ -83,7 +83,7 @@ type: 'line', data: { labels: histMem.map((_, i) => String(i)), - datasets: [{ label: 'KB', data: [...histMem], borderColor: '#a78bfa', tension: 0.2, fill: true }] + datasets: [{ label: 'KiB', data: [...histMem], borderColor: '#a78bfa', tension: 0.2, fill: true }] }, options: lineOpts() }); diff --git a/web/src/routes/servers/[alias]/mihomo/+page.svelte b/web/src/routes/servers/[alias]/mihomo/+page.svelte index 3040a58..1159e1a 100644 --- a/web/src/routes/servers/[alias]/mihomo/+page.svelte +++ b/web/src/routes/servers/[alias]/mihomo/+page.svelte @@ -36,7 +36,8 @@ let downBps = $state(0); let totalUp = $state(0); let totalDown = $state(0); - let memKB = $state(0); + /** Память в KiB (кибибайты): из WS Mihomo приходит в байтах — нормализуем в одном месте. */ + let memKiB = $state(0); let connTotal = $state(0); let tcpN = $state(0); let udpN = $state(0); @@ -48,6 +49,12 @@ let topList = $state<{ name: string; n: number }[]>([]); const MAX_POINTS = 72; + + /** Mihomo WS: `inuse` (/memory) и `memory` (/connections) — в байтах → KiB для карточки и графика. */ + function mihomoWsMemoryToKiB(bytes: number): number { + if (!Number.isFinite(bytes) || bytes <= 0) return 0; + return bytes / 1024; + } /** Mihomo hub/route/proxies.go: без query `url` URLTest часто даёт delay=0 → HTTP 503. */ const MIHOMO_DELAY_DEFAULT_URL = 'https://www.gstatic.com/generate_204'; @@ -203,8 +210,8 @@ if (line) { try { const o = JSON.parse(line) as { inuse?: number }; - memKB = Number(o.inuse) || 0; - histMem = [...histMem, memKB]; + memKiB = mihomoWsMemoryToKiB(Number(o.inuse) || 0); + histMem = [...histMem, memKiB]; while (histMem.length > MAX_POINTS) histMem.shift(); seen++; } catch { @@ -343,8 +350,8 @@ ws.onmessage = (ev) => { try { const o = JSON.parse(String(ev.data)) as { inuse?: number }; - memKB = Number(o.inuse) || 0; - histMem = [...histMem, memKB]; + memKiB = mihomoWsMemoryToKiB(Number(o.inuse) || 0); + histMem = [...histMem, memKiB]; while (histMem.length > MAX_POINTS) histMem.shift(); } catch { /* ignore */ @@ -397,8 +404,8 @@ totalDown = j.downloadTotal; } if (typeof j.memory === 'number') { - memKB = j.memory; - histMem = [...histMem, memKB]; + memKiB = mihomoWsMemoryToKiB(j.memory); + histMem = [...histMem, memKiB]; while (histMem.length > MAX_POINTS) histMem.shift(); } let t = 0, @@ -486,7 +493,7 @@ totalDown = 0; upBps = 0; downBps = 0; - memKB = 0; + memKiB = 0; histUp = []; histDown = []; histMem = []; @@ -676,7 +683,7 @@ Память - {memKB > 0 ? `${(memKB / 1024).toFixed(1)} MiB` : '—'} + {memKiB > 0 ? `${(memKiB / 1024).toFixed(1)} MiB` : '—'}