'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); const net = require('net'); const fsMemo = require('fs-memo'); async function getPort(config) { if (typeof config === "number" || typeof config === "string") { config = {port: parseInt(config + "")}; } const options = { name: "default", random: false, port: parseInt(process.env.PORT || "") || 3e3, ports: [4e3, 5e3, 6e3, 7e3], host: process.env.HOST || "0.0.0.0", memoName: "port", ...config }; const portsToCheck = []; if (!options.random) { if (options.port) { portsToCheck.push(options.port); } if (Array.isArray(options.ports)) { portsToCheck.push(...options.ports); } } const memoOptions = {name: options.memoName, dir: options.memoDir}; const memoKey = "port_" + options.name; const memo = await fsMemo.getMemo(memoOptions); if (memo[memoKey]) { portsToCheck.push(memo[memoKey]); } const availablePort = await checkPorts(portsToCheck, options.host); await fsMemo.setMemo({[memoKey]: availablePort}, memoOptions); return availablePort; } async function checkPorts(ports, host) { for (const port of ports) { const r = await checkPort(port, host); if (r) { return r; } } return checkPort(0, host); } function checkPort(port, host) { return new Promise((resolve) => { const server = net.createServer(); server.unref(); server.on("error", () => { resolve(false); }); server.listen(port, host, () => { const {port: port2} = server.address(); server.close(() => { resolve(port2); }); }); }); } exports.getPort = getPort;