playground: minor improvements and install default font

This commit is contained in:
Yeicor
2025-07-26 00:51:53 +02:00
parent 3545785cae
commit d1e5658e07
5 changed files with 142 additions and 44 deletions

View File

@@ -1,30 +1,43 @@
import type {loadPyodide} from "pyodide";
import type {MessageEventDataIn} from "./pyodide-worker.ts";
let requestId = 0;
/** Simple API for the Pyodide worker. */
export function newPyodideWorker(initOpts: Parameters<typeof loadPyodide>[0]) {
let worker = new Worker(new URL('./pyodide-worker.ts', import.meta.url), {type: "module"});
worker.postMessage(initOpts);
return {
asyncRun: (code: String, stdout: (msg: string) => void, stderr: (msg: string) => void) => new Promise((resolve, reject) => {
worker.addEventListener("message", function listener(event) {
if (event.data?.stdout) {
stdout(event.data.stdout);
const commonRequestResponse = (event: MessageEventDataIn, stdout?: (msg: string) => void, stderr?: (msg: string) => void) => {
return new Promise((resolve, reject) => {
worker.addEventListener("message", function listener(event: MessageEvent) {
if (stdout && event.data?.stdout) {
stdout(event.data.stdout); // No clue if associated with this request, but we handle it anyway.
return;
}
if (event.data?.stderr) {
stderr(event.data.stderr);
if (stderr && event.data?.stderr) {
stderr(event.data.stderr); // No clue if associated with this request, but we handle it anyway.
return;
}
// Result or error.
worker.removeEventListener("message", listener);
if (event.data?.id !== event.data.id) return; // Ignore messages that are not for this request.
if (event.data?.error) {
worker.removeEventListener("message", listener);
reject(event.data.error);
} else if (event.data?.hasOwnProperty("result")) {
worker.removeEventListener("message", listener);
resolve(event.data.result);
} else {
resolve(event.data?.result);
throw new Error("Unexpected message from worker: " + JSON.stringify(event.data));
}
});
worker.postMessage(code);
}),
})
worker.postMessage(event);
});
}
return {
asyncRun: (code: string, stdout: (msg: string) => void, stderr: (msg: string) => void) =>
commonRequestResponse({type: "asyncRun", id: requestId++, code}, stdout, stderr),
mkdirTree: (path: string) => commonRequestResponse({type: "mkdirTree", id: requestId++, path}),
writeFile: (path: string, content: string) =>
commonRequestResponse({type: "writeFile", id: requestId++, path, content}),
terminate: () => worker.terminate()
}
}