import { GATEWAY_HOST } from './config'; export interface NetworkStatus { state?: string; title?: string; message?: string; ip: string; fqdn: string; peers: string; connectedSince: number | null; gatewayHost: string; } interface NetBirdStatusResponse { daemonStatus?: string; netbirdIp?: string; fqdn?: string; management?: { connected?: boolean; }; signal?: { connected?: boolean; }; peers?: { connected?: number; total?: number; }; } export function baseStatus( overrides: Partial = {} ): NetworkStatus { return { ip: '', fqdn: '', peers: '0/0', connectedSince: null, gatewayHost: GATEWAY_HOST, ...overrides, }; } export function normalizeStatus( raw: string, previousStatus: Partial = {} ): NetworkStatus { let parsed: NetBirdStatusResponse; try { parsed = JSON.parse(raw) as NetBirdStatusResponse; } catch { return baseStatus({ state: 'error', title: 'Connection failed', message: `${GATEWAY_HOST} status could not be parsed.`, }); } const daemonConnected = String(parsed.daemonStatus ?? '') .toLowerCase() .includes('connected'); const managementConnected = parsed.management?.connected === true; const signalConnected = parsed.signal?.connected === true; const hasIdentity = Boolean(parsed.netbirdIp || parsed.fqdn); const connected = daemonConnected && (managementConnected || signalConnected || hasIdentity); const peerCount = parsed.peers ?? {}; if (connected) { return baseStatus({ state: 'connected', title: 'Connected', message: "You're on the Vynte network.", ip: parsed.netbirdIp || 'Assigned', fqdn: parsed.fqdn || '', peers: `${peerCount.connected ?? 0}/${peerCount.total ?? 0}`, connectedSince: previousStatus.connectedSince ?? Date.now(), }); } return baseStatus({ state: 'disconnected', title: 'Disconnected', message: 'Click the flame to connect with NetBird.', fqdn: parsed.fqdn || '', peers: `${peerCount.connected ?? 0}/${peerCount.total ?? 0}`, }); }