From 935f286377a44872663388ae62b50ba0943a6fca Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 24 Apr 2026 01:53:32 +0700 Subject: [PATCH] chore(lint): clear desktop warnings to zero Convert polling loops to recursive helpers to avoid no-await-in-loop, and switch the ws import to the named export so the WebSocket type is referenced directly. --- packages/desktop/scripts/verify-electron-cdp.mjs | 15 ++++++++++++--- packages/desktop/src/daemon/daemon-manager.ts | 12 ++++++++---- packages/desktop/src/daemon/local-transport.ts | 4 ++-- 3 files changed, 22 insertions(+), 9 deletions(-) diff --git a/packages/desktop/scripts/verify-electron-cdp.mjs b/packages/desktop/scripts/verify-electron-cdp.mjs index fd86ec998..0a795c2a7 100644 --- a/packages/desktop/scripts/verify-electron-cdp.mjs +++ b/packages/desktop/scripts/verify-electron-cdp.mjs @@ -351,7 +351,7 @@ async function inspectFullscreenResizer(page) { } async function findAppPage(browser) { - for (let attempt = 0; attempt < 30; attempt += 1) { + function findMatchingPage() { for (const context of browser.contexts()) { for (const page of context.pages()) { if (page.url().includes(APP_URL_FRAGMENT) && !page.url().startsWith("devtools://")) { @@ -359,9 +359,18 @@ async function findAppPage(browser) { } } } - await new Promise((resolve) => setTimeout(resolve, 500)); + return null; } - throw new Error(`Unable to find Electron app page for ${APP_URL_FRAGMENT}`); + async function poll(attempt) { + const page = findMatchingPage(); + if (page) return page; + if (attempt >= 29) { + throw new Error(`Unable to find Electron app page for ${APP_URL_FRAGMENT}`); + } + await new Promise((resolve) => setTimeout(resolve, 500)); + return poll(attempt + 1); + } + return poll(0); } function attachConsoleCollector(page, consoleMessages) { diff --git a/packages/desktop/src/daemon/daemon-manager.ts b/packages/desktop/src/daemon/daemon-manager.ts index c35b12a62..1e3583775 100644 --- a/packages/desktop/src/daemon/daemon-manager.ts +++ b/packages/desktop/src/daemon/daemon-manager.ts @@ -134,11 +134,13 @@ function sleep(ms: number): Promise { async function waitForPidExit(pid: number, timeoutMs: number): Promise { const deadline = Date.now() + timeoutMs; - while (Date.now() < deadline) { + async function poll(): Promise { if (!isProcessRunning(pid)) return true; + if (Date.now() >= deadline) return !isProcessRunning(pid); await sleep(PID_POLL_INTERVAL_MS); + return poll(); } - return !isProcessRunning(pid); + return poll(); } function tailFile(filePath: string, lines = 50): string { @@ -262,7 +264,8 @@ function buildStartupFailureError( } async function pollForRunningDaemon(): Promise { - for (let attempt = 0; attempt < STARTUP_POLL_MAX_ATTEMPTS; attempt++) { + async function poll(attempt: number): Promise { + if (attempt >= STARTUP_POLL_MAX_ATTEMPTS) return resolveStatus(); const status = await resolveStatus(); if (attempt === 0 || attempt === STARTUP_POLL_MAX_ATTEMPTS - 1 || attempt % 10 === 9) { logDesktopDaemonLifecycle("polling daemon status after detached start", { @@ -275,8 +278,9 @@ async function pollForRunningDaemon(): Promise { } if (status.status === "running" && status.serverId && status.listen) return status; await sleep(STARTUP_POLL_INTERVAL_MS); + return poll(attempt + 1); } - return resolveStatus(); + return poll(0); } async function startDaemon(): Promise { diff --git a/packages/desktop/src/daemon/local-transport.ts b/packages/desktop/src/daemon/local-transport.ts index d13364618..c3d5227f4 100644 --- a/packages/desktop/src/daemon/local-transport.ts +++ b/packages/desktop/src/daemon/local-transport.ts @@ -1,5 +1,5 @@ import { BrowserWindow } from "electron"; -import WebSocket from "ws"; +import { WebSocket, type RawData } from "ws"; interface TransportTarget { transportType: "socket" | "pipe"; @@ -97,7 +97,7 @@ export function openLocalTransportSession(target: TransportTarget): Promise { + ws.on("message", (data: RawData, isBinary: boolean) => { if (isBinary || data instanceof Buffer) { const buf = Buffer.isBuffer(data) ? data : Buffer.from(data as ArrayBuffer); emitTransportEvent({