| 634 | } |
| 635 | |
| 636 | function buildReliabilityProfile(speedResults, totalQueries) { |
| 637 | if (totalQueries === 0) { |
| 638 | return { status: 'no-data', successCount: 0, failureCount: 0, totalQueries: 0, message: 'No hostnames configured for testing.' }; |
| 639 | } |
| 640 | const successCount = speedResults.filter(s => typeof s === 'number').length; |
| 641 | const failureCount = totalQueries - successCount; |
| 642 | |
| 643 | let status, message; |
| 644 | if (successCount === 0) { |
| 645 | status = 'failed'; |
| 646 | message = `All queries failed from your current network. This may indicate regional/IP blocking or temporary connectivity issues. Each timeout counts as ${TIMEOUT_PENALTY_MS}ms penalty.`; |
| 647 | } else if (failureCount > 0) { |
| 648 | status = 'partial'; |
| 649 | message = `${failureCount} of ${totalQueries} queries timed out. Failed runs scored as ${TIMEOUT_PENALTY_MS}ms.`; |
| 650 | } else { |
| 651 | status = 'healthy'; |
| 652 | message = 'All queries succeeded.'; |
| 653 | } |
| 654 | return { status, successCount, failureCount, totalQueries, message }; |
| 655 | } |
| 656 | |
| 657 | // ─── DNS Query Logic (preserved exactly) ───────────────────────────────────── |
| 658 | |