// isolator/deno_server.ts import { serve } from "https://deno.land/std@0.201.0/http/server.ts"; const TIMEOUT_MS = 5_000; const States = Object.freeze({ TIMEOUT: "TIMEOUT", }); async function handler(req: Request): Promise { if (req.method !== "POST" || new URL(req.url).pathname !== "/execute") { return new Response("Not Found", { status: 404 }); } try { const body = await req.json(); const { code = "", request = {}, environment = {}, name } = body; const worker = new Worker(new URL("./worker.ts", import.meta.url).href, { type: "module", // The `deno` option is now stable, but your editor might show a TS error // if it's not configured for Deno. This will run correctly with Deno. deno: { namespace: true, // recommended for workers permissions: "inherit", }, }); const executionPromise = new Promise((resolve, reject) => { worker.onmessage = (e) => { resolve(e.data); worker.terminate(); }; worker.onerror = (e) => { reject(new Error(`Worker error: ${e.message}`)); worker.terminate(); }; }); const timeoutPromise = new Promise((_, reject) => setTimeout(() => reject(new Error("Timeout")), TIMEOUT_MS) ); worker.postMessage({ code, request, environment, name }); const startTime = performance.now(); try { const result = await Promise.race([executionPromise, timeoutPromise]); return new Response(JSON.stringify(result), { headers: { "Content-Type": "application/json" }, }); } catch (err) { worker.terminate(); const executionTime = performance.now() - startTime; const payload = { status: States.TIMEOUT, result: err.message, logs: [], environment: environment, execution_time: executionTime, }; return new Response(JSON.stringify(payload), { status: 500, headers: { "Content-Type": "application/json" }, }); } } catch (e) { return new Response(`Bad Request: ${e.message}`, { status: 400 }); } } console.log("⚡ Deno server ready on :8000"); await serve(handler, { port: 8000 });