import vm from "node:vm"; import url from "node:url"; import fs from "node:fs"; import path from "node:path"; import crypto from "node:crypto"; import perf_hooks from "node:perf_hooks"; const __dirname = url.fileURLToPath(new URL(".", import.meta.url)); let files = [ "src/const.js", "src/config.js", "src/log.js", "src/cpu.js", "src/debug.js", "src/io.js", "src/main.js", "src/lib.js", "src/buffer.js", "src/ide.js", "src/pci.js", "src/floppy.js", "src/memory.js", "src/dma.js", "src/pit.js", "src/vga.js", "src/ps2.js", "src/rtc.js", "src/uart.js", "src/acpi.js", "src/apic.js", "src/ioapic.js", "src/state.js", "src/ne2k.js", "src/sb16.js", "src/virtio.js", "src/virtio_console.js", "src/virtio_net.js", //"src/virtio_balloon.js", "src/bus.js", "src/debug.js", "src/elf.js", "src/kernel.js", "lib/9p.js", "lib/filesystem.js", "lib/jor1k.js", "lib/marshall.js", "src/browser/screen.js", "src/browser/keyboard.js", "src/browser/mouse.js", "src/browser/speaker.js", "src/browser/serial.js", "src/browser/network.js", "src/browser/fake_network.js", "src/browser/fetch_network.js", "src/browser/starter.js", "src/browser/worker_bus.js", "src/browser/dummy_screen.js", "src/browser/print_stats.js", "src/browser/filestorage.js" ]; let globals = Object.create(globalThis); let v86 = {}; let ctx = vm.createContext(globals); globals.DEBUG = false; globals.module = {exports:v86}; Object.defineProperty(globals, "crypto", {value: crypto}); globals.require = (what) => { return ({ perf_hooks, fs })[what]; }; for( let f of files ) { vm.runInContext(fs.readFileSync(path.join(__dirname, f), "utf8"), ctx, { filename: f }); } export let { V86, CPU, FetchNetworkAdapter, MemoryFileStorage, ServerFileStorageWrapper, } = globals;