-
Notifications
You must be signed in to change notification settings - Fork 0
/
wasm-worker.js
52 lines (45 loc) · 1.29 KB
/
wasm-worker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
import { threads } from "wasm-feature-detect";
import { N, AU, N_plummer } from "./cosmology";
import * as Comlink from "comlink";
function wrapExports(wasm) {
const fmm = new wasm.CosmoSim(N_plummer, 10 * AU, N_plummer * 1e24);
return ({ timestep }) => {
const start = performance.now();
fmm.simulate(timestep);
const position = fmm.get_position();
const time = performance.now() - start;
return {
position,
time,
};
};
}
async function initHandlers() {
let [singleThread, multiThread] = await Promise.all([
(async () => {
const singleThread = await import("./pkg/rust_ffm.js");
console.log("single thread available");
await singleThread.default();
return wrapExports(singleThread);
})(),
(async () => {
if (!(await threads())) {
console.error("threads unavailable");
return;
}
console.log("threads available");
const multiThread = await import("./pkg-parallel/rust_ffm.js");
await multiThread.default();
await multiThread.initThreadPool(navigator.hardwareConcurrency);
return wrapExports(multiThread);
})(),
]);
return Comlink.proxy({
singleThread,
supportsThreads: !!multiThread,
multiThread,
});
}
Comlink.expose({
handlers: initHandlers(),
});