diff --git a/src/backend/ssh/server-stats.ts b/src/backend/ssh/server-stats.ts index 8fb6c050..8823fd56 100644 --- a/src/backend/ssh/server-stats.ts +++ b/src/backend/ssh/server-stats.ts @@ -370,7 +370,9 @@ async function pollStatusesOnce(): Promise { const checks = hosts.map(async (h) => { const isOnline = await tcpPing(h.ip, h.port, 5000); - hostStatuses.set(h.id, {status: isOnline ? 'online' : 'offline', lastChecked: now}); + const now = new Date().toISOString(); + const statusEntry: StatusEntry = {status: isOnline ? 'online' : 'offline', lastChecked: now}; + hostStatuses.set(h.id, statusEntry); return isOnline; }); @@ -396,15 +398,22 @@ app.get('/status/:id', async (req, res) => { return res.status(400).json({error: 'Invalid id'}); } - if (!hostStatuses.has(id)) { - await pollStatusesOnce(); + try { + const host = await fetchHostById(id); + if (!host) { + return res.status(404).json({error: 'Host not found'}); + } + + const isOnline = await tcpPing(host.ip, host.port, 5000); + const now = new Date().toISOString(); + const statusEntry: StatusEntry = {status: isOnline ? 'online' : 'offline', lastChecked: now}; + + hostStatuses.set(id, statusEntry); + res.json(statusEntry); + } catch (err) { + logger.error('Failed to check host status', err); + res.status(500).json({error: 'Failed to check host status'}); } - - const entry = hostStatuses.get(id); - if (!entry) { - return res.status(404).json({error: 'Host not found'}); - } - res.json(entry); }); app.post('/refresh', async (req, res) => { diff --git a/src/ui/Apps/Server/Server.tsx b/src/ui/Apps/Server/Server.tsx index 7f15e830..c97b0346 100644 --- a/src/ui/Apps/Server/Server.tsx +++ b/src/ui/Apps/Server/Server.tsx @@ -6,7 +6,7 @@ import {Button} from "@/components/ui/button.tsx"; import {Progress} from "@/components/ui/progress" import {Cpu, HardDrive, MemoryStick} from "lucide-react"; import {Tunnel} from "@/ui/Apps/Tunnel/Tunnel.tsx"; -import {getServerStatusById, getServerMetricsById, ServerMetrics} from "@/ui/main-axios.ts"; +import {getServerStatusById, getServerMetricsById, type ServerMetrics} from "@/ui/main-axios.ts"; import {useTabs} from "@/ui/Navigation/Tabs/TabContext.tsx"; interface ServerProps { @@ -102,7 +102,7 @@ export function Server({ fetchStatus(); fetchMetrics(); } - }, 300_000); + }, 30000); } return () => { diff --git a/src/ui/Navigation/Hosts/Host.tsx b/src/ui/Navigation/Hosts/Host.tsx index 280eff73..c4c76763 100644 --- a/src/ui/Navigation/Hosts/Host.tsx +++ b/src/ui/Navigation/Hosts/Host.tsx @@ -58,7 +58,7 @@ export function Host({host}: HostProps): React.ReactElement { fetchStatus(); - intervalId = window.setInterval(fetchStatus, 30000); + intervalId = window.setInterval(fetchStatus, 10000); return () => { cancelled = true; diff --git a/src/ui/Navigation/LeftSidebar.tsx b/src/ui/Navigation/LeftSidebar.tsx index ef3eec9b..9ddcec72 100644 --- a/src/ui/Navigation/LeftSidebar.tsx +++ b/src/ui/Navigation/LeftSidebar.tsx @@ -429,7 +429,7 @@ export function LeftSidebar({ -