veriname/dns_native.js

124 lines
3.2 KiB
JavaScript

var ares = require('./ares/build/default/ares');
function rec_toString() {
var out = "";
console.log(this);
out += ";; Question Section:\n";
for (var i = 0, len = this.question.length; i < len; i++) {
var q = this.question[i];
out += q.name + "\t" + (q.class || q.nclass) + "\t" + (q.type || q.ntype) + "\n";
}
out += ";; Answer Section:\n";
for (var i = 0, len = this.answer.length; i < len; i++) {
var r = this.answer[i];
out += r.name + "\t" + r.ttl + "\t" + (r.class || r.nclass) + "\t" + (r.type || r.ntype) + "\t" + (r.text || '<unkown type>') + "\n";
}
out += ";; Authority Section:\n";
for (var i = 0, len = this.authority.length; i < len; i++) {
var r = this.authority[i];
out += r.name + "\t" + r.ttl + "\t" + (r.class || r.nclass) + "\t" + (r.type || r.ntype) + "\t" + (r.text || '<unkown type>') + "\n";
}
out += ";; Additional Section:\n";
for (var i = 0, len = this.additional.length; i < len; i++) {
var r = this.additional[i];
out += r.name + "\t" + r.ttl + "\t" + (r.class || r.nclass) + "\t" + (r.type || r.ntype) + "\t" + (r.text || '<unkown type>') + "\n";
}
return out;
}
function newChannel(servers) {
var channel;
var watchers = {};
var activeWatchers = {};
var timer = new process.Timer();
timer.callback = function () {
channel.processFD(ares.SOCKET_BAD, ares.SOCKET_BAD);
updateTimer();
}
function updateTimer() {
timer.stop();
// Were just checking to see if activeWatchers is empty or not
for (var socket in activeWatchers) {
if (activeWatchers.hasOwnProperty(socket)) {
var timeout = channel.timeout(-1);
timer.start(timeout, 0);
// Short circuit the loop on first find.
return;
}
}
}
channel = new ares.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 : ares.SOCKET_BAD, write ? socket : ares.SOCKET_BAD);
updateTimer();
}
}
watcher.stop();
if (!(read || write)) {
delete activeWatchers[socket];
return;
} else {
watcher.set(socket, read == 1, write == 1);
watcher.start();
activeWatchers[socket] = watcher;
}
updateTimer();
}});
if (servers) {
channel.setServers(servers);
}
/* wrapper mapping type strings to numerical values */
channel._query = channel.query;
channel.query = function(domain, type, callback) {
channel._query(domain, ares[type], function(err, result) {
if (result) result.toString = rec_toString;
// console.log(result);
callback(err, result);
});
};
return channel;
};
var channel = newChannel();
exports.query = channel.query;
exports.newChannel = newChannel;
// ERROR CODES
exports.NODATA = ares.NODATA;
exports.FORMERR = ares.FORMERR;
exports.BADRESP = ares.BADRESP;
exports.NOTFOUND = ares.NOTFOUND;
exports.BADNAME = ares.BADNAME;
exports.TIMEOUT = ares.TIMEOUT;
exports.CONNREFUSED = ares.CONNREFUSED;
exports.NOMEM = ares.NOMEM;
exports.DESTRUCTION = ares.DESTRUCTION;
exports.NOTIMP = ares.NOTIMP;
exports.EREFUSED = ares.EREFUSED;
exports.SERVFAIL = ares.SERVFAIL;