UNPKG

chromancer

Version:

A powerful command-line interface for automating Chrome browser using Playwright. Perfect for web scraping, automation, testing, and browser workflows.

101 lines (100 loc) 2.94 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.scanForChromeInstances = scanForChromeInstances; exports.findAvailablePort = findAvailablePort; exports.checkPortAvailable = checkPortAvailable; exports.waitForChromeReady = waitForChromeReady; const tslib_1 = require("tslib"); const net = tslib_1.__importStar(require("net")); /** * Check if a port is open and has Chrome DevTools */ async function checkChromePort(port, host = 'localhost') { try { const response = await fetch(`http://${host}:${port}/json/version`, { signal: AbortSignal.timeout(1000), }); return response.ok; } catch { return false; } } /** * Get Chrome version info from a port */ async function getChromeInfo(port, host = 'localhost') { try { const response = await fetch(`http://${host}:${port}/json/version`, { signal: AbortSignal.timeout(1000), }); if (response.ok) { return await response.json(); } } catch { // Ignore errors } return null; } /** * Scan for Chrome instances on common debugging ports */ async function scanForChromeInstances(host = 'localhost', startPort = 9222, endPort = 9232) { const instances = []; const checkPromises = []; for (let port = startPort; port <= endPort; port++) { checkPromises.push((async () => { if (await checkChromePort(port, host)) { const info = await getChromeInfo(port, host); instances.push({ port, url: `http://${host}:${port}`, version: info, }); } })()); } await Promise.all(checkPromises); return instances.sort((a, b) => a.port - b.port); } /** * Find an available port for Chrome */ async function findAvailablePort(startPort = 9222, endPort = 9232) { for (let port = startPort; port <= endPort; port++) { const isAvailable = await checkPortAvailable(port); if (isAvailable) { return port; } } return null; } /** * Check if a port is available (not in use) */ async function checkPortAvailable(port) { return new Promise((resolve) => { const server = net.createServer(); server.once('error', () => resolve(false)); server.once('listening', () => { server.close(); resolve(true); }); server.listen(port); }); } /** * Wait for Chrome to be ready on a port */ async function waitForChromeReady(port, host = 'localhost', maxRetries = 10, retryDelay = 1000) { for (let i = 0; i < maxRetries; i++) { if (await checkChromePort(port, host)) { return true; } if (i < maxRetries - 1) { await new Promise(resolve => setTimeout(resolve, retryDelay)); } } return false; }