@@ -19,15 +19,7 @@ import type {
19
19
TransactionContext ,
20
20
User ,
21
21
} from '@sentry/types' ;
22
- import {
23
- GLOBAL_OBJ ,
24
- consoleSandbox ,
25
- dateTimestampInSeconds ,
26
- getGlobalSingleton ,
27
- isThenable ,
28
- logger ,
29
- uuid4 ,
30
- } from '@sentry/utils' ;
22
+ import { GLOBAL_OBJ , consoleSandbox , dateTimestampInSeconds , isThenable , logger , uuid4 } from '@sentry/utils' ;
31
23
32
24
import { DEFAULT_ENVIRONMENT } from './constants' ;
33
25
import { DEBUG_BUILD } from './debug-build' ;
@@ -86,21 +78,41 @@ export interface Layer {
86
78
* @hidden
87
79
*/
88
80
export interface Carrier {
89
- __SENTRY__ ?: {
90
- hub ?: Hub ;
91
- acs ?: AsyncContextStrategy ;
92
- /**
93
- * Extra Hub properties injected by various SDKs
94
- */
95
- integrations ?: Integration [ ] ;
96
- extensions ?: {
97
- /** Extension methods for the hub, which are bound to the current Hub instance */
98
- // eslint-disable-next-line @typescript-eslint/ban-types
99
- [ key : string ] : Function ;
100
- } ;
81
+ __SENTRY__ ?: SentryCarrier ;
82
+ }
83
+
84
+ type CreateHub = ( ...options : ConstructorParameters < typeof Hub > ) => Hub ;
85
+
86
+ interface SentryCarrier {
87
+ hub ?: Hub ;
88
+ createHub ?: CreateHub ;
89
+ acs ?: AsyncContextStrategy ;
90
+ /**
91
+ * Extra Hub properties injected by various SDKs
92
+ */
93
+ integrations ?: Integration [ ] ;
94
+ extensions ?: {
95
+ /** Extension methods for the hub, which are bound to the current Hub instance */
96
+ // eslint-disable-next-line @typescript-eslint/ban-types
97
+ [ key : string ] : Function ;
101
98
} ;
102
99
}
103
100
101
+ /**
102
+ * Create a hub. If a custom `createHub` is registered on the main carrier, use that instead.
103
+ * This only exists to make POTEL migration easier.
104
+ */
105
+ function createHub ( ...options : ConstructorParameters < typeof Hub > ) : Hub {
106
+ const carrier = getMainCarrier ( ) ;
107
+ const sentry = getSentryCarrier ( carrier ) ;
108
+
109
+ if ( sentry . createHub ) {
110
+ return sentry . createHub ( ...options ) ;
111
+ }
112
+
113
+ return new Hub ( ...options ) ;
114
+ }
115
+
104
116
/**
105
117
* @inheritDoc
106
118
*/
@@ -663,8 +675,8 @@ Sentry.init({...});
663
675
// eslint-disable-next-line @typescript-eslint/no-explicit-any
664
676
private _callExtensionMethod < T > ( method : string , ...args : any [ ] ) : T {
665
677
const carrier = getMainCarrier ( ) ;
666
- const sentry = carrier . __SENTRY__ ;
667
- if ( sentry && sentry . extensions && typeof sentry . extensions [ method ] === 'function' ) {
678
+ const sentry = getSentryCarrier ( carrier ) ;
679
+ if ( sentry . extensions && typeof sentry . extensions [ method ] === 'function' ) {
668
680
return sentry . extensions [ method ] . apply ( this , args ) ;
669
681
}
670
682
DEBUG_BUILD && logger . warn ( `Extension method ${ method } couldn't be found, doing nothing.` ) ;
@@ -679,10 +691,8 @@ Sentry.init({...});
679
691
* at the call-site. We always access the carrier through this function, so we can guarantee that `__SENTRY__` is there.
680
692
**/
681
693
export function getMainCarrier ( ) : Carrier {
682
- GLOBAL_OBJ . __SENTRY__ = GLOBAL_OBJ . __SENTRY__ || {
683
- extensions : { } ,
684
- hub : undefined ,
685
- } ;
694
+ // This ensures a Sentry carrier exists
695
+ getSentryCarrier ( GLOBAL_OBJ ) ;
686
696
return GLOBAL_OBJ ;
687
697
}
688
698
@@ -711,18 +721,19 @@ export function makeMain(hub: Hub): Hub {
711
721
*/
712
722
export function getCurrentHub ( ) : Hub {
713
723
// Get main carrier (global for every environment)
714
- const registry = getMainCarrier ( ) ;
724
+ const carrier = getMainCarrier ( ) ;
725
+ const sentry = getSentryCarrier ( carrier ) ;
715
726
716
- if ( registry . __SENTRY__ && registry . __SENTRY__ . acs ) {
717
- const hub = registry . __SENTRY__ . acs . getCurrentHub ( ) ;
727
+ if ( sentry . acs ) {
728
+ const hub = sentry . acs . getCurrentHub ( ) ;
718
729
719
730
if ( hub ) {
720
731
return hub ;
721
732
}
722
733
}
723
734
724
735
// Return hub that lives on a global object
725
- return getGlobalHub ( registry ) ;
736
+ return getGlobalHub ( ) ;
726
737
}
727
738
728
739
/**
@@ -735,15 +746,17 @@ export function getIsolationScope(): Scope {
735
746
return getCurrentHub ( ) . getIsolationScope ( ) ;
736
747
}
737
748
738
- function getGlobalHub ( registry : Carrier = getMainCarrier ( ) ) : Hub {
749
+ function getGlobalHub ( ) : Hub {
750
+ const registry = getMainCarrier ( ) ;
751
+
739
752
// If there's no hub, or its an old API, assign a new one
740
753
741
754
if (
742
755
! hasHubOnCarrier ( registry ) ||
743
756
// eslint-disable-next-line deprecation/deprecation
744
757
getHubFromCarrier ( registry ) . isOlderThan ( API_VERSION )
745
758
) {
746
- setHubOnCarrier ( registry , new Hub ( ) ) ;
759
+ setHubOnCarrier ( registry , createHub ( ) ) ;
747
760
}
748
761
749
762
// Return hub that lives on a global object
@@ -768,7 +781,7 @@ export function ensureHubOnCarrier(carrier: Carrier, parent: Hub = getGlobalHub(
768
781
const scope = parent . getScope ( ) ;
769
782
// eslint-disable-next-line deprecation/deprecation
770
783
const isolationScope = parent . getIsolationScope ( ) ;
771
- setHubOnCarrier ( carrier , new Hub ( client , scope . clone ( ) , isolationScope . clone ( ) ) ) ;
784
+ setHubOnCarrier ( carrier , createHub ( client , scope . clone ( ) , isolationScope . clone ( ) ) ) ;
772
785
}
773
786
}
774
787
@@ -780,8 +793,8 @@ export function ensureHubOnCarrier(carrier: Carrier, parent: Hub = getGlobalHub(
780
793
export function setAsyncContextStrategy ( strategy : AsyncContextStrategy | undefined ) : void {
781
794
// Get main carrier (global for every environment)
782
795
const registry = getMainCarrier ( ) ;
783
- registry . __SENTRY__ = registry . __SENTRY__ || { } ;
784
- registry . __SENTRY__ . acs = strategy ;
796
+ const sentry = getSentryCarrier ( registry ) ;
797
+ sentry . acs = strategy ;
785
798
}
786
799
787
800
/**
@@ -793,9 +806,10 @@ export function setAsyncContextStrategy(strategy: AsyncContextStrategy | undefin
793
806
*/
794
807
export function runWithAsyncContext < T > ( callback : ( ) => T , options : RunWithAsyncContextOptions = { } ) : T {
795
808
const registry = getMainCarrier ( ) ;
809
+ const sentry = getSentryCarrier ( registry ) ;
796
810
797
- if ( registry . __SENTRY__ && registry . __SENTRY__ . acs ) {
798
- return registry . __SENTRY__ . acs . runWithAsyncContext ( callback , options ) ;
811
+ if ( sentry . acs ) {
812
+ return sentry . acs . runWithAsyncContext ( callback , options ) ;
799
813
}
800
814
801
815
// if there was no strategy, fallback to just calling the callback
@@ -807,7 +821,7 @@ export function runWithAsyncContext<T>(callback: () => T, options: RunWithAsyncC
807
821
* @param carrier object
808
822
*/
809
823
function hasHubOnCarrier ( carrier : Carrier ) : boolean {
810
- return ! ! ( carrier && carrier . __SENTRY__ && carrier . __SENTRY__ . hub ) ;
824
+ return ! ! getSentryCarrier ( carrier ) . hub ;
811
825
}
812
826
813
827
/**
@@ -817,7 +831,12 @@ function hasHubOnCarrier(carrier: Carrier): boolean {
817
831
* @hidden
818
832
*/
819
833
export function getHubFromCarrier ( carrier : Carrier ) : Hub {
820
- return getGlobalSingleton < Hub > ( 'hub' , ( ) => new Hub ( ) , carrier ) ;
834
+ const sentry = getSentryCarrier ( carrier ) ;
835
+ if ( ! sentry . hub ) {
836
+ sentry . hub = createHub ( ) ;
837
+ }
838
+
839
+ return sentry . hub ;
821
840
}
822
841
823
842
/**
@@ -828,7 +847,18 @@ export function getHubFromCarrier(carrier: Carrier): Hub {
828
847
*/
829
848
export function setHubOnCarrier ( carrier : Carrier , hub : Hub ) : boolean {
830
849
if ( ! carrier ) return false ;
831
- const __SENTRY__ = ( carrier . __SENTRY__ = carrier . __SENTRY__ || { } ) ;
832
- __SENTRY__ . hub = hub ;
850
+ const sentry = getSentryCarrier ( carrier ) ;
851
+ sentry . hub = hub ;
833
852
return true ;
834
853
}
854
+
855
+ /** Will either get the existing sentry carrier, or create a new one. */
856
+ function getSentryCarrier ( carrier : Carrier ) : SentryCarrier {
857
+ if ( ! carrier . __SENTRY__ ) {
858
+ carrier . __SENTRY__ = {
859
+ extensions : { } ,
860
+ hub : undefined ,
861
+ } ;
862
+ }
863
+ return carrier . __SENTRY__ ;
864
+ }
0 commit comments