55 DataCategory ,
66 DsnComponents ,
77 Envelope ,
8+ ErrorEvent ,
89 Event ,
910 EventDropReason ,
1011 EventHint ,
@@ -15,6 +16,7 @@ import {
1516 SessionAggregates ,
1617 Severity ,
1718 SeverityLevel ,
19+ TransactionEvent ,
1820 Transport ,
1921} from '@sentry/types' ;
2022import {
@@ -627,14 +629,15 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
627629 return rejectedSyncPromise ( new SentryError ( 'SDK not enabled, will not capture event.' , 'log' ) ) ;
628630 }
629631
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 } \`` ;
633636
634637 // 1.0 === 100% events are sent
635638 // 0.0 === 0% events are sent
636639 // Sampling for transaction happens somewhere else
637- if ( ! isTransaction && typeof sampleRate === 'number' && Math . random ( ) > sampleRate ) {
640+ if ( isError && typeof sampleRate === 'number' && Math . random ( ) > sampleRate ) {
638641 this . recordDroppedEvent ( 'sample_rate' , 'error' , event ) ;
639642 return rejectedSyncPromise (
640643 new SentryError (
@@ -647,22 +650,22 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
647650 return this . _prepareEvent ( event , hint , scope )
648651 . then ( prepared => {
649652 if ( prepared === null ) {
650- this . recordDroppedEvent ( 'event_processor' , event . type || 'error' , event ) ;
653+ this . recordDroppedEvent ( 'event_processor' , eventType , event ) ;
651654 throw new SentryError ( 'An event processor returned `null`, will not send event.' , 'log' ) ;
652655 }
653656
654657 const isInternalException = hint . data && ( hint . data as { __sentry__ : boolean } ) . __sentry__ === true ;
655- if ( isInternalException || ! beforeSendProcessor ) {
658+ if ( isInternalException ) {
656659 return prepared ;
657660 }
658661
659- const beforeSendResult = beforeSendProcessor ( prepared , hint ) ;
660- return _validateBeforeSendResult ( beforeSendResult , beforeSendProcessorName ) ;
662+ const result = processBeforeSend ( options , prepared , hint ) ;
663+ return _validateBeforeSendResult ( result , beforeSendLabel ) ;
661664 } )
662665 . then ( processedEvent => {
663666 if ( processedEvent === null ) {
664667 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' ) ;
666669 }
667670
668671 const session = scope && scope . getSession ( ) ;
@@ -779,9 +782,9 @@ export abstract class BaseClient<O extends ClientOptions> implements Client<O> {
779782 */
780783function _validateBeforeSendResult (
781784 beforeSendResult : PromiseLike < Event | null > | Event | null ,
782- beforeSendProcessorName : 'beforeSend' | 'beforeSendTransaction' ,
785+ beforeSendLabel : string ,
783786) : 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.` ;
785788 if ( isThenable ( beforeSendResult ) ) {
786789 return beforeSendResult . then (
787790 event => {
@@ -791,11 +794,40 @@ function _validateBeforeSendResult(
791794 return event ;
792795 } ,
793796 e => {
794- throw new SentryError ( `\` ${ beforeSendProcessorName } \` rejected with ${ e } ` ) ;
797+ throw new SentryError ( `${ beforeSendLabel } rejected with ${ e } ` ) ;
795798 } ,
796799 ) ;
797800 } else if ( ! isPlainObject ( beforeSendResult ) && beforeSendResult !== null ) {
798801 throw new SentryError ( invalidValueError ) ;
799802 }
800803 return beforeSendResult ;
801804}
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 ) {
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