5
5
DataCategory ,
6
6
DsnComponents ,
7
7
Envelope ,
8
+ ErrorEvent ,
8
9
Event ,
9
10
EventDropReason ,
10
11
EventHint ,
@@ -15,6 +16,7 @@ import {
15
16
SessionAggregates ,
16
17
Severity ,
17
18
SeverityLevel ,
19
+ TransactionEvent ,
18
20
Transport ,
19
21
} from '@sentry/types' ;
20
22
import {
@@ -627,14 +629,15 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
627
629
return rejectedSyncPromise ( new SentryError ( 'SDK not enabled, will not capture event.' , 'log' ) ) ;
628
630
}
629
631
630
- const isTransaction = event . type === 'transaction' ;
631
- const beforeSendProcessorName = isTransaction ? 'beforeSendTransaction' : 'beforeSend' ;
632
- const beforeSendProcessor = options [ beforeSendProcessorName ] ;
632
+ const isTransaction = isTransactionEvent ( event ) ;
633
+ const isError = isErrorEvent ( event ) ;
634
+ const eventType = event . type || 'error' ;
635
+ const beforeSendLabel = `before send for type \`${ eventType } \`` ;
633
636
634
637
// 1.0 === 100% events are sent
635
638
// 0.0 === 0% events are sent
636
639
// Sampling for transaction happens somewhere else
637
- if ( ! isTransaction && typeof sampleRate === 'number' && Math . random ( ) > sampleRate ) {
640
+ if ( isError && typeof sampleRate === 'number' && Math . random ( ) > sampleRate ) {
638
641
this . recordDroppedEvent ( 'sample_rate' , 'error' , event ) ;
639
642
return rejectedSyncPromise (
640
643
new SentryError (
@@ -647,22 +650,22 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
647
650
return this . _prepareEvent ( event , hint , scope )
648
651
. then ( prepared => {
649
652
if ( prepared === null ) {
650
- this . recordDroppedEvent ( 'event_processor' , event . type || 'error' , event ) ;
653
+ this . recordDroppedEvent ( 'event_processor' , eventType , event ) ;
651
654
throw new SentryError ( 'An event processor returned `null`, will not send event.' , 'log' ) ;
652
655
}
653
656
654
657
const isInternalException = hint . data && ( hint . data as { __sentry__ : boolean } ) . __sentry__ === true ;
655
- if ( isInternalException || ! beforeSendProcessor ) {
658
+ if ( isInternalException ) {
656
659
return prepared ;
657
660
}
658
661
659
- const beforeSendResult = beforeSendProcessor ( prepared , hint ) ;
660
- return _validateBeforeSendResult ( beforeSendResult , beforeSendProcessorName ) ;
662
+ const result = processBeforeSend ( options , prepared , hint ) ;
663
+ return _validateBeforeSendResult ( result , beforeSendLabel ) ;
661
664
} )
662
665
. then ( processedEvent => {
663
666
if ( processedEvent === null ) {
664
667
this . recordDroppedEvent ( 'before_send' , event . type || 'error' , event ) ;
665
- throw new SentryError ( `\` ${ beforeSendProcessorName } \` returned \`null\`, will not send event.` , 'log' ) ;
668
+ throw new SentryError ( `${ beforeSendLabel } returned \`null\`, will not send event.` , 'log' ) ;
666
669
}
667
670
668
671
const session = scope && scope . getSession ( ) ;
@@ -779,9 +782,9 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
779
782
*/
780
783
function _validateBeforeSendResult (
781
784
beforeSendResult : PromiseLike < Event | null > | Event | null ,
782
- beforeSendProcessorName : 'beforeSend' | 'beforeSendTransaction' ,
785
+ beforeSendLabel : string ,
783
786
) : PromiseLike < Event | null > | Event | null {
784
- const invalidValueError = `\` ${ beforeSendProcessorName } \` must return \`null\` or a valid event.` ;
787
+ const invalidValueError = `${ beforeSendLabel } must return \`null\` or a valid event.` ;
785
788
if ( isThenable ( beforeSendResult ) ) {
786
789
return beforeSendResult . then (
787
790
event => {
@@ -791,11 +794,40 @@ function _validateBeforeSendResult(
791
794
return event ;
792
795
} ,
793
796
e => {
794
- throw new SentryError ( `\` ${ beforeSendProcessorName } \` rejected with ${ e } ` ) ;
797
+ throw new SentryError ( `${ beforeSendLabel } rejected with ${ e } ` ) ;
795
798
} ,
796
799
) ;
797
800
} else if ( ! isPlainObject ( beforeSendResult ) && beforeSendResult !== null ) {
798
801
throw new SentryError ( invalidValueError ) ;
799
802
}
800
803
return beforeSendResult ;
801
804
}
805
+
806
+ /**
807
+ * Process the matching `beforeSendXXX` callback.
808
+ */
809
+ function processBeforeSend (
810
+ options : ClientOptions ,
811
+ event : Event ,
812
+ hint : EventHint ,
813
+ ) : PromiseLike < Event | null > | Event | null {
814
+ const { beforeSend, beforeSendTransaction } = options ;
815
+
816
+ if ( isErrorEvent ( event ) && beforeSend ) {
<
F438
/td>817
+ return beforeSend ( event , hint ) ;
818
+ }
819
+
820
+ if ( isTransactionEvent ( event ) && beforeSendTransaction ) {
821
+ return beforeSendTransaction ( event , hint ) ;
822
+ }
823
+
824
+ return event ;
825
+ }
826
+
827
+ function isErrorEvent ( event : Event ) : event is ErrorEvent {
828
+ return event . type === undefined ;
829
+ }
830
+
831
+ function isTransactionEvent ( event : Event ) : event is TransactionEvent {
832
+ return event . type === 'transaction' ;
833
+ }
0 commit comments