h2non/thread.js

View on GitHub
thread.min.js

Summary

Maintainability
A
0 mins
Test Coverage
/*! thread.js - v0.1.16 - MIT License - https://github.com/h2non/thread.js */
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;"undefined"!=typeof window?t=window:"undefined"!=typeof global?t=global:"undefined"!=typeof self&&(t=self),t.thread=e()}}(function(){var define,module,exports;return function e(t,r,n){function i(o,a){if(!r[o]){if(!t[o]){var u=typeof require=="function"&&require;if(!a&&u)return u(o,!0);if(s)return s(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=r[o]={exports:{}};t[o][0].call(l.exports,function(e){var r=t[o][1][e];return i(r?r:e)},l,l.exports,e,t,r,n)}return r[o].exports}var s=typeof require=="function"&&require;for(var o=0;o<n.length;o++)i(n[o]);return i}({1:[function(e,t,r){var n=e("./utils");var i=e("./worker");var s=window.addEventListener?"addEventListener":"attachEvent";var o=s==="attachEvent"?"onmessage":"message";var a=window[s];var u=window[window.removeEventListener?"removeEventListener":"detachEvent"];t.exports=f;function f(e){this.id=e;this._terminated=false;this.listeners={};this._create();this._setupListeners();this._initialize()}f.prototype._create=function(){var e=this.iframe=document.createElement("iframe");if(!e.style)e.style={};e.style.display="none";e.id="thread-"+this.id;document.body.appendChild(e)};f.prototype._subscribeListeners=function(e){var t=this.listeners;if(s==="attachEvent")e="on"+e;function r(r){if(r.data&&r.data.owner==="thread.js"){if(t[e]){n.each(t[e],function(e){if(n.isFn(e))e(r)})}}}this._eventHandler=r;a(e,r)};f.prototype._setupListeners=function(){this._subscribeListeners("message");this._subscribeListeners("error")};f.prototype._unsubscribeListeners=function(){u("error",this._eventHandler);u("message",this._eventHandler)};f.prototype._getWindow=function(){var e=null;if(!this._terminated){e=this.iframe.contentWindow;var t=e.eval;if(!t&&e.execScript){e.execScript("null");t=e.eval}}return e};f.prototype._initialize=function(e){var t=this._getWindow();if(t)t.eval.call(t,n.getSource(i))};f.prototype.addEventListener=function(e,t){var r=this.listeners[e]=this.listeners[e]||[];if(n.isFn(t))r.push(t)};f.prototype.removeEventListener=function(e,t){var r,i=this.listeners[e];if(i){if(n.isFn(t)){i.splice(0,i.length)}else{r=i.indexOf(t);if(r>=0)i.splice(r,1)}}};f.prototype.postMessage=function(e){var t=this._getWindow();if(t){e.origin=n.getLocation();t.postMessage(e,e.origin)}};f.prototype.terminate=function(){this.listeners={};this._terminated=true;this._unsubscribeListeners();document.body.removeChild(this.iframe)}},{"./utils":7,"./worker":8}],2:[function(e,t,r){var n=e("./store");var i=e("./thread");t.exports=s;window.thread=window.thread||s;function s(e){return new i(e)}s.VERSION="0.1.16";s.create=s;s.Task=i.Task;s.Thread=i;s.total=n.all;s.total=n.total;s.running=n.running;s.idle=n.idle;s.flush=n.flush;s.killAll=s.terminateAll=n.killAll;s.killIdle=s.terminateIdle=n.killIdle},{"./store":4,"./thread":6}],3:[function(e,t,r){var n=e("./utils");t.exports=i;function i(e,t){var r=[t];t._run=t.run;t._terminate=t.terminate;t.run=t.exec=function(){return a(t,r,e,arguments)(0)};t.terminate=t.kill=function(){n.each(r,function(e){if(e._terminate){e._terminate()}else{e.terminate()}});r.splice(0)};t.threadPool=r;t.isPool=true;return t}function s(e){var t=e[0];var r=new t.constructor(t.options);e.push(r);return r}function o(e,t,r){var n=e===t[0]?"_run":"run";return e[n].apply(e,r)}function a(e,t,r,n){return function i(e){var a,f=u(t,e);if(f){a=o(f,t,n)}else{if(t.length<r){a=o(s(t),t,n)}else{a=i(e+1)}}return a}}function u(e,t){var r,n;for(var i=0,s=e.length;i<s;i+=1){r=e[i];n=r.pending();if(n===0||n<t){if(r.terminated){e.splice(i,1);s-=1;i-=1}else{return r}}}}},{"./utils":7}],4:[function(e,t,r){var n=e("./utils");var i=[];var s=t.exports={};s.push=function(e){i.push(e)};s.all=function(){return i.slice()};s.remove=function(e){var t=i.indexOf(e);if(t>=0)i.splice(t,1)};s.flush=function(){i.splice(0)};s.total=function(){return i.length};function o(e){var t=[];n.each(i,function(r){if(r[e]())t.push(r)});return t}s.running=function(){return o("running")};s.idle=function(){return o("idle")};s.killAll=function(){var e=i.slice();n.each(e,function(e){e.kill()})};s.killIdle=function(){n.each(s.idle(),function(e){e.kill()})}},{"./utils":7}],5:[function(e,t,r){var n=e("./utils");t.exports=i;function i(e,t){this.id=n.uuid();this.thread=e;this.worker=e.worker;this.env=t||{};this.time=this.memoized=null;this.listeners={error:[],success:[],end:[]}}i.intervalCheckTime=200;i.prototype.bind=i.prototype.set=function(e){n.extend(this.env,e);return this};i.prototype.run=i.prototype.exec=function(e,t,r){var u=this.thread;if(!u||u._terminated){throw new Error("cannot execute the task. The thread was terminated")}if(!n.isFn(e)){throw new TypeError("first argument must be a function")}if(n.isArr(arguments[1]))r=arguments[1];if(n.isObj(arguments[2]))t=arguments[2];t=n.serializeMap(n.extend({},this.env,t));this.memoized=null;this.time=n.now();if(u.maxTaskDelay>=i.intervalCheckTime){o(this,u.maxTaskDelay)}if(u._tasks.indexOf(this)===-1){u._tasks.push(this)}this["finally"](p(u,this));a(this);s(this,t,e,r);return this};i.prototype.then=i.prototype.success=function(e,t){if(n.isFn(e))u(this,"success",e);if(n.isFn(t))this["catch"](t);return this};i.prototype["catch"]=i.prototype.error=function(e){if(n.isFn(e))u(this,"error",e);return this};i.prototype["finally"]=i.prototype.finish=function(e){if(n.isFn(e)){if(this.memoized)e.call(null,g(this.memoized));else this.listeners.end.push(e)}return this};i.prototype.flush=function(){this.memoized=this.thread=null;this.worker=this.env=this.listeners=null};i.prototype.flushed=function(){return!this.thread&&!this.worker};i.create=function(e){return new i(e)};function s(e,t,r,n){e.worker.postMessage({id:e.id,type:"run",env:t,src:r.toString(),args:n})}function o(e,t){var r=n.now();e._timer=setInterval(function(){if(e.memoized){h.call(e)}else{d.call(e,r,t)}},i.intervalCheckTime)}function a(e){e.worker.addEventListener("message",m(e))}function u(e,t,r){if(e.memoized){if(e.memoized.type==="run:"+t)r.call(null,g(e.memoized))}else{e.listeners[t].push(r)}}function f(e,t,r){if(typeof e._timer==="number")h.call(e);l(e,t)(e.listeners[r])}function l(e,t){return function r(e){var i=null;if(n.isArr(e)){i=e.shift();if(i){i.call(null,t);if(e.length)r(e)}}}}function c(e){var t=new Error(e.error);t.name=e.errorName;t.stack=e.errorStack;return t}function p(e,t){return function(){var r=e._tasks.indexOf(t);e._latestTask=n.now();if(r>=0)e._tasks.splice(r,1)}}function d(e,t){var r=null;if(n.now()-e>t){r=new Error("maximum task execution time exceeded");this.memoized={type:"run:error",error:r};f(this,r,"error");f(this,r,"end");h.call(this)}}function h(){clearInterval(this._timer);this._timer=null}function v(e){return e==="run:error"||e==="run:success"}function m(e){return function t(r){var n=r.data;if(n&&n.id===e.id&&v(n.type)){e.worker.removeEventListener("message",t);e.memoized=n;y(e,n)}}}function y(e,t){var r=g(t);f(e,r,t.type.split(":")[1]);f(e,r,"end")}function g(e){return e.type==="run:error"?c(e):e.value}},{"./utils":7}],6:[function(e,t,r){var n=e("./utils");var i=e("./worker");var s=e("./task");var o=e("./fake-worker");var a=e("./pool");var u=e("./store");var f=window.Worker;var l=window.URL||window.webkitURL;var c=n.isFn(f)||f&&typeof f==="object"||false;var p=/MSIE (10|11)/.test(window.navigator.userAgent);var d=window.BlobBuilder||window.WebKitBlobBuilder||window.MozBlobBuilder;t.exports=h;function h(e){this.id=n.uuid();this.terminated=false;this.options={};this._tasks=[];this._latestTask=0;v(this,e);m(this)}h.prototype.isPool=false;h.prototype.maxTaskDelay=0;h.prototype.idleTime=30*1e3;h.prototype.defaults={evalPath:"lib/eval.js",silent:false};h.prototype.constructor=h;h.prototype.run=h.prototype.exec=function(e,t,r){var i;if(n.isArr(t)){r=t;t=arguments[2]}if(e&&e instanceof s){i=e}else{if(!n.isFn(e))throw new TypeError("first argument must be a function");i=new s(this)}this._tasks.push(i);n.defer(function(){i.run(e,t,r)});return i};h.prototype.require=h.prototype["import"]=function(e,t){if(n.isFn(e)){t=e;e=n.fnName(t);if(!e)throw new Error("function must be named");this.send({type:"require:fn",src:t.toString(),name:n.fnName(t)})}else if(typeof e==="string"){if(n.isFn(t)){this.send({type:"require:fn",src:t.toString(),name:e})}else{if(n.isArr(this.options.require))this.options.require.push(e);this.send({type:"require:file",src:e})}}else if(n.isArr(e)){if(n.isArr(this.options.require))this.options.require=this.options.require.concat(e);this.send({type:"require:file",src:e})}else if(n.isObj(e)){this.send({type:"require:map",src:n.serializeMap(e)})}return this};h.prototype.bind=h.prototype.set=function(e){this.send({type:"env",data:n.serializeMap(e)});return this};h.prototype.flush=function(){this.send({type:"flush"});this.options.env={};return this};h.prototype.flushTasks=function(){n.each(this.tasks,function(e){e.flush()});this._tasks.splice(0);return this};h.prototype.send=function(e){if(this.worker){this.worker.postMessage(e)}};h.prototype.pool=function(e){return a(e||2,this)};h.prototype.terminate=h.prototype.kill=function(){if(!this.terminated){this.options={};this.flushTasks().flush();this.terminated=true;this.worker.terminate();u.remove(this)}return this};h.prototype.start=h.prototype.init=function(e){if(this.terminated){this._setOptions(e);this._create();this.terminated=false}return this};h.prototype.pending=function(){return this._tasks.length};h.prototype.running=function(){return this._tasks.length>0};h.prototype.idle=h.prototype.sleep=function(){return!this.running()&&!this.terminated&&(this._latestTask===0||n.now()-this._latestTask>this.idleTime)};h.prototype.on=h.prototype.addEventListener=function(e,t){if(this.worker)this.worker.addEventListener(e,t);return this};h.prototype.off=h.prototype.removeEventListener=function(e,t){if(this.worker&&n.isFn(t)){this.worker.removeEventListener(e,t)}return this};h.prototype.toString=function(){return"[object Thread]"};h.Task=s;function v(e,t){e.options.namespace="env";e.options.require=[];e.options.env={};n.extend(e.options,e.defaults,t)}function m(e){var t=n.getSource(i);if(c&&l){if(p){e.worker=new f(e.options.evalPath);e.worker.postMessage(t)}else{e.worker=new f(y(t))}}else{e.worker=new o(e.id)}if(!e.options.silent){e.worker.addEventListener("error",function(e){throw e})}e.send({type:"start",env:n.serializeMap(e.options.env),namespace:e.options.namespace,origin:n.getLocation()});e.require(e.options.require);u.push(e)}function y(e){var t=null;try{t=new Blob([e],{type:"text/javascript"})}catch(r){t=new d;t.append(e);t=t.getBlob()}return l.createObjectURL(t)}},{"./fake-worker":1,"./pool":3,"./store":4,"./task":5,"./utils":7,"./worker":8}],7:[function(e,t,r){var n=r;var i=Object.prototype.toString;var s=Array.prototype.slice;var o=Object.prototype.hasOwnProperty;var a=Array.isArray;r.now=function(){return(new Date).getTime()};r.isFn=function(e){return typeof e==="function"};r.isObj=function(e){return e&&i.call(e)==="[object Object]"||false};r.isArr=function(e){return e&&(a?a(e):i.call(e)==="[object Array]")||false};r.toArr=function(e){return s.call(e)};r.defer=function(e){setTimeout(e,1)};r.each=function(e,t){var r,i;if(n.isArr(e))for(r=0,i=e.length;r<i;r+=1)t(e[r],r);else if(n.isObj(e))for(r in e)if(o.call(e,r))t(e[r],r)};r.extend=function(e){var t=n.toArr(arguments).slice(1);n.each(t,function(t){if(n.isObj(t)){n.each(t,function(t,r){e[r]=t})}});return e};r.getSource=function(e){return"("+e.toString()+").call(this)"};r.fnName=function(e){return e.name||(e=/\W*function\s+([\w\$]+)\(/.exec(e.toString())?e[1]:"")};r.serializeMap=function(e){if(n.isObj(e)){n.each(e,function(t,r){if(n.isFn(t)){e["$$fn$$"+r]=t.toString();e[r]=undefined}})}return e};r.uuid=function(){var e="",t,r;for(t=0;t<32;t++){r=Math.random()*16|0;if(t===8||t===12||t===16||t===20)e+="-";e+=(t===12?4:t===16?r&3|8:r).toString(16)}return e};r.getLocation=function(){return location.origin||location.protocol+"//"+location.hostname+(location.port?":"+location.port:"")}},{}],8:[function(require,module,exports){module.exports=worker;function worker(){var self=this;function $$evalExpr(expr){var fn=null;eval("fn = "+expr);return fn}(function isolated(){"use strict";var namespace="env";var isWorker=typeof document==="undefined";var toStr=Object.prototype.toString;var slice=Array.prototype.slice;var eventMethod=self.addEventListener?"addEventListener":"attachEvent";var messageEvent=eventMethod==="attachEvent"?"onmessage":"message";var importFn=isWorker?importScripts:appendScripts;var ready=false;var fnRegex=/^\$\$fn\$\$/;var urlProtocolRegex=/^http[s]?/;var isArrayNative=Array.isArray;var queue,origin,scriptsLoad,intervalId=null;self.addEventListener=self[eventMethod];if(typeof window==="undefined"){self.window=self}function isObj(e){return e&&toStr.call(e)==="[object Object]"}function isArr(e){return e&&(isArrayNative?isArrayNative(e):toStr.call(e)==="[object Array]")||false}function mapFields(e){for(var t in e)if(e.hasOwnProperty(t)){if(fnRegex.test(t)){e[t.replace("$$fn$$","")]=$$evalExpr(e[t]);e[t]=undefined}else{e[t]=e[t]}}return e}function extend(e,t){var r,n,i,s=slice.call(arguments).slice(1);for(r=0,n=s.length;r<n;r+=1){t=s[r];if(isObj(t)){t=mapFields(t);for(i in t)if(t[i]!==undefined){e[i]=t[i]}}}return e}function each(e,t){var r,n;if(isArr(e)){if(e.forEach){e.forEach(t)}else{for(r=0,n=e.length;r<n;r+=1){t(e[r],r)}}}else if(isObj(e)){for(r in e)if(e.hasOwnProperty(r)){t(e[r],r)}}}function waitToDocumentReady(){if(document.readyState==="complete"){ready=true}else{document.onreadystatechange=function(){if(document.readyState==="complete"){ready=true}}}}function appendScript(e){var t=document.getElementsByTagName("head")[0];var r=document.createElement("script");r.type="text/javascript";r.src=e;scriptsLoad.push(r);r.onload=r.onreadystatechange=function(){if(!this.readyState||this.readyState==="loaded"||this.readyState==="complete"){scriptsLoad.splice(scriptsLoad.indexOf(r),1)}r.onload=r.onreadystatechange=null};t.appendChild(r)}function appendScripts(){var e,t,r=slice.call(arguments);for(e=0,t=r.length;e<t;e+=1){if(r[e])appendScript(r[e])}}function scriptsLoadTimer(){intervalId=setInterval(function(){if(ready&&!scriptsLoad.length){clearInterval(intervalId);each(queue,function(e){e()});queue=[];intervalId=null}},50)}function loadScripts(e){if(isArr(e)){importFn.apply(self,e.map(makePathFullUrl))}else{importFn(makePathFullUrl(e))}if(!isWorker&&!intervalId){scriptsLoadTimer()}}function makePathFullUrl(e){if(urlProtocolRegex.test(e)===false){e=origin+e}return e}function require(e){if(isArr(e)||typeof e==="string"){loadScripts(e)}else if(isObj(e)){each(e,function(e,t){requireFn(t,e)})}}function requireFn(name,fn){if(fnRegex.test(name)){name=name.replace("$$fn$$","");fn=$$evalExpr(fn)}eval("self[namespace][name] = "+fn)}function postMessage(e){if(isWorker){self.postMessage(e)}else{e.owner="thread.js";self.parent.postMessage(e,origin)}}function sendError(e,t){postMessage({type:"run:error",id:e.id,error:t.message||t,errorName:t.name||null,errorStack:t.stack||null})}function sendSuccess(e,t){postMessage({type:"run:success",id:e.id,value:t})}function done(e){return function(t,r){if(t){sendError(e,t)}else{sendSuccess(e,r)}}}function process(e){var t=null;var r=e.args||[];var n=$$evalExpr(e.src);var i=isObj(e.env)?mapFields(e.env):self[namespace];if(n.length===r.length+1){r.push(done(e));n.apply(i,r)}else{t=n.apply(i,r);if(t instanceof Error){sendError(e,t)}else{sendSuccess(e,t)}}}function run(e){function t(){try{process(e)}catch(t){sendError(e,t)}}if(!isWorker&&(!ready||scriptsLoad.length)){queue.push(t)}else{t()}}function start(e){if(e.require){require(e.require)}if(e.origin){origin=e.origin}namespace=e.namespace||namespace;self[namespace]=mapFields(e.env||{})}function flush(){self[namespace]={}}function extendEnv(e){extend(self[namespace||namespace],e.env)}function onMessage(e){var t=e.data;if(t.origin){origin=t.origin}switch(t.type){case"start":start(t);break;case"run":run(t);break;case"env":extendEnv(t);break;case"require:fn":requireFn(t.name,t.src);break;case"require:file":case"require:map":require(t.src);break;case"flush":flush();break}}if(!isWorker){scriptsLoad=[];queue=[];waitToDocumentReady()}self.addEventListener(messageEvent,onMessage);self.addEventListener("error",function(e){throw e})})()}},{}]},{},[2])(2)});
//# sourceMappingURL=http://cdn.rawgit.com/h2non/thread.js/0.1.16/thread.min.js.map