<commit_before>var TaskQueue = require('tasks-queue');

module.exports = S3Uploader_LimitedQueue;

/**
 * @param {S3Uploader_EventService} emitter
 * @param {S3Uploader_Config.tasks_queue} config
 */
function S3Uploader_LimitedQueue(emitter, config) {

  var self = this;

  /** @type {String} - внутреннее событие для _taskQueue */
  var FILE_ADDED_EVENT = 'file:added';

  /** @type {tasks-queue.TaskQueue} */
  var _taskQueue = new TaskQueue();

  /** @type {Jinn} - вызов jinn.done() завершает обработку текущего события https://github.com/tutukin/tasks-queue */
  var _jinn = null;

  /** @type {{localPath: 'String', fsStats: 'fs.Stats'}} - контекст текущего, обрабатываемого события. */
  var _context = null;

  (function _initialize() {
    _taskQueue.setMinTime(config.defaultInterval);
    _taskQueue.noautostop();
    _taskQueue.execute();
  })();

  (function _eventness() {
    _taskQueue.on(FILE_ADDED_EVENT, raiseMoveNeededEvent)
  })();

  /**
   * @see {S3Uploader_EventService.emitEmergedFileEvent}
   * @listens {S3Uploader_EventType.EMERGED_FILE}
   */
  self.addFileToQueue = function addFileToQueue(localPath, fsStats) {
    _context = {
      'localPath': localPath,
      'fsStats': fsStats
    };
    queue.pushTask(FILE_ADDED_EVENT, _context)
  };

  /**
   * @see {S3Uploader_EventService.emitMoveSucceedEvent}
   * @listens {S3Uploader_EventType.MOVE_SUCCEED}
   */
  self.speedUpProcessing = function speedUpProcessing() {
    // если все ок, то сбрасываем интервал ожидания обработки следующего события и
    // завершает его обработку вызовом _jinn.done()
    _taskQueue.setMinTime(config.defaultInterval);
    _jinn.done();
    _jinn = null;
  };

  /**
   * @see {S3Uploader_EventService.emitMoveFailingEvent}
   * @listens {S3Uploader_EventType.MOVE_FAILING}
   */
  self.slowDownProcessing = function slowDownProcessing() {
    // если ошибка, добавляем таск в конец очереди,
    // чтобы снова попытаться отправить файл в S3
    // и увеличиваем интервал между попытками
    slowDownTaskQueue();
    _taskQueue.pushTask('file:added', _context);
    _jinn.done();
    _jinn = null;
  };

  function raiseMoveNeededEvent(jinn, context) {
    _jinn = jinn;
    _context = context;
    emitter.emitMoveNeededEvent(context.localPath, context.fsStats);
  }

  function slowDownTaskQueue() {
    var retryInterval = config.intervalMultiplier * _taskQueue.getMinTime();
    var isOverInterval = config.maximumInterval < retryInterval;
    retryInterval = (isOverInterval ? config.maximumInterval : retryInterval);
    _taskQueue.setMinTime(retryInterval);
  }
}<commit_msg>New. Доработка алгоритма работы с ограничивающей очередью.<commit_after>var TaskQueue = require('tasks-queue');

module.exports = S3Uploader_LimitedQueue;

/**
 * @param {S3Uploader_EventService} emitter
 * @param {S3Uploader_Config.tasks_queue} config
 */
function S3Uploader_LimitedQueue(emitter, config) {

  var self = this;

  /** @type {String} - внутреннее событие для _taskQueue */
  var FILE_ADDED_EVENT = 'file:added';

  /** @type {tasks-queue.TaskQueue} */
  var _taskQueue = new TaskQueue();

  /** @type {{localPath: 'String', fsStats: 'fs.Stats'}} - контекст текущего, обрабатываемого события. */
  var _eventContext = null;

  /** @type {Jinn} - вызов jinn.done() завершает обработку текущего события https://github.com/tutukin/tasks-queue */
  var _jinn = null;

  (function _initialize() {
    _taskQueue.setMinTime(config.defaultInterval);
    _taskQueue.noautostop();
    _taskQueue.execute();
  })();

  (function _eventness() {
    _taskQueue.on(FILE_ADDED_EVENT, raiseMoveNeededEvent)
  })();

  /**
   * @see {S3Uploader_EventService.emitEmergedFileEvent}
   * @listens {S3Uploader_EventType.EMERGED_FILE}
   */
  self.addFileToQueue = function addFileToQueue(localPath, fsStats) {
    _taskQueue.pushTask(FILE_ADDED_EVENT, { 'localPath': localPath, 'fsStats': fsStats })
  };

  /**
   * @see {S3Uploader_EventService.emitMoveSucceedEvent}
   * @listens {S3Uploader_EventType.MOVE_SUCCEED}
   */
  self.speedUpProcessing = function speedUpProcessing() {
    // если все ок, то сбрасываем интервал ожидания обработки следующего события и
    // завершаем обработку текущего события вызовом _jinn.done()
    _taskQueue.setMinTime(config.defaultInterval);
    _jinn.done();
    _jinn = null;
  };

  /**
   * @see {S3Uploader_EventService.emitMoveFailingEvent}
   * @listens {S3Uploader_EventType.MOVE_FAILING}
   */
  self.slowDownProcessing = function slowDownProcessing() {
    // если ошибка, добавляем таск в конец очереди, чтобы снова попытаться отправить файл в S3
    // увеличиваем интервал между попытками, завершаем обработку текущего события вызовом _jinn.done()
    slowDownTaskQueue();
    _taskQueue.pushTask(FILE_ADDED_EVENT, _eventContext);
    _jinn.done();
    _jinn = null;
  };

  /**
   * @param jinn
   * @param eventContext
   * @listens {FILE_ADDED_EVENT}
   */
  function raiseMoveNeededEvent(jinn, eventContext) {
    _jinn = jinn;
    _eventContext = eventContext;
    emitter.emitMoveNeededEvent(eventContext.localPath, eventContext.fsStats);
  }

  function slowDownTaskQueue() {
    var retryInterval = config.intervalMultiplier * _taskQueue.getMinTime();
    var isOverInterval = config.maximumInterval < retryInterval;
    retryInterval = (isOverInterval ? config.maximumInterval : retryInterval);
    _taskQueue.setMinTime(retryInterval);
  }
}
{'fraction_non_alphanumeric': 0.11662347278785636, 'fraction_numerical': 0.004072565716401333, 'mean_word_length': 4.150619637750238, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 3, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6395377', 'n_tokens_mistral': 1928, 'n_tokens_neox': 1983, 'n_words': 342}