2018-02-08 10:21:31 -08:00
|
|
|
'use strict';
|
|
|
|
|
|
|
|
|
|
exports = module.exports = {
|
2018-02-08 11:42:45 -08:00
|
|
|
resolve: resolve
|
2018-02-08 10:21:31 -08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
var assert = require('assert'),
|
|
|
|
|
dns = require('dns');
|
|
|
|
|
|
|
|
|
|
// a note on TXT records. It doesn't have quotes ("") at the DNS level. Those quotes
|
|
|
|
|
// are added for DNS server software to enclose spaces. Such quotes may also be returned
|
|
|
|
|
// by the DNS REST API of some providers
|
|
|
|
|
function resolve(hostname, rrtype, options, callback) {
|
|
|
|
|
assert.strictEqual(typeof hostname, 'string');
|
|
|
|
|
assert.strictEqual(typeof rrtype, 'string');
|
|
|
|
|
assert(options && typeof options === 'object');
|
|
|
|
|
assert.strictEqual(typeof callback, 'function');
|
|
|
|
|
|
|
|
|
|
const resolver = new dns.Resolver();
|
|
|
|
|
if (options.server) resolver.setServers([ options.server ]);
|
|
|
|
|
|
|
|
|
|
// should callback with ECANCELLED but looks like we might hit https://github.com/nodejs/node/issues/14814
|
|
|
|
|
const timerId = setTimeout(resolver.cancel.bind(resolver), options.timeout || 5000);
|
|
|
|
|
|
|
|
|
|
resolver.resolve(hostname, rrtype, function (error, result) {
|
|
|
|
|
clearTimeout(timerId);
|
|
|
|
|
|
2018-02-08 14:27:02 -08:00
|
|
|
if (error && error.code === 'ECANCELLED') error.code = 'TIMEOUT';
|
|
|
|
|
|
2018-02-08 14:10:53 -08:00
|
|
|
// result is an empty array if there was no error but there is no record. when you query a random
|
|
|
|
|
// domain, it errors with ENOTFOUND. But if you query an existing domain (A record) but with different
|
|
|
|
|
// type (CNAME) it is not an error and empty array
|
2018-02-08 10:21:31 -08:00
|
|
|
callback(error, result);
|
|
|
|
|
});
|
|
|
|
|
}
|