import express from "express"; import { readFile } from "node:fs/promises"; import { guardedScreenshot, android_websocket, waitFullBoot, } from "./screenshot.mjs"; import { execSync } from "node:child_process"; import fileUpload from "express-fileupload"; const device_size_x = 320; const device_size_y = 640; const app = express(); app.use(express.urlencoded({ extended: false })); app.use(express.static("/code/dist")); console.log("Waiting for full boot..."); await waitFullBoot(); console.log("Boot detected! activating endpoints"); //GET app.get("/favicon.ico", function (req, res) { res.sendFile("/code/favicon.ico"); }); app.get("/htmx.js", function (req, res) { res.sendFile("/code/node_modules/htmx.org/dist/htmx.min.js"); }); app.get("/trafficLog", async function (req, res) { res.sendFile("/log/trafficLog"); }); app.get("/screen", async function (req, res) { await guardedScreenshot(); res.sendFile("/code/screenshot.png"); }); app.get("/", async function (req, res) { 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); }); //POST app.post("/back", function (req, res) { android_websocket.send(`back`); res.sendStatus(200); }); // default options app.use(fileUpload()); app.post("/upload_apk", async function (req, res) { if (!req.files || Object.keys(req.files).length === 0) { return res.status(400).send("No files were uploaded."); } execSync("rm -rf /shared_buffer/*"); if (Array.isArray(req.files.app)) { for (const [idx, file] of req.files.app.entries()) { let uploadPath = "/shared_buffer/app" + idx + ".apk"; await file.mv(uploadPath); } } else { let uploadPath = "/shared_buffer/app" + 0 + ".apk"; await req.files.app.mv(uploadPath); } android_websocket.send(`install`); res.send("Files uploaded!"); }); app.post("/home", function (req, res) { 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); 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); android_websocket.send(`drag ${startX} ${startY} ${endX} ${endY}`); res.sendStatus(200); }); app.listen(8080, () => console.log("Listening in port 8080"));