From bd7ad919a8249a696cb3875fbc0ca7100c091ab6 Mon Sep 17 00:00:00 2001 From: HDTianRu <3291691454@qq.com> Date: Sun, 18 Aug 2024 15:18:32 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=97=A0=E6=B3=95=E4=B8=8B?= =?UTF-8?q?=E8=BD=BD=E8=B5=84=E6=BA=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- utils/network.js | 42 ++++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/utils/network.js b/utils/network.js index b4eb275..a45c778 100644 --- a/utils/network.js +++ b/utils/network.js @@ -1,29 +1,27 @@ -import http from 'http'; -import https from 'https'; -export async function checkLatency(url) { - let request = http; - if (url.startsWith('https')) { - request = https; +import fetch from 'node-fetch'; + +export async function checkLatency(url, timeout = 5000) { + const controller = new AbortController() + const { signal } = controller + const timeoutId = setTimeout(() => controller.abort(), timeout) + + const start = Date.now() + + try { + await fetch(url, { signal }) + const latency = Date.now() - start + return { url, latency } + } catch (err) { + logger.debug(`下载节点 ${url} 连接失败:`, err.message) + return { url, latency: Infinity } + } finally { + clearTimeout(timeoutId) } - return new Promise(resolve => { - const start = Date.now(); - request - .get(url, res => { - res.on('data', () => {}); - res.on('end', () => { - const latency = Date.now() - start; - resolve({ url, latency }); - }); - }) - .on('error', err => { - logger.debug(`下载节点 ${url} 连接失败:`, err.message); - resolve({ url, latency: Infinity }); - }); - }); } + export async function findLowestLatencyUrl(urls) { - const results = await Promise.all(urls.map(checkLatency)); + const results = await Promise.allSettled(urls.map(checkLatency)); const lowestLatencyResult = results.reduce((prev, curr) => prev.latency < curr.latency ? prev : curr );