mirror of
https://github.com/pyscript/pyscript.git
synced 2026-02-13 07:01:00 -05:00
[next] Better Errors - Worker (#1602)
This commit is contained in:
committed by
GitHub
parent
0c54036466
commit
413428f535
@@ -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");
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
@@ -69,6 +69,6 @@
|
||||
"coincident": "^0.11.1"
|
||||
},
|
||||
"worker": {
|
||||
"blob": "sha256-Ku7KFQEos4ex24kNmg6mhCafl5jblyxgiWfXyVxhpUk="
|
||||
"blob": "sha256-YJ2S61l39eRltU0ldf3Q7CfCASBa8FrQLLsfXUSzBHc="
|
||||
}
|
||||
}
|
||||
|
||||
28
pyscript.core/test/error.html
Normal file
28
pyscript.core/test/error.html
Normal 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>
|
||||
3
pyscript.core/test/error.py
Normal file
3
pyscript.core/test/error.py
Normal file
@@ -0,0 +1,3 @@
|
||||
# from xworker import xworker
|
||||
|
||||
xworker.postMessage("error")
|
||||
Reference in New Issue
Block a user