From b85b11cf1a0386e8889822773c48143121ce1085 Mon Sep 17 00:00:00 2001 From: Mike Clark Date: Sat, 1 Mar 2025 20:10:25 +0000 Subject: [PATCH 1/6] init when not ssl --- .../src/browser-preload.browser.js | 28 ++++++++++++------- packages/desktop-client/src/browser-server.js | 12 +------- .../platform/client/fetch/index.browser.ts | 6 ++++ 3 files changed, 25 insertions(+), 21 deletions(-) diff --git a/packages/desktop-client/src/browser-preload.browser.js b/packages/desktop-client/src/browser-preload.browser.js index 30a40dda606..e228ea0354c 100644 --- a/packages/desktop-client/src/browser-preload.browser.js +++ b/packages/desktop-client/src/browser-preload.browser.js @@ -31,16 +31,24 @@ function createBackendWorker() { localStorage.removeItem('SharedArrayBufferOverride'); } - worker.postMessage({ - type: 'init', - version: ACTUAL_VERSION, - isDev: IS_DEV, - publicUrl: process.env.PUBLIC_URL, - hash: process.env.REACT_APP_BACKEND_WORKER_HASH, - isSharedArrayBufferOverrideEnabled: localStorage.getItem( - 'SharedArrayBufferOverride', - ), - }); + worker.onmessage = event => { + // Send init only when the worker is ready to receive messages + if ( + event.data.type === 'init' && + event.data.name === 'client-ready-to-receive-messages' + ) { + worker.postMessage({ + type: 'init', + version: ACTUAL_VERSION, + isDev: IS_DEV, + publicUrl: process.env.PUBLIC_URL, + hash: process.env.REACT_APP_BACKEND_WORKER_HASH, + isSharedArrayBufferOverrideEnabled: localStorage.getItem( + 'SharedArrayBufferOverride', + ), + }); + } + }; } createBackendWorker(); diff --git a/packages/desktop-client/src/browser-server.js b/packages/desktop-client/src/browser-server.js index 3052ea8f451..e0573c332f7 100644 --- a/packages/desktop-client/src/browser-server.js +++ b/packages/desktop-client/src/browser-server.js @@ -42,22 +42,12 @@ self.addEventListener('message', async event => { const msg = event.data; if (msg.type === 'init') { + console.info('received init'); hasInitialized = true; const isDev = !!msg.isDev; // let version = msg.version; const hash = msg.hash; - if ( - !self.SharedArrayBuffer && - !msg.isSharedArrayBufferOverrideEnabled - ) { - self.postMessage({ - type: 'app-init-failure', - SharedArrayBufferMissing: true, - }); - return; - } - await importScriptsWithRetry( `${msg.publicUrl}/kcab/kcab.worker.${hash}.js`, { maxRetries: isDev ? 5 : 0 }, 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..8125a51ac86 100644 --- a/packages/loot-core/src/platform/client/fetch/index.browser.ts +++ b/packages/loot-core/src/platform/client/fetch/index.browser.ts @@ -142,6 +142,12 @@ function connectWorker(worker, onOpen, onError) { if (worker instanceof MessagePort) { worker.start(); } + + // Signify that we're ready to receive messages + globalWorker.postMessage({ + type: 'init', + name: 'client-ready-to-receive-messages', + }); } export const init: T.Init = async function (worker) { From 3657549e1d43659c334c36d9d667d5f4ba6f63da Mon Sep 17 00:00:00 2001 From: Mike Clark Date: Sat, 1 Mar 2025 20:15:26 +0000 Subject: [PATCH 2/6] bringing it all back --- packages/desktop-client/src/browser-server.js | 11 +++++++++++ .../src/platform/client/fetch/index.browser.ts | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/desktop-client/src/browser-server.js b/packages/desktop-client/src/browser-server.js index e0573c332f7..5870b8e171d 100644 --- a/packages/desktop-client/src/browser-server.js +++ b/packages/desktop-client/src/browser-server.js @@ -48,6 +48,17 @@ self.addEventListener('message', async event => { // let version = msg.version; const hash = msg.hash; + if ( + !self.SharedArrayBuffer && + !msg.isSharedArrayBufferOverrideEnabled + ) { + self.postMessage({ + type: 'app-init-failure', + SharedArrayBufferMissing: true, + }); + return; + } + await importScriptsWithRetry( `${msg.publicUrl}/kcab/kcab.worker.${hash}.js`, { maxRetries: isDev ? 5 : 0 }, 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 8125a51ac86..439447ddeae 100644 --- a/packages/loot-core/src/platform/client/fetch/index.browser.ts +++ b/packages/loot-core/src/platform/client/fetch/index.browser.ts @@ -146,7 +146,7 @@ function connectWorker(worker, onOpen, onError) { // Signify that we're ready to receive messages globalWorker.postMessage({ type: 'init', - name: 'client-ready-to-receive-messages', + name: 'worker-ready-to-receive-messages', }); } From 903b6e6797be2bc72964ffcc9c5ed9d607e9bdaf Mon Sep 17 00:00:00 2001 From: Mike Clark Date: Sat, 1 Mar 2025 20:57:33 +0000 Subject: [PATCH 3/6] huh --- .../desktop-client/src/browser-preload.browser.js | 11 ++++------- .../src/platform/client/fetch/index.browser.ts | 4 ++-- .../src/platform/server/connection/index.web.ts | 5 +++++ 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/desktop-client/src/browser-preload.browser.js b/packages/desktop-client/src/browser-preload.browser.js index e228ea0354c..10618ba2eee 100644 --- a/packages/desktop-client/src/browser-preload.browser.js +++ b/packages/desktop-client/src/browser-preload.browser.js @@ -24,19 +24,16 @@ const ACTUAL_VERSION = Platform.isPlaywright let worker; function createBackendWorker() { - worker = new Worker(backendWorkerUrl); - initSQLBackend(worker); - if (window.SharedArrayBuffer) { localStorage.removeItem('SharedArrayBufferOverride'); } + worker = new Worker(backendWorkerUrl); + initSQLBackend(worker); + worker.onmessage = event => { // Send init only when the worker is ready to receive messages - if ( - event.data.type === 'init' && - event.data.name === 'client-ready-to-receive-messages' - ) { + if (event.data.name === 'worker-ready-for-messages') { worker.postMessage({ type: 'init', version: ACTUAL_VERSION, 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 439447ddeae..24cda0cb6ad 100644 --- a/packages/loot-core/src/platform/client/fetch/index.browser.ts +++ b/packages/loot-core/src/platform/client/fetch/index.browser.ts @@ -144,9 +144,9 @@ function connectWorker(worker, onOpen, onError) { } // Signify that we're ready to receive messages + console.info('worker-ready-for-messages'); globalWorker.postMessage({ - type: 'init', - name: 'worker-ready-to-receive-messages', + name: 'worker-ready-for-messages', }); } 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..26d7ad55c6a 100644 --- a/packages/loot-core/src/platform/server/connection/index.web.ts +++ b/packages/loot-core/src/platform/server/connection/index.web.ts @@ -44,6 +44,11 @@ export const init: T.Init = function (serverChn, handlers) { return; } + if (msg.name === 'worker-ready-for-messages') { + console.info('Backend: Ready for messages'); + return; + } + if (msg.name === 'client-connected-to-backend') { // the client is indicating that it is connected to this backend. Stop attempting to connect console.info('Backend: Client connected'); From bea97066fb8c10471c0b13d7f323ed0e7962f7b4 Mon Sep 17 00:00:00 2001 From: Mike Clark Date: Sat, 1 Mar 2025 22:50:19 +0000 Subject: [PATCH 4/6] race conditions.... --- .../src/browser-preload.browser.js | 31 +++++++-------- packages/desktop-client/src/browser-server.js | 38 +++++++++++++++---- .../desktop-client/src/components/App.tsx | 4 +- .../platform/client/fetch/index.browser.ts | 9 ++--- .../platform/server/connection/index.web.ts | 7 +--- 5 files changed, 49 insertions(+), 40 deletions(-) diff --git a/packages/desktop-client/src/browser-preload.browser.js b/packages/desktop-client/src/browser-preload.browser.js index 10618ba2eee..30a40dda606 100644 --- a/packages/desktop-client/src/browser-preload.browser.js +++ b/packages/desktop-client/src/browser-preload.browser.js @@ -24,28 +24,23 @@ const ACTUAL_VERSION = Platform.isPlaywright let worker; function createBackendWorker() { + worker = new Worker(backendWorkerUrl); + initSQLBackend(worker); + if (window.SharedArrayBuffer) { localStorage.removeItem('SharedArrayBufferOverride'); } - worker = new Worker(backendWorkerUrl); - initSQLBackend(worker); - - worker.onmessage = event => { - // Send init only when the worker is ready to receive messages - if (event.data.name === 'worker-ready-for-messages') { - worker.postMessage({ - type: 'init', - version: ACTUAL_VERSION, - isDev: IS_DEV, - publicUrl: process.env.PUBLIC_URL, - hash: process.env.REACT_APP_BACKEND_WORKER_HASH, - isSharedArrayBufferOverrideEnabled: localStorage.getItem( - 'SharedArrayBufferOverride', - ), - }); - } - }; + worker.postMessage({ + type: 'init', + version: ACTUAL_VERSION, + isDev: IS_DEV, + publicUrl: process.env.PUBLIC_URL, + hash: process.env.REACT_APP_BACKEND_WORKER_HASH, + isSharedArrayBufferOverrideEnabled: localStorage.getItem( + 'SharedArrayBufferOverride', + ), + }); } createBackendWorker(); diff --git a/packages/desktop-client/src/browser-server.js b/packages/desktop-client/src/browser-server.js index 5870b8e171d..1b56916b744 100644 --- a/packages/desktop-client/src/browser-server.js +++ b/packages/desktop-client/src/browser-server.js @@ -36,13 +36,30 @@ 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') { - console.info('received init'); + console.info('init'); hasInitialized = true; const isDev = !!msg.isDev; // let version = msg.version; @@ -52,10 +69,11 @@ self.addEventListener('message', async event => { !self.SharedArrayBuffer && !msg.isSharedArrayBufferOverrideEnabled ) { - self.postMessage({ + appInitFailureInterval = postMessageWithRetry({ type: 'app-init-failure', SharedArrayBufferMissing: true, }); + return; } @@ -66,19 +84,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 24cda0cb6ad..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( @@ -142,12 +145,6 @@ function connectWorker(worker, onOpen, onError) { if (worker instanceof MessagePort) { worker.start(); } - - // Signify that we're ready to receive messages - console.info('worker-ready-for-messages'); - globalWorker.postMessage({ - name: 'worker-ready-for-messages', - }); } export const init: T.Init = async function (worker) { 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 26d7ad55c6a..f889a0a57e2 100644 --- a/packages/loot-core/src/platform/server/connection/index.web.ts +++ b/packages/loot-core/src/platform/server/connection/index.web.ts @@ -44,11 +44,6 @@ export const init: T.Init = function (serverChn, handlers) { return; } - if (msg.name === 'worker-ready-for-messages') { - console.info('Backend: Ready for messages'); - return; - } - if (msg.name === 'client-connected-to-backend') { // the client is indicating that it is connected to this backend. Stop attempting to connect console.info('Backend: Client connected'); @@ -115,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) { From 55eff84fc7562ed546ea2352e3ca06d5f6a9871d Mon Sep 17 00:00:00 2001 From: Mike Clark Date: Sat, 1 Mar 2025 23:04:18 +0000 Subject: [PATCH 5/6] release notes --- upcoming-release-notes/4499.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 upcoming-release-notes/4499.md 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 From cdd6392a502a9c367168458c09e0564c61607bce Mon Sep 17 00:00:00 2001 From: Mike Clark Date: Sat, 1 Mar 2025 23:08:11 +0000 Subject: [PATCH 6/6] remove unneeded console log --- packages/desktop-client/src/browser-server.js | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/desktop-client/src/browser-server.js b/packages/desktop-client/src/browser-server.js index 1b56916b744..e573a665a28 100644 --- a/packages/desktop-client/src/browser-server.js +++ b/packages/desktop-client/src/browser-server.js @@ -59,7 +59,6 @@ self.addEventListener('message', async event => { const msg = event.data; if (!hasInitialized) { if (msg.type === 'init') { - console.info('init'); hasInitialized = true; const isDev = !!msg.isDev; // let version = msg.version;