'use client'; import React, { useState, useEffect, useRef, useCallback } from 'react'; import { OperationsInfrastructureData, ServiceStatusValue, ComponentHealthStatus, OperationsRole, InfrastructureSpeedtestResult, SpeedtestMode, } from './types'; import { normalizeInfrastructureResponse } from '../../lib/ops-data'; import { OperationsActions } from './operations-actions'; interface OperationsInfrastructureProps { role: OperationsRole; } export function OperationsInfrastructure({ role }: OperationsInfrastructureProps) { const [data, setData] = useState(null); const [isRefreshing, setIsRefreshing] = useState(false); const [lastFetchedAt, setLastFetchedAt] = useState(null); const [fetchError, setFetchError] = useState(null); const [copiedSha, setCopiedSha] = useState(false); const [refreshInterval, setRefreshInterval] = useState(30); // Speedtest state: dual options (Client to Server vs Server to External) const [speedtestMode, setSpeedtestMode] = useState('client_to_server'); const [isRunningSpeedtest, setIsRunningSpeedtest] = useState(false); const [clientSpeedtestResult, setClientSpeedtestResult] = useState(null); const [serverSpeedtestResult, setServerSpeedtestResult] = useState(null); const [speedtestError, setSpeedtestError] = useState(null); const [speedtestProgress, setSpeedtestProgress] = useState<{ percent: number; currentMbps?: number; message: string; }>({ percent: 0, message: '' }); const activeSpeedtestResult = speedtestMode === 'client_to_server' ? clientSpeedtestResult : serverSpeedtestResult; const speedtestResult = activeSpeedtestResult; const isFetchingRef = useRef(false); const pollTimerRef = useRef(null); const fetchData = useCallback(async () => { if (isFetchingRef.current) return; isFetchingRef.current = true; setIsRefreshing(true); try { const resp = await fetch('/api/ops/infrastructure', { method: 'GET', headers: { accept: 'application/json' }, cache: 'no-store', }); if (resp.ok) { const raw = await resp.json(); const normalized = normalizeInfrastructureResponse(raw); setData(normalized); setLastFetchedAt(new Date().toLocaleTimeString()); setFetchError(null); } else if (resp.status === 401 || resp.status === 403) { setFetchError('Authorization failed. Access restricted.'); } else { const raw = await resp.json().catch(() => null); setData(normalizeInfrastructureResponse(raw)); setFetchError('Metrics collector degraded or partially unavailable.'); } } catch { setFetchError('Network error reaching infrastructure endpoint.'); } finally { isFetchingRef.current = false; setIsRefreshing(false); } }, []); const handleRunClientSpeedtest = async () => { setSpeedtestProgress({ percent: 10, message: 'Measuring latency to MotorSignal server...' }); // 1. Latency probe (3 rapid samples) const pings: number[] = []; let detectedIp: string | undefined; for (let i = 0; i < 3; i++) { const t0 = typeof performance !== 'undefined' ? performance.now() : Date.now(); const pingResp = await fetch(`/api/ops/infrastructure/speedtest?action=ping&sample=${i}&t=${Date.now()}`, { method: 'GET', headers: { accept: 'application/json' }, cache: 'no-store', }); if (!pingResp.ok) throw new Error('Client-to-server latency probe failed'); const t1 = typeof performance !== 'undefined' ? performance.now() : Date.now(); pings.push(Math.max(1, t1 - t0)); const pingJson = await pingResp.json().catch(() => null); if (pingJson?.client_ip) detectedIp = pingJson.client_ip; } const minPing = Math.min(...pings); const latencyMs = Math.round(minPing * 10) / 10; setSpeedtestProgress({ percent: 30, message: `Latency: ${latencyMs} ms. Testing download throughput...`, }); // 2. Download throughput benchmark (2.5 MB bounded payload) const expectedBytes = 2500000; const downloadUrl = `/api/ops/infrastructure/speedtest?action=download&bytes=${expectedBytes}&t=${Date.now()}`; const tDownStart = typeof performance !== 'undefined' ? performance.now() : Date.now(); const downResp = await fetch(downloadUrl, { method: 'GET', headers: { accept: 'application/octet-stream' }, cache: 'no-store', }); if (!downResp.ok) throw new Error('Download throughput test failed'); if (downResp.headers.get('X-Client-IP')) { detectedIp = downResp.headers.get('X-Client-IP')!; } let receivedBytes = 0; if (downResp.body && typeof downResp.body.getReader === 'function') { const reader = downResp.body.getReader(); while (true) { const { done, value } = await reader.read(); if (done) break; if (value) { receivedBytes += value.length; const elapsedSec = Math.max( 0.01, ((typeof performance !== 'undefined' ? performance.now() : Date.now()) - tDownStart) / 1000 ); const currentMbps = Math.round(((receivedBytes * 8) / (elapsedSec * 1000000)) * 100) / 100; const pct = Math.min(70, 30 + Math.round((receivedBytes / expectedBytes) * 40)); setSpeedtestProgress({ percent: pct, currentMbps, message: `Downloading: ${Math.round((receivedBytes / 1024 / 1024) * 10) / 10} MB (${currentMbps} Mbps)...`, }); } } } else if (typeof downResp.arrayBuffer === 'function') { const buf = await downResp.arrayBuffer(); receivedBytes = buf.byteLength; } else { const blob = await downResp.blob(); receivedBytes = blob.size; } const tDownEnd = typeof performance !== 'undefined' ? performance.now() : Date.now(); const downDurationSec = Math.max(0.01, (tDownEnd - tDownStart) / 1000); const downloadMbps = Math.round(((receivedBytes * 8) / (downDurationSec * 1000000)) * 100) / 100; setSpeedtestProgress({ percent: 75, currentMbps: downloadMbps, message: `Download: ${downloadMbps} Mbps. Testing upload throughput...`, }); // 3. Upload throughput benchmark (1.5 MB bounded payload) const uploadBytes = 1500000; const uploadPayload = new Uint8Array(uploadBytes); for (let i = 0; i < uploadBytes; i += 4096) { uploadPayload[i] = (i * 37) & 0xff; } const tUpStart = typeof performance !== 'undefined' ? performance.now() : Date.now(); const upResp = await fetch(`/api/ops/infrastructure/speedtest?action=upload&t=${Date.now()}`, { method: 'POST', headers: { 'Content-Type': 'application/octet-stream' }, body: uploadPayload, }); if (!upResp.ok) throw new Error('Upload throughput test failed'); const tUpEnd = typeof performance !== 'undefined' ? performance.now() : Date.now(); const upDurationSec = Math.max(0.01, (tUpEnd - tUpStart) / 1000); const uploadMbps = Math.round(((uploadBytes * 8) / (upDurationSec * 1000000)) * 100) / 100; const upData = await upResp.json().catch(() => null); if (upData?.client_ip) detectedIp = upData.client_ip; setSpeedtestProgress({ percent: 100, currentMbps: uploadMbps, message: 'Client-to-server benchmark complete', }); const result: InfrastructureSpeedtestResult = { status: 'completed', tested_at: new Date().toISOString(), latency_ms: latencyMs, download_mbps: downloadMbps, upload_mbps: uploadMbps, server_target: 'MotorSignal Host Edge', client_ip: detectedIp ?? 'Operator Browser Link', mode: 'client_to_server', direction_label: 'Operator Browser ➔ MotorSignal Server', }; setClientSpeedtestResult(result); // Audit recording proxy call (non-blocking) void fetch('/api/ops/infrastructure/speedtest?action=record_client_result', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ latency_ms: latencyMs, download_mbps: downloadMbps, upload_mbps: uploadMbps, client_ip: detectedIp, }), }).catch(() => {}); }; const handleRunServerSpeedtest = async () => { setSpeedtestProgress({ percent: 30, message: 'Benchmarking MotorSignal server to upstream internet probe...', }); const resp = await fetch('/api/ops/infrastructure/speedtest', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ mode: 'server_to_external' }), }); if (!resp.ok) { const data = await resp.json().catch(() => null); throw new Error(data?.detail || 'Failed to complete upstream speedtest'); } const data = (await resp.json()) as InfrastructureSpeedtestResult; setSpeedtestProgress({ percent: 100, currentMbps: data.download_mbps, message: 'Server upstream benchmark complete', }); const result: InfrastructureSpeedtestResult = { ...data, mode: 'server_to_external', direction_label: data.direction_label ?? 'MotorSignal Server ➔ Upstream Edge (1.1.1.1)', }; setServerSpeedtestResult(result); }; const handleRunSpeedtest = async () => { if (isRunningSpeedtest) return; setIsRunningSpeedtest(true); setSpeedtestError(null); setSpeedtestProgress({ percent: 5, message: 'Preparing benchmark...' }); try { if (speedtestMode === 'client_to_server') { await handleRunClientSpeedtest(); } else { await handleRunServerSpeedtest(); } } catch (err: unknown) { setSpeedtestError(err instanceof Error ? err.message : 'Network error executing speedtest'); } finally { setIsRunningSpeedtest(false); } }; // Initial fetch and user-selectable visibility-gated polling loop (5s, 10s, 30s) useEffect(() => { void fetchData(); const handleVisibilityChange = () => { if (document.visibilityState === 'visible') { void fetchData(); } }; document.addEventListener('visibilitychange', handleVisibilityChange); const pollIntervalMs = refreshInterval ? refreshInterval * 1000 : 30000; pollTimerRef.current = setInterval(() => { if (document.visibilityState === 'visible') { void fetchData(); } }, pollIntervalMs || 30000); return () => { document.removeEventListener('visibilitychange', handleVisibilityChange); if (pollTimerRef.current) { clearInterval(pollTimerRef.current); } }; }, [fetchData, refreshInterval]); const handleCopySha = (sha: string) => { if (!sha) return; navigator.clipboard.writeText(sha).then(() => { setCopiedSha(true); setTimeout(() => setCopiedSha(false), 2000); }); }; const formatBytes = (bytes: number | null): string => { if (bytes === null || bytes === undefined) return 'N/A'; if (bytes >= 1e12) return `${(bytes / 1e12).toFixed(2)} TB`; if (bytes >= 1e9) return `${(bytes / 1e9).toFixed(2)} GB`; if (bytes >= 1e6) return `${(bytes / 1e6).toFixed(1)} MB`; return `${(bytes / 1e3).toFixed(1)} KB`; }; const getServiceStatusBadge = (status: ServiceStatusValue) => { switch (status) { case 'active': return { label: 'Active (Running)', icon: 'check_circle', classes: 'bg-emerald-950/60 text-emerald-400 border-emerald-800/60', }; case 'inactive': return { label: 'Inactive (Stopped)', icon: 'pause_circle', classes: 'bg-amber-950/60 text-amber-400 border-amber-800/60', }; case 'failed': return { label: 'Failed', icon: 'cancel', classes: 'bg-rose-950/60 text-rose-400 border-rose-800/60', }; case 'unknown': default: return { label: 'Unknown / Unreachable', icon: 'help', classes: 'bg-slate-900/60 text-slate-400 border-slate-700/60', }; } }; const getComponentHealthBadge = (status: ComponentHealthStatus) => { switch (status) { case 'available': return { label: 'Available', icon: 'check_circle', classes: 'bg-emerald-950/60 text-emerald-400 border-emerald-800/60', }; case 'degraded': return { label: 'Degraded', icon: 'warning', classes: 'bg-amber-950/60 text-amber-400 border-amber-800/60', }; case 'unavailable': return { label: 'Unavailable', icon: 'cancel', classes: 'bg-rose-950/60 text-rose-400 border-rose-800/60', }; case 'unknown': default: return { label: 'Unknown', icon: 'help', classes: 'bg-slate-900/60 text-slate-400 border-slate-700/60', }; } }; const resources = data?.resources; const services = data?.services ?? []; const network = data?.network; const deployment = data?.deployment; return (
{/* Header & Controls */}
dns

Infrastructure & Runtime

Phase 2 Operations

Host system resources, systemd core services, network totals, and deployment runtime health.

{/* Selectable Auto-refresh interval (5s, 10s, 30s) */}
Auto: {[5, 10, 30].map((sec) => ( ))}
{/* Last refreshed */} {lastFetchedAt && ( Updated: {lastFetchedAt} )} {/* Manual Refresh Button */}
{/* Optional Warning Banner */} {fetchError && (
warning {fetchError}
)} {/* SECTION 1: System Resources */}

Server Resources

Target Host: Ubuntu VPS
{/* CPU Usage */}
CPU Usage memory
{resources?.cpu_percent !== null && resources?.cpu_percent !== undefined ? `${resources.cpu_percent}%` : 'Unavailable'}

Load: {resources?.load_avg ? resources.load_avg.join(', ') : 'N/A'}

{/* Progress Bar */}
{/* Memory (RAM) */}
Memory (RAM) developer_board
{resources?.memory ? `${formatBytes(resources.memory.used)} / ${formatBytes(resources.memory.total)}` : 'Unavailable'}

{resources?.memory ? `${resources.memory.percent}% used (${formatBytes(resources.memory.available)} free)` : 'N/A'}

{/* Progress Bar */}
= 90 ? 'bg-rose-500' : (resources?.memory?.percent ?? 0) >= 80 ? 'bg-amber-500' : 'bg-primary-container' }`} style={{ width: `${Math.min(100, Math.max(0, resources?.memory?.percent ?? 0))}%` }} />
{/* Swap Memory */}
Swap Space swap_horiz
{resources?.swap ? `${formatBytes(resources.swap.used)} / ${formatBytes(resources.swap.total)}` : 'Unavailable'}

{resources?.swap ? `${resources.swap.percent}% utilized` : 'N/A'}

{/* Progress Bar */}
{/* Disk Storage (/) */}
Root Disk (/) {resources?.disk?.critical ? ( CRITICAL ) : resources?.disk?.warning ? ( WARNING ) : null}
hard_drive
{resources?.disk ? `${formatBytes(resources.disk.used)} / ${formatBytes(resources.disk.total)}` : 'Unavailable'}

{resources?.disk ? `${resources.disk.percent}% used (${formatBytes(resources.disk.available)} free)` : 'N/A'}

{/* Progress Bar */}
{/* Server Uptime */}
Server Uptime schedule
{resources?.uptime_formatted || 'Unavailable'}

{resources?.uptime_seconds ? `${resources.uptime_seconds.toLocaleString()}s total uptime` : 'N/A'}

System running continuously
{/* SECTION 2: Core Systemd Services */}

Core Services (systemd)

Strict Allowlist: 4 Services
{services.map((svc) => { const badge = getServiceStatusBadge(svc.status); return (

{svc.display_name}

{svc.name}.service

{svc.description}

Service Status
{badge.icon} {badge.label}
); })}
{/* SECTION 3 & 4: Network Cumulative Totals & Deployment Health */}
{/* Network Cumulative Totals */}
network_check

Network Cumulative Totals

Aggregated across non-loopback interfaces since host boot

Not a rate
download Total Received
{formatBytes(network?.bytes_received ?? null)}

{network?.bytes_received ? `${network.bytes_received.toLocaleString()} bytes` : 'N/A'}

upload Total Transmitted
{formatBytes(network?.bytes_transmitted ?? null)}

{network?.bytes_transmitted ? `${network.bytes_transmitted.toLocaleString()} bytes` : 'N/A'}

{/* Speedtest Suite: Client-to-Server vs Server-to-Upstream */}
speed Network Speedtest & Diagnostics

Measure real-time latency and throughput across network segments

{/* Mode Toggle Tabs */}
{/* Direction description banner & trigger */}
{speedtestMode === 'client_to_server' ? 'sync_alt' : 'hub'} {speedtestMode === 'client_to_server' ? ( Client to Server: Measures latency, download, and upload between your operator browser and the MotorSignal web host. ) : ( Server to External: Measures server-side network performance from MotorSignal production host to upstream Cloudflare edge. )}
{/* Running Progress Card */} {isRunningSpeedtest && (
network_check {speedtestMode === 'client_to_server' ? 'Benchmarking Client ➔ MotorSignal Server' : 'Benchmarking MotorSignal Server ➔ Upstream CDN'}
{speedtestProgress.percent}%
{/* Progress bar */}
{speedtestProgress.message} {speedtestProgress.currentMbps !== undefined && ( {speedtestProgress.currentMbps} Mbps )}
)} {/* Error banner */} {speedtestError && (
error {speedtestError}
)} {/* Result display */} {activeSpeedtestResult && !isRunningSpeedtest && (
check_circle {activeSpeedtestResult.mode === 'client_to_server' ? 'Client to Server Result (My Connection → MotorSignal)' : 'Server to External Result (MotorSignal → Upstream Server)'}
{new Date(activeSpeedtestResult.tested_at).toLocaleTimeString()}
LATENCY {activeSpeedtestResult.latency_ms !== null && activeSpeedtestResult.latency_ms !== undefined ? `${activeSpeedtestResult.latency_ms} ms` : 'N/A'}
DOWNLOAD {activeSpeedtestResult.download_mbps !== null && activeSpeedtestResult.download_mbps !== undefined ? `${activeSpeedtestResult.download_mbps} Mbps` : 'N/A'}
UPLOAD {activeSpeedtestResult.upload_mbps !== null && activeSpeedtestResult.upload_mbps !== undefined ? `${activeSpeedtestResult.upload_mbps} Mbps` : 'N/A'}
Route: {activeSpeedtestResult.direction_label || (activeSpeedtestResult.mode === 'client_to_server' ? 'Browser ➔ MotorSignal Server' : 'MotorSignal Server ➔ Upstream CDN')}
Target: {activeSpeedtestResult.server_target} {activeSpeedtestResult.client_ip && IP: {activeSpeedtestResult.client_ip}}
)} {!activeSpeedtestResult && !isRunningSpeedtest && (
No speedtest run yet for{' '} {speedtestMode === 'client_to_server' ? 'My Connection → MotorSignal' : 'MotorSignal → Upstream Server'} . Click above to run test.
)}
info Cumulative Total Since Boot across physical network interfaces. Instantaneous bandwidth rates are not tracked.
{/* Deployment Health Foundations */}
deployed_code

Deployment Health Foundations

Active code revision and subsystem runtime readiness

Foundation
{/* Active Git Revision */}
Active Git Revision
{deployment?.short_revision || 'Unavailable'} {deployment?.git_revision && ( )}
{deployment?.revision_status ?? 'unavailable'}
{/* Health indicators */}
Website Ingress
{(() => { const badge = getComponentHealthBadge(deployment?.website_health ?? 'unknown'); return (
{badge.icon} {badge.label}
); })()}
API Readiness
{(() => { const badge = getComponentHealthBadge(deployment?.api_health ?? 'unknown'); return (
{badge.icon} {badge.label}
); })()}
{/* Deployment History Status */}
Deployment History: Audited in Phase 2
{/* Operations Actions & Deployment Controls */}
); }