Skip to content

Commit 2a1cfed

Browse files
committed
ref(replay): Extract overwriteRecordDroppedEvent into fn
1 parent 667edd6 commit 2a1cfed

File tree

3 files changed

+47
-45
lines changed

3 files changed

+47
-45
lines changed

packages/replay/src/replay.ts

Lines changed: 4 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/* eslint-disable max-lines */ // TODO: We might want to split this file up
22
import { addGlobalEventProcessor, getCurrentHub, Scope, setContext } from '@sentry/core';
3-
import { Breadcrumb, Client, DataCategory, Event, EventDropReason } from '@sentry/types';
3+
import { Breadcrumb, Client, Event } from '@sentry/types';
44
import { addInstrumentationHandler, createEnvelope, logger } from '@sentry/utils';
55
import debounce from 'lodash.debounce';
66
import { PerformanceObserverEntryList } from 'perf_hooks';
@@ -39,6 +39,7 @@ import { createPayload } from './util/createPayload';
3939
import { dedupePerformanceEntries } from './util/dedupePerformanceEntries';
4040
import { isExpired } from './util/isExpired';
4141
import { isSessionExpired } from './util/isSessionExpired';
42+
import { overwriteRecordDroppedEvent, restoreRecordDroppedEvent } from './util/monkeyPatchRecordDroppedEvent';
4243

4344
/**
4445
* Returns true to return control to calling function, otherwise continue with normal batching
@@ -108,11 +109,6 @@ export class ReplayContainer {
108109
*/
109110
private _stopRecording: ReturnType<typeof record> | null = null;
110111

111-
/**
112-
* We overwrite `client.recordDroppedEvent`, but store the original method here so we can restore it.
113-
*/
114-
private _originalRecordDroppedEvent?: Client['recordDroppedEvent'];
115-
116112
private _context: InternalEventContext = {
117113
errorIds: new Set(),
118114
traceIds: new Set(),
@@ -310,7 +306,7 @@ export class ReplayContainer {
310306
WINDOW.addEventListener('focus', this.handleWindowFocus);
311307

312308
// We need to filter out dropped events captured by `addGlobalEventProcessor(this.handleGlobalEvent)` below
313-
this._overwriteRecordDroppedEvent();
309+
overwriteRecordDroppedEvent(this._context.errorIds);
314310

315311
// There is no way to remove these listeners, so ensure they are only added once
316312
if (!this._hasInitializedCoreListeners) {
@@ -374,7 +370,7 @@ export class ReplayContainer {
374370
WINDOW.removeEventListener('blur', this.handleWindowBlur);
375371
WINDOW.removeEventListener('focus', this.handleWindowFocus);
376372

377-
this._restoreRecordDroppedEvent();
373+
restoreRecordDroppedEvent();
378374

379375
if (this._performanceObserver) {
380376
this._performanceObserver.disconnect();
@@ -1249,39 +1245,4 @@ export class ReplayContainer {
12491245
saveSession(this.session);
12501246
}
12511247
}
1252-
1253-
private _overwriteRecordDroppedEvent(): void {
1254-
const client = getCurrentHub().getClient();
1255-
1256-
if (!client) {
1257-
return;
1258-
}
1259-
1260-
const _originalCallback = client.recordDroppedEvent.bind(client);
1261-
1262-
const recordDroppedEvent: Client['recordDroppedEvent'] = (
1263-
reason: EventDropReason,
1264-
category: DataCategory,
1265-
event?: Event,
1266-
): void => {
1267-
if (event && event.event_id) {
1268-
this._context.errorIds.delete(event.event_id);
1269-
}
1270-
1271-
return _originalCallback(reason, category, event);
1272-
};
1273-
1274-
client.recordDroppedEvent = recordDroppedEvent;
1275-
this._originalRecordDroppedEvent = _originalCallback;
1276-
}
1277-
1278-
private _restoreRecordDroppedEvent(): void {
1279-
const client = getCurrentHub().getClient();
1280-
1281-
if (!client || !this._originalRecordDroppedEvent) {
1282-
return;
1283-
}
1284-
1285-
client.recordDroppedEvent = this._originalRecordDroppedEvent;
1286-
}
12871248
}
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import { getCurrentHub } from '@sentry/core';
2+
import { Client, DataCategory, Event, EventDropReason } from '@sentry/types';
3+
4+
let _originalRecordDroppedEvent: Client['recordDroppedEvent'] | undefined;
5+
6+
export function overwriteRecordDroppedEvent(errorIds: Set<string>): void {
7+
const client = getCurrentHub().getClient();
8+
9+
if (!client) {
10+
return;
11+
}
12+
13+
const _originalCallback = client.recordDroppedEvent.bind(client);
14+
15+
const recordDroppedEvent: Client['recordDroppedEvent'] = (
16+
reason: EventDropReason,
17+
category: DataCategory,
18+
event?: Event,
19+
): void => {
20+
if (event && event.event_id) {
21+
errorIds.delete(event.event_id);
22+
}
23+
24+
return _originalCallback(reason, category, event);
25+
};
26+
27+
client.recordDroppedEvent = recordDroppedEvent;
28+
_originalRecordDroppedEvent = _originalCallback;
29+
}
30+
31+
export function restoreRecordDroppedEvent(): void {
32+
const client = getCurrentHub().getClient();
33+
34+
if (!client || !_originalRecordDroppedEvent) {
35+
return;
36+
}
37+
38+
client.recordDroppedEvent = _originalRecordDroppedEvent;
39+
}

packages/replay/test/unit/index-handleGlobalEvent.test.ts

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

33
import { REPLAY_EVENT_NAME } from '../../src/constants';
4+
import { overwriteRecordDroppedEvent, restoreRecordDroppedEvent } from '../../src/util/monkeyPatchRecordDroppedEvent';
45
import { ReplayContainer } from './../../src/replay';
56
import { Error } from './../fixtures/error';
67
import { Transaction } from './../fixtures/transaction';
@@ -93,7 +94,8 @@ it('strips out dropped events from errorIds', async () => {
9394
const error2 = Error({ event_id: 'err2' });
9495
const error3 = Error({ event_id: 'err3' });
9596

96-
replay['_overwriteRecordDroppedEvent']();
97+
// @ts-ignore private
98+
overwriteRecordDroppedEvent(replay._context.errorIds);
9799

98100
const client = getCurrentHub().getClient()!;
99101

@@ -106,7 +108,7 @@ it('strips out dropped events from errorIds', async () => {
106108
// @ts-ignore private
107109
expect(Array.from(replay._context.errorIds)).toEqual(['err1', 'err3']);
108110

109-
replay['_restoreRecordDroppedEvent']();
111+
restoreRecordDroppedEvent();
110112
});
111113

112114
it('tags errors and transactions with replay id for session samples', async () => {

0 commit comments

Comments
 (0)