import { isThenable } from '@sentry/utils'; import { getCurrentHub } from '../hub.js'; import { hasTracingEnabled } from '../utils/hasTracingEnabled.js'; /** * Wraps a function with a transaction/span and finishes the span after the function is done. * * Note that if you have not enabled tracing extensions via `addTracingExtensions` * or you didn't set `tracesSampleRate`, this function will not generate spans * and the `span` returned from the callback will be undefined. * * This function is meant to be used internally and may break at any time. Use at your own risk. * * @internal * @private */ function trace( context, callback, // eslint-disable-next-line @typescript-eslint/no-empty-function onError = () => {}, ) { const ctx = { ...context }; // If a name is set and a description is not, set the description to the name. if (ctx.name !== undefined && ctx.description === undefined) { ctx.description = ctx.name; } const hub = getCurrentHub(); const scope = hub.getScope(); const parentSpan = scope.getSpan(); function getActiveSpan() { if (!hasTracingEnabled()) { return undefined; } return parentSpan ? parentSpan.startChild(ctx) : hub.startTransaction(ctx); } const activeSpan = getActiveSpan(); scope.setSpan(activeSpan); function finishAndSetSpan() { activeSpan && activeSpan.finish(); hub.getScope().setSpan(parentSpan); } let maybePromiseResult; try { maybePromiseResult = callback(activeSpan); } catch (e) { activeSpan && activeSpan.setStatus('internal_error'); onError(e); finishAndSetSpan(); throw e; } if (isThenable(maybePromiseResult)) { Promise.resolve(maybePromiseResult).then( () => { finishAndSetSpan(); }, e => { activeSpan && activeSpan.setStatus('internal_error'); onError(e); finishAndSetSpan(); }, ); } else { finishAndSetSpan(); } return maybePromiseResult; } export { trace }; //# sourceMappingURL=trace.js.map