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
This commit is contained in:
parent
40cb7397b0
commit
ff7e32a3d5
28
.prettierrc
Normal file
28
.prettierrc
Normal file
@ -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
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
@ -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");
|
||||
});
|
49
android/code/index.mjs
Normal file
49
android/code/index.mjs
Normal file
@ -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();
|
||||
});
|
||||
});
|
34
android/code/package-lock.json
generated
34
android/code/package-lock.json
generated
@ -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": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"net": "^1.0.2"
|
||||
"ws": "^8.18.0"
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -36,7 +36,7 @@ RENTGEN_ANDROID docker structure
|
||||
| :3000 |
|
||||
+---------------------------------+--------------------+
|
||||
|
|
||||
| SOCKETS
|
||||
| WEBSOCKETS
|
||||
|
|
||||
+---------------------------------+--------------------+
|
||||
| HTTP_SERVER | |
|
||||
|
@ -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])
|
||||
|
@ -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"));
|
||||
|
29
http_server/code/package-lock.json
generated
29
http_server/code/package-lock.json
generated
@ -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
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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"
|
||||
|
@ -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);
|
||||
}
|
||||
});
|
||||
android_websocket.on("message", (dataBuf) => {
|
||||
let fd;
|
||||
fd = fs.openSync("/code/screenshot.png", "w");
|
||||
fs.writeSync(fd, dataBuf);
|
||||
fs.close(fd);
|
||||
doneWrite = 1;
|
||||
});
|
||||
|
@ -1,3 +1,3 @@
|
||||
export async function sleep(time) {
|
||||
return new Promise((resolve) => setTimeout(resolve, time));
|
||||
}
|
||||
}
|
||||
|
@ -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", () => {});
|
||||
|
Loading…
x
Reference in New Issue
Block a user