@orbit/core
Version:
Core library for Orbit - a flexible data access and synchronization layer.
52 lines • 4.59 kB
JavaScript
/**
* The `Notifier` class can emit messages to an array of subscribed listeners.
* Here's a simple example:
*
* ```ts
* import { Notifier } from '@orbit/core';
*
* let notifier = new Notifier();
* notifier.addListener((message: string) => {
* console.log("I heard " + message);
* });
* notifier.addListener((message: string) => {
* console.log("I also heard " + message);
* });
*
* notifier.emit('hello'); // logs "I heard hello" and "I also heard hello"
* ```
*
* Calls to `emit` will send along all of their arguments.
*/
export class Notifier {
constructor() {
this.listeners = [];
}
/**
* Add a callback as a listener, which will be triggered when sending
* notifications.
*/
addListener(listener) {
this.listeners.push(listener);
return () => this.removeListener(listener);
}
/**
* Remove a listener so that it will no longer receive notifications.
*/
removeListener(listener) {
const listeners = this.listeners;
for (let i = 0, len = listeners.length; i < len; i++) {
if (listeners[i] === listener) {
listeners.splice(i, 1);
return;
}
}
}
/**
* Notify registered listeners.
*/
emit(...args) {
this.listeners.slice(0).forEach((listener) => listener(...args));
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbm90aWZpZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxNQUFNLE9BQU8sUUFBUTtJQUduQjtRQUNFLElBQUksQ0FBQyxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFRDs7O09BR0c7SUFDSCxXQUFXLENBQUMsUUFBa0I7UUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFOUIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7T0FFRztJQUNILGNBQWMsQ0FBQyxRQUFrQjtRQUMvQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRWpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDcEQsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxFQUFFO2dCQUM3QixTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDdkIsT0FBTzthQUNSO1NBQ0Y7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsR0FBRyxJQUFlO1FBQ3JCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNuRSxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBMaXN0ZW5lciA9ICguLi5hcmdzOiBhbnlbXSkgPT4gYW55O1xuXG4vKipcbiAqICBUaGUgYE5vdGlmaWVyYCBjbGFzcyBjYW4gZW1pdCBtZXNzYWdlcyB0byBhbiBhcnJheSBvZiBzdWJzY3JpYmVkIGxpc3RlbmVycy5cbiAqIEhlcmUncyBhIHNpbXBsZSBleGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBOb3RpZmllciB9IGZyb20gJ0BvcmJpdC9jb3JlJztcbiAqXG4gKiBsZXQgbm90aWZpZXIgPSBuZXcgTm90aWZpZXIoKTtcbiAqIG5vdGlmaWVyLmFkZExpc3RlbmVyKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJJIGhlYXJkIFwiICsgbWVzc2FnZSk7XG4gKiB9KTtcbiAqIG5vdGlmaWVyLmFkZExpc3RlbmVyKChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAqICAgY29uc29sZS5sb2coXCJJIGFsc28gaGVhcmQgXCIgKyBtZXNzYWdlKTtcbiAqIH0pO1xuICpcbiAqIG5vdGlmaWVyLmVtaXQoJ2hlbGxvJyk7IC8vIGxvZ3MgXCJJIGhlYXJkIGhlbGxvXCIgYW5kIFwiSSBhbHNvIGhlYXJkIGhlbGxvXCJcbiAqIGBgYFxuICpcbiAqIENhbGxzIHRvIGBlbWl0YCB3aWxsIHNlbmQgYWxvbmcgYWxsIG9mIHRoZWlyIGFyZ3VtZW50cy5cbiAqL1xuZXhwb3J0IGNsYXNzIE5vdGlmaWVyIHtcbiAgcHVibGljIGxpc3RlbmVyczogTGlzdGVuZXJbXTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmxpc3RlbmVycyA9IFtdO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIGNhbGxiYWNrIGFzIGEgbGlzdGVuZXIsIHdoaWNoIHdpbGwgYmUgdHJpZ2dlcmVkIHdoZW4gc2VuZGluZ1xuICAgKiBub3RpZmljYXRpb25zLlxuICAgKi9cbiAgYWRkTGlzdGVuZXIobGlzdGVuZXI6IExpc3RlbmVyKTogKCkgPT4gdm9pZCB7XG4gICAgdGhpcy5saXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG5cbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcik7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgbGlzdGVuZXIgc28gdGhhdCBpdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIG5vdGlmaWNhdGlvbnMuXG4gICAqL1xuICByZW1vdmVMaXN0ZW5lcihsaXN0ZW5lcjogTGlzdGVuZXIpOiB2b2lkIHtcbiAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLmxpc3RlbmVycztcblxuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKSB7XG4gICAgICAgIGxpc3RlbmVycy5zcGxpY2UoaSwgMSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTm90aWZ5IHJlZ2lzdGVyZWQgbGlzdGVuZXJzLlxuICAgKi9cbiAgZW1pdCguLi5hcmdzOiB1bmtub3duW10pOiB2b2lkIHtcbiAgICB0aGlzLmxpc3RlbmVycy5zbGljZSgwKS5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoLi4uYXJncykpO1xuICB9XG59XG4iXX0=