diff --git a/src/main/actions/setupIPCForwarding.js b/src/main/actions/setupIPCForwarding.js index 0b52c908..3aae68ef 100644 --- a/src/main/actions/setupIPCForwarding.js +++ b/src/main/actions/setupIPCForwarding.js @@ -1,10 +1,19 @@ import { ipcMain } from "electron"; +// Sentry for main process +const Sentry = require("@sentry/electron/main"); export const setupIPCForwardingToBackground = (backgroundWindow) => { ipcMain.handle( "forward-event-from-webapp-to-background-and-await-reply", async (event, incomingData) => { return new Promise((resolve) => { + // Check if backgroundWindow is available and not destroyed (check on each IPC call) + if (!backgroundWindow || backgroundWindow.isDestroyed()) { + const errorMessage = "Background process unavailable during IPC communication"; + console.error(errorMessage); + Sentry.captureException(new Error(errorMessage)); + } + const { actualPayload, eventName } = incomingData; ipcMain.once(`reply-${eventName}`, (responseEvent, responsePayload) => { resolve(responsePayload); diff --git a/src/main/actions/startBackgroundProcess.js b/src/main/actions/startBackgroundProcess.js index 8b04d734..11b2eba7 100644 --- a/src/main/actions/startBackgroundProcess.js +++ b/src/main/actions/startBackgroundProcess.js @@ -1,5 +1,6 @@ /* eslint-disable */ import { enable as enableWebContents } from "@electron/remote/main"; +import { captureException } from "@sentry/browser"; /** Babel */ require("core-js/stable"); require("regenerator-runtime/runtime"); @@ -27,28 +28,34 @@ const startBackgroundProcess = async () => { return new Promise(async (resolve) => { let backgroundWindow = await getState("backgroundWindow"); if (!backgroundWindow) { - backgroundWindow = await setState(null, { - stateName: "backgroundWindow", - // Background Process Window - newValue: new BrowserWindow({ - width: 800, - height: 600, - show: - process.env.NODE_ENV === "development" || - process.env.DEBUG_PROD === "true", - webPreferences: { - nodeIntegration: true, - contextIsolation: false, - enableRemoteModule: true, - }, - }), - }); - enableWebContents(backgroundWindow.webContents); + try { + backgroundWindow = await setState(null, { + stateName: "backgroundWindow", + // Background Process Window + newValue: new BrowserWindow({ + width: 800, + height: 600, + show: + process.env.NODE_ENV === "development" || + process.env.DEBUG_PROD === "true", + webPreferences: { + nodeIntegration: true, + contextIsolation: false, + enableRemoteModule: true, + }, + }), + }); + enableWebContents(backgroundWindow.webContents); + } catch (error) { + console.error(error); + captureException(error); + resolve(false); + return; + } } else { logger.log( "startBackgroundProcess: A background windows already exists. Cancelling." ); - resolve(true); return; } @@ -75,6 +82,11 @@ const startBackgroundProcess = async () => { // Set state global.isBackgroundProcessActive = true; + backgroundWindow.on("closed", () => { + console.error("Background window closed unexpectedly"); + captureException(new Error("Background window closed unexpectedly")); + }) + backgroundWindow.webContents.on("did-finish-load", () => { resolve(true); });