-
-
Notifications
You must be signed in to change notification settings - Fork 156
/
getPort.js
60 lines (51 loc) · 1.27 KB
/
getPort.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
/* Get an available TCP port.
*
* |Name |Desc |
* |------|---------------|
* |port |Preferred ports|
* |host |Host address |
* |return|Available port |
*
* If preferred ports are not available, a random port will be returned.
*/
/* example
* getPort([3000, 3001], '127.0.0.1').then(port => {
* console.log(port);
* });
*/
/* module
* env: node
* since: 1.1.0
*/
/* typescript
* export declare function getPort(
* port?: number | number[],
* host?: string
* ): Promise<number>;
*/
_('toArr');
const net = require('net');
exports = function(ports, host) {
ports = toArr(ports);
ports.push(0);
return ports.reduce((seq, port) => {
return seq.catch(() => isAvailable(port, host));
}, Promise.reject());
};
// Passing 0 will get an available random port.
function isAvailable(port, host) {
return new Promise((resolve, reject) => {
const server = net.createServer();
server.unref();
server.on('error', reject);
const options = {};
options.port = port;
if (host) options.host = host;
server.listen(options, () => {
const { port } = server.address();
server.close(() => {
resolve(port);
});
});
});
}