import type { WebSocket } from "ws"; import { websockify } from "./websockify"; import net from "node:net"; import { spawn } from "node:child_process"; const VNC_PORT = parseInt(process.env.VNC_PORT || "") || 5901; const VNC_START_CMD = process.env.VNC_START_CMD; export const createVNCSession = async (ws: WebSocket) => { const isVncStarted = await isPortOpen(VNC_PORT); // VNC is not started, start it. if (!isVncStarted && VNC_START_CMD) { const cmd = VNC_START_CMD.split(" "); const child = spawn(cmd[0], cmd.slice(1)); await new Promise((resolve) => { child.on("close", () => resolve(null)); }); } websockify(ws, "localhost", VNC_PORT); }; async function isPortOpen(port: number) { return new Promise((resolve) => { const tester = net .createServer() .once("error", function (err: any) { resolve(err.code === "EADDRINUSE"); }) .once("listening", function () { tester.close(); resolve(false); }) .listen(port); }); }