diff --git a/src/preload.ts b/src/preload.ts index be844c84..c8fdb217 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -6,6 +6,7 @@ import { HarFile } from './types/har' import { GeneratorFile } from './types/generator' import { AddToastPayload } from './types/toast' import { AppSettings } from './types/settings' +import * as Sentry from './sentry' interface GetFilesResponse { recordings: string[] @@ -209,4 +210,6 @@ const studio = { contextBridge.exposeInMainWorld('studio', studio) +Sentry.configureRendererProcess(studio.settings.getSettings) + export type Studio = typeof studio diff --git a/src/renderer.ts b/src/renderer.ts index 694eb999..67f41290 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -29,9 +29,12 @@ import { ProxyData } from './types' import './index.tsx' import { setMonacoEnv } from './components/Monaco/setMonacoEnv' +import * as Sentry from './sentry' setMonacoEnv() +Sentry.configureRendererProcess() + // Proxy window.studio.proxy.onProxyData((_data: ProxyData) => {}) diff --git a/src/sentry.ts b/src/sentry.ts new file mode 100644 index 00000000..f42ac345 --- /dev/null +++ b/src/sentry.ts @@ -0,0 +1,25 @@ +import * as SentryRenderer from '@sentry/electron/renderer' +import { AppSettings } from './types/settings' + +export function configureRendererProcess( + getSettingsFn?: () => Promise +) { + if (process.env.NODE_ENV !== 'development') { + SentryRenderer.init({ + // conditionally send the event based on the user's settings + beforeSend: async (event) => { + const getSettings = getSettingsFn || window.studio.settings.getSettings + const { telemetry } = await getSettings() + if (telemetry.errorReport) { + return event + } + return null + }, + }) + + // attach event listener to catch unhandled promise rejections + window.addEventListener('unhandledrejection', (event) => { + SentryRenderer.captureException(event.reason) + }) + } +}