self.pyodideUrl = null; self.micropipIncludePre = false; self.pythonModuleName = null; self.documentUrl = null; self.initialized = false; self.flet_js = {}; // namespace for Python global functions self.initPyodide = async function () { try { importScripts(self.pyodideUrl); self.pyodide = await loadPyodide(); self.pyodide.registerJsModule("flet_js", flet_js); self.pyodide.globals.set("python_module_name", self.pythonModuleName); self.pyodide.globals.set("micropip_include_pre", self.micropipIncludePre); flet_js.documentUrl = documentUrl; await self.pyodide.loadPackage("micropip"); await self.pyodide.runPythonAsync(` import flet_js, micropip, os, runpy, sys, traceback from pyodide.http import pyfetch py_args = flet_js.args.to_py() if flet_js.args else None if "python_module_name" in py_args: python_module_name = py_args["python_module_name"] if python_module_name is None: python_module_name = "main" if "micropip_include_pre" in py_args: micropip_include_pre = py_args["micropip_include_pre"] if micropip_include_pre is None: micropip_include_pre = False print("python_module_name:", python_module_name) print("micropip_include_pre:", micropip_include_pre) if "script" not in py_args: print("Downloading app archive") response = await pyfetch("assets/app/app.zip") await response.unpack_archive() else: print("Saving script to a file") with open(f"{python_module_name}.py", "w") as f: f.write(py_args["script"]); pkgs_path = "__pypackages__" if os.path.exists(pkgs_path): print(f"Adding {pkgs_path} to sys.path") sys.path.insert(0, pkgs_path) if os.path.exists("requirements.txt"): with open("requirements.txt", "r") as f: deps = [line.rstrip() for line in f] print("Loading requirements.txt:", deps) await micropip.install(deps, pre=micropip_include_pre) if "dependencies" in py_args: await micropip.install(py_args["dependencies"], pre=micropip_include_pre) # Execute app runpy.run_module(python_module_name, run_name="__main__") `); await self.flet_js.start_connection(self.receiveCallback); self.postMessage("initialized"); } catch (error) { self.postMessage(error.toString()); } }; self.receiveCallback = (message) => { self.postMessage(message.toJs()); } self.onmessage = async (event) => { // run only once if (!self.initialized) { self.initialized = true; self.pyodideUrl = event.data.pyodideUrl; self.flet_js.args = event.data.args; self.documentUrl = event.data.documentUrl; self.micropipIncludePre = event.data.micropipIncludePre; self.pythonModuleName = event.data.pythonModuleName; await self.initPyodide(); } else { // message flet_js.send(event.data); } };