aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main/src/index.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/main/src/index.ts')
-rw-r--r--packages/main/src/index.ts108
1 files changed, 63 insertions, 45 deletions
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index bc10b4c..1f80e44 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -33,12 +33,7 @@ import {
33 MainToRendererIpcMessage, 33 MainToRendererIpcMessage,
34 RendererToMainIpcMessage, 34 RendererToMainIpcMessage,
35} from '@sophie/shared'; 35} from '@sophie/shared';
36import { 36import { app, BrowserView, BrowserWindow, ipcMain } from 'electron';
37 app,
38 BrowserView,
39 BrowserWindow,
40 ipcMain,
41} from 'electron';
42import { ensureDirSync, readFile, readFileSync } from 'fs-extra'; 37import { ensureDirSync, readFile, readFileSync } from 'fs-extra';
43import { autorun } from 'mobx'; 38import { autorun } from 'mobx';
44import { getSnapshot, onPatch } from 'mobx-state-tree'; 39import { getSnapshot, onPatch } from 'mobx-state-tree';
@@ -97,7 +92,9 @@ app.setAboutPanelOptions({
97 `Node.js: ${process.versions.node}`, 92 `Node.js: ${process.versions.node}`,
98 `Platform: ${osName()}`, 93 `Platform: ${osName()}`,
99 `Arch: ${arch()}`, 94 `Arch: ${arch()}`,
100 `Build date: ${new Date(Number(import.meta.env.BUILD_DATE)).toLocaleString()}`, 95 `Build date: ${new Date(
96 Number(import.meta.env.BUILD_DATE),
97 ).toLocaleString()}`,
101 `Git SHA: ${import.meta.env.GIT_SHA}`, 98 `Git SHA: ${import.meta.env.GIT_SHA}`,
102 `Git branch: ${import.meta.env.GIT_BRANCH}`, 99 `Git branch: ${import.meta.env.GIT_BRANCH}`,
103 ].join('\n'), 100 ].join('\n'),
@@ -123,11 +120,13 @@ const serviceInject: WebSource = {
123let mainWindow: BrowserWindow | null = null; 120let mainWindow: BrowserWindow | null = null;
124 121
125const store = createMainStore(); 122const store = createMainStore();
126init(store).then((disposeCompositionRoot) => { 123init(store)
127 app.on('will-quit', disposeCompositionRoot); 124 .then((disposeCompositionRoot) => {
128}).catch((err) => { 125 app.on('will-quit', disposeCompositionRoot);
129 log.log('Failed to initialize application', err); 126 })
130}); 127 .catch((err) => {
128 log.log('Failed to initialize application', err);
129 });
131 130
132const rendererBaseUrl = getResourceUrl('../renderer/'); 131const rendererBaseUrl = getResourceUrl('../renderer/');
133function shouldCancelMainWindowRequest(url: string, method: string): boolean { 132function shouldCancelMainWindowRequest(url: string, method: string): boolean {
@@ -141,12 +140,20 @@ function shouldCancelMainWindowRequest(url: string, method: string): boolean {
141 return true; 140 return true;
142 } 141 }
143 if (isDevelopment) { 142 if (isDevelopment) {
144 if (DEVMODE_ALLOWED_URL_PREFIXES.some((prefix) => normalizedUrl.startsWith(prefix))) { 143 if (
144 DEVMODE_ALLOWED_URL_PREFIXES.some((prefix) =>
145 normalizedUrl.startsWith(prefix),
146 )
147 ) {
145 return false; 148 return false;
146 } 149 }
147 if (import.meta.env.VITE_DEV_SERVER_URL !== undefined) { 150 if (import.meta.env.VITE_DEV_SERVER_URL !== undefined) {
148 const isHttp = normalizedUrl.startsWith(import.meta.env.VITE_DEV_SERVER_URL); 151 const isHttp = normalizedUrl.startsWith(
149 const isWs = normalizedUrl.startsWith(import.meta.env.VITE_DEV_SERVER_URL.replace(/^http:/, 'ws:')); 152 import.meta.env.VITE_DEV_SERVER_URL,
153 );
154 const isWs = normalizedUrl.startsWith(
155 import.meta.env.VITE_DEV_SERVER_URL.replace(/^http:/, 'ws:'),
156 );
150 return !isHttp && !isWs; 157 return !isHttp && !isWs;
151 } 158 }
152 } 159 }
@@ -168,19 +175,24 @@ async function createWindow(): Promise<unknown> {
168 175
169 webContents.userAgent = originalUserAgent; 176 webContents.userAgent = originalUserAgent;
170 177
171 webContents.session.setPermissionRequestHandler((_webContents, _permission, callback) => { 178 webContents.session.setPermissionRequestHandler(
172 callback(false); 179 (_webContents, _permission, callback) => {
173 }); 180 callback(false);
181 },
182 );
174 183
175 webContents.session.webRequest.onBeforeRequest(({ url, method }, callback) => { 184 webContents.session.webRequest.onBeforeRequest(
176 callback({ 185 ({ url, method }, callback) => {
177 cancel: shouldCancelMainWindowRequest(url, method), 186 callback({
178 }); 187 cancel: shouldCancelMainWindowRequest(url, method),
179 }); 188 });
189 },
190 );
180 191
181 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) 192 const pageUrl =
182 ? import.meta.env.VITE_DEV_SERVER_URL 193 isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined
183 : getResourceUrl('../renderer/dist/index.html'); 194 ? import.meta.env.VITE_DEV_SERVER_URL
195 : getResourceUrl('../renderer/dist/index.html');
184 196
185 webContents.on('will-navigate', (event, url) => { 197 webContents.on('will-navigate', (event, url) => {
186 if (url !== pageUrl) { 198 if (url !== pageUrl) {
@@ -273,9 +285,8 @@ async function createWindow(): Promise<unknown> {
273 webContents.send(MainToRendererIpcMessage.SharedStorePatch, patch); 285 webContents.send(MainToRendererIpcMessage.SharedStorePatch, patch);
274 }); 286 });
275 287
276 ipcMain.handle( 288 ipcMain.handle(ServiceToMainIpcMessage.ApiExposedInMainWorld, (event) =>
277 ServiceToMainIpcMessage.ApiExposedInMainWorld, 289 event.sender.id === browserView.webContents.id ? serviceInject : null,
278 (event) => (event.sender.id === browserView.webContents.id ? serviceInject : null),
279 ); 290 );
280 291
281 browserView.webContents.on('ipc-message', (_event, channel, ...args) => { 292 browserView.webContents.on('ipc-message', (_event, channel, ...args) => {
@@ -305,7 +316,9 @@ async function createWindow(): Promise<unknown> {
305 316
306 browserView.webContents.session.webRequest.onBeforeSendHeaders( 317 browserView.webContents.session.webRequest.onBeforeSendHeaders(
307 ({ url, requestHeaders }, callback) => { 318 ({ url, requestHeaders }, callback) => {
308 const requestUserAgent = url.match(/^[^:]+:\/\/accounts\.google\.[^./]+\//) 319 const requestUserAgent = url.match(
320 /^[^:]+:\/\/accounts\.google\.[^./]+\//,
321 )
309 ? chromelessUserAgent 322 ? chromelessUserAgent
310 : userAgent; 323 : userAgent;
311 callback({ 324 callback({
@@ -317,9 +330,11 @@ async function createWindow(): Promise<unknown> {
317 }, 330 },
318 ); 331 );
319 332
320 browserView.webContents.loadURL('https://gitlab.com/say-hi-to-sophie/sophie').catch((err) => { 333 browserView.webContents
321 log.error('Failed to load browser', err); 334 .loadURL('https://gitlab.com/say-hi-to-sophie/sophie')
322 }); 335 .catch((err) => {
336 log.error('Failed to load browser', err);
337 });
323 338
324 return mainWindow.loadURL(pageUrl); 339 return mainWindow.loadURL(pageUrl);
325} 340}
@@ -342,17 +357,20 @@ app.on('window-all-closed', () => {
342 } 357 }
343}); 358});
344 359
345app.whenReady().then(async () => { 360app
346 if (isDevelopment) { 361 .whenReady()
347 try { 362 .then(async () => {
348 await installDevToolsExtensions(); 363 if (isDevelopment) {
349 } catch (err) { 364 try {
350 log.error('Failed to install devtools extensions', err); 365 await installDevToolsExtensions();
366 } catch (err) {
367 log.error('Failed to install devtools extensions', err);
368 }
351 } 369 }
352 }
353 370
354 return createWindow(); 371 return createWindow();
355}).catch((err) => { 372 })
356 log.error('Failed to create window', err); 373 .catch((err) => {
357 process.exit(1); 374 log.error('Failed to create window', err);
358}); 375 process.exit(1);
376 });