diff options
author | Kristóf Marussy <kristof@marussy.com> | 2021-12-23 13:40:47 +0100 |
---|---|---|
committer | Kristóf Marussy <kristof@marussy.com> | 2021-12-23 15:48:30 +0100 |
commit | 950fb9be8061e2a26e0536b98c6a3ee230618f54 (patch) | |
tree | b136dcc9add0d268a2e7a6288ec934a86d03b652 /packages/shared | |
parent | feat: Add shared package for electron ipc (diff) | |
download | sophie-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.json | 5 | ||||
-rw-r--r-- | packages/shared/src/contextBridge/SophieRenderer.ts | 6 | ||||
-rw-r--r-- | packages/shared/src/index.ts | 11 | ||||
-rw-r--r-- | packages/shared/src/ipc/MainToRendererIpcMessage.ts | 4 | ||||
-rw-r--r-- | packages/shared/src/ipc/RendererIpcMessage.ts | 3 | ||||
-rw-r--r-- | packages/shared/src/ipc/RendererToMainIpcMessage.ts | 4 | ||||
-rw-r--r-- | packages/shared/src/stores/SharedStore.ts | 23 | ||||
-rw-r--r-- | packages/shared/vite.config.js | 8 |
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 @@ | |||
1 | import { SharedStoreListener } from '../stores/SharedStore'; | ||
2 | |||
1 | export interface SophieRenderer { | 3 | export 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 @@ | |||
1 | export type { SophieRenderer } from './contextBridge/SophieRenderer'; | 1 | export type { SophieRenderer } from './contextBridge/SophieRenderer'; |
2 | 2 | ||
3 | export { RendererIpcMessage } from './ipc/RendererIpcMessage'; | 3 | export { MainToRendererIpcMessage } from './ipc/MainToRendererIpcMessage'; |
4 | export { RendererToMainIpcMessage } from './ipc/RendererToMainIpcMessage'; | ||
5 | |||
6 | export type { | ||
7 | SharedStore, | ||
8 | SharedStoreListener, | ||
9 | SharedStoreSnapshotIn, | ||
10 | SharedStoreSnapshotOut, | ||
11 | } from './stores/SharedStore'; | ||
12 | export { 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 @@ | |||
1 | export 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 @@ | |||
1 | export 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 @@ | |||
1 | export 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 @@ | |||
1 | import { | ||
2 | IJsonPatch, | ||
3 | Instance, | ||
4 | types, | ||
5 | SnapshotIn, | ||
6 | SnapshotOut, | ||
7 | } from 'mobx-state-tree'; | ||
8 | |||
9 | export const sharedStore = types.model("SharedStore", { | ||
10 | clickCount: 0 | ||
11 | }); | ||
12 | |||
13 | export interface SharedStore extends Instance<typeof sharedStore> {} | ||
14 | |||
15 | export interface SharedStoreSnapshotIn extends SnapshotIn<typeof sharedStore> {} | ||
16 | |||
17 | export interface SharedStoreSnapshotOut extends SnapshotOut<typeof sharedStore> {} | ||
18 | |||
19 | export 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, |