UNPKG

donobu

Version:

Create browser automations with an LLM agent and replay them as Playwright scripts.

94 lines 3.65 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.registerPageLogListeners = registerPageLogListeners; const Logger_1 = require("./Logger"); /** * Registers Playwright page event listeners that route browser console messages * and network request/response data to the {@link browserLogger} and * {@link networkLogger} Winston loggers. These loggers include a * {@link FlowLogBufferTransport} that captures entries into the per-flow * log buffer (when one is available via AsyncLocalStorage or the process-local * fallback). * * This function is called from both {@link WebTargetInspector.handleNewPage} * (Studio-launched flows) and the Playwright test extension fixture, ensuring * identical logging behaviour across both runtime contexts. */ function registerPageLogListeners(page) { page.on('console', (msg) => { const { url, lineNumber, columnNumber } = msg.location(); const hasSourceLocation = lineNumber !== 0 || columnNumber !== 0; const meta = url ? hasSourceLocation ? { url, lineNumber, columnNumber } : { url } : undefined; switch (msg.type()) { case 'error': Logger_1.browserLogger.error(msg.text(), meta); break; case 'warning': Logger_1.browserLogger.warn(msg.text(), meta); break; case 'debug': Logger_1.browserLogger.debug(msg.text(), meta); break; default: Logger_1.browserLogger.info(msg.text(), meta); break; } }); page.on('pageerror', (error) => { Logger_1.browserLogger.error(error.message, { stack: error.stack, url: page.url(), }); }); // Fallback timing: track request start times keyed by the Request object // itself (via WeakMap) so concurrent requests to the same URL don't collide. // Prefer Playwright's native timing API when it has data. const requestStartTimes = new WeakMap(); page.on('request', (request) => { requestStartTimes.set(request, Date.now()); }); const getDuration = (request) => { const timing = request.timing(); if (timing.responseEnd >= 0) { return Math.round(timing.responseEnd); } const startTime = requestStartTimes.get(request); return startTime !== undefined ? Date.now() - startTime : undefined; }; page.on('response', (response) => { const request = response.request(); const status = response.status(); const duration = getDuration(request); const meta = { method: request.method(), url: request.url(), status, duration, resourceType: request.resourceType(), }; if (status >= 500) { Logger_1.networkLogger.error(request.url(), meta); } else if (status >= 400) { Logger_1.networkLogger.warn(request.url(), meta); } else { Logger_1.networkLogger.info(request.url(), meta); } }); page.on('requestfailed', (request) => { const duration = getDuration(request); Logger_1.networkLogger.error(`${request.url()} FAILED: ${request.failure()?.errorText}`, { method: request.method(), url: request.url(), resourceType: request.resourceType(), failureReason: request.failure()?.errorText, duration, }); }); } //# sourceMappingURL=PageLogListeners.js.map