UNPKG

@devicecloud.dev/dcd

Version:

Better cloud maestro testing

101 lines (100 loc) 4.05 kB
"use strict"; /** * Utility for checking internet connectivity using third-party endpoints */ Object.defineProperty(exports, "__esModule", { value: true }); exports.checkInternetConnectivity = checkInternetConnectivity; /** * Check if the system has internet connectivity by testing against * multiple reliable third-party endpoints with detailed diagnostics. * * @returns Promise<ConnectivityCheckResult> - Detailed connectivity check results */ async function checkInternetConnectivity() { // Use multiple reliable endpoints to test connectivity const testEndpoints = [ { url: 'https://www.google.com/generate_204', description: 'Google' }, { url: 'https://www.cloudflare.com/cdn-cgi/trace', description: 'Cloudflare' }, { url: 'https://1.1.1.1/', description: 'Cloudflare DNS' }, ]; const endpointResults = []; let anySuccess = false; // Try each endpoint with a short timeout for (const { url, description } of testEndpoints) { const startTime = Date.now(); try { const controller = new AbortController(); const timeoutId = setTimeout(() => controller.abort(), 3000); // 3 second timeout const response = await fetch(url, { method: 'HEAD', // Use HEAD to minimize data transfer signal: controller.signal, // Disable redirects to get faster response redirect: 'manual', }); clearTimeout(timeoutId); const latencyMs = Date.now() - startTime; // Any response (including 3xx redirects) indicates connectivity if (response) { anySuccess = true; endpointResults.push({ endpoint: `${description} (${url})`, success: true, statusCode: response.status, latencyMs, }); // Found working connection, no need to test more break; } } catch (error) { const latencyMs = Date.now() - startTime; let errorMessage = 'Unknown error'; if (error instanceof Error) { if (error.name === 'AbortError') { errorMessage = 'Request timeout (>3s)'; } else if (error.message.includes('fetch failed')) { errorMessage = 'Network request failed (DNS/connection error)'; } else if (error.message.includes('ENOTFOUND')) { errorMessage = 'DNS resolution failed'; } else if (error.message.includes('ECONNREFUSED')) { errorMessage = 'Connection refused'; } else if (error.message.includes('ETIMEDOUT')) { errorMessage = 'Connection timeout'; } else if (error.message.includes('ENETUNREACH')) { errorMessage = 'Network unreachable'; } else { errorMessage = error.message; } } endpointResults.push({ endpoint: `${description} (${url})`, success: false, error: errorMessage, latencyMs, }); // Continue to next endpoint if this one fails continue; } } // Generate developer-friendly message let message; if (anySuccess) { const successfulEndpoint = endpointResults.find((r) => r.success); message = `Internet connectivity verified via ${successfulEndpoint?.endpoint} (${successfulEndpoint?.latencyMs}ms)`; } else { const testedEndpoints = endpointResults.map((r) => r.endpoint).join(', '); message = `No internet connectivity detected. Tested endpoints: ${testedEndpoints}`; } return { connected: anySuccess, endpointResults, message, }; }