Path: blob/main/core/kernel/src/wasm/import-browser.ts
1067 views
import { Options, WasmInstanceAbstractBaseClass } from "./import";1import { EventEmitter } from "events";2import IOProviderUsingAtomics from "./io-using-atomics";3import IOProviderUsingServiceWorker, {4fixServiceWorker,5} from "./io-using-service-worker";6import type { WasmInstanceAsync } from "./types";78class WorkerThread extends EventEmitter {9public postMessage: (message) => void;10public terminate: () => void;1112constructor(worker: Worker) {13super();14this.setMaxListeners(100);15this.postMessage = worker.postMessage.bind(worker);16this.terminate = worker.terminate.bind(worker);17worker.onmessage = ({ data: message }) => {18if (message?.event == "service-worker-broken") {19fixServiceWorker();20return;21}22this.emit("message", message);23};24}25}2627export class WasmInstance extends WasmInstanceAbstractBaseClass {28protected initWorker(): WorkerThread {29// @ts-ignore this import.meta.url issue -- actually only consumed by webpack in calling code...30const worker = new Worker(new URL("./worker/browser.js", import.meta.url));31return new WorkerThread(worker);32}33}3435export default async function wasmImportBrowserWorker(36wasmSource: string,37options: Options = {}38): Promise<WasmInstanceAsync> {39const IOProvider = crossOriginIsolated40? IOProviderUsingAtomics41: IOProviderUsingServiceWorker;42return new WasmInstance(wasmSource, options, IOProvider);43}444546