{"version":3,"file":"composite.mjs","names":[],"sources":["../../src/propagation/composite.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type {\n  Context,\n  TextMapGetter,\n  TextMapPropagator,\n  TextMapSetter,\n} from '@opentelemetry/api';\nimport { diag } from '@opentelemetry/api';\n\n/** Configuration object for composite propagator */\nexport interface CompositePropagatorConfig {\n  /**\n   * List of propagators to run. Propagators run in the\n   * list order. If a propagator later in the list writes the same context\n   * key as a propagator earlier in the list, the later on will \"win\".\n   */\n  propagators?: TextMapPropagator[];\n}\n\n/** Combines multiple propagators into a single propagator. */\nexport class CompositePropagator implements TextMapPropagator {\n  private readonly _propagators: TextMapPropagator[];\n  private readonly _fields: string[];\n\n  /**\n   * Construct a composite propagator from a list of propagators.\n   *\n   * @param [config] Configuration object for composite propagator\n   */\n  constructor(config: CompositePropagatorConfig = {}) {\n    this._propagators = config.propagators ?? [];\n\n    const fields = new Set<string>();\n    for (const propagator of this._propagators) {\n      // older propagators may not have fields function, null check to be sure\n      const propagatorFields =\n        typeof propagator.fields === 'function' ? propagator.fields() : [];\n      for (const field of propagatorFields) {\n        fields.add(field);\n      }\n    }\n    this._fields = Array.from(fields);\n  }\n\n  /**\n   * Run each of the configured propagators with the given context and carrier.\n   * Propagators are run in the order they are configured, so if multiple\n   * propagators write the same carrier key, the propagator later in the list\n   * will \"win\".\n   *\n   * @param context Context to inject\n   * @param carrier Carrier into which context will be injected\n   */\n  inject(context: Context, carrier: unknown, setter: TextMapSetter): void {\n    for (const propagator of this._propagators) {\n      try {\n        propagator.inject(context, carrier, setter);\n      } catch (err) {\n        diag.warn(\n          `Failed to inject with ${propagator.constructor.name}. Err: ${err.message}`\n        );\n      }\n    }\n  }\n\n  /**\n   * Run each of the configured propagators with the given context and carrier.\n   * Propagators are run in the order they are configured, so if multiple\n   * propagators write the same context key, the propagator later in the list\n   * will \"win\".\n   *\n   * @param context Context to add values to\n   * @param carrier Carrier from which to extract context\n   */\n  extract(context: Context, carrier: unknown, getter: TextMapGetter): Context {\n    return this._propagators.reduce((ctx, propagator) => {\n      try {\n        return propagator.extract(ctx, carrier, getter);\n      } catch (err) {\n        diag.warn(\n          `Failed to extract with ${propagator.constructor.name}. Err: ${err.message}`\n        );\n      }\n      return ctx;\n    }, context);\n  }\n\n  fields(): string[] {\n    // return a new array so our fields cannot be modified\n    return this._fields.slice();\n  }\n}\n"],"mappings":";;;AAwBA,IAAa,sBAAb,MAA8D;CAC5D;CACA;;;;;;CAOA,YAAY,SAAoC,CAAC,GAAG;EAClD,KAAK,eAAe,OAAO,eAAe,CAAC;EAE3C,MAAM,yBAAS,IAAI,IAAY;EAC/B,KAAK,MAAM,cAAc,KAAK,cAAc;GAE1C,MAAM,mBACJ,OAAO,WAAW,WAAW,aAAa,WAAW,OAAO,IAAI,CAAC;GACnE,KAAK,MAAM,SAAS,kBAClB,OAAO,IAAI,KAAK;EAEpB;EACA,KAAK,UAAU,MAAM,KAAK,MAAM;CAClC;;;;;;;;;;CAWA,OAAO,SAAkB,SAAkB,QAA6B;EACtE,KAAK,MAAM,cAAc,KAAK,cAC5B,IAAI;GACF,WAAW,OAAO,SAAS,SAAS,MAAM;EAC5C,SAAS,KAAK;GACZ,KAAK,KACH,yBAAyB,WAAW,YAAY,KAAK,SAAS,IAAI,SACpE;EACF;CAEJ;;;;;;;;;;CAWA,QAAQ,SAAkB,SAAkB,QAAgC;EAC1E,OAAO,KAAK,aAAa,QAAQ,KAAK,eAAe;GACnD,IAAI;IACF,OAAO,WAAW,QAAQ,KAAK,SAAS,MAAM;GAChD,SAAS,KAAK;IACZ,KAAK,KACH,0BAA0B,WAAW,YAAY,KAAK,SAAS,IAAI,SACrE;GACF;GACA,OAAO;EACT,GAAG,OAAO;CACZ;CAEA,SAAmB;EAEjB,OAAO,KAAK,QAAQ,MAAM;CAC5B;AACF"}