33 lines
1.2 KiB
TypeScript
33 lines
1.2 KiB
TypeScript
export type FirstNavigationSample = {
|
|
observedAtMs: number
|
|
source: boolean
|
|
destination: boolean
|
|
content: boolean
|
|
pathname?: string
|
|
center?: string
|
|
}
|
|
|
|
function category(sample: FirstNavigationSample) {
|
|
if (sample.destination && !sample.source) return "destination"
|
|
if (sample.source && !sample.destination) return "source"
|
|
if (!sample.content) return "blank"
|
|
return "unknown"
|
|
}
|
|
|
|
export function summarizeFirstNavigation(samples: FirstNavigationSample[]) {
|
|
const categories = samples.map(category)
|
|
const stable = categories.findIndex(
|
|
(value, index) =>
|
|
value === "destination" && categories[index + 1] === "destination" && categories[index + 2] === "destination",
|
|
)
|
|
return {
|
|
samples: samples.length,
|
|
firstDestinationObservedMs: samples[categories.indexOf("destination")]?.observedAtMs ?? null,
|
|
stableDestinationObservedMs: stable === -1 ? null : samples[stable + 2]!.observedAtMs,
|
|
sourceSamples: categories.filter((value) => value === "source").length,
|
|
blankSamples: categories.filter((value) => value === "blank").length,
|
|
unknownSamples: categories.filter((value) => value === "unknown").length,
|
|
destinationSamples: categories.filter((value) => value === "destination").length,
|
|
}
|
|
}
|