Cleanup timeout issue
This commit is contained in:
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user