source: gs3-extensions/web-audio/trunk/js-mad/sink.js-master/src/core/inline-worker.js@ 28388

Last change on this file since 28388 was 28388, checked in by davidb, 11 years ago

Set of JS, CSS, PNG etc web resources to support a mixture of audio player/document display capabilities

File size: 2.3 KB
Line 
1void function (Sink) {
2
3/**
4 * Creates an inline worker using a data/blob URL, if possible.
5 *
6 * @static Sink
7 *
8 * @arg {String} script
9 *
10 * @return {Worker} A web worker, or null if impossible to create.
11*/
12
13var define = Object.defineProperty ? function (obj, name, value) {
14 Object.defineProperty(obj, name, {
15 value: value,
16 configurable: true,
17 writable: true
18 });
19} : function (obj, name, value) {
20 obj[name] = value;
21};
22
23function terminate () {
24 define(this, 'terminate', this._terminate);
25
26 Sink.revokeDynURL(this._url);
27
28 delete this._url;
29 delete this._terminate;
30 return this.terminate();
31}
32
33function inlineWorker (script) {
34 function wrap (type, content, typeName) {
35 try {
36 var url = type(content, 'text/javascript');
37 var worker = new Worker(url);
38
39 define(worker, '_url', url);
40 define(worker, '_terminate', worker.terminate);
41 define(worker, 'terminate', terminate);
42
43 if (inlineWorker.type) return worker;
44
45 inlineWorker.type = typeName;
46 inlineWorker.createURL = type;
47
48 return worker;
49 } catch (e) {
50 return null;
51 }
52 }
53
54 var createDynURL = Sink.createDynURL;
55
56 if (!createDynURL) return null;
57
58 var worker;
59
60 if (inlineWorker.createURL) {
61 return wrap(inlineWorker.createURL, script, inlineWorker.type);
62 }
63
64 worker = wrap(createDynURL.createBlob, script, 'blob');
65 if (worker) return worker;
66
67 worker = wrap(createDynURL.createBlobBuilder, script, 'blobbuilder');
68 if (worker) return worker;
69
70 worker = wrap(createDynURL.createData, script, 'data');
71
72 return worker;
73}
74
75Sink.EventEmitter.call(inlineWorker);
76
77inlineWorker.test = function () {
78 inlineWorker.ready = inlineWorker.working = false;
79 inlineWorker.type = '';
80 inlineWorker.createURL = null;
81
82 var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}');
83 var data = 'inlineWorker';
84
85 function ready (success) {
86 if (inlineWorker.ready) return;
87
88 inlineWorker.ready = true;
89 inlineWorker.working = success;
90 inlineWorker.emit('ready', [success]);
91 inlineWorker.off('ready');
92
93 if (success && worker) {
94 worker.terminate();
95 }
96
97 worker = null;
98 }
99
100 if (!worker) {
101 setTimeout(function () {
102 ready(false);
103 }, 0);
104 } else {
105 worker.onmessage = function (e) {
106 ready(e.data === data);
107 };
108
109 worker.postMessage(data);
110
111 setTimeout(function () {
112 ready(false);
113 }, 1000);
114 }
115};
116
117Sink.inlineWorker = inlineWorker;
118
119inlineWorker.test();
120
121}(this.Sink);
Note: See TracBrowser for help on using the repository browser.