hydrateSpans.tsx 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. import invariant from 'invariant';
  2. import isValidDate from 'sentry/utils/date/isValidDate';
  3. import type {RawSpanFrame, SpanFrame} from 'sentry/utils/replays/types';
  4. import type {ReplayRecord} from 'sentry/views/replays/types';
  5. function isSpanFrame(frame: SpanFrame | undefined): frame is SpanFrame {
  6. return frame !== undefined;
  7. }
  8. export default function hydrateSpans(
  9. replayRecord: ReplayRecord,
  10. spanFrames: RawSpanFrame[]
  11. ): SpanFrame[] {
  12. const startTimestampMs = replayRecord.started_at.getTime();
  13. return spanFrames
  14. .map((frame: RawSpanFrame) => {
  15. try {
  16. const start = new Date(frame.startTimestamp * 1000);
  17. const end = new Date(frame.endTimestamp * 1000);
  18. invariant(isValidDate(start), 'spanFrame.startTimestamp is invalid');
  19. invariant(isValidDate(end), 'spanFrame.endTimestamp is invalid');
  20. return {
  21. ...frame,
  22. endTimestamp: end,
  23. endTimestampMs: end.getTime(),
  24. offsetMs: Math.abs(start.getTime() - startTimestampMs),
  25. startTimestamp: start,
  26. timestampMs: start.getTime(),
  27. // TODO: do we need this added as well?
  28. // id: `${span.description ?? span.op}-${span.startTimestamp}-${span.endTimestamp}`,
  29. };
  30. } catch {
  31. return undefined;
  32. }
  33. })
  34. .filter(isSpanFrame);
  35. }