Files
pyscript/pyscript.core/esm/worker/_template.js
Andrea Giammarchi af72e232c3 Worker sync utility (#1511)
* patched an issue with wasmoon randomly asking to resolve proxy references
  * simplified pyodide and micropython dance by grouping their common utilities together
  * created an integration test around a worker to main thread input between MicroPython and Lua
  * commented some weird bugs / funny behaviors around both MicroPython and Pyodide
  * other minor clean ups
2023-06-08 11:10:47 +02:00

58 lines
1.9 KiB
JavaScript

// ⚠️ This file is used to generate xworker.js
// That means if any import is circular or brings in too much
// that would be a higher payload for every worker.
// Please check via `npm run size` that worker code is not much
// bigger than it used to be before any changes is applied to this file.
import coincident from "coincident/structured";
import { registry } from "../runtimes.js";
import { getRuntime, getRuntimeID } from "../loader.js";
let engine, run, runtimeEvent;
const add = (type, fn) => {
addEventListener(
type,
fn ||
(async (event) => {
const runtime = await engine;
runtimeEvent = event;
run(runtime, `xworker.on${type}(xworker.event);`, xworker);
}),
!!fn && { once: true },
);
};
const xworker = {
// allows synchronous utilities between this worker and the main thread
sync: coincident(self),
// standard worker related events / features
onerror() {},
onmessage() {},
onmessageerror() {},
postMessage: postMessage.bind(self),
// this getter exists so that arbitrarily access to xworker.event
// would always fail once an event has been dispatched, as that's not
// meant to be accessed in the wild, respecting the one-off event nature of JS.
get event() {
const event = runtimeEvent;
if (!event) throw new Error("Unauthorized event access");
runtimeEvent = void 0;
return event;
},
};
add("message", ({ data: { options, code } }) => {
engine = (async () => {
const { type, version, config, async: isAsync } = options;
const engine = await getRuntime(getRuntimeID(type, version), config);
const details = registry.get(type);
run = details[`runWorker${isAsync ? "Async" : ""}`].bind(details);
run(engine, code, xworker);
return engine;
})();
add("error");
add("message");
add("messageerror");
});