aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-24 01:36:20 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-24 01:36:20 +0100
commitcf3ec7fc396125ed452c553b34ae2737329fc61d (patch)
tree6d2fdbb40b9c9b1d32168d1ccb2372b5602f1968
parentfeat: Set up partition persistence (diff)
downloadsophie-cf3ec7fc396125ed452c553b34ae2737329fc61d.tar.gz
sophie-cf3ec7fc396125ed452c553b34ae2737329fc61d.tar.zst
sophie-cf3ec7fc396125ed452c553b34ae2737329fc61d.zip
feat: Service to main process communication
-rw-r--r--package.json4
-rw-r--r--packages/main/package.json1
-rw-r--r--packages/main/src/index.ts51
-rw-r--r--packages/main/tsconfig.json3
-rw-r--r--packages/preload/src/SophieRendererImpl.ts5
-rw-r--r--packages/renderer/src/devTools.ts13
-rw-r--r--packages/renderer/src/index.tsx6
-rw-r--r--packages/service-preload/package.json22
-rw-r--r--packages/service-preload/src/index.ts29
-rw-r--r--packages/service-preload/tsconfig.json17
-rw-r--r--packages/service-preload/vite.config.js31
-rw-r--r--packages/service-shared/package.json21
-rw-r--r--packages/service-shared/src/index.ts (renamed from packages/shared/src/ipc/RendererToMainIpcMessage.ts)13
-rw-r--r--packages/service-shared/src/ipc.ts (renamed from packages/shared/src/ipc/MainToRendererIpcMessage.ts)5
-rw-r--r--packages/service-shared/src/schemas.ts28
-rw-r--r--packages/service-shared/tsconfig.json12
-rw-r--r--packages/service-shared/vite.config.js34
-rw-r--r--packages/shared/package.json11
-rw-r--r--packages/shared/src/contextBridge/SophieRenderer.ts2
-rw-r--r--packages/shared/src/index.ts6
-rw-r--r--packages/shared/src/ipc.ts31
-rw-r--r--scripts/watch.js37
-rw-r--r--yarn.lock24
23 files changed, 370 insertions, 36 deletions
diff --git a/package.json b/package.json
index a3754dd..b03bdd4 100644
--- a/package.json
+++ b/package.json
@@ -25,12 +25,16 @@
25 "main": "yarn workspace @sophie/main", 25 "main": "yarn workspace @sophie/main",
26 "preload": "yarn workspace @sophie/preload", 26 "preload": "yarn workspace @sophie/preload",
27 "renderer": "yarn workspace @sophie/renderer", 27 "renderer": "yarn workspace @sophie/renderer",
28 "service-preload": "yarn workspace @sophie/service-preload",
29 "service-shared": "yarn workspace @sophie/service-shared",
28 "shared": "yarn workspace @sophie/shared" 30 "shared": "yarn workspace @sophie/shared"
29 }, 31 },
30 "workspaces": [ 32 "workspaces": [
31 "packages/main", 33 "packages/main",
32 "packages/preload", 34 "packages/preload",
33 "packages/renderer", 35 "packages/renderer",
36 "packages/service-preload",
37 "packages/service-shared",
34 "packages/shared" 38 "packages/shared"
35 ], 39 ],
36 "devDependencies": { 40 "devDependencies": {
diff --git a/packages/main/package.json b/packages/main/package.json
index 014c511..a23d791 100644
--- a/packages/main/package.json
+++ b/packages/main/package.json
@@ -10,6 +10,7 @@
10 "typecheck": "tsc" 10 "typecheck": "tsc"
11 }, 11 },
12 "dependencies": { 12 "dependencies": {
13 "@sophie/service-shared": "workspace:*",
13 "@sophie/shared": "workspace:*", 14 "@sophie/shared": "workspace:*",
14 "electron": "16.0.5", 15 "electron": "16.0.5",
15 "mobx": "^6.3.10", 16 "mobx": "^6.3.10",
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index f56d629..857c15d 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -23,6 +23,10 @@ import { autorun } from 'mobx';
23import { getSnapshot, onPatch } from 'mobx-state-tree'; 23import { getSnapshot, onPatch } from 'mobx-state-tree';
24import { join } from 'path'; 24import { join } from 'path';
25import { 25import {
26 ServiceToMainIpcMessage,
27 unreadCount,
28} from '@sophie/service-shared';
29import {
26 browserViewBounds, 30 browserViewBounds,
27 MainToRendererIpcMessage, 31 MainToRendererIpcMessage,
28 paletteMode, 32 paletteMode,
@@ -54,9 +58,9 @@ app.enableSandbox();
54 58
55// Remove sophie and electron from the user-agent string to avoid detection. 59// Remove sophie and electron from the user-agent string to avoid detection.
56const originalUserAgent = app.userAgentFallback; 60const originalUserAgent = app.userAgentFallback;
61const userAgent = originalUserAgent.replaceAll(/ ([Ss]ophie|Electron)\/[0-9.]+/g, '');
57// Removing the electron version breaks redux devtools, so we only do this in production. 62// Removing the electron version breaks redux devtools, so we only do this in production.
58if (!isDevelopment) { 63if (!isDevelopment) {
59 const userAgent = originalUserAgent.replaceAll(/ ([Ss]ophie|Electron)\/[0-9.]+/g, '');
60 app.userAgentFallback = userAgent; 64 app.userAgentFallback = userAgent;
61} 65}
62 66
@@ -97,6 +101,17 @@ async function createWindow(): Promise<void> {
97 101
98 webContents.userAgent = originalUserAgent; 102 webContents.userAgent = originalUserAgent;
99 103
104 const browserView = new BrowserView({
105 webPreferences: {
106 sandbox: true,
107 partition: 'persist:service',
108 preload: join(__dirname, '../../service-preload/dist/index.cjs'),
109 },
110 });
111
112 browserView.webContents.userAgent = userAgent;
113 browserView.setBackgroundColor('#fff');
114
100 webContents.on('ipc-message', (_event, channel, ...args) => { 115 webContents.on('ipc-message', (_event, channel, ...args) => {
101 try { 116 try {
102 switch (channel) { 117 switch (channel) {
@@ -109,8 +124,11 @@ async function createWindow(): Promise<void> {
109 case RendererToMainIpcMessage.SetPaletteMode: 124 case RendererToMainIpcMessage.SetPaletteMode:
110 store.setPaletteMode(paletteMode.parse(args[0])) 125 store.setPaletteMode(paletteMode.parse(args[0]))
111 break; 126 break;
127 case RendererToMainIpcMessage.ReloadAllServices:
128 browserView.webContents.reload();
129 break;
112 default: 130 default:
113 console.warn('Unknown IPC message:', channel, args); 131 console.error('Unknown IPC message:', channel, args);
114 break; 132 break;
115 } 133 }
116 } catch (err) { 134 } catch (err) {
@@ -122,26 +140,31 @@ async function createWindow(): Promise<void> {
122 webContents.send(MainToRendererIpcMessage.SharedStorePatch, patch); 140 webContents.send(MainToRendererIpcMessage.SharedStorePatch, patch);
123 }); 141 });
124 142
125 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) 143 browserView.webContents.on('ipc-message', (_event, channel, ...args) => {
126 ? import.meta.env.VITE_DEV_SERVER_URL 144 try {
127 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString(); 145 switch (channel) {
128 146 case ServiceToMainIpcMessage.SetUnreadCount:
129 const browserView = new BrowserView({ 147 console.log('Unread count:', unreadCount.parse(args[0]));
130 webPreferences: { 148 break;
131 sandbox: true, 149 default:
132 partition: 'persist:service', 150 console.error('Unknown IPC message:', channel, args);
133 }, 151 break;
152 }
153 } catch (err) {
154 console.error('Error while processing IPC message:', channel, args, err);
155 }
134 }); 156 });
135 157
136 browserView.setBackgroundColor('#fff');
137
138 autorun(() => { 158 autorun(() => {
139 browserView.setBounds(store.shared.browserViewBounds); 159 browserView.setBounds(store.shared.browserViewBounds);
140 }); 160 });
141 161
162 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined)
163 ? import.meta.env.VITE_DEV_SERVER_URL
164 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString();
142 await mainWindow.loadURL(pageUrl); 165 await mainWindow.loadURL(pageUrl);
143 166
144 mainWindow.addBrowserView(browserView); 167 mainWindow.setBrowserView(browserView);
145 168
146 return browserView.webContents.loadURL('https://git.marussy.com/sophie/about'); 169 return browserView.webContents.loadURL('https://git.marussy.com/sophie/about');
147} 170}
diff --git a/packages/main/tsconfig.json b/packages/main/tsconfig.json
index 5afee21..2529709 100644
--- a/packages/main/tsconfig.json
+++ b/packages/main/tsconfig.json
@@ -12,6 +12,9 @@
12 }, 12 },
13 "references": [ 13 "references": [
14 { 14 {
15 "path": "../service-shared"
16 },
17 {
15 "path": "../shared" 18 "path": "../shared"
16 } 19 }
17 ], 20 ],
diff --git a/packages/preload/src/SophieRendererImpl.ts b/packages/preload/src/SophieRendererImpl.ts
index 6bffeae..bd0f6cb 100644
--- a/packages/preload/src/SophieRendererImpl.ts
+++ b/packages/preload/src/SophieRendererImpl.ts
@@ -86,6 +86,10 @@ export class SophieRendererImpl implements SophieRenderer {
86 this.#send(RendererToMainIpcMessage.SetPaletteMode, mode); 86 this.#send(RendererToMainIpcMessage.SetPaletteMode, mode);
87 } 87 }
88 } 88 }
89
90 reloadAllServices(): void {
91 this.#send(RendererToMainIpcMessage.ReloadAllServices);
92 }
89} 93}
90 94
91export function createSophieRenderer(): SophieRenderer { 95export function createSophieRenderer(): SophieRenderer {
@@ -103,5 +107,6 @@ export function createSophieRenderer(): SophieRenderer {
103 setSharedStoreListener: impl.setSharedStoreListener.bind(impl), 107 setSharedStoreListener: impl.setSharedStoreListener.bind(impl),
104 setBrowserViewBounds: impl.setBrowserViewBounds.bind(impl), 108 setBrowserViewBounds: impl.setBrowserViewBounds.bind(impl),
105 setPaletteMode: impl.setPaletteMode.bind(impl), 109 setPaletteMode: impl.setPaletteMode.bind(impl),
110 reloadAllServices: impl.reloadAllServices.bind(impl),
106 }; 111 };
107} 112}
diff --git a/packages/renderer/src/devTools.ts b/packages/renderer/src/devTools.ts
index ffd99e6..44c87ae 100644
--- a/packages/renderer/src/devTools.ts
+++ b/packages/renderer/src/devTools.ts
@@ -55,3 +55,16 @@ export function exposeToReduxDevtools(model: IAnyStateTreeNode): void {
55 console.error('Could not connect to Redux devtools', err); 55 console.error('Could not connect to Redux devtools', err);
56 }); 56 });
57} 57}
58
59/**
60 * Sends a message to the main process to reload all services when
61 * `build/watch.js` sends a reload event on bundle write.
62 */
63export function hotReloadServices(): void {
64 import.meta.hot?.on(
65 'sophie:reload-services',
66 () => {
67 window.sophieRenderer.reloadAllServices();
68 },
69 );
70}
diff --git a/packages/renderer/src/index.tsx b/packages/renderer/src/index.tsx
index 90cba2c..0919b93 100644
--- a/packages/renderer/src/index.tsx
+++ b/packages/renderer/src/index.tsx
@@ -29,11 +29,15 @@ import { render } from 'react-dom';
29import { App } from './components/App'; 29import { App } from './components/App';
30import { StoreProvider } from './components/StoreProvider'; 30import { StoreProvider } from './components/StoreProvider';
31import { ThemeProvider } from './components/ThemeProvider'; 31import { ThemeProvider } from './components/ThemeProvider';
32import { exposeToReduxDevtools } from './devTools'; 32import { exposeToReduxDevtools, hotReloadServices } from './devTools';
33import { createAndConnectRootStore } from './stores/RootStore'; 33import { createAndConnectRootStore } from './stores/RootStore';
34 34
35const isDevelopment = import.meta.env.MODE === 'development'; 35const isDevelopment = import.meta.env.MODE === 'development';
36 36
37if (isDevelopment) {
38 hotReloadServices();
39}
40
37const store = createAndConnectRootStore(window.sophieRenderer); 41const store = createAndConnectRootStore(window.sophieRenderer);
38 42
39if (isDevelopment) { 43if (isDevelopment) {
diff --git a/packages/service-preload/package.json b/packages/service-preload/package.json
new file mode 100644
index 0000000..1296cda
--- /dev/null
+++ b/packages/service-preload/package.json
@@ -0,0 +1,22 @@
1{
2 "name": "@sophie/service-preload",
3 "version": "0.1.0",
4 "private": true,
5 "sideEffects": false,
6 "main": "dist/index.cjs",
7 "types": "dist-types/index.d.ts",
8 "scripts": {
9 "clean": "rimraf dist dist-types tsconfig.tsbuildinfo",
10 "build": "vite build",
11 "typecheck": "tsc"
12 },
13 "dependencies": {
14 "@sophie/service-shared": "workspace:*",
15 "electron": "16.0.5"
16 },
17 "devDependencies": {
18 "rimraf": "^3.0.2",
19 "typescript": "^4.5.4",
20 "vite": "^2.7.6"
21 }
22}
diff --git a/packages/service-preload/src/index.ts b/packages/service-preload/src/index.ts
new file mode 100644
index 0000000..4e93a07
--- /dev/null
+++ b/packages/service-preload/src/index.ts
@@ -0,0 +1,29 @@
1/*
2 * Copyright (C) 2021-2022 Kristóf Marussy <kristof@marussy.com>
3 *
4 * This file is part of Sophie.
5 *
6 * Sophie is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as
8 * published by the Free Software Foundation, version 3.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: AGPL-3.0-only
19 */
20
21import { ipcRenderer } from 'electron';
22import { ServiceToMainIpcMessage } from '@sophie/service-shared';
23
24let i = 1;
25
26setInterval(() => {
27 ipcRenderer.send(ServiceToMainIpcMessage.SetUnreadCount, { direct: i });
28 i += 1;
29}, 1000);
diff --git a/packages/service-preload/tsconfig.json b/packages/service-preload/tsconfig.json
new file mode 100644
index 0000000..e5b8ccb
--- /dev/null
+++ b/packages/service-preload/tsconfig.json
@@ -0,0 +1,17 @@
1{
2 "extends": "../../tsconfig.json",
3 "compilerOptions": {
4 "composite": true,
5 "declarationDir": "dist-types",
6 "emitDeclarationOnly": true,
7 "rootDir": "src"
8 },
9 "references": [
10 {
11 "path": "../service-shared"
12 }
13 ],
14 "include": [
15 "src/**/*.ts"
16 ]
17}
diff --git a/packages/service-preload/vite.config.js b/packages/service-preload/vite.config.js
new file mode 100644
index 0000000..5af78d9
--- /dev/null
+++ b/packages/service-preload/vite.config.js
@@ -0,0 +1,31 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig } from '../../config/vite-common';
6
7/** @type string */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: chrome,
18 lib: {
19 entry: 'src/index.ts',
20 formats: ['cjs'],
21 },
22 rollupOptions: {
23 external: [
24 'electron',
25 ...builtinModules,
26 ],
27 },
28 },
29});
30
31export default config;
diff --git a/packages/service-shared/package.json b/packages/service-shared/package.json
new file mode 100644
index 0000000..88f113e
--- /dev/null
+++ b/packages/service-shared/package.json
@@ -0,0 +1,21 @@
1{
2 "name": "@sophie/service-shared",
3 "version": "0.1.0",
4 "private": true,
5 "sideEffects": false,
6 "main": "dist/index.cjs",
7 "types": "dist-types/index.d.ts",
8 "scripts": {
9 "clean": "rimraf dist dist-types tsconfig.tsbuildinfo",
10 "build": "vite build",
11 "typecheck": "tsc"
12 },
13 "dependencies": {
14 "zod": "^3.11.6"
15 },
16 "devDependencies": {
17 "rimraf": "^3.0.2",
18 "typescript": "^4.5.4",
19 "vite": "^2.7.6"
20 }
21}
diff --git a/packages/shared/src/ipc/RendererToMainIpcMessage.ts b/packages/service-shared/src/index.ts
index ba354d1..c517959 100644
--- a/packages/shared/src/ipc/RendererToMainIpcMessage.ts
+++ b/packages/service-shared/src/index.ts
@@ -18,8 +18,11 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21export enum RendererToMainIpcMessage { 21export { ServiceToMainIpcMessage } from './ipc';
22 SharedStoreSnapshotRequest = 'sophie-shared-store-snapshot-request', 22
23 SetBrowserViewBounds = 'sophie-set-browser-view-bounds', 23export type {
24 SetPaletteMode = 'sophie-set-palette-mode', 24 UnreadCount,
25} 25} from './schemas';
26export {
27 unreadCount,
28} from './schemas';
diff --git a/packages/shared/src/ipc/MainToRendererIpcMessage.ts b/packages/service-shared/src/ipc.ts
index 92da489..ad2ceca 100644
--- a/packages/shared/src/ipc/MainToRendererIpcMessage.ts
+++ b/packages/service-shared/src/ipc.ts
@@ -18,7 +18,6 @@
18 * SPDX-License-Identifier: AGPL-3.0-only 18 * SPDX-License-Identifier: AGPL-3.0-only
19 */ 19 */
20 20
21export enum MainToRendererIpcMessage { 21export enum ServiceToMainIpcMessage {
22 SharedStoreSnapshot = 'sophie-shared-store-snapshot', 22 SetUnreadCount = 'sophie-service-to-main:set-unread-count',
23 SharedStorePatch = 'sophie-shared-store-patch',
24} 23}
diff --git a/packages/service-shared/src/schemas.ts b/packages/service-shared/src/schemas.ts
new file mode 100644
index 0000000..1513e43
--- /dev/null
+++ b/packages/service-shared/src/schemas.ts
@@ -0,0 +1,28 @@
1/*
2 * Copyright (C) 2021-2022 Kristóf Marussy <kristof@marussy.com>
3 *
4 * This file is part of Sophie.
5 *
6 * Sophie is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as
8 * published by the Free Software Foundation, version 3.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: AGPL-3.0-only
19 */
20
21import { z } from 'zod';
22
23export const unreadCount = z.object({
24 direct: z.number().nonnegative().optional(),
25 indirect: z.number().nonnegative().optional(),
26});
27
28export type UnreadCount = z.infer<typeof unreadCount>;
diff --git a/packages/service-shared/tsconfig.json b/packages/service-shared/tsconfig.json
new file mode 100644
index 0000000..de75833
--- /dev/null
+++ b/packages/service-shared/tsconfig.json
@@ -0,0 +1,12 @@
1{
2 "extends": "../../tsconfig.json",
3 "compilerOptions": {
4 "composite": true,
5 "declarationDir": "dist-types",
6 "emitDeclarationOnly": true,
7 "rootDir": "src"
8 },
9 "include": [
10 "src/**/*.ts"
11 ]
12}
diff --git a/packages/service-shared/vite.config.js b/packages/service-shared/vite.config.js
new file mode 100644
index 0000000..6f4959f
--- /dev/null
+++ b/packages/service-shared/vite.config.js
@@ -0,0 +1,34 @@
1// @ts-check
2
3import { builtinModules } from 'module';
4
5import { chrome, makeConfig, node } from '../../config/vite-common';
6
7/** @type string */
8const PACKAGE_ROOT = __dirname;
9
10/**
11 * @type {import('vite').UserConfig}
12 * @see https://vitejs.dev/config/
13 */
14const config = makeConfig({
15 root: PACKAGE_ROOT,
16 build: {
17 target: [
18 chrome,
19 node,
20 ],
21 lib: {
22 entry: 'src/index.ts',
23 formats: ['cjs'],
24 },
25 rollupOptions: {
26 external: [
27 'zod',
28 ...builtinModules,
29 ],
30 },
31 },
32});
33
34export default config;
diff --git a/packages/shared/package.json b/packages/shared/package.json
index f5d4f90..96e9b68 100644
--- a/packages/shared/package.json
+++ b/packages/shared/package.json
@@ -2,6 +2,7 @@
2 "name": "@sophie/shared", 2 "name": "@sophie/shared",
3 "version": "0.1.0", 3 "version": "0.1.0",
4 "private": true, 4 "private": true,
5 "sideEffects": false,
5 "main": "dist/index.cjs", 6 "main": "dist/index.cjs",
6 "module": "dist/index.es.js", 7 "module": "dist/index.es.js",
7 "types": "dist-types/index.d.ts", 8 "types": "dist-types/index.d.ts",
@@ -10,14 +11,14 @@
10 "build": "vite build", 11 "build": "vite build",
11 "typecheck": "tsc" 12 "typecheck": "tsc"
12 }, 13 },
13 "devDependencies": {
14 "rimraf": "^3.0.2",
15 "typescript": "^4.5.4",
16 "vite": "^2.7.6"
17 },
18 "dependencies": { 14 "dependencies": {
19 "mobx": "^6.3.10", 15 "mobx": "^6.3.10",
20 "mobx-state-tree": "^5.1.0", 16 "mobx-state-tree": "^5.1.0",
21 "zod": "^3.11.6" 17 "zod": "^3.11.6"
18 },
19 "devDependencies": {
20 "rimraf": "^3.0.2",
21 "typescript": "^4.5.4",
22 "vite": "^2.7.6"
22 } 23 }
23} 24}
diff --git a/packages/shared/src/contextBridge/SophieRenderer.ts b/packages/shared/src/contextBridge/SophieRenderer.ts
index f2e2180..e310829 100644
--- a/packages/shared/src/contextBridge/SophieRenderer.ts
+++ b/packages/shared/src/contextBridge/SophieRenderer.ts
@@ -28,4 +28,6 @@ export interface SophieRenderer {
28 setBrowserViewBounds(bounds: BrowserViewBounds): void; 28 setBrowserViewBounds(bounds: BrowserViewBounds): void;
29 29
30 setPaletteMode(mode: PaletteMode): void; 30 setPaletteMode(mode: PaletteMode): void;
31
32 reloadAllServices(): void;
31} 33}
diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts
index 0a1ec40..f054571 100644
--- a/packages/shared/src/index.ts
+++ b/packages/shared/src/index.ts
@@ -20,8 +20,10 @@
20 20
21export type { SophieRenderer } from './contextBridge/SophieRenderer'; 21export type { SophieRenderer } from './contextBridge/SophieRenderer';
22 22
23export { MainToRendererIpcMessage } from './ipc/MainToRendererIpcMessage'; 23export {
24export { RendererToMainIpcMessage } from './ipc/RendererToMainIpcMessage'; 24 MainToRendererIpcMessage,
25 RendererToMainIpcMessage,
26} from './ipc';
25 27
26export type { 28export type {
27 BrowserViewBounds, 29 BrowserViewBounds,
diff --git a/packages/shared/src/ipc.ts b/packages/shared/src/ipc.ts
new file mode 100644
index 0000000..2e35d7a
--- /dev/null
+++ b/packages/shared/src/ipc.ts
@@ -0,0 +1,31 @@
1/*
2 * Copyright (C) 2021-2022 Kristóf Marussy <kristof@marussy.com>
3 *
4 * This file is part of Sophie.
5 *
6 * Sophie is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU Affero General Public License as
8 * published by the Free Software Foundation, version 3.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU Affero General Public License for more details.
14 *
15 * You should have received a copy of the GNU Affero General Public License
16 * along with this program. If not, see <https://www.gnu.org/licenses/>.
17 *
18 * SPDX-License-Identifier: AGPL-3.0-only
19 */
20
21export enum MainToRendererIpcMessage {
22 SharedStoreSnapshot = 'sophie-main-to-renderer:shared-store-snapshot',
23 SharedStorePatch = 'sophie-main-to-renderer:shared-store-patch',
24}
25
26export enum RendererToMainIpcMessage {
27 SharedStoreSnapshotRequest = 'sophie-renderer-to-main:shared-store-snapshot-request',
28 SetBrowserViewBounds = 'sophie-renderer-to-main:set-browser-view-bounds',
29 SetPaletteMode = 'sophie-renderer-to-main:set-palette-mode',
30 ReloadAllServices = 'sophie-renderer-to-main:reload-all-services',
31}
diff --git a/scripts/watch.js b/scripts/watch.js
index 7f5f42c..f49037e 100644
--- a/scripts/watch.js
+++ b/scripts/watch.js
@@ -128,14 +128,35 @@ function setupPreloadPackageWatcher(viteDevServer) {
128} 128}
129 129
130/** 130/**
131 * Reload services when source files are changed.
132 *
133 * @param {import('vite').ViteDevServer} viteDevServer
134 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>}
135 */
136function setupServicePreloadPackageWatcher(viteDevServer) {
137 return getWatcher({
138 name: 'reload-services-on-service-preload-package-change',
139 configFile: 'packages/service-preload/vite.config.js',
140 writeBundle() {
141 console.log('wrote');
142 viteDevServer.ws.send({
143 type: 'custom',
144 event: 'sophie:reload-services',
145 });
146 },
147 });
148}
149
150/**
131 * Rebuild package when source files are changed. 151 * Rebuild package when source files are changed.
132 * 152 *
153 * @param packageName {string} The name of the package to watch.
133 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>} 154 * @returns {Promise<import('rollup').RollupOutput | Array<import('rollup').RollupOutput> | import('rollup').RollupWatcher>}
134 */ 155 */
135function setupSharedPackageWatcher() { 156function setupSharedPackageWatcher(packageName) {
136 return getWatcher({ 157 return getWatcher({
137 name: 'rebuild-package-on-shared-package-change', 158 name: `rebuild-package-on-${packageName}-package-change`,
138 configFile: 'packages/shared/vite.config.js', 159 configFile: `packages/${packageName}/vite.config.js`,
139 }); 160 });
140} 161}
141 162
@@ -143,16 +164,20 @@ function setupSharedPackageWatcher() {
143 * @returns Promise<void> 164 * @returns Promise<void>
144 */ 165 */
145async function setupDevEnvironment() { 166async function setupDevEnvironment() {
146 await setupSharedPackageWatcher(); 167 await setupSharedPackageWatcher('shared');
147 168
148 const viteDevServer = await createServer({ 169 const viteDevServer = await createServer({
149 ...sharedConfig, 170 ...sharedConfig,
150 configFile: 'packages/renderer/vite.config.js', 171 configFile: 'packages/renderer/vite.config.js',
151 }); 172 });
152
153 await viteDevServer.listen(); 173 await viteDevServer.listen();
154 174
155 await setupPreloadPackageWatcher(viteDevServer); 175 await Promise.all([
176 setupPreloadPackageWatcher(viteDevServer),
177 setupServicePreloadPackageWatcher(viteDevServer),
178 setupSharedPackageWatcher('shared'),
179 ]);
180
156 return setupMainPackageWatcher(viteDevServer); 181 return setupMainPackageWatcher(viteDevServer);
157} 182}
158 183
diff --git a/yarn.lock b/yarn.lock
index 064f045..ef16435 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -822,6 +822,7 @@ __metadata:
822 version: 0.0.0-use.local 822 version: 0.0.0-use.local
823 resolution: "@sophie/main@workspace:packages/main" 823 resolution: "@sophie/main@workspace:packages/main"
824 dependencies: 824 dependencies:
825 "@sophie/service-shared": "workspace:*"
825 "@sophie/shared": "workspace:*" 826 "@sophie/shared": "workspace:*"
826 "@types/electron-devtools-installer": ^2.2.0 827 "@types/electron-devtools-installer": ^2.2.0
827 "@types/node": ^17.0.4 828 "@types/node": ^17.0.4
@@ -877,6 +878,29 @@ __metadata:
877 languageName: unknown 878 languageName: unknown
878 linkType: soft 879 linkType: soft
879 880
881"@sophie/service-preload@workspace:packages/service-preload":
882 version: 0.0.0-use.local
883 resolution: "@sophie/service-preload@workspace:packages/service-preload"
884 dependencies:
885 "@sophie/service-shared": "workspace:*"
886 electron: 16.0.5
887 rimraf: ^3.0.2
888 typescript: ^4.5.4
889 vite: ^2.7.6
890 languageName: unknown
891 linkType: soft
892
893"@sophie/service-shared@workspace:*, @sophie/service-shared@workspace:packages/service-shared":
894 version: 0.0.0-use.local
895 resolution: "@sophie/service-shared@workspace:packages/service-shared"
896 dependencies:
897 rimraf: ^3.0.2
898 typescript: ^4.5.4
899 vite: ^2.7.6
900 zod: ^3.11.6
901 languageName: unknown
902 linkType: soft
903
880"@sophie/shared@workspace:*, @sophie/shared@workspace:packages/shared": 904"@sophie/shared@workspace:*, @sophie/shared@workspace:packages/shared":
881 version: 0.0.0-use.local 905 version: 0.0.0-use.local
882 resolution: "@sophie/shared@workspace:packages/shared" 906 resolution: "@sophie/shared@workspace:packages/shared"