UNPKG

@onehilltech/blueprint

Version:

lightweight, simple, elegant framework for building mean applications

101 lines (89 loc) 2.33 kB
/* * Copyright (c) 2018 One Hill Technologies, LLC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ const { BO } = require ('base-object'); const EventListeners = require ('./event-listeners'); /** * @class Messenger * * Wrapper class for the events.EventEmitter class to that provides more * domain-specific operations. */ module.exports = BO.extend ({ init () { this._super.call (this, ...arguments); this._eventListeners = {}; }, /** * Lookup the event listeners container for an event. * * @param ev The name of the event * @returns {*} */ lookup (ev) { let listeners = this._eventListeners[ev]; if (listeners) return listeners; return this._eventListeners[ev] = new EventListeners ({name: ev}); }, /** * Register a listener with the messenger. * * @param ev * @param listener */ on (ev, listener) { return this.lookup (ev).on (listener); }, /** * Register a listener for a single invocation of an event. * * @param ev * @param listener * @returns {Emitter|*|EventEmitter} */ once (ev, listener) { return this.lookup (ev).once (listener); }, /** * Emit an event to the messenger. The event is sent to all registered * listeners in the messenger. * * @returns {Promise} */ emit () { let [name, ...args] = arguments; let listeners = this._eventListeners[name]; return listeners ? listeners.emit (...args) : Promise.resolve (); }, /** * Get the listeners for an event. * * @param ev * @returns {*} */ getListeners (ev) { return this._eventListeners[ev].listeners; }, /** * Test if the event has listeners. * * @param ev * @returns {boolean} */ hasListeners (ev) { return (ev in this._eventListeners); } });