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