import { WebSocketServer } from "ws"; import child_process from "child_process"; import fs from "fs"; import { send_notification } from "./notifications.mjs"; async function spawnPromise(program, args) { return new Promise((resolve, reject) => { let output = ""; const process = child_process.spawn(program, args); process.stdout.on("data", (data) => { output += data; }); process.stderr.on("data", (data) => { output += data; }); process.on("close", (code) => { resolve({ output, code }); }); }); } const wss = new WebSocketServer({ port: 3000 }); //maybe check output of child processes and send errors in some way wss.on("connection", (ws) => { ws.on("message", async (dataBuf) => { let data = dataBuf.toString(); if (data === "screenshot") { await spawnPromise("bash", ["/conf/screenshot.sh"]); ws.send(fs.readFileSync("/screenshot.png")); } else if (data.includes("touch")) { const dataSplit = data.split(" "); await spawnPromise("bash", [ "/conf/touch.sh", dataSplit[1], dataSplit[2], ]); } else if (data === "back") { await spawnPromise("bash", ["/conf/back.sh"]); } else if (data === "home") { await spawnPromise("bash", ["/conf/home.sh"]); } else if (data === "install") { const res = await spawnPromise("bash", ["/conf/install.sh"]); send_notification( res.code === 0, "Installing the application", res.output ); } else if (data.includes("drag")) { const dataSplit = data.split(" "); await spawnPromise("bash", [ "/conf/drag.sh", dataSplit[1], dataSplit[2], dataSplit[3], dataSplit[4], ]); } else if (data.startsWith("setcoord")) { const dataSplit = data.split(" "); const res = await spawnPromise("bash", [ "/conf/set_geo.sh", dataSplit[1], dataSplit[2], ]); send_notification( res.code === 0, "Setting the moch location", res.output ); } }); ws.on("close", (_) => { ws.close(); }); });