|
export interface ConnectionStatus { |
|
connected: boolean; |
|
latency: number; |
|
lastChecked: string; |
|
} |
|
|
|
export const checkConnection = async (): Promise<ConnectionStatus> => { |
|
try { |
|
|
|
const online = navigator.onLine; |
|
|
|
if (!online) { |
|
return { |
|
connected: false, |
|
latency: 0, |
|
lastChecked: new Date().toISOString(), |
|
}; |
|
} |
|
|
|
|
|
const endpoints = [ |
|
'/api/health', |
|
'/', |
|
'/favicon.ico', |
|
]; |
|
|
|
let latency = 0; |
|
let connected = false; |
|
|
|
for (const endpoint of endpoints) { |
|
try { |
|
const start = performance.now(); |
|
const response = await fetch(endpoint, { |
|
method: 'HEAD', |
|
cache: 'no-cache', |
|
}); |
|
const end = performance.now(); |
|
|
|
if (response.ok) { |
|
latency = Math.round(end - start); |
|
connected = true; |
|
break; |
|
} |
|
} catch (endpointError) { |
|
console.debug(`Failed to connect to ${endpoint}:`, endpointError); |
|
continue; |
|
} |
|
} |
|
|
|
return { |
|
connected, |
|
latency, |
|
lastChecked: new Date().toISOString(), |
|
}; |
|
} catch (error) { |
|
console.error('Connection check failed:', error); |
|
return { |
|
connected: false, |
|
latency: 0, |
|
lastChecked: new Date().toISOString(), |
|
}; |
|
} |
|
}; |
|
|