"use client"; import { useEffect, useState, useRef } from "react"; import { io } from "socket.io-client"; import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { LineChart, Line, XAxis, YAxis, CartesianGrid, Tooltip, ResponsiveContainer, AreaChart, Area, } from "recharts"; import { Activity, HardDrive, Clock, Cpu, Server } from "lucide-react"; interface DataPoint { time: string; cpu: number; memory: number; players: number; } interface MonitoringData { system: { cpuPercent: number; totalMemMb: number; usedMemMb: number; loadAvg: number[]; uptime: number; }; server: { running: boolean; uptime?: number }; timestamp: number; } const MAX_HISTORY = 60; // 60 data points (e.g. 2 minutes at 2s intervals) function formatUptime(s: number) { const d = Math.floor(s / 86400); const h = Math.floor((s % 86400) / 3600); const m = Math.floor((s % 3600) / 60); if (d > 0) return `${d}d ${h}h ${m}m`; if (h > 0) return `${h}h ${m}m`; return `${m}m ${s % 60}s`; } export default function MonitoringPage() { const [data, setData] = useState(null); const [history, setHistory] = useState([]); const socketRef = useRef | null>(null); useEffect(() => { // Use REST polling (Socket.io monitoring namespace is optional here) const poll = async () => { try { const res = await fetch("/api/monitoring"); if (!res.ok) return; const json: MonitoringData = await res.json(); setData(json); const time = new Date(json.timestamp).toLocaleTimeString("en", { hour12: false, hour: "2-digit", minute: "2-digit", second: "2-digit", }); setHistory((prev) => { const updated = [ ...prev, { time, cpu: json.system.cpuPercent, memory: Math.round( (json.system.usedMemMb / json.system.totalMemMb) * 100, ), players: 0, }, ]; return updated.length > MAX_HISTORY ? updated.slice(-MAX_HISTORY) : updated; }); } catch {} }; poll(); const interval = setInterval(poll, 2000); return () => clearInterval(interval); }, []); const memPercent = data ? Math.round((data.system.usedMemMb / data.system.totalMemMb) * 100) : 0; const chartTheme = { grid: "#27272a", axis: "#52525b", tooltip: { bg: "#18181b", border: "#3f3f46", text: "#fff" }, }; return (

Monitoring

Real-time system and server performance metrics

{/* Summary cards */}
{[ { title: "CPU", value: `${data?.system.cpuPercent ?? 0}%`, icon: Cpu, color: "text-blue-500", bg: "bg-blue-500/10", }, { title: "Memory", value: `${memPercent}%`, icon: HardDrive, color: "text-emerald-500", bg: "bg-emerald-500/10", sub: `${data?.system.usedMemMb ?? 0} / ${data?.system.totalMemMb ?? 0} MB`, }, { title: "Load Avg", value: data?.system.loadAvg[0].toFixed(2) ?? "—", icon: Activity, color: "text-amber-500", bg: "bg-amber-500/10", }, { title: "Uptime", value: data ? formatUptime(data.system.uptime) : "—", icon: Clock, color: "text-violet-500", bg: "bg-violet-500/10", }, ].map(({ title, value, icon: Icon, color, bg, sub }) => (

{title}

{value}

{sub &&

{sub}

}
))}
{/* CPU chart */} CPU Usage Over Time `${v}%`} /> [`${v}%`, "CPU"]} /> {/* Memory chart */} Memory Usage Over Time `${v}%`} /> [`${v}%`, "Memory"]} />
); }