diff --git a/apps/electron/main.js b/apps/electron/main.js index bbac17f56..a06653701 100644 --- a/apps/electron/main.js +++ b/apps/electron/main.js @@ -41,7 +41,7 @@ async function startBackend() { await initAssets(); - const result = await startServer(); + const result = await startServer(escalateError); loaded = result.message; await startIntegrations(); @@ -86,6 +86,11 @@ function askToQuit() { win.send('user-request-shutdown'); } +function escalateError(error) { + dialog.showErrorBox('An unrecoverable error occurred', error); + app.quit(); +} + // Ensure there isn't another instance of the app running already const lock = app.requestSingleInstanceLock(); if (!lock) { @@ -213,11 +218,8 @@ app.whenReady().then(() => { const trayMenuTemplate = getTrayMenu(bringToFront, askToQuit); const trayContextMenu = Menu.buildFromTemplate(trayMenuTemplate); tray.setContextMenu(trayContextMenu); - - }); - // unregister shortcuts before quitting app.once('will-quit', () => { globalShortcut.unregisterAll(); diff --git a/apps/server/src/app.ts b/apps/server/src/app.ts index 1e5125027..82afb50e9 100644 --- a/apps/server/src/app.ts +++ b/apps/server/src/app.ts @@ -153,9 +153,10 @@ export const initAssets = async () => { /** * Starts servers - * @return {Promise} */ -export const startServer = async () => { +export const startServer = async ( + escalateErrorFn?: (error: string) => void, +): Promise<{ message: string; serverPort: number }> => { checkStart(OntimeStartOrder.InitServer); const { serverPort } = DataProvider.getSettings(); @@ -185,6 +186,9 @@ export const startServer = async () => { }, }); + // initialise logging service, escalateErrorFn is only exists in electron + logger.init(escalateErrorFn); + // initialise rundown service const persistedRundown = DataProvider.getRundown(); const persistedCustomFields = DataProvider.getCustomFields(); diff --git a/apps/server/src/classes/Logger.ts b/apps/server/src/classes/Logger.ts index 689e5bfe7..51fbcc07f 100644 --- a/apps/server/src/classes/Logger.ts +++ b/apps/server/src/classes/Logger.ts @@ -8,19 +8,26 @@ import { consoleRed } from '../utils/console.js'; class Logger { private queue: Log[]; + private escalateErrorFn: (error: string) => void | null; constructor() { this.queue = []; + this.escalateErrorFn = null; } /** * Enabling setup logger after init */ - init() { + init(escalateErrorFn: (error: string) => void) { this.queue.forEach((log) => { this._push(log); }); this.queue = []; + + // we only get this when running in electron + if (escalateErrorFn) { + this.escalateErrorFn = escalateErrorFn; + } } private addToQueue(log: Log) { @@ -105,6 +112,7 @@ class Logger { */ crash(origin: string, text: string) { this.emit(LogLevel.Severe, origin, text); + this.escalateErrorFn?.(text); } /**