@knighttower/utility
Version:
UtilityJs is a utility library that provides a collection of utility functions for various tasks. The library is designed to be easy to use and covers the most common use cases.
1 lines • 7.79 kB
JavaScript
var e,t;e=this,t=()=>(()=>{"use strict";var e={d:(t,s)=>{for(var r in s){e.o(s,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:s[r]})}},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{doAsync:()=>p,doPoll:()=>c,doTimeout:()=>h,promisePool:()=>a,promiseQueue:()=>l});class s{constructor(){this.listeners={}}on(e,t){this.registerListener(e,t)}once(e,t){this.registerListener(e,t,1)}exactly(e,t,s){this.registerListener(e,t,s)}off(e){delete this.listeners[e]}detach(e,t){const s=(this.listeners[e]||[]).filter(function(e){return e.callback!==t});return e in this.listeners&&(this.listeners[e]=s,!0)}emit(e,...t){let s=[],r=null;const i=this.extractContextFromArgs(t),n=i[0];if(t=i[1],this.hasListener(e)){s=this.listeners[e]}else if(e.includes("*")){r=this.patternSearch(e,Object.keys(this.listeners)),r.length>0&&r.forEach(e=>{s=s.concat(this.listeners[e])})}else{for(const t in this.listeners){t.includes("*")&&(r=this.patternSearch(t,[e]),r&&(s=s.concat(this.listeners[t])))}}s.forEach((r,i)=>{let o=r.callback;n&&(o=o.bind(n)),void 0!==r.triggerCapacity&&(r.triggerCapacity--,s[i].triggerCapacity=r.triggerCapacity),this.checkToRemoveListener(r)&&this.listeners[e].splice(i,1),o(...t)})}patternSearch(e,t){let s=[];const r=new RegExp(this.setWildCardString(e),"g");return s=t.filter(e=>r.test(e)),0===s.length?null:s}setWildCardString(e){let t=e.replace(/([.+?^${}()|\[\]\/\\])/g,"\\$&");return t=t.replace(/\*/g,"(.*?)"),`^${t}`}extractContextFromArgs(e){let t=null;for(let s=0;s<e.length;s++){const r=e[s];if(r&&"object"==typeof r&&r.hasOwnProperty("__context")){t=r.__context,e.splice(s,1);break}}return[t,e]}registerListener(e,t,s){this.hasListener(e)||(this.listeners[e]=[]),this.listeners[e].push({callback:t,triggerCapacity:s})}checkToRemoveListener(e){return void 0!==e.triggerCapacity&&e.triggerCapacity<=0}hasListener(e){return e in this.listeners}}const r=e=>Array.isArray(e)?e:[e],i=(e=20)=>{const t=()=>Math.random().toString(36).substring(2,15);e=e||40;for(var s="",r=0;r<e/3+1;r++){s+=t()}return s.substring(0,e)};function n(){return"id__"+i(8)+"__"+(new Date).getTime()}function o(e,t){if(null===e){return t?null===t||"null"===t:"null"}let s;switch(typeof e){case"number":case"string":case"boolean":case"undefined":case"bigint":case"symbol":case"function":s=typeof e;break;case"object":s=Array.isArray(e)?"array":"object";break;default:s="unknown"}if(t){if(t.includes("|")){for(let e of t.split("|")){if(s===e){return e}}return!1}return t===s}return s}const l=()=>{const e={completed:0,rejected:0,pending:0,total:0,errors:"",promises:[]};return new class extends s{constructor(){super(),this.queue=[],this.inProgress=!1,this._timer=null,this._stats={...e}}add(e){if(!(e instanceof Promise||Array.isArray(e)&&e.length>0&&e.every(e=>e instanceof Promise))){if(!o(e,"function")){return console.error("---\x3e Invalid promise added to the Queue:",e.toString()),this.emit("fail",e.toString())}e=new Promise(async t=>t(await e()))}r(e).forEach(e=>{this._stats.total++,this._stats.pending++,this.queue.push({promiseFunction:e,response:null,status:"pending",error:null})}),this.inProgress||this._next(),this._setTimer()}clear(){return this._timer&&clearInterval(this._timer),this._timer=null,this.queue=[],this.inProgress=!1,this._stats={...e},this}_setTimer(){this._timer&&clearInterval(this._timer),this._timer=setInterval(()=>{"done"===this.status()&&(clearInterval(this._timer),this._timer=null,this.emit("completed",this._stats),this.emit("done",this._stats))},10)}_next(){if(0===this.queue.length){return void(this.inProgress=!1)}this.inProgress=!0;const{promiseFunction:e}=this.queue[0];e.then(e=>{this.queue[0].status="fulfilled",this.queue[0].response=e,this._stats.completed++}).catch(e=>{this._stats.errors+=e+"\n",this.queue[0].status="rejected",this._stats.rejected++}).finally(()=>{this._stats.promises.push(this.queue[0]),this._stats.pending--,this.queue.shift(),this._next()})}stats(){return this._stats}status(){return 0===this.queue.length?"done":"in-progress"}}},c=(e,t={})=>{const s=e=>null!=e&&("object"==typeof e||"function"==typeof e)&&"function"==typeof e.then;if("function"!=typeof e&&!s(e)){throw new Error("doPoll: The first argument must be a function or Promise.")}const{msg:r,interval:i=200,timeout:n=1e4,timeoutMsg:l=r??null,signal:c}=t,a=Number.isFinite(i)&&i>0?i:200,u=Number.isFinite(n)&&n>0?n:1e4,h=s(e);let p,d,f,m,g=!1,_=!1,y=!1;const b=()=>{g=!0,p&&clearTimeout(p),d&&clearInterval(d),c&&c.removeEventListener?.("abort",x)},v=e=>{y||(y=!0,b(),f(e))},j=e=>{y||(y=!0,b(),m(e))},P=e=>"__TIMEOUT__"===e&&o(l,"string")?(console.info(l),j(l)):j(e),S=e=>{(o(e,"boolean")||e)&&v(e)},x=()=>P(c?.reason??"aborted");return{promise:new Promise((t,r)=>{f=t,m=r;const i=()=>{if(!(g||_||y)){try{const t=h?e:e(v,P);s(t)?(_=!0,t.then(e=>{_=!1,S(e)}).catch(e=>{_=!1,g||P(e)})):S(t)}catch(e){g||P(e)}}};h||(d=setInterval(i,a)),i(),p=setTimeout(()=>{g||P("__TIMEOUT__")},u),c?.aborted?x():c&&c.addEventListener?.("abort",x,{once:!0})}),stop:P}},a=(e=10)=>{let t="not-started";const i={},o=[],l=[];let c=0,a=0,u=0,h=0;return new class extends s{constructor(){super()}clear(){t="done",a=0,u=0,h=0,c=0,o.length=0,l.length=0,Object.keys(i).forEach(e=>{i[e].rejecter&&i[e].rejecter("Promise pool cleared."),delete i[e]})}add(e){e?("not-started"===t&&(t="in-progress"),r(e).forEach(e=>{let t,s=e;if(e instanceof Promise){t=()=>e}else{if("function"!=typeof e){return console.info("---\x3e Invalid promise added to the pool."),o.push(e.toString()),void h++}t=e,e=null}a++;const r=n();i[r]={status:"in-progress",promise:s,promiseFunction:t,response:null,error:null,resolver:null,rejecter:null},l.push(r)}),this._processQueue()):this._updateStatus()}_processQueue(){const t=this;for(;c<e&&l.length>0;){const e=l.shift(),s=i[e];s&&(c++,t._updateStatus(),new Promise((t,r)=>{let n;s.resolver=e=>{"rejected"!==s.status&&(s.status="completed",s.response=e,u++,t(e))},s.rejecter=e=>{s.status="rejected",s.error=e,o.push(e),h++,r(e)};try{n=s.promiseFunction(),n instanceof Promise||(n=Promise.resolve(n))}catch(e){n=Promise.reject(e)}n.then(t=>{i[e]?.resolver(t)}).catch(t=>{i[e]?.rejecter(t)})}).catch(()=>{}).finally(()=>{c--,t._updateStatus(),l.length>0?t._processQueue():0===c&&t._checkCompletion()}))}}_checkCompletion(){if("done"!==t&&0===c&&0===l.length&&(Object.values(i).every(e=>"completed"===e.status||"rejected"===e.status)||0===a)){t="done";const e=this._getStats();this.emit("done",e),a>0&&(this.emit("completed",e),o.length>0&&this.emit("rejected",o,e))}}status(){return t}isDone(){return"done"===t}isEmpty(){return 0===a}results(){return this._getStats()}stats(){return this.results()}_getStats(){return Object.values(i),{completed:u,rejected:h,pending:l.length+c,total:a,errors:o.join("\n"),promises:i}}_updateStatus(){const e=this._getStats();this.emit("stats",e)}}},u={};function h(e,t,s,...r){let i,n;if("string"==typeof e&&"number"==typeof t){i=e,n=t}else if("number"==typeof e&&"function"==typeof t){n=e,s=t}else{if(t||"string"!=typeof e){throw new Error("Invalid parameters")}i=e}const o=i?"_doTimeout_"+i:null;function l(){o&&o in u&&delete u[o]}if(o&&o in u&&(clearTimeout(u[o]),delete u[o]),"function"==typeof s&&"number"==typeof n){return function e(){u[o]=setTimeout(()=>{!0===s(...r)?e():l()},n)}(),!0}i&&void 0===n&&l()}function p(e,...t){return new Promise((s,r)=>{try{Promise.resolve(e(...t)).then(e=>s(e)).catch(e=>r(e))}catch(e){r(e)}})}return t})(),"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("promises",[],t):"object"==typeof exports?exports.promises=t():e.promises=t();