import _ from 'lodash'; import * as sentry from '@sentry/browser'; import * as Integrations from '@sentry/integrations'; import parseUrl from 'Utilities/String/parseUrl'; function cleanseUrl(url) { const properties = parseUrl(url); return `${properties.pathname}${properties.search}`; } function cleanseData(data) { const result = _.cloneDeep(data); result.transaction = cleanseUrl(result.transaction); if (result.exception) { result.exception.values.forEach((exception) => { const stacktrace = exception.stacktrace; if (stacktrace) { stacktrace.frames.forEach((frame) => { frame.filename = cleanseUrl(frame.filename); }); } }); } result.request.url = cleanseUrl(result.request.url); return result; } function identity(stuff) { return stuff; } function stripUrlBase(frame) { if (frame.filename && window.Radarr.urlBase) { frame.filename = frame.filename.replace(window.Readarr.urlBase, ''); } return frame; } function createMiddleware() { return (store) => (next) => (action) => { try { // Adds a breadcrumb for reporting later (if necessary). sentry.addBreadcrumb({ category: 'redux', message: action.type }); return next(action); } catch (err) { console.error(`[sentry] Reporting error to Sentry: ${err}`); // Send the report including breadcrumbs. sentry.captureException(err, { extra: { action: identity(action), state: identity(store.getState()) } }); } }; } export default function createSentryMiddleware() { const { analytics, branch, version, release, userHash, isProduction } = window.Readarr; if (!analytics) { return; } const dsn = isProduction ? 'https://c2c8e08845994dbfb7eddb158b408172@sentry.radarr.video/18' : 'https://c2c8e08845994dbfb7eddb158b408172@sentry.radarr.video/18'; sentry.init({ dsn, environment: branch, release, sendDefaultPii: true, beforeSend: cleanseData, integrations: [ new Integrations.RewriteFrames({ iteratee: stripUrlBase }), new Integrations.Dedupe() ] }); sentry.configureScope((scope) => { scope.setUser({ username: userHash }); scope.setTag('version', version); scope.setTag('production', isProduction); }); return createMiddleware(); }