const ConnectionObserver = require('.')

/**
 * Responsible for attaching a dispacther to all data events on a socket
 */
class ConnectionObserverFactory
{
  /**
   * @param {Logger} log
   * @param {DispatcherFactory} dispatcherFactory
   * @param {EmitterFactory} emitterFactory
   * @param {ContextFactory} contextFactory
   */
  constructor(log, dispatcherFactory, emitterFactory, contextFactory)
  {
    this.log                = log
    this.dispatcherFactory  = dispatcherFactory
    this.emitterFactory     = emitterFactory
    this.contextFactory     = contextFactory
  }

  /**
   * @returns {ConnectionObserver}
   */
  create()
  {
    const
    emitter     = this.emitterFactory.create(),
    dispatcher  = this.dispatcherFactory.create()

    return new ConnectionObserver(this.log, dispatcher, emitter, this.contextFactory)
  }
}

module.exports = ConnectionObserverFactory