@@ -24,28 +24,39 @@ export function mergeBaggageHeaders<Existing extends string | string[] | number
2424 return existing ;
2525 }
2626
27- const newSentryBaggageEntries = Object . entries ( newBaggageEntries ) . filter ( ( [ key ] ) =>
28- key . startsWith ( SENTRY_BAGGAGE_KEY_PREFIX ) ,
29- ) ;
27+ // Single pass over new entries to partition sentry vs non-sentry
28+ const newSentryEntries : Record < string , string > = { } ;
29+ const newNonSentryEntries : Record < string , string > = { } ;
30+ for ( const [ key , value ] of Object . entries ( newBaggageEntries ) ) {
31+ if ( key . startsWith ( SENTRY_BAGGAGE_KEY_PREFIX ) ) {
32+ newSentryEntries [ key ] = value ;
33+ } else {
34+ newNonSentryEntries [ key ] = value ;
35+ }
36+ }
3037
31- const existingBaggageEntriesWithoutSentry = existingBaggageEntries
32- ? Object . entries ( existingBaggageEntries ) . filter ( ( [ key ] ) => ! key . startsWith ( SENTRY_BAGGAGE_KEY_PREFIX ) )
33- : [ ] ;
38+ const hasNewSentryEntries = Object . keys ( newSentryEntries ) . length > 0 ;
3439
3540 // If new baggage contains at least one sentry- value, we remove all old sentry- values
3641 // otherwise, we keep old sentry- values. If we don't remove old sentry- values, we end
3742 // up with an inconsistent dynamic sampling context propagation.
38- const mergedBaggageEntries = newSentryBaggageEntries . length
39- ? Object . fromEntries ( existingBaggageEntriesWithoutSentry )
40- : ( existingBaggageEntries ?? { } ) ;
41-
42- Object . entries ( newBaggageEntries ) . forEach ( ( [ key , value ] ) => {
43- // Sentry-specific keys always take precedence from new baggage
44- // Non-Sentry keys only added if not already present
45- if ( key . startsWith ( SENTRY_BAGGAGE_KEY_PREFIX ) || ! mergedBaggageEntries [ key ] ) {
43+ const mergedBaggageEntries : Record < string , string > = { } ;
44+ if ( existingBaggageEntries ) {
45+ for ( const [ key , value ] of Object . entries ( existingBaggageEntries ) ) {
46+ if ( hasNewSentryEntries && key . startsWith ( SENTRY_BAGGAGE_KEY_PREFIX ) ) {
47+ continue ;
48+ }
4649 mergedBaggageEntries [ key ] = value ;
4750 }
48- } ) ;
51+ }
52+
53+ // Sentry entries from new baggage always overwrite; non-sentry only if not already present
54+ Object . assign ( mergedBaggageEntries , newSentryEntries ) ;
55+ for ( const [ key , value ] of Object . entries ( newNonSentryEntries ) ) {
56+ if ( ! mergedBaggageEntries [ key ] ) {
57+ mergedBaggageEntries [ key ] = value ;
58+ }
59+ }
4960
5061 return objectToBaggageHeader ( mergedBaggageEntries ) ;
5162}
0 commit comments