From e16c94f2738c83031433995fc7b5f44219bc6747 Mon Sep 17 00:00:00 2001 From: Jake Date: Sun, 23 Mar 2025 23:13:12 +0800 Subject: [PATCH] shifted pyodide to a worker thread, added hooks for external functions from python to javascript --- index.html | 102 ++++++++++++++++------------------------------ pyodide-worker.js | 57 ++++++++++++++++++++++++++ 2 files changed, 93 insertions(+), 66 deletions(-) create mode 100644 pyodide-worker.js diff --git a/index.html b/index.html index d5056aa..bb1a26f 100644 --- a/index.html +++ b/index.html @@ -30,78 +30,48 @@
diff --git a/pyodide-worker.js b/pyodide-worker.js new file mode 100644 index 0000000..ebaab16 --- /dev/null +++ b/pyodide-worker.js @@ -0,0 +1,57 @@ +importScripts("https://cdn.jsdelivr.net/pyodide/v0.23.4/full/pyodide.js"); + +async function initializePyodide() { + self.pyodide = await loadPyodide({ + indexURL: "https://cdn.jsdelivr.net/pyodide/v0.23.4/full/" + }); + + // Expose a function to send messages from Python to JavaScript + self.pyodide.globals.set("send_to_main", (event, data) => { + self.postMessage({ type: event, data: data }); + }); + + // Define the fire() and turn(deg) functions in Python + self.pyodide.runPython(` +import sys +import pyodide + +def fire(): + pyodide.ffi.to_js(send_to_main)("fire", None) + +def turn(deg): + pyodide.ffi.to_js(send_to_main)("turn", deg) + +class ConsoleOutput: + def write(self, text): + if text.strip(): # Avoid empty writes + pyodide.ffi.to_js(send_to_main)("console", text) + return None # Prevent 'undefined' from appearing + + def flush(self): + pass + +sys.stdout = ConsoleOutput() +sys.stderr = ConsoleOutput() +`); + + self.postMessage({ type: "ready" }); // Notify main thread that Pyodide is ready +} + +initializePyodide(); + +self.onmessage = async (event) => { + if (!self.pyodide) { + self.postMessage({ type: "error", message: "Pyodide not initialized yet." }); + return; + } + + try { + let result = await self.pyodide.runPythonAsync(event.data.code); + + if (result !== undefined && result !== null && result !== "") { + self.postMessage({ type: "console", data: result }); + } + } catch (error) { + self.postMessage({ type: "error", message: error.toString() }); + } +};