forked from J-Chaniotis/external-ip
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathext-ip.js
80 lines (66 loc) · 2.28 KB
/
ext-ip.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
"use strict";
let utils = require("./utils");
let requests = require("./requests");
let defaults = require("./defaults");
let events = require("events");
let EventEmitter = events.EventEmitter;
/**
* external-ip module
* @param {object} [config]
* @return {function(Promise)|{addListener:*, on:*, once:*, removeListener:*}}
*/
module.exports = config => {
config = config || {};
// make config compatible to old 'external-ip' module
if( config.hasOwnProperty("getIP") && !config.hasOwnProperty("mode") ) {
config.mode = config.getIP;
console.info("ext-ip: config parameter 'getIP' is deprecated, use 'mode' instead");
}
// validate an build config
let validation = utils.validateConfig(config);
if( validation !== true ) {
let message = "ext-ip config validation:\n- ";
message += validation.join("\n- ");
throw new Error(message);
}
config = utils.mergeConfig(config, defaults);
// create instance wrapper
let emitter = new EventEmitter();
let services = requests.setup(config);
/**
* wrapper function for execution after instance creation
* @param {function} [cb]
* @return {Promise}
*/
let extIP = cb => {
cb = cb || (() => {});
let handling = config.mode === "parallel" ? utils.promiseParallel : utils.promiseSequential;
let promise = handling(services);
promise.then(ip => {
cb(null, ip);
emitter.emit("ip", ip);
return Promise.resolve(ip);
}, err => {
let error = new Error(err);
cb(error);
emitter.emit("err", error);
return error;
});
return promise;
};
// extend wrapper with event emitter methods
Object.assign(extIP, emitter, {
on : emitter.on,
once : emitter.once,
removeListener : emitter.removeListener,
addListener : emitter.addListener
});
// wrapper function for use of promises on response
// it's used to prevent 'unhandled promise rejection' warning on normal use
extIP.get = cb => {
return new Promise((resolve, reject) => {
extIP(cb).then(ip => resolve(ip), err => reject(new Error(err)));
});
};
return extIP;
};