Files
minimax/webui/src/utils/wasmLoader.ts
2025-11-01 10:01:59 -07:00

90 lines
2.1 KiB
TypeScript

// WASM loader for Rhai CodeMirror mode
import init, {
RhaiMode,
init_codemirror_pass,
} from "@/wasm/rhai-codemirror/rhai_codemirror.js";
let wasmInitialized = false;
let wasmModule: any = null;
let wasmLoadPromise: Promise<any> | null = null;
export const loadRhaiWasm = async () => {
if (wasmInitialized) {
return wasmModule;
}
if (wasmLoadPromise) {
return wasmLoadPromise;
}
wasmLoadPromise = (async () => {
try {
// Initialize the WASM module
wasmModule = await init();
wasmInitialized = true;
return wasmModule;
} catch (error) {
console.error("Failed to load Rhai WASM module:", error);
wasmLoadPromise = null; // Reset on error
throw error;
}
})();
return wasmLoadPromise;
};
export const initRhaiMode = (CodeMirror: any) => {
if (!wasmInitialized || !wasmModule) {
throw new Error("WASM module not loaded. Call loadRhaiWasm() first.");
}
// Initialize CodeMirror Pass for the WASM module
init_codemirror_pass(CodeMirror.Pass);
// Define the Rhai mode using the WASM-based RhaiMode
CodeMirror.defineMode("rhai", (config: any) => {
return new RhaiMode(config.indentUnit || 4);
});
};
// Function to preload all WASM modules used by the application
export const loadAllWasm = async (): Promise<void> => {
try {
// Load Rhai CodeMirror WASM
await loadRhaiWasm();
// Load Script Runner WASM by creating and immediately terminating a worker
const worker = new Worker(
new URL("../lib/worker_bulk.ts", import.meta.url)
);
await new Promise<void>((resolve, reject) => {
const timeout = setTimeout(() => {
worker.terminate();
reject(new Error("Script runner WASM load timeout"));
}, 10000);
worker.postMessage({ type: "init" });
worker.onmessage = (event) => {
if (event.data.type === "ready") {
clearTimeout(timeout);
worker.terminate();
resolve();
}
};
worker.onerror = (error) => {
clearTimeout(timeout);
worker.terminate();
reject(error);
};
});
console.log("✅ All WASM modules loaded successfully");
} catch (error) {
console.error("❌ Failed to load WASM modules:", error);
throw error;
}
};
export { RhaiMode };