From 8d096ef85de90cb651d53546ee44b0d005d70b29 Mon Sep 17 00:00:00 2001 From: Onur Date: Thu, 8 Jan 2026 09:49:27 +0300 Subject: [PATCH] Tests: stabilize file watchers --- src/canvas-host/server.test.ts | 2 +- src/canvas-host/server.ts | 1 + src/gateway/config-reload.ts | 6 ++++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/canvas-host/server.test.ts b/src/canvas-host/server.test.ts index 600e6df74..06132469b 100644 --- a/src/canvas-host/server.test.ts +++ b/src/canvas-host/server.test.ts @@ -231,7 +231,7 @@ describe("canvas host", () => { await server.close(); await fs.rm(dir, { recursive: true, force: true }); } - }); + }, 10_000); it("serves the gateway-hosted A2UI scaffold", async () => { const dir = await fs.mkdtemp(path.join(os.tmpdir(), "clawdbot-canvas-")); diff --git a/src/canvas-host/server.ts b/src/canvas-host/server.ts index 871c70e9f..85eb3bc33 100644 --- a/src/canvas-host/server.ts +++ b/src/canvas-host/server.ts @@ -271,6 +271,7 @@ export async function createCanvasHostHandler( ? chokidar.watch(rootReal, { ignoreInitial: true, awaitWriteFinish: { stabilityThreshold: 75, pollInterval: 10 }, + usePolling: opts.allowInTests === true, ignored: [ /(^|[\\/])\../, // dotfiles /(^|[\\/])node_modules([\\/]|$)/, diff --git a/src/gateway/config-reload.ts b/src/gateway/config-reload.ts index 65303873a..f053dcd2e 100644 --- a/src/gateway/config-reload.ts +++ b/src/gateway/config-reload.ts @@ -360,13 +360,18 @@ export function startGatewayConfigReloader(opts: { const watcher = chokidar.watch(opts.watchPath, { ignoreInitial: true, awaitWriteFinish: { stabilityThreshold: 200, pollInterval: 50 }, + usePolling: Boolean(process.env.VITEST), }); watcher.on("add", schedule); watcher.on("change", schedule); watcher.on("unlink", schedule); + let watcherClosed = false; watcher.on("error", (err) => { + if (watcherClosed) return; + watcherClosed = true; opts.log.warn(`config watcher error: ${String(err)}`); + void watcher.close().catch(() => {}); }); return { @@ -374,6 +379,7 @@ export function startGatewayConfigReloader(opts: { stopped = true; if (debounceTimer) clearTimeout(debounceTimer); debounceTimer = null; + watcherClosed = true; await watcher.close().catch(() => {}); }, };