Files
rustpad/static/js/logger.js
T
2026-07-22 11:15:01 +02:00

33 lines
1.8 KiB
JavaScript

const PREFIX = "[RustPad]";
const LEVELS = Object.freeze({ off: 0, error: 1, warn: 2, info: 3, debug: 4 });
function configuredLevel() {
const configured = window.__RUSTPAD_CONFIG__?.frontendLogLevel;
return Object.prototype.hasOwnProperty.call(LEVELS, configured) ? configured : "warn";
}
function enabled(level) {
return LEVELS[configuredLevel()] >= LEVELS[level];
}
function safeDetails(details) {
if (!details || typeof details !== "object") return details;
const blocked = /password|token|secret|authorization|cookie|email|content/i;
return Object.fromEntries(Object.entries(details).map(([key, value]) => [key, blocked.test(key) ? "[redacted]" : value]));
}
export function logInfo(event, details = {}) { if (enabled("info")) console.info(PREFIX, event, safeDetails(details)); }
export function logWarn(event, details = {}) { if (enabled("warn")) console.warn(PREFIX, event, safeDetails(details)); }
export function logError(event, error, details = {}) {
if (enabled("error")) console.error(PREFIX, event, { ...safeDetails(details), error: error instanceof Error ? error.message : String(error) });
}
export function logDebug(event, details = {}) { if (enabled("debug")) console.debug(PREFIX, event, safeDetails(details)); }
export function installGlobalDiagnostics() {
logInfo("frontend.initialized", { path: location.pathname, assetVersion: document.body?.dataset.assetVersion || "unknown", logLevel: configuredLevel() });
window.addEventListener("error", (event) => logError("frontend.uncaught_error", event.error || event.message, { file: event.filename, line: event.lineno, column: event.colno }));
window.addEventListener("unhandledrejection", (event) => logError("frontend.unhandled_rejection", event.reason));
window.addEventListener("online", () => logInfo("network.online"));
window.addEventListener("offline", () => logWarn("network.offline"));
}