11import { addBreadcrumb } from '@sentry/core' ;
2- import type { ErrorEvent , Event , EventHint } from '@sentry/types' ;
2+ import type { Event , EventHint } from '@sentry/types' ;
33import { logger } from '@sentry/utils' ;
44
5- import { REPLAY_EVENT_NAME } from '../constants' ;
65import type { ReplayContainer } from '../types' ;
6+ import { isErrorEvent , isReplayEvent , isTransactionEvent } from '../util/eventUtils' ;
77import { isRrwebError } from '../util/isRrwebError' ;
8- import { handleAfterSendError } from './handleAfterSendError ' ;
8+ import { handleAfterSendEvent } from './handleAfterSendEvent ' ;
99
1010/**
1111 * Returns a listener to be added to `addGlobalEventProcessor(listener)`.
1212 */
1313export function handleGlobalEventListener (
1414 replay : ReplayContainer ,
15- includeErrorHandling = false ,
15+ includeAfterSendEventHandling = false ,
1616) : ( event : Event , hint : EventHint ) => Event | null {
17- const errorHandler = includeErrorHandling ? handleAfterSendError ( replay ) : undefined ;
17+ const afterSendHandler = includeAfterSendEventHandling ? handleAfterSendEvent ( replay ) : undefined ;
1818
1919 return ( event : Event , hint : EventHint ) => {
20- // Do not apply replayId to the root event
21- if ( event . type === REPLAY_EVENT_NAME ) {
20+ if ( isReplayEvent ( event ) ) {
2221 // Replays have separate set of breadcrumbs, do not include breadcrumbs
2322 // from core SDK
2423 delete event . breadcrumbs ;
2524 return event ;
2625 }
2726
27+ // We only want to handle errors & transactions, nothing else
28+ if ( ! isErrorEvent ( event ) && ! isTransactionEvent ( event ) ) {
29+ return event ;
30+ }
31+
2832 // Unless `captureExceptions` is enabled, we want to ignore errors coming from rrweb
2933 // As there can be a bunch of stuff going wrong in internals there, that we don't want to bubble up to users
3034 if ( isRrwebError ( event , hint ) && ! replay . getOptions ( ) . _experiments . captureExceptions ) {
@@ -33,28 +37,20 @@ export function handleGlobalEventListener(
3337 }
3438
3539 // Only tag transactions with replayId if not waiting for an error
36- // @ts -ignore private
37- if ( ! event . type || replay . recordingMode === 'session' ) {
40+ if ( isErrorEvent ( event ) || ( isTransactionEvent ( event ) && replay . recordingMode === 'session' ) ) {
3841 event . tags = { ...event . tags , replayId : replay . getSessionId ( ) } ;
3942 }
4043
41- // Collect traceIds in _context regardless of `recordingMode` - if it's true,
42- // _context gets cleared on every checkout
43- if ( event . type === 'transaction' && event . contexts && event . contexts . trace && event . contexts . trace . trace_id ) {
44- replay . getContext ( ) . traceIds . add ( event . contexts . trace . trace_id as string ) ;
45- return event ;
46- }
47-
48- if ( __DEBUG_BUILD__ && replay . getOptions ( ) . _experiments . traceInternals ) {
44+ if ( __DEBUG_BUILD__ && replay . getOptions ( ) . _experiments . traceInternals && isErrorEvent ( event ) ) {
4945 const exc = getEventExceptionValues ( event ) ;
5046 addInternalBreadcrumb ( {
5147 message : `Tagging event (${ event . event_id } ) - ${ event . message } - ${ exc . type } : ${ exc . value } ` ,
5248 } ) ;
5349 }
5450
55- if ( errorHandler && ! event . type ) {
51+ if ( afterSendHandler ) {
5652 // Pretend the error had a 200 response so we capture it
57- errorHandler ( event as ErrorEvent , { statusCode : 200 } ) ;
53+ afterSendHandler ( event , { statusCode : 200 } ) ;
5854 }
5955
6056 return event ;
0 commit comments