From 84827350af16ab927125c4a63da6f03d8642097b Mon Sep 17 00:00:00 2001 From: a2nr Date: Fri, 17 Jul 2026 10:37:08 +0700 Subject: [PATCH] fix(usb-deployer): drain stray bytes until quiet window --- frontend/src/lib/services/usb-deployer.ts | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/frontend/src/lib/services/usb-deployer.ts b/frontend/src/lib/services/usb-deployer.ts index e158534..bc17f18 100644 --- a/frontend/src/lib/services/usb-deployer.ts +++ b/frontend/src/lib/services/usb-deployer.ts @@ -494,31 +494,36 @@ export class USBHardwareDeployer implements HardwareDeployer { } /** - * Drain any stray bytes from the serial input (short timeout). - * Drains repeatedly until no more bytes arrive or 50ms elapsed. + * Drain any stray bytes from the serial input. + * Keeps reading until no bytes arrive for DRAIN_BYTE_TIMEOUT_MS, + * or DRAIN_TOTAL_MS has elapsed. */ private async drainStray(): Promise { - const deadline = Date.now() + 50; + const deadline = Date.now() + DRAIN_TOTAL_MS; let totalDrained = 0; - + while (Date.now() < deadline) { try { const { value, done } = await Promise.race([ this.reader!.read(), new Promise((_, reject) => - setTimeout(() => reject(new Error('timeout')), 10) + setTimeout(() => reject(new Error('timeout')), DRAIN_BYTE_TIMEOUT_MS) ) ]); if (done) break; if (value && value.length > 0) { totalDrained += value.length; + /* Got bytes; keep looping inside the same deadline window. */ + continue; } + /* Empty chunk: treat same as a quiet window. */ + break; } catch { - /* timeout — no more bytes available */ + /* No bytes available for DRAIN_BYTE_TIMEOUT_MS -> channel is clean. */ break; } } - + if (totalDrained > 0) { console.log(`[USB] drained ${totalDrained} stray bytes`); }