[next] Better Errors - Worker (#1602)

This commit is contained in:
Andrea Giammarchi
2023-07-19 13:20:03 +02:00
committed by GitHub
parent 0c54036466
commit 413428f535
5 changed files with 81 additions and 35 deletions

View File

@@ -30,8 +30,12 @@ const add = (type, fn) => {
type,
fn ||
(async (event) => {
await interpreter;
runEvent(`xworker.on${type}`, event);
try {
await interpreter;
runEvent(`xworker.on${type}`, event);
} catch (error) {
postMessage(error);
}
}),
!!fn && { once: true },
);
@@ -55,43 +59,47 @@ const xworker = {
add("message", ({ data: { options, code, hooks } }) => {
interpreter = (async () => {
const { type, version, config, async: isAsync } = options;
const interpreter = await getRuntime(
getRuntimeID(type, version),
config,
);
const details = create(registry.get(type));
const name = `run${isAsync ? "Async" : ""}`;
try {
const { type, version, config, async: isAsync } = options;
const interpreter = await getRuntime(
getRuntimeID(type, version),
config,
);
const details = create(registry.get(type));
const name = `run${isAsync ? "Async" : ""}`;
if (hooks) {
// patch code if needed
const { beforeRun, beforeRunAsync, afterRun, afterRunAsync } =
hooks;
if (hooks) {
// patch code if needed
const { beforeRun, beforeRunAsync, afterRun, afterRunAsync } =
hooks;
const after = afterRun || afterRunAsync;
const before = beforeRun || beforeRunAsync;
const after = afterRun || afterRunAsync;
const before = beforeRun || beforeRunAsync;
// append code that should be executed *after* first
if (after) {
const method = details[name].bind(details);
details[name] = (interpreter, code) =>
method(interpreter, `${code}\n${after}`);
}
// prepend code that should be executed *before* (so that after is post-patched)
if (before) {
const method = details[name].bind(details);
details[name] = (interpreter, code) =>
method(interpreter, `${before}\n${code}`);
// append code that should be executed *after* first
if (after) {
const method = details[name].bind(details);
details[name] = (interpreter, code) =>
method(interpreter, `${code}\n${after}`);
}
// prepend code that should be executed *before* (so that after is post-patched)
if (before) {
const method = details[name].bind(details);
details[name] = (interpreter, code) =>
method(interpreter, `${before}\n${code}`);
}
}
// set the `xworker` global reference once
details.registerJSModule(interpreter, "xworker", { xworker });
// simplify runEvent calls
runEvent = details.runEvent.bind(details, interpreter);
// run either sync or async code in the worker
await details[name](interpreter, code);
return interpreter;
} catch (error) {
postMessage(error);
}
// set the `xworker` global reference once
details.registerJSModule(interpreter, "xworker", { xworker });
// simplify runEvent calls
runEvent = details.runEvent.bind(details, interpreter);
// run either sync or async code in the worker
await details[name](interpreter, code);
return interpreter;
})();
add("error");
add("message");

View File

@@ -53,5 +53,12 @@ export default (...args) =>
if (isHook) this.onWorkerReady?.(this.interpreter, worker);
worker.addEventListener("message", (event) => {
if (event.data instanceof Error) {
event.stopImmediatePropagation();
worker.onerror(event);
}
});
return worker;
};

View File

@@ -69,6 +69,6 @@
"coincident": "^0.11.1"
},
"worker": {
"blob": "sha256-Ku7KFQEos4ex24kNmg6mhCafl5jblyxgiWfXyVxhpUk="
"blob": "sha256-YJ2S61l39eRltU0ldf3Q7CfCASBa8FrQLLsfXUSzBHc="
}
}

View File

@@ -0,0 +1,28 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
</head>
<body>
<div>See console ➡️</div>
<script type="micropython">
from xworker import XWorker
def handle_error(event):
print("Python")
print(event.data.message)
w = XWorker('./error.py')
w.onerror = handle_error
</script>
<script type="module">
import { XWorker } from "../core.js";
const w = new XWorker("./error.py", { type: "micropython" });
w.onerror = ({ data: error }) => {
console.log('JS', error);
};
</script>
</body>
</html>

View File

@@ -0,0 +1,3 @@
# from xworker import xworker
xworker.postMessage("error")