39 lines
1.0 KiB
TypeScript

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);
});
}