aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-23 13:40:47 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-23 15:48:30 +0100
commit950fb9be8061e2a26e0536b98c6a3ee230618f54 (patch)
treeb136dcc9add0d268a2e7a6288ec934a86d03b652 /packages/shared
parentfeat: Add shared package for electron ipc (diff)
downloadsophie-950fb9be8061e2a26e0536b98c6a3ee230618f54.tar.gz
sophie-950fb9be8061e2a26e0536b98c6a3ee230618f54.tar.zst
sophie-950fb9be8061e2a26e0536b98c6a3ee230618f54.zip
feat: Main to renderer store synchronization
Patches are send in one direction only, from the main to the renderer, so all actions have to go through the context bridge and the renderer IPC to modify the store in the renderer. This makes the store in the main process a single source of truth, which simplifies debugging and state persistence. The store in the renderer is connected to redux devtools for inspection, but playing back the state in the devtools won't change the sotre in main process.
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/package.json5
-rw-r--r--packages/shared/src/contextBridge/SophieRenderer.ts6
-rw-r--r--packages/shared/src/index.ts11
-rw-r--r--packages/shared/src/ipc/MainToRendererIpcMessage.ts4
-rw-r--r--packages/shared/src/ipc/RendererIpcMessage.ts3
-rw-r--r--packages/shared/src/ipc/RendererToMainIpcMessage.ts4
-rw-r--r--packages/shared/src/stores/SharedStore.ts23
-rw-r--r--packages/shared/vite.config.js8
8 files changed, 55 insertions, 9 deletions
diff --git a/packages/shared/package.json b/packages/shared/package.json
index ccde705..f49be47 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -3,6 +3,7 @@
3 "version": "0.1.0", 3 "version": "0.1.0",
4 "private": true, 4 "private": true,
5 "main": "dist/index.cjs", 5 "main": "dist/index.cjs",
6 "module": "dist/index.es.js",
6 "types": "dist/index.d.ts", 7 "types": "dist/index.d.ts",
7 "scripts": { 8 "scripts": {
8 "build": "vite build", 9 "build": "vite build",
@@ -11,5 +12,9 @@
11 "devDependencies": { 12 "devDependencies": {
12 "typescript": "^4.5.4", 13 "typescript": "^4.5.4",
13 "vite": "^2.7.6" 14 "vite": "^2.7.6"
15 },
16 "dependencies": {
17 "mobx": "^6.3.10",
18 "mobx-state-tree": "^5.1.0"
14 } 19 }
15} 20}
diff --git a/packages/shared/src/contextBridge/SophieRenderer.ts b/packages/shared/src/contextBridge/SophieRenderer.ts
index 91a0a3c..c878595 100644
--- a/packages/shared/src/contextBridge/SophieRenderer.ts
+++ b/packages/shared/src/contextBridge/SophieRenderer.ts
@@ -1,3 +1,7 @@
1import { SharedStoreListener } from '../stores/SharedStore';
2
1export interface SophieRenderer { 3export interface SophieRenderer {
2 buttonClicked(): void; 4 setSharedStoreListener(listener: SharedStoreListener): void;
5
6 buttonClick(): void;
3} 7}
diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts
index f95675d..7f192bd 100644
--- a/packages/shared/src/index.ts
+++ b/packages/shared/src/index.ts
@@ -1,3 +1,12 @@
1export type { SophieRenderer } from './contextBridge/SophieRenderer'; 1export type { SophieRenderer } from './contextBridge/SophieRenderer';
2 2
3export { RendererIpcMessage } from './ipc/RendererIpcMessage'; 3export { MainToRendererIpcMessage } from './ipc/MainToRendererIpcMessage';
4export { RendererToMainIpcMessage } from './ipc/RendererToMainIpcMessage';
5
6export type {
7 SharedStore,
8 SharedStoreListener,
9 SharedStoreSnapshotIn,
10 SharedStoreSnapshotOut,
11} from './stores/SharedStore';
12export { sharedStore } from './stores/SharedStore';
diff --git a/packages/shared/src/ipc/MainToRendererIpcMessage.ts b/packages/shared/src/ipc/MainToRendererIpcMessage.ts
new file mode 100644
index 0000000..2ddca80
--- /dev/null
+++ b/packages/shared/src/ipc/MainToRendererIpcMessage.ts
@@ -0,0 +1,4 @@
1export enum MainToRendererIpcMessage {
2 SharedStoreSnapshot = "sophie-shared-store-snapshot",
3 SharedStorePatch = "sophie-shared-store-patch",
4}
diff --git a/packages/shared/src/ipc/RendererIpcMessage.ts b/packages/shared/src/ipc/RendererIpcMessage.ts
deleted file mode 100644
index cfb87ae..0000000
--- a/packages/shared/src/ipc/RendererIpcMessage.ts
+++ /dev/null
@@ -1,3 +0,0 @@
1export enum RendererIpcMessage {
2 ButtonClicked = "button-clicked"
3}
diff --git a/packages/shared/src/ipc/RendererToMainIpcMessage.ts b/packages/shared/src/ipc/RendererToMainIpcMessage.ts
new file mode 100644
index 0000000..c4c682d
--- /dev/null
+++ b/packages/shared/src/ipc/RendererToMainIpcMessage.ts
@@ -0,0 +1,4 @@
1export enum RendererToMainIpcMessage {
2 SharedStoreSnapshotRequest = "sophie-shared-store-snapshot-request",
3 ButtonClick = "sophie-button-click"
4}
diff --git a/packages/shared/src/stores/SharedStore.ts b/packages/shared/src/stores/SharedStore.ts
new file mode 100644
index 0000000..8933bca
--- /dev/null
+++ b/packages/shared/src/stores/SharedStore.ts
@@ -0,0 +1,23 @@
1import {
2 IJsonPatch,
3 Instance,
4 types,
5 SnapshotIn,
6 SnapshotOut,
7} from 'mobx-state-tree';
8
9export const sharedStore = types.model("SharedStore", {
10 clickCount: 0
11});
12
13export interface SharedStore extends Instance<typeof sharedStore> {}
14
15export interface SharedStoreSnapshotIn extends SnapshotIn<typeof sharedStore> {}
16
17export interface SharedStoreSnapshotOut extends SnapshotOut<typeof sharedStore> {}
18
19export interface SharedStoreListener {
20 onSnapshot(snapshot: SharedStoreSnapshotIn): void;
21
22 onPatch(patch: IJsonPatch): void;
23}
diff --git a/packages/shared/vite.config.js b/packages/shared/vite.config.js
index cbebb8a..05ec118 100644
--- a/packages/shared/vite.config.js
+++ b/packages/shared/vite.config.js
@@ -26,15 +26,15 @@ const config = {
26 outDir: 'dist', 26 outDir: 'dist',
27 lib: { 27 lib: {
28 entry: 'src/index.ts', 28 entry: 'src/index.ts',
29 formats: ['cjs'], 29 formats: ['cjs', 'es'],
30 fileName: (format) => format === 'cjs' ? 'index.cjs' : `index.${format}.js`,
30 }, 31 },
31 rollupOptions: { 32 rollupOptions: {
32 external: [ 33 external: [
34 'mobx',
35 'mobx-state-tree',
33 ...builtinModules, 36 ...builtinModules,
34 ], 37 ],
35 output: {
36 entryFileNames: '[name].cjs',
37 },
38 }, 38 },
39 emptyOutDir: false, // Do not remove `.d.ts` files. 39 emptyOutDir: false, // Do not remove `.d.ts` files.
40 brotliSize: false, 40 brotliSize: false,