@avatijs/listener
Version:
Listener package part of Avati project
8 lines • 9.13 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.
*/
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Avati",[],t):"object"==typeof exports?exports.Avati=t():(e.Avati=e.Avati||{},e.Avati.Listener=t())}("undefined"!=typeof self?self:this,(()=>(()=>{var e={747:function(e){"undefined"!=typeof self&&self,e.exports=(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},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,{debounce:()=>r});const n=new WeakMap,o=e=>({log:(...t)=>e&&void 0,warn:(...t)=>e&&void 0,error:(...t)=>e&&void 0});function r(e,t={}){if("function"!=typeof e)throw new TypeError("Expected a function");const{wait:r=0,leading:i=!1,trailing:a=!0,maxWait:c,debug:l=!1,signal:u,onError:s}=t;if(0>r||void 0!==c&&r>c)throw new RangeError("Invalid wait/maxWait values");if(!i&&!a)throw Error("At least one of leading or trailing must be true");const f=o(l),d={lastInvokeTime:0,pendingPromises:[],aborted:!1};function b(){void 0!==d.timerId&&(clearTimeout(d.timerId),d.timerId=void 0,f.log("Cleared debounce timer")),void 0!==d.maxTimerId&&(clearTimeout(d.maxTimerId),d.maxTimerId=void 0,f.log("Cleared max wait timer"))}function v(){f.log("Cancelling pending invocations"),b(),d.lastInvokeTime=0,d.lastArgs=void 0,d.lastThis=void 0,d.lastCallTime=void 0,m(Error("Debounced function cancelled")),d.pendingPromises.forEach((({reject:e})=>e(Error("Debounced function cancelled")))),d.pendingPromises=[]}function m(e){if(f.error("Error occurred:",e),s)try{s(e)}catch(e){f.error("Error in onError callback:",e)}}function h(){return void 0!==d.timerId}function p(e){if(d.aborted)return!1;const t=void 0===d.lastCallTime?0:e-d.lastCallTime;return void 0===d.lastCallTime||t>=r||0>t||void 0!==c&&e-d.lastInvokeTime>=c}async function y(t){f.log("Invoking function at "+t),d.lastInvokeTime=t;const n=d.lastArgs,o=d.lastThis;d.lastArgs=void 0,d.lastThis=void 0;try{const t=await e.apply(o,n);return d.result=t,d.pendingPromises.forEach((({resolve:e})=>e(t))),d.pendingPromises=[],f.log("Function invoked successfully",t),t}catch(e){const t=e instanceof Error?e:Error(e+"");f.error("Error in function invocation:",t),m(t);const n=[...d.pendingPromises];d.pendingPromises=[],n.forEach((({reject:e})=>e(t)))}}function g(e){const t=function(e){return Math.max(0,r-(d.lastCallTime?e-d.lastCallTime:0))}(e);if(d.timerId=setTimeout(w,t),f.log(`Started debounce timer for ${t}ms`),void 0!==c&&!d.maxTimerId){const t=c-(e-d.lastCallTime);d.maxTimerId=setTimeout((()=>{f.log("Max wait timer expired"),b(),y(Date.now())}),Math.max(0,t)),f.log(`Started max wait timer for ${t}ms`)}}function w(){const e=Date.now();if(f.log("Debounce timer expired"),p(e))return function(e){f.log("Trailing edge triggered"),b(),a&&d.lastArgs?y(e):(d.pendingPromises.forEach((({resolve:e})=>{e(d.result)})),d.pendingPromises=[])}(e);g(e)}u&&u.addEventListener("abort",(()=>{d.aborted=!0,v()}));const E=function(...e){if(d.aborted)return Promise.reject(Error("Debounced function aborted"));const t=Date.now(),n=p(t);return d.lastArgs=e,d.lastThis=this,d.lastCallTime=t,f.log("Function called",{time:t,isInvoking:n,args:e,pending:h()}),new Promise(((e,n)=>{d.pendingPromises.push({resolve:e,reject:n}),void 0===d.timerId?function(e){f.log("Leading edge triggered"),d.lastInvokeTime=e,g(e),i&&y(e)}(t):(b(),g(t))}))};return n.set(E,d),Object.defineProperties(E,{cancel:{value:v,writable:!1,configurable:!1},flush:{value:async function(...e){f.log("Flush requested");const t=e.length>0?e:d.lastArgs,n=d.lastThis;return b(),t?(d.lastArgs=t,d.lastThis=n,y(Date.now())):Promise.resolve(d.result)},writable:!1,configurable:!1},pending:{value:h,writable:!1,configurable:!1},cleanup:{value:function(){f.log("Cleanup initiated"),v(),n.delete(E)},writable:!1,configurable:!1}}),E}return t})()},94:function(e){"undefined"!=typeof self&&self,e.exports=(()=>{"use strict";var e={d:(t,n)=>{for(var o in n)e.o(n,o)&&!e.o(t,o)&&Object.defineProperty(t,o,{enumerable:!0,get:n[o]})},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={};function n(e,t=1e3/120,n={}){let o,r=null,i=null,a=null,c=!1;const{leading:l=!0,trailing:u=!0,onError:s}=n,f=()=>{if(null!==i){c=!0,d();try{e.apply(a,i)}catch(e){if(!s)throw e;s(e instanceof Error?e:Error(e+""))}finally{c=!1}r=d(),i=null,a=null,d()}},d="undefined"!=typeof performance?()=>performance.now():()=>Date.now(),b=function(...e){const n=d();if(null===r){if(l)return i=e,a=this,void f();r=n}const c=r?t-(n-r):0;i=e,a=this,0>c||c>t?(o&&(clearTimeout(o),o=void 0),r=n,f()):!o&&u&&(e=>{o=setTimeout((()=>{o=void 0,u&&f()}),e)})(c)};return b.cancel=()=>{o&&clearTimeout(o),r=null,i=null,a=null,o=void 0,c=!1},b.flush=()=>{o&&(clearTimeout(o),o=void 0,!c&&u&&i)&&(r?d()-r:1/0)>=t&&f()},b}return e.r(t),e.d(t,{throttle:()=>n}),t})()}},t={};function n(o){var r=t[o];if(void 0!==r)return r.exports;var i=t[o]={exports:{}};return e[o].call(i.exports,i,i.exports,n),i.exports}n.d=(e,t)=>{for(var o in t)n.o(t,o)&&!n.o(e,o)&&Object.defineProperty(e,o,{enumerable:!0,get:t[o]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"t",{value:!0})};var o={};return(()=>{"use strict";n.r(o),n.d(o,{EventListenerManager:()=>b});var e,t,r,i=n(747),a=n(94);const c=Symbol("listeners"),l=Symbol("weakRefMap"),u=Symbol("handleWeakRef"),s=Symbol("validateParams"),f=Symbol("generateEventId"),d=Symbol("eventIdCounter");class b{constructor(){Object.defineProperty(this,"defaultOptions",{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,e,{enumerable:!0,configurable:!0,writable:!0,value:void 0}),Object.defineProperty(this,t,{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,"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[c]=new Map,this[l]=new WeakMap,this[d]=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,n,o={}){this[s](e,t,n);const r=this[f](),l={...this.defaultOptions,...o};let d=n;if(l.debounce&&l.throttle)throw Error("Cannot specify both debounce and throttle options");l.async&&(d=async e=>{try{await n(e)}catch(e){if(!(l.onError&&e instanceof Error))throw e;l.onError(e)}}),l.debounce?(this.recommendation(t,"debounce"),d=(0,i.debounce)(d,{wait:l.debounce,leading:l.leading,trailing:l.trailing,debug:l.debug,onError:l.onError})):l.throttle&&(this.recommendation(t,"throttle"),d=(0,a.throttle)(d,l.throttle,{leading:l.leading,trailing:l.trailing,onError:l.onError}));const b=async t=>{l.metadata&&(t.metadata={timestamp:Date.now(),eventId:r,originalCallback:n.name||"anonymous"});try{await d.call(e,t)}catch(e){if(!(l.onError&&e instanceof Error))throw e;l.onError(e)}l.once&&this.remove(r)},v={element:new WeakRef(e),eventType:t,callback:b,originalCallback:n,options:l,timestamp:Date.now()};return this[c].set(r,v),this[u](e,r),e.addEventListener(t,b,l),r}remove(e){const t=this[c].get(e);if(!t)return!1;const n=t.element.deref();if(n){n.removeEventListener(t.eventType,t.callback,t.options);const o=this[l].get(n);o&&(o.delete(e),0===o.size&&this[l].delete(n))}return this[c].delete(e),!0}addWithCleanup(e,t,n,o={}){const r=this.add(e,t,n,o);return()=>this.remove(r)}getListeners(e){const t=this[l].get(e);return t?Array.from(t).map((t=>{const n=this[c].get(t);if(!n)return null;const o=n.element.deref();return o&&o===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,o={}){return this.add(e,t,n,{...o,once:!0})}[(e=c,t=l,r=d,s)](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")}[f](){return"event_"+ ++this[d]}[u](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)}}})(),o})()));
//# sourceMappingURL=index.min.js.map