web-threads
Version:
generic threads using web workers for the web
40 lines (36 loc) • 1.22 kB
JavaScript
;
function worker () {
function getFunctionArguments(fn) {
return fn.substring(fn.indexOf("(") + 1, fn.indexOf(")"));
}
function getFunctionContent(fn) {
return fn.substring(fn.indexOf("{") + 1, fn.lastIndexOf("}"));
}
function worker(params) {
var context = params.data[0].context;
var fn = params.data[0].fn;
var newFunc = new Function(getFunctionArguments(fn), getFunctionContent(fn));
postMessage([newFunc.apply(context, params.data[0].args), context]);
}
self.onmessage = worker;
return worker;
}
var workerString = worker.toString();
var code = workerString.substring(workerString.indexOf("{") + 1, workerString.lastIndexOf("return"));
function execute(param) {
return new Promise(function (resolve, reject) {
var webWorker = new Worker(URL.createObjectURL(new Blob([code], {
type: 'text/javascript'
})));
webWorker.onmessage = function (result) {
if (param.context) Object.assign(param.context, result.data[1]);
resolve(result.data[0]);
};
webWorker.onerror = reject;
var copy = Object.assign({}, param, {
fn: param.fn.toString()
});
webWorker.postMessage([copy]);
});
}
exports.execute = execute;