whois-api
Version:
An independent Whois Client and Parser written in Javascript.
151 lines (127 loc) • 3.73 kB
JavaScript
var _net = require('net');
var _net2 = _interopRequireDefault(_net);
var _lodash = require('lodash');
var _lodash2 = _interopRequireDefault(_lodash);
var _punycode = require('punycode');
var _punycode2 = _interopRequireDefault(_punycode);
var _servers = require('./servers.json');
var _servers2 = _interopRequireDefault(_servers);
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
var validateAddress = function validateAddress(address) {
switch (true) {
case !address:
return new Error('Address is empty');
case address.indexOf(':') > -1:
return new Error('IPv6 not supported');
case address.indexOf('@') > -1:
return new Error('Email not supported');
default:
return null;
}
};
var isIPv4 = function isIPv4(address) {
return address.match(/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/) != null;
};
var getServer = function getServer(address, aSpecificServer) {
var server = void 0;
if (aSpecificServer) {
server = aSpecificServer;
} else {
if (isIPv4(address)) {
server = _servers2.default['_']['ipv4'];
} else {
var tld = _punycode2.default.toASCII(address);
while (true) {
server = _servers2.default[tld];
if (!tld || server) {
break;
}
tld = tld.replace(/^.+?(\.|$)/, '');
}
}
}
if (server) {
if (typeof server === 'string') {
var parts = server.split(':');
server = {
host: parts[0],
port: parts[1]
};
}
_lodash2.default.defaults(server, {
port: 43,
query: "$addr\r\n"
});
}
return server;
};
var lookup = function lookup(address, options, callback) {
if (typeof done === 'undefined' && typeof options === 'function') {
callback = options;
options = {};
}
_lodash2.default.defaults(options, {
follow: 2
});
callback = _lodash2.default.once(callback);
var validationError = validateAddress(address);
if (validationError) {
return callback(validationError);
}
var server = getServer(address, options.server);
if (!server) {
return callback(new Error('No WHOIS server found for the address'));;
}
var socket = _net2.default.connect(server.port, server.host, function () {
var idn = _punycode2.default.toASCII(address);
return socket.write(server.query.replace('$addr', idn));
});
socket.setEncoding('utf-8');
var data = '';
socket.on('data', function (chunk) {
return data += chunk;
});
socket.on('timeout', function () {
return callback(new Error('Connection timeout'));
});
socket.on('error', function (err) {
return callback(err);
});
return socket.on('close', function (err) {
if (options.follow > 0) {
var match = data.match(/(ReferralServer|Registrar Whois|Whois Server):\s*(r?whois:\/\/)?(.+)/);
if (match != null) {
options = _lodash2.default.extend({}, options, {
follow: options.follow - 1,
server: match[3]
});
lookup(address, options, function (err, parts) {
if (err != null) {
return callback(err);
}
if (options.verbose) {
return callback(null, [{
server: server,
data: data
}].concat(parts));
} else {
return callback(null, parts);
}
});
return;
}
}
if (options.verbose) {
return callback(null, [{
server: server,
data: data
}]);
} else {
return callback(null, data);
}
});
};
module.exports = {
lookup: lookup
};
;