From 5f97ac2cffa9ead54d1ccdf69fcd46dce55fcbea Mon Sep 17 00:00:00 2001 From: Tom Butcher Date: Sat, 1 Aug 2026 21:51:51 +0100 Subject: [PATCH] Enhance desktop window creation and logging - Updated electrobun.config.ts to conditionally disable ASAR packaging for macOS to improve module loading reliability. - Added detailed logging in src/bun/index.js to track the startup process of the desktop host and services. - Improved the createDesktopWindow function in src/desktop/window.js with enhanced logging and timeout handling for the webview's readiness, ensuring better visibility during the window creation process. --- electrobun.config.ts | 20 +++++++++++++++++--- src/bun/index.js | 4 ++++ src/desktop/window.js | 27 +++++++++++++++++++++++++-- 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/electrobun.config.ts b/electrobun.config.ts index 0838b20..f8bd558 100644 --- a/electrobun.config.ts +++ b/electrobun.config.ts @@ -5,6 +5,13 @@ const packageJson = JSON.parse(readFileSync("./package.json", "utf8")); const buildEnv = process.env.ELECTROBUN_BUILD_ENV || "dev"; const isStable = buildEnv === "stable"; const canCodesign = Boolean(process.env.ELECTROBUN_DEVELOPER_ID); +const targetOs = + process.env.ELECTROBUN_OS || + (process.platform === "darwin" + ? "macos" + : process.platform === "win32" + ? "win" + : "linux"); const nativeExternals = [ "canvas", @@ -27,12 +34,19 @@ export default { build: { buildFolder: "build", artifactFolder: "app_dist", - useAsar: isStable, - asarUnpack: ["*.node", "*.dll", "*.dylib", "*.so"], + // macOS WebKit loads views:// assets reliably from a flat app folder; + // ASAR-packed views can fail to load module scripts on first launch. + useAsar: isStable && targetOs !== "macos", + asarUnpack: [ + "*.node", + "*.dll", + "*.dylib", + "*.so", + "views/**", + ], bun: { entrypoint: "src/bun/index.js", external: nativeExternals, - packages: "external", }, copy: { "dist/mainview": "views/mainview", diff --git a/src/bun/index.js b/src/bun/index.js index 915d53d..5e1bdf8 100644 --- a/src/bun/index.js +++ b/src/bun/index.js @@ -2,7 +2,11 @@ import { createDesktopWindow } from "../desktop/window.js"; import { setupIPC } from "../desktop/rpc.js"; import { init } from "../index.js"; +console.log("[FarmControlServer] Starting desktop host..."); + const mainWindow = await createDesktopWindow(); await setupIPC(mainWindow); +console.log("[FarmControlServer] Desktop window created, starting services..."); await init({ headless: false, skipWindow: true }); +console.log("[FarmControlServer] Startup complete"); diff --git a/src/desktop/window.js b/src/desktop/window.js index 6bff630..7a88a9b 100644 --- a/src/desktop/window.js +++ b/src/desktop/window.js @@ -33,6 +33,7 @@ export async function createDesktopWindow() { const rpc = createAppRpc(); startWaiting("Creating desktop window...", logger); + logger.info(`Loading main view: ${url}`); const mainWindow = new BrowserWindow({ title: "Farm Control Server", @@ -49,11 +50,33 @@ export async function createDesktopWindow() { }); registerMainWindow(mainWindow); + mainWindow.show(); return new Promise((resolve) => { - mainWindow.webview.on("dom-ready", async () => { + let settled = false; + + const finish = async (reason) => { + if (settled) { + return; + } + settled = true; + clearTimeout(timeout); + logger.info(`Desktop window ready (${reason})`); await stopWaiting(); resolve(mainWindow); - }); + }; + + const timeout = setTimeout(() => { + logger.warn( + "Desktop window dom-ready timed out after 15s; continuing startup", + ); + finish("timeout"); + }, 15000); + + mainWindow.webview.on("dom-ready", () => finish("dom-ready")); + mainWindow.webview.on("did-navigate", () => finish("did-navigate")); + mainWindow.webview.on("did-commit-navigation", () => + finish("did-commit-navigation"), + ); }); }