@@ -53,7 +53,6 @@ import {
5353import { createClientReportEnvelope } from './utils-hoist/clientreport' ;
5454import { dsnToString , makeDsn } from './utils-hoist/dsn' ;
5555import { addItemToEnvelope , createAttachmentEnvelopeItem } from './utils-hoist/envelope' ;
56- import { SentryError } from './utils-hoist/error' ;
5756import { isParameterizedString , isPlainObject , isPrimitive , isThenable } from './utils-hoist/is' ;
5857import { logger } from './utils-hoist/logger' ;
5958import { checkOrSetAlreadyCaught , uuid4 } from './utils-hoist/misc' ;
@@ -69,6 +68,41 @@ import { _getSpanForScope } from './utils/spanOnScope';
6968const ALREADY_SEEN_ERROR = "Not capturing exception because it's already been captured." ;
7069const MISSING_RELEASE_FOR_SESSION_ERROR = 'Discarded session because of missing or non-string release' ;
7170
71+ const INTERNAL_ERROR_SYMBOL = Symbol . for ( 'SentryInternalError' ) ;
72+ const DO_NOT_SEND_EVENT_SYMBOL = Symbol . for ( 'SentryDoNotSendEventError' ) ;
73+
74+ interface InternalError {
75+ message : string ;
76+ [ INTERNAL_ERROR_SYMBOL ] : true ;
77+ }
78+
79+ interface DoNotSendEventError {
80+ message : string ;
81+ [ DO_NOT_SEND_EVENT_SYMBOL ] : true ;
82+ }
83+
84+ function makeInternalError ( message : string ) : InternalError {
85+ return {
86+ message,
87+ [ INTERNAL_ERROR_SYMBOL ] : true ,
88+ } ;
89+ }
90+
91+ function makeDoNotSendEventError ( message : string ) : DoNotSendEventError {
92+ return {
93+ message,
94+ [ DO_NOT_SEND_EVENT_SYMBOL ] : true ,
95+ } ;
96+ }
97+
98+ function isInternalError ( error : unknown ) : error is InternalError {
99+ return ! ! error && typeof error === 'object' && INTERNAL_ERROR_SYMBOL in error ;
100+ }
101+
102+ function isDoNotSendEventError ( error : unknown ) : error is DoNotSendEventError {
103+ return ! ! error && typeof error === 'object' && DO_NOT_SEND_EVENT_SYMBOL in error ;
104+ }
105+
72106/**
73107 * Base implementation for all JavaScript SDK clients.
74108 *
@@ -963,10 +997,10 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
963997 } ,
964998 reason => {
965999 if ( DEBUG_BUILD ) {
966- // If something's gone wrong, log the error as a warning. If it's just us having used a `SentryError` for
967- // control flow, log just the message (no stack) as a log-level log.
968- if ( reason instanceof SentryError && reason . logLevel === 'log' ) {
1000+ if ( isDoNotSendEventError ( reason ) ) {
9691001 logger . log ( reason . message ) ;
1002+ } else if ( isInternalError ( reason ) ) {
1003+ logger . warn ( reason . message ) ;
9701004 } else {
9711005 logger . warn ( reason ) ;
9721006 }
@@ -1010,9 +1044,8 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
10101044 if ( isError && typeof parsedSampleRate === 'number' && Math . random ( ) > parsedSampleRate ) {
10111045 this . recordDroppedEvent ( 'sample_rate' , 'error' ) ;
10121046 return rejectedSyncPromise (
1013- new SentryError (
1047+ makeDoNotSendEventError (
10141048 `Discarding event because it's not included in the random sample (sampling rate = ${ sampleRate } )` ,
1015- 'log' ,
10161049 ) ,
10171050 ) ;
10181051 }
@@ -1023,7 +1056,7 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
10231056 . then ( prepared => {
10241057 if ( prepared === null ) {
10251058 this . recordDroppedEvent ( 'event_processor' , dataCategory ) ;
1026- throw new SentryError ( 'An event processor returned `null`, will not send event.' , 'log ') ;
1059+ throw makeDoNotSendEventError ( 'An event processor returned `null`, will not send event.' ) ;
10271060 }
10281061
10291062 const isInternalException = hint . data && ( hint . data as { __sentry__ : boolean } ) . __sentry__ === true ;
@@ -1043,7 +1076,7 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
10431076 const spanCount = 1 + spans . length ;
10441077 this . recordDroppedEvent ( 'before_send' , 'span' , spanCount ) ;
10451078 }
1046- throw new SentryError ( `${ beforeSendLabel } returned \`null\`, will not send event.` , 'log' ) ;
1079+ throw makeDoNotSendEventError ( `${ beforeSendLabel } returned \`null\`, will not send event.` ) ;
10471080 }
10481081
10491082 const session = currentScope . getSession ( ) || isolationScope . getSession ( ) ;
@@ -1077,7 +1110,7 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
10771110 return processedEvent ;
10781111 } )
10791112 . then ( null , reason => {
1080- if ( reason instanceof SentryError ) {
1113+ if ( isDoNotSendEventError ( reason ) || isInternalError ( reason ) ) {
10811114 throw reason ;
10821115 }
10831116
@@ -1087,7 +1120,7 @@ export abstract class Client<O extends ClientOptions = ClientOptions> {
10871120 } ,
10881121 originalException : reason ,
10891122 } ) ;
1090- throw new SentryError (
1123+ throw makeInternalError (
10911124 `Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: ${ reason } ` ,
10921125 ) ;
10931126 } ) ;
@@ -1192,17 +1225,17 @@ function _validateBeforeSendResult(
11921225 if ( isThenable ( beforeSendResult ) ) {
11931226 return beforeSendResult . then (
11941227 event => {
1195- if ( ! isPlainObject ( event ) && event !== null ) {
1196- throw new SentryError ( invalidValueError ) ;
1228+ if ( ! isPlainObject ( event ) && event ) {
1229+ throw makeInternalError ( invalidValueError ) ;
11971230 }
11981231 return event ;
11991232 } ,
12001233 e => {
1201- throw new SentryError ( `${ beforeSendLabel } rejected with ${ e } ` ) ;
1234+ throw makeInternalError ( `${ beforeSendLabel } rejected with ${ e } ` ) ;
12021235 } ,
12031236 ) ;
1204- } else if ( ! isPlainObject ( beforeSendResult ) && beforeSendResult !== null ) {
1205- throw new SentryError ( invalidValueError ) ;
1237+ } else if ( ! isPlainObject ( beforeSendResult ) && beforeSendResult ) {
1238+ throw makeInternalError ( invalidValueError ) ;
12061239 }
12071240 return beforeSendResult ;
12081241}
0 commit comments