NextNodeTemplate/backend/lib/portFinder.js
DosAi ea61c5f493
Some checks failed
CI/CD / lint-and-build (push) Has been cancelled
feat: Add automatic free port finder for frontend and backend
2025-11-02 17:39:38 +03:00

78 lines
2.4 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Утилита для поиска свободного порта
const net = require('net');
/**
* Проверяет, свободен ли порт
* @param {number} port - Порт для проверки
* @returns {Promise<boolean>} - 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<number>} - Свободный порт
*/
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<number>} - Порт для использования
*/
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,
};