Add localhost CDP proxy for debug browser
This commit is contained in:
@@ -2,12 +2,14 @@ import { chromium } from "playwright";
|
|||||||
import { spawn } from "node:child_process";
|
import { spawn } from "node:child_process";
|
||||||
import { existsSync, readdirSync } from "node:fs";
|
import { existsSync, readdirSync } from "node:fs";
|
||||||
import { mkdtemp, rm } from "node:fs/promises";
|
import { mkdtemp, rm } from "node:fs/promises";
|
||||||
|
import net from "node:net";
|
||||||
import os from "node:os";
|
import os from "node:os";
|
||||||
import path from "node:path";
|
import path from "node:path";
|
||||||
|
|
||||||
const sourceUrl = process.argv[2];
|
const sourceUrl = process.argv[2];
|
||||||
const holdMs = Number(process.env.DEBUG_HOLD_MS || "900000");
|
const holdMs = Number(process.env.DEBUG_HOLD_MS || "900000");
|
||||||
const port = Number(process.env.DEBUG_PORT || "9222");
|
const port = Number(process.env.DEBUG_PORT || "9222");
|
||||||
|
const proxyPort = process.env.DEBUG_PROXY_PORT ? Number(process.env.DEBUG_PROXY_PORT) : null;
|
||||||
|
|
||||||
if (!sourceUrl) {
|
if (!sourceUrl) {
|
||||||
console.error("usage: node scripts/debug-chatgpt-share.mjs <chatgpt-share-url>");
|
console.error("usage: node scripts/debug-chatgpt-share.mjs <chatgpt-share-url>");
|
||||||
@@ -17,6 +19,7 @@ if (!sourceUrl) {
|
|||||||
let browser;
|
let browser;
|
||||||
let context;
|
let context;
|
||||||
let browserProcess;
|
let browserProcess;
|
||||||
|
let proxyServer;
|
||||||
let userDataDir;
|
let userDataDir;
|
||||||
|
|
||||||
function now() {
|
function now() {
|
||||||
@@ -42,6 +45,7 @@ function findChromiumExecutable() {
|
|||||||
async function close() {
|
async function close() {
|
||||||
if (context) await context.close().catch(() => undefined);
|
if (context) await context.close().catch(() => undefined);
|
||||||
if (browser) await browser.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 (browserProcess && !browserProcess.killed) browserProcess.kill("SIGTERM");
|
||||||
if (userDataDir) await rm(userDataDir, { recursive: true, force: true }).catch(() => undefined);
|
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}`);
|
console.log(`[${now()}] Chromium exited code=${code} signal=${signal}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
let devtoolsReady = false;
|
||||||
for (let attempt = 0; attempt < 100; attempt += 1) {
|
for (let attempt = 0; attempt < 100; attempt += 1) {
|
||||||
const response = await fetch(`http://127.0.0.1:${port}/json/version`).catch(() => null);
|
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));
|
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}`);
|
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(JSON.stringify(summary, null, 2));
|
||||||
console.log(`[${now()}] Holding browser for ${Math.round(holdMs / 1000)}s.`);
|
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 new Promise((resolve) => setTimeout(resolve, holdMs));
|
||||||
await close();
|
await close();
|
||||||
|
|||||||
Reference in New Issue
Block a user