diff --git a/packages/desktop-client/src/browser-server.js b/packages/desktop-client/src/browser-server.js index 3052ea8f451..e573a665a28 100644 --- a/packages/desktop-client/src/browser-server.js +++ b/packages/desktop-client/src/browser-server.js @@ -36,11 +36,28 @@ const importScriptsWithRetry = async (script, { maxRetries = 5 } = {}) => { } }; +const RECONNECT_INTERVAL_MS = 200; +const MAX_RECONNECT_ATTEMPTS = 500; +let reconnectAttempts = 0; + +const postMessageWithRetry = message => { + const reconnectToClientInterval = setInterval(() => { + self.postMessage(message); + + reconnectAttempts++; + if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) { + clearInterval(reconnectToClientInterval); + } + }, RECONNECT_INTERVAL_MS); + + return reconnectToClientInterval; +}; + +let appInitFailureInterval; self.addEventListener('message', async event => { try { + const msg = event.data; if (!hasInitialized) { - const msg = event.data; - if (msg.type === 'init') { hasInitialized = true; const isDev = !!msg.isDev; @@ -51,10 +68,11 @@ self.addEventListener('message', async event => { !self.SharedArrayBuffer && !msg.isSharedArrayBufferOverrideEnabled ) { - self.postMessage({ + appInitFailureInterval = postMessageWithRetry({ type: 'app-init-failure', SharedArrayBufferMissing: true, }); + return; } @@ -65,19 +83,23 @@ self.addEventListener('message', async event => { backend.initApp(isDev, self).catch(err => { console.log(err); - const msg = { + appInitFailureInterval = postMessageWithRetry({ type: 'app-init-failure', IDBFailure: err.message.includes('indexeddb-failure'), - }; - self.postMessage(msg); + }); throw err; }); } } + + if (msg.name === '__app-init-failure-acknowledged') { + // Clear the interval if the client has acknowledged the failure, otherwise keep retrying + clearInterval(appInitFailureInterval); + } } catch (error) { console.log('Failed initializing backend:', error); - self.postMessage({ + appInitFailureInterval = postMessageWithRetry({ type: 'app-init-failure', BackendInitFailure: true, }); diff --git a/packages/desktop-client/src/components/App.tsx b/packages/desktop-client/src/components/App.tsx index b40d3625055..459a7062167 100644 --- a/packages/desktop-client/src/components/App.tsx +++ b/packages/desktop-client/src/components/App.tsx @@ -127,9 +127,9 @@ function AppInner() { } initAll().catch(showErrorBoundary); - // Removed cloudFileId from dependencies to prevent hard crash when closing budget in Electron + // Removed cloudFileId & t from dependencies to prevent hard crash when closing budget in Electron // eslint-disable-next-line react-hooks/exhaustive-deps - }, [dispatch, showErrorBoundary, t]); + }, [dispatch, showErrorBoundary]); useEffect(() => { global.Actual.updateAppMenu(budgetId); diff --git a/packages/loot-core/src/platform/client/fetch/index.browser.ts b/packages/loot-core/src/platform/client/fetch/index.browser.ts index defc478021d..f2587ba895a 100644 --- a/packages/loot-core/src/platform/client/fetch/index.browser.ts +++ b/packages/loot-core/src/platform/client/fetch/index.browser.ts @@ -107,6 +107,9 @@ function connectWorker(worker, onOpen, onError) { }); onOpen(); } else if (msg.type === 'app-init-failure') { + globalWorker.postMessage({ + name: '__app-init-failure-acknowledged', + }); onError(msg); } else if (msg.type === 'capture-exception') { captureException( diff --git a/packages/loot-core/src/platform/server/connection/index.web.ts b/packages/loot-core/src/platform/server/connection/index.web.ts index c34766d53a8..f889a0a57e2 100644 --- a/packages/loot-core/src/platform/server/connection/index.web.ts +++ b/packages/loot-core/src/platform/server/connection/index.web.ts @@ -110,7 +110,7 @@ export const init: T.Init = function (serverChn, handlers) { let reconnectAttempts = 0; const reconnectToClientInterval = setInterval(() => { - console.info('Backend: Atempting to connect to client'); + console.info('Backend: Trying to connect to client'); serverChannel.postMessage({ type: 'connect' }); reconnectAttempts++; if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) { diff --git a/upcoming-release-notes/4499.md b/upcoming-release-notes/4499.md new file mode 100644 index 00000000000..4dea5db9655 --- /dev/null +++ b/upcoming-release-notes/4499.md @@ -0,0 +1,6 @@ +--- +category: Bugfix +authors: [MikesGlitch] +--- + +Fixed error modal not showing when using non-secure context