mirror of
https://github.com/pyscript/pyscript.git
synced 2025-12-19 18:27:29 -05:00
* introducing pyscript.fs namespace/module * Added proper rejection when showDirectoryPicker is not supported * Improved exports to make explicit import in 3rd party modules easier * implemented `fs.unmount(path)`: * verified that RAM gets freed * allowed to mount different handlers within the same path through different `id` as that's the Web best way to do so
118 lines
3.9 KiB
JavaScript
118 lines
3.9 KiB
JavaScript
import { typedSet } from "type-checked-collections";
|
|
import { dedent } from "polyscript/exports";
|
|
import toJSONCallback from "to-json-callback";
|
|
|
|
import { stdlib, optional } from "./stdlib.js";
|
|
|
|
export const main = (name) => hooks.main[name];
|
|
export const worker = (name) => hooks.worker[name];
|
|
|
|
const code = (hooks, branch, key, lib) => {
|
|
hooks[key] = () => {
|
|
const arr = lib ? [lib] : [];
|
|
arr.push(...branch(key));
|
|
return arr.map(dedent).join("\n");
|
|
};
|
|
};
|
|
|
|
export const codeFor = (branch, type) => {
|
|
const pylib = type === "mpy" ? stdlib.replace(optional, "") : stdlib;
|
|
const hooks = {};
|
|
code(hooks, branch, `codeBeforeRun`, pylib);
|
|
code(hooks, branch, `codeBeforeRunAsync`, pylib);
|
|
code(hooks, branch, `codeAfterRun`);
|
|
code(hooks, branch, `codeAfterRunAsync`);
|
|
return hooks;
|
|
};
|
|
|
|
export const createFunction = (self, name) => {
|
|
const cbs = [...worker(name)];
|
|
if (cbs.length) {
|
|
const cb = toJSONCallback(
|
|
self[`_${name}`] ||
|
|
(name.endsWith("Async")
|
|
? async (wrap, xworker, ...cbs) => {
|
|
for (const cb of cbs) await cb(wrap, xworker);
|
|
}
|
|
: (wrap, xworker, ...cbs) => {
|
|
for (const cb of cbs) cb(wrap, xworker);
|
|
}),
|
|
);
|
|
const a = cbs.map(toJSONCallback).join(", ");
|
|
return Function(`return(w,x)=>(${cb})(w,x,...[${a}])`)();
|
|
}
|
|
};
|
|
|
|
const SetFunction = typedSet({ typeof: "function" });
|
|
const SetString = typedSet({ typeof: "string" });
|
|
|
|
export const inputFailure = `
|
|
import builtins
|
|
def input(prompt=""):
|
|
raise Exception("\\n ".join([
|
|
"input() doesn't work when PyScript runs in the main thread.",
|
|
"Consider using the worker attribute: https://pyscript.github.io/docs/2023.11.2/user-guide/workers/"
|
|
]))
|
|
|
|
builtins.input = input
|
|
del builtins
|
|
del input
|
|
`;
|
|
|
|
export const hooks = {
|
|
main: {
|
|
/** @type {Set<function>} */
|
|
onWorker: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onReady: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onBeforeRun: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onBeforeRunAsync: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onAfterRun: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onAfterRunAsync: new SetFunction(),
|
|
/** @type {Set<string>} */
|
|
codeBeforeRun: new SetString([inputFailure]),
|
|
/** @type {Set<string>} */
|
|
codeBeforeRunAsync: new SetString(),
|
|
/** @type {Set<string>} */
|
|
codeAfterRun: new SetString(),
|
|
/** @type {Set<string>} */
|
|
codeAfterRunAsync: new SetString(),
|
|
},
|
|
worker: {
|
|
/** @type {Set<function>} */
|
|
onReady: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onBeforeRun: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onBeforeRunAsync: new SetFunction([
|
|
({ interpreter }) => {
|
|
interpreter.registerJsModule("_pyscript", {
|
|
// cannot be imported from fs.js
|
|
// because this code is stringified
|
|
fs: {
|
|
ERROR: "storage permissions not granted",
|
|
NAMESPACE: "@pyscript.fs",
|
|
},
|
|
interpreter,
|
|
});
|
|
},
|
|
]),
|
|
/** @type {Set<function>} */
|
|
onAfterRun: new SetFunction(),
|
|
/** @type {Set<function>} */
|
|
onAfterRunAsync: new SetFunction(),
|
|
/** @type {Set<string>} */
|
|
codeBeforeRun: new SetString(),
|
|
/** @type {Set<string>} */
|
|
codeBeforeRunAsync: new SetString(),
|
|
/** @type {Set<string>} */
|
|
codeAfterRun: new SetString(),
|
|
/** @type {Set<string>} */
|
|
codeAfterRunAsync: new SetString(),
|
|
},
|
|
};
|