Files
MikrotikManager/backend/src/services/traffic-observation.ts
T

26 lines
1.4 KiB
TypeScript

import { rateBpsFromDelta } from "./traffic-rate.js"
/** RouterOS byte counters must be exact nonnegative integers, never fallback zero. */
export function parseTrafficCounter(raw: unknown): number {
if (typeof raw !== "number" && (typeof raw !== "string" || !/^\d+$/.test(raw))) {
throw new Error("RouterOS вернул некорректный счётчик трафика")
}
const n = Number(raw)
if (!Number.isSafeInteger(n) || n < 0) throw new Error("RouterOS вернул некорректный счётчик трафика")
return n
}
export function observedTrafficRate(
previous: { rxBytes: number; txBytes: number; sampledAt: string } | undefined,
rxBytes: number, txBytes: number, nowMs: number,
): { rxBps: number; txBps: number; measured: boolean } {
const prevMs = previous ? Date.parse(previous.sampledAt) : NaN
if (!previous || ![previous.rxBytes, previous.txBytes, rxBytes, txBytes].every(v => Number.isSafeInteger(v) && v >= 0)) {
return { rxBps: 0, txBps: 0, measured: false }
}
const rx = previous ? rateBpsFromDelta(previous.rxBytes, rxBytes, prevMs, nowMs) : null
const tx = previous ? rateBpsFromDelta(previous.txBytes, txBytes, prevMs, nowMs) : null
// Stored rates retain the legacy numeric shape; observed totals require both deltas.
return { rxBps: rx ?? 0, txBps: tx ?? 0, measured: rx !== null && tx !== null }
}