Files
klz-cables.com/.pnpm-store/v10/files/78/49ec74a1221630bd5eef37bae5fa088f0a6340229d0bc2dc75e1ab890761f6ab8315fb1d7db58aa4f0876195db4ea3819a87e88233605da1e3c9d206313e17
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

67 lines
2.4 KiB
Plaintext

import { getActiveSpan, getCurrentScope, _INTERNAL_setSpanForScope } from '@sentry/core';
/**
* Sets an inactive span active on the current scope.
*
* This is useful in browser applications, if you want to create a span that cannot be finished
* within its callback. Any spans started while the given span is active, will be children of the span.
*
* If there already was an active span on the scope prior to calling this function, it is replaced
* with the given span and restored after the span ended. Otherwise, the span will simply be
* removed, resulting in no active span on the scope.
*
* IMPORTANT: This function can ONLY be used in the browser! Calling this function in a server
* environment (for example in a server-side rendered component) will result in undefined behaviour
* and is not supported.
* You MUST call `span.end()` manually, otherwise the span will never be finished.
*
* @example
* ```js
* let checkoutSpan;
*
* on('checkoutStarted', () => {
* checkoutSpan = Sentry.startInactiveSpan({ name: 'checkout-flow' });
* Sentry.setActiveSpanInBrowser(checkoutSpan);
* })
*
* // during this time, any spans started will be children of `checkoutSpan`:
* Sentry.startSpan({ name: 'checkout-step-1' }, () => {
* // ... `
* })
*
* on('checkoutCompleted', () => {
* checkoutSpan?.end();
* })
* ```
*
* @param span - the span to set active
*/
function setActiveSpanInBrowser(span) {
const maybePreviousActiveSpan = getActiveSpan();
// If the span is already active, there's no need to double-patch or set it again.
// This also guards against users (for whatever reason) calling setActiveSpanInBrowser on SDK-started
// idle spans like pageload or navigation spans. These will already be handled correctly by the SDK.
// For nested situations, we have to double-patch to ensure we restore the correct previous span (see tests)
if (maybePreviousActiveSpan === span) {
return;
}
const scope = getCurrentScope();
// Putting a small patch onto the span.end method to ensure we
// remove the span from the scope when it ends.
// eslint-disable-next-line @typescript-eslint/unbound-method
span.end = new Proxy(span.end, {
apply(target, thisArg, args) {
_INTERNAL_setSpanForScope(scope, maybePreviousActiveSpan);
return Reflect.apply(target, thisArg, args);
},
});
_INTERNAL_setSpanForScope(scope, span);
}
export { setActiveSpanInBrowser };
//# sourceMappingURL=setActiveSpan.js.map