UNPKG

@dash0/sdk-web

Version:

Dash0's Web SDK to collect telemetry from end-users' web browsers

53 lines (52 loc) 2.24 kB
import { vars } from "../../vars"; import { win } from "../../utils"; import { addWrappedDomEventListener, popWrappedDomEventListener, } from "./async-function-wrapping"; import { ignoreNextOnErrorEvent, reportUnhandledError } from "./unhandled-error"; export function startEventHandlerInstrumentation() { if (vars.wrapEventHandlers) { wrapEventTarget(win?.EventTarget); } } function wrapEventTarget(EventTarget) { if (!EventTarget || typeof EventTarget.prototype.addEventListener !== "function" || typeof EventTarget.prototype.removeEventListener !== "function") { return; } const originalAddEventListener = EventTarget.prototype.addEventListener; const originalRemoveEventListener = EventTarget.prototype.removeEventListener; EventTarget.prototype.addEventListener = function wrappedAddEventListener(eventName, fn, optionsOrCapture) { if (typeof fn !== "function") { return originalAddEventListener.apply(this, arguments); } // non-deopt arguments copy const args = new Array(arguments.length); for (let i = 0; i < arguments.length; i++) { args[i] = arguments[i]; } args[1] = function wrappedEventListener() { try { return fn.apply(this, arguments); } catch (e) { reportUnhandledError(e); ignoreNextOnErrorEvent(); throw e; } }; args[1] = addWrappedDomEventListener(this, args[1], eventName, fn, optionsOrCapture); return originalAddEventListener.apply(this, args); }; EventTarget.prototype.removeEventListener = function wrappedRemoveEventListener(eventName, fn, optionsOrCapture) { if (typeof fn !== "function") { return originalRemoveEventListener.apply(this, arguments); } // non-deopt arguments copy const args = new Array(arguments.length); for (let i = 0; i < arguments.length; i++) { args[i] = arguments[i]; } args[1] = popWrappedDomEventListener(this, eventName, fn, optionsOrCapture, fn); return originalRemoveEventListener.apply(this, args); }; }