aboutsummaryrefslogtreecommitdiffstats
path: root/packages/main/src/index.ts
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-24 19:00:07 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2021-12-24 19:13:56 +0100
commit90471302835dad5251ea568091cfd6c21d757fd3 (patch)
tree66ba2d5181ef4c4cb552c53936369bcb530c524c /packages/main/src/index.ts
parentfix: Typings in js config files (diff)
downloadsophie-90471302835dad5251ea568091cfd6c21d757fd3.tar.gz
sophie-90471302835dad5251ea568091cfd6c21d757fd3.tar.zst
sophie-90471302835dad5251ea568091cfd6c21d757fd3.zip
feat: User agent data simulator
Diffstat (limited to 'packages/main/src/index.ts')
-rw-r--r--packages/main/src/index.ts56
1 files changed, 51 insertions, 5 deletions
diff --git a/packages/main/src/index.ts b/packages/main/src/index.ts
index b6df67b..70acb15 100644
--- a/packages/main/src/index.ts
+++ b/packages/main/src/index.ts
@@ -19,6 +19,7 @@
19 */ 19 */
20 20
21import { app, BrowserView, BrowserWindow } from 'electron'; 21import { app, BrowserView, BrowserWindow } from 'electron';
22import { readFile, readFileSync } from 'fs';
22import { autorun } from 'mobx'; 23import { autorun } from 'mobx';
23import { getSnapshot, onPatch } from 'mobx-state-tree'; 24import { getSnapshot, onPatch } from 'mobx-state-tree';
24import { join } from 'path'; 25import { join } from 'path';
@@ -39,7 +40,6 @@ import {
39 openDevToolsWhenReady, 40 openDevToolsWhenReady,
40} from './devTools'; 41} from './devTools';
41import { createRootStore } from './stores/RootStore'; 42import { createRootStore } from './stores/RootStore';
42import { reduceUserAgent } from './userAgent';
43 43
44const isDevelopment = import.meta.env.MODE === 'development'; 44const isDevelopment = import.meta.env.MODE === 'development';
45 45
@@ -67,12 +67,33 @@ app.commandLine.appendSwitch(
67 67
68// Remove sophie and electron from the user-agent string to avoid detection. 68// Remove sophie and electron from the user-agent string to avoid detection.
69const originalUserAgent = app.userAgentFallback; 69const originalUserAgent = app.userAgentFallback;
70const userAgent = reduceUserAgent(originalUserAgent); 70const userAgent = originalUserAgent.replaceAll(/\s(sophie|Electron)\/\S+/g, '');
71const platformInUa = userAgent.match(/\((Win|Mac|X11; L)/);
72let platform = 'Unknown';
73if (platformInUa !== null) {
74 switch (platformInUa[1]) {
75 case 'Win':
76 platform = 'Windows';
77 break;
78 case 'Mac':
79 platform = 'macOS';
80 break;
81 case 'X11; L':
82 platform = 'Linux';
83 break;
84 }
85}
86const chromiumVersion = process.versions.chrome.split('.')[0];
71// Removing the electron version breaks redux devtools, so we only do this in production. 87// Removing the electron version breaks redux devtools, so we only do this in production.
72if (!isDevelopment) { 88if (!isDevelopment) {
73 app.userAgentFallback = userAgent; 89 app.userAgentFallback = userAgent;
74} 90}
75 91
92let serviceInjectRelativePath = '../../service-inject/dist/index.cjs';
93let serviceInjectPath = join(__dirname, serviceInjectRelativePath);
94let serviceInjectUrl = new URL(serviceInjectRelativePath, `file://${__dirname}`).toString();
95let serviceInject: string = readFileSync(serviceInjectPath, 'utf8');
96
76if (isDevelopment) { 97if (isDevelopment) {
77 installDevToolsExtensions(app); 98 installDevToolsExtensions(app);
78} 99}
@@ -92,7 +113,7 @@ function createWindow(): Promise<unknown> {
92 }); 113 });
93 114
94 if (isDevelopment) { 115 if (isDevelopment) {
95 openDevToolsWhenReady(mainWindow); 116 //openDevToolsWhenReady(mainWindow);
96 } 117 }
97 118
98 mainWindow.on('ready-to-show', () => { 119 mainWindow.on('ready-to-show', () => {
@@ -131,7 +152,14 @@ function createWindow(): Promise<unknown> {
131 store.setPaletteMode(paletteMode.parse(args[0])) 152 store.setPaletteMode(paletteMode.parse(args[0]))
132 break; 153 break;
133 case RendererToMainIpcMessage.ReloadAllServices: 154 case RendererToMainIpcMessage.ReloadAllServices:
134 browserView.webContents.reload(); 155 readFile(serviceInjectPath, 'utf8', (err, data) => {
156 if (err === null) {
157 serviceInject = data;
158 } else {
159 console.error('Error while reloading', serviceInjectPath, err);
160 }
161 browserView.webContents.reload();
162 });
135 break; 163 break;
136 default: 164 default:
137 console.error('Unknown IPC message:', channel, args); 165 console.error('Unknown IPC message:', channel, args);
@@ -149,6 +177,16 @@ function createWindow(): Promise<unknown> {
149 browserView.webContents.on('ipc-message', (_event, channel, ...args) => { 177 browserView.webContents.on('ipc-message', (_event, channel, ...args) => {
150 try { 178 try {
151 switch (channel) { 179 switch (channel) {
180 case ServiceToMainIpcMessage.ApiExposedInMainWorld:
181 browserView.webContents.executeJavaScriptInIsolatedWorld(0, [
182 {
183 code: serviceInject,
184 url: serviceInjectUrl,
185 }
186 ]).catch((err) => {
187 console.error('Cannot inject script:', err);
188 });
189 break;
152 case ServiceToMainIpcMessage.SetUnreadCount: 190 case ServiceToMainIpcMessage.SetUnreadCount:
153 console.log('Unread count:', unreadCount.parse(args[0])); 191 console.log('Unread count:', unreadCount.parse(args[0]));
154 break; 192 break;
@@ -172,13 +210,21 @@ function createWindow(): Promise<unknown> {
172 ); 210 );
173 }); 211 });
174 212
213 browserView.webContents.session.webRequest.onBeforeSendHeaders(({ requestHeaders }, callback) => {
214 requestHeaders['User-Agent'] = userAgent;
215 requestHeaders['Sec-CH-UA'] = `" Not A;Brand";v="99", "Chromium";v="${chromiumVersion}"`;
216 requestHeaders['Sec-CH-UA-Mobile'] = '?0';
217 requestHeaders['Sec-CH-UA-Platform'] = platform;
218 callback({ requestHeaders });
219 });
220
175 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined) 221 const pageUrl = (isDevelopment && import.meta.env.VITE_DEV_SERVER_URL !== undefined)
176 ? import.meta.env.VITE_DEV_SERVER_URL 222 ? import.meta.env.VITE_DEV_SERVER_URL
177 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString(); 223 : new URL('../renderer/dist/index.html', `file://${__dirname}`).toString();
178 224
179 return Promise.all([ 225 return Promise.all([
180 mainWindow.loadURL(pageUrl), 226 mainWindow.loadURL(pageUrl),
181 browserView.webContents.loadURL('https://git.marussy.com/sophie/about'), 227 browserView.webContents.loadURL('https://gmail.com').then(() => browserView.webContents.openDevTools()),
182 ]); 228 ]);
183} 229}
184 230