{"version":3,"file":"W3CTraceContextPropagator.cjs","names":["trace","isTracingSuppressed","isSpanContextValid","TraceFlags","TraceState"],"sources":["../../src/trace/W3CTraceContextPropagator.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n  Context,\n  SpanContext,\n  TextMapGetter,\n  TextMapPropagator,\n  TextMapSetter,\n} from '@opentelemetry/api';\nimport { isSpanContextValid, trace, TraceFlags } from '@opentelemetry/api';\nimport { isTracingSuppressed } from './suppress-tracing';\nimport { TraceState } from './TraceState';\n\nexport const TRACE_PARENT_HEADER = 'traceparent';\nexport const TRACE_STATE_HEADER = 'tracestate';\n\nconst VERSION = '00';\nconst VERSION_PART = '(?!ff)[\\\\da-f]{2}';\nconst TRACE_ID_PART = '(?![0]{32})[\\\\da-f]{32}';\nconst PARENT_ID_PART = '(?![0]{16})[\\\\da-f]{16}';\nconst FLAGS_PART = '[\\\\da-f]{2}';\nconst TRACE_PARENT_REGEX = new RegExp(\n  `^\\\\s?(${VERSION_PART})-(${TRACE_ID_PART})-(${PARENT_ID_PART})-(${FLAGS_PART})(-.*)?\\\\s?$`\n);\n\n/**\n * Parses information from the [traceparent] span tag and converts it into {@link SpanContext}\n * @param traceParent - A meta property that comes from server.\n *     It should be dynamically generated server side to have the server's request trace Id,\n *     a parent span Id that was set on the server's request span,\n *     and the trace flags to indicate the server's sampling decision\n *     (01 = sampled, 00 = not sampled).\n *     for example: '{version}-{traceId}-{spanId}-{sampleDecision}'\n *     For more information see {@link https://www.w3.org/TR/trace-context/}\n */\nexport function parseTraceParent(traceParent: string): SpanContext | null {\n  const match = TRACE_PARENT_REGEX.exec(traceParent);\n  if (!match) return null;\n\n  // According to the specification the implementation should be compatible\n  // with future versions. If there are more parts, we only reject it if it's using version 00\n  // See https://www.w3.org/TR/trace-context/#versioning-of-traceparent\n  if (match[1] === '00' && match[5]) return null;\n\n  return {\n    traceId: match[2],\n    spanId: match[3],\n    traceFlags: parseInt(match[4], 16),\n  };\n}\n\n/**\n * Propagates {@link SpanContext} through Trace Context format propagation.\n *\n * Based on the Trace Context specification:\n * https://www.w3.org/TR/trace-context/\n */\nexport class W3CTraceContextPropagator implements TextMapPropagator {\n  inject(context: Context, carrier: unknown, setter: TextMapSetter): void {\n    const spanContext = trace.getSpanContext(context);\n    if (\n      !spanContext ||\n      isTracingSuppressed(context) ||\n      !isSpanContextValid(spanContext)\n    )\n      return;\n\n    const traceParent = `${VERSION}-${spanContext.traceId}-${\n      spanContext.spanId\n    }-0${Number(spanContext.traceFlags || TraceFlags.NONE).toString(16)}`;\n\n    setter.set(carrier, TRACE_PARENT_HEADER, traceParent);\n    if (spanContext.traceState) {\n      setter.set(\n        carrier,\n        TRACE_STATE_HEADER,\n        spanContext.traceState.serialize()\n      );\n    }\n  }\n\n  extract(context: Context, carrier: unknown, getter: TextMapGetter): Context {\n    const traceParentHeader = getter.get(carrier, TRACE_PARENT_HEADER);\n    if (!traceParentHeader) return context;\n    const traceParent = Array.isArray(traceParentHeader)\n      ? traceParentHeader[0]\n      : traceParentHeader;\n    if (typeof traceParent !== 'string') return context;\n    const spanContext = parseTraceParent(traceParent);\n    if (!spanContext) return context;\n\n    spanContext.isRemote = true;\n\n    const traceStateHeader = getter.get(carrier, TRACE_STATE_HEADER);\n    if (traceStateHeader) {\n      // If more than one `tracestate` header is found, we merge them into a\n      // single header.\n      const state = Array.isArray(traceStateHeader)\n        ? traceStateHeader.join(',')\n        : traceStateHeader;\n      spanContext.traceState = new TraceState(\n        typeof state === 'string' ? state : undefined\n      );\n    }\n    return trace.setSpanContext(context, spanContext);\n  }\n\n  fields(): string[] {\n    return [TRACE_PARENT_HEADER, TRACE_STATE_HEADER];\n  }\n}\n"],"mappings":";;;;AAgBA,MAAa,sBAAsB;AACnC,MAAa,qBAAqB;AAElC,MAAM,UAAU;AAKhB,MAAM,qBAAqB,IAAI,OAC7B,uGACF;;;;;;;;;;;AAYA,SAAgB,iBAAiB,aAAyC;CACxE,MAAM,QAAQ,mBAAmB,KAAK,WAAW;CACjD,IAAI,CAAC,OAAO,OAAO;CAKnB,IAAI,MAAM,OAAO,QAAQ,MAAM,IAAI,OAAO;CAE1C,OAAO;EACL,SAAS,MAAM;EACf,QAAQ,MAAM;EACd,YAAY,SAAS,MAAM,IAAI,EAAE;CACnC;AACF;;;;;;;AAQA,IAAa,4BAAb,MAAoE;CAClE,OAAO,SAAkB,SAAkB,QAA6B;EACtE,MAAM,cAAcA,mBAAAA,MAAM,eAAe,OAAO;EAChD,IACE,CAAC,eACDC,yBAAAA,oBAAoB,OAAO,KAC3B,EAAA,GAACC,mBAAAA,mBAAAA,CAAmB,WAAW,GAE/B;EAEF,MAAM,cAAc,GAAG,QAAQ,GAAG,YAAY,QAAQ,GACpD,YAAY,OACb,IAAI,OAAO,YAAY,cAAcC,mBAAAA,WAAW,IAAI,CAAC,CAAC,SAAS,EAAE;EAElE,OAAO,IAAI,SAAS,qBAAqB,WAAW;EACpD,IAAI,YAAY,YACd,OAAO,IACL,SACA,oBACA,YAAY,WAAW,UAAU,CACnC;CAEJ;CAEA,QAAQ,SAAkB,SAAkB,QAAgC;EAC1E,MAAM,oBAAoB,OAAO,IAAI,SAAS,mBAAmB;EACjE,IAAI,CAAC,mBAAmB,OAAO;EAC/B,MAAM,cAAc,MAAM,QAAQ,iBAAiB,IAC/C,kBAAkB,KAClB;EACJ,IAAI,OAAO,gBAAgB,UAAU,OAAO;EAC5C,MAAM,cAAc,iBAAiB,WAAW;EAChD,IAAI,CAAC,aAAa,OAAO;EAEzB,YAAY,WAAW;EAEvB,MAAM,mBAAmB,OAAO,IAAI,SAAS,kBAAkB;EAC/D,IAAI,kBAAkB;GAGpB,MAAM,QAAQ,MAAM,QAAQ,gBAAgB,IACxC,iBAAiB,KAAK,GAAG,IACzB;GACJ,YAAY,aAAa,IAAIC,mBAAAA,WAC3B,OAAO,UAAU,WAAW,QAAQ,KAAA,CACtC;EACF;EACA,OAAOJ,mBAAAA,MAAM,eAAe,SAAS,WAAW;CAClD;CAEA,SAAmB;EACjB,OAAO,CAAC,qBAAqB,kBAAkB;CACjD;AACF"}