| 'use strict'; |
| |
| const pRetry = require('p-retry'); |
| const portfinder = require('portfinder'); |
| const defaultPort = require('./defaultPort'); |
| const defaultTo = require('./defaultTo'); |
| const tryParseInt = require('./tryParseInt'); |
| |
| function runPortFinder() { |
| return new Promise((resolve, reject) => { |
| portfinder.basePort = defaultPort; |
| portfinder.getPort((error, port) => { |
| if (error) { |
| return reject(error); |
| } |
| |
| return resolve(port); |
| }); |
| }); |
| } |
| |
| function findPort(port) { |
| if (port) { |
| return Promise.resolve(port); |
| } |
| |
| // Try to find unused port and listen on it for 3 times, |
| // if port is not specified in options. |
| // Because NaN == null is false, defaultTo fails if parseInt returns NaN |
| // so the tryParseInt function is introduced to handle NaN |
| const defaultPortRetry = defaultTo( |
| tryParseInt(process.env.DEFAULT_PORT_RETRY), |
| 3 |
| ); |
| |
| return pRetry(runPortFinder, { retries: defaultPortRetry }); |
| } |
| |
| module.exports = findPort; |