@grafana/faro-web-sdk
Version:
Faro instrumentations, metas, transports for web.
46 lines • 1.88 kB
JavaScript
import { allLogLevels, defaultUnpatchedConsole, Observable } from '@grafana/faro-core';
import { MESSAGE_TYPE_CONSOLE } from './const';
let consoleObservable;
let isInstrumented = false;
/**
* Monitors console methods and emits events to subscribers.
* @param unpatchedConsole - Optional console to call after notifying subscribers.
* Only the first caller's value is used (since we patch once).
* Defaults to defaultUnpatchedConsole.
*/
export function monitorConsole(unpatchedConsole) {
if (!consoleObservable) {
consoleObservable = new Observable();
}
if (!isInstrumented) {
const originalConsole = unpatchedConsole !== null && unpatchedConsole !== void 0 ? unpatchedConsole : defaultUnpatchedConsole;
// Patch ALL console methods - subscribers decide which levels to process
allLogLevels.forEach((level) => {
console[level] = (...args) => {
var _a;
// Notify all subscribers
consoleObservable.notify({
type: MESSAGE_TYPE_CONSOLE,
level,
args,
});
// Call the unpatchedConsole method
(_a = originalConsole[level]) === null || _a === void 0 ? void 0 : _a.apply(console, args);
};
});
isInstrumented = true;
}
return consoleObservable;
}
// Test-only utility to reset state between tests
export function __resetConsoleMonitorForTests() {
// Restore original console methods from defaultUnpatchedConsole
for (const level of allLogLevels) {
if (defaultUnpatchedConsole[level]) {
console[level] = defaultUnpatchedConsole[level];
}
}
consoleObservable = undefined;
isInstrumented = false;
}
//# sourceMappingURL=consoleMonitor.js.map