import { loadPyodide } from "https://cdn.jsdelivr.net/pyodide/v314.0.5/full/pyodide.mjs"; const MODULES = [ "__init__.py", "api.py", "diagnostics.py", "disaggregated.py", "kv_cache.py", "latency.py", "metrics.py", "models.py", "optimizer.py", "profiles.py", "simulator.py", "workloads.py", ]; let pyodide; async function init() { pyodide = await loadPyodide(); pyodide.FS.mkdirTree("/home/pyodide/inferscale"); for (const file of MODULES) { const url = new URL(`./py/inferscale/${file}`, self.location.href); const response = await fetch(url); if (!response.ok) throw new Error(`Failed to fetch ${file}: HTTP ${response.status}`); pyodide.FS.writeFile(`/home/pyodide/inferscale/${file}`, await response.text(), { encoding: "utf8" }); } await pyodide.runPythonAsync(` import sys if "/home/pyodide" not in sys.path: sys.path.insert(0, "/home/pyodide") from inferscale.api import execute `); self.postMessage({ type: "ready" }); } const readyPromise = init().catch((error) => { self.postMessage({ type: "fatal", error: error.message || String(error) }); throw error; }); self.onmessage = async (event) => { const { id, action, payload } = event.data; try { await readyPromise; pyodide.globals.set("_action", action); pyodide.globals.set("_payload_json", JSON.stringify(payload ?? {})); const output = await pyodide.runPythonAsync(` import json _result = execute(_action, json.loads(_payload_json)) json.dumps(_result, separators=(",", ":")) `); self.postMessage({ id, result: JSON.parse(output) }); } catch (error) { self.postMessage({ id, error: error.message || String(error) }); } };