UNPKG

zthreader

Version:

JavaScript library that provides pseudo-threading for leveraging resources during long, CPU intensive operations

1 lines 2.52 kB
define((()=>(()=>{"use strict";var t={d:(e,s)=>{for(var i in s)t.o(s,i)&&!t.o(e,i)&&Object.defineProperty(e,i,{enumerable:!0,get:s[i]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})}},e={};t.r(e),t.d(e,{zThread:()=>i,zThreader:()=>s});class s{static _threads=[];static _fps=60;static _executeInterval=1e3/60;static _lastExecution=0;static _priority=.4;static _requestId=-1;static init(t,e){this.setPriority(t),this._fps=e||60,this._executeInterval=1e3/this._fps}static add(t){return!this.has(t)&&(this._threads.push(t),1===this._threads.length&&this.run(),!0)}static remove(t){const e=this._threads;let s=e.length,i=!1;for(;s--;)if(e[s]===t){e.splice(s,1),i=!0;break}return i&&0===e.length&&this.stop(),!1}static has(t){return this._threads.indexOf(t)>-1}static stop(){this._threads.length=0,cancelAnimationFrame(this._requestId)}static getAmountOfThreads(){return this._threads.length}static setPriority(t){this._priority=t}static run(){this._requestId=requestAnimationFrame(this.execute.bind(this))}static execute(){const t=Date.now(),e=t-this._lastExecution;if(e>this._executeInterval){this._lastExecution=t-e%this._executeInterval;const s=this._threads.length;let i=this._priority<1?1e3/this._executeInterval*this._priority+1:this._fps-this._priority;i=Math.max(i,s);let r=i/s,n=s,a=0;for(;n--;){const t=this._threads[n];if(t.isExecutable()){if(t.execute(r)){const t=this._threads.length;t>a&&(r=i/(t-a))}}else++a,this._threads.length>1&&(r=i/(this._threads.length-a))}Date.now()}this._threads.length>0&&this.run()}}class i{_iterations=0;_suspended=!1;_paused=!1;constructor(t){"function"==typeof(null==t?void 0:t.executionFn)&&(this._executeInternal=t.executionFn),"function"==typeof(null==t?void 0:t.completeFn)&&(this._callback=t.completeFn),this._iterations=0,this._suspended=!1,this._paused=!1}run(){s.add(this)&&(this._iterations=0)}stop(){s.remove(this)}pause(){this._paused=!0}unpause(){this._paused=!1}execute(t){const e=Date.now();for(;Date.now()-e<t;)if(this._executeInternal())return this.handleComplete(),!0;return!1}sleep(t){window.clearTimeout(this._sleepTimeout),this._suspended=!0,this._sleepTimeout=window.setTimeout((()=>{this._suspended=!1}),t)}isExecutable(){return!this._suspended&&!this._paused}_executeInternal(){return!1}handleComplete(){this.stop(),"function"==typeof this._callback&&this._callback()}}return e})()));