aboutsummaryrefslogtreecommitdiffstats
path: root/packages/preload/src/contextBridge/SophieRendererImpl.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/preload/src/contextBridge/SophieRendererImpl.ts')
-rw-r--r--packages/preload/src/contextBridge/SophieRendererImpl.ts48
1 files changed, 21 insertions, 27 deletions
diff --git a/packages/preload/src/contextBridge/SophieRendererImpl.ts b/packages/preload/src/contextBridge/SophieRendererImpl.ts
index 153fdd1..61b01e9 100644
--- a/packages/preload/src/contextBridge/SophieRendererImpl.ts
+++ b/packages/preload/src/contextBridge/SophieRendererImpl.ts
@@ -30,52 +30,46 @@ import {
30import { RendererToMainIpcService } from '../services/RendererToMainIpcService'; 30import { RendererToMainIpcService } from '../services/RendererToMainIpcService';
31 31
32class SophieRendererImpl implements SophieRenderer { 32class SophieRendererImpl implements SophieRenderer {
33 readonly #ipcService: RendererToMainIpcService; 33 readonly #ipcService = new RendererToMainIpcService();
34 34
35 #onSharedStoreChangeCalled = false; 35 #onSharedStoreChangeCalled: boolean = false;
36 36
37 #listener: SharedStoreListener | null = null; 37 #listener: SharedStoreListener | null = null;
38 38
39 constructor(ipcService: RendererToMainIpcService) { 39 constructor() {
40 this.#ipcService = ipcService; 40 this.#ipcService.onSharedStorePatch((patch) => {
41 ipcService.onSharedStorePatch((patch) => {
42 try { 41 try {
43 // `mobx-state-tree` will validate the patch, so we can safely cast here. 42 // `mobx-state-tree` will validate the patch, so we can safely cast here.
44 this.#listener?.onPatch(patch as IJsonPatch); 43 this.#listener?.onPatch(patch as IJsonPatch);
45 } catch (err) { 44 } catch (err) {
46 console.log('Shared store listener onPatch failed', err); 45 console.error('Shared store listener onPatch failed', err);
46 this.#listener = null;
47 } 47 }
48 }); 48 });
49 } 49 }
50 50
51 async #setSharedStoreChangeListener(listener: SharedStoreListener): Promise<void> { 51 async onSharedStoreChange(listener: SharedStoreListener): Promise<void> {
52 let snapshot: unknown; 52 if (this.#onSharedStoreChangeCalled) {
53 throw new Error('Shared store change listener was already set');
54 }
55 this.#onSharedStoreChangeCalled = true;
56 let success = false;
57 let snapshot: unknown | null = null;
53 try { 58 try {
54 snapshot = await this.#ipcService.getSharedStoreSnapshot(); 59 snapshot = await this.#ipcService.getSharedStoreSnapshot();
60 success = true;
55 } catch (err) { 61 } catch (err) {
56 console.error('Failed to get initial shared store snapshot', err); 62 console.error('Failed to get initial shared store snapshot', err);
57 return;
58 } 63 }
59 if (sharedStore.is(snapshot)) { 64 if (success) {
60 try { 65 if (sharedStore.is(snapshot)) {
61 listener.onSnapshot(snapshot); 66 listener.onSnapshot(snapshot);
62 } catch (err) { 67 this.#listener = listener;
63 console.error('Shared store listener onSnapshot failed', err);
64 return; 68 return;
65 } 69 }
66 this.#listener = listener; 70 console.error('Got invalid initial shared store snapshot', snapshot);
67 return;
68 } 71 }
69 console.error('Got invalid initial shared store snapshot', snapshot); 72 throw new Error('Failed to connect to shared store');
70 }
71
72 onSharedStoreChange(listener: SharedStoreListener): void {
73 if (this.#onSharedStoreChangeCalled) {
74 throw new Error('Shared store change listener was already set');
75 }
76 this.#setSharedStoreChangeListener(listener).catch((err) => {
77 console.log('Failed to set shared store change listener', err);
78 });
79 } 73 }
80 74
81 dispatchAction(actionToDispatch: Action): void { 75 dispatchAction(actionToDispatch: Action): void {
@@ -93,8 +87,8 @@ class SophieRendererImpl implements SophieRenderer {
93 } 87 }
94} 88}
95 89
96export function createSophieRenderer(ipcService: RendererToMainIpcService): SophieRenderer { 90export function createSophieRenderer(): SophieRenderer {
97 const impl = new SophieRendererImpl(ipcService); 91 const impl = new SophieRendererImpl();
98 return { 92 return {
99 onSharedStoreChange: impl.onSharedStoreChange.bind(impl), 93 onSharedStoreChange: impl.onSharedStoreChange.bind(impl),
100 dispatchAction: impl.dispatchAction.bind(impl), 94 dispatchAction: impl.dispatchAction.bind(impl),