@sentry/nextjs
Version:
Official Sentry SDK for Next.js
91 lines (87 loc) • 3.79 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const core = require('@sentry/core');
const nextNavigationErrorUtils = require('./nextNavigationErrorUtils.js');
const responseEnd = require('./utils/responseEnd.js');
const tracingUtils = require('./utils/tracingUtils.js');
const attributes = require('@sentry/conventions/attributes');
function wrapRouteHandlerWithSentry(routeHandler, context) {
const { method, parameterizedRoute, headers } = context;
return new Proxy(routeHandler, {
apply: async (originalFunction, thisArg, args) => {
const activeSpan = core.getActiveSpan();
const rootSpan = activeSpan ? core.getRootSpan(activeSpan) : void 0;
let edgeRuntimeIsolationScopeOverride;
if (rootSpan && process.env.NEXT_RUNTIME === "edge") {
const isolationScope = tracingUtils.commonObjectToIsolationScope(headers);
const { scope } = core.getCapturedScopesOnSpan(rootSpan);
core.setCapturedScopesOnSpan(rootSpan, scope ?? new core.Scope(), isolationScope);
edgeRuntimeIsolationScopeOverride = isolationScope;
rootSpan.updateName(`${method} ${parameterizedRoute}`);
rootSpan.setAttributes({
[core.SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: "route",
[core.SEMANTIC_ATTRIBUTE_SENTRY_OP]: "http.server",
[attributes.HTTP_ROUTE]: parameterizedRoute
});
}
return core.withIsolationScope(
process.env.NEXT_RUNTIME === "edge" ? edgeRuntimeIsolationScopeOverride : core.getIsolationScope(),
() => {
return core.withScope(async (scope) => {
scope.setTransactionName(`${method} ${parameterizedRoute}`);
if (process.env.NEXT_RUNTIME === "edge") {
const completeHeadersDict = headers ? core.winterCGHeadersToDict(headers) : {};
const incomingPropagationContext = core.propagationContextFromHeaders(
completeHeadersDict["sentry-trace"],
completeHeadersDict["baggage"]
);
scope.setPropagationContext(incomingPropagationContext);
scope.setSDKProcessingMetadata({
normalizedRequest: {
method,
headers: completeHeadersDict
}
});
}
const response = await core.handleCallbackErrors(
() => originalFunction.apply(thisArg, args),
(error) => {
if (nextNavigationErrorUtils.isRedirectNavigationError(error)) ; else if (nextNavigationErrorUtils.isNotFoundNavigationError(error)) {
if (activeSpan) {
core.setHttpStatus(activeSpan, 404);
}
if (rootSpan) {
core.setHttpStatus(rootSpan, 404);
}
} else {
core.captureException(error, {
mechanism: {
handled: false,
type: "auto.function.nextjs.route_handler"
}
});
}
},
() => {
responseEnd.waitUntil(responseEnd.flushSafelyWithTimeout());
}
);
try {
if (response.status) {
if (activeSpan) {
core.setHttpStatus(activeSpan, response.status);
}
if (rootSpan) {
core.setHttpStatus(rootSpan, response.status);
}
}
} catch {
}
return response;
});
}
);
}
});
}
exports.wrapRouteHandlerWithSentry = wrapRouteHandlerWithSentry;
//# sourceMappingURL=wrapRouteHandlerWithSentry.js.map