From ff7e32a3d55f5ca590fcb065666ce976e71bb456 Mon Sep 17 00:00:00 2001 From: migueldar Date: Wed, 29 Jan 2025 15:00:28 +0100 Subject: [PATCH] prettierrc, websockets, fix in frontend Summary: Ref T2992 Reviewers: kuba-orlik Reviewed By: kuba-orlik Subscribers: kuba-orlik Maniphest Tasks: T2992 Differential Revision: https://hub.sealcode.org/D1570 --- .prettierrc | 28 ++++++++++ android/code/index.js | 55 ------------------- android/code/index.mjs | 49 +++++++++++++++++ android/code/package-lock.json | 34 ++++++++---- android/code/package.json | 2 +- android/conf/docker-entrypoint.sh | 2 +- diagram.txt | 2 +- http_server/code/index.html | 9 ++-- http_server/code/index.mjs | 79 +++++++++++++++------------- http_server/code/package-lock.json | 29 ++++++++--- http_server/code/package.json | 4 +- http_server/code/screenshot.mjs | 84 +++++++++++++++--------------- http_server/code/utils.mjs | 2 +- http_server/code/waitSocket.mjs | 6 +-- 14 files changed, 221 insertions(+), 164 deletions(-) create mode 100644 .prettierrc delete mode 100644 android/code/index.js create mode 100644 android/code/index.mjs diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..fcad336 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,28 @@ +{ + "useTabs": true, + "tabWidth": 4, + "trailingComma": "es5", + "overrides": [ + { + "files": "*.yml", + "options": { + "tabWidth": 2, + "useTabs": false + } + }, + { + "files": "*.html", + "options": { + "tabWidth": 2, + "useTabs": false + } + }, + { + "files": "*.json", + "options": { + "tabWidth": 2, + "useTabs": false + } + } + ] +} diff --git a/android/code/index.js b/android/code/index.js deleted file mode 100644 index d4afc66..0000000 --- a/android/code/index.js +++ /dev/null @@ -1,55 +0,0 @@ -const net = require("net"); -const child_process = require("child_process"); -const fs = require("fs"); - -const server = net.createServer(); - -async function spawnPromise(program, args) { - return new Promise((resolve, reject) => { - const process = child_process.spawn(program, args); - process.on("close", (_) => { - resolve(); - }); - }); -} - -//maybe check output of child processe and send errors in some way -server.on("connection", (socket) => { - socket.on("data", async (dataBuf) => { - data = dataBuf.toString(); - if (data === "screenshot") { - socket.write("start"); - await spawnPromise("bash", ["/conf/screenshot.sh"]); - socket.write(fs.readFileSync("/screenshot.png")); - socket.write("ENDOFMSG"); - } 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.includes("drag")) { - const dataSplit = data.split(" "); - - await spawnPromise("bash", [ - "/conf/drag.sh", - dataSplit[1], - dataSplit[2], - dataSplit[3], - dataSplit[4], - ]); - } - }); - socket.on("close", (_) => { - socket.end(); - }); -}); - -server.listen(3000, () => { - console.log("listening on 3000"); -}); diff --git a/android/code/index.mjs b/android/code/index.mjs new file mode 100644 index 0000000..932977b --- /dev/null +++ b/android/code/index.mjs @@ -0,0 +1,49 @@ +import { WebSocketServer } from "ws"; +import child_process from "child_process"; +import fs from "fs"; + +async function spawnPromise(program, args) { + return new Promise((resolve, reject) => { + const process = child_process.spawn(program, args); + process.on("close", (_) => { + resolve(); + }); + }); +} + +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.includes("drag")) { + const dataSplit = data.split(" "); + + await spawnPromise("bash", [ + "/conf/drag.sh", + dataSplit[1], + dataSplit[2], + dataSplit[3], + dataSplit[4], + ]); + } + }); + ws.on("close", (_) => { + ws.close(); + }); +}); diff --git a/android/code/package-lock.json b/android/code/package-lock.json index 15021ed..b827a9c 100644 --- a/android/code/package-lock.json +++ b/android/code/package-lock.json @@ -5,20 +5,36 @@ "packages": { "": { "dependencies": { - "net": "^1.0.2" + "ws": "^8.18.0" } }, - "node_modules/net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } }, "dependencies": { - "net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" + "ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "requires": {} } } } diff --git a/android/code/package.json b/android/code/package.json index d7363ab..37c3082 100644 --- a/android/code/package.json +++ b/android/code/package.json @@ -1,5 +1,5 @@ { "dependencies": { - "net": "^1.0.2" + "ws": "^8.18.0" } } diff --git a/android/conf/docker-entrypoint.sh b/android/conf/docker-entrypoint.sh index ea68137..5928466 100644 --- a/android/conf/docker-entrypoint.sh +++ b/android/conf/docker-entrypoint.sh @@ -3,6 +3,6 @@ npm i -C /code bash /conf/iptables_conf.sh redsocks -c /conf/redsocks.conf & bash /conf/wait_for_sd.sh -node /code/index.js +node /code/index.mjs #tail -f /dev/null diff --git a/diagram.txt b/diagram.txt index 5cfefd4..6deebc1 100644 --- a/diagram.txt +++ b/diagram.txt @@ -36,7 +36,7 @@ RENTGEN_ANDROID docker structure | :3000 | +---------------------------------+--------------------+ | - | SOCKETS + | WEBSOCKETS | +---------------------------------+--------------------+ | HTTP_SERVER | | diff --git a/http_server/code/index.html b/http_server/code/index.html index 0a73df8..253bddd 100644 --- a/http_server/code/index.html +++ b/http_server/code/index.html @@ -131,7 +131,7 @@ let startDraggingPosY = 0; let endDraggingPosY = 0; - const screenSize = [320, 640] + const screenSize = [320, 640]; const handleDraggStart = (e) => { e.preventDefault(); @@ -146,15 +146,16 @@ endDraggingPosX = e.offsetX; endDraggingPosY = e.offsetY; if ( - isDragging && (Math.abs(endDraggingPosY - startDraggingPosY) > 10 || - Math.abs(endDraggingPosX - startDraggingPosX) > 10) + isDragging && + (Math.abs(endDraggingPosY - startDraggingPosY) > 10 || + Math.abs(endDraggingPosX - startDraggingPosX) > 10) ) { registerClick({ path: "drag", logText: `await drag({x:${startDraggingPosX},y:${startDraggingPosY}},{x:${e.offsetX},y:${e.offsetY}});`, body: `startX=${startDraggingPosX}&startY=${startDraggingPosY}&endX=${e.offsetX}&endY=${e.offsetY}`, }); - } else { + } else if (e.target === screen) { const phoneX = event.offsetX; const phoneY = event.offsetY; if (phoneX <= screenSize[0] && phoneY <= screenSize[1]) diff --git a/http_server/code/index.mjs b/http_server/code/index.mjs index b519ae3..dc6d278 100644 --- a/http_server/code/index.mjs +++ b/http_server/code/index.mjs @@ -1,6 +1,10 @@ import express from "express"; import { readFile } from "node:fs/promises"; -import { guardedScreenshot, socket_client, waitFullBoot } from "./screenshot.mjs"; +import { + guardedScreenshot, + android_websocket, + waitFullBoot, +} from "./screenshot.mjs"; const device_size_x = 320; const device_size_y = 640; @@ -14,69 +18,70 @@ console.log("Boot detected! activating endpoints"); //GET app.get("/favicon.ico", function (req, res) { - res.sendFile("/code/favicon.ico"); + res.sendFile("/code/favicon.ico"); }); app.get("/trafficLog.js", function (req, res) { - res.sendFile("/code/dist/trafficLog.js"); + res.sendFile("/code/dist/trafficLog.js"); }); app.get("/trafficLog", async function (req, res) { - res.sendFile("/log/trafficLog"); + res.sendFile("/log/trafficLog"); }); app.get("/screen", async function (req, res) { - await guardedScreenshot(); - res.sendFile("/code/screenshot.png"); + await guardedScreenshot(); + res.sendFile("/code/screenshot.png"); }); app.get("/", async function (req, res) { - let fileData = (await readFile("/code/index.html")).toString(); + let fileData = (await readFile("/code/index.html")).toString(); - fileData = fileData.replace( - "___screenshotDelayMs___", - process.env.screenshotDelayMs - ); - - res.setHeader("Content-Type", "text/html"); - res.setHeader("Content-Disposition", "inline"); - - res.send(fileData); + fileData = fileData.replace( + "___screenshotDelayMs___", + process.env.screenshotDelayMs + ); + + res.setHeader("Content-Type", "text/html"); + res.setHeader("Content-Disposition", "inline"); + + res.send(fileData); }); //POST app.post("/back", function (req, res) { - socket_client.write(`back`); - res.sendStatus(200); + android_websocket.send(`back`); + res.sendStatus(200); }); app.post("/home", function (req, res) { - socket_client.write(`home`); - res.sendStatus(200); + android_websocket.send(`home`); + res.sendStatus(200); }); app.post("/touch", function (req, res) { - const x = parseInt(req.body.x); - const y = parseInt(req.body.y); + const x = parseInt(req.body.x); + const y = parseInt(req.body.y); - if (isNaN(x) || isNaN(y) || x > device_size_x || y > device_size_y) { - res.send( - `the query params must be x <= ${device_size_x}, y <= ${device_size_y}\n` - ); - } else { - socket_client.write(`touch ${x} ${y}`); - res.sendStatus(200); - } + if (isNaN(x) || isNaN(y) || x > device_size_x || y > device_size_y) { + res.send( + `the query params must be x <= ${device_size_x}, y <= ${device_size_y}\n` + ); + } else { + android_websocket.send(`touch ${x} ${y}`); + res.sendStatus(200); + } }); app.post("/drag", function (req, res) { - const body = req.body; - const startX = Number(body.startX); - const startY = Number(body.startY); - const endX = Number(body.endX); - const endY = Number(body.endY); - socket_client.write(`drag ${startX} ${startY} ${endX} ${endY}`); - res.sendStatus(200); + const body = req.body; + const startX = Number(body.startX); + const startY = Number(body.startY); + const endX = Number(body.endX); + const endY = Number(body.endY); + android_websocket.send(`drag ${startX} ${startY} ${endX} ${endY}`); + res.sendStatus(200); }); app.listen(8080, () => console.log("Listening in port 8080")); + \ No newline at end of file diff --git a/http_server/code/package-lock.json b/http_server/code/package-lock.json index 65a07f6..a251c47 100644 --- a/http_server/code/package-lock.json +++ b/http_server/code/package-lock.json @@ -6,8 +6,8 @@ "": { "dependencies": { "express": "^4.18.2", - "net": "^1.0.2", - "preact": "^10.18.1" + "preact": "^10.18.1", + "ws": "^8.18.0" }, "devDependencies": { "esbuild": "^0.19.5" @@ -774,11 +774,6 @@ "node": ">= 0.6" } }, - "node_modules/net": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/net/-/net-1.0.2.tgz", - "integrity": "sha512-kbhcj2SVVR4caaVnGLJKmlk2+f+oLkjqdKeQlmUtz6nGzOpbcobwVIeSURNgraV/v3tlmGIX82OcPCl0K6RbHQ==" - }, "node_modules/object-inspect": { "version": "1.12.3", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", @@ -1003,6 +998,26 @@ "engines": { "node": ">= 0.8" } + }, + "node_modules/ws": { + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } } } } diff --git a/http_server/code/package.json b/http_server/code/package.json index 86420ef..9e314ac 100644 --- a/http_server/code/package.json +++ b/http_server/code/package.json @@ -4,8 +4,8 @@ }, "dependencies": { "express": "^4.18.2", - "net": "^1.0.2", - "preact": "^10.18.1" + "preact": "^10.18.1", + "ws": "^8.18.0" }, "devDependencies": { "esbuild": "^0.19.5" diff --git a/http_server/code/screenshot.mjs b/http_server/code/screenshot.mjs index 9c93e15..71b26fe 100644 --- a/http_server/code/screenshot.mjs +++ b/http_server/code/screenshot.mjs @@ -1,62 +1,60 @@ -import net from "net"; import fs from "fs"; import { sleep } from "./utils.mjs"; +import { WebSocket } from "ws"; -export const socket_client = net.createConnection({ port: 3000, host: "android" }); +export const android_websocket = new WebSocket("ws://android:3000"); let doneWrite = 0; let screenshotPromise = null; async function screenshot() { - const time_start = Date.now(); - socket_client.write("screenshot"); - while (!doneWrite) { - await sleep(15); - if (Date.now() - time_start > 2000) { - console.error("Screenshot timed out after 2s"); - break; // timeout - } - } - doneWrite = 0; - screenshotPromise = null; + const time_start = Date.now(); + while (android_websocket.readyState != WebSocket.OPEN) { + await sleep(15); + } + android_websocket.send("screenshot"); + while (!doneWrite) { + await sleep(15); + if (Date.now() - time_start > 2000) { + console.error("Screenshot timed out after 2s"); + break; // timeout + } + } + doneWrite = 0; + screenshotPromise = null; } export async function guardedScreenshot() { - console.log("Requesting a screenshot"); - if (!screenshotPromise) { - console.log("no ongoing promise, starting a new one"); - screenshotPromise = screenshot(); - } - return screenshotPromise; + if (!screenshotPromise) { + screenshotPromise = screenshot(); + } else { + console.log("ongoing screenshot promise not taking a new one"); + } + return screenshotPromise; } export async function waitFullBoot() { - var start = performance.now(); - var counter = 0; + var start = performance.now(); + var counter = 0; - //will timeout after 10 min - while (performance.now() - start < 600 * 1000) { - var before = performance.now(); - await screenshot(); - var after = performance.now(); - if (after - before < process.env.screenshotDelayMs) counter++; - else counter = 0; + //will timeout after 10 min + while (performance.now() - start < 600 * 1000) { + var before = performance.now(); + await screenshot(); + var after = performance.now(); + if (after - before < process.env.screenshotDelayMs) counter++; + else counter = 0; - if (counter === 10) return; - } + if (counter === 10) return; + } - throw new Error("wait for screenshot time to be less than 0.5s timed out"); + throw new Error("wait for screenshot time to be less than 0.5s timed out"); } -let fd; -socket_client.on("data", (dataBuf) => { - if (dataBuf.toString() === "start") - fd = fs.openSync("/code/screenshot.png", "w"); - else { - if (dataBuf.toString().includes("ENDOFMSG")) { - fs.writeSync(fd, dataBuf); - fs.close(fd); - doneWrite = 1; - } else fs.writeSync(fd, dataBuf); - } -}); \ No newline at end of file +android_websocket.on("message", (dataBuf) => { + let fd; + fd = fs.openSync("/code/screenshot.png", "w"); + fs.writeSync(fd, dataBuf); + fs.close(fd); + doneWrite = 1; +}); diff --git a/http_server/code/utils.mjs b/http_server/code/utils.mjs index 31e4abf..1061956 100644 --- a/http_server/code/utils.mjs +++ b/http_server/code/utils.mjs @@ -1,3 +1,3 @@ export async function sleep(time) { return new Promise((resolve) => setTimeout(resolve, time)); -} \ No newline at end of file +} diff --git a/http_server/code/waitSocket.mjs b/http_server/code/waitSocket.mjs index 512855c..1088ae2 100644 --- a/http_server/code/waitSocket.mjs +++ b/http_server/code/waitSocket.mjs @@ -1,14 +1,14 @@ -import net from "net"; import { exit } from "process"; +import { WebSocket } from "ws"; async function sleep(time) { return new Promise((resolve) => setTimeout(resolve, time)); } while (true) { - let socket = net.createConnection({ port: 3000, host: "android" }); + let socket = new WebSocket("ws://android:3000"); - socket.on("connect", () => { + socket.on("open", () => { exit(0); }); socket.on("error", () => {});