hydrateSpans.tsx 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  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. offsetMs: Math.abs(start.getTime() - startTimestampMs),
  24. startTimestamp: start,
  25. timestampMs: start.getTime(),
  26. // TODO: do we need this added as well?
  27. // id: `${span.description ?? span.op}-${span.startTimestamp}-${span.endTimestamp}`,
  28. };
  29. } catch {
  30. return undefined;
  31. }
  32. })
  33. .filter(isSpanFrame);
  34. }