@dash0/sdk-web
Version:
Dash0's Web SDK to collect telemetry from end-users' web browsers
53 lines (52 loc) • 2.24 kB
JavaScript
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);
};
}