ng-event-bus
Version:
RxJS-based message/event bus service for Angular.
1 lines • 7.69 kB
Source Map (JSON)
{"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 * @author Cristiam Mercado\n * @since 2.0.0\n * @version 9.0.0\n */\nexport class MetaData<T = any> {\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 * Data associated to message. It's optional.\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: Additional data sent with the message.\n */\n constructor(key: string, data?: T) {\n this._id = this.uuid();\n this._key = key;\n this._data = data;\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 * Data associated to message. It's optional.\n */\n public get data(): T | undefined {\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 9.0.0\n */\nexport class NgEventBus {\n /**\n * Main observable to multicast to all observers.\n */\n private eventBus: Subject<IEventBusMessage>;\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>();\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: Additional data sent with the message/event.\n * @throws {Error} key parameter must be a string and must not be empty.\n */\n public cast<T>(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 * @param key Key to identify the message/event.\n *\n * @return Observable you can subscribe to listen messages/events.\n */\n public on<T>(key: string): Observable<MetaData<T>> {\n return this.eventBus.asObservable().pipe(\n filter((event: IEventBusMessage): boolean => this.keyMatch(event.key, key)),\n map((event: IEventBusMessage): MetaData<T> => event.metadata)\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":"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"}