{"version":3,"file":"EventsListeners.mjs","names":[],"sources":["../../../../@mongez/events/src/EventsListeners.ts"],"sourcesContent":["import { EventListeners, EventListenersList, EventSubscription } from \"./types\";\r\n\r\nexport default class EventsListeners {\r\n  protected listeners: EventListeners = {};\r\n\r\n  /**\r\n   * Add event subscriptions\r\n   */\r\n  public set(event: string, subscriptions: EventSubscription[]) {\r\n    this.listeners[event] = subscriptions;\r\n  }\r\n\r\n  /**\r\n   * Get all subscriptions for the given event\r\n   */\r\n  public get(event: string) {\r\n    const subscriptions: EventSubscription[] = this.listeners[event] || [];\r\n\r\n    return subscriptions;\r\n  }\r\n\r\n  /**\r\n   * Clear all events\r\n   */\r\n  public clear() {\r\n    this.listeners = {};\r\n  }\r\n\r\n  /**\r\n   * Check if the given event has subscriptions\r\n   */\r\n  public has(event: string) {\r\n    return typeof this.listeners[event] !== \"undefined\";\r\n  }\r\n\r\n  /**\r\n   * Delete the given event\r\n   */\r\n  public delete(event: string) {\r\n    delete this.listeners[event];\r\n  }\r\n\r\n  /**\r\n   * Match an event name against a namespace by segment boundary, not by raw\r\n   * prefix. Without this, `\"users.created\"` matches the namespace `\"user\"`\r\n   * (false positive) and destroying namespace `\"atoms.foo.clone.1\"` would\r\n   * also wipe `\"atoms.foo.clone.10\"`, `\"atoms.foo.clone.100\"`, etc.\r\n   */\r\n  protected matchesNamespace(event: string, namespace: string): boolean {\r\n    return event === namespace || event.startsWith(namespace + \".\");\r\n  }\r\n\r\n  /**\r\n   * List all events by namespace\r\n   */\r\n  public getByNamespace(namespace: string) {\r\n    let events: EventListeners = {};\r\n    for (const event in this.listeners) {\r\n      if (this.matchesNamespace(event, namespace)) {\r\n        events[event] = this.listeners[event];\r\n      }\r\n    }\r\n\r\n    return events;\r\n  }\r\n\r\n  /**\r\n   * Get all events listeners by namespace as an array\r\n   */\r\n  public getByNamespaceArray(namespace: string) {\r\n    let eventSubscriptions: EventListenersList = [];\r\n    for (const event in this.listeners) {\r\n      if (this.matchesNamespace(event, namespace)) {\r\n        eventSubscriptions.push({\r\n          event: event,\r\n          subscriptions: this.listeners[event],\r\n        });\r\n      }\r\n    }\r\n\r\n    return eventSubscriptions;\r\n  }\r\n\r\n  /**\r\n   * Delete all events that belongs to the given namespace\r\n   * i.e \"users\" namespace will affect on: users.created, users.updated, users.deleted will be deleted\r\n   */\r\n  public deleteByNamespace(namespace: string): void {\r\n    for (const event in this.listeners) {\r\n      if (this.matchesNamespace(event, namespace)) {\r\n        delete this.listeners[event];\r\n      }\r\n    }\r\n  }\r\n}\r\n"],"mappings":";AAEA,IAAqB,kBAArB,MAAqC;CACnC,AAAU,YAA4B,CAAC;;;;CAKvC,AAAO,IAAI,OAAe,eAAoC;EAC5D,KAAK,UAAU,SAAS;CAC1B;;;;CAKA,AAAO,IAAI,OAAe;EAGxB,OAF2C,KAAK,UAAU,UAAU,CAAC;CAGvE;;;;CAKA,AAAO,QAAQ;EACb,KAAK,YAAY,CAAC;CACpB;;;;CAKA,AAAO,IAAI,OAAe;EACxB,OAAO,OAAO,KAAK,UAAU,WAAW;CAC1C;;;;CAKA,AAAO,OAAO,OAAe;EAC3B,OAAO,KAAK,UAAU;CACxB;;;;;;;CAQA,AAAU,iBAAiB,OAAe,WAA4B;EACpE,OAAO,UAAU,aAAa,MAAM,WAAW,YAAY,GAAG;CAChE;;;;CAKA,AAAO,eAAe,WAAmB;EACvC,IAAI,SAAyB,CAAC;EAC9B,KAAK,MAAM,SAAS,KAAK,WACvB,IAAI,KAAK,iBAAiB,OAAO,SAAS,GACxC,OAAO,SAAS,KAAK,UAAU;EAInC,OAAO;CACT;;;;CAKA,AAAO,oBAAoB,WAAmB;EAC5C,IAAI,qBAAyC,CAAC;EAC9C,KAAK,MAAM,SAAS,KAAK,WACvB,IAAI,KAAK,iBAAiB,OAAO,SAAS,GACxC,mBAAmB,KAAK;GACf;GACP,eAAe,KAAK,UAAU;EAChC,CAAC;EAIL,OAAO;CACT;;;;;CAMA,AAAO,kBAAkB,WAAyB;EAChD,KAAK,MAAM,SAAS,KAAK,WACvB,IAAI,KAAK,iBAAiB,OAAO,SAAS,GACxC,OAAO,KAAK,UAAU;CAG5B;AACF"}