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(); } }