124 lines
3.2 KiB
JavaScript
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;
|