donobu
Version:
Create browser automations with an LLM agent and replay them as Playwright scripts.
94 lines • 3.65 kB
JavaScript
;
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