58 lines
2.0 KiB
JavaScript
58 lines
2.0 KiB
JavaScript
import net from "node:net";
|
|
|
|
const MIN_NODE = [22, 5, 0];
|
|
const actualNode = process.versions.node.split(".").map(Number);
|
|
const isVersionAtLeast = actualNode[0] > MIN_NODE[0]
|
|
|| actualNode[0] === MIN_NODE[0] && (actualNode[1] > MIN_NODE[1]
|
|
|| actualNode[1] === MIN_NODE[1] && actualNode[2] >= MIN_NODE[2]);
|
|
|
|
if (!isVersionAtLeast) {
|
|
console.error(`AgendaPro requiere Node.js >= ${MIN_NODE.join(".")}; detectado ${process.version}.`);
|
|
process.exit(1);
|
|
}
|
|
|
|
try {
|
|
await import("node:sqlite");
|
|
} catch (error) {
|
|
console.error("La instalación de Node no incluye node:sqlite, requerido por AgendaPro.");
|
|
console.error(error);
|
|
process.exit(1);
|
|
}
|
|
|
|
const portsArg = process.argv.find((arg) => arg.startsWith("--ports="))?.split("=", 2)[1];
|
|
const configuredPorts = portsArg ? portsArg.split(",").map(Number).filter(Boolean) : [];
|
|
const ports = configuredPorts.map((port, index) => {
|
|
if (index === 0 && process.env.PORT) return Number(process.env.PORT) || port;
|
|
if (index === 1 && process.env.VITE_PORT) return Number(process.env.VITE_PORT) || port;
|
|
return port;
|
|
});
|
|
|
|
function isPortBusy(port) {
|
|
return new Promise((resolve) => {
|
|
const socket = net.createConnection({ host: "127.0.0.1", port });
|
|
let settled = false;
|
|
const finish = (busy) => {
|
|
if (settled) return;
|
|
settled = true;
|
|
socket.destroy();
|
|
resolve(busy);
|
|
};
|
|
socket.once("connect", () => finish(true));
|
|
socket.once("error", () => finish(false));
|
|
socket.setTimeout(500, () => finish(false));
|
|
});
|
|
}
|
|
|
|
const busyPorts = [];
|
|
for (const port of ports) {
|
|
if (await isPortBusy(port)) busyPorts.push(port);
|
|
}
|
|
|
|
if (busyPorts.length) {
|
|
console.error(`No se puede iniciar AgendaPro: los puertos ${busyPorts.join(", ")} ya están ocupados.`);
|
|
console.error("Cierra el proceso anterior o cambia PORT/VITE_PORT; en Windows puedes localizarlo con: netstat -ano | findstr :<puerto>");
|
|
process.exit(1);
|
|
}
|
|
|
|
console.log(`Preflight OK: Node ${process.version}${ports.length ? `; puertos ${ports.join(", ")} disponibles` : ""}.`);
|