mirror of
https://github.com/khairul169/home-lab.git
synced 2025-04-29 00:59:36 +07:00
39 lines
1.0 KiB
TypeScript
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);
|
|
});
|
|
}
|