1 | /* global URL */ |
||
2 | var q = require('q'); |
||
3 | var webworkify = require('webworkify'); |
||
4 | |||
5 | /** |
||
6 | * wrapper around creating / using webworker that reuses webworker instance |
||
7 | * |
||
8 | * @param self |
||
9 | * @param workerModuleFactory |
||
10 | * @param message |
||
11 | * @returns {*} |
||
12 | */ |
||
13 | module.exports = exports = { |
||
14 | workify: function(self, workerModuleFactory, onLoad, message) { |
||
15 | if (typeof message === "undefined") { |
||
16 | if (typeof onLoad !== "undefined") { |
||
17 | message = onLoad; |
||
18 | onLoad = function noop() {}; |
||
19 | } |
||
20 | } |
||
21 | |||
22 | // create promise for result |
||
23 | var deferred = q.defer(); |
||
24 | |||
25 | try { |
||
26 | // init worker if necessary |
||
27 | if (typeof self.worker === "undefined") { |
||
28 | self.worker = webworkify(workerModuleFactory()); |
||
29 | self.first = true; |
||
30 | self.id = 0; |
||
31 | onLoad(self.worker); |
||
0 ignored issues
–
show
Bug
introduced
by
![]() |
|||
32 | } |
||
33 | |||
34 | var worker = self.worker; |
||
35 | |||
36 | // keep a unique id to distinguish between responses |
||
37 | var id = self.id++; |
||
38 | |||
39 | var onMessage = function(e) { |
||
40 | if (self.first) { |
||
41 | self.first = false; |
||
42 | URL.revokeObjectURL(worker.objectURL); |
||
43 | } |
||
44 | |||
45 | // don't process messages that aren't for us |
||
46 | if (e.data.id !== id) { |
||
47 | return; |
||
48 | } |
||
49 | |||
50 | deferred.resolve(e.data); |
||
51 | }; |
||
52 | |||
53 | var onError = function(e) { |
||
54 | deferred.reject(new Error(e.message.replace("Uncaught Error: ", ''))); |
||
55 | }; |
||
56 | |||
57 | var unsub = function() { |
||
58 | worker.removeEventListener("message", onMessage); |
||
59 | worker.removeEventListener("error", onError); |
||
60 | }; |
||
61 | |||
62 | // register event listeners |
||
63 | worker.addEventListener('message', onMessage, false); |
||
64 | worker.addEventListener('error', onError, false); |
||
65 | |||
66 | // submit message to worker to init work |
||
67 | message.id = id; |
||
68 | worker.postMessage(message); |
||
69 | |||
70 | // return promise |
||
71 | return deferred.promise.then(function(r) { |
||
72 | unsub(); |
||
73 | return r; |
||
74 | }, function(e) { |
||
75 | unsub(); |
||
76 | throw e; |
||
77 | }); |
||
78 | } catch (e) { |
||
79 | deferred.reject(e); |
||
80 | return deferred.promise; |
||
81 | } |
||
82 | } |
||
83 | }; |
||
84 |