import _ from 'lodash'; import * as sentry from '@sentry/browser'; 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 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, isProduction } = window.Lidarr; if (!analytics) { return; } const dsn = isProduction ? 'https://c3a5b33e08de4e18b7d0505e942dbc95@sentry.io/216290' : 'https://baede6f14da54cf48ff431479e400adf@sentry.io/1249427'; sentry.init({ dsn, environment: isProduction ? 'production' : 'development', release, sendDefaultPii: true, beforeSend: cleanseData }); sentry.configureScope((scope) => { scope.setTag('branch', branch); scope.setTag('version', version); }); return createMiddleware(); }