detox
Version:
E2E tests and automation for mobile
38 lines (31 loc) • 907 B
JavaScript
const net = require('net');
class FreePortFinder {
constructor({ min = 10000, max = 20000 } = {}) {
this._min = min;
this._max = max;
}
async findFreePort() {
let port;
do {
const min = this._min;
const max = this._max;
port = Math.random() * (max - min) + min;
port = port & 0xFFFFFFFE; // Should always be even
} while (await this.isPortTaken(port));
return port;
}
async isPortTaken(port) {
return new Promise((resolve, reject) => {
const tester = net.createServer()
.once('error', /** @param {*} err */ (err) => {
/* istanbul ignore next */
return err && err.code === 'EADDRINUSE' ? resolve(true) : reject(err);
})
.once('listening', () => {
tester.once('close', () => resolve(false)).close();
})
.listen(port);
});
}
}
module.exports = FreePortFinder;