@creejs/commons-collection
Version:
Commons Collection
3 lines (2 loc) • 18.9 kB
JavaScript
"use strict";function e(e){return null==e}function t(e){return null===e}function r(e){return null!=e&&"number"==typeof e}function n(e){return null!==e&&"object"==typeof e&&(e.constructor===Object||void 0===e.constructor)}function s(e){return null!=e&&"string"==typeof e}function i(e){return null!=e&&"symbol"==typeof e}Object.defineProperty(exports,"__esModule",{value:!0});var o={assertNumber:function(e,t){if(!r(e))throw new Error(`${t?'"'+t+'" ':""}Not Number: type=${typeof e} value=${a(e)}`)},assertPositive:function(e,t){if(!function(e){return!!r(e)&&e>0}(e))throw new Error(`${t?'"'+t+'" ':""}Not Positive: ${e}`)},assertNegative:function(e,t){if(!function(e){return!!r(e)&&e<0}(e))throw new Error(`${t?'"'+t+'" ':""}Not Negative: ${e}`)},assertNotNegative:function(e,t){if(!function(e){return!!r(e)&&e>=0}(e))throw new Error(`${t?'"'+t+'" ':""}Not "0 or Positive": ${e}`)},assertBoolean:function(e,t){if(!function(e){return"boolean"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Boolean: type=${typeof e} value=${a(e)}`)},assertObject:function(e,t){if(!function(e){return null!=e&&"object"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Object: type=${typeof e} value=${a(e)}`)},assertPlainObject:function(e,t){if(!n(e))throw new Error(`${t?'"'+t+'" ':""}Not PlainObject: type=${typeof e} value=${a(e)}`)},assertSymbol:function(e,t){if(!i(e))throw new Error(`${t?'"'+t+'" ':""}Not Symbol: type=${typeof e} value=${a(e)}`)},assertFunction:function(e,t){if(!function(e){return"function"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Function: type=${typeof e} value=${a(e)}`)},assertInstance:function(e,t){if(!function(e){return null!=e&&"object"==typeof e&&!n(e)}(e))throw new Error(`${t?'"'+t+'" ':""}Not Class Instance: type=${typeof e} value=${a(e)}`)},assertPromise:function(e,t){if(!function(e){return null!=e&&"function"==typeof e.then}(e))throw new Error(`${t?'"'+t+'" ':""}Not Promise: type=${typeof e} value=${a(e)}`)},assertNil:function(t,r){if(!e(t))throw new Error(`${r?'"'+r+'" ':""}Neither Null nor Undefined: type=${typeof t} value=${a(t)}`)},assertNotNil:function(t,r){if(e(t))throw new Error((r?'"'+r+'" ':"")+"Should Not Nil")},assertNull:function(e,r){if(!t(e))throw new Error(`${r?'"'+r+'" ':""}Not Null: type=${typeof e} value=${a(e)}`)},assertNotNull:function(e,r){if(t(e))throw new Error((r?'"'+r+'" ':"")+"Should Not Null")},assertUndefined:function(e,t){if(!function(e){return void 0===e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Undefined: type=${typeof e} value=${a(e)}`)},assertString:function(e,t){if(!s(e))throw new Error(`${t?'"'+t+'" ':""}Not String: type=${typeof e} value=${a(e)}`)},assertArray:function(e,t){if(!Array.isArray(e))throw new Error(`${t?'"'+t+'" ':""}Not Array: type=${typeof e} value=${a(e)}`)},assertStringOrSymbol:function(e,t){if(!s(e)&&!i(e))throw new Error(`${t?'"'+t+'" ':""}Not String or Symbol: type=${typeof e} value=${a(e)}`)},assertInt8Array:function(e,t){if(function(e){return e instanceof Int8Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Int8Array")},assertUint8Array:function(e,t){if(function(e){return e instanceof Uint8Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint8Array")},assertUint8ClampedArray:function(e,t){if(function(e){return e instanceof Uint8ClampedArray}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint8ClampedArray")},assertInt16Array:function(e,t){if(function(e){return e instanceof Int16Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Int16Array")},assertUint16Array:function(e,t){if(function(e){return e instanceof Uint16Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint16Array")},assertInt32Array:function(e,t){if(function(e){return e instanceof Int32Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Int32Array")},assertUint32Array:function(e,t){if(function(e){return e instanceof Uint32Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Uint32Array")},assertFloat32Array:function(e,t){if(function(e){return e instanceof Float32Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Float32Array")},assertFloat64Array:function(e,t){if(function(e){return e instanceof Float64Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not Float64Array")},assertBigInt64Array:function(e,t){if(function(e){return e instanceof BigInt64Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not BigInt64Array")},assertBigUint64Array:function(e,t){if(function(e){return e instanceof BigUint64Array}(e))throw new Error((t?'"'+t+'" ':"")+"Not BigUint64Array")},assertTypedArray:function(e,t){if(function(e){return ArrayBuffer.isView(e)&&e.constructor!==DataView}(e))throw new Error((t?'"'+t+'" ':"")+"Not TypedArray")},assertArrayBuffer:function(e,t){if(!function(e){return e instanceof ArrayBuffer}(e))throw new Error((t?'"'+t+'" ':"")+"Not ArrayBuffer")}};function a(e){if(null===e)return"null";if(void 0===e)return"undefined";let t;try{t=JSON.stringify(e)}catch(r){t=e.toString()}return t}new TextDecoder,new TextEncoder;const l=1e6;var h=function(){if("undefined"!=typeof performance&&"number"==typeof performance.timeOrigin){const e=performance.timeOrigin,t=performance.now();return Math.ceil((e+t)/l)}return Date.now()};const{assertPositive:c}=o;class u{constructor(e){c(e,"capacity"),this.capacity=e,this._map=new Map,this._head=void 0,this._tail=void 0}get size(){return this._map.size}get oldest(){return this._head?.value}get newest(){return this._tail?.value}[Symbol.iterator](){return this._map.keys()}add(e){if(this._map.has(e)){const t=this._map.get(e);t&&this._removeNode(t)}else this.size>=this.capacity&&this._removeOldest();this._addNew(e)}has(e){return this._map.has(e)}delete(e){if(this._map.has(e)){const t=this._map.get(e);return t&&this._removeNode(t),!0}return!1}clear(){this._map.clear(),this._head=void 0,this._tail=void 0}values(){return this._map.keys()}_addNew(e){const t={value:e,prev:this._tail,next:void 0};this._tail?this._tail.next=t:this._head=t,this._tail=t,this._map.set(e,t)}_removeNode(e){e.prev?e.prev.next=e.next:this._head=e.next,e.next?e.next.prev=e.prev:this._tail=e.prev,this._map.delete(e.value)}_removeOldest(){this._head&&this._removeNode(this._head)}}var f={isFunction:_,isNil:d};function _(e){return"function"==typeof e}function d(e){return null==e}function m(e){return null!=e&&"string"==typeof e}var p={assertNumber:function(e,t){if(!function(e){return null!=e&&"number"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not Number: type=${typeof e} value=${w(e)}`)},assertFunction:function(e,t){if(!_(e))throw new Error(`${t?'"'+t+'" ':""}Not Function: type=${typeof e} value=${w(e)}`)},assertNotNil:function(e,t){if(d(e))throw new Error((t?'"'+t+'" ':"")+"Should Not Nil")},assertString:function(e,t){if(!m(e))throw new Error(`${t?'"'+t+'" ':""}Not String: type=${typeof e} value=${w(e)}`)},assertStringOrSymbol:function(e,t){if(!m(e)&&!function(e){return null!=e&&"symbol"==typeof e}(e))throw new Error(`${t?'"'+t+'" ':""}Not String or Symbol: type=${typeof e} value=${w(e)}`)}};function w(e){if(null===e)return"null";if(void 0===e)return"undefined";let t;try{t=JSON.stringify(e)}catch(r){t=e.toString()}return t}new TextDecoder,new TextEncoder;const v="DOwner$#$",{assertFunction:y,assertNotNil:g}=p;class E{constructor(e,t,r=!1){g(e,"event"),y(t,"callback"),this._event=e,this._callback=t,this._isOnce=!!r,this._owner=void 0}set owner(e){this._owner=e}get owner(){return this._owner===v?void 0:this._owner}get event(){return this._event}get isOnce(){return this._isOnce}isSameCallback(e){return this._callback===e}get callback(){return this._callback}invoke(...e){try{return this._callback(...e)}finally{if(this._isOnce)try{this._event._remove(this)}catch(e){console.warn(e)}}}listener(...e){return this.invoke(...e)}}const{isFunction:N,isNil:x}=f,{assertStringOrSymbol:L,assertFunction:$}=p;class k{static get DefaultOwner(){return v}constructor(e){L(e,"eventName"),this._name=e,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(e){return null==e?this._listeners.length:this._callback2Listeners.get(e)?.size??0}callbacks(){return[...this.rawListeners().map(e=>e.callback)]}emit(...e){if(0===this._listeners.length)return!1;for(const t of[...this._listeners])t.invoke(...e);return!0}emitOwner(e,...t){if(0===this._listeners.length)return!1;const r=this._owner2Listeners.get(e);if(null==r)return!1;for(const e of[...r])e.invoke(...t);return!0}hasListener(e){return!!N(e)&&this._callbacks.has(e)}hasOwner(e){return!x(e)&&this._owner2Listeners.has(e)}addListener(e,t){return this._addListener(e,t,!1,!1)}prependListener(e,t){return this._addListener(e,t,!1,!0)}addOnceListener(e,t){return this._addListener(e,t,!0,!1)}prependOnceListener(e,t){return this._addListener(e,t,!0,!0)}_addListener(e,t,r,n){if(x(e))return!1;$(e),this._callbacks.has(e)||this._callbacks.add(e),t=t??v;const s=new E(this,e,r);s.owner=t,n?this._listeners.unshift(s):this._listeners.push(s),this._listener2Owner.set(s,t);let i=this._callback2Listeners.get(e);null==i&&(i=new Set,this._callback2Listeners.set(e,i)),i.add(s);let o=this._owner2Listeners.get(t);return null==o&&(o=new Set,this._owner2Listeners.set(t,o)),o.add(s),!0}removeListener(e){if(x(e))return!1;if(!this._callbacks.has(e))return!1;this._callbacks.delete(e);const t=this._callback2Listeners.get(e);if(null==t)return!1;this._callback2Listeners.delete(e);for(const e of t){-1!==this._listeners.indexOf(e)&&this._listeners.splice(this._listeners.indexOf(e),1);const t=this._listener2Owner.get(e);if(null==t)continue;this._listener2Owner.delete(e);const r=this._owner2Listeners.get(t);null!=r&&(r.delete(e),0===r.size&&this._owner2Listeners.delete(t))}return!0}_remove(e){const t=this._listeners.indexOf(e);-1!==t&&this._listeners.splice(t,1);const{callback:r}=e,n=this._callback2Listeners.get(r);null!=n&&(n.delete(e),0===n.size&&(this._callback2Listeners.delete(r),this._callbacks.delete(r)));const s=this._listener2Owner.get(e);if(null==s)return;this._listener2Owner.delete(e);const i=this._owner2Listeners.get(s);null!=i&&(i.delete(e),0===i.size&&this._owner2Listeners.delete(s))}removeAllListeners(e){if(x(e))return this._callbacks.clear(),this._listeners.length=0,this._callback2Listeners.clear(),this._listener2Owner.clear(),this._owner2Listeners.clear(),this;const t=this._owner2Listeners.get(e);if(null==t)return this;this._owner2Listeners.delete(e);for(const e of t){-1!==this._listeners.indexOf(e)&&this._listeners.splice(this._listeners.indexOf(e),1),this._listener2Owner.delete(e);const{callback:t}=e,r=this._callback2Listeners.get(t);null!=r&&(r.delete(e),0===r.size&&(this._callback2Listeners.delete(t),this._callbacks.delete(t)))}return this}}const{isNil:b}=f,{assertString:A,assertFunction:O,assertNumber:S,assertStringOrSymbol:W,assertNotNil:I}=p,T=["on","once","addListener","prependListener","prependOnceListener","off","offAll","offOwner","removeAllListeners","removeListener","emit","emitOwner","setMaxListeners","getMaxListeners","hasOwner","listeners","listenerCount","eventNames","rawListeners"];let C=10;class M{static mixin(e){const t=new M;e.__emitter=t;for(const r of T){const n=t[r];e[r]=n.bind(t)}return e}static get defaultMaxListeners(){return C}static set defaultMaxListeners(e){S(e),C=e??10}constructor(){this._name2Event=new Map,this._maxListeners=C}addListener(e,t,r){return this.on(e,t,r)}prependListener(e,t,r){return A(e),O(t),this._checkMaxListeners(e),this._getOrCreateEvent(e).prependListener(t,r),this}prependOnceListener(e,t,r){return A(e),O(t),this._checkMaxListeners(e),this._getOrCreateEvent(e).prependOnceListener(t,r),this}emit(e,...t){const r=this._name2Event.get(e);return null!=r&&!r.isEmpty()&&(r.emit(...t),!0)}emitOwner(e,t,...r){if(null==t)throw new Error('Missing "owner"');const n=this._name2Event.get(e);return null!=n&&!n.isEmpty()&&(n.emitOwner(t,...r),!0)}eventNames(){return[...this._name2Event.keys()]}getMaxListeners(){return this._maxListeners}listenerCount(e,t){W(e,"eventName");const r=this._name2Event.get(e);return null==r||r.isEmpty()?0:r.listenerCount(t)}listeners(e){W(e,"eventName");const t=this._name2Event.get(e);return null==t||t.isEmpty()?[]:t.callbacks()}off(e,t){const r=this._name2Event.get(e);return null==r?this:(r.removeListener(t),r.isEmpty()?(this._name2Event.delete(e),this):this)}offAll(e,t){W(e,"eventName");const r=this._name2Event.get(e);return null==r?this:(r.removeAllListeners(t),r.isEmpty()?(this._name2Event.delete(e),this):this)}offOwner(e){I(e,"owner");const t=[...this._name2Event.values()];for(const r of t)r.removeAllListeners(e),r.isEmpty()&&this._name2Event.delete(r.name);return this}on(e,t,r){return A(e),O(t),this._checkMaxListeners(e),this._getOrCreateEvent(e).addListener(t,r),this}_checkMaxListeners(e){let t=0;0!==this._maxListeners&&this._maxListeners!==1/0&&(t=this.listenerCount(e))>=this._maxListeners&&console.warn(`maxlistenersexceededwarning: Possible EventEmitter memory leak detected. ${t} ${e} listeners added to [${this}]. Use emitter.setMaxListeners() to increase limit`)}once(e,t,r){return A(e),O(t),this._getOrCreateEvent(e).addOnceListener(t,r),this}rawListeners(e){return this._name2Event.get(e)?.rawListeners()||[]}removeAllListeners(e,t){return this.offAll(e,t)}removeListener(e,t){return this.off(e,t)}setMaxListeners(e){if(S(e),e<0)throw new RangeError("maxListeners must >=0");return this._maxListeners=e,this}_getOrCreateEvent(e){if(this._name2Event.has(e))return this._name2Event.get(e);const t=new k(e);return this._name2Event.set(e,t),t}hasOwner(e){if(b(e))return!1;for(const t of this._name2Event.values())if(t.hasOwner(e))return!0;return!1}}const U={Advance:"advance",Expired:"expired"};class z extends M{get Event(){return U}constructor(e){super(),this.options=e??{},this._tickInterval=this.options.tickInterval??1e3,this._tickCount=this.options.tickCount??60,this._slots=Array(this._tickCount).fill(void 0).map(()=>new Map),this._cache=new Map,this._currentSlotIndex=0,this._timer=void 0,this._startAutoEvict()}get tickInterval(){return this._tickInterval}get tickCount(){return this._tickCount}get maxTtl(){return null==this._maxTtl&&(this._maxTtl=this._tickCount*this._tickInterval),this._maxTtl}assertStarted(){if(!this.autoEvictRunning)throw new Error(`${this.constructor.name} is not started`)}get autoEvictRunning(){return null!=this._timer}_startAutoEvict(){this._timer=setInterval(()=>this._advance(),this._tickInterval)}_stopAutoEvict(){this._timer&&clearInterval(this._timer),this._timer=void 0}_advance(){const e=(this._currentSlotIndex+1)%this._tickCount,t=this._slots[e],r=this._slots[this._currentSlotIndex];if(this.emit(U.Advance,this._currentSlotIndex,r,t),r.size>0){for(const e of r.keys()){const t=this._cache.get(e);this._cache.delete(e),this.emit(U.Expired,e,t.value,t.expireTimestamp)}r.clear()}this._currentSlotIndex=e}start(){this.autoEvictRunning||this._startAutoEvict()}stop(){this.autoEvictRunning&&this._stopAutoEvict()}destroy(){this._stopAutoEvict(),this.clear()}set(e,t,r){if(this.assertStarted(),o.assertNotNil(e,"key"),o.assertNotNil(t,"value"),r<=0)throw new Error(`Bad ttl "${r}", must > 0`);if(r>this.maxTtl)throw new Error(`Bad ttl "${r}", must <= maxTtl(${this.maxTtl})`);this._cache.has(e)&&this.delete(e);const n=h()+r,s=Math.floor((r-1)/this._tickInterval),i=(this._currentSlotIndex+s)%this._tickCount,a={value:t,slotIndex:i,expireTimestamp:n};return this._slots[i].set(e,a),this._cache.set(e,a),!0}delete(e){const t=this._cache.get(e);if(!t)return!1;this._cache.delete(e);const{slotIndex:r}=t;return this._slots[r].delete(e),!0}has(e){const t=this._cache.get(e);return!!t&&(!(t.expireTimestamp<=h())||(this.delete(e),this.emit("expired",e,t.value,t.expireTimestamp),!1))}clear(){this._cache.clear(),this._slots.forEach(e=>e.clear()),this._currentSlotIndex=0}get(e){const t=this._cache.get(e);if(t)return t.expireTimestamp<=h()?(this.delete(e),void this.emit("expired",e,t.value,t.expireTimestamp)):t.value}size(){const e=this._slots[this._currentSlotIndex];if(e.size>0){const t=h();for(const[r,{expireTimestamp:n}]of e.entries())if(n<=t){const t=this._cache.get(r);this.emit("expired",r,t.value,t.expireTimestamp),e.delete(r),this._cache.delete(r)}}return this._cache.size}}const B=6e4,F=36e5,D=864e5,P={HourToSecond:"hour->second",HourToMinute:"hour->minute",MinuteToSecond:"minute->second"},j={Downgrade:"downgrade",Expired:"expired"};class R extends M{static get DowngradType(){return P}static get Event(){return j}constructor(){super(),this._secondWheel=new z({tickInterval:1e3,tickCount:60}),this._minuteWheel=new z({tickInterval:B,tickCount:60}),this._hourWheel=new z({tickInterval:F,tickCount:24}),this._cache=new Map,this._init()}get maxTtl(){return 86399999}get autoEvictRunning(){return this._secondWheel.autoEvictRunning||this._minuteWheel.autoEvictRunning||this._hourWheel.autoEvictRunning}_init(){this._hourWheel.on("advance",(e,t,r)=>{for(const[e,{value:t,expireTimestamp:n}]of r){let r,s=n-h();s<=0?(s=1e3,r=P.HourToSecond,this._secondWheel.set(e,t,s),this.emit(j.Downgrade,e,t,r,s)):s<B?(r=P.HourToSecond,this._secondWheel.set(e,t,s),this.emit(j.Downgrade,e,t,r,s)):(r=P.HourToMinute,this._minuteWheel.set(e,t,s)),this._hourWheel.delete(e),this.emit(j.Downgrade,e,t,r,s)}}),this._minuteWheel.on("advance",(e,t,r)=>{for(const[e,{value:t,expireTimestamp:n}]of r){let r=n-h();r<=0&&(r=999),this._secondWheel.set(e,t,r),this.emit(j.Downgrade,e,t,P.MinuteToSecond,r),this._minuteWheel.delete(e)}}),this._secondWheel.on("expired",(e,t,r)=>{this.emit(j.Expired,e,t,r)})}start(){this._secondWheel.start(),this._minuteWheel.start(),this._hourWheel.start()}stop(){this._secondWheel.stop(),this._minuteWheel.stop(),this._hourWheel.stop()}destroy(){this._secondWheel.destroy(),this._minuteWheel.destroy(),this._hourWheel.destroy()}set(e,t,r){if(r<=0)throw new Error(`Bad ttl "${r}", must > 0`);let n;if(r<B)n=this._secondWheel;else if(r<F)n=this._minuteWheel;else{if(!(r<D))throw new Error('"ttl" Should <= Millisencod Of 24 Hours');n=this._hourWheel}return n.set(e,t,r),this._cache.set(e,n),!0}delete(e){const t=this._cache.get(e);return!!t&&t.delete(e)}has(e){const t=this._cache.get(e);return!!t&&(!!t.has(e)||t!==this._secondWheel&&(t===this._hourWheel?this._minuteWheel.has(e):t===this._minuteWheel&&this._secondWheel.has(e)))}clear(){this._secondWheel.clear(),this._minuteWheel.clear(),this._hourWheel.clear(),this._cache.clear()}get(e){const t=this._cache.get(e);if(!t)return;const r=t.get(e);return null!=r?r:t!==this._secondWheel?t===this._hourWheel?this._minuteWheel.get(e):t===this._minuteWheel?this._secondWheel.get(e):void 0:void 0}size(){return this._hourWheel.size()+this._minuteWheel.size()+this._secondWheel.size()}}var H={CappedSet:u,TimeWheelCache:z,Hour24TimeWheelCache:R};exports.CappedSet=u,exports.Hour24TimeWheelCache=R,exports.TimeWheelCache=z,exports.default=H;
//# sourceMappingURL=index-min.cjs.map