/**
* Utility to find available port or handle port conflicts
*/
import { createServer } from 'net';
import { log } from 'apify';
/**
* Check if a port is available
* Returns true if port is available, false if in use
*/
export async function isPortAvailable(port: number): Promise<boolean> {
return new Promise((resolve) => {
const server = createServer();
server.listen({ port, host: '0.0.0.0' }, () => {
server.once('close', () => resolve(true));
server.close();
});
server.on('error', () => {
resolve(false);
});
});
}
/**
* Find an available port starting from the given port
*/
export async function findAvailablePort(startPort: number, maxAttempts: number = 10): Promise<number> {
for (let i = 0; i < maxAttempts; i++) {
const port = startPort + i;
const available = await isPortAvailable(port);
if (available) {
if (i > 0) {
log.warning(`Port ${startPort} is in use, using port ${port} instead`);
}
return port;
}
}
throw new Error(`Could not find an available port starting from ${startPort} after ${maxAttempts} attempts`);
}