From da76c1c4be398735f9fe66e3cccb9b36f4bcb7a1 Mon Sep 17 00:00:00 2001 From: Codex Date: Wed, 8 Jul 2026 01:55:19 +0000 Subject: [PATCH] Add localhost CDP proxy for debug browser --- scripts/debug-chatgpt-share.mjs | 28 +++++++++++++++++++++++++--- 1 file changed, 25 insertions(+), 3 deletions(-) diff --git a/scripts/debug-chatgpt-share.mjs b/scripts/debug-chatgpt-share.mjs index 192e633..be087c3 100644 --- a/scripts/debug-chatgpt-share.mjs +++ b/scripts/debug-chatgpt-share.mjs @@ -2,12 +2,14 @@ import { chromium } from "playwright"; import { spawn } from "node:child_process"; import { existsSync, readdirSync } from "node:fs"; import { mkdtemp, rm } from "node:fs/promises"; +import net from "node:net"; import os from "node:os"; import path from "node:path"; const sourceUrl = process.argv[2]; const holdMs = Number(process.env.DEBUG_HOLD_MS || "900000"); const port = Number(process.env.DEBUG_PORT || "9222"); +const proxyPort = process.env.DEBUG_PROXY_PORT ? Number(process.env.DEBUG_PROXY_PORT) : null; if (!sourceUrl) { console.error("usage: node scripts/debug-chatgpt-share.mjs "); @@ -17,6 +19,7 @@ if (!sourceUrl) { let browser; let context; let browserProcess; +let proxyServer; let userDataDir; function now() { @@ -42,6 +45,7 @@ function findChromiumExecutable() { async function close() { if (context) await context.close().catch(() => undefined); if (browser) await browser.close().catch(() => undefined); + if (proxyServer) await new Promise((resolve) => proxyServer.close(resolve)).catch(() => undefined); if (browserProcess && !browserProcess.killed) browserProcess.kill("SIGTERM"); if (userDataDir) await rm(userDataDir, { recursive: true, force: true }).catch(() => undefined); } @@ -74,11 +78,31 @@ browserProcess.on("exit", (code, signal) => { console.log(`[${now()}] Chromium exited code=${code} signal=${signal}`); }); +let devtoolsReady = false; for (let attempt = 0; attempt < 100; attempt += 1) { const response = await fetch(`http://127.0.0.1:${port}/json/version`).catch(() => null); - if (response?.ok) break; + if (response?.ok) { + devtoolsReady = true; + break; + } await new Promise((resolve) => setTimeout(resolve, 250)); } +if (!devtoolsReady) throw new Error(`Chromium DevTools endpoint did not start on 127.0.0.1:${port}.`); + +if (proxyPort) { + proxyServer = net.createServer((client) => { + const upstream = net.connect(port, "127.0.0.1"); + client.pipe(upstream); + upstream.pipe(client); + client.on("error", () => upstream.destroy()); + upstream.on("error", () => client.destroy()); + }); + await new Promise((resolve, reject) => { + proxyServer.once("error", reject); + proxyServer.listen(proxyPort, "0.0.0.0", resolve); + }); + console.log(`[${now()}] DevTools proxy: 0.0.0.0:${proxyPort} -> 127.0.0.1:${port}`); +} browser = await chromium.connectOverCDP(`http://127.0.0.1:${port}`); @@ -133,8 +157,6 @@ const summary = await page.evaluate(() => { console.log(JSON.stringify(summary, null, 2)); console.log(`[${now()}] Holding browser for ${Math.round(holdMs / 1000)}s.`); -console.log(`[${now()}] Tunnel with: ssh -L ${port}:127.0.0.1:${port} titan-reverse`); -console.log(`[${now()}] Then open: chrome://inspect/#devices`); await new Promise((resolve) => setTimeout(resolve, holdMs)); await close();