Skip to content

Commit 52f43de

Browse files
committed
fix(replay): Handle worker compression errors
1 parent 088cb46 commit 52f43de

File tree

2 files changed

+36
-3
lines changed

2 files changed

+36
-3
lines changed

packages/replay/src/eventBuffer/EventBufferCompressionWorker.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { logger } from '@sentry/utils';
22

33
import type { AddEventResult, EventBuffer, RecordingEvent, WorkerRequest, WorkerResponse } from '../types';
4+
import { ReplayRecordingData } from '@sentry/types';
45

56
/**
67
* Event buffer that uses a web worker to compress events.
@@ -101,8 +102,15 @@ export class EventBufferCompressionWorker implements EventBuffer {
101102
/**
102103
* Finish the event buffer and return the compressed data.
103104
*/
104-
public finish(): Promise<Uint8Array> {
105-
return this._finishRequest(this._getAndIncrementId());
105+
public async finish(): Promise<ReplayRecordingData> {
106+
try {
107+
return await this._finishRequest(this._getAndIncrementId());
108+
} catch (error) {
109+
__DEBUG_BUILD__ && logger.error('[Replay] Error when trying to compress events', error);
110+
// fall back to uncompressed
111+
const events = this.pendingEvents;
112+
return JSON.stringify(events);
113+
}
106114
}
107115

108116
/**

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import 'jsdom-worker';
22

33
import pako from 'pako';
44

5+
import { EventBufferProxy } from '../../src/eventBuffer/EventBufferProxy';
56
import { createEventBuffer } from './../../src/eventBuffer';
67
import { BASE_TIMESTAMP } from './../index';
7-
import { EventBufferProxy } from '../../src/eventBuffer/EventBufferProxy';
88

99
const TEST_EVENT = { data: {}, timestamp: BASE_TIMESTAMP, type: 3 };
1010
describe('Unit | eventBuffer', () => {
@@ -145,6 +145,31 @@ describe('Unit | eventBuffer', () => {
145145
expect(restored1).toEqual(JSON.stringify([TEST_EVENT]));
146146
expect(restored2).toEqual(JSON.stringify([{ ...TEST_EVENT, type: 5 }]));
147147
});
148+
149+
it('handles an error when compressing the payload xxx', async function () {
150+
const buffer = createEventBuffer({
151+
useCompression: true,
152+
}) as EventBufferProxy;
153+
154+
expect(buffer).toBeInstanceOf(EventBufferProxy);
155+
156+
// Ensure worker is ready
157+
await buffer.ensureWorkerIsLoaded();
158+
159+
buffer.addEvent(TEST_EVENT);
160+
buffer.addEvent(TEST_EVENT);
161+
162+
// @ts-ignore Mock this private so it triggers an error
163+
const postMessageSpy = jest.spyOn(buffer._compression, '_postMessage').mockImplementation(() => {
164+
return Promise.reject('test worker error');
165+
});
166+
167+
const result = await buffer.finish();
168+
169+
expect(postMessageSpy).toHaveBeenCalledTimes(1);
170+
171+
expect(result).toEqual(JSON.stringify([TEST_EVENT, TEST_EVENT]));
172+
});
148173
});
149174

150175
describe('EventBufferProxy fallback', () => {

0 commit comments

Comments
 (0)