Object.defineProperty(exports, '__esModule', { value: true }); const utils = require('@sentry/utils'); const debugBuild = require('../debug-build.js'); const integration = require('../integration.js'); // "Script error." is hard coded into browsers for errors that it can't read. // this is the result of a script being pulled in from an external domain and CORS. const DEFAULT_IGNORE_ERRORS = [ /^Script error\.?$/, /^Javascript error: Script error\.? on line 0$/, /^ResizeObserver loop completed with undelivered notifications.$/, /^Cannot redefine property: googletag$/, ]; const DEFAULT_IGNORE_TRANSACTIONS = [ /^.*\/healthcheck$/, /^.*\/healthy$/, /^.*\/live$/, /^.*\/ready$/, /^.*\/heartbeat$/, /^.*\/health$/, /^.*\/healthz$/, ]; /** Options for the InboundFilters integration */ const INTEGRATION_NAME = 'InboundFilters'; const _inboundFiltersIntegration = ((options = {}) => { return { name: INTEGRATION_NAME, // TODO v8: Remove this setupOnce() {}, // eslint-disable-line @typescript-eslint/no-empty-function processEvent(event, _hint, client) { const clientOptions = client.getOptions(); const mergedOptions = _mergeOptions(options, clientOptions); return _shouldDropEvent(event, mergedOptions) ? null : event; }, }; }) ; const inboundFiltersIntegration = integration.defineIntegration(_inboundFiltersIntegration); /** * Inbound filters configurable by the user. * @deprecated Use `inboundFiltersIntegration()` instead. */ // eslint-disable-next-line deprecation/deprecation const InboundFilters = integration.convertIntegrationFnToClass( INTEGRATION_NAME, inboundFiltersIntegration, ) ; function _mergeOptions( internalOptions = {}, clientOptions = {}, ) { return { allowUrls: [...(internalOptions.allowUrls || []), ...(clientOptions.allowUrls || [])], denyUrls: [...(internalOptions.denyUrls || []), ...(clientOptions.denyUrls || [])], ignoreErrors: [ ...(internalOptions.ignoreErrors || []), ...(clientOptions.ignoreErrors || []), ...(internalOptions.disableErrorDefaults ? [] : DEFAULT_IGNORE_ERRORS), ], ignoreTransactions: [ ...(internalOptions.ignoreTransactions || []), ...(clientOptions.ignoreTransactions || []), ...(internalOptions.disableTransactionDefaults ? [] : DEFAULT_IGNORE_TRANSACTIONS), ], ignoreInternal: internalOptions.ignoreInternal !== undefined ? internalOptions.ignoreInternal : true, }; } function _shouldDropEvent(event, options) { if (options.ignoreInternal && _isSentryError(event)) { debugBuild.DEBUG_BUILD && utils.logger.warn(`Event dropped due to being internal Sentry Error.\nEvent: ${utils.getEventDescription(event)}`); return true; } if (_isIgnoredError(event, options.ignoreErrors)) { debugBuild.DEBUG_BUILD && utils.logger.warn( `Event dropped due to being matched by \`ignoreErrors\` option.\nEvent: ${utils.getEventDescription(event)}`, ); return true; } if (_isIgnoredTransaction(event, options.ignoreTransactions)) { debugBuild.DEBUG_BUILD && utils.logger.warn( `Event dropped due to being matched by \`ignoreTransactions\` option.\nEvent: ${utils.getEventDescription(event)}`, ); return true; } if (_isDeniedUrl(event, options.denyUrls)) { debugBuild.DEBUG_BUILD && utils.logger.warn( `Event dropped due to being matched by \`denyUrls\` option.\nEvent: ${utils.getEventDescription( event, )}.\nUrl: ${_getEventFilterUrl(event)}`, ); return true; } if (!_isAllowedUrl(event, options.allowUrls)) { debugBuild.DEBUG_BUILD && utils.logger.warn( `Event dropped due to not being matched by \`allowUrls\` option.\nEvent: ${utils.getEventDescription( event, )}.\nUrl: ${_getEventFilterUrl(event)}`, ); return true; } return false; } function _isIgnoredError(event, ignoreErrors) { // If event.type, this is not an error if (event.type || !ignoreErrors || !ignoreErrors.length) { return false; } return _getPossibleEventMessages(event).some(message => utils.stringMatchesSomePattern(message, ignoreErrors)); } function _isIgnoredTransaction(event, ignoreTransactions) { if (event.type !== 'transaction' || !ignoreTransactions || !ignoreTransactions.length) { return false; } const name = event.transaction; return name ? utils.stringMatchesSomePattern(name, ignoreTransactions) : false; } function _isDeniedUrl(event, denyUrls) { // TODO: Use Glob instead? if (!denyUrls || !denyUrls.length) { return false; } const url = _getEventFilterUrl(event); return !url ? false : utils.stringMatchesSomePattern(url, denyUrls); } function _isAllowedUrl(event, allowUrls) { // TODO: Use Glob instead? if (!allowUrls || !allowUrls.length) { return true; } const url = _getEventFilterUrl(event); return !url ? true : utils.stringMatchesSomePattern(url, allowUrls); } function _getPossibleEventMessages(event) { const possibleMessages = []; if (event.message) { possibleMessages.push(event.message); } let lastException; try { // @ts-expect-error Try catching to save bundle size // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access lastException = event.exception.values[event.exception.values.length - 1]; } catch (e) { // try catching to save bundle size checking existence of variables } if (lastException) { if (lastException.value) { possibleMessages.push(lastException.value); if (lastException.type) { possibleMessages.push(`${lastException.type}: ${lastException.value}`); } } } if (debugBuild.DEBUG_BUILD && possibleMessages.length === 0) { utils.logger.error(`Could not extract message for event ${utils.getEventDescription(event)}`); } return possibleMessages; } function _isSentryError(event) { try { // @ts-expect-error can't be a sentry error if undefined // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access return event.exception.values[0].type === 'SentryError'; } catch (e) { // ignore } return false; } function _getLastValidUrl(frames = []) { for (let i = frames.length - 1; i >= 0; i--) { const frame = frames[i]; if (frame && frame.filename !== '' && frame.filename !== '[native code]') { return frame.filename || null; } } return null; } function _getEventFilterUrl(event) { try { let frames; try { // @ts-expect-error we only care about frames if the whole thing here is defined frames = event.exception.values[0].stacktrace.frames; } catch (e) { // ignore } return frames ? _getLastValidUrl(frames) : null; } catch (oO) { debugBuild.DEBUG_BUILD && utils.logger.error(`Cannot extract url for event ${utils.getEventDescription(event)}`); return null; } } exports.InboundFilters = InboundFilters; exports.inboundFiltersIntegration = inboundFiltersIntegration; //# sourceMappingURL=inboundfilters.js.map