react-cosmos
Version:
Sandbox for developing and testing UI components in isolation
30 lines (29 loc) • 1.02 kB
JavaScript
import net from 'net';
// Inspired by https://stackoverflow.com/q/19129570
export async function findNextAvailablePort(port, retries, retriesLeft = retries) {
return new Promise((resolve, reject) => {
const socket = new net.Socket();
socket.on('connect', () => {
console.log(`[Cosmos] Port ${port} already in use, trying next...`);
if (retriesLeft > 0) {
socket.destroy();
resolve(findNextAvailablePort(port + 1, retries, retriesLeft - 1));
}
else {
reject(`No available port found after ${retries} retries.`);
}
});
socket.on('error', (error) => {
if (error.code === 'ECONNREFUSED')
resolve(port);
else
reject(error);
});
socket.setTimeout(400);
socket.on('timeout', () => {
socket.destroy();
resolve(port);
});
socket.connect(port, '0.0.0.0');
});
}