@@ -7,7 +7,7 @@ import type {
77 Transport ,
88 TransportMakeRequestResponse ,
99} from '@sentry/types' ;
10- import { dsnFromString , forEachEnvelopeItem } from '@sentry/utils' ;
10+ import { createEnvelope , dsnFromString , forEachEnvelopeItem } from '@sentry/utils' ;
1111
1212import { getEnvelopeEndpointWithUrlEncodedAuth } from '../api' ;
1313
@@ -57,6 +57,7 @@ function makeOverrideReleaseTransport<TO extends BaseTransportOptions>(
5757 const transport = createTransport ( options ) ;
5858
5959 return {
60+ ...transport ,
6061 send : async ( envelope : Envelope ) : Promise < void | TransportMakeRequestResponse > => {
6162 const event = eventFromEnvelope ( envelope , [ 'event' , 'transaction' , 'profile' , 'replay_event' ] ) ;
6263
@@ -65,11 +66,23 @@ function makeOverrideReleaseTransport<TO extends BaseTransportOptions>(
6566 }
6667 return transport . send ( envelope ) ;
6768 } ,
68- flush : timeout => transport . flush ( timeout ) ,
6969 } ;
7070 } ;
7171}
7272
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+
7386/**
7487 * Creates a transport that can send events to different DSNs depending on the envelope contents.
7588 */
@@ -79,26 +92,31 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
7992) : ( options : TO ) => Transport {
8093 return options => {
8194 const fallbackTransport = createTransport ( options ) ;
82- const otherTransports : Record < string , Transport > = { } ;
95+ const otherTransports = new Map < string , Transport > ( ) ;
8396
84- function getTransport ( dsn : string , release : string | undefined ) : Transport | undefined {
97+ function getTransport ( dsn : string , release : string | undefined ) : [ string , Transport ] | undefined {
8598 // We create a transport for every unique dsn/release combination as there may be code from multiple releases in
8699 // use at the same time
87100 const key = release ? `${ dsn } :${ release } ` : dsn ;
88101
89- if ( ! otherTransports [ key ] ) {
102+ let transport = otherTransports . get ( key ) ;
103+
104+ if ( ! transport ) {
90105 const validatedDsn = dsnFromString ( dsn ) ;
91106 if ( ! validatedDsn ) {
92107 return undefined ;
93108 }
94- const url = getEnvelopeEndpointWithUrlEncodedAuth ( validatedDsn ) ;
95109
96- otherTransports [ key ] = release
110+ const url = getEnvelopeEndpointWithUrlEncodedAuth ( validatedDsn , options . tunnel ) ;
111+
112+ transport = release
97113 ? makeOverrideReleaseTransport ( createTransport , release ) ( { ...options , url } )
98114 : createTransport ( { ...options , url } ) ;
115+
116+ otherTransports . set ( key , transport ) ;
99117 }
100118
101- return otherTransports [ key ] ;
119+ return [ dsn , transport ] ;
102120 }
103121
104122 async function send ( envelope : Envelope ) : Promise < void | TransportMakeRequestResponse > {
@@ -115,22 +133,28 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
115133 return getTransport ( result . dsn , result . release ) ;
116134 }
117135 } )
118- . filter ( ( t ) : t is Transport => ! ! t ) ;
136+ . filter ( ( t ) : t is [ string , Transport ] => ! ! t ) ;
119137
120138 // If we have no transports to send to, use the fallback transport
121139 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 ] ) ;
123142 }
124143
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+ ) ;
126147
127148 return results [ 0 ] ;
128149 }
129150
130151 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 ) ;
134158 }
135159
136160 return {
0 commit comments