{"version":3,"file":"ng-event-bus.mjs","sources":["../../../projects/ng-event-bus/src/lib/meta-data.ts","../../../projects/ng-event-bus/src/lib/ng-event-bus.ts","../../../projects/ng-event-bus/src/public-api.ts","../../../projects/ng-event-bus/src/ng-event-bus.ts"],"sourcesContent":["/* tslint:disable:variable-name */\n\n/**\n * Metadata of the messages sent through the events bus.\n *\n * @typeParam T Payload type. Defaults to `undefined` when no payload is declared.\n * @author Cristiam Mercado\n * @since 2.0.0\n * @version 11.0.0\n */\nexport class MetaData<T = undefined> {\n  /**\n   * A unique identifier of the message sent through the events bus.\n   * @private\n   */\n  private readonly _id: string;\n\n  /**\n   * Original key associated to the message.\n   * @private\n   */\n  private readonly _key: string;\n\n  /**\n   * Payload associated with the message.\n   * @private\n   */\n  private readonly _data: T;\n\n  /**\n   * Time in milliseconds in which the message was generated.\n   * @private\n   */\n  private readonly _timestamp: number;\n\n  /**\n   * Constructor for this class.\n   *\n   * @param key Original key associated to the message sent through the events bus.\n   * @param [data] Optional payload sent with the message. Its type is preserved as `T`.\n   */\n  constructor(key: string, data?: T) {\n    this._id = this.uuid();\n    this._key = key;\n    this._data = data as T;\n    this._timestamp = new Date().getTime();\n  }\n\n  /**\n   * Gets unique identifier of the message sent through the events bus.\n   */\n  public get id(): string {\n    return this._id;\n  }\n\n  /**\n   * Original key associated to the message.\n   */\n  public get key(): string {\n    return this._key;\n  }\n\n  /**\n   * Gets the payload associated with the message.\n   */\n  public get data(): T {\n    return this._data;\n  }\n\n  /**\n   * Gets the time in milliseconds in which the message was generated.\n   */\n  public get timestamp(): number {\n    return this._timestamp;\n  }\n\n  /**\n   * Generates UUID version 4. The solution above uses Math.random() for brevity, however, Math.random() is not\n   * guaranteed to be a high-quality RNG.\n   *\n   * @return UUID version 4.\n   */\n  private uuid(): string {\n    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c: string): string => {\n      const r: number = (Math.random() * 16) | 0;\n      const v: number = c === 'x' ? r : (r & 0x3) | 0x8;\n      return v.toString(16);\n    });\n  }\n}\n","import { Observable, Subject } from 'rxjs';\nimport { filter, map } from 'rxjs/operators';\n\nimport { MetaData } from './meta-data';\nimport { IEventBusMessage } from './i-event-bus-message';\n\n/**\n * Main library class.\n *\n * @author Cristiam Mercado\n * @since 2.0.0\n * @version 11.0.0\n */\nexport class NgEventBus {\n  /**\n   * Main observable to multicast to all observers.\n   */\n  private eventBus: Subject<IEventBusMessage<unknown>>;\n\n  /**\n   * Key message separator.\n   */\n  private separator: string = ':';\n\n  /**\n   * Constructor for this class: Initializes event bus.\n   */\n  constructor() {\n    this.eventBus = new Subject<IEventBusMessage<unknown>>();\n  }\n\n  /**\n   * Validates key matching.\n   *\n   * @param key Key to identify the message/event.\n   * @param wildcard Wildcard received from on method.\n   *\n   * @return true if key matches, false otherwise.\n   */\n  public keyMatch(key: string, wildcard: string): boolean {\n    const w: string = '*';\n    const ww: string = '**';\n\n    const partMatch = (wl: string, k: string): boolean => wl === w || wl === k;\n\n    const sep: string = this.separator;\n    const kArr: string[] = key.split(sep);\n    const wArr: string[] = wildcard.split(sep);\n\n    const kLen: number = kArr.length;\n    const wLen: number = wArr.length;\n    const max: number = Math.max(kLen, wLen);\n\n    for (let i: number = 0; i < max; i++) {\n      const cK: string = kArr[i];\n      const cW: string = wArr[i];\n\n      if (cW === ww && typeof cK !== 'undefined') return true;\n\n      if (!partMatch(cW, cK)) return false;\n    }\n\n    return true;\n  }\n\n  /**\n   * Publish a message/event to event bus.\n   *\n   * @param  key Key to identify the message/event.\n   * @param [data] Optional payload sent with the message/event.\n   * @throws {Error} key parameter must be a string and must not be empty.\n   */\n  public cast(key: string): void;\n  public cast<T>(key: string, data: T): void;\n  public cast<T = undefined>(key: string, data?: T): void {\n    if (!key.trim().length) throw new Error('key parameter must be a string and must not be empty');\n\n    const metadata: MetaData<T> = new MetaData<T>(key, data);\n\n    this.eventBus.next({ key, metadata });\n  }\n\n  /**\n   * Returns an observable you can subscribe to listen messages/events.\n   *\n   * @typeParam T Expected payload type. Defaults to `undefined` when omitted.\n   * @param key Key or wildcard pattern used to identify messages/events.\n   *\n   * @return Observable you can subscribe to listen messages/events.\n   */\n  public on<T = undefined>(key: string): Observable<MetaData<T>> {\n    return this.eventBus.asObservable().pipe(\n      filter((event: IEventBusMessage<unknown>): boolean => this.keyMatch(event.key, key)),\n      map((event: IEventBusMessage<unknown>): MetaData<T> => event.metadata as MetaData<T>)\n    );\n  }\n}\n","/*\n * Public API Surface of ng-event-bus\n */\n\nexport * from './lib/ng-event-bus';\nexport * from './lib/meta-data';\nexport * from './lib/i-event-bus-message';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;AAAA;AAEA;;;;;;;AAOG;MACU,QAAQ,CAAA;AACnB;;;AAGG;AACc,IAAA,GAAG;AAEpB;;;AAGG;AACc,IAAA,IAAI;AAErB;;;AAGG;AACc,IAAA,KAAK;AAEtB;;;AAGG;AACc,IAAA,UAAU;AAE3B;;;;;AAKG;IACH,WAAA,CAAY,GAAW,EAAE,IAAQ,EAAA;AAC/B,QAAA,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE;AACtB,QAAA,IAAI,CAAC,IAAI,GAAG,GAAG;AACf,QAAA,IAAI,CAAC,KAAK,GAAG,IAAS;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE;IACxC;AAEA;;AAEG;AACH,IAAA,IAAW,EAAE,GAAA;QACX,OAAO,IAAI,CAAC,GAAG;IACjB;AAEA;;AAEG;AACH,IAAA,IAAW,GAAG,GAAA;QACZ,OAAO,IAAI,CAAC,IAAI;IAClB;AAEA;;AAEG;AACH,IAAA,IAAW,IAAI,GAAA;QACb,OAAO,IAAI,CAAC,KAAK;IACnB;AAEA;;AAEG;AACH,IAAA,IAAW,SAAS,GAAA;QAClB,OAAO,IAAI,CAAC,UAAU;IACxB;AAEA;;;;;AAKG;IACK,IAAI,GAAA;QACV,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAS,KAAY;AACnF,YAAA,MAAM,CAAC,GAAW,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC;AAC1C,YAAA,MAAM,CAAC,GAAW,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,IAAI,GAAG;AACjD,YAAA,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;AACvB,QAAA,CAAC,CAAC;IACJ;AACD;;ACnFD;;;;;;AAMG;MACU,UAAU,CAAA;AACrB;;AAEG;AACK,IAAA,QAAQ;AAEhB;;AAEG;IACK,SAAS,GAAW,GAAG;AAE/B;;AAEG;AACH,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,OAAO,EAA6B;IAC1D;AAEA;;;;;;;AAOG;IACI,QAAQ,CAAC,GAAW,EAAE,QAAgB,EAAA;QAC3C,MAAM,CAAC,GAAW,GAAG;QACrB,MAAM,EAAE,GAAW,IAAI;AAEvB,QAAA,MAAM,SAAS,GAAG,CAAC,EAAU,EAAE,CAAS,KAAc,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC;AAE1E,QAAA,MAAM,GAAG,GAAW,IAAI,CAAC,SAAS;QAClC,MAAM,IAAI,GAAa,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;QACrC,MAAM,IAAI,GAAa,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;AAE1C,QAAA,MAAM,IAAI,GAAW,IAAI,CAAC,MAAM;AAChC,QAAA,MAAM,IAAI,GAAW,IAAI,CAAC,MAAM;QAChC,MAAM,GAAG,GAAW,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC;AAExC,QAAA,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE;AACpC,YAAA,MAAM,EAAE,GAAW,IAAI,CAAC,CAAC,CAAC;AAC1B,YAAA,MAAM,EAAE,GAAW,IAAI,CAAC,CAAC,CAAC;AAE1B,YAAA,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,EAAE,KAAK,WAAW;AAAE,gBAAA,OAAO,IAAI;AAEvD,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC;AAAE,gBAAA,OAAO,KAAK;QACtC;AAEA,QAAA,OAAO,IAAI;IACb;IAWO,IAAI,CAAgB,GAAW,EAAE,IAAQ,EAAA;AAC9C,QAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM;AAAE,YAAA,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC;QAE/F,MAAM,QAAQ,GAAgB,IAAI,QAAQ,CAAI,GAAG,EAAE,IAAI,CAAC;QAExD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IACvC;AAEA;;;;;;;AAOG;AACI,IAAA,EAAE,CAAgB,GAAW,EAAA;AAClC,QAAA,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,CACtC,MAAM,CAAC,CAAC,KAAgC,KAAc,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,EACpF,GAAG,CAAC,CAAC,KAAgC,KAAkB,KAAK,CAAC,QAAuB,CAAC,CACtF;IACH;AACD;;AChGD;;AAEG;;ACFH;;AAEG;;;;"}