hydrateErrors.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. import invariant from 'invariant';
  2. import isValidDate from 'sentry/utils/date/isValidDate';
  3. import type {ErrorFrame, RawReplayError} from 'sentry/utils/replays/types';
  4. import type {ReplayRecord} from 'sentry/views/replays/types';
  5. function isErrorFrame(frame: ErrorFrame | undefined): frame is ErrorFrame {
  6. return frame !== undefined;
  7. }
  8. export default function hydrateErrors(
  9. replayRecord: ReplayRecord,
  10. errors: RawReplayError[]
  11. ): ErrorFrame[] {
  12. const startTimestampMs = replayRecord.started_at.getTime();
  13. return errors
  14. .map(error => {
  15. try {
  16. const time = new Date(error.timestamp);
  17. invariant(isValidDate(time), 'errorFrame.timestamp is invalid');
  18. return {
  19. category: 'issue' as const,
  20. data: {
  21. eventId: error.id,
  22. groupId: error['issue.id'],
  23. groupShortId: error.issue,
  24. label:
  25. (Array.isArray(error['error.type'])
  26. ? error['error.type'][0]
  27. : error['error.type']) ?? '',
  28. projectSlug: error['project.name'],
  29. },
  30. message: error.title,
  31. offsetMs: Math.abs(time.getTime() - startTimestampMs),
  32. timestamp: time,
  33. timestampMs: time.getTime(),
  34. type: 'error', // For compatibility reasons. See BreadcrumbType
  35. };
  36. } catch {
  37. return undefined;
  38. }
  39. })
  40. .filter(isErrorFrame);
  41. }