From de5c56e530dbcfa8bed9f8c52df4c994a90f383e Mon Sep 17 00:00:00 2001 From: Peter Stockings Date: Sat, 26 Jul 2025 22:17:54 +1000 Subject: [PATCH] Cleanup timeout issue --- deno_server.ts | 38 ++++++++++++++++++++++---------------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/deno_server.ts b/deno_server.ts index af14ad3..7da90a5 100644 --- a/deno_server.ts +++ b/deno_server.ts @@ -72,39 +72,45 @@ async function handler(req: Request): Promise { } = body; const executionPromise = new Promise((resolve, reject) => { - const messageHandler = (e) => { - resolve(e.data); - cleanup(); - }; - const errorHandler = (e) => { - reject(new Error(`Worker error: ${e.message}`)); - cleanup(); - }; + let timeoutId: number; + const cleanup = () => { availableWorker.worker.removeEventListener("message", messageHandler); availableWorker.worker.removeEventListener("error", errorHandler); + if (timeoutId) clearTimeout(timeoutId); }; + const messageHandler = (e: MessageEvent) => { + cleanup(); + resolve(e.data); + }; + + const errorHandler = (e: ErrorEvent) => { + cleanup(); + reject(new Error(`Worker error: ${e.message}`)); + }; + + timeoutId = setTimeout(() => { + cleanup(); + reject(new Error("Timeout")); + }, TIMEOUT_MS); + availableWorker.worker.addEventListener("message", messageHandler); availableWorker.worker.addEventListener("error", errorHandler); + + availableWorker.worker.postMessage({ code, request, environment, name }); }); - const timeoutPromise = new Promise((_, reject) => - setTimeout(() => reject(new Error("Timeout")), TIMEOUT_MS) - ); - - availableWorker.worker.postMessage({ code, request, environment, name }); - const startTime = performance.now(); try { - const result = await Promise.race([executionPromise, timeoutPromise]); + const result = await executionPromise; return new Response(JSON.stringify(result), { headers: { "Content-Type": "application/json" }, }); } catch (err) { const executionTime = performance.now() - startTime; const payload = { - status: States.TIMEOUT, + status: err.message === "Timeout" ? States.TIMEOUT : "ERROR", result: err.message, logs: [], environment: environment,