@herbertgao/surgio
Version:
Generating rules for Surge, Clash, Quantumult like a PRO
51 lines • 1.97 kB
JavaScript
;
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