@@ -15,28 +15,47 @@ const sortSpans = (spans: Span[], mode: string): Span[] => {
1515 if ( mode === "logical" ) {
1616 const spanMap = new Map < string , Span > ( ) ;
1717
18- // Convert objects to Span instances
18+ // Step 1: Convert raw objects into Span instances
1919 spans . forEach ( span => {
20- const newSpan = Object . assign ( new Span ( span . name , span . parentSpanId ) , span ) ;
21- newSpan . children = [ ] ;
22- spanMap . set ( span . spanId , newSpan ) ;
20+ if ( ! spanMap . has ( span . spanId ) ) {
21+ const newSpan = Object . assign ( new Span ( span . name , span . parentSpanId ) , span ) ;
22+ newSpan . children = [ ] ;
23+ spanMap . set ( span . spanId , newSpan ) ;
24+ }
2325 } ) ;
2426
2527 const rootSpans : Span [ ] = [ ] ;
28+
29+ // Step 2: Link children correctly and prevent duplicates
2630 spans . forEach ( span => {
2731 if ( span . parentSpanId && spanMap . has ( span . parentSpanId ) ) {
28- spanMap . get ( span . parentSpanId ) ! . children . push ( spanMap . get ( span . spanId ) ! ) ;
29- } else {
30- rootSpans . push ( spanMap . get ( span . spanId ) ! ) ;
32+ const parent = spanMap . get ( span . parentSpanId ) ;
33+ const child = spanMap . get ( span . spanId ) ;
34+ if ( parent && child && ! parent . children . includes ( child ) ) {
35+ parent . children . push ( child ) ; // ✅ Only push unique children
36+ }
37+ }
38+ } ) ;
39+
40+ // Step 3: Collect only true root spans
41+ spans . forEach ( span => {
42+ if ( ! span . parentSpanId ) {
43+ const rootSpan = spanMap . get ( span . spanId ) ;
44+ if ( rootSpan && ! rootSpans . includes ( rootSpan ) ) {
45+ rootSpans . push ( rootSpan ) ;
46+ }
3147 }
3248 } ) ;
3349
34- return rootSpans ;
50+ return rootSpans ; // ✅ Only root spans are returned, no duplicates
3551 } else {
52+ // ✅ Sort spans by time for time-based mode
3653 return spans . sort ( ( a , b ) => a . startTime - b . startTime ) ;
3754 }
3855} ;
3956
57+
58+
4059/**
4160 * **Recursive Renderer**
4261 * - Uses box-drawing characters (│ ├ └) for structured layout.
0 commit comments