UNPKG

@creejs/commons-retrier

Version:
3 lines (2 loc) 31 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});let t=class t extends Error{static isAggregatedErrorLike(t){return t&&Array.isArray(t.errors)}static isAggregatedError(e){return e instanceof t}constructor(t,e){super(t),this.errors=e??[]}addError(t){this.errors.push(t)}removeError(t){const e=this.errors.indexOf(t);return-1!==e&&(this.errors.splice(e,1),!0)}};var e=function(t,...e){if(null==t)throw new TypeError('"target" Should Not Nil');for(const r of e)if(null!=r)for(const e in r)void 0===t[e]&&(t[e]=r[e]);return t};var r={isArray:function(t){return Array.isArray(t)},isBoolean:function(t){return"boolean"==typeof t},isBuffer:function(t){return null!=t&&Buffer.isBuffer(t)},isFunction:n,isInstance:function(t){return null!=t&&"object"==typeof t&&!c(t)},isIterable:function(t){return null!=t&&"function"==typeof t[Symbol.iterator]},isDate:function(t){return null!=t&&t instanceof Date},isError:function(t){return null!=t&&t instanceof Error},isMap:function(t){return null!=t&&"object"==typeof t&&t.constructor===Map},isWeakMap:function(t){return null!=t&&"object"==typeof t&&t.constructor===WeakMap},isNumber:a,isPositive:i,isNegative:function(t){return!!a(t)&&t<0},isNotNegative:o,isNil:s,isNullOrUndefined:function(t){return null==t},isNull:function(t){return null===t},isUndefined:function(t){return void 0===t},isPlainObject:c,isObject:function(t){return null!=t&&"object"==typeof t},isPromise:l,isRegExp:function(t){return null!=t&&"object"==typeof t&&t.constructor===RegExp},isSet:function(t){return null!=t&&"object"==typeof t&&t.constructor===Set},isWeakSet:function(t){return null!=t&&"object"==typeof t&&t.constructor===WeakSet},isStream:function(t){return null!=t&&"function"==typeof t.pipe},isString:u,isSymbol:function(t){return null!=t&&"symbol"==typeof t},isPrimitive:function(t){return null!==t&&("string"==typeof t||"number"==typeof t||"boolean"==typeof t)},isInt8Array:function(t){return t instanceof Int8Array},isUint8Array:function(t){return t instanceof Uint8Array},isUint8ClampedArray:function(t){return t instanceof Uint8ClampedArray},isInt16Array:function(t){return t instanceof Int16Array},isUint16Array:function(t){return t instanceof Uint16Array},isInt32Array:function(t){return t instanceof Int32Array},isUint32Array:function(t){return t instanceof Uint32Array},isFloat32Array:function(t){return t instanceof Float32Array},isFloat64Array:function(t){return t instanceof Float64Array},isBigInt64Array:function(t){return t instanceof BigInt64Array},isBigUint64Array:function(t){return t instanceof BigUint64Array},isTypedArray:function(t){return ArrayBuffer.isView(t)&&t.constructor!==DataView},isArrayBuffer:function(t){return t instanceof ArrayBuffer}};function n(t){return"function"==typeof t}function s(t){return null==t}function i(t){return!!a(t)&&t>0}function o(t){return!!a(t)&&t>=0}function a(t){return null!=t&&"number"==typeof t}function c(t){return null!==t&&"object"==typeof t&&(t.constructor===Object||void 0===t.constructor)}function l(t){return null!=t&&"function"==typeof t.then}function u(t){return null!=t&&"string"==typeof t}var h={assertNumber:m,assertPositive:function(t,e){if(!i(t))throw new Error(`${e?'"'+e+'" ':""}Not Positive: ${t}`)},assertNotNegative:_,assertFunction:p,assertNotNil:function(t,e){if(s(t))throw new Error((e?'"'+e+'" ':"")+"Should Not Nil")},assertString:function(t,e){if(!u(t))throw new Error(`${e?'"'+e+'" ':""}Not String: type=${typeof t} value=${d(t)}`)}};function f(t,e){if(!Array.isArray(t))throw new Error(`${e?'"'+e+'" ':""}Not Array: type=${typeof t} value=${d(t)}`)}function m(t,e){if(!a(t))throw new Error(`${e?'"'+e+'" ':""}Not Number: type=${typeof t} value=${d(t)}`)}function _(t,e){if(!o(t))throw new Error(`${e?'"'+e+'" ':""}Not "0 or Positive": ${t}`)}function p(t,e){if(!n(t))throw new Error(`${e?'"'+e+'" ':""}Not Function: type=${typeof t} value=${d(t)}`)}function w(t,e){if(!l(t))throw new Error(`${e?'"'+e+'" ':""}Not Promise: type=${typeof t} value=${d(t)}`)}function d(t){if(null===t)return"null";if(void 0===t)return"undefined";const e=typeof t;if("string"===e)return t;if("symbol"===e)return`Symbol(${t.description})`;if("function"===e)return`Function ${t.name}(){}`;if(t instanceof String)return t.toString();if(Number.isNaN(t))return"NaN";if(t===1/0)return"Infinity";if(t===-1/0)return"-Infinity";if(t instanceof Error)return`${t.constructor.name}: ${t.message}`;if(t instanceof Promise)return"Promise";if(t instanceof Set)return`Set: ${d(Array.from(t))}`;if(t instanceof Map)return`Map: ${d(Array.from(t.entries()))}`;if(t instanceof RegExp)return t.toString();if(Array.isArray(t))return`[${t.map(d).join(", ")}]`;let r;try{r=JSON.stringify(t)}catch(e){r=t.toString()}return r}var g={any:function(e){if(f(e),0===e.length)throw new Error("Empty Tasks");const n=y(),s=[];for(let i=0;i<e.length;i++){const o=e[i];let a;if(r.isPromise(o))a=o;else{if(!r.isFunction(o)){s.push(new Error(`Invalid Task at index ${i}/${e.length-1}: ${o}`));continue}a=v(o)}a.then(t=>{n.resolve(t)}).catch(r=>{s.push(r),s.length>=e.length&&n.reject(new t("All Tasks Failed",s))})}return s.length===e.length&&n.reject(new t("All Tasks Failed",s)),n.promise},defer:y,delay:function(t,e){r.isNumber(t)?(e=t,t=Promise.resolve()):null==t&&null==e&&(e=1,t=Promise.resolve()),null!=t&&w(t),m(e=e??1e3);const n=y(),s=Date.now();return t.then((...t)=>{const r=Date.now()-s;r<e?setTimeout(()=>n.resolve(...t),e-r):n.resolve(...t)}).catch(t=>{const r=Date.now()-s;r<e?setTimeout(()=>n.reject(t),e-r):n.reject(t)}),n.promise},timeout:function(t,e,r){w(t),m(e=e??1);const n=y(e,r),s=Date.now();return t.then((...t)=>{Date.now()-s<=e?n.resolve(...t):n.reject(new Error(r??`Promise Timeout: ${e}ms`))}).catch(t=>{!n.resolved&&!n.rejected&&n.reject(t)}),n.promise},allSettled:x,returnValuePromised:v,series:async function(t){f(t);const e=[];for(const n of t)if(p(n),r.isFunction(n))e.push(await v(n));else{if(!r.isPromise(n))throw new Error(`Invalid Task: ${n}`);e.push(await n)}return e},seriesAllSettled:async function(t){f(t);const e=[];for(const r of t){p(r);try{e.push({ok:!0,result:await r()})}catch(t){e.push({ok:!1,result:t})}}return e},parallel:async function(t,e=5){if(f(t),m(e),e<=0)throw new Error(`Invalid maxParallel: ${e}, should > 0`);t.forEach(t=>p(t));const r=[];if(t.length<=e){const e=await Promise.all(t.map(t=>v(t)));return r.push(...e),r}const n=[];for(const s of t)if(p(s),n.push(s),n.length>=e){const t=await Promise.all(n.map(t=>v(t)));r.push(...t),n.length=0}if(n.length>0&&n.length<e){const t=await Promise.all(n.map(t=>v(t)));r.push(...t)}return r},parallelAny:async function(e,n=5,s){if(f(e,"tasks"),m(n),0===e.length)throw new Error("Empty Tasks");if(n<=0)throw new Error(`Invalid maxParallel: ${n}, should > 0`);const i=[];let o=0,a=0;const c=y();function l(){if(o>=e.length)return;if(a>n)return;const u=e[o++];let h;a++,h=r.isPromise(u)?u:r.isFunction(u)?v(u):Promise.reject(new TypeError(`Invalid task: ${typeof u}, Only Promise or Function allowed`)),h.then(t=>{a--,c.resolve(t)}).catch(r=>{i.push(r),i.length>=e.length&&c.pending?c.reject(new t(s??"All Tasks Failed",i)):(a--,l())})}const u=Math.min(e.length,n);for(let t=0;t<u;t++)l();return c.promise},parallelAllSettled:async function(t,e=5){if(f(t),m(e),e<=0)throw new Error(`Invalid maxParallel: ${e}, should > 0`);t.forEach(t=>p(t));const r=[];if(t.length<=e){const e=await x(t.map(t=>v(t)));return r.push(...e),r}const n=[];for(const s of t)if(n.push(s),n.length>=e){const t=await x(n.map(t=>v(t)));r.push(...t),n.length=0}if(n.length>0&&n.length<e){const t=await x(n.map(t=>v(t)));r.push(...t)}return r},wait:function(t){_(t);const e={};let r;return e.timerHandler=r=setTimeout(()=>{clearTimeout(r),e._resolve()},t),e.promise=new Promise((t,n)=>{e._resolve=e=>{null!=r&&clearTimeout(r),t(e)}}),e.wakeup=()=>{e._resolve()},e}};function y(t=-1,e){m(t);const r={};let n;return r.pending=!0,r.canceled=!1,r.rejected=!1,r.resolved=!1,t>=0&&(r.timerCleared=!1,r.timerHandler=n=setTimeout(()=>{clearTimeout(n),r.timerCleared=!0,r.reject(new Error(e??`Promise Timeout: ${t}ms`))},t)),r.promise=new Promise((t,e)=>{r.resolve=e=>{r.resolved||r.rejected||r.canceled||(null!=n&&(clearTimeout(n),r.timerCleared=!0),r.pending=!1,r.canceled=!1,r.rejected=!1,r.resolved=!0,t(e))},r.reject=t=>{r.resolved||r.rejected||r.canceled||(null!=n&&(clearTimeout(n),r.timerCleared=!0),r.pending=!1,r.canceled=!1,r.resolved=!1,r.rejected=!0,e(t))}}),r.cancel=r.promise.cancel=t=>{r.resolved||r.rejected||r.canceled||(null!=n&&(clearTimeout(n),r.timerCleared=!0),r.reject(t??new Error("Cancelled")),r.canceled=r.promise.canceled=!0)},r}async function x(t){f(t);const e=await Promise.allSettled(t),r=[];for(const t of e)"fulfilled"===t.status&&r.push({ok:!0,result:t.value}),"rejected"===t.status&&r.push({ok:!1,result:t.reason});return r}function v(t){try{const e=t();return r.isPromise(e)?e:Promise.resolve(e)}catch(t){return Promise.reject(t)}}new TextDecoder,new TextEncoder;const{assertPositive:k,assertNotNegative:b}=h,{isNumber:E}=r;class L{constructor(){this._min=50,this._max=3e4,this._nextInterval=this._min,this._jitter=0}get jitter(){return this._jitter}set jitter(t){b(t,"jitter"),this._jitter=t}copyPolicySettingTo(t){t.range(this._min,this._max),t._nextInterval=this._nextInterval}range(t,e){if(k(t,"min"),k(e,"max"),t>=e)throw new Error("min must < max");return this._min=t,this._nextInterval<this._min&&(this._nextInterval=this._min),this._max=e,this._nextInterval>this._max&&(this._nextInterval=this._max),this}min(t){if(k(t,"min"),t>=this._max)throw new Error("min must < max");return this._min=t,this._nextInterval<this._min&&(this._nextInterval=this._min),this}max(t){if(k(t,"max"),t<=this._min)throw new Error("max must > min");return this._max=t,this._nextInterval>this._max&&(this._nextInterval=this._max),this}reset(){return this._nextInterval=this._min,this}generate(t){const e=this._nextInterval;return this._increase(t),e}_increase(t){const e=this._next(t);if(!E(e))throw new Error("Generated Next Interval Not Number");const r=this._jitter<=0?e:e+Math.floor(Math.random()*this._jitter);return r<this._min?this._nextInterval=this._min:r>this._max?this._nextInterval=this._max:this._nextInterval=r}_next(t){throw new Error("Not Impled Yet")}}var N={isFunction:T,isNil:S};function T(t){return"function"==typeof t}function S(t){return null==t}function I(t){return null!=t&&"string"==typeof t}var F={assertNumber:function(t,e){if(!function(t){return null!=t&&"number"==typeof t}(t))throw new Error(`${e?'"'+e+'" ':""}Not Number: type=${typeof t} value=${R(t)}`)},assertFunction:function(t,e){if(!T(t))throw new Error(`${e?'"'+e+'" ':""}Not Function: type=${typeof t} value=${R(t)}`)},assertNotNil:function(t,e){if(S(t))throw new Error((e?'"'+e+'" ':"")+"Should Not Nil")},assertString:function(t,e){if(!I(t))throw new Error(`${e?'"'+e+'" ':""}Not String: type=${typeof t} value=${R(t)}`)},assertStringOrSymbol:function(t,e){if(!I(t)&&!function(t){return null!=t&&"symbol"==typeof t}(t))throw new Error(`${e?'"'+e+'" ':""}Not String or Symbol: type=${typeof t} value=${R(t)}`)}};function R(t){if(null===t)return"null";if(void 0===t)return"undefined";const e=typeof t;if("string"===e)return t;if("symbol"===e)return`Symbol(${t.description})`;if("function"===e)return`Function ${t.name}(){}`;if(t instanceof String)return t.toString();if(Number.isNaN(t))return"NaN";if(t===1/0)return"Infinity";if(t===-1/0)return"-Infinity";if(t instanceof Error)return`${t.constructor.name}: ${t.message}`;if(t instanceof Promise)return"Promise";if(t instanceof Set)return`Set: ${R(Array.from(t))}`;if(t instanceof Map)return`Map: ${R(Array.from(t.entries()))}`;if(t instanceof RegExp)return t.toString();if(Array.isArray(t))return`[${t.map(R).join(", ")}]`;let r;try{r=JSON.stringify(t)}catch(e){r=t.toString()}return r}new TextDecoder,new TextEncoder;const $="DOwner$#$",{assertFunction:A,assertNotNil:P}=F;class j{constructor(t,e,r=!1){P(t,"event"),A(e,"callback"),this._event=t,this._callback=e,this._isOnce=!!r,this._owner=void 0}set owner(t){this._owner=t}get owner(){return this._owner===$?void 0:this._owner}get event(){return this._event}get isOnce(){return this._isOnce}isSameCallback(t){return this._callback===t}get callback(){return this._callback}invoke(...t){try{return this._callback(...t)}finally{if(this._isOnce)try{this._event._remove(this)}catch(t){console.warn(t)}}}listener(...t){return this.invoke(...t)}}const{isFunction:O,isNil:C}=N,{assertStringOrSymbol:M,assertFunction:B}=F;class D{static get DefaultOwner(){return $}constructor(t){M(t,"eventName"),this._name=t,this._callbacks=new Set,this._listeners=[],this._callback2Listeners=new Map,this._listener2Owner=new Map,this._owner2Listeners=new Map}get name(){return this._name}isEmpty(){return 0===this._callbacks.size}rawListeners(){return[...this._listeners]}listenerCount(t){return null==t?this._listeners.length:this._callback2Listeners.get(t)?.size??0}callbacks(){return[...this.rawListeners().map(t=>t.callback)]}emit(...t){if(0===this._listeners.length)return!1;for(const e of[...this._listeners])e.invoke(...t);return!0}emitOwner(t,...e){if(0===this._listeners.length)return!1;const r=this._owner2Listeners.get(t);if(null==r)return!1;for(const t of[...r])t.invoke(...e);return!0}hasListener(t){return!!O(t)&&this._callbacks.has(t)}hasOwner(t){return!C(t)&&this._owner2Listeners.has(t)}addListener(t,e){return this._addListener(t,e,!1,!1)}prependListener(t,e){return this._addListener(t,e,!1,!0)}addOnceListener(t,e){return this._addListener(t,e,!0,!1)}prependOnceListener(t,e){return this._addListener(t,e,!0,!0)}_addListener(t,e,r,n){if(C(t))return!1;B(t),this._callbacks.has(t)||this._callbacks.add(t),e=e??$;const s=new j(this,t,r);s.owner=e,n?this._listeners.unshift(s):this._listeners.push(s),this._listener2Owner.set(s,e);let i=this._callback2Listeners.get(t);null==i&&(i=new Set,this._callback2Listeners.set(t,i)),i.add(s);let o=this._owner2Listeners.get(e);return null==o&&(o=new Set,this._owner2Listeners.set(e,o)),o.add(s),!0}removeListener(t){if(C(t))return!1;if(!this._callbacks.has(t))return!1;this._callbacks.delete(t);const e=this._callback2Listeners.get(t);if(null==e)return!1;this._callback2Listeners.delete(t);for(const t of e){-1!==this._listeners.indexOf(t)&&this._listeners.splice(this._listeners.indexOf(t),1);const e=this._listener2Owner.get(t);if(null==e)continue;this._listener2Owner.delete(t);const r=this._owner2Listeners.get(e);null!=r&&(r.delete(t),0===r.size&&this._owner2Listeners.delete(e))}return!0}_remove(t){const e=this._listeners.indexOf(t);-1!==e&&this._listeners.splice(e,1);const{callback:r}=t,n=this._callback2Listeners.get(r);null!=n&&(n.delete(t),0===n.size&&(this._callback2Listeners.delete(r),this._callbacks.delete(r)));const s=this._listener2Owner.get(t);if(null==s)return;this._listener2Owner.delete(t);const i=this._owner2Listeners.get(s);null!=i&&(i.delete(t),0===i.size&&this._owner2Listeners.delete(s))}removeAllListeners(t){if(C(t))return this._callbacks.clear(),this._listeners.length=0,this._callback2Listeners.clear(),this._listener2Owner.clear(),this._owner2Listeners.clear(),this;const e=this._owner2Listeners.get(t);if(null==e)return this;this._owner2Listeners.delete(t);for(const t of e){-1!==this._listeners.indexOf(t)&&this._listeners.splice(this._listeners.indexOf(t),1),this._listener2Owner.delete(t);const{callback:e}=t,r=this._callback2Listeners.get(e);null!=r&&(r.delete(t),0===r.size&&(this._callback2Listeners.delete(e),this._callbacks.delete(e)))}return this}}const{isNil:U}=N,{assertString:W,assertFunction:z,assertNumber:H,assertStringOrSymbol:V,assertNotNil:J}=F,G=["on","once","addListener","prependListener","prependOnceListener","off","offAll","offOwner","removeAllListeners","removeListener","emit","emitOwner","setMaxListeners","getMaxListeners","hasOwner","listeners","listenerCount","eventNames","rawListeners"];let Y=10;class q{static mixin(t){const e=new q;t.__emitter=e;for(const r of G){const n=e[r];t[r]=n.bind(e)}return t}static get defaultMaxListeners(){return Y}static set defaultMaxListeners(t){H(t),Y=t??10}constructor(){this._name2Event=new Map,this._maxListeners=Y}clean(){this._name2Event.clear()}addListener(t,e,r){return this.on(t,e,r)}prependListener(t,e,r){return W(t),z(e),this._checkMaxListeners(t),this._getOrCreateEvent(t).prependListener(e,r),this}prependOnceListener(t,e,r){return W(t),z(e),this._checkMaxListeners(t),this._getOrCreateEvent(t).prependOnceListener(e,r),this}emit(t,...e){const r=this._name2Event.get(t);return null!=r&&!r.isEmpty()&&(r.emit(...e),!0)}emitOwner(t,e,...r){if(null==e)throw new Error('Missing "owner"');const n=this._name2Event.get(t);return null!=n&&!n.isEmpty()&&(n.emitOwner(e,...r),!0)}eventNames(){return[...this._name2Event.keys()]}getMaxListeners(){return this._maxListeners}listenerCount(t,e){V(t,"eventName");const r=this._name2Event.get(t);return null==r||r.isEmpty()?0:r.listenerCount(e)}listeners(t){V(t,"eventName");const e=this._name2Event.get(t);return null==e||e.isEmpty()?[]:e.callbacks()}off(t,e){const r=this._name2Event.get(t);return null==r?this:(r.removeListener(e),r.isEmpty()?(this._name2Event.delete(t),this):this)}offAll(t,e){V(t,"eventName");const r=this._name2Event.get(t);return null==r?this:(r.removeAllListeners(e),r.isEmpty()?(this._name2Event.delete(t),this):this)}offOwner(t){J(t,"owner");const e=[...this._name2Event.values()];for(const r of e)r.removeAllListeners(t),r.isEmpty()&&this._name2Event.delete(r.name);return this}on(t,e,r){return W(t),z(e),this._checkMaxListeners(t),this._getOrCreateEvent(t).addListener(e,r),this}_checkMaxListeners(t){let e=0;0!==this._maxListeners&&this._maxListeners!==1/0&&(e=this.listenerCount(t))>=this._maxListeners&&console.warn(`maxlistenersexceededwarning: Possible EventEmitter memory leak detected. ${e} ${t} listeners added to [${this}]. Use emitter.setMaxListeners() to increase limit`)}once(t,e,r){return W(t),z(e),this._getOrCreateEvent(t).addOnceListener(e,r),this}rawListeners(t){return this._name2Event.get(t)?.rawListeners()||[]}removeAllListeners(t,e){return this.offAll(t,e)}removeListener(t,e){return this.off(t,e)}setMaxListeners(t){if(H(t),t<0)throw new RangeError("maxListeners must >=0");return this._maxListeners=t,this}_getOrCreateEvent(t){if(this._name2Event.has(t))return this._name2Event.get(t);const e=new D(t);return this._name2Event.set(t,e),e}hasOwner(t){if(U(t))return!1;for(const e of this._name2Event.values())if(e.hasOwner(t))return!0;return!1}}var K={Start:"start",Retry:"retry",Success:"success",Failure:"failure",Timeout:"timeout",TaskTimeout:"task-timeout",Stop:"stop",Completed:"complete",MaxRetries:"max-retries"};const{assertPositive:Q}=h;class X extends L{constructor(t){super(),this.interval=t}set interval(t){Q(t,"interval"),this._interval=t,this._nextInterval=t,this._min=t,this._max=t}get interval(){return this._interval}_next(t){return this.interval}}const{assertPositive:Z}=h;class tt extends L{constructor(t){super(),Z(t,"increasement"),this._increasement=t}set increasement(t){Z(t,"increasement"),this._increasement=t}get increasement(){return this._increasement}_next(t){return this._nextInterval>=this._max?this._max:this._nextInterval+this.increasement}}const{assertPositive:et}=h;class rt extends L{constructor(t){if(super(),et(t,"factor"),t<1)throw new Error("factor must be >= 1");this._factor=t}set factor(t){if(et(t,"factor"),t<1)throw new Error("factor must be >= 1");this._factor=t}get factor(){return this._factor}_next(t){return this._nextInterval>=this._max?this._max:this._nextInterval*this.factor}}const{assertPositive:nt}=h;class st extends L{constructor(t){super(),nt(t,"stepLength"),this._stepLength=t,this.increasement=t}set stepLength(t){nt(t,"stepLength"),this._stepLength=t,this.increasement=t}get stepLength(){return this._stepLength}_next(t){const e=this._nextInterval+this.increasement;return e>=this._max?(this.increasement=-this.stepLength,this._max):e<=this._min?(this.increasement=this.stepLength,this._min):e}}const{assertNotNegative:it}=h;class ot extends X{constructor(t,e=500){super(t),it(e,"jitter"),this._jitter=e??500}}const{assertNotNegative:at}=h;class ct extends rt{constructor(t=500){super(2),at(t,"jitter"),this._jitter=t??500}}const{assertNotNegative:lt}=h;class ut extends tt{constructor(t,e=500){super(t),lt(e,"jitter"),this._jitter=e??500}}const{assertNotNil:ht,assertFunction:ft}=h;class mt{constructor(t,e){ht(t,"retrier"),ft(e,"task"),this.retrier=t,this.task=e,this.result=void 0,this.error=void 0}get failed(){return null!=this.error}get succeeded(){return null==this.error}async execute(t,e,r){try{this.result=await this.task(t,e,r),this.error=void 0}catch(t){this.error=t instanceof Error?t:new Error(String(t))}}dispose(){this.retrier=void 0}}class _t extends mt{static isAlwaysTask(t){return t instanceof _t}constructor(t,e,r){super(t,e),this.resetPolicy=r}async execute(t,e,r){await super.execute(t,e,r),this.succeeded&&this.resetPolicy&&this.retrier.resetRetryPolicy()}}class pt extends mt{static isForeverTask(t){return t instanceof pt}constructor(t,e,r){super(t,e),this.resetPolicy=r}async execute(t,e,r){await super.execute(t,e,r),this.succeeded&&this.resetPolicy&&this.retrier.resetRetryPolicy()}}const{assertPositive:wt,assertString:dt,assertFunction:gt,assertNumber:yt}=h,{isNil:xt}=r,vt="!#@%$&^*";class kt{static naming(t){const e=new kt;return e.name(t),e}static infinite(){const t=new kt;return t.infinite(),t}static times(t){const e=new kt;return e.times(t),e}static maxRetries(t){const e=new kt;return e.maxRetries(t),e}static min(t){const e=new kt;return e.min(t),e}static max(t){const e=new kt;return e.max(t),e}static range(t,e){const r=new kt;return r.range(t,e),r}static fixedInterval(t){const e=new kt;return e.fixedInterval(t),e}static fixedBackoff(t,e=500){const r=new kt;return r.fixedBackoff(t,e),r}static fixedIncrease(t){const e=new kt;return e.fixedIncrease(t),e}static linearBackoff(t,e=500){const r=new kt;return r.linearBackoff(t,e),r}static factorIncrease(t){const e=new kt;return e.factorIncrease(t),e}static exponentialBackoff(t=500){const e=new kt;return e.exponentialBackoff(t),e}static shuttleInterval(t){const e=new kt;return e.shuttleInterval(t),e}static timeout(t){const e=new kt;return e.timeout(t),e}static taskTimeout(t){const e=new kt;return e.taskTimeout(t),e}static start(t){const e=new kt;return e.task(t),e.start()}constructor(t){q.mixin(this),this._policy=new X(t??1e3),this._maxRetries=3,this._currentRetries=1,this._timeout=12e4,this._taskTimeout=2e3,this._name="unamed",this._taskingFlag=void 0,this._breakFlag=void 0,this._breakReason=void 0}get running(){return!xt(this._taskingFlag)}name(t){return dt(t,"name"),this._assertChangeable(t),this._name=t,this}infinite(){return this._assertChangeable("infinite"),this._maxRetries=1/0,this}times(t){return this._assertChangeable("times"),this.maxRetries(t)}maxRetries(t){return wt(t,"maxRetries"),this._assertChangeable("maxRetries"),this._maxRetries=t,this}min(t){return this._assertChangeable("min"),this._policy.min(t),this}max(t){return this._assertChangeable("max"),this._policy.max(t),this}range(t,e){return this._assertChangeable("range"),this._policy.range(t,e),this}fixedInterval(t){this._assertChangeable("fixedInterval");const e=this._policy;if(e instanceof X)return e.interval=t,this;const r=new X(t);return e?.copyPolicySettingTo(r),r.reset(),this._policy=r,this}fixedBackoff(t,e=500){this._assertChangeable("fixedBackoff");const r=this._policy;if(r instanceof X)return r.interval=t,r.jitter=e,this;const n=new ot(t,e);return r?.copyPolicySettingTo(n),n.reset(),this._policy=n,this}fixedIncrease(t){this._assertChangeable("fixedIncrease");const e=this._policy;if(e instanceof tt)return e.increasement=t,this;const r=new tt(t);return e?.copyPolicySettingTo(r),r.reset(),this._policy=r,this}linearBackoff(t,e=500){this._assertChangeable("linearBackoff");const r=this._policy;if(r instanceof ut)return r.increasement=t,r.jitter=e,this;const n=new ut(t,e);return r?.copyPolicySettingTo(n),n.reset(),this._policy=n,this}factorIncrease(t){this._assertChangeable("factorIncrease");const e=this._policy;if(e instanceof rt)return e.factor=t,this;const r=new rt(t);return e?.copyPolicySettingTo(r),r.reset(),this._policy=r,this}exponentialBackoff(t=500){this._assertChangeable("exponentialBackoff");const e=this._policy;if(e instanceof ct)return e.jitter=t,this;const r=new ct(t);return e?.copyPolicySettingTo(r),r.reset(),this._policy=r,this}shuttleInterval(t){this._assertChangeable("shuttleInterval");const e=this._policy;if(e instanceof st)return e.stepLength=t,this;const r=new st(t);return e?.copyPolicySettingTo(r),r.reset(),this._policy=r,this}taskTimeout(t){return wt(t,"taskTimeout"),this._assertChangeable("taskTimeout"),this._taskTimeout=t,this}timeout(t){return yt(t,"timeout"),this._assertChangeable("timeout"),this._timeout=t,this}noTimeout(){return this._assertChangeable("noTimeout"),this._timeout=0,this}task(t){return gt(t,"task"),this._assertChangeable("task"),this._task=new mt(this,t),this}retry(t){return this._assertChangeable("retry"),this.task(t),this}always(t,e=!0){return this._assertChangeable("always"),this._task=new _t(this,t,e),this}forever(t,e=!0){return this._assertChangeable("forever"),this.noTimeout(),this.infinite(),this._task=new pt(this,t,e),this}async start(){if(null==this._task)throw new Error("No Task to Retry");return null!=this._taskingFlag||(this._taskingFlag=g.defer(),pt.isForeverTask(this._task)?(this._executeForeverTask(this._task),this._taskingFlag.resolve()):this._executeEndableTask(this._task)),this._taskingFlag.promise}wakeup(){this.running?null!=this._sleepWaiter&&this._sleepWaiter.wakeup():this.start()}async stop(t){if(this.emit(K.Stop,t),null!=this._taskingFlag)return null!=this._breakFlag||(null!=this._sleepWaiter&&this._sleepWaiter.wakeup(),this._breakFlag=g.defer(),this._breakReason=t??new Error("Manually Stop"),this.once(K.Completed,()=>{this._breakFlag?.resolve()}),this._breakFlag.promise.finally(()=>{this._breakFlag=void 0,this._breakReason=void 0,this._taskingFlag=void 0})),this._breakFlag.promise}resetRetryPolicy(){this._policy.reset()}onRetry(t){return this.on(K.Retry,t),this}onError(t){return this.on(K.Error,t),this}onFailure(t){return this.on(K.Failure,t),this}onSuccess(t){return this.on(K.Success,t),this}onStart(t){return this.on(K.Start,t),this}onStop(t){return this.on(K.Stop,t),this}onTimeout(t){return this.on(K.Timeout,t),this}onTaskTimeout(t){return this.on(K.TaskTimeout,t),this}onCompleted(t){return this.on(K.Completed,t),this}onMaxRetries(t){return this.on(K.MaxRetries,t),this}async _executeForeverTask(t){if(null==this._taskingFlag)throw new Error("Must be called in start()");const e=Date.now();this.emit(K.Start,e);let r=null;for(;;){if(null!=this._breakFlag){const t=Date.now()-e;this.emit(K.Completed,this._currentRetries,t);break}r=Date.now()-e,this.emit(K.Retry,this._currentRetries,r);const n=this._policy.generate(this._currentRetries);try{try{await g.timeout(t.execute(this._currentRetries,r,n),this._taskTimeout,vt)}catch(t){throw t.message===vt&&this.emit(K.TaskTimeout,this._currentRetries,r,this._taskTimeout),t}if(t.failed)throw t.error;const e=t.result;this.emit(K.Success,e,this._currentRetries,r)}catch(t){this.emit(K.Failure,t,this._currentRetries,r)}++this._currentRetries,this._sleepWaiter=g.wait(n),await this._sleepWaiter.promise}}async _executeEndableTask(t){if(null==this._taskingFlag)throw new Error("Must be called in start()");const e=Date.now();let r;this.emit(K.Start,e);let n=null;for(;;){if(null!=this._breakFlag){this._taskingFlag.reject(this._breakReason??new Error("Have Been Broken"));break}if(n=Date.now()-e,!bt(this._timeout)&&n>=this._timeout){if(this.emit(K.Timeout,this._currentRetries,n,this._timeout),_t.isAlwaysTask(this._task)){this._taskingFlag.resolve();break}this._taskingFlag.reject(r??new Error(`Timeout "${this._timeout}" Exceeded`));break}this.emit(K.Retry,this._currentRetries,n);const s=this._policy.generate(this._currentRetries);try{try{await g.timeout(t.execute(this._currentRetries,n,s),this._taskTimeout,vt)}catch(t){throw t.message===vt&&this.emit(K.TaskTimeout,this._currentRetries,n,this._taskTimeout),t}if(t.failed)throw r=t.error,t.error;const e=t.result;if(this.emit(K.Success,e,this._currentRetries,n),!_t.isAlwaysTask(t)){this._taskingFlag.resolve(e);break}}catch(t){this.emit(K.Failure,t,this._currentRetries,n)}const i=++this._currentRetries;if(this._currentRetries>this._maxRetries){if(this.emit(K.MaxRetries,i,this._maxRetries),_t.isAlwaysTask(t)){this._taskingFlag.resolve();break}this._taskingFlag.reject(r??new Error(`Max Retries Exceeded, Retring ${this._currentRetries} times > max ${this._maxRetries}`));break}this._sleepWaiter=g.wait(s),await this._sleepWaiter.promise}if(this._taskingFlag.promise.finally(()=>{this.resetRetryPolicy(),this._taskingFlag=void 0;const t=Date.now()-e;this.emit(K.Completed,this._currentRetries,t)}),!_t.isAlwaysTask(this._task))return this._taskingFlag.promise}_assertChangeable(t){if(null!=this._taskingFlag)throw new Error(`No Change "${t}" After Retrier Started`)}}function bt(t){return t<=0||t===1/0}function Et(t){const e=new kt;return e.name(t),e}function Lt(){const t=new kt;return t.infinite(),t}function Nt(t){const e=new kt;return e.times(t),e}function Tt(t){const e=new kt;return e.maxRetries(t),e}function St(t){const e=new kt;return e.min(t),e}function It(t){const e=new kt;return e.max(t),e}function Ft(t,e){const r=new kt;return r.range(t,e),r}function Rt(t){const e=new kt;return e.fixedInterval(t),e}function $t(t,e=500){const r=new kt;return r.fixedBackoff(t,e),r}function At(t){const e=new kt;return e.fixedIncrease(t),e}function Pt(t,e=500){const r=new kt;return r.linearBackoff(t,e),r}function jt(t){const e=new kt;return e.factorIncrease(t),e}function Ot(t=500){const e=new kt;return e.exponentialBackoff(t),e}function Ct(t){const e=new kt;return e.shuttleInterval(t),e}function Mt(t){const e=new kt;return e.timeout(t),e}function Bt(t){const e=new kt;return e.taskTimeout(t),e}function Dt(t){const e=new kt;return e.task(t),e.start()}var Ut={retry:function(t){const e=new kt;return e.retry(t),e},always:function(t){const e=new kt;return e.always(t),e},forever:function(t){const e=new kt;return e.forever(t),e},name:Et,infinite:Lt,times:Nt,maxRetries:Tt,min:St,max:It,range:Ft,fixedInterval:Rt,fixedBackoff:$t,fixedIncrease:At,linearBackoff:Pt,factorIncrease:jt,exponentialBackoff:Ot,shuttleInterval:Ct,timeout:Mt,taskTimeout:Bt,start:Dt};e(kt,Ut);var Wt={Policy:L,Retrier:kt,Event:K,RetrierFactory:Ut,...Ut};exports.Event=K,exports.Policy=L,exports.Retrier=kt,exports.RetrierFactory=Ut,exports.default=Wt,exports.exponentialBackoff=Ot,exports.factorIncrease=jt,exports.fixedBackoff=$t,exports.fixedIncrease=At,exports.fixedInterval=Rt,exports.infinite=Lt,exports.linearBackoff=Pt,exports.max=It,exports.maxRetries=Tt,exports.min=St,exports.name=Et,exports.range=Ft,exports.shuttleInterval=Ct,exports.start=Dt,exports.taskTimeout=Bt,exports.timeout=Mt,exports.times=Nt; //# sourceMappingURL=index-min.cjs.map