{"version":3,"file":"@sentry-internal-b1355029.js","sources":["../../node_modules/@sentry-internal/tracing/esm/common/debug-build.js","../../node_modules/@sentry-internal/tracing/esm/browser/types.js","../../node_modules/@sentry-internal/tracing/esm/browser/backgroundtab.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/bindReporter.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/generateUniqueID.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/getNavigationEntry.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/getActivationStart.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/initMetric.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/observe.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/onHidden.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getCLS.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/lib/getVisibilityWatcher.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getFID.js","../../node_modules/@sentry-internal/tracing/esm/browser/web-vitals/getLCP.js","../../node_modules/@sentry-internal/tracing/esm/browser/instrument.js","../../node_modules/@sentry-internal/tracing/esm/browser/metrics/utils.js","../../node_modules/@sentry-internal/tracing/esm/browser/metrics/index.js","../../node_modules/@sentry-internal/tracing/esm/common/fetch.js","../../node_modules/@sentry-internal/tracing/esm/browser/request.js","../../node_modules/@sentry-internal/tracing/esm/browser/router.js","../../node_modules/@sentry-internal/tracing/esm/browser/browsertracing.js"],"sourcesContent":["/**\n * This serves as a build time flag that will be true by default, but false in non-debug builds or if users replace `__SENTRY_DEBUG__` in their generated code.\n *\n * ATTENTION: This constant must never cross package boundaries (i.e. be exported) to guarantee that it can be used for tree shaking.\n */\nconst DEBUG_BUILD = (typeof __SENTRY_DEBUG__ === 'undefined' || __SENTRY_DEBUG__);\n\nexport { DEBUG_BUILD };\n//# sourceMappingURL=debug-build.js.map\n","import { GLOBAL_OBJ } from '@sentry/utils';\n\nconst WINDOW = GLOBAL_OBJ ;\n\nexport { WINDOW };\n//# sourceMappingURL=types.js.map\n","import { getActiveTransaction } from '@sentry/core';\nimport { logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../common/debug-build.js';\nimport { WINDOW } from './types.js';\n\n/**\n * Add a listener that cancels and finishes a transaction when the global\n * document is hidden.\n */\nfunction registerBackgroundTabDetection() {\n if (WINDOW && WINDOW.document) {\n WINDOW.document.addEventListener('visibilitychange', () => {\n const activeTransaction = getActiveTransaction() ;\n if (WINDOW.document.hidden && activeTransaction) {\n const statusType = 'cancelled';\n\n DEBUG_BUILD &&\n logger.log(\n `[Tracing] Transaction: ${statusType} -> since tab moved to the background, op: ${activeTransaction.op}`,\n );\n // We should not set status if it is already set, this prevent important statuses like\n // error or data loss from being overwritten on transaction.\n if (!activeTransaction.status) {\n activeTransaction.setStatus(statusType);\n }\n activeTransaction.setTag('visibilitychange', 'document.hidden');\n activeTransaction.end();\n }\n });\n } else {\n DEBUG_BUILD && logger.warn('[Tracing] Could not set up background tab detection due to lack of global document');\n }\n}\n\nexport { registerBackgroundTabDetection };\n//# sourceMappingURL=backgroundtab.js.map\n","const bindReporter = (\n callback,\n metric,\n reportAllChanges,\n) => {\n let prevValue;\n let delta;\n return (forceReport) => {\n if (metric.value >= 0) {\n if (forceReport || reportAllChanges) {\n delta = metric.value - (prevValue || 0);\n\n // Report the metric if there's a non-zero delta or if no previous\n // value exists (which can happen in the case of the document becoming\n // hidden when the metric value is 0).\n // See: https://github.com/GoogleChrome/web-vitals/issues/14\n if (delta || prevValue === undefined) {\n prevValue = metric.value;\n metric.delta = delta;\n callback(metric);\n }\n }\n }\n };\n};\n\nexport { bindReporter };\n//# sourceMappingURL=bindReporter.js.map\n","/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Performantly generate a unique, 30-char string by combining a version\n * number, the current timestamp with a 13-digit number integer.\n * @return {string}\n */\nconst generateUniqueID = () => {\n return `v3-${Date.now()}-${Math.floor(Math.random() * (9e12 - 1)) + 1e12}`;\n};\n\nexport { generateUniqueID };\n//# sourceMappingURL=generateUniqueID.js.map\n","import { WINDOW } from '../../types.js';\n\n/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst getNavigationEntryFromPerformanceTiming = () => {\n // eslint-disable-next-line deprecation/deprecation\n const timing = WINDOW.performance.timing;\n // eslint-disable-next-line deprecation/deprecation\n const type = WINDOW.performance.navigation.type;\n\n const navigationEntry = {\n entryType: 'navigation',\n startTime: 0,\n type: type == 2 ? 'back_forward' : type === 1 ? 'reload' : 'navigate',\n };\n\n for (const key in timing) {\n if (key !== 'navigationStart' && key !== 'toJSON') {\n // eslint-disable-next-line deprecation/deprecation\n navigationEntry[key] = Math.max((timing[key ] ) - timing.navigationStart, 0);\n }\n }\n return navigationEntry ;\n};\n\nconst getNavigationEntry = () => {\n if (WINDOW.__WEB_VITALS_POLYFILL__) {\n return (\n WINDOW.performance &&\n ((performance.getEntriesByType && performance.getEntriesByType('navigation')[0]) ||\n getNavigationEntryFromPerformanceTiming())\n );\n } else {\n return WINDOW.performance && performance.getEntriesByType && performance.getEntriesByType('navigation')[0];\n }\n};\n\nexport { getNavigationEntry };\n//# sourceMappingURL=getNavigationEntry.js.map\n","import { getNavigationEntry } from './getNavigationEntry.js';\n\n/*\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst getActivationStart = () => {\n const navEntry = getNavigationEntry();\n return (navEntry && navEntry.activationStart) || 0;\n};\n\nexport { getActivationStart };\n//# sourceMappingURL=getActivationStart.js.map\n","import { WINDOW } from '../../types.js';\nimport { generateUniqueID } from './generateUniqueID.js';\nimport { getActivationStart } from './getActivationStart.js';\nimport { getNavigationEntry } from './getNavigationEntry.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst initMetric = (name, value) => {\n const navEntry = getNavigationEntry();\n let navigationType = 'navigate';\n\n if (navEntry) {\n if (WINDOW.document.prerendering || getActivationStart() > 0) {\n navigationType = 'prerender';\n } else {\n navigationType = navEntry.type.replace(/_/g, '-') ;\n }\n }\n\n return {\n name,\n value: typeof value === 'undefined' ? -1 : value,\n rating: 'good', // Will be updated if the value changes.\n delta: 0,\n entries: [],\n id: generateUniqueID(),\n navigationType,\n };\n};\n\nexport { initMetric };\n//# sourceMappingURL=initMetric.js.map\n","/**\n * Takes a performance entry type and a callback function, and creates a\n * `PerformanceObserver` instance that will observe the specified entry type\n * with buffering enabled and call the callback _for each entry_.\n *\n * This function also feature-detects entry support and wraps the logic in a\n * try/catch to avoid errors in unsupporting browsers.\n */\nconst observe = (\n type,\n callback,\n opts,\n) => {\n try {\n if (PerformanceObserver.supportedEntryTypes.includes(type)) {\n const po = new PerformanceObserver(list => {\n callback(list.getEntries() );\n });\n po.observe(\n Object.assign(\n {\n type,\n buffered: true,\n },\n opts || {},\n ) ,\n );\n return po;\n }\n } catch (e) {\n // Do nothing.\n }\n return;\n};\n\nexport { observe };\n//# sourceMappingURL=observe.js.map\n","import { WINDOW } from '../../types.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst onHidden = (cb, once) => {\n const onHiddenOrPageHide = (event) => {\n if (event.type === 'pagehide' || WINDOW.document.visibilityState === 'hidden') {\n cb(event);\n if (once) {\n removeEventListener('visibilitychange', onHiddenOrPageHide, true);\n removeEventListener('pagehide', onHiddenOrPageHide, true);\n }\n }\n };\n addEventListener('visibilitychange', onHiddenOrPageHide, true);\n // Some browsers have buggy implementations of visibilitychange,\n // so we use pagehide in addition, just to be safe.\n addEventListener('pagehide', onHiddenOrPageHide, true);\n};\n\nexport { onHidden };\n//# sourceMappingURL=onHidden.js.map\n","import { bindReporter } from './lib/bindReporter.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Calculates the [CLS](https://web.dev/cls/) value for the current page and\n * calls the `callback` function once the value is ready to be reported, along\n * with all `layout-shift` performance entries that were used in the metric\n * value calculation. The reported value is a `double` (corresponding to a\n * [layout shift score](https://web.dev/cls/#layout-shift-score)).\n *\n * If the `reportAllChanges` configuration option is set to `true`, the\n * `callback` function will be called as soon as the value is initially\n * determined as well as any time the value changes throughout the page\n * lifespan.\n *\n * _**Important:** CLS should be continually monitored for changes throughout\n * the entire lifespan of a page—including if the user returns to the page after\n * it's been hidden/backgrounded. However, since browsers often [will not fire\n * additional callbacks once the user has backgrounded a\n * page](https://developer.chrome.com/blog/page-lifecycle-api/#advice-hidden),\n * `callback` is always called when the page's visibility state changes to\n * hidden. As a result, the `callback` function might be called multiple times\n * during the same page load._\n */\nconst onCLS = (onReport) => {\n const metric = initMetric('CLS', 0);\n let report;\n\n let sessionValue = 0;\n let sessionEntries = [];\n\n // const handleEntries = (entries: Metric['entries']) => {\n const handleEntries = (entries) => {\n entries.forEach(entry => {\n // Only count layout shifts without recent user input.\n if (!entry.hadRecentInput) {\n const firstSessionEntry = sessionEntries[0];\n const lastSessionEntry = sessionEntries[sessionEntries.length - 1];\n\n // If the entry occurred less than 1 second after the previous entry and\n // less than 5 seconds after the first entry in the session, include the\n // entry in the current session. Otherwise, start a new session.\n if (\n sessionValue &&\n sessionEntries.length !== 0 &&\n entry.startTime - lastSessionEntry.startTime < 1000 &&\n entry.startTime - firstSessionEntry.startTime < 5000\n ) {\n sessionValue += entry.value;\n sessionEntries.push(entry);\n } else {\n sessionValue = entry.value;\n sessionEntries = [entry];\n }\n\n // If the current session value is larger than the current CLS value,\n // update CLS and the entries contributing to it.\n if (sessionValue > metric.value) {\n metric.value = sessionValue;\n metric.entries = sessionEntries;\n if (report) {\n report();\n }\n }\n }\n });\n };\n\n const po = observe('layout-shift', handleEntries);\n if (po) {\n report = bindReporter(onReport, metric);\n\n const stopListening = () => {\n handleEntries(po.takeRecords() );\n report(true);\n };\n\n onHidden(stopListening);\n\n return stopListening;\n }\n\n return;\n};\n\nexport { onCLS };\n//# sourceMappingURL=getCLS.js.map\n","import { WINDOW } from '../../types.js';\nimport { onHidden } from './onHidden.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nlet firstHiddenTime = -1;\n\nconst initHiddenTime = () => {\n // If the document is hidden and not prerendering, assume it was always\n // hidden and the page was loaded in the background.\n return WINDOW.document.visibilityState === 'hidden' && !WINDOW.document.prerendering ? 0 : Infinity;\n};\n\nconst trackChanges = () => {\n // Update the time if/when the document becomes hidden.\n onHidden(({ timeStamp }) => {\n firstHiddenTime = timeStamp;\n }, true);\n};\n\nconst getVisibilityWatcher = (\n\n) => {\n if (firstHiddenTime < 0) {\n // If the document is hidden when this code runs, assume it was hidden\n // since navigation start. This isn't a perfect heuristic, but it's the\n // best we can do until an API is available to support querying past\n // visibilityState.\n firstHiddenTime = initHiddenTime();\n trackChanges();\n }\n return {\n get firstHiddenTime() {\n return firstHiddenTime;\n },\n };\n};\n\nexport { getVisibilityWatcher };\n//# sourceMappingURL=getVisibilityWatcher.js.map\n","import { bindReporter } from './lib/bindReporter.js';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Calculates the [FID](https://web.dev/fid/) value for the current page and\n * calls the `callback` function once the value is ready, along with the\n * relevant `first-input` performance entry used to determine the value. The\n * reported value is a `DOMHighResTimeStamp`.\n *\n * _**Important:** since FID is only reported after the user interacts with the\n * page, it's possible that it will not be reported for some page loads._\n */\nconst onFID = (onReport) => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('FID');\n // eslint-disable-next-line prefer-const\n let report;\n\n const handleEntry = (entry) => {\n // Only report if the page wasn't hidden prior to the first input.\n if (entry.startTime < visibilityWatcher.firstHiddenTime) {\n metric.value = entry.processingStart - entry.startTime;\n metric.entries.push(entry);\n report(true);\n }\n };\n\n const handleEntries = (entries) => {\n (entries ).forEach(handleEntry);\n };\n\n const po = observe('first-input', handleEntries);\n report = bindReporter(onReport, metric);\n\n if (po) {\n onHidden(() => {\n handleEntries(po.takeRecords() );\n po.disconnect();\n }, true);\n }\n};\n\nexport { onFID };\n//# sourceMappingURL=getFID.js.map\n","import { bindReporter } from './lib/bindReporter.js';\nimport { getActivationStart } from './lib/getActivationStart.js';\nimport { getVisibilityWatcher } from './lib/getVisibilityWatcher.js';\nimport { initMetric } from './lib/initMetric.js';\nimport { observe } from './lib/observe.js';\nimport { onHidden } from './lib/onHidden.js';\n\n/*\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nconst reportedMetricIDs = {};\n\n/**\n * Calculates the [LCP](https://web.dev/lcp/) value for the current page and\n * calls the `callback` function once the value is ready (along with the\n * relevant `largest-contentful-paint` performance entry used to determine the\n * value). The reported value is a `DOMHighResTimeStamp`.\n */\nconst onLCP = (onReport) => {\n const visibilityWatcher = getVisibilityWatcher();\n const metric = initMetric('LCP');\n let report;\n\n const handleEntries = (entries) => {\n const lastEntry = entries[entries.length - 1] ;\n if (lastEntry) {\n // The startTime attribute returns the value of the renderTime if it is\n // not 0, and the value of the loadTime otherwise. The activationStart\n // reference is used because LCP should be relative to page activation\n // rather than navigation start if the page was prerendered.\n const value = Math.max(lastEntry.startTime - getActivationStart(), 0);\n\n // Only report if the page wasn't hidden prior to LCP.\n if (value < visibilityWatcher.firstHiddenTime) {\n metric.value = value;\n metric.entries = [lastEntry];\n report();\n }\n }\n };\n\n const po = observe('largest-contentful-paint', handleEntries);\n\n if (po) {\n report = bindReporter(onReport, metric);\n\n const stopListening = () => {\n if (!reportedMetricIDs[metric.id]) {\n handleEntries(po.takeRecords() );\n po.disconnect();\n reportedMetricIDs[metric.id] = true;\n report(true);\n }\n };\n\n // Stop listening after input. Note: while scrolling is an input that\n // stop LCP observation, it's unreliable since it can be programmatically\n // generated. See: https://github.com/GoogleChrome/web-vitals/issues/75\n ['keydown', 'click'].forEach(type => {\n addEventListener(type, stopListening, { once: true, capture: true });\n });\n\n onHidden(stopListening, true);\n\n return stopListening;\n }\n\n return;\n};\n\nexport { onLCP };\n//# sourceMappingURL=getLCP.js.map\n","import { logger, getFunctionName } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../common/debug-build.js';\nimport { onCLS } from './web-vitals/getCLS.js';\nimport { onFID } from './web-vitals/getFID.js';\nimport { onLCP } from './web-vitals/getLCP.js';\nimport { observe } from './web-vitals/lib/observe.js';\n\nconst handlers = {};\nconst instrumented = {};\n\nlet _previousCls;\nlet _previousFid;\nlet _previousLcp;\n\n/**\n * Add a callback that will be triggered when a CLS metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addClsInstrumentationHandler(callback) {\n return addMetricObserver('cls', callback, instrumentCls, _previousCls);\n}\n\n/**\n * Add a callback that will be triggered when a LCP metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addLcpInstrumentationHandler(callback) {\n return addMetricObserver('lcp', callback, instrumentLcp, _previousLcp);\n}\n\n/**\n * Add a callback that will be triggered when a FID metric is available.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addFidInstrumentationHandler(callback) {\n return addMetricObserver('fid', callback, instrumentFid, _previousFid);\n}\n\n/**\n * Add a callback that will be triggered when a performance observer is triggered,\n * and receives the entries of the observer.\n * Returns a cleanup callback which can be called to remove the instrumentation handler.\n */\nfunction addPerformanceInstrumentationHandler(\n type,\n callback,\n) {\n addHandler(type, callback);\n\n if (!instrumented[type]) {\n instrumentPerformanceObserver(type);\n instrumented[type] = true;\n }\n\n return getCleanupCallback(type, callback);\n}\n\n/** Trigger all handlers of a given type. */\nfunction triggerHandlers(type, data) {\n const typeHandlers = handlers[type];\n\n if (!typeHandlers || !typeHandlers.length) {\n return;\n }\n\n for (const handler of typeHandlers) {\n try {\n handler(data);\n } catch (e) {\n DEBUG_BUILD &&\n logger.error(\n `Error while triggering instrumentation handler.\\nType: ${type}\\nName: ${getFunctionName(handler)}\\nError:`,\n e,\n );\n }\n }\n}\n\nfunction instrumentCls() {\n onCLS(metric => {\n triggerHandlers('cls', {\n metric,\n });\n _previousCls = metric;\n });\n}\n\nfunction instrumentFid() {\n onFID(metric => {\n triggerHandlers('fid', {\n metric,\n });\n _previousFid = metric;\n });\n}\n\nfunction instrumentLcp() {\n onLCP(metric => {\n triggerHandlers('lcp', {\n metric,\n });\n _previousLcp = metric;\n });\n}\n\nfunction addMetricObserver(\n type,\n callback,\n instrumentFn,\n previousValue,\n) {\n addHandler(type, callback);\n\n if (!instrumented[type]) {\n instrumentFn();\n instrumented[type] = true;\n }\n\n if (previousValue) {\n callback({ metric: previousValue });\n }\n\n return getCleanupCallback(type, callback);\n}\n\nfunction instrumentPerformanceObserver(type) {\n const options = {};\n\n // Special per-type options we want to use\n if (type === 'event') {\n options.durationThreshold = 0;\n }\n\n observe(\n type,\n entries => {\n triggerHandlers(type, { entries });\n },\n options,\n );\n}\n\nfunction addHandler(type, handler) {\n handlers[type] = handlers[type] || [];\n (handlers[type] ).push(handler);\n}\n\n// Get a callback which can be called to remove the instrumentation handler\nfunction getCleanupCallback(type, callback) {\n return () => {\n const typeHandlers = handlers[type];\n\n if (!typeHandlers) {\n return;\n }\n\n const index = typeHandlers.indexOf(callback);\n if (index !== -1) {\n typeHandlers.splice(index, 1);\n }\n };\n}\n\nexport { addClsInstrumentationHandler, addFidInstrumentationHandler, addLcpInstrumentationHandler, addPerformanceInstrumentationHandler };\n//# sourceMappingURL=instrument.js.map\n","/**\n * Checks if a given value is a valid measurement value.\n */\nfunction isMeasurementValue(value) {\n return typeof value === 'number' && isFinite(value);\n}\n\n/**\n * Helper function to start child on transactions. This function will make sure that the transaction will\n * use the start timestamp of the created child span if it is earlier than the transactions actual\n * start timestamp.\n */\nfunction _startChild(transaction, { startTimestamp, ...ctx }) {\n if (startTimestamp && transaction.startTimestamp > startTimestamp) {\n transaction.startTimestamp = startTimestamp;\n }\n\n return transaction.startChild({\n startTimestamp,\n ...ctx,\n });\n}\n\nexport { _startChild, isMeasurementValue };\n//# sourceMappingURL=utils.js.map\n","import { getActiveTransaction } from '@sentry/core';\nimport { browserPerformanceTimeOrigin, htmlTreeAsString, getComponentName, logger } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../../common/debug-build.js';\nimport { addPerformanceInstrumentationHandler, addClsInstrumentationHandler, addLcpInstrumentationHandler, addFidInstrumentationHandler } from '../instrument.js';\nimport { WINDOW } from '../types.js';\nimport { getVisibilityWatcher } from '../web-vitals/lib/getVisibilityWatcher.js';\nimport { _startChild, isMeasurementValue } from './utils.js';\n\nconst MAX_INT_AS_BYTES = 2147483647;\n\n/**\n * Converts from milliseconds to seconds\n * @param time time in ms\n */\nfunction msToSec(time) {\n return time / 1000;\n}\n\nfunction getBrowserPerformanceAPI() {\n // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n return WINDOW && WINDOW.addEventListener && WINDOW.performance;\n}\n\nlet _performanceCursor = 0;\n\nlet _measurements = {};\nlet _lcpEntry;\nlet _clsEntry;\n\n/**\n * Start tracking web vitals\n *\n * @returns A function that forces web vitals collection\n */\nfunction startTrackingWebVitals() {\n const performance = getBrowserPerformanceAPI();\n if (performance && browserPerformanceTimeOrigin) {\n // @ts-expect-error we want to make sure all of these are available, even if TS is sure they are\n if (performance.mark) {\n WINDOW.performance.mark('sentry-tracing-init');\n }\n const fidCallback = _trackFID();\n const clsCallback = _trackCLS();\n const lcpCallback = _trackLCP();\n\n return () => {\n fidCallback();\n clsCallback();\n lcpCallback();\n };\n }\n\n return () => undefined;\n}\n\n/**\n * Start tracking long tasks.\n */\nfunction startTrackingLongTasks() {\n addPerformanceInstrumentationHandler('longtask', ({ entries }) => {\n for (const entry of entries) {\n const transaction = getActiveTransaction() ;\n if (!transaction) {\n return;\n }\n const startTime = msToSec((browserPerformanceTimeOrigin ) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n transaction.startChild({\n description: 'Main UI thread blocked',\n op: 'ui.long-task',\n origin: 'auto.ui.browser.metrics',\n startTimestamp: startTime,\n endTimestamp: startTime + duration,\n });\n }\n });\n}\n\n/**\n * Start tracking interaction events.\n */\nfunction startTrackingInteractions() {\n addPerformanceInstrumentationHandler('event', ({ entries }) => {\n for (const entry of entries) {\n const transaction = getActiveTransaction() ;\n if (!transaction) {\n return;\n }\n\n if (entry.name === 'click') {\n const startTime = msToSec((browserPerformanceTimeOrigin ) + entry.startTime);\n const duration = msToSec(entry.duration);\n\n const span = {\n description: htmlTreeAsString(entry.target),\n op: `ui.interaction.${entry.name}`,\n origin: 'auto.ui.browser.metrics',\n startTimestamp: startTime,\n endTimestamp: startTime + duration,\n };\n\n const componentName = getComponentName(entry.target);\n if (componentName) {\n span.data = { 'ui.component_name': componentName };\n }\n\n transaction.startChild(span);\n }\n }\n });\n}\n\n/** Starts tracking the Cumulative Layout Shift on the current page. */\nfunction _trackCLS() {\n return addClsInstrumentationHandler(({ metric }) => {\n const entry = metric.entries.pop();\n if (!entry) {\n return;\n }\n\n DEBUG_BUILD && logger.log('[Measurements] Adding CLS');\n _measurements['cls'] = { value: metric.value, unit: '' };\n _clsEntry = entry ;\n });\n}\n\n/** Starts tracking the Largest Contentful Paint on the current page. */\nfunction _trackLCP() {\n return addLcpInstrumentationHandler(({ metric }) => {\n const entry = metric.entries.pop();\n if (!entry) {\n return;\n }\n\n DEBUG_BUILD && logger.log('[Measurements] Adding LCP');\n _measurements['lcp'] = { value: metric.value, unit: 'millisecond' };\n _lcpEntry = entry ;\n });\n}\n\n/** Starts tracking the First Input Delay on the current page. */\nfunction _trackFID() {\n return addFidInstrumentationHandler(({ metric }) => {\n const entry = metric.entries.pop();\n if (!entry) {\n return;\n }\n\n const timeOrigin = msToSec(browserPerformanceTimeOrigin );\n const startTime = msToSec(entry.startTime);\n DEBUG_BUILD && logger.log('[Measurements] Adding FID');\n _measurements['fid'] = { value: metric.value, unit: 'millisecond' };\n _measurements['mark.fid'] = { value: timeOrigin + startTime, unit: 'second' };\n });\n}\n\n/** Add performance related spans to a transaction */\nfunction addPerformanceEntries(transaction) {\n const performance = getBrowserPerformanceAPI();\n if (!performance || !WINDOW.performance.getEntries || !browserPerformanceTimeOrigin) {\n // Gatekeeper if performance API not available\n return;\n }\n\n DEBUG_BUILD && logger.log('[Tracing] Adding & adjusting spans using Performance API');\n const timeOrigin = msToSec(browserPerformanceTimeOrigin);\n\n const performanceEntries = performance.getEntries();\n\n let responseStartTimestamp;\n let requestStartTimestamp;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n performanceEntries.slice(_performanceCursor).forEach((entry) => {\n const startTime = msToSec(entry.startTime);\n const duration = msToSec(entry.duration);\n\n if (transaction.op === 'navigation' && timeOrigin + startTime < transaction.startTimestamp) {\n return;\n }\n\n switch (entry.entryType) {\n case 'navigation': {\n _addNavigationSpans(transaction, entry, timeOrigin);\n responseStartTimestamp = timeOrigin + msToSec(entry.responseStart);\n requestStartTimestamp = timeOrigin + msToSec(entry.requestStart);\n break;\n }\n case 'mark':\n case 'paint':\n case 'measure': {\n _addMeasureSpans(transaction, entry, startTime, duration, timeOrigin);\n\n // capture web vitals\n const firstHidden = getVisibilityWatcher();\n // Only report if the page wasn't hidden prior to the web vital.\n const shouldRecord = entry.startTime < firstHidden.firstHiddenTime;\n\n if (entry.name === 'first-paint' && shouldRecord) {\n DEBUG_BUILD && logger.log('[Measurements] Adding FP');\n _measurements['fp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n if (entry.name === 'first-contentful-paint' && shouldRecord) {\n DEBUG_BUILD && logger.log('[Measurements] Adding FCP');\n _measurements['fcp'] = { value: entry.startTime, unit: 'millisecond' };\n }\n break;\n }\n case 'resource': {\n const resourceName = (entry.name ).replace(WINDOW.location.origin, '');\n _addResourceSpans(transaction, entry, resourceName, startTime, duration, timeOrigin);\n break;\n }\n // Ignore other entry types.\n }\n });\n\n _performanceCursor = Math.max(performanceEntries.length - 1, 0);\n\n _trackNavigator(transaction);\n\n // Measurements are only available for pageload transactions\n if (transaction.op === 'pageload') {\n // Generate TTFB (Time to First Byte), which measured as the time between the beginning of the transaction and the\n // start of the response in milliseconds\n if (typeof responseStartTimestamp === 'number') {\n DEBUG_BUILD && logger.log('[Measurements] Adding TTFB');\n _measurements['ttfb'] = {\n value: (responseStartTimestamp - transaction.startTimestamp) * 1000,\n unit: 'millisecond',\n };\n\n if (typeof requestStartTimestamp === 'number' && requestStartTimestamp <= responseStartTimestamp) {\n // Capture the time spent making the request and receiving the first byte of the response.\n // This is the time between the start of the request and the start of the response in milliseconds.\n _measurements['ttfb.requestTime'] = {\n value: (responseStartTimestamp - requestStartTimestamp) * 1000,\n unit: 'millisecond',\n };\n }\n }\n\n ['fcp', 'fp', 'lcp'].forEach(name => {\n if (!_measurements[name] || timeOrigin >= transaction.startTimestamp) {\n return;\n }\n // The web vitals, fcp, fp, lcp, and ttfb, all measure relative to timeOrigin.\n // Unfortunately, timeOrigin is not captured within the transaction span data, so these web vitals will need\n // to be adjusted to be relative to transaction.startTimestamp.\n const oldValue = _measurements[name].value;\n const measurementTimestamp = timeOrigin + msToSec(oldValue);\n\n // normalizedValue should be in milliseconds\n const normalizedValue = Math.abs((measurementTimestamp - transaction.startTimestamp) * 1000);\n const delta = normalizedValue - oldValue;\n\n DEBUG_BUILD && logger.log(`[Measurements] Normalized ${name} from ${oldValue} to ${normalizedValue} (${delta})`);\n _measurements[name].value = normalizedValue;\n });\n\n const fidMark = _measurements['mark.fid'];\n if (fidMark && _measurements['fid']) {\n // create span for FID\n _startChild(transaction, {\n description: 'first input delay',\n endTimestamp: fidMark.value + msToSec(_measurements['fid'].value),\n op: 'ui.action',\n origin: 'auto.ui.browser.metrics',\n startTimestamp: fidMark.value,\n });\n\n // Delete mark.fid as we don't want it to be part of final payload\n delete _measurements['mark.fid'];\n }\n\n // If FCP is not recorded we should not record the cls value\n // according to the new definition of CLS.\n if (!('fcp' in _measurements)) {\n delete _measurements.cls;\n }\n\n Object.keys(_measurements).forEach(measurementName => {\n transaction.setMeasurement(\n measurementName,\n _measurements[measurementName].value,\n _measurements[measurementName].unit,\n );\n });\n\n _tagMetricInfo(transaction);\n }\n\n _lcpEntry = undefined;\n _clsEntry = undefined;\n _measurements = {};\n}\n\n/** Create measure related spans */\nfunction _addMeasureSpans(\n transaction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entry,\n startTime,\n duration,\n timeOrigin,\n) {\n const measureStartTimestamp = timeOrigin + startTime;\n const measureEndTimestamp = measureStartTimestamp + duration;\n\n _startChild(transaction, {\n description: entry.name ,\n endTimestamp: measureEndTimestamp,\n op: entry.entryType ,\n origin: 'auto.resource.browser.metrics',\n startTimestamp: measureStartTimestamp,\n });\n\n return measureStartTimestamp;\n}\n\n/** Instrument navigation entries */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _addNavigationSpans(transaction, entry, timeOrigin) {\n ['unloadEvent', 'redirect', 'domContentLoadedEvent', 'loadEvent', 'connect'].forEach(event => {\n _addPerformanceNavigationTiming(transaction, entry, event, timeOrigin);\n });\n _addPerformanceNavigationTiming(transaction, entry, 'secureConnection', timeOrigin, 'TLS/SSL', 'connectEnd');\n _addPerformanceNavigationTiming(transaction, entry, 'fetch', timeOrigin, 'cache', 'domainLookupStart');\n _addPerformanceNavigationTiming(transaction, entry, 'domainLookup', timeOrigin, 'DNS');\n _addRequest(transaction, entry, timeOrigin);\n}\n\n/** Create performance navigation related spans */\nfunction _addPerformanceNavigationTiming(\n transaction,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n entry,\n event,\n timeOrigin,\n description,\n eventEnd,\n) {\n const end = eventEnd ? (entry[eventEnd] ) : (entry[`${event}End`] );\n const start = entry[`${event}Start`] ;\n if (!start || !end) {\n return;\n }\n _startChild(transaction, {\n op: 'browser',\n origin: 'auto.browser.browser.metrics',\n description: description || event,\n startTimestamp: timeOrigin + msToSec(start),\n endTimestamp: timeOrigin + msToSec(end),\n });\n}\n\n/** Create request and response related spans */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction _addRequest(transaction, entry, timeOrigin) {\n _startChild(transaction, {\n op: 'browser',\n origin: 'auto.browser.browser.metrics',\n description: 'request',\n startTimestamp: timeOrigin + msToSec(entry.requestStart ),\n endTimestamp: timeOrigin + msToSec(entry.responseEnd ),\n });\n\n _startChild(transaction, {\n op: 'browser',\n origin: 'auto.browser.browser.metrics',\n description: 'response',\n startTimestamp: timeOrigin + msToSec(entry.responseStart ),\n endTimestamp: timeOrigin + msToSec(entry.responseEnd ),\n });\n}\n\n/** Create resource-related spans */\nfunction _addResourceSpans(\n transaction,\n entry,\n resourceName,\n startTime,\n duration,\n timeOrigin,\n) {\n // we already instrument based on fetch and xhr, so we don't need to\n // duplicate spans here.\n if (entry.initiatorType === 'xmlhttprequest' || entry.initiatorType === 'fetch') {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const data = {};\n setResourceEntrySizeData(data, entry, 'transferSize', 'http.response_transfer_size');\n setResourceEntrySizeData(data, entry, 'encodedBodySize', 'http.response_content_length');\n setResourceEntrySizeData(data, entry, 'decodedBodySize', 'http.decoded_response_content_length');\n if ('renderBlockingStatus' in entry) {\n data['resource.render_blocking_status'] = entry.renderBlockingStatus;\n }\n\n const startTimestamp = timeOrigin + startTime;\n const endTimestamp = startTimestamp + duration;\n\n _startChild(transaction, {\n description: resourceName,\n endTimestamp,\n op: entry.initiatorType ? `resource.${entry.initiatorType}` : 'resource.other',\n origin: 'auto.resource.browser.metrics',\n startTimestamp,\n data,\n });\n}\n\n/**\n * Capture the information of the user agent.\n */\nfunction _trackNavigator(transaction) {\n const navigator = WINDOW.navigator ;\n if (!navigator) {\n return;\n }\n\n // track network connectivity\n const connection = navigator.connection;\n if (connection) {\n if (connection.effectiveType) {\n transaction.setTag('effectiveConnectionType', connection.effectiveType);\n }\n\n if (connection.type) {\n transaction.setTag('connectionType', connection.type);\n }\n\n if (isMeasurementValue(connection.rtt)) {\n _measurements['connection.rtt'] = { value: connection.rtt, unit: 'millisecond' };\n }\n }\n\n if (isMeasurementValue(navigator.deviceMemory)) {\n transaction.setTag('deviceMemory', `${navigator.deviceMemory} GB`);\n }\n\n if (isMeasurementValue(navigator.hardwareConcurrency)) {\n transaction.setTag('hardwareConcurrency', String(navigator.hardwareConcurrency));\n }\n}\n\n/** Add LCP / CLS data to transaction to allow debugging */\nfunction _tagMetricInfo(transaction) {\n if (_lcpEntry) {\n DEBUG_BUILD && logger.log('[Measurements] Adding LCP Data');\n\n // Capture Properties of the LCP element that contributes to the LCP.\n\n if (_lcpEntry.element) {\n transaction.setTag('lcp.element', htmlTreeAsString(_lcpEntry.element));\n }\n\n if (_lcpEntry.id) {\n transaction.setTag('lcp.id', _lcpEntry.id);\n }\n\n if (_lcpEntry.url) {\n // Trim URL to the first 200 characters.\n transaction.setTag('lcp.url', _lcpEntry.url.trim().slice(0, 200));\n }\n\n transaction.setTag('lcp.size', _lcpEntry.size);\n }\n\n // See: https://developer.mozilla.org/en-US/docs/Web/API/LayoutShift\n if (_clsEntry && _clsEntry.sources) {\n DEBUG_BUILD && logger.log('[Measurements] Adding CLS Data');\n _clsEntry.sources.forEach((source, index) =>\n transaction.setTag(`cls.source.${index + 1}`, htmlTreeAsString(source.node)),\n );\n }\n}\n\nfunction setResourceEntrySizeData(\n data,\n entry,\n key,\n dataKey,\n) {\n const entryVal = entry[key];\n if (entryVal != null && entryVal < MAX_INT_AS_BYTES) {\n data[dataKey] = entryVal;\n }\n}\n\nexport { _addMeasureSpans, _addResourceSpans, addPerformanceEntries, startTrackingInteractions, startTrackingLongTasks, startTrackingWebVitals };\n//# sourceMappingURL=index.js.map\n","import { hasTracingEnabled, getCurrentScope, getClient, getDynamicSamplingContextFromClient } from '@sentry/core';\nimport { generateSentryTraceHeader, dynamicSamplingContextToSentryBaggageHeader, isInstanceOf, BAGGAGE_HEADER_NAME } from '@sentry/utils';\n\n/**\n * Create and track fetch request spans for usage in combination with `addInstrumentationHandler`.\n *\n * @returns Span if a span was created, otherwise void.\n */\nfunction instrumentFetchRequest(\n handlerData,\n shouldCreateSpan,\n shouldAttachHeaders,\n spans,\n spanOrigin = 'auto.http.browser',\n) {\n if (!hasTracingEnabled() || !handlerData.fetchData) {\n return undefined;\n }\n\n const shouldCreateSpanResult = shouldCreateSpan(handlerData.fetchData.url);\n\n if (handlerData.endTimestamp && shouldCreateSpanResult) {\n const spanId = handlerData.fetchData.__span;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span) {\n if (handlerData.response) {\n span.setHttpStatus(handlerData.response.status);\n\n const contentLength =\n handlerData.response && handlerData.response.headers && handlerData.response.headers.get('content-length');\n\n if (contentLength) {\n const contentLengthNum = parseInt(contentLength);\n if (contentLengthNum > 0) {\n span.setData('http.response_content_length', contentLengthNum);\n }\n }\n } else if (handlerData.error) {\n span.setStatus('internal_error');\n }\n span.end();\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return undefined;\n }\n\n const scope = getCurrentScope();\n const client = getClient();\n const parentSpan = scope.getSpan();\n\n const { method, url } = handlerData.fetchData;\n\n const span =\n shouldCreateSpanResult && parentSpan\n ? parentSpan.startChild({\n data: {\n url,\n type: 'fetch',\n 'http.method': method,\n },\n description: `${method} ${url}`,\n op: 'http.client',\n origin: spanOrigin,\n })\n : undefined;\n\n if (span) {\n handlerData.fetchData.__span = span.spanId;\n spans[span.spanId] = span;\n }\n\n if (shouldAttachHeaders(handlerData.fetchData.url) && client) {\n const request = handlerData.args[0];\n\n // In case the user hasn't set the second argument of a fetch call we default it to `{}`.\n handlerData.args[1] = handlerData.args[1] || {};\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const options = handlerData.args[1];\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n options.headers = addTracingHeadersToFetchRequest(request, client, scope, options, span);\n }\n\n return span;\n}\n\n/**\n * Adds sentry-trace and baggage headers to the various forms of fetch headers\n */\nfunction addTracingHeadersToFetchRequest(\n request, // unknown is actually type Request but we can't export DOM types from this package,\n client,\n scope,\n options\n\n,\n requestSpan,\n) {\n const span = requestSpan || scope.getSpan();\n\n const transaction = span && span.transaction;\n\n const { traceId, sampled, dsc } = scope.getPropagationContext();\n\n const sentryTraceHeader = span ? span.toTraceparent() : generateSentryTraceHeader(traceId, undefined, sampled);\n const dynamicSamplingContext = transaction\n ? transaction.getDynamicSamplingContext()\n : dsc\n ? dsc\n : getDynamicSamplingContextFromClient(traceId, client, scope);\n\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);\n\n const headers =\n typeof Request !== 'undefined' && isInstanceOf(request, Request) ? (request ).headers : options.headers;\n\n if (!headers) {\n return { 'sentry-trace': sentryTraceHeader, baggage: sentryBaggageHeader };\n } else if (typeof Headers !== 'undefined' && isInstanceOf(headers, Headers)) {\n const newHeaders = new Headers(headers );\n\n newHeaders.append('sentry-trace', sentryTraceHeader);\n\n if (sentryBaggageHeader) {\n // If the same header is appended multiple times the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.append(BAGGAGE_HEADER_NAME, sentryBaggageHeader);\n }\n\n return newHeaders ;\n } else if (Array.isArray(headers)) {\n const newHeaders = [...headers, ['sentry-trace', sentryTraceHeader]];\n\n if (sentryBaggageHeader) {\n // If there are multiple entries with the same key, the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.push([BAGGAGE_HEADER_NAME, sentryBaggageHeader]);\n }\n\n return newHeaders ;\n } else {\n const existingBaggageHeader = 'baggage' in headers ? headers.baggage : undefined;\n const newBaggageHeaders = [];\n\n if (Array.isArray(existingBaggageHeader)) {\n newBaggageHeaders.push(...existingBaggageHeader);\n } else if (existingBaggageHeader) {\n newBaggageHeaders.push(existingBaggageHeader);\n }\n\n if (sentryBaggageHeader) {\n newBaggageHeaders.push(sentryBaggageHeader);\n }\n\n return {\n ...(headers ),\n 'sentry-trace': sentryTraceHeader,\n baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined,\n };\n }\n}\n\nexport { addTracingHeadersToFetchRequest, instrumentFetchRequest };\n//# sourceMappingURL=fetch.js.map\n","import { hasTracingEnabled, getCurrentScope, getClient, getDynamicSamplingContextFromClient } from '@sentry/core';\nimport { addFetchInstrumentationHandler, addXhrInstrumentationHandler, SENTRY_XHR_DATA_KEY, dynamicSamplingContextToSentryBaggageHeader, generateSentryTraceHeader, BAGGAGE_HEADER_NAME, browserPerformanceTimeOrigin, stringMatchesSomePattern } from '@sentry/utils';\nimport { instrumentFetchRequest } from '../common/fetch.js';\nimport { addPerformanceInstrumentationHandler } from './instrument.js';\n\n/* eslint-disable max-lines */\n\nconst DEFAULT_TRACE_PROPAGATION_TARGETS = ['localhost', /^\\/(?!\\/)/];\n\n/** Options for Request Instrumentation */\n\nconst defaultRequestInstrumentationOptions = {\n traceFetch: true,\n traceXHR: true,\n enableHTTPTimings: true,\n // TODO (v8): Remove this property\n tracingOrigins: DEFAULT_TRACE_PROPAGATION_TARGETS,\n tracePropagationTargets: DEFAULT_TRACE_PROPAGATION_TARGETS,\n};\n\n/** Registers span creators for xhr and fetch requests */\nfunction instrumentOutgoingRequests(_options) {\n const {\n traceFetch,\n traceXHR,\n // eslint-disable-next-line deprecation/deprecation\n tracePropagationTargets,\n // eslint-disable-next-line deprecation/deprecation\n tracingOrigins,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n } = {\n traceFetch: defaultRequestInstrumentationOptions.traceFetch,\n traceXHR: defaultRequestInstrumentationOptions.traceXHR,\n ..._options,\n };\n\n const shouldCreateSpan =\n typeof shouldCreateSpanForRequest === 'function' ? shouldCreateSpanForRequest : (_) => true;\n\n // TODO(v8) Remove tracingOrigins here\n // The only reason we're passing it in here is because this instrumentOutgoingRequests function is publicly exported\n // and we don't want to break the API. We can remove it in v8.\n const shouldAttachHeadersWithTargets = (url) =>\n shouldAttachHeaders(url, tracePropagationTargets || tracingOrigins);\n\n const spans = {};\n\n if (traceFetch) {\n addFetchInstrumentationHandler(handlerData => {\n const createdSpan = instrumentFetchRequest(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n if (enableHTTPTimings && createdSpan) {\n addHTTPTimings(createdSpan);\n }\n });\n }\n\n if (traceXHR) {\n addXhrInstrumentationHandler(handlerData => {\n const createdSpan = xhrCallback(handlerData, shouldCreateSpan, shouldAttachHeadersWithTargets, spans);\n if (enableHTTPTimings && createdSpan) {\n addHTTPTimings(createdSpan);\n }\n });\n }\n}\n\nfunction isPerformanceResourceTiming(entry) {\n return (\n entry.entryType === 'resource' &&\n 'initiatorType' in entry &&\n typeof (entry ).nextHopProtocol === 'string' &&\n (entry.initiatorType === 'fetch' || entry.initiatorType === 'xmlhttprequest')\n );\n}\n\n/**\n * Creates a temporary observer to listen to the next fetch/xhr resourcing timings,\n * so that when timings hit their per-browser limit they don't need to be removed.\n *\n * @param span A span that has yet to be finished, must contain `url` on data.\n */\nfunction addHTTPTimings(span) {\n const url = span.data.url;\n\n if (!url) {\n return;\n }\n\n const cleanup = addPerformanceInstrumentationHandler('resource', ({ entries }) => {\n entries.forEach(entry => {\n if (isPerformanceResourceTiming(entry) && entry.name.endsWith(url)) {\n const spanData = resourceTimingEntryToSpanData(entry);\n spanData.forEach(data => span.setData(...data));\n // In the next tick, clean this handler up\n // We have to wait here because otherwise this cleans itself up before it is fully done\n setTimeout(cleanup);\n }\n });\n });\n}\n\n/**\n * Converts ALPN protocol ids to name and version.\n *\n * (https://www.iana.org/assignments/tls-extensiontype-values/tls-extensiontype-values.xhtml#alpn-protocol-ids)\n * @param nextHopProtocol PerformanceResourceTiming.nextHopProtocol\n */\nfunction extractNetworkProtocol(nextHopProtocol) {\n let name = 'unknown';\n let version = 'unknown';\n let _name = '';\n for (const char of nextHopProtocol) {\n // http/1.1 etc.\n if (char === '/') {\n [name, version] = nextHopProtocol.split('/');\n break;\n }\n // h2, h3 etc.\n if (!isNaN(Number(char))) {\n name = _name === 'h' ? 'http' : _name;\n version = nextHopProtocol.split(_name)[1];\n break;\n }\n _name += char;\n }\n if (_name === nextHopProtocol) {\n // webrtc, ftp, etc.\n name = _name;\n }\n return { name, version };\n}\n\nfunction getAbsoluteTime(time = 0) {\n return ((browserPerformanceTimeOrigin || performance.timeOrigin) + time) / 1000;\n}\n\nfunction resourceTimingEntryToSpanData(resourceTiming) {\n const { name, version } = extractNetworkProtocol(resourceTiming.nextHopProtocol);\n\n const timingSpanData = [];\n\n timingSpanData.push(['network.protocol.version', version], ['network.protocol.name', name]);\n\n if (!browserPerformanceTimeOrigin) {\n return timingSpanData;\n }\n return [\n ...timingSpanData,\n ['http.request.redirect_start', getAbsoluteTime(resourceTiming.redirectStart)],\n ['http.request.fetch_start', getAbsoluteTime(resourceTiming.fetchStart)],\n ['http.request.domain_lookup_start', getAbsoluteTime(resourceTiming.domainLookupStart)],\n ['http.request.domain_lookup_end', getAbsoluteTime(resourceTiming.domainLookupEnd)],\n ['http.request.connect_start', getAbsoluteTime(resourceTiming.connectStart)],\n ['http.request.secure_connection_start', getAbsoluteTime(resourceTiming.secureConnectionStart)],\n ['http.request.connection_end', getAbsoluteTime(resourceTiming.connectEnd)],\n ['http.request.request_start', getAbsoluteTime(resourceTiming.requestStart)],\n ['http.request.response_start', getAbsoluteTime(resourceTiming.responseStart)],\n ['http.request.response_end', getAbsoluteTime(resourceTiming.responseEnd)],\n ];\n}\n\n/**\n * A function that determines whether to attach tracing headers to a request.\n * This was extracted from `instrumentOutgoingRequests` to make it easier to test shouldAttachHeaders.\n * We only export this fuction for testing purposes.\n */\nfunction shouldAttachHeaders(url, tracePropagationTargets) {\n return stringMatchesSomePattern(url, tracePropagationTargets || DEFAULT_TRACE_PROPAGATION_TARGETS);\n}\n\n/**\n * Create and track xhr request spans\n *\n * @returns Span if a span was created, otherwise void.\n */\n// eslint-disable-next-line complexity\nfunction xhrCallback(\n handlerData,\n shouldCreateSpan,\n shouldAttachHeaders,\n spans,\n) {\n const xhr = handlerData.xhr;\n const sentryXhrData = xhr && xhr[SENTRY_XHR_DATA_KEY];\n\n if (!hasTracingEnabled() || !xhr || xhr.__sentry_own_request__ || !sentryXhrData) {\n return undefined;\n }\n\n const shouldCreateSpanResult = shouldCreateSpan(sentryXhrData.url);\n\n // check first if the request has finished and is tracked by an existing span which should now end\n if (handlerData.endTimestamp && shouldCreateSpanResult) {\n const spanId = xhr.__sentry_xhr_span_id__;\n if (!spanId) return;\n\n const span = spans[spanId];\n if (span && sentryXhrData.status_code !== undefined) {\n span.setHttpStatus(sentryXhrData.status_code);\n span.end();\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n return undefined;\n }\n\n const scope = getCurrentScope();\n const parentSpan = scope.getSpan();\n\n const span =\n shouldCreateSpanResult && parentSpan\n ? parentSpan.startChild({\n data: {\n type: 'xhr',\n 'http.method': sentryXhrData.method,\n url: sentryXhrData.url,\n },\n description: `${sentryXhrData.method} ${sentryXhrData.url}`,\n op: 'http.client',\n origin: 'auto.http.browser',\n })\n : undefined;\n\n if (span) {\n xhr.__sentry_xhr_span_id__ = span.spanId;\n spans[xhr.__sentry_xhr_span_id__] = span;\n }\n\n if (xhr.setRequestHeader && shouldAttachHeaders(sentryXhrData.url)) {\n if (span) {\n const transaction = span && span.transaction;\n const dynamicSamplingContext = transaction && transaction.getDynamicSamplingContext();\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);\n setHeaderOnXhr(xhr, span.toTraceparent(), sentryBaggageHeader);\n } else {\n const client = getClient();\n const { traceId, sampled, dsc } = scope.getPropagationContext();\n const sentryTraceHeader = generateSentryTraceHeader(traceId, undefined, sampled);\n const dynamicSamplingContext =\n dsc || (client ? getDynamicSamplingContextFromClient(traceId, client, scope) : undefined);\n const sentryBaggageHeader = dynamicSamplingContextToSentryBaggageHeader(dynamicSamplingContext);\n setHeaderOnXhr(xhr, sentryTraceHeader, sentryBaggageHeader);\n }\n }\n\n return span;\n}\n\nfunction setHeaderOnXhr(\n xhr,\n sentryTraceHeader,\n sentryBaggageHeader,\n) {\n try {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n xhr.setRequestHeader('sentry-trace', sentryTraceHeader);\n if (sentryBaggageHeader) {\n // From MDN: \"If this method is called several times with the same header, the values are merged into one single request header.\"\n // We can therefore simply set a baggage header without checking what was there before\n // https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/setRequestHeader\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n xhr.setRequestHeader(BAGGAGE_HEADER_NAME, sentryBaggageHeader);\n }\n } catch (_) {\n // Error: InvalidStateError: Failed to execute 'setRequestHeader' on 'XMLHttpRequest': The object's state must be OPENED.\n }\n}\n\nexport { DEFAULT_TRACE_PROPAGATION_TARGETS, defaultRequestInstrumentationOptions, extractNetworkProtocol, instrumentOutgoingRequests, shouldAttachHeaders, xhrCallback };\n//# sourceMappingURL=request.js.map\n","import { logger, browserPerformanceTimeOrigin, addHistoryInstrumentationHandler } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../common/debug-build.js';\nimport { WINDOW } from './types.js';\n\n/**\n * Default function implementing pageload and navigation transactions\n */\nfunction instrumentRoutingWithDefaults(\n customStartTransaction,\n startTransactionOnPageLoad = true,\n startTransactionOnLocationChange = true,\n) {\n if (!WINDOW || !WINDOW.location) {\n DEBUG_BUILD && logger.warn('Could not initialize routing instrumentation due to invalid location');\n return;\n }\n\n let startingUrl = WINDOW.location.href;\n\n let activeTransaction;\n if (startTransactionOnPageLoad) {\n activeTransaction = customStartTransaction({\n name: WINDOW.location.pathname,\n // pageload should always start at timeOrigin (and needs to be in s, not ms)\n startTimestamp: browserPerformanceTimeOrigin ? browserPerformanceTimeOrigin / 1000 : undefined,\n op: 'pageload',\n origin: 'auto.pageload.browser',\n metadata: { source: 'url' },\n });\n }\n\n if (startTransactionOnLocationChange) {\n addHistoryInstrumentationHandler(({ to, from }) => {\n /**\n * This early return is there to account for some cases where a navigation transaction starts right after\n * long-running pageload. We make sure that if `from` is undefined and a valid `startingURL` exists, we don't\n * create an uneccessary navigation transaction.\n *\n * This was hard to duplicate, but this behavior stopped as soon as this fix was applied. This issue might also\n * only be caused in certain development environments where the usage of a hot module reloader is causing\n * errors.\n */\n if (from === undefined && startingUrl && startingUrl.indexOf(to) !== -1) {\n startingUrl = undefined;\n return;\n }\n\n if (from !== to) {\n startingUrl = undefined;\n if (activeTransaction) {\n DEBUG_BUILD && logger.log(`[Tracing] Finishing current transaction with op: ${activeTransaction.op}`);\n // If there's an open transaction on the scope, we need to finish it before creating an new one.\n activeTransaction.end();\n }\n activeTransaction = customStartTransaction({\n name: WINDOW.location.pathname,\n op: 'navigation',\n origin: 'auto.navigation.browser',\n metadata: { source: 'url' },\n });\n }\n });\n }\n}\n\nexport { instrumentRoutingWithDefaults };\n//# sourceMappingURL=router.js.map\n","import { TRACING_DEFAULTS, addTracingExtensions, startIdleTransaction, getActiveTransaction } from '@sentry/core';\nimport { logger, tracingContextFromHeaders, getDomElement } from '@sentry/utils';\nimport { DEBUG_BUILD } from '../common/debug-build.js';\nimport { registerBackgroundTabDetection } from './backgroundtab.js';\nimport { startTrackingWebVitals, startTrackingLongTasks, startTrackingInteractions, addPerformanceEntries } from './metrics/index.js';\nimport { defaultRequestInstrumentationOptions, instrumentOutgoingRequests } from './request.js';\nimport { instrumentRoutingWithDefaults } from './router.js';\nimport { WINDOW } from './types.js';\n\nconst BROWSER_TRACING_INTEGRATION_ID = 'BrowserTracing';\n\n/** Options for Browser Tracing integration */\n\nconst DEFAULT_BROWSER_TRACING_OPTIONS = {\n ...TRACING_DEFAULTS,\n markBackgroundTransactions: true,\n routingInstrumentation: instrumentRoutingWithDefaults,\n startTransactionOnLocationChange: true,\n startTransactionOnPageLoad: true,\n enableLongTask: true,\n _experiments: {},\n ...defaultRequestInstrumentationOptions,\n};\n\n/**\n * The Browser Tracing integration automatically instruments browser pageload/navigation\n * actions as transactions, and captures requests, metrics and errors as spans.\n *\n * The integration can be configured with a variety of options, and can be extended to use\n * any routing library. This integration uses {@see IdleTransaction} to create transactions.\n */\nclass BrowserTracing {\n // This class currently doesn't have a static `id` field like the other integration classes, because it prevented\n // @sentry/tracing from being treeshaken. Tree shakers do not like static fields, because they behave like side effects.\n // TODO: Come up with a better plan, than using static fields on integration classes, and use that plan on all\n // integrations.\n\n /** Browser Tracing integration options */\n\n /**\n * @inheritDoc\n */\n\n constructor(_options) {\n this.name = BROWSER_TRACING_INTEGRATION_ID;\n this._hasSetTracePropagationTargets = false;\n\n addTracingExtensions();\n\n if (DEBUG_BUILD) {\n this._hasSetTracePropagationTargets = !!(\n _options &&\n // eslint-disable-next-line deprecation/deprecation\n (_options.tracePropagationTargets || _options.tracingOrigins)\n );\n }\n\n this.options = {\n ...DEFAULT_BROWSER_TRACING_OPTIONS,\n ..._options,\n };\n\n // Special case: enableLongTask can be set in _experiments\n // TODO (v8): Remove this in v8\n if (this.options._experiments.enableLongTask !== undefined) {\n this.options.enableLongTask = this.options._experiments.enableLongTask;\n }\n\n // TODO (v8): remove this block after tracingOrigins is removed\n // Set tracePropagationTargets to tracingOrigins if specified by the user\n // In case both are specified, tracePropagationTargets takes precedence\n // eslint-disable-next-line deprecation/deprecation\n if (_options && !_options.tracePropagationTargets && _options.tracingOrigins) {\n // eslint-disable-next-line deprecation/deprecation\n this.options.tracePropagationTargets = _options.tracingOrigins;\n }\n\n this._collectWebVitals = startTrackingWebVitals();\n if (this.options.enableLongTask) {\n startTrackingLongTasks();\n }\n if (this.options._experiments.enableInteractions) {\n startTrackingInteractions();\n }\n }\n\n /**\n * @inheritDoc\n */\n setupOnce(_, getCurrentHub) {\n this._getCurrentHub = getCurrentHub;\n const hub = getCurrentHub();\n const client = hub.getClient();\n const clientOptions = client && client.getOptions();\n\n const {\n routingInstrumentation: instrumentRouting,\n startTransactionOnLocationChange,\n startTransactionOnPageLoad,\n markBackgroundTransactions,\n traceFetch,\n traceXHR,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n _experiments,\n } = this.options;\n\n const clientOptionsTracePropagationTargets = clientOptions && clientOptions.tracePropagationTargets;\n // There are three ways to configure tracePropagationTargets:\n // 1. via top level client option `tracePropagationTargets`\n // 2. via BrowserTracing option `tracePropagationTargets`\n // 3. via BrowserTracing option `tracingOrigins` (deprecated)\n //\n // To avoid confusion, favour top level client option `tracePropagationTargets`, and fallback to\n // BrowserTracing option `tracePropagationTargets` and then `tracingOrigins` (deprecated).\n // This is done as it minimizes bundle size (we don't have to have undefined checks).\n //\n // If both 1 and either one of 2 or 3 are set (from above), we log out a warning.\n // eslint-disable-next-line deprecation/deprecation\n const tracePropagationTargets = clientOptionsTracePropagationTargets || this.options.tracePropagationTargets;\n if (DEBUG_BUILD && this._hasSetTracePropagationTargets && clientOptionsTracePropagationTargets) {\n logger.warn(\n '[Tracing] The `tracePropagationTargets` option was set in the BrowserTracing integration and top level `Sentry.init`. The top level `Sentry.init` value is being used.',\n );\n }\n\n instrumentRouting(\n (context) => {\n const transaction = this._createRouteTransaction(context);\n\n this.options._experiments.onStartRouteTransaction &&\n this.options._experiments.onStartRouteTransaction(transaction, context, getCurrentHub);\n\n return transaction;\n },\n startTransactionOnPageLoad,\n startTransactionOnLocationChange,\n );\n\n if (markBackgroundTransactions) {\n registerBackgroundTabDetection();\n }\n\n if (_experiments.enableInteractions) {\n this._registerInteractionListener();\n }\n\n instrumentOutgoingRequests({\n traceFetch,\n traceXHR,\n tracePropagationTargets,\n shouldCreateSpanForRequest,\n enableHTTPTimings,\n });\n }\n\n /** Create routing idle transaction. */\n _createRouteTransaction(context) {\n if (!this._getCurrentHub) {\n DEBUG_BUILD &&\n logger.warn(`[Tracing] Did not create ${context.op} transaction because _getCurrentHub is invalid.`);\n return undefined;\n }\n\n const hub = this._getCurrentHub();\n\n const { beforeNavigate, idleTimeout, finalTimeout, heartbeatInterval } = this.options;\n\n const isPageloadTransaction = context.op === 'pageload';\n\n const sentryTrace = isPageloadTransaction ? getMetaContent('sentry-trace') : '';\n const baggage = isPageloadTransaction ? getMetaContent('baggage') : '';\n const { traceparentData, dynamicSamplingContext, propagationContext } = tracingContextFromHeaders(\n sentryTrace,\n baggage,\n );\n\n const expandedContext = {\n ...context,\n ...traceparentData,\n metadata: {\n ...context.metadata,\n dynamicSamplingContext: traceparentData && !dynamicSamplingContext ? {} : dynamicSamplingContext,\n },\n trimEnd: true,\n };\n\n const modifiedContext = typeof beforeNavigate === 'function' ? beforeNavigate(expandedContext) : expandedContext;\n\n // For backwards compatibility reasons, beforeNavigate can return undefined to \"drop\" the transaction (prevent it\n // from being sent to Sentry).\n const finalContext = modifiedContext === undefined ? { ...expandedContext, sampled: false } : modifiedContext;\n\n // If `beforeNavigate` set a custom name, record that fact\n finalContext.metadata =\n finalContext.name !== expandedContext.name\n ? { ...finalContext.metadata, source: 'custom' }\n : finalContext.metadata;\n\n this._latestRouteName = finalContext.name;\n this._latestRouteSource = finalContext.metadata && finalContext.metadata.source;\n\n if (finalContext.sampled === false) {\n DEBUG_BUILD && logger.log(`[Tracing] Will not send ${finalContext.op} transaction because of beforeNavigate.`);\n }\n\n DEBUG_BUILD && logger.log(`[Tracing] Starting ${finalContext.op} transaction on scope`);\n\n const { location } = WINDOW;\n\n const idleTransaction = startIdleTransaction(\n hub,\n finalContext,\n idleTimeout,\n finalTimeout,\n true,\n { location }, // for use in the tracesSampler\n heartbeatInterval,\n );\n\n const scope = hub.getScope();\n\n // If it's a pageload and there is a meta tag set\n // use the traceparentData as the propagation context\n if (isPageloadTransaction && traceparentData) {\n scope.setPropagationContext(propagationContext);\n } else {\n // Navigation transactions should set a new propagation context based on the\n // created idle transaction.\n scope.setPropagationContext({\n traceId: idleTransaction.traceId,\n spanId: idleTransaction.spanId,\n parentSpanId: idleTransaction.parentSpanId,\n sampled: idleTransaction.sampled,\n });\n }\n\n idleTransaction.registerBeforeFinishCallback(transaction => {\n this._collectWebVitals();\n addPerformanceEntries(transaction);\n });\n\n return idleTransaction ;\n }\n\n /** Start listener for interaction transactions */\n _registerInteractionListener() {\n let inflightInteractionTransaction;\n const registerInteractionTransaction = () => {\n const { idleTimeout, finalTimeout, heartbeatInterval } = this.options;\n const op = 'ui.action.click';\n\n const currentTransaction = getActiveTransaction();\n if (currentTransaction && currentTransaction.op && ['navigation', 'pageload'].includes(currentTransaction.op)) {\n DEBUG_BUILD &&\n logger.warn(\n `[Tracing] Did not create ${op} transaction because a pageload or navigation transaction is in progress.`,\n );\n return undefined;\n }\n\n if (inflightInteractionTransaction) {\n inflightInteractionTransaction.setFinishReason('interactionInterrupted');\n inflightInteractionTransaction.end();\n inflightInteractionTransaction = undefined;\n }\n\n if (!this._getCurrentHub) {\n DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _getCurrentHub is invalid.`);\n return undefined;\n }\n\n if (!this._latestRouteName) {\n DEBUG_BUILD && logger.warn(`[Tracing] Did not create ${op} transaction because _latestRouteName is missing.`);\n return undefined;\n }\n\n const hub = this._getCurrentHub();\n const { location } = WINDOW;\n\n const context = {\n name: this._latestRouteName,\n op,\n trimEnd: true,\n metadata: {\n source: this._latestRouteSource || 'url',\n },\n };\n\n inflightInteractionTransaction = startIdleTransaction(\n hub,\n context,\n idleTimeout,\n finalTimeout,\n true,\n { location }, // for use in the tracesSampler\n heartbeatInterval,\n );\n };\n\n ['click'].forEach(type => {\n addEventListener(type, registerInteractionTransaction, { once: false, capture: true });\n });\n }\n}\n\n/** Returns the value of a meta tag */\nfunction getMetaContent(metaName) {\n // Can't specify generic to `getDomElement` because tracing can be used\n // in a variety of environments, have to disable `no-unsafe-member-access`\n // as a result.\n const metaTag = getDomElement(`meta[name=${metaName}]`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return metaTag ? metaTag.getAttribute('content') : undefined;\n}\n\nexport { BROWSER_TRACING_INTEGRATION_ID, BrowserTracing, getMetaContent };\n//# sourceMappingURL=browsertracing.js.map\n"],"names":["DEBUG_BUILD","WINDOW","GLOBAL_OBJ","registerBackgroundTabDetection","activeTransaction","getActiveTransaction","statusType","logger","bindReporter","callback","metric","reportAllChanges","prevValue","delta","forceReport","generateUniqueID","getNavigationEntryFromPerformanceTiming","timing","type","navigationEntry","key","getNavigationEntry","getActivationStart","navEntry","initMetric","name","value","navigationType","observe","opts","po","list","onHidden","cb","once","onHiddenOrPageHide","event","onCLS","onReport","report","sessionValue","sessionEntries","handleEntries","entries","entry","firstSessionEntry","lastSessionEntry","stopListening","firstHiddenTime","initHiddenTime","trackChanges","timeStamp","getVisibilityWatcher","onFID","visibilityWatcher","handleEntry","reportedMetricIDs","onLCP","lastEntry","handlers","instrumented","_previousCls","_previousFid","_previousLcp","addClsInstrumentationHandler","addMetricObserver","instrumentCls","addLcpInstrumentationHandler","instrumentLcp","addFidInstrumentationHandler","instrumentFid","addPerformanceInstrumentationHandler","addHandler","instrumentPerformanceObserver","getCleanupCallback","triggerHandlers","data","typeHandlers","handler","e","getFunctionName","instrumentFn","previousValue","options","index","isMeasurementValue","_startChild","transaction","startTimestamp","ctx","MAX_INT_AS_BYTES","msToSec","time","getBrowserPerformanceAPI","_performanceCursor","_measurements","_lcpEntry","_clsEntry","startTrackingWebVitals","performance","browserPerformanceTimeOrigin","fidCallback","_trackFID","clsCallback","_trackCLS","lcpCallback","_trackLCP","startTrackingLongTasks","startTime","duration","startTrackingInteractions","span","htmlTreeAsString","componentName","getComponentName","timeOrigin","addPerformanceEntries","performanceEntries","responseStartTimestamp","requestStartTimestamp","_addNavigationSpans","_addMeasureSpans","firstHidden","shouldRecord","resourceName","_addResourceSpans","_trackNavigator","oldValue","measurementTimestamp","normalizedValue","fidMark","measurementName","_tagMetricInfo","measureStartTimestamp","measureEndTimestamp","_addPerformanceNavigationTiming","_addRequest","description","eventEnd","end","start","setResourceEntrySizeData","endTimestamp","navigator","connection","source","dataKey","entryVal","instrumentFetchRequest","handlerData","shouldCreateSpan","shouldAttachHeaders","spans","spanOrigin","hasTracingEnabled","shouldCreateSpanResult","spanId","contentLength","contentLengthNum","scope","getCurrentScope","client","getClient","parentSpan","method","url","request","addTracingHeadersToFetchRequest","requestSpan","traceId","sampled","dsc","sentryTraceHeader","generateSentryTraceHeader","dynamicSamplingContext","getDynamicSamplingContextFromClient","sentryBaggageHeader","dynamicSamplingContextToSentryBaggageHeader","headers","isInstanceOf","newHeaders","BAGGAGE_HEADER_NAME","existingBaggageHeader","newBaggageHeaders","DEFAULT_TRACE_PROPAGATION_TARGETS","defaultRequestInstrumentationOptions","instrumentOutgoingRequests","_options","traceFetch","traceXHR","tracePropagationTargets","tracingOrigins","shouldCreateSpanForRequest","enableHTTPTimings","_","shouldAttachHeadersWithTargets","addFetchInstrumentationHandler","createdSpan","addHTTPTimings","addXhrInstrumentationHandler","xhrCallback","isPerformanceResourceTiming","cleanup","resourceTimingEntryToSpanData","extractNetworkProtocol","nextHopProtocol","version","_name","char","getAbsoluteTime","resourceTiming","timingSpanData","stringMatchesSomePattern","xhr","sentryXhrData","SENTRY_XHR_DATA_KEY","setHeaderOnXhr","instrumentRoutingWithDefaults","customStartTransaction","startTransactionOnPageLoad","startTransactionOnLocationChange","startingUrl","addHistoryInstrumentationHandler","to","from","BROWSER_TRACING_INTEGRATION_ID","DEFAULT_BROWSER_TRACING_OPTIONS","TRACING_DEFAULTS","BrowserTracing","addTracingExtensions","getCurrentHub","clientOptions","instrumentRouting","markBackgroundTransactions","_experiments","clientOptionsTracePropagationTargets","context","hub","beforeNavigate","idleTimeout","finalTimeout","heartbeatInterval","isPageloadTransaction","sentryTrace","getMetaContent","baggage","traceparentData","propagationContext","tracingContextFromHeaders","expandedContext","modifiedContext","finalContext","location","idleTransaction","startIdleTransaction","inflightInteractionTransaction","registerInteractionTransaction","op","currentTransaction","metaName","metaTag","getDomElement"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]}