repo_description: Premium Queue package for handling distributed jobs and messages in NodeJS.
repo_topics: job job-queue message message-queue nodejs priority queue rate-limiter scheduler
code: 'use strict';
  const errorObject = { value: null };
  function tryCatch(fn, ctx, args) {
    try {
      return fn.apply(ctx, args);
    } catch (e) {
      errorObject.value = e;
      return errorObject;
    }
  }
  
  /**
   * Waits for a redis client to be ready.
   * @param {Redis} redis client
   */
  function isRedisReady(client) {
    return new Promise((resolve, reject) => {
      if (client.status === 'ready') {
        resolve();
      } else {
        function handleReady() {
          client.removeListener('end', handleEnd);
          client.removeListener('error', handleError);
          resolve();
        }
  
        let lastError;
        function handleError(err) {
          lastError = err;
        }
  
        function handleEnd() {
          client.removeListener('ready', handleReady);
          client.removeListener('error', handleError);
          reject(lastError);
        }
  
        client.once('ready', handleReady);
        client.on('error', handleError);
        client.once('end', handleEnd);
      }
    });
  }
  
  module.exports.errorObject = errorObject;
  module.exports.tryCatch = tryCatch;
  module.exports.isRedisReady = isRedisReady;
  module.exports.emitSafe = function(emitter, event, ...args) {
    try {
      return emitter.emit(event, ...args);
    } catch (err) {
      try {
        return emitter.emit('error', err);
      } catch (err) {
        // We give up if the error event also throws an exception.
        console.error(err);
      }
    }
  };
  
  module.exports.MetricsTime = {
    ONE_MINUTE: 1,
    FIVE_MINUTES: 5,
    FIFTEEN_MINUTES: 15,
    THIRTY_MINUTES: 30,
    ONE_HOUR: 60,
    ONE_WEEK: 60 * 24 * 7,
    TWO_WEEKS: 60 * 24 * 7 * 2,
    ONE_MONTH: 60 * 24 * 7 * 2 * 4
  };
  