@sentry/browser 10.10.0 → 10.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -111,6 +111,7 @@ function wrap(
111
111
  return event;
112
112
  });
113
113
 
114
+ // no need to add a mechanism here, we already add it via an event processor above
114
115
  core.captureException(ex);
115
116
  });
116
117
 
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/helpers.ts"],"sourcesContent":["import type { Mechanism, WrappedFunction } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n captureException,\n getLocationHref,\n getOriginalFunction,\n GLOBAL_OBJ,\n markFunctionWrapped,\n withScope,\n} from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError++;\n setTimeout(() => {\n ignoreOnError--;\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n fn: T,\n options?: {\n mechanism?: Mechanism;\n },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n fn: NonFunction,\n options?: {\n mechanism?: Mechanism;\n },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n fn: T | NonFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n): NonFunction | WrappedFunction<T> {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n function isFunction(fn: T | NonFunction): fn is T {\n return typeof fn === 'function';\n }\n\n if (!isFunction(fn)) {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n if (wrapper) {\n if (typeof wrapper === 'function') {\n return wrapper;\n } else {\n // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n // that something messed with it. In that case we want to return the originally passed function.\n return fn;\n }\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n // Wrap the function itself\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n try {\n // Also wrap arguments that are themselves functions\n const wrappedArguments = args.map(arg => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope(scope => {\n scope.addEventProcessor(event => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n } as unknown as WrappedFunction<T>;\n\n // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property as keyof T] = fn[property as keyof T];\n }\n }\n } catch {\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n }\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n } catch {\n // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n // to save some bytes we simply try-catch this\n }\n\n return sentryWrapped;\n}\n\n/**\n * Get HTTP request data from the current page.\n */\nexport function getHttpRequestData(): { url: string; headers: Record<string, string> } {\n // grab as much info as exists and add it to the event\n const url = getLocationHref();\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = {\n url,\n headers,\n };\n\n return request;\n}\n"],"names":["GLOBAL_OBJ","getOriginalFunction","withScope","addExceptionTypeValue","addExceptionMechanism","captureException","markFunctionWrapped","addNonEnumerableProperty","getLocationHref"],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/helpers.ts"],"sourcesContent":["import type { Mechanism, WrappedFunction } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n captureException,\n getLocationHref,\n getOriginalFunction,\n GLOBAL_OBJ,\n markFunctionWrapped,\n withScope,\n} from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError++;\n setTimeout(() => {\n ignoreOnError--;\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n fn: T,\n options?: {\n mechanism?: Mechanism;\n },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n fn: NonFunction,\n options?: {\n mechanism?: Mechanism;\n },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n fn: T | NonFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n): NonFunction | WrappedFunction<T> {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n function isFunction(fn: T | NonFunction): fn is T {\n return typeof fn === 'function';\n }\n\n if (!isFunction(fn)) {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n if (wrapper) {\n if (typeof wrapper === 'function') {\n return wrapper;\n } else {\n // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n // that something messed with it. In that case we want to return the originally passed function.\n return fn;\n }\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n // Wrap the function itself\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n try {\n // Also wrap arguments that are themselves functions\n const wrappedArguments = args.map(arg => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope(scope => {\n scope.addEventProcessor(event => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n // no need to add a mechanism here, we already add it via an event processor above\n captureException(ex);\n });\n\n throw ex;\n }\n } as unknown as WrappedFunction<T>;\n\n // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property as keyof T] = fn[property as keyof T];\n }\n }\n } catch {\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n }\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n } catch {\n // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n // to save some bytes we simply try-catch this\n }\n\n return sentryWrapped;\n}\n\n/**\n * Get HTTP request data from the current page.\n */\nexport function getHttpRequestData(): { url: string; headers: Record<string, string> } {\n // grab as much info as exists and add it to the event\n const url = getLocationHref();\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = {\n url,\n headers,\n };\n\n return request;\n}\n"],"names":["GLOBAL_OBJ","getOriginalFunction","withScope","addExceptionTypeValue","addExceptionMechanism","captureException","markFunctionWrapped","addNonEnumerableProperty","getLocationHref"],"mappings":"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"}
@@ -90,9 +90,8 @@ function _wrapTimeFunction(original) {
90
90
  const originalCallback = args[0];
91
91
  args[0] = helpers.wrap(originalCallback, {
92
92
  mechanism: {
93
- data: { function: core.getFunctionName(original) },
94
93
  handled: false,
95
- type: 'instrument',
94
+ type: `auto.browser.browserapierrors.${core.getFunctionName(original)}`,
96
95
  },
97
96
  });
98
97
  return original.apply(this, args);
@@ -105,11 +104,10 @@ function _wrapRAF(original) {
105
104
  helpers.wrap(callback, {
106
105
  mechanism: {
107
106
  data: {
108
- function: 'requestAnimationFrame',
109
107
  handler: core.getFunctionName(original),
110
108
  },
111
109
  handled: false,
112
- type: 'instrument',
110
+ type: 'auto.browser.browserapierrors.requestAnimationFrame',
113
111
  },
114
112
  }),
115
113
  ]);
@@ -128,11 +126,10 @@ function _wrapXHR(originalSend) {
128
126
  const wrapOptions = {
129
127
  mechanism: {
130
128
  data: {
131
- function: prop,
132
129
  handler: core.getFunctionName(original),
133
130
  },
134
131
  handled: false,
135
- type: 'instrument',
132
+ type: `auto.browser.browserapierrors.xhr.${prop}`,
136
133
  },
137
134
  };
138
135
 
@@ -176,12 +173,11 @@ function _wrapEventTarget(target, integrationOptions) {
176
173
  fn.handleEvent = helpers.wrap(fn.handleEvent, {
177
174
  mechanism: {
178
175
  data: {
179
- function: 'handleEvent',
180
176
  handler: core.getFunctionName(fn),
181
177
  target,
182
178
  },
183
179
  handled: false,
184
- type: 'instrument',
180
+ type: 'auto.browser.browserapierrors.handleEvent',
185
181
  },
186
182
  });
187
183
  }
@@ -198,12 +194,11 @@ function _wrapEventTarget(target, integrationOptions) {
198
194
  helpers.wrap(fn, {
199
195
  mechanism: {
200
196
  data: {
201
- function: 'addEventListener',
202
197
  handler: core.getFunctionName(fn),
203
198
  target,
204
199
  },
205
200
  handled: false,
206
- type: 'instrument',
201
+ type: 'auto.browser.browserapierrors.addEventListener',
207
202
  },
208
203
  }),
209
204
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"browserapierrors.js","sources":["../../../../src/integrations/browserapierrors.ts"],"sourcesContent":["import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\nimport { WINDOW, wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'BroadcastChannel',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'SharedWorker',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n\n /**\n * If you experience issues with this integration causing double-invocations of event listeners,\n * try setting this option to `true`. It will unregister the original callbacks from the event targets\n * before adding the instrumented callback.\n *\n * @default false\n */\n unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n unregisterOriginalCallbacks: false,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(target => _wrapEventTarget(target, _options));\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: false,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n if (integrationOptions.unregisterOriginalCallbacks) {\n unregisterOriginalCallback(this, eventName, fn);\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n if (\n target &&\n typeof target === 'object' &&\n 'removeEventListener' in target &&\n typeof target.removeEventListener === 'function'\n ) {\n target.removeEventListener(eventName, fn);\n }\n}\n"],"names":["fill","WINDOW","defineIntegration","wrap","getFunctionName","getOriginalFunction"],"mappings":"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"}
1
+ {"version":3,"file":"browserapierrors.js","sources":["../../../../src/integrations/browserapierrors.ts"],"sourcesContent":["import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\nimport { WINDOW, wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'BroadcastChannel',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'SharedWorker',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n\n /**\n * If you experience issues with this integration causing double-invocations of event listeners,\n * try setting this option to `true`. It will unregister the original callbacks from the event targets\n * before adding the instrumented callback.\n *\n * @default false\n */\n unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n unregisterOriginalCallbacks: false,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(target => _wrapEventTarget(target, _options));\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n handled: false,\n type: `auto.browser.browserapierrors.${getFunctionName(original)}`,\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'auto.browser.browserapierrors.requestAnimationFrame',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: `auto.browser.browserapierrors.xhr.${prop}`,\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.handleEvent',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n if (integrationOptions.unregisterOriginalCallbacks) {\n unregisterOriginalCallback(this, eventName, fn);\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.addEventListener',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n if (\n target &&\n typeof target === 'object' &&\n 'removeEventListener' in target &&\n typeof target.removeEventListener === 'function'\n ) {\n target.removeEventListener(eventName, fn);\n }\n}\n"],"names":["fill","WINDOW","defineIntegration","wrap","getFunctionName","getOriginalFunction"],"mappings":"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"}
@@ -60,6 +60,7 @@ function _fetchResponseHandler(
60
60
  requestCookies,
61
61
  responseCookies,
62
62
  error,
63
+ type: 'fetch',
63
64
  });
64
65
 
65
66
  core.captureEvent(event);
@@ -132,6 +133,7 @@ function _xhrResponseHandler(
132
133
  responseHeaders,
133
134
  responseCookies,
134
135
  error,
136
+ type: 'xhr',
135
137
  });
136
138
 
137
139
  core.captureEvent(event);
@@ -362,7 +364,7 @@ function _createEvent(data
362
364
  };
363
365
 
364
366
  core.addExceptionMechanism(event, {
365
- type: 'http.client',
367
+ type: `auto.http.client.${data.type}`,
366
368
  handled: false,
367
369
  });
368
370
 
@@ -1 +1 @@
1
- {"version":3,"file":"httpclient.js","sources":["../../../../src/integrations/httpclient.ts"],"sourcesContent":["import type { Client, Event as SentryEvent, IntegrationFn, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addFetchInstrumentationHandler,\n captureEvent,\n debug,\n defineIntegration,\n getClient,\n GLOBAL_OBJ,\n isSentryRequestUrl,\n supportsNativeFetch,\n} from '@sentry/core';\nimport { addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type HttpStatusCodeRange = [number, number] | number;\nexport type HttpRequestTarget = string | RegExp;\n\nconst INTEGRATION_NAME = 'HttpClient';\n\ninterface HttpClientOptions {\n /**\n * HTTP status codes that should be considered failed.\n * This array can contain tuples of `[begin, end]` (both inclusive),\n * single status codes, or a combinations of both\n *\n * Example: [[500, 505], 507]\n * Default: [[500, 599]]\n */\n failedRequestStatusCodes: HttpStatusCodeRange[];\n\n /**\n * Targets to track for failed requests.\n * This array can contain strings or regular expressions.\n *\n * Example: ['http://localhost', /api\\/.*\\/]\n * Default: [/.*\\/]\n */\n failedRequestTargets: HttpRequestTarget[];\n}\n\nconst _httpClientIntegration = ((options: Partial<HttpClientOptions> = {}) => {\n const _options: HttpClientOptions = {\n failedRequestStatusCodes: [[500, 599]],\n failedRequestTargets: [/.*/],\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client): void {\n _wrapFetch(client, _options);\n _wrapXHR(client, _options);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Create events for failed client side HTTP requests.\n */\nexport const httpClientIntegration = defineIntegration(_httpClientIntegration);\n\n/**\n * Interceptor function for fetch requests\n *\n * @param requestInfo The Fetch API request info\n * @param response The Fetch API response\n * @param requestInit The request init object\n */\nfunction _fetchResponseHandler(\n options: HttpClientOptions,\n requestInfo: RequestInfo,\n response: Response,\n requestInit?: RequestInit,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, response.status, response.url)) {\n const request = _getRequest(requestInfo, requestInit);\n\n let requestHeaders, responseHeaders, requestCookies, responseCookies;\n\n if (_shouldSendDefaultPii()) {\n [requestHeaders, requestCookies] = _parseCookieHeaders('Cookie', request);\n [responseHeaders, responseCookies] = _parseCookieHeaders('Set-Cookie', response);\n }\n\n const event = _createEvent({\n url: request.url,\n method: request.method,\n status: response.status,\n requestHeaders,\n responseHeaders,\n requestCookies,\n responseCookies,\n error,\n });\n\n captureEvent(event);\n }\n}\n\nfunction _parseCookieHeaders(\n cookieHeader: string,\n obj: Request | Response,\n): [Record<string, string>, Record<string, string> | undefined] {\n const headers = _extractFetchHeaders(obj.headers);\n let cookies;\n\n try {\n const cookieString = headers[cookieHeader] || headers[cookieHeader.toLowerCase()] || undefined;\n\n if (cookieString) {\n cookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n return [headers, cookies];\n}\n\n/**\n * Interceptor function for XHR requests\n *\n * @param xhr The XHR request\n * @param method The HTTP method\n * @param headers The HTTP headers\n */\nfunction _xhrResponseHandler(\n options: HttpClientOptions,\n xhr: XMLHttpRequest,\n method: string,\n headers: Record<string, string>,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, xhr.status, xhr.responseURL)) {\n let requestHeaders, responseCookies, responseHeaders;\n\n if (_shouldSendDefaultPii()) {\n try {\n const cookieString = xhr.getResponseHeader('Set-Cookie') || xhr.getResponseHeader('set-cookie') || undefined;\n\n if (cookieString) {\n responseCookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n try {\n responseHeaders = _getXHRResponseHeaders(xhr);\n } catch {\n // ignore it if parsing fails\n }\n\n requestHeaders = headers;\n }\n\n const event = _createEvent({\n url: xhr.responseURL,\n method,\n status: xhr.status,\n requestHeaders,\n // Can't access request cookies from XHR\n responseHeaders,\n responseCookies,\n error,\n });\n\n captureEvent(event);\n }\n}\n\n/**\n * Extracts response size from `Content-Length` header when possible\n *\n * @param headers\n * @returns The response size in bytes or undefined\n */\nfunction _getResponseSizeFromHeaders(headers?: Record<string, string>): number | undefined {\n if (headers) {\n const contentLength = headers['Content-Length'] || headers['content-length'];\n\n if (contentLength) {\n return parseInt(contentLength, 10);\n }\n }\n\n return undefined;\n}\n\n/**\n * Creates an object containing cookies from the given cookie string\n *\n * @param cookieString The cookie string to parse\n * @returns The parsed cookies\n */\nfunction _parseCookieString(cookieString: string): Record<string, string> {\n return cookieString.split('; ').reduce((acc: Record<string, string>, cookie: string) => {\n const [key, value] = cookie.split('=');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Extracts the headers as an object from the given Fetch API request or response object\n *\n * @param headers The headers to extract\n * @returns The extracted headers as an object\n */\nfunction _extractFetchHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n}\n\n/**\n * Extracts the response headers as an object from the given XHR object\n *\n * @param xhr The XHR object to extract the response headers from\n * @returns The response headers as an object\n */\nfunction _getXHRResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n const [key, value] = line.split(': ');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Checks if the given target url is in the given list of targets\n *\n * @param target The target url to check\n * @returns true if the target url is in the given list of targets, false otherwise\n */\nfunction _isInGivenRequestTargets(\n failedRequestTargets: HttpClientOptions['failedRequestTargets'],\n target: string,\n): boolean {\n return failedRequestTargets.some((givenRequestTarget: HttpRequestTarget) => {\n if (typeof givenRequestTarget === 'string') {\n return target.includes(givenRequestTarget);\n }\n\n return givenRequestTarget.test(target);\n });\n}\n\n/**\n * Checks if the given status code is in the given range\n *\n * @param status The status code to check\n * @returns true if the status code is in the given range, false otherwise\n */\nfunction _isInGivenStatusRanges(\n failedRequestStatusCodes: HttpClientOptions['failedRequestStatusCodes'],\n status: number,\n): boolean {\n return failedRequestStatusCodes.some((range: HttpStatusCodeRange) => {\n if (typeof range === 'number') {\n return range === status;\n }\n\n return status >= range[0] && status <= range[1];\n });\n}\n\n/**\n * Wraps `fetch` function to capture request and response data\n */\nfunction _wrapFetch(client: Client, options: HttpClientOptions): void {\n if (!supportsNativeFetch()) {\n return;\n }\n\n addFetchInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { response, args, error, virtualError } = handlerData;\n const [requestInfo, requestInit] = args as [RequestInfo, RequestInit | undefined];\n\n if (!response) {\n return;\n }\n\n _fetchResponseHandler(options, requestInfo, response as Response, requestInit, error || virtualError);\n }, false);\n}\n\n/**\n * Wraps XMLHttpRequest to capture request and response data\n */\nfunction _wrapXHR(client: Client, options: HttpClientOptions): void {\n if (!('XMLHttpRequest' in GLOBAL_OBJ)) {\n return;\n }\n\n addXhrInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { error, virtualError } = handlerData;\n\n const xhr = handlerData.xhr as SentryWrappedXMLHttpRequest & XMLHttpRequest;\n\n const sentryXhrData = xhr[SENTRY_XHR_DATA_KEY];\n\n if (!sentryXhrData) {\n return;\n }\n\n const { method, request_headers: headers } = sentryXhrData;\n\n try {\n _xhrResponseHandler(options, xhr, method, headers, error || virtualError);\n } catch (e) {\n DEBUG_BUILD && debug.warn('Error while extracting response event form XHR response', e);\n }\n });\n}\n\n/**\n * Checks whether to capture given response as an event\n *\n * @param status response status code\n * @param url response url\n */\nfunction _shouldCaptureResponse(options: HttpClientOptions, status: number, url: string): boolean {\n return (\n _isInGivenStatusRanges(options.failedRequestStatusCodes, status) &&\n _isInGivenRequestTargets(options.failedRequestTargets, url) &&\n !isSentryRequestUrl(url, getClient())\n );\n}\n\n/**\n * Creates a synthetic Sentry event from given response data\n *\n * @param data response data\n * @returns event\n */\nfunction _createEvent(data: {\n url: string;\n method: string;\n status: number;\n responseHeaders?: Record<string, string>;\n responseCookies?: Record<string, string>;\n requestHeaders?: Record<string, string>;\n requestCookies?: Record<string, string>;\n error?: unknown;\n}): SentryEvent {\n const client = getClient();\n const virtualStackTrace = client && data.error && data.error instanceof Error ? data.error.stack : undefined;\n // Remove the first frame from the stack as it's the HttpClient call\n const stack = virtualStackTrace && client ? client.getOptions().stackParser(virtualStackTrace, 0, 1) : undefined;\n const message = `HTTP Client Error with status code: ${data.status}`;\n\n const event: SentryEvent = {\n message,\n exception: {\n values: [\n {\n type: 'Error',\n value: message,\n stacktrace: stack ? { frames: stack } : undefined,\n },\n ],\n },\n request: {\n url: data.url,\n method: data.method,\n headers: data.requestHeaders,\n cookies: data.requestCookies,\n },\n contexts: {\n response: {\n status_code: data.status,\n headers: data.responseHeaders,\n cookies: data.responseCookies,\n body_size: _getResponseSizeFromHeaders(data.responseHeaders),\n },\n },\n };\n\n addExceptionMechanism(event, {\n type: 'http.client',\n handled: false,\n });\n\n return event;\n}\n\nfunction _getRequest(requestInfo: RequestInfo, requestInit?: RequestInit): Request {\n if (!requestInit && requestInfo instanceof Request) {\n return requestInfo;\n }\n\n // If both are set, we try to construct a new Request with the given arguments\n // However, if e.g. the original request has a `body`, this will throw an error because it was already accessed\n // In this case, as a fallback, we just use the original request - using both is rather an edge case\n if (requestInfo instanceof Request && requestInfo.bodyUsed) {\n return requestInfo;\n }\n\n return new Request(requestInfo, requestInit);\n}\n\nfunction _shouldSendDefaultPii(): boolean {\n const client = getClient();\n return client ? Boolean(client.getOptions().sendDefaultPii) : false;\n}\n"],"names":["defineIntegration","captureEvent","supportsNativeFetch","addFetchInstrumentationHandler","getClient","GLOBAL_OBJ","addXhrInstrumentationHandler","SENTRY_XHR_DATA_KEY","DEBUG_BUILD","debug","isSentryRequestUrl","addExceptionMechanism"],"mappings":"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"}
1
+ {"version":3,"file":"httpclient.js","sources":["../../../../src/integrations/httpclient.ts"],"sourcesContent":["import type { Client, Event as SentryEvent, IntegrationFn, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addFetchInstrumentationHandler,\n captureEvent,\n debug,\n defineIntegration,\n getClient,\n GLOBAL_OBJ,\n isSentryRequestUrl,\n supportsNativeFetch,\n} from '@sentry/core';\nimport { addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type HttpStatusCodeRange = [number, number] | number;\nexport type HttpRequestTarget = string | RegExp;\n\nconst INTEGRATION_NAME = 'HttpClient';\n\ninterface HttpClientOptions {\n /**\n * HTTP status codes that should be considered failed.\n * This array can contain tuples of `[begin, end]` (both inclusive),\n * single status codes, or a combinations of both\n *\n * Example: [[500, 505], 507]\n * Default: [[500, 599]]\n */\n failedRequestStatusCodes: HttpStatusCodeRange[];\n\n /**\n * Targets to track for failed requests.\n * This array can contain strings or regular expressions.\n *\n * Example: ['http://localhost', /api\\/.*\\/]\n * Default: [/.*\\/]\n */\n failedRequestTargets: HttpRequestTarget[];\n}\n\nconst _httpClientIntegration = ((options: Partial<HttpClientOptions> = {}) => {\n const _options: HttpClientOptions = {\n failedRequestStatusCodes: [[500, 599]],\n failedRequestTargets: [/.*/],\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client): void {\n _wrapFetch(client, _options);\n _wrapXHR(client, _options);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Create events for failed client side HTTP requests.\n */\nexport const httpClientIntegration = defineIntegration(_httpClientIntegration);\n\n/**\n * Interceptor function for fetch requests\n *\n * @param requestInfo The Fetch API request info\n * @param response The Fetch API response\n * @param requestInit The request init object\n */\nfunction _fetchResponseHandler(\n options: HttpClientOptions,\n requestInfo: RequestInfo,\n response: Response,\n requestInit?: RequestInit,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, response.status, response.url)) {\n const request = _getRequest(requestInfo, requestInit);\n\n let requestHeaders, responseHeaders, requestCookies, responseCookies;\n\n if (_shouldSendDefaultPii()) {\n [requestHeaders, requestCookies] = _parseCookieHeaders('Cookie', request);\n [responseHeaders, responseCookies] = _parseCookieHeaders('Set-Cookie', response);\n }\n\n const event = _createEvent({\n url: request.url,\n method: request.method,\n status: response.status,\n requestHeaders,\n responseHeaders,\n requestCookies,\n responseCookies,\n error,\n type: 'fetch',\n });\n\n captureEvent(event);\n }\n}\n\nfunction _parseCookieHeaders(\n cookieHeader: string,\n obj: Request | Response,\n): [Record<string, string>, Record<string, string> | undefined] {\n const headers = _extractFetchHeaders(obj.headers);\n let cookies;\n\n try {\n const cookieString = headers[cookieHeader] || headers[cookieHeader.toLowerCase()] || undefined;\n\n if (cookieString) {\n cookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n return [headers, cookies];\n}\n\n/**\n * Interceptor function for XHR requests\n *\n * @param xhr The XHR request\n * @param method The HTTP method\n * @param headers The HTTP headers\n */\nfunction _xhrResponseHandler(\n options: HttpClientOptions,\n xhr: XMLHttpRequest,\n method: string,\n headers: Record<string, string>,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, xhr.status, xhr.responseURL)) {\n let requestHeaders, responseCookies, responseHeaders;\n\n if (_shouldSendDefaultPii()) {\n try {\n const cookieString = xhr.getResponseHeader('Set-Cookie') || xhr.getResponseHeader('set-cookie') || undefined;\n\n if (cookieString) {\n responseCookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n try {\n responseHeaders = _getXHRResponseHeaders(xhr);\n } catch {\n // ignore it if parsing fails\n }\n\n requestHeaders = headers;\n }\n\n const event = _createEvent({\n url: xhr.responseURL,\n method,\n status: xhr.status,\n requestHeaders,\n // Can't access request cookies from XHR\n responseHeaders,\n responseCookies,\n error,\n type: 'xhr',\n });\n\n captureEvent(event);\n }\n}\n\n/**\n * Extracts response size from `Content-Length` header when possible\n *\n * @param headers\n * @returns The response size in bytes or undefined\n */\nfunction _getResponseSizeFromHeaders(headers?: Record<string, string>): number | undefined {\n if (headers) {\n const contentLength = headers['Content-Length'] || headers['content-length'];\n\n if (contentLength) {\n return parseInt(contentLength, 10);\n }\n }\n\n return undefined;\n}\n\n/**\n * Creates an object containing cookies from the given cookie string\n *\n * @param cookieString The cookie string to parse\n * @returns The parsed cookies\n */\nfunction _parseCookieString(cookieString: string): Record<string, string> {\n return cookieString.split('; ').reduce((acc: Record<string, string>, cookie: string) => {\n const [key, value] = cookie.split('=');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Extracts the headers as an object from the given Fetch API request or response object\n *\n * @param headers The headers to extract\n * @returns The extracted headers as an object\n */\nfunction _extractFetchHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n}\n\n/**\n * Extracts the response headers as an object from the given XHR object\n *\n * @param xhr The XHR object to extract the response headers from\n * @returns The response headers as an object\n */\nfunction _getXHRResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n const [key, value] = line.split(': ');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Checks if the given target url is in the given list of targets\n *\n * @param target The target url to check\n * @returns true if the target url is in the given list of targets, false otherwise\n */\nfunction _isInGivenRequestTargets(\n failedRequestTargets: HttpClientOptions['failedRequestTargets'],\n target: string,\n): boolean {\n return failedRequestTargets.some((givenRequestTarget: HttpRequestTarget) => {\n if (typeof givenRequestTarget === 'string') {\n return target.includes(givenRequestTarget);\n }\n\n return givenRequestTarget.test(target);\n });\n}\n\n/**\n * Checks if the given status code is in the given range\n *\n * @param status The status code to check\n * @returns true if the status code is in the given range, false otherwise\n */\nfunction _isInGivenStatusRanges(\n failedRequestStatusCodes: HttpClientOptions['failedRequestStatusCodes'],\n status: number,\n): boolean {\n return failedRequestStatusCodes.some((range: HttpStatusCodeRange) => {\n if (typeof range === 'number') {\n return range === status;\n }\n\n return status >= range[0] && status <= range[1];\n });\n}\n\n/**\n * Wraps `fetch` function to capture request and response data\n */\nfunction _wrapFetch(client: Client, options: HttpClientOptions): void {\n if (!supportsNativeFetch()) {\n return;\n }\n\n addFetchInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { response, args, error, virtualError } = handlerData;\n const [requestInfo, requestInit] = args as [RequestInfo, RequestInit | undefined];\n\n if (!response) {\n return;\n }\n\n _fetchResponseHandler(options, requestInfo, response as Response, requestInit, error || virtualError);\n }, false);\n}\n\n/**\n * Wraps XMLHttpRequest to capture request and response data\n */\nfunction _wrapXHR(client: Client, options: HttpClientOptions): void {\n if (!('XMLHttpRequest' in GLOBAL_OBJ)) {\n return;\n }\n\n addXhrInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { error, virtualError } = handlerData;\n\n const xhr = handlerData.xhr as SentryWrappedXMLHttpRequest & XMLHttpRequest;\n\n const sentryXhrData = xhr[SENTRY_XHR_DATA_KEY];\n\n if (!sentryXhrData) {\n return;\n }\n\n const { method, request_headers: headers } = sentryXhrData;\n\n try {\n _xhrResponseHandler(options, xhr, method, headers, error || virtualError);\n } catch (e) {\n DEBUG_BUILD && debug.warn('Error while extracting response event form XHR response', e);\n }\n });\n}\n\n/**\n * Checks whether to capture given response as an event\n *\n * @param status response status code\n * @param url response url\n */\nfunction _shouldCaptureResponse(options: HttpClientOptions, status: number, url: string): boolean {\n return (\n _isInGivenStatusRanges(options.failedRequestStatusCodes, status) &&\n _isInGivenRequestTargets(options.failedRequestTargets, url) &&\n !isSentryRequestUrl(url, getClient())\n );\n}\n\n/**\n * Creates a synthetic Sentry event from given response data\n *\n * @param data response data\n * @returns event\n */\nfunction _createEvent(data: {\n url: string;\n method: string;\n status: number;\n type: 'fetch' | 'xhr';\n responseHeaders?: Record<string, string>;\n responseCookies?: Record<string, string>;\n requestHeaders?: Record<string, string>;\n requestCookies?: Record<string, string>;\n error?: unknown;\n}): SentryEvent {\n const client = getClient();\n const virtualStackTrace = client && data.error && data.error instanceof Error ? data.error.stack : undefined;\n // Remove the first frame from the stack as it's the HttpClient call\n const stack = virtualStackTrace && client ? client.getOptions().stackParser(virtualStackTrace, 0, 1) : undefined;\n const message = `HTTP Client Error with status code: ${data.status}`;\n\n const event: SentryEvent = {\n message,\n exception: {\n values: [\n {\n type: 'Error',\n value: message,\n stacktrace: stack ? { frames: stack } : undefined,\n },\n ],\n },\n request: {\n url: data.url,\n method: data.method,\n headers: data.requestHeaders,\n cookies: data.requestCookies,\n },\n contexts: {\n response: {\n status_code: data.status,\n headers: data.responseHeaders,\n cookies: data.responseCookies,\n body_size: _getResponseSizeFromHeaders(data.responseHeaders),\n },\n },\n };\n\n addExceptionMechanism(event, {\n type: `auto.http.client.${data.type}`,\n handled: false,\n });\n\n return event;\n}\n\nfunction _getRequest(requestInfo: RequestInfo, requestInit?: RequestInit): Request {\n if (!requestInit && requestInfo instanceof Request) {\n return requestInfo;\n }\n\n // If both are set, we try to construct a new Request with the given arguments\n // However, if e.g. the original request has a `body`, this will throw an error because it was already accessed\n // In this case, as a fallback, we just use the original request - using both is rather an edge case\n if (requestInfo instanceof Request && requestInfo.bodyUsed) {\n return requestInfo;\n }\n\n return new Request(requestInfo, requestInit);\n}\n\nfunction _shouldSendDefaultPii(): boolean {\n const client = getClient();\n return client ? Boolean(client.getOptions().sendDefaultPii) : false;\n}\n"],"names":["defineIntegration","captureEvent","supportsNativeFetch","addFetchInstrumentationHandler","getClient","GLOBAL_OBJ","addXhrInstrumentationHandler","SENTRY_XHR_DATA_KEY","DEBUG_BUILD","debug","isSentryRequestUrl","addExceptionMechanism"],"mappings":"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"}
@@ -109,6 +109,7 @@ function wrap(
109
109
  return event;
110
110
  });
111
111
 
112
+ // no need to add a mechanism here, we already add it via an event processor above
112
113
  captureException(ex);
113
114
  });
114
115
 
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.js","sources":["../../../src/helpers.ts"],"sourcesContent":["import type { Mechanism, WrappedFunction } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n captureException,\n getLocationHref,\n getOriginalFunction,\n GLOBAL_OBJ,\n markFunctionWrapped,\n withScope,\n} from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError++;\n setTimeout(() => {\n ignoreOnError--;\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n fn: T,\n options?: {\n mechanism?: Mechanism;\n },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n fn: NonFunction,\n options?: {\n mechanism?: Mechanism;\n },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n fn: T | NonFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n): NonFunction | WrappedFunction<T> {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n function isFunction(fn: T | NonFunction): fn is T {\n return typeof fn === 'function';\n }\n\n if (!isFunction(fn)) {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n if (wrapper) {\n if (typeof wrapper === 'function') {\n return wrapper;\n } else {\n // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n // that something messed with it. In that case we want to return the originally passed function.\n return fn;\n }\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n // Wrap the function itself\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n try {\n // Also wrap arguments that are themselves functions\n const wrappedArguments = args.map(arg => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope(scope => {\n scope.addEventProcessor(event => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n captureException(ex);\n });\n\n throw ex;\n }\n } as unknown as WrappedFunction<T>;\n\n // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property as keyof T] = fn[property as keyof T];\n }\n }\n } catch {\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n }\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n } catch {\n // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n // to save some bytes we simply try-catch this\n }\n\n return sentryWrapped;\n}\n\n/**\n * Get HTTP request data from the current page.\n */\nexport function getHttpRequestData(): { url: string; headers: Record<string, string> } {\n // grab as much info as exists and add it to the event\n const url = getLocationHref();\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = {\n url,\n headers,\n };\n\n return request;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"helpers.js","sources":["../../../src/helpers.ts"],"sourcesContent":["import type { Mechanism, WrappedFunction } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addExceptionTypeValue,\n addNonEnumerableProperty,\n captureException,\n getLocationHref,\n getOriginalFunction,\n GLOBAL_OBJ,\n markFunctionWrapped,\n withScope,\n} from '@sentry/core';\n\nexport const WINDOW = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n\nlet ignoreOnError: number = 0;\n\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError(): boolean {\n return ignoreOnError > 0;\n}\n\n/**\n * @hidden\n */\nexport function ignoreNextOnError(): void {\n // onerror should trigger before setTimeout\n ignoreOnError++;\n setTimeout(() => {\n ignoreOnError--;\n });\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\ntype WrappableFunction = Function;\n\nexport function wrap<T extends WrappableFunction>(\n fn: T,\n options?: {\n mechanism?: Mechanism;\n },\n): WrappedFunction<T>;\nexport function wrap<NonFunction>(\n fn: NonFunction,\n options?: {\n mechanism?: Mechanism;\n },\n): NonFunction;\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap. It is generally safe to pass an unbound function, because the returned wrapper always\n * has a correct `this` context.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap<T extends WrappableFunction, NonFunction>(\n fn: T | NonFunction,\n options: {\n mechanism?: Mechanism;\n } = {},\n): NonFunction | WrappedFunction<T> {\n // for future readers what this does is wrap a function and then create\n // a bi-directional wrapping between them.\n //\n // example: wrapped = wrap(original);\n // original.__sentry_wrapped__ -> wrapped\n // wrapped.__sentry_original__ -> original\n\n function isFunction(fn: T | NonFunction): fn is T {\n return typeof fn === 'function';\n }\n\n if (!isFunction(fn)) {\n return fn;\n }\n\n try {\n // if we're dealing with a function that was previously wrapped, return\n // the original wrapper.\n const wrapper = (fn as WrappedFunction<T>).__sentry_wrapped__;\n if (wrapper) {\n if (typeof wrapper === 'function') {\n return wrapper;\n } else {\n // If we find that the `__sentry_wrapped__` function is not a function at the time of accessing it, it means\n // that something messed with it. In that case we want to return the originally passed function.\n return fn;\n }\n }\n\n // We don't wanna wrap it twice\n if (getOriginalFunction(fn)) {\n return fn;\n }\n } catch {\n // Just accessing custom props in some Selenium environments\n // can cause a \"Permission denied\" exception (see raven-js#495).\n // Bail on wrapping and return the function as-is (defers to window.onerror).\n return fn;\n }\n\n // Wrap the function itself\n // It is important that `sentryWrapped` is not an arrow function to preserve the context of `this`\n const sentryWrapped = function (this: unknown, ...args: unknown[]): unknown {\n try {\n // Also wrap arguments that are themselves functions\n const wrappedArguments = args.map(arg => wrap(arg, options));\n\n // Attempt to invoke user-land function\n // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n // means the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n } catch (ex) {\n ignoreNextOnError();\n\n withScope(scope => {\n scope.addEventProcessor(event => {\n if (options.mechanism) {\n addExceptionTypeValue(event, undefined, undefined);\n addExceptionMechanism(event, options.mechanism);\n }\n\n event.extra = {\n ...event.extra,\n arguments: args,\n };\n\n return event;\n });\n\n // no need to add a mechanism here, we already add it via an event processor above\n captureException(ex);\n });\n\n throw ex;\n }\n } as unknown as WrappedFunction<T>;\n\n // Wrap the wrapped function in a proxy, to ensure any other properties of the original function remain available\n try {\n for (const property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property as keyof T] = fn[property as keyof T];\n }\n }\n } catch {\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n }\n\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n markFunctionWrapped(sentryWrapped, fn);\n\n addNonEnumerableProperty(fn, '__sentry_wrapped__', sentryWrapped);\n\n // Restore original function name (not all browsers allow that)\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name')!;\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get(): string {\n return fn.name;\n },\n });\n }\n } catch {\n // This may throw if e.g. the descriptor does not exist, or a browser does not allow redefining `name`.\n // to save some bytes we simply try-catch this\n }\n\n return sentryWrapped;\n}\n\n/**\n * Get HTTP request data from the current page.\n */\nexport function getHttpRequestData(): { url: string; headers: Record<string, string> } {\n // grab as much info as exists and add it to the event\n const url = getLocationHref();\n const { referrer } = WINDOW.document || {};\n const { userAgent } = WINDOW.navigator || {};\n\n const headers = {\n ...(referrer && { Referer: referrer }),\n ...(userAgent && { 'User-Agent': userAgent }),\n };\n const request = {\n url,\n headers,\n };\n\n return request;\n}\n"],"names":[],"mappings":"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"}
@@ -88,9 +88,8 @@ function _wrapTimeFunction(original) {
88
88
  const originalCallback = args[0];
89
89
  args[0] = wrap(originalCallback, {
90
90
  mechanism: {
91
- data: { function: getFunctionName(original) },
92
91
  handled: false,
93
- type: 'instrument',
92
+ type: `auto.browser.browserapierrors.${getFunctionName(original)}`,
94
93
  },
95
94
  });
96
95
  return original.apply(this, args);
@@ -103,11 +102,10 @@ function _wrapRAF(original) {
103
102
  wrap(callback, {
104
103
  mechanism: {
105
104
  data: {
106
- function: 'requestAnimationFrame',
107
105
  handler: getFunctionName(original),
108
106
  },
109
107
  handled: false,
110
- type: 'instrument',
108
+ type: 'auto.browser.browserapierrors.requestAnimationFrame',
111
109
  },
112
110
  }),
113
111
  ]);
@@ -126,11 +124,10 @@ function _wrapXHR(originalSend) {
126
124
  const wrapOptions = {
127
125
  mechanism: {
128
126
  data: {
129
- function: prop,
130
127
  handler: getFunctionName(original),
131
128
  },
132
129
  handled: false,
133
- type: 'instrument',
130
+ type: `auto.browser.browserapierrors.xhr.${prop}`,
134
131
  },
135
132
  };
136
133
 
@@ -174,12 +171,11 @@ function _wrapEventTarget(target, integrationOptions) {
174
171
  fn.handleEvent = wrap(fn.handleEvent, {
175
172
  mechanism: {
176
173
  data: {
177
- function: 'handleEvent',
178
174
  handler: getFunctionName(fn),
179
175
  target,
180
176
  },
181
177
  handled: false,
182
- type: 'instrument',
178
+ type: 'auto.browser.browserapierrors.handleEvent',
183
179
  },
184
180
  });
185
181
  }
@@ -196,12 +192,11 @@ function _wrapEventTarget(target, integrationOptions) {
196
192
  wrap(fn, {
197
193
  mechanism: {
198
194
  data: {
199
- function: 'addEventListener',
200
195
  handler: getFunctionName(fn),
201
196
  target,
202
197
  },
203
198
  handled: false,
204
- type: 'instrument',
199
+ type: 'auto.browser.browserapierrors.addEventListener',
205
200
  },
206
201
  }),
207
202
  options,
@@ -1 +1 @@
1
- {"version":3,"file":"browserapierrors.js","sources":["../../../../src/integrations/browserapierrors.ts"],"sourcesContent":["import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\nimport { WINDOW, wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'BroadcastChannel',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'SharedWorker',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n\n /**\n * If you experience issues with this integration causing double-invocations of event listeners,\n * try setting this option to `true`. It will unregister the original callbacks from the event targets\n * before adding the instrumented callback.\n *\n * @default false\n */\n unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n unregisterOriginalCallbacks: false,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(target => _wrapEventTarget(target, _options));\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: false,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'instrument',\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n if (integrationOptions.unregisterOriginalCallbacks) {\n unregisterOriginalCallback(this, eventName, fn);\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'instrument',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n if (\n target &&\n typeof target === 'object' &&\n 'removeEventListener' in target &&\n typeof target.removeEventListener === 'function'\n ) {\n target.removeEventListener(eventName, fn);\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"browserapierrors.js","sources":["../../../../src/integrations/browserapierrors.ts"],"sourcesContent":["import type { IntegrationFn, WrappedFunction } from '@sentry/core';\nimport { defineIntegration, fill, getFunctionName, getOriginalFunction } from '@sentry/core';\nimport { WINDOW, wrap } from '../helpers';\n\nconst DEFAULT_EVENT_TARGET = [\n 'EventTarget',\n 'Window',\n 'Node',\n 'ApplicationCache',\n 'AudioTrackList',\n 'BroadcastChannel',\n 'ChannelMergerNode',\n 'CryptoOperation',\n 'EventSource',\n 'FileReader',\n 'HTMLUnknownElement',\n 'IDBDatabase',\n 'IDBRequest',\n 'IDBTransaction',\n 'KeyOperation',\n 'MediaController',\n 'MessagePort',\n 'ModalWindow',\n 'Notification',\n 'SVGElementInstance',\n 'Screen',\n 'SharedWorker',\n 'TextTrack',\n 'TextTrackCue',\n 'TextTrackList',\n 'WebSocket',\n 'WebSocketWorker',\n 'Worker',\n 'XMLHttpRequest',\n 'XMLHttpRequestEventTarget',\n 'XMLHttpRequestUpload',\n];\n\nconst INTEGRATION_NAME = 'BrowserApiErrors';\n\ntype XMLHttpRequestProp = 'onload' | 'onerror' | 'onprogress' | 'onreadystatechange';\n\ninterface BrowserApiErrorsOptions {\n setTimeout: boolean;\n setInterval: boolean;\n requestAnimationFrame: boolean;\n XMLHttpRequest: boolean;\n eventTarget: boolean | string[];\n\n /**\n * If you experience issues with this integration causing double-invocations of event listeners,\n * try setting this option to `true`. It will unregister the original callbacks from the event targets\n * before adding the instrumented callback.\n *\n * @default false\n */\n unregisterOriginalCallbacks: boolean;\n}\n\nconst _browserApiErrorsIntegration = ((options: Partial<BrowserApiErrorsOptions> = {}) => {\n const _options = {\n XMLHttpRequest: true,\n eventTarget: true,\n requestAnimationFrame: true,\n setInterval: true,\n setTimeout: true,\n unregisterOriginalCallbacks: false,\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n // TODO: This currently only works for the first client this is setup\n // We may want to adjust this to check for client etc.\n setupOnce() {\n if (_options.setTimeout) {\n fill(WINDOW, 'setTimeout', _wrapTimeFunction);\n }\n\n if (_options.setInterval) {\n fill(WINDOW, 'setInterval', _wrapTimeFunction);\n }\n\n if (_options.requestAnimationFrame) {\n fill(WINDOW, 'requestAnimationFrame', _wrapRAF);\n }\n\n if (_options.XMLHttpRequest && 'XMLHttpRequest' in WINDOW) {\n fill(XMLHttpRequest.prototype, 'send', _wrapXHR);\n }\n\n const eventTargetOption = _options.eventTarget;\n if (eventTargetOption) {\n const eventTarget = Array.isArray(eventTargetOption) ? eventTargetOption : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(target => _wrapEventTarget(target, _options));\n }\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Wrap timer functions and event targets to catch errors and provide better meta data.\n */\nexport const browserApiErrorsIntegration = defineIntegration(_browserApiErrorsIntegration);\n\nfunction _wrapTimeFunction(original: () => void): () => number {\n return function (this: unknown, ...args: unknown[]): number {\n const originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n handled: false,\n type: `auto.browser.browserapierrors.${getFunctionName(original)}`,\n },\n });\n return original.apply(this, args);\n };\n}\n\nfunction _wrapRAF(original: () => void): (callback: () => void) => unknown {\n return function (this: unknown, callback: () => void): () => void {\n return original.apply(this, [\n wrap(callback, {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: 'auto.browser.browserapierrors.requestAnimationFrame',\n },\n }),\n ]);\n };\n}\n\nfunction _wrapXHR(originalSend: () => void): () => void {\n return function (this: XMLHttpRequest, ...args: unknown[]): void {\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n const xhr = this;\n const xmlHttpRequestProps: XMLHttpRequestProp[] = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\n xmlHttpRequestProps.forEach(prop => {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n const wrapOptions = {\n mechanism: {\n data: {\n handler: getFunctionName(original),\n },\n handled: false,\n type: `auto.browser.browserapierrors.xhr.${prop}`,\n },\n };\n\n // If Instrument integration has been called before BrowserApiErrors, get the name of original function\n const originalFunction = getOriginalFunction(original);\n if (originalFunction) {\n wrapOptions.mechanism.data.handler = getFunctionName(originalFunction);\n }\n\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n\n return originalSend.apply(this, args);\n };\n}\n\nfunction _wrapEventTarget(target: string, integrationOptions: BrowserApiErrorsOptions): void {\n const globalObject = WINDOW as unknown as Record<string, { prototype?: object }>;\n const proto = globalObject[target]?.prototype;\n\n // eslint-disable-next-line no-prototype-builtins\n if (!proto?.hasOwnProperty?.('addEventListener')) {\n return;\n }\n\n fill(proto, 'addEventListener', function (original: VoidFunction): (\n ...args: Parameters<typeof WINDOW.addEventListener>\n ) => ReturnType<typeof WINDOW.addEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n try {\n if (isEventListenerObject(fn)) {\n // ESlint disable explanation:\n // First, it is generally safe to call `wrap` with an unbound function. Furthermore, using `.bind()` would\n // introduce a bug here, because bind returns a new function that doesn't have our\n // flags(like __sentry_original__) attached. `wrap` checks for those flags to avoid unnecessary wrapping.\n // Without those flags, every call to addEventListener wraps the function again, causing a memory leak.\n // eslint-disable-next-line @typescript-eslint/unbound-method\n fn.handleEvent = wrap(fn.handleEvent, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.handleEvent',\n },\n });\n }\n } catch {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n\n if (integrationOptions.unregisterOriginalCallbacks) {\n unregisterOriginalCallback(this, eventName, fn);\n }\n\n return original.apply(this, [\n eventName,\n wrap(fn, {\n mechanism: {\n data: {\n handler: getFunctionName(fn),\n target,\n },\n handled: false,\n type: 'auto.browser.browserapierrors.addEventListener',\n },\n }),\n options,\n ]);\n };\n });\n\n fill(proto, 'removeEventListener', function (originalRemoveEventListener: VoidFunction): (\n this: unknown,\n ...args: Parameters<typeof WINDOW.removeEventListener>\n ) => ReturnType<typeof WINDOW.removeEventListener> {\n return function (this: unknown, eventName, fn, options): VoidFunction {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n const originalEventHandler = (fn as WrappedFunction).__sentry_wrapped__;\n if (originalEventHandler) {\n originalRemoveEventListener.call(this, eventName, originalEventHandler, options);\n }\n } catch {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return originalRemoveEventListener.call(this, eventName, fn, options);\n };\n });\n}\n\nfunction isEventListenerObject(obj: unknown): obj is EventListenerObject {\n return typeof (obj as EventListenerObject).handleEvent === 'function';\n}\n\nfunction unregisterOriginalCallback(target: unknown, eventName: string, fn: EventListenerOrEventListenerObject): void {\n if (\n target &&\n typeof target === 'object' &&\n 'removeEventListener' in target &&\n typeof target.removeEventListener === 'function'\n ) {\n target.removeEventListener(eventName, fn);\n }\n}\n"],"names":[],"mappings":"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"}
@@ -58,6 +58,7 @@ function _fetchResponseHandler(
58
58
  requestCookies,
59
59
  responseCookies,
60
60
  error,
61
+ type: 'fetch',
61
62
  });
62
63
 
63
64
  captureEvent(event);
@@ -130,6 +131,7 @@ function _xhrResponseHandler(
130
131
  responseHeaders,
131
132
  responseCookies,
132
133
  error,
134
+ type: 'xhr',
133
135
  });
134
136
 
135
137
  captureEvent(event);
@@ -360,7 +362,7 @@ function _createEvent(data
360
362
  };
361
363
 
362
364
  addExceptionMechanism(event, {
363
- type: 'http.client',
365
+ type: `auto.http.client.${data.type}`,
364
366
  handled: false,
365
367
  });
366
368
 
@@ -1 +1 @@
1
- {"version":3,"file":"httpclient.js","sources":["../../../../src/integrations/httpclient.ts"],"sourcesContent":["import type { Client, Event as SentryEvent, IntegrationFn, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addFetchInstrumentationHandler,\n captureEvent,\n debug,\n defineIntegration,\n getClient,\n GLOBAL_OBJ,\n isSentryRequestUrl,\n supportsNativeFetch,\n} from '@sentry/core';\nimport { addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type HttpStatusCodeRange = [number, number] | number;\nexport type HttpRequestTarget = string | RegExp;\n\nconst INTEGRATION_NAME = 'HttpClient';\n\ninterface HttpClientOptions {\n /**\n * HTTP status codes that should be considered failed.\n * This array can contain tuples of `[begin, end]` (both inclusive),\n * single status codes, or a combinations of both\n *\n * Example: [[500, 505], 507]\n * Default: [[500, 599]]\n */\n failedRequestStatusCodes: HttpStatusCodeRange[];\n\n /**\n * Targets to track for failed requests.\n * This array can contain strings or regular expressions.\n *\n * Example: ['http://localhost', /api\\/.*\\/]\n * Default: [/.*\\/]\n */\n failedRequestTargets: HttpRequestTarget[];\n}\n\nconst _httpClientIntegration = ((options: Partial<HttpClientOptions> = {}) => {\n const _options: HttpClientOptions = {\n failedRequestStatusCodes: [[500, 599]],\n failedRequestTargets: [/.*/],\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client): void {\n _wrapFetch(client, _options);\n _wrapXHR(client, _options);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Create events for failed client side HTTP requests.\n */\nexport const httpClientIntegration = defineIntegration(_httpClientIntegration);\n\n/**\n * Interceptor function for fetch requests\n *\n * @param requestInfo The Fetch API request info\n * @param response The Fetch API response\n * @param requestInit The request init object\n */\nfunction _fetchResponseHandler(\n options: HttpClientOptions,\n requestInfo: RequestInfo,\n response: Response,\n requestInit?: RequestInit,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, response.status, response.url)) {\n const request = _getRequest(requestInfo, requestInit);\n\n let requestHeaders, responseHeaders, requestCookies, responseCookies;\n\n if (_shouldSendDefaultPii()) {\n [requestHeaders, requestCookies] = _parseCookieHeaders('Cookie', request);\n [responseHeaders, responseCookies] = _parseCookieHeaders('Set-Cookie', response);\n }\n\n const event = _createEvent({\n url: request.url,\n method: request.method,\n status: response.status,\n requestHeaders,\n responseHeaders,\n requestCookies,\n responseCookies,\n error,\n });\n\n captureEvent(event);\n }\n}\n\nfunction _parseCookieHeaders(\n cookieHeader: string,\n obj: Request | Response,\n): [Record<string, string>, Record<string, string> | undefined] {\n const headers = _extractFetchHeaders(obj.headers);\n let cookies;\n\n try {\n const cookieString = headers[cookieHeader] || headers[cookieHeader.toLowerCase()] || undefined;\n\n if (cookieString) {\n cookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n return [headers, cookies];\n}\n\n/**\n * Interceptor function for XHR requests\n *\n * @param xhr The XHR request\n * @param method The HTTP method\n * @param headers The HTTP headers\n */\nfunction _xhrResponseHandler(\n options: HttpClientOptions,\n xhr: XMLHttpRequest,\n method: string,\n headers: Record<string, string>,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, xhr.status, xhr.responseURL)) {\n let requestHeaders, responseCookies, responseHeaders;\n\n if (_shouldSendDefaultPii()) {\n try {\n const cookieString = xhr.getResponseHeader('Set-Cookie') || xhr.getResponseHeader('set-cookie') || undefined;\n\n if (cookieString) {\n responseCookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n try {\n responseHeaders = _getXHRResponseHeaders(xhr);\n } catch {\n // ignore it if parsing fails\n }\n\n requestHeaders = headers;\n }\n\n const event = _createEvent({\n url: xhr.responseURL,\n method,\n status: xhr.status,\n requestHeaders,\n // Can't access request cookies from XHR\n responseHeaders,\n responseCookies,\n error,\n });\n\n captureEvent(event);\n }\n}\n\n/**\n * Extracts response size from `Content-Length` header when possible\n *\n * @param headers\n * @returns The response size in bytes or undefined\n */\nfunction _getResponseSizeFromHeaders(headers?: Record<string, string>): number | undefined {\n if (headers) {\n const contentLength = headers['Content-Length'] || headers['content-length'];\n\n if (contentLength) {\n return parseInt(contentLength, 10);\n }\n }\n\n return undefined;\n}\n\n/**\n * Creates an object containing cookies from the given cookie string\n *\n * @param cookieString The cookie string to parse\n * @returns The parsed cookies\n */\nfunction _parseCookieString(cookieString: string): Record<string, string> {\n return cookieString.split('; ').reduce((acc: Record<string, string>, cookie: string) => {\n const [key, value] = cookie.split('=');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Extracts the headers as an object from the given Fetch API request or response object\n *\n * @param headers The headers to extract\n * @returns The extracted headers as an object\n */\nfunction _extractFetchHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n}\n\n/**\n * Extracts the response headers as an object from the given XHR object\n *\n * @param xhr The XHR object to extract the response headers from\n * @returns The response headers as an object\n */\nfunction _getXHRResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n const [key, value] = line.split(': ');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Checks if the given target url is in the given list of targets\n *\n * @param target The target url to check\n * @returns true if the target url is in the given list of targets, false otherwise\n */\nfunction _isInGivenRequestTargets(\n failedRequestTargets: HttpClientOptions['failedRequestTargets'],\n target: string,\n): boolean {\n return failedRequestTargets.some((givenRequestTarget: HttpRequestTarget) => {\n if (typeof givenRequestTarget === 'string') {\n return target.includes(givenRequestTarget);\n }\n\n return givenRequestTarget.test(target);\n });\n}\n\n/**\n * Checks if the given status code is in the given range\n *\n * @param status The status code to check\n * @returns true if the status code is in the given range, false otherwise\n */\nfunction _isInGivenStatusRanges(\n failedRequestStatusCodes: HttpClientOptions['failedRequestStatusCodes'],\n status: number,\n): boolean {\n return failedRequestStatusCodes.some((range: HttpStatusCodeRange) => {\n if (typeof range === 'number') {\n return range === status;\n }\n\n return status >= range[0] && status <= range[1];\n });\n}\n\n/**\n * Wraps `fetch` function to capture request and response data\n */\nfunction _wrapFetch(client: Client, options: HttpClientOptions): void {\n if (!supportsNativeFetch()) {\n return;\n }\n\n addFetchInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { response, args, error, virtualError } = handlerData;\n const [requestInfo, requestInit] = args as [RequestInfo, RequestInit | undefined];\n\n if (!response) {\n return;\n }\n\n _fetchResponseHandler(options, requestInfo, response as Response, requestInit, error || virtualError);\n }, false);\n}\n\n/**\n * Wraps XMLHttpRequest to capture request and response data\n */\nfunction _wrapXHR(client: Client, options: HttpClientOptions): void {\n if (!('XMLHttpRequest' in GLOBAL_OBJ)) {\n return;\n }\n\n addXhrInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { error, virtualError } = handlerData;\n\n const xhr = handlerData.xhr as SentryWrappedXMLHttpRequest & XMLHttpRequest;\n\n const sentryXhrData = xhr[SENTRY_XHR_DATA_KEY];\n\n if (!sentryXhrData) {\n return;\n }\n\n const { method, request_headers: headers } = sentryXhrData;\n\n try {\n _xhrResponseHandler(options, xhr, method, headers, error || virtualError);\n } catch (e) {\n DEBUG_BUILD && debug.warn('Error while extracting response event form XHR response', e);\n }\n });\n}\n\n/**\n * Checks whether to capture given response as an event\n *\n * @param status response status code\n * @param url response url\n */\nfunction _shouldCaptureResponse(options: HttpClientOptions, status: number, url: string): boolean {\n return (\n _isInGivenStatusRanges(options.failedRequestStatusCodes, status) &&\n _isInGivenRequestTargets(options.failedRequestTargets, url) &&\n !isSentryRequestUrl(url, getClient())\n );\n}\n\n/**\n * Creates a synthetic Sentry event from given response data\n *\n * @param data response data\n * @returns event\n */\nfunction _createEvent(data: {\n url: string;\n method: string;\n status: number;\n responseHeaders?: Record<string, string>;\n responseCookies?: Record<string, string>;\n requestHeaders?: Record<string, string>;\n requestCookies?: Record<string, string>;\n error?: unknown;\n}): SentryEvent {\n const client = getClient();\n const virtualStackTrace = client && data.error && data.error instanceof Error ? data.error.stack : undefined;\n // Remove the first frame from the stack as it's the HttpClient call\n const stack = virtualStackTrace && client ? client.getOptions().stackParser(virtualStackTrace, 0, 1) : undefined;\n const message = `HTTP Client Error with status code: ${data.status}`;\n\n const event: SentryEvent = {\n message,\n exception: {\n values: [\n {\n type: 'Error',\n value: message,\n stacktrace: stack ? { frames: stack } : undefined,\n },\n ],\n },\n request: {\n url: data.url,\n method: data.method,\n headers: data.requestHeaders,\n cookies: data.requestCookies,\n },\n contexts: {\n response: {\n status_code: data.status,\n headers: data.responseHeaders,\n cookies: data.responseCookies,\n body_size: _getResponseSizeFromHeaders(data.responseHeaders),\n },\n },\n };\n\n addExceptionMechanism(event, {\n type: 'http.client',\n handled: false,\n });\n\n return event;\n}\n\nfunction _getRequest(requestInfo: RequestInfo, requestInit?: RequestInit): Request {\n if (!requestInit && requestInfo instanceof Request) {\n return requestInfo;\n }\n\n // If both are set, we try to construct a new Request with the given arguments\n // However, if e.g. the original request has a `body`, this will throw an error because it was already accessed\n // In this case, as a fallback, we just use the original request - using both is rather an edge case\n if (requestInfo instanceof Request && requestInfo.bodyUsed) {\n return requestInfo;\n }\n\n return new Request(requestInfo, requestInit);\n}\n\nfunction _shouldSendDefaultPii(): boolean {\n const client = getClient();\n return client ? Boolean(client.getOptions().sendDefaultPii) : false;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"httpclient.js","sources":["../../../../src/integrations/httpclient.ts"],"sourcesContent":["import type { Client, Event as SentryEvent, IntegrationFn, SentryWrappedXMLHttpRequest } from '@sentry/core';\nimport {\n addExceptionMechanism,\n addFetchInstrumentationHandler,\n captureEvent,\n debug,\n defineIntegration,\n getClient,\n GLOBAL_OBJ,\n isSentryRequestUrl,\n supportsNativeFetch,\n} from '@sentry/core';\nimport { addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY } from '@sentry-internal/browser-utils';\nimport { DEBUG_BUILD } from '../debug-build';\n\nexport type HttpStatusCodeRange = [number, number] | number;\nexport type HttpRequestTarget = string | RegExp;\n\nconst INTEGRATION_NAME = 'HttpClient';\n\ninterface HttpClientOptions {\n /**\n * HTTP status codes that should be considered failed.\n * This array can contain tuples of `[begin, end]` (both inclusive),\n * single status codes, or a combinations of both\n *\n * Example: [[500, 505], 507]\n * Default: [[500, 599]]\n */\n failedRequestStatusCodes: HttpStatusCodeRange[];\n\n /**\n * Targets to track for failed requests.\n * This array can contain strings or regular expressions.\n *\n * Example: ['http://localhost', /api\\/.*\\/]\n * Default: [/.*\\/]\n */\n failedRequestTargets: HttpRequestTarget[];\n}\n\nconst _httpClientIntegration = ((options: Partial<HttpClientOptions> = {}) => {\n const _options: HttpClientOptions = {\n failedRequestStatusCodes: [[500, 599]],\n failedRequestTargets: [/.*/],\n ...options,\n };\n\n return {\n name: INTEGRATION_NAME,\n setup(client): void {\n _wrapFetch(client, _options);\n _wrapXHR(client, _options);\n },\n };\n}) satisfies IntegrationFn;\n\n/**\n * Create events for failed client side HTTP requests.\n */\nexport const httpClientIntegration = defineIntegration(_httpClientIntegration);\n\n/**\n * Interceptor function for fetch requests\n *\n * @param requestInfo The Fetch API request info\n * @param response The Fetch API response\n * @param requestInit The request init object\n */\nfunction _fetchResponseHandler(\n options: HttpClientOptions,\n requestInfo: RequestInfo,\n response: Response,\n requestInit?: RequestInit,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, response.status, response.url)) {\n const request = _getRequest(requestInfo, requestInit);\n\n let requestHeaders, responseHeaders, requestCookies, responseCookies;\n\n if (_shouldSendDefaultPii()) {\n [requestHeaders, requestCookies] = _parseCookieHeaders('Cookie', request);\n [responseHeaders, responseCookies] = _parseCookieHeaders('Set-Cookie', response);\n }\n\n const event = _createEvent({\n url: request.url,\n method: request.method,\n status: response.status,\n requestHeaders,\n responseHeaders,\n requestCookies,\n responseCookies,\n error,\n type: 'fetch',\n });\n\n captureEvent(event);\n }\n}\n\nfunction _parseCookieHeaders(\n cookieHeader: string,\n obj: Request | Response,\n): [Record<string, string>, Record<string, string> | undefined] {\n const headers = _extractFetchHeaders(obj.headers);\n let cookies;\n\n try {\n const cookieString = headers[cookieHeader] || headers[cookieHeader.toLowerCase()] || undefined;\n\n if (cookieString) {\n cookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n return [headers, cookies];\n}\n\n/**\n * Interceptor function for XHR requests\n *\n * @param xhr The XHR request\n * @param method The HTTP method\n * @param headers The HTTP headers\n */\nfunction _xhrResponseHandler(\n options: HttpClientOptions,\n xhr: XMLHttpRequest,\n method: string,\n headers: Record<string, string>,\n error?: unknown,\n): void {\n if (_shouldCaptureResponse(options, xhr.status, xhr.responseURL)) {\n let requestHeaders, responseCookies, responseHeaders;\n\n if (_shouldSendDefaultPii()) {\n try {\n const cookieString = xhr.getResponseHeader('Set-Cookie') || xhr.getResponseHeader('set-cookie') || undefined;\n\n if (cookieString) {\n responseCookies = _parseCookieString(cookieString);\n }\n } catch {\n // ignore it if parsing fails\n }\n\n try {\n responseHeaders = _getXHRResponseHeaders(xhr);\n } catch {\n // ignore it if parsing fails\n }\n\n requestHeaders = headers;\n }\n\n const event = _createEvent({\n url: xhr.responseURL,\n method,\n status: xhr.status,\n requestHeaders,\n // Can't access request cookies from XHR\n responseHeaders,\n responseCookies,\n error,\n type: 'xhr',\n });\n\n captureEvent(event);\n }\n}\n\n/**\n * Extracts response size from `Content-Length` header when possible\n *\n * @param headers\n * @returns The response size in bytes or undefined\n */\nfunction _getResponseSizeFromHeaders(headers?: Record<string, string>): number | undefined {\n if (headers) {\n const contentLength = headers['Content-Length'] || headers['content-length'];\n\n if (contentLength) {\n return parseInt(contentLength, 10);\n }\n }\n\n return undefined;\n}\n\n/**\n * Creates an object containing cookies from the given cookie string\n *\n * @param cookieString The cookie string to parse\n * @returns The parsed cookies\n */\nfunction _parseCookieString(cookieString: string): Record<string, string> {\n return cookieString.split('; ').reduce((acc: Record<string, string>, cookie: string) => {\n const [key, value] = cookie.split('=');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Extracts the headers as an object from the given Fetch API request or response object\n *\n * @param headers The headers to extract\n * @returns The extracted headers as an object\n */\nfunction _extractFetchHeaders(headers: Headers): Record<string, string> {\n const result: Record<string, string> = {};\n\n headers.forEach((value, key) => {\n result[key] = value;\n });\n\n return result;\n}\n\n/**\n * Extracts the response headers as an object from the given XHR object\n *\n * @param xhr The XHR object to extract the response headers from\n * @returns The response headers as an object\n */\nfunction _getXHRResponseHeaders(xhr: XMLHttpRequest): Record<string, string> {\n const headers = xhr.getAllResponseHeaders();\n\n if (!headers) {\n return {};\n }\n\n return headers.split('\\r\\n').reduce((acc: Record<string, string>, line: string) => {\n const [key, value] = line.split(': ');\n if (key && value) {\n acc[key] = value;\n }\n return acc;\n }, {});\n}\n\n/**\n * Checks if the given target url is in the given list of targets\n *\n * @param target The target url to check\n * @returns true if the target url is in the given list of targets, false otherwise\n */\nfunction _isInGivenRequestTargets(\n failedRequestTargets: HttpClientOptions['failedRequestTargets'],\n target: string,\n): boolean {\n return failedRequestTargets.some((givenRequestTarget: HttpRequestTarget) => {\n if (typeof givenRequestTarget === 'string') {\n return target.includes(givenRequestTarget);\n }\n\n return givenRequestTarget.test(target);\n });\n}\n\n/**\n * Checks if the given status code is in the given range\n *\n * @param status The status code to check\n * @returns true if the status code is in the given range, false otherwise\n */\nfunction _isInGivenStatusRanges(\n failedRequestStatusCodes: HttpClientOptions['failedRequestStatusCodes'],\n status: number,\n): boolean {\n return failedRequestStatusCodes.some((range: HttpStatusCodeRange) => {\n if (typeof range === 'number') {\n return range === status;\n }\n\n return status >= range[0] && status <= range[1];\n });\n}\n\n/**\n * Wraps `fetch` function to capture request and response data\n */\nfunction _wrapFetch(client: Client, options: HttpClientOptions): void {\n if (!supportsNativeFetch()) {\n return;\n }\n\n addFetchInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { response, args, error, virtualError } = handlerData;\n const [requestInfo, requestInit] = args as [RequestInfo, RequestInit | undefined];\n\n if (!response) {\n return;\n }\n\n _fetchResponseHandler(options, requestInfo, response as Response, requestInit, error || virtualError);\n }, false);\n}\n\n/**\n * Wraps XMLHttpRequest to capture request and response data\n */\nfunction _wrapXHR(client: Client, options: HttpClientOptions): void {\n if (!('XMLHttpRequest' in GLOBAL_OBJ)) {\n return;\n }\n\n addXhrInstrumentationHandler(handlerData => {\n if (getClient() !== client) {\n return;\n }\n\n const { error, virtualError } = handlerData;\n\n const xhr = handlerData.xhr as SentryWrappedXMLHttpRequest & XMLHttpRequest;\n\n const sentryXhrData = xhr[SENTRY_XHR_DATA_KEY];\n\n if (!sentryXhrData) {\n return;\n }\n\n const { method, request_headers: headers } = sentryXhrData;\n\n try {\n _xhrResponseHandler(options, xhr, method, headers, error || virtualError);\n } catch (e) {\n DEBUG_BUILD && debug.warn('Error while extracting response event form XHR response', e);\n }\n });\n}\n\n/**\n * Checks whether to capture given response as an event\n *\n * @param status response status code\n * @param url response url\n */\nfunction _shouldCaptureResponse(options: HttpClientOptions, status: number, url: string): boolean {\n return (\n _isInGivenStatusRanges(options.failedRequestStatusCodes, status) &&\n _isInGivenRequestTargets(options.failedRequestTargets, url) &&\n !isSentryRequestUrl(url, getClient())\n );\n}\n\n/**\n * Creates a synthetic Sentry event from given response data\n *\n * @param data response data\n * @returns event\n */\nfunction _createEvent(data: {\n url: string;\n method: string;\n status: number;\n type: 'fetch' | 'xhr';\n responseHeaders?: Record<string, string>;\n responseCookies?: Record<string, string>;\n requestHeaders?: Record<string, string>;\n requestCookies?: Record<string, string>;\n error?: unknown;\n}): SentryEvent {\n const client = getClient();\n const virtualStackTrace = client && data.error && data.error instanceof Error ? data.error.stack : undefined;\n // Remove the first frame from the stack as it's the HttpClient call\n const stack = virtualStackTrace && client ? client.getOptions().stackParser(virtualStackTrace, 0, 1) : undefined;\n const message = `HTTP Client Error with status code: ${data.status}`;\n\n const event: SentryEvent = {\n message,\n exception: {\n values: [\n {\n type: 'Error',\n value: message,\n stacktrace: stack ? { frames: stack } : undefined,\n },\n ],\n },\n request: {\n url: data.url,\n method: data.method,\n headers: data.requestHeaders,\n cookies: data.requestCookies,\n },\n contexts: {\n response: {\n status_code: data.status,\n headers: data.responseHeaders,\n cookies: data.responseCookies,\n body_size: _getResponseSizeFromHeaders(data.responseHeaders),\n },\n },\n };\n\n addExceptionMechanism(event, {\n type: `auto.http.client.${data.type}`,\n handled: false,\n });\n\n return event;\n}\n\nfunction _getRequest(requestInfo: RequestInfo, requestInit?: RequestInit): Request {\n if (!requestInit && requestInfo instanceof Request) {\n return requestInfo;\n }\n\n // If both are set, we try to construct a new Request with the given arguments\n // However, if e.g. the original request has a `body`, this will throw an error because it was already accessed\n // In this case, as a fallback, we just use the original request - using both is rather an edge case\n if (requestInfo instanceof Request && requestInfo.bodyUsed) {\n return requestInfo;\n }\n\n return new Request(requestInfo, requestInit);\n}\n\nfunction _shouldSendDefaultPii(): boolean {\n const client = getClient();\n return client ? Boolean(client.getOptions().sendDefaultPii) : false;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"type":"module","version":"10.10.0","sideEffects":false}
1
+ {"type":"module","version":"10.11.0","sideEffects":false}
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAa/D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;2CAA2C,CAAC;AAI/D;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAGD,KAAK,iBAAiB,GAAG,QAAQ,CAAC;AAElC,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,EAAE,EAAE,CAAC,EACL,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACA,eAAe,CAAC,CAAC,CAAC,CAAC;AACtB,wBAAgB,IAAI,CAAC,WAAW,EAC9B,EAAE,EAAE,WAAW,EACf,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACA,WAAW,CAAC;AAkIf;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAgBrF"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAa/D,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;2CAA2C,CAAC;AAI/D;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,OAAO,CAE7C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAMxC;AAGD,KAAK,iBAAiB,GAAG,QAAQ,CAAC;AAElC,wBAAgB,IAAI,CAAC,CAAC,SAAS,iBAAiB,EAC9C,EAAE,EAAE,CAAC,EACL,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACA,eAAe,CAAC,CAAC,CAAC,CAAC;AACtB,wBAAgB,IAAI,CAAC,WAAW,EAC9B,EAAE,EAAE,WAAW,EACf,OAAO,CAAC,EAAE;IACR,SAAS,CAAC,EAAE,SAAS,CAAC;CACvB,GACA,WAAW,CAAC;AAmIf;;GAEG;AACH,wBAAgB,kBAAkB,IAAI;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,CAgBrF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sentry/browser",
3
- "version": "10.10.0",
3
+ "version": "10.11.0",
4
4
  "description": "Official Sentry SDK for browsers",
5
5
  "repository": "git://github.com/getsentry/sentry-javascript.git",
6
6
  "homepage": "https://github.com/getsentry/sentry-javascript/tree/master/packages/browser",
@@ -39,14 +39,14 @@
39
39
  "access": "public"
40
40
  },
41
41
  "dependencies": {
42
- "@sentry-internal/browser-utils": "10.10.0",
43
- "@sentry-internal/feedback": "10.10.0",
44
- "@sentry-internal/replay": "10.10.0",
45
- "@sentry-internal/replay-canvas": "10.10.0",
46
- "@sentry/core": "10.10.0"
42
+ "@sentry-internal/browser-utils": "10.11.0",
43
+ "@sentry-internal/feedback": "10.11.0",
44
+ "@sentry-internal/replay": "10.11.0",
45
+ "@sentry-internal/replay-canvas": "10.11.0",
46
+ "@sentry/core": "10.11.0"
47
47
  },
48
48
  "devDependencies": {
49
- "@sentry-internal/integration-shims": "10.10.0",
49
+ "@sentry-internal/integration-shims": "10.11.0",
50
50
  "fake-indexeddb": "^4.0.1"
51
51
  },
52
52
  "scripts": {