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  };