Skip to content

Commit 1d7f18f

Browse files
authored
fix(replay): Ensure circular references are handled (#7752)
1 parent c90a60f commit 1d7f18f

File tree

2 files changed

+52
-1
lines changed

2 files changed

+52
-1
lines changed

packages/replay/src/coreHandlers/util/addBreadcrumbEvent.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { EventType } from '@sentry-internal/rrweb';
22
import type { Breadcrumb } from '@sentry/types';
3+
import { normalize } from '@sentry/utils';
34

45
import type { ReplayContainer } from '../../types';
56
import { addEvent } from '../../util/addEvent';
@@ -26,7 +27,7 @@ export function addBreadcrumbEvent(replay: ReplayContainer, breadcrumb: Breadcru
2627
timestamp: (breadcrumb.timestamp || 0) * 1000,
2728
data: {
2829
tag: 'breadcrumb',
29-
payload: breadcrumb,
30+
payload: normalize(breadcrumb),
3031
},
3132
});
3233

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
import { BASE_TIMESTAMP } from '../../..';
2+
import { addBreadcrumbEvent } from '../../../../src/coreHandlers/util/addBreadcrumbEvent';
3+
import type { EventBufferArray } from '../../../../src/eventBuffer/EventBufferArray';
4+
import { setupReplayContainer } from '../../../utils/setupReplayContainer';
5+
6+
jest.useFakeTimers();
7+
8+
describe('Unit | coreHandlers | util | addBreadcrumbEvent', function () {
9+
beforeEach(function () {
10+
jest.setSystemTime(BASE_TIMESTAMP);
11+
});
12+
13+
it('handles circular references', async () => {
14+
const breadcrumb: any = {
15+
category: 'console',
16+
message: 'Test message',
17+
thisIsNull: null,
18+
thisIsUndefined: undefined,
19+
timestamp: BASE_TIMESTAMP / 1000,
20+
};
21+
breadcrumb['circular'] = breadcrumb;
22+
23+
const replay = setupReplayContainer();
24+
addBreadcrumbEvent(replay, breadcrumb);
25+
26+
await undefined;
27+
await undefined;
28+
await undefined;
29+
await undefined;
30+
await undefined;
31+
32+
expect((replay.eventBuffer as EventBufferArray).events).toEqual([
33+
{
34+
type: 5,
35+
timestamp: BASE_TIMESTAMP,
36+
data: {
37+
tag: 'breadcrumb',
38+
payload: {
39+
category: 'console',
40+
message: 'Test message',
41+
thisIsNull: null,
42+
thisIsUndefined: '[undefined]',
43+
circular: '[Circular ~]',
44+
timestamp: BASE_TIMESTAMP / 1000,
45+
},
46+
},
47+
},
48+
]);
49+
});
50+
});

0 commit comments

Comments
 (0)