|
| 1 | +import { SharedObject, SharedObjectRef } from "@oligami/shared-object"; |
| 2 | +import { get_rustc_wasm } from "../../../lib/src/get_rustc_wasm"; |
| 3 | +import { WASIFarmAnimal } from "@oligami/browser_wasi_shim-threads"; |
| 4 | +import type { Ctx } from "../ctx"; |
| 5 | + |
| 6 | +import thread_spawn_path from "./thread_spawn.ts?worker&url"; |
| 7 | + |
| 8 | +let terminal: (string) => void; |
| 9 | +let compiler: WebAssembly.Module; |
| 10 | +const wasi_refs = []; |
| 11 | +let ctx: Ctx; |
| 12 | +let rustc_shared: SharedObject; |
| 13 | +let waiter: { |
| 14 | + rustc: () => Promise<void>; |
| 15 | + end_rustc_fetch: () => Promise<void>; |
| 16 | +}; |
| 17 | + |
| 18 | +globalThis.addEventListener("message", async (event) => { |
| 19 | + if (event.data.ctx) { |
| 20 | + ctx = event.data.ctx; |
| 21 | + terminal = new SharedObjectRef(ctx.terminal_id).proxy< |
| 22 | + (string) => Promise<void> |
| 23 | + >(); |
| 24 | + await terminal("loading rustc\r\n"); |
| 25 | + waiter = new SharedObjectRef(ctx.waiter_id).proxy<{ |
| 26 | + rustc: () => Promise<void>; |
| 27 | + end_rustc_fetch: () => Promise<void>; |
| 28 | + }>(); |
| 29 | + compiler = await get_rustc_wasm(); |
| 30 | + |
| 31 | + await waiter.end_rustc_fetch(); |
| 32 | + } else if (event.data.wasi_ref) { |
| 33 | + const { wasi_ref } = event.data; |
| 34 | + |
| 35 | + wasi_refs.push(wasi_ref); |
| 36 | + |
| 37 | + // wait for the compiler to load |
| 38 | + while (!compiler) { |
| 39 | + await new Promise((resolve) => setTimeout(resolve, 100)); |
| 40 | + } |
| 41 | + |
| 42 | + await terminal("loaded rustc\r\n"); |
| 43 | + |
| 44 | + while (wasi_refs.length === 1) { |
| 45 | + await new Promise((resolve) => setTimeout(resolve, 100)); |
| 46 | + } |
| 47 | + |
| 48 | + await terminal("loaded wasi\r\n"); |
| 49 | + |
| 50 | + const wasi = new WASIFarmAnimal( |
| 51 | + wasi_refs, |
| 52 | + [], // args |
| 53 | + ["RUST_MIN_STACK=16777216"], // env |
| 54 | + { |
| 55 | + // debug: true, |
| 56 | + can_thread_spawn: true, |
| 57 | + thread_spawn_worker_url: new URL(thread_spawn_path, import.meta.url) |
| 58 | + .href, |
| 59 | + thread_spawn_wasm: compiler, |
| 60 | + }, |
| 61 | + ); |
| 62 | + |
| 63 | + await wasi.wait_worker_background_worker(); |
| 64 | + |
| 65 | + wasi.get_share_memory().grow(200); |
| 66 | + |
| 67 | + rustc_shared = new SharedObject((...args) => { |
| 68 | + try { |
| 69 | + wasi.args = ["rustc", ...args]; |
| 70 | + console.log("wasi.start"); |
| 71 | + wasi.block_start_on_thread(); |
| 72 | + console.log("wasi.start done"); |
| 73 | + } catch (e) { |
| 74 | + terminal(`${e.toString()}\r\n`); |
| 75 | + } |
| 76 | + }, ctx.rustc_id); |
| 77 | + |
| 78 | + waiter.rustc(); |
| 79 | + } else if (event.data.wasi_ref_ui) { |
| 80 | + wasi_refs.push(event.data.wasi_ref_ui); |
| 81 | + } |
| 82 | +}); |
0 commit comments