Skip to content

Commit 1cdfae2

Browse files
author
Romain Fournereau
committed
'webkitURL' is deprecated. Please use 'URL' instead.
1 parent c679a72 commit 1cdfae2

File tree

3 files changed

+70
-86
lines changed

3 files changed

+70
-86
lines changed

dist/angular-workers.js

Lines changed: 68 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -2,64 +2,81 @@ angular.module('FredrikSandell.worker-pool', []).service('WorkerService', [
22
'$q',
33
function ($q) {
44
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;
76
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');
846
that.setAngularUrl = function (urlToAngularJs) {
947
urlToAngular = urlToAngularJs;
48+
return that;
1049
};
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();
5650
that.addDependency = function (serviceName, moduleName, url) {
5751
serviceToUrlMap[serviceName] = {
5852
url: url,
5953
moduleName: moduleName
6054
};
6155
return that;
6256
};
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+
};
6380
function createIncludeStatements(listOfServiceNames) {
6481
var includeString = '';
6582
angular.forEach(listOfServiceNames, function (serviceName) {
@@ -104,7 +121,6 @@ angular.module('FredrikSandell.worker-pool', []).service('WorkerService', [
104121
var deferred = $q.defer();
105122
initializedWorker.addEventListener('message', function (e) {
106123
var eventId = e.data.event;
107-
//console.log(e.data);
108124
if (eventId === 'initDone') {
109125
throw 'Received worker initialization in run method. This should already have occurred!';
110126
} else if (eventId === 'success') {
@@ -125,44 +141,12 @@ angular.module('FredrikSandell.worker-pool', []).service('WorkerService', [
125141
};
126142
return that;
127143
};
128-
var extractDependencyList = function (depFuncList) {
144+
function extractDependencyList(depFuncList) {
129145
return depFuncList.slice(0, depFuncList.length - 1);
130-
};
131-
var workerFunctionToString = function (func, paramList) {
146+
}
147+
function workerFunctionToString(func, paramList) {
132148
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+
}
166150
return that;
167151
}
168152
]);

dist/angular-workers.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/angular-workers.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ angular.module('FredrikSandell.worker-pool', [])
7777

7878
var dependencyMetaData = createDependencyMetaData(extractDependencyList(depFuncList));
7979

80-
var blobURL = (window.webkitURL ? webkitURL : URL).createObjectURL(new Blob([
80+
var blobURL = (window.URL ? URL : webkitURL).createObjectURL(new Blob([
8181
populateWorkerTemplate(
8282
workerFunctionToString(
8383
depFuncList[depFuncList.length - 1],

0 commit comments

Comments
 (0)