UNPKG

@herbertgao/surgio

Version:

Generating rules for Surge, Clash, Quantumult like a PRO

51 lines 1.97 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.resolve4And6 = exports.resolveDomain = void 0; const dns_1 = require("dns"); const logger_1 = require("@surgio/logger"); const bluebird_1 = __importDefault(require("bluebird")); const cache_manager_1 = require("cache-manager"); const ms_1 = __importDefault(require("ms")); const env_flag_1 = require("./env-flag"); const domainCache = (0, cache_manager_1.caching)('memory', { ttl: (0, ms_1.default)('1d'), max: 5000, }); const logger = (0, logger_1.createLogger)({ service: 'surgio:utils:dns' }); const resolveDomain = async (domain, timeout = (0, env_flag_1.getNetworkResolveTimeout)()) => { const cached = await (await domainCache).get(domain); if (cached) { return cached; } logger.debug(`try to resolve domain ${domain}`); const now = Date.now(); const records = await bluebird_1.default.race([ (0, exports.resolve4And6)(domain), bluebird_1.default.delay(timeout).then(() => []), ]); logger.debug(`resolved domain ${domain}: ${JSON.stringify(records)} ${Date.now() - now}ms`); if (records.length) { const address = records.map((item) => item.address); await (await domainCache).set(domain, address, records[0].ttl); // ttl is in seconds return address; } // istanbul ignore next return []; }; exports.resolveDomain = resolveDomain; const resolve4And6 = async (domain) => { // istanbul ignore next function onErr() { return []; } const [ipv4, ipv6] = await Promise.all([ dns_1.promises.resolve4(domain, { ttl: true }).catch(onErr), dns_1.promises.resolve6(domain, { ttl: true }).catch(onErr), ]); return [...ipv4, ...ipv6]; }; exports.resolve4And6 = resolve4And6; //# sourceMappingURL=dns.js.map