@@ -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 < 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,30 @@ 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 : Map < string , Transport > = new Map ( ) ;
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 ) ;
109+ const url = getEnvelopeEndpointWithUrlEncodedAuth ( validatedDsn , options . tunnel ) ;
95110
96- otherTransports [ key ] = release
111+ transport = release
97112 ? makeOverrideReleaseTransport ( createTransport , release ) ( { ...options , url } )
98113 : createTransport ( { ...options , url } ) ;
114+
115+ otherTransports . set ( key , transport ) ;
99116 }
100117
101- return otherTransports [ key ] ;
118+ return [ dsn , transport ] ;
102119 }
103120
104121 async function send ( envelope : Envelope ) : Promise < TransportMakeRequestResponse > {
@@ -115,20 +132,23 @@ export function makeMultiplexedTransport<TO extends BaseTransportOptions>(
115132 return getTransport ( result . dsn , result . release ) ;
116133 }
117134 } )
118- . filter ( ( t ) : t is Transport => ! ! t ) ;
135+ . filter ( ( t ) : t is [ string , Transport ] => ! ! t ) ;
119136
120137 // If we have no transports to send to, use the fallback transport
121138 if ( transports . length === 0 ) {
122- transports . push ( fallbackTransport ) ;
139+ // Don't override the DSN in the header for the fallback transport. '' is falsy
140+ transports . push ( [ '' , fallbackTransport ] ) ;
123141 }
124142
125- const results = await Promise . all ( transports . map ( transport => transport . send ( envelope ) ) ) ;
143+ const results = await Promise . all (
144+ transports . map ( ( [ dsn , transport ] ) => transport . send ( overrideDsn ( envelope , dsn ) ) ) ,
145+ ) ;
126146
127147 return results [ 0 ] ;
128148 }
129149
130150 async function flush ( timeout : number | undefined ) : Promise < boolean > {
131- const allTransports = [ ...Object . keys ( otherTransports ) . map ( dsn => otherTransports [ dsn ] ) , fallbackTransport ] ;
151+ const allTransports = [ ...otherTransports . values ( ) , fallbackTransport ] ;
132152 const results = await Promise . all ( allTransports . map ( transport => transport . flush ( timeout ) ) ) ;
133153 return results . every ( r => r ) ;
134154 }
0 commit comments