import puppeteer from 'puppeteer';
import type { Page } from 'puppeteer';
import type { BrowserState, ConsoleLog, NetworkRequest } from './types.js';
export const browserState: BrowserState = {
browser: null,
page: null,
consoleLogs: [],
networkRequests: [],
};
export async function initBrowser(): Promise<Page> {
if (!browserState.browser) {
browserState.browser = await puppeteer.launch({
headless: true,
args: [
'--no-sandbox',
'--disable-setuid-sandbox',
'--disable-dev-shm-usage',
'--disable-web-security',
'--disable-features=IsolateOrigins,site-per-process',
],
});
}
if (!browserState.page) {
browserState.page = await browserState.browser.newPage();
// Configurar viewport
await browserState.page.setViewport({ width: 1920, height: 1080 });
// Capturar console logs
browserState.page.on('console', (msg) => {
const log: ConsoleLog = {
type: msg.type(),
text: msg.text(),
timestamp: new Date().toISOString(),
};
browserState.consoleLogs.push(log);
});
// Capturar erros de página
browserState.page.on('pageerror', (error) => {
const log: ConsoleLog = {
type: 'error',
text: error.message,
stack: error.stack,
timestamp: new Date().toISOString(),
};
browserState.consoleLogs.push(log);
});
// Monitorar requisições de rede
browserState.page.on('request', (request) => {
const networkRequest: NetworkRequest = {
type: 'request',
url: request.url(),
method: request.method(),
resourceType: request.resourceType(),
timestamp: new Date().toISOString(),
};
browserState.networkRequests.push(networkRequest);
});
browserState.page.on('response', (response) => {
const networkRequest: NetworkRequest = {
type: 'response',
url: response.url(),
status: response.status(),
statusText: response.statusText(),
timestamp: new Date().toISOString(),
};
browserState.networkRequests.push(networkRequest);
});
}
return browserState.page;
}
export function clearConsoleLogs(): void {
browserState.consoleLogs = [];
}
export function clearNetworkRequests(): void {
browserState.networkRequests = [];
}
export async function closeBrowser(): Promise<void> {
if (browserState.browser) {
await browserState.browser.close();
browserState.browser = null;
browserState.page = null;
}
}