You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

54 lines
1.3 KiB

import fs from "node:fs";
import type { Page } from "playwright";
export type ConsoleEvent = {
ts: number;
iso: string;
phase: string;
type: string;
text: string;
location?: string;
};
export class ConsoleLogger {
private phase = "recording_start";
constructor(private readonly outPath: string) {
fs.mkdirSync(dirname(outPath), { recursive: true });
}
setPhase(phase: string): void {
this.phase = phase;
}
attach(page: Page): void {
page.on("console", (msg) => {
const entry: ConsoleEvent = {
ts: Date.now(),
iso: new Date().toISOString(),
phase: this.phase,
type: msg.type(),
text: msg.text().slice(0, 2000),
location: msg.location()?.url,
};
fs.appendFileSync(this.outPath, `${JSON.stringify(entry)}\n`, "utf8");
});
page.on("pageerror", (error) => {
const entry: ConsoleEvent = {
ts: Date.now(),
iso: new Date().toISOString(),
phase: this.phase,
type: "pageerror",
text: error.message.slice(0, 2000),
};
fs.appendFileSync(this.outPath, `${JSON.stringify(entry)}\n`, "utf8");
});
}
}
function dirname(filePath: string): string {
const idx = Math.max(filePath.lastIndexOf("/"), filePath.lastIndexOf("\\"));
return idx >= 0 ? filePath.slice(0, idx) : filePath;
}