refactoring in playground, use zip file for web

This commit is contained in:
2024-12-08 20:19:55 -08:00
parent 0f5a909cce
commit d6aaaaabf1
47 changed files with 1932 additions and 88 deletions

76
playground/src/frame.ts Normal file
View File

@@ -0,0 +1,76 @@
import { archive } from "./preload";
import { Message } from "./types";
// fs emulation for frame
const shim = {
stdout: "",
fs: {
// made just for Node.newt...
readFileSync(fn: string, encoding: string) {
let data = archive?.getData(fn);
if (data) {
return new TextDecoder().decode(data);
} else {
throw new Error(`${fn} not found`);
}
},
},
};
// we intercept require to return our fake node modules
declare global {
interface Window {
require: (x: string) => any;
}
}
const requireStub: any = (x: string) => (shim as any)[x];
self.require = requireStub;
self.process = {
platform: "linux",
argv: ["", ""],
stdout: {
// We'll want to replace this one
write(s) {
console.log("*", s);
shim.stdout += s;
},
},
exit(v: number) {
console.log("exit", v);
},
cwd() {
return "";
},
env: {
NO_COLOR: "true",
IDRIS2_CG: "javascript",
IDRIS2_PREFIX: "",
},
__lasterr: {
errno: 0,
},
// stdin: { fd: 0 },
};
let realLog = console.log;
console.log = (...args) => {
sendMessage({ type: "pushConsole", message: args.join(" ") });
realLog(...args);
};
window.addEventListener("message", (ev: MessageEvent<Message>) => {
realLog("got", ev.data);
if (ev.data.type === "exec") {
let { src } = ev.data;
try {
sendMessage({ type: "setConsole", messages: [] });
eval(src);
} catch (e) {
console.log(e);
}
}
});
const sendMessage = (msg: Message) => window.parent.postMessage(msg, "*");
realLog("IFRAME INITIALIZED");
if (shim) {
realLog("shim imported for effect");
}