66 lines
2.7 KiB
JavaScript
66 lines
2.7 KiB
JavaScript
import { existsSync, readFileSync } from 'node:fs';
|
|
import { homedir } from 'node:os';
|
|
import { resolve } from 'node:path';
|
|
|
|
const browserPaths = [
|
|
resolve(homedir(), 'Library/Application Support/Google/Chrome/DevToolsActivePort'),
|
|
resolve(homedir(), 'Library/Application Support/Google/Chrome Beta/DevToolsActivePort'),
|
|
resolve(homedir(), 'Library/Application Support/Chromium/DevToolsActivePort'),
|
|
resolve(homedir(), 'Library/Application Support/Google/Chrome for Testing/DevToolsActivePort'),
|
|
resolve(homedir(), '.config/google-chrome/DevToolsActivePort'),
|
|
resolve(homedir(), '.config/chromium/DevToolsActivePort')
|
|
];
|
|
|
|
function browserWebSocketUrl() {
|
|
const portFile = [process.env.CDP_PORT_FILE, ...browserPaths].filter(Boolean).find((path) => existsSync(path));
|
|
if (!portFile) throw new Error('No DevToolsActivePort found; enable Chrome remote debugging first.');
|
|
const lines = readFileSync(portFile, 'utf8').trim().split('\n');
|
|
if (!lines[0] || !lines[1]) throw new Error(`Invalid DevToolsActivePort file: ${portFile}`);
|
|
const host = process.env.CDP_HOST || '127.0.0.1';
|
|
return `ws://${host}:${lines[0]}${lines[1]}`;
|
|
}
|
|
|
|
function request(wsUrl, method, params = {}) {
|
|
return new Promise((resolve, reject) => {
|
|
const ws = new WebSocket(wsUrl);
|
|
let id = 0;
|
|
let timer;
|
|
const fail = (error) => {
|
|
clearTimeout(timer);
|
|
try { ws.close(); } catch {}
|
|
reject(error);
|
|
};
|
|
ws.onerror = (event) => fail(new Error(event.message || event.type || 'Chrome DevTools WebSocket error'));
|
|
ws.onopen = () => {
|
|
id += 1;
|
|
timer = setTimeout(() => fail(new Error(`Timeout: ${method}`)), 15000);
|
|
ws.send(JSON.stringify({ id, method, params }));
|
|
};
|
|
ws.onmessage = (event) => {
|
|
const message = JSON.parse(event.data);
|
|
if (message.id !== id) return;
|
|
clearTimeout(timer);
|
|
try { ws.close(); } catch {}
|
|
if (message.error) reject(new Error(message.error.message || `${method} failed`));
|
|
else resolve(message.result || {});
|
|
};
|
|
});
|
|
}
|
|
|
|
export async function getTarget(port = '') {
|
|
try {
|
|
const response = await fetch(`http://127.0.0.1:${port}/json`);
|
|
if (response.ok) {
|
|
const targets = await response.json();
|
|
const target = targets.find((item) => item.type === 'page' && item.url.includes('lwlt.hisy.cc'));
|
|
if (target) return target;
|
|
}
|
|
} catch {}
|
|
|
|
const wsUrl = browserWebSocketUrl();
|
|
const result = await request(wsUrl, 'Target.getTargets');
|
|
const target = (result.targetInfos || []).find((item) => item.type === 'page' && item.url.includes('lwlt.hisy.cc'));
|
|
if (!target) throw new Error('No lwlt.hisy.cc page target on the Chrome DevTools connection.');
|
|
return { webSocketDebuggerUrl: wsUrl, targetId: target.targetId };
|
|
}
|