@@ -13,7 +13,6 @@ import { eventFromException, eventFromMessage } from './eventbuilder';
1313import { Breadcrumbs } from './integrations' ;
1414import { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs' ;
1515import { BrowserTransportOptions } from './transports/types' ;
16- import { sendReport } from './transports/utils' ;
1716
1817const globalObject = getGlobalObject < Window > ( ) ;
1918
@@ -165,7 +164,19 @@ export class BrowserClient extends BaseClient<BrowserClientOptions> {
165164 const envelope = createClientReportEnvelope ( outcomes , this . _options . tunnel && dsnToString ( this . _dsn ) ) ;
166165
167166 try {
168- sendReport ( url , serializeEnvelope ( envelope ) ) ;
167+ const global = getGlobalObject < Window > ( ) ;
168+ const isRealNavigator = Object . prototype . toString . call ( global && global . navigator ) === '[object Navigator]' ;
169+ const hasSendBeacon = isRealNavigator && typeof global . navigator . sendBeacon === 'function' ;
170+ // Make sure beacon is not used if user configures custom transport options
171+ if ( hasSendBeacon && ! this . _options . transportOptions ) {
172+ // Prevent illegal invocations - https://xgwang.me/posts/you-may-not-know-beacon/#it-may-throw-error%2C-be-sure-to-catch
173+ const sendBeacon = global . navigator . sendBeacon . bind ( global . navigator ) ;
174+ sendBeacon ( url , serializeEnvelope ( envelope ) ) ;
175+ } else {
176+ // If beacon is not supported or if they are using the tunnel option
177+ // use our regular transport to send client reports to Sentry.
178+ this . _sendEnvelope ( envelope ) ;
179+ }
169180 } catch ( e ) {
170181 __DEBUG_BUILD__ && logger . error ( e ) ;
171182 }
0 commit comments