Files
MikrotikManager/backend/src/services/ospf-optimizer-metrics.ts
T

17 lines
1.2 KiB
TypeScript

import {ospfOptimizerObservedSchema,type OspfOptimizerObserved} from "@mmapp/contracts"
interface Probe {id:string;lastPingRttMs:number|null;lastPingAt:string|null;lastTxAvgMbps:number|null;lastRxAvgMbps:number|null}
interface Traffic {interfaceName:string;rxBps:number;txBps:number;sampledAt:string}
const unknown=()=>({value:null,source:"unknown" as const,sourceId:null,measuredAt:null})
function timestamp(value:string|null){return value===null?null:new Date(value).toISOString()}
export function readOspfOptimizerObserved(probe:Probe|undefined,traffic:Traffic|undefined):OspfOptimizerObserved{
function speed(value:number|null|undefined,field:"rxBps"|"txBps"){
if(value!=null&&probe)return {value,source:"speed-probe" as const,sourceId:probe.id,measuredAt:null}
if(traffic)return {value:traffic[field]/1_000_000,source:"interface-traffic" as const,sourceId:traffic.interfaceName,measuredAt:timestamp(traffic.sampledAt)}
return unknown()
}
return ospfOptimizerObservedSchema.parse({
ping:probe?.lastPingRttMs!=null?{value:probe.lastPingRttMs,source:"speed-probe",sourceId:probe.id,measuredAt:timestamp(probe.lastPingAt)}:unknown(),
dl:speed(probe?.lastTxAvgMbps,"rxBps"),ul:speed(probe?.lastRxAvgMbps,"txBps"),
})
}