in src/sdk/trace-metrics.ts [34:86]
static compute(trace: LHProcessedTrace) {
const { processEvents } = trace;
const measuresMap = new Map();
const userTimings: Array<TraceOutput> = [];
for (const event of processEvents) {
const { name, ph, ts, args } = event;
if (!event.cat.includes('blink.user_timing')) {
continue;
}
// discard all browser level mark events with frame data
if (
name === 'requestStart' ||
name === 'navigationStart' ||
name === 'paintNonDefaultBackgroundColor' ||
args.frame !== undefined
) {
continue;
}
/**
* user timing mark events falls under `R` and i or I
* measure events starts with `b` and ends with `e`
* Doc - https://docs.google.com/document/d/1CvAClvFfyA5R-PhYUmn5OOQtYMH4h6I0nSsKchNAySU/edit#heading=h.puwqg050lyuy
*/
const phase = ph.toLowerCase();
if (phase === 'r' || phase === 'i') {
userTimings.push({
name,
type: 'mark',
start: {
us: ts,
},
});
} else if (phase === 'b') {
measuresMap.set(name, ts);
} else if (phase === 'e') {
const startTime = measuresMap.get(name);
userTimings.push({
name,
type: 'measure',
start: {
us: startTime,
},
duration: {
us: ts - startTime,
},
});
}
}
return userTimings;
}