Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
sagemathinc
GitHub Repository: sagemathinc/wapython
Path: blob/main/core/kernel/src/wasm/import-browser.ts
1067 views
1
import { Options, WasmInstanceAbstractBaseClass } from "./import";
2
import { EventEmitter } from "events";
3
import IOProviderUsingAtomics from "./io-using-atomics";
4
import IOProviderUsingServiceWorker, {
5
fixServiceWorker,
6
} from "./io-using-service-worker";
7
import type { WasmInstanceAsync } from "./types";
8
9
class WorkerThread extends EventEmitter {
10
public postMessage: (message) => void;
11
public terminate: () => void;
12
13
constructor(worker: Worker) {
14
super();
15
this.setMaxListeners(100);
16
this.postMessage = worker.postMessage.bind(worker);
17
this.terminate = worker.terminate.bind(worker);
18
worker.onmessage = ({ data: message }) => {
19
if (message?.event == "service-worker-broken") {
20
fixServiceWorker();
21
return;
22
}
23
this.emit("message", message);
24
};
25
}
26
}
27
28
export class WasmInstance extends WasmInstanceAbstractBaseClass {
29
protected initWorker(): WorkerThread {
30
// @ts-ignore this import.meta.url issue -- actually only consumed by webpack in calling code...
31
const worker = new Worker(new URL("./worker/browser.js", import.meta.url));
32
return new WorkerThread(worker);
33
}
34
}
35
36
export default async function wasmImportBrowserWorker(
37
wasmSource: string,
38
options: Options = {}
39
): Promise<WasmInstanceAsync> {
40
const IOProvider = crossOriginIsolated
41
? IOProviderUsingAtomics
42
: IOProviderUsingServiceWorker;
43
return new WasmInstance(wasmSource, options, IOProvider);
44
}
45
46