-
Notifications
You must be signed in to change notification settings - Fork 0
/
createRa.ts
49 lines (43 loc) · 1.19 KB
/
createRa.ts
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
import { WorldState } from "../../pkg/wasm_demo";
// Create an RA Web worker
export const createRa = async (): Promise<WorldState> => {
const worker = new Worker(new URL("./ra-worker.ts", import.meta.url));
const pendingResolve: { [index: string]: any } = {};
let id = 1;
let ready: (value: any) => void;
const callWorker = async (which: any, ...args: any[]) => {
return new Promise((resolve, _) => {
pendingResolve[id] = resolve;
worker.postMessage({
which: which,
args: args,
id: id,
});
id += 1;
});
};
const proxyHandler = {
get: (target: object, prop: PropertyKey, _receiver: any) => {
if (prop == "then") {
return Reflect.get(target, prop, _receiver);
}
return async (...args: any[]) => {
return callWorker(prop, ...args);
};
},
};
worker.onmessage = (e) => {
if (e.data.id == "ra-worker-ready") {
ready(new Proxy({}, proxyHandler));
return;
}
const pending = pendingResolve[e.data.id];
if (pending) {
pending(e.data.result);
delete pendingResolve[e.data.id];
}
};
return new Promise((resolve, _) => {
ready = resolve;
});
};