17 lines
1.2 KiB
TypeScript
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"),
|
|
})
|
|
}
|