eventman.js

const Logger = require("./logger");

const manifest = {
	version: '0.1b',
	name: 'org.js.diddle.engine.event'
}
/**
 * @class EventManager
 * @property {EngineScript.Manifest} manifest
 */
class EventManager {

	constructor(diddle) {
		this.diddle = diddle;
		this._eventchannels = {}
		this.log = new Logger(diddle,manifest.name);
		this.manifest = manifest;
	}
	/**
	 * Listen to an event on specified channel.
	 * @param {string} _channel 
	 * @param  {...function} _callbacks 
	 */
	on (_channel,..._callbacks) {
		if (this._eventchannels[_channel] == undefined) {
			this._eventchannels[_channel] = [];
		}
		for ( let i = 0; i < _callbacks.length; i++) {
			this._eventchannels[_channel].push(_callbacks[i]);
		}
		this.log.debug(`added event listener for '${_channel}'`);
	}
	/**
	 * Invoke Event to the specified channel.
	 * @param {string} _channel 
	 * @param {*} _data 
	 */
	call (_channel,_data) {
		if (this._eventchannels[_channel] == undefined) {
			this._eventchannels[_channel] = [];
		}
		this.log.debug(`called event '${_channel}' `,_data || '');
		return new Promise(async (resolve,reject) => {
			let tmpPromise = this._eventchannels[_channel].map(e => new Promise(res => e(this.diddle,_data || null)));

			Promise.all(tmpPromise)
				.then((response) =>
				{
					if (response != undefined && response.stack != undefined)
					{
						reject(response);
					}
					else
					{
						resolve(response == undefined ? null : response);
					}
				})
				.catch(reject);
		})
	}
}
module.exports = EventManager;