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
1 line
9.1 KiB
Plaintext
1 line
9.1 KiB
Plaintext
{"version":3,"file":"withServerActionInstrumentation.js","sources":["../../../src/common/withServerActionInstrumentation.ts"],"sourcesContent":["import type { RequestEventData } from '@sentry/core';\nimport {\n captureException,\n continueTrace,\n debug,\n getActiveSpan,\n getClient,\n getIsolationScope,\n handleCallbackErrors,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SPAN_STATUS_ERROR,\n startSpan,\n withIsolationScope,\n} from '@sentry/core';\nimport { flushSafelyWithTimeout, waitUntil } from '../common/utils/responseEnd';\nimport { DEBUG_BUILD } from './debug-build';\nimport { isNotFoundNavigationError, isRedirectNavigationError } from './nextNavigationErrorUtils';\n\ninterface Options {\n formData?: FormData;\n\n /**\n * Headers as returned from `headers()`.\n *\n * Currently accepts both a plain `Headers` object and `Promise<ReadonlyHeaders>` to be compatible with async APIs introduced in Next.js 15: https://github.com/vercel/next.js/pull/68812\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n headers?: Headers | Promise<any>;\n\n /**\n * Whether the server action response should be included in any events captured within the server action.\n */\n recordResponse?: boolean;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withServerActionInstrumentation<A extends (...args: any[]) => any>(\n serverActionName: string,\n callback: A,\n): Promise<ReturnType<A>>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function withServerActionInstrumentation<A extends (...args: any[]) => any>(\n serverActionName: string,\n options: Options,\n callback: A,\n): Promise<ReturnType<A>>;\n\n/**\n * Wraps a Next.js Server Action implementation with Sentry Error and Performance instrumentation.\n */\nexport function withServerActionInstrumentation<A extends (...args: unknown[]) => unknown>(\n ...args: [string, Options, A] | [string, A]\n): Promise<ReturnType<A>> {\n if (typeof args[1] === 'function') {\n const [serverActionName, callback] = args;\n return withServerActionInstrumentationImplementation(serverActionName, {}, callback);\n } else {\n const [serverActionName, options, callback] = args;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n return withServerActionInstrumentationImplementation(serverActionName, options, callback!);\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nasync function withServerActionInstrumentationImplementation<A extends (...args: any[]) => any>(\n serverActionName: string,\n options: Options,\n callback: A,\n): Promise<ReturnType<A>> {\n return withIsolationScope(async isolationScope => {\n const sendDefaultPii = getClient()?.getOptions().sendDefaultPii;\n\n let sentryTraceHeader;\n let baggageHeader;\n const fullHeadersObject: Record<string, string> = {};\n try {\n const awaitedHeaders: Headers = await options.headers;\n sentryTraceHeader = awaitedHeaders?.get('sentry-trace') ?? undefined;\n baggageHeader = awaitedHeaders?.get('baggage');\n awaitedHeaders?.forEach((value, key) => {\n fullHeadersObject[key] = value;\n });\n } catch {\n DEBUG_BUILD &&\n debug.warn(\n \"Sentry wasn't able to extract the tracing headers for a server action. Will not trace this request.\",\n );\n }\n\n isolationScope.setTransactionName(`serverAction/${serverActionName}`);\n isolationScope.setSDKProcessingMetadata({\n normalizedRequest: {\n headers: fullHeadersObject,\n } satisfies RequestEventData,\n });\n\n // Normally, there is an active span here (from Next.js OTEL) and we just use that as parent\n // Else, we manually continueTrace from the incoming headers\n const continueTraceIfNoActiveSpan = getActiveSpan()\n ? <T>(_opts: unknown, callback: () => T) => callback()\n : continueTrace;\n\n return continueTraceIfNoActiveSpan(\n {\n sentryTrace: sentryTraceHeader,\n baggage: baggageHeader,\n },\n async () => {\n try {\n return await startSpan(\n {\n op: 'function.server_action',\n name: `serverAction/${serverActionName}`,\n forceTransaction: true,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.function.nextjs.server_action',\n },\n },\n async span => {\n const result = await handleCallbackErrors(callback, error => {\n if (isNotFoundNavigationError(error)) {\n // We don't want to report \"not-found\"s\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'not_found' });\n } else if (isRedirectNavigationError(error)) {\n // Don't do anything for redirects\n } else {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n captureException(error, {\n mechanism: {\n handled: false,\n type: 'auto.function.nextjs.server_action',\n },\n });\n }\n });\n\n if (options.recordResponse !== undefined ? options.recordResponse : sendDefaultPii) {\n getIsolationScope().setExtra('server_action_result', result);\n }\n\n if (options.formData) {\n options.formData.forEach((value, key) => {\n getIsolationScope().setExtra(\n `server_action_form_data.${key}`,\n typeof value === 'string' ? value : '[non-string value]',\n );\n });\n }\n\n return result;\n },\n );\n } finally {\n waitUntil(flushSafelyWithTimeout());\n }\n },\n );\n });\n}\n"],"names":["withIsolationScope","getClient","DEBUG_BUILD","debug","getActiveSpan","continueTrace","startSpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN","handleCallbackErrors","isNotFoundNavigationError","SPAN_STATUS_ERROR","isRedirectNavigationError","captureException","getIsolationScope","waitUntil","flushSafelyWithTimeout"],"mappings":"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"} |