@@ -7,7 +7,7 @@ import type {
7
7
Transport ,
8
8
TransportMakeRequestResponse ,
9
9
} from '@sentry/types' ;
10
- import { dsnFromString , forEachEnvelopeItem } from '@sentry/utils' ;
10
+ import { createEnvelope , dsnFromString , forEachEnvelopeItem } from '@sentry/utils' ;
11
11
12
12
import { getEnvelopeEndpointWithUrlEncodedAuth } from '../api' ;
13
13
@@ -57,6 +57,7 @@ function makeOverrideReleaseTransport<TO extends BaseTransportOptions>(
57
57
const transport = createTransport ( options ) ;
58
58
59
59
return {
60
+ ...transport ,
60
61
send : async ( envelope : Envelope ) : Promise < void | TransportMakeRequestResponse > => {
61
62
const event = eventFromEnvelope ( envelope , [ 'event' , 'transaction' , 'profile' , 'replay_event' ] ) ;
62
63
@@ -65,11 +66,23 @@ function makeOverrideReleaseTransport<TO extends BaseTransportOptions>(
65
66
}
66
67
return transport . send ( envelope ) ;
67
68
} ,
68
- flush : timeout => transport . flush ( timeout ) ,
69
69
} ;
70
70
} ;
71
71
}
72
72
73
+ /** Overrides the DSN in the envelope header */
74
+ function overrideDsn ( envelope : Envelope , dsn : string ) : Envelope {
75
+ return createEnvelope (
76
+ dsn
77
+ ? {
78
+ ...envelope [ 0 ] ,
79
+ dsn,
80
+ }
81
+ : envelope [ 0 ] ,
82
+ envelope [ 1 ] ,
83
+ ) ;
84
+ }
85
+
73
86
/**
74
87
* Creates a transport that can send events to different DSNs depending on the envelope contents.
75
88
*/
@@ -79,26 +92,31 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
79
92
) : ( options : TO ) => Transport {
80
93
return options => {
81
94
const fallbackTransport = createTransport ( options ) ;
82
- const otherTransports : Record < string , Transport > = { } ;
95
+ const otherTransports = new Map < string , Transport > ( ) ;
83
96
84
- function getTransport ( dsn : string , release : string | undefined ) : Transport | undefined {
97
+ function getTransport ( dsn : string , release : string | undefined ) : [ string , Transport ] | undefined {
85
98
// We create a transport for every unique dsn/release combination as there may be code from multiple releases in
86
99
// use at the same time
87
100
const key = release ? `${ dsn } :${ release } ` : dsn ;
88
101
89
- if ( ! otherTransports [ key ] ) {
102
+ let transport = otherTransports . get ( key ) ;
103
+
104
+ if ( ! transport ) {
90
105
const validatedDsn = dsnFromString ( dsn ) ;
91
106
if ( ! validatedDsn ) {
92
107
return undefined ;
93
108
}
94
- const url = getEnvelopeEndpointWithUrlEncodedAuth ( validatedDsn ) ;
95
109
96
- otherTransports [ key ] = release
110
+ const url = getEnvelopeEndpointWithUrlEncodedAuth ( validatedDsn , options . tunnel ) ;
111
+
112
+ transport = release
97
113
? makeOverrideReleaseTransport ( createTransport , release ) ( { ...options , url } )
98
114
: createTransport ( { ...options , url } ) ;
115
+
116
+ otherTransports . set ( key , transport ) ;
99
117
}
100
118
101
- return otherTransports [ key ] ;
119
+ return [ dsn , transport ] ;
102
120
}
103
121
104
122
async function send ( envelope : Envelope ) : Promise < void | TransportMakeRequestResponse > {
@@ -115,22 +133,28 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
115
133
return getTransport ( result . dsn , result . release ) ;
116
134
}
117
135
} )
118
- . filter ( ( t ) : t is Transport => ! ! t ) ;
136
+ . filter ( ( t ) : t is [ string , Transport ] => ! ! t ) ;
119
137
120
138
// If we have no transports to send to, use the fallback transport
121
139
if ( transports . length === 0 ) {
122
- transports . push ( fallbackTransport ) ;
140
+ // Don't override the DSN in the header for the fallback transport. '' is falsy
141
+ transports . push ( [ '' , fallbackTransport ] ) ;
123
142
}
124
143
125
- const results = await Promise . all ( transports . map ( transport => transport . send ( envelope ) ) ) ;
144
+ const results = await Promise . all (
145
+ transports . map ( ( [ dsn , transport ] ) => transport . send ( overrideDsn ( envelope , dsn ) ) ) ,
146
+ ) ;
126
147
127
148
return results [ 0 ] ;
128
149
}
129
150
130
151
async function flush ( timeout : number | undefined ) : Promise < boolean > {
131
- const allTransports = [ ...Object . keys ( otherTransports ) . map ( dsn => otherTransports [ dsn ] ) , fallbackTransport ] ;
132
- const results = await Promise . all ( allTransports . map ( transport => transport . flush ( timeout ) ) ) ;
133
- return results . every ( r => r ) ;
152
+ const promises = [ await fallbackTransport . flush ( timeout ) ] ;
153
+ for ( const [ , transport ] of otherTransports ) {
154
+ promises . push ( await transport . flush ( timeout ) ) ;
155
+ }
156
+
157
+ return promises . every ( r => r ) ;
134
158
}
135
159
136
160
return {
0 commit comments