Cleanup timeout issue

This commit is contained in:
Peter Stockings
2025-07-26 22:17:54 +10:00
parent 2fbace641d
commit de5c56e530

View File

@@ -72,39 +72,45 @@ async function handler(req: Request): Promise<Response> {
} = body; } = body;
const executionPromise = new Promise((resolve, reject) => { const executionPromise = new Promise((resolve, reject) => {
const messageHandler = (e) => { let timeoutId: number;
resolve(e.data);
cleanup();
};
const errorHandler = (e) => {
reject(new Error(`Worker error: ${e.message}`));
cleanup();
};
const cleanup = () => { const cleanup = () => {
availableWorker.worker.removeEventListener("message", messageHandler); availableWorker.worker.removeEventListener("message", messageHandler);
availableWorker.worker.removeEventListener("error", errorHandler); 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("message", messageHandler);
availableWorker.worker.addEventListener("error", errorHandler); availableWorker.worker.addEventListener("error", errorHandler);
});
const timeoutPromise = new Promise((_, reject) =>
setTimeout(() => reject(new Error("Timeout")), TIMEOUT_MS)
);
availableWorker.worker.postMessage({ code, request, environment, name }); availableWorker.worker.postMessage({ code, request, environment, name });
});
const startTime = performance.now(); const startTime = performance.now();
try { try {
const result = await Promise.race([executionPromise, timeoutPromise]); const result = await executionPromise;
return new Response(JSON.stringify(result), { return new Response(JSON.stringify(result), {
headers: { "Content-Type": "application/json" }, headers: { "Content-Type": "application/json" },
}); });
} catch (err) { } catch (err) {
const executionTime = performance.now() - startTime; const executionTime = performance.now() - startTime;
const payload = { const payload = {
status: States.TIMEOUT, status: err.message === "Timeout" ? States.TIMEOUT : "ERROR",
result: err.message, result: err.message,
logs: [], logs: [],
environment: environment, environment: environment,