clarity-js
Version:
An analytics library that uses web page interactions to generate aggregated insights
42 lines (35 loc) • 1.28 kB
text/typescript
import { Event, Setting } from "@clarity-types/data";
import type { ScriptErrorData } from "@clarity-types/diagnostic";
import { FunctionNames } from "@clarity-types/performance";
import { bind } from "@src/core/event";
import encode from "./encode";
let history: { [key: string]: number } = {};
export let data: ScriptErrorData;
export function start(): void {
bind(window, "error", handler);
history = {};
}
function handler(error: ErrorEvent): boolean {
handler.dn = FunctionNames.ScriptHandler;
const e = error.error || error;
// While rare, it's possible for code to fail repeatedly during the lifetime of the same page
// In those cases, we only want to log the failure first few times and not spam logs with redundant information.
if (!(e.message in history)) {
history[e.message] = 0;
}
if (history[e.message]++ >= Setting.ScriptErrorLimit) {
return true;
}
// Send back information only if the handled error has valid information
if (e?.message) {
data = {
message: e.message,
line: error.lineno,
column: error.colno,
stack: e.stack,
source: error.filename,
};
encode(Event.ScriptError);
}
return true;
}