@avatijs/listener
Version:
Listener package part of Avati project
7 lines • 3.89 kB
JavaScript
/*!
* @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.
*/(()=>{"use strict";var e={d:(t,n)=>{for(var i in n)e.o(n,i)&&!e.o(t,i)&&Object.defineProperty(t,i,{enumerable:!0,get:n[i]})},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,"t",{value:!0})}},t={};e.r(t),e.d(t,{EventListenerManager:()=>m});const n=require("@avatijs/debounce"),i=require("@avatijs/throttle");var o,r,a;const s=Symbol("listeners"),l=Symbol("weakRefMap"),c=Symbol("handleWeakRef"),u=Symbol("validateParams"),h=Symbol("generateEventId"),b=Symbol("eventIdCounter");class m{constructor(){Object.defineProperty(this,"defaultOptions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,o,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,r,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,a,{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[s]=new Map,this[l]=new WeakMap,this[b]=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(e,t,o,r={}){this[u](e,t,o);const a=this[h](),l={...this.defaultOptions,...r};let b=o;if(l.debounce&&l.throttle)throw Error("Cannot specify both debounce and throttle options");l.async&&(b=async e=>{try{await o(e)}catch(e){if(!(l.onError&&e instanceof Error))throw e;l.onError(e)}}),l.debounce?(this.recommendation(t,"debounce"),b=(0,n.debounce)(b,{wait:l.debounce,leading:l.leading,trailing:l.trailing,debug:l.debug,onError:l.onError})):l.throttle&&(this.recommendation(t,"throttle"),b=(0,i.throttle)(b,l.throttle,{leading:l.leading,trailing:l.trailing,onError:l.onError}));const m=async t=>{l.metadata&&(t.metadata={timestamp:Date.now(),eventId:a,originalCallback:o.name||"anonymous"});try{await b.call(e,t)}catch(e){if(!(l.onError&&e instanceof Error))throw e;l.onError(e)}l.once&&this.remove(a)},f={element:new WeakRef(e),eventType:t,callback:m,originalCallback:o,options:l,timestamp:Date.now()};return this[s].set(a,f),this[c](e,a),e.addEventListener(t,m,l),a}remove(e){const t=this[s].get(e);if(!t)return!1;const n=t.element.deref();if(n){n.removeEventListener(t.eventType,t.callback,t.options);const i=this[l].get(n);i&&(i.delete(e),0===i.size&&this[l].delete(n))}return this[s].delete(e),!0}addWithCleanup(e,t,n,i={}){const o=this.add(e,t,n,i);return()=>this.remove(o)}getListeners(e){const t=this[l].get(e);return t?Array.from(t).map((t=>{const n=this[s].get(t);if(!n)return null;const i=n.element.deref();return i&&i===e?{eventId:t,eventType:n.eventType,options:n.options,timestamp:n.timestamp}:null})).filter((e=>null!==e)):[]}removeAll(e){const t=this[l].get(e);if(t){for(const e of t)this.remove(e);this[l].delete(e)}}once(e,t,n,i={}){return this.add(e,t,n,{...i,once:!0})}[(o=s,r=l,a=b,u)](e,t,n){if(!(e instanceof Element||e instanceof Window||e instanceof Document))throw new TypeError("Element must be an instance of Element, Window, or Document");if("string"!=typeof t)throw new TypeError("Event type must be a string");if("function"!=typeof n)throw new TypeError("Callback must be a function")}[h](){return"event_"+ ++this[b]}[c](e,t){let n=this[l].get(e);n||(n=new Set,this[l].set(e,n)),n.add(t)}recommendation(e,t){this.EVENT_MAPPINGS["throttle"===t?"debounce":"throttle"].has(e)}}module.exports=t})();
//# sourceMappingURL=index.min.js.map