{"version":3,"file":"fetch.js","sources":["../../src/fetch.ts"],"sourcesContent":["import { getClient } from './currentScopes';\nimport { SEMANTIC_ATTRIBUTE_SENTRY_OP, SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN } from './semanticAttributes';\nimport { setHttpStatus, SPAN_STATUS_ERROR, startInactiveSpan } from './tracing';\nimport { SentryNonRecordingSpan } from './tracing/sentryNonRecordingSpan';\nimport { hasSpanStreamingEnabled } from './tracing/spans/hasSpanStreamingEnabled';\nimport type { FetchBreadcrumbHint } from './types/breadcrumb';\nimport type { HandlerDataFetch } from './types/instrument';\nimport type { ResponseHookInfo } from './types/request';\nimport type { Span, SpanAttributes, SpanOrigin } from './types/span';\nimport { SENTRY_BAGGAGE_KEY_PREFIX } from './utils/baggage';\nimport { hasSpansEnabled } from './utils/hasSpansEnabled';\nimport { isInstanceOf, isRequest } from './utils/is';\nimport { getActiveSpan } from './utils/spanUtils';\nimport { getTraceData } from './utils/traceData';\nimport {\n getSanitizedUrlStringFromUrlObject,\n isURLObjectRelative,\n parseStringToURLObject,\n stripDataUrlContent,\n} from './utils/url';\n\ntype PolymorphicRequestHeaders =\n | Record\n | Array<[string, unknown]>\n | Iterable>\n // the below is not precisely the Header type used in Request, but it'll pass duck-typing\n | {\n append: (key: string, value: string) => void;\n get: (key: string) => string | null | undefined;\n };\n\ninterface InstrumentFetchRequestOptions {\n spanOrigin?: SpanOrigin;\n propagateTraceparent?: boolean;\n onRequestSpanEnd?: (span: Span, responseInformation: ResponseHookInfo) => void;\n}\n\n/**\n * Create and track fetch request spans for usage in combination with `addFetchInstrumentationHandler`.\n *\n * @deprecated pass an options object instead of the spanOrigin parameter\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function instrumentFetchRequest(\n handlerData: HandlerDataFetch,\n shouldCreateSpan: (url: string) => boolean,\n shouldAttachHeaders: (url: string) => boolean,\n spans: Record,\n spanOrigin: SpanOrigin,\n): Span | undefined;\n/**\n * Create and track fetch request spans for usage in combination with `addFetchInstrumentationHandler`.\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function instrumentFetchRequest(\n handlerData: HandlerDataFetch,\n shouldCreateSpan: (url: string) => boolean,\n shouldAttachHeaders: (url: string) => boolean,\n spans: Record,\n // eslint-disable-next-line @typescript-eslint/unified-signatures -- needed because the other overload is deprecated\n instrumentFetchRequestOptions: InstrumentFetchRequestOptions,\n): Span | undefined;\n\n/**\n * Create and track fetch request spans for usage in combination with `addFetchInstrumentationHandler`.\n *\n * @returns Span if a span was created, otherwise void.\n */\nexport function instrumentFetchRequest(\n handlerData: HandlerDataFetch,\n shouldCreateSpan: (url: string) => boolean,\n shouldAttachHeaders: (url: string) => boolean,\n spans: Record,\n spanOriginOrOptions?: SpanOrigin | InstrumentFetchRequestOptions,\n): Span | undefined {\n if (!handlerData.fetchData) {\n return undefined;\n }\n\n const { method, url } = handlerData.fetchData;\n\n const shouldCreateSpanResult = hasSpansEnabled() && shouldCreateSpan(url);\n\n if (handlerData.endTimestamp) {\n const spanId = handlerData.fetchData.__span;\n if (!spanId) return;\n\n const span = spans[spanId];\n\n if (span) {\n // Only end the span and call hooks if we're actually recording\n if (shouldCreateSpanResult) {\n endSpan(span, handlerData);\n _callOnRequestSpanEnd(span, handlerData, spanOriginOrOptions);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-dynamic-delete\n delete spans[spanId];\n }\n\n return undefined;\n }\n\n // Backwards-compatible with the old signature. Needed to introduce the combined optional parameter\n // to avoid API breakage for anyone calling this function with the optional spanOrigin parameter\n // TODO (v11): remove this backwards-compatible code and only accept the options parameter\n const { spanOrigin = 'auto.http.browser', propagateTraceparent = false } =\n typeof spanOriginOrOptions === 'object' ? spanOriginOrOptions : { spanOrigin: spanOriginOrOptions };\n\n const client = getClient();\n const hasParent = !!getActiveSpan();\n // With span streaming, we always emit http.client spans, even without a parent span\n const shouldEmitSpan = hasParent || (!!client && hasSpanStreamingEnabled(client));\n\n const span =\n shouldCreateSpanResult && shouldEmitSpan\n ? startInactiveSpan(getSpanStartOptions(url, method, spanOrigin))\n : new SentryNonRecordingSpan();\n\n if (shouldCreateSpanResult && !shouldEmitSpan) {\n client?.recordDroppedEvent('no_parent_span', 'span');\n }\n\n handlerData.fetchData.__span = span.spanContext().spanId;\n spans[span.spanContext().spanId] = span;\n\n if (shouldAttachHeaders(handlerData.fetchData.url)) {\n const request: string | Request = handlerData.args[0];\n\n // Shallow clone the options object to avoid mutating the original user-provided object\n // Examples: users re-using same options object for multiple fetch calls, frozen objects\n const options: { [key: string]: unknown } = { ...(handlerData.args[1] || {}) };\n\n const headers = _INTERNAL_getTracingHeadersForFetchRequest(\n request,\n options,\n // If performance is disabled (TWP) or there's no active root span (pageload/navigation/interaction),\n // we do not want to use the span as base for the trace headers,\n // which means that the headers will be generated from the scope and the sampling decision is deferred\n hasSpansEnabled() && shouldEmitSpan ? span : undefined,\n propagateTraceparent,\n );\n if (headers) {\n // Ensure this is actually set, if no options have been passed previously\n handlerData.args[1] = options;\n options.headers = headers;\n }\n }\n\n if (client) {\n const fetchHint = {\n input: handlerData.args,\n response: handlerData.response,\n startTimestamp: handlerData.startTimestamp,\n endTimestamp: handlerData.endTimestamp,\n } satisfies FetchBreadcrumbHint;\n\n client.emit('beforeOutgoingRequestSpan', span, fetchHint);\n }\n\n return span;\n}\n\n/**\n * Calls the onRequestSpanEnd callback if it is defined.\n */\nexport function _callOnRequestSpanEnd(\n span: Span,\n handlerData: HandlerDataFetch,\n spanOriginOrOptions?: SpanOrigin | InstrumentFetchRequestOptions,\n): void {\n const onRequestSpanEnd =\n typeof spanOriginOrOptions === 'object' && spanOriginOrOptions !== null\n ? spanOriginOrOptions.onRequestSpanEnd\n : undefined;\n\n onRequestSpanEnd?.(span, {\n headers: handlerData.response?.headers,\n error: handlerData.error,\n });\n}\n\n/**\n * Builds merged fetch headers that include `sentry-trace` and `baggage` (and optionally `traceparent`)\n * for the given request and init, without mutating the original request or options.\n * Returns `undefined` when there is no `sentry-trace` value to attach.\n *\n * @internal Exported for cross-package instrumentation (for example Cloudflare Workers fetcher bindings)\n * and unit tests\n *\n * Baggage handling:\n * 1. No previous baggage header → include Sentry baggage\n * 2. Previous baggage has no Sentry entries → merge Sentry baggage in\n * 3. Previous baggage already has Sentry entries → leave as-is (may be user-defined)\n */\n// eslint-disable-next-line complexity -- yup it's this complicated :(\nexport function _INTERNAL_getTracingHeadersForFetchRequest(\n request: string | URL | Request,\n fetchOptionsObj: {\n headers?:\n | {\n [key: string]: string[] | string | undefined;\n }\n | PolymorphicRequestHeaders;\n },\n span?: Span,\n propagateTraceparent?: boolean,\n): PolymorphicRequestHeaders | undefined {\n const traceHeaders = getTraceData({ span, propagateTraceparent });\n const sentryTrace = traceHeaders['sentry-trace'];\n const baggage = traceHeaders.baggage;\n const traceparent = traceHeaders.traceparent;\n\n // Nothing to do, when we return undefined here, the original headers will be used\n if (!sentryTrace) {\n return undefined;\n }\n\n const originalHeaders = fetchOptionsObj.headers || (isRequest(request) ? request.headers : undefined);\n\n if (!originalHeaders) {\n return { ...traceHeaders };\n } else if (isHeaders(originalHeaders)) {\n const newHeaders = new Headers(originalHeaders);\n\n // We don't want to override manually added sentry headers\n if (!newHeaders.get('sentry-trace')) {\n newHeaders.set('sentry-trace', sentryTrace);\n }\n\n if (propagateTraceparent && traceparent && !newHeaders.get('traceparent')) {\n newHeaders.set('traceparent', traceparent);\n }\n\n if (baggage) {\n const prevBaggageHeader = newHeaders.get('baggage');\n\n if (!prevBaggageHeader) {\n newHeaders.set('baggage', baggage);\n } else if (!baggageHeaderHasSentryBaggageValues(prevBaggageHeader)) {\n newHeaders.set('baggage', `${prevBaggageHeader},${baggage}`);\n }\n }\n\n return newHeaders;\n } else if (isHeadersInitTupleArray(originalHeaders)) {\n const newHeaders = [...originalHeaders];\n\n if (!newHeaders.find(header => header[0] === 'sentry-trace')) {\n newHeaders.push(['sentry-trace', sentryTrace]);\n }\n\n if (propagateTraceparent && traceparent && !newHeaders.find(header => header[0] === 'traceparent')) {\n newHeaders.push(['traceparent', traceparent]);\n }\n\n const prevBaggageHeaderWithSentryValues = originalHeaders.find(\n header =>\n header[0] === 'baggage' && typeof header[1] === 'string' && baggageHeaderHasSentryBaggageValues(header[1]),\n );\n\n if (baggage && !prevBaggageHeaderWithSentryValues) {\n // If there are multiple entries with the same key, the browser will merge the values into a single request header.\n // Its therefore safe to simply push a \"baggage\" entry, even though there might already be another baggage header.\n newHeaders.push(['baggage', baggage]);\n }\n\n return newHeaders;\n } else {\n const existingSentryTraceHeader = 'sentry-trace' in originalHeaders ? originalHeaders['sentry-trace'] : undefined;\n const existingTraceparentHeader = 'traceparent' in originalHeaders ? originalHeaders.traceparent : undefined;\n const existingBaggageHeader = 'baggage' in originalHeaders ? originalHeaders.baggage : undefined;\n\n const newBaggageHeaders: string[] = existingBaggageHeader\n ? Array.isArray(existingBaggageHeader)\n ? [...existingBaggageHeader]\n : [existingBaggageHeader]\n : [];\n\n const prevBaggageHeaderWithSentryValues =\n existingBaggageHeader &&\n (Array.isArray(existingBaggageHeader)\n ? existingBaggageHeader.find(headerItem => baggageHeaderHasSentryBaggageValues(headerItem))\n : baggageHeaderHasSentryBaggageValues(existingBaggageHeader));\n\n if (baggage && !prevBaggageHeaderWithSentryValues) {\n newBaggageHeaders.push(baggage);\n }\n\n const newHeaders: {\n 'sentry-trace': string;\n baggage: string | undefined;\n traceparent?: string;\n } = Object.assign({}, originalHeaders, {\n 'sentry-trace': (existingSentryTraceHeader as string | undefined) ?? sentryTrace,\n baggage: newBaggageHeaders.length > 0 ? newBaggageHeaders.join(',') : undefined,\n });\n\n if (propagateTraceparent && traceparent && !existingTraceparentHeader) {\n newHeaders.traceparent = traceparent;\n }\n\n return newHeaders;\n }\n}\n\nfunction endSpan(span: Span, handlerData: HandlerDataFetch): void {\n if (handlerData.response) {\n setHttpStatus(span, handlerData.response.status);\n\n const contentLength = handlerData.response?.headers?.get('content-length');\n\n if (contentLength) {\n const contentLengthNum = parseInt(contentLength);\n if (contentLengthNum > 0) {\n span.setAttribute('http.response_content_length', contentLengthNum);\n }\n }\n } else if (handlerData.error) {\n span.setStatus({ code: SPAN_STATUS_ERROR, message: 'internal_error' });\n }\n span.end();\n}\n\nfunction baggageHeaderHasSentryBaggageValues(baggageHeader: unknown): boolean {\n if (typeof baggageHeader !== 'string') {\n return false;\n }\n\n return baggageHeader.split(',').some(baggageEntry => baggageEntry.trim().startsWith(SENTRY_BAGGAGE_KEY_PREFIX));\n}\n\nfunction isHeaders(headers: unknown): headers is Headers {\n return typeof Headers !== 'undefined' && isInstanceOf(headers, Headers);\n}\n\n/** `HeadersInit` array form: each entry is a [name, value] pair of strings. */\nfunction isHeadersInitTupleArray(headers: unknown): headers is [string, unknown][] {\n if (!Array.isArray(headers)) {\n return false;\n }\n\n return headers.every(\n (item): item is [string, unknown] => Array.isArray(item) && item.length === 2 && typeof item[0] === 'string',\n );\n}\n\nfunction getSpanStartOptions(\n url: string,\n method: string,\n spanOrigin: SpanOrigin,\n): Parameters[0] {\n // Data URLs need special handling because parseStringToURLObject treats them as \"relative\"\n // (no \"://\"), causing getSanitizedUrlStringFromUrlObject to return just the pathname\n // without the \"data:\" prefix, making later stripDataUrlContent calls ineffective.\n // So for data URLs, we strip the content first and use that directly.\n if (url.startsWith('data:')) {\n const sanitizedUrl = stripDataUrlContent(url);\n return {\n name: `${method} ${sanitizedUrl}`,\n attributes: getFetchSpanAttributes(url, undefined, method, spanOrigin),\n };\n }\n\n const parsedUrl = parseStringToURLObject(url);\n const sanitizedUrl = parsedUrl ? getSanitizedUrlStringFromUrlObject(parsedUrl) : url;\n return {\n name: `${method} ${sanitizedUrl}`,\n attributes: getFetchSpanAttributes(url, parsedUrl, method, spanOrigin),\n };\n}\n\nfunction getFetchSpanAttributes(\n url: string,\n parsedUrl: ReturnType,\n method: string,\n spanOrigin: SpanOrigin,\n): SpanAttributes {\n const attributes: SpanAttributes = {\n url: stripDataUrlContent(url),\n type: 'fetch',\n 'http.method': method,\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: spanOrigin,\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'http.client',\n };\n if (parsedUrl) {\n if (!isURLObjectRelative(parsedUrl)) {\n attributes['http.url'] = stripDataUrlContent(parsedUrl.href);\n attributes['server.address'] = parsedUrl.host;\n }\n if (parsedUrl.search) {\n attributes['http.query'] = parsedUrl.search;\n }\n if (parsedUrl.hash) {\n attributes['http.fragment'] = parsedUrl.hash;\n }\n }\n return attributes;\n}\n"],"names":["span","sanitizedUrl"],"mappings":"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"}