hydrateFrames.tsx 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. import type {
  2. OptionFrame,
  3. RawBreadcrumbFrame,
  4. RawSpanFrame,
  5. RecordingFrame,
  6. VideoEvent,
  7. } from 'sentry/utils/replays/types';
  8. import {
  9. isBreadcrumbFrameEvent,
  10. isOptionFrameEvent,
  11. isRecordingFrame,
  12. isSpanFrameEvent,
  13. isVideoFrameEvent,
  14. } from 'sentry/utils/replays/types';
  15. export default function hydrateFrames(attachments: unknown[]) {
  16. const rrwebFrames: RecordingFrame[] = [];
  17. const breadcrumbFrames: RawBreadcrumbFrame[] = [];
  18. const spanFrames: RawSpanFrame[] = [];
  19. const videoFrames: VideoEvent[] = [];
  20. let optionFrame = undefined as OptionFrame | undefined;
  21. attachments.forEach(attachment => {
  22. if (!attachment) {
  23. return;
  24. }
  25. if (isBreadcrumbFrameEvent(attachment)) {
  26. if (attachment.data.payload.category !== 'sentry.feedback') {
  27. breadcrumbFrames.push(attachment.data.payload);
  28. }
  29. } else if (isSpanFrameEvent(attachment)) {
  30. spanFrames.push(attachment.data.payload);
  31. } else if (isOptionFrameEvent(attachment)) {
  32. optionFrame = attachment.data.payload;
  33. } else if (isVideoFrameEvent(attachment) && attachment.data.payload.duration > 0) {
  34. videoFrames.push({
  35. duration: attachment.data.payload.duration,
  36. id: attachment.data.payload.segmentId,
  37. timestamp: attachment.timestamp,
  38. });
  39. } else if (isRecordingFrame(attachment)) {
  40. rrwebFrames.push(attachment);
  41. }
  42. });
  43. return {
  44. breadcrumbFrames,
  45. optionFrame,
  46. rrwebFrames,
  47. spanFrames,
  48. videoFrames,
  49. };
  50. }