countDomNodes.tsx 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. import replayerStepper from 'sentry/utils/replays/replayerStepper';
  2. import type {RecordingFrame} from 'sentry/utils/replays/types';
  3. export type DomNodeChartDatapoint = {
  4. count: number;
  5. endTimestampMs: number;
  6. startTimestampMs: number;
  7. timestampMs: number;
  8. };
  9. type Args = {
  10. frames: RecordingFrame[] | undefined;
  11. rrwebEvents: RecordingFrame[] | undefined;
  12. startTimestampMs: number;
  13. };
  14. export default function countDomNodes({
  15. frames,
  16. rrwebEvents,
  17. startTimestampMs,
  18. }: Args): Promise<Map<RecordingFrame, DomNodeChartDatapoint>> {
  19. let frameCount = 0;
  20. const length = frames?.length ?? 0;
  21. const frameStep = Math.max(Math.round(length * 0.007), 1);
  22. return replayerStepper<RecordingFrame, DomNodeChartDatapoint>({
  23. frames,
  24. rrwebEvents,
  25. startTimestampMs,
  26. shouldVisitFrame: () => {
  27. frameCount++;
  28. return frameCount % frameStep === 0;
  29. },
  30. onVisitFrame: (frame, collection, replayer) => {
  31. const idCount = replayer.getMirror().getIds().length; // gets number of DOM nodes present
  32. collection.set(frame as RecordingFrame, {
  33. count: idCount,
  34. timestampMs: frame.timestamp,
  35. startTimestampMs: frame.timestamp,
  36. endTimestampMs: frame.timestamp,
  37. });
  38. },
  39. });
  40. }