// Утилита для поиска свободного порта const net = require('net'); /** * Проверяет, свободен ли порт * @param {number} port - Порт для проверки * @returns {Promise} - true если порт свободен, false если занят */ function isPortAvailable(port) { return new Promise((resolve) => { const server = net.createServer(); server.listen(port, () => { server.once('close', () => { resolve(true); }); server.close(); }); server.on('error', (err) => { if (err.code === 'EADDRINUSE') { resolve(false); } else { resolve(false); } }); }); } /** * Находит свободный порт начиная с заданного * @param {number} startPort - Начальный порт для поиска * @param {number} maxAttempts - Максимальное количество попыток (по умолчанию 10) * @returns {Promise} - Свободный порт */ async function findFreePort(startPort, maxAttempts = 10) { for (let i = 0; i < maxAttempts; i++) { const port = startPort + i; const available = await isPortAvailable(port); if (available) { return port; } } throw new Error( `Не удалось найти свободный порт в диапазоне ${startPort}-${startPort + maxAttempts - 1}` ); } /** * Получить порт для сервера (проверяет занятость и находит свободный) * @param {number} defaultPort - Порт по умолчанию * @param {boolean} autoFind - Автоматически искать свободный если занят * @returns {Promise} - Порт для использования */ async function getServerPort(defaultPort, autoFind = true) { const available = await isPortAvailable(defaultPort); if (available) { return defaultPort; } if (!autoFind) { throw new Error(`Порт ${defaultPort} занят`); } console.log(`⚠️ Порт ${defaultPort} занят, ищем свободный...`); const freePort = await findFreePort(defaultPort + 1); console.log(`✅ Найден свободный порт: ${freePort}`); return freePort; } module.exports = { isPortAvailable, findFreePort, getServerPort, };