From a2847664c8112d04bb43fdadb30e1185943e6a2b Mon Sep 17 00:00:00 2001 From: Anish Sarkar <104695310+AnishSarkar22@users.noreply.github.com> Date: Mon, 25 May 2026 17:52:10 +0530 Subject: [PATCH] feat(server): enhance server management with process forking and implement server origin retrieval --- surfsense_desktop/src/modules/server.ts | 53 +++++++++++++++++++++---- surfsense_desktop/src/modules/window.ts | 10 +++++ 2 files changed, 56 insertions(+), 7 deletions(-) diff --git a/surfsense_desktop/src/modules/server.ts b/surfsense_desktop/src/modules/server.ts index e2f078a8c..daec9bed0 100644 --- a/surfsense_desktop/src/modules/server.ts +++ b/surfsense_desktop/src/modules/server.ts @@ -1,9 +1,10 @@ import path from 'path'; -import { app } from 'electron'; +import { app, utilityProcess } from 'electron'; import { getPort } from 'get-port-please'; const isDev = !app.isPackaged; let serverPort = 3000; +let nextServerProcess: ReturnType | null = null; export function getServerPort(): number { return serverPort; @@ -38,16 +39,54 @@ export async function startNextServer(): Promise { const standalonePath = getStandalonePath(); const serverScript = path.join(standalonePath, 'server.js'); - process.env.PORT = String(serverPort); - process.env.HOSTNAME = '0.0.0.0'; - process.env.NODE_ENV = 'production'; - process.chdir(standalonePath); + const child = utilityProcess.fork(serverScript, [], { + cwd: standalonePath, + env: { + ...process.env, + PORT: String(serverPort), + HOSTNAME: '127.0.0.1', + NODE_ENV: 'production', + }, + serviceName: 'SurfSense Next Server', + stdio: 'pipe', + }); + nextServerProcess = child; - require(serverScript); + child.stdout?.on('data', (chunk) => { + process.stdout.write(chunk); + }); + child.stderr?.on('data', (chunk) => { + process.stderr.write(chunk); + }); - const ready = await waitForServer(`http://localhost:${serverPort}`); + const handleExit = (code: number) => { + if (nextServerProcess === child) { + nextServerProcess = null; + } + console.error(`Next.js server exited with code ${code}`); + }; + child.on('exit', handleExit); + + let startupExitHandler: ((code: number) => void) | null = null; + const exited = new Promise((_resolve, reject) => { + startupExitHandler = (code: number) => { + reject(new Error(`Next.js server exited before startup completed with code ${code}`)); + }; + child.once('exit', startupExitHandler); + }); + + const ready = await Promise.race([waitForServer(`http://localhost:${serverPort}`), exited]); + if (startupExitHandler) { + child.removeListener('exit', startupExitHandler); + } if (!ready) { + stopNextServer(); throw new Error('Next.js server failed to start within 30 s'); } console.log(`Next.js server ready on port ${serverPort}`); } + +export function stopNextServer(): void { + nextServerProcess?.kill(); + nextServerProcess = null; +} diff --git a/surfsense_desktop/src/modules/window.ts b/surfsense_desktop/src/modules/window.ts index 5317005d5..7ee7eb8db 100644 --- a/surfsense_desktop/src/modules/window.ts +++ b/surfsense_desktop/src/modules/window.ts @@ -8,6 +8,7 @@ import { setActiveSearchSpaceId } from './active-search-space'; const isDev = !app.isPackaged; const HOSTED_FRONTEND_URL = process.env.HOSTED_FRONTEND_URL as string; const isMac = process.platform === 'darwin'; +const WINDOW_TITLE = 'SurfSense'; let mainWindow: BrowserWindow | null = null; let isQuitting = false; @@ -24,6 +25,7 @@ export function markQuitting(): void { export function createMainWindow(initialPath = '/dashboard'): BrowserWindow { mainWindow = new BrowserWindow({ + title: WINDOW_TITLE, width: 1280, height: 800, minWidth: 800, @@ -48,6 +50,14 @@ export function createMainWindow(initialPath = '/dashboard'): BrowserWindow { mainWindow?.show(); }); + mainWindow.webContents.on('page-title-updated', (event) => { + event.preventDefault(); + mainWindow?.setTitle(WINDOW_TITLE); + }); + mainWindow.webContents.on('did-finish-load', () => { + mainWindow?.setTitle(WINDOW_TITLE); + }); + mainWindow.loadURL(`http://localhost:${getServerPort()}${initialPath}`); mainWindow.webContents.setWindowOpenHandler(({ url }) => {