@sentry/browser
Version:
Official Sentry SDK for browsers
87 lines (76 loc) • 2.7 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
const browserUtils = require('@sentry-internal/browser-utils');
const core = require('@sentry/core');
const debugBuild = require('../debug-build.js');
const INTEGRATION_NAME = 'SpotlightBrowser';
const _spotlightIntegration = ((options = {}) => {
const sidecarUrl = options.sidecarUrl || 'http://localhost:8969/stream';
return {
name: INTEGRATION_NAME,
setup: () => {
debugBuild.DEBUG_BUILD && core.logger.log('Using Sidecar URL', sidecarUrl);
},
// We don't want to send interaction transactions/root spans created from
// clicks within Spotlight to Sentry. Neither do we want them to be sent to
// spotlight.
processEvent: event => (isSpotlightInteraction(event) ? null : event),
afterAllSetup: (client) => {
setupSidecarForwarding(client, sidecarUrl);
},
};
}) ;
function setupSidecarForwarding(client, sidecarUrl) {
const makeFetch = browserUtils.getNativeImplementation('fetch');
let failCount = 0;
client.on('beforeEnvelope', (envelope) => {
if (failCount > 3) {
core.logger.warn('[Spotlight] Disabled Sentry -> Spotlight integration due to too many failed requests:', failCount);
return;
}
makeFetch(sidecarUrl, {
method: 'POST',
body: core.serializeEnvelope(envelope),
headers: {
'Content-Type': 'application/x-sentry-envelope',
},
mode: 'cors',
}).then(
res => {
if (res.status >= 200 && res.status < 400) {
// Reset failed requests counter on success
failCount = 0;
}
},
err => {
failCount++;
core.logger.error(
"Sentry SDK can't connect to Sidecar is it running? See: https://spotlightjs.com/sidecar/npx/",
err,
);
},
);
});
}
/**
* Use this integration to send errors and transactions to Spotlight.
*
* Learn more about spotlight at https://spotlightjs.com
*/
const spotlightBrowserIntegration = core.defineIntegration(_spotlightIntegration);
/**
* Flags if the event is a transaction created from an interaction with the spotlight UI.
*/
function isSpotlightInteraction(event) {
return Boolean(
event.type === 'transaction' &&
event.spans &&
event.contexts &&
event.contexts.trace &&
event.contexts.trace.op === 'ui.action.click' &&
event.spans.some(({ description }) => description?.includes('#sentry-spotlight')),
);
}
exports.INTEGRATION_NAME = INTEGRATION_NAME;
exports.isSpotlightInteraction = isSpotlightInteraction;
exports.spotlightBrowserIntegration = spotlightBrowserIntegration;
//# sourceMappingURL=spotlight.js.map