Source: register-callback/modules/register-callback.js

/**
 * @summary register-callback
 * @version 3.0.0
 * @since 1.0.0
 * @author Arian Khosravi <arian.khosravi@aofl.com>
 */


/**
 * RegisterCallback class. It allows callback functions to be registered and called in
 * series when registerCallbackinstance.next is called.
 *
 * @memberof module:@aofl/register-callback
 */
class RegisterCallback {
  /**
   * Creates an instance of RegisterCallback.
   */
  constructor() {
    this.callbacks = [];
  }

  /**
   * When register() is invoked, it adds next and error functions to the callbacks list.
   *
   * @param {Function} cb The callback function is invoked when registerCallbackInstance.next is called.
   * @return {Function}
   */
  register(cb) {
    this.callbacks.push(cb);

    const unsubscribe = () => {
      if (unsubscribe.executed) { return; }
      Object.defineProperty(unsubscribe, 'executed', {
        value: true
      });

      const index = this.callbacks.indexOf(cb);
      /* istanbul ignore else */
      if (index > -1) {
        this.callbacks.splice(index, 1);
      }
    };

    return unsubscribe;
  }

  /**
   * When next() is invoked, it calls all functions in this.callbacks list and passes error and args
   * to each function.
   *
   * @param {Error} [err=null]
   * @param {*} args
   */
  next(err = null, ...args) {
    for (let i = 0; i < this.callbacks.length; i++) {
      this.callbacks[i].call(null, err, ...args);
    }
  }
}

export {
  RegisterCallback
};