41 lines
1.2 KiB
JavaScript
41 lines
1.2 KiB
JavaScript
importScripts("https://cdn.jsdelivr.net/pyodide/v0.26.2/full/pyodide.js");
|
|
|
|
self.pythonModuleName = null;
|
|
self.initialized = false;
|
|
self.flet_js = {}; // namespace for Python global functions
|
|
|
|
self.initPyodide = async function () {
|
|
self.pyodide = await loadPyodide();
|
|
self.pyodide.registerJsModule("flet_js", flet_js);
|
|
flet_js.documentUrl = documentUrl;
|
|
await self.pyodide.runPythonAsync(`
|
|
import sys, runpy, traceback
|
|
from pyodide.http import pyfetch
|
|
response = await pyfetch("assets/app/app.zip")
|
|
await response.unpack_archive()
|
|
sys.path.append("__pypackages__")
|
|
try:
|
|
runpy.run_module("${self.pythonModuleName}", run_name="__main__")
|
|
except Exception as e:
|
|
traceback.print_exception(e)
|
|
`);
|
|
await self.flet_js.start_connection(self.receiveCallback);
|
|
self.postMessage("initialized");
|
|
};
|
|
|
|
self.receiveCallback = (message) => {
|
|
self.postMessage(message);
|
|
}
|
|
|
|
self.onmessage = async (event) => {
|
|
// run only once
|
|
if (!self.initialized) {
|
|
self.initialized = true;
|
|
self.documentUrl = event.data.documentUrl;
|
|
self.pythonModuleName = event.data.pythonModuleName;
|
|
await self.initPyodide();
|
|
} else {
|
|
// message
|
|
flet_js.send(event.data);
|
|
}
|
|
}; |