github.com/mdaxf/iac@v0.0.0-20240519030858-58a061660378/integration/messagebus/glue/client/src/emitter.js (about) 1 /* 2 * This code lives inside the glue function. 3 */ 4 5 // Source: https://github.com/component/emitter 6 7 8 /** 9 * Expose `Emitter`. 10 */ 11 12 if (typeof module !== 'undefined') { 13 module.exports = Emitter; 14 } 15 16 /** 17 * Initialize a new `Emitter`. 18 * 19 * @api public 20 */ 21 22 function Emitter(obj) { 23 if (obj) return mixin(obj); 24 } 25 26 /** 27 * Mixin the emitter properties. 28 * 29 * @param {Object} obj 30 * @return {Object} 31 * @api private 32 */ 33 34 function mixin(obj) { 35 for (var key in Emitter.prototype) { 36 obj[key] = Emitter.prototype[key]; 37 } 38 return obj; 39 } 40 41 /** 42 * Listen on the given `event` with `fn`. 43 * 44 * @param {String} event 45 * @param {Function} fn 46 * @return {Emitter} 47 * @api public 48 */ 49 50 Emitter.prototype.on = 51 Emitter.prototype.addEventListener = function(event, fn){ 52 this._callbacks = this._callbacks || {}; 53 (this._callbacks['$' + event] = this._callbacks['$' + event] || []) 54 .push(fn); 55 return this; 56 }; 57 58 /** 59 * Adds an `event` listener that will be invoked a single 60 * time then automatically removed. 61 * 62 * @param {String} event 63 * @param {Function} fn 64 * @return {Emitter} 65 * @api public 66 */ 67 68 Emitter.prototype.once = function(event, fn){ 69 function on() { 70 this.off(event, on); 71 fn.apply(this, arguments); 72 } 73 74 on.fn = fn; 75 this.on(event, on); 76 return this; 77 }; 78 79 /** 80 * Remove the given callback for `event` or all 81 * registered callbacks. 82 * 83 * @param {String} event 84 * @param {Function} fn 85 * @return {Emitter} 86 * @api public 87 */ 88 89 Emitter.prototype.off = 90 Emitter.prototype.removeListener = 91 Emitter.prototype.removeAllListeners = 92 Emitter.prototype.removeEventListener = function(event, fn){ 93 this._callbacks = this._callbacks || {}; 94 95 // all 96 if (0 === arguments.length) { 97 this._callbacks = {}; 98 return this; 99 } 100 101 // specific event 102 var callbacks = this._callbacks['$' + event]; 103 if (!callbacks) return this; 104 105 // remove all handlers 106 if (1 == arguments.length) { 107 delete this._callbacks['$' + event]; 108 return this; 109 } 110 111 // remove specific handler 112 var cb; 113 for (var i = 0; i < callbacks.length; i++) { 114 cb = callbacks[i]; 115 if (cb === fn || cb.fn === fn) { 116 callbacks.splice(i, 1); 117 break; 118 } 119 } 120 return this; 121 }; 122 123 /** 124 * Emit `event` with the given args. 125 * 126 * @param {String} event 127 * @param {Mixed} ... 128 * @return {Emitter} 129 */ 130 131 Emitter.prototype.emit = function(event){ 132 this._callbacks = this._callbacks || {}; 133 var args = [].slice.call(arguments, 1), callbacks = this._callbacks['$' + event]; 134 135 if (callbacks) { 136 callbacks = callbacks.slice(0); 137 for (var i = 0, len = callbacks.length; i < len; ++i) { 138 callbacks[i].apply(this, args); 139 } 140 } 141 142 return this; 143 }; 144 145 /** 146 * Return array of callbacks for `event`. 147 * 148 * @param {String} event 149 * @return {Array} 150 * @api public 151 */ 152 153 Emitter.prototype.listeners = function(event){ 154 this._callbacks = this._callbacks || {}; 155 return this._callbacks['$' + event] || []; 156 }; 157 158 /** 159 * Check if this emitter has `event` handlers. 160 * 161 * @param {String} event 162 * @return {Boolean} 163 * @api public 164 */ 165 166 Emitter.prototype.hasListeners = function(event){ 167 return !! this.listeners(event).length; 168 };