UNPKG

ng-event-bus

Version:

RxJS-based message/event bus service for Angular.

1 lines 8.21 kB
{"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":"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"}