UNPKG

@homer0/events-hub

Version:

A simple implementation of a pubsub service for handling events

2 lines 1.89 kB
var d=class{events={};onceWrappers={};getSubscribers(e){return this.events[e]||(this.events[e]=[]),this.events[e]}on(e,r){return(Array.isArray(e)?e:[e]).forEach(a=>{let n=this.getSubscribers(a);n.includes(r)||n.push(r)}),()=>this.off(e,r)}once(e,r){let o=Array.isArray(e)?e:[e],a=o.reduce((n,s)=>{if(n)return n;let t=this.onceWrappers[s];if(Array.isArray(t)){let i=t.find(F=>F.original===r);return i?i.wrapper:null}return this.onceWrappers[s]=[],null},null);if(!a){let n=(...s)=>r(...s);n.once=!0,a=n,o.forEach(s=>{this.onceWrappers[s].push({wrapper:a,original:r})})}return this.on(e,a)}off(e,r){let o=Array.isArray(e),n=(o?e:[e]).map(s=>{let t=this.getSubscribers(s),i=this.onceWrappers[s],F=!1,c=t.indexOf(r);if(c>-1){if(F=!0,"once"in r&&i){let l=i.findIndex(p=>p.wrapper===r);i.splice(l,1)}t.splice(c,1)}else if(i&&(c=i.findIndex(l=>l.original===r),c>-1)){F=!0;let l=t.indexOf(i[c].original);t.splice(l,1),i.splice(c,1)}return F});return o?n:n[0]}emit(e,...r){let o=[];(Array.isArray(e)?e:[e]).forEach(n=>{this.getSubscribers(n).forEach(s=>{s(...r),"once"in s&&o.push({event:n,listener:s})})}),o.forEach(n=>this.off(n.event,n.listener))}async reduce(e,r,...o){let a=Array.isArray(e)?e:[e],n=[],s=await a.reduce((t,i)=>t.then(F=>this.getSubscribers(i).reduce((l,p)=>l.then(g=>{let f;Array.isArray(g)?f=g.slice():typeof g=="object"?f={...g}:f=g;let u=p(f,...o);return"once"in p&&n.push({event:i,listener:p}),u}),Promise.resolve(F))),Promise.resolve(r));return n.forEach(t=>this.off(t.event,t.listener)),s}reduceSync(e,r,...o){let a=Array.isArray(e)?e:[e],n=[],s=a.reduce((t,i)=>this.getSubscribers(i).reduce((c,l)=>{let p;Array.isArray(c)?p=c.slice():typeof c=="object"?p={...c}:p=c;let g=l(p,...o);return"once"in l&&n.push({event:i,listener:l}),g},t),r);return n.forEach(t=>this.off(t.event,t.listener)),s}},h=()=>new d;export{d as EventsHub,h as eventsHub}; //# sourceMappingURL=index.js.map