diff options
Diffstat (limited to 'lib/dns.js')
-rw-r--r-- | lib/dns.js | 148 |
1 files changed, 121 insertions, 27 deletions
diff --git a/lib/dns.js b/lib/dns.js index cd7bc817d3..6794ef426f 100644 --- a/lib/dns.js +++ b/lib/dns.js @@ -1,4 +1,72 @@ -var dns = process.binding('dns'); +var dns = process.binding('cares'); + + +var watchers = {}; +var activeWatchers = {}; + + +var timer = new process.Timer(); + +timer.callback = function () { + for (var socket in activeWatchers) { + var s = parseInt(socket); + channel.processFD( watchers[socket].read ? s : dns.SOCKET_BAD + , watchers[socket].write ? s : dns.SOCKET_BAD + ); + } + updateTimer(); +} + + +function updateTimer() { + timer.stop(); + + for (var socket in activeWatchers) { // if !empty(activeWatchers) + var max = 20000; + var timeout = channel.timeout(max); + + timer.start(timeout, 0); + + return; + } +} + + +var channel = new dns.Channel({SOCK_STATE_CB: function (socket, read, write) { + var watcher; + + if (socket in watchers) { + watcher = watchers[socket].watcher; + } else { + watcher = new process.IOWatcher(); + watchers[socket] = { read: read + , write: write + , watcher: watcher + }; + + watcher.callback = function(read, write) { + channel.processFD( read ? socket : dns.SOCKET_BAD + , write ? socket : dns.SOCKET_BAD + ); + updateTimer(); + } + } + + watcher.set(socket, read == 1, write == 1); + + if (!(read || write)) { + watcher.stop(); + delete activeWatchers[socket]; + return; + } else { + watcher.start(); + activeWatchers[socket] = watcher; + } + + updateTimer(); +}}); + + exports.resolve = function (domain, type_, callback_) { var type, callback; @@ -19,38 +87,64 @@ exports.resolve = function (domain, type_, callback_) { } } -exports.resolve4 = dns.resolve4; -exports.resolve6 = dns.resolve6; -exports.resolveMx = dns.resolveMx; -exports.resolveTxt = dns.resolveTxt; -exports.resolveSrv = dns.resolveSrv; -exports.reverse = dns.reverse; - -// ERROR CODES - -// timeout, SERVFAIL or similar. -exports.TEMPFAIL = dns.TEMPFAIL; -// got garbled reply. -exports.PROTOCOL = dns.PROTOCOL; +exports.getHostByName = function (domain, callback) { + channel.getHostByName(domain, dns.AF_INET, callback); +}; -// domain does not exists. -exports.NXDOMAIN = dns.NXDOMAIN; +// Easy DNS A/AAAA look up +exports.lookup = function (domain, callback) { + var addressType = dns.isIP(domain); + if (addressType) { + process.nextTick(function () { + callback(null, domain, addressType); + }); + } else { + channel.getHostByName(domain, dns.AF_INET, function (err, domains4) { + if (domains4 && domains4.length) { + callback(null, domains4[0], 4); + } else { + channel.getHostByName(domain, dns.AF_INET6, function (err, domains6) { + if (domains6 && domains6.length) { + callback(null, domains6[0], 6); + } else { + callback(err, []); + } + }); + } + }); + } +}; -// domain exists but no data of reqd type. -exports.NODATA = dns.NODATA; -// out of memory while processing. -exports.NOMEM = dns.NOMEM; +exports.resolve4 = function(domain, callback) { channel.query(domain, dns.A, callback) }; +exports.resolve6 = function(domain, callback) { channel.query(domain, dns.AAAA, callback) }; +exports.resolveTxt = function(domain, callback) { channel.query(domain, dns.TXT, callback) }; +exports.resolveSrv = function(domain, callback) { channel.query(domain, dns.SRV, callback) }; +exports.reverse = function(domain, callback) { channel.query(domain, dns.PTR, callback) }; +exports.resolveNs = function(domain, callback) { channel.query(domain, dns.NS, callback) }; -// the query is malformed. -exports.BADQUERY = dns.BADQUERY; var resolveMap = { - 'A': exports.resolve4, + 'A' : exports.resolve4, 'AAAA': exports.resolve6, - 'MX': exports.resolveMx, - 'TXT': exports.resolveTxt, - 'SRV': exports.resolveSrv, - 'PTR': exports.reverse, + 'TXT' : exports.resolveTxt, + 'SRV' : exports.resolveSrv, + 'PTR' : exports.resolvePtr, + 'NS' : exports.resolveNs, }; + +// ERROR CODES +exports.NODATA = dns.NODATA; +exports.FORMERR = dns.FORMERR; +exports.BADRESP = dns.BADRESP; +exports.NOTFOUND = dns.NOTFOUND; +exports.BADNAME = dns.BADNAME; +exports.TIMEOUT = dns.TIMEOUT; +exports.CONNREFUSED = dns.CONNREFUSED; +exports.NOMEM = dns.NOMEM; +exports.DESTRUCTION = dns.DESTRUCTION; + +exports.NOTIMP = dns.NOTIMP; +exports.EREFUSED = dns.EREFUSED; +exports.SERVFAIL = dns.SERVFAIL; |