@absolunet/ioc2.1.0

View on GitHub

events/services/Dispatcher/drivers/PubSubJsDriver.js

//--------------------------------------------------------
//-- Node IoC - Events - Services - Dispatcher - Drivers - PubSubJS Driver
//--------------------------------------------------------

import __     from '@absolunet/private-registry';
import PubSub from 'pubsub-js';
import Driver from './Driver';


/**
 * Dispatcher driver that uses PubSubJS as dispatcher engine.
 *
 * @memberof events.services.Dispatcher.drivers
 * @augments events.services.Dispatcher.drivers.Driver
 * @hideconstructor
 */
class PubSubJsDriver extends Driver {

	/**
	 * @inheritdoc
	 * @private
	 */
	init() {
		__(this).set('tokens', {});
		this.setEngine(PubSub);
	}

	/**
	 * @inheritdoc
	 */
	on(event, listener) {
		this.saveTokenForCall(event, listener, 'subscribe');

		return this;
	}

	/**
	 * @inheritdoc
	 */
	once(event, listener) {
		this.saveTokenForCall(event, listener, 'subscribeOnce');

		return this;
	}

	/**
	 * @inheritdoc
	 */
	off(event, listener) {
		const tokenMap = __(this).get('tokens')[event];

		if (tokenMap) {
			const token = tokenMap.get(listener);

			if (token) {
				this.engine.unsubscribe(token);
			}
		}

		return this;
	}

	/**
	 * @inheritdoc
	 */
	removeListeners(event) {
		this.engine.clearSubscriptions(event);

		return this;
	}

	/**
	 * @inheritdoc
	 */
	removeAllListeners() {
		this.engine.clearAllSubscriptions();

		return this;
	}

	/**
	 * @inheritdoc
	 */
	emit(event, payload) {
		this.engine.publishSync(event, payload);

		return this;
	}

	/**
	 * Save token got from the given call on the engine.
	 *
	 * @param {string} event - The event to listen.
	 * @param {Function} listener - The listener.
	 * @param {string} method - The method to use on the engine.
	 * @returns {events.services.Dispatcher.drivers.PubSubJsDriver} The current driver instance.
	 */
	saveTokenForCall(event, listener, method) {
		const tokens = __(this).get('tokens');
		tokens[event] = tokens[event] || new Map();
		tokens[event].set(listener, this.engine[method](event, listener));

		return this;
	}

}


export default PubSubJsDriver;