Skip to content

Commit 637b0fd

Browse files
committed
fix: try to use next available port
closes #15
1 parent de63f55 commit 637b0fd

File tree

3 files changed

+45
-15
lines changed

3 files changed

+45
-15
lines changed

lib/detect-port.js

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,26 +8,40 @@ module.exports = (port, callback) => {
88
callback = port;
99
port = null;
1010
}
11+
port = parseInt(port) || 0;
12+
let maxPort = port + 10;
13+
if (maxPort > 65535) {
14+
maxPort = 65535;
15+
}
16+
debug('detect free port between [%s, %s)', port, maxPort);
1117
if (typeof callback === 'function') {
12-
return tryListen(port, callback);
18+
return tryListen(port, maxPort, callback);
1319
}
1420
// promise
1521
return new Promise(resolve => {
16-
tryListen(port, (_, realPort) => {
22+
tryListen(port, maxPort, (_, realPort) => {
1723
resolve(realPort);
1824
});
1925
});
2026
};
2127

22-
function tryListen(port, callback) {
23-
port = parseInt(port) || 0;
28+
function tryListen(port, maxPort, callback) {
2429
const server = new net.Server();
2530

2631
server.on('error', err => {
2732
debug('listen %s error: %s', port, err);
28-
port = 0;
33+
if (port === 0) {
34+
return callback(err);
35+
}
36+
37+
port++;
38+
if (port >= maxPort) {
39+
debug('port: %s >= maxPort: %s, give up and use random port', port, maxPort);
40+
port = 0;
41+
maxPort = 0;
42+
}
2943
server.close();
30-
return tryListen(port, callback);
44+
return tryListen(port, maxPort, callback);
3145
});
3246

3347
server.listen({ port }, () => {

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,8 @@
2323
"egg-bin": "^2.0.0",
2424
"egg-ci": "^1.1.0",
2525
"eslint": "^3.13.1",
26-
"eslint-config-egg": "^3.1.0"
26+
"eslint-config-egg": "^3.1.0",
27+
"pedding": "^1.1.0"
2728
},
2829
"scripts": {
2930
"test": "egg-bin test",

test/detect-port.test.js

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,24 @@
22

33
const assert = require('assert');
44
const net = require('net');
5+
const pedding = require('pedding');
56
const detectPort = require('..');
67

78
describe('detect port test', () => {
8-
let server;
9+
const servers = [];
910
before(done => {
10-
server = new net.Server();
11-
server.listen(7001, done);
11+
done = pedding(11, done);
12+
const server = new net.Server();
13+
server.listen(3000, done);
14+
servers.push(server);
15+
for (let port = 7000; port < 7010; port++) {
16+
const server = new net.Server();
17+
server.listen(port, done);
18+
servers.push(server);
19+
}
1220
});
1321
after(() => {
14-
server.close();
22+
servers.forEach(server => server.close());
1523
});
1624

1725
it('get random port', done => {
@@ -29,11 +37,18 @@ describe('detect port test', () => {
2937
});
3038
});
3139

32-
it('work with listening port', done => {
33-
const port = 7001;
40+
it('work with listening next port 3001', done => {
41+
const port = 3000;
3442
detectPort(port, (_, realPort) => {
35-
assert(realPort !== 7001);
36-
assert(realPort > 0);
43+
assert(realPort === 3001);
44+
done();
45+
});
46+
});
47+
48+
it('work with listening random port when try port hit maxPort', done => {
49+
const port = 7000;
50+
detectPort(port, (_, realPort) => {
51+
assert(realPort < 7000 || realPort > 7009);
3752
done();
3853
});
3954
});

0 commit comments

Comments
 (0)