Files
assetx/webapp/scripts/start-with-port.js

85 lines
1.9 KiB
JavaScript
Raw Permalink Normal View History

const { spawn } = require('child_process');
const net = require('net');
const DEFAULT_PORT = 3000;
const MAX_PORT = 3020;
function checkPort(port) {
return new Promise((resolve) => {
const server = net.createServer();
server.once('error', (err) => {
if (err.code === 'EADDRINUSE') {
resolve(false);
} else {
resolve(false);
}
});
server.once('listening', () => {
server.close();
resolve(true);
});
server.listen(port, '0.0.0.0');
});
}
async function findAvailablePort(startPort = DEFAULT_PORT) {
for (let port = startPort; port <= MAX_PORT; port++) {
const isAvailable = await checkPort(port);
if (isAvailable) {
return port;
}
}
throw new Error(`No available port found between ${startPort} and ${MAX_PORT}`);
}
async function startServer() {
try {
const port = await findAvailablePort(DEFAULT_PORT);
if (port !== DEFAULT_PORT) {
console.log(`Port ${DEFAULT_PORT} is in use, using port ${port} instead`);
} else {
console.log(`Starting server on port ${port}`);
}
const args = process.argv.slice(2);
const command = args[0] || 'next';
const commandArgs = args.slice(1);
const child = spawn(command, [...commandArgs, '-p', String(port), '-H', '0.0.0.0'], {
stdio: 'inherit',
shell: true,
env: {
...process.env,
PORT: String(port)
}
});
child.on('error', (error) => {
console.error('Failed to start server:', error);
process.exit(1);
});
child.on('exit', (code) => {
process.exit(code || 0);
});
process.on('SIGINT', () => {
child.kill('SIGINT');
});
process.on('SIGTERM', () => {
child.kill('SIGTERM');
});
} catch (error) {
console.error('Error:', error.message);
process.exit(1);
}
}
startServer();