@@ -13,7 +13,6 @@ import { eventFromException, eventFromMessage } from './eventbuilder';
13
13
import { Breadcrumbs } from './integrations' ;
14
14
import { BREADCRUMB_INTEGRATION_ID } from './integrations/breadcrumbs' ;
15
15
import { BrowserTransportOptions } from './transports/types' ;
16
- import { sendReport } from './transports/utils' ;
17
16
18
17
const globalObject = getGlobalObject < Window > ( ) ;
19
18
@@ -165,7 +164,19 @@ export class BrowserClient extends BaseClient<BrowserClientOptions> {
165
164
const envelope = createClientReportEnvelope ( outcomes , this . _options . tunnel && dsnToString ( this . _dsn ) ) ;
166
165
167
166
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
+ }
169
180
} catch ( e ) {
170
181
__DEBUG_BUILD__ && logger . error ( e ) ;
171
182
}
0 commit comments