Files
vynte-connect/src/status.ts
T

93 lines
2.1 KiB
TypeScript

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> = {}
): NetworkStatus {
return {
ip: '',
fqdn: '',
peers: '0/0',
connectedSince: null,
gatewayHost: GATEWAY_HOST,
...overrides,
};
}
export function normalizeStatus(
raw: string,
previousStatus: Partial<NetworkStatus> = {}
): 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}`,
});
}