Skip to content

Instantly share code, notes, and snippets.

@jussi-kalliokoski
Created December 4, 2011 19:34
Show Gist options
  • Save jussi-kalliokoski/1431080 to your computer and use it in GitHub Desktop.
Save jussi-kalliokoski/1431080 to your computer and use it in GitHub Desktop.
A small library to get Workers from Data/Blob URIs where supported
<!DOCTYPE html>
<html>
<head>
<script src="inline-worker.js"></script>
</script>
</head>
<body>
<div id="log"></div>
<script>
inlineWorker.onready(function(){
if (inlineWorker.working) {
console.log('It works');
console.log('Worker type: ' + inlineWorker.type);
} else {
console.log('It doesn\'t work.');
}
});
inlineWorker.onready(function(){
var log = document.getElementById('log'),
worker = inlineWorker.working && inlineWorker('var x = 0; setInterval(function(){ postMessage("Hello, I am inside your Worker, sending messages. #" + x++); }, 1000);');
if (worker) {
worker.onmessage = function (e) {
log.innerHTML = e.data;
};
} else {
log.innerHTML = 'Failed to create the worker :(';
}
});
</script>
</body>
</html>
var inlineWorker = (function(){
var BlobBuilder = typeof window === 'undefined' ? undefined :
window.MozBlobBuilder || window.WebKitBlobBuilder || window.MSBlobBuilder || window.OBlobBuilder || window.BlobBuilder,
URL = typeof window === 'undefined' ? undefined : (window.MozURL || window.webkitURL || window.MSURL || window.OURL || window.URL);
/**
* Creates an inline worker using a data/blob URL, if possible.
*
* @arg {String} script
*
* @return {Worker} A web worker, or null if impossible to create.
*/
function inlineWorker (script) {
var worker = null,
url, bb;
try {
bb = new BlobBuilder();
bb.append(script);
url = URL.createObjectURL(bb.getBlob());
worker = new Worker(url);
worker._terminate = worker.terminate;
worker._url = url;
bb = null;
worker.terminate = function () {
this._terminate;
URL.revokeObjectURL(this._url);
};
inlineWorker.type = 'blob';
return worker;
} catch (e) {}
try {
worker = new Worker('data:text/javascript;base64,' + btoa(script));
inlineWorker.type = 'data';
return worker;
} catch (e) {}
return worker;
}
inlineWorker.ready = inlineWorker.working = false;
inlineWorker.events = [];
inlineWorker.test = function () {
var worker = inlineWorker('this.onmessage=function(e){postMessage(e.data)}'),
data = 'inlineWorker';
inlineWorker.ready = inlineWorker.working = false;
function ready(success) {
if (inlineWorker.ready) return;
inlineWorker.ready = true;
inlineWorker.working = success;
while (inlineWorker.events.length) {
inlineWorker.events.shift()();
}
success && worker && worker.terminate();
worker = null;
}
if (!worker) {
ready(false);
} else {
worker.onmessage = function (e) {
ready(e.data === data);
};
worker.postMessage(data);
setTimeout(function () {
ready(false);
}, 1000);
}
};
inlineWorker.onready = function (callback) {
inlineWorker.ready ? callback() : inlineWorker.events.push(callback);
};
inlineWorker.test();
return inlineWorker;
}());
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment