diff --git a/.cursor/debug-378b5f.log b/.cursor/debug-378b5f.log index 701d0f7..7af9604 100644 --- a/.cursor/debug-378b5f.log +++ b/.cursor/debug-378b5f.log @@ -1,8 +1 @@ -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771912295663} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"POST","url":"/uptime/check","status":200},"timestamp":1771912297719} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771912335274} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771912395275} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771912395275} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/alerts","status":200},"timestamp":1771912434898} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:response","message":"API response received","data":{"method":"GET","url":"/alerts","status":200},"timestamp":1771912439040} -{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771912455273} +{"sessionId":"378b5f","runId":"baseline","hypothesisId":"H1_H2","location":"frontend/src/lib/api.js:request","message":"API request started","data":{"method":"GET","url":"/alerts"},"timestamp":1771912788315} diff --git a/frontend/src/ResourceStatsPage.jsx b/frontend/src/ResourceStatsPage.jsx index b3546dc..eeec38e 100644 --- a/frontend/src/ResourceStatsPage.jsx +++ b/frontend/src/ResourceStatsPage.jsx @@ -8,6 +8,8 @@ import { } from '@tabler/icons-react'; import PageHeader from './components/PageHeader.jsx'; +const REQUEST_TIMEOUT_MS = 15000; + function formatBytes(bytes) { if (bytes == null || bytes === 0) return '0 B'; const k = 1024; @@ -149,7 +151,7 @@ export default function ResourceStatsPage() { const fetchStats = useCallback(async (abortSignal) => { setLoading(true); setError(null); - const opts = abortSignal ? { signal: abortSignal } : {}; + const opts = { timeout: REQUEST_TIMEOUT_MS, ...(abortSignal ? { signal: abortSignal } : {}) }; try { const res = await api.get('/resources/stats', opts); const data = res?.data; diff --git a/frontend/src/TrafficDashboard.jsx b/frontend/src/TrafficDashboard.jsx index a1b8483..6770ebe 100644 --- a/frontend/src/TrafficDashboard.jsx +++ b/frontend/src/TrafficDashboard.jsx @@ -33,6 +33,7 @@ function formatBytes(bytes) { const DONUT_SIZE = 200; const DONUT_OUTER = 88; const DONUT_INNER = 52; +const REQUEST_TIMEOUT_MS = 15000; function JumphostCard({ jumphost }) { const { name, host, error, interfaces } = jumphost; @@ -184,7 +185,7 @@ export default function TrafficDashboard() { const fetchStats = useCallback(async (abortSignal) => { setLoading(true); setError(null); - const opts = abortSignal ? { signal: abortSignal } : {}; + const opts = { timeout: REQUEST_TIMEOUT_MS, ...(abortSignal ? { signal: abortSignal } : {}) }; try { const [statsRes, settingsRes] = await Promise.all([ api.get('/traffic/interface-stats', opts),