File size: 1,490 Bytes
ebc1b3a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
const PYODIDE_URL = 'https://cdn.jsdelivr.net/pyodide/v0.26.4/full/';

let pyodide = null;
let shimSource = '';
let initPromise = null;

function post(message) {
  self.postMessage(message);
}

async function init() {
  if (pyodide) return pyodide;
  if (initPromise) return initPromise;
  initPromise = (async () => {
    if (!shimSource) throw new Error('No Python shim was supplied.');
    importScripts(`${PYODIDE_URL}pyodide.js`);
    if (typeof loadPyodide !== 'function') {
      throw new Error('Pyodide did not initialise.');
    }
    pyodide = await loadPyodide({ indexURL: PYODIDE_URL });
    pyodide.runPython(shimSource);
    post({ type: 'ready' });
    return pyodide;
  })();
  return initPromise;
}

self.onmessage = async (event) => {
  const message = event.data || {};
  if (message.type === 'init') {
    shimSource = message.shim || '';
    try {
      await init();
    } catch (error) {
      post({ type: 'fatal', error: String((error && error.stack) || error) });
    }
    return;
  }
  if (message.type === 'run') {
    try {
      await init();
      pyodide.globals.set('__wfcad_code', message.code || '');
      const raw = pyodide.runPython(
        'import json; json.dumps(__wfcad_runtime.run(__wfcad_code))',
      );
      post({ type: 'result', id: message.id, result: JSON.parse(raw) });
    } catch (error) {
      post({
        type: 'error',
        id: message.id,
        error: String((error && error.message) || error),
      });
    }
  }
};