Archived
67 lines
1.5 KiB
TypeScript
67 lines
1.5 KiB
TypeScript
import { GATEWAY_HOST } from './config';
|
|
import { NetworkStatus } from './types';
|
|
|
|
interface NetBirdStatusResponse {
|
|
daemonStatus?: string;
|
|
management?: {
|
|
connected?: boolean;
|
|
};
|
|
signal?: {
|
|
connected?: boolean;
|
|
};
|
|
peers?: {
|
|
connected?: number;
|
|
total?: number;
|
|
};
|
|
}
|
|
|
|
export function baseStatus(overrides: NetworkStatus): NetworkStatus {
|
|
return {
|
|
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 connected =
|
|
daemonConnected &&
|
|
(managementConnected || signalConnected);
|
|
|
|
if (connected) {
|
|
return baseStatus({
|
|
state: 'connected',
|
|
title: 'Connected',
|
|
message: "You're on the Vynte network.",
|
|
connectedSince:
|
|
previousStatus.connectedSince ?? Date.now(),
|
|
});
|
|
}
|
|
|
|
return baseStatus({
|
|
state: 'disconnected',
|
|
title: 'Disconnected',
|
|
message: 'Click the flame to connect with NetBird.',
|
|
});
|
|
} |