53 lines
1.3 KiB
TypeScript
53 lines
1.3 KiB
TypeScript
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;
|
||
|
|
}
|