@sentry/nextjs
Version:
Official Sentry SDK for Next.js
73 lines (69 loc) • 2.9 kB
JavaScript
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