UNPKG

@modern-js/utils

Version:

A Progressive React Framework for modern web development.

36 lines (35 loc) 1.2 kB
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 };