-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathworker-thread.js
More file actions
62 lines (56 loc) · 1.5 KB
/
worker-thread.js
File metadata and controls
62 lines (56 loc) · 1.5 KB
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
window.WorkerThread = (function () {
"use strict";
function str(e) {
if (typeof e === "object" && !Array.isArray(e)) {
var f = [];
var json = JSON.stringify(e, function (k, value) {
return typeof value === "function" ? (f.push(value), "__@f__") : value;
});
return json.replace(/"__@fn__"/g, function () {
return f.shift();
});
}
return typeof e === "function" ? e.toString() : JSON.stringify(e);
}
function read(args) {
var s = "";
for (var i = 1; i < args.length; i++) {
s += (i > 1 ? "," : "") + str(args[i]);
}
return s;
}
function worker(data) {
var url = URL.createObjectURL(new Blob(data, { type:"text/javascript" }));
var w = new Worker(url);
URL.revokeObjectURL(url);
return w;
}
return {
new: function () {
var f = arguments[0].toString();
var args = read(arguments);
return worker(["(",f,")(",args,")"]);
},
run: function () {
var f = arguments[0].toString();
var args = read(arguments);
var w = worker(["postMessage((",f,")(",args,"));"]);
return {
then: function (cb) {
w.onmessage = function (e) {
cb(e.data);
};
}
};
},
await: function () {
var f = arguments[0].toString();
var args = read(arguments);
var w = worker([
"onmessage=function(m){",
"postMessage((",f,")(m.data",(args.length ? "," : ""),args,"));}"
]);
return w;
}
};
})();