mirror of
https://github.com/pyscript/pyscript.git
synced 2025-12-19 18:27:29 -05:00
* updated MicroPython to latest in order to have `globals` API available * reduced code around helpers for both MicroPython and Pyodide as now these are more aligned * updated all dependencies and brought in latest [coincident/window](https://github.com/WebReflection/coincident#coincidentwindow) goodness to any `xworker`, preserving the `sync` previous behavior * using [@ungap/structured-clone/json](https://github.com/ungap/structured-clone#tojson) as *coincident* default `parse` and `stringify` utility to allow recursive and more complex data to travel back from the *Worker* (forward data is still fully [structured clone algorithm compatible](https://developer.mozilla.org/en-US/docs/Web/API/Web_Workers_API/Structured_clone_algorithm)) * renamed all *plugin/s* references to *custom/s* as plugin as a word was too misleading * changed *custom types* helpers logic to allow any single node to have its own version of the interpreter wrapper, and all the extra fields it carries with it, including a way to augment every interpreter execution, among as every worker code execution * created a `custom` folder where I've landed the very first `pyscript.js` custom type * created an exhaustive test page to demonstrate the current abilities of *PyScript Next* among its ability to expose utilities that can be used to create *PyScript* plugins
46 lines
1.7 KiB
JavaScript
46 lines
1.7 KiB
JavaScript
import * as JSON from "@ungap/structured-clone/json";
|
|
import coincident from "coincident/window";
|
|
import xworker from "./xworker.js";
|
|
import { assign, defineProperties, absoluteURL } from "../utils.js";
|
|
import { getText } from "../fetch-utils.js";
|
|
|
|
/**
|
|
* @typedef {Object} WorkerOptions custom configuration
|
|
* @prop {string} type the interpreter type to use
|
|
* @prop {string} [version] the optional interpreter version to use
|
|
* @prop {string} [config] the optional config to use within such interpreter
|
|
*/
|
|
|
|
export default (...args) =>
|
|
/**
|
|
* A XWorker is a Worker facade able to bootstrap a channel with any desired interpreter.
|
|
* @param {string} url the remote file to evaluate on bootstrap
|
|
* @param {WorkerOptions} [options] optional arguments to define the interpreter to use
|
|
* @returns {Worker}
|
|
*/
|
|
function XWorker(url, options) {
|
|
const worker = xworker();
|
|
const { postMessage } = worker;
|
|
const hooks = this instanceof XWorker ? void 0 : this;
|
|
if (args.length) {
|
|
const [type, version] = args;
|
|
options = assign({}, options || { type, version });
|
|
if (!options.type) options.type = type;
|
|
}
|
|
if (options?.config) options.config = absoluteURL(options.config);
|
|
const bootstrap = fetch(url)
|
|
.then(getText)
|
|
.then((code) => postMessage.call(worker, { options, code, hooks }));
|
|
return defineProperties(worker, {
|
|
postMessage: {
|
|
value: (data, ...rest) =>
|
|
bootstrap.then(() =>
|
|
postMessage.call(worker, data, ...rest),
|
|
),
|
|
},
|
|
sync: {
|
|
value: coincident(worker, JSON).proxy,
|
|
},
|
|
});
|
|
};
|