diff --git a/src/shared/versions.ts b/src/shared/versions.ts index 8930a02..df140c1 100644 --- a/src/shared/versions.ts +++ b/src/shared/versions.ts @@ -1,6 +1,6 @@ export const HARBOR_VERSIONS = Object.freeze({ - macClient: '0.25.7', - gatewayClient: '0.26.6', + macClient: '0.25.8', + gatewayClient: '0.26.7', gatewayBackend: '0.26.5', }); diff --git a/src/web/components/ClientOverviewPage.tsx b/src/web/components/ClientOverviewPage.tsx index bced752..f0d4ad4 100644 --- a/src/web/components/ClientOverviewPage.tsx +++ b/src/web/components/ClientOverviewPage.tsx @@ -724,7 +724,6 @@ export function ClientOverviewPage({ servers={profile.servers} selectedServerId={pickerState.selectedServerId} disabled={serverApplyBlocked || pickerState.disabled} - prompt={!pickerState.selectedServerId} leaving={pickerState.leaving} revealVersion={pickerState.revealVersion} anchorServerId={pickerState.anchorServerId} diff --git a/src/web/features/devices/DevicesPanel.tsx b/src/web/features/devices/DevicesPanel.tsx index c0c3081..f2bc4e9 100644 --- a/src/web/features/devices/DevicesPanel.tsx +++ b/src/web/features/devices/DevicesPanel.tsx @@ -29,6 +29,18 @@ interface TrafficDelta { gateway?: string; proxy?: string; total?: string; + vpn?: string; + direct?: string; + unknown?: string; + outboundTotal?: string; +} + +interface TrafficTotals { + gateway: bigint; + proxy: bigint; + vpn: bigint; + direct: bigint; + unknown: bigint; } interface PinCollapse { @@ -95,7 +107,7 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) { const previousPositions = useRef(new Map()); const previousScrollTop = useRef(0); const movementAnimations = useRef(new Map()); - const previousTraffic = useRef(new Map()); + const previousTraffic = useRef(new Map()); const aliasBaseline = useRef({ id: '', value: '' }); const copyTimers = useRef(new Map>()); const copyAttempts = useRef(new Map()); @@ -131,19 +143,38 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) { return; } - const next = new Map(); + const next = new Map(); const deltas: Record = {}; for (const device of snapshot?.devices || []) { const gateway = byteString(device.downloadBytes) + byteString(device.uploadBytes); const proxy = byteString(device.proxyDownloadBytes) + byteString(device.proxyUploadBytes); + const vpn = byteString(device.outboundTraffic?.vpnBytes); + const direct = byteString(device.outboundTraffic?.directTrackedBytes) + + byteString(device.outboundTraffic?.directIpv4Bytes); + const unknown = byteString(device.outboundTraffic?.unknownBytes); const previous = previousTraffic.current.get(device.id); - next.set(device.id, { gateway, proxy }); + next.set(device.id, { gateway, proxy, vpn, direct, unknown }); if (!previous) continue; const gatewayDelta = positiveByteDelta(previous.gateway, gateway); const proxyDelta = positiveByteDelta(previous.proxy, proxy); - if (!gatewayDelta && !proxyDelta) continue; + const vpnDelta = positiveByteDelta(previous.vpn, vpn); + const directDelta = positiveByteDelta(previous.direct, direct); + const unknownDelta = positiveByteDelta(previous.unknown, unknown); + if (!gatewayDelta && !proxyDelta && !vpnDelta && !directDelta && !unknownDelta) continue; const totalDelta = positiveByteDelta(previous.gateway + previous.proxy, gateway + proxy); - deltas[device.id] = { gateway: gatewayDelta, proxy: proxyDelta, total: totalDelta }; + const outboundTotalDelta = positiveByteDelta( + previous.vpn + previous.direct + previous.unknown, + vpn + direct + unknown, + ); + deltas[device.id] = { + gateway: gatewayDelta, + proxy: proxyDelta, + total: totalDelta, + vpn: vpnDelta, + direct: directDelta, + unknown: unknownDelta, + outboundTotal: outboundTotalDelta, + }; } previousTraffic.current = next; if (!Object.keys(deltas).length) return; @@ -343,7 +374,7 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) { - Сбросить вход и выход всех устройств + Обнулить трафик устройств

Устройства

@@ -579,13 +610,13 @@ export function DevicesPanel({ feature }: { feature: DevicesFeature }) { aria-label={trafficAriaLabel} >