fcoin/lib/net/dns.js
Christopher Jeffrey ddda6c9dbd
dns: minor.
2017-07-31 18:21:03 -07:00

100 lines
1.8 KiB
JavaScript

/*!
* dns.js - dns backend for bcoin
* Copyright (c) 2014-2017, Christopher Jeffrey (MIT License).
* https://github.com/bcoin-org/bcoin
*/
'use strict';
/**
* @module net/dns
*/
const dns = require('dns');
const socks = require('./socks');
const options = {
family: 4,
hints: dns.ADDRCONFIG | dns.V4MAPPED,
all: true
};
/**
* Resolve host (async w/ libcares).
* @param {String} host
* @param {String?} proxy - Tor socks proxy.
* @returns {Promise}
*/
exports.resolve = function resolve(host, proxy) {
if (proxy)
return socks.resolve(proxy, host);
return new Promise((resolve, reject) => {
dns.resolve(host, 'A', to((err, result) => {
if (err) {
reject(err);
return;
}
if (result.length === 0) {
reject(new Error('No DNS results.'));
return;
}
resolve(result);
}));
});
};
/**
* Resolve host (getaddrinfo).
* @param {String} host
* @param {String?} proxy - Tor socks proxy.
* @returns {Promise}
*/
exports.lookup = function lookup(host, proxy) {
if (proxy)
return socks.resolve(proxy, host);
return new Promise((resolve, reject) => {
dns.lookup(host, options, to((err, result) => {
if (err) {
reject(err);
return;
}
if (result.length === 0) {
reject(new Error('No DNS results.'));
return;
}
const addrs = [];
for (const addr of result)
addrs.push(addr.address);
resolve(addrs);
}));
});
};
/*
* Helpers
*/
function to(callback) {
const timeout = setTimeout(() => {
callback(new Error('DNS request timed out.'));
callback = null;
}, 5000);
return function(err, result) {
if (callback) {
clearTimeout(timeout);
callback(err, result);
}
};
}