pyodide-worker.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. // webworker.js
  2. // Setup your project to serve `py-worker.js`. You should also serve
  3. // `pyodide.js`, and all its associated `.asm.js`, `.json`,
  4. // and `.wasm` files as well:
  5. importScripts('/pyodide/pyodide.js');
  6. async function loadPyodideAndPackages(packages = []) {
  7. self.stdout = null;
  8. self.stderr = null;
  9. self.result = null;
  10. self.pyodide = await loadPyodide({
  11. indexURL: '/pyodide/',
  12. stdout: (text) => {
  13. console.log('Python output:', text);
  14. if (self.stdout) {
  15. self.stdout += `${text}\n`;
  16. } else {
  17. self.stdout = `${text}\n`;
  18. }
  19. },
  20. stderr: (text) => {
  21. console.log('An error occured:', text);
  22. if (self.stderr) {
  23. self.stderr += `${text}\n`;
  24. } else {
  25. self.stderr = `${text}\n`;
  26. }
  27. }
  28. });
  29. await self.pyodide.loadPackage('micropip');
  30. const micropip = self.pyodide.pyimport('micropip');
  31. await micropip.set_index_urls('https://pypi.org/pypi/{package_name}/json');
  32. await micropip.install(packages);
  33. }
  34. self.onmessage = async (event) => {
  35. const { id, code, ...context } = event.data;
  36. console.log(event.data)
  37. // The worker copies the context in its own "memory" (an object mapping name to values)
  38. for (const key of Object.keys(context)) {
  39. self[key] = context[key];
  40. }
  41. // make sure loading is done
  42. await loadPyodideAndPackages(self.packages);
  43. self.result = await self.pyodide.runPythonAsync(code);
  44. self.postMessage({ id, result: self.result, stdout: self.stdout, stderr: self.stderr });
  45. };