{"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-hoist/breadcrumb';\nimport type { HandlerDataFetch } from './types-hoist/instrument';\nimport type { ResponseHookInfo } from './types-hoist/request';\nimport type { Span, SpanAttributes, SpanOrigin } from './types-hoist/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<string, unknown>\n  | Array<[string, unknown]>\n  | Iterable<Iterable<unknown>>\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<string, Span>,\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<string, Span>,\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<string, Span>,\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<typeof startInactiveSpan>[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<typeof parseStringToURLObject>,\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":[],"mappings":"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"}