54 lines
2.9 KiB
JavaScript
54 lines
2.9 KiB
JavaScript
import { createServer } from "node:http";
|
|
import { readFile } from "node:fs/promises";
|
|
import { join, normalize } from "node:path";
|
|
import { pathToFileURL } from "node:url";
|
|
|
|
const root = new URL("../web/", import.meta.url).pathname.replace(/\/$/, "");
|
|
const seleniumRoot = process.env.SELENIUM_ROOT;
|
|
|
|
function result(status, code = null, extra = {}) {
|
|
console.log(JSON.stringify({ schema: "browser-opfs-s6-05-firefox-sample.v1", status, browser: "firefox", ...extra, ...(code ? { code } : {}) }));
|
|
}
|
|
|
|
if (!seleniumRoot) {
|
|
result("blocked", "selenium_unavailable", { reason: "SELENIUM_ROOT is not set" });
|
|
} else {
|
|
let server;
|
|
let driver;
|
|
try {
|
|
const { Builder } = await import(pathToFileURL(join(seleniumRoot, "node_modules/selenium-webdriver/index.js")).href);
|
|
const firefox = await import(pathToFileURL(join(seleniumRoot, "node_modules/selenium-webdriver/firefox.js")).href);
|
|
server = createServer(async (request, response) => {
|
|
const requested = (request.url ?? "/").split("?")[0];
|
|
const file = normalize(join(root, requested === "/" ? "/app/browser-opfs-probe.html" : requested));
|
|
try {
|
|
const body = await readFile(file);
|
|
response.writeHead(200, { "content-type": file.endsWith(".html") ? "text/html" : "text/javascript", "cache-control": "no-store" });
|
|
response.end(body);
|
|
} catch {
|
|
if (!response.headersSent) { response.writeHead(404); response.end(); }
|
|
}
|
|
});
|
|
await new Promise((resolve) => server.listen(0, "127.0.0.1", resolve));
|
|
const port = server.address().port;
|
|
const options = new firefox.Options().setBinary(process.env.FIREFOX_BINARY || "/snap/firefox/current/usr/lib/firefox/firefox").addArguments("-headless");
|
|
const service = new firefox.ServiceBuilder(process.env.GECKODRIVER || "/snap/bin/geckodriver");
|
|
driver = await new Builder().forBrowser("firefox").setFirefoxOptions(options).setFirefoxService(service).build();
|
|
await driver.get(`http://127.0.0.1:${port}/app/browser-opfs-probe.html?mode=round_trip`);
|
|
let text = "pending";
|
|
for (let attempt = 0; attempt < 150; attempt += 1) {
|
|
text = await driver.executeScript("return document.querySelector('#result')?.textContent ?? 'pending';");
|
|
if (text !== "pending") break;
|
|
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
}
|
|
const probe = JSON.parse(text);
|
|
if (probe.status !== "verified") throw new Error(probe.code ?? "firefox_opfs_probe_blocked");
|
|
result("verified", null, { browser_version: await driver.executeScript("return navigator.userAgent"), mode: probe.mode, project_id: probe.project_id, bytes: probe.bytes, commit_seq: probe.commit_seq, content_hash: probe.content_hash, cleanup: probe.cleanup });
|
|
} catch (error) {
|
|
result("blocked", "firefox_opfs_probe_failed", { reason: error?.message ?? error?.name ?? String(error) });
|
|
} finally {
|
|
await driver?.quit().catch(() => {});
|
|
server?.close();
|
|
}
|
|
}
|