// TCP-пинг: меряем время до открытия TCP-соединения с хостом:портом. // Это не ICMP-ping, но для VPN-серверов точнее (проверяем именно тот порт, куда подключается клиент). import net from "node:net"; import dns from "node:dns/promises"; const DEFAULT_TIMEOUT = 3000; export async function tcpPing(host, port, timeout = DEFAULT_TIMEOUT) { const start = Date.now(); return new Promise((resolve) => { const socket = new net.Socket(); let done = false; const finish = (result) => { if (done) return; done = true; socket.removeAllListeners(); socket.destroy(); resolve(result); }; socket.setTimeout(timeout); socket.once("connect", () => finish({ ok: true, latency: Date.now() - start }), ); socket.once("timeout", () => finish({ ok: false, latency: null, error: "timeout" }), ); socket.once("error", (err) => finish({ ok: false, latency: null, error: err.code || err.message }), ); try { socket.connect(port, host); } catch (err) { finish({ ok: false, latency: null, error: err.message }); } }); } export async function resolveHost(host) { if (net.isIP(host)) return host; try { const result = await dns.lookup(host); return result.address; } catch { return null; } }