"use strict"; /** * @fileOverview Provides easy access to the system bus and provides some helper methods for doing so * @module mixins/bussable * @requires postal * @requires lodash * @requires base */ var bus = require( "postal" ); var Base = require( "../base" ); var sys = require( "lodash" ); /** * @classDesc Provides easy access to the system bus and provides some helper methods for doing so * @exports mixins/bussable * @mixin */ var Bussable = Base.compose( [Base], /** @lends mixins/bussable# */{ declaredClass : "mixins/Bussable", constructor : function () { /** * The list of subscriptions maintained by the mixin * @type {Array} * @memberof mixins/bussable# * @name _subscriptions * @private */ this._subscriptions = {}; this.log.trace( "Bussable constructor" ); }, /** * Subscribe to an event * @param {string} channel The channel to subscribe to * @param {string} topic The topic to subscribe to * @param {callback} callback What to do when you get the event * @returns {object} The subscription definition */ subscribe : function ( channel, topic, callback ) { this.log.trace( "Bussable subscribe" ); var sub = bus.subscribe( {channel : channel, topic : topic, callback : callback} ); this.subscriptions[channel + "." + topic] = sub; return sub; }, /** * Subscribe to an event once * @param {string} channel The channel to subscribe to * @param {string} topic The topic to subscribe to * @param {callback} callback What to do when you get the event * @returns {object} The subscription definition */ once : function ( channel, topic, callback ) { this.log.trace( "Bussable once" ); var sub = this.subscribe( channel, topic, callback ); this.subscriptions[channel + "." + topic] = sub; sub.disposeAfter( 1 ); return sub; }, /** * Publish an event on the system bus * @param {string} channel The channel to publish to * @param {string} topic The topic to publish to * @param {object=} options What to pass to the event */ publish : function ( channel, topic, options ) { this.log.trace( "Bussable publish" ); bus.publish( {channel : channel, topic : topic, data : options} ); }, /** * Get a subscription definition * * @param {string} channel * @param {string} topic * @returns {object=} The subscription definition */ getSubscription : function ( channel, topic ) { this.log.trace( "Bussable getSubscription" ); return this.subscriptions[channel + "." + topic]; }, /** * Gets rid of all subscriptions for this object. * @private */ destroy : function () { this.log.trace( "Bussable destroy" ); sys.each( this.subscriptions, function ( sub ) { sub.unsubscribe(); } ); } } ); module.exports = Bussable;