diff --git a/packages/core/src/carrier.ts b/packages/core/src/carrier.ts index 2b67df90b6a3..4f84f1d48a5f 100644 --- a/packages/core/src/carrier.ts +++ b/packages/core/src/carrier.ts @@ -13,7 +13,7 @@ export interface Carrier { __SENTRY__?: VersionedCarrier; } -export type VersionedCarrier = { +type VersionedCarrier = { version?: string; } & Record, SentryCarrier>; @@ -57,3 +57,23 @@ export function getSentryCarrier(carrier: Carrier): SentryCarrier { // rather than what's set in .version so that "this" SDK always gets its carrier return (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {}); } + +/** + * Returns a global singleton contained in the global `__SENTRY__[]` object. + * + * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory + * function and added to the `__SENTRY__` object. + * + * @param name name of the global singleton on __SENTRY__ + * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__` + * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value + * @returns the singleton + */ +export function getGlobalSingleton( + name: Prop, + creator: () => NonNullable, + obj = GLOBAL_OBJ, +): NonNullable { + const carrier = getSentryCarrier(obj); + return carrier[name] || (carrier[name] = creator()); +} diff --git a/packages/core/src/currentScopes.ts b/packages/core/src/currentScopes.ts index 85b148738467..b339a9f6d4cf 100644 --- a/packages/core/src/currentScopes.ts +++ b/packages/core/src/currentScopes.ts @@ -1,9 +1,9 @@ import { getAsyncContextStrategy } from './asyncContext'; import { getMainCarrier } from './carrier'; +import { getGlobalSingleton } from './carrier'; import { Scope as ScopeClass } from './scope'; import type { Client, Scope, TraceContext } from './types-hoist'; import { dropUndefinedKeys } from './utils-hoist/object'; -import { getGlobalSingleton } from './utils-hoist/worldwide'; /** * Get the currently active scope. diff --git a/packages/core/src/defaultScopes.ts b/packages/core/src/defaultScopes.ts index c9fb32c2049e..581eef68aff1 100644 --- a/packages/core/src/defaultScopes.ts +++ b/packages/core/src/defaultScopes.ts @@ -1,6 +1,6 @@ +import { getGlobalSingleton } from './carrier'; import { Scope as ScopeClass } from './scope'; import type { Scope } from './types-hoist'; -import { getGlobalSingleton } from './utils-hoist/worldwide'; /** Get the default current scope. */ export function getDefaultCurrentScope(): Scope { diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts index 77259d2434d4..efaa6a12a675 100644 --- a/packages/core/src/index.ts +++ b/packages/core/src/index.ts @@ -45,7 +45,7 @@ export { getDefaultIsolationScope, } from './defaultScopes'; export { setAsyncContextStrategy } from './asyncContext'; -export { getMainCarrier } from './carrier'; +export { getGlobalSingleton, getMainCarrier } from './carrier'; export { makeSession, closeSession, updateSession } from './session'; // eslint-disable-next-line deprecation/deprecation export { SessionFlusher } from './sessionflusher'; diff --git a/packages/core/src/metrics/exports.ts b/packages/core/src/metrics/exports.ts index 6d25b0522d4f..03d2ef90efe8 100644 --- a/packages/core/src/metrics/exports.ts +++ b/packages/core/src/metrics/exports.ts @@ -1,10 +1,10 @@ +import { getGlobalSingleton } from '../carrier'; import { getClient } from '../currentScopes'; import { DEBUG_BUILD } from '../debug-build'; import { startSpanManual } from '../tracing'; import type { Client, DurationUnit, MetricData, MetricsAggregator as MetricsAggregatorInterface } from '../types-hoist'; import { logger } from '../utils-hoist/logger'; import { timestampInSeconds } from '../utils-hoist/time'; -import { getGlobalSingleton } from '../utils-hoist/worldwide'; import { handleCallbackErrors } from '../utils/handleCallbackErrors'; import { getActiveSpan, getRootSpan, spanToJSON } from '../utils/spanUtils'; import { COUNTER_METRIC_TYPE, DISTRIBUTION_METRIC_TYPE, GAUGE_METRIC_TYPE, SET_METRIC_TYPE } from './constants'; diff --git a/packages/core/src/utils-hoist/index.ts b/packages/core/src/utils-hoist/index.ts index befb934905a2..a9048037e345 100644 --- a/packages/core/src/utils-hoist/index.ts +++ b/packages/core/src/utils-hoist/index.ts @@ -5,7 +5,7 @@ export { getBreadcrumbLogLevelFromHttpStatusCode } from './breadcrumb-log-level' export { getComponentName, getDomElement, getLocationHref, htmlTreeAsString } from './browser'; export { dsnFromString, dsnToString, makeDsn } from './dsn'; export { SentryError } from './error'; -export { GLOBAL_OBJ, getGlobalSingleton } from './worldwide'; +export { GLOBAL_OBJ } from './worldwide'; export type { InternalGlobal } from './worldwide'; export { addConsoleInstrumentationHandler } from './instrument/console'; export { addFetchEndInstrumentationHandler, addFetchInstrumentationHandler } from './instrument/fetch'; diff --git a/packages/core/src/utils-hoist/logger.ts b/packages/core/src/utils-hoist/logger.ts index 57b901118cff..ee642d44582d 100644 --- a/packages/core/src/utils-hoist/logger.ts +++ b/packages/core/src/utils-hoist/logger.ts @@ -1,7 +1,7 @@ +import { getGlobalSingleton } from '../carrier'; import type { ConsoleLevel } from '../types-hoist'; - import { DEBUG_BUILD } from './debug-build'; -import { GLOBAL_OBJ, getGlobalSingleton } from './worldwide'; +import { GLOBAL_OBJ } from './worldwide'; /** Prefix for logging strings */ const PREFIX = 'Sentry Logger '; diff --git a/packages/core/src/utils-hoist/worldwide.ts b/packages/core/src/utils-hoist/worldwide.ts index dcb8bde2c20a..cd88db09942c 100644 --- a/packages/core/src/utils-hoist/worldwide.ts +++ b/packages/core/src/utils-hoist/worldwide.ts @@ -12,9 +12,8 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import type { Carrier, SentryCarrier, VersionedCarrier } from '../carrier'; +import type { Carrier } from '../carrier'; import type { SdkSource } from './env'; -import { SDK_VERSION } from './version'; /** Internal global with common properties and Sentry extensions */ export type InternalGlobal = { @@ -53,32 +52,3 @@ export type InternalGlobal = { /** Get's the global object for the current JavaScript runtime */ export const GLOBAL_OBJ = globalThis as unknown as InternalGlobal; - -/** - * Returns a global singleton contained in the global `__SENTRY__[]` object. - * - * If the singleton doesn't already exist in `__SENTRY__`, it will be created using the given factory - * function and added to the `__SENTRY__` object. - * - * @param name name of the global singleton on __SENTRY__ - * @param creator creator Factory function to create the singleton if it doesn't already exist on `__SENTRY__` - * @param obj (Optional) The global object on which to look for `__SENTRY__`, if not `GLOBAL_OBJ`'s return value - * @returns the singleton - */ -export function getGlobalSingleton( - name: Prop, - creator: () => NonNullable, - obj = GLOBAL_OBJ, -): NonNullable { - const __SENTRY__ = getSentryCarrierObj(obj); - const versionedCarrier = (__SENTRY__[SDK_VERSION] = __SENTRY__[SDK_VERSION] || {}); - - return versionedCarrier[name] || (versionedCarrier[name] = creator()); -} - -function getSentryCarrierObj( - obj: Omit & Partial>, -): VersionedCarrier { - // Set the Sentry carrier, if it does not exist yet - return obj.__SENTRY__ || (obj.__SENTRY__ = {}); -}