93 lines
2.1 KiB
TypeScript
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}`,
|
|
});
|
|
} |