Skip to content

Commit 3a8f9f0

Browse files
committed
fix(replay): Ensure initial event is compressed
1 parent ec27c34 commit 3a8f9f0

File tree

4 files changed

+26
-15
lines changed

4 files changed

+26
-15
lines changed

packages/replay/src/eventBuffer/EventBufferProxy.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ export class EventBufferProxy implements EventBuffer {
2020
this._compression = new EventBufferCompressionWorker(worker);
2121
this._used = this._fallback;
2222

23-
void this._ensureWorkerIsLoaded();
23+
void this.ensureWorkerIsLoaded();
2424
}
2525

2626
/** @inheritDoc */
@@ -60,7 +60,7 @@ export class EventBufferProxy implements EventBuffer {
6060
}
6161

6262
/** Ensure the worker has loaded. */
63-
private async _ensureWorkerIsLoaded(): Promise<void> {
63+
public async ensureWorkerIsLoaded(): Promise<void> {
6464
try {
6565
await this._compression.ensureReady();
6666
} catch (error) {

packages/replay/src/replay.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import { disabledUntil, logger } from '@sentry/utils';
66
import { EventType, record } from 'rrweb';
77

88
import {
9+
ERROR_CHECKOUT_TIME,
910
MAX_SESSION_LIFE,
1011
SESSION_IDLE_DURATION,
1112
VISIBILITY_CHANGE_TIMEOUT,
1213
WINDOW,
13-
ERROR_CHECKOUT_TIME,
1414
} from './constants';
1515
import { setupPerformanceObserver } from './coreHandlers/performanceObserver';
1616
import { createEventBuffer } from './eventBuffer';
17+
import { EventBufferProxy } from './eventBuffer/EventBufferProxy';
1718
import { getSession } from './session/getSession';
1819
import { saveSession } from './session/saveSession';
1920
import type {
@@ -328,9 +329,18 @@ export class ReplayContainer implements ReplayContainerInterface {
328329
* from calling both `flush` and `_debouncedFlush`. Otherwise, there could be
329330
* cases of mulitple flushes happening closely together.
330331
*/
331-
public flushImmediate(): Promise<void> {
332+
public async flushImmediate(waitForCompression?: boolean): Promise<void> {
332333
this._debouncedFlush();
333334
// `.flush` is provided by the debounced function, analogously to lodash.debounce
335+
336+
// Ensure the worker is loaded, so the sent event is compressed
337+
if (waitForCompression && this.eventBuffer instanceof EventBufferProxy) {
338+
try {
339+
await this.eventBuffer.ensureWorkerIsLoaded();
340+
} catch (error) {
341+
// If this fails, we'll just send uncompressed events
342+
}
343+
}
334344
return this._debouncedFlush.flush() as Promise<void>;
335345
}
336346

@@ -541,7 +551,8 @@ export class ReplayContainer implements ReplayContainerInterface {
541551
// replays (e.g. opening and closing a tab quickly), but these can be
542552
// filtered on the UI.
543553
if (this.recordingMode === 'session') {
544-
void this.flushImmediate();
554+
// We want to ensure the worker is ready, as otherwise we'd always send the first event uncompressed
555+
void this.flushImmediate(true);
545556
}
546557

547558
return true;

packages/replay/test/integration/errorSampleRate.test.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@ import { captureException } from '@sentry/core';
22

33
import {
44
DEFAULT_FLUSH_MIN_DELAY,
5+
ERROR_CHECKOUT_TIME,
56
REPLAY_SESSION_KEY,
67
VISIBILITY_CHANGE_TIMEOUT,
78
WINDOW,
8-
ERROR_CHECKOUT_TIME,
99
} from '../../src/constants';
1010
import type { ReplayContainer } from '../../src/replay';
1111
import { addEvent } from '../../src/util/addEvent';

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

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ describe('Unit | eventBuffer', () => {
8383
expect(buffer).toBeInstanceOf(EventBufferProxy);
8484

8585
// Ensure worker is ready
86-
await buffer['_ensureWorkerIsLoaded']();
86+
await buffer.ensureWorkerIsLoaded();
8787

8888
buffer.addEvent(TEST_EVENT);
8989
buffer.addEvent(TEST_EVENT);
@@ -105,7 +105,7 @@ describe('Unit | eventBuffer', () => {
105105
expect(buffer).toBeInstanceOf(EventBufferProxy);
106106

107107
// Ensure worker is ready
108-
await buffer['_ensureWorkerIsLoaded']();
108+
await buffer.ensureWorkerIsLoaded();
109109

110110
buffer.addEvent(TEST_EVENT);
111111
buffer.addEvent(TEST_EVENT);
@@ -129,7 +129,7 @@ describe('Unit | eventBuffer', () => {
129129
expect(buffer).toBeInstanceOf(EventBufferProxy);
130130

131131
// Ensure worker is ready
132-
await buffer['_ensureWorkerIsLoaded']();
132+
await buffer.ensureWorkerIsLoaded();
133133

134134
buffer.addEvent({ data: { order: 1 }, timestamp: BASE_TIMESTAMP, type: 2 });
135135
buffer.addEvent({ data: { order: 2 }, timestamp: BASE_TIMESTAMP, type: 3 });
@@ -162,7 +162,7 @@ describe('Unit | eventBuffer', () => {
162162
expect(buffer).toBeInstanceOf(EventBufferProxy);
163163

164164
// Ensure worker is ready
165-
await buffer['_ensureWorkerIsLoaded']();
165+
await buffer.ensureWorkerIsLoaded();
166166

167167
buffer.addEvent({ data: { order: 1 }, timestamp: BASE_TIMESTAMP, type: 2 });
168168
buffer.addEvent({ data: { order: 2 }, timestamp: BASE_TIMESTAMP, type: 3 });
@@ -198,7 +198,7 @@ describe('Unit | eventBuffer', () => {
198198
expect(buffer).toBeInstanceOf(EventBufferProxy);
199199

200200
// Ensure worker is ready
201-
await buffer['_ensureWorkerIsLoaded']();
201+
await buffer.ensureWorkerIsLoaded();
202202

203203
buffer.addEvent(TEST_EVENT);
204204
buffer.addEvent(TEST_EVENT);
@@ -223,7 +223,7 @@ describe('Unit | eventBuffer', () => {
223223
expect(buffer).toBeInstanceOf(EventBufferProxy);
224224

225225
// Ensure worker is ready
226-
await buffer['_ensureWorkerIsLoaded']();
226+
await buffer.ensureWorkerIsLoaded();
227227

228228
buffer.addEvent(TEST_EVENT);
229229

@@ -247,7 +247,7 @@ describe('Unit | eventBuffer', () => {
247247
expect(buffer).toBeInstanceOf(EventBufferProxy);
248248

249249
// Ensure worker is ready
250-
await buffer['_ensureWorkerIsLoaded']();
250+
await buffer.ensureWorkerIsLoaded();
251251

252252
buffer.addEvent(TEST_EVENT);
253253

@@ -297,7 +297,7 @@ describe('Unit | eventBuffer', () => {
297297
expect(result).toEqual(JSON.stringify([TEST_EVENT, TEST_EVENT]));
298298

299299
// Now actually finish loading the worker
300-
await buffer['_ensureWorkerIsLoaded']();
300+
await buffer.ensureWorkerIsLoaded();
301301

302302
buffer.addEvent(TEST_EVENT);
303303
buffer.addEvent(TEST_EVENT);
@@ -331,7 +331,7 @@ describe('Unit | eventBuffer', () => {
331331
expect(result).toEqual(JSON.stringify([TEST_EVENT, TEST_EVENT]));
332332

333333
// Now actually finish loading the worker - which triggers an error
334-
await buffer['_ensureWorkerIsLoaded']();
334+
await buffer.ensureWorkerIsLoaded();
335335

336336
buffer.addEvent(TEST_EVENT);
337337
buffer.addEvent(TEST_EVENT);

0 commit comments

Comments
 (0)