@@ -2,64 +2,81 @@ angular.module('FredrikSandell.worker-pool', []).service('WorkerService', [
2
2
'$q' ,
3
3
function ( $q ) {
4
4
var that = { } ;
5
- //this should be configured from the app in the future
6
- var urlToAngular = 'http://localhost:9876/base/bower_components/angular/angular.js' ;
5
+ var urlToAngular ;
7
6
var serviceToUrlMap = { } ;
7
+ /*jshint laxcomma:true */
8
+ /*jshint quotmark: false */
9
+ var workerTemplate = [
10
+ '' ,
11
+ 'var window = self;' ,
12
+ 'self.history = {};' ,
13
+ 'var document = {' ,
14
+ ' readyState: \'complete\',' ,
15
+ ' cookie: \'\',' ,
16
+ ' querySelector: function () {},' ,
17
+ ' createElement: function () {' ,
18
+ ' return {' ,
19
+ ' pathname: \'\',' ,
20
+ ' setAttribute: function () {}' ,
21
+ ' };' ,
22
+ ' }' ,
23
+ '};' ,
24
+ 'importScripts(\'<URL_TO_ANGULAR>\');' ,
25
+ '<CUSTOM_DEP_INCLUDES>' ,
26
+ 'angular = window.angular;' ,
27
+ 'var workerApp = angular.module(\'WorkerApp\', [<DEP_MODULES>]);' ,
28
+ 'workerApp.run([\'$q\'<STRING_DEP_NAMES>, function ($q<DEP_NAMES>) {' ,
29
+ ' self.addEventListener(\'message\', function(e) {' ,
30
+ ' var input = e.data;' ,
31
+ ' var output = $q.defer();' ,
32
+ ' var promise = output.promise;' ,
33
+ ' promise.then(function(success) {' ,
34
+ ' self.postMessage({event:\'success\', data : success});' ,
35
+ ' }, function(reason) {' ,
36
+ ' self.postMessage({event:\'failure\', data : reason});' ,
37
+ ' }, function(update) {' ,
38
+ ' self.postMessage({event:\'update\', data : update});' ,
39
+ ' });' ,
40
+ ' <WORKER_FUNCTION>;' ,
41
+ ' });' ,
42
+ ' self.postMessage({event:\'initDone\'});' ,
43
+ '}]);' ,
44
+ 'angular.bootstrap(null, [\'WorkerApp\']);'
45
+ ] . join ( '\n' ) ;
8
46
that . setAngularUrl = function ( urlToAngularJs ) {
9
47
urlToAngular = urlToAngularJs ;
48
+ return that ;
10
49
} ;
11
- function createAngularWorkerTemplate ( ) {
12
- /*jshint laxcomma:true */
13
- /*jshint quotmark: false */
14
- var workerTemplate = [
15
- '' ,
16
- '//try {' ,
17
- 'var window = self;' ,
18
- 'self.history = {};' ,
19
- 'var document = {' ,
20
- ' readyState: \'complete\',' ,
21
- ' cookie: \'\',' ,
22
- ' querySelector: function () {},' ,
23
- ' createElement: function () {' ,
24
- ' return {' ,
25
- ' pathname: \'\',' ,
26
- ' setAttribute: function () {}' ,
27
- ' };' ,
28
- ' }' ,
29
- '};' ,
30
- 'importScripts(\'<URL_TO_ANGULAR>\');' ,
31
- '<CUSTOM_DEP_INCLUDES>' ,
32
- 'angular = window.angular;' ,
33
- 'var workerApp = angular.module(\'WorkerApp\', [<DEP_MODULES>]);' ,
34
- 'workerApp.run([\'$q\'<STRING_DEP_NAMES>, function ($q<DEP_NAMES>) {' ,
35
- ' self.addEventListener(\'message\', function(e) {' ,
36
- ' var input = e.data;' ,
37
- ' var output = $q.defer();' ,
38
- ' var promise = output.promise;' ,
39
- ' promise.then(function(success) {' ,
40
- ' self.postMessage({event:\'success\', data : success});' ,
41
- ' }, function(reason) {' ,
42
- ' self.postMessage({event:\'failure\', data : reason});' ,
43
- ' }, function(update) {' ,
44
- ' self.postMessage({event:\'update\', data : update});' ,
45
- ' });' ,
46
- ' <WORKER_FUNCTION>;' ,
47
- ' });' ,
48
- ' self.postMessage({event:\'initDone\'});' ,
49
- '}]);' ,
50
- 'angular.bootstrap(null, [\'WorkerApp\']);' ,
51
- '//} catch(e) {self.postMessage(JSON.stringify(e));}'
52
- ] ;
53
- return workerTemplate . join ( '\n' ) ;
54
- }
55
- var workerTemplate = createAngularWorkerTemplate ( ) ;
56
50
that . addDependency = function ( serviceName , moduleName , url ) {
57
51
serviceToUrlMap [ serviceName ] = {
58
52
url : url ,
59
53
moduleName : moduleName
60
54
} ;
61
55
return that ;
62
56
} ;
57
+ that . createAngularWorker = function ( depFuncList ) {
58
+ //validate the input
59
+ if ( ! Array . isArray ( depFuncList ) || depFuncList . length < 3 || typeof depFuncList [ depFuncList . length - 1 ] !== 'function' ) {
60
+ throw 'Input needs to be: [\'input\',\'output\'/*optional additional dependencies*/,\n' + ' function(workerInput, deferredOutput /*optional additional dependencies*/)\n' + ' {/*worker body*/}' + ']' ;
61
+ }
62
+ if ( typeof urlToAngular !== 'string' ) {
63
+ throw 'The url to angular must be defined before worker creation' ;
64
+ }
65
+ var deferred = $q . defer ( ) ;
66
+ var dependencyMetaData = createDependencyMetaData ( extractDependencyList ( depFuncList ) ) ;
67
+ var blobURL = ( window . URL ? URL : webkitURL ) . createObjectURL ( new Blob ( [ populateWorkerTemplate ( workerFunctionToString ( depFuncList [ depFuncList . length - 1 ] , dependencyMetaData . workerFuncParamList ) , dependencyMetaData ) ] , { type : 'application/javascript' } ) ) ;
68
+ var worker = new Worker ( blobURL ) ;
69
+ //wait for the worker to load resources
70
+ worker . addEventListener ( 'message' , function ( e ) {
71
+ var eventId = e . data . event ;
72
+ if ( eventId === 'initDone' ) {
73
+ deferred . resolve ( buildAngularWorker ( worker ) ) ;
74
+ } else {
75
+ deferred . reject ( e ) ;
76
+ }
77
+ } ) ;
78
+ return deferred . promise ;
79
+ } ;
63
80
function createIncludeStatements ( listOfServiceNames ) {
64
81
var includeString = '' ;
65
82
angular . forEach ( listOfServiceNames , function ( serviceName ) {
@@ -104,7 +121,6 @@ angular.module('FredrikSandell.worker-pool', []).service('WorkerService', [
104
121
var deferred = $q . defer ( ) ;
105
122
initializedWorker . addEventListener ( 'message' , function ( e ) {
106
123
var eventId = e . data . event ;
107
- //console.log(e.data);
108
124
if ( eventId === 'initDone' ) {
109
125
throw 'Received worker initialization in run method. This should already have occurred!' ;
110
126
} else if ( eventId === 'success' ) {
@@ -125,44 +141,12 @@ angular.module('FredrikSandell.worker-pool', []).service('WorkerService', [
125
141
} ;
126
142
return that ;
127
143
} ;
128
- var extractDependencyList = function ( depFuncList ) {
144
+ function extractDependencyList ( depFuncList ) {
129
145
return depFuncList . slice ( 0 , depFuncList . length - 1 ) ;
130
- } ;
131
- var workerFunctionToString = function ( func , paramList ) {
146
+ }
147
+ function workerFunctionToString ( func , paramList ) {
132
148
return '(' + func . toString ( ) + ')(' + paramList + ')' ;
133
- } ;
134
- /**
135
- * example call:
136
- * WorkerService.createAngularWorker(['input', 'output', '$http', function(input, output, $http)
137
- * {body of function}]);
138
- * Parameters "input" and "output" is required. Not defining them will cause a runtime error.
139
- * Declaring services to be injected, as '$http' is above, requires the web worker to be able to resolve them.
140
- * '$http' service is a part of the standard angular package which means it will resolve without additional information
141
- * since angular source is always loaded in the web worker.
142
- * But if a custom service was to be injected the WorkerService would need be be informed on how to resolve the.
143
- * @param depFuncList
144
- */
145
- that . createAngularWorker = function ( depFuncList ) {
146
- //validate the input
147
- if ( ! Array . isArray ( depFuncList ) || depFuncList . length < 3 || typeof depFuncList [ depFuncList . length - 1 ] !== 'function' ) {
148
- throw 'Input needs to be: [\'workerInput\',\'deferredOutput\'/*optional additional dependencies*/,\n' + ' function(workerInput, deferredOutput /*optional additional dependencies*/)\n' + ' {/*worker body*/}' + ']' ;
149
- }
150
- var deferred = $q . defer ( ) ;
151
- var dependencyMetaData = createDependencyMetaData ( extractDependencyList ( depFuncList ) ) ;
152
- var blobURL = ( window . webkitURL ? webkitURL : URL ) . createObjectURL ( new Blob ( [ populateWorkerTemplate ( workerFunctionToString ( depFuncList [ depFuncList . length - 1 ] , dependencyMetaData . workerFuncParamList ) , dependencyMetaData ) ] , { type : 'application/javascript' } ) ) ;
153
- var worker = new Worker ( blobURL ) ;
154
- //wait for the worker to load resources
155
- worker . addEventListener ( 'message' , function ( e ) {
156
- var eventId = e . data . event ;
157
- console . log ( e . data ) ;
158
- if ( eventId === 'initDone' ) {
159
- deferred . resolve ( buildAngularWorker ( worker ) ) ;
160
- } else {
161
- deferred . reject ( e ) ;
162
- }
163
- } ) ;
164
- return deferred . promise ;
165
- } ;
149
+ }
166
150
return that ;
167
151
}
168
152
] ) ;
0 commit comments