@@ -9,9 +9,20 @@ import {
99} from '@sentry/types' ;
1010import { logger } from '@sentry/utils/logger' ;
1111import { getGlobalObject , uuid4 } from '@sentry/utils/misc' ;
12+ import * as domain from 'domain' ;
1213import { Carrier , Layer } from './interfaces' ;
1314import { Scope } from './scope' ;
1415
16+ declare module 'domain' {
17+ export let active : Domain ;
18+ /**
19+ * Extension for domain interface
20+ */
21+ export interface Domain {
22+ __SENTRY__ ?: Carrier ;
23+ }
24+ }
25+
1526/**
1627 * API compatibility version of this hub.
1728 *
@@ -291,26 +302,21 @@ export function getMainCarrier(): Carrier {
291302 carrier . __SENTRY__ = carrier . __SENTRY__ || {
292303 hub : undefined ,
293304 } ;
294- return carrier . __SENTRY__ ;
305+ return carrier ;
295306}
296307
297308/**
298309 * Replaces the current main hub with the passed one on the global object
299310 *
300311 * @returns The old replaced hub
301312 */
302- export function makeMain ( hub ? : Hub ) : Hub | undefined {
313+ export function makeMain ( hub : Hub ) : Hub {
303314 const registry = getMainCarrier ( ) ;
304- const oldHub = registry . hub ;
305- registry . hub = hub ;
315+ const oldHub = getHubFromCarrier ( registry ) ;
316+ setHubOnCarrier ( registry , hub ) ;
306317 return oldHub ;
307318}
308319
309- /** Domain interface with attached Hub */
310- interface SentryDomain extends NodeJS . Domain {
311- __SENTRY__ ?: Carrier ;
312- }
313-
314320/**
315321 * Returns the default hub instance.
316322 *
@@ -319,26 +325,46 @@ interface SentryDomain extends NodeJS.Domain {
319325 * Otherwise, the currently registered hub will be returned.
320326 */
321327export function getCurrentHub ( ) : Hub {
328+ // Get main carrier (global for every environment)
322329 const registry = getMainCarrier ( ) ;
323330
324- if ( ! registry . hub || registry . hub . isOlderThan ( API_VERSION ) ) {
325- registry . hub = new Hub ( ) ;
331+ // If there's no hub, or its an old API, assign a new one
332+ if ( ! hasHubOnCarrier ( registry ) || getHubFromCarrier ( registry ) . isOlderThan ( API_VERSION ) ) {
333+ setHubOnCarrier ( registry , new Hub ( ) ) ;
326334 }
327335
336+ // Prefer domains over global if they are there
328337 try {
329- const domain = process . domain as SentryDomain ;
338+ const activeDomain = domain . active ;
330339
331- if ( ! domain . __SENTRY__ ) {
332- return registry . hub ;
340+ // If there no active domain, just return global hub
341+ if ( ! activeDomain ) {
342+ return getHubFromCarrier ( registry ) ;
333343 }
334344
335- if ( ! domain . __SENTRY__ . hub || domain . __SENTRY__ . hub . isOlderThan ( API_VERSION ) ) {
336- domain . __SENTRY__ . hub = new Hub ( registry . hub . getStackTop ( ) . client , Scope . clone ( registry . hub . getStackTop ( ) . scope ) ) ;
345+ // If there's no hub on current domain, or its an old API, assign a new one
346+ if ( ! hasHubOnCarrier ( activeDomain ) || getHubFromCarrier ( activeDomain ) . isOlderThan ( API_VERSION ) ) {
347+ const registryHubTopStack = getHubFromCarrier ( registry ) . getStackTop ( ) ;
348+ setHubOnCarrier ( activeDomain , new Hub ( registryHubTopStack . client , Scope . clone ( registryHubTopStack . scope ) ) ) ;
337349 }
338350
339- return domain . __SENTRY__ . hub ;
351+ // Return hub that lives on a domain
352+ return getHubFromCarrier ( activeDomain ) ;
340353 } catch ( _Oo ) {
341- return registry . hub ;
354+ // Return hub that lives on a global object
355+ return getHubFromCarrier ( registry ) ;
356+ }
357+ }
358+
359+ /**
360+ * This will tell whether a carrier has a hub on it or not
361+ * @param carrier object
362+ */
363+ export function hasHubOnCarrier ( carrier : any ) : boolean {
364+ if ( carrier && carrier . __SENTRY__ && carrier . __SENTRY__ . hub ) {
365+ return true ;
366+ } else {
367+ return false ;
342368 }
343369}
344370
0 commit comments