Home Reference Source Repository

src/component/abstract-component.js

'use strict';

const events = require('../events');

/**
 * Abstract component
 */
class AbstractComponent {
  constructor() {
    this._logger = console;
    this._active = false;
    this._processing = 0;
  }
  
  /**
   * @returns {number}
   */
  get processing() {
    return this._processing;
  }
  
  /**
   * @param {number} interval
   *
   * @returns {Promise}
   */
  waitProcessing(interval = 200) {
    return new Promise(resolve => {
      if (!this.isProcessing) {
        return process.nextTick(() => resolve());
      }
      
      const id = setInterval(() => {
        if (!this.isProcessing) {
          clearInterval(id);
          process.nextTick(() => resolve());
        }
      }, interval);
    });
  }
  
  /**
   * @returns {AbstractComponent}
   */
  removeProcessing() {
    this._processing--;
    
    return this;
  }
  
  /**
   * @returns {AbstractComponent}
   */
  addProcessing() {
    this._processing++;
    
    return this;
  }
  
  /**
   * @returns {boolean}
   */
  get isProcessing() {
    return this.processing > 0;
  }
  
  /**
   * @returns {*}
   */
  get logger() {
    return this._logger;
  }
  
  /**
   * @param {*} logger
   *
   * @returns {AbstractComponent}
   */
  setLogger(logger) {
    this._logger = logger;
    
    return this;
  }
  
  /**
   * @param {boolean} state
   *
   * @returns {AbstractComponent}
   */
  setActive(state) {
    this._active = !!state;
    
    return this;
  }
  
  /**
   * @returns {boolean}
   */
  get isActive() {
    return !!this._active;
  }
  
  /**
   * @throws {Error}
   */
  get name() {
    throw new Error(`${ this.constructor.name }.name not implemented!`);
  }
  
  /**
   * @returns {*}
   */
  get events() {
    return events;
  }

  /**
   * @param {Emitter} emitter
   * 
   * @returns {Promise}
   */
  init(emitter) {
    return Promise.resolve();
  }

  /**
   * @param {Emitter} emitter
   * 
   * @returns {Promise}
   */
  run(emitter) {
    return Promise.resolve();
  }
  
  /**
   * @param {Emitter} emitter
   * 
   * @returns {Promise}
   */
  teardown(emitter) {
    return Promise.resolve();
  }
  
  /**
   * @param {Emitter} emitter
   * 
   * @returns {Promise}
   */
  subscribe(emitter) {
    return Promise.resolve();
  }
  
  /**
   * @returns {Promise}
   */
  ready() {
    return Promise.resolve();
  }
}

module.exports = AbstractComponent;