{"version":3,"file":"global-utils.mjs","names":[],"sources":["../../src/internal/global-utils.ts"],"sourcesContent":["/*\n * Copyright The OpenTelemetry Authors\n * SPDX-License-Identifier: Apache-2.0\n */\n\nimport type { MeterProvider } from '../metrics/MeterProvider';\nimport type { LoggerProvider } from '../logs/LoggerProvider';\nimport type { ContextManager } from '../context/types';\nimport type { DiagLogger } from '../diag/types';\nimport type { TextMapPropagator } from '../propagation/TextMapPropagator';\nimport type { TracerProvider } from '../trace/tracer_provider';\nimport { VERSION } from '../version';\nimport { isCompatible } from './semver';\n\nconst major = VERSION.split('.')[0];\nconst GLOBAL_OPENTELEMETRY_API_KEY = Symbol.for(\n  `opentelemetry.js.api.${major}`\n);\n\ndeclare const self: unknown;\ndeclare const window: unknown;\ndeclare const global: unknown;\n\nconst _global = (\n  typeof globalThis === 'object'\n    ? globalThis\n    : typeof self === 'object'\n      ? self\n      : typeof window === 'object'\n        ? window\n        : typeof global === 'object'\n          ? global\n          : {}\n) as OTelGlobal;\n\nfunction _makeGlobalApi(): OTelGlobalAPI {\n  // The version property is sealed (non-writable, non-configurable) so it stays\n  // constant for the api object's lifetime. getGlobal caches its compatibility\n  // check per api-object identity and relies on that invariant.\n  return Object.defineProperty({} as OTelGlobalAPI, 'version', {\n    value: VERSION,\n    enumerable: true,\n    writable: false,\n    configurable: false,\n  });\n}\n\nexport function registerGlobal<Type extends keyof OTelGlobalAPI>(\n  type: Type,\n  instance: OTelGlobalAPI[Type],\n  diag: DiagLogger,\n  allowOverride = false\n): boolean {\n  const api = (_global[GLOBAL_OPENTELEMETRY_API_KEY] =\n    _global[GLOBAL_OPENTELEMETRY_API_KEY] ?? _makeGlobalApi());\n\n  if (!allowOverride && api[type]) {\n    // already registered an API of this type\n    const err = new Error(\n      `@opentelemetry/api: Attempted duplicate registration of API: ${type}`\n    );\n    diag.error(err.stack || err.message);\n    return false;\n  }\n\n  if (api.version !== VERSION) {\n    // All registered APIs must be of the same version exactly\n    const err = new Error(\n      `@opentelemetry/api: Registration of version v${api.version} for ${type} does not match previously registered API v${VERSION}`\n    );\n    diag.error(err.stack || err.message);\n    return false;\n  }\n\n  api[type] = instance;\n  diag.debug(\n    `@opentelemetry/api: Registered a global for ${type} v${VERSION}.`\n  );\n\n  return true;\n}\n\n// The api object whose compatibility has already been verified. Its version is\n// sealed at registerGlobal, so a full compatibility check is only needed when\n// the object identity changes, letting the steady-state hot path skip it.\nlet _compatibleGlobalApi: OTelGlobalAPI | undefined;\n\nexport function getGlobal<Type extends keyof OTelGlobalAPI>(\n  type: Type\n): OTelGlobalAPI[Type] | undefined {\n  const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n  if (api == null) {\n    return;\n  }\n  if (api !== _compatibleGlobalApi) {\n    // A new api object has been registered since the last time we checked, so\n    // verify its compatibility again.\n    if (!api.version || !isCompatible(api.version)) {\n      return;\n    }\n    _compatibleGlobalApi = api;\n  }\n  return api[type];\n}\n\nexport function unregisterGlobal(type: keyof OTelGlobalAPI, diag: DiagLogger) {\n  diag.debug(\n    `@opentelemetry/api: Unregistering a global for ${type} v${VERSION}.`\n  );\n  const api = _global[GLOBAL_OPENTELEMETRY_API_KEY];\n\n  if (api) {\n    delete api[type];\n  }\n}\n\ntype OTelGlobal = {\n  [GLOBAL_OPENTELEMETRY_API_KEY]?: OTelGlobalAPI;\n};\n\ntype OTelGlobalAPI = {\n  version: string;\n\n  diag?: DiagLogger;\n  trace?: TracerProvider;\n  context?: ContextManager;\n  metrics?: MeterProvider;\n  logs?: LoggerProvider;\n  propagation?: TextMapPropagator;\n};\n"],"mappings":";;;AAcA,MAAM,QAAQ,QAAQ,MAAM,GAAG,CAAC,CAAC;AACjC,MAAM,+BAA+B,OAAO,IAC1C,wBAAwB,OAC1B;AAMA,MAAM,UACJ,OAAO,eAAe,WAClB,aACA,OAAO,SAAS,WACd,OACA,OAAO,WAAW,WAChB,SACA,OAAO,WAAW,WAChB,SACA,CAAC;AAGb,SAAS,iBAAgC;CAIvC,OAAO,OAAO,eAAe,CAAC,GAAoB,WAAW;EAC3D,OAAO;EACP,YAAY;EACZ,UAAU;EACV,cAAc;CAChB,CAAC;AACH;AAEA,SAAgB,eACd,MACA,UACA,MACA,gBAAgB,OACP;;CACT,MAAM,MAAO,QAAQ,iCAAA,wBACnB,QAAQ,mCAAA,QAAA,0BAAA,KAAA,IAAA,wBAAiC,eAAe;CAE1D,IAAI,CAAC,iBAAiB,IAAI,OAAO;EAE/B,MAAM,sBAAM,IAAI,MACd,gEAAgE,MAClE;EACA,KAAK,MAAM,IAAI,SAAS,IAAI,OAAO;EACnC,OAAO;CACT;CAEA,IAAI,IAAI,YAAA,UAAqB;EAE3B,MAAM,sBAAM,IAAI,MACd,gDAAgD,IAAI,QAAQ,OAAO,KAAK,6CAA6C,SACvH;EACA,KAAK,MAAM,IAAI,SAAS,IAAI,OAAO;EACnC,OAAO;CACT;CAEA,IAAI,QAAQ;CACZ,KAAK,MACH,+CAA+C,KAAK,IAAI,QAAQ,EAClE;CAEA,OAAO;AACT;AAKA,IAAI;AAEJ,SAAgB,UACd,MACiC;CACjC,MAAM,MAAM,QAAQ;CACpB,IAAI,OAAO,MACT;CAEF,IAAI,QAAQ,sBAAsB;EAGhC,IAAI,CAAC,IAAI,WAAW,CAAC,aAAa,IAAI,OAAO,GAC3C;EAEF,uBAAuB;CACzB;CACA,OAAO,IAAI;AACb;AAEA,SAAgB,iBAAiB,MAA2B,MAAkB;CAC5E,KAAK,MACH,kDAAkD,KAAK,IAAI,QAAQ,EACrE;CACA,MAAM,MAAM,QAAQ;CAEpB,IAAI,KACF,OAAO,IAAI;AAEf"}