Skip to content

Commit ed2d738

Browse files
committed
fix(replay): Ensure circular references are handled
1 parent a0e9489 commit ed2d738

File tree

4 files changed

+42
-2
lines changed

4 files changed

+42
-2
lines changed

packages/replay/src/eventBuffer/EventBufferArray.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { normalize } from '@sentry/utils';
2+
13
import type { AddEventResult, EventBuffer, RecordingEvent } from '../types';
24

35
/**
@@ -41,7 +43,7 @@ export class EventBufferArray implements EventBuffer {
4143
// attachment.
4244
const eventsRet = this.events;
4345
this.events = [];
44-
resolve(JSON.stringify(eventsRet));
46+
resolve(JSON.stringify(normalize(eventsRet)));
4547
});
4648
}
4749
}

packages/replay/src/eventBuffer/EventBufferCompressionWorker.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import type { ReplayRecordingData } from '@sentry/types';
2+
import { normalize } from '@sentry/utils';
23

34
import type { AddEventResult, EventBuffer, RecordingEvent } from '../types';
45
import { WorkerHandler } from './WorkerHandler';
@@ -61,7 +62,7 @@ export class EventBufferCompressionWorker implements EventBuffer {
6162
* Send the event to the worker.
6263
*/
6364
private _sendEventToWorker(event: RecordingEvent): Promise<AddEventResult> {
64-
return this._worker.postMessage<void>('addEvent', JSON.stringify(event));
65+
return this._worker.postMessage<void>('addEvent', JSON.stringify(normalize(event)));
6566
}
6667

6768
/**

packages/replay/test/unit/eventBuffer/EventBufferArray.test.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import type { RecordingEvent } from '../../../src/types';
12
import { createEventBuffer } from './../../../src/eventBuffer';
23
import { BASE_TIMESTAMP } from './../../index';
34

@@ -42,4 +43,17 @@ describe('Unit | eventBuffer | EventBufferArray', () => {
4243
expect(result1).toEqual(JSON.stringify([TEST_EVENT]));
4344
expect(result2).toEqual(JSON.stringify([]));
4445
});
46+
47+
it('handles circular references', async function () {
48+
const buffer = createEventBuffer({ useCompression: false });
49+
50+
const event: RecordingEvent = { data: {}, timestamp: BASE_TIMESTAMP, type: 3 };
51+
(event.data as any).child = event;
52+
53+
buffer.addEvent(event);
54+
55+
const result = await buffer.finish();
56+
57+
expect(result).toEqual(`[{"data":{"child":"[Circular ~]"},"timestamp":${BASE_TIMESTAMP},"type":3}]`);
58+
});
4559
});

packages/replay/test/unit/eventBuffer/EventBufferCompressionWorker.test.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import pako from 'pako';
44

55
import { BASE_TIMESTAMP } from '../..';
66
import { EventBufferProxy } from '../../../src/eventBuffer/EventBufferProxy';
7+
import type { RecordingEvent } from '../../../src/types';
78
import { createEventBuffer } from './../../../src/eventBuffer';
89

910
const TEST_EVENT = { data: {}, timestamp: BASE_TIMESTAMP, type: 3 };
@@ -145,4 +146,26 @@ describe('Unit | eventBuffer | EventBufferCompressionWorker', () => {
145146

146147
await expect(() => buffer.addEvent({ data: { o: 3 }, timestamp: BASE_TIMESTAMP, type: 3 })).rejects.toBeDefined();
147148
});
149+
150+
it('handles circular references', async function () {
151+
const buffer = createEventBuffer({
152+
useCompression: true,
153+
}) as EventBufferProxy;
154+
155+
expect(buffer).toBeInstanceOf(EventBufferProxy);
156+
157+
// Ensure worker is ready
158+
await buffer.ensureWorkerIsLoaded();
159+
160+
const event: RecordingEvent = { data: {}, timestamp: BASE_TIMESTAMP, type: 3 };
161+
(event.data as any).child = event;
162+
163+
buffer.addEvent(event);
164+
165+
const result = await buffer.finish();
166+
expect(result).toBeInstanceOf(Uint8Array);
167+
const restored = pako.inflate(result as Uint8Array, { to: 'string' });
168+
169+
expect(restored).toEqual(`[{"data":{"child":"[Circular ~]"},"timestamp":${BASE_TIMESTAMP},"type":3}]`);
170+
});
148171
});

0 commit comments

Comments
 (0)