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