@modern-js/utils
Version:
A Progressive React Framework for modern web development.
36 lines (35 loc) • 1.2 kB
JavaScript
import net from "net";
import { chalk } from "../compiled.mjs";
import { logger } from "./logger.mjs";
const getPort = async (expectPort, { tryLimits = 20, strictPort = false, slient = false } = {})=>{
let port = expectPort;
if ('string' == typeof port) port = parseInt(port, 10);
if (strictPort) tryLimits = 1;
const original = port;
let found = false;
let attempts = 0;
while(!found && attempts <= tryLimits)try {
await new Promise((resolve, reject)=>{
const server = net.createServer();
server.unref();
server.on('error', reject);
server.listen({
port,
host: '0.0.0.0'
}, ()=>{
found = true;
server.close(resolve);
});
});
} catch (e) {
if ('EADDRINUSE' !== e.code) throw e;
port++;
attempts++;
}
if (port !== original) {
if (strictPort) throw new Error(`Port "${original}" is occupied, please choose another one.`);
else if (!slient) logger.info(`Port ${original} is in use. ${chalk.yellow(`using port ${port}.`)}`);
}
return port;
};
export { getPort };