Skip to content

Commit ead7032

Browse files
committed
Fix port detection lag on OS X with Firewall enabled
This fixes #302 by temporarily forking `detect-port`. Hopefully this fix will be merged into the original project, and we can refer to it again.
1 parent 31e6cf1 commit ead7032

File tree

4 files changed

+88
-2
lines changed

4 files changed

+88
-2
lines changed

package.json

-1
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,6 @@
4444
"chalk": "1.1.3",
4545
"cross-spawn": "4.0.0",
4646
"css-loader": "0.23.1",
47-
"detect-port": "0.1.4",
4847
"eslint": "3.1.1",
4948
"eslint-loader": "1.4.1",
5049
"eslint-plugin-flowtype": "2.4.0",

scripts/eject.js

+1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ prompt(
4040
path.join('scripts', 'build.js'),
4141
path.join('scripts', 'start.js'),
4242
path.join('scripts', 'utils', 'chrome.applescript'),
43+
path.join('scripts', 'utils', 'detectPort.js'),
4344
path.join('scripts', 'utils', 'prompt.js')
4445
];
4546

scripts/start.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ var webpack = require('webpack');
1515
var WebpackDevServer = require('webpack-dev-server');
1616
var execSync = require('child_process').execSync;
1717
var opn = require('opn');
18-
var detect = require('detect-port');
18+
var detect = require('./utils/detectPort');
1919
var prompt = require('./utils/prompt');
2020
var config = require('../config/webpack.config.dev');
2121

scripts/utils/detectPort.js

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
/* ================================================================
2+
* detect-port by xdf(xudafeng[at]126.com)
3+
*
4+
* first created at : Tue Mar 17 2015 00:16:10 GMT+0800 (CST)
5+
*
6+
* ================================================================
7+
* Copyright xdf
8+
*
9+
* Licensed under the MIT License
10+
* You may not use this file except in compliance with the License.
11+
*
12+
* ================================================================ */
13+
14+
// We are forking this temporarily to resolve
15+
// https://github.com/facebookincubator/create-react-app/issues/302.
16+
17+
// We can replace this fork with `detect-port` package when this is merged:
18+
// https://github.com/xudafeng/detect-port/pull/4.
19+
20+
'use strict';
21+
22+
var net = require('net');
23+
24+
var inject = function(port) {
25+
var options = global.__detect ? global.__detect.options : {};
26+
27+
if (options.verbose) {
28+
console.log('port %d was occupied', port);
29+
}
30+
};
31+
32+
function detect(port, fn) {
33+
34+
var _detect = function(port) {
35+
return new Promise(function(resolve, reject) {
36+
var socket = new net.Socket();
37+
socket.once('error', function() {
38+
socket.removeAllListeners('connect');
39+
socket.removeAllListeners('error');
40+
socket.end();
41+
socket.destroy();
42+
socket.unref();
43+
var server = new net.Server();
44+
server.on('error', function() {
45+
inject(port);
46+
port++;
47+
resolve(_detect(port));
48+
});
49+
50+
server.listen(port, function() {
51+
server.once('close', function() {
52+
resolve(port);
53+
});
54+
server.close();
55+
});
56+
});
57+
socket.once('connect', function() {
58+
inject(port);
59+
port++;
60+
resolve(_detect(port));
61+
socket.removeAllListeners('connect');
62+
socket.removeAllListeners('error');
63+
socket.end();
64+
socket.destroy();
65+
socket.unref();
66+
});
67+
socket.connect({
68+
port: port
69+
});
70+
});
71+
}
72+
73+
var _detect_with_cb = function(_fn) {
74+
_detect(port)
75+
.then(function(result) {
76+
_fn(null, result);
77+
})
78+
.catch(function(e) {
79+
_fn(e);
80+
});
81+
};
82+
83+
return fn ? _detect_with_cb(fn) : _detect(port);
84+
}
85+
86+
module.exports = detect;

0 commit comments

Comments
 (0)