-
-
Notifications
You must be signed in to change notification settings - Fork 634
/
Copy pathworkerWrapper.ts
63 lines (55 loc) · 1.23 KB
/
workerWrapper.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
import { Module } from "webpack";
const resolves = {};
const rejects = {};
let globalMsgId = 0;
// Activate calculation in the worker, returning a promise
function sendMsg(payload, worker: Worker) {
const msgId = globalMsgId++;
const msg = {
id: msgId,
payload
};
return new Promise(function(resolve, reject) {
// save callbacks for later
resolves[msgId] = resolve;
rejects[msgId] = reject;
worker.postMessage(msg);
// TODO: CHECK FOR MEMORY LEAK
});
}
// Handle incoming calculation result
function handleMsg(msg) {
const { id, err, payload } = msg.data;
if (payload) {
const resolve = resolves[id];
if (resolve) {
resolve(payload);
}
} else {
// error condition
const reject = rejects[id];
if (reject) {
if (err) {
reject(new Error(err));
} else {
reject("Got nothing");
}
}
}
// purge used callbacks
delete resolves[id];
delete rejects[id];
}
export class Wrapper {
worker: Worker;
constructor(worker: Worker) {
this.worker = worker;
this.worker.onmessage = handleMsg;
}
send(str): Promise<any> {
return sendMsg(str, this.worker);
}
}
export function getWorker(Worker) {
return new Wrapper(new Worker());
}