UNPKG

event-on

Version:

A high-performance event handler optimized for high-frequency scenarios with support for regular and one-time events

2 lines (1 loc) 3.23 kB
var b=Object.defineProperty;var A=(r,e,n)=>e in r?b(r,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[e]=n;var g=(r,e)=>b(r,"name",{value:e,configurable:!0});var _=(r,e,n)=>A(r,typeof e!="symbol"?e+"":e,n);var f=class f{constructor(){_(this,"_events",Object.create(null));_(this,"_eventHashCache",Object.create(null));_(this,"_hashCacheSize",0);_(this,"_arrayPool",Object.create(null))}_getEventKey(e){let n=e.length;if(n<=8)return e;let s=this._eventHashCache[e];if(s)return s.t=Date.now(),s.h;if(this._hashCacheSize>=2048){let l=1/0,i="";for(let h in this._eventHashCache){let a=this._eventHashCache[h];a.t<l&&(l=a.t,i=h)}delete this._eventHashCache[i],this._hashCacheSize--}let t=16777619;for(let l=0;l<n;l+=2)t^=e.charCodeAt(l),t=(t<<16)+(t<<5)-t,l+1<n&&(t^=e.charCodeAt(l+1),t=(t<<16)+(t<<5)-t);return t|=0,this._eventHashCache[e]={h:t,t:Date.now()},this._hashCacheSize++,t}_acquireArray(e){let n=e>8?1:0,s=this._arrayPool[n];return s||(s=this._arrayPool[n]=[]),s.pop()||new Array(n?64:32)}_releaseArray(e,n){let s=n>8?1:0,t=this._arrayPool[s];t&&e.length<2048&&(e.length=0,t.push(e))}_bind(e,n,s,t){if(typeof n!="function")return this;let l=this._getEventKey(e),i=this._events[l];return i||(i=this._acquireArray(e.length),this._events[l]=i),i.push(n,s,!1,t),this}on(e,n,s=null){return this._bind(e,n,s,!1)}once(e,n,s=null){return this._bind(e,n,s,!0)}off(e,n,s=null){let t=this._getEventKey(e),l=this._events[t];if(!l)return this;if(n===void 0)return this._releaseArray(l,e.length),delete this._events[t],this;let i=l.length,h=!1;for(let a=0;a<i;a+=4)if(l[a]===n&&l[a+1]===s){l[a+2]=!0,h=!0;break}return h&&i===4&&(this._releaseArray(l,e.length),delete this._events[t]),this}trigger(e,...n){let s=this._getEventKey(e),t=this._events[s];if(!t||t.length===0)return!1;let l=!1,i=!1,h=t.length,a=n.length;for(let o=0;o<h;o+=4){if(t[o+2]){i=!0;continue}let c=t[o],u=t[o+1],y=c.length;switch(a<y?a:y){case 0:c.call(u)===!0&&(l=!0);break;case 1:c.call(u,n[0])===!0&&(l=!0);break;case 2:c.call(u,n[0],n[1])===!0&&(l=!0);break;default:c(...n)===!0&&(l=!0);break}if(l)break;t[o+3]&&(t[o+2]=!0,i=!0)}return i&&(h>1e3?this._cleanupLarge(t,s,e.length):this._cleanupSmall(t,s,e.length)),l}_cleanupSmall(e,n,s){let t=0,l=e.length;for(let i=0;i<l;i+=4)e[i+2]||(e[t]=e[i],e[t+1]=e[i+1],e[t+2]=!1,e[t+3]=e[i+3],t+=4);e.length=t,t===0&&(this._releaseArray(e,s),delete this._events[n])}_cleanupLarge(e,n,s){let t=this._acquireArray(s),l=e.length;for(let i=0;i<l;i+=4)e[i+2]||t.push(e[i],e[i+1],!1,e[i+3]);this._releaseArray(e,s),t.length===0?(this._releaseArray(t,s),delete this._events[n]):this._events[n]=t}has(e){let n=this._getEventKey(e),s=this._events[n];if(!s||s.length===0)return!1;let t=s.length;for(let l=0;l<t;l+=4)if(!s[l+2])return!0;return!1}cleanupAll(){let e=Object.keys(this._events);for(let n=0;n<e.length;n++){let s=e[n],t=this._events[s];t.length>1e3?this._cleanupLarge(t,s,0):this._cleanupSmall(t,s,0)}}destroy(){let e=Object.keys(this._events);for(let s=0;s<e.length;s++){let t=e[s];this._releaseArray(this._events[t],0),delete this._events[t]}let n=Object.keys(this._eventHashCache);for(let s=0;s<n.length;s++)delete this._eventHashCache[n[s]];this._hashCacheSize=0}};g(f,"EventOn");var C=f;export{C as EventOn};