diff --git a/package.json b/package.json index 35243aed443ac55d7bea8ce2936eb47fab27604f..99dbed8207befc9d40ae26c7d2d5d0eac475b82f 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "chalk": "1.1.3", "cross-spawn": "4.0.0", "css-loader": "0.23.1", - "detect-port": "0.1.4", "eslint": "3.1.1", "eslint-loader": "1.4.1", "eslint-plugin-flowtype": "2.4.0", diff --git a/scripts/eject.js b/scripts/eject.js index 0319b00b34f58d5eec6c71be7d095d0e5a43446a..2772aa2a3b3023be3d184d5d77053797a3b69cd2 100644 --- a/scripts/eject.js +++ b/scripts/eject.js @@ -40,6 +40,7 @@ prompt( path.join('scripts', 'build.js'), path.join('scripts', 'start.js'), path.join('scripts', 'utils', 'chrome.applescript'), + path.join('scripts', 'utils', 'detectPort.js'), path.join('scripts', 'utils', 'prompt.js') ]; diff --git a/scripts/start.js b/scripts/start.js index c93754df3b05c319397e6de34fc56e9873bf14da..3c8d8e468253735e9111fecd8739ff0eb7c6f182 100644 --- a/scripts/start.js +++ b/scripts/start.js @@ -15,7 +15,7 @@ var webpack = require('webpack'); var WebpackDevServer = require('webpack-dev-server'); var execSync = require('child_process').execSync; var opn = require('opn'); -var detect = require('detect-port'); +var detect = require('./utils/detectPort'); var prompt = require('./utils/prompt'); var config = require('../config/webpack.config.dev'); diff --git a/scripts/utils/detectPort.js b/scripts/utils/detectPort.js new file mode 100644 index 0000000000000000000000000000000000000000..759a59f8d04e7f440ebef9aeef67e658421f2bab --- /dev/null +++ b/scripts/utils/detectPort.js @@ -0,0 +1,86 @@ +/* ================================================================ + * detect-port by xdf(xudafeng[at]126.com) + * + * first created at : Tue Mar 17 2015 00:16:10 GMT+0800 (CST) + * + * ================================================================ + * Copyright xdf + * + * Licensed under the MIT License + * You may not use this file except in compliance with the License. + * + * ================================================================ */ + +// We are forking this temporarily to resolve +// https://github.com/facebookincubator/create-react-app/issues/302. + +// We can replace this fork with `detect-port` package when this is merged: +// https://github.com/xudafeng/detect-port/pull/4. + +'use strict'; + +var net = require('net'); + +var inject = function(port) { + var options = global.__detect ? global.__detect.options : {}; + + if (options.verbose) { + console.log('port %d was occupied', port); + } +}; + +function detect(port, fn) { + + var _detect = function(port) { + return new Promise(function(resolve, reject) { + var socket = new net.Socket(); + socket.once('error', function() { + socket.removeAllListeners('connect'); + socket.removeAllListeners('error'); + socket.end(); + socket.destroy(); + socket.unref(); + var server = new net.Server(); + server.on('error', function() { + inject(port); + port++; + resolve(_detect(port)); + }); + + server.listen(port, function() { + server.once('close', function() { + resolve(port); + }); + server.close(); + }); + }); + socket.once('connect', function() { + inject(port); + port++; + resolve(_detect(port)); + socket.removeAllListeners('connect'); + socket.removeAllListeners('error'); + socket.end(); + socket.destroy(); + socket.unref(); + }); + socket.connect({ + port: port + }); + }); + } + + var _detect_with_cb = function(_fn) { + _detect(port) + .then(function(result) { + _fn(null, result); + }) + .catch(function(e) { + _fn(e); + }); + }; + + return fn ? _detect_with_cb(fn) : _detect(port); +} + +module.exports = detect;