@opentelemetry/api
Version:
Public API for OpenTelemetry
1 lines • 5.11 kB
Source Map (JSON)
{"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"}