first-navigation-metrics.ts 1.2 KB

1234567891011121314151617181920212223242526272829303132
  1. export type FirstNavigationSample = {
  2. observedAtMs: number
  3. source: boolean
  4. destination: boolean
  5. content: boolean
  6. pathname?: string
  7. center?: string
  8. }
  9. function category(sample: FirstNavigationSample) {
  10. if (sample.destination && !sample.source) return "destination"
  11. if (sample.source && !sample.destination) return "source"
  12. if (!sample.content) return "blank"
  13. return "unknown"
  14. }
  15. export function summarizeFirstNavigation(samples: FirstNavigationSample[]) {
  16. const categories = samples.map(category)
  17. const stable = categories.findIndex(
  18. (value, index) =>
  19. value === "destination" && categories[index + 1] === "destination" && categories[index + 2] === "destination",
  20. )
  21. return {
  22. samples: samples.length,
  23. firstDestinationObservedMs: samples[categories.indexOf("destination")]?.observedAtMs ?? null,
  24. stableDestinationObservedMs: stable === -1 ? null : samples[stable + 2]!.observedAtMs,
  25. sourceSamples: categories.filter((value) => value === "source").length,
  26. blankSamples: categories.filter((value) => value === "blank").length,
  27. unknownSamples: categories.filter((value) => value === "unknown").length,
  28. destinationSamples: categories.filter((value) => value === "destination").length,
  29. }
  30. }