From 49a25a5c89ec024912fab060f14db45b4facd005 Mon Sep 17 00:00:00 2001 From: webreflection Date: Tue, 26 Aug 2025 14:39:36 +0200 Subject: [PATCH] Experimenal Pyodide in MicroPython --- test/raw/micropython/index.html | 36 ++++++++++++++++++----------- test/raw/micropython/worker.js | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 test/raw/micropython/worker.js diff --git a/test/raw/micropython/index.html b/test/raw/micropython/index.html index af3b4185..5308b3ad 100644 --- a/test/raw/micropython/index.html +++ b/test/raw/micropython/index.html @@ -4,22 +4,32 @@ diff --git a/test/raw/micropython/worker.js b/test/raw/micropython/worker.js new file mode 100644 index 00000000..0bcdc333 --- /dev/null +++ b/test/raw/micropython/worker.js @@ -0,0 +1,41 @@ +const { promise, resolve } = Promise.withResolvers(); + +addEventListener('message', async ({ data }) => { + await promise; + await interpreter.runPythonAsync(data); +}); + +// Instant MicroPython +const base = 'https://cdn.jsdelivr.net/npm/@micropython/micropython-webassembly-pyscript@latest'; +const { loadMicroPython } = await import(`${base}/micropython.mjs`); +const interpreter = await loadMicroPython({ url: `${base}/micropython.wasm` }); + +// Lazy Pyodide +let pyodide; +interpreter.registerJsModule('pyodide', new Proxy(new Map, { + async get(locals, prop) { + const [ module ] = prop.split(/[@<>=]/); + if (!locals.has(module)) { + if (!pyodide) { + const { loadPyodide } = await import(`https://cdn.jsdelivr.net/pyodide/v0.28.1/full/pyodide.mjs`); + pyodide = await loadPyodide({ indexURL: 'https://cdn.jsdelivr.net/pyodide/v0.28.1/full' }); + } + try { + pyodide.runPython(`import ${module}`, { locals }); + } + catch { + let micropip = locals.get('micropip'); + if (!micropip) { + await pyodide.loadPackage('micropip'); + micropip = pyodide.pyimport('micropip'); + locals.set('micropip', micropip); + } + await micropip.install([prop], { keep_going: true }); + pyodide.runPython(`import ${module}`, { locals }); + } + } + return locals.get(module); + } +})); + +resolve();