interface Callback {
(...data: any): void
}
const subscribers = new Map<string, Set<Callback>>()
export const subscribe = (event: string, callback: Callback): void => {
if (subscribers.has(event)) {
subscribers.get(event)?.add(callback)
} else {
subscribers.set(event, new Set<Callback>().add(callback))
}
}
export const publish = (event: string, ...data: any): void => {
if (subscribers.has(event)) {
Promise.all([...subscribers.get(event)!].map((cb: Callback) => cb(...data)))
}
}
export const unsubscribe = (event: string, callback?: Callback): void => {
if (callback) {
subscribers.get(event)?.delete(callback)
} else if (event === "*") {
subscribers.clear()
} else {
subscribers.delete(event)
}
}