UNPKG

@avatijs/listener

Version:

Listener package part of Avati project

8 lines 3.84 kB
/*! * @avatijs/listener 0.1.1 * Copyright (c) 2024 Khaled Sameer <khaled.smq@hotmail.com> * Licensed under MIT, https://opensource.org/licenses/MIT/ * Please visit https://avati.io/ for details. */ import*as t from"@avatijs/debounce";import*as e from"@avatijs/throttle";var n={d:(t,e)=>{for(var r in e)n.o(e,r)&&!n.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:e[r]})},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e)},r={};n.d(r,{W:()=>d});const i=(n.d(o={},{debounce:()=>t.debounce}),o);var o;const a=(()=>{var t={};return n.d(t,{throttle:()=>e.throttle}),t})();var s,l,c;const h=Symbol("listeners"),u=Symbol("weakRefMap"),b=Symbol("handleWeakRef"),m=Symbol("validateParams"),f=Symbol("generateEventId"),v=Symbol("eventIdCounter");class d{constructor(){Object.defineProperty(this,"defaultOptions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,s,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,l,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,c,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,"EVENT_MAPPINGS",{enumerable:!0,configurable:!0,writable:!0,value:{debounce:new Set(["input","change","keyup","keydown","focus","blur","click"]),throttle:new Set(["mousemove","scroll","resize","wheel"])}}),this[h]=new Map,this[u]=new WeakMap,this[v]=0,this.add=this.add.bind(this),this.remove=this.remove.bind(this),this.defaultOptions=Object.freeze({capture:!1,passive:!0,once:!1,async:!1})}add(t,e,n,r={}){this[m](t,e,n);const o=this[f](),s={...this.defaultOptions,...r};let l=n;if(s.debounce&&s.throttle)throw Error("Cannot specify both debounce and throttle options");s.async&&(l=async t=>{try{await n(t)}catch(t){if(!(s.onError&&t instanceof Error))throw t;s.onError(t)}}),s.debounce?(this.recommendation(e,"debounce"),l=(0,i.debounce)(l,{wait:s.debounce,leading:s.leading,trailing:s.trailing,debug:s.debug,onError:s.onError})):s.throttle&&(this.recommendation(e,"throttle"),l=(0,a.throttle)(l,s.throttle,{leading:s.leading,trailing:s.trailing,onError:s.onError}));const c=async e=>{s.metadata&&(e.metadata={timestamp:Date.now(),eventId:o,originalCallback:n.name||"anonymous"});try{await l.call(t,e)}catch(t){if(!(s.onError&&t instanceof Error))throw t;s.onError(t)}s.once&&this.remove(o)},u={element:new WeakRef(t),eventType:e,callback:c,originalCallback:n,options:s,timestamp:Date.now()};return this[h].set(o,u),this[b](t,o),t.addEventListener(e,c,s),o}remove(t){const e=this[h].get(t);if(!e)return!1;const n=e.element.deref();if(n){n.removeEventListener(e.eventType,e.callback,e.options);const r=this[u].get(n);r&&(r.delete(t),0===r.size&&this[u].delete(n))}return this[h].delete(t),!0}addWithCleanup(t,e,n,r={}){const i=this.add(t,e,n,r);return()=>this.remove(i)}getListeners(t){const e=this[u].get(t);return e?Array.from(e).map((e=>{const n=this[h].get(e);if(!n)return null;const r=n.element.deref();return r&&r===t?{eventId:e,eventType:n.eventType,options:n.options,timestamp:n.timestamp}:null})).filter((t=>null!==t)):[]}removeAll(t){const e=this[u].get(t);if(e){for(const t of e)this.remove(t);this[u].delete(t)}}once(t,e,n,r={}){return this.add(t,e,n,{...r,once:!0})}[(s=h,l=u,c=v,m)](t,e,n){if(!(t instanceof Element||t instanceof Window||t instanceof Document))throw new TypeError("Element must be an instance of Element, Window, or Document");if("string"!=typeof e)throw new TypeError("Event type must be a string");if("function"!=typeof n)throw new TypeError("Callback must be a function")}[f](){return"event_"+ ++this[v]}[b](t,e){let n=this[u].get(t);n||(n=new Set,this[u].set(t,n)),n.add(e)}recommendation(t,e){this.EVENT_MAPPINGS["throttle"===e?"debounce":"throttle"].has(t)}}var w=r.W;export{w as EventListenerManager}; //# sourceMappingURL=index.min.js.map