🚀 Socket Launch Week Day 5:Introducing Repository Access Permissions and Custom Roles.Learn more
Sign In

@sentry/core

Package Overview
Dependencies
Maintainers
1
Versions
711
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@sentry/core - npm Package Compare versions

Comparing version
10.58.0
to
10.59.0
+1
-1
build/cjs/fetch.js

@@ -9,4 +9,4 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const hasSpansEnabled = require('./utils/hasSpansEnabled.js');
const sentryNonRecordingSpan = require('./tracing/sentryNonRecordingSpan.js');
const baggage = require('./utils/baggage.js');
const sentryNonRecordingSpan = require('./tracing/sentryNonRecordingSpan.js');
const hasSpanStreamingEnabled = require('./tracing/spans/hasSpanStreamingEnabled.js');

@@ -13,0 +13,0 @@ const trace = require('./tracing/trace.js');

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../../../src/integrations/express/index.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debug } from '../../utils/debug-logger';\nimport { captureException } from '../../exports';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n ExpressApplication,\n ExpressErrorMiddleware,\n ExpressHandlerOptions,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressMiddleware,\n ExpressModuleExport,\n ExpressRequest,\n ExpressResponse,\n ExpressRouter,\n ExpressRouterv4,\n ExpressRouterv5,\n MiddlewareError,\n} from './types';\nimport {\n defaultShouldHandleError,\n getLayerPath,\n isExpressWithoutRouterPrototype,\n isExpressWithRouterPrototype,\n} from './utils';\nimport { wrapMethod } from '../../utils/object';\nimport { patchLayer } from './patch-layer';\nimport { setSDKProcessingMetadata } from './set-sdk-processing-metadata';\nimport { getDefaultExport } from '../../utils/get-default-export';\n\nfunction isLegacyOptions(\n options: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n): options is ExpressIntegrationOptions & { express: ExpressModuleExport } {\n return !!(options as { express: ExpressModuleExport }).express;\n}\n\n// TODO: remove this deprecation handling in v11\nlet didLegacyDeprecationWarning = false;\nfunction deprecationWarning() {\n if (!didLegacyDeprecationWarning) {\n didLegacyDeprecationWarning = true;\n DEBUG_BUILD &&\n debug.warn(\n '[Express] `patchExpressModule(options)` is deprecated. Use `patchExpressModule(moduleExports, getOptions)` instead.',\n );\n }\n}\n\n/**\n * This is a portable instrumentatiton function that works in any environment\n * where Express can be loaded, without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import express from 'express';\n * import * as Sentry from '@sentry/deno'; // or any SDK that extends core\n *\n * Sentry.patchExpressModule(express, () => ({}));\n * ```\n */\nexport function patchExpressModule(\n moduleExports: ExpressModuleExport,\n getOptions: () => ExpressIntegrationOptions,\n): ExpressModuleExport;\n/**\n * @deprecated Pass the Express module export as the first argument and options getter as the second argument.\n */\nexport function patchExpressModule(\n options: ExpressIntegrationOptions & { express: ExpressModuleExport },\n): ExpressModuleExport;\nexport function patchExpressModule(\n optionsOrExports: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n maybeGetOptions?: () => ExpressIntegrationOptions,\n): ExpressModuleExport {\n let getOptions: () => ExpressIntegrationOptions;\n let moduleExports: ExpressModuleExport;\n if (!maybeGetOptions && isLegacyOptions(optionsOrExports)) {\n const { express, ...options } = optionsOrExports;\n moduleExports = express;\n getOptions = () => options;\n deprecationWarning();\n } else if (typeof maybeGetOptions !== 'function') {\n throw new TypeError('`patchExpressModule(moduleExports, getOptions)` requires a `getOptions` callback');\n } else {\n getOptions = maybeGetOptions;\n moduleExports = optionsOrExports as ExpressModuleExport;\n }\n\n // pass in the require() or import() result of express\n const express = getDefaultExport(moduleExports);\n const routerProto: ExpressRouterv4 | ExpressRouterv5 | undefined = isExpressWithRouterPrototype(express)\n ? express.Router.prototype // Express v5\n : isExpressWithoutRouterPrototype(express)\n ? express.Router // Express v4\n : undefined;\n\n if (!routerProto) {\n throw new TypeError('no valid Express route function to instrument');\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouteMethod = routerProto.route;\n try {\n wrapMethod(\n routerProto,\n 'route',\n function routeTrace(this: ExpressRouter, ...args: Parameters<typeof originalRouteMethod>[]) {\n const route = originalRouteMethod.apply(this, args);\n const layer = this.stack[this.stack.length - 1] as ExpressLayer;\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express route method:', e);\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouterUse = routerProto.use;\n try {\n wrapMethod(\n routerProto,\n 'use',\n function useTrace(this: ExpressApplication, ...args: Parameters<typeof originalRouterUse>) {\n const route = originalRouterUse.apply(this, args);\n const layer = this.stack[this.stack.length - 1];\n if (!layer) {\n return route;\n }\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express use method:', e);\n }\n\n const { application } = express;\n const originalApplicationUse = application.use;\n try {\n wrapMethod(\n application,\n 'use',\n function appUseTrace(\n this: ExpressApplication & {\n _router?: ExpressRouter;\n router?: ExpressRouter;\n },\n ...args: Parameters<ExpressApplication['use']>\n ) {\n // If we access app.router in express 4.x we trigger an assertion error.\n // This property existed in v3, was removed in v4 and then re-added in v5.\n const route = originalApplicationUse.apply(this, args);\n const router = isExpressWithRouterPrototype(express) ? this.router : this._router;\n if (router) {\n const layer = router.stack[router.stack.length - 1];\n if (layer) {\n patchLayer(getOptions, layer, getLayerPath(args));\n }\n }\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express application.use method:', e);\n }\n\n return express;\n}\n\n/**\n * An Express-compatible error handler, used by setupExpressErrorHandler\n */\nexport function expressErrorHandler(options?: ExpressHandlerOptions): ExpressErrorMiddleware {\n return function sentryErrorMiddleware(\n error: MiddlewareError,\n request: ExpressRequest,\n res: ExpressResponse,\n next: (error: MiddlewareError) => void,\n ): void {\n // When an error happens, the `expressRequestHandler` middleware does not run, so we set it here too\n setSDKProcessingMetadata(request);\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n if (shouldHandleError(error)) {\n const eventId = captureException(error, {\n mechanism: { type: 'auto.middleware.express', handled: false },\n });\n (res as { sentry?: string }).sentry = eventId;\n }\n\n next(error);\n };\n}\n\n/**\n * Add an Express error handler to capture errors to Sentry.\n *\n * The error handler must be before any other middleware and after all controllers.\n *\n * @param app The Express instances\n * @param options {ExpressHandlerOptions} Configuration options for the handler\n *\n * @example\n * ```javascript\n * import * as Sentry from 'sentry/deno'; // or any other @sentry/<platform>\n * import * as express from 'express';\n *\n * Sentry.instrumentExpress(express);\n *\n * const app = express();\n *\n * // Add your routes, etc.\n *\n * // Add this after all routes,\n * // but before any and other error-handling middlewares are defined\n * Sentry.setupExpressErrorHandler(app);\n *\n * app.listen(3000);\n * ```\n */\nexport function setupExpressErrorHandler(\n app: {\n //oxlint-disable-next-line no-explicit-any\n use: (middleware: any) => unknown;\n },\n options?: ExpressHandlerOptions,\n): void {\n app.use(expressRequestHandler());\n app.use(expressErrorHandler(options));\n}\n\nfunction expressRequestHandler(): ExpressMiddleware {\n return function sentryRequestMiddleware(request: ExpressRequest, _res: ExpressResponse, next: () => void): void {\n setSDKProcessingMetadata(request);\n next();\n };\n}\n"],"names":["DEBUG_BUILD","debug","express","getDefaultExport","isExpressWithRouterPrototype","isExpressWithoutRouterPrototype","wrapMethod","patchLayer","getLayerPath","setSDKProcessingMetadata","defaultShouldHandleError","captureException"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../../../src/integrations/express/index.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debug } from '../../utils/debug-logger';\nimport { captureException } from '../../exports';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n ExpressApplication,\n ExpressErrorMiddleware,\n ExpressHandlerOptions,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressMiddleware,\n ExpressModuleExport,\n ExpressRequest,\n ExpressResponse,\n ExpressRouter,\n ExpressRouterv4,\n ExpressRouterv5,\n MiddlewareError,\n} from './types';\nimport {\n defaultShouldHandleError,\n getLayerPath,\n isExpressWithoutRouterPrototype,\n isExpressWithRouterPrototype,\n} from './utils';\nimport { wrapMethod } from '../../utils/object';\nimport { patchLayer } from './patch-layer';\nimport { setSDKProcessingMetadata } from './set-sdk-processing-metadata';\nimport { getDefaultExport } from '../../utils/get-default-export';\n\nfunction isLegacyOptions(\n options: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n): options is ExpressIntegrationOptions & { express: ExpressModuleExport } {\n return !!(options as { express: ExpressModuleExport }).express;\n}\n\n// TODO: remove this deprecation handling in v11\nlet didLegacyDeprecationWarning = false;\nfunction deprecationWarning() {\n if (!didLegacyDeprecationWarning) {\n didLegacyDeprecationWarning = true;\n DEBUG_BUILD &&\n debug.warn(\n '[Express] `patchExpressModule(options)` is deprecated. Use `patchExpressModule(moduleExports, getOptions)` instead.',\n );\n }\n}\n\n/**\n * This is a portable instrumentatiton function that works in any environment\n * where Express can be loaded, without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import express from 'express';\n * import * as Sentry from '@sentry/deno'; // or any SDK that extends core\n *\n * Sentry.patchExpressModule(express, () => ({}));\n * ```\n */\nexport function patchExpressModule(\n moduleExports: ExpressModuleExport,\n getOptions: () => ExpressIntegrationOptions,\n): ExpressModuleExport;\n/**\n * @deprecated Pass the Express module export as the first argument and options getter as the second argument.\n */\nexport function patchExpressModule(\n options: ExpressIntegrationOptions & { express: ExpressModuleExport },\n): ExpressModuleExport;\nexport function patchExpressModule(\n optionsOrExports: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n maybeGetOptions?: () => ExpressIntegrationOptions,\n): ExpressModuleExport {\n let getOptions: () => ExpressIntegrationOptions;\n let moduleExports: ExpressModuleExport;\n if (!maybeGetOptions && isLegacyOptions(optionsOrExports)) {\n // eslint-disable-next-line typescript/no-deprecated\n const { express, ...options } = optionsOrExports;\n moduleExports = express;\n getOptions = () => options;\n deprecationWarning();\n } else if (typeof maybeGetOptions !== 'function') {\n throw new TypeError('`patchExpressModule(moduleExports, getOptions)` requires a `getOptions` callback');\n } else {\n getOptions = maybeGetOptions;\n moduleExports = optionsOrExports as ExpressModuleExport;\n }\n\n // pass in the require() or import() result of express\n const express = getDefaultExport(moduleExports);\n const routerProto: ExpressRouterv4 | ExpressRouterv5 | undefined = isExpressWithRouterPrototype(express)\n ? express.Router.prototype // Express v5\n : isExpressWithoutRouterPrototype(express)\n ? express.Router // Express v4\n : undefined;\n\n if (!routerProto) {\n throw new TypeError('no valid Express route function to instrument');\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouteMethod = routerProto.route;\n try {\n wrapMethod(\n routerProto,\n 'route',\n function routeTrace(this: ExpressRouter, ...args: Parameters<typeof originalRouteMethod>[]) {\n const route = originalRouteMethod.apply(this, args);\n const layer = this.stack[this.stack.length - 1] as ExpressLayer;\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express route method:', e);\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouterUse = routerProto.use;\n try {\n wrapMethod(\n routerProto,\n 'use',\n function useTrace(this: ExpressApplication, ...args: Parameters<typeof originalRouterUse>) {\n const route = originalRouterUse.apply(this, args);\n const layer = this.stack[this.stack.length - 1];\n if (!layer) {\n return route;\n }\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express use method:', e);\n }\n\n const { application } = express;\n const originalApplicationUse = application.use;\n try {\n wrapMethod(\n application,\n 'use',\n function appUseTrace(\n this: ExpressApplication & {\n _router?: ExpressRouter;\n router?: ExpressRouter;\n },\n ...args: Parameters<ExpressApplication['use']>\n ) {\n // If we access app.router in express 4.x we trigger an assertion error.\n // This property existed in v3, was removed in v4 and then re-added in v5.\n const route = originalApplicationUse.apply(this, args);\n const router = isExpressWithRouterPrototype(express) ? this.router : this._router;\n if (router) {\n const layer = router.stack[router.stack.length - 1];\n if (layer) {\n patchLayer(getOptions, layer, getLayerPath(args));\n }\n }\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express application.use method:', e);\n }\n\n return express;\n}\n\n/**\n * An Express-compatible error handler, used by setupExpressErrorHandler\n */\nexport function expressErrorHandler(options?: ExpressHandlerOptions): ExpressErrorMiddleware {\n return function sentryErrorMiddleware(\n error: MiddlewareError,\n request: ExpressRequest,\n res: ExpressResponse,\n next: (error: MiddlewareError) => void,\n ): void {\n // When an error happens, the `expressRequestHandler` middleware does not run, so we set it here too\n setSDKProcessingMetadata(request);\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n if (shouldHandleError(error)) {\n const eventId = captureException(error, {\n mechanism: { type: 'auto.middleware.express', handled: false },\n });\n (res as { sentry?: string }).sentry = eventId;\n }\n\n next(error);\n };\n}\n\n/**\n * Add an Express error handler to capture errors to Sentry.\n *\n * The error handler must be before any other middleware and after all controllers.\n *\n * @param app The Express instances\n * @param options {ExpressHandlerOptions} Configuration options for the handler\n *\n * @example\n * ```javascript\n * import * as Sentry from 'sentry/deno'; // or any other @sentry/<platform>\n * import * as express from 'express';\n *\n * Sentry.instrumentExpress(express);\n *\n * const app = express();\n *\n * // Add your routes, etc.\n *\n * // Add this after all routes,\n * // but before any and other error-handling middlewares are defined\n * Sentry.setupExpressErrorHandler(app);\n *\n * app.listen(3000);\n * ```\n */\nexport function setupExpressErrorHandler(\n app: {\n //oxlint-disable-next-line no-explicit-any\n use: (middleware: any) => unknown;\n },\n options?: ExpressHandlerOptions,\n): void {\n app.use(expressRequestHandler());\n app.use(expressErrorHandler(options));\n}\n\nfunction expressRequestHandler(): ExpressMiddleware {\n return function sentryRequestMiddleware(request: ExpressRequest, _res: ExpressResponse, next: () => void): void {\n setSDKProcessingMetadata(request);\n next();\n };\n}\n"],"names":["DEBUG_BUILD","debug","express","getDefaultExport","isExpressWithRouterPrototype","isExpressWithoutRouterPrototype","wrapMethod","patchLayer","getLayerPath","setSDKProcessingMetadata","defaultShouldHandleError","captureException"],"mappings":"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"}

@@ -19,3 +19,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

function getRequestUrl(requestOptions) {
return String(getRequestUrlObject(requestOptions));
try {
return String(getRequestUrlObject(requestOptions));
} catch {
return "";
}
}

@@ -28,3 +32,4 @@ function getRequestUrlObject(requestOptions) {

const path = requestOptions.path ? requestOptions.path : "/";
return new URL(path, `${protocol}//${hostname}${port}`);
const base = `${protocol}//${hostname}${port}`;
return new URL(path.startsWith("//") ? `${base}${path}` : path, base);
}

@@ -31,0 +36,0 @@ function getRequestUrlFromClientRequest(request) {

@@ -1,1 +0,1 @@

{"version":3,"file":"get-request-url.js","sources":["../../../../src/integrations/http/get-request-url.ts"],"sourcesContent":["import type { HttpClientRequest, HttpRequestOptions } from './types';\n\n/** Convert an outgoing request to request options. */\nexport function getRequestOptions(request: HttpClientRequest): HttpRequestOptions {\n // request.host may be 'hostname:port' when the caller passed\n // { host: 'hostname:port' } to http.request(). Split it so that\n // `hostname` is always port-free (matching the http.RequestOptions contract)\n // and the port is not lost when request.port is undefined.\n const hostWithPort = request.host || '';\n const portInHost = /^(.*):(\\d+)$/.exec(hostWithPort);\n const hostname = portInHost ? portInHost[1] : hostWithPort;\n const port = request.port ?? (portInHost ? Number(portInHost[2]) : undefined);\n\n return {\n method: request.method,\n port,\n protocol: request.protocol,\n host: request.host,\n hostname,\n path: request.path,\n headers: request.getHeaders(),\n };\n}\n\nexport function getRequestUrl(requestOptions: HttpRequestOptions): string {\n return String(getRequestUrlObject(requestOptions));\n}\n\nexport function getRequestUrlObject(requestOptions: HttpRequestOptions): URL {\n const protocol = requestOptions.protocol || 'http:';\n const hostHeader = requestOptions.headers?.host && String(requestOptions.headers?.host);\n const hostname = hostHeader || requestOptions.hostname || requestOptions.host || '';\n // Don't log standard :80 (http) and :443 (https) ports to reduce the noise\n // Also don't add port if the hostname already includes a port\n const port =\n !requestOptions.port || requestOptions.port === 80 || requestOptions.port === 443 || /^(.*):(\\d+)$/.test(hostname)\n ? ''\n : `:${requestOptions.port}`;\n const path = requestOptions.path ? requestOptions.path : '/';\n return new URL(path, `${protocol}//${hostname}${port}`);\n}\n\n/**\n * Build the full URL string from a Node.js ClientRequest.\n */\nexport function getRequestUrlFromClientRequest(request: HttpClientRequest): string {\n return String(getRequestUrl(getRequestOptions(request)));\n}\n"],"names":[],"mappings":";;AAGO,SAAS,kBAAkB,OAAA,EAAgD;AAKhF,EAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,IAAQ,EAAA;AACrC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,KAAS,UAAA,GAAa,OAAO,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,MAAA,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,IAAA;AAAA,IACA,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,QAAQ,UAAA;AAAW,GAC9B;AACF;AAEO,SAAS,cAAc,cAAA,EAA4C;AACxE,EAAA,OAAO,MAAA,CAAO,mBAAA,CAAoB,cAAc,CAAC,CAAA;AACnD;AAEO,SAAS,oBAAoB,cAAA,EAAyC;AAC3E,EAAA,MAAM,QAAA,GAAW,eAAe,QAAA,IAAY,OAAA;AAC5C,EAAA,MAAM,aAAa,cAAA,CAAe,OAAA,EAAS,QAAQ,MAAA,CAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AACtF,EAAA,MAAM,QAAA,GAAW,UAAA,IAAc,cAAA,CAAe,QAAA,IAAY,eAAe,IAAA,IAAQ,EAAA;AAGjF,EAAA,MAAM,OACJ,CAAC,cAAA,CAAe,IAAA,IAAQ,cAAA,CAAe,SAAS,EAAA,IAAM,cAAA,CAAe,IAAA,KAAS,GAAA,IAAO,eAAe,IAAA,CAAK,QAAQ,IAC7G,EAAA,GACA,CAAA,CAAA,EAAI,eAAe,IAAI,CAAA,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,GAAA;AACzD,EAAA,OAAO,IAAI,IAAI,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACxD;AAKO,SAAS,+BAA+B,OAAA,EAAoC;AACjF,EAAA,OAAO,MAAA,CAAO,aAAA,CAAc,iBAAA,CAAkB,OAAO,CAAC,CAAC,CAAA;AACzD;;;;;;;"}
{"version":3,"file":"get-request-url.js","sources":["../../../../src/integrations/http/get-request-url.ts"],"sourcesContent":["import type { HttpClientRequest, HttpRequestOptions } from './types';\n\n/** Convert an outgoing request to request options. */\nexport function getRequestOptions(request: HttpClientRequest): HttpRequestOptions {\n // request.host may be 'hostname:port' when the caller passed\n // { host: 'hostname:port' } to http.request(). Split it so that\n // `hostname` is always port-free (matching the http.RequestOptions contract)\n // and the port is not lost when request.port is undefined.\n const hostWithPort = request.host || '';\n const portInHost = /^(.*):(\\d+)$/.exec(hostWithPort);\n const hostname = portInHost ? portInHost[1] : hostWithPort;\n const port = request.port ?? (portInHost ? Number(portInHost[2]) : undefined);\n\n return {\n method: request.method,\n port,\n protocol: request.protocol,\n host: request.host,\n hostname,\n path: request.path,\n headers: request.getHeaders(),\n };\n}\n\nexport function getRequestUrl(requestOptions: HttpRequestOptions): string {\n try {\n return String(getRequestUrlObject(requestOptions));\n } catch {\n return '';\n }\n}\n\nexport function getRequestUrlObject(requestOptions: HttpRequestOptions): URL {\n const protocol = requestOptions.protocol || 'http:';\n const hostHeader = requestOptions.headers?.host && String(requestOptions.headers?.host);\n const hostname = hostHeader || requestOptions.hostname || requestOptions.host || '';\n // Don't log standard :80 (http) and :443 (https) ports to reduce the noise\n // Also don't add port if the hostname already includes a port\n const port =\n !requestOptions.port || requestOptions.port === 80 || requestOptions.port === 443 || /^(.*):(\\d+)$/.test(hostname)\n ? ''\n : `:${requestOptions.port}`;\n const path = requestOptions.path ? requestOptions.path : '/';\n const base = `${protocol}//${hostname}${port}`;\n // A path starting with `//` (valid for e.g. S3 object keys) would otherwise be parsed as a\n // protocol-relative reference, discarding the request's origin, so we resolve it against the origin.\n return new URL(path.startsWith('//') ? `${base}${path}` : path, base);\n}\n\n/**\n * Build the full URL string from a Node.js ClientRequest.\n */\nexport function getRequestUrlFromClientRequest(request: HttpClientRequest): string {\n return String(getRequestUrl(getRequestOptions(request)));\n}\n"],"names":[],"mappings":";;AAGO,SAAS,kBAAkB,OAAA,EAAgD;AAKhF,EAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,IAAQ,EAAA;AACrC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,KAAS,UAAA,GAAa,OAAO,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,MAAA,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,IAAA;AAAA,IACA,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,QAAQ,UAAA;AAAW,GAC9B;AACF;AAEO,SAAS,cAAc,cAAA,EAA4C;AACxE,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,mBAAA,CAAoB,cAAc,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,cAAA,EAAyC;AAC3E,EAAA,MAAM,QAAA,GAAW,eAAe,QAAA,IAAY,OAAA;AAC5C,EAAA,MAAM,aAAa,cAAA,CAAe,OAAA,EAAS,QAAQ,MAAA,CAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AACtF,EAAA,MAAM,QAAA,GAAW,UAAA,IAAc,cAAA,CAAe,QAAA,IAAY,eAAe,IAAA,IAAQ,EAAA;AAGjF,EAAA,MAAM,OACJ,CAAC,cAAA,CAAe,IAAA,IAAQ,cAAA,CAAe,SAAS,EAAA,IAAM,cAAA,CAAe,IAAA,KAAS,GAAA,IAAO,eAAe,IAAA,CAAK,QAAQ,IAC7G,EAAA,GACA,CAAA,CAAA,EAAI,eAAe,IAAI,CAAA,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,GAAA;AACzD,EAAA,MAAM,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AAG5C,EAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,GAAK,IAAA,EAAM,IAAI,CAAA;AACtE;AAKO,SAAS,+BAA+B,OAAA,EAAoC;AACjF,EAAA,OAAO,MAAA,CAAO,aAAA,CAAc,iBAAA,CAAkB,OAAO,CAAC,CAAC,CAAA;AACzD;;;;;;;"}

@@ -1,1 +0,1 @@

{"version":3,"file":"handlers.js","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"sourcesContent":["/**\n * Handler method wrapping for MCP server instrumentation\n *\n * Provides automatic error capture and span correlation for tool, resource,\n * and prompt handlers.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport { fill } from '../../utils/object';\nimport { captureError } from './errorCapture';\nimport type { MCPHandler, MCPServerInstance } from './types';\n\n/**\n * Generic function to wrap MCP server method handlers\n * @internal\n * @param serverInstance - MCP server instance\n * @param methodName - Method name to wrap (tool, resource, prompt)\n */\nfunction wrapMethodHandler(serverInstance: MCPServerInstance, methodName: keyof MCPServerInstance): void {\n fill(serverInstance, methodName, originalMethod => {\n return function (this: MCPServerInstance, name: string, ...args: unknown[]) {\n const handler = args[args.length - 1];\n\n if (typeof handler !== 'function') {\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args);\n }\n\n const wrappedHandler = createWrappedHandler(handler as MCPHandler, methodName, name);\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args.slice(0, -1), wrappedHandler);\n };\n });\n}\n\n/**\n * Creates a wrapped handler with span correlation and error capture\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @returns Wrapped handler function\n */\nfunction createWrappedHandler(originalHandler: MCPHandler, methodName: keyof MCPServerInstance, handlerName: string) {\n return function (this: unknown, ...handlerArgs: unknown[]): unknown {\n try {\n return createErrorCapturingHandler.call(this, originalHandler, methodName, handlerName, handlerArgs);\n } catch (error) {\n DEBUG_BUILD && debug.warn('MCP handler wrapping failed:', error);\n return originalHandler.apply(this, handlerArgs);\n }\n };\n}\n\n/**\n * Creates an error-capturing wrapper for handler execution\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @param handlerArgs - Handler arguments\n * @param extraHandlerData - Additional handler context\n * @returns Handler execution result\n */\nfunction createErrorCapturingHandler(\n this: MCPServerInstance,\n originalHandler: MCPHandler,\n methodName: keyof MCPServerInstance,\n handlerName: string,\n handlerArgs: unknown[],\n): unknown {\n try {\n const result = originalHandler.apply(this, handlerArgs);\n\n if (result && typeof result === 'object' && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).catch(error => {\n captureHandlerError(error, methodName, handlerName);\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n captureHandlerError(error as Error, methodName, handlerName);\n throw error;\n }\n}\n\n/**\n * Captures handler execution errors based on handler type\n * @internal\n * @param error - Error to capture\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n */\nfunction captureHandlerError(error: Error, methodName: keyof MCPServerInstance, handlerName: string): void {\n try {\n const extraData: Record<string, unknown> = {};\n\n if (methodName === 'tool' || methodName === 'registerTool') {\n extraData.tool_name = handlerName;\n\n if (\n error.name === 'ProtocolValidationError' ||\n error.message.includes('validation') ||\n error.message.includes('protocol')\n ) {\n captureError(error, 'validation', extraData);\n } else if (\n error.name === 'ServerTimeoutError' ||\n error.message.includes('timed out') ||\n error.message.includes('timeout')\n ) {\n captureError(error, 'timeout', extraData);\n } else {\n captureError(error, 'tool_execution', extraData);\n }\n } else if (methodName === 'resource' || methodName === 'registerResource') {\n extraData.resource_uri = handlerName;\n captureError(error, 'resource_execution', extraData);\n } else if (methodName === 'prompt' || methodName === 'registerPrompt') {\n extraData.prompt_name = handlerName;\n captureError(error, 'prompt_execution', extraData);\n }\n } catch (_captureErr) {\n // noop\n }\n}\n\n/**\n * Wraps tool handlers to associate them with request spans.\n * Instruments both `tool` (legacy API) and `registerTool` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapToolHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.tool === 'function') wrapMethodHandler(serverInstance, 'tool');\n if (typeof serverInstance.registerTool === 'function') wrapMethodHandler(serverInstance, 'registerTool');\n}\n\n/**\n * Wraps resource handlers to associate them with request spans.\n * Instruments both `resource` (legacy API) and `registerResource` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapResourceHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.resource === 'function') wrapMethodHandler(serverInstance, 'resource');\n if (typeof serverInstance.registerResource === 'function') wrapMethodHandler(serverInstance, 'registerResource');\n}\n\n/**\n * Wraps prompt handlers to associate them with request spans.\n * Instruments both `prompt` (legacy API) and `registerPrompt` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapPromptHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.prompt === 'function') wrapMethodHandler(serverInstance, 'prompt');\n if (typeof serverInstance.registerPrompt === 'function') wrapMethodHandler(serverInstance, 'registerPrompt');\n}\n\n/**\n * Wraps all MCP handler types for span correlation.\n * Supports both the legacy API (`tool`, `resource`, `prompt`) and the newer API\n * (`registerTool`, `registerResource`, `registerPrompt`), instrumenting whichever methods are present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapAllMCPHandlers(serverInstance: MCPServerInstance): void {\n wrapToolHandlers(serverInstance);\n wrapResourceHandlers(serverInstance);\n wrapPromptHandlers(serverInstance);\n}\n\n/**\n * Retroactively wraps handlers on tools, resources, and prompts that were registered\n * before `wrapMcpServerWithSentry` was called.\n *\n * The MCP SDK stores registered entries in private maps and invokes them via the entry's\n * own property at call time — `executor` for tools, `readCallback` for resources, and\n * `handler` for prompts. Replacing those properties\n * in-place is therefore equivalent to having wrapped the original registration call.\n *\n * NOTE: This intentionally accesses private MCP SDK internals (`_registeredTools` etc.).\n * The properties and their shapes are verified against @modelcontextprotocol/sdk source:\n * https://github.com/modelcontextprotocol/typescript-sdk/blob/2c0c481cb9dbfd15c8613f765c940a5f5bace94d/packages/server/src/server/mcp.ts#L304\n * When upgrading the MCP SDK, re-verify that these internal maps and their callable\n * properties still exist and are invoked directly (not captured by closure at registration).\n * All access is defensive — if a property is absent or not a function we skip silently.\n * @internal\n */\nexport function wrapExistingHandlers(serverInstance: MCPServerInstance): void {\n const server = serverInstance as unknown as Record<string, unknown>;\n\n // Tools: MCP SDK calls registeredTool.executor (generated from handler at registration time)\n const registeredTools = server['_registeredTools'];\n if (registeredTools && typeof registeredTools === 'object') {\n for (const [name, tool] of Object.entries(registeredTools as Record<string, Record<string, unknown>>)) {\n if (typeof tool['executor'] === 'function') {\n tool['executor'] = createWrappedHandler(tool['executor'] as MCPHandler, 'registerTool', name);\n }\n }\n }\n\n // Resources: MCP SDK calls registeredResource.readCallback\n const registeredResources = server['_registeredResources'];\n if (registeredResources && typeof registeredResources === 'object') {\n for (const [name, resource] of Object.entries(registeredResources as Record<string, Record<string, unknown>>)) {\n if (typeof resource['readCallback'] === 'function') {\n resource['readCallback'] = createWrappedHandler(\n resource['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Resource templates: MCP SDK calls registeredResourceTemplate.readCallback\n const registeredResourceTemplates = server['_registeredResourceTemplates'];\n if (registeredResourceTemplates && typeof registeredResourceTemplates === 'object') {\n for (const [name, template] of Object.entries(\n registeredResourceTemplates as Record<string, Record<string, unknown>>,\n )) {\n if (typeof template['readCallback'] === 'function') {\n template['readCallback'] = createWrappedHandler(\n template['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Prompts: MCP SDK calls registeredPrompt.handler\n const registeredPrompts = server['_registeredPrompts'];\n if (registeredPrompts && typeof registeredPrompts === 'object') {\n for (const [name, prompt] of Object.entries(registeredPrompts as Record<string, Record<string, unknown>>)) {\n if (typeof prompt['handler'] === 'function') {\n prompt['handler'] = createWrappedHandler(prompt['handler'] as MCPHandler, 'registerPrompt', name);\n }\n }\n }\n}\n"],"names":["fill","DEBUG_BUILD","debug","captureError"],"mappings":"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"}
{"version":3,"file":"handlers.js","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"sourcesContent":["/**\n * Handler method wrapping for MCP server instrumentation\n *\n * Provides automatic error capture and span correlation for tool, resource,\n * and prompt handlers.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport { fill } from '../../utils/object';\nimport { captureError } from './errorCapture';\nimport type { MCPHandler, MCPServerInstance } from './types';\n\n/**\n * Generic function to wrap MCP server method handlers\n * @internal\n * @param serverInstance - MCP server instance\n * @param methodName - Method name to wrap (tool, resource, prompt)\n */\nfunction wrapMethodHandler(serverInstance: MCPServerInstance, methodName: keyof MCPServerInstance): void {\n fill(serverInstance, methodName, originalMethod => {\n return function (this: MCPServerInstance, name: string, ...args: unknown[]) {\n const handler = args[args.length - 1];\n\n if (typeof handler !== 'function') {\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args);\n }\n\n const wrappedHandler = createWrappedHandler(handler as MCPHandler, methodName, name);\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args.slice(0, -1), wrappedHandler);\n };\n });\n}\n\n/**\n * Creates a wrapped handler with span correlation and error capture\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @returns Wrapped handler function\n */\nfunction createWrappedHandler(originalHandler: MCPHandler, methodName: keyof MCPServerInstance, handlerName: string) {\n return function (this: unknown, ...handlerArgs: unknown[]): unknown {\n try {\n return createErrorCapturingHandler.call(this, originalHandler, methodName, handlerName, handlerArgs);\n } catch (error) {\n DEBUG_BUILD && debug.warn('MCP handler wrapping failed:', error);\n return originalHandler.apply(this, handlerArgs);\n }\n };\n}\n\n/**\n * Creates an error-capturing wrapper for handler execution\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @param handlerArgs - Handler arguments\n * @param extraHandlerData - Additional handler context\n * @returns Handler execution result\n */\nfunction createErrorCapturingHandler(\n this: MCPServerInstance,\n originalHandler: MCPHandler,\n methodName: keyof MCPServerInstance,\n handlerName: string,\n handlerArgs: unknown[],\n): unknown {\n try {\n const result = originalHandler.apply(this, handlerArgs);\n\n if (result && typeof result === 'object' && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).catch(error => {\n captureHandlerError(error, methodName, handlerName);\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n captureHandlerError(error as Error, methodName, handlerName);\n throw error;\n }\n}\n\n/**\n * Captures handler execution errors based on handler type\n * @internal\n * @param error - Error to capture\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n */\nfunction captureHandlerError(error: Error, methodName: keyof MCPServerInstance, handlerName: string): void {\n try {\n const extraData: Record<string, unknown> = {};\n\n if (methodName === 'tool' || methodName === 'registerTool') {\n extraData.tool_name = handlerName;\n\n if (\n error.name === 'ProtocolValidationError' ||\n error.message.includes('validation') ||\n error.message.includes('protocol')\n ) {\n captureError(error, 'validation', extraData);\n } else if (\n error.name === 'ServerTimeoutError' ||\n error.message.includes('timed out') ||\n error.message.includes('timeout')\n ) {\n captureError(error, 'timeout', extraData);\n } else {\n captureError(error, 'tool_execution', extraData);\n }\n } else if (methodName === 'resource' || methodName === 'registerResource') {\n extraData.resource_uri = handlerName;\n captureError(error, 'resource_execution', extraData);\n } else if (methodName === 'prompt' || methodName === 'registerPrompt') {\n extraData.prompt_name = handlerName;\n captureError(error, 'prompt_execution', extraData);\n }\n } catch (_captureErr) {\n // noop\n }\n}\n\n/**\n * Wraps tool handlers to associate them with request spans.\n * Instruments both `tool` (legacy API) and `registerTool` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapToolHandlers(serverInstance: MCPServerInstance): void {\n // eslint-disable-next-line typescript/no-deprecated\n if (typeof serverInstance.tool === 'function') wrapMethodHandler(serverInstance, 'tool');\n if (typeof serverInstance.registerTool === 'function') wrapMethodHandler(serverInstance, 'registerTool');\n}\n\n/**\n * Wraps resource handlers to associate them with request spans.\n * Instruments both `resource` (legacy API) and `registerResource` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapResourceHandlers(serverInstance: MCPServerInstance): void {\n // eslint-disable-next-line typescript/no-deprecated\n if (typeof serverInstance.resource === 'function') wrapMethodHandler(serverInstance, 'resource');\n if (typeof serverInstance.registerResource === 'function') wrapMethodHandler(serverInstance, 'registerResource');\n}\n\n/**\n * Wraps prompt handlers to associate them with request spans.\n * Instruments both `prompt` (legacy API) and `registerPrompt` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapPromptHandlers(serverInstance: MCPServerInstance): void {\n // eslint-disable-next-line typescript/no-deprecated\n if (typeof serverInstance.prompt === 'function') wrapMethodHandler(serverInstance, 'prompt');\n if (typeof serverInstance.registerPrompt === 'function') wrapMethodHandler(serverInstance, 'registerPrompt');\n}\n\n/**\n * Wraps all MCP handler types for span correlation.\n * Supports both the legacy API (`tool`, `resource`, `prompt`) and the newer API\n * (`registerTool`, `registerResource`, `registerPrompt`), instrumenting whichever methods are present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapAllMCPHandlers(serverInstance: MCPServerInstance): void {\n wrapToolHandlers(serverInstance);\n wrapResourceHandlers(serverInstance);\n wrapPromptHandlers(serverInstance);\n}\n\n/**\n * Retroactively wraps handlers on tools, resources, and prompts that were registered\n * before `wrapMcpServerWithSentry` was called.\n *\n * The MCP SDK stores registered entries in private maps and invokes them via the entry's\n * own property at call time — `executor` for tools, `readCallback` for resources, and\n * `handler` for prompts. Replacing those properties\n * in-place is therefore equivalent to having wrapped the original registration call.\n *\n * NOTE: This intentionally accesses private MCP SDK internals (`_registeredTools` etc.).\n * The properties and their shapes are verified against @modelcontextprotocol/sdk source:\n * https://github.com/modelcontextprotocol/typescript-sdk/blob/2c0c481cb9dbfd15c8613f765c940a5f5bace94d/packages/server/src/server/mcp.ts#L304\n * When upgrading the MCP SDK, re-verify that these internal maps and their callable\n * properties still exist and are invoked directly (not captured by closure at registration).\n * All access is defensive — if a property is absent or not a function we skip silently.\n * @internal\n */\nexport function wrapExistingHandlers(serverInstance: MCPServerInstance): void {\n const server = serverInstance as unknown as Record<string, unknown>;\n\n // Tools: MCP SDK calls registeredTool.executor (generated from handler at registration time)\n const registeredTools = server['_registeredTools'];\n if (registeredTools && typeof registeredTools === 'object') {\n for (const [name, tool] of Object.entries(registeredTools as Record<string, Record<string, unknown>>)) {\n if (typeof tool['executor'] === 'function') {\n tool['executor'] = createWrappedHandler(tool['executor'] as MCPHandler, 'registerTool', name);\n }\n }\n }\n\n // Resources: MCP SDK calls registeredResource.readCallback\n const registeredResources = server['_registeredResources'];\n if (registeredResources && typeof registeredResources === 'object') {\n for (const [name, resource] of Object.entries(registeredResources as Record<string, Record<string, unknown>>)) {\n if (typeof resource['readCallback'] === 'function') {\n resource['readCallback'] = createWrappedHandler(\n resource['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Resource templates: MCP SDK calls registeredResourceTemplate.readCallback\n const registeredResourceTemplates = server['_registeredResourceTemplates'];\n if (registeredResourceTemplates && typeof registeredResourceTemplates === 'object') {\n for (const [name, template] of Object.entries(\n registeredResourceTemplates as Record<string, Record<string, unknown>>,\n )) {\n if (typeof template['readCallback'] === 'function') {\n template['readCallback'] = createWrappedHandler(\n template['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Prompts: MCP SDK calls registeredPrompt.handler\n const registeredPrompts = server['_registeredPrompts'];\n if (registeredPrompts && typeof registeredPrompts === 'object') {\n for (const [name, prompt] of Object.entries(registeredPrompts as Record<string, Record<string, unknown>>)) {\n if (typeof prompt['handler'] === 'function') {\n prompt['handler'] = createWrappedHandler(prompt['handler'] as MCPHandler, 'registerPrompt', name);\n }\n }\n }\n}\n"],"names":["fill","DEBUG_BUILD","debug","captureError"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"internal.js","sources":["../../../src/metrics/internal.ts"],"sourcesContent":["import { type RawAttributes, serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport type { Integration } from '../types/integration';\nimport type { Metric, SerializedMetric } from '../types/metric';\nimport type { User } from '../types/user';\nimport { debug } from '../utils/debug-logger';\nimport { getCombinedScopeData } from '../utils/scopeData';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { getSequenceAttribute } from '../utils/timestampSequence';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { createMetricEnvelope } from './envelope';\n\nconst MAX_METRIC_BUFFER_SIZE = 1000;\n\n/**\n * Sets a metric attribute if the value exists and the attribute key is not already present.\n *\n * @param metricAttributes - The metric attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setMetricAttribute(\n metricAttributes: Record<string, unknown>,\n key: string,\n value: unknown,\n setEvenIfPresent = true,\n): void {\n if (value && (setEvenIfPresent || !(key in metricAttributes))) {\n metricAttributes[key] = value;\n }\n}\n\n/**\n * Captures a serialized metric event and adds it to the metric buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedMetric - The serialized metric event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedMetric(client: Client, serializedMetric: SerializedMetric): void {\n const bufferMap = _getBufferMap();\n const metricBuffer = _INTERNAL_getMetricBuffer(client);\n\n if (metricBuffer === undefined) {\n bufferMap.set(client, [serializedMetric]);\n } else {\n if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) {\n _INTERNAL_flushMetricsBuffer(client, metricBuffer);\n bufferMap.set(client, [serializedMetric]);\n } else {\n bufferMap.set(client, [...metricBuffer, serializedMetric]);\n }\n }\n}\n\n/**\n * Options for capturing a metric internally.\n */\nexport interface InternalCaptureMetricOptions {\n /**\n * The scope to capture the metric with.\n */\n scope?: Scope;\n\n /**\n * A function to capture the serialized metric.\n */\n captureSerializedMetric?: (client: Client, metric: SerializedMetric) => void;\n}\n\n/**\n * Enriches metric with all contextual attributes (user, SDK metadata, replay, etc.)\n */\nfunction _enrichMetricAttributes(beforeMetric: Metric, client: Client, user: User): Metric {\n const { release, environment } = client.getOptions();\n\n const processedMetricAttributes = {\n ...beforeMetric.attributes,\n };\n\n // Add user attributes\n setMetricAttribute(processedMetricAttributes, 'user.id', user.id, false);\n setMetricAttribute(processedMetricAttributes, 'user.email', user.email, false);\n setMetricAttribute(processedMetricAttributes, 'user.name', user.username, false);\n\n // Add Sentry metadata\n setMetricAttribute(processedMetricAttributes, 'sentry.release', release);\n setMetricAttribute(processedMetricAttributes, 'sentry.environment', environment);\n\n // Add SDK metadata\n const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.name', name);\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.version', version);\n\n // Add replay metadata\n const replay = client.getIntegrationByName<\n Integration & {\n getReplayId: (onlyIfSampled?: boolean) => string;\n getRecordingMode: () => 'session' | 'buffer' | undefined;\n }\n >('Replay');\n\n const replayId = replay?.getReplayId(true);\n setMetricAttribute(processedMetricAttributes, 'sentry.replay_id', replayId);\n\n if (replayId && replay?.getRecordingMode() === 'buffer') {\n setMetricAttribute(processedMetricAttributes, 'sentry._internal.replay_is_buffering', true);\n }\n\n return {\n ...beforeMetric,\n attributes: processedMetricAttributes,\n };\n}\n\n/**\n * Creates a serialized metric ready to be sent to Sentry.\n */\nfunction _buildSerializedMetric(\n metric: Metric,\n client: Client,\n currentScope: Scope,\n scopeAttributes: RawAttributes<Record<string, unknown>> | undefined,\n): SerializedMetric {\n // Get trace context\n const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n const span = _getSpanForScope(currentScope);\n const traceId = span ? span.spanContext().traceId : traceContext?.trace_id;\n const spanId = span ? span.spanContext().spanId : undefined;\n\n const timestamp = timestampInSeconds();\n const sequenceAttr = getSequenceAttribute(timestamp);\n\n return {\n timestamp,\n trace_id: traceId ?? '',\n span_id: spanId,\n name: metric.name,\n type: metric.type,\n unit: metric.unit,\n value: metric.value,\n attributes: {\n ...serializeAttributes(scopeAttributes),\n ...serializeAttributes(metric.attributes, 'skip-undefined'),\n [sequenceAttr.key]: sequenceAttr.value,\n },\n };\n}\n\n/**\n * Captures a metric event and sends it to Sentry.\n *\n * @param metric - The metric event to capture.\n * @param options - Options for capturing the metric.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureMetric(beforeMetric: Metric, options?: InternalCaptureMetricOptions): void {\n const currentScope = options?.scope ?? getCurrentScope();\n const captureSerializedMetric = options?.captureSerializedMetric ?? _INTERNAL_captureSerializedMetric;\n const client = currentScope?.getClient() ?? getClient();\n if (!client) {\n DEBUG_BUILD && debug.warn('No client available to capture metric.');\n return;\n }\n\n const { _experiments, enableMetrics, beforeSendMetric } = client.getOptions();\n\n // todo(v11): Remove the experimental flag\n // eslint-disable-next-line deprecation/deprecation\n const metricsEnabled = enableMetrics ?? _experiments?.enableMetrics ?? true;\n\n if (!metricsEnabled) {\n DEBUG_BUILD && debug.warn('metrics option not enabled, metric will not be captured.');\n return;\n }\n\n // Enrich metric with contextual attributes\n const { user, attributes: scopeAttributes } = getCombinedScopeData(getIsolationScope(), currentScope);\n const enrichedMetric = _enrichMetricAttributes(beforeMetric, client, user);\n\n client.emit('processMetric', enrichedMetric);\n\n // todo(v11): Remove the experimental `beforeSendMetric`\n // eslint-disable-next-line deprecation/deprecation\n const beforeSendCallback = beforeSendMetric || _experiments?.beforeSendMetric;\n const processedMetric = beforeSendCallback ? beforeSendCallback(enrichedMetric) : enrichedMetric;\n\n if (!processedMetric) {\n DEBUG_BUILD && debug.log('`beforeSendMetric` returned `null`, will not send metric.');\n return;\n }\n\n const serializedMetric = _buildSerializedMetric(processedMetric, client, currentScope, scopeAttributes);\n\n DEBUG_BUILD && debug.log('[Metric]', serializedMetric);\n\n captureSerializedMetric(client, serializedMetric);\n\n client.emit('afterCaptureMetric', processedMetric);\n}\n\n/**\n * Flushes the metrics buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeMetricBuffer - A metric buffer. Uses the metric buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushMetricsBuffer(client: Client, maybeMetricBuffer?: Array<SerializedMetric>): void {\n const metricBuffer = maybeMetricBuffer ?? _INTERNAL_getMetricBuffer(client) ?? [];\n if (metricBuffer.length === 0) {\n return;\n }\n\n const clientOptions = client.getOptions();\n const envelope = createMetricEnvelope(\n metricBuffer,\n clientOptions._metadata,\n clientOptions.tunnel,\n client.getDsn(),\n client.getDataCollectionOptions().userInfo,\n );\n\n // Clear the metric buffer after envelopes have been constructed.\n _getBufferMap().set(client, []);\n\n client.emit('flushMetrics');\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the metric buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the metric buffer for.\n * @returns The metric buffer for the given client.\n */\nexport function _INTERNAL_getMetricBuffer(client: Client): Array<SerializedMetric> | undefined {\n return _getBufferMap().get(client);\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedMetric>> {\n // The reference to the Client <> MetricBuffer map is stored on the carrier to ensure it's always the same\n return getGlobalSingleton('clientToMetricBufferMap', () => new WeakMap<Client, Array<SerializedMetric>>());\n}\n"],"names":["_getTraceInfoFromScope","_getSpanForScope","timestampInSeconds","getSequenceAttribute","serializeAttributes","getCurrentScope","getClient","DEBUG_BUILD","debug","getCombinedScopeData","getIsolationScope","envelope","createMetricEnvelope","getGlobalSingleton"],"mappings":";;;;;;;;;;;;;;AAiBA,MAAM,sBAAA,GAAyB,GAAA;AAU/B,SAAS,kBAAA,CACP,gBAAA,EACA,GAAA,EACA,KAAA,EACA,mBAAmB,IAAA,EACb;AACN,EAAA,IAAI,KAAA,KAAU,gBAAA,IAAoB,EAAE,GAAA,IAAO,gBAAA,CAAA,CAAA,EAAoB;AAC7D,IAAA,gBAAA,CAAiB,GAAG,CAAA,GAAI,KAAA;AAAA,EAC1B;AACF;AAWO,SAAS,iCAAA,CAAkC,QAAgB,gBAAA,EAA0C;AAC1G,EAAA,MAAM,YAAY,aAAA,EAAc;AAChC,EAAA,MAAM,YAAA,GAAe,0BAA0B,MAAM,CAAA;AAErD,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,CAAC,gBAAgB,CAAC,CAAA;AAAA,EAC1C,CAAA,MAAO;AACL,IAAA,IAAI,YAAA,CAAa,UAAU,sBAAA,EAAwB;AACjD,MAAA,4BAAA,CAA6B,QAAQ,YAAY,CAAA;AACjD,MAAA,SAAA,CAAU,GAAA,CAAI,MAAA,EAAQ,CAAC,gBAAgB,CAAC,CAAA;AAAA,IAC1C,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,IAAI,MAAA,EAAQ,CAAC,GAAG,YAAA,EAAc,gBAAgB,CAAC,CAAA;AAAA,IAC3D;AAAA,EACF;AACF;AAoBA,SAAS,uBAAA,CAAwB,YAAA,EAAsB,MAAA,EAAgB,IAAA,EAAoB;AACzF,EAAA,MAAM,EAAE,OAAA,EAAS,WAAA,EAAY,GAAI,OAAO,UAAA,EAAW;AAEnD,EAAA,MAAM,yBAAA,GAA4B;AAAA,IAChC,GAAG,YAAA,CAAa;AAAA,GAClB;AAGA,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,SAAA,EAAW,IAAA,CAAK,EAAA,EAAI,KAAK,CAAA;AACvE,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,YAAA,EAAc,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAC7E,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,WAAA,EAAa,IAAA,CAAK,QAAA,EAAU,KAAK,CAAA;AAG/E,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,kBAAkB,OAAO,CAAA;AACvE,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,sBAAsB,WAAW,CAAA;AAG/E,EAAA,MAAM,EAAE,MAAM,OAAA,EAAQ,GAAI,OAAO,cAAA,EAAe,EAAG,OAAO,EAAC;AAC3D,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,mBAAmB,IAAI,CAAA;AACrE,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,sBAAsB,OAAO,CAAA;AAG3E,EAAA,MAAM,MAAA,GAAS,MAAA,CAAO,oBAAA,CAKpB,QAAQ,CAAA;AAEV,EAAA,MAAM,QAAA,GAAW,MAAA,EAAQ,WAAA,CAAY,IAAI,CAAA;AACzC,EAAA,kBAAA,CAAmB,yBAAA,EAA2B,oBAAoB,QAAQ,CAAA;AAE1E,EAAA,IAAI,QAAA,IAAY,MAAA,EAAQ,gBAAA,EAAiB,KAAM,QAAA,EAAU;AACvD,IAAA,kBAAA,CAAmB,yBAAA,EAA2B,wCAAwC,IAAI,CAAA;AAAA,EAC5F;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,YAAA;AAAA,IACH,UAAA,EAAY;AAAA,GACd;AACF;AAKA,SAAS,sBAAA,CACP,MAAA,EACA,MAAA,EACA,YAAA,EACA,eAAA,EACkB;AAElB,EAAA,MAAM,GAAG,YAAY,CAAA,GAAIA,gCAAA,CAAuB,QAAQ,YAAY,CAAA;AACpE,EAAA,MAAM,IAAA,GAAOC,6BAAiB,YAAY,CAAA;AAC1C,EAAA,MAAM,UAAU,IAAA,GAAO,IAAA,CAAK,WAAA,EAAY,CAAE,UAAU,YAAA,EAAc,QAAA;AAClE,EAAA,MAAM,MAAA,GAAS,IAAA,GAAO,IAAA,CAAK,WAAA,GAAc,MAAA,GAAS,MAAA;AAElD,EAAA,MAAM,YAAYC,uBAAA,EAAmB;AACrC,EAAA,MAAM,YAAA,GAAeC,uCAAqB,SAAS,CAAA;AAEnD,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,UAAU,OAAA,IAAW,EAAA;AAAA,IACrB,OAAA,EAAS,MAAA;AAAA,IACT,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,OAAO,MAAA,CAAO,KAAA;AAAA,IACd,UAAA,EAAY;AAAA,MACV,GAAGC,+BAAoB,eAAe,CAAA;AAAA,MACtC,GAAGA,8BAAA,CAAoB,MAAA,CAAO,UAAA,EAAY,gBAAgB,CAAA;AAAA,MAC1D,CAAC,YAAA,CAAa,GAAG,GAAG,YAAA,CAAa;AAAA;AACnC,GACF;AACF;AAWO,SAAS,uBAAA,CAAwB,cAAsB,OAAA,EAA8C;AAC1G,EAAA,MAAM,YAAA,GAAe,OAAA,EAAS,KAAA,IAASC,6BAAA,EAAgB;AACvD,EAAA,MAAM,uBAAA,GAA0B,SAAS,uBAAA,IAA2B,iCAAA;AACpE,EAAA,MAAM,MAAA,GAAS,YAAA,EAAc,SAAA,EAAU,IAAKC,uBAAA,EAAU;AACtD,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAAC,sBAAA,IAAeC,iBAAA,CAAM,KAAK,wCAAwC,CAAA;AAClE,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,YAAA,EAAc,aAAA,EAAe,gBAAA,EAAiB,GAAI,OAAO,UAAA,EAAW;AAI5E,EAAA,MAAM,cAAA,GAAiB,aAAA,IAAiB,YAAA,EAAc,aAAA,IAAiB,IAAA;AAEvE,EAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,IAAAD,sBAAA,IAAeC,iBAAA,CAAM,KAAK,0DAA0D,CAAA;AACpF,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,EAAE,MAAM,UAAA,EAAY,eAAA,KAAoBC,8BAAA,CAAqBC,+BAAA,IAAqB,YAAY,CAAA;AACpG,EAAA,MAAM,cAAA,GAAiB,uBAAA,CAAwB,YAAA,EAAc,MAAA,EAAQ,IAAI,CAAA;AAEzE,EAAA,MAAA,CAAO,IAAA,CAAK,iBAAiB,cAAc,CAAA;AAI3C,EAAA,MAAM,kBAAA,GAAqB,oBAAoB,YAAA,EAAc,gBAAA;AAC7D,EAAA,MAAM,eAAA,GAAkB,kBAAA,GAAqB,kBAAA,CAAmB,cAAc,CAAA,GAAI,cAAA;AAElF,EAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,IAAAH,sBAAA,IAAeC,iBAAA,CAAM,IAAI,2DAA2D,CAAA;AACpF,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,gBAAA,GAAmB,sBAAA,CAAuB,eAAA,EAAiB,MAAA,EAAQ,cAAc,eAAe,CAAA;AAEtG,EAAAD,sBAAA,IAAeC,iBAAA,CAAM,GAAA,CAAI,UAAA,EAAY,gBAAgB,CAAA;AAErD,EAAA,uBAAA,CAAwB,QAAQ,gBAAgB,CAAA;AAEhD,EAAA,MAAA,CAAO,IAAA,CAAK,sBAAsB,eAAe,CAAA;AACnD;AAWO,SAAS,4BAAA,CAA6B,QAAgB,iBAAA,EAAmD;AAC9G,EAAA,MAAM,YAAA,GAAe,iBAAA,IAAqB,yBAAA,CAA0B,MAAM,KAAK,EAAC;AAChF,EAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAA,EAAW;AACxC,EAAA,MAAMG,UAAA,GAAWC,6BAAA;AAAA,IACf,YAAA;AAAA,IACA,aAAA,CAAc,SAAA;AAAA,IACd,aAAA,CAAc,MAAA;AAAA,IACd,OAAO,MAAA,EAAO;AAAA,IACd,MAAA,CAAO,0BAAyB,CAAE;AAAA,GACpC;AAGA,EAAA,aAAA,EAAc,CAAE,GAAA,CAAI,MAAA,EAAQ,EAAE,CAAA;AAE9B,EAAA,MAAA,CAAO,KAAK,cAAc,CAAA;AAI1B,EAAA,MAAA,CAAO,aAAaD,UAAQ,CAAA;AAC9B;AAUO,SAAS,0BAA0B,MAAA,EAAqD;AAC7F,EAAA,OAAO,aAAA,EAAc,CAAE,GAAA,CAAI,MAAM,CAAA;AACnC;AAEA,SAAS,aAAA,GAA0D;AAEjE,EAAA,OAAOE,0BAAA,CAAmB,yBAAA,EAA2B,sBAAM,IAAI,SAA0C,CAAA;AAC3G;;;;;;;"}
{"version":3,"file":"internal.js","sources":["../../../src/metrics/internal.ts"],"sourcesContent":["import { type RawAttributes, serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport type { Integration } from '../types/integration';\nimport type { Metric, SerializedMetric } from '../types/metric';\nimport type { User } from '../types/user';\nimport { debug } from '../utils/debug-logger';\nimport { getCombinedScopeData } from '../utils/scopeData';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { getSequenceAttribute } from '../utils/timestampSequence';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { createMetricEnvelope } from './envelope';\n\nconst MAX_METRIC_BUFFER_SIZE = 1000;\n\n/**\n * Sets a metric attribute if the value exists and the attribute key is not already present.\n *\n * @param metricAttributes - The metric attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setMetricAttribute(\n metricAttributes: Record<string, unknown>,\n key: string,\n value: unknown,\n setEvenIfPresent = true,\n): void {\n if (value && (setEvenIfPresent || !(key in metricAttributes))) {\n metricAttributes[key] = value;\n }\n}\n\n/**\n * Captures a serialized metric event and adds it to the metric buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedMetric - The serialized metric event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedMetric(client: Client, serializedMetric: SerializedMetric): void {\n const bufferMap = _getBufferMap();\n const metricBuffer = _INTERNAL_getMetricBuffer(client);\n\n if (metricBuffer === undefined) {\n bufferMap.set(client, [serializedMetric]);\n } else {\n if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) {\n _INTERNAL_flushMetricsBuffer(client, metricBuffer);\n bufferMap.set(client, [serializedMetric]);\n } else {\n bufferMap.set(client, [...metricBuffer, serializedMetric]);\n }\n }\n}\n\n/**\n * Options for capturing a metric internally.\n */\nexport interface InternalCaptureMetricOptions {\n /**\n * The scope to capture the metric with.\n */\n scope?: Scope;\n\n /**\n * A function to capture the serialized metric.\n */\n captureSerializedMetric?: (client: Client, metric: SerializedMetric) => void;\n}\n\n/**\n * Enriches metric with all contextual attributes (user, SDK metadata, replay, etc.)\n */\nfunction _enrichMetricAttributes(beforeMetric: Metric, client: Client, user: User): Metric {\n const { release, environment } = client.getOptions();\n\n const processedMetricAttributes = {\n ...beforeMetric.attributes,\n };\n\n // Add user attributes\n setMetricAttribute(processedMetricAttributes, 'user.id', user.id, false);\n setMetricAttribute(processedMetricAttributes, 'user.email', user.email, false);\n setMetricAttribute(processedMetricAttributes, 'user.name', user.username, false);\n\n // Add Sentry metadata\n setMetricAttribute(processedMetricAttributes, 'sentry.release', release);\n setMetricAttribute(processedMetricAttributes, 'sentry.environment', environment);\n\n // Add SDK metadata\n const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.name', name);\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.version', version);\n\n // Add replay metadata\n const replay = client.getIntegrationByName<\n Integration & {\n getReplayId: (onlyIfSampled?: boolean) => string;\n getRecordingMode: () => 'session' | 'buffer' | undefined;\n }\n >('Replay');\n\n const replayId = replay?.getReplayId(true);\n setMetricAttribute(processedMetricAttributes, 'sentry.replay_id', replayId);\n\n if (replayId && replay?.getRecordingMode() === 'buffer') {\n setMetricAttribute(processedMetricAttributes, 'sentry._internal.replay_is_buffering', true);\n }\n\n return {\n ...beforeMetric,\n attributes: processedMetricAttributes,\n };\n}\n\n/**\n * Creates a serialized metric ready to be sent to Sentry.\n */\nfunction _buildSerializedMetric(\n metric: Metric,\n client: Client,\n currentScope: Scope,\n scopeAttributes: RawAttributes<Record<string, unknown>> | undefined,\n): SerializedMetric {\n // Get trace context\n const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n const span = _getSpanForScope(currentScope);\n const traceId = span ? span.spanContext().traceId : traceContext?.trace_id;\n const spanId = span ? span.spanContext().spanId : undefined;\n\n const timestamp = timestampInSeconds();\n const sequenceAttr = getSequenceAttribute(timestamp);\n\n return {\n timestamp,\n trace_id: traceId ?? '',\n span_id: spanId,\n name: metric.name,\n type: metric.type,\n unit: metric.unit,\n value: metric.value,\n attributes: {\n ...serializeAttributes(scopeAttributes),\n ...serializeAttributes(metric.attributes, 'skip-undefined'),\n [sequenceAttr.key]: sequenceAttr.value,\n },\n };\n}\n\n/**\n * Captures a metric event and sends it to Sentry.\n *\n * @param metric - The metric event to capture.\n * @param options - Options for capturing the metric.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureMetric(beforeMetric: Metric, options?: InternalCaptureMetricOptions): void {\n const currentScope = options?.scope ?? getCurrentScope();\n const captureSerializedMetric = options?.captureSerializedMetric ?? _INTERNAL_captureSerializedMetric;\n const client = currentScope?.getClient() ?? getClient();\n if (!client) {\n DEBUG_BUILD && debug.warn('No client available to capture metric.');\n return;\n }\n\n const { _experiments, enableMetrics, beforeSendMetric } = client.getOptions();\n\n // todo(v11): Remove the experimental flag\n // eslint-disable-next-line typescript/no-deprecated\n const metricsEnabled = enableMetrics ?? _experiments?.enableMetrics ?? true;\n\n if (!metricsEnabled) {\n DEBUG_BUILD && debug.warn('metrics option not enabled, metric will not be captured.');\n return;\n }\n\n // Enrich metric with contextual attributes\n const { user, attributes: scopeAttributes } = getCombinedScopeData(getIsolationScope(), currentScope);\n const enrichedMetric = _enrichMetricAttributes(beforeMetric, client, user);\n\n client.emit('processMetric', enrichedMetric);\n\n // todo(v11): Remove the experimental `beforeSendMetric`\n // eslint-disable-next-line typescript/no-deprecated\n const beforeSendCallback = beforeSendMetric || _experiments?.beforeSendMetric;\n const processedMetric = beforeSendCallback ? beforeSendCallback(enrichedMetric) : enrichedMetric;\n\n if (!processedMetric) {\n DEBUG_BUILD && debug.log('`beforeSendMetric` returned `null`, will not send metric.');\n return;\n }\n\n const serializedMetric = _buildSerializedMetric(processedMetric, client, currentScope, scopeAttributes);\n\n DEBUG_BUILD && debug.log('[Metric]', serializedMetric);\n\n captureSerializedMetric(client, serializedMetric);\n\n client.emit('afterCaptureMetric', processedMetric);\n}\n\n/**\n * Flushes the metrics buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeMetricBuffer - A metric buffer. Uses the metric buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushMetricsBuffer(client: Client, maybeMetricBuffer?: Array<SerializedMetric>): void {\n const metricBuffer = maybeMetricBuffer ?? _INTERNAL_getMetricBuffer(client) ?? [];\n if (metricBuffer.length === 0) {\n return;\n }\n\n const clientOptions = client.getOptions();\n const envelope = createMetricEnvelope(\n metricBuffer,\n clientOptions._metadata,\n clientOptions.tunnel,\n client.getDsn(),\n client.getDataCollectionOptions().userInfo,\n );\n\n // Clear the metric buffer after envelopes have been constructed.\n _getBufferMap().set(client, []);\n\n client.emit('flushMetrics');\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the metric buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the metric buffer for.\n * @returns The metric buffer for the given client.\n */\nexport function _INTERNAL_getMetricBuffer(client: Client): Array<SerializedMetric> | undefined {\n return _getBufferMap().get(client);\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedMetric>> {\n // The reference to the Client <> MetricBuffer map is stored on the carrier to ensure it's always the same\n return getGlobalSingleton('clientToMetricBufferMap', () => new WeakMap<Client, Array<SerializedMetric>>());\n}\n"],"names":["_getTraceInfoFromScope","_getSpanForScope","timestampInSeconds","getSequenceAttribute","serializeAttributes","getCurrentScope","getClient","DEBUG_BUILD","debug","getCombinedScopeData","getIsolationScope","envelope","createMetricEnvelope","getGlobalSingleton"],"mappings":"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"}

@@ -19,4 +19,10 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

function shouldEnableTruncation(enableTruncation) {
if (enableTruncation !== void 0) {
return enableTruncation;
}
const client = currentScopes.getClient();
return enableTruncation ?? !(client && hasSpanStreamingEnabled.hasSpanStreamingEnabled(client));
if (!client) {
return true;
}
return !hasSpanStreamingEnabled.hasSpanStreamingEnabled(client) && !client.getOptions().streamGenAiSpans;
}

@@ -23,0 +29,0 @@ function buildMethodPath(currentPath, prop) {

@@ -1,1 +0,1 @@

{"version":3,"file":"utils.js","sources":["../../../../src/tracing/ai/utils.ts"],"sourcesContent":["/**\n * Shared utils for AI integrations (OpenAI, Anthropic, Verce.AI, etc.)\n */\nimport { captureException } from '../../exports';\nimport { getClient } from '../../currentScopes';\nimport { hasSpanStreamingEnabled } from '../spans/hasSpanStreamingEnabled';\nimport type { Span } from '../../types/span';\nimport { isThenable } from '../../utils/is';\nimport {\n GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE,\n GEN_AI_RESPONSE_ID_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_STREAMING_ATTRIBUTE,\n GEN_AI_RESPONSE_TEXT_ATTRIBUTE,\n GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from './gen-ai-attributes';\nimport { truncateGenAiMessages, truncateGenAiStringInput } from './messageTruncation';\n\nexport interface AIRecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\n/**\n * A method registry entry describes a single instrumented method:\n * which gen_ai operation it maps to and whether it is intrinsically streaming.\n */\nexport interface InstrumentedMethodEntry {\n /** Operation name (e.g. 'chat', 'embeddings', 'generate_content'). Omit for factory methods that only need result proxying. */\n operation?: string;\n /** True if the method itself is always streaming (not param-based) */\n streaming?: boolean;\n /** When set, the method's return value is re-proxied with this as the base path */\n proxyResultPath?: string;\n}\n\n/**\n * Maps method paths to their registry entries.\n * Used by proxy-based AI client instrumentations to determine which methods\n * to instrument, what operation name to use, and whether they stream.\n */\nexport type InstrumentedMethodRegistry = Record<string, InstrumentedMethodEntry>;\n\n/**\n * Resolves AI recording options by falling back to the client's `dataCollection.genAI` settings.\n * Precedence: explicit option > dataCollection.genAI > sendDefaultPii > false\n */\nexport function resolveAIRecordingOptions<T extends AIRecordingOptions>(options?: T): T & Required<AIRecordingOptions> {\n const genAI = getClient()?.getDataCollectionOptions().genAI;\n return {\n ...options,\n recordInputs: options?.recordInputs ?? genAI?.inputs ?? false,\n recordOutputs: options?.recordOutputs ?? genAI?.outputs ?? false,\n } as T & Required<AIRecordingOptions>;\n}\n\n/**\n * Resolves whether truncation should be enabled.\n * If the user explicitly set `enableTruncation`, that value is used.\n * Otherwise, truncation is disabled when span streaming is active.\n */\nexport function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean {\n const client = getClient();\n return enableTruncation ?? !(client && hasSpanStreamingEnabled(client));\n}\n\n/**\n * Build method path from current traversal\n */\nexport function buildMethodPath(currentPath: string, prop: string): string {\n return currentPath ? `${currentPath}.${prop}` : prop;\n}\n\n/**\n * Set token usage attributes\n * @param span - The span to add attributes to\n * @param promptTokens - The number of prompt tokens\n * @param completionTokens - The number of completion tokens\n * @param cachedInputTokens - The number of cached input tokens\n * @param cachedOutputTokens - The number of cached output tokens\n */\nexport function setTokenUsageAttributes(\n span: Span,\n promptTokens?: number,\n completionTokens?: number,\n cachedInputTokens?: number,\n cachedOutputTokens?: number,\n): void {\n if (promptTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens,\n });\n }\n if (completionTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens,\n });\n }\n if (\n promptTokens !== undefined ||\n completionTokens !== undefined ||\n cachedInputTokens !== undefined ||\n cachedOutputTokens !== undefined\n ) {\n /**\n * Total input tokens in a request is the summation of `input_tokens`,\n * `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n */\n const totalTokens =\n (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);\n\n span.setAttributes({\n [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens,\n });\n }\n}\n\nexport interface StreamResponseState {\n responseId?: string;\n responseModel?: string;\n finishReasons: string[];\n responseTexts: string[];\n toolCalls: unknown[];\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n}\n\n/**\n * Ends a streaming span by setting all accumulated response attributes and ending the span.\n * Shared across OpenAI, Anthropic, and Google GenAI streaming implementations.\n */\nexport function endStreamSpan(span: Span, state: StreamResponseState, recordOutputs: boolean): void {\n if (!span.isRecording()) {\n return;\n }\n\n const attrs: Record<string, string | number | boolean> = {\n [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n };\n\n if (state.responseId) attrs[GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;\n if (state.responseModel) attrs[GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;\n\n if (state.promptTokens !== undefined) attrs[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;\n if (state.completionTokens !== undefined) attrs[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;\n\n // Use explicit total if provided (OpenAI, Google), otherwise compute from cache tokens (Anthropic)\n if (state.totalTokens !== undefined) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;\n } else if (\n state.promptTokens !== undefined ||\n state.completionTokens !== undefined ||\n state.cacheCreationInputTokens !== undefined ||\n state.cacheReadInputTokens !== undefined\n ) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n (state.promptTokens ?? 0) +\n (state.completionTokens ?? 0) +\n (state.cacheCreationInputTokens ?? 0) +\n (state.cacheReadInputTokens ?? 0);\n }\n\n if (state.finishReasons.length) {\n attrs[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);\n }\n if (recordOutputs && state.responseTexts.length) {\n attrs[GEN_AI_RESPONSE_TEXT_ATTRIBUTE] = state.responseTexts.join('');\n }\n if (recordOutputs && state.toolCalls.length) {\n attrs[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE] = JSON.stringify(state.toolCalls);\n }\n\n span.setAttributes(attrs);\n span.end();\n}\n\n/**\n * Serialize a value to a JSON string without truncation.\n * Strings are returned as-is, arrays and objects are JSON-stringified.\n */\nexport function getJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n\n/**\n * Get the truncated JSON string for a string or array of strings.\n *\n * @param value - The string or array of strings to truncate\n * @returns The truncated JSON string\n */\nexport function getTruncatedJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n // Some values are already JSON strings, so we don't need to duplicate the JSON parsing\n return truncateGenAiStringInput(value);\n }\n if (Array.isArray(value)) {\n // truncateGenAiMessages returns an array of strings, so we need to stringify it\n const truncatedMessages = truncateGenAiMessages(value);\n return JSON.stringify(truncatedMessages);\n }\n // value is an object, so we need to stringify it\n return JSON.stringify(value);\n}\n\n/**\n * Extract system instructions from messages array.\n * Finds the first system message and formats it according to OpenTelemetry semantic conventions.\n *\n * @param messages - Array of messages to extract system instructions from\n * @returns systemInstructions (JSON string) and filteredMessages (without system message)\n */\nexport function extractSystemInstructions(messages: unknown[] | unknown): {\n systemInstructions: string | undefined;\n filteredMessages: unknown[] | unknown;\n} {\n if (!Array.isArray(messages)) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessageIndex = messages.findIndex(\n msg => msg && typeof msg === 'object' && 'role' in msg && (msg as { role: string }).role === 'system',\n );\n\n if (systemMessageIndex === -1) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessage = messages[systemMessageIndex] as { role: string; content?: string | unknown };\n const systemContent =\n typeof systemMessage.content === 'string'\n ? systemMessage.content\n : systemMessage.content !== undefined\n ? JSON.stringify(systemMessage.content)\n : undefined;\n\n if (!systemContent) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemInstructions = JSON.stringify([{ type: 'text', content: systemContent }]);\n const filteredMessages = [...messages.slice(0, systemMessageIndex), ...messages.slice(systemMessageIndex + 1)];\n\n return { systemInstructions, filteredMessages };\n}\n\n/**\n * Creates a wrapped version of .withResponse() that replaces the data field\n * with the instrumented result while preserving metadata (response, request_id).\n */\nasync function createWithResponseWrapper<T>(\n originalWithResponse: Promise<unknown>,\n instrumentedPromise: Promise<T>,\n mechanismType: string,\n): Promise<unknown> {\n // Attach catch handler to originalWithResponse immediately to prevent unhandled rejection\n // If instrumentedPromise rejects first, we still need this handled\n const safeOriginalWithResponse = originalWithResponse.catch(error => {\n captureException(error, {\n mechanism: {\n handled: false,\n type: mechanismType,\n },\n });\n throw error;\n });\n\n const instrumentedResult = await instrumentedPromise;\n const originalWrapper = await safeOriginalWithResponse;\n\n // Combine instrumented result with original metadata\n if (originalWrapper && typeof originalWrapper === 'object' && 'data' in originalWrapper) {\n return {\n ...originalWrapper,\n data: instrumentedResult,\n };\n }\n return instrumentedResult;\n}\n\n/**\n * Wraps a promise-like object to preserve additional methods (like .withResponse())\n * that AI SDK clients (OpenAI, Anthropic) attach to their APIPromise return values.\n *\n * Standard Promise methods (.then, .catch, .finally) are routed to the instrumented\n * promise to preserve Sentry's span instrumentation, while custom SDK methods are\n * forwarded to the original promise to maintain the SDK's API surface.\n */\nexport function wrapPromiseWithMethods<R>(\n originalPromiseLike: Promise<R>,\n instrumentedPromise: Promise<R>,\n mechanismType: string,\n): Promise<R> {\n // If the original result is not thenable, return the instrumented promise\n if (!isThenable(originalPromiseLike)) {\n return instrumentedPromise;\n }\n\n // Create a proxy that forwards Promise methods to instrumentedPromise\n // and preserves additional methods from the original result\n return new Proxy(originalPromiseLike, {\n get(target: object, prop: string | symbol): unknown {\n // For standard Promise methods (.then, .catch, .finally, Symbol.toStringTag),\n // use instrumentedPromise to preserve Sentry instrumentation.\n // For custom methods (like .withResponse()), use the original target.\n const useInstrumentedPromise = prop in Promise.prototype || prop === Symbol.toStringTag;\n const source = useInstrumentedPromise ? instrumentedPromise : target;\n\n const value = Reflect.get(source, prop) as unknown;\n\n // Special handling for .withResponse() to preserve instrumentation\n // .withResponse() returns { data: T, response: Response, request_id: string }\n if (prop === 'withResponse' && typeof value === 'function') {\n return function wrappedWithResponse(this: unknown): unknown {\n const originalWithResponse = (value as (...args: unknown[]) => unknown).call(target);\n return createWithResponseWrapper(originalWithResponse, instrumentedPromise, mechanismType);\n };\n }\n\n return typeof value === 'function' ? value.bind(source) : value;\n },\n }) as Promise<R>;\n}\n"],"names":["getClient","hasSpanStreamingEnabled","GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE","GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE","GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE","GEN_AI_RESPONSE_STREAMING_ATTRIBUTE","GEN_AI_RESPONSE_ID_ATTRIBUTE","GEN_AI_RESPONSE_MODEL_ATTRIBUTE","GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE","GEN_AI_RESPONSE_TEXT_ATTRIBUTE","GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE","truncateGenAiStringInput","truncateGenAiMessages","captureException","isThenable"],"mappings":"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"}
{"version":3,"file":"utils.js","sources":["../../../../src/tracing/ai/utils.ts"],"sourcesContent":["/**\n * Shared utils for AI integrations (OpenAI, Anthropic, Verce.AI, etc.)\n */\nimport { captureException } from '../../exports';\nimport { getClient } from '../../currentScopes';\nimport { hasSpanStreamingEnabled } from '../spans/hasSpanStreamingEnabled';\nimport type { Span } from '../../types/span';\nimport { isThenable } from '../../utils/is';\nimport {\n GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE,\n GEN_AI_RESPONSE_ID_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_STREAMING_ATTRIBUTE,\n GEN_AI_RESPONSE_TEXT_ATTRIBUTE,\n GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from './gen-ai-attributes';\nimport { truncateGenAiMessages, truncateGenAiStringInput } from './messageTruncation';\n\nexport interface AIRecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\n/**\n * A method registry entry describes a single instrumented method:\n * which gen_ai operation it maps to and whether it is intrinsically streaming.\n */\nexport interface InstrumentedMethodEntry {\n /** Operation name (e.g. 'chat', 'embeddings', 'generate_content'). Omit for factory methods that only need result proxying. */\n operation?: string;\n /** True if the method itself is always streaming (not param-based) */\n streaming?: boolean;\n /** When set, the method's return value is re-proxied with this as the base path */\n proxyResultPath?: string;\n}\n\n/**\n * Maps method paths to their registry entries.\n * Used by proxy-based AI client instrumentations to determine which methods\n * to instrument, what operation name to use, and whether they stream.\n */\nexport type InstrumentedMethodRegistry = Record<string, InstrumentedMethodEntry>;\n\n/**\n * Resolves AI recording options by falling back to the client's `dataCollection.genAI` settings.\n * Precedence: explicit option > dataCollection.genAI > sendDefaultPii > false\n */\nexport function resolveAIRecordingOptions<T extends AIRecordingOptions>(options?: T): T & Required<AIRecordingOptions> {\n const genAI = getClient()?.getDataCollectionOptions().genAI;\n return {\n ...options,\n recordInputs: options?.recordInputs ?? genAI?.inputs ?? false,\n recordOutputs: options?.recordOutputs ?? genAI?.outputs ?? false,\n } as T & Required<AIRecordingOptions>;\n}\n\n/**\n * Resolves whether truncation should be enabled.\n * If the user explicitly set `enableTruncation`, that value is used.\n * Otherwise, truncation is disabled whenever gen_ai spans are sent through the span streaming / v2\n * span path, i.e. full span streaming (`traceLifecycle: 'stream'`) or `streamGenAiSpans`. That path\n * is not subject to the transaction payload-size limits that truncation works around, so the full\n * message data can be retained.\n */\nexport function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean {\n if (enableTruncation !== undefined) {\n return enableTruncation;\n }\n\n const client = getClient();\n if (!client) {\n return true;\n }\n\n return !hasSpanStreamingEnabled(client) && !client.getOptions().streamGenAiSpans;\n}\n\n/**\n * Build method path from current traversal\n */\nexport function buildMethodPath(currentPath: string, prop: string): string {\n return currentPath ? `${currentPath}.${prop}` : prop;\n}\n\n/**\n * Set token usage attributes\n * @param span - The span to add attributes to\n * @param promptTokens - The number of prompt tokens\n * @param completionTokens - The number of completion tokens\n * @param cachedInputTokens - The number of cached input tokens\n * @param cachedOutputTokens - The number of cached output tokens\n */\nexport function setTokenUsageAttributes(\n span: Span,\n promptTokens?: number,\n completionTokens?: number,\n cachedInputTokens?: number,\n cachedOutputTokens?: number,\n): void {\n if (promptTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens,\n });\n }\n if (completionTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens,\n });\n }\n if (\n promptTokens !== undefined ||\n completionTokens !== undefined ||\n cachedInputTokens !== undefined ||\n cachedOutputTokens !== undefined\n ) {\n /**\n * Total input tokens in a request is the summation of `input_tokens`,\n * `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n */\n const totalTokens =\n (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);\n\n span.setAttributes({\n [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens,\n });\n }\n}\n\nexport interface StreamResponseState {\n responseId?: string;\n responseModel?: string;\n finishReasons: string[];\n responseTexts: string[];\n toolCalls: unknown[];\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n}\n\n/**\n * Ends a streaming span by setting all accumulated response attributes and ending the span.\n * Shared across OpenAI, Anthropic, and Google GenAI streaming implementations.\n */\nexport function endStreamSpan(span: Span, state: StreamResponseState, recordOutputs: boolean): void {\n if (!span.isRecording()) {\n return;\n }\n\n const attrs: Record<string, string | number | boolean> = {\n [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n };\n\n if (state.responseId) attrs[GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;\n if (state.responseModel) attrs[GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;\n\n if (state.promptTokens !== undefined) attrs[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;\n if (state.completionTokens !== undefined) attrs[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;\n\n // Use explicit total if provided (OpenAI, Google), otherwise compute from cache tokens (Anthropic)\n if (state.totalTokens !== undefined) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;\n } else if (\n state.promptTokens !== undefined ||\n state.completionTokens !== undefined ||\n state.cacheCreationInputTokens !== undefined ||\n state.cacheReadInputTokens !== undefined\n ) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n (state.promptTokens ?? 0) +\n (state.completionTokens ?? 0) +\n (state.cacheCreationInputTokens ?? 0) +\n (state.cacheReadInputTokens ?? 0);\n }\n\n if (state.finishReasons.length) {\n attrs[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);\n }\n if (recordOutputs && state.responseTexts.length) {\n attrs[GEN_AI_RESPONSE_TEXT_ATTRIBUTE] = state.responseTexts.join('');\n }\n if (recordOutputs && state.toolCalls.length) {\n attrs[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE] = JSON.stringify(state.toolCalls);\n }\n\n span.setAttributes(attrs);\n span.end();\n}\n\n/**\n * Serialize a value to a JSON string without truncation.\n * Strings are returned as-is, arrays and objects are JSON-stringified.\n */\nexport function getJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n\n/**\n * Get the truncated JSON string for a string or array of strings.\n *\n * @param value - The string or array of strings to truncate\n * @returns The truncated JSON string\n */\nexport function getTruncatedJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n // Some values are already JSON strings, so we don't need to duplicate the JSON parsing\n return truncateGenAiStringInput(value);\n }\n if (Array.isArray(value)) {\n // truncateGenAiMessages returns an array of strings, so we need to stringify it\n const truncatedMessages = truncateGenAiMessages(value);\n return JSON.stringify(truncatedMessages);\n }\n // value is an object, so we need to stringify it\n return JSON.stringify(value);\n}\n\n/**\n * Extract system instructions from messages array.\n * Finds the first system message and formats it according to OpenTelemetry semantic conventions.\n *\n * @param messages - Array of messages to extract system instructions from\n * @returns systemInstructions (JSON string) and filteredMessages (without system message)\n */\nexport function extractSystemInstructions(messages: unknown[] | unknown): {\n systemInstructions: string | undefined;\n filteredMessages: unknown[] | unknown;\n} {\n if (!Array.isArray(messages)) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessageIndex = messages.findIndex(\n msg => msg && typeof msg === 'object' && 'role' in msg && (msg as { role: string }).role === 'system',\n );\n\n if (systemMessageIndex === -1) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessage = messages[systemMessageIndex] as { role: string; content?: string | unknown };\n const systemContent =\n typeof systemMessage.content === 'string'\n ? systemMessage.content\n : systemMessage.content !== undefined\n ? JSON.stringify(systemMessage.content)\n : undefined;\n\n if (!systemContent) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemInstructions = JSON.stringify([{ type: 'text', content: systemContent }]);\n const filteredMessages = [...messages.slice(0, systemMessageIndex), ...messages.slice(systemMessageIndex + 1)];\n\n return { systemInstructions, filteredMessages };\n}\n\n/**\n * Creates a wrapped version of .withResponse() that replaces the data field\n * with the instrumented result while preserving metadata (response, request_id).\n */\nasync function createWithResponseWrapper<T>(\n originalWithResponse: Promise<unknown>,\n instrumentedPromise: Promise<T>,\n mechanismType: string,\n): Promise<unknown> {\n // Attach catch handler to originalWithResponse immediately to prevent unhandled rejection\n // If instrumentedPromise rejects first, we still need this handled\n const safeOriginalWithResponse = originalWithResponse.catch(error => {\n captureException(error, {\n mechanism: {\n handled: false,\n type: mechanismType,\n },\n });\n throw error;\n });\n\n const instrumentedResult = await instrumentedPromise;\n const originalWrapper = await safeOriginalWithResponse;\n\n // Combine instrumented result with original metadata\n if (originalWrapper && typeof originalWrapper === 'object' && 'data' in originalWrapper) {\n return {\n ...originalWrapper,\n data: instrumentedResult,\n };\n }\n return instrumentedResult;\n}\n\n/**\n * Wraps a promise-like object to preserve additional methods (like .withResponse())\n * that AI SDK clients (OpenAI, Anthropic) attach to their APIPromise return values.\n *\n * Standard Promise methods (.then, .catch, .finally) are routed to the instrumented\n * promise to preserve Sentry's span instrumentation, while custom SDK methods are\n * forwarded to the original promise to maintain the SDK's API surface.\n */\nexport function wrapPromiseWithMethods<R>(\n originalPromiseLike: Promise<R>,\n instrumentedPromise: Promise<R>,\n mechanismType: string,\n): Promise<R> {\n // If the original result is not thenable, return the instrumented promise\n if (!isThenable(originalPromiseLike)) {\n return instrumentedPromise;\n }\n\n // Create a proxy that forwards Promise methods to instrumentedPromise\n // and preserves additional methods from the original result\n return new Proxy(originalPromiseLike, {\n get(target: object, prop: string | symbol): unknown {\n // For standard Promise methods (.then, .catch, .finally, Symbol.toStringTag),\n // use instrumentedPromise to preserve Sentry instrumentation.\n // For custom methods (like .withResponse()), use the original target.\n const useInstrumentedPromise = prop in Promise.prototype || prop === Symbol.toStringTag;\n const source = useInstrumentedPromise ? instrumentedPromise : target;\n\n const value = Reflect.get(source, prop) as unknown;\n\n // Special handling for .withResponse() to preserve instrumentation\n // .withResponse() returns { data: T, response: Response, request_id: string }\n if (prop === 'withResponse' && typeof value === 'function') {\n return function wrappedWithResponse(this: unknown): unknown {\n const originalWithResponse = (value as (...args: unknown[]) => unknown).call(target);\n return createWithResponseWrapper(originalWithResponse, instrumentedPromise, mechanismType);\n };\n }\n\n return typeof value === 'function' ? value.bind(source) : value;\n },\n }) as Promise<R>;\n}\n"],"names":["getClient","hasSpanStreamingEnabled","GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE","GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE","GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE","GEN_AI_RESPONSE_STREAMING_ATTRIBUTE","GEN_AI_RESPONSE_ID_ATTRIBUTE","GEN_AI_RESPONSE_MODEL_ATTRIBUTE","GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE","GEN_AI_RESPONSE_TEXT_ATTRIBUTE","GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE","truncateGenAiStringInput","truncateGenAiMessages","captureException","isThenable"],"mappings":"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"}

@@ -11,2 +11,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const spanUtils = require('../utils/spanUtils.js');
const sentryNonRecordingSpan = require('./sentryNonRecordingSpan.js');
const utils = require('./utils.js');

@@ -56,2 +57,8 @@

}
if (sentryNonRecordingSpan.spanIsNonRecordingSpan(rootSpan) && !hasSpansEnabled.hasSpansEnabled(client.getOptions())) {
const capturedScope = utils.getCapturedScopesOnSpan(rootSpan).scope;
if (capturedScope) {
return applyLocalSampleRateToDsc({ ...getDynamicSamplingContextFromScope(client, capturedScope) });
}
}
const traceStateDsc = traceState?.get("sentry.dsc");

@@ -58,0 +65,0 @@ const dscOnTraceState = traceStateDsc && baggage.baggageHeaderToDynamicSamplingContext(traceStateDsc);

@@ -1,1 +0,1 @@

{"version":3,"file":"dynamicSamplingContext.js","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n const dsc: DynamicSamplingContext = {\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n org_id: extractOrgIdFromClient(client),\n };\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n // TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n"],"names":["addNonEnumerableProperty","DEFAULT_ENVIRONMENT","extractOrgIdFromClient","getClient","getRootSpan","spanToJSON","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE","dsc","baggageHeaderToDynamicSamplingContext","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","hasSpansEnabled","spanIsSampled","getCapturedScopesOnSpan","dynamicSamplingContextToSentryBaggageHeader"],"mappings":"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"}
{"version":3,"file":"dynamicSamplingContext.js","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n const dsc: DynamicSamplingContext = {\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n org_id: extractOrgIdFromClient(client),\n };\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For a non-recording placeholder in Tracing without Performance (TwP) mode, the DSC is not\n // carried on the span; the scope is the source of truth. Resolve it from the span's captured\n // scope: continued traces keep the incoming DSC, new traces derive it from the client.\n //\n // We gate this on `!hasSpansEnabled()` so it mirrors the `sentry-trace` source in `getTraceData`:\n // with tracing enabled, a non-recording span (e.g. an `onlyIfParent` placeholder) keeps deriving\n // its DSC from the span/client so the baggage agrees with the `-0` decision that `spanToTraceHeader`\n // encodes for `sentry-trace`. Without this guard the two headers can disagree.\n //\n // We spread into a new object so applying the local sample rate can't mutate the scope's DSC.\n if (spanIsNonRecordingSpan(rootSpan) && !hasSpansEnabled(client.getOptions())) {\n const capturedScope = getCapturedScopesOnSpan(rootSpan).scope;\n if (capturedScope) {\n return applyLocalSampleRateToDsc({ ...getDynamicSamplingContextFromScope(client, capturedScope) });\n }\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n // TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n"],"names":["addNonEnumerableProperty","DEFAULT_ENVIRONMENT","extractOrgIdFromClient","getClient","getRootSpan","spanToJSON","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE","dsc","spanIsNonRecordingSpan","hasSpansEnabled","getCapturedScopesOnSpan","baggageHeaderToDynamicSamplingContext","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","spanIsSampled","dynamicSamplingContextToSentryBaggageHeader"],"mappings":"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"}

@@ -12,3 +12,2 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const time = require('../utils/time.js');
const dynamicSamplingContext = require('./dynamicSamplingContext.js');
const sentryNonRecordingSpan = require('./sentryNonRecordingSpan.js');

@@ -18,2 +17,3 @@ const sentrySpan = require('./sentrySpan.js');

const trace = require('./trace.js');
const utils = require('./utils.js');

@@ -44,13 +44,8 @@ const TRACING_DEFAULTS = {

const client = currentScopes.getClient();
const scope = currentScopes.getCurrentScope();
if (!client || !hasSpansEnabled.hasSpansEnabled()) {
const span2 = new sentryNonRecordingSpan.SentryNonRecordingSpan();
const dsc = {
sample_rate: "0",
sampled: "false",
...dynamicSamplingContext.getDynamicSamplingContextFromSpan(span2)
};
dynamicSamplingContext.freezeDscOnSpan(span2, dsc);
const span2 = new sentryNonRecordingSpan.SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });
utils.setCapturedScopesOnSpan(span2, scope, currentScopes.getIsolationScope());
return span2;
}
const scope = currentScopes.getCurrentScope();
const previousActiveSpan = spanUtils.getActiveSpan();

@@ -63,3 +58,3 @@ const span = _startIdleSpan(startSpanOptions);

}
if (thisArg instanceof sentryNonRecordingSpan.SentryNonRecordingSpan) {
if (sentryNonRecordingSpan.spanIsNonRecordingSpan(thisArg)) {
return;

@@ -66,0 +61,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"idleSpan.js","sources":["../../../src/tracing/idleSpan.ts"],"sourcesContent":["import { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { debug } from '../utils/debug-logger';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { _setSpanForScope } from '../utils/spanOnScope';\nimport {\n getActiveSpan,\n getSpanDescendants,\n removeChildSpanFromSpan,\n spanTimeInputToSeconds,\n spanToJSON,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR, SPAN_STATUS_OK } from './spanstatus';\nimport { startInactiveSpan } from './trace';\n\nexport const TRACING_DEFAULTS = {\n idleTimeout: 1_000,\n finalTimeout: 30_000,\n childSpanTimeout: 15_000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\nconst FINISH_REASON_CANCELLED = 'cancelled';\n\n// unused\nconst FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden';\n\n// unused in this file, but used in BrowserTracing\nconst FINISH_REASON_INTERRUPTED = 'interactionInterrupted';\n\ntype IdleSpanFinishReason =\n | typeof FINISH_REASON_CANCELLED\n | typeof FINISH_REASON_DOCUMENT_HIDDEN\n | typeof FINISH_REASON_EXTERNAL_FINISH\n | typeof FINISH_REASON_FINAL_TIMEOUT\n | typeof FINISH_REASON_HEARTBEAT_FAILED\n | typeof FINISH_REASON_IDLE_TIMEOUT\n | typeof FINISH_REASON_INTERRUPTED;\n\ninterface IdleSpanOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n */\n idleTimeout: number;\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n */\n finalTimeout: number;\n /**\n * The max. time a child span may run.\n * If the time since the last span was started exceeds this time, the idle span will finish.\n */\n childSpanTimeout?: number;\n /**\n * When set to `true`, will disable the idle timeout and child timeout\n * until the `idleSpanEnableAutoFinish` hook is emitted for the idle span.\n * The final timeout mechanism will not be affected by this option,\n * meaning the idle span will definitely be finished when the final timeout is\n * reached, no matter what this option is configured to.\n *\n * Defaults to `false`.\n */\n disableAutoFinish?: boolean;\n\n /** Allows to configure a hook that is called when the idle span is ended, before it is processed. */\n beforeSpanEnd?: (span: Span) => void;\n\n /**\n * If set to `true`, the idle span will be trimmed to the latest span end timestamp of its children.\n *\n * @default `true`.\n */\n trimIdleSpanEndTimestamp?: boolean;\n}\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nexport function startIdleSpan(startSpanOptions: StartSpanOptions, options: Partial<IdleSpanOptions> = {}): Span {\n // Activities store a list of active spans\n const activities = new Map<string, boolean>();\n\n // We should not use heartbeat if we finished a span\n let _finished = false;\n\n // Timer that tracks idleTimeout\n let _idleTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // Timer that tracks maxSpanTime for child spans\n let _childSpanTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // The reason why the span was finished\n let _finishReason: IdleSpanFinishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n let _autoFinishAllowed: boolean = !options.disableAutoFinish;\n\n const _cleanupHooks: (() => void)[] = [];\n\n const {\n idleTimeout = TRACING_DEFAULTS.idleTimeout,\n finalTimeout = TRACING_DEFAULTS.finalTimeout,\n childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n beforeSpanEnd,\n trimIdleSpanEndTimestamp = true,\n } = options;\n\n const client = getClient();\n\n if (!client || !hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n const dsc = {\n sample_rate: '0',\n sampled: 'false',\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n\n return span;\n }\n\n const scope = getCurrentScope();\n const previousActiveSpan = getActiveSpan();\n const span = _startIdleSpan(startSpanOptions);\n\n // We patch span.end to ensure we can run some things before the span is ended\n // eslint-disable-next-line @typescript-eslint/unbound-method\n span.end = new Proxy(span.end, {\n apply(target, thisArg, args: Parameters<Span['end']>) {\n if (beforeSpanEnd) {\n beforeSpanEnd(span);\n }\n\n // If the span is non-recording, nothing more to do here...\n // This is the case if tracing is enabled but this specific span was not sampled\n if (thisArg instanceof SentryNonRecordingSpan) {\n return;\n }\n\n // Just ensuring that this keeps working, even if we ever have more arguments here\n const [definedEndTimestamp, ...rest] = args;\n const timestamp = definedEndTimestamp || timestampInSeconds();\n const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n // Ensure we end with the last span timestamp, if possible\n const spans = getSpanDescendants(span).filter(child => child !== span);\n\n const spanJson = spanToJSON(span);\n\n // If we have no spans, we just end, nothing else to do here\n // Likewise, if users explicitly ended the span, we simply end the span without timestamp adjustment\n if (!spans.length || !trimIdleSpanEndTimestamp) {\n onIdleSpanEnded(spanEndTimestamp);\n return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n }\n\n const ignoreSpans = client.getOptions().ignoreSpans;\n\n const latestSpanEndTimestamp = spans?.reduce((acc: number | undefined, current) => {\n const currentSpanJson = spanToJSON(current);\n if (!currentSpanJson.timestamp) {\n return acc;\n }\n // Ignored spans will get dropped later (in the client) but since we already adjust\n // the idle span end timestamp here, we can already take to-be-ignored spans out of\n // the calculation here.\n if (\n ignoreSpans &&\n shouldIgnoreSpan(\n { description: currentSpanJson.description, op: currentSpanJson.op, attributes: currentSpanJson.data },\n ignoreSpans,\n )\n ) {\n return acc;\n }\n return acc ? Math.max(acc, currentSpanJson.timestamp) : currentSpanJson.timestamp;\n }, undefined);\n\n // In reality this should always exist here, but type-wise it may be undefined...\n const spanStartTimestamp = spanJson.start_timestamp;\n\n // The final endTimestamp should:\n // * Never be before the span start timestamp\n // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n // * Otherwise be the passed end timestamp\n // Final timestamp can never be after finalTimeout\n const endTimestamp = Math.min(\n spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n );\n\n onIdleSpanEnded(endTimestamp);\n return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n },\n });\n\n /**\n * Cancels the existing idle timeout, if there is one.\n */\n function _cancelIdleTimeout(): void {\n if (_idleTimeoutID) {\n clearTimeout(_idleTimeoutID);\n _idleTimeoutID = undefined;\n }\n }\n\n /**\n * Cancels the existing child span timeout, if there is one.\n */\n function _cancelChildSpanTimeout(): void {\n if (_childSpanTimeoutID) {\n clearTimeout(_childSpanTimeoutID);\n _childSpanTimeoutID = undefined;\n }\n }\n\n /**\n * Restarts idle timeout, if there is no running idle timeout it will start one.\n */\n function _restartIdleTimeout(endTimestamp?: number): void {\n _cancelIdleTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n span.end(endTimestamp);\n }\n }, idleTimeout);\n }\n\n /**\n * Restarts child span timeout, if there is none running it will start one.\n */\n function _restartChildSpanTimeout(endTimestamp?: number): void {\n _cancelChildSpanTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n span.end(endTimestamp);\n }\n }, childSpanTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n function _pushActivity(spanId: string): void {\n _cancelIdleTimeout();\n activities.set(spanId, true);\n\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n function _popActivity(spanId: string): void {\n if (activities.has(spanId)) {\n activities.delete(spanId);\n }\n\n if (activities.size === 0) {\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n _cancelChildSpanTimeout();\n }\n }\n\n function onIdleSpanEnded(endTimestamp: number): void {\n _finished = true;\n activities.clear();\n\n _cleanupHooks.forEach(cleanup => cleanup());\n\n _setSpanForScope(scope, previousActiveSpan);\n\n const spanJSON = spanToJSON(span);\n\n const { start_timestamp: startTimestamp } = spanJSON;\n // This should never happen, but to make TS happy...\n if (!startTimestamp) {\n return;\n }\n\n const attributes = spanJSON.data;\n if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n }\n\n // Set span status to 'ok' if it hasn't been explicitly set to an error status\n const currentStatus = spanJSON.status;\n if (!currentStatus || currentStatus === 'unknown') {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n debug.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n let discardedSpans = 0;\n childSpans.forEach(childSpan => {\n // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n if (childSpan.isRecording()) {\n childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n childSpan.end(endTimestamp);\n DEBUG_BUILD &&\n debug.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n }\n\n const childSpanJSON = spanToJSON(childSpan);\n const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n // Add a delta with idle timeout so that we prevent false positives\n const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n if (DEBUG_BUILD) {\n const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n if (!spanStartedBeforeIdleSpanEnd) {\n debug.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n } else if (!spanEndedBeforeFinalTimeout) {\n debug.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n }\n }\n\n if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n removeChildSpanFromSpan(span, childSpan);\n discardedSpans++;\n }\n });\n\n if (discardedSpans > 0) {\n span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n }\n }\n\n _cleanupHooks.push(\n client.on('spanStart', startedSpan => {\n // If we already finished the idle span,\n // or if this is the idle span itself being started,\n // or if the started span has already been closed,\n // we don't care about it for activity\n if (\n _finished ||\n startedSpan === span ||\n !!spanToJSON(startedSpan).timestamp ||\n (startedSpan instanceof SentrySpan && startedSpan.isStandaloneSpan())\n ) {\n return;\n }\n\n const allSpans = getSpanDescendants(span);\n\n // If the span that was just started is a child of the idle span, we should track it\n if (allSpans.includes(startedSpan)) {\n _pushActivity(startedSpan.spanContext().spanId);\n }\n }),\n );\n\n _cleanupHooks.push(\n client.on('spanEnd', endedSpan => {\n if (_finished) {\n return;\n }\n\n _popActivity(endedSpan.spanContext().spanId);\n }),\n );\n\n _cleanupHooks.push(\n client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n if (spanToAllowAutoFinish === span) {\n _autoFinishAllowed = true;\n _restartIdleTimeout();\n\n if (activities.size) {\n _restartChildSpanTimeout();\n }\n }\n }),\n );\n\n // We only start the initial idle timeout if we are not delaying the auto finish\n if (!options.disableAutoFinish) {\n _restartIdleTimeout();\n }\n\n setTimeout(() => {\n if (!_finished) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n span.end();\n }\n }, finalTimeout);\n\n return span;\n}\n\nfunction _startIdleSpan(options: StartSpanOptions): Span {\n const span = startInactiveSpan(options);\n\n _setSpanForScope(getCurrentScope(), span);\n\n DEBUG_BUILD && debug.log('[Tracing] Started span is an idle span');\n\n return span;\n}\n"],"names":["getClient","hasSpansEnabled","span","SentryNonRecordingSpan","getDynamicSamplingContextFromSpan","freezeDscOnSpan","getCurrentScope","getActiveSpan","timestampInSeconds","spanTimeInputToSeconds","getSpanDescendants","spanToJSON","shouldIgnoreSpan","_setSpanForScope","SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON","SPAN_STATUS_OK","debug","SPAN_STATUS_ERROR","DEBUG_BUILD","removeChildSpanFromSpan","SentrySpan","startInactiveSpan"],"mappings":"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"}
{"version":3,"file":"idleSpan.js","sources":["../../../src/tracing/idleSpan.ts"],"sourcesContent":["import { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes';\nimport type { Span } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { debug } from '../utils/debug-logger';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { _setSpanForScope } from '../utils/spanOnScope';\nimport {\n getActiveSpan,\n getSpanDescendants,\n removeChildSpanFromSpan,\n spanTimeInputToSeconds,\n spanToJSON,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { SentryNonRecordingSpan, spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR, SPAN_STATUS_OK } from './spanstatus';\nimport { startInactiveSpan } from './trace';\nimport { setCapturedScopesOnSpan } from './utils';\n\nexport const TRACING_DEFAULTS = {\n idleTimeout: 1_000,\n finalTimeout: 30_000,\n childSpanTimeout: 15_000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\nconst FINISH_REASON_CANCELLED = 'cancelled';\n\n// unused\nconst FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden';\n\n// unused in this file, but used in BrowserTracing\nconst FINISH_REASON_INTERRUPTED = 'interactionInterrupted';\n\ntype IdleSpanFinishReason =\n | typeof FINISH_REASON_CANCELLED\n | typeof FINISH_REASON_DOCUMENT_HIDDEN\n | typeof FINISH_REASON_EXTERNAL_FINISH\n | typeof FINISH_REASON_FINAL_TIMEOUT\n | typeof FINISH_REASON_HEARTBEAT_FAILED\n | typeof FINISH_REASON_IDLE_TIMEOUT\n | typeof FINISH_REASON_INTERRUPTED;\n\ninterface IdleSpanOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n */\n idleTimeout: number;\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n */\n finalTimeout: number;\n /**\n * The max. time a child span may run.\n * If the time since the last span was started exceeds this time, the idle span will finish.\n */\n childSpanTimeout?: number;\n /**\n * When set to `true`, will disable the idle timeout and child timeout\n * until the `idleSpanEnableAutoFinish` hook is emitted for the idle span.\n * The final timeout mechanism will not be affected by this option,\n * meaning the idle span will definitely be finished when the final timeout is\n * reached, no matter what this option is configured to.\n *\n * Defaults to `false`.\n */\n disableAutoFinish?: boolean;\n\n /** Allows to configure a hook that is called when the idle span is ended, before it is processed. */\n beforeSpanEnd?: (span: Span) => void;\n\n /**\n * If set to `true`, the idle span will be trimmed to the latest span end timestamp of its children.\n *\n * @default `true`.\n */\n trimIdleSpanEndTimestamp?: boolean;\n}\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nexport function startIdleSpan(startSpanOptions: StartSpanOptions, options: Partial<IdleSpanOptions> = {}): Span {\n // Activities store a list of active spans\n const activities = new Map<string, boolean>();\n\n // We should not use heartbeat if we finished a span\n let _finished = false;\n\n // Timer that tracks idleTimeout\n let _idleTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // Timer that tracks maxSpanTime for child spans\n let _childSpanTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // The reason why the span was finished\n let _finishReason: IdleSpanFinishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n let _autoFinishAllowed: boolean = !options.disableAutoFinish;\n\n const _cleanupHooks: (() => void)[] = [];\n\n const {\n idleTimeout = TRACING_DEFAULTS.idleTimeout,\n finalTimeout = TRACING_DEFAULTS.finalTimeout,\n childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n beforeSpanEnd,\n trimIdleSpanEndTimestamp = true,\n } = options;\n\n const client = getClient();\n const scope = getCurrentScope();\n\n if (!client || !hasSpansEnabled()) {\n // The placeholder is a thin marker; it carries no sampling decision or DSC. Both are read from\n // the scope: the sampling decision in `getTraceData`, the DSC in `getDynamicSamplingContextFromSpan`.\n const span = new SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });\n\n // Capture scopes so consumers (e.g. SentryTraceProvider) can read them and so the DSC can be\n // resolved from the scope by `getDynamicSamplingContextFromSpan`.\n setCapturedScopesOnSpan(span, scope, getIsolationScope());\n\n return span;\n }\n\n const previousActiveSpan = getActiveSpan();\n const span = _startIdleSpan(startSpanOptions);\n\n // We patch span.end to ensure we can run some things before the span is ended\n // eslint-disable-next-line @typescript-eslint/unbound-method\n span.end = new Proxy(span.end, {\n apply(target, thisArg, args: Parameters<Span['end']>) {\n if (beforeSpanEnd) {\n beforeSpanEnd(span);\n }\n\n // If the span is non-recording, nothing more to do here...\n // This is the case if tracing is enabled but this specific span was not sampled\n if (spanIsNonRecordingSpan(thisArg)) {\n return;\n }\n\n // Just ensuring that this keeps working, even if we ever have more arguments here\n const [definedEndTimestamp, ...rest] = args;\n const timestamp = definedEndTimestamp || timestampInSeconds();\n const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n // Ensure we end with the last span timestamp, if possible\n const spans = getSpanDescendants(span).filter(child => child !== span);\n\n const spanJson = spanToJSON(span);\n\n // If we have no spans, we just end, nothing else to do here\n // Likewise, if users explicitly ended the span, we simply end the span without timestamp adjustment\n if (!spans.length || !trimIdleSpanEndTimestamp) {\n onIdleSpanEnded(spanEndTimestamp);\n return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n }\n\n const ignoreSpans = client.getOptions().ignoreSpans;\n\n const latestSpanEndTimestamp = spans?.reduce((acc: number | undefined, current) => {\n const currentSpanJson = spanToJSON(current);\n if (!currentSpanJson.timestamp) {\n return acc;\n }\n // Ignored spans will get dropped later (in the client) but since we already adjust\n // the idle span end timestamp here, we can already take to-be-ignored spans out of\n // the calculation here.\n if (\n ignoreSpans &&\n shouldIgnoreSpan(\n { description: currentSpanJson.description, op: currentSpanJson.op, attributes: currentSpanJson.data },\n ignoreSpans,\n )\n ) {\n return acc;\n }\n return acc ? Math.max(acc, currentSpanJson.timestamp) : currentSpanJson.timestamp;\n }, undefined);\n\n // In reality this should always exist here, but type-wise it may be undefined...\n const spanStartTimestamp = spanJson.start_timestamp;\n\n // The final endTimestamp should:\n // * Never be before the span start timestamp\n // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n // * Otherwise be the passed end timestamp\n // Final timestamp can never be after finalTimeout\n const endTimestamp = Math.min(\n spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n );\n\n onIdleSpanEnded(endTimestamp);\n return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n },\n });\n\n /**\n * Cancels the existing idle timeout, if there is one.\n */\n function _cancelIdleTimeout(): void {\n if (_idleTimeoutID) {\n clearTimeout(_idleTimeoutID);\n _idleTimeoutID = undefined;\n }\n }\n\n /**\n * Cancels the existing child span timeout, if there is one.\n */\n function _cancelChildSpanTimeout(): void {\n if (_childSpanTimeoutID) {\n clearTimeout(_childSpanTimeoutID);\n _childSpanTimeoutID = undefined;\n }\n }\n\n /**\n * Restarts idle timeout, if there is no running idle timeout it will start one.\n */\n function _restartIdleTimeout(endTimestamp?: number): void {\n _cancelIdleTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n span.end(endTimestamp);\n }\n }, idleTimeout);\n }\n\n /**\n * Restarts child span timeout, if there is none running it will start one.\n */\n function _restartChildSpanTimeout(endTimestamp?: number): void {\n _cancelChildSpanTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n span.end(endTimestamp);\n }\n }, childSpanTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n function _pushActivity(spanId: string): void {\n _cancelIdleTimeout();\n activities.set(spanId, true);\n\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n function _popActivity(spanId: string): void {\n if (activities.has(spanId)) {\n activities.delete(spanId);\n }\n\n if (activities.size === 0) {\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n _cancelChildSpanTimeout();\n }\n }\n\n function onIdleSpanEnded(endTimestamp: number): void {\n _finished = true;\n activities.clear();\n\n _cleanupHooks.forEach(cleanup => cleanup());\n\n _setSpanForScope(scope, previousActiveSpan);\n\n const spanJSON = spanToJSON(span);\n\n const { start_timestamp: startTimestamp } = spanJSON;\n // This should never happen, but to make TS happy...\n if (!startTimestamp) {\n return;\n }\n\n const attributes = spanJSON.data;\n if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n }\n\n // Set span status to 'ok' if it hasn't been explicitly set to an error status\n const currentStatus = spanJSON.status;\n if (!currentStatus || currentStatus === 'unknown') {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n debug.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n let discardedSpans = 0;\n childSpans.forEach(childSpan => {\n // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n if (childSpan.isRecording()) {\n childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n childSpan.end(endTimestamp);\n DEBUG_BUILD &&\n debug.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n }\n\n const childSpanJSON = spanToJSON(childSpan);\n const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n // Add a delta with idle timeout so that we prevent false positives\n const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n if (DEBUG_BUILD) {\n const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n if (!spanStartedBeforeIdleSpanEnd) {\n debug.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n } else if (!spanEndedBeforeFinalTimeout) {\n debug.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n }\n }\n\n if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n removeChildSpanFromSpan(span, childSpan);\n discardedSpans++;\n }\n });\n\n if (discardedSpans > 0) {\n span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n }\n }\n\n _cleanupHooks.push(\n client.on('spanStart', startedSpan => {\n // If we already finished the idle span,\n // or if this is the idle span itself being started,\n // or if the started span has already been closed,\n // we don't care about it for activity\n if (\n _finished ||\n startedSpan === span ||\n !!spanToJSON(startedSpan).timestamp ||\n (startedSpan instanceof SentrySpan && startedSpan.isStandaloneSpan())\n ) {\n return;\n }\n\n const allSpans = getSpanDescendants(span);\n\n // If the span that was just started is a child of the idle span, we should track it\n if (allSpans.includes(startedSpan)) {\n _pushActivity(startedSpan.spanContext().spanId);\n }\n }),\n );\n\n _cleanupHooks.push(\n client.on('spanEnd', endedSpan => {\n if (_finished) {\n return;\n }\n\n _popActivity(endedSpan.spanContext().spanId);\n }),\n );\n\n _cleanupHooks.push(\n client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n if (spanToAllowAutoFinish === span) {\n _autoFinishAllowed = true;\n _restartIdleTimeout();\n\n if (activities.size) {\n _restartChildSpanTimeout();\n }\n }\n }),\n );\n\n // We only start the initial idle timeout if we are not delaying the auto finish\n if (!options.disableAutoFinish) {\n _restartIdleTimeout();\n }\n\n setTimeout(() => {\n if (!_finished) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n span.end();\n }\n }, finalTimeout);\n\n return span;\n}\n\nfunction _startIdleSpan(options: StartSpanOptions): Span {\n const span = startInactiveSpan(options);\n\n _setSpanForScope(getCurrentScope(), span);\n\n DEBUG_BUILD && debug.log('[Tracing] Started span is an idle span');\n\n return span;\n}\n"],"names":["getClient","getCurrentScope","hasSpansEnabled","span","SentryNonRecordingSpan","setCapturedScopesOnSpan","getIsolationScope","getActiveSpan","spanIsNonRecordingSpan","timestampInSeconds","spanTimeInputToSeconds","getSpanDescendants","spanToJSON","shouldIgnoreSpan","_setSpanForScope","SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON","SPAN_STATUS_OK","debug","SPAN_STATUS_ERROR","DEBUG_BUILD","removeChildSpanFromSpan","SentrySpan","startInactiveSpan"],"mappings":"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"}
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const object = require('../utils/object.js');
const propagationContext = require('../utils/propagationContext.js');
const spanUtils = require('../utils/spanUtils.js');
const NON_RECORDING_SPAN_FIELD = /* @__PURE__ */ Symbol.for("sentry.nonRecordingSpan");
class SentryNonRecordingSpan {

@@ -11,2 +13,3 @@ constructor(spanContext = {}) {

this.dropReason = spanContext.dropReason;
object.addNonEnumerableProperty(this, NON_RECORDING_SPAN_FIELD, true);
}

@@ -66,4 +69,8 @@ /** @inheritdoc */

}
function spanIsNonRecordingSpan(span) {
return !!span && span[NON_RECORDING_SPAN_FIELD] === true;
}
exports.SentryNonRecordingSpan = SentryNonRecordingSpan;
exports.spanIsNonRecordingSpan = spanIsNonRecordingSpan;
//# sourceMappingURL=sentryNonRecordingSpan.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"sentryNonRecordingSpan.js","sources":["../../../src/tracing/sentryNonRecordingSpan.ts"],"sourcesContent":["import type { EventDropReason } from '../types/clientreport';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanTimeInput,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\ninterface SentryNonRecordingSpanArguments extends SentrySpanArguments {\n dropReason?: EventDropReason;\n}\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n private _traceId: string;\n private _spanId: string;\n\n /**\n * Reason why this span was dropped, if applicable ('ignored' or 'sample_rate').\n * Used to propagate the correct client report outcome to descendant spans\n * when span streaming is enabled.\n */\n public dropReason?: EventDropReason;\n\n public constructor(spanContext: SentryNonRecordingSpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this.dropReason = spanContext.dropReason;\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n return {\n spanId: this._spanId,\n traceId: this._traceId,\n traceFlags: TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public end(_timestamp?: SpanTimeInput): void {}\n\n /** @inheritdoc */\n public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(_values: SpanAttributes): this {\n return this;\n }\n\n /** @inheritdoc */\n public setStatus(_status: SpanStatus): this {\n return this;\n }\n\n /** @inheritdoc */\n public updateName(_name: string): this {\n return this;\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return false;\n }\n\n /** @inheritdoc */\n public addEvent(\n _name: string,\n _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n _startTime?: SpanTimeInput,\n ): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLink(_link: unknown): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(_links: unknown[]): this {\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n}\n"],"names":["generateTraceId","generateSpanId","TRACE_FLAG_NONE"],"mappings":";;;;;AAoBO,MAAM,sBAAA,CAAuC;AAAA,EAW3C,WAAA,CAAY,WAAA,GAA+C,EAAC,EAAG;AACpE,IAAA,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,OAAA,IAAWA,kCAAA,EAAgB;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA,CAAY,MAAA,IAAUC,iCAAA,EAAe;AACpD,IAAA,IAAA,CAAK,aAAa,WAAA,CAAY,UAAA;AAAA,EAChC;AAAA;AAAA,EAGO,WAAA,GAA+B;AACpC,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAA,EAAYC;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAGO,IAAI,UAAA,EAAkC;AAAA,EAAC;AAAA;AAAA,EAGvC,YAAA,CAAa,MAAc,MAAA,EAA8C;AAC9E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,cAAc,OAAA,EAA+B;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,UAAU,OAAA,EAA2B;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAW,KAAA,EAAqB;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAA,GAAuB;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAA,CACL,KAAA,EACA,sBAAA,EACA,UAAA,EACM;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAQ,KAAA,EAAsB;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,SAAS,MAAA,EAAyB;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CAAgB,YAAqB,KAAA,EAAkC;AAAA,EAE9E;AACF;;;;"}
{"version":3,"file":"sentryNonRecordingSpan.js","sources":["../../../src/tracing/sentryNonRecordingSpan.ts"],"sourcesContent":["import type { EventDropReason } from '../types/clientreport';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanTimeInput,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\ninterface SentryNonRecordingSpanArguments extends SentrySpanArguments {\n dropReason?: EventDropReason;\n}\n\n// Brand used to detect non-recording spans via {@link spanIsNonRecordingSpan} without `instanceof`,\n// which is brittle when `@sentry/core` is duplicated across packages. We use `Symbol.for` so the key\n// is shared across copies of the module, and so user payloads (e.g. JSON) cannot spoof the marker.\nconst NON_RECORDING_SPAN_FIELD = Symbol.for('sentry.nonRecordingSpan');\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n private _traceId: string;\n private _spanId: string;\n\n /**\n * Reason why this span was dropped, if applicable ('ignored' or 'sample_rate').\n * Used to propagate the correct client report outcome to descendant spans\n * when span streaming is enabled.\n */\n public dropReason?: EventDropReason;\n\n public constructor(spanContext: SentryNonRecordingSpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this.dropReason = spanContext.dropReason;\n addNonEnumerableProperty(this, NON_RECORDING_SPAN_FIELD, true);\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n return {\n spanId: this._spanId,\n traceId: this._traceId,\n traceFlags: TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public end(_timestamp?: SpanTimeInput): void {}\n\n /** @inheritdoc */\n public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(_values: SpanAttributes): this {\n return this;\n }\n\n /** @inheritdoc */\n public setStatus(_status: SpanStatus): this {\n return this;\n }\n\n /** @inheritdoc */\n public updateName(_name: string): this {\n return this;\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return false;\n }\n\n /** @inheritdoc */\n public addEvent(\n _name: string,\n _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n _startTime?: SpanTimeInput,\n ): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLink(_link: unknown): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(_links: unknown[]): this {\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: SpanTimeInput | undefined): void {\n // noop\n }\n}\n\n/**\n * Whether the given span is a {@link SentryNonRecordingSpan}.\n */\nexport function spanIsNonRecordingSpan(span: Span | undefined): span is SentryNonRecordingSpan {\n return !!span && (span as { [NON_RECORDING_SPAN_FIELD]?: boolean })[NON_RECORDING_SPAN_FIELD] === true;\n}\n"],"names":["generateTraceId","generateSpanId","addNonEnumerableProperty","TRACE_FLAG_NONE"],"mappings":";;;;;;AAqBA,MAAM,wBAAA,mBAA2B,MAAA,CAAO,GAAA,CAAI,yBAAyB,CAAA;AAK9D,MAAM,sBAAA,CAAuC;AAAA,EAW3C,WAAA,CAAY,WAAA,GAA+C,EAAC,EAAG;AACpE,IAAA,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,OAAA,IAAWA,kCAAA,EAAgB;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA,CAAY,MAAA,IAAUC,iCAAA,EAAe;AACpD,IAAA,IAAA,CAAK,aAAa,WAAA,CAAY,UAAA;AAC9B,IAAAC,+BAAA,CAAyB,IAAA,EAAM,0BAA0B,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGO,WAAA,GAA+B;AACpC,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAA,EAAYC;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAGO,IAAI,UAAA,EAAkC;AAAA,EAAC;AAAA;AAAA,EAGvC,YAAA,CAAa,MAAc,MAAA,EAA8C;AAC9E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,cAAc,OAAA,EAA+B;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,UAAU,OAAA,EAA2B;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAW,KAAA,EAAqB;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAA,GAAuB;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAA,CACL,KAAA,EACA,sBAAA,EACA,UAAA,EACM;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAQ,KAAA,EAAsB;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,SAAS,MAAA,EAAyB;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CAAgB,YAAqB,KAAA,EAAyC;AAAA,EAErF;AACF;AAKO,SAAS,uBAAuB,IAAA,EAAwD;AAC7F,EAAA,OAAO,CAAC,CAAC,IAAA,IAAS,IAAA,CAAkD,wBAAwB,CAAA,KAAM,IAAA;AACpG;;;;;"}

@@ -10,2 +10,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const scopeContextAttributes = require('./scopeContextAttributes.js');
const constants = require('../../constants.js');

@@ -66,3 +67,3 @@ function captureSpan(span, client) {

[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,
[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,
[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || constants.DEFAULT_ENVIRONMENT,
[semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,

@@ -69,0 +70,0 @@ [semanticAttributes.SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,

@@ -1,1 +0,1 @@

{"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from '../../utils/url';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Backfill span data from OTel semantic conventions when not explicitly set.\n // OTel-originated spans don't have sentry.op, description, etc. — the non-streamed path\n // infers these in the SentrySpanExporter, but streamed spans skip the exporter entirely.\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // This must run before all hooks and beforeSendSpan so that user callbacks can see and override inferred values.\n const spanKind = (span as { kind?: number }).kind;\n inferSpanDataFromOtelAttributes(spanJSON, spanKind);\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\n// OTel SpanKind values (numeric to avoid importing from @opentelemetry/api)\nconst SPAN_KIND_SERVER = 1;\nconst SPAN_KIND_CLIENT = 2;\n\n/**\n * Infer and backfill span data from OTel semantic conventions.\n * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`.\n * Streamed spans skip the exporter, so we do the inference here during capture.\n *\n * Backfills: `sentry.op`, `sentry.source`, and `name` (description).\n * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten.\n */\n/** Exported only for tests. */\nexport function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void {\n const attributes = spanJSON.attributes;\n if (!attributes) {\n return;\n }\n\n const httpMethod = attributes['http.request.method'] || attributes['http.method'];\n if (httpMethod) {\n inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod);\n return;\n }\n\n const dbSystem = attributes['db.system.name'] || attributes['db.system'];\n const opIsCache =\n typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'string' &&\n `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith('cache.');\n if (dbSystem && !opIsCache) {\n inferDbSpanData(spanJSON, attributes);\n return;\n }\n\n if (attributes['rpc.service']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'rpc' });\n return;\n }\n\n if (attributes['messaging.system']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'message' });\n return;\n }\n\n const faasTrigger = attributes['faas.trigger'];\n if (faasTrigger) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` });\n }\n}\n\nfunction inferHttpSpanData(\n spanJSON: StreamedSpanJSON,\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n httpMethod: unknown,\n): void {\n // Infer op: http.client, http.server, or just http\n const opParts = ['http'];\n if (spanKind === SPAN_KIND_CLIENT) {\n opParts.push('client');\n } else if (spanKind === SPAN_KIND_SERVER) {\n opParts.push('server');\n }\n if (attributes['sentry.http.prefetch']) {\n opParts.push('prefetch');\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join('.') });\n\n // If the user set a custom span name via updateSpanName(), apply it — OTel instrumentation\n // may have overwritten span.name after the user set it, so we restore from the attribute.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const httpRoute = attributes['http.route'];\n if (typeof httpRoute === 'string') {\n spanJSON.name = `${httpMethod} ${httpRoute}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route' });\n } else {\n // Infer span name from URL attributes, matching the non-streamed exporter's behavior.\n // Only overwrite the name for OTel spans (known spanKind)\n if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) {\n const urlPath = getUrlPath(attributes, spanKind);\n if (urlPath) {\n spanJSON.name = `${httpMethod} ${urlPath}`;\n }\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' });\n }\n}\n\n/**\n * Extract a URL path from span attributes for use in the span name.\n * Mirrors the logic in the non-streamed exporter's `getSanitizedUrl`.\n */\nfunction getUrlPath(\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n): string | undefined {\n const httpUrl = attributes['http.url'] || attributes['url.full'];\n const httpTarget = attributes['http.target'];\n\n const parsedUrl = typeof httpUrl === 'string' ? parseUrl(httpUrl) : undefined;\n const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : undefined;\n\n // For server spans, prefer the relative target path\n if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n // For client spans (and others), use the full sanitized URL\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Fall back to target if no full URL is available\n if (typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n return undefined;\n}\n\nfunction inferDbSpanData(spanJSON: StreamedSpanJSON, attributes: RawAttributes<Record<string, unknown>>): void {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db' });\n\n // If the user set a custom span name via updateSpanName(), apply it.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const statement = attributes['db.statement'];\n if (statement) {\n spanJSON.name = `${statement}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'task' });\n }\n}\n"],"names":["spanToStreamedSpanJSON","INTERNAL_getSegmentSpan","getCapturedScopesOnSpan","getCombinedScopeData","beforeSendSpan","isStreamedBeforeSendSpanCallback","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","streamedSpanJsonToSerializedSpan","scopeContextsToSpanAttributes","SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS","SEMANTIC_ATTRIBUTE_SENTRY_RELEASE","SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID","SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION","SEMANTIC_ATTRIBUTE_USER_ID","SEMANTIC_ATTRIBUTE_USER_EMAIL","SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS","SEMANTIC_ATTRIBUTE_USER_USERNAME","showSpanDropWarning","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","parseUrl","getSanitizedUrlString","stripUrlQueryAndFragment"],"mappings":"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"}
{"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from '../../utils/url';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Backfill span data from OTel semantic conventions when not explicitly set.\n // OTel-originated spans don't have sentry.op, description, etc. — the non-streamed path\n // infers these in the SentrySpanExporter, but streamed spans skip the exporter entirely.\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // This must run before all hooks and beforeSendSpan so that user callbacks can see and override inferred values.\n const spanKind = (span as { kind?: number }).kind;\n inferSpanDataFromOtelAttributes(spanJSON, spanKind);\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\n// OTel SpanKind values (numeric to avoid importing from @opentelemetry/api)\nconst SPAN_KIND_SERVER = 1;\nconst SPAN_KIND_CLIENT = 2;\n\n/**\n * Infer and backfill span data from OTel semantic conventions.\n * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`.\n * Streamed spans skip the exporter, so we do the inference here during capture.\n *\n * Backfills: `sentry.op`, `sentry.source`, and `name` (description).\n * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten.\n */\n/** Exported only for tests. */\nexport function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void {\n const attributes = spanJSON.attributes;\n if (!attributes) {\n return;\n }\n\n const httpMethod = attributes['http.request.method'] || attributes['http.method'];\n if (httpMethod) {\n inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod);\n return;\n }\n\n const dbSystem = attributes['db.system.name'] || attributes['db.system'];\n const opIsCache =\n typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'string' &&\n `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith('cache.');\n if (dbSystem && !opIsCache) {\n inferDbSpanData(spanJSON, attributes);\n return;\n }\n\n if (attributes['rpc.service']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'rpc' });\n return;\n }\n\n if (attributes['messaging.system']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'message' });\n return;\n }\n\n const faasTrigger = attributes['faas.trigger'];\n if (faasTrigger) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` });\n }\n}\n\nfunction inferHttpSpanData(\n spanJSON: StreamedSpanJSON,\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n httpMethod: unknown,\n): void {\n // Infer op: http.client, http.server, or just http\n const opParts = ['http'];\n if (spanKind === SPAN_KIND_CLIENT) {\n opParts.push('client');\n } else if (spanKind === SPAN_KIND_SERVER) {\n opParts.push('server');\n }\n if (attributes['sentry.http.prefetch']) {\n opParts.push('prefetch');\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join('.') });\n\n // If the user set a custom span name via updateSpanName(), apply it — OTel instrumentation\n // may have overwritten span.name after the user set it, so we restore from the attribute.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const httpRoute = attributes['http.route'];\n if (typeof httpRoute === 'string') {\n spanJSON.name = `${httpMethod} ${httpRoute}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route' });\n } else {\n // Infer span name from URL attributes, matching the non-streamed exporter's behavior.\n // Only overwrite the name for OTel spans (known spanKind)\n if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) {\n const urlPath = getUrlPath(attributes, spanKind);\n if (urlPath) {\n spanJSON.name = `${httpMethod} ${urlPath}`;\n }\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' });\n }\n}\n\n/**\n * Extract a URL path from span attributes for use in the span name.\n * Mirrors the logic in the non-streamed exporter's `getSanitizedUrl`.\n */\nfunction getUrlPath(\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n): string | undefined {\n const httpUrl = attributes['http.url'] || attributes['url.full'];\n const httpTarget = attributes['http.target'];\n\n const parsedUrl = typeof httpUrl === 'string' ? parseUrl(httpUrl) : undefined;\n const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : undefined;\n\n // For server spans, prefer the relative target path\n if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n // For client spans (and others), use the full sanitized URL\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Fall back to target if no full URL is available\n if (typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n return undefined;\n}\n\nfunction inferDbSpanData(spanJSON: StreamedSpanJSON, attributes: RawAttributes<Record<string, unknown>>): void {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db' });\n\n // If the user set a custom span name via updateSpanName(), apply it.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const statement = attributes['db.statement'];\n if (statement) {\n spanJSON.name = `${statement}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'task' });\n }\n}\n"],"names":["spanToStreamedSpanJSON","INTERNAL_getSegmentSpan","getCapturedScopesOnSpan","getCombinedScopeData","beforeSendSpan","isStreamedBeforeSendSpanCallback","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","streamedSpanJsonToSerializedSpan","scopeContextsToSpanAttributes","SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS","SEMANTIC_ATTRIBUTE_SENTRY_RELEASE","SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT","DEFAULT_ENVIRONMENT","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID","SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME","SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION","SEMANTIC_ATTRIBUTE_USER_ID","SEMANTIC_ATTRIBUTE_USER_EMAIL","SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS","SEMANTIC_ATTRIBUTE_USER_USERNAME","showSpanDropWarning","SEMANTIC_ATTRIBUTE_SENTRY_OP","SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME","parseUrl","getSanitizedUrlString","stripUrlQueryAndFragment"],"mappings":"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"}

@@ -44,3 +44,3 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const missingRequiredParent = options.onlyIfParent && !parentSpan;
const activeSpan = missingRequiredParent ? new sentryNonRecordingSpan.SentryNonRecordingSpan() : createChildOrRootSpan({
const activeSpan = missingRequiredParent ? startMissingRequiredParentSpan(scope, client) : createChildOrRootSpan({
parentSpan,

@@ -51,5 +51,2 @@ spanArguments,

});
if (missingRequiredParent) {
client?.recordDroppedEvent("no_parent_span", "span");
}
if (!_isIgnoredSpan(activeSpan) || !parentSpan) {

@@ -87,3 +84,3 @@ spanOnScope._setSpanForScope(scope, activeSpan);

const missingRequiredParent = options.onlyIfParent && !parentSpan;
const activeSpan = missingRequiredParent ? new sentryNonRecordingSpan.SentryNonRecordingSpan() : createChildOrRootSpan({
const activeSpan = missingRequiredParent ? startMissingRequiredParentSpan(scope, currentScopes.getClient()) : createChildOrRootSpan({
parentSpan,

@@ -94,5 +91,2 @@ spanArguments,

});
if (missingRequiredParent) {
currentScopes.getClient()?.recordDroppedEvent("no_parent_span", "span");
}
if (!_isIgnoredSpan(activeSpan) || !parentSpan) {

@@ -131,4 +125,3 @@ spanOnScope._setSpanForScope(scope, activeSpan);

if (missingRequiredParent) {
client?.recordDroppedEvent("no_parent_span", "span");
return new sentryNonRecordingSpan.SentryNonRecordingSpan();
return startMissingRequiredParentSpan(scope, client);
}

@@ -198,2 +191,8 @@ return createChildOrRootSpan({

}
function startMissingRequiredParentSpan(scope, client) {
client?.recordDroppedEvent("no_parent_span", "span");
const span = new sentryNonRecordingSpan.SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });
utils.setCapturedScopesOnSpan(span, scope, currentScopes.getIsolationScope());
return span;
}
function createChildOrRootSpan({

@@ -205,13 +204,11 @@ parentSpan,

}) {
const isolationScope = currentScopes.getIsolationScope();
if (!hasSpansEnabled.hasSpansEnabled()) {
const span2 = new sentryNonRecordingSpan.SentryNonRecordingSpan();
if (forceTransaction || !parentSpan) {
const dsc = {
sampled: "false",
sample_rate: "0",
transaction: spanArguments.name,
...dynamicSamplingContext.getDynamicSamplingContextFromSpan(span2)
};
dynamicSamplingContext.freezeDscOnSpan(span2, dsc);
const scopePropagationContext = { ...isolationScope.getPropagationContext(), ...scope.getPropagationContext() };
const traceId = parentSpan ? parentSpan.spanContext().traceId : scopePropagationContext.traceId;
const span2 = new sentryNonRecordingSpan.SentryNonRecordingSpan({ traceId });
if (parentSpan && !forceTransaction) {
spanUtils.addChildSpanToSpan(parentSpan, span2);
}
utils.setCapturedScopesOnSpan(span2, scope, isolationScope);
return span2;

@@ -224,11 +221,12 @@ }

}
return new sentryNonRecordingSpan.SentryNonRecordingSpan({
const ignoredSpan = new sentryNonRecordingSpan.SentryNonRecordingSpan({
dropReason: "ignored",
traceId: parentSpan?.spanContext().traceId ?? scope.getPropagationContext().traceId
});
utils.setCapturedScopesOnSpan(ignoredSpan, scope, isolationScope);
return ignoredSpan;
}
const isolationScope = currentScopes.getIsolationScope();
let span;
if (parentSpan && !forceTransaction) {
span = _startChildSpan(parentSpan, scope, spanArguments);
span = _startChildSpan(parentSpan, scope, spanArguments, isolationScope);
spanUtils.addChildSpanToSpan(parentSpan, span);

@@ -246,2 +244,3 @@ } else if (parentSpan) {

scope,
isolationScope,
parentSampled

@@ -267,2 +266,3 @@ );

scope,
isolationScope,
parentSampled

@@ -275,3 +275,2 @@ );

logSpans.logSpanStart(span);
utils.setCapturedScopesOnSpan(span, scope, isolationScope);
return span;

@@ -297,3 +296,3 @@ }

}
function _startRootSpan(spanArguments, scope, parentSampled) {
function _startRootSpan(spanArguments, scope, isolationScope, parentSampled) {
const client = currentScopes.getClient();

@@ -331,2 +330,3 @@ const options = client?.getOptions() || {};

}
utils.setCapturedScopesOnSpan(rootSpan, scope, isolationScope);
if (client) {

@@ -337,3 +337,3 @@ client.emit("spanStart", rootSpan);

}
function _startChildSpan(parentSpan, scope, spanArguments) {
function _startChildSpan(parentSpan, scope, spanArguments, isolationScope) {
const { spanId, traceId } = parentSpan.spanContext();

@@ -349,2 +349,3 @@ const isTracingSuppressed = _isTracingSuppressed(scope);

spanUtils.addChildSpanToSpan(parentSpan, childSpan);
utils.setCapturedScopesOnSpan(childSpan, scope, isolationScope);
const client = currentScopes.getClient();

@@ -354,4 +355,4 @@ if (!client) {

}
if (hasSpanStreamingEnabled.hasSpanStreamingEnabled(client) && childSpan instanceof sentryNonRecordingSpan.SentryNonRecordingSpan) {
if (parentSpan instanceof sentryNonRecordingSpan.SentryNonRecordingSpan && parentSpan.dropReason) {
if (hasSpanStreamingEnabled.hasSpanStreamingEnabled(client) && sentryNonRecordingSpan.spanIsNonRecordingSpan(childSpan)) {
if (sentryNonRecordingSpan.spanIsNonRecordingSpan(parentSpan) && parentSpan.dropReason) {
childSpan.dropReason = parentSpan.dropReason;

@@ -409,3 +410,3 @@ client.recordDroppedEvent(parentSpan.dropReason, "span");

function _isIgnoredSpan(span) {
return span instanceof sentryNonRecordingSpan.SentryNonRecordingSpan && span.dropReason === "ignored";
return sentryNonRecordingSpan.spanIsNonRecordingSpan(span) && span.dropReason === "ignored";
}

@@ -412,0 +413,0 @@ function _isTracingSuppressed(scope) {

@@ -1,1 +0,1 @@

{"version":3,"file":"trace.js","sources":["../../../src/tracing/trace.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { ClientOptions } from '../types/options';\nimport type { SentrySpanArguments, Span, SpanTimeInput } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { baggageHeaderToDynamicSamplingContext } from '../utils/baggage';\nimport { debug } from '../utils/debug-logger';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { generateTraceId } from '../utils/propagationContext';\nimport { safeMathRandom } from '../utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { propagationContextFromHeaders, shouldContinueTrace } from '../utils/tracing';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\nimport type { Client } from '../client';\n\nexport const SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n if (missingRequiredParent) {\n client?.recordDroppedEvent('no_parent_span', 'span');\n }\n\n // Ignored root spans still need to be set on scope so that `getActiveSpan()` returns them\n // and descendants are also non-recording. Ignored child spans don't need this because\n // the parent span is already on scope.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n if (missingRequiredParent) {\n getClient()?.recordDroppedEvent('no_parent_span', 'span');\n }\n\n // We don't set ignored child spans onto the scope because there likely is an active,\n // unignored span on the scope already.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n\n if (missingRequiredParent) {\n client?.recordDroppedEvent('no_parent_span', 'span');\n return new SentryNonRecordingSpan();\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n const client = getClient();\n const incomingDsc = baggageHeaderToDynamicSamplingContext(baggage);\n if (client && !shouldContinueTrace(client, incomingDsc?.org_id)) {\n return startNewTrace(callback);\n }\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n _setSpanForScope(scope, undefined);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n // Note: We do not wait for the callback to finish before we reset the metadata\n // the reason for this is that otherwise, in the browser this can lead to very weird behavior\n // as there is only a single top scope, if the callback takes longer to finish,\n // other, unrelated spans may also be suppressed, which we do not want\n // so instead, we only suppress tracing synchronoysly in the browser\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n const res = callback();\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: undefined });\n return res;\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n const acs = getAcs();\n if (acs.startNewTrace) {\n return acs.startNewTrace(callback);\n }\n\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom(),\n });\n DEBUG_BUILD && debug.log(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n if (!hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n // If this is a root span, we ensure to freeze a DSC\n // So we can have at least partial data here\n if (forceTransaction || !parentSpan) {\n const dsc = {\n sampled: 'false',\n sample_rate: '0',\n transaction: spanArguments.name,\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n }\n\n return span;\n }\n\n const client = getClient();\n if (_shouldIgnoreStreamedSpan(client, spanArguments)) {\n if (!_isTracingSuppressed(scope)) {\n // if tracing is actively suppressed (Sentry.suppressTracing(...)),\n // we don't want to record a client outcome for the ignored span\n client?.recordDroppedEvent('ignored', 'span');\n }\n\n return new SentryNonRecordingSpan({\n dropReason: 'ignored',\n traceId: parentSpan?.spanContext().traceId ?? scope.getPropagationContext().traceId,\n });\n }\n\n const isolationScope = getIsolationScope();\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments: SentrySpanArguments, scope: Scope, parentSampled?: boolean): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '' } = spanArguments;\n\n const mutableSpanSamplingData = { spanAttributes: { ...spanArguments.attributes }, spanName: name, parentSampled };\n\n // we don't care about the decision for the moment; this is just a placeholder\n client?.emit('beforeSampling', mutableSpanSamplingData, { decision: false });\n\n // If hook consumers override the parentSampled flag, we will use that value instead of the actual one\n const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;\n const finalAttributes = mutableSpanSamplingData.spanAttributes;\n\n const currentPropagationContext = scope.getPropagationContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n\n const [sampled, sampleRate, localSampleRateWasApplied] = isTracingSuppressed\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled: finalParentSampled,\n attributes: finalAttributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...finalAttributes,\n },\n sampled,\n });\n\n if (!sampled && client && !isTracingSuppressed) {\n DEBUG_BUILD && debug.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', hasSpanStreamingEnabled(client) ? 'span' : 'transaction');\n }\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan: Span, scope: Scope, spanArguments: SentrySpanArguments): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n const sampled = isTracingSuppressed ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n const client = getClient();\n\n if (!client) {\n return childSpan;\n }\n\n if (hasSpanStreamingEnabled(client) && childSpan instanceof SentryNonRecordingSpan) {\n if (parentSpan instanceof SentryNonRecordingSpan && parentSpan.dropReason) {\n // We land here if the parent span was a segment span that was ignored (`ignoreSpans`).\n // In this case, the child was also ignored (see `sampled` above) but we need to\n // record a client outcome for the child.\n childSpan.dropReason = parentSpan.dropReason;\n client.recordDroppedEvent(parentSpan.dropReason, 'span');\n } else if (!isTracingSuppressed) {\n // Otherwise, the child is not sampled due to sampling of the parent span,\n // hence we record a sample_rate client outcome for the child.\n childSpan.dropReason = 'sample_rate';\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n client.emit('afterSpanEnd', childSpan);\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope, customParentSpan: Span | null | undefined): SentrySpan | undefined {\n // always use the passed in span directly\n if (customParentSpan) {\n return customParentSpan as SentrySpan;\n }\n\n // This is different from `undefined` as it means the user explicitly wants no parent span\n if (customParentSpan === null) {\n return undefined;\n }\n\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n\n/* Checks if `ignoreSpans` applies (extracted for bundle size)*/\nfunction _shouldIgnoreStreamedSpan(client: Client | undefined, spanArguments: SentrySpanArguments): boolean {\n const ignoreSpans = client?.getOptions().ignoreSpans;\n\n if (!client || !hasSpanStreamingEnabled(client) || !ignoreSpans?.length) {\n return false;\n }\n\n return shouldIgnoreSpan(\n {\n description: spanArguments.name || '',\n op: spanArguments.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] || spanArguments.op,\n attributes: spanArguments.attributes,\n },\n ignoreSpans,\n );\n}\n\nfunction _isIgnoredSpan(span: Span): span is SentryNonRecordingSpan {\n return span instanceof SentryNonRecordingSpan && span.dropReason === 'ignored';\n}\n\nfunction _isTracingSuppressed(scope: Scope): boolean {\n return scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] === true;\n}\n"],"names":["withScope","getCurrentScope","getClient","SentryNonRecordingSpan","_setSpanForScope","handleCallbackErrors","spanToJSON","SPAN_STATUS_ERROR","carrier","getMainCarrier","getAsyncContextStrategy","baggage","baggageHeaderToDynamicSamplingContext","shouldContinueTrace","propagationContextFromHeaders","generateTraceId","safeMathRandom","DEBUG_BUILD","debug","hasSpansEnabled","span","getDynamicSamplingContextFromSpan","freezeDscOnSpan","getIsolationScope","addChildSpanToSpan","spanIsSampled","logSpanStart","setCapturedScopesOnSpan","spanTimeInputToSeconds","sampleSpan","parseSampleRate","SentrySpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","hasSpanStreamingEnabled","_getSpanForScope","getRootSpan","shouldIgnoreSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP"],"mappings":"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"}
{"version":3,"file":"trace.js","sources":["../../../src/tracing/trace.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { ClientOptions } from '../types/options';\nimport type { SentrySpanArguments, Span, SpanTimeInput } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { baggageHeaderToDynamicSamplingContext } from '../utils/baggage';\nimport { debug } from '../utils/debug-logger';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { generateTraceId } from '../utils/propagationContext';\nimport { safeMathRandom } from '../utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { propagationContextFromHeaders, shouldContinueTrace } from '../utils/tracing';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan, spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\nimport type { Client } from '../client';\n\nexport const SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? startMissingRequiredParentSpan(scope, client)\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n // Ignored root spans still need to be set on scope so that `getActiveSpan()` returns them\n // and descendants are also non-recording. Ignored child spans don't need this because\n // the parent span is already on scope.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? startMissingRequiredParentSpan(scope, getClient())\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n // We don't set ignored child spans onto the scope because there likely is an active,\n // unignored span on the scope already.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n\n if (missingRequiredParent) {\n return startMissingRequiredParentSpan(scope, client);\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n const client = getClient();\n const incomingDsc = baggageHeaderToDynamicSamplingContext(baggage);\n if (client && !shouldContinueTrace(client, incomingDsc?.org_id)) {\n return startNewTrace(callback);\n }\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n _setSpanForScope(scope, undefined);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n // Note: We do not wait for the callback to finish before we reset the metadata\n // the reason for this is that otherwise, in the browser this can lead to very weird behavior\n // as there is only a single top scope, if the callback takes longer to finish,\n // other, unrelated spans may also be suppressed, which we do not want\n // so instead, we only suppress tracing synchronoysly in the browser\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n const res = callback();\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: undefined });\n return res;\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n const acs = getAcs();\n if (acs.startNewTrace) {\n return acs.startNewTrace(callback);\n }\n\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom(),\n });\n DEBUG_BUILD && debug.log(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\n/**\n * The placeholder returned from `startSpan*` when `onlyIfParent` is set but there is no parent span.\n * It carries the current trace id and captured scopes so the trace data it propagates (and any nested\n * span that resolves it as its root via `getRootSpan`) reads its DSC from the scope, preserving a\n * continued trace's DSC instead of fabricating a fresh client one. Also records the dropped-span outcome.\n */\nfunction startMissingRequiredParentSpan(scope: Scope, client: Client | undefined): SentryNonRecordingSpan {\n client?.recordDroppedEvent('no_parent_span', 'span');\n const span = new SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });\n setCapturedScopesOnSpan(span, scope, getIsolationScope());\n return span;\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n const isolationScope = getIsolationScope();\n\n if (!hasSpansEnabled()) {\n const scopePropagationContext = { ...isolationScope.getPropagationContext(), ...scope.getPropagationContext() };\n const traceId = parentSpan ? parentSpan.spanContext().traceId : scopePropagationContext.traceId;\n\n // The placeholder is a thin marker; it carries no sampling decision or DSC. Both are read from\n // the scope: the sampling decision in `getTraceData`, the DSC in `getDynamicSamplingContextFromSpan`.\n const span = new SentryNonRecordingSpan({ traceId });\n\n // Nested placeholders link to their parent so `getRootSpan` resolves to the root placeholder,\n // whose captured scope is the source of truth. Root/forced placeholders are their own root.\n if (parentSpan && !forceTransaction) {\n addChildSpanToSpan(parentSpan, span);\n }\n\n // Capture scopes so consumers (e.g. SentryTraceProvider) can read them and so the DSC can be\n // resolved from the scope by `getDynamicSamplingContextFromSpan`. Consistent with `startIdleSpan`.\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n }\n\n const client = getClient();\n if (_shouldIgnoreStreamedSpan(client, spanArguments)) {\n if (!_isTracingSuppressed(scope)) {\n // if tracing is actively suppressed (Sentry.suppressTracing(...)),\n // we don't want to record a client outcome for the ignored span\n client?.recordDroppedEvent('ignored', 'span');\n }\n\n const ignoredSpan = new SentryNonRecordingSpan({\n dropReason: 'ignored',\n traceId: parentSpan?.spanContext().traceId ?? scope.getPropagationContext().traceId,\n });\n setCapturedScopesOnSpan(ignoredSpan, scope, isolationScope);\n\n return ignoredSpan;\n }\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments, isolationScope);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n isolationScope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n isolationScope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(\n spanArguments: SentrySpanArguments,\n scope: Scope,\n isolationScope: Scope,\n parentSampled?: boolean,\n): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '' } = spanArguments;\n\n const mutableSpanSamplingData = { spanAttributes: { ...spanArguments.attributes }, spanName: name, parentSampled };\n\n // we don't care about the decision for the moment; this is just a placeholder\n client?.emit('beforeSampling', mutableSpanSamplingData, { decision: false });\n\n // If hook consumers override the parentSampled flag, we will use that value instead of the actual one\n const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;\n const finalAttributes = mutableSpanSamplingData.spanAttributes;\n\n const currentPropagationContext = scope.getPropagationContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n\n const [sampled, sampleRate, localSampleRateWasApplied] = isTracingSuppressed\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled: finalParentSampled,\n attributes: finalAttributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...finalAttributes,\n },\n sampled,\n });\n\n if (!sampled && client && !isTracingSuppressed) {\n DEBUG_BUILD && debug.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', hasSpanStreamingEnabled(client) ? 'span' : 'transaction');\n }\n\n setCapturedScopesOnSpan(rootSpan, scope, isolationScope);\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(\n parentSpan: Span,\n scope: Scope,\n spanArguments: SentrySpanArguments,\n isolationScope: Scope,\n): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n const sampled = isTracingSuppressed ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n setCapturedScopesOnSpan(childSpan, scope, isolationScope);\n\n const client = getClient();\n\n if (!client) {\n return childSpan;\n }\n\n if (hasSpanStreamingEnabled(client) && spanIsNonRecordingSpan(childSpan)) {\n if (spanIsNonRecordingSpan(parentSpan) && parentSpan.dropReason) {\n // We land here if the parent span was a segment span that was ignored (`ignoreSpans`).\n // In this case, the child was also ignored (see `sampled` above) but we need to\n // record a client outcome for the child.\n childSpan.dropReason = parentSpan.dropReason;\n client.recordDroppedEvent(parentSpan.dropReason, 'span');\n } else if (!isTracingSuppressed) {\n // Otherwise, the child is not sampled due to sampling of the parent span,\n // hence we record a sample_rate client outcome for the child.\n childSpan.dropReason = 'sample_rate';\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n client.emit('afterSpanEnd', childSpan);\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope, customParentSpan: Span | null | undefined): SentrySpan | undefined {\n // always use the passed in span directly\n if (customParentSpan) {\n return customParentSpan as SentrySpan;\n }\n\n // This is different from `undefined` as it means the user explicitly wants no parent span\n if (customParentSpan === null) {\n return undefined;\n }\n\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n\n/* Checks if `ignoreSpans` applies (extracted for bundle size)*/\nfunction _shouldIgnoreStreamedSpan(client: Client | undefined, spanArguments: SentrySpanArguments): boolean {\n const ignoreSpans = client?.getOptions().ignoreSpans;\n\n if (!client || !hasSpanStreamingEnabled(client) || !ignoreSpans?.length) {\n return false;\n }\n\n return shouldIgnoreSpan(\n {\n description: spanArguments.name || '',\n op: spanArguments.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] || spanArguments.op,\n attributes: spanArguments.attributes,\n },\n ignoreSpans,\n );\n}\n\nfunction _isIgnoredSpan(span: Span): span is SentryNonRecordingSpan {\n return spanIsNonRecordingSpan(span) && span.dropReason === 'ignored';\n}\n\nfunction _isTracingSuppressed(scope: Scope): boolean {\n return scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] === true;\n}\n"],"names":["withScope","getCurrentScope","getClient","_setSpanForScope","handleCallbackErrors","spanToJSON","SPAN_STATUS_ERROR","carrier","getMainCarrier","getAsyncContextStrategy","baggage","baggageHeaderToDynamicSamplingContext","shouldContinueTrace","propagationContextFromHeaders","generateTraceId","safeMathRandom","DEBUG_BUILD","debug","SentryNonRecordingSpan","setCapturedScopesOnSpan","getIsolationScope","hasSpansEnabled","span","addChildSpanToSpan","getDynamicSamplingContextFromSpan","spanIsSampled","freezeDscOnSpan","logSpanStart","spanTimeInputToSeconds","sampleSpan","parseSampleRate","SentrySpan","SEMANTIC_ATTRIBUTE_SENTRY_SOURCE","SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE","hasSpanStreamingEnabled","spanIsNonRecordingSpan","_getSpanForScope","getRootSpan","shouldIgnoreSpan","SEMANTIC_ATTRIBUTE_SENTRY_OP"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"supports.js","sources":["../../../src/utils/supports.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { debug } from './debug-logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n new ErrorEvent('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-expect-error It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n new DOMException('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n return 'history' in WINDOW && !!WINDOW.history;\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport const supportsFetch = _isFetchSupported;\n\nfunction _isFetchSupported(): boolean {\n if (!('fetch' in WINDOW)) {\n return false;\n }\n\n try {\n new Headers();\n // Deno requires a valid URL so '' cannot be used as an argument\n new Request('data:,');\n new Response();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (typeof EdgeRuntime === 'string') {\n return true;\n }\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFunction(WINDOW.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = WINDOW.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow?.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFunction(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n DEBUG_BUILD && debug.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["GLOBAL_OBJ","DEBUG_BUILD","debug"],"mappings":"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"}
{"version":3,"file":"supports.js","sources":["../../../src/utils/supports.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { debug } from './debug-logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n new ErrorEvent('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-expect-error It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n new DOMException('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n return 'history' in WINDOW && !!WINDOW.history;\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport const supportsFetch = _isFetchSupported;\n\nfunction _isFetchSupported(): boolean {\n if (!('fetch' in WINDOW)) {\n return false;\n }\n\n try {\n new Headers();\n // Deno requires a valid URL so '' cannot be used as an argument\n new Request('data:,');\n new Response();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (typeof EdgeRuntime === 'string') {\n return true;\n }\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFunction(WINDOW.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = WINDOW.document;\n // eslint-disable-next-line typescript/no-deprecated\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow?.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFunction(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n DEBUG_BUILD && debug.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":["GLOBAL_OBJ","DEBUG_BUILD","debug"],"mappings":";;;;;;AAIA,MAAM,MAAA,GAASA,oBAAA;AAUR,SAAS,kBAAA,GAA8B;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,WAAW,EAAE,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,IAAI;AAIF,IAAA,IAAI,SAAS,EAAE,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI;AACF,IAAA,IAAI,aAAa,EAAE,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,SAAA,IAAa,MAAA,IAAU,CAAC,CAAC,MAAA,CAAO,OAAA;AACzC;AASO,MAAM,aAAA,GAAgB;AAE7B,SAAS,iBAAA,GAA6B;AACpC,EAAA,IAAI,EAAE,WAAW,MAAA,CAAA,EAAS;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,EAAQ;AAEZ,IAAA,IAAI,QAAQ,QAAQ,CAAA;AACpB,IAAA,IAAI,QAAA,EAAS;AACb,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMO,SAAS,iBAAiB,IAAA,EAAyB;AACxD,EAAA,OAAO,IAAA,IAAQ,kDAAA,CAAmD,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AACxF;AAQO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,IAAI,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AAEnB,EAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAI,aAAA,KAA8B,UAAA,EAAY;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAC5B,MAAA,IAAI,OAAA,CAAQ,eAAe,KAAA,EAAO;AAEhC,QAAA,MAAA,GAAS,gBAAA,CAAiB,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAAC,sBAAA,IAAeC,iBAAA,CAAM,IAAA,CAAK,iFAAA,EAAmF,GAAG,CAAA;AAAA,IAClH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,yBAAA,GAAqC;AACnD,EAAA,OAAO,mBAAA,IAAuB,MAAA;AAChC;AASO,SAAS,sBAAA,GAAkC;AAMhD,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,QAAQ,GAAA,EAAK;AAAA,MACf,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;;;;;;;;;"}

@@ -1,1 +0,1 @@

{"version":3,"file":"time.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { safeDateNow, withRandomSafeContext } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n /**\n * The millisecond timestamp at which measurement began, measured in Unix time.\n */\n timeOrigin: number;\n /**\n * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n */\n now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport function dateTimestampInSeconds(): number {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n // Some browser and environments don't have a performance or timeOrigin, so we fallback to\n // using Date.now() to compute the starting time.\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n\n const timeOrigin = performance.timeOrigin;\n\n // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n //\n // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n // correct for this.\n // See: https://github.com/getsentry/sentry-javascript/issues/2590\n // See: https://github.com/mdn/content/issues/4713\n // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\n\nlet _cachedTimestampInSeconds: (() => number) | undefined;\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport function timestampInSeconds(): number {\n // We store this in a closure so that we don't have to create a new function every time this is called.\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\n\n/**\n * Cached result of getBrowserTimeOrigin.\n */\nlet cachedTimeOrigin: number | null | undefined = null;\n\n/**\n * Gets the time origin and the mode used to determine it.\n *\n * Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n * performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n * data as reliable if they are within a reasonable threshold of the current time.\n *\n * TODO: move to `@sentry/browser-utils` package.\n */\nfunction getBrowserTimeOrigin(): number | undefined {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n if (!performance?.now) {\n return undefined;\n }\n\n const threshold = 300_000; // 5 minutes in milliseconds\n const performanceNow = withRandomSafeContext(() => performance.now());\n const dateNow = safeDateNow();\n\n const timeOrigin = performance.timeOrigin;\n if (typeof timeOrigin === 'number') {\n const timeOriginDelta = Math.abs(timeOrigin + performanceNow - dateNow);\n if (timeOriginDelta < threshold) {\n return timeOrigin;\n }\n }\n\n // TODO: Remove all code related to `performance.timing.navigationStart` once we drop support for Safari 14.\n // `performance.timeSince` is available in Safari 15.\n // see: https://caniuse.com/mdn-api_performance_timeorigin\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n const navigationStart = performance.timing?.navigationStart;\n if (typeof navigationStart === 'number') {\n const navigationStartDelta = Math.abs(navigationStart + performanceNow - dateNow);\n if (navigationStartDelta < threshold) {\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to subtracting\n // `performance.now()` from `Date.now()`.\n return dateNow - performanceNow;\n}\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport function browserPerformanceTimeOrigin(): number | undefined {\n if (cachedTimeOrigin === null) {\n cachedTimeOrigin = getBrowserTimeOrigin();\n }\n\n return cachedTimeOrigin;\n}\n"],"names":["safeDateNow","GLOBAL_OBJ","withRandomSafeContext"],"mappings":";;;;;AAGA,MAAM,gBAAA,GAAmB,GAAA;AAoBlB,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAOA,+BAAY,GAAI,gBAAA;AACzB;AAQA,SAAS,gCAAA,GAAiD;AACxD,EAAA,MAAM,EAAE,aAAY,GAAIC,oBAAA;AAGxB,EAAA,IAAI,CAAC,WAAA,EAAa,GAAA,IAAO,CAAC,YAAY,UAAA,EAAY;AAChD,IAAA,OAAO,sBAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAW/B,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,aAAaC,uCAAA,CAAsB,MAAM,WAAA,CAAY,GAAA,EAAK,CAAA,IAAK,gBAAA;AAAA,EACzE,CAAA;AACF;AAEA,IAAI,yBAAA;AAWG,SAAS,kBAAA,GAA6B;AAE3C,EAAA,MAAM,IAAA,GAAO,yBAAA,KAA8B,yBAAA,GAA4B,gCAAA,EAAiC,CAAA;AACxG,EAAA,OAAO,IAAA,EAAK;AACd;AAKA,IAAI,gBAAA,GAA8C,IAAA;AAWlD,SAAS,oBAAA,GAA2C;AAClD,EAAA,MAAM,EAAE,aAAY,GAAID,oBAAA;AACxB,EAAA,IAAI,CAAC,aAAa,GAAA,EAAK;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,MAAM,cAAA,GAAiBC,uCAAA,CAAsB,MAAM,WAAA,CAAY,KAAK,CAAA;AACpE,EAAA,MAAM,UAAUF,6BAAA,EAAY;AAE5B,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAC/B,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,iBAAiB,OAAO,CAAA;AACtE,IAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAYA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAA,EAAQ,eAAA;AAC5C,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,eAAA,GAAkB,iBAAiB,OAAO,CAAA;AAChF,IAAA,IAAI,uBAAuB,SAAA,EAAW;AACpC,MAAA,OAAO,eAAA;AAAA,IACT;AAAA,EACF;AAIA,EAAA,OAAO,OAAA,GAAU,cAAA;AACnB;AAMO,SAAS,4BAAA,GAAmD;AACjE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,gBAAA,GAAmB,oBAAA,EAAqB;AAAA,EAC1C;AAEA,EAAA,OAAO,gBAAA;AACT;;;;;;"}
{"version":3,"file":"time.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { safeDateNow, withRandomSafeContext } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n /**\n * The millisecond timestamp at which measurement began, measured in Unix time.\n */\n timeOrigin: number;\n /**\n * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n */\n now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport function dateTimestampInSeconds(): number {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n // Some browser and environments don't have a performance or timeOrigin, so we fallback to\n // using Date.now() to compute the starting time.\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n\n const timeOrigin = performance.timeOrigin;\n\n // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n //\n // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n // correct for this.\n // See: https://github.com/getsentry/sentry-javascript/issues/2590\n // See: https://github.com/mdn/content/issues/4713\n // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\n\nlet _cachedTimestampInSeconds: (() => number) | undefined;\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport function timestampInSeconds(): number {\n // We store this in a closure so that we don't have to create a new function every time this is called.\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\n\n/**\n * Cached result of getBrowserTimeOrigin.\n */\nlet cachedTimeOrigin: number | null | undefined = null;\n\n/**\n * Gets the time origin and the mode used to determine it.\n *\n * Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n * performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n * data as reliable if they are within a reasonable threshold of the current time.\n *\n * TODO: move to `@sentry/browser-utils` package.\n */\nfunction getBrowserTimeOrigin(): number | undefined {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n if (!performance?.now) {\n return undefined;\n }\n\n const threshold = 300_000; // 5 minutes in milliseconds\n const performanceNow = withRandomSafeContext(() => performance.now());\n const dateNow = safeDateNow();\n\n const timeOrigin = performance.timeOrigin;\n if (typeof timeOrigin === 'number') {\n const timeOriginDelta = Math.abs(timeOrigin + performanceNow - dateNow);\n if (timeOriginDelta < threshold) {\n return timeOrigin;\n }\n }\n\n // TODO: Remove all code related to `performance.timing.navigationStart` once we drop support for Safari 14.\n // `performance.timeSince` is available in Safari 15.\n // see: https://caniuse.com/mdn-api_performance_timeorigin\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line typescript/no-deprecated\n const navigationStart = performance.timing?.navigationStart;\n if (typeof navigationStart === 'number') {\n const navigationStartDelta = Math.abs(navigationStart + performanceNow - dateNow);\n if (navigationStartDelta < threshold) {\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to subtracting\n // `performance.now()` from `Date.now()`.\n return dateNow - performanceNow;\n}\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport function browserPerformanceTimeOrigin(): number | undefined {\n if (cachedTimeOrigin === null) {\n cachedTimeOrigin = getBrowserTimeOrigin();\n }\n\n return cachedTimeOrigin;\n}\n"],"names":["safeDateNow","GLOBAL_OBJ","withRandomSafeContext"],"mappings":";;;;;AAGA,MAAM,gBAAA,GAAmB,GAAA;AAoBlB,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAOA,+BAAY,GAAI,gBAAA;AACzB;AAQA,SAAS,gCAAA,GAAiD;AACxD,EAAA,MAAM,EAAE,aAAY,GAAIC,oBAAA;AAGxB,EAAA,IAAI,CAAC,WAAA,EAAa,GAAA,IAAO,CAAC,YAAY,UAAA,EAAY;AAChD,IAAA,OAAO,sBAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAW/B,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,aAAaC,uCAAA,CAAsB,MAAM,WAAA,CAAY,GAAA,EAAK,CAAA,IAAK,gBAAA;AAAA,EACzE,CAAA;AACF;AAEA,IAAI,yBAAA;AAWG,SAAS,kBAAA,GAA6B;AAE3C,EAAA,MAAM,IAAA,GAAO,yBAAA,KAA8B,yBAAA,GAA4B,gCAAA,EAAiC,CAAA;AACxG,EAAA,OAAO,IAAA,EAAK;AACd;AAKA,IAAI,gBAAA,GAA8C,IAAA;AAWlD,SAAS,oBAAA,GAA2C;AAClD,EAAA,MAAM,EAAE,aAAY,GAAID,oBAAA;AACxB,EAAA,IAAI,CAAC,aAAa,GAAA,EAAK;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,MAAM,cAAA,GAAiBC,uCAAA,CAAsB,MAAM,WAAA,CAAY,KAAK,CAAA;AACpE,EAAA,MAAM,UAAUF,6BAAA,EAAY;AAE5B,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAC/B,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,iBAAiB,OAAO,CAAA;AACtE,IAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAYA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAA,EAAQ,eAAA;AAC5C,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,eAAA,GAAkB,iBAAiB,OAAO,CAAA;AAChF,IAAA,IAAI,uBAAuB,SAAA,EAAW;AACpC,MAAA,OAAO,eAAA;AAAA,IACT;AAAA,EACF;AAIA,EAAA,OAAO,OAAA,GAAU,cAAA;AACnB;AAMO,SAAS,4BAAA,GAAmD;AACjE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,gBAAA,GAAmB,oBAAA,EAAqB;AAAA,EAC1C;AAEA,EAAA,OAAO,gBAAA;AACT;;;;;;"}

@@ -9,2 +9,4 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });

const spanUtils = require('./spanUtils.js');
const hasSpansEnabled = require('./hasSpansEnabled.js');
const sentryNonRecordingSpan = require('../tracing/sentryNonRecordingSpan.js');
const dynamicSamplingContext = require('../tracing/dynamicSamplingContext.js');

@@ -26,6 +28,7 @@ const baggage = require('./baggage.js');

const span = options.span || spanUtils.getActiveSpan();
const isTwpPlaceholder = sentryNonRecordingSpan.spanIsNonRecordingSpan(span) && !hasSpansEnabled.hasSpansEnabled(client.getOptions());
if (!span && currentScopes.hasExternalPropagationContext()) {
return {};
}
const sentryTrace = span ? spanUtils.spanToTraceHeader(span) : scopeToTraceHeader(scope);
const sentryTrace = span && !isTwpPlaceholder ? spanUtils.spanToTraceHeader(span) : scopeToTraceHeader(scope);
const dsc = span ? dynamicSamplingContext.getDynamicSamplingContextFromSpan(span) : dynamicSamplingContext.getDynamicSamplingContextFromScope(client, scope);

@@ -43,3 +46,3 @@ const baggage$1 = baggage.dynamicSamplingContextToSentryBaggageHeader(dsc);

if (options.propagateTraceparent) {
traceData.traceparent = span ? spanUtils.spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);
traceData.traceparent = span && !isTwpPlaceholder ? spanUtils.spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);
}

@@ -46,0 +49,0 @@ return traceData;

@@ -1,1 +0,1 @@

{"version":3,"file":"traceData.js","sources":["../../../src/utils/traceData.ts"],"sourcesContent":["import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, hasExternalPropagationContext } from '../currentScopes';\nimport { isEnabled } from '../exports';\nimport type { Scope } from '../scope';\nimport { getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan } from '../tracing';\nimport type { Span } from '../types/span';\nimport type { SerializedTraceData } from '../types/tracing';\nimport { dynamicSamplingContextToSentryBaggageHeader } from './baggage';\nimport { debug } from './debug-logger';\nimport { getActiveSpan, spanToTraceHeader, spanToTraceparentHeader } from './spanUtils';\nimport { generateSentryTraceHeader, generateTraceparentHeader, TRACEPARENT_REGEXP } from './tracing';\n\n/**\n * Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation\n * context) and serializes it to `sentry-trace` and `baggage` values. These values can be used to propagate\n * a trace via our tracing Http headers or Html `<meta>` tags.\n *\n * This function also applies some validation to the generated sentry-trace and baggage values to ensure that\n * only valid strings are returned.\n *\n * When an external propagation context is registered (e.g. via the OTLP integration) and there is no active\n * Sentry span, this function returns an empty object to defer outgoing request propagation to the external\n * propagator (e.g. an OpenTelemetry propagator).\n *\n * If (@param options.propagateTraceparent) is `true`, the function will also generate a `traceparent` value,\n * following the W3C traceparent header format.\n *\n * @returns an object with the tracing data values. The object keys are the name of the tracing key to be used as header\n * or meta tag name.\n */\nexport function getTraceData(\n options: { span?: Span; scope?: Scope; client?: Client; propagateTraceparent?: boolean } = {},\n): SerializedTraceData {\n const client = options.client || getClient();\n if (!isEnabled() || !client) {\n return {};\n }\n\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getTraceData) {\n return acs.getTraceData(options);\n }\n\n const scope = options.scope || getCurrentScope();\n const span = options.span || getActiveSpan();\n\n // When no active span and external propagation context is registered (e.g. OTLP integration),\n // return empty to let the OTel propagator handle outgoing request propagation.\n if (!span && hasExternalPropagationContext()) {\n return {};\n }\n\n const sentryTrace = span ? spanToTraceHeader(span) : scopeToTraceHeader(scope);\n const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);\n const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);\n\n const isValidSentryTraceHeader = TRACEPARENT_REGEXP.test(sentryTrace);\n if (!isValidSentryTraceHeader) {\n debug.warn('Invalid sentry-trace data. Cannot generate trace data');\n return {};\n }\n\n const traceData: SerializedTraceData = {\n 'sentry-trace': sentryTrace,\n baggage,\n };\n\n if (options.propagateTraceparent) {\n traceData.traceparent = span ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);\n }\n\n return traceData;\n}\n\n/**\n * Get a sentry-trace header value for the given scope.\n */\nfunction scopeToTraceHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateSentryTraceHeader(traceId, propagationSpanId, sampled);\n}\n\nfunction scopeToTraceparentHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateTraceparentHeader(traceId, propagationSpanId, sampled);\n}\n"],"names":["getClient","isEnabled","carrier","getMainCarrier","getAsyncContextStrategy","getCurrentScope","getActiveSpan","hasExternalPropagationContext","spanToTraceHeader","getDynamicSamplingContextFromSpan","getDynamicSamplingContextFromScope","baggage","dynamicSamplingContextToSentryBaggageHeader","TRACEPARENT_REGEXP","debug","spanToTraceparentHeader","generateSentryTraceHeader","generateTraceparentHeader"],"mappings":";;;;;;;;;;;;AAgCO,SAAS,YAAA,CACd,OAAA,GAA2F,EAAC,EACvE;AACrB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAUA,uBAAA,EAAU;AAC3C,EAAA,IAAI,CAACC,mBAAA,EAAU,IAAK,CAAC,MAAA,EAAQ;AAC3B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAMC,YAAUC,sBAAA,EAAe;AAC/B,EAAA,MAAM,GAAA,GAAMC,8BAAwBF,SAAO,CAAA;AAC3C,EAAA,IAAI,IAAI,YAAA,EAAc;AACpB,IAAA,OAAO,GAAA,CAAI,aAAa,OAAO,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAASG,6BAAA,EAAgB;AAC/C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQC,uBAAA,EAAc;AAI3C,EAAA,IAAI,CAAC,IAAA,IAAQC,2CAAA,EAA8B,EAAG;AAC5C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,cAAc,IAAA,GAAOC,2BAAA,CAAkB,IAAI,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAC7E,EAAA,MAAM,MAAM,IAAA,GAAOC,wDAAA,CAAkC,IAAI,CAAA,GAAIC,yDAAA,CAAmC,QAAQ,KAAK,CAAA;AAC7G,EAAA,MAAMC,SAAA,GAAUC,oDAA4C,GAAG,CAAA;AAE/D,EAAA,MAAM,wBAAA,GAA2BC,0BAAA,CAAmB,IAAA,CAAK,WAAW,CAAA;AACpE,EAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,IAAAC,iBAAA,CAAM,KAAK,uDAAuD,CAAA;AAClE,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,cAAA,EAAgB,WAAA;AAAA,aAChBH;AAAA,GACF;AAEA,EAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,IAAA,SAAA,CAAU,cAAc,IAAA,GAAOI,iCAAA,CAAwB,IAAI,CAAA,GAAI,yBAAyB,KAAK,CAAA;AAAA,EAC/F;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,mBAAmB,KAAA,EAAsB;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAOC,iCAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;AAEA,SAAS,yBAAyB,KAAA,EAAsB;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAOC,iCAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;;;;"}
{"version":3,"file":"traceData.js","sources":["../../../src/utils/traceData.ts"],"sourcesContent":["import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, hasExternalPropagationContext } from '../currentScopes';\nimport { isEnabled } from '../exports';\nimport type { Scope } from '../scope';\nimport { getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan } from '../tracing';\nimport { spanIsNonRecordingSpan } from '../tracing/sentryNonRecordingSpan';\nimport type { Span } from '../types/span';\nimport type { SerializedTraceData } from '../types/tracing';\nimport { dynamicSamplingContextToSentryBaggageHeader } from './baggage';\nimport { debug } from './debug-logger';\nimport { hasSpansEnabled } from './hasSpansEnabled';\nimport { getActiveSpan, spanToTraceHeader, spanToTraceparentHeader } from './spanUtils';\nimport { generateSentryTraceHeader, generateTraceparentHeader, TRACEPARENT_REGEXP } from './tracing';\n\n/**\n * Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation\n * context) and serializes it to `sentry-trace` and `baggage` values. These values can be used to propagate\n * a trace via our tracing Http headers or Html `<meta>` tags.\n *\n * This function also applies some validation to the generated sentry-trace and baggage values to ensure that\n * only valid strings are returned.\n *\n * When an external propagation context is registered (e.g. via the OTLP integration) and there is no active\n * Sentry span, this function returns an empty object to defer outgoing request propagation to the external\n * propagator (e.g. an OpenTelemetry propagator).\n *\n * If (@param options.propagateTraceparent) is `true`, the function will also generate a `traceparent` value,\n * following the W3C traceparent header format.\n *\n * @returns an object with the tracing data values. The object keys are the name of the tracing key to be used as header\n * or meta tag name.\n */\nexport function getTraceData(\n options: { span?: Span; scope?: Scope; client?: Client; propagateTraceparent?: boolean } = {},\n): SerializedTraceData {\n const client = options.client || getClient();\n if (!isEnabled() || !client) {\n return {};\n }\n\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getTraceData) {\n return acs.getTraceData(options);\n }\n\n const scope = options.scope || getCurrentScope();\n const span = options.span || getActiveSpan();\n\n // In Tracing-without-Performance (TwP) mode, spans are non-recording placeholders that carry no\n // sampling decision of their own (it's deferred). The scope is the source of truth, so we read\n // the trace headers from the scope. A non-recording span in *tracing* mode (e.g. an unsampled\n // child or an ignored span) is different: it represents an explicit negative decision, which\n // `spanToTraceHeader` correctly encodes as `-0`, so we keep reading those from the span.\n const isTwpPlaceholder = spanIsNonRecordingSpan(span) && !hasSpansEnabled(client.getOptions());\n\n // When there's no recording span and an external propagation context is registered (e.g. OTLP\n // integration), return empty to let the external propagator handle outgoing request propagation.\n if (!span && hasExternalPropagationContext()) {\n return {};\n }\n\n const sentryTrace = span && !isTwpPlaceholder ? spanToTraceHeader(span) : scopeToTraceHeader(scope);\n const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);\n const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);\n\n const isValidSentryTraceHeader = TRACEPARENT_REGEXP.test(sentryTrace);\n if (!isValidSentryTraceHeader) {\n debug.warn('Invalid sentry-trace data. Cannot generate trace data');\n return {};\n }\n\n const traceData: SerializedTraceData = {\n 'sentry-trace': sentryTrace,\n baggage,\n };\n\n if (options.propagateTraceparent) {\n traceData.traceparent = span && !isTwpPlaceholder ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);\n }\n\n return traceData;\n}\n\n/**\n * Get a sentry-trace header value for the given scope.\n */\nfunction scopeToTraceHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateSentryTraceHeader(traceId, propagationSpanId, sampled);\n}\n\nfunction scopeToTraceparentHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateTraceparentHeader(traceId, propagationSpanId, sampled);\n}\n"],"names":["getClient","isEnabled","carrier","getMainCarrier","getAsyncContextStrategy","getCurrentScope","getActiveSpan","spanIsNonRecordingSpan","hasSpansEnabled","hasExternalPropagationContext","spanToTraceHeader","getDynamicSamplingContextFromSpan","getDynamicSamplingContextFromScope","baggage","dynamicSamplingContextToSentryBaggageHeader","TRACEPARENT_REGEXP","debug","spanToTraceparentHeader","generateSentryTraceHeader","generateTraceparentHeader"],"mappings":";;;;;;;;;;;;;;AAkCO,SAAS,YAAA,CACd,OAAA,GAA2F,EAAC,EACvE;AACrB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAUA,uBAAA,EAAU;AAC3C,EAAA,IAAI,CAACC,mBAAA,EAAU,IAAK,CAAC,MAAA,EAAQ;AAC3B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAMC,YAAUC,sBAAA,EAAe;AAC/B,EAAA,MAAM,GAAA,GAAMC,8BAAwBF,SAAO,CAAA;AAC3C,EAAA,IAAI,IAAI,YAAA,EAAc;AACpB,IAAA,OAAO,GAAA,CAAI,aAAa,OAAO,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAASG,6BAAA,EAAgB;AAC/C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQC,uBAAA,EAAc;AAO3C,EAAA,MAAM,gBAAA,GAAmBC,8CAAuB,IAAI,CAAA,IAAK,CAACC,+BAAA,CAAgB,MAAA,CAAO,YAAY,CAAA;AAI7F,EAAA,IAAI,CAAC,IAAA,IAAQC,2CAAA,EAA8B,EAAG;AAC5C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,WAAA,GAAc,QAAQ,CAAC,gBAAA,GAAmBC,4BAAkB,IAAI,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAClG,EAAA,MAAM,MAAM,IAAA,GAAOC,wDAAA,CAAkC,IAAI,CAAA,GAAIC,yDAAA,CAAmC,QAAQ,KAAK,CAAA;AAC7G,EAAA,MAAMC,SAAA,GAAUC,oDAA4C,GAAG,CAAA;AAE/D,EAAA,MAAM,wBAAA,GAA2BC,0BAAA,CAAmB,IAAA,CAAK,WAAW,CAAA;AACpE,EAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,IAAAC,iBAAA,CAAM,KAAK,uDAAuD,CAAA;AAClE,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,cAAA,EAAgB,WAAA;AAAA,aAChBH;AAAA,GACF;AAEA,EAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,IAAA,SAAA,CAAU,WAAA,GAAc,QAAQ,CAAC,gBAAA,GAAmBI,kCAAwB,IAAI,CAAA,GAAI,yBAAyB,KAAK,CAAA;AAAA,EACpH;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,mBAAmB,KAAA,EAAsB;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAOC,iCAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;AAEA,SAAS,yBAAyB,KAAA,EAAsB;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAOC,iCAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;;;;"}
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const SDK_VERSION = "10.58.0" ;
const SDK_VERSION = "10.59.0" ;
exports.SDK_VERSION = SDK_VERSION;
//# sourceMappingURL=version.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"escapeStringForRegex.js","sources":["../../../src/vendor/escapeStringForRegex.ts"],"sourcesContent":["// Based on https://github.com/sindresorhus/escape-string-regexp but with modifications to:\n// a) reduce the size by skipping the runtime type - checking\n// b) ensure it gets down - compiled for old versions of Node(the published package only supports Node 14+).\n//\n// MIT License\n//\n// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and\n// to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n// the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString: string): string {\n // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n"],"names":[],"mappings":";;AA6BO,SAAS,qBAAqB,WAAA,EAA6B;AAGhE,EAAA,OAAO,YAAY,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAO,CAAA;AACjF;;;;"}
{"version":3,"file":"escapeStringForRegex.js","sources":["../../../src/vendor/escapeStringForRegex.ts"],"sourcesContent":["// Based on https://github.com/sindresorhus/escape-string-regexp but with modifications to:\n// a) reduce the size by skipping the runtime type - checking\n// b) ensure it gets down - compiled for old versions of Node(the published package only supports Node 14+).\n//\n// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n// SPDX-License-Identifier: MIT\n\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString: string): string {\n // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n"],"names":[],"mappings":";;AAcO,SAAS,qBAAqB,WAAA,EAA6B;AAGhE,EAAA,OAAO,YAAY,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAO,CAAA;AACjF;;;;"}

@@ -1,1 +0,1 @@

{"version":3,"file":"getIpAddress.js","sources":["../../../src/vendor/getIpAddress.ts"],"sourcesContent":["// Vendored / modified from @sergiodxa/remix-utils\n\n// https://github.com/sergiodxa/remix-utils/blob/02af80e12829a53696bfa8f3c2363975cf59f55e/src/server/get-client-ip-address.ts\n// MIT License\n\n// Copyright (c) 2021 Sergio Xalambrí\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// The headers to check, in priority order\nexport const ipHeaderNames = [\n 'X-Client-IP',\n 'X-Forwarded-For',\n 'Fly-Client-IP',\n 'CF-Connecting-IP',\n 'Fastly-Client-Ip',\n 'True-Client-Ip',\n 'X-Real-IP',\n 'X-Cluster-Client-IP',\n 'X-Forwarded',\n 'Forwarded-For',\n 'Forwarded',\n 'X-Vercel-Forwarded-For',\n];\n\n/**\n * Get the IP address of the client sending a request.\n *\n * It receives a Request headers object and use it to get the\n * IP address from one of the following headers in order.\n *\n * If the IP address is valid, it will be returned. Otherwise, null will be\n * returned.\n *\n * If the header values contains more than one IP address, the first valid one\n * will be returned.\n */\nexport function getClientIPAddress(headers: { [key: string]: string | string[] | undefined }): string | null {\n // Build a map of lowercase header names to their values for case-insensitive lookup\n // This is needed because headers from different sources may have different casings\n const lowerCaseHeaders: { [key: string]: string | string[] | undefined } = {};\n\n for (const key of Object.keys(headers)) {\n lowerCaseHeaders[key.toLowerCase()] = headers[key];\n }\n\n // This will end up being Array<string | string[] | undefined | null> because of the various possible values a header\n // can take\n const headerValues = ipHeaderNames.map((headerName: string) => {\n const rawValue = lowerCaseHeaders[headerName.toLowerCase()];\n const value = Array.isArray(rawValue) ? rawValue.join(';') : rawValue;\n\n if (headerName === 'Forwarded') {\n return parseForwardedHeader(value);\n }\n\n return value?.split(',').map((v: string) => v.trim());\n });\n\n // Flatten the array and filter out any falsy entries\n const flattenedHeaderValues = headerValues.reduce((acc: string[], val) => {\n if (!val) {\n return acc;\n }\n\n return acc.concat(val);\n }, []);\n\n // Find the first value which is a valid IP address, if any\n const ipAddress = flattenedHeaderValues.find(ip => ip !== null && isIP(ip));\n\n return ipAddress || null;\n}\n\nfunction parseForwardedHeader(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n\n for (const part of value.split(';')) {\n if (part.startsWith('for=')) {\n return part.slice(4);\n }\n }\n\n return null;\n}\n\n//\n/**\n * Custom method instead of importing this from `net` package, as this only exists in node\n * Accepts:\n * 127.0.0.1\n * 192.168.1.1\n * 192.168.1.255\n * 255.255.255.255\n * 10.1.1.1\n * 0.0.0.0\n * 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5\n *\n * Rejects:\n * 1.1.1.01\n * 30.168.1.255.1\n * 127.1\n * 192.168.1.256\n * -1.2.3.4\n * 1.1.1.1.\n * 3...3\n * 192.168.1.099\n */\nfunction isIP(str: string): boolean {\n const regex =\n /(?:^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$)|(?:^(?:(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$)/;\n return regex.test(str);\n}\n"],"names":[],"mappings":";;AA0BO,MAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAcO,SAAS,mBAAmB,OAAA,EAA0E;AAG3G,EAAA,MAAM,mBAAqE,EAAC;AAE5E,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,EACnD;AAIA,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,UAAA,KAAuB;AAC7D,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,WAAA,EAAa,CAAA;AAC1D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AAE7D,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EACtD,CAAC,CAAA;AAGD,EAAA,MAAM,qBAAA,GAAwB,YAAA,CAAa,MAAA,CAAO,CAAC,KAAe,GAAA,KAAQ;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAY,sBAAsB,IAAA,CAAK,CAAA,EAAA,KAAM,OAAO,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAE1E,EAAA,OAAO,SAAA,IAAa,IAAA;AACtB;AAEA,SAAS,qBAAqB,KAAA,EAAiD;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAwBA,SAAS,KAAK,GAAA,EAAsB;AAClC,EAAA,MAAM,KAAA,GACJ,muCAAA;AACF,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;;;;;"}
{"version":3,"file":"getIpAddress.js","sources":["../../../src/vendor/getIpAddress.ts"],"sourcesContent":["// Vendored / modified from @sergiodxa/remix-utils\n\n// https://github.com/sergiodxa/remix-utils/blob/02af80e12829a53696bfa8f3c2363975cf59f55e/src/server/get-client-ip-address.ts\n// Copyright (c) 2021 Sergio Xalambrí\n// SPDX-License-Identifier: MIT\n\n// The headers to check, in priority order\nexport const ipHeaderNames = [\n 'X-Client-IP',\n 'X-Forwarded-For',\n 'Fly-Client-IP',\n 'CF-Connecting-IP',\n 'Fastly-Client-Ip',\n 'True-Client-Ip',\n 'X-Real-IP',\n 'X-Cluster-Client-IP',\n 'X-Forwarded',\n 'Forwarded-For',\n 'Forwarded',\n 'X-Vercel-Forwarded-For',\n];\n\n/**\n * Get the IP address of the client sending a request.\n *\n * It receives a Request headers object and use it to get the\n * IP address from one of the following headers in order.\n *\n * If the IP address is valid, it will be returned. Otherwise, null will be\n * returned.\n *\n * If the header values contains more than one IP address, the first valid one\n * will be returned.\n */\nexport function getClientIPAddress(headers: { [key: string]: string | string[] | undefined }): string | null {\n // Build a map of lowercase header names to their values for case-insensitive lookup\n // This is needed because headers from different sources may have different casings\n const lowerCaseHeaders: { [key: string]: string | string[] | undefined } = {};\n\n for (const key of Object.keys(headers)) {\n lowerCaseHeaders[key.toLowerCase()] = headers[key];\n }\n\n // This will end up being Array<string | string[] | undefined | null> because of the various possible values a header\n // can take\n const headerValues = ipHeaderNames.map((headerName: string) => {\n const rawValue = lowerCaseHeaders[headerName.toLowerCase()];\n const value = Array.isArray(rawValue) ? rawValue.join(';') : rawValue;\n\n if (headerName === 'Forwarded') {\n return parseForwardedHeader(value);\n }\n\n return value?.split(',').map((v: string) => v.trim());\n });\n\n // Flatten the array and filter out any falsy entries\n const flattenedHeaderValues = headerValues.reduce((acc: string[], val) => {\n if (!val) {\n return acc;\n }\n\n return acc.concat(val);\n }, []);\n\n // Find the first value which is a valid IP address, if any\n const ipAddress = flattenedHeaderValues.find(ip => ip !== null && isIP(ip));\n\n return ipAddress || null;\n}\n\nfunction parseForwardedHeader(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n\n for (const part of value.split(';')) {\n if (part.startsWith('for=')) {\n return part.slice(4);\n }\n }\n\n return null;\n}\n\n//\n/**\n * Custom method instead of importing this from `net` package, as this only exists in node\n * Accepts:\n * 127.0.0.1\n * 192.168.1.1\n * 192.168.1.255\n * 255.255.255.255\n * 10.1.1.1\n * 0.0.0.0\n * 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5\n *\n * Rejects:\n * 1.1.1.01\n * 30.168.1.255.1\n * 127.1\n * 192.168.1.256\n * -1.2.3.4\n * 1.1.1.1.\n * 3...3\n * 192.168.1.099\n */\nfunction isIP(str: string): boolean {\n const regex =\n /(?:^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$)|(?:^(?:(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$)/;\n return regex.test(str);\n}\n"],"names":[],"mappings":";;AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAcO,SAAS,mBAAmB,OAAA,EAA0E;AAG3G,EAAA,MAAM,mBAAqE,EAAC;AAE5E,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,EACnD;AAIA,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,UAAA,KAAuB;AAC7D,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,WAAA,EAAa,CAAA;AAC1D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AAE7D,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EACtD,CAAC,CAAA;AAGD,EAAA,MAAM,qBAAA,GAAwB,YAAA,CAAa,MAAA,CAAO,CAAC,KAAe,GAAA,KAAQ;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAY,sBAAsB,IAAA,CAAK,CAAA,EAAA,KAAM,OAAO,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAE1E,EAAA,OAAO,SAAA,IAAa,IAAA;AACtB;AAEA,SAAS,qBAAqB,KAAA,EAAiD;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAwBA,SAAS,KAAK,GAAA,EAAsB;AAClC,EAAA,MAAM,KAAA,GACJ,muCAAA;AACF,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;;;;;"}

@@ -7,4 +7,4 @@ import { getClient } from './currentScopes.js';

import { hasSpansEnabled } from './utils/hasSpansEnabled.js';
import { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan.js';
import { SENTRY_BAGGAGE_KEY_PREFIX } from './utils/baggage.js';
import { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan.js';
import { hasSpanStreamingEnabled } from './tracing/spans/hasSpanStreamingEnabled.js';

@@ -11,0 +11,0 @@ import { startInactiveSpan } from './tracing/trace.js';

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../../../src/integrations/express/index.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debug } from '../../utils/debug-logger';\nimport { captureException } from '../../exports';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n ExpressApplication,\n ExpressErrorMiddleware,\n ExpressHandlerOptions,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressMiddleware,\n ExpressModuleExport,\n ExpressRequest,\n ExpressResponse,\n ExpressRouter,\n ExpressRouterv4,\n ExpressRouterv5,\n MiddlewareError,\n} from './types';\nimport {\n defaultShouldHandleError,\n getLayerPath,\n isExpressWithoutRouterPrototype,\n isExpressWithRouterPrototype,\n} from './utils';\nimport { wrapMethod } from '../../utils/object';\nimport { patchLayer } from './patch-layer';\nimport { setSDKProcessingMetadata } from './set-sdk-processing-metadata';\nimport { getDefaultExport } from '../../utils/get-default-export';\n\nfunction isLegacyOptions(\n options: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n): options is ExpressIntegrationOptions & { express: ExpressModuleExport } {\n return !!(options as { express: ExpressModuleExport }).express;\n}\n\n// TODO: remove this deprecation handling in v11\nlet didLegacyDeprecationWarning = false;\nfunction deprecationWarning() {\n if (!didLegacyDeprecationWarning) {\n didLegacyDeprecationWarning = true;\n DEBUG_BUILD &&\n debug.warn(\n '[Express] `patchExpressModule(options)` is deprecated. Use `patchExpressModule(moduleExports, getOptions)` instead.',\n );\n }\n}\n\n/**\n * This is a portable instrumentatiton function that works in any environment\n * where Express can be loaded, without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import express from 'express';\n * import * as Sentry from '@sentry/deno'; // or any SDK that extends core\n *\n * Sentry.patchExpressModule(express, () => ({}));\n * ```\n */\nexport function patchExpressModule(\n moduleExports: ExpressModuleExport,\n getOptions: () => ExpressIntegrationOptions,\n): ExpressModuleExport;\n/**\n * @deprecated Pass the Express module export as the first argument and options getter as the second argument.\n */\nexport function patchExpressModule(\n options: ExpressIntegrationOptions & { express: ExpressModuleExport },\n): ExpressModuleExport;\nexport function patchExpressModule(\n optionsOrExports: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n maybeGetOptions?: () => ExpressIntegrationOptions,\n): ExpressModuleExport {\n let getOptions: () => ExpressIntegrationOptions;\n let moduleExports: ExpressModuleExport;\n if (!maybeGetOptions && isLegacyOptions(optionsOrExports)) {\n const { express, ...options } = optionsOrExports;\n moduleExports = express;\n getOptions = () => options;\n deprecationWarning();\n } else if (typeof maybeGetOptions !== 'function') {\n throw new TypeError('`patchExpressModule(moduleExports, getOptions)` requires a `getOptions` callback');\n } else {\n getOptions = maybeGetOptions;\n moduleExports = optionsOrExports as ExpressModuleExport;\n }\n\n // pass in the require() or import() result of express\n const express = getDefaultExport(moduleExports);\n const routerProto: ExpressRouterv4 | ExpressRouterv5 | undefined = isExpressWithRouterPrototype(express)\n ? express.Router.prototype // Express v5\n : isExpressWithoutRouterPrototype(express)\n ? express.Router // Express v4\n : undefined;\n\n if (!routerProto) {\n throw new TypeError('no valid Express route function to instrument');\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouteMethod = routerProto.route;\n try {\n wrapMethod(\n routerProto,\n 'route',\n function routeTrace(this: ExpressRouter, ...args: Parameters<typeof originalRouteMethod>[]) {\n const route = originalRouteMethod.apply(this, args);\n const layer = this.stack[this.stack.length - 1] as ExpressLayer;\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express route method:', e);\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouterUse = routerProto.use;\n try {\n wrapMethod(\n routerProto,\n 'use',\n function useTrace(this: ExpressApplication, ...args: Parameters<typeof originalRouterUse>) {\n const route = originalRouterUse.apply(this, args);\n const layer = this.stack[this.stack.length - 1];\n if (!layer) {\n return route;\n }\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express use method:', e);\n }\n\n const { application } = express;\n const originalApplicationUse = application.use;\n try {\n wrapMethod(\n application,\n 'use',\n function appUseTrace(\n this: ExpressApplication & {\n _router?: ExpressRouter;\n router?: ExpressRouter;\n },\n ...args: Parameters<ExpressApplication['use']>\n ) {\n // If we access app.router in express 4.x we trigger an assertion error.\n // This property existed in v3, was removed in v4 and then re-added in v5.\n const route = originalApplicationUse.apply(this, args);\n const router = isExpressWithRouterPrototype(express) ? this.router : this._router;\n if (router) {\n const layer = router.stack[router.stack.length - 1];\n if (layer) {\n patchLayer(getOptions, layer, getLayerPath(args));\n }\n }\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express application.use method:', e);\n }\n\n return express;\n}\n\n/**\n * An Express-compatible error handler, used by setupExpressErrorHandler\n */\nexport function expressErrorHandler(options?: ExpressHandlerOptions): ExpressErrorMiddleware {\n return function sentryErrorMiddleware(\n error: MiddlewareError,\n request: ExpressRequest,\n res: ExpressResponse,\n next: (error: MiddlewareError) => void,\n ): void {\n // When an error happens, the `expressRequestHandler` middleware does not run, so we set it here too\n setSDKProcessingMetadata(request);\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n if (shouldHandleError(error)) {\n const eventId = captureException(error, {\n mechanism: { type: 'auto.middleware.express', handled: false },\n });\n (res as { sentry?: string }).sentry = eventId;\n }\n\n next(error);\n };\n}\n\n/**\n * Add an Express error handler to capture errors to Sentry.\n *\n * The error handler must be before any other middleware and after all controllers.\n *\n * @param app The Express instances\n * @param options {ExpressHandlerOptions} Configuration options for the handler\n *\n * @example\n * ```javascript\n * import * as Sentry from 'sentry/deno'; // or any other @sentry/<platform>\n * import * as express from 'express';\n *\n * Sentry.instrumentExpress(express);\n *\n * const app = express();\n *\n * // Add your routes, etc.\n *\n * // Add this after all routes,\n * // but before any and other error-handling middlewares are defined\n * Sentry.setupExpressErrorHandler(app);\n *\n * app.listen(3000);\n * ```\n */\nexport function setupExpressErrorHandler(\n app: {\n //oxlint-disable-next-line no-explicit-any\n use: (middleware: any) => unknown;\n },\n options?: ExpressHandlerOptions,\n): void {\n app.use(expressRequestHandler());\n app.use(expressErrorHandler(options));\n}\n\nfunction expressRequestHandler(): ExpressMiddleware {\n return function sentryRequestMiddleware(request: ExpressRequest, _res: ExpressResponse, next: () => void): void {\n setSDKProcessingMetadata(request);\n next();\n };\n}\n"],"names":["express"],"mappings":"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"}
{"version":3,"file":"index.js","sources":["../../../../src/integrations/express/index.ts"],"sourcesContent":["/**\n * Platform-portable Express tracing integration.\n *\n * @module\n *\n * This Sentry integration is a derivative work based on the OpenTelemetry\n * Express instrumentation.\n *\n * <https://github.com/open-telemetry/opentelemetry-js-contrib/tree/main/packages/instrumentation-express>\n *\n * Extended under the terms of the Apache 2.0 license linked below:\n *\n * ----\n *\n * Copyright The OpenTelemetry Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debug } from '../../utils/debug-logger';\nimport { captureException } from '../../exports';\nimport { DEBUG_BUILD } from '../../debug-build';\nimport type {\n ExpressApplication,\n ExpressErrorMiddleware,\n ExpressHandlerOptions,\n ExpressIntegrationOptions,\n ExpressLayer,\n ExpressMiddleware,\n ExpressModuleExport,\n ExpressRequest,\n ExpressResponse,\n ExpressRouter,\n ExpressRouterv4,\n ExpressRouterv5,\n MiddlewareError,\n} from './types';\nimport {\n defaultShouldHandleError,\n getLayerPath,\n isExpressWithoutRouterPrototype,\n isExpressWithRouterPrototype,\n} from './utils';\nimport { wrapMethod } from '../../utils/object';\nimport { patchLayer } from './patch-layer';\nimport { setSDKProcessingMetadata } from './set-sdk-processing-metadata';\nimport { getDefaultExport } from '../../utils/get-default-export';\n\nfunction isLegacyOptions(\n options: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n): options is ExpressIntegrationOptions & { express: ExpressModuleExport } {\n return !!(options as { express: ExpressModuleExport }).express;\n}\n\n// TODO: remove this deprecation handling in v11\nlet didLegacyDeprecationWarning = false;\nfunction deprecationWarning() {\n if (!didLegacyDeprecationWarning) {\n didLegacyDeprecationWarning = true;\n DEBUG_BUILD &&\n debug.warn(\n '[Express] `patchExpressModule(options)` is deprecated. Use `patchExpressModule(moduleExports, getOptions)` instead.',\n );\n }\n}\n\n/**\n * This is a portable instrumentatiton function that works in any environment\n * where Express can be loaded, without depending on OpenTelemetry.\n *\n * @example\n * ```javascript\n * import express from 'express';\n * import * as Sentry from '@sentry/deno'; // or any SDK that extends core\n *\n * Sentry.patchExpressModule(express, () => ({}));\n * ```\n */\nexport function patchExpressModule(\n moduleExports: ExpressModuleExport,\n getOptions: () => ExpressIntegrationOptions,\n): ExpressModuleExport;\n/**\n * @deprecated Pass the Express module export as the first argument and options getter as the second argument.\n */\nexport function patchExpressModule(\n options: ExpressIntegrationOptions & { express: ExpressModuleExport },\n): ExpressModuleExport;\nexport function patchExpressModule(\n optionsOrExports: ExpressModuleExport | (ExpressIntegrationOptions & { express: ExpressModuleExport }),\n maybeGetOptions?: () => ExpressIntegrationOptions,\n): ExpressModuleExport {\n let getOptions: () => ExpressIntegrationOptions;\n let moduleExports: ExpressModuleExport;\n if (!maybeGetOptions && isLegacyOptions(optionsOrExports)) {\n // eslint-disable-next-line typescript/no-deprecated\n const { express, ...options } = optionsOrExports;\n moduleExports = express;\n getOptions = () => options;\n deprecationWarning();\n } else if (typeof maybeGetOptions !== 'function') {\n throw new TypeError('`patchExpressModule(moduleExports, getOptions)` requires a `getOptions` callback');\n } else {\n getOptions = maybeGetOptions;\n moduleExports = optionsOrExports as ExpressModuleExport;\n }\n\n // pass in the require() or import() result of express\n const express = getDefaultExport(moduleExports);\n const routerProto: ExpressRouterv4 | ExpressRouterv5 | undefined = isExpressWithRouterPrototype(express)\n ? express.Router.prototype // Express v5\n : isExpressWithoutRouterPrototype(express)\n ? express.Router // Express v4\n : undefined;\n\n if (!routerProto) {\n throw new TypeError('no valid Express route function to instrument');\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouteMethod = routerProto.route;\n try {\n wrapMethod(\n routerProto,\n 'route',\n function routeTrace(this: ExpressRouter, ...args: Parameters<typeof originalRouteMethod>[]) {\n const route = originalRouteMethod.apply(this, args);\n const layer = this.stack[this.stack.length - 1] as ExpressLayer;\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express route method:', e);\n }\n\n // oxlint-disable-next-line @typescript-eslint/unbound-method\n const originalRouterUse = routerProto.use;\n try {\n wrapMethod(\n routerProto,\n 'use',\n function useTrace(this: ExpressApplication, ...args: Parameters<typeof originalRouterUse>) {\n const route = originalRouterUse.apply(this, args);\n const layer = this.stack[this.stack.length - 1];\n if (!layer) {\n return route;\n }\n patchLayer(getOptions, layer, getLayerPath(args));\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express use method:', e);\n }\n\n const { application } = express;\n const originalApplicationUse = application.use;\n try {\n wrapMethod(\n application,\n 'use',\n function appUseTrace(\n this: ExpressApplication & {\n _router?: ExpressRouter;\n router?: ExpressRouter;\n },\n ...args: Parameters<ExpressApplication['use']>\n ) {\n // If we access app.router in express 4.x we trigger an assertion error.\n // This property existed in v3, was removed in v4 and then re-added in v5.\n const route = originalApplicationUse.apply(this, args);\n const router = isExpressWithRouterPrototype(express) ? this.router : this._router;\n if (router) {\n const layer = router.stack[router.stack.length - 1];\n if (layer) {\n patchLayer(getOptions, layer, getLayerPath(args));\n }\n }\n return route;\n },\n );\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to patch express application.use method:', e);\n }\n\n return express;\n}\n\n/**\n * An Express-compatible error handler, used by setupExpressErrorHandler\n */\nexport function expressErrorHandler(options?: ExpressHandlerOptions): ExpressErrorMiddleware {\n return function sentryErrorMiddleware(\n error: MiddlewareError,\n request: ExpressRequest,\n res: ExpressResponse,\n next: (error: MiddlewareError) => void,\n ): void {\n // When an error happens, the `expressRequestHandler` middleware does not run, so we set it here too\n setSDKProcessingMetadata(request);\n const shouldHandleError = options?.shouldHandleError || defaultShouldHandleError;\n\n if (shouldHandleError(error)) {\n const eventId = captureException(error, {\n mechanism: { type: 'auto.middleware.express', handled: false },\n });\n (res as { sentry?: string }).sentry = eventId;\n }\n\n next(error);\n };\n}\n\n/**\n * Add an Express error handler to capture errors to Sentry.\n *\n * The error handler must be before any other middleware and after all controllers.\n *\n * @param app The Express instances\n * @param options {ExpressHandlerOptions} Configuration options for the handler\n *\n * @example\n * ```javascript\n * import * as Sentry from 'sentry/deno'; // or any other @sentry/<platform>\n * import * as express from 'express';\n *\n * Sentry.instrumentExpress(express);\n *\n * const app = express();\n *\n * // Add your routes, etc.\n *\n * // Add this after all routes,\n * // but before any and other error-handling middlewares are defined\n * Sentry.setupExpressErrorHandler(app);\n *\n * app.listen(3000);\n * ```\n */\nexport function setupExpressErrorHandler(\n app: {\n //oxlint-disable-next-line no-explicit-any\n use: (middleware: any) => unknown;\n },\n options?: ExpressHandlerOptions,\n): void {\n app.use(expressRequestHandler());\n app.use(expressErrorHandler(options));\n}\n\nfunction expressRequestHandler(): ExpressMiddleware {\n return function sentryRequestMiddleware(request: ExpressRequest, _res: ExpressResponse, next: () => void): void {\n setSDKProcessingMetadata(request);\n next();\n };\n}\n"],"names":["express"],"mappings":"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"}

@@ -17,3 +17,7 @@ function getRequestOptions(request) {

function getRequestUrl(requestOptions) {
return String(getRequestUrlObject(requestOptions));
try {
return String(getRequestUrlObject(requestOptions));
} catch {
return "";
}
}

@@ -26,3 +30,4 @@ function getRequestUrlObject(requestOptions) {

const path = requestOptions.path ? requestOptions.path : "/";
return new URL(path, `${protocol}//${hostname}${port}`);
const base = `${protocol}//${hostname}${port}`;
return new URL(path.startsWith("//") ? `${base}${path}` : path, base);
}

@@ -29,0 +34,0 @@ function getRequestUrlFromClientRequest(request) {

@@ -1,1 +0,1 @@

{"version":3,"file":"get-request-url.js","sources":["../../../../src/integrations/http/get-request-url.ts"],"sourcesContent":["import type { HttpClientRequest, HttpRequestOptions } from './types';\n\n/** Convert an outgoing request to request options. */\nexport function getRequestOptions(request: HttpClientRequest): HttpRequestOptions {\n // request.host may be 'hostname:port' when the caller passed\n // { host: 'hostname:port' } to http.request(). Split it so that\n // `hostname` is always port-free (matching the http.RequestOptions contract)\n // and the port is not lost when request.port is undefined.\n const hostWithPort = request.host || '';\n const portInHost = /^(.*):(\\d+)$/.exec(hostWithPort);\n const hostname = portInHost ? portInHost[1] : hostWithPort;\n const port = request.port ?? (portInHost ? Number(portInHost[2]) : undefined);\n\n return {\n method: request.method,\n port,\n protocol: request.protocol,\n host: request.host,\n hostname,\n path: request.path,\n headers: request.getHeaders(),\n };\n}\n\nexport function getRequestUrl(requestOptions: HttpRequestOptions): string {\n return String(getRequestUrlObject(requestOptions));\n}\n\nexport function getRequestUrlObject(requestOptions: HttpRequestOptions): URL {\n const protocol = requestOptions.protocol || 'http:';\n const hostHeader = requestOptions.headers?.host && String(requestOptions.headers?.host);\n const hostname = hostHeader || requestOptions.hostname || requestOptions.host || '';\n // Don't log standard :80 (http) and :443 (https) ports to reduce the noise\n // Also don't add port if the hostname already includes a port\n const port =\n !requestOptions.port || requestOptions.port === 80 || requestOptions.port === 443 || /^(.*):(\\d+)$/.test(hostname)\n ? ''\n : `:${requestOptions.port}`;\n const path = requestOptions.path ? requestOptions.path : '/';\n return new URL(path, `${protocol}//${hostname}${port}`);\n}\n\n/**\n * Build the full URL string from a Node.js ClientRequest.\n */\nexport function getRequestUrlFromClientRequest(request: HttpClientRequest): string {\n return String(getRequestUrl(getRequestOptions(request)));\n}\n"],"names":[],"mappings":"AAGO,SAAS,kBAAkB,OAAA,EAAgD;AAKhF,EAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,IAAQ,EAAA;AACrC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,KAAS,UAAA,GAAa,OAAO,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,MAAA,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,IAAA;AAAA,IACA,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,QAAQ,UAAA;AAAW,GAC9B;AACF;AAEO,SAAS,cAAc,cAAA,EAA4C;AACxE,EAAA,OAAO,MAAA,CAAO,mBAAA,CAAoB,cAAc,CAAC,CAAA;AACnD;AAEO,SAAS,oBAAoB,cAAA,EAAyC;AAC3E,EAAA,MAAM,QAAA,GAAW,eAAe,QAAA,IAAY,OAAA;AAC5C,EAAA,MAAM,aAAa,cAAA,CAAe,OAAA,EAAS,QAAQ,MAAA,CAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AACtF,EAAA,MAAM,QAAA,GAAW,UAAA,IAAc,cAAA,CAAe,QAAA,IAAY,eAAe,IAAA,IAAQ,EAAA;AAGjF,EAAA,MAAM,OACJ,CAAC,cAAA,CAAe,IAAA,IAAQ,cAAA,CAAe,SAAS,EAAA,IAAM,cAAA,CAAe,IAAA,KAAS,GAAA,IAAO,eAAe,IAAA,CAAK,QAAQ,IAC7G,EAAA,GACA,CAAA,CAAA,EAAI,eAAe,IAAI,CAAA,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,GAAA;AACzD,EAAA,OAAO,IAAI,IAAI,IAAA,EAAM,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAG,IAAI,CAAA,CAAE,CAAA;AACxD;AAKO,SAAS,+BAA+B,OAAA,EAAoC;AACjF,EAAA,OAAO,MAAA,CAAO,aAAA,CAAc,iBAAA,CAAkB,OAAO,CAAC,CAAC,CAAA;AACzD;;;;"}
{"version":3,"file":"get-request-url.js","sources":["../../../../src/integrations/http/get-request-url.ts"],"sourcesContent":["import type { HttpClientRequest, HttpRequestOptions } from './types';\n\n/** Convert an outgoing request to request options. */\nexport function getRequestOptions(request: HttpClientRequest): HttpRequestOptions {\n // request.host may be 'hostname:port' when the caller passed\n // { host: 'hostname:port' } to http.request(). Split it so that\n // `hostname` is always port-free (matching the http.RequestOptions contract)\n // and the port is not lost when request.port is undefined.\n const hostWithPort = request.host || '';\n const portInHost = /^(.*):(\\d+)$/.exec(hostWithPort);\n const hostname = portInHost ? portInHost[1] : hostWithPort;\n const port = request.port ?? (portInHost ? Number(portInHost[2]) : undefined);\n\n return {\n method: request.method,\n port,\n protocol: request.protocol,\n host: request.host,\n hostname,\n path: request.path,\n headers: request.getHeaders(),\n };\n}\n\nexport function getRequestUrl(requestOptions: HttpRequestOptions): string {\n try {\n return String(getRequestUrlObject(requestOptions));\n } catch {\n return '';\n }\n}\n\nexport function getRequestUrlObject(requestOptions: HttpRequestOptions): URL {\n const protocol = requestOptions.protocol || 'http:';\n const hostHeader = requestOptions.headers?.host && String(requestOptions.headers?.host);\n const hostname = hostHeader || requestOptions.hostname || requestOptions.host || '';\n // Don't log standard :80 (http) and :443 (https) ports to reduce the noise\n // Also don't add port if the hostname already includes a port\n const port =\n !requestOptions.port || requestOptions.port === 80 || requestOptions.port === 443 || /^(.*):(\\d+)$/.test(hostname)\n ? ''\n : `:${requestOptions.port}`;\n const path = requestOptions.path ? requestOptions.path : '/';\n const base = `${protocol}//${hostname}${port}`;\n // A path starting with `//` (valid for e.g. S3 object keys) would otherwise be parsed as a\n // protocol-relative reference, discarding the request's origin, so we resolve it against the origin.\n return new URL(path.startsWith('//') ? `${base}${path}` : path, base);\n}\n\n/**\n * Build the full URL string from a Node.js ClientRequest.\n */\nexport function getRequestUrlFromClientRequest(request: HttpClientRequest): string {\n return String(getRequestUrl(getRequestOptions(request)));\n}\n"],"names":[],"mappings":"AAGO,SAAS,kBAAkB,OAAA,EAAgD;AAKhF,EAAA,MAAM,YAAA,GAAe,QAAQ,IAAA,IAAQ,EAAA;AACrC,EAAA,MAAM,UAAA,GAAa,cAAA,CAAe,IAAA,CAAK,YAAY,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,UAAA,GAAa,UAAA,CAAW,CAAC,CAAA,GAAI,YAAA;AAC9C,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,KAAS,UAAA,GAAa,OAAO,UAAA,CAAW,CAAC,CAAC,CAAA,GAAI,MAAA,CAAA;AAEnE,EAAA,OAAO;AAAA,IACL,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,IAAA;AAAA,IACA,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,OAAA,EAAS,QAAQ,UAAA;AAAW,GAC9B;AACF;AAEO,SAAS,cAAc,cAAA,EAA4C;AACxE,EAAA,IAAI;AACF,IAAA,OAAO,MAAA,CAAO,mBAAA,CAAoB,cAAc,CAAC,CAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AACF;AAEO,SAAS,oBAAoB,cAAA,EAAyC;AAC3E,EAAA,MAAM,QAAA,GAAW,eAAe,QAAA,IAAY,OAAA;AAC5C,EAAA,MAAM,aAAa,cAAA,CAAe,OAAA,EAAS,QAAQ,MAAA,CAAO,cAAA,CAAe,SAAS,IAAI,CAAA;AACtF,EAAA,MAAM,QAAA,GAAW,UAAA,IAAc,cAAA,CAAe,QAAA,IAAY,eAAe,IAAA,IAAQ,EAAA;AAGjF,EAAA,MAAM,OACJ,CAAC,cAAA,CAAe,IAAA,IAAQ,cAAA,CAAe,SAAS,EAAA,IAAM,cAAA,CAAe,IAAA,KAAS,GAAA,IAAO,eAAe,IAAA,CAAK,QAAQ,IAC7G,EAAA,GACA,CAAA,CAAA,EAAI,eAAe,IAAI,CAAA,CAAA;AAC7B,EAAA,MAAM,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,cAAA,CAAe,IAAA,GAAO,GAAA;AACzD,EAAA,MAAM,OAAO,CAAA,EAAG,QAAQ,CAAA,EAAA,EAAK,QAAQ,GAAG,IAAI,CAAA,CAAA;AAG5C,EAAA,OAAO,IAAI,GAAA,CAAI,IAAA,CAAK,UAAA,CAAW,IAAI,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAG,IAAI,CAAA,CAAA,GAAK,IAAA,EAAM,IAAI,CAAA;AACtE;AAKO,SAAS,+BAA+B,OAAA,EAAoC;AACjF,EAAA,OAAO,MAAA,CAAO,aAAA,CAAc,iBAAA,CAAkB,OAAO,CAAC,CAAC,CAAA;AACzD;;;;"}

@@ -1,1 +0,1 @@

{"version":3,"file":"handlers.js","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"sourcesContent":["/**\n * Handler method wrapping for MCP server instrumentation\n *\n * Provides automatic error capture and span correlation for tool, resource,\n * and prompt handlers.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport { fill } from '../../utils/object';\nimport { captureError } from './errorCapture';\nimport type { MCPHandler, MCPServerInstance } from './types';\n\n/**\n * Generic function to wrap MCP server method handlers\n * @internal\n * @param serverInstance - MCP server instance\n * @param methodName - Method name to wrap (tool, resource, prompt)\n */\nfunction wrapMethodHandler(serverInstance: MCPServerInstance, methodName: keyof MCPServerInstance): void {\n fill(serverInstance, methodName, originalMethod => {\n return function (this: MCPServerInstance, name: string, ...args: unknown[]) {\n const handler = args[args.length - 1];\n\n if (typeof handler !== 'function') {\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args);\n }\n\n const wrappedHandler = createWrappedHandler(handler as MCPHandler, methodName, name);\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args.slice(0, -1), wrappedHandler);\n };\n });\n}\n\n/**\n * Creates a wrapped handler with span correlation and error capture\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @returns Wrapped handler function\n */\nfunction createWrappedHandler(originalHandler: MCPHandler, methodName: keyof MCPServerInstance, handlerName: string) {\n return function (this: unknown, ...handlerArgs: unknown[]): unknown {\n try {\n return createErrorCapturingHandler.call(this, originalHandler, methodName, handlerName, handlerArgs);\n } catch (error) {\n DEBUG_BUILD && debug.warn('MCP handler wrapping failed:', error);\n return originalHandler.apply(this, handlerArgs);\n }\n };\n}\n\n/**\n * Creates an error-capturing wrapper for handler execution\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @param handlerArgs - Handler arguments\n * @param extraHandlerData - Additional handler context\n * @returns Handler execution result\n */\nfunction createErrorCapturingHandler(\n this: MCPServerInstance,\n originalHandler: MCPHandler,\n methodName: keyof MCPServerInstance,\n handlerName: string,\n handlerArgs: unknown[],\n): unknown {\n try {\n const result = originalHandler.apply(this, handlerArgs);\n\n if (result && typeof result === 'object' && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).catch(error => {\n captureHandlerError(error, methodName, handlerName);\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n captureHandlerError(error as Error, methodName, handlerName);\n throw error;\n }\n}\n\n/**\n * Captures handler execution errors based on handler type\n * @internal\n * @param error - Error to capture\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n */\nfunction captureHandlerError(error: Error, methodName: keyof MCPServerInstance, handlerName: string): void {\n try {\n const extraData: Record<string, unknown> = {};\n\n if (methodName === 'tool' || methodName === 'registerTool') {\n extraData.tool_name = handlerName;\n\n if (\n error.name === 'ProtocolValidationError' ||\n error.message.includes('validation') ||\n error.message.includes('protocol')\n ) {\n captureError(error, 'validation', extraData);\n } else if (\n error.name === 'ServerTimeoutError' ||\n error.message.includes('timed out') ||\n error.message.includes('timeout')\n ) {\n captureError(error, 'timeout', extraData);\n } else {\n captureError(error, 'tool_execution', extraData);\n }\n } else if (methodName === 'resource' || methodName === 'registerResource') {\n extraData.resource_uri = handlerName;\n captureError(error, 'resource_execution', extraData);\n } else if (methodName === 'prompt' || methodName === 'registerPrompt') {\n extraData.prompt_name = handlerName;\n captureError(error, 'prompt_execution', extraData);\n }\n } catch (_captureErr) {\n // noop\n }\n}\n\n/**\n * Wraps tool handlers to associate them with request spans.\n * Instruments both `tool` (legacy API) and `registerTool` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapToolHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.tool === 'function') wrapMethodHandler(serverInstance, 'tool');\n if (typeof serverInstance.registerTool === 'function') wrapMethodHandler(serverInstance, 'registerTool');\n}\n\n/**\n * Wraps resource handlers to associate them with request spans.\n * Instruments both `resource` (legacy API) and `registerResource` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapResourceHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.resource === 'function') wrapMethodHandler(serverInstance, 'resource');\n if (typeof serverInstance.registerResource === 'function') wrapMethodHandler(serverInstance, 'registerResource');\n}\n\n/**\n * Wraps prompt handlers to associate them with request spans.\n * Instruments both `prompt` (legacy API) and `registerPrompt` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapPromptHandlers(serverInstance: MCPServerInstance): void {\n if (typeof serverInstance.prompt === 'function') wrapMethodHandler(serverInstance, 'prompt');\n if (typeof serverInstance.registerPrompt === 'function') wrapMethodHandler(serverInstance, 'registerPrompt');\n}\n\n/**\n * Wraps all MCP handler types for span correlation.\n * Supports both the legacy API (`tool`, `resource`, `prompt`) and the newer API\n * (`registerTool`, `registerResource`, `registerPrompt`), instrumenting whichever methods are present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapAllMCPHandlers(serverInstance: MCPServerInstance): void {\n wrapToolHandlers(serverInstance);\n wrapResourceHandlers(serverInstance);\n wrapPromptHandlers(serverInstance);\n}\n\n/**\n * Retroactively wraps handlers on tools, resources, and prompts that were registered\n * before `wrapMcpServerWithSentry` was called.\n *\n * The MCP SDK stores registered entries in private maps and invokes them via the entry's\n * own property at call time — `executor` for tools, `readCallback` for resources, and\n * `handler` for prompts. Replacing those properties\n * in-place is therefore equivalent to having wrapped the original registration call.\n *\n * NOTE: This intentionally accesses private MCP SDK internals (`_registeredTools` etc.).\n * The properties and their shapes are verified against @modelcontextprotocol/sdk source:\n * https://github.com/modelcontextprotocol/typescript-sdk/blob/2c0c481cb9dbfd15c8613f765c940a5f5bace94d/packages/server/src/server/mcp.ts#L304\n * When upgrading the MCP SDK, re-verify that these internal maps and their callable\n * properties still exist and are invoked directly (not captured by closure at registration).\n * All access is defensive — if a property is absent or not a function we skip silently.\n * @internal\n */\nexport function wrapExistingHandlers(serverInstance: MCPServerInstance): void {\n const server = serverInstance as unknown as Record<string, unknown>;\n\n // Tools: MCP SDK calls registeredTool.executor (generated from handler at registration time)\n const registeredTools = server['_registeredTools'];\n if (registeredTools && typeof registeredTools === 'object') {\n for (const [name, tool] of Object.entries(registeredTools as Record<string, Record<string, unknown>>)) {\n if (typeof tool['executor'] === 'function') {\n tool['executor'] = createWrappedHandler(tool['executor'] as MCPHandler, 'registerTool', name);\n }\n }\n }\n\n // Resources: MCP SDK calls registeredResource.readCallback\n const registeredResources = server['_registeredResources'];\n if (registeredResources && typeof registeredResources === 'object') {\n for (const [name, resource] of Object.entries(registeredResources as Record<string, Record<string, unknown>>)) {\n if (typeof resource['readCallback'] === 'function') {\n resource['readCallback'] = createWrappedHandler(\n resource['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Resource templates: MCP SDK calls registeredResourceTemplate.readCallback\n const registeredResourceTemplates = server['_registeredResourceTemplates'];\n if (registeredResourceTemplates && typeof registeredResourceTemplates === 'object') {\n for (const [name, template] of Object.entries(\n registeredResourceTemplates as Record<string, Record<string, unknown>>,\n )) {\n if (typeof template['readCallback'] === 'function') {\n template['readCallback'] = createWrappedHandler(\n template['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Prompts: MCP SDK calls registeredPrompt.handler\n const registeredPrompts = server['_registeredPrompts'];\n if (registeredPrompts && typeof registeredPrompts === 'object') {\n for (const [name, prompt] of Object.entries(registeredPrompts as Record<string, Record<string, unknown>>)) {\n if (typeof prompt['handler'] === 'function') {\n prompt['handler'] = createWrappedHandler(prompt['handler'] as MCPHandler, 'registerPrompt', name);\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"handlers.js","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"sourcesContent":["/**\n * Handler method wrapping for MCP server instrumentation\n *\n * Provides automatic error capture and span correlation for tool, resource,\n * and prompt handlers.\n */\n\nimport { DEBUG_BUILD } from '../../debug-build';\nimport { debug } from '../../utils/debug-logger';\nimport { fill } from '../../utils/object';\nimport { captureError } from './errorCapture';\nimport type { MCPHandler, MCPServerInstance } from './types';\n\n/**\n * Generic function to wrap MCP server method handlers\n * @internal\n * @param serverInstance - MCP server instance\n * @param methodName - Method name to wrap (tool, resource, prompt)\n */\nfunction wrapMethodHandler(serverInstance: MCPServerInstance, methodName: keyof MCPServerInstance): void {\n fill(serverInstance, methodName, originalMethod => {\n return function (this: MCPServerInstance, name: string, ...args: unknown[]) {\n const handler = args[args.length - 1];\n\n if (typeof handler !== 'function') {\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args);\n }\n\n const wrappedHandler = createWrappedHandler(handler as MCPHandler, methodName, name);\n return (originalMethod as (...args: unknown[]) => unknown).call(this, name, ...args.slice(0, -1), wrappedHandler);\n };\n });\n}\n\n/**\n * Creates a wrapped handler with span correlation and error capture\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @returns Wrapped handler function\n */\nfunction createWrappedHandler(originalHandler: MCPHandler, methodName: keyof MCPServerInstance, handlerName: string) {\n return function (this: unknown, ...handlerArgs: unknown[]): unknown {\n try {\n return createErrorCapturingHandler.call(this, originalHandler, methodName, handlerName, handlerArgs);\n } catch (error) {\n DEBUG_BUILD && debug.warn('MCP handler wrapping failed:', error);\n return originalHandler.apply(this, handlerArgs);\n }\n };\n}\n\n/**\n * Creates an error-capturing wrapper for handler execution\n * @internal\n * @param originalHandler - Original handler function\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n * @param handlerArgs - Handler arguments\n * @param extraHandlerData - Additional handler context\n * @returns Handler execution result\n */\nfunction createErrorCapturingHandler(\n this: MCPServerInstance,\n originalHandler: MCPHandler,\n methodName: keyof MCPServerInstance,\n handlerName: string,\n handlerArgs: unknown[],\n): unknown {\n try {\n const result = originalHandler.apply(this, handlerArgs);\n\n if (result && typeof result === 'object' && typeof (result as { then?: unknown }).then === 'function') {\n return Promise.resolve(result).catch(error => {\n captureHandlerError(error, methodName, handlerName);\n throw error;\n });\n }\n\n return result;\n } catch (error) {\n captureHandlerError(error as Error, methodName, handlerName);\n throw error;\n }\n}\n\n/**\n * Captures handler execution errors based on handler type\n * @internal\n * @param error - Error to capture\n * @param methodName - MCP method name\n * @param handlerName - Handler identifier\n */\nfunction captureHandlerError(error: Error, methodName: keyof MCPServerInstance, handlerName: string): void {\n try {\n const extraData: Record<string, unknown> = {};\n\n if (methodName === 'tool' || methodName === 'registerTool') {\n extraData.tool_name = handlerName;\n\n if (\n error.name === 'ProtocolValidationError' ||\n error.message.includes('validation') ||\n error.message.includes('protocol')\n ) {\n captureError(error, 'validation', extraData);\n } else if (\n error.name === 'ServerTimeoutError' ||\n error.message.includes('timed out') ||\n error.message.includes('timeout')\n ) {\n captureError(error, 'timeout', extraData);\n } else {\n captureError(error, 'tool_execution', extraData);\n }\n } else if (methodName === 'resource' || methodName === 'registerResource') {\n extraData.resource_uri = handlerName;\n captureError(error, 'resource_execution', extraData);\n } else if (methodName === 'prompt' || methodName === 'registerPrompt') {\n extraData.prompt_name = handlerName;\n captureError(error, 'prompt_execution', extraData);\n }\n } catch (_captureErr) {\n // noop\n }\n}\n\n/**\n * Wraps tool handlers to associate them with request spans.\n * Instruments both `tool` (legacy API) and `registerTool` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapToolHandlers(serverInstance: MCPServerInstance): void {\n // eslint-disable-next-line typescript/no-deprecated\n if (typeof serverInstance.tool === 'function') wrapMethodHandler(serverInstance, 'tool');\n if (typeof serverInstance.registerTool === 'function') wrapMethodHandler(serverInstance, 'registerTool');\n}\n\n/**\n * Wraps resource handlers to associate them with request spans.\n * Instruments both `resource` (legacy API) and `registerResource` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapResourceHandlers(serverInstance: MCPServerInstance): void {\n // eslint-disable-next-line typescript/no-deprecated\n if (typeof serverInstance.resource === 'function') wrapMethodHandler(serverInstance, 'resource');\n if (typeof serverInstance.registerResource === 'function') wrapMethodHandler(serverInstance, 'registerResource');\n}\n\n/**\n * Wraps prompt handlers to associate them with request spans.\n * Instruments both `prompt` (legacy API) and `registerPrompt` (new API) if present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapPromptHandlers(serverInstance: MCPServerInstance): void {\n // eslint-disable-next-line typescript/no-deprecated\n if (typeof serverInstance.prompt === 'function') wrapMethodHandler(serverInstance, 'prompt');\n if (typeof serverInstance.registerPrompt === 'function') wrapMethodHandler(serverInstance, 'registerPrompt');\n}\n\n/**\n * Wraps all MCP handler types for span correlation.\n * Supports both the legacy API (`tool`, `resource`, `prompt`) and the newer API\n * (`registerTool`, `registerResource`, `registerPrompt`), instrumenting whichever methods are present.\n * @param serverInstance - MCP server instance\n */\nexport function wrapAllMCPHandlers(serverInstance: MCPServerInstance): void {\n wrapToolHandlers(serverInstance);\n wrapResourceHandlers(serverInstance);\n wrapPromptHandlers(serverInstance);\n}\n\n/**\n * Retroactively wraps handlers on tools, resources, and prompts that were registered\n * before `wrapMcpServerWithSentry` was called.\n *\n * The MCP SDK stores registered entries in private maps and invokes them via the entry's\n * own property at call time — `executor` for tools, `readCallback` for resources, and\n * `handler` for prompts. Replacing those properties\n * in-place is therefore equivalent to having wrapped the original registration call.\n *\n * NOTE: This intentionally accesses private MCP SDK internals (`_registeredTools` etc.).\n * The properties and their shapes are verified against @modelcontextprotocol/sdk source:\n * https://github.com/modelcontextprotocol/typescript-sdk/blob/2c0c481cb9dbfd15c8613f765c940a5f5bace94d/packages/server/src/server/mcp.ts#L304\n * When upgrading the MCP SDK, re-verify that these internal maps and their callable\n * properties still exist and are invoked directly (not captured by closure at registration).\n * All access is defensive — if a property is absent or not a function we skip silently.\n * @internal\n */\nexport function wrapExistingHandlers(serverInstance: MCPServerInstance): void {\n const server = serverInstance as unknown as Record<string, unknown>;\n\n // Tools: MCP SDK calls registeredTool.executor (generated from handler at registration time)\n const registeredTools = server['_registeredTools'];\n if (registeredTools && typeof registeredTools === 'object') {\n for (const [name, tool] of Object.entries(registeredTools as Record<string, Record<string, unknown>>)) {\n if (typeof tool['executor'] === 'function') {\n tool['executor'] = createWrappedHandler(tool['executor'] as MCPHandler, 'registerTool', name);\n }\n }\n }\n\n // Resources: MCP SDK calls registeredResource.readCallback\n const registeredResources = server['_registeredResources'];\n if (registeredResources && typeof registeredResources === 'object') {\n for (const [name, resource] of Object.entries(registeredResources as Record<string, Record<string, unknown>>)) {\n if (typeof resource['readCallback'] === 'function') {\n resource['readCallback'] = createWrappedHandler(\n resource['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Resource templates: MCP SDK calls registeredResourceTemplate.readCallback\n const registeredResourceTemplates = server['_registeredResourceTemplates'];\n if (registeredResourceTemplates && typeof registeredResourceTemplates === 'object') {\n for (const [name, template] of Object.entries(\n registeredResourceTemplates as Record<string, Record<string, unknown>>,\n )) {\n if (typeof template['readCallback'] === 'function') {\n template['readCallback'] = createWrappedHandler(\n template['readCallback'] as MCPHandler,\n 'registerResource',\n name,\n );\n }\n }\n }\n\n // Prompts: MCP SDK calls registeredPrompt.handler\n const registeredPrompts = server['_registeredPrompts'];\n if (registeredPrompts && typeof registeredPrompts === 'object') {\n for (const [name, prompt] of Object.entries(registeredPrompts as Record<string, Record<string, unknown>>)) {\n if (typeof prompt['handler'] === 'function') {\n prompt['handler'] = createWrappedHandler(prompt['handler'] as MCPHandler, 'registerPrompt', name);\n }\n }\n }\n}\n"],"names":[],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"internal.js","sources":["../../../src/metrics/internal.ts"],"sourcesContent":["import { type RawAttributes, serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport type { Integration } from '../types/integration';\nimport type { Metric, SerializedMetric } from '../types/metric';\nimport type { User } from '../types/user';\nimport { debug } from '../utils/debug-logger';\nimport { getCombinedScopeData } from '../utils/scopeData';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { getSequenceAttribute } from '../utils/timestampSequence';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { createMetricEnvelope } from './envelope';\n\nconst MAX_METRIC_BUFFER_SIZE = 1000;\n\n/**\n * Sets a metric attribute if the value exists and the attribute key is not already present.\n *\n * @param metricAttributes - The metric attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setMetricAttribute(\n metricAttributes: Record<string, unknown>,\n key: string,\n value: unknown,\n setEvenIfPresent = true,\n): void {\n if (value && (setEvenIfPresent || !(key in metricAttributes))) {\n metricAttributes[key] = value;\n }\n}\n\n/**\n * Captures a serialized metric event and adds it to the metric buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedMetric - The serialized metric event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedMetric(client: Client, serializedMetric: SerializedMetric): void {\n const bufferMap = _getBufferMap();\n const metricBuffer = _INTERNAL_getMetricBuffer(client);\n\n if (metricBuffer === undefined) {\n bufferMap.set(client, [serializedMetric]);\n } else {\n if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) {\n _INTERNAL_flushMetricsBuffer(client, metricBuffer);\n bufferMap.set(client, [serializedMetric]);\n } else {\n bufferMap.set(client, [...metricBuffer, serializedMetric]);\n }\n }\n}\n\n/**\n * Options for capturing a metric internally.\n */\nexport interface InternalCaptureMetricOptions {\n /**\n * The scope to capture the metric with.\n */\n scope?: Scope;\n\n /**\n * A function to capture the serialized metric.\n */\n captureSerializedMetric?: (client: Client, metric: SerializedMetric) => void;\n}\n\n/**\n * Enriches metric with all contextual attributes (user, SDK metadata, replay, etc.)\n */\nfunction _enrichMetricAttributes(beforeMetric: Metric, client: Client, user: User): Metric {\n const { release, environment } = client.getOptions();\n\n const processedMetricAttributes = {\n ...beforeMetric.attributes,\n };\n\n // Add user attributes\n setMetricAttribute(processedMetricAttributes, 'user.id', user.id, false);\n setMetricAttribute(processedMetricAttributes, 'user.email', user.email, false);\n setMetricAttribute(processedMetricAttributes, 'user.name', user.username, false);\n\n // Add Sentry metadata\n setMetricAttribute(processedMetricAttributes, 'sentry.release', release);\n setMetricAttribute(processedMetricAttributes, 'sentry.environment', environment);\n\n // Add SDK metadata\n const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.name', name);\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.version', version);\n\n // Add replay metadata\n const replay = client.getIntegrationByName<\n Integration & {\n getReplayId: (onlyIfSampled?: boolean) => string;\n getRecordingMode: () => 'session' | 'buffer' | undefined;\n }\n >('Replay');\n\n const replayId = replay?.getReplayId(true);\n setMetricAttribute(processedMetricAttributes, 'sentry.replay_id', replayId);\n\n if (replayId && replay?.getRecordingMode() === 'buffer') {\n setMetricAttribute(processedMetricAttributes, 'sentry._internal.replay_is_buffering', true);\n }\n\n return {\n ...beforeMetric,\n attributes: processedMetricAttributes,\n };\n}\n\n/**\n * Creates a serialized metric ready to be sent to Sentry.\n */\nfunction _buildSerializedMetric(\n metric: Metric,\n client: Client,\n currentScope: Scope,\n scopeAttributes: RawAttributes<Record<string, unknown>> | undefined,\n): SerializedMetric {\n // Get trace context\n const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n const span = _getSpanForScope(currentScope);\n const traceId = span ? span.spanContext().traceId : traceContext?.trace_id;\n const spanId = span ? span.spanContext().spanId : undefined;\n\n const timestamp = timestampInSeconds();\n const sequenceAttr = getSequenceAttribute(timestamp);\n\n return {\n timestamp,\n trace_id: traceId ?? '',\n span_id: spanId,\n name: metric.name,\n type: metric.type,\n unit: metric.unit,\n value: metric.value,\n attributes: {\n ...serializeAttributes(scopeAttributes),\n ...serializeAttributes(metric.attributes, 'skip-undefined'),\n [sequenceAttr.key]: sequenceAttr.value,\n },\n };\n}\n\n/**\n * Captures a metric event and sends it to Sentry.\n *\n * @param metric - The metric event to capture.\n * @param options - Options for capturing the metric.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureMetric(beforeMetric: Metric, options?: InternalCaptureMetricOptions): void {\n const currentScope = options?.scope ?? getCurrentScope();\n const captureSerializedMetric = options?.captureSerializedMetric ?? _INTERNAL_captureSerializedMetric;\n const client = currentScope?.getClient() ?? getClient();\n if (!client) {\n DEBUG_BUILD && debug.warn('No client available to capture metric.');\n return;\n }\n\n const { _experiments, enableMetrics, beforeSendMetric } = client.getOptions();\n\n // todo(v11): Remove the experimental flag\n // eslint-disable-next-line deprecation/deprecation\n const metricsEnabled = enableMetrics ?? _experiments?.enableMetrics ?? true;\n\n if (!metricsEnabled) {\n DEBUG_BUILD && debug.warn('metrics option not enabled, metric will not be captured.');\n return;\n }\n\n // Enrich metric with contextual attributes\n const { user, attributes: scopeAttributes } = getCombinedScopeData(getIsolationScope(), currentScope);\n const enrichedMetric = _enrichMetricAttributes(beforeMetric, client, user);\n\n client.emit('processMetric', enrichedMetric);\n\n // todo(v11): Remove the experimental `beforeSendMetric`\n // eslint-disable-next-line deprecation/deprecation\n const beforeSendCallback = beforeSendMetric || _experiments?.beforeSendMetric;\n const processedMetric = beforeSendCallback ? beforeSendCallback(enrichedMetric) : enrichedMetric;\n\n if (!processedMetric) {\n DEBUG_BUILD && debug.log('`beforeSendMetric` returned `null`, will not send metric.');\n return;\n }\n\n const serializedMetric = _buildSerializedMetric(processedMetric, client, currentScope, scopeAttributes);\n\n DEBUG_BUILD && debug.log('[Metric]', serializedMetric);\n\n captureSerializedMetric(client, serializedMetric);\n\n client.emit('afterCaptureMetric', processedMetric);\n}\n\n/**\n * Flushes the metrics buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeMetricBuffer - A metric buffer. Uses the metric buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushMetricsBuffer(client: Client, maybeMetricBuffer?: Array<SerializedMetric>): void {\n const metricBuffer = maybeMetricBuffer ?? _INTERNAL_getMetricBuffer(client) ?? [];\n if (metricBuffer.length === 0) {\n return;\n }\n\n const clientOptions = client.getOptions();\n const envelope = createMetricEnvelope(\n metricBuffer,\n clientOptions._metadata,\n clientOptions.tunnel,\n client.getDsn(),\n client.getDataCollectionOptions().userInfo,\n );\n\n // Clear the metric buffer after envelopes have been constructed.\n _getBufferMap().set(client, []);\n\n client.emit('flushMetrics');\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the metric buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the metric buffer for.\n * @returns The metric buffer for the given client.\n */\nexport function _INTERNAL_getMetricBuffer(client: Client): Array<SerializedMetric> | undefined {\n return _getBufferMap().get(client);\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedMetric>> {\n // The reference to the Client <> MetricBuffer map is stored on the carrier to ensure it's always the same\n return getGlobalSingleton('clientToMetricBufferMap', () => new WeakMap<Client, Array<SerializedMetric>>());\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"internal.js","sources":["../../../src/metrics/internal.ts"],"sourcesContent":["import { type RawAttributes, serializeAttributes } from '../attributes';\nimport { getGlobalSingleton } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport type { Integration } from '../types/integration';\nimport type { Metric, SerializedMetric } from '../types/metric';\nimport type { User } from '../types/user';\nimport { debug } from '../utils/debug-logger';\nimport { getCombinedScopeData } from '../utils/scopeData';\nimport { _getSpanForScope } from '../utils/spanOnScope';\nimport { timestampInSeconds } from '../utils/time';\nimport { getSequenceAttribute } from '../utils/timestampSequence';\nimport { _getTraceInfoFromScope } from '../utils/trace-info';\nimport { createMetricEnvelope } from './envelope';\n\nconst MAX_METRIC_BUFFER_SIZE = 1000;\n\n/**\n * Sets a metric attribute if the value exists and the attribute key is not already present.\n *\n * @param metricAttributes - The metric attributes object to modify.\n * @param key - The attribute key to set.\n * @param value - The value to set (only sets if truthy and key not present).\n * @param setEvenIfPresent - Whether to set the attribute if it is present. Defaults to true.\n */\nfunction setMetricAttribute(\n metricAttributes: Record<string, unknown>,\n key: string,\n value: unknown,\n setEvenIfPresent = true,\n): void {\n if (value && (setEvenIfPresent || !(key in metricAttributes))) {\n metricAttributes[key] = value;\n }\n}\n\n/**\n * Captures a serialized metric event and adds it to the metric buffer for the given client.\n *\n * @param client - A client. Uses the current client if not provided.\n * @param serializedMetric - The serialized metric event to capture.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureSerializedMetric(client: Client, serializedMetric: SerializedMetric): void {\n const bufferMap = _getBufferMap();\n const metricBuffer = _INTERNAL_getMetricBuffer(client);\n\n if (metricBuffer === undefined) {\n bufferMap.set(client, [serializedMetric]);\n } else {\n if (metricBuffer.length >= MAX_METRIC_BUFFER_SIZE) {\n _INTERNAL_flushMetricsBuffer(client, metricBuffer);\n bufferMap.set(client, [serializedMetric]);\n } else {\n bufferMap.set(client, [...metricBuffer, serializedMetric]);\n }\n }\n}\n\n/**\n * Options for capturing a metric internally.\n */\nexport interface InternalCaptureMetricOptions {\n /**\n * The scope to capture the metric with.\n */\n scope?: Scope;\n\n /**\n * A function to capture the serialized metric.\n */\n captureSerializedMetric?: (client: Client, metric: SerializedMetric) => void;\n}\n\n/**\n * Enriches metric with all contextual attributes (user, SDK metadata, replay, etc.)\n */\nfunction _enrichMetricAttributes(beforeMetric: Metric, client: Client, user: User): Metric {\n const { release, environment } = client.getOptions();\n\n const processedMetricAttributes = {\n ...beforeMetric.attributes,\n };\n\n // Add user attributes\n setMetricAttribute(processedMetricAttributes, 'user.id', user.id, false);\n setMetricAttribute(processedMetricAttributes, 'user.email', user.email, false);\n setMetricAttribute(processedMetricAttributes, 'user.name', user.username, false);\n\n // Add Sentry metadata\n setMetricAttribute(processedMetricAttributes, 'sentry.release', release);\n setMetricAttribute(processedMetricAttributes, 'sentry.environment', environment);\n\n // Add SDK metadata\n const { name, version } = client.getSdkMetadata()?.sdk ?? {};\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.name', name);\n setMetricAttribute(processedMetricAttributes, 'sentry.sdk.version', version);\n\n // Add replay metadata\n const replay = client.getIntegrationByName<\n Integration & {\n getReplayId: (onlyIfSampled?: boolean) => string;\n getRecordingMode: () => 'session' | 'buffer' | undefined;\n }\n >('Replay');\n\n const replayId = replay?.getReplayId(true);\n setMetricAttribute(processedMetricAttributes, 'sentry.replay_id', replayId);\n\n if (replayId && replay?.getRecordingMode() === 'buffer') {\n setMetricAttribute(processedMetricAttributes, 'sentry._internal.replay_is_buffering', true);\n }\n\n return {\n ...beforeMetric,\n attributes: processedMetricAttributes,\n };\n}\n\n/**\n * Creates a serialized metric ready to be sent to Sentry.\n */\nfunction _buildSerializedMetric(\n metric: Metric,\n client: Client,\n currentScope: Scope,\n scopeAttributes: RawAttributes<Record<string, unknown>> | undefined,\n): SerializedMetric {\n // Get trace context\n const [, traceContext] = _getTraceInfoFromScope(client, currentScope);\n const span = _getSpanForScope(currentScope);\n const traceId = span ? span.spanContext().traceId : traceContext?.trace_id;\n const spanId = span ? span.spanContext().spanId : undefined;\n\n const timestamp = timestampInSeconds();\n const sequenceAttr = getSequenceAttribute(timestamp);\n\n return {\n timestamp,\n trace_id: traceId ?? '',\n span_id: spanId,\n name: metric.name,\n type: metric.type,\n unit: metric.unit,\n value: metric.value,\n attributes: {\n ...serializeAttributes(scopeAttributes),\n ...serializeAttributes(metric.attributes, 'skip-undefined'),\n [sequenceAttr.key]: sequenceAttr.value,\n },\n };\n}\n\n/**\n * Captures a metric event and sends it to Sentry.\n *\n * @param metric - The metric event to capture.\n * @param options - Options for capturing the metric.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_captureMetric(beforeMetric: Metric, options?: InternalCaptureMetricOptions): void {\n const currentScope = options?.scope ?? getCurrentScope();\n const captureSerializedMetric = options?.captureSerializedMetric ?? _INTERNAL_captureSerializedMetric;\n const client = currentScope?.getClient() ?? getClient();\n if (!client) {\n DEBUG_BUILD && debug.warn('No client available to capture metric.');\n return;\n }\n\n const { _experiments, enableMetrics, beforeSendMetric } = client.getOptions();\n\n // todo(v11): Remove the experimental flag\n // eslint-disable-next-line typescript/no-deprecated\n const metricsEnabled = enableMetrics ?? _experiments?.enableMetrics ?? true;\n\n if (!metricsEnabled) {\n DEBUG_BUILD && debug.warn('metrics option not enabled, metric will not be captured.');\n return;\n }\n\n // Enrich metric with contextual attributes\n const { user, attributes: scopeAttributes } = getCombinedScopeData(getIsolationScope(), currentScope);\n const enrichedMetric = _enrichMetricAttributes(beforeMetric, client, user);\n\n client.emit('processMetric', enrichedMetric);\n\n // todo(v11): Remove the experimental `beforeSendMetric`\n // eslint-disable-next-line typescript/no-deprecated\n const beforeSendCallback = beforeSendMetric || _experiments?.beforeSendMetric;\n const processedMetric = beforeSendCallback ? beforeSendCallback(enrichedMetric) : enrichedMetric;\n\n if (!processedMetric) {\n DEBUG_BUILD && debug.log('`beforeSendMetric` returned `null`, will not send metric.');\n return;\n }\n\n const serializedMetric = _buildSerializedMetric(processedMetric, client, currentScope, scopeAttributes);\n\n DEBUG_BUILD && debug.log('[Metric]', serializedMetric);\n\n captureSerializedMetric(client, serializedMetric);\n\n client.emit('afterCaptureMetric', processedMetric);\n}\n\n/**\n * Flushes the metrics buffer to Sentry.\n *\n * @param client - A client.\n * @param maybeMetricBuffer - A metric buffer. Uses the metric buffer for the given client if not provided.\n *\n * @experimental This method will experience breaking changes. This is not yet part of\n * the stable Sentry SDK API and can be changed or removed without warning.\n */\nexport function _INTERNAL_flushMetricsBuffer(client: Client, maybeMetricBuffer?: Array<SerializedMetric>): void {\n const metricBuffer = maybeMetricBuffer ?? _INTERNAL_getMetricBuffer(client) ?? [];\n if (metricBuffer.length === 0) {\n return;\n }\n\n const clientOptions = client.getOptions();\n const envelope = createMetricEnvelope(\n metricBuffer,\n clientOptions._metadata,\n clientOptions.tunnel,\n client.getDsn(),\n client.getDataCollectionOptions().userInfo,\n );\n\n // Clear the metric buffer after envelopes have been constructed.\n _getBufferMap().set(client, []);\n\n client.emit('flushMetrics');\n\n // sendEnvelope should not throw\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n client.sendEnvelope(envelope);\n}\n\n/**\n * Returns the metric buffer for a given client.\n *\n * Exported for testing purposes.\n *\n * @param client - The client to get the metric buffer for.\n * @returns The metric buffer for the given client.\n */\nexport function _INTERNAL_getMetricBuffer(client: Client): Array<SerializedMetric> | undefined {\n return _getBufferMap().get(client);\n}\n\nfunction _getBufferMap(): WeakMap<Client, Array<SerializedMetric>> {\n // The reference to the Client <> MetricBuffer map is stored on the carrier to ensure it's always the same\n return getGlobalSingleton('clientToMetricBufferMap', () => new WeakMap<Client, Array<SerializedMetric>>());\n}\n"],"names":[],"mappings":"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"}

@@ -1,1 +0,1 @@

{"type":"module","version":"10.58.0","sideEffects":false}
{"type":"module","version":"10.59.0","sideEffects":false}

@@ -17,4 +17,10 @@ import { captureException } from '../../exports.js';

function shouldEnableTruncation(enableTruncation) {
if (enableTruncation !== void 0) {
return enableTruncation;
}
const client = getClient();
return enableTruncation ?? !(client && hasSpanStreamingEnabled(client));
if (!client) {
return true;
}
return !hasSpanStreamingEnabled(client) && !client.getOptions().streamGenAiSpans;
}

@@ -21,0 +27,0 @@ function buildMethodPath(currentPath, prop) {

@@ -1,1 +0,1 @@

{"version":3,"file":"utils.js","sources":["../../../../src/tracing/ai/utils.ts"],"sourcesContent":["/**\n * Shared utils for AI integrations (OpenAI, Anthropic, Verce.AI, etc.)\n */\nimport { captureException } from '../../exports';\nimport { getClient } from '../../currentScopes';\nimport { hasSpanStreamingEnabled } from '../spans/hasSpanStreamingEnabled';\nimport type { Span } from '../../types/span';\nimport { isThenable } from '../../utils/is';\nimport {\n GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE,\n GEN_AI_RESPONSE_ID_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_STREAMING_ATTRIBUTE,\n GEN_AI_RESPONSE_TEXT_ATTRIBUTE,\n GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from './gen-ai-attributes';\nimport { truncateGenAiMessages, truncateGenAiStringInput } from './messageTruncation';\n\nexport interface AIRecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\n/**\n * A method registry entry describes a single instrumented method:\n * which gen_ai operation it maps to and whether it is intrinsically streaming.\n */\nexport interface InstrumentedMethodEntry {\n /** Operation name (e.g. 'chat', 'embeddings', 'generate_content'). Omit for factory methods that only need result proxying. */\n operation?: string;\n /** True if the method itself is always streaming (not param-based) */\n streaming?: boolean;\n /** When set, the method's return value is re-proxied with this as the base path */\n proxyResultPath?: string;\n}\n\n/**\n * Maps method paths to their registry entries.\n * Used by proxy-based AI client instrumentations to determine which methods\n * to instrument, what operation name to use, and whether they stream.\n */\nexport type InstrumentedMethodRegistry = Record<string, InstrumentedMethodEntry>;\n\n/**\n * Resolves AI recording options by falling back to the client's `dataCollection.genAI` settings.\n * Precedence: explicit option > dataCollection.genAI > sendDefaultPii > false\n */\nexport function resolveAIRecordingOptions<T extends AIRecordingOptions>(options?: T): T & Required<AIRecordingOptions> {\n const genAI = getClient()?.getDataCollectionOptions().genAI;\n return {\n ...options,\n recordInputs: options?.recordInputs ?? genAI?.inputs ?? false,\n recordOutputs: options?.recordOutputs ?? genAI?.outputs ?? false,\n } as T & Required<AIRecordingOptions>;\n}\n\n/**\n * Resolves whether truncation should be enabled.\n * If the user explicitly set `enableTruncation`, that value is used.\n * Otherwise, truncation is disabled when span streaming is active.\n */\nexport function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean {\n const client = getClient();\n return enableTruncation ?? !(client && hasSpanStreamingEnabled(client));\n}\n\n/**\n * Build method path from current traversal\n */\nexport function buildMethodPath(currentPath: string, prop: string): string {\n return currentPath ? `${currentPath}.${prop}` : prop;\n}\n\n/**\n * Set token usage attributes\n * @param span - The span to add attributes to\n * @param promptTokens - The number of prompt tokens\n * @param completionTokens - The number of completion tokens\n * @param cachedInputTokens - The number of cached input tokens\n * @param cachedOutputTokens - The number of cached output tokens\n */\nexport function setTokenUsageAttributes(\n span: Span,\n promptTokens?: number,\n completionTokens?: number,\n cachedInputTokens?: number,\n cachedOutputTokens?: number,\n): void {\n if (promptTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens,\n });\n }\n if (completionTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens,\n });\n }\n if (\n promptTokens !== undefined ||\n completionTokens !== undefined ||\n cachedInputTokens !== undefined ||\n cachedOutputTokens !== undefined\n ) {\n /**\n * Total input tokens in a request is the summation of `input_tokens`,\n * `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n */\n const totalTokens =\n (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);\n\n span.setAttributes({\n [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens,\n });\n }\n}\n\nexport interface StreamResponseState {\n responseId?: string;\n responseModel?: string;\n finishReasons: string[];\n responseTexts: string[];\n toolCalls: unknown[];\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n}\n\n/**\n * Ends a streaming span by setting all accumulated response attributes and ending the span.\n * Shared across OpenAI, Anthropic, and Google GenAI streaming implementations.\n */\nexport function endStreamSpan(span: Span, state: StreamResponseState, recordOutputs: boolean): void {\n if (!span.isRecording()) {\n return;\n }\n\n const attrs: Record<string, string | number | boolean> = {\n [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n };\n\n if (state.responseId) attrs[GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;\n if (state.responseModel) attrs[GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;\n\n if (state.promptTokens !== undefined) attrs[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;\n if (state.completionTokens !== undefined) attrs[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;\n\n // Use explicit total if provided (OpenAI, Google), otherwise compute from cache tokens (Anthropic)\n if (state.totalTokens !== undefined) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;\n } else if (\n state.promptTokens !== undefined ||\n state.completionTokens !== undefined ||\n state.cacheCreationInputTokens !== undefined ||\n state.cacheReadInputTokens !== undefined\n ) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n (state.promptTokens ?? 0) +\n (state.completionTokens ?? 0) +\n (state.cacheCreationInputTokens ?? 0) +\n (state.cacheReadInputTokens ?? 0);\n }\n\n if (state.finishReasons.length) {\n attrs[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);\n }\n if (recordOutputs && state.responseTexts.length) {\n attrs[GEN_AI_RESPONSE_TEXT_ATTRIBUTE] = state.responseTexts.join('');\n }\n if (recordOutputs && state.toolCalls.length) {\n attrs[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE] = JSON.stringify(state.toolCalls);\n }\n\n span.setAttributes(attrs);\n span.end();\n}\n\n/**\n * Serialize a value to a JSON string without truncation.\n * Strings are returned as-is, arrays and objects are JSON-stringified.\n */\nexport function getJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n\n/**\n * Get the truncated JSON string for a string or array of strings.\n *\n * @param value - The string or array of strings to truncate\n * @returns The truncated JSON string\n */\nexport function getTruncatedJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n // Some values are already JSON strings, so we don't need to duplicate the JSON parsing\n return truncateGenAiStringInput(value);\n }\n if (Array.isArray(value)) {\n // truncateGenAiMessages returns an array of strings, so we need to stringify it\n const truncatedMessages = truncateGenAiMessages(value);\n return JSON.stringify(truncatedMessages);\n }\n // value is an object, so we need to stringify it\n return JSON.stringify(value);\n}\n\n/**\n * Extract system instructions from messages array.\n * Finds the first system message and formats it according to OpenTelemetry semantic conventions.\n *\n * @param messages - Array of messages to extract system instructions from\n * @returns systemInstructions (JSON string) and filteredMessages (without system message)\n */\nexport function extractSystemInstructions(messages: unknown[] | unknown): {\n systemInstructions: string | undefined;\n filteredMessages: unknown[] | unknown;\n} {\n if (!Array.isArray(messages)) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessageIndex = messages.findIndex(\n msg => msg && typeof msg === 'object' && 'role' in msg && (msg as { role: string }).role === 'system',\n );\n\n if (systemMessageIndex === -1) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessage = messages[systemMessageIndex] as { role: string; content?: string | unknown };\n const systemContent =\n typeof systemMessage.content === 'string'\n ? systemMessage.content\n : systemMessage.content !== undefined\n ? JSON.stringify(systemMessage.content)\n : undefined;\n\n if (!systemContent) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemInstructions = JSON.stringify([{ type: 'text', content: systemContent }]);\n const filteredMessages = [...messages.slice(0, systemMessageIndex), ...messages.slice(systemMessageIndex + 1)];\n\n return { systemInstructions, filteredMessages };\n}\n\n/**\n * Creates a wrapped version of .withResponse() that replaces the data field\n * with the instrumented result while preserving metadata (response, request_id).\n */\nasync function createWithResponseWrapper<T>(\n originalWithResponse: Promise<unknown>,\n instrumentedPromise: Promise<T>,\n mechanismType: string,\n): Promise<unknown> {\n // Attach catch handler to originalWithResponse immediately to prevent unhandled rejection\n // If instrumentedPromise rejects first, we still need this handled\n const safeOriginalWithResponse = originalWithResponse.catch(error => {\n captureException(error, {\n mechanism: {\n handled: false,\n type: mechanismType,\n },\n });\n throw error;\n });\n\n const instrumentedResult = await instrumentedPromise;\n const originalWrapper = await safeOriginalWithResponse;\n\n // Combine instrumented result with original metadata\n if (originalWrapper && typeof originalWrapper === 'object' && 'data' in originalWrapper) {\n return {\n ...originalWrapper,\n data: instrumentedResult,\n };\n }\n return instrumentedResult;\n}\n\n/**\n * Wraps a promise-like object to preserve additional methods (like .withResponse())\n * that AI SDK clients (OpenAI, Anthropic) attach to their APIPromise return values.\n *\n * Standard Promise methods (.then, .catch, .finally) are routed to the instrumented\n * promise to preserve Sentry's span instrumentation, while custom SDK methods are\n * forwarded to the original promise to maintain the SDK's API surface.\n */\nexport function wrapPromiseWithMethods<R>(\n originalPromiseLike: Promise<R>,\n instrumentedPromise: Promise<R>,\n mechanismType: string,\n): Promise<R> {\n // If the original result is not thenable, return the instrumented promise\n if (!isThenable(originalPromiseLike)) {\n return instrumentedPromise;\n }\n\n // Create a proxy that forwards Promise methods to instrumentedPromise\n // and preserves additional methods from the original result\n return new Proxy(originalPromiseLike, {\n get(target: object, prop: string | symbol): unknown {\n // For standard Promise methods (.then, .catch, .finally, Symbol.toStringTag),\n // use instrumentedPromise to preserve Sentry instrumentation.\n // For custom methods (like .withResponse()), use the original target.\n const useInstrumentedPromise = prop in Promise.prototype || prop === Symbol.toStringTag;\n const source = useInstrumentedPromise ? instrumentedPromise : target;\n\n const value = Reflect.get(source, prop) as unknown;\n\n // Special handling for .withResponse() to preserve instrumentation\n // .withResponse() returns { data: T, response: Response, request_id: string }\n if (prop === 'withResponse' && typeof value === 'function') {\n return function wrappedWithResponse(this: unknown): unknown {\n const originalWithResponse = (value as (...args: unknown[]) => unknown).call(target);\n return createWithResponseWrapper(originalWithResponse, instrumentedPromise, mechanismType);\n };\n }\n\n return typeof value === 'function' ? value.bind(source) : value;\n },\n }) as Promise<R>;\n}\n"],"names":[],"mappings":";;;;;;;AAkDO,SAAS,0BAAwD,OAAA,EAA+C;AACrH,EAAA,MAAM,KAAA,GAAQ,SAAA,EAAU,EAAG,wBAAA,EAAyB,CAAE,KAAA;AACtD,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,YAAA,EAAc,OAAA,EAAS,YAAA,IAAgB,KAAA,EAAO,MAAA,IAAU,KAAA;AAAA,IACxD,aAAA,EAAe,OAAA,EAAS,aAAA,IAAiB,KAAA,EAAO,OAAA,IAAW;AAAA,GAC7D;AACF;AAOO,SAAS,uBAAuB,gBAAA,EAAgD;AACrF,EAAA,MAAM,SAAS,SAAA,EAAU;AACzB,EAAA,OAAO,gBAAA,IAAoB,EAAE,MAAA,IAAU,uBAAA,CAAwB,MAAM,CAAA,CAAA;AACvE;AAKO,SAAS,eAAA,CAAgB,aAAqB,IAAA,EAAsB;AACzE,EAAA,OAAO,WAAA,GAAc,CAAA,EAAG,WAAW,CAAA,CAAA,EAAI,IAAI,CAAA,CAAA,GAAK,IAAA;AAClD;AAUO,SAAS,uBAAA,CACd,IAAA,EACA,YAAA,EACA,gBAAA,EACA,mBACA,kBAAA,EACM;AACN,EAAA,IAAI,iBAAiB,MAAA,EAAW;AAC9B,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,CAAC,mCAAmC,GAAG;AAAA,KACxC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,qBAAqB,MAAA,EAAW;AAClC,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,CAAC,oCAAoC,GAAG;AAAA,KACzC,CAAA;AAAA,EACH;AACA,EAAA,IACE,iBAAiB,MAAA,IACjB,gBAAA,KAAqB,UACrB,iBAAA,KAAsB,MAAA,IACtB,uBAAuB,MAAA,EACvB;AAKA,IAAA,MAAM,eACH,YAAA,IAAgB,CAAA,KAAM,oBAAoB,CAAA,CAAA,IAAM,iBAAA,IAAqB,MAAM,kBAAA,IAAsB,CAAA,CAAA;AAEpG,IAAA,IAAA,CAAK,aAAA,CAAc;AAAA,MACjB,CAAC,mCAAmC,GAAG;AAAA,KACxC,CAAA;AAAA,EACH;AACF;AAmBO,SAAS,aAAA,CAAc,IAAA,EAAY,KAAA,EAA4B,aAAA,EAA8B;AAClG,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,EAAY,EAAG;AACvB,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAmD;AAAA,IACvD,CAAC,mCAAmC,GAAG;AAAA,GACzC;AAEA,EAAA,IAAI,KAAA,CAAM,UAAA,EAAY,KAAA,CAAM,4BAA4B,IAAI,KAAA,CAAM,UAAA;AAClE,EAAA,IAAI,KAAA,CAAM,aAAA,EAAe,KAAA,CAAM,+BAA+B,IAAI,KAAA,CAAM,aAAA;AAExE,EAAA,IAAI,MAAM,YAAA,KAAiB,MAAA,EAAW,KAAA,CAAM,mCAAmC,IAAI,KAAA,CAAM,YAAA;AACzF,EAAA,IAAI,MAAM,gBAAA,KAAqB,MAAA,EAAW,KAAA,CAAM,oCAAoC,IAAI,KAAA,CAAM,gBAAA;AAG9F,EAAA,IAAI,KAAA,CAAM,gBAAgB,MAAA,EAAW;AACnC,IAAA,KAAA,CAAM,mCAAmC,IAAI,KAAA,CAAM,WAAA;AAAA,EACrD,CAAA,MAAA,IACE,KAAA,CAAM,YAAA,KAAiB,MAAA,IACvB,KAAA,CAAM,gBAAA,KAAqB,MAAA,IAC3B,KAAA,CAAM,wBAAA,KAA6B,MAAA,IACnC,KAAA,CAAM,oBAAA,KAAyB,MAAA,EAC/B;AACA,IAAA,KAAA,CAAM,mCAAmC,CAAA,GAAA,CACtC,KAAA,CAAM,YAAA,IAAgB,CAAA,KACtB,KAAA,CAAM,gBAAA,IAAoB,CAAA,CAAA,IAC1B,KAAA,CAAM,wBAAA,IAA4B,CAAA,CAAA,IAClC,KAAA,CAAM,oBAAA,IAAwB,CAAA,CAAA;AAAA,EACnC;AAEA,EAAA,IAAI,KAAA,CAAM,cAAc,MAAA,EAAQ;AAC9B,IAAA,KAAA,CAAM,wCAAwC,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,aAAa,CAAA;AAAA,EACtF;AACA,EAAA,IAAI,aAAA,IAAiB,KAAA,CAAM,aAAA,CAAc,MAAA,EAAQ;AAC/C,IAAA,KAAA,CAAM,8BAA8B,CAAA,GAAI,KAAA,CAAM,aAAA,CAAc,KAAK,EAAE,CAAA;AAAA,EACrE;AACA,EAAA,IAAI,aAAA,IAAiB,KAAA,CAAM,SAAA,CAAU,MAAA,EAAQ;AAC3C,IAAA,KAAA,CAAM,oCAAoC,CAAA,GAAI,IAAA,CAAK,SAAA,CAAU,MAAM,SAAS,CAAA;AAAA,EAC9E;AAEA,EAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AACxB,EAAA,IAAA,CAAK,GAAA,EAAI;AACX;AAMO,SAAS,cAAiB,KAAA,EAAwB;AACvD,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AAQO,SAAS,uBAA0B,KAAA,EAAwB;AAChE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAE7B,IAAA,OAAO,yBAAyB,KAAK,CAAA;AAAA,EACvC;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AAExB,IAAA,MAAM,iBAAA,GAAoB,sBAAsB,KAAK,CAAA;AACrD,IAAA,OAAO,IAAA,CAAK,UAAU,iBAAiB,CAAA;AAAA,EACzC;AAEA,EAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAC7B;AASO,SAAS,0BAA0B,QAAA,EAGxC;AACA,EAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAC5B,IAAA,OAAO,EAAE,kBAAA,EAAoB,MAAA,EAAW,gBAAA,EAAkB,QAAA,EAAS;AAAA,EACrE;AAEA,EAAA,MAAM,qBAAqB,QAAA,CAAS,SAAA;AAAA,IAClC,CAAA,GAAA,KAAO,OAAO,OAAO,GAAA,KAAQ,YAAY,MAAA,IAAU,GAAA,IAAQ,IAAyB,IAAA,KAAS;AAAA,GAC/F;AAEA,EAAA,IAAI,uBAAuB,EAAA,EAAI;AAC7B,IAAA,OAAO,EAAE,kBAAA,EAAoB,MAAA,EAAW,gBAAA,EAAkB,QAAA,EAAS;AAAA,EACrE;AAEA,EAAA,MAAM,aAAA,GAAgB,SAAS,kBAAkB,CAAA;AACjD,EAAA,MAAM,aAAA,GACJ,OAAO,aAAA,CAAc,OAAA,KAAY,WAC7B,aAAA,CAAc,OAAA,GACd,aAAA,CAAc,OAAA,KAAY,MAAA,GACxB,IAAA,CAAK,SAAA,CAAU,aAAA,CAAc,OAAO,CAAA,GACpC,MAAA;AAER,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAO,EAAE,kBAAA,EAAoB,MAAA,EAAW,gBAAA,EAAkB,QAAA,EAAS;AAAA,EACrE;AAEA,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,SAAA,CAAU,CAAC,EAAE,MAAM,MAAA,EAAQ,OAAA,EAAS,aAAA,EAAe,CAAC,CAAA;AACpF,EAAA,MAAM,gBAAA,GAAmB,CAAC,GAAG,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,kBAAkB,CAAA,EAAG,GAAG,QAAA,CAAS,KAAA,CAAM,kBAAA,GAAqB,CAAC,CAAC,CAAA;AAE7G,EAAA,OAAO,EAAE,oBAAoB,gBAAA,EAAiB;AAChD;AAMA,eAAe,yBAAA,CACb,oBAAA,EACA,mBAAA,EACA,aAAA,EACkB;AAGlB,EAAA,MAAM,wBAAA,GAA2B,oBAAA,CAAqB,KAAA,CAAM,CAAA,KAAA,KAAS;AACnE,IAAA,gBAAA,CAAiB,KAAA,EAAO;AAAA,MACtB,SAAA,EAAW;AAAA,QACT,OAAA,EAAS,KAAA;AAAA,QACT,IAAA,EAAM;AAAA;AACR,KACD,CAAA;AACD,IAAA,MAAM,KAAA;AAAA,EACR,CAAC,CAAA;AAED,EAAA,MAAM,qBAAqB,MAAM,mBAAA;AACjC,EAAA,MAAM,kBAAkB,MAAM,wBAAA;AAG9B,EAAA,IAAI,eAAA,IAAmB,OAAO,eAAA,KAAoB,QAAA,IAAY,UAAU,eAAA,EAAiB;AACvF,IAAA,OAAO;AAAA,MACL,GAAG,eAAA;AAAA,MACH,IAAA,EAAM;AAAA,KACR;AAAA,EACF;AACA,EAAA,OAAO,kBAAA;AACT;AAUO,SAAS,sBAAA,CACd,mBAAA,EACA,mBAAA,EACA,aAAA,EACY;AAEZ,EAAA,IAAI,CAAC,UAAA,CAAW,mBAAmB,CAAA,EAAG;AACpC,IAAA,OAAO,mBAAA;AAAA,EACT;AAIA,EAAA,OAAO,IAAI,MAAM,mBAAA,EAAqB;AAAA,IACpC,GAAA,CAAI,QAAgB,IAAA,EAAgC;AAIlD,MAAA,MAAM,sBAAA,GAAyB,IAAA,IAAQ,OAAA,CAAQ,SAAA,IAAa,SAAS,MAAA,CAAO,WAAA;AAC5E,MAAA,MAAM,MAAA,GAAS,yBAAyB,mBAAA,GAAsB,MAAA;AAE9D,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,GAAA,CAAI,MAAA,EAAQ,IAAI,CAAA;AAItC,MAAA,IAAI,IAAA,KAAS,cAAA,IAAkB,OAAO,KAAA,KAAU,UAAA,EAAY;AAC1D,QAAA,OAAO,SAAS,mBAAA,GAA4C;AAC1D,UAAA,MAAM,oBAAA,GAAwB,KAAA,CAA0C,IAAA,CAAK,MAAM,CAAA;AACnF,UAAA,OAAO,yBAAA,CAA0B,oBAAA,EAAsB,mBAAA,EAAqB,aAAa,CAAA;AAAA,QAC3F,CAAA;AAAA,MACF;AAEA,MAAA,OAAO,OAAO,KAAA,KAAU,UAAA,GAAa,KAAA,CAAM,IAAA,CAAK,MAAM,CAAA,GAAI,KAAA;AAAA,IAC5D;AAAA,GACD,CAAA;AACH;;;;"}
{"version":3,"file":"utils.js","sources":["../../../../src/tracing/ai/utils.ts"],"sourcesContent":["/**\n * Shared utils for AI integrations (OpenAI, Anthropic, Verce.AI, etc.)\n */\nimport { captureException } from '../../exports';\nimport { getClient } from '../../currentScopes';\nimport { hasSpanStreamingEnabled } from '../spans/hasSpanStreamingEnabled';\nimport type { Span } from '../../types/span';\nimport { isThenable } from '../../utils/is';\nimport {\n GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE,\n GEN_AI_RESPONSE_ID_ATTRIBUTE,\n GEN_AI_RESPONSE_MODEL_ATTRIBUTE,\n GEN_AI_RESPONSE_STREAMING_ATTRIBUTE,\n GEN_AI_RESPONSE_TEXT_ATTRIBUTE,\n GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE,\n GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE,\n GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE,\n} from './gen-ai-attributes';\nimport { truncateGenAiMessages, truncateGenAiStringInput } from './messageTruncation';\n\nexport interface AIRecordingOptions {\n recordInputs?: boolean;\n recordOutputs?: boolean;\n}\n\n/**\n * A method registry entry describes a single instrumented method:\n * which gen_ai operation it maps to and whether it is intrinsically streaming.\n */\nexport interface InstrumentedMethodEntry {\n /** Operation name (e.g. 'chat', 'embeddings', 'generate_content'). Omit for factory methods that only need result proxying. */\n operation?: string;\n /** True if the method itself is always streaming (not param-based) */\n streaming?: boolean;\n /** When set, the method's return value is re-proxied with this as the base path */\n proxyResultPath?: string;\n}\n\n/**\n * Maps method paths to their registry entries.\n * Used by proxy-based AI client instrumentations to determine which methods\n * to instrument, what operation name to use, and whether they stream.\n */\nexport type InstrumentedMethodRegistry = Record<string, InstrumentedMethodEntry>;\n\n/**\n * Resolves AI recording options by falling back to the client's `dataCollection.genAI` settings.\n * Precedence: explicit option > dataCollection.genAI > sendDefaultPii > false\n */\nexport function resolveAIRecordingOptions<T extends AIRecordingOptions>(options?: T): T & Required<AIRecordingOptions> {\n const genAI = getClient()?.getDataCollectionOptions().genAI;\n return {\n ...options,\n recordInputs: options?.recordInputs ?? genAI?.inputs ?? false,\n recordOutputs: options?.recordOutputs ?? genAI?.outputs ?? false,\n } as T & Required<AIRecordingOptions>;\n}\n\n/**\n * Resolves whether truncation should be enabled.\n * If the user explicitly set `enableTruncation`, that value is used.\n * Otherwise, truncation is disabled whenever gen_ai spans are sent through the span streaming / v2\n * span path, i.e. full span streaming (`traceLifecycle: 'stream'`) or `streamGenAiSpans`. That path\n * is not subject to the transaction payload-size limits that truncation works around, so the full\n * message data can be retained.\n */\nexport function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean {\n if (enableTruncation !== undefined) {\n return enableTruncation;\n }\n\n const client = getClient();\n if (!client) {\n return true;\n }\n\n return !hasSpanStreamingEnabled(client) && !client.getOptions().streamGenAiSpans;\n}\n\n/**\n * Build method path from current traversal\n */\nexport function buildMethodPath(currentPath: string, prop: string): string {\n return currentPath ? `${currentPath}.${prop}` : prop;\n}\n\n/**\n * Set token usage attributes\n * @param span - The span to add attributes to\n * @param promptTokens - The number of prompt tokens\n * @param completionTokens - The number of completion tokens\n * @param cachedInputTokens - The number of cached input tokens\n * @param cachedOutputTokens - The number of cached output tokens\n */\nexport function setTokenUsageAttributes(\n span: Span,\n promptTokens?: number,\n completionTokens?: number,\n cachedInputTokens?: number,\n cachedOutputTokens?: number,\n): void {\n if (promptTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE]: promptTokens,\n });\n }\n if (completionTokens !== undefined) {\n span.setAttributes({\n [GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE]: completionTokens,\n });\n }\n if (\n promptTokens !== undefined ||\n completionTokens !== undefined ||\n cachedInputTokens !== undefined ||\n cachedOutputTokens !== undefined\n ) {\n /**\n * Total input tokens in a request is the summation of `input_tokens`,\n * `cache_creation_input_tokens`, and `cache_read_input_tokens`.\n */\n const totalTokens =\n (promptTokens ?? 0) + (completionTokens ?? 0) + (cachedInputTokens ?? 0) + (cachedOutputTokens ?? 0);\n\n span.setAttributes({\n [GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE]: totalTokens,\n });\n }\n}\n\nexport interface StreamResponseState {\n responseId?: string;\n responseModel?: string;\n finishReasons: string[];\n responseTexts: string[];\n toolCalls: unknown[];\n promptTokens?: number;\n completionTokens?: number;\n totalTokens?: number;\n cacheCreationInputTokens?: number;\n cacheReadInputTokens?: number;\n}\n\n/**\n * Ends a streaming span by setting all accumulated response attributes and ending the span.\n * Shared across OpenAI, Anthropic, and Google GenAI streaming implementations.\n */\nexport function endStreamSpan(span: Span, state: StreamResponseState, recordOutputs: boolean): void {\n if (!span.isRecording()) {\n return;\n }\n\n const attrs: Record<string, string | number | boolean> = {\n [GEN_AI_RESPONSE_STREAMING_ATTRIBUTE]: true,\n };\n\n if (state.responseId) attrs[GEN_AI_RESPONSE_ID_ATTRIBUTE] = state.responseId;\n if (state.responseModel) attrs[GEN_AI_RESPONSE_MODEL_ATTRIBUTE] = state.responseModel;\n\n if (state.promptTokens !== undefined) attrs[GEN_AI_USAGE_INPUT_TOKENS_ATTRIBUTE] = state.promptTokens;\n if (state.completionTokens !== undefined) attrs[GEN_AI_USAGE_OUTPUT_TOKENS_ATTRIBUTE] = state.completionTokens;\n\n // Use explicit total if provided (OpenAI, Google), otherwise compute from cache tokens (Anthropic)\n if (state.totalTokens !== undefined) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] = state.totalTokens;\n } else if (\n state.promptTokens !== undefined ||\n state.completionTokens !== undefined ||\n state.cacheCreationInputTokens !== undefined ||\n state.cacheReadInputTokens !== undefined\n ) {\n attrs[GEN_AI_USAGE_TOTAL_TOKENS_ATTRIBUTE] =\n (state.promptTokens ?? 0) +\n (state.completionTokens ?? 0) +\n (state.cacheCreationInputTokens ?? 0) +\n (state.cacheReadInputTokens ?? 0);\n }\n\n if (state.finishReasons.length) {\n attrs[GEN_AI_RESPONSE_FINISH_REASONS_ATTRIBUTE] = JSON.stringify(state.finishReasons);\n }\n if (recordOutputs && state.responseTexts.length) {\n attrs[GEN_AI_RESPONSE_TEXT_ATTRIBUTE] = state.responseTexts.join('');\n }\n if (recordOutputs && state.toolCalls.length) {\n attrs[GEN_AI_RESPONSE_TOOL_CALLS_ATTRIBUTE] = JSON.stringify(state.toolCalls);\n }\n\n span.setAttributes(attrs);\n span.end();\n}\n\n/**\n * Serialize a value to a JSON string without truncation.\n * Strings are returned as-is, arrays and objects are JSON-stringified.\n */\nexport function getJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n return value;\n }\n return JSON.stringify(value);\n}\n\n/**\n * Get the truncated JSON string for a string or array of strings.\n *\n * @param value - The string or array of strings to truncate\n * @returns The truncated JSON string\n */\nexport function getTruncatedJsonString<T>(value: T | T[]): string {\n if (typeof value === 'string') {\n // Some values are already JSON strings, so we don't need to duplicate the JSON parsing\n return truncateGenAiStringInput(value);\n }\n if (Array.isArray(value)) {\n // truncateGenAiMessages returns an array of strings, so we need to stringify it\n const truncatedMessages = truncateGenAiMessages(value);\n return JSON.stringify(truncatedMessages);\n }\n // value is an object, so we need to stringify it\n return JSON.stringify(value);\n}\n\n/**\n * Extract system instructions from messages array.\n * Finds the first system message and formats it according to OpenTelemetry semantic conventions.\n *\n * @param messages - Array of messages to extract system instructions from\n * @returns systemInstructions (JSON string) and filteredMessages (without system message)\n */\nexport function extractSystemInstructions(messages: unknown[] | unknown): {\n systemInstructions: string | undefined;\n filteredMessages: unknown[] | unknown;\n} {\n if (!Array.isArray(messages)) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessageIndex = messages.findIndex(\n msg => msg && typeof msg === 'object' && 'role' in msg && (msg as { role: string }).role === 'system',\n );\n\n if (systemMessageIndex === -1) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemMessage = messages[systemMessageIndex] as { role: string; content?: string | unknown };\n const systemContent =\n typeof systemMessage.content === 'string'\n ? systemMessage.content\n : systemMessage.content !== undefined\n ? JSON.stringify(systemMessage.content)\n : undefined;\n\n if (!systemContent) {\n return { systemInstructions: undefined, filteredMessages: messages };\n }\n\n const systemInstructions = JSON.stringify([{ type: 'text', content: systemContent }]);\n const filteredMessages = [...messages.slice(0, systemMessageIndex), ...messages.slice(systemMessageIndex + 1)];\n\n return { systemInstructions, filteredMessages };\n}\n\n/**\n * Creates a wrapped version of .withResponse() that replaces the data field\n * with the instrumented result while preserving metadata (response, request_id).\n */\nasync function createWithResponseWrapper<T>(\n originalWithResponse: Promise<unknown>,\n instrumentedPromise: Promise<T>,\n mechanismType: string,\n): Promise<unknown> {\n // Attach catch handler to originalWithResponse immediately to prevent unhandled rejection\n // If instrumentedPromise rejects first, we still need this handled\n const safeOriginalWithResponse = originalWithResponse.catch(error => {\n captureException(error, {\n mechanism: {\n handled: false,\n type: mechanismType,\n },\n });\n throw error;\n });\n\n const instrumentedResult = await instrumentedPromise;\n const originalWrapper = await safeOriginalWithResponse;\n\n // Combine instrumented result with original metadata\n if (originalWrapper && typeof originalWrapper === 'object' && 'data' in originalWrapper) {\n return {\n ...originalWrapper,\n data: instrumentedResult,\n };\n }\n return instrumentedResult;\n}\n\n/**\n * Wraps a promise-like object to preserve additional methods (like .withResponse())\n * that AI SDK clients (OpenAI, Anthropic) attach to their APIPromise return values.\n *\n * Standard Promise methods (.then, .catch, .finally) are routed to the instrumented\n * promise to preserve Sentry's span instrumentation, while custom SDK methods are\n * forwarded to the original promise to maintain the SDK's API surface.\n */\nexport function wrapPromiseWithMethods<R>(\n originalPromiseLike: Promise<R>,\n instrumentedPromise: Promise<R>,\n mechanismType: string,\n): Promise<R> {\n // If the original result is not thenable, return the instrumented promise\n if (!isThenable(originalPromiseLike)) {\n return instrumentedPromise;\n }\n\n // Create a proxy that forwards Promise methods to instrumentedPromise\n // and preserves additional methods from the original result\n return new Proxy(originalPromiseLike, {\n get(target: object, prop: string | symbol): unknown {\n // For standard Promise methods (.then, .catch, .finally, Symbol.toStringTag),\n // use instrumentedPromise to preserve Sentry instrumentation.\n // For custom methods (like .withResponse()), use the original target.\n const useInstrumentedPromise = prop in Promise.prototype || prop === Symbol.toStringTag;\n const source = useInstrumentedPromise ? instrumentedPromise : target;\n\n const value = Reflect.get(source, prop) as unknown;\n\n // Special handling for .withResponse() to preserve instrumentation\n // .withResponse() returns { data: T, response: Response, request_id: string }\n if (prop === 'withResponse' && typeof value === 'function') {\n return function wrappedWithResponse(this: unknown): unknown {\n const originalWithResponse = (value as (...args: unknown[]) => unknown).call(target);\n return createWithResponseWrapper(originalWithResponse, instrumentedPromise, mechanismType);\n };\n }\n\n return typeof value === 'function' ? value.bind(source) : value;\n },\n }) as Promise<R>;\n}\n"],"names":[],"mappings":"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"}

@@ -9,2 +9,3 @@ import { DEFAULT_ENVIRONMENT } from '../constants.js';

import { getRootSpan, spanToJSON, spanIsSampled } from '../utils/spanUtils.js';
import { spanIsNonRecordingSpan } from './sentryNonRecordingSpan.js';
import { getCapturedScopesOnSpan } from './utils.js';

@@ -54,2 +55,8 @@

}
if (spanIsNonRecordingSpan(rootSpan) && !hasSpansEnabled(client.getOptions())) {
const capturedScope = getCapturedScopesOnSpan(rootSpan).scope;
if (capturedScope) {
return applyLocalSampleRateToDsc({ ...getDynamicSamplingContextFromScope(client, capturedScope) });
}
}
const traceStateDsc = traceState?.get("sentry.dsc");

@@ -56,0 +63,0 @@ const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);

@@ -1,1 +0,1 @@

{"version":3,"file":"dynamicSamplingContext.js","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n const dsc: DynamicSamplingContext = {\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n org_id: extractOrgIdFromClient(client),\n };\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n // TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n"],"names":["dsc"],"mappings":"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"}
{"version":3,"file":"dynamicSamplingContext.js","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"sourcesContent":["import type { Client } from '../client';\nimport { DEFAULT_ENVIRONMENT } from '../constants';\nimport { getClient } from '../currentScopes';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport { baggageHeaderToDynamicSamplingContext, dynamicSamplingContextToSentryBaggageHeader } from '../utils/baggage';\nimport { extractOrgIdFromClient } from '../utils/dsn';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { getRootSpan, spanIsSampled, spanToJSON } from '../utils/spanUtils';\nimport { spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { getCapturedScopesOnSpan } from './utils';\n\n/**\n * If you change this value, also update the terser plugin config to\n * avoid minification of the object property!\n */\nconst FROZEN_DSC_FIELD = '_frozenDsc';\n\ntype SpanWithMaybeDsc = Span & {\n [FROZEN_DSC_FIELD]?: Partial<DynamicSamplingContext> | undefined;\n};\n\n/**\n * Freeze the given DSC on the given span.\n */\nexport function freezeDscOnSpan(span: Span, dsc: Partial<DynamicSamplingContext>): void {\n const spanWithMaybeDsc = span as SpanWithMaybeDsc;\n addNonEnumerableProperty(spanWithMaybeDsc, FROZEN_DSC_FIELD, dsc);\n}\n\n/**\n * Creates a dynamic sampling context from a client.\n *\n * Dispatches the `createDsc` lifecycle hook as a side effect.\n */\nexport function getDynamicSamplingContextFromClient(trace_id: string, client: Client): DynamicSamplingContext {\n const options = client.getOptions();\n\n const { publicKey: public_key } = client.getDsn() || {};\n\n // Instead of conditionally adding non-undefined values, we add them and then remove them if needed\n // otherwise, the order of baggage entries changes, which \"breaks\" a bunch of tests etc.\n const dsc: DynamicSamplingContext = {\n environment: options.environment || DEFAULT_ENVIRONMENT,\n release: options.release,\n public_key,\n trace_id,\n org_id: extractOrgIdFromClient(client),\n };\n\n client.emit('createDsc', dsc);\n\n return dsc;\n}\n\n/**\n * Get the dynamic sampling context for the currently active scopes.\n */\nexport function getDynamicSamplingContextFromScope(client: Client, scope: Scope): Partial<DynamicSamplingContext> {\n const propagationContext = scope.getPropagationContext();\n return propagationContext.dsc || getDynamicSamplingContextFromClient(propagationContext.traceId, client);\n}\n\n/**\n * Creates a dynamic sampling context from a span (and client and scope)\n *\n * @param span the span from which a few values like the root span name and sample rate are extracted.\n *\n * @returns a dynamic sampling context\n */\nexport function getDynamicSamplingContextFromSpan(span: Span): Readonly<Partial<DynamicSamplingContext>> {\n const client = getClient();\n if (!client) {\n return {};\n }\n\n const rootSpan = getRootSpan(span);\n const rootSpanJson = spanToJSON(rootSpan);\n const rootSpanAttributes = rootSpanJson.data;\n const traceState = rootSpan.spanContext().traceState;\n\n // The span sample rate that was locally applied to the root span should also always be applied to the DSC, even if the DSC is frozen.\n // This is so that the downstream traces/services can use parentSampleRate in their `tracesSampler` to make consistent sampling decisions across the entire trace.\n const rootSpanSampleRate =\n traceState?.get('sentry.sample_rate') ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE] ??\n rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_PREVIOUS_TRACE_SAMPLE_RATE];\n\n function applyLocalSampleRateToDsc(dsc: Partial<DynamicSamplingContext>): Partial<DynamicSamplingContext> {\n if (typeof rootSpanSampleRate === 'number' || typeof rootSpanSampleRate === 'string') {\n dsc.sample_rate = `${rootSpanSampleRate}`;\n }\n return dsc;\n }\n\n // For core implementation, we freeze the DSC onto the span as a non-enumerable property\n const frozenDsc = (rootSpan as SpanWithMaybeDsc)[FROZEN_DSC_FIELD];\n if (frozenDsc) {\n return applyLocalSampleRateToDsc(frozenDsc);\n }\n\n // For a non-recording placeholder in Tracing without Performance (TwP) mode, the DSC is not\n // carried on the span; the scope is the source of truth. Resolve it from the span's captured\n // scope: continued traces keep the incoming DSC, new traces derive it from the client.\n //\n // We gate this on `!hasSpansEnabled()` so it mirrors the `sentry-trace` source in `getTraceData`:\n // with tracing enabled, a non-recording span (e.g. an `onlyIfParent` placeholder) keeps deriving\n // its DSC from the span/client so the baggage agrees with the `-0` decision that `spanToTraceHeader`\n // encodes for `sentry-trace`. Without this guard the two headers can disagree.\n //\n // We spread into a new object so applying the local sample rate can't mutate the scope's DSC.\n if (spanIsNonRecordingSpan(rootSpan) && !hasSpansEnabled(client.getOptions())) {\n const capturedScope = getCapturedScopesOnSpan(rootSpan).scope;\n if (capturedScope) {\n return applyLocalSampleRateToDsc({ ...getDynamicSamplingContextFromScope(client, capturedScope) });\n }\n }\n\n // For OpenTelemetry, we freeze the DSC on the trace state\n const traceStateDsc = traceState?.get('sentry.dsc');\n\n // If the span has a DSC, we want it to take precedence\n const dscOnTraceState = traceStateDsc && baggageHeaderToDynamicSamplingContext(traceStateDsc);\n\n if (dscOnTraceState) {\n return applyLocalSampleRateToDsc(dscOnTraceState);\n }\n\n // Else, we generate it from the span\n const dsc = getDynamicSamplingContextFromClient(span.spanContext().traceId, client);\n\n // We don't want to have a transaction name in the DSC if the source is \"url\" because URLs might contain PII\n // TODO(v11): Only read `SEMANTIC_ATTRIBUTE_SENTRY_SOURCE` again, once we renamed it to `sentry.span.source`\n const source = rootSpanAttributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] ?? rootSpanAttributes['sentry.span.source'];\n\n // after JSON conversion, txn.name becomes jsonSpan.description\n const name = rootSpanJson.description;\n if (source !== 'url' && name) {\n dsc.transaction = name;\n }\n\n // How can we even land here with hasSpansEnabled() returning false?\n // Otel creates a Non-recording span in Tracing Without Performance mode when handling incoming requests\n // So we end up with an active span that is not sampled (neither positively nor negatively)\n if (hasSpansEnabled()) {\n dsc.sampled = String(spanIsSampled(rootSpan));\n dsc.sample_rand =\n // In OTEL we store the sample rand on the trace state because we cannot access scopes for NonRecordingSpans\n // The Sentry OTEL SpanSampler takes care of writing the sample rand on the root span\n traceState?.get('sentry.sample_rand') ??\n // On all other platforms we can actually get the scopes from a root span (we use this as a fallback)\n getCapturedScopesOnSpan(rootSpan).scope?.getPropagationContext().sampleRand.toString();\n }\n\n applyLocalSampleRateToDsc(dsc);\n\n client.emit('createDsc', dsc, rootSpan);\n\n return dsc;\n}\n\n/**\n * Convert a Span to a baggage header.\n */\nexport function spanToBaggageHeader(span: Span): string | undefined {\n const dsc = getDynamicSamplingContextFromSpan(span);\n return dynamicSamplingContextToSentryBaggageHeader(dsc);\n}\n"],"names":["dsc"],"mappings":"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"}

@@ -1,2 +0,2 @@

import { getClient, getCurrentScope } from '../currentScopes.js';
import { getClient, getCurrentScope, getIsolationScope } from '../currentScopes.js';
import { DEBUG_BUILD } from '../debug-build.js';

@@ -10,7 +10,7 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes.js';

import { timestampInSeconds } from '../utils/time.js';
import { getDynamicSamplingContextFromSpan, freezeDscOnSpan } from './dynamicSamplingContext.js';
import { SentryNonRecordingSpan } from './sentryNonRecordingSpan.js';
import { SentryNonRecordingSpan, spanIsNonRecordingSpan } from './sentryNonRecordingSpan.js';
import { SentrySpan } from './sentrySpan.js';
import { SPAN_STATUS_OK, SPAN_STATUS_ERROR } from './spanstatus.js';
import { startInactiveSpan } from './trace.js';
import { setCapturedScopesOnSpan } from './utils.js';

@@ -41,13 +41,8 @@ const TRACING_DEFAULTS = {

const client = getClient();
const scope = getCurrentScope();
if (!client || !hasSpansEnabled()) {
const span2 = new SentryNonRecordingSpan();
const dsc = {
sample_rate: "0",
sampled: "false",
...getDynamicSamplingContextFromSpan(span2)
};
freezeDscOnSpan(span2, dsc);
const span2 = new SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });
setCapturedScopesOnSpan(span2, scope, getIsolationScope());
return span2;
}
const scope = getCurrentScope();
const previousActiveSpan = getActiveSpan();

@@ -60,3 +55,3 @@ const span = _startIdleSpan(startSpanOptions);

}
if (thisArg instanceof SentryNonRecordingSpan) {
if (spanIsNonRecordingSpan(thisArg)) {
return;

@@ -63,0 +58,0 @@ }

@@ -1,1 +0,1 @@

{"version":3,"file":"idleSpan.js","sources":["../../../src/tracing/idleSpan.ts"],"sourcesContent":["import { getClient, getCurrentScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { Span } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { debug } from '../utils/debug-logger';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { _setSpanForScope } from '../utils/spanOnScope';\nimport {\n getActiveSpan,\n getSpanDescendants,\n removeChildSpanFromSpan,\n spanTimeInputToSeconds,\n spanToJSON,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR, SPAN_STATUS_OK } from './spanstatus';\nimport { startInactiveSpan } from './trace';\n\nexport const TRACING_DEFAULTS = {\n idleTimeout: 1_000,\n finalTimeout: 30_000,\n childSpanTimeout: 15_000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\nconst FINISH_REASON_CANCELLED = 'cancelled';\n\n// unused\nconst FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden';\n\n// unused in this file, but used in BrowserTracing\nconst FINISH_REASON_INTERRUPTED = 'interactionInterrupted';\n\ntype IdleSpanFinishReason =\n | typeof FINISH_REASON_CANCELLED\n | typeof FINISH_REASON_DOCUMENT_HIDDEN\n | typeof FINISH_REASON_EXTERNAL_FINISH\n | typeof FINISH_REASON_FINAL_TIMEOUT\n | typeof FINISH_REASON_HEARTBEAT_FAILED\n | typeof FINISH_REASON_IDLE_TIMEOUT\n | typeof FINISH_REASON_INTERRUPTED;\n\ninterface IdleSpanOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n */\n idleTimeout: number;\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n */\n finalTimeout: number;\n /**\n * The max. time a child span may run.\n * If the time since the last span was started exceeds this time, the idle span will finish.\n */\n childSpanTimeout?: number;\n /**\n * When set to `true`, will disable the idle timeout and child timeout\n * until the `idleSpanEnableAutoFinish` hook is emitted for the idle span.\n * The final timeout mechanism will not be affected by this option,\n * meaning the idle span will definitely be finished when the final timeout is\n * reached, no matter what this option is configured to.\n *\n * Defaults to `false`.\n */\n disableAutoFinish?: boolean;\n\n /** Allows to configure a hook that is called when the idle span is ended, before it is processed. */\n beforeSpanEnd?: (span: Span) => void;\n\n /**\n * If set to `true`, the idle span will be trimmed to the latest span end timestamp of its children.\n *\n * @default `true`.\n */\n trimIdleSpanEndTimestamp?: boolean;\n}\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nexport function startIdleSpan(startSpanOptions: StartSpanOptions, options: Partial<IdleSpanOptions> = {}): Span {\n // Activities store a list of active spans\n const activities = new Map<string, boolean>();\n\n // We should not use heartbeat if we finished a span\n let _finished = false;\n\n // Timer that tracks idleTimeout\n let _idleTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // Timer that tracks maxSpanTime for child spans\n let _childSpanTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // The reason why the span was finished\n let _finishReason: IdleSpanFinishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n let _autoFinishAllowed: boolean = !options.disableAutoFinish;\n\n const _cleanupHooks: (() => void)[] = [];\n\n const {\n idleTimeout = TRACING_DEFAULTS.idleTimeout,\n finalTimeout = TRACING_DEFAULTS.finalTimeout,\n childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n beforeSpanEnd,\n trimIdleSpanEndTimestamp = true,\n } = options;\n\n const client = getClient();\n\n if (!client || !hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n const dsc = {\n sample_rate: '0',\n sampled: 'false',\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n\n return span;\n }\n\n const scope = getCurrentScope();\n const previousActiveSpan = getActiveSpan();\n const span = _startIdleSpan(startSpanOptions);\n\n // We patch span.end to ensure we can run some things before the span is ended\n // eslint-disable-next-line @typescript-eslint/unbound-method\n span.end = new Proxy(span.end, {\n apply(target, thisArg, args: Parameters<Span['end']>) {\n if (beforeSpanEnd) {\n beforeSpanEnd(span);\n }\n\n // If the span is non-recording, nothing more to do here...\n // This is the case if tracing is enabled but this specific span was not sampled\n if (thisArg instanceof SentryNonRecordingSpan) {\n return;\n }\n\n // Just ensuring that this keeps working, even if we ever have more arguments here\n const [definedEndTimestamp, ...rest] = args;\n const timestamp = definedEndTimestamp || timestampInSeconds();\n const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n // Ensure we end with the last span timestamp, if possible\n const spans = getSpanDescendants(span).filter(child => child !== span);\n\n const spanJson = spanToJSON(span);\n\n // If we have no spans, we just end, nothing else to do here\n // Likewise, if users explicitly ended the span, we simply end the span without timestamp adjustment\n if (!spans.length || !trimIdleSpanEndTimestamp) {\n onIdleSpanEnded(spanEndTimestamp);\n return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n }\n\n const ignoreSpans = client.getOptions().ignoreSpans;\n\n const latestSpanEndTimestamp = spans?.reduce((acc: number | undefined, current) => {\n const currentSpanJson = spanToJSON(current);\n if (!currentSpanJson.timestamp) {\n return acc;\n }\n // Ignored spans will get dropped later (in the client) but since we already adjust\n // the idle span end timestamp here, we can already take to-be-ignored spans out of\n // the calculation here.\n if (\n ignoreSpans &&\n shouldIgnoreSpan(\n { description: currentSpanJson.description, op: currentSpanJson.op, attributes: currentSpanJson.data },\n ignoreSpans,\n )\n ) {\n return acc;\n }\n return acc ? Math.max(acc, currentSpanJson.timestamp) : currentSpanJson.timestamp;\n }, undefined);\n\n // In reality this should always exist here, but type-wise it may be undefined...\n const spanStartTimestamp = spanJson.start_timestamp;\n\n // The final endTimestamp should:\n // * Never be before the span start timestamp\n // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n // * Otherwise be the passed end timestamp\n // Final timestamp can never be after finalTimeout\n const endTimestamp = Math.min(\n spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n );\n\n onIdleSpanEnded(endTimestamp);\n return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n },\n });\n\n /**\n * Cancels the existing idle timeout, if there is one.\n */\n function _cancelIdleTimeout(): void {\n if (_idleTimeoutID) {\n clearTimeout(_idleTimeoutID);\n _idleTimeoutID = undefined;\n }\n }\n\n /**\n * Cancels the existing child span timeout, if there is one.\n */\n function _cancelChildSpanTimeout(): void {\n if (_childSpanTimeoutID) {\n clearTimeout(_childSpanTimeoutID);\n _childSpanTimeoutID = undefined;\n }\n }\n\n /**\n * Restarts idle timeout, if there is no running idle timeout it will start one.\n */\n function _restartIdleTimeout(endTimestamp?: number): void {\n _cancelIdleTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n span.end(endTimestamp);\n }\n }, idleTimeout);\n }\n\n /**\n * Restarts child span timeout, if there is none running it will start one.\n */\n function _restartChildSpanTimeout(endTimestamp?: number): void {\n _cancelChildSpanTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n span.end(endTimestamp);\n }\n }, childSpanTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n function _pushActivity(spanId: string): void {\n _cancelIdleTimeout();\n activities.set(spanId, true);\n\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n function _popActivity(spanId: string): void {\n if (activities.has(spanId)) {\n activities.delete(spanId);\n }\n\n if (activities.size === 0) {\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n _cancelChildSpanTimeout();\n }\n }\n\n function onIdleSpanEnded(endTimestamp: number): void {\n _finished = true;\n activities.clear();\n\n _cleanupHooks.forEach(cleanup => cleanup());\n\n _setSpanForScope(scope, previousActiveSpan);\n\n const spanJSON = spanToJSON(span);\n\n const { start_timestamp: startTimestamp } = spanJSON;\n // This should never happen, but to make TS happy...\n if (!startTimestamp) {\n return;\n }\n\n const attributes = spanJSON.data;\n if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n }\n\n // Set span status to 'ok' if it hasn't been explicitly set to an error status\n const currentStatus = spanJSON.status;\n if (!currentStatus || currentStatus === 'unknown') {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n debug.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n let discardedSpans = 0;\n childSpans.forEach(childSpan => {\n // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n if (childSpan.isRecording()) {\n childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n childSpan.end(endTimestamp);\n DEBUG_BUILD &&\n debug.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n }\n\n const childSpanJSON = spanToJSON(childSpan);\n const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n // Add a delta with idle timeout so that we prevent false positives\n const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n if (DEBUG_BUILD) {\n const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n if (!spanStartedBeforeIdleSpanEnd) {\n debug.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n } else if (!spanEndedBeforeFinalTimeout) {\n debug.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n }\n }\n\n if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n removeChildSpanFromSpan(span, childSpan);\n discardedSpans++;\n }\n });\n\n if (discardedSpans > 0) {\n span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n }\n }\n\n _cleanupHooks.push(\n client.on('spanStart', startedSpan => {\n // If we already finished the idle span,\n // or if this is the idle span itself being started,\n // or if the started span has already been closed,\n // we don't care about it for activity\n if (\n _finished ||\n startedSpan === span ||\n !!spanToJSON(startedSpan).timestamp ||\n (startedSpan instanceof SentrySpan && startedSpan.isStandaloneSpan())\n ) {\n return;\n }\n\n const allSpans = getSpanDescendants(span);\n\n // If the span that was just started is a child of the idle span, we should track it\n if (allSpans.includes(startedSpan)) {\n _pushActivity(startedSpan.spanContext().spanId);\n }\n }),\n );\n\n _cleanupHooks.push(\n client.on('spanEnd', endedSpan => {\n if (_finished) {\n return;\n }\n\n _popActivity(endedSpan.spanContext().spanId);\n }),\n );\n\n _cleanupHooks.push(\n client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n if (spanToAllowAutoFinish === span) {\n _autoFinishAllowed = true;\n _restartIdleTimeout();\n\n if (activities.size) {\n _restartChildSpanTimeout();\n }\n }\n }),\n );\n\n // We only start the initial idle timeout if we are not delaying the auto finish\n if (!options.disableAutoFinish) {\n _restartIdleTimeout();\n }\n\n setTimeout(() => {\n if (!_finished) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n span.end();\n }\n }, finalTimeout);\n\n return span;\n}\n\nfunction _startIdleSpan(options: StartSpanOptions): Span {\n const span = startInactiveSpan(options);\n\n _setSpanForScope(getCurrentScope(), span);\n\n DEBUG_BUILD && debug.log('[Tracing] Started span is an idle span');\n\n return span;\n}\n"],"names":["span"],"mappings":"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"}
{"version":3,"file":"idleSpan.js","sources":["../../../src/tracing/idleSpan.ts"],"sourcesContent":["import { getClient, getCurrentScope, getIsolationScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON } from '../semanticAttributes';\nimport type { Span } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { debug } from '../utils/debug-logger';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { _setSpanForScope } from '../utils/spanOnScope';\nimport {\n getActiveSpan,\n getSpanDescendants,\n removeChildSpanFromSpan,\n spanTimeInputToSeconds,\n spanToJSON,\n} from '../utils/spanUtils';\nimport { timestampInSeconds } from '../utils/time';\nimport { SentryNonRecordingSpan, spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR, SPAN_STATUS_OK } from './spanstatus';\nimport { startInactiveSpan } from './trace';\nimport { setCapturedScopesOnSpan } from './utils';\n\nexport const TRACING_DEFAULTS = {\n idleTimeout: 1_000,\n finalTimeout: 30_000,\n childSpanTimeout: 15_000,\n};\n\nconst FINISH_REASON_HEARTBEAT_FAILED = 'heartbeatFailed';\nconst FINISH_REASON_IDLE_TIMEOUT = 'idleTimeout';\nconst FINISH_REASON_FINAL_TIMEOUT = 'finalTimeout';\nconst FINISH_REASON_EXTERNAL_FINISH = 'externalFinish';\nconst FINISH_REASON_CANCELLED = 'cancelled';\n\n// unused\nconst FINISH_REASON_DOCUMENT_HIDDEN = 'documentHidden';\n\n// unused in this file, but used in BrowserTracing\nconst FINISH_REASON_INTERRUPTED = 'interactionInterrupted';\n\ntype IdleSpanFinishReason =\n | typeof FINISH_REASON_CANCELLED\n | typeof FINISH_REASON_DOCUMENT_HIDDEN\n | typeof FINISH_REASON_EXTERNAL_FINISH\n | typeof FINISH_REASON_FINAL_TIMEOUT\n | typeof FINISH_REASON_HEARTBEAT_FAILED\n | typeof FINISH_REASON_IDLE_TIMEOUT\n | typeof FINISH_REASON_INTERRUPTED;\n\ninterface IdleSpanOptions {\n /**\n * The time that has to pass without any span being created.\n * If this time is exceeded, the idle span will finish.\n */\n idleTimeout: number;\n /**\n * The max. time an idle span may run.\n * If this time is exceeded, the idle span will finish no matter what.\n */\n finalTimeout: number;\n /**\n * The max. time a child span may run.\n * If the time since the last span was started exceeds this time, the idle span will finish.\n */\n childSpanTimeout?: number;\n /**\n * When set to `true`, will disable the idle timeout and child timeout\n * until the `idleSpanEnableAutoFinish` hook is emitted for the idle span.\n * The final timeout mechanism will not be affected by this option,\n * meaning the idle span will definitely be finished when the final timeout is\n * reached, no matter what this option is configured to.\n *\n * Defaults to `false`.\n */\n disableAutoFinish?: boolean;\n\n /** Allows to configure a hook that is called when the idle span is ended, before it is processed. */\n beforeSpanEnd?: (span: Span) => void;\n\n /**\n * If set to `true`, the idle span will be trimmed to the latest span end timestamp of its children.\n *\n * @default `true`.\n */\n trimIdleSpanEndTimestamp?: boolean;\n}\n\n/**\n * An idle span is a span that automatically finishes. It does this by tracking child spans as activities.\n * An idle span is always the active span.\n */\nexport function startIdleSpan(startSpanOptions: StartSpanOptions, options: Partial<IdleSpanOptions> = {}): Span {\n // Activities store a list of active spans\n const activities = new Map<string, boolean>();\n\n // We should not use heartbeat if we finished a span\n let _finished = false;\n\n // Timer that tracks idleTimeout\n let _idleTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // Timer that tracks maxSpanTime for child spans\n let _childSpanTimeoutID: ReturnType<typeof setTimeout> | undefined;\n\n // The reason why the span was finished\n let _finishReason: IdleSpanFinishReason = FINISH_REASON_EXTERNAL_FINISH;\n\n let _autoFinishAllowed: boolean = !options.disableAutoFinish;\n\n const _cleanupHooks: (() => void)[] = [];\n\n const {\n idleTimeout = TRACING_DEFAULTS.idleTimeout,\n finalTimeout = TRACING_DEFAULTS.finalTimeout,\n childSpanTimeout = TRACING_DEFAULTS.childSpanTimeout,\n beforeSpanEnd,\n trimIdleSpanEndTimestamp = true,\n } = options;\n\n const client = getClient();\n const scope = getCurrentScope();\n\n if (!client || !hasSpansEnabled()) {\n // The placeholder is a thin marker; it carries no sampling decision or DSC. Both are read from\n // the scope: the sampling decision in `getTraceData`, the DSC in `getDynamicSamplingContextFromSpan`.\n const span = new SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });\n\n // Capture scopes so consumers (e.g. SentryTraceProvider) can read them and so the DSC can be\n // resolved from the scope by `getDynamicSamplingContextFromSpan`.\n setCapturedScopesOnSpan(span, scope, getIsolationScope());\n\n return span;\n }\n\n const previousActiveSpan = getActiveSpan();\n const span = _startIdleSpan(startSpanOptions);\n\n // We patch span.end to ensure we can run some things before the span is ended\n // eslint-disable-next-line @typescript-eslint/unbound-method\n span.end = new Proxy(span.end, {\n apply(target, thisArg, args: Parameters<Span['end']>) {\n if (beforeSpanEnd) {\n beforeSpanEnd(span);\n }\n\n // If the span is non-recording, nothing more to do here...\n // This is the case if tracing is enabled but this specific span was not sampled\n if (spanIsNonRecordingSpan(thisArg)) {\n return;\n }\n\n // Just ensuring that this keeps working, even if we ever have more arguments here\n const [definedEndTimestamp, ...rest] = args;\n const timestamp = definedEndTimestamp || timestampInSeconds();\n const spanEndTimestamp = spanTimeInputToSeconds(timestamp);\n\n // Ensure we end with the last span timestamp, if possible\n const spans = getSpanDescendants(span).filter(child => child !== span);\n\n const spanJson = spanToJSON(span);\n\n // If we have no spans, we just end, nothing else to do here\n // Likewise, if users explicitly ended the span, we simply end the span without timestamp adjustment\n if (!spans.length || !trimIdleSpanEndTimestamp) {\n onIdleSpanEnded(spanEndTimestamp);\n return Reflect.apply(target, thisArg, [spanEndTimestamp, ...rest]);\n }\n\n const ignoreSpans = client.getOptions().ignoreSpans;\n\n const latestSpanEndTimestamp = spans?.reduce((acc: number | undefined, current) => {\n const currentSpanJson = spanToJSON(current);\n if (!currentSpanJson.timestamp) {\n return acc;\n }\n // Ignored spans will get dropped later (in the client) but since we already adjust\n // the idle span end timestamp here, we can already take to-be-ignored spans out of\n // the calculation here.\n if (\n ignoreSpans &&\n shouldIgnoreSpan(\n { description: currentSpanJson.description, op: currentSpanJson.op, attributes: currentSpanJson.data },\n ignoreSpans,\n )\n ) {\n return acc;\n }\n return acc ? Math.max(acc, currentSpanJson.timestamp) : currentSpanJson.timestamp;\n }, undefined);\n\n // In reality this should always exist here, but type-wise it may be undefined...\n const spanStartTimestamp = spanJson.start_timestamp;\n\n // The final endTimestamp should:\n // * Never be before the span start timestamp\n // * Be the latestSpanEndTimestamp, if there is one, and it is smaller than the passed span end timestamp\n // * Otherwise be the passed end timestamp\n // Final timestamp can never be after finalTimeout\n const endTimestamp = Math.min(\n spanStartTimestamp ? spanStartTimestamp + finalTimeout / 1000 : Infinity,\n Math.max(spanStartTimestamp || -Infinity, Math.min(spanEndTimestamp, latestSpanEndTimestamp || Infinity)),\n );\n\n onIdleSpanEnded(endTimestamp);\n return Reflect.apply(target, thisArg, [endTimestamp, ...rest]);\n },\n });\n\n /**\n * Cancels the existing idle timeout, if there is one.\n */\n function _cancelIdleTimeout(): void {\n if (_idleTimeoutID) {\n clearTimeout(_idleTimeoutID);\n _idleTimeoutID = undefined;\n }\n }\n\n /**\n * Cancels the existing child span timeout, if there is one.\n */\n function _cancelChildSpanTimeout(): void {\n if (_childSpanTimeoutID) {\n clearTimeout(_childSpanTimeoutID);\n _childSpanTimeoutID = undefined;\n }\n }\n\n /**\n * Restarts idle timeout, if there is no running idle timeout it will start one.\n */\n function _restartIdleTimeout(endTimestamp?: number): void {\n _cancelIdleTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && activities.size === 0 && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_IDLE_TIMEOUT;\n span.end(endTimestamp);\n }\n }, idleTimeout);\n }\n\n /**\n * Restarts child span timeout, if there is none running it will start one.\n */\n function _restartChildSpanTimeout(endTimestamp?: number): void {\n _cancelChildSpanTimeout();\n _idleTimeoutID = setTimeout(() => {\n if (!_finished && _autoFinishAllowed) {\n _finishReason = FINISH_REASON_HEARTBEAT_FAILED;\n span.end(endTimestamp);\n }\n }, childSpanTimeout);\n }\n\n /**\n * Start tracking a specific activity.\n * @param spanId The span id that represents the activity\n */\n function _pushActivity(spanId: string): void {\n _cancelIdleTimeout();\n activities.set(spanId, true);\n\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartChildSpanTimeout(endTimestamp + childSpanTimeout / 1000);\n }\n\n /**\n * Remove an activity from usage\n * @param spanId The span id that represents the activity\n */\n function _popActivity(spanId: string): void {\n if (activities.has(spanId)) {\n activities.delete(spanId);\n }\n\n if (activities.size === 0) {\n const endTimestamp = timestampInSeconds();\n // We need to add the timeout here to have the real endtimestamp of the idle span\n // Remember timestampInSeconds is in seconds, timeout is in ms\n _restartIdleTimeout(endTimestamp + idleTimeout / 1000);\n _cancelChildSpanTimeout();\n }\n }\n\n function onIdleSpanEnded(endTimestamp: number): void {\n _finished = true;\n activities.clear();\n\n _cleanupHooks.forEach(cleanup => cleanup());\n\n _setSpanForScope(scope, previousActiveSpan);\n\n const spanJSON = spanToJSON(span);\n\n const { start_timestamp: startTimestamp } = spanJSON;\n // This should never happen, but to make TS happy...\n if (!startTimestamp) {\n return;\n }\n\n const attributes = spanJSON.data;\n if (!attributes[SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON]) {\n span.setAttribute(SEMANTIC_ATTRIBUTE_SENTRY_IDLE_SPAN_FINISH_REASON, _finishReason);\n }\n\n // Set span status to 'ok' if it hasn't been explicitly set to an error status\n const currentStatus = spanJSON.status;\n if (!currentStatus || currentStatus === 'unknown') {\n span.setStatus({ code: SPAN_STATUS_OK });\n }\n\n debug.log(`[Tracing] Idle span \"${spanJSON.op}\" finished`);\n\n const childSpans = getSpanDescendants(span).filter(child => child !== span);\n\n let discardedSpans = 0;\n childSpans.forEach(childSpan => {\n // We cancel all pending spans with status \"cancelled\" to indicate the idle span was finished early\n if (childSpan.isRecording()) {\n childSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'cancelled' });\n childSpan.end(endTimestamp);\n DEBUG_BUILD &&\n debug.log('[Tracing] Cancelling span since span ended early', JSON.stringify(childSpan, undefined, 2));\n }\n\n const childSpanJSON = spanToJSON(childSpan);\n const { timestamp: childEndTimestamp = 0, start_timestamp: childStartTimestamp = 0 } = childSpanJSON;\n\n const spanStartedBeforeIdleSpanEnd = childStartTimestamp <= endTimestamp;\n\n // Add a delta with idle timeout so that we prevent false positives\n const timeoutWithMarginOfError = (finalTimeout + idleTimeout) / 1000;\n const spanEndedBeforeFinalTimeout = childEndTimestamp - childStartTimestamp <= timeoutWithMarginOfError;\n\n if (DEBUG_BUILD) {\n const stringifiedSpan = JSON.stringify(childSpan, undefined, 2);\n if (!spanStartedBeforeIdleSpanEnd) {\n debug.log('[Tracing] Discarding span since it happened after idle span was finished', stringifiedSpan);\n } else if (!spanEndedBeforeFinalTimeout) {\n debug.log('[Tracing] Discarding span since it finished after idle span final timeout', stringifiedSpan);\n }\n }\n\n if (!spanEndedBeforeFinalTimeout || !spanStartedBeforeIdleSpanEnd) {\n removeChildSpanFromSpan(span, childSpan);\n discardedSpans++;\n }\n });\n\n if (discardedSpans > 0) {\n span.setAttribute('sentry.idle_span_discarded_spans', discardedSpans);\n }\n }\n\n _cleanupHooks.push(\n client.on('spanStart', startedSpan => {\n // If we already finished the idle span,\n // or if this is the idle span itself being started,\n // or if the started span has already been closed,\n // we don't care about it for activity\n if (\n _finished ||\n startedSpan === span ||\n !!spanToJSON(startedSpan).timestamp ||\n (startedSpan instanceof SentrySpan && startedSpan.isStandaloneSpan())\n ) {\n return;\n }\n\n const allSpans = getSpanDescendants(span);\n\n // If the span that was just started is a child of the idle span, we should track it\n if (allSpans.includes(startedSpan)) {\n _pushActivity(startedSpan.spanContext().spanId);\n }\n }),\n );\n\n _cleanupHooks.push(\n client.on('spanEnd', endedSpan => {\n if (_finished) {\n return;\n }\n\n _popActivity(endedSpan.spanContext().spanId);\n }),\n );\n\n _cleanupHooks.push(\n client.on('idleSpanEnableAutoFinish', spanToAllowAutoFinish => {\n if (spanToAllowAutoFinish === span) {\n _autoFinishAllowed = true;\n _restartIdleTimeout();\n\n if (activities.size) {\n _restartChildSpanTimeout();\n }\n }\n }),\n );\n\n // We only start the initial idle timeout if we are not delaying the auto finish\n if (!options.disableAutoFinish) {\n _restartIdleTimeout();\n }\n\n setTimeout(() => {\n if (!_finished) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'deadline_exceeded' });\n _finishReason = FINISH_REASON_FINAL_TIMEOUT;\n span.end();\n }\n }, finalTimeout);\n\n return span;\n}\n\nfunction _startIdleSpan(options: StartSpanOptions): Span {\n const span = startInactiveSpan(options);\n\n _setSpanForScope(getCurrentScope(), span);\n\n DEBUG_BUILD && debug.log('[Tracing] Started span is an idle span');\n\n return span;\n}\n"],"names":["span"],"mappings":"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"}

@@ -0,4 +1,6 @@

import { addNonEnumerableProperty } from '../utils/object.js';
import { generateTraceId, generateSpanId } from '../utils/propagationContext.js';
import { TRACE_FLAG_NONE } from '../utils/spanUtils.js';
const NON_RECORDING_SPAN_FIELD = /* @__PURE__ */ Symbol.for("sentry.nonRecordingSpan");
class SentryNonRecordingSpan {

@@ -9,2 +11,3 @@ constructor(spanContext = {}) {

this.dropReason = spanContext.dropReason;
addNonEnumerableProperty(this, NON_RECORDING_SPAN_FIELD, true);
}

@@ -64,4 +67,7 @@ /** @inheritdoc */

}
function spanIsNonRecordingSpan(span) {
return !!span && span[NON_RECORDING_SPAN_FIELD] === true;
}
export { SentryNonRecordingSpan };
export { SentryNonRecordingSpan, spanIsNonRecordingSpan };
//# sourceMappingURL=sentryNonRecordingSpan.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"sentryNonRecordingSpan.js","sources":["../../../src/tracing/sentryNonRecordingSpan.ts"],"sourcesContent":["import type { EventDropReason } from '../types/clientreport';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanTimeInput,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\ninterface SentryNonRecordingSpanArguments extends SentrySpanArguments {\n dropReason?: EventDropReason;\n}\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n private _traceId: string;\n private _spanId: string;\n\n /**\n * Reason why this span was dropped, if applicable ('ignored' or 'sample_rate').\n * Used to propagate the correct client report outcome to descendant spans\n * when span streaming is enabled.\n */\n public dropReason?: EventDropReason;\n\n public constructor(spanContext: SentryNonRecordingSpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this.dropReason = spanContext.dropReason;\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n return {\n spanId: this._spanId,\n traceId: this._traceId,\n traceFlags: TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public end(_timestamp?: SpanTimeInput): void {}\n\n /** @inheritdoc */\n public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(_values: SpanAttributes): this {\n return this;\n }\n\n /** @inheritdoc */\n public setStatus(_status: SpanStatus): this {\n return this;\n }\n\n /** @inheritdoc */\n public updateName(_name: string): this {\n return this;\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return false;\n }\n\n /** @inheritdoc */\n public addEvent(\n _name: string,\n _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n _startTime?: SpanTimeInput,\n ): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLink(_link: unknown): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(_links: unknown[]): this {\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: number | undefined): void {\n // noop\n }\n}\n"],"names":[],"mappings":";;;AAoBO,MAAM,sBAAA,CAAuC;AAAA,EAW3C,WAAA,CAAY,WAAA,GAA+C,EAAC,EAAG;AACpE,IAAA,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,OAAA,IAAW,eAAA,EAAgB;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA,CAAY,MAAA,IAAU,cAAA,EAAe;AACpD,IAAA,IAAA,CAAK,aAAa,WAAA,CAAY,UAAA;AAAA,EAChC;AAAA;AAAA,EAGO,WAAA,GAA+B;AACpC,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAGO,IAAI,UAAA,EAAkC;AAAA,EAAC;AAAA;AAAA,EAGvC,YAAA,CAAa,MAAc,MAAA,EAA8C;AAC9E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,cAAc,OAAA,EAA+B;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,UAAU,OAAA,EAA2B;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAW,KAAA,EAAqB;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAA,GAAuB;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAA,CACL,KAAA,EACA,sBAAA,EACA,UAAA,EACM;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAQ,KAAA,EAAsB;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,SAAS,MAAA,EAAyB;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CAAgB,YAAqB,KAAA,EAAkC;AAAA,EAE9E;AACF;;;;"}
{"version":3,"file":"sentryNonRecordingSpan.js","sources":["../../../src/tracing/sentryNonRecordingSpan.ts"],"sourcesContent":["import type { EventDropReason } from '../types/clientreport';\nimport type {\n SentrySpanArguments,\n Span,\n SpanAttributes,\n SpanAttributeValue,\n SpanContextData,\n SpanTimeInput,\n} from '../types/span';\nimport type { SpanStatus } from '../types/spanStatus';\nimport { addNonEnumerableProperty } from '../utils/object';\nimport { generateSpanId, generateTraceId } from '../utils/propagationContext';\nimport { TRACE_FLAG_NONE } from '../utils/spanUtils';\n\ninterface SentryNonRecordingSpanArguments extends SentrySpanArguments {\n dropReason?: EventDropReason;\n}\n\n// Brand used to detect non-recording spans via {@link spanIsNonRecordingSpan} without `instanceof`,\n// which is brittle when `@sentry/core` is duplicated across packages. We use `Symbol.for` so the key\n// is shared across copies of the module, and so user payloads (e.g. JSON) cannot spoof the marker.\nconst NON_RECORDING_SPAN_FIELD = Symbol.for('sentry.nonRecordingSpan');\n\n/**\n * A Sentry Span that is non-recording, meaning it will not be sent to Sentry.\n */\nexport class SentryNonRecordingSpan implements Span {\n private _traceId: string;\n private _spanId: string;\n\n /**\n * Reason why this span was dropped, if applicable ('ignored' or 'sample_rate').\n * Used to propagate the correct client report outcome to descendant spans\n * when span streaming is enabled.\n */\n public dropReason?: EventDropReason;\n\n public constructor(spanContext: SentryNonRecordingSpanArguments = {}) {\n this._traceId = spanContext.traceId || generateTraceId();\n this._spanId = spanContext.spanId || generateSpanId();\n this.dropReason = spanContext.dropReason;\n addNonEnumerableProperty(this, NON_RECORDING_SPAN_FIELD, true);\n }\n\n /** @inheritdoc */\n public spanContext(): SpanContextData {\n return {\n spanId: this._spanId,\n traceId: this._traceId,\n traceFlags: TRACE_FLAG_NONE,\n };\n }\n\n /** @inheritdoc */\n public end(_timestamp?: SpanTimeInput): void {}\n\n /** @inheritdoc */\n public setAttribute(_key: string, _value: SpanAttributeValue | undefined): this {\n return this;\n }\n\n /** @inheritdoc */\n public setAttributes(_values: SpanAttributes): this {\n return this;\n }\n\n /** @inheritdoc */\n public setStatus(_status: SpanStatus): this {\n return this;\n }\n\n /** @inheritdoc */\n public updateName(_name: string): this {\n return this;\n }\n\n /** @inheritdoc */\n public isRecording(): boolean {\n return false;\n }\n\n /** @inheritdoc */\n public addEvent(\n _name: string,\n _attributesOrStartTime?: SpanAttributes | SpanTimeInput,\n _startTime?: SpanTimeInput,\n ): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLink(_link: unknown): this {\n return this;\n }\n\n /** @inheritDoc */\n public addLinks(_links: unknown[]): this {\n return this;\n }\n\n /**\n * This should generally not be used,\n * but we need it for being compliant with the OTEL Span interface.\n *\n * @hidden\n * @internal\n */\n public recordException(_exception: unknown, _time?: SpanTimeInput | undefined): void {\n // noop\n }\n}\n\n/**\n * Whether the given span is a {@link SentryNonRecordingSpan}.\n */\nexport function spanIsNonRecordingSpan(span: Span | undefined): span is SentryNonRecordingSpan {\n return !!span && (span as { [NON_RECORDING_SPAN_FIELD]?: boolean })[NON_RECORDING_SPAN_FIELD] === true;\n}\n"],"names":[],"mappings":";;;;AAqBA,MAAM,wBAAA,mBAA2B,MAAA,CAAO,GAAA,CAAI,yBAAyB,CAAA;AAK9D,MAAM,sBAAA,CAAuC;AAAA,EAW3C,WAAA,CAAY,WAAA,GAA+C,EAAC,EAAG;AACpE,IAAA,IAAA,CAAK,QAAA,GAAW,WAAA,CAAY,OAAA,IAAW,eAAA,EAAgB;AACvD,IAAA,IAAA,CAAK,OAAA,GAAU,WAAA,CAAY,MAAA,IAAU,cAAA,EAAe;AACpD,IAAA,IAAA,CAAK,aAAa,WAAA,CAAY,UAAA;AAC9B,IAAA,wBAAA,CAAyB,IAAA,EAAM,0BAA0B,IAAI,CAAA;AAAA,EAC/D;AAAA;AAAA,EAGO,WAAA,GAA+B;AACpC,IAAA,OAAO;AAAA,MACL,QAAQ,IAAA,CAAK,OAAA;AAAA,MACb,SAAS,IAAA,CAAK,QAAA;AAAA,MACd,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAAA;AAAA,EAGO,IAAI,UAAA,EAAkC;AAAA,EAAC;AAAA;AAAA,EAGvC,YAAA,CAAa,MAAc,MAAA,EAA8C;AAC9E,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,cAAc,OAAA,EAA+B;AAClD,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,UAAU,OAAA,EAA2B;AAC1C,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAW,KAAA,EAAqB;AACrC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,WAAA,GAAuB;AAC5B,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAA,CACL,KAAA,EACA,sBAAA,EACA,UAAA,EACM;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,QAAQ,KAAA,EAAsB;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA,EAGO,SAAS,MAAA,EAAyB;AACvC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASO,eAAA,CAAgB,YAAqB,KAAA,EAAyC;AAAA,EAErF;AACF;AAKO,SAAS,uBAAuB,IAAA,EAAwD;AAC7F,EAAA,OAAO,CAAC,CAAC,IAAA,IAAS,IAAA,CAAkD,wBAAwB,CAAA,KAAM,IAAA;AACpG;;;;"}

@@ -8,2 +8,3 @@ import { SEMANTIC_ATTRIBUTE_SENTRY_SOURCE, SEMANTIC_ATTRIBUTE_USER_USERNAME, SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS, SEMANTIC_ATTRIBUTE_USER_EMAIL, SEMANTIC_ATTRIBUTE_USER_ID, SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION, SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID, SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME, SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT, SEMANTIC_ATTRIBUTE_SENTRY_RELEASE, SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS, SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME } from '../../semanticAttributes.js';

import { scopeContextsToSpanAttributes } from './scopeContextAttributes.js';
import { DEFAULT_ENVIRONMENT } from '../../constants.js';

@@ -64,3 +65,3 @@ function captureSpan(span, client) {

[SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,
[SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,
[SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,
[SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,

@@ -67,0 +68,0 @@ [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,

@@ -1,1 +0,1 @@

{"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from '../../utils/url';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Backfill span data from OTel semantic conventions when not explicitly set.\n // OTel-originated spans don't have sentry.op, description, etc. — the non-streamed path\n // infers these in the SentrySpanExporter, but streamed spans skip the exporter entirely.\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // This must run before all hooks and beforeSendSpan so that user callbacks can see and override inferred values.\n const spanKind = (span as { kind?: number }).kind;\n inferSpanDataFromOtelAttributes(spanJSON, spanKind);\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\n// OTel SpanKind values (numeric to avoid importing from @opentelemetry/api)\nconst SPAN_KIND_SERVER = 1;\nconst SPAN_KIND_CLIENT = 2;\n\n/**\n * Infer and backfill span data from OTel semantic conventions.\n * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`.\n * Streamed spans skip the exporter, so we do the inference here during capture.\n *\n * Backfills: `sentry.op`, `sentry.source`, and `name` (description).\n * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten.\n */\n/** Exported only for tests. */\nexport function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void {\n const attributes = spanJSON.attributes;\n if (!attributes) {\n return;\n }\n\n const httpMethod = attributes['http.request.method'] || attributes['http.method'];\n if (httpMethod) {\n inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod);\n return;\n }\n\n const dbSystem = attributes['db.system.name'] || attributes['db.system'];\n const opIsCache =\n typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'string' &&\n `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith('cache.');\n if (dbSystem && !opIsCache) {\n inferDbSpanData(spanJSON, attributes);\n return;\n }\n\n if (attributes['rpc.service']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'rpc' });\n return;\n }\n\n if (attributes['messaging.system']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'message' });\n return;\n }\n\n const faasTrigger = attributes['faas.trigger'];\n if (faasTrigger) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` });\n }\n}\n\nfunction inferHttpSpanData(\n spanJSON: StreamedSpanJSON,\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n httpMethod: unknown,\n): void {\n // Infer op: http.client, http.server, or just http\n const opParts = ['http'];\n if (spanKind === SPAN_KIND_CLIENT) {\n opParts.push('client');\n } else if (spanKind === SPAN_KIND_SERVER) {\n opParts.push('server');\n }\n if (attributes['sentry.http.prefetch']) {\n opParts.push('prefetch');\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join('.') });\n\n // If the user set a custom span name via updateSpanName(), apply it — OTel instrumentation\n // may have overwritten span.name after the user set it, so we restore from the attribute.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const httpRoute = attributes['http.route'];\n if (typeof httpRoute === 'string') {\n spanJSON.name = `${httpMethod} ${httpRoute}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route' });\n } else {\n // Infer span name from URL attributes, matching the non-streamed exporter's behavior.\n // Only overwrite the name for OTel spans (known spanKind)\n if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) {\n const urlPath = getUrlPath(attributes, spanKind);\n if (urlPath) {\n spanJSON.name = `${httpMethod} ${urlPath}`;\n }\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' });\n }\n}\n\n/**\n * Extract a URL path from span attributes for use in the span name.\n * Mirrors the logic in the non-streamed exporter's `getSanitizedUrl`.\n */\nfunction getUrlPath(\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n): string | undefined {\n const httpUrl = attributes['http.url'] || attributes['url.full'];\n const httpTarget = attributes['http.target'];\n\n const parsedUrl = typeof httpUrl === 'string' ? parseUrl(httpUrl) : undefined;\n const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : undefined;\n\n // For server spans, prefer the relative target path\n if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n // For client spans (and others), use the full sanitized URL\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Fall back to target if no full URL is available\n if (typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n return undefined;\n}\n\nfunction inferDbSpanData(spanJSON: StreamedSpanJSON, attributes: RawAttributes<Record<string, unknown>>): void {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db' });\n\n // If the user set a custom span name via updateSpanName(), apply it.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const statement = attributes['db.statement'];\n if (statement) {\n spanJSON.name = `${statement}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'task' });\n }\n}\n"],"names":[],"mappings":"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"}
{"version":3,"file":"captureSpan.js","sources":["../../../../src/tracing/spans/captureSpan.ts"],"sourcesContent":["import type { RawAttributes } from '../../attributes';\nimport type { Client } from '../../client';\nimport type { ScopeData } from '../../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_RELEASE,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID,\n SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n SEMANTIC_ATTRIBUTE_USER_EMAIL,\n SEMANTIC_ATTRIBUTE_USER_ID,\n SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS,\n SEMANTIC_ATTRIBUTE_USER_USERNAME,\n} from '../../semanticAttributes';\nimport type { SerializedStreamedSpan, Span, StreamedSpanJSON } from '../../types/span';\nimport { getCombinedScopeData } from '../../utils/scopeData';\nimport { getSanitizedUrlString, parseUrl, stripUrlQueryAndFragment } from '../../utils/url';\nimport {\n INTERNAL_getSegmentSpan,\n showSpanDropWarning,\n spanToStreamedSpanJSON,\n streamedSpanJsonToSerializedSpan,\n} from '../../utils/spanUtils';\nimport { getCapturedScopesOnSpan } from '../utils';\nimport { isStreamedBeforeSendSpanCallback } from './beforeSendSpan';\nimport { scopeContextsToSpanAttributes } from './scopeContextAttributes';\nimport { DEFAULT_ENVIRONMENT } from '../../constants';\n\nexport type SerializedStreamedSpanWithSegmentSpan = SerializedStreamedSpan & {\n _segmentSpan: Span;\n};\n\n/**\n * Captures a span and returns a JSON representation to be enqueued for sending.\n *\n * IMPORTANT: This function converts the span to JSON immediately to avoid writing\n * to an already-ended OTel span instance (which is blocked by the OTel Span class).\n *\n * @returns the final serialized span with a reference to its segment span. This reference\n * is needed later on to compute the DSC for the span envelope.\n */\nexport function captureSpan(span: Span, client: Client): SerializedStreamedSpanWithSegmentSpan {\n // Convert to JSON FIRST - we cannot write to an already-ended span\n const spanJSON = spanToStreamedSpanJSON(span);\n\n const segmentSpan = INTERNAL_getSegmentSpan(span);\n const serializedSegmentSpan = spanToStreamedSpanJSON(segmentSpan);\n\n const { isolationScope: spanIsolationScope, scope: spanScope } = getCapturedScopesOnSpan(span);\n\n const finalScopeData = getCombinedScopeData(spanIsolationScope, spanScope);\n\n applyCommonSpanAttributes(spanJSON, serializedSegmentSpan, client, finalScopeData);\n\n // Backfill span data from OTel semantic conventions when not explicitly set.\n // OTel-originated spans don't have sentry.op, description, etc. — the non-streamed path\n // infers these in the SentrySpanExporter, but streamed spans skip the exporter entirely.\n // Access `kind` via duck-typing — OTel span objects have this property but it's not on Sentry's Span type.\n // This must run before all hooks and beforeSendSpan so that user callbacks can see and override inferred values.\n const spanKind = (span as { kind?: number }).kind;\n inferSpanDataFromOtelAttributes(spanJSON, spanKind);\n\n if (spanJSON.is_segment) {\n applyScopeToSegmentSpan(spanJSON, finalScopeData);\n applySdkMetadataToSegmentSpan(spanJSON, client);\n // Allow hook subscribers to mutate the segment span JSON\n // This also invokes the `processSegmentSpan` hook of all integrations\n client.emit('processSegmentSpan', spanJSON);\n }\n\n // This allows hook subscribers to mutate the span JSON\n // This also invokes the `processSpan` hook of all integrations\n client.emit('processSpan', spanJSON);\n\n const { beforeSendSpan } = client.getOptions();\n const processedSpan =\n beforeSendSpan && isStreamedBeforeSendSpanCallback(beforeSendSpan)\n ? applyBeforeSendSpanCallback(spanJSON, beforeSendSpan)\n : spanJSON;\n\n // Backfill sentry.span.source from sentry.source. Only `sentry.span.source` is respected by Sentry.\n // TODO(v11): Remove this backfill once we renamed SEMANTIC_ATTRIBUTE_SENTRY_SOURCE to sentry.span.source\n const spanNameSource = processedSpan.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE];\n if (spanNameSource) {\n safeSetSpanJSONAttributes(processedSpan, {\n // Purposefully not using a constant defined here like in other attributes:\n // This will be the name for SEMANTIC_ATTRIBUTE_SENTRY_SOURCE in v11\n 'sentry.span.source': spanNameSource,\n });\n }\n\n return {\n ...streamedSpanJsonToSerializedSpan(processedSpan),\n _segmentSpan: segmentSpan,\n };\n}\n\nfunction applyScopeToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, scopeData: ScopeData): void {\n const contextAttributes = scopeContextsToSpanAttributes(scopeData.contexts);\n safeSetSpanJSONAttributes(segmentSpanJSON, contextAttributes);\n}\n\n/**\n * Safely set attributes on a span JSON.\n * If an attribute already exists, it will not be overwritten.\n */\nexport function safeSetSpanJSONAttributes(\n spanJSON: StreamedSpanJSON,\n newAttributes: RawAttributes<Record<string, unknown>>,\n): void {\n const originalAttributes = spanJSON.attributes ?? (spanJSON.attributes = {});\n\n Object.entries(newAttributes).forEach(([key, value]) => {\n if (value != null && !(key in originalAttributes)) {\n originalAttributes[key] = value;\n }\n });\n}\n\nfunction applySdkMetadataToSegmentSpan(segmentSpanJSON: StreamedSpanJSON, client: Client): void {\n const integrationNames = client.getIntegrationNames();\n if (!integrationNames.length) return;\n\n safeSetSpanJSONAttributes(segmentSpanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_INTEGRATIONS]: integrationNames,\n });\n}\n\nfunction applyCommonSpanAttributes(\n spanJSON: StreamedSpanJSON,\n serializedSegmentSpan: StreamedSpanJSON,\n client: Client,\n scopeData: ScopeData,\n): void {\n const sdk = client.getSdkMetadata();\n const { release, environment } = client.getOptions();\n\n // avoid overwriting any previously set attributes (from users or potentially our SDK instrumentation)\n safeSetSpanJSONAttributes(spanJSON, {\n [SEMANTIC_ATTRIBUTE_SENTRY_RELEASE]: release,\n [SEMANTIC_ATTRIBUTE_SENTRY_ENVIRONMENT]: environment || DEFAULT_ENVIRONMENT,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_NAME]: serializedSegmentSpan.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SEGMENT_ID]: serializedSegmentSpan.span_id,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_NAME]: sdk?.sdk?.name,\n [SEMANTIC_ATTRIBUTE_SENTRY_SDK_VERSION]: sdk?.sdk?.version,\n [SEMANTIC_ATTRIBUTE_USER_ID]: scopeData.user?.id,\n [SEMANTIC_ATTRIBUTE_USER_EMAIL]: scopeData.user?.email,\n [SEMANTIC_ATTRIBUTE_USER_IP_ADDRESS]: scopeData.user?.ip_address,\n [SEMANTIC_ATTRIBUTE_USER_USERNAME]: scopeData.user?.username,\n ...scopeData.attributes,\n });\n}\n\n/**\n * Apply a user-provided beforeSendSpan callback to a span JSON.\n */\nexport function applyBeforeSendSpanCallback(\n span: StreamedSpanJSON,\n beforeSendSpan: (span: StreamedSpanJSON) => StreamedSpanJSON,\n): StreamedSpanJSON {\n const modifedSpan = beforeSendSpan(span);\n if (!modifedSpan) {\n showSpanDropWarning();\n return span;\n }\n return modifedSpan;\n}\n\n// OTel SpanKind values (numeric to avoid importing from @opentelemetry/api)\nconst SPAN_KIND_SERVER = 1;\nconst SPAN_KIND_CLIENT = 2;\n\n/**\n * Infer and backfill span data from OTel semantic conventions.\n * This mirrors what the `SentrySpanExporter` does for non-streamed spans via `getSpanData`/`inferSpanData`.\n * Streamed spans skip the exporter, so we do the inference here during capture.\n *\n * Backfills: `sentry.op`, `sentry.source`, and `name` (description).\n * Uses `safeSetSpanJSONAttributes` so explicitly set attributes are never overwritten.\n */\n/** Exported only for tests. */\nexport function inferSpanDataFromOtelAttributes(spanJSON: StreamedSpanJSON, spanKind?: number): void {\n const attributes = spanJSON.attributes;\n if (!attributes) {\n return;\n }\n\n const httpMethod = attributes['http.request.method'] || attributes['http.method'];\n if (httpMethod) {\n inferHttpSpanData(spanJSON, attributes, spanKind, httpMethod);\n return;\n }\n\n const dbSystem = attributes['db.system.name'] || attributes['db.system'];\n const opIsCache =\n typeof attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP] === 'string' &&\n `${attributes[SEMANTIC_ATTRIBUTE_SENTRY_OP]}`.startsWith('cache.');\n if (dbSystem && !opIsCache) {\n inferDbSpanData(spanJSON, attributes);\n return;\n }\n\n if (attributes['rpc.service']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'rpc' });\n return;\n }\n\n if (attributes['messaging.system']) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'message' });\n return;\n }\n\n const faasTrigger = attributes['faas.trigger'];\n if (faasTrigger) {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: `${faasTrigger}` });\n }\n}\n\nfunction inferHttpSpanData(\n spanJSON: StreamedSpanJSON,\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n httpMethod: unknown,\n): void {\n // Infer op: http.client, http.server, or just http\n const opParts = ['http'];\n if (spanKind === SPAN_KIND_CLIENT) {\n opParts.push('client');\n } else if (spanKind === SPAN_KIND_SERVER) {\n opParts.push('server');\n }\n if (attributes['sentry.http.prefetch']) {\n opParts.push('prefetch');\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: opParts.join('.') });\n\n // If the user set a custom span name via updateSpanName(), apply it — OTel instrumentation\n // may have overwritten span.name after the user set it, so we restore from the attribute.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const httpRoute = attributes['http.route'];\n if (typeof httpRoute === 'string') {\n spanJSON.name = `${httpMethod} ${httpRoute}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'route' });\n } else {\n // Infer span name from URL attributes, matching the non-streamed exporter's behavior.\n // Only overwrite the name for OTel spans (known spanKind)\n if (spanKind === SPAN_KIND_CLIENT || spanKind === SPAN_KIND_SERVER) {\n const urlPath = getUrlPath(attributes, spanKind);\n if (urlPath) {\n spanJSON.name = `${httpMethod} ${urlPath}`;\n }\n }\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url' });\n }\n}\n\n/**\n * Extract a URL path from span attributes for use in the span name.\n * Mirrors the logic in the non-streamed exporter's `getSanitizedUrl`.\n */\nfunction getUrlPath(\n attributes: RawAttributes<Record<string, unknown>>,\n spanKind: number | undefined,\n): string | undefined {\n const httpUrl = attributes['http.url'] || attributes['url.full'];\n const httpTarget = attributes['http.target'];\n\n const parsedUrl = typeof httpUrl === 'string' ? parseUrl(httpUrl) : undefined;\n const sanitizedUrl = parsedUrl ? getSanitizedUrlString(parsedUrl) : undefined;\n\n // For server spans, prefer the relative target path\n if (spanKind === SPAN_KIND_SERVER && typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n // For client spans (and others), use the full sanitized URL\n if (sanitizedUrl) {\n return sanitizedUrl;\n }\n\n // Fall back to target if no full URL is available\n if (typeof httpTarget === 'string') {\n return stripUrlQueryAndFragment(httpTarget);\n }\n\n return undefined;\n}\n\nfunction inferDbSpanData(spanJSON: StreamedSpanJSON, attributes: RawAttributes<Record<string, unknown>>): void {\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'db' });\n\n // If the user set a custom span name via updateSpanName(), apply it.\n const customName = attributes[SEMANTIC_ATTRIBUTE_SENTRY_CUSTOM_SPAN_NAME];\n if (typeof customName === 'string') {\n spanJSON.name = customName;\n return;\n }\n\n if (attributes[SEMANTIC_ATTRIBUTE_SENTRY_SOURCE] === 'custom') {\n return;\n }\n\n const statement = attributes['db.statement'];\n if (statement) {\n spanJSON.name = `${statement}`;\n safeSetSpanJSONAttributes(spanJSON, { [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'task' });\n }\n}\n"],"names":[],"mappings":"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"}

@@ -21,3 +21,3 @@ import { getAsyncContextStrategy } from '../asyncContext/index.js';

import { sampleSpan } from './sampling.js';
import { SentryNonRecordingSpan } from './sentryNonRecordingSpan.js';
import { SentryNonRecordingSpan, spanIsNonRecordingSpan } from './sentryNonRecordingSpan.js';
import { SentrySpan } from './sentrySpan.js';

@@ -43,3 +43,3 @@ import { SPAN_STATUS_ERROR } from './spanstatus.js';

const missingRequiredParent = options.onlyIfParent && !parentSpan;
const activeSpan = missingRequiredParent ? new SentryNonRecordingSpan() : createChildOrRootSpan({
const activeSpan = missingRequiredParent ? startMissingRequiredParentSpan(scope, client) : createChildOrRootSpan({
parentSpan,

@@ -50,5 +50,2 @@ spanArguments,

});
if (missingRequiredParent) {
client?.recordDroppedEvent("no_parent_span", "span");
}
if (!_isIgnoredSpan(activeSpan) || !parentSpan) {

@@ -86,3 +83,3 @@ _setSpanForScope(scope, activeSpan);

const missingRequiredParent = options.onlyIfParent && !parentSpan;
const activeSpan = missingRequiredParent ? new SentryNonRecordingSpan() : createChildOrRootSpan({
const activeSpan = missingRequiredParent ? startMissingRequiredParentSpan(scope, getClient()) : createChildOrRootSpan({
parentSpan,

@@ -93,5 +90,2 @@ spanArguments,

});
if (missingRequiredParent) {
getClient()?.recordDroppedEvent("no_parent_span", "span");
}
if (!_isIgnoredSpan(activeSpan) || !parentSpan) {

@@ -130,4 +124,3 @@ _setSpanForScope(scope, activeSpan);

if (missingRequiredParent) {
client?.recordDroppedEvent("no_parent_span", "span");
return new SentryNonRecordingSpan();
return startMissingRequiredParentSpan(scope, client);
}

@@ -197,2 +190,8 @@ return createChildOrRootSpan({

}
function startMissingRequiredParentSpan(scope, client) {
client?.recordDroppedEvent("no_parent_span", "span");
const span = new SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });
setCapturedScopesOnSpan(span, scope, getIsolationScope());
return span;
}
function createChildOrRootSpan({

@@ -204,13 +203,11 @@ parentSpan,

}) {
const isolationScope = getIsolationScope();
if (!hasSpansEnabled()) {
const span2 = new SentryNonRecordingSpan();
if (forceTransaction || !parentSpan) {
const dsc = {
sampled: "false",
sample_rate: "0",
transaction: spanArguments.name,
...getDynamicSamplingContextFromSpan(span2)
};
freezeDscOnSpan(span2, dsc);
const scopePropagationContext = { ...isolationScope.getPropagationContext(), ...scope.getPropagationContext() };
const traceId = parentSpan ? parentSpan.spanContext().traceId : scopePropagationContext.traceId;
const span2 = new SentryNonRecordingSpan({ traceId });
if (parentSpan && !forceTransaction) {
addChildSpanToSpan(parentSpan, span2);
}
setCapturedScopesOnSpan(span2, scope, isolationScope);
return span2;

@@ -223,11 +220,12 @@ }

}
return new SentryNonRecordingSpan({
const ignoredSpan = new SentryNonRecordingSpan({
dropReason: "ignored",
traceId: parentSpan?.spanContext().traceId ?? scope.getPropagationContext().traceId
});
setCapturedScopesOnSpan(ignoredSpan, scope, isolationScope);
return ignoredSpan;
}
const isolationScope = getIsolationScope();
let span;
if (parentSpan && !forceTransaction) {
span = _startChildSpan(parentSpan, scope, spanArguments);
span = _startChildSpan(parentSpan, scope, spanArguments, isolationScope);
addChildSpanToSpan(parentSpan, span);

@@ -245,2 +243,3 @@ } else if (parentSpan) {

scope,
isolationScope,
parentSampled

@@ -266,2 +265,3 @@ );

scope,
isolationScope,
parentSampled

@@ -274,3 +274,2 @@ );

logSpanStart(span);
setCapturedScopesOnSpan(span, scope, isolationScope);
return span;

@@ -296,3 +295,3 @@ }

}
function _startRootSpan(spanArguments, scope, parentSampled) {
function _startRootSpan(spanArguments, scope, isolationScope, parentSampled) {
const client = getClient();

@@ -330,2 +329,3 @@ const options = client?.getOptions() || {};

}
setCapturedScopesOnSpan(rootSpan, scope, isolationScope);
if (client) {

@@ -336,3 +336,3 @@ client.emit("spanStart", rootSpan);

}
function _startChildSpan(parentSpan, scope, spanArguments) {
function _startChildSpan(parentSpan, scope, spanArguments, isolationScope) {
const { spanId, traceId } = parentSpan.spanContext();

@@ -348,2 +348,3 @@ const isTracingSuppressed = _isTracingSuppressed(scope);

addChildSpanToSpan(parentSpan, childSpan);
setCapturedScopesOnSpan(childSpan, scope, isolationScope);
const client = getClient();

@@ -353,4 +354,4 @@ if (!client) {

}
if (hasSpanStreamingEnabled(client) && childSpan instanceof SentryNonRecordingSpan) {
if (parentSpan instanceof SentryNonRecordingSpan && parentSpan.dropReason) {
if (hasSpanStreamingEnabled(client) && spanIsNonRecordingSpan(childSpan)) {
if (spanIsNonRecordingSpan(parentSpan) && parentSpan.dropReason) {
childSpan.dropReason = parentSpan.dropReason;

@@ -408,3 +409,3 @@ client.recordDroppedEvent(parentSpan.dropReason, "span");

function _isIgnoredSpan(span) {
return span instanceof SentryNonRecordingSpan && span.dropReason === "ignored";
return spanIsNonRecordingSpan(span) && span.dropReason === "ignored";
}

@@ -411,0 +412,0 @@ function _isTracingSuppressed(scope) {

@@ -1,1 +0,1 @@

{"version":3,"file":"trace.js","sources":["../../../src/tracing/trace.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { DynamicSamplingContext } from '../types/envelope';\nimport type { ClientOptions } from '../types/options';\nimport type { SentrySpanArguments, Span, SpanTimeInput } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { baggageHeaderToDynamicSamplingContext } from '../utils/baggage';\nimport { debug } from '../utils/debug-logger';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { generateTraceId } from '../utils/propagationContext';\nimport { safeMathRandom } from '../utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { propagationContextFromHeaders, shouldContinueTrace } from '../utils/tracing';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\nimport type { Client } from '../client';\n\nexport const SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n if (missingRequiredParent) {\n client?.recordDroppedEvent('no_parent_span', 'span');\n }\n\n // Ignored root spans still need to be set on scope so that `getActiveSpan()` returns them\n // and descendants are also non-recording. Ignored child spans don't need this because\n // the parent span is already on scope.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? new SentryNonRecordingSpan()\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n if (missingRequiredParent) {\n getClient()?.recordDroppedEvent('no_parent_span', 'span');\n }\n\n // We don't set ignored child spans onto the scope because there likely is an active,\n // unignored span on the scope already.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n\n if (missingRequiredParent) {\n client?.recordDroppedEvent('no_parent_span', 'span');\n return new SentryNonRecordingSpan();\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n const client = getClient();\n const incomingDsc = baggageHeaderToDynamicSamplingContext(baggage);\n if (client && !shouldContinueTrace(client, incomingDsc?.org_id)) {\n return startNewTrace(callback);\n }\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n _setSpanForScope(scope, undefined);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n // Note: We do not wait for the callback to finish before we reset the metadata\n // the reason for this is that otherwise, in the browser this can lead to very weird behavior\n // as there is only a single top scope, if the callback takes longer to finish,\n // other, unrelated spans may also be suppressed, which we do not want\n // so instead, we only suppress tracing synchronoysly in the browser\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n const res = callback();\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: undefined });\n return res;\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n const acs = getAcs();\n if (acs.startNewTrace) {\n return acs.startNewTrace(callback);\n }\n\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom(),\n });\n DEBUG_BUILD && debug.log(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n if (!hasSpansEnabled()) {\n const span = new SentryNonRecordingSpan();\n\n // If this is a root span, we ensure to freeze a DSC\n // So we can have at least partial data here\n if (forceTransaction || !parentSpan) {\n const dsc = {\n sampled: 'false',\n sample_rate: '0',\n transaction: spanArguments.name,\n ...getDynamicSamplingContextFromSpan(span),\n } satisfies Partial<DynamicSamplingContext>;\n freezeDscOnSpan(span, dsc);\n }\n\n return span;\n }\n\n const client = getClient();\n if (_shouldIgnoreStreamedSpan(client, spanArguments)) {\n if (!_isTracingSuppressed(scope)) {\n // if tracing is actively suppressed (Sentry.suppressTracing(...)),\n // we don't want to record a client outcome for the ignored span\n client?.recordDroppedEvent('ignored', 'span');\n }\n\n return new SentryNonRecordingSpan({\n dropReason: 'ignored',\n traceId: parentSpan?.spanContext().traceId ?? scope.getPropagationContext().traceId,\n });\n }\n\n const isolationScope = getIsolationScope();\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(spanArguments: SentrySpanArguments, scope: Scope, parentSampled?: boolean): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '' } = spanArguments;\n\n const mutableSpanSamplingData = { spanAttributes: { ...spanArguments.attributes }, spanName: name, parentSampled };\n\n // we don't care about the decision for the moment; this is just a placeholder\n client?.emit('beforeSampling', mutableSpanSamplingData, { decision: false });\n\n // If hook consumers override the parentSampled flag, we will use that value instead of the actual one\n const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;\n const finalAttributes = mutableSpanSamplingData.spanAttributes;\n\n const currentPropagationContext = scope.getPropagationContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n\n const [sampled, sampleRate, localSampleRateWasApplied] = isTracingSuppressed\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled: finalParentSampled,\n attributes: finalAttributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...finalAttributes,\n },\n sampled,\n });\n\n if (!sampled && client && !isTracingSuppressed) {\n DEBUG_BUILD && debug.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', hasSpanStreamingEnabled(client) ? 'span' : 'transaction');\n }\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(parentSpan: Span, scope: Scope, spanArguments: SentrySpanArguments): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n const sampled = isTracingSuppressed ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n const client = getClient();\n\n if (!client) {\n return childSpan;\n }\n\n if (hasSpanStreamingEnabled(client) && childSpan instanceof SentryNonRecordingSpan) {\n if (parentSpan instanceof SentryNonRecordingSpan && parentSpan.dropReason) {\n // We land here if the parent span was a segment span that was ignored (`ignoreSpans`).\n // In this case, the child was also ignored (see `sampled` above) but we need to\n // record a client outcome for the child.\n childSpan.dropReason = parentSpan.dropReason;\n client.recordDroppedEvent(parentSpan.dropReason, 'span');\n } else if (!isTracingSuppressed) {\n // Otherwise, the child is not sampled due to sampling of the parent span,\n // hence we record a sample_rate client outcome for the child.\n childSpan.dropReason = 'sample_rate';\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n client.emit('afterSpanEnd', childSpan);\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope, customParentSpan: Span | null | undefined): SentrySpan | undefined {\n // always use the passed in span directly\n if (customParentSpan) {\n return customParentSpan as SentrySpan;\n }\n\n // This is different from `undefined` as it means the user explicitly wants no parent span\n if (customParentSpan === null) {\n return undefined;\n }\n\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n\n/* Checks if `ignoreSpans` applies (extracted for bundle size)*/\nfunction _shouldIgnoreStreamedSpan(client: Client | undefined, spanArguments: SentrySpanArguments): boolean {\n const ignoreSpans = client?.getOptions().ignoreSpans;\n\n if (!client || !hasSpanStreamingEnabled(client) || !ignoreSpans?.length) {\n return false;\n }\n\n return shouldIgnoreSpan(\n {\n description: spanArguments.name || '',\n op: spanArguments.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] || spanArguments.op,\n attributes: spanArguments.attributes,\n },\n ignoreSpans,\n );\n}\n\nfunction _isIgnoredSpan(span: Span): span is SentryNonRecordingSpan {\n return span instanceof SentryNonRecordingSpan && span.dropReason === 'ignored';\n}\n\nfunction _isTracingSuppressed(scope: Scope): boolean {\n return scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] === true;\n}\n"],"names":["span"],"mappings":"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"}
{"version":3,"file":"trace.js","sources":["../../../src/tracing/trace.ts"],"sourcesContent":["/* eslint-disable max-lines */\n\nimport { getAsyncContextStrategy } from '../asyncContext';\nimport type { AsyncContextStrategy } from '../asyncContext/types';\nimport { getMainCarrier } from '../carrier';\nimport { getClient, getCurrentScope, getIsolationScope, withScope } from '../currentScopes';\nimport { DEBUG_BUILD } from '../debug-build';\nimport type { Scope } from '../scope';\nimport {\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '../semanticAttributes';\nimport type { ClientOptions } from '../types/options';\nimport type { SentrySpanArguments, Span, SpanTimeInput } from '../types/span';\nimport type { StartSpanOptions } from '../types/startSpanOptions';\nimport { baggageHeaderToDynamicSamplingContext } from '../utils/baggage';\nimport { debug } from '../utils/debug-logger';\nimport { handleCallbackErrors } from '../utils/handleCallbackErrors';\nimport { hasSpansEnabled } from '../utils/hasSpansEnabled';\nimport { shouldIgnoreSpan } from '../utils/should-ignore-span';\nimport { hasSpanStreamingEnabled } from './spans/hasSpanStreamingEnabled';\nimport { parseSampleRate } from '../utils/parseSampleRate';\nimport { generateTraceId } from '../utils/propagationContext';\nimport { safeMathRandom } from '../utils/randomSafeContext';\nimport { _getSpanForScope, _setSpanForScope } from '../utils/spanOnScope';\nimport { addChildSpanToSpan, getRootSpan, spanIsSampled, spanTimeInputToSeconds, spanToJSON } from '../utils/spanUtils';\nimport { propagationContextFromHeaders, shouldContinueTrace } from '../utils/tracing';\nimport { freezeDscOnSpan, getDynamicSamplingContextFromSpan } from './dynamicSamplingContext';\nimport { logSpanStart } from './logSpans';\nimport { sampleSpan } from './sampling';\nimport { SentryNonRecordingSpan, spanIsNonRecordingSpan } from './sentryNonRecordingSpan';\nimport { SentrySpan } from './sentrySpan';\nimport { SPAN_STATUS_ERROR } from './spanstatus';\nimport { setCapturedScopesOnSpan } from './utils';\nimport type { Client } from '../client';\n\nexport const SUPPRESS_TRACING_KEY = '__SENTRY_SUPPRESS_TRACING__';\n\n/**\n * Wraps a function with a transaction/span and finishes the span after the function is done.\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * If you want to create a span that is not set as active, use {@link startInactiveSpan}.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpan<T>(options: StartSpanOptions, callback: (span: Span) => T): T {\n const acs = getAcs();\n if (acs.startSpan) {\n return acs.startSpan(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n // We still need to fork a potentially passed scope, as we set the active span on it\n // and we need to ensure that it is cleaned up properly once the span ends.\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? startMissingRequiredParentSpan(scope, client)\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n // Ignored root spans still need to be set on scope so that `getActiveSpan()` returns them\n // and descendants are also non-recording. Ignored child spans don't need this because\n // the parent span is already on scope.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n () => callback(activeSpan),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n () => {\n activeSpan.end();\n },\n );\n });\n });\n}\n\n/**\n * Similar to `Sentry.startSpan`. Wraps a function with a transaction/span, but does not finish the span\n * after the function is done automatically. Use `span.end()` to end the span.\n *\n * The created span is the active span and will be used as parent by other spans created inside the function\n * and can be accessed via `Sentry.getActiveSpan()`, as long as the function is executed while the scope is active.\n *\n * You'll always get a span passed to the callback,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startSpanManual<T>(options: StartSpanOptions, callback: (span: Span, finish: () => void) => T): T {\n const acs = getAcs();\n if (acs.startSpanManual) {\n return acs.startSpanManual(options, callback);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan, scope: customScope } = options;\n\n const customForkedScope = customScope?.clone();\n\n return withScope(customForkedScope, () => {\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = getActiveSpanWrapper<T>(customParentSpan);\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n const activeSpan = missingRequiredParent\n ? startMissingRequiredParentSpan(scope, getClient())\n : createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n\n // We don't set ignored child spans onto the scope because there likely is an active,\n // unignored span on the scope already.\n if (!_isIgnoredSpan(activeSpan) || !parentSpan) {\n _setSpanForScope(scope, activeSpan);\n }\n\n return handleCallbackErrors(\n // We pass the `finish` function to the callback, so the user can finish the span manually\n // this is mainly here for historic purposes because previously, we instructed users to call\n // `finish` instead of `span.end()` to also clean up the scope. Nowadays, calling `span.end()`\n // or `finish` has the same effect and we simply leave it here to avoid breaking user code.\n () => callback(activeSpan, () => activeSpan.end()),\n () => {\n // Only update the span status if it hasn't been changed yet, and the span is not yet finished\n const { status } = spanToJSON(activeSpan);\n if (activeSpan.isRecording() && (!status || status === 'ok')) {\n activeSpan.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n },\n );\n });\n });\n}\n\n/**\n * Creates a span. This span is not set as active, so will not get automatic instrumentation spans\n * as children or be able to be accessed via `Sentry.getActiveSpan()`.\n *\n * If you want to create a span that is set as active, use {@link startSpan}.\n *\n * This function will always return a span,\n * it may just be a non-recording span if the span is not sampled or if tracing is disabled.\n */\nexport function startInactiveSpan(options: StartSpanOptions): Span {\n const acs = getAcs();\n if (acs.startInactiveSpan) {\n return acs.startInactiveSpan(options);\n }\n\n const spanArguments = parseSentrySpanArguments(options);\n const { forceTransaction, parentSpan: customParentSpan } = options;\n\n // If `options.scope` is defined, we use this as as a wrapper,\n // If `options.parentSpan` is defined, we want to wrap the callback in `withActiveSpan`\n const wrapper = options.scope\n ? (callback: () => Span) => withScope(options.scope, callback)\n : customParentSpan !== undefined\n ? (callback: () => Span) => withActiveSpan(customParentSpan, callback)\n : (callback: () => Span) => callback();\n\n return wrapper(() => {\n const scope = getCurrentScope();\n const parentSpan = getParentSpan(scope, customParentSpan);\n const client = getClient();\n\n const missingRequiredParent = options.onlyIfParent && !parentSpan;\n\n if (missingRequiredParent) {\n return startMissingRequiredParentSpan(scope, client);\n }\n\n return createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n });\n });\n}\n\n/**\n * Continue a trace from `sentry-trace` and `baggage` values.\n * These values can be obtained from incoming request headers, or in the browser from `<meta name=\"sentry-trace\">`\n * and `<meta name=\"baggage\">` HTML tags.\n *\n * Spans started with `startSpan`, `startSpanManual` and `startInactiveSpan`, within the callback will automatically\n * be attached to the incoming trace.\n */\nexport const continueTrace = <V>(\n options: {\n sentryTrace: Parameters<typeof propagationContextFromHeaders>[0];\n baggage: Parameters<typeof propagationContextFromHeaders>[1];\n },\n callback: () => V,\n): V => {\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.continueTrace) {\n return acs.continueTrace(options, callback);\n }\n\n const { sentryTrace, baggage } = options;\n\n const client = getClient();\n const incomingDsc = baggageHeaderToDynamicSamplingContext(baggage);\n if (client && !shouldContinueTrace(client, incomingDsc?.org_id)) {\n return startNewTrace(callback);\n }\n\n return withScope(scope => {\n const propagationContext = propagationContextFromHeaders(sentryTrace, baggage);\n scope.setPropagationContext(propagationContext);\n _setSpanForScope(scope, undefined);\n return callback();\n });\n};\n\n/**\n * Forks the current scope and sets the provided span as active span in the context of the provided callback. Can be\n * passed `null` to start an entirely new span tree.\n *\n * @param span Spans started in the context of the provided callback will be children of this span. If `null` is passed,\n * spans started within the callback will not be attached to a parent span.\n * @param callback Execution context in which the provided span will be active. Is passed the newly forked scope.\n * @returns the value returned from the provided callback function.\n */\nexport function withActiveSpan<T>(span: Span | null, callback: (scope: Scope) => T): T {\n const acs = getAcs();\n if (acs.withActiveSpan) {\n return acs.withActiveSpan(span, callback);\n }\n\n return withScope(scope => {\n _setSpanForScope(scope, span || undefined);\n return callback(scope);\n });\n}\n\n/** Suppress tracing in the given callback, ensuring no spans are generated inside of it. */\nexport function suppressTracing<T>(callback: () => T): T {\n const acs = getAcs();\n\n if (acs.suppressTracing) {\n return acs.suppressTracing(callback);\n }\n\n return withScope(scope => {\n // Note: We do not wait for the callback to finish before we reset the metadata\n // the reason for this is that otherwise, in the browser this can lead to very weird behavior\n // as there is only a single top scope, if the callback takes longer to finish,\n // other, unrelated spans may also be suppressed, which we do not want\n // so instead, we only suppress tracing synchronoysly in the browser\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: true });\n const res = callback();\n scope.setSDKProcessingMetadata({ [SUPPRESS_TRACING_KEY]: undefined });\n return res;\n });\n}\n\n/**\n * Starts a new trace for the duration of the provided callback. Spans started within the\n * callback will be part of the new trace instead of a potentially previously started trace.\n *\n * Important: Only use this function if you want to override the default trace lifetime and\n * propagation mechanism of the SDK for the duration and scope of the provided callback.\n * The newly created trace will also be the root of a new distributed trace, for example if\n * you make http requests within the callback.\n * This function might be useful if the operation you want to instrument should not be part\n * of a potentially ongoing trace.\n *\n * Default behavior:\n * - Server-side: A new trace is started for each incoming request.\n * - Browser: A new trace is started for each page our route. Navigating to a new route\n * or page will automatically create a new trace.\n */\nexport function startNewTrace<T>(callback: () => T): T {\n const acs = getAcs();\n if (acs.startNewTrace) {\n return acs.startNewTrace(callback);\n }\n\n return withScope(scope => {\n scope.setPropagationContext({\n traceId: generateTraceId(),\n sampleRand: safeMathRandom(),\n });\n DEBUG_BUILD && debug.log(`Starting a new trace with id ${scope.getPropagationContext().traceId}`);\n return withActiveSpan(null, callback);\n });\n}\n\n/**\n * The placeholder returned from `startSpan*` when `onlyIfParent` is set but there is no parent span.\n * It carries the current trace id and captured scopes so the trace data it propagates (and any nested\n * span that resolves it as its root via `getRootSpan`) reads its DSC from the scope, preserving a\n * continued trace's DSC instead of fabricating a fresh client one. Also records the dropped-span outcome.\n */\nfunction startMissingRequiredParentSpan(scope: Scope, client: Client | undefined): SentryNonRecordingSpan {\n client?.recordDroppedEvent('no_parent_span', 'span');\n const span = new SentryNonRecordingSpan({ traceId: scope.getPropagationContext().traceId });\n setCapturedScopesOnSpan(span, scope, getIsolationScope());\n return span;\n}\n\nfunction createChildOrRootSpan({\n parentSpan,\n spanArguments,\n forceTransaction,\n scope,\n}: {\n parentSpan: SentrySpan | undefined;\n spanArguments: SentrySpanArguments;\n forceTransaction?: boolean;\n scope: Scope;\n}): Span {\n const isolationScope = getIsolationScope();\n\n if (!hasSpansEnabled()) {\n const scopePropagationContext = { ...isolationScope.getPropagationContext(), ...scope.getPropagationContext() };\n const traceId = parentSpan ? parentSpan.spanContext().traceId : scopePropagationContext.traceId;\n\n // The placeholder is a thin marker; it carries no sampling decision or DSC. Both are read from\n // the scope: the sampling decision in `getTraceData`, the DSC in `getDynamicSamplingContextFromSpan`.\n const span = new SentryNonRecordingSpan({ traceId });\n\n // Nested placeholders link to their parent so `getRootSpan` resolves to the root placeholder,\n // whose captured scope is the source of truth. Root/forced placeholders are their own root.\n if (parentSpan && !forceTransaction) {\n addChildSpanToSpan(parentSpan, span);\n }\n\n // Capture scopes so consumers (e.g. SentryTraceProvider) can read them and so the DSC can be\n // resolved from the scope by `getDynamicSamplingContextFromSpan`. Consistent with `startIdleSpan`.\n setCapturedScopesOnSpan(span, scope, isolationScope);\n\n return span;\n }\n\n const client = getClient();\n if (_shouldIgnoreStreamedSpan(client, spanArguments)) {\n if (!_isTracingSuppressed(scope)) {\n // if tracing is actively suppressed (Sentry.suppressTracing(...)),\n // we don't want to record a client outcome for the ignored span\n client?.recordDroppedEvent('ignored', 'span');\n }\n\n const ignoredSpan = new SentryNonRecordingSpan({\n dropReason: 'ignored',\n traceId: parentSpan?.spanContext().traceId ?? scope.getPropagationContext().traceId,\n });\n setCapturedScopesOnSpan(ignoredSpan, scope, isolationScope);\n\n return ignoredSpan;\n }\n\n let span: Span;\n if (parentSpan && !forceTransaction) {\n span = _startChildSpan(parentSpan, scope, spanArguments, isolationScope);\n addChildSpanToSpan(parentSpan, span);\n } else if (parentSpan) {\n // If we forced a transaction but have a parent span, make sure to continue from the parent span, not the scope\n const dsc = getDynamicSamplingContextFromSpan(parentSpan);\n const { traceId, spanId: parentSpanId } = parentSpan.spanContext();\n const parentSampled = spanIsSampled(parentSpan);\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n isolationScope,\n parentSampled,\n );\n\n freezeDscOnSpan(span, dsc);\n } else {\n const {\n traceId,\n dsc,\n parentSpanId,\n sampled: parentSampled,\n } = {\n ...isolationScope.getPropagationContext(),\n ...scope.getPropagationContext(),\n };\n\n span = _startRootSpan(\n {\n traceId,\n parentSpanId,\n ...spanArguments,\n },\n scope,\n isolationScope,\n parentSampled,\n );\n\n if (dsc) {\n freezeDscOnSpan(span, dsc);\n }\n }\n\n logSpanStart(span);\n\n return span;\n}\n\n/**\n * This converts StartSpanOptions to SentrySpanArguments.\n * For the most part (for now) we accept the same options,\n * but some of them need to be transformed.\n */\nfunction parseSentrySpanArguments(options: StartSpanOptions): SentrySpanArguments {\n const exp = options.experimental || {};\n const initialCtx: SentrySpanArguments = {\n isStandalone: exp.standalone,\n ...options,\n };\n\n if (options.startTime) {\n const ctx: SentrySpanArguments & { startTime?: SpanTimeInput } = { ...initialCtx };\n ctx.startTimestamp = spanTimeInputToSeconds(options.startTime);\n delete ctx.startTime;\n return ctx;\n }\n\n return initialCtx;\n}\n\nfunction getAcs(): AsyncContextStrategy {\n const carrier = getMainCarrier();\n return getAsyncContextStrategy(carrier);\n}\n\nfunction _startRootSpan(\n spanArguments: SentrySpanArguments,\n scope: Scope,\n isolationScope: Scope,\n parentSampled?: boolean,\n): SentrySpan {\n const client = getClient();\n const options: Partial<ClientOptions> = client?.getOptions() || {};\n\n const { name = '' } = spanArguments;\n\n const mutableSpanSamplingData = { spanAttributes: { ...spanArguments.attributes }, spanName: name, parentSampled };\n\n // we don't care about the decision for the moment; this is just a placeholder\n client?.emit('beforeSampling', mutableSpanSamplingData, { decision: false });\n\n // If hook consumers override the parentSampled flag, we will use that value instead of the actual one\n const finalParentSampled = mutableSpanSamplingData.parentSampled ?? parentSampled;\n const finalAttributes = mutableSpanSamplingData.spanAttributes;\n\n const currentPropagationContext = scope.getPropagationContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n\n const [sampled, sampleRate, localSampleRateWasApplied] = isTracingSuppressed\n ? [false]\n : sampleSpan(\n options,\n {\n name,\n parentSampled: finalParentSampled,\n attributes: finalAttributes,\n parentSampleRate: parseSampleRate(currentPropagationContext.dsc?.sample_rate),\n },\n currentPropagationContext.sampleRand,\n );\n\n const rootSpan = new SentrySpan({\n ...spanArguments,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'custom',\n [SEMANTIC_ATTRIBUTE_SENTRY_SAMPLE_RATE]:\n sampleRate !== undefined && localSampleRateWasApplied ? sampleRate : undefined,\n ...finalAttributes,\n },\n sampled,\n });\n\n if (!sampled && client && !isTracingSuppressed) {\n DEBUG_BUILD && debug.log('[Tracing] Discarding root span because its trace was not chosen to be sampled.');\n client.recordDroppedEvent('sample_rate', hasSpanStreamingEnabled(client) ? 'span' : 'transaction');\n }\n\n setCapturedScopesOnSpan(rootSpan, scope, isolationScope);\n\n if (client) {\n client.emit('spanStart', rootSpan);\n }\n\n return rootSpan;\n}\n\n/**\n * Creates a new `Span` while setting the current `Span.id` as `parentSpanId`.\n * This inherits the sampling decision from the parent span.\n */\nfunction _startChildSpan(\n parentSpan: Span,\n scope: Scope,\n spanArguments: SentrySpanArguments,\n isolationScope: Scope,\n): Span {\n const { spanId, traceId } = parentSpan.spanContext();\n const isTracingSuppressed = _isTracingSuppressed(scope);\n const sampled = isTracingSuppressed ? false : spanIsSampled(parentSpan);\n\n const childSpan = sampled\n ? new SentrySpan({\n ...spanArguments,\n parentSpanId: spanId,\n traceId,\n sampled,\n })\n : new SentryNonRecordingSpan({ traceId });\n\n addChildSpanToSpan(parentSpan, childSpan);\n\n setCapturedScopesOnSpan(childSpan, scope, isolationScope);\n\n const client = getClient();\n\n if (!client) {\n return childSpan;\n }\n\n if (hasSpanStreamingEnabled(client) && spanIsNonRecordingSpan(childSpan)) {\n if (spanIsNonRecordingSpan(parentSpan) && parentSpan.dropReason) {\n // We land here if the parent span was a segment span that was ignored (`ignoreSpans`).\n // In this case, the child was also ignored (see `sampled` above) but we need to\n // record a client outcome for the child.\n childSpan.dropReason = parentSpan.dropReason;\n client.recordDroppedEvent(parentSpan.dropReason, 'span');\n } else if (!isTracingSuppressed) {\n // Otherwise, the child is not sampled due to sampling of the parent span,\n // hence we record a sample_rate client outcome for the child.\n childSpan.dropReason = 'sample_rate';\n client.recordDroppedEvent('sample_rate', 'span');\n }\n }\n\n client.emit('spanStart', childSpan);\n // If it has an endTimestamp, it's already ended\n if (spanArguments.endTimestamp) {\n client.emit('spanEnd', childSpan);\n client.emit('afterSpanEnd', childSpan);\n }\n\n return childSpan;\n}\n\nfunction getParentSpan(scope: Scope, customParentSpan: Span | null | undefined): SentrySpan | undefined {\n // always use the passed in span directly\n if (customParentSpan) {\n return customParentSpan as SentrySpan;\n }\n\n // This is different from `undefined` as it means the user explicitly wants no parent span\n if (customParentSpan === null) {\n return undefined;\n }\n\n const span = _getSpanForScope(scope) as SentrySpan | undefined;\n\n if (!span) {\n return undefined;\n }\n\n const client = getClient();\n const options: Partial<ClientOptions> = client ? client.getOptions() : {};\n if (options.parentSpanIsAlwaysRootSpan) {\n return getRootSpan(span) as SentrySpan;\n }\n\n return span;\n}\n\nfunction getActiveSpanWrapper<T>(parentSpan: Span | undefined | null): (callback: () => T) => T {\n return parentSpan !== undefined\n ? (callback: () => T) => {\n return withActiveSpan(parentSpan, callback);\n }\n : (callback: () => T) => callback();\n}\n\n/* Checks if `ignoreSpans` applies (extracted for bundle size)*/\nfunction _shouldIgnoreStreamedSpan(client: Client | undefined, spanArguments: SentrySpanArguments): boolean {\n const ignoreSpans = client?.getOptions().ignoreSpans;\n\n if (!client || !hasSpanStreamingEnabled(client) || !ignoreSpans?.length) {\n return false;\n }\n\n return shouldIgnoreSpan(\n {\n description: spanArguments.name || '',\n op: spanArguments.attributes?.[SEMANTIC_ATTRIBUTE_SENTRY_OP] || spanArguments.op,\n attributes: spanArguments.attributes,\n },\n ignoreSpans,\n );\n}\n\nfunction _isIgnoredSpan(span: Span): span is SentryNonRecordingSpan {\n return spanIsNonRecordingSpan(span) && span.dropReason === 'ignored';\n}\n\nfunction _isTracingSuppressed(scope: Scope): boolean {\n return scope.getScopeData().sdkProcessingMetadata[SUPPRESS_TRACING_KEY] === true;\n}\n"],"names":["span"],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"supports.js","sources":["../../../src/utils/supports.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { debug } from './debug-logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n new ErrorEvent('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-expect-error It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n new DOMException('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n return 'history' in WINDOW && !!WINDOW.history;\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport const supportsFetch = _isFetchSupported;\n\nfunction _isFetchSupported(): boolean {\n if (!('fetch' in WINDOW)) {\n return false;\n }\n\n try {\n new Headers();\n // Deno requires a valid URL so '' cannot be used as an argument\n new Request('data:,');\n new Response();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (typeof EdgeRuntime === 'string') {\n return true;\n }\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFunction(WINDOW.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = WINDOW.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow?.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFunction(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n DEBUG_BUILD && debug.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":";;;;AAIA,MAAM,MAAA,GAAS,UAAA;AAUR,SAAS,kBAAA,GAA8B;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,WAAW,EAAE,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,IAAI;AAIF,IAAA,IAAI,SAAS,EAAE,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI;AACF,IAAA,IAAI,aAAa,EAAE,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,SAAA,IAAa,MAAA,IAAU,CAAC,CAAC,MAAA,CAAO,OAAA;AACzC;AASO,MAAM,aAAA,GAAgB;AAE7B,SAAS,iBAAA,GAA6B;AACpC,EAAA,IAAI,EAAE,WAAW,MAAA,CAAA,EAAS;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,EAAQ;AAEZ,IAAA,IAAI,QAAQ,QAAQ,CAAA;AACpB,IAAA,IAAI,QAAA,EAAS;AACb,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMO,SAAS,iBAAiB,IAAA,EAAyB;AACxD,EAAA,OAAO,IAAA,IAAQ,kDAAA,CAAmD,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AACxF;AAQO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,IAAI,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AAEnB,EAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAI,aAAA,KAA8B,UAAA,EAAY;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAC5B,MAAA,IAAI,OAAA,CAAQ,eAAe,KAAA,EAAO;AAEhC,QAAA,MAAA,GAAS,gBAAA,CAAiB,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAA,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,iFAAA,EAAmF,GAAG,CAAA;AAAA,IAClH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,yBAAA,GAAqC;AACnD,EAAA,OAAO,mBAAA,IAAuB,MAAA;AAChC;AASO,SAAS,sBAAA,GAAkC;AAMhD,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,QAAQ,GAAA,EAAK;AAAA,MACf,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;"}
{"version":3,"file":"supports.js","sources":["../../../src/utils/supports.ts"],"sourcesContent":["import { DEBUG_BUILD } from '../debug-build';\nimport { debug } from './debug-logger';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst WINDOW = GLOBAL_OBJ as unknown as Window;\n\ndeclare const EdgeRuntime: string | undefined;\n\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent(): boolean {\n try {\n new ErrorEvent('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError(): boolean {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-expect-error It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException(): boolean {\n try {\n new DOMException('');\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory(): boolean {\n return 'history' in WINDOW && !!WINDOW.history;\n}\n\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport const supportsFetch = _isFetchSupported;\n\nfunction _isFetchSupported(): boolean {\n if (!('fetch' in WINDOW)) {\n return false;\n }\n\n try {\n new Headers();\n // Deno requires a valid URL so '' cannot be used as an argument\n new Request('data:,');\n new Response();\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * isNative checks if the given function is a native implementation\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isNativeFunction(func: Function): boolean {\n return func && /^function\\s+\\w+\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch(): boolean {\n if (typeof EdgeRuntime === 'string') {\n return true;\n }\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFunction(WINDOW.fetch)) {\n return true;\n }\n\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n let result = false;\n const doc = WINDOW.document;\n // eslint-disable-next-line typescript/no-deprecated\n if (doc && typeof (doc.createElement as unknown) === 'function') {\n try {\n const sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow?.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFunction(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n } catch (err) {\n DEBUG_BUILD && debug.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n\n return result;\n}\n\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver(): boolean {\n return 'ReportingObserver' in WINDOW;\n}\n\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n * @deprecated This is no longer used and will be removed in a future major version.\n */\nexport function supportsReferrerPolicy(): boolean {\n // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'\n // (see https://caniuse.com/#feat=referrer-policy),\n // it doesn't. And it throws an exception instead of ignoring this parameter...\n // REF: https://github.com/getsentry/raven-js/issues/1233\n\n if (!_isFetchSupported()) {\n return false;\n }\n\n try {\n new Request('_', {\n referrerPolicy: 'origin' as ReferrerPolicy,\n });\n return true;\n } catch {\n return false;\n }\n}\n"],"names":[],"mappings":";;;;AAIA,MAAM,MAAA,GAAS,UAAA;AAUR,SAAS,kBAAA,GAA8B;AAC5C,EAAA,IAAI;AACF,IAAA,IAAI,WAAW,EAAE,CAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,IAAI;AAIF,IAAA,IAAI,SAAS,EAAE,CAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,oBAAA,GAAgC;AAC9C,EAAA,IAAI;AACF,IAAA,IAAI,aAAa,EAAE,CAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAQO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,SAAA,IAAa,MAAA,IAAU,CAAC,CAAC,MAAA,CAAO,OAAA;AACzC;AASO,MAAM,aAAA,GAAgB;AAE7B,SAAS,iBAAA,GAA6B;AACpC,EAAA,IAAI,EAAE,WAAW,MAAA,CAAA,EAAS;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,OAAA,EAAQ;AAEZ,IAAA,IAAI,QAAQ,QAAQ,CAAA;AACpB,IAAA,IAAI,QAAA,EAAS;AACb,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAMO,SAAS,iBAAiB,IAAA,EAAyB;AACxD,EAAA,OAAO,IAAA,IAAQ,kDAAA,CAAmD,IAAA,CAAK,IAAA,CAAK,UAAU,CAAA;AACxF;AAQO,SAAS,mBAAA,GAA+B;AAC7C,EAAA,IAAI,OAAO,gBAAgB,QAAA,EAAU;AACnC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAIA,EAAA,IAAI,gBAAA,CAAiB,MAAA,CAAO,KAAK,CAAA,EAAG;AAClC,IAAA,OAAO,IAAA;AAAA,EACT;AAIA,EAAA,IAAI,MAAA,GAAS,KAAA;AACb,EAAA,MAAM,MAAM,MAAA,CAAO,QAAA;AAEnB,EAAA,IAAI,GAAA,IAAO,OAAQ,GAAA,CAAI,aAAA,KAA8B,UAAA,EAAY;AAC/D,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,GAAA,CAAI,aAAA,CAAc,QAAQ,CAAA;AAC1C,MAAA,OAAA,CAAQ,MAAA,GAAS,IAAA;AACjB,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAC5B,MAAA,IAAI,OAAA,CAAQ,eAAe,KAAA,EAAO;AAEhC,QAAA,MAAA,GAAS,gBAAA,CAAiB,OAAA,CAAQ,aAAA,CAAc,KAAK,CAAA;AAAA,MACvD;AACA,MAAA,GAAA,CAAI,IAAA,CAAK,YAAY,OAAO,CAAA;AAAA,IAC9B,SAAS,GAAA,EAAK;AACZ,MAAA,WAAA,IAAe,KAAA,CAAM,IAAA,CAAK,iFAAA,EAAmF,GAAG,CAAA;AAAA,IAClH;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAQO,SAAS,yBAAA,GAAqC;AACnD,EAAA,OAAO,mBAAA,IAAuB,MAAA;AAChC;AASO,SAAS,sBAAA,GAAkC;AAMhD,EAAA,IAAI,CAAC,mBAAkB,EAAG;AACxB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,IAAI,QAAQ,GAAA,EAAK;AAAA,MACf,cAAA,EAAgB;AAAA,KACjB,CAAA;AACD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;;;;"}

@@ -1,1 +0,1 @@

{"version":3,"file":"time.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { safeDateNow, withRandomSafeContext } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n /**\n * The millisecond timestamp at which measurement began, measured in Unix time.\n */\n timeOrigin: number;\n /**\n * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n */\n now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport function dateTimestampInSeconds(): number {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n // Some browser and environments don't have a performance or timeOrigin, so we fallback to\n // using Date.now() to compute the starting time.\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n\n const timeOrigin = performance.timeOrigin;\n\n // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n //\n // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n // correct for this.\n // See: https://github.com/getsentry/sentry-javascript/issues/2590\n // See: https://github.com/mdn/content/issues/4713\n // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\n\nlet _cachedTimestampInSeconds: (() => number) | undefined;\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport function timestampInSeconds(): number {\n // We store this in a closure so that we don't have to create a new function every time this is called.\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\n\n/**\n * Cached result of getBrowserTimeOrigin.\n */\nlet cachedTimeOrigin: number | null | undefined = null;\n\n/**\n * Gets the time origin and the mode used to determine it.\n *\n * Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n * performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n * data as reliable if they are within a reasonable threshold of the current time.\n *\n * TODO: move to `@sentry/browser-utils` package.\n */\nfunction getBrowserTimeOrigin(): number | undefined {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n if (!performance?.now) {\n return undefined;\n }\n\n const threshold = 300_000; // 5 minutes in milliseconds\n const performanceNow = withRandomSafeContext(() => performance.now());\n const dateNow = safeDateNow();\n\n const timeOrigin = performance.timeOrigin;\n if (typeof timeOrigin === 'number') {\n const timeOriginDelta = Math.abs(timeOrigin + performanceNow - dateNow);\n if (timeOriginDelta < threshold) {\n return timeOrigin;\n }\n }\n\n // TODO: Remove all code related to `performance.timing.navigationStart` once we drop support for Safari 14.\n // `performance.timeSince` is available in Safari 15.\n // see: https://caniuse.com/mdn-api_performance_timeorigin\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line deprecation/deprecation\n const navigationStart = performance.timing?.navigationStart;\n if (typeof navigationStart === 'number') {\n const navigationStartDelta = Math.abs(navigationStart + performanceNow - dateNow);\n if (navigationStartDelta < threshold) {\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to subtracting\n // `performance.now()` from `Date.now()`.\n return dateNow - performanceNow;\n}\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport function browserPerformanceTimeOrigin(): number | undefined {\n if (cachedTimeOrigin === null) {\n cachedTimeOrigin = getBrowserTimeOrigin();\n }\n\n return cachedTimeOrigin;\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,gBAAA,GAAmB,GAAA;AAoBlB,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAO,aAAY,GAAI,gBAAA;AACzB;AAQA,SAAS,gCAAA,GAAiD;AACxD,EAAA,MAAM,EAAE,aAAY,GAAI,UAAA;AAGxB,EAAA,IAAI,CAAC,WAAA,EAAa,GAAA,IAAO,CAAC,YAAY,UAAA,EAAY;AAChD,IAAA,OAAO,sBAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAW/B,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,aAAa,qBAAA,CAAsB,MAAM,WAAA,CAAY,GAAA,EAAK,CAAA,IAAK,gBAAA;AAAA,EACzE,CAAA;AACF;AAEA,IAAI,yBAAA;AAWG,SAAS,kBAAA,GAA6B;AAE3C,EAAA,MAAM,IAAA,GAAO,yBAAA,KAA8B,yBAAA,GAA4B,gCAAA,EAAiC,CAAA;AACxG,EAAA,OAAO,IAAA,EAAK;AACd;AAKA,IAAI,gBAAA,GAA8C,IAAA;AAWlD,SAAS,oBAAA,GAA2C;AAClD,EAAA,MAAM,EAAE,aAAY,GAAI,UAAA;AACxB,EAAA,IAAI,CAAC,aAAa,GAAA,EAAK;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAM,WAAA,CAAY,KAAK,CAAA;AACpE,EAAA,MAAM,UAAU,WAAA,EAAY;AAE5B,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAC/B,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,iBAAiB,OAAO,CAAA;AACtE,IAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAYA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAA,EAAQ,eAAA;AAC5C,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,eAAA,GAAkB,iBAAiB,OAAO,CAAA;AAChF,IAAA,IAAI,uBAAuB,SAAA,EAAW;AACpC,MAAA,OAAO,eAAA;AAAA,IACT;AAAA,EACF;AAIA,EAAA,OAAO,OAAA,GAAU,cAAA;AACnB;AAMO,SAAS,4BAAA,GAAmD;AACjE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,gBAAA,GAAmB,oBAAA,EAAqB;AAAA,EAC1C;AAEA,EAAA,OAAO,gBAAA;AACT;;;;"}
{"version":3,"file":"time.js","sources":["../../../src/utils/time.ts"],"sourcesContent":["import { safeDateNow, withRandomSafeContext } from './randomSafeContext';\nimport { GLOBAL_OBJ } from './worldwide';\n\nconst ONE_SECOND_IN_MS = 1000;\n\n/**\n * A partial definition of the [Performance Web API]{@link https://developer.mozilla.org/en-US/docs/Web/API/Performance}\n * for accessing a high-resolution monotonic clock.\n */\ninterface Performance {\n /**\n * The millisecond timestamp at which measurement began, measured in Unix time.\n */\n timeOrigin: number;\n /**\n * Returns the current millisecond timestamp, where 0 represents the start of measurement.\n */\n now(): number;\n}\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using the Date API.\n */\nexport function dateTimestampInSeconds(): number {\n return safeDateNow() / ONE_SECOND_IN_MS;\n}\n\n/**\n * Returns a wrapper around the native Performance API browser implementation, or undefined for browsers that do not\n * support the API.\n *\n * Wrapping the native API works around differences in behavior from different browsers.\n */\nfunction createUnixTimestampInSecondsFunc(): () => number {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & { performance?: Performance };\n // Some browser and environments don't have a performance or timeOrigin, so we fallback to\n // using Date.now() to compute the starting time.\n if (!performance?.now || !performance.timeOrigin) {\n return dateTimestampInSeconds;\n }\n\n const timeOrigin = performance.timeOrigin;\n\n // performance.now() is a monotonic clock, which means it starts at 0 when the process begins. To get the current\n // wall clock time (actual UNIX timestamp), we need to add the starting time origin and the current time elapsed.\n //\n // TODO: This does not account for the case where the monotonic clock that powers performance.now() drifts from the\n // wall clock time, which causes the returned timestamp to be inaccurate. We should investigate how to detect and\n // correct for this.\n // See: https://github.com/getsentry/sentry-javascript/issues/2590\n // See: https://github.com/mdn/content/issues/4713\n // See: https://dev.to/noamr/when-a-millisecond-is-not-a-millisecond-3h6\n return () => {\n return (timeOrigin + withRandomSafeContext(() => performance.now())) / ONE_SECOND_IN_MS;\n };\n}\n\nlet _cachedTimestampInSeconds: (() => number) | undefined;\n\n/**\n * Returns a timestamp in seconds since the UNIX epoch using either the Performance or Date APIs, depending on the\n * availability of the Performance API.\n *\n * BUG: Note that because of how browsers implement the Performance API, the clock might stop when the computer is\n * asleep. This creates a skew between `dateTimestampInSeconds` and `timestampInSeconds`. The\n * skew can grow to arbitrary amounts like days, weeks or months.\n * See https://github.com/getsentry/sentry-javascript/issues/2590.\n */\nexport function timestampInSeconds(): number {\n // We store this in a closure so that we don't have to create a new function every time this is called.\n const func = _cachedTimestampInSeconds ?? (_cachedTimestampInSeconds = createUnixTimestampInSecondsFunc());\n return func();\n}\n\n/**\n * Cached result of getBrowserTimeOrigin.\n */\nlet cachedTimeOrigin: number | null | undefined = null;\n\n/**\n * Gets the time origin and the mode used to determine it.\n *\n * Unfortunately browsers may report an inaccurate time origin data, through either performance.timeOrigin or\n * performance.timing.navigationStart, which results in poor results in performance data. We only treat time origin\n * data as reliable if they are within a reasonable threshold of the current time.\n *\n * TODO: move to `@sentry/browser-utils` package.\n */\nfunction getBrowserTimeOrigin(): number | undefined {\n const { performance } = GLOBAL_OBJ as typeof GLOBAL_OBJ & Window;\n if (!performance?.now) {\n return undefined;\n }\n\n const threshold = 300_000; // 5 minutes in milliseconds\n const performanceNow = withRandomSafeContext(() => performance.now());\n const dateNow = safeDateNow();\n\n const timeOrigin = performance.timeOrigin;\n if (typeof timeOrigin === 'number') {\n const timeOriginDelta = Math.abs(timeOrigin + performanceNow - dateNow);\n if (timeOriginDelta < threshold) {\n return timeOrigin;\n }\n }\n\n // TODO: Remove all code related to `performance.timing.navigationStart` once we drop support for Safari 14.\n // `performance.timeSince` is available in Safari 15.\n // see: https://caniuse.com/mdn-api_performance_timeorigin\n\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // Also as of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always\n // a valid fallback. In the absence of an initial time provided by the browser, fallback to the current time from the\n // Date API.\n // eslint-disable-next-line typescript/no-deprecated\n const navigationStart = performance.timing?.navigationStart;\n if (typeof navigationStart === 'number') {\n const navigationStartDelta = Math.abs(navigationStart + performanceNow - dateNow);\n if (navigationStartDelta < threshold) {\n return navigationStart;\n }\n }\n\n // Either both timeOrigin and navigationStart are skewed or neither is available, fallback to subtracting\n // `performance.now()` from `Date.now()`.\n return dateNow - performanceNow;\n}\n\n/**\n * The number of milliseconds since the UNIX epoch. This value is only usable in a browser, and only when the\n * performance API is available.\n */\nexport function browserPerformanceTimeOrigin(): number | undefined {\n if (cachedTimeOrigin === null) {\n cachedTimeOrigin = getBrowserTimeOrigin();\n }\n\n return cachedTimeOrigin;\n}\n"],"names":[],"mappings":";;;AAGA,MAAM,gBAAA,GAAmB,GAAA;AAoBlB,SAAS,sBAAA,GAAiC;AAC/C,EAAA,OAAO,aAAY,GAAI,gBAAA;AACzB;AAQA,SAAS,gCAAA,GAAiD;AACxD,EAAA,MAAM,EAAE,aAAY,GAAI,UAAA;AAGxB,EAAA,IAAI,CAAC,WAAA,EAAa,GAAA,IAAO,CAAC,YAAY,UAAA,EAAY;AAChD,IAAA,OAAO,sBAAA;AAAA,EACT;AAEA,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAW/B,EAAA,OAAO,MAAM;AACX,IAAA,OAAA,CAAQ,aAAa,qBAAA,CAAsB,MAAM,WAAA,CAAY,GAAA,EAAK,CAAA,IAAK,gBAAA;AAAA,EACzE,CAAA;AACF;AAEA,IAAI,yBAAA;AAWG,SAAS,kBAAA,GAA6B;AAE3C,EAAA,MAAM,IAAA,GAAO,yBAAA,KAA8B,yBAAA,GAA4B,gCAAA,EAAiC,CAAA;AACxG,EAAA,OAAO,IAAA,EAAK;AACd;AAKA,IAAI,gBAAA,GAA8C,IAAA;AAWlD,SAAS,oBAAA,GAA2C;AAClD,EAAA,MAAM,EAAE,aAAY,GAAI,UAAA;AACxB,EAAA,IAAI,CAAC,aAAa,GAAA,EAAK;AACrB,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,GAAA;AAClB,EAAA,MAAM,cAAA,GAAiB,qBAAA,CAAsB,MAAM,WAAA,CAAY,KAAK,CAAA;AACpE,EAAA,MAAM,UAAU,WAAA,EAAY;AAE5B,EAAA,MAAM,aAAa,WAAA,CAAY,UAAA;AAC/B,EAAA,IAAI,OAAO,eAAe,QAAA,EAAU;AAClC,IAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,GAAA,CAAI,UAAA,GAAa,iBAAiB,OAAO,CAAA;AACtE,IAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,MAAA,OAAO,UAAA;AAAA,IACT;AAAA,EACF;AAYA,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAA,EAAQ,eAAA;AAC5C,EAAA,IAAI,OAAO,oBAAoB,QAAA,EAAU;AACvC,IAAA,MAAM,oBAAA,GAAuB,IAAA,CAAK,GAAA,CAAI,eAAA,GAAkB,iBAAiB,OAAO,CAAA;AAChF,IAAA,IAAI,uBAAuB,SAAA,EAAW;AACpC,MAAA,OAAO,eAAA;AAAA,IACT;AAAA,EACF;AAIA,EAAA,OAAO,OAAA,GAAU,cAAA;AACnB;AAMO,SAAS,4BAAA,GAAmD;AACjE,EAAA,IAAI,qBAAqB,IAAA,EAAM;AAC7B,IAAA,gBAAA,GAAmB,oBAAA,EAAqB;AAAA,EAC1C;AAEA,EAAA,OAAO,gBAAA;AACT;;;;"}

@@ -7,2 +7,4 @@ import { getAsyncContextStrategy } from '../asyncContext/index.js';

import { getActiveSpan, spanToTraceHeader, spanToTraceparentHeader } from './spanUtils.js';
import { hasSpansEnabled } from './hasSpansEnabled.js';
import { spanIsNonRecordingSpan } from '../tracing/sentryNonRecordingSpan.js';
import { getDynamicSamplingContextFromSpan, getDynamicSamplingContextFromScope } from '../tracing/dynamicSamplingContext.js';

@@ -24,6 +26,7 @@ import { dynamicSamplingContextToSentryBaggageHeader } from './baggage.js';

const span = options.span || getActiveSpan();
const isTwpPlaceholder = spanIsNonRecordingSpan(span) && !hasSpansEnabled(client.getOptions());
if (!span && hasExternalPropagationContext()) {
return {};
}
const sentryTrace = span ? spanToTraceHeader(span) : scopeToTraceHeader(scope);
const sentryTrace = span && !isTwpPlaceholder ? spanToTraceHeader(span) : scopeToTraceHeader(scope);
const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);

@@ -41,3 +44,3 @@ const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);

if (options.propagateTraceparent) {
traceData.traceparent = span ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);
traceData.traceparent = span && !isTwpPlaceholder ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);
}

@@ -44,0 +47,0 @@ return traceData;

@@ -1,1 +0,1 @@

{"version":3,"file":"traceData.js","sources":["../../../src/utils/traceData.ts"],"sourcesContent":["import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, hasExternalPropagationContext } from '../currentScopes';\nimport { isEnabled } from '../exports';\nimport type { Scope } from '../scope';\nimport { getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan } from '../tracing';\nimport type { Span } from '../types/span';\nimport type { SerializedTraceData } from '../types/tracing';\nimport { dynamicSamplingContextToSentryBaggageHeader } from './baggage';\nimport { debug } from './debug-logger';\nimport { getActiveSpan, spanToTraceHeader, spanToTraceparentHeader } from './spanUtils';\nimport { generateSentryTraceHeader, generateTraceparentHeader, TRACEPARENT_REGEXP } from './tracing';\n\n/**\n * Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation\n * context) and serializes it to `sentry-trace` and `baggage` values. These values can be used to propagate\n * a trace via our tracing Http headers or Html `<meta>` tags.\n *\n * This function also applies some validation to the generated sentry-trace and baggage values to ensure that\n * only valid strings are returned.\n *\n * When an external propagation context is registered (e.g. via the OTLP integration) and there is no active\n * Sentry span, this function returns an empty object to defer outgoing request propagation to the external\n * propagator (e.g. an OpenTelemetry propagator).\n *\n * If (@param options.propagateTraceparent) is `true`, the function will also generate a `traceparent` value,\n * following the W3C traceparent header format.\n *\n * @returns an object with the tracing data values. The object keys are the name of the tracing key to be used as header\n * or meta tag name.\n */\nexport function getTraceData(\n options: { span?: Span; scope?: Scope; client?: Client; propagateTraceparent?: boolean } = {},\n): SerializedTraceData {\n const client = options.client || getClient();\n if (!isEnabled() || !client) {\n return {};\n }\n\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getTraceData) {\n return acs.getTraceData(options);\n }\n\n const scope = options.scope || getCurrentScope();\n const span = options.span || getActiveSpan();\n\n // When no active span and external propagation context is registered (e.g. OTLP integration),\n // return empty to let the OTel propagator handle outgoing request propagation.\n if (!span && hasExternalPropagationContext()) {\n return {};\n }\n\n const sentryTrace = span ? spanToTraceHeader(span) : scopeToTraceHeader(scope);\n const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);\n const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);\n\n const isValidSentryTraceHeader = TRACEPARENT_REGEXP.test(sentryTrace);\n if (!isValidSentryTraceHeader) {\n debug.warn('Invalid sentry-trace data. Cannot generate trace data');\n return {};\n }\n\n const traceData: SerializedTraceData = {\n 'sentry-trace': sentryTrace,\n baggage,\n };\n\n if (options.propagateTraceparent) {\n traceData.traceparent = span ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);\n }\n\n return traceData;\n}\n\n/**\n * Get a sentry-trace header value for the given scope.\n */\nfunction scopeToTraceHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateSentryTraceHeader(traceId, propagationSpanId, sampled);\n}\n\nfunction scopeToTraceparentHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateTraceparentHeader(traceId, propagationSpanId, sampled);\n}\n"],"names":[],"mappings":";;;;;;;;;;AAgCO,SAAS,YAAA,CACd,OAAA,GAA2F,EAAC,EACvE;AACrB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,SAAA,EAAU;AAC3C,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,MAAA,EAAQ;AAC3B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,GAAA,GAAM,wBAAwB,OAAO,CAAA;AAC3C,EAAA,IAAI,IAAI,YAAA,EAAc;AACpB,IAAA,OAAO,GAAA,CAAI,aAAa,OAAO,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,eAAA,EAAgB;AAC/C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,aAAA,EAAc;AAI3C,EAAA,IAAI,CAAC,IAAA,IAAQ,6BAAA,EAA8B,EAAG;AAC5C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,cAAc,IAAA,GAAO,iBAAA,CAAkB,IAAI,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAC7E,EAAA,MAAM,MAAM,IAAA,GAAO,iCAAA,CAAkC,IAAI,CAAA,GAAI,kCAAA,CAAmC,QAAQ,KAAK,CAAA;AAC7G,EAAA,MAAM,OAAA,GAAU,4CAA4C,GAAG,CAAA;AAE/D,EAAA,MAAM,wBAAA,GAA2B,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAA;AACpE,EAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,IAAA,KAAA,CAAM,KAAK,uDAAuD,CAAA;AAClE,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,cAAA,EAAgB,WAAA;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,IAAA,SAAA,CAAU,cAAc,IAAA,GAAO,uBAAA,CAAwB,IAAI,CAAA,GAAI,yBAAyB,KAAK,CAAA;AAAA,EAC/F;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,mBAAmB,KAAA,EAAsB;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAO,yBAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;AAEA,SAAS,yBAAyB,KAAA,EAAsB;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAO,yBAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;;;;"}
{"version":3,"file":"traceData.js","sources":["../../../src/utils/traceData.ts"],"sourcesContent":["import { getAsyncContextStrategy } from '../asyncContext';\nimport { getMainCarrier } from '../carrier';\nimport type { Client } from '../client';\nimport { getClient, getCurrentScope, hasExternalPropagationContext } from '../currentScopes';\nimport { isEnabled } from '../exports';\nimport type { Scope } from '../scope';\nimport { getDynamicSamplingContextFromScope, getDynamicSamplingContextFromSpan } from '../tracing';\nimport { spanIsNonRecordingSpan } from '../tracing/sentryNonRecordingSpan';\nimport type { Span } from '../types/span';\nimport type { SerializedTraceData } from '../types/tracing';\nimport { dynamicSamplingContextToSentryBaggageHeader } from './baggage';\nimport { debug } from './debug-logger';\nimport { hasSpansEnabled } from './hasSpansEnabled';\nimport { getActiveSpan, spanToTraceHeader, spanToTraceparentHeader } from './spanUtils';\nimport { generateSentryTraceHeader, generateTraceparentHeader, TRACEPARENT_REGEXP } from './tracing';\n\n/**\n * Extracts trace propagation data from the current span or from the client's scope (via transaction or propagation\n * context) and serializes it to `sentry-trace` and `baggage` values. These values can be used to propagate\n * a trace via our tracing Http headers or Html `<meta>` tags.\n *\n * This function also applies some validation to the generated sentry-trace and baggage values to ensure that\n * only valid strings are returned.\n *\n * When an external propagation context is registered (e.g. via the OTLP integration) and there is no active\n * Sentry span, this function returns an empty object to defer outgoing request propagation to the external\n * propagator (e.g. an OpenTelemetry propagator).\n *\n * If (@param options.propagateTraceparent) is `true`, the function will also generate a `traceparent` value,\n * following the W3C traceparent header format.\n *\n * @returns an object with the tracing data values. The object keys are the name of the tracing key to be used as header\n * or meta tag name.\n */\nexport function getTraceData(\n options: { span?: Span; scope?: Scope; client?: Client; propagateTraceparent?: boolean } = {},\n): SerializedTraceData {\n const client = options.client || getClient();\n if (!isEnabled() || !client) {\n return {};\n }\n\n const carrier = getMainCarrier();\n const acs = getAsyncContextStrategy(carrier);\n if (acs.getTraceData) {\n return acs.getTraceData(options);\n }\n\n const scope = options.scope || getCurrentScope();\n const span = options.span || getActiveSpan();\n\n // In Tracing-without-Performance (TwP) mode, spans are non-recording placeholders that carry no\n // sampling decision of their own (it's deferred). The scope is the source of truth, so we read\n // the trace headers from the scope. A non-recording span in *tracing* mode (e.g. an unsampled\n // child or an ignored span) is different: it represents an explicit negative decision, which\n // `spanToTraceHeader` correctly encodes as `-0`, so we keep reading those from the span.\n const isTwpPlaceholder = spanIsNonRecordingSpan(span) && !hasSpansEnabled(client.getOptions());\n\n // When there's no recording span and an external propagation context is registered (e.g. OTLP\n // integration), return empty to let the external propagator handle outgoing request propagation.\n if (!span && hasExternalPropagationContext()) {\n return {};\n }\n\n const sentryTrace = span && !isTwpPlaceholder ? spanToTraceHeader(span) : scopeToTraceHeader(scope);\n const dsc = span ? getDynamicSamplingContextFromSpan(span) : getDynamicSamplingContextFromScope(client, scope);\n const baggage = dynamicSamplingContextToSentryBaggageHeader(dsc);\n\n const isValidSentryTraceHeader = TRACEPARENT_REGEXP.test(sentryTrace);\n if (!isValidSentryTraceHeader) {\n debug.warn('Invalid sentry-trace data. Cannot generate trace data');\n return {};\n }\n\n const traceData: SerializedTraceData = {\n 'sentry-trace': sentryTrace,\n baggage,\n };\n\n if (options.propagateTraceparent) {\n traceData.traceparent = span && !isTwpPlaceholder ? spanToTraceparentHeader(span) : scopeToTraceparentHeader(scope);\n }\n\n return traceData;\n}\n\n/**\n * Get a sentry-trace header value for the given scope.\n */\nfunction scopeToTraceHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateSentryTraceHeader(traceId, propagationSpanId, sampled);\n}\n\nfunction scopeToTraceparentHeader(scope: Scope): string {\n const { traceId, sampled, propagationSpanId } = scope.getPropagationContext();\n return generateTraceparentHeader(traceId, propagationSpanId, sampled);\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AAkCO,SAAS,YAAA,CACd,OAAA,GAA2F,EAAC,EACvE;AACrB,EAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,MAAA,IAAU,SAAA,EAAU;AAC3C,EAAA,IAAI,CAAC,SAAA,EAAU,IAAK,CAAC,MAAA,EAAQ;AAC3B,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,UAAU,cAAA,EAAe;AAC/B,EAAA,MAAM,GAAA,GAAM,wBAAwB,OAAO,CAAA;AAC3C,EAAA,IAAI,IAAI,YAAA,EAAc;AACpB,IAAA,OAAO,GAAA,CAAI,aAAa,OAAO,CAAA;AAAA,EACjC;AAEA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,IAAS,eAAA,EAAgB;AAC/C,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,IAAA,IAAQ,aAAA,EAAc;AAO3C,EAAA,MAAM,gBAAA,GAAmB,uBAAuB,IAAI,CAAA,IAAK,CAAC,eAAA,CAAgB,MAAA,CAAO,YAAY,CAAA;AAI7F,EAAA,IAAI,CAAC,IAAA,IAAQ,6BAAA,EAA8B,EAAG;AAC5C,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,WAAA,GAAc,QAAQ,CAAC,gBAAA,GAAmB,kBAAkB,IAAI,CAAA,GAAI,mBAAmB,KAAK,CAAA;AAClG,EAAA,MAAM,MAAM,IAAA,GAAO,iCAAA,CAAkC,IAAI,CAAA,GAAI,kCAAA,CAAmC,QAAQ,KAAK,CAAA;AAC7G,EAAA,MAAM,OAAA,GAAU,4CAA4C,GAAG,CAAA;AAE/D,EAAA,MAAM,wBAAA,GAA2B,kBAAA,CAAmB,IAAA,CAAK,WAAW,CAAA;AACpE,EAAA,IAAI,CAAC,wBAAA,EAA0B;AAC7B,IAAA,KAAA,CAAM,KAAK,uDAAuD,CAAA;AAClE,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,MAAM,SAAA,GAAiC;AAAA,IACrC,cAAA,EAAgB,WAAA;AAAA,IAChB;AAAA,GACF;AAEA,EAAA,IAAI,QAAQ,oBAAA,EAAsB;AAChC,IAAA,SAAA,CAAU,WAAA,GAAc,QAAQ,CAAC,gBAAA,GAAmB,wBAAwB,IAAI,CAAA,GAAI,yBAAyB,KAAK,CAAA;AAAA,EACpH;AAEA,EAAA,OAAO,SAAA;AACT;AAKA,SAAS,mBAAmB,KAAA,EAAsB;AAChD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAO,yBAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;AAEA,SAAS,yBAAyB,KAAA,EAAsB;AACtD,EAAA,MAAM,EAAE,OAAA,EAAS,OAAA,EAAS,iBAAA,EAAkB,GAAI,MAAM,qBAAA,EAAsB;AAC5E,EAAA,OAAO,yBAAA,CAA0B,OAAA,EAAS,iBAAA,EAAmB,OAAO,CAAA;AACtE;;;;"}

@@ -1,4 +0,4 @@

const SDK_VERSION = "10.58.0" ;
const SDK_VERSION = "10.59.0" ;
export { SDK_VERSION };
//# sourceMappingURL=version.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"escapeStringForRegex.js","sources":["../../../src/vendor/escapeStringForRegex.ts"],"sourcesContent":["// Based on https://github.com/sindresorhus/escape-string-regexp but with modifications to:\n// a) reduce the size by skipping the runtime type - checking\n// b) ensure it gets down - compiled for old versions of Node(the published package only supports Node 14+).\n//\n// MIT License\n//\n// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated\n// documentation files(the \"Software\"), to deal in the Software without restriction, including without limitation\n// the rights to use, copy, modify, merge, publish, distribute, sublicense, and / or sell copies of the Software, and\n// to permit persons to whom the Software is furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in all copies or substantial portions of\n// the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO\n// THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\n// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n// IN THE SOFTWARE.\n\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString: string): string {\n // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n"],"names":[],"mappings":"AA6BO,SAAS,qBAAqB,WAAA,EAA6B;AAGhE,EAAA,OAAO,YAAY,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAO,CAAA;AACjF;;;;"}
{"version":3,"file":"escapeStringForRegex.js","sources":["../../../src/vendor/escapeStringForRegex.ts"],"sourcesContent":["// Based on https://github.com/sindresorhus/escape-string-regexp but with modifications to:\n// a) reduce the size by skipping the runtime type - checking\n// b) ensure it gets down - compiled for old versions of Node(the published package only supports Node 14+).\n//\n// Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)\n// SPDX-License-Identifier: MIT\n\n/**\n * Given a string, escape characters which have meaning in the regex grammar, such that the result is safe to feed to\n * `new RegExp()`.\n *\n * @param regexString The string to escape\n * @returns An version of the string with all special regex characters escaped\n */\nexport function escapeStringForRegex(regexString: string): string {\n // escape the hyphen separately so we can also replace it with a unicode literal hyphen, to avoid the problems\n // discussed in https://github.com/sindresorhus/escape-string-regexp/issues/20.\n return regexString.replace(/[|\\\\{}()[\\]^$+*?.]/g, '\\\\$&').replace(/-/g, '\\\\x2d');\n}\n"],"names":[],"mappings":"AAcO,SAAS,qBAAqB,WAAA,EAA6B;AAGhE,EAAA,OAAO,YAAY,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA,CAAE,OAAA,CAAQ,MAAM,OAAO,CAAA;AACjF;;;;"}

@@ -1,1 +0,1 @@

{"version":3,"file":"getIpAddress.js","sources":["../../../src/vendor/getIpAddress.ts"],"sourcesContent":["// Vendored / modified from @sergiodxa/remix-utils\n\n// https://github.com/sergiodxa/remix-utils/blob/02af80e12829a53696bfa8f3c2363975cf59f55e/src/server/get-client-ip-address.ts\n// MIT License\n\n// Copyright (c) 2021 Sergio Xalambrí\n\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n\n// The above copyright notice and this permission notice shall be included in all\n// copies or substantial portions of the Software.\n\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n// SOFTWARE.\n\n// The headers to check, in priority order\nexport const ipHeaderNames = [\n 'X-Client-IP',\n 'X-Forwarded-For',\n 'Fly-Client-IP',\n 'CF-Connecting-IP',\n 'Fastly-Client-Ip',\n 'True-Client-Ip',\n 'X-Real-IP',\n 'X-Cluster-Client-IP',\n 'X-Forwarded',\n 'Forwarded-For',\n 'Forwarded',\n 'X-Vercel-Forwarded-For',\n];\n\n/**\n * Get the IP address of the client sending a request.\n *\n * It receives a Request headers object and use it to get the\n * IP address from one of the following headers in order.\n *\n * If the IP address is valid, it will be returned. Otherwise, null will be\n * returned.\n *\n * If the header values contains more than one IP address, the first valid one\n * will be returned.\n */\nexport function getClientIPAddress(headers: { [key: string]: string | string[] | undefined }): string | null {\n // Build a map of lowercase header names to their values for case-insensitive lookup\n // This is needed because headers from different sources may have different casings\n const lowerCaseHeaders: { [key: string]: string | string[] | undefined } = {};\n\n for (const key of Object.keys(headers)) {\n lowerCaseHeaders[key.toLowerCase()] = headers[key];\n }\n\n // This will end up being Array<string | string[] | undefined | null> because of the various possible values a header\n // can take\n const headerValues = ipHeaderNames.map((headerName: string) => {\n const rawValue = lowerCaseHeaders[headerName.toLowerCase()];\n const value = Array.isArray(rawValue) ? rawValue.join(';') : rawValue;\n\n if (headerName === 'Forwarded') {\n return parseForwardedHeader(value);\n }\n\n return value?.split(',').map((v: string) => v.trim());\n });\n\n // Flatten the array and filter out any falsy entries\n const flattenedHeaderValues = headerValues.reduce((acc: string[], val) => {\n if (!val) {\n return acc;\n }\n\n return acc.concat(val);\n }, []);\n\n // Find the first value which is a valid IP address, if any\n const ipAddress = flattenedHeaderValues.find(ip => ip !== null && isIP(ip));\n\n return ipAddress || null;\n}\n\nfunction parseForwardedHeader(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n\n for (const part of value.split(';')) {\n if (part.startsWith('for=')) {\n return part.slice(4);\n }\n }\n\n return null;\n}\n\n//\n/**\n * Custom method instead of importing this from `net` package, as this only exists in node\n * Accepts:\n * 127.0.0.1\n * 192.168.1.1\n * 192.168.1.255\n * 255.255.255.255\n * 10.1.1.1\n * 0.0.0.0\n * 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5\n *\n * Rejects:\n * 1.1.1.01\n * 30.168.1.255.1\n * 127.1\n * 192.168.1.256\n * -1.2.3.4\n * 1.1.1.1.\n * 3...3\n * 192.168.1.099\n */\nfunction isIP(str: string): boolean {\n const regex =\n /(?:^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$)|(?:^(?:(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$)/;\n return regex.test(str);\n}\n"],"names":[],"mappings":"AA0BO,MAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAcO,SAAS,mBAAmB,OAAA,EAA0E;AAG3G,EAAA,MAAM,mBAAqE,EAAC;AAE5E,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,EACnD;AAIA,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,UAAA,KAAuB;AAC7D,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,WAAA,EAAa,CAAA;AAC1D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AAE7D,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EACtD,CAAC,CAAA;AAGD,EAAA,MAAM,qBAAA,GAAwB,YAAA,CAAa,MAAA,CAAO,CAAC,KAAe,GAAA,KAAQ;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAY,sBAAsB,IAAA,CAAK,CAAA,EAAA,KAAM,OAAO,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAE1E,EAAA,OAAO,SAAA,IAAa,IAAA;AACtB;AAEA,SAAS,qBAAqB,KAAA,EAAiD;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAwBA,SAAS,KAAK,GAAA,EAAsB;AAClC,EAAA,MAAM,KAAA,GACJ,muCAAA;AACF,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;;;;"}
{"version":3,"file":"getIpAddress.js","sources":["../../../src/vendor/getIpAddress.ts"],"sourcesContent":["// Vendored / modified from @sergiodxa/remix-utils\n\n// https://github.com/sergiodxa/remix-utils/blob/02af80e12829a53696bfa8f3c2363975cf59f55e/src/server/get-client-ip-address.ts\n// Copyright (c) 2021 Sergio Xalambrí\n// SPDX-License-Identifier: MIT\n\n// The headers to check, in priority order\nexport const ipHeaderNames = [\n 'X-Client-IP',\n 'X-Forwarded-For',\n 'Fly-Client-IP',\n 'CF-Connecting-IP',\n 'Fastly-Client-Ip',\n 'True-Client-Ip',\n 'X-Real-IP',\n 'X-Cluster-Client-IP',\n 'X-Forwarded',\n 'Forwarded-For',\n 'Forwarded',\n 'X-Vercel-Forwarded-For',\n];\n\n/**\n * Get the IP address of the client sending a request.\n *\n * It receives a Request headers object and use it to get the\n * IP address from one of the following headers in order.\n *\n * If the IP address is valid, it will be returned. Otherwise, null will be\n * returned.\n *\n * If the header values contains more than one IP address, the first valid one\n * will be returned.\n */\nexport function getClientIPAddress(headers: { [key: string]: string | string[] | undefined }): string | null {\n // Build a map of lowercase header names to their values for case-insensitive lookup\n // This is needed because headers from different sources may have different casings\n const lowerCaseHeaders: { [key: string]: string | string[] | undefined } = {};\n\n for (const key of Object.keys(headers)) {\n lowerCaseHeaders[key.toLowerCase()] = headers[key];\n }\n\n // This will end up being Array<string | string[] | undefined | null> because of the various possible values a header\n // can take\n const headerValues = ipHeaderNames.map((headerName: string) => {\n const rawValue = lowerCaseHeaders[headerName.toLowerCase()];\n const value = Array.isArray(rawValue) ? rawValue.join(';') : rawValue;\n\n if (headerName === 'Forwarded') {\n return parseForwardedHeader(value);\n }\n\n return value?.split(',').map((v: string) => v.trim());\n });\n\n // Flatten the array and filter out any falsy entries\n const flattenedHeaderValues = headerValues.reduce((acc: string[], val) => {\n if (!val) {\n return acc;\n }\n\n return acc.concat(val);\n }, []);\n\n // Find the first value which is a valid IP address, if any\n const ipAddress = flattenedHeaderValues.find(ip => ip !== null && isIP(ip));\n\n return ipAddress || null;\n}\n\nfunction parseForwardedHeader(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n\n for (const part of value.split(';')) {\n if (part.startsWith('for=')) {\n return part.slice(4);\n }\n }\n\n return null;\n}\n\n//\n/**\n * Custom method instead of importing this from `net` package, as this only exists in node\n * Accepts:\n * 127.0.0.1\n * 192.168.1.1\n * 192.168.1.255\n * 255.255.255.255\n * 10.1.1.1\n * 0.0.0.0\n * 2b01:cb19:8350:ed00:d0dd:fa5b:de31:8be5\n *\n * Rejects:\n * 1.1.1.01\n * 30.168.1.255.1\n * 127.1\n * 192.168.1.256\n * -1.2.3.4\n * 1.1.1.1.\n * 3...3\n * 192.168.1.099\n */\nfunction isIP(str: string): boolean {\n const regex =\n /(?:^(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}$)|(?:^(?:(?:[a-fA-F\\d]{1,4}:){7}(?:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){6}(?:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|:[a-fA-F\\d]{1,4}|:)|(?:[a-fA-F\\d]{1,4}:){5}(?::(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,2}|:)|(?:[a-fA-F\\d]{1,4}:){4}(?:(?::[a-fA-F\\d]{1,4}){0,1}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,3}|:)|(?:[a-fA-F\\d]{1,4}:){3}(?:(?::[a-fA-F\\d]{1,4}){0,2}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,4}|:)|(?:[a-fA-F\\d]{1,4}:){2}(?:(?::[a-fA-F\\d]{1,4}){0,3}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,5}|:)|(?:[a-fA-F\\d]{1,4}:){1}(?:(?::[a-fA-F\\d]{1,4}){0,4}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,6}|:)|(?::(?:(?::[a-fA-F\\d]{1,4}){0,5}:(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)(?:\\\\.(?:25[0-5]|2[0-4]\\d|1\\d\\d|[1-9]\\d|\\d)){3}|(?::[a-fA-F\\d]{1,4}){1,7}|:)))(?:%[0-9a-zA-Z]{1,})?$)/;\n return regex.test(str);\n}\n"],"names":[],"mappings":"AAOO,MAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA;AAAA,EACA,iBAAA;AAAA,EACA,eAAA;AAAA,EACA,kBAAA;AAAA,EACA,kBAAA;AAAA,EACA,gBAAA;AAAA,EACA,WAAA;AAAA,EACA,qBAAA;AAAA,EACA,aAAA;AAAA,EACA,eAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF;AAcO,SAAS,mBAAmB,OAAA,EAA0E;AAG3G,EAAA,MAAM,mBAAqE,EAAC;AAE5E,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,EAAG;AACtC,IAAA,gBAAA,CAAiB,GAAA,CAAI,WAAA,EAAa,CAAA,GAAI,QAAQ,GAAG,CAAA;AAAA,EACnD;AAIA,EAAA,MAAM,YAAA,GAAe,aAAA,CAAc,GAAA,CAAI,CAAC,UAAA,KAAuB;AAC7D,IAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,UAAA,CAAW,WAAA,EAAa,CAAA;AAC1D,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,CAAQ,QAAQ,IAAI,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,QAAA;AAE7D,IAAA,IAAI,eAAe,WAAA,EAAa;AAC9B,MAAA,OAAO,qBAAqB,KAAK,CAAA;AAAA,IACnC;AAEA,IAAA,OAAO,KAAA,EAAO,MAAM,GAAG,CAAA,CAAE,IAAI,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AAAA,EACtD,CAAC,CAAA;AAGD,EAAA,MAAM,qBAAA,GAAwB,YAAA,CAAa,MAAA,CAAO,CAAC,KAAe,GAAA,KAAQ;AACxE,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,GAAA;AAAA,IACT;AAEA,IAAA,OAAO,GAAA,CAAI,OAAO,GAAG,CAAA;AAAA,EACvB,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,MAAM,SAAA,GAAY,sBAAsB,IAAA,CAAK,CAAA,EAAA,KAAM,OAAO,IAAA,IAAQ,IAAA,CAAK,EAAE,CAAC,CAAA;AAE1E,EAAA,OAAO,SAAA,IAAa,IAAA;AACtB;AAEA,SAAS,qBAAqB,KAAA,EAAiD;AAC7E,EAAA,IAAI,CAAC,KAAA,EAAO;AACV,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA,EAAG;AACnC,IAAA,IAAI,IAAA,CAAK,UAAA,CAAW,MAAM,CAAA,EAAG;AAC3B,MAAA,OAAO,IAAA,CAAK,MAAM,CAAC,CAAA;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAwBA,SAAS,KAAK,GAAA,EAAsB;AAClC,EAAA,MAAM,KAAA,GACJ,muCAAA;AACF,EAAA,OAAO,KAAA,CAAM,KAAK,GAAG,CAAA;AACvB;;;;"}

@@ -32,3 +32,6 @@ import { Span } from '../../types/span';

* If the user explicitly set `enableTruncation`, that value is used.
* Otherwise, truncation is disabled when span streaming is active.
* Otherwise, truncation is disabled whenever gen_ai spans are sent through the span streaming / v2
* span path, i.e. full span streaming (`traceLifecycle: 'stream'`) or `streamGenAiSpans`. That path
* is not subject to the transaction payload-size limits that truncation works around, so the full
* message data can be retained.
*/

@@ -35,0 +38,0 @@ export declare function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean;

@@ -47,5 +47,9 @@ import { EventDropReason } from '../types/clientreport';

*/
recordException(_exception: unknown, _time?: number | undefined): void;
recordException(_exception: unknown, _time?: SpanTimeInput | undefined): void;
}
/**
* Whether the given span is a {@link SentryNonRecordingSpan}.
*/
export declare function spanIsNonRecordingSpan(span: Span | undefined): span is SentryNonRecordingSpan;
export {};
//# sourceMappingURL=sentryNonRecordingSpan.d.ts.map

@@ -86,2 +86,3 @@ import { AttachmentType } from './attachment';

type: 'profile_chunk';
platform: ProfileChunk['platform'];
};

@@ -88,0 +89,0 @@ type SpanItemHeaders = {

@@ -517,2 +517,7 @@ import { CaptureContext } from '../scope';

*
* Because the v2 span format is not subject to the transaction payload-size limits that gen_ai message
* truncation exists to work around, enabling this option also disables gen_ai input truncation (and the
* inline-media redaction that rides along with it) by default. Set `enableTruncation: true` on the
* respective AI integration to opt back into truncation.
*
* @default false

@@ -519,0 +524,0 @@ */

@@ -1,1 +0,1 @@

{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/integrations/express/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAKH,OAAO,KAAK,EAEV,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EAGzB,mBAAmB,EAOpB,MAAM,SAAS,CAAC;AA8BjB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,mBAAmB,EAClC,UAAU,EAAE,MAAM,yBAAyB,GAC1C,mBAAmB,CAAC;AACvB;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GAAG;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,GACpE,mBAAmB,CAAC;AAqGvB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,sBAAsB,CAoB3F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE;IAEH,GAAG,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC;CACnC,EACD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAGN"}
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/integrations/express/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAKH,OAAO,KAAK,EAEV,sBAAsB,EACtB,qBAAqB,EACrB,yBAAyB,EAGzB,mBAAmB,EAOpB,MAAM,SAAS,CAAC;AA8BjB;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,aAAa,EAAE,mBAAmB,EAClC,UAAU,EAAE,MAAM,yBAAyB,GAC1C,mBAAmB,CAAC;AACvB;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,yBAAyB,GAAG;IAAE,OAAO,EAAE,mBAAmB,CAAA;CAAE,GACpE,mBAAmB,CAAC;AAsGvB;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,sBAAsB,CAoB3F;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,wBAAwB,CACtC,GAAG,EAAE;IAEH,GAAG,EAAE,CAAC,UAAU,EAAE,GAAG,KAAK,OAAO,CAAC;CACnC,EACD,OAAO,CAAC,EAAE,qBAAqB,GAC9B,IAAI,CAGN"}

@@ -1,1 +0,1 @@

{"version":3,"file":"get-request-url.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/get-request-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAErE,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,kBAAkB,CAmBhF;AAED,wBAAgB,aAAa,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,CAExE;AAED,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,GAAG,GAAG,CAY3E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEjF"}
{"version":3,"file":"get-request-url.d.ts","sourceRoot":"","sources":["../../../../src/integrations/http/get-request-url.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAErE,sDAAsD;AACtD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,GAAG,kBAAkB,CAmBhF;AAED,wBAAgB,aAAa,CAAC,cAAc,EAAE,kBAAkB,GAAG,MAAM,CAMxE;AAED,wBAAgB,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,GAAG,GAAG,CAe3E;AAED;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,OAAO,EAAE,iBAAiB,GAAG,MAAM,CAEjF"}

@@ -1,1 +0,1 @@

{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqH7D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAGxE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAG5E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAG1E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAI1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAoD5E"}
{"version":3,"file":"handlers.d.ts","sourceRoot":"","sources":["../../../../src/integrations/mcp-server/handlers.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,KAAK,EAAc,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAqH7D;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAIxE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAI5E;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAI1E;AAED;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAI1E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAAC,cAAc,EAAE,iBAAiB,GAAG,IAAI,CAoD5E"}

@@ -1,1 +0,1 @@

{"version":3,"file":"server-exports.d.ts","sourceRoot":"","sources":["../../src/server-exports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,SAAS,IAAI,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACjH,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAC;AACnG,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC/F,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}
{"version":3,"file":"server-exports.d.ts","sourceRoot":"","sources":["../../src/server-exports.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AAC1E,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAC9D,YAAY,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAE,eAAe,EAAE,IAAI,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACtF,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AAC9D,OAAO,EAAE,qBAAqB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,EAAE,SAAS,IAAI,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEjE,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,mBAAmB,EAAE,MAAM,8BAA8B,CAAC;AACjH,YAAY,EACV,yBAAyB,EACzB,qBAAqB,EACrB,iBAAiB,EACjB,sBAAsB,GACvB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAEpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAE,0BAA0B,EAAE,oBAAoB,EAAE,MAAM,yCAAyC,CAAC;AAC3G,OAAO,EAAE,oBAAoB,EAAE,MAAM,4CAA4C,CAAC;AAClF,OAAO,EAAE,4BAA4B,EAAE,MAAM,qDAAqD,CAAC;AACnG,OAAO,EACL,aAAa,EACb,mBAAmB,EACnB,8BAA8B,EAC9B,iBAAiB,GAClB,MAAM,qCAAqC,CAAC;AAC7C,OAAO,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAC/F,YAAY,EACV,0BAA0B,EAC1B,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,EAClB,gBAAgB,GACjB,MAAM,2BAA2B,CAAC"}

@@ -1,1 +0,1 @@

{"version":3,"file":"shared-exports.d.ts","sourceRoot":"","sources":["../../src/shared-exports.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"shared-exports.d.ts","sourceRoot":"","sources":["../../src/shared-exports.ts"],"names":[],"mappings":"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"}

@@ -32,3 +32,6 @@ import type { Span } from '../../types/span';

* If the user explicitly set `enableTruncation`, that value is used.
* Otherwise, truncation is disabled when span streaming is active.
* Otherwise, truncation is disabled whenever gen_ai spans are sent through the span streaming / v2
* span path, i.e. full span streaming (`traceLifecycle: 'stream'`) or `streamGenAiSpans`. That path
* is not subject to the transaction payload-size limits that truncation works around, so the full
* message data can be retained.
*/

@@ -35,0 +38,0 @@ export declare function shouldEnableTruncation(enableTruncation: boolean | undefined): boolean;

@@ -1,1 +0,1 @@

{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/tracing/ai/utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAe7C,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,+HAA+H;IAC/H,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAOrH;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAGrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,IAAI,CA4BN;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CA2ClG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAKvD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAYhE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG;IACxE,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACvC,CA6BA;AAoCD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,EAC/B,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,EAC/B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,CAAC,CA8BZ"}
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../../src/tracing/ai/utils.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAe7C,MAAM,WAAW,kBAAkB;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,+HAA+H;IAC/H,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,sEAAsE;IACtE,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,mFAAmF;IACnF,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,0BAA0B,GAAG,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AAEjF;;;GAGG;AACH,wBAAgB,yBAAyB,CAAC,CAAC,SAAS,kBAAkB,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,kBAAkB,CAAC,CAOrH;AAED;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,gBAAgB,EAAE,OAAO,GAAG,SAAS,GAAG,OAAO,CAWrF;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEzE;AAED;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,IAAI,EACV,YAAY,CAAC,EAAE,MAAM,EACrB,gBAAgB,CAAC,EAAE,MAAM,EACzB,iBAAiB,CAAC,EAAE,MAAM,EAC1B,kBAAkB,CAAC,EAAE,MAAM,GAC1B,IAAI,CA4BN;AAED,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,SAAS,EAAE,OAAO,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,mBAAmB,EAAE,aAAa,EAAE,OAAO,GAAG,IAAI,CA2ClG;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAKvD;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,MAAM,CAYhE;AAED;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,OAAO,EAAE,GAAG,OAAO,GAAG;IACxE,kBAAkB,EAAE,MAAM,GAAG,SAAS,CAAC;IACvC,gBAAgB,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;CACvC,CA6BA;AAoCD;;;;;;;GAOG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,EACtC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,EAC/B,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC,EAC/B,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,CAAC,CAAC,CA8BZ"}

@@ -1,1 +0,1 @@

{"version":3,"file":"dynamicSamplingContext.d.ts","sourceRoot":"","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAMtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAkB1C;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAGtF;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAkB5G;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAGhH;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAwEvG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAGlE"}
{"version":3,"file":"dynamicSamplingContext.d.ts","sourceRoot":"","sources":["../../../src/tracing/dynamicSamplingContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAMtC,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAChE,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAmB1C;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAGtF;AAED;;;;GAIG;AACH,wBAAgB,mCAAmC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,sBAAsB,CAkB5G;AAED;;GAEG;AACH,wBAAgB,kCAAkC,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAGhH;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,IAAI,EAAE,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAyFvG;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,SAAS,CAGlE"}

@@ -1,1 +0,1 @@

{"version":3,"file":"idleSpan.d.ts","sourceRoot":"","sources":["../../../src/tracing/idleSpan.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAmBlE,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAC;AAuBF,UAAU,eAAe;IACvB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,qGAAqG;IACrG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAErC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,IAAI,CAuU9G"}
{"version":3,"file":"idleSpan.d.ts","sourceRoot":"","sources":["../../../src/tracing/idleSpan.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAmBlE,eAAO,MAAM,gBAAgB;;;;CAI5B,CAAC;AAuBF,UAAU,eAAe;IACvB;;;OAGG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB;;;OAGG;IACH,YAAY,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B,qGAAqG;IACrG,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IAErC;;;;OAIG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,gBAAgB,EAAE,gBAAgB,EAAE,OAAO,GAAE,OAAO,CAAC,eAAe,CAAM,GAAG,IAAI,CAsU9G"}

@@ -47,5 +47,9 @@ import type { EventDropReason } from '../types/clientreport';

*/
recordException(_exception: unknown, _time?: number | undefined): void;
recordException(_exception: unknown, _time?: SpanTimeInput | undefined): void;
}
/**
* Whether the given span is a {@link SentryNonRecordingSpan}.
*/
export declare function spanIsNonRecordingSpan(span: Span | undefined): span is SentryNonRecordingSpan;
export {};
//# sourceMappingURL=sentryNonRecordingSpan.d.ts.map

@@ -1,1 +0,1 @@

{"version":3,"file":"sentryNonRecordingSpan.d.ts","sourceRoot":"","sources":["../../../src/tracing/sentryNonRecordingSpan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,mBAAmB,EACnB,IAAI,EACJ,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,aAAa,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAItD,UAAU,+BAAgC,SAAQ,mBAAmB;IACnE,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAED;;GAEG;AACH,qBAAa,sBAAuB,YAAW,IAAI;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB;;;;OAIG;IACI,UAAU,CAAC,EAAE,eAAe,CAAC;gBAEjB,WAAW,GAAE,+BAAoC;IAMpE,kBAAkB;IACX,WAAW,IAAI,eAAe;IAQrC,kBAAkB;IACX,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,IAAI;IAE5C,kBAAkB;IACX,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI;IAI/E,kBAAkB;IACX,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAInD,kBAAkB;IACX,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAI3C,kBAAkB;IACX,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,kBAAkB;IACX,WAAW,IAAI,OAAO;IAI7B,kBAAkB;IACX,QAAQ,CACb,KAAK,EAAE,MAAM,EACb,sBAAsB,CAAC,EAAE,cAAc,GAAG,aAAa,EACvD,UAAU,CAAC,EAAE,aAAa,GACzB,IAAI;IAIP,kBAAkB;IACX,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIpC,kBAAkB;IACX,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI;IAIxC;;;;;;OAMG;IACI,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI;CAG9E"}
{"version":3,"file":"sentryNonRecordingSpan.d.ts","sourceRoot":"","sources":["../../../src/tracing/sentryNonRecordingSpan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EACV,mBAAmB,EACnB,IAAI,EACJ,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,aAAa,EACd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKtD,UAAU,+BAAgC,SAAQ,mBAAmB;IACnE,UAAU,CAAC,EAAE,eAAe,CAAC;CAC9B;AAOD;;GAEG;AACH,qBAAa,sBAAuB,YAAW,IAAI;IACjD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAS;IAExB;;;;OAIG;IACI,UAAU,CAAC,EAAE,eAAe,CAAC;gBAEjB,WAAW,GAAE,+BAAoC;IAOpE,kBAAkB;IACX,WAAW,IAAI,eAAe;IAQrC,kBAAkB;IACX,GAAG,CAAC,UAAU,CAAC,EAAE,aAAa,GAAG,IAAI;IAE5C,kBAAkB;IACX,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB,GAAG,SAAS,GAAG,IAAI;IAI/E,kBAAkB;IACX,aAAa,CAAC,OAAO,EAAE,cAAc,GAAG,IAAI;IAInD,kBAAkB;IACX,SAAS,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAI3C,kBAAkB;IACX,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAItC,kBAAkB;IACX,WAAW,IAAI,OAAO;IAI7B,kBAAkB;IACX,QAAQ,CACb,KAAK,EAAE,MAAM,EACb,sBAAsB,CAAC,EAAE,cAAc,GAAG,aAAa,EACvD,UAAU,CAAC,EAAE,aAAa,GACzB,IAAI;IAIP,kBAAkB;IACX,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAIpC,kBAAkB;IACX,QAAQ,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI;IAIxC;;;;;;OAMG;IACI,eAAe,CAAC,UAAU,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,GAAG,IAAI;CAGrF;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,IAAI,sBAAsB,CAE7F"}

@@ -1,1 +0,1 @@

{"version":3,"file":"captureSpan.d.ts","sourceRoot":"","sources":["../../../../src/tracing/spans/captureSpan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAavF,MAAM,MAAM,qCAAqC,GAAG,sBAAsB,GAAG;IAC3E,YAAY,EAAE,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,qCAAqC,CAsD7F;AAOD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACpD,IAAI,CAQN;AAoCD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,gBAAgB,EACtB,cAAc,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,gBAAgB,GAC3D,gBAAgB,CAOlB;AAMD;;;;;;;GAOG;AACH,+BAA+B;AAC/B,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAmCnG"}
{"version":3,"file":"captureSpan.d.ts","sourceRoot":"","sources":["../../../../src/tracing/spans/captureSpan.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAkB3C,OAAO,KAAK,EAAE,sBAAsB,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAcvF,MAAM,MAAM,qCAAqC,GAAG,sBAAsB,GAAG;IAC3E,YAAY,EAAE,IAAI,CAAC;CACpB,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,qCAAqC,CAsD7F;AAOD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,gBAAgB,EAC1B,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACpD,IAAI,CAQN;AAoCD;;GAEG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,gBAAgB,EACtB,cAAc,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,gBAAgB,GAC3D,gBAAgB,CAOlB;AAMD;;;;;;;GAOG;AACH,+BAA+B;AAC/B,wBAAgB,+BAA+B,CAAC,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAmCnG"}

@@ -1,1 +0,1 @@

{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../../src/tracing/trace.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAQtC,OAAO,KAAK,EAAuB,IAAI,EAAiB,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAYlE,OAAO,EAAE,6BAA6B,EAAuB,MAAM,kBAAkB,CAAC;AAUtF,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAElE;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,CA0DtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAuDhH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAoCjE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAC7B,SAAS;IACP,WAAW,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9D,EACD,UAAU,MAAM,CAAC,KAChB,CAqBF,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,CAUrF;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAkBvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAcrD"}
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../../src/tracing/trace.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAOtC,OAAO,KAAK,EAAuB,IAAI,EAAiB,MAAM,eAAe,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAYlE,OAAO,EAAE,6BAA6B,EAAuB,MAAM,kBAAkB,CAAC;AAUtF,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAElE;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,CAAC,GAAG,CAAC,CAsDtF;AAED;;;;;;;;;GASG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAmDhH;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI,CAmCjE;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAC7B,SAAS;IACP,WAAW,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;IACjE,OAAO,EAAE,UAAU,CAAC,OAAO,6BAA6B,CAAC,CAAC,CAAC,CAAC,CAAC;CAC9D,EACD,UAAU,MAAM,CAAC,KAChB,CAqBF,CAAC;AAEF;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,CAAC,GAAG,CAAC,CAUrF;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAkBvD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAcrD"}

@@ -83,2 +83,3 @@ import type { AttachmentType } from './attachment';

type: 'profile_chunk';
platform: ProfileChunk['platform'];
};

@@ -85,0 +86,0 @@ type SpanItemHeaders = {

@@ -1,1 +0,1 @@

{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/types/envelope.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"envelope.d.ts","sourceRoot":"","sources":["../../../src/types/envelope.ts"],"names":[],"mappings":"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"}

@@ -517,2 +517,7 @@ import type { CaptureContext } from '../scope';

*
* Because the v2 span format is not subject to the transaction payload-size limits that gen_ai message
* truncation exists to work around, enabling this option also disables gen_ai input truncation (and the
* inline-media redaction that rides along with it) by default. Set `enableTruncation: true` on the
* respective AI integration to opt back into truncation.
*
* @default false

@@ -519,0 +524,0 @@ */

@@ -1,1 +0,1 @@

{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/types/options.ts"],"names":[],"mappings":"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"}
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../../src/types/options.ts"],"names":[],"mappings":"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"}

@@ -1,1 +0,1 @@

{"version":3,"file":"traceData.d.ts","sourceRoot":"","sources":["../../../src/utils/traceData.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAM5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5F,mBAAmB,CAyCrB"}
{"version":3,"file":"traceData.d.ts","sourceRoot":"","sources":["../../../src/utils/traceData.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;AAGxC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAGtC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAO5D;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAC1B,OAAO,GAAE;IAAE,IAAI,CAAC,EAAE,IAAI,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,oBAAoB,CAAC,EAAE,OAAO,CAAA;CAAO,GAC5F,mBAAmB,CAgDrB"}

@@ -1,1 +0,1 @@

{"version":3,"file":"escapeStringForRegex.d.ts","sourceRoot":"","sources":["../../../src/vendor/escapeStringForRegex.ts"],"names":[],"mappings":"AAsBA;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIhE"}
{"version":3,"file":"escapeStringForRegex.d.ts","sourceRoot":"","sources":["../../../src/vendor/escapeStringForRegex.ts"],"names":[],"mappings":"AAOA;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAIhE"}

@@ -1,1 +0,1 @@

{"version":3,"file":"getIpAddress.d.ts","sourceRoot":"","sources":["../../../src/vendor/getIpAddress.ts"],"names":[],"mappings":"AA0BA,eAAO,MAAM,aAAa,UAazB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAmC3G"}
{"version":3,"file":"getIpAddress.d.ts","sourceRoot":"","sources":["../../../src/vendor/getIpAddress.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,aAAa,UAazB,CAAC;AAEF;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAmC3G"}
{
"name": "@sentry/core",
"version": "10.58.0",
"version": "10.59.0",
"description": "Base implementation for all Sentry JavaScript SDKs",

@@ -5,0 +5,0 @@ "repository": "git://github.com/getsentry/sentry-javascript.git",

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display