diff options
author | Kristóf Marussy <kristof@marussy.com> | 2021-12-27 02:15:13 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2021-12-27 02:37:38 +0100 |
commit | 3d9ee27d8d813101114cb15c448f2307a72eebb3 (patch) | |
tree | bacfa8fd77b6b2e8a7d4ead365fb5c4b3d956df9 /packages/preload/src/contextBridge/SophieRendererImpl.ts | |
parent | refactor: Improve error handling in preload (diff) | |
download | sophie-3d9ee27d8d813101114cb15c448f2307a72eebb3.tar.gz sophie-3d9ee27d8d813101114cb15c448f2307a72eebb3.tar.zst sophie-3d9ee27d8d813101114cb15c448f2307a72eebb3.zip |
test: Add preload unit tests
Diffstat (limited to 'packages/preload/src/contextBridge/SophieRendererImpl.ts')
-rw-r--r-- | packages/preload/src/contextBridge/SophieRendererImpl.ts | 48 |
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 { | |||
30 | import { RendererToMainIpcService } from '../services/RendererToMainIpcService'; | 30 | import { RendererToMainIpcService } from '../services/RendererToMainIpcService'; |
31 | 31 | ||
32 | class SophieRendererImpl implements SophieRenderer { | 32 | class 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 | ||
96 | export function createSophieRenderer(ipcService: RendererToMainIpcService): SophieRenderer { | 90 | export 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), |