verbatim = options.verbatim; } } return createLookupPromise(family, hostname, all, hints, verbatim); } function onlookupservice(err, hostname, service) { if (err) { this.reject(dnsException(err, 'getnameinfo', this.host)); return; } this.resolve({ hostname, service }); stopPerf(this, kPerfHooksDnsLookupServiceContext); } function createLookupServicePromise(hostname, port) { return new Promise((resolve, reject) => { const req = new GetNameInfoReqWrap(); req.hostname = hostname; req.port = port; req.oncomplete = onlookupservice; req.resolve = resolve; req.reject = reject; const err = getnameinfo(req, hostname, port); if (err) reject(dnsException(err, 'getnameinfo', hostname)); else startPerf(req, kPerfHooksDnsLookupServiceContext, { type: 'dns', name: 'lookupService', detail: { host: hostname, port } }); }); } function lookupService(address, port) { if (arguments.length !== 2) throw new ERR_MISSING_ARGS('address', 'port'); if (isIP(address) === 0) throw new ERR_INVALID_ARG_VALUE('address', address); validatePort(port); return createLookupServicePromise(address, +port); } function onresolve(err, result, ttls) { if (err) { this.reject(dnsException(err, this.bindingName, this.hostname)); return; } if (ttls && this.ttl) result = ArrayPrototypeMap( result, (address, index) => ({ address, ttl: ttls[index] })); this.resolve(result); stopPerf(this, kPerfHooksDnsLookupResolveContext); } function createResolverPromise(resolver, bindingName, hostname, ttl) { return new Promise((resolve, reject) => { const req = new QueryReqWrap(); req.bindingName = bindingName; req.hostname = hostname; req.oncomplete = onresolve; req.resolve = resolve; req.reject = reject; req.ttl = ttl; const err = resolver._handle[bindingName](req, toASCII(hostname)); if (err) reject(dnsException(err, bindingName, hostname)); else { startPerf(req, kPerfHooksDnsLookupResolveContext, { type: 'dns', name: bindingName, detail: { host: hostname, ttl } }); } }); } function resolver(bindingName) { function query(name, options) { validateString(name, 'name'); const ttl = !!(options && options.ttl); return createResolverPromise(this, bindingName, name, ttl); } ObjectDefineProperty(query, 'name', { value: bindingName }); return query; } const resolveMap = ObjectCreate(null); // Resolver instances correspond 1:1 to c-ares channels. class Resolver { constructor(options = undefined) { const timeout = validateTimeout(options); const tries = validateTries(options); this._handle = new ChannelWrap(timeout, tries); } } Resolver.prototype.getServers = CallbackResolver.prototype.getServers; Resolver.prototype.setServers = CallbackResolver.prototype.setServers; Resolver.prototype.cancel = CallbackResolver.prototype.cancel; Resolver.prototype.setLocalAddress = CallbackResolver.prototype.setLocalAddress; Resolver.prototype.resolveAny = resolveMap.ANY = resolver('queryAny'); Resolver.prototype.resolve4 = resolveMap.A = resolver('queryA'); Resolver.prototype.resolve6 = resolveMap.AAAA = resolver('queryAaaa'); Resolver.prototype.resolveCaa = resolveMap.CAA = resolver('queryCaa'); Resolver.prototype.resolveCname = resolveMap.CNAME = resolver('queryCname'); Resolver.prototype.resolveMx = resolveMap.MX = resolver('queryMx'); Resolver.prototype.resolveNs = resolveMap.NS = resolver('queryNs'); Resolver.prototype.resolveTxt = resolveMap.TXT = resolver('queryTxt'); Resolver.prototype.resolveSrv = resolveMap.SRV = resolver('querySrv'); Resolver.prototype.resolvePtr = resolveMap.PTR = resolver('queryPtr'); Resolver.prototype.resolveNaptr = resolveMap.NAPTR = resolver('queryNaptr'); Resolver.prototype.resolveSoa = resolveMap.SOA = resolver('querySoa'); Resolver.prototype.reverse = resolver('getHostByAddr'); Resolver.prototype.resolve = function resolve(hostname, rrtype) { let resolver; if (rrtype !== undefined) { validateString(rrtype, 'rrtype'); resolver = resolveMap[rrtype]; if (typeof resolver !== 'function') throw new ERR_INVALID_ARG_VALUE('rrtype', rrtype); } else { resolver = resolveMap.A; } return ReflectApply(resolver, this, [hostname]); }; module.exports = { lookup, lookupService, Resolver }; bindDefaultResolver(module.exports, Resolver.prototype);