provisioning-outreach/presentations/rust-laspalmas-250926/auroraframe/framework/templates/wasm-loader.js.template

67 lines
1.8 KiB
Text
Raw Permalink Normal View History

// Generated WASM loader
class WasmLoader {
constructor() {
this.modules = new Map();
}
async loadModule(name, wasmPath) {
if (this.modules.has(name)) {
return this.modules.get(name);
}
try {
let wasmModule;
if (typeof WebAssembly.instantiateStreaming === "function") {
const response = await fetch(wasmPath);
const result = await WebAssembly.instantiateStreaming(response);
wasmModule = result.instance;
} else {
// Fallback for older browsers
const response = await fetch(wasmPath);
const bytes = await response.arrayBuffer();
const result = await WebAssembly.instantiate(bytes);
wasmModule = result.instance;
}
this.modules.set(name, wasmModule);
return wasmModule;
} catch (error) {
console.error(`Failed to load WASM module ${name}:`, error);
throw error;
}
}
async loadAll() {
const modulePromises = [
{{MODULE_PROMISES}}
];
try {
await Promise.all(modulePromises);
console.log("All WASM modules loaded successfully");
} catch (error) {
console.error("Failed to load some WASM modules:", error);
}
}
getModule(name) {
return this.modules.get(name);
}
}
// Export for use
window.WasmLoader = WasmLoader;
// Auto-load if desired
if (window.autoLoadWasm !== false) {
const loader = new WasmLoader();
loader.loadAll().then(() => {
window.wasm = loader;
// Dispatch event when all modules are ready
window.dispatchEvent(new CustomEvent("wasmReady", {
detail: { loader }
}));
});
}