Skip to content

Instantly share code, notes, and snippets.

@netbrain
Created December 12, 2018 08:00
Show Gist options
  • Save netbrain/308ad2fa196a41d2604fa1fa5e841d76 to your computer and use it in GitHub Desktop.
Save netbrain/308ad2fa196a41d2604fa1fa5e841d76 to your computer and use it in GitHub Desktop.
Simple Typescript Event Bus
interface Subscription<T> {
id: number,
type: new () => T
fn: (event:T)=>any
}
class Bus {
private seq:number = 0;
private subscribers:Map<string,Array<Subscription<any>>> = new Map();
public subscribe<T>(type: new () => T,callback:(event:T)=>any):Subscription<T>{
const key = new type().constructor.name;
if(!this.subscribers.has(key)){
this.subscribers.set(key,[])
}
const subscription = {
id:++this.seq,
fn: callback,
type,
};
(this.subscribers.get(key) as Array<Subscription<T>>).push(subscription);
return subscription;
}
public emit<T>(event:T){
const s = this.subscribers.get(event.constructor.name);
if(!s){
return;
}
s.forEach((subscription)=>{
subscription.fn(event);
})
}
public once<T>(type: new () => T,callback:(event:T)=>any){
let subscription:Subscription<T>;
subscription = this.subscribe(type,(T)=>{
this.unsubscribe(subscription);
callback(T);
})
}
public unsubscribe<T>(subscription: Subscription<T>){
const event = new subscription.type();
const key = event.constructor.name;
const subs = this.subscribers.get(key);
if (subs){
subs.splice(subs.findIndex((e:Subscription<T>)=>e.id === subscription.id),1);
}
}
}
export default new Bus();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment