Files

53 lines
1.3 KiB
TypeScript
Raw Permalink Normal View History

import si from "systeminformation";
import type { SystemResult } from "@/lib/types/system-result";
const CACHE_MS = 1_000;
let lastSample: { data: SystemResult; ts: number } | null = null;
let inFlight: Promise<SystemResult> | null = null;
function pickDisk(disks: si.Systeminformation.FsSizeData[]): si.Systeminformation.FsSizeData | undefined {
return disks.find((disk) => disk.mount === "/") ?? disks.sort((a, b) => b.size - a.size)[0];
}
async function sample(): Promise<SystemResult> {
const [load, mem, disks, net] = await Promise.all([
si.currentLoad(),
si.mem(),
si.fsSize(),
si.networkStats(),
]);
const disk = pickDisk(disks);
const primaryNet = net[0];
return {
cpuPercent: load.currentLoad,
memUsedBytes: mem.active,
memTotalBytes: mem.total,
diskUsedBytes: disk?.used ?? 0,
diskTotalBytes: disk?.size ?? 0,
netRxBytesPerSec: primaryNet?.rx_sec ?? 0,
netTxBytesPerSec: primaryNet?.tx_sec ?? 0,
};
}
export async function collectSystem(): Promise<SystemResult> {
const now = Date.now();
if (lastSample && now - lastSample.ts < CACHE_MS) {
return lastSample.data;
}
if (inFlight) return inFlight;
inFlight = sample()
.then((data) => {
lastSample = { data, ts: Date.now() };
return data;
})
.finally(() => {
inFlight = null;
});
return inFlight;
}