-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
89 lines (76 loc) · 1.91 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
var IDNSCache = require('./dns-cache/i-dns-cache');
var IDNSCore = require('./dns-core/i-dns-core');
var async = require('async');
var net = require('net');
var _ = require('underscore');
module.exports = (function () {
'use strict';
function URLResolver (config, callback) {
config = config || {};
this.dnsCore = new IDNSCore(config.core);
this.dnsCache = new IDNSCache(config.cache, callback);
}
URLResolver.prototype.resolve = function (hostname, options, callback) {
async.waterfall([
function (cb) {
this.dnsCache.get(hostname, cb);
}.bind(this),
function (addresses, cb) {
if (addresses) {
return cb(null, addresses, true);
}
this.dnsCore.resolve(
hostname,
options,
function (e, addresses) {
cb(e, addresses, false);
}
);
}.bind(this),
function (addresses, cached, cb) {
if (cached === true) {
return cb(null, addresses);
}
else if (!addresses) {
return cb(null, null);
}
this.dnsCache.set(hostname, addresses, cb);
}.bind(this),
], function (e, addresses) {
if (e) {
return callback(e);
}
if (!Array.isArray(addresses) || !addresses.length) {
return callback(
new Error('IDNSResolver: Hostname `' + hostname + '` couldn\'t be resolved to any IP address')
);
}
callback(null, addresses);
}.bind(this));
};
URLResolver.prototype.resolveAll = function (hostname, options, callback) {
this.resolve(hostname, options, function (e, addresses) {
if (e) {
return callback(e);
}
callback(
null,
addresses,
net.isIPv4(addresses[0]) ? 4 : 6
);
});
};
URLResolver.prototype.resolveRandom = function (hostname, options, callback) {
this.resolve(hostname, options, function (e, addresses) {
if (e) {
return callback(e);
}
callback(
null,
_.sample(addresses),
net.isIPv4(addresses[0]) ? 4 : 6
);
});
};
return URLResolver;
})();