1
+ // @flow
1
2
// Copyright (c) 2017 Uber Technologies, Inc.
2
3
//
3
4
// Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -25,23 +26,50 @@ import {
25
26
getTraceSpansAsMap ,
26
27
getTraceTimestamp ,
27
28
} from '../../../selectors/trace' ;
29
+ import type { Process , Span } from '../../../types' ;
28
30
29
- const cache = new Map ( ) ;
31
+ type SpanWithProcess = Span & { process : Process } ;
30
32
31
- export function transformTrace ( trace ) {
32
- if ( cache . has ( trace . traceID ) ) {
33
- return cache . get ( trace . traceID ) ;
33
+ export type XformedSpan = SpanWithProcess & {
34
+ depth : number ,
35
+ hasChildren : boolean ,
36
+ relativeStartTime : number ,
37
+ } ;
38
+
39
+ type TracePartial = {
40
+ processes : { [ string ] : Process } ,
41
+ traceID : string ,
42
+ } ;
43
+
44
+ export type XformedTrace = TracePartial & {
45
+ duration : number ,
46
+ endTime : number ,
47
+ spans : XformedSpan [ ] ,
48
+ startTime : number ,
49
+ } ;
50
+
51
+ const cache : Map < string , ?XformedTrace > = new Map ( ) ;
52
+
53
+ // eslint-disable-next-line import/prefer-default-export
54
+ export function transformTrace ( trace : TracePartial & { spans : SpanWithProcess [ ] } ) : XformedTrace {
55
+ const cached = cache . get ( trace . traceID ) ;
56
+ if ( cached ) {
57
+ return cached ;
34
58
}
35
59
const traceStartTime = getTraceTimestamp ( trace ) ;
36
60
const traceEndTime = getTraceEndTimestamp ( trace ) ;
37
- const spanMap = getTraceSpansAsMap ( trace ) ;
61
+ const spanMap : Map < string , ? SpanWithProcess > = getTraceSpansAsMap ( trace ) ;
38
62
const tree = getTraceSpanIdsAsTree ( trace ) ;
39
- const spans = [ ] ;
63
+ const spans : XformedSpan [ ] = [ ] ;
64
+
40
65
tree . walk ( ( spanID , node , depth ) => {
41
66
if ( spanID === '__root__' ) {
42
67
return ;
43
68
}
44
- const span = spanMap . get ( spanID ) ;
69
+ const span : ?SpanWithProcess = spanMap . get ( spanID ) ;
70
+ if ( ! span ) {
71
+ return ;
72
+ }
45
73
spans . push ( {
46
74
...span ,
47
75
relativeStartTime : span . startTime - traceStartTime ,
@@ -50,8 +78,12 @@ export function transformTrace(trace) {
50
78
} ) ;
51
79
} ) ;
52
80
const transform = {
53
- ...trace ,
54
81
spans,
82
+ // can't use spread operator for intersection types
83
+ // repl: https://goo.gl/4Z23MJ
84
+ // issue: https://github.com/facebook/flow/issues/1511
85
+ processes : trace . processes ,
86
+ traceID : trace . traceID ,
55
87
duration : getTraceDuration ( trace ) ,
56
88
startTime : traceStartTime ,
57
89
endTime : traceEndTime ,
0 commit comments