UNPKG

@sentry/nextjs

Version:
73 lines (69 loc) • 2.9 kB
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); const api = require('@opentelemetry/api'); const nextSpanAttributes = require('../common/nextSpanAttributes.js'); const APP_RENDER_BODY_SPAN_TYPE = "AppRender.getBodyResult"; const PRERENDER_ROUTE_SPAN_NAME_PREFIX = "prerender route"; const PRERENDER_CONTEXT_KEY = api.createContextKey("sentry.nextjs.prerender"); const prerenderSpans = /* @__PURE__ */ new WeakSet(); function isPrerenderSpanStart(name, options) { const attributes = options?.attributes; const spanName = attributes?.[nextSpanAttributes.ATTR_NEXT_SPAN_NAME] ?? name; return attributes?.[nextSpanAttributes.ATTR_NEXT_SPAN_TYPE] === APP_RENDER_BODY_SPAN_TYPE && typeof spanName === "string" && spanName.startsWith(PRERENDER_ROUTE_SPAN_NAME_PREFIX); } function isPrerenderContext(ctx) { if (ctx.getValue(PRERENDER_CONTEXT_KEY) === true) { return true; } const span = api.trace.getSpan(ctx); return !!span && prerenderSpans.has(span); } function wrapTracer(tracer) { return { startSpan: (name, options, ctx) => { const span = tracer.startSpan(name, options, ctx); if (isPrerenderSpanStart(name, options)) { prerenderSpans.add(span); } return span; }, startActiveSpan: (name, ...args) => { const startActiveSpan = tracer.startActiveSpan.bind(tracer); const options = typeof args[0] === "function" ? void 0 : args[0]; if (!isPrerenderSpanStart(name, options)) { return startActiveSpan(name, ...args); } const explicitContext = args.length === 3 ? args[1] : void 0; if (explicitContext) { return startActiveSpan(name, args[0], explicitContext.setValue(PRERENDER_CONTEXT_KEY, true), args[2]); } return api.context.with(api.context.active().setValue(PRERENDER_CONTEXT_KEY, true), () => startActiveSpan(name, ...args)); } }; } const markedProviders = /* @__PURE__ */ new WeakSet(); function markPrerendersOnTracerProvider(provider) { if (markedProviders.has(provider)) { return; } markedProviders.add(provider); const wrappedTracers = /* @__PURE__ */ new WeakMap(); const getTracer = provider.getTracer.bind(provider); provider.getTracer = (...args) => { const tracer = getTracer(...args); let wrapped = wrappedTracers.get(tracer); if (!wrapped) { wrapped = wrapTracer(tracer); wrappedTracers.set(tracer, wrapped); } return wrapped; }; } function getGlobalTracerProvider() { const provider = api.trace.getTracerProvider(); return "getDelegate" in provider ? provider.getDelegate() : provider; } exports.getGlobalTracerProvider = getGlobalTracerProvider; exports.isPrerenderContext = isPrerenderContext; exports.isPrerenderSpanStart = isPrerenderSpanStart; exports.markPrerendersOnTracerProvider = markPrerendersOnTracerProvider; //# sourceMappingURL=prerenderContext.js.map