'a'
mh-two-thousand-and-two
2024-04-12 44d2c92345cd156a59fc327b3060292a282d2893
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
64
65
66
67
68
69
70
var restArgs = require('./restArgs');
var uniqId = require('./uniqId');
var toSrc = require('./toSrc');
var createUrl = require('./createUrl');
var isStr = require('./isStr');
var root = require('./root');
exports = function(fn) {
    var promises = {};
    var src = [
        toSrc(isPromise),
        'onmessage=(',
        toSrc(function(fn) {
            return function(e) {
                var data = e.data;
                var id = data[0];
                var args = data[1];
                var value;
                try {
                    value = fn.apply(fn, args);
                    if (isPromise(value)) {
                        value.then(
                            function(value) {
                                postMessage([id, null, value]);
                            },
                            function(err) {
                                postMessage([id, err.message]);
                            }
                        );
                    } else {
                        postMessage([id, null, value]);
                    }
                } catch (e) {
                    postMessage([id, e.message]);
                }
            };
        }),
        ')(' + toSrc(fn) + ')'
    ].join('\n');
    var worker = new Worker(createUrl(src));
    worker.onmessage = function(e) {
        var data = e.data;
        var id = data[0];
        var err = data[1];
        var value = data[2];
        if (isStr(err)) err = new Error(err);
        promises[id](err, value);
        delete promises[id];
    };
    return restArgs(function(args) {
        var id = uniqId('workerize');
        return new root.Promise(function(resolve, reject) {
            promises[id] = function(err, value) {
                if (err) return reject(err);
                resolve(value);
            };
            worker.postMessage([id, args]);
        });
    });
};
 
function isPromise(val) {
    return (
        !!val &&
        (typeof val === 'object' || typeof val === 'function') &&
        typeof val.then === 'function' &&
        typeof val.catch === 'function'
    );
}
 
module.exports = exports;