69 lines
1.6 KiB
JavaScript
69 lines
1.6 KiB
JavaScript
import fs from "fs";
|
|
import { sleep } from "./utils.mjs";
|
|
import { WebSocket } from "ws";
|
|
|
|
export const android_websocket = new WebSocket("ws://android:3000");
|
|
|
|
let doneWrite = 0;
|
|
let screenshotPromise = null;
|
|
|
|
async function screenshot() {
|
|
const time_start = Date.now();
|
|
let retries = 0;
|
|
while (android_websocket.readyState != WebSocket.OPEN) {
|
|
await sleep(15);
|
|
retries++;
|
|
if (retries > 50) {
|
|
console.error("Screenshot ws timeout");
|
|
doneWrite = 0;
|
|
screenshotPromise = null;
|
|
return;
|
|
}
|
|
}
|
|
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() {
|
|
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;
|
|
|
|
//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;
|
|
}
|
|
|
|
throw new Error("wait for screenshot time to be less than 0.5s timed out");
|
|
}
|
|
|
|
android_websocket.on("message", (dataBuf) => {
|
|
let fd;
|
|
fd = fs.openSync("/code/screenshot.png", "w");
|
|
fs.writeSync(fd, dataBuf);
|
|
fs.close(fd);
|
|
doneWrite = 1;
|
|
});
|