From 4266122ac1cd315ee338c19a7da8e8299e1e56e6 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 14 May 2017 14:48:39 -0400 Subject: [PATCH 1/4] Temporarily fork detect-port --- packages/react-dev-utils/detectPort.js | 66 +++++++++++++++++++++++++ packages/react-scripts/package.json | 1 - packages/react-scripts/scripts/start.js | 12 ++--- 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 packages/react-dev-utils/detectPort.js diff --git a/packages/react-dev-utils/detectPort.js b/packages/react-dev-utils/detectPort.js new file mode 100644 index 00000000000..34a6d35da90 --- /dev/null +++ b/packages/react-dev-utils/detectPort.js @@ -0,0 +1,66 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * All rights reserved. + * + * This source code is licensed under the BSD-style license found in the + * LICENSE file in the root directory of this source tree. An additional grant + * of patent rights can be found in the PATENTS file in the same directory. + */ + +'use strict'; + +const debug = require('debug')('detect-port'); +const net = require('net'); + +module.exports = (port, host, callback) => { + if (typeof port === 'function') { + callback = port; + port = null; + } + port = parseInt(port) || 0; + let maxPort = port + 10; + if (maxPort > 65535) { + maxPort = 65535; + } + debug('detect free port between [%s, %s)', port, maxPort); + if (typeof callback === 'function') { + return tryListen(host, port, maxPort, callback); + } + // promise + return new Promise(resolve => { + tryListen(host, port, maxPort, (_, realPort) => { + resolve(realPort); + }); + }); +}; + +function tryListen(host, port, maxPort, callback) { + const server = new net.Server(); + + server.on('error', err => { + debug('listen %s error: %s', port, err); + if (port === 0) { + return callback(err); + } + + port++; + if (port >= maxPort) { + debug( + 'port: %s >= maxPort: %s, give up and use random port', + port, + maxPort + ); + port = 0; + maxPort = 0; + } + server.close(); + return tryListen(host, port, maxPort, callback); + }); + + server.listen({ port, host }, () => { + port = server.address().port; + server.close(); + debug('get free port: %s', port); + callback(null, port); + }); +} diff --git a/packages/react-scripts/package.json b/packages/react-scripts/package.json index 86961ff905a..787ad137a2a 100644 --- a/packages/react-scripts/package.json +++ b/packages/react-scripts/package.json @@ -33,7 +33,6 @@ "connect-history-api-fallback": "1.3.0", "cross-spawn": "4.0.2", "css-loader": "0.28.0", - "detect-port": "1.1.1", "dotenv": "2.0.0", "eslint": "3.16.1", "eslint-config-react-app": "^0.6.1", diff --git a/packages/react-scripts/scripts/start.js b/packages/react-scripts/scripts/start.js index 45c83eb83c7..c08c5734c9d 100644 --- a/packages/react-scripts/scripts/start.js +++ b/packages/react-scripts/scripts/start.js @@ -24,7 +24,7 @@ require('../config/env'); const fs = require('fs'); const chalk = require('chalk'); -const detect = require('detect-port'); +const detect = require('react-dev-utils/detectPort'); const WebpackDevServer = require('webpack-dev-server'); const clearConsole = require('react-dev-utils/clearConsole'); const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); @@ -48,10 +48,10 @@ if (!checkRequiredFiles([paths.appHtml, paths.appIndexJs])) { // Tools like Cloud9 rely on this. const DEFAULT_PORT = parseInt(process.env.PORT, 10) || 3000; +const HOST = process.env.HOST || '0.0.0.0'; function run(port) { const protocol = process.env.HTTPS === 'true' ? 'https' : 'http'; - const host = process.env.HOST || '0.0.0.0'; // Create a webpack compiler that is configured with custom messages. const compiler = createWebpackCompiler( @@ -63,7 +63,7 @@ function run(port) { console.log(); console.log('The app is running at:'); console.log(); - console.log(` ${chalk.cyan(`${protocol}://${host}:${port}/`)}`); + console.log(` ${chalk.cyan(`${protocol}://${HOST}:${port}/`)}`); console.log(); console.log('Note that the development build is not optimized.'); console.log( @@ -80,7 +80,7 @@ function run(port) { addWebpackMiddleware(devServer) .then(() => { // Launch WebpackDevServer. - devServer.listen(port, host, err => { + devServer.listen(port, HOST, err => { if (err) { return console.log(err); } @@ -91,7 +91,7 @@ function run(port) { console.log(chalk.cyan('Starting the development server...')); console.log(); - openBrowser(`${protocol}://${host}:${port}/`); + openBrowser(`${protocol}://${HOST}:${port}/`); }); }) .catch(e => { @@ -105,7 +105,7 @@ function run(port) { // We attempt to use the default port but if it is busy, we offer the user to // run on a different port. `detect()` Promise resolves to the next free port. -detect(DEFAULT_PORT).then(port => { +detect(DEFAULT_PORT, HOST).then(port => { if (port === DEFAULT_PORT) { run(port); return; From 573fb6870e5e3b35a0cb7eca2ce45140aeff0458 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 14 May 2017 15:05:52 -0400 Subject: [PATCH 2/4] Fix get process id --- packages/react-dev-utils/getProcessForPort.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/react-dev-utils/getProcessForPort.js b/packages/react-dev-utils/getProcessForPort.js index 2d9e531c381..f96d3ec77c0 100644 --- a/packages/react-dev-utils/getProcessForPort.js +++ b/packages/react-dev-utils/getProcessForPort.js @@ -27,10 +27,10 @@ function isProcessAReactApp(processCommand) { } function getProcessIdOnPort(port) { - return execSync( - 'lsof -i:' + port + ' -P -t -sTCP:LISTEN', - execOptions - ).trim(); + let text = execSync('lsof -i:' + port + ' -P -t -sTCP:LISTEN', execOptions) + .split('\n')[0] + .trim(); + return text; } function getPackageNameInDirectory(directory) { From 4be315990a42249b300b8a23e8d92d6465d4b362 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 14 May 2017 15:07:59 -0400 Subject: [PATCH 3/4] Use different package --- packages/react-dev-utils/detectPort.js | 66 ------------------------- packages/react-scripts/package.json | 1 + packages/react-scripts/scripts/start.js | 2 +- 3 files changed, 2 insertions(+), 67 deletions(-) delete mode 100644 packages/react-dev-utils/detectPort.js diff --git a/packages/react-dev-utils/detectPort.js b/packages/react-dev-utils/detectPort.js deleted file mode 100644 index 34a6d35da90..00000000000 --- a/packages/react-dev-utils/detectPort.js +++ /dev/null @@ -1,66 +0,0 @@ -/** - * Copyright (c) 2015-present, Facebook, Inc. - * All rights reserved. - * - * This source code is licensed under the BSD-style license found in the - * LICENSE file in the root directory of this source tree. An additional grant - * of patent rights can be found in the PATENTS file in the same directory. - */ - -'use strict'; - -const debug = require('debug')('detect-port'); -const net = require('net'); - -module.exports = (port, host, callback) => { - if (typeof port === 'function') { - callback = port; - port = null; - } - port = parseInt(port) || 0; - let maxPort = port + 10; - if (maxPort > 65535) { - maxPort = 65535; - } - debug('detect free port between [%s, %s)', port, maxPort); - if (typeof callback === 'function') { - return tryListen(host, port, maxPort, callback); - } - // promise - return new Promise(resolve => { - tryListen(host, port, maxPort, (_, realPort) => { - resolve(realPort); - }); - }); -}; - -function tryListen(host, port, maxPort, callback) { - const server = new net.Server(); - - server.on('error', err => { - debug('listen %s error: %s', port, err); - if (port === 0) { - return callback(err); - } - - port++; - if (port >= maxPort) { - debug( - 'port: %s >= maxPort: %s, give up and use random port', - port, - maxPort - ); - port = 0; - maxPort = 0; - } - server.close(); - return tryListen(host, port, maxPort, callback); - }); - - server.listen({ port, host }, () => { - port = server.address().port; - server.close(); - debug('get free port: %s', port); - callback(null, port); - }); -} diff --git a/packages/react-scripts/package.json b/packages/react-scripts/package.json index 787ad137a2a..453697d6d78 100644 --- a/packages/react-scripts/package.json +++ b/packages/react-scripts/package.json @@ -33,6 +33,7 @@ "connect-history-api-fallback": "1.3.0", "cross-spawn": "4.0.2", "css-loader": "0.28.0", + "@timer/detect-port": "1.1.2", "dotenv": "2.0.0", "eslint": "3.16.1", "eslint-config-react-app": "^0.6.1", diff --git a/packages/react-scripts/scripts/start.js b/packages/react-scripts/scripts/start.js index c08c5734c9d..465474f2ddc 100644 --- a/packages/react-scripts/scripts/start.js +++ b/packages/react-scripts/scripts/start.js @@ -24,7 +24,7 @@ require('../config/env'); const fs = require('fs'); const chalk = require('chalk'); -const detect = require('react-dev-utils/detectPort'); +const detect = require('@timer/detect-port'); const WebpackDevServer = require('webpack-dev-server'); const clearConsole = require('react-dev-utils/clearConsole'); const checkRequiredFiles = require('react-dev-utils/checkRequiredFiles'); From b11a93edb328471fa0119abcad3f8a91a481ad96 Mon Sep 17 00:00:00 2001 From: Joe Haddad Date: Sun, 14 May 2017 15:08:57 -0400 Subject: [PATCH 4/4] Unnecessary var --- packages/react-dev-utils/getProcessForPort.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/react-dev-utils/getProcessForPort.js b/packages/react-dev-utils/getProcessForPort.js index f96d3ec77c0..428dc62cfda 100644 --- a/packages/react-dev-utils/getProcessForPort.js +++ b/packages/react-dev-utils/getProcessForPort.js @@ -27,10 +27,9 @@ function isProcessAReactApp(processCommand) { } function getProcessIdOnPort(port) { - let text = execSync('lsof -i:' + port + ' -P -t -sTCP:LISTEN', execOptions) + return execSync('lsof -i:' + port + ' -P -t -sTCP:LISTEN', execOptions) .split('\n')[0] .trim(); - return text; } function getPackageNameInDirectory(directory) {