File size: 1,880 Bytes
88c4c60 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | import { EventEmitter } from "events";
import { CONSOLE_LOG_CONFIG } from "@/shared/constants/config.js";
const consoleLevels = ["log", "info", "warn", "error", "debug"];
if (!global._consoleLogBufferState) {
global._consoleLogBufferState = {
logs: [],
patched: false,
originals: {},
emitter: new EventEmitter(),
};
global._consoleLogBufferState.emitter.setMaxListeners(50);
}
const state = global._consoleLogBufferState;
// Ensure emitter exists (handles hot reload with stale global)
if (!state.emitter) {
state.emitter = new EventEmitter();
state.emitter.setMaxListeners(50);
}
function toLogLine(level, args) {
return args.map(formatArg).join(" ");
}
// Strip ANSI escape codes so terminal colors don't bleed into UI
const ANSI_RE = /\x1b\[[0-9;]*m/g;
function stripAnsi(str) {
return str.replace(ANSI_RE, "");
}
function formatArg(arg) {
if (typeof arg === "string") return stripAnsi(arg);
if (arg instanceof Error) return stripAnsi(arg.stack || arg.message || String(arg));
try {
return stripAnsi(JSON.stringify(arg));
} catch {
return stripAnsi(String(arg));
}
}
function appendLine(line) {
state.logs.push(line);
const maxLines = CONSOLE_LOG_CONFIG.maxLines;
if (state.logs.length > maxLines) {
state.logs = state.logs.slice(-maxLines);
}
state.emitter.emit("line", line);
}
export function initConsoleLogCapture() {
if (state.patched) return;
for (const level of consoleLevels) {
state.originals[level] = console[level];
console[level] = (...args) => {
appendLine(toLogLine(level, args));
state.originals[level](...args);
};
}
state.patched = true;
}
export function getConsoleLogs() {
return state.logs;
}
export function clearConsoleLogs() {
state.logs = [];
state.emitter.emit("clear");
}
export function getConsoleEmitter() {
return state.emitter;
}
|