getReplayEvent.tsx 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. import type {Crumb} from 'sentry/types/breadcrumbs';
  2. import type {ReplaySpan} from 'sentry/views/replays/types';
  3. export function getPrevReplayEvent<T extends ReplaySpan | Crumb>({
  4. items,
  5. targetTimestampMs,
  6. allowExact = false,
  7. allowEqual = false,
  8. }: {
  9. items: T[];
  10. targetTimestampMs: number;
  11. allowEqual?: boolean;
  12. allowExact?: boolean;
  13. }) {
  14. return items.reduce<T | undefined>((prev, item) => {
  15. const itemTimestampMS = +new Date(item.timestamp || '');
  16. if (
  17. itemTimestampMS > targetTimestampMs ||
  18. (!allowExact && itemTimestampMS === targetTimestampMs)
  19. ) {
  20. return prev;
  21. }
  22. if (
  23. !prev ||
  24. (allowEqual
  25. ? itemTimestampMS >= +new Date(prev.timestamp || '')
  26. : itemTimestampMS > +new Date(prev.timestamp || ''))
  27. ) {
  28. return item;
  29. }
  30. return prev;
  31. }, undefined);
  32. }
  33. export function getNextReplayEvent<T extends ReplaySpan | Crumb>({
  34. items,
  35. targetTimestampMs,
  36. allowExact = false,
  37. }: {
  38. items: T[];
  39. targetTimestampMs: number;
  40. allowExact?: boolean;
  41. }) {
  42. return items.reduce<T | undefined>((found, item) => {
  43. const itemTimestampMS = +new Date(item.timestamp || '');
  44. if (
  45. itemTimestampMS < targetTimestampMs ||
  46. (!allowExact && itemTimestampMS === targetTimestampMs)
  47. ) {
  48. return found;
  49. }
  50. if (!found || itemTimestampMS < +new Date(found.timestamp || '')) {
  51. return item;
  52. }
  53. return found;
  54. }, undefined);
  55. }