99 lines
2.7 KiB
JavaScript
99 lines
2.7 KiB
JavaScript
|
"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;
|