UNPKG

whois-api

Version:

An independent Whois Client and Parser written in Javascript.

151 lines (127 loc) 3.73 kB
'use strict'; 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 };