Skip to content

Instantly share code, notes, and snippets.

@viebel
Forked from westc/limitEval.js
Created November 1, 2016 06:02
Show Gist options
  • Save viebel/707cc19e288aa9f40510333187f06f53 to your computer and use it in GitHub Desktop.
Save viebel/707cc19e288aa9f40510333187f06f53 to your computer and use it in GitHub Desktop.
Use web workers to limit the amount of time that an eval can run.
function limitEval(code, fnOnStop, opt_timeoutInMS) {
var id = Math.random() + 1,
blob = new Blob(
['onmessage=function(a){a=a.data;postMessage({i:a.i+1});postMessage({r:eval.call(this,a.c),i:a.i})};'],
{ type:'text/javascript' }
),
myWorker = new Worker(URL.createObjectURL(blob));
function onDone() {
URL.revokeObjectURL(blob);
fnOnStop.apply(this, arguments);
}
myWorker.onmessage = function (data) {
data = data.data;
if (data) {
if (data.i === id) {// we're done
id = 0;
onDone(true, data.r);
}
else if (data.i === id + 1) {// the worker started
setTimeout(function() {
if (id) {
myWorker.terminate();
onDone(false);
}
}, opt_timeoutInMS || 1000);
}
}
};
myWorker.postMessage({ c: code, i: id });
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment