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),
});
}
}
};
|