"use strict";

/**
 * Filter for rpc log.
 * Reject rpc request when toobusy
 * @access private
 */
const rpcLogger = require('@sex-pomelo/sex-pomelo-logger').getLogger('rpc-log', __filename);
let toobusy = null;

const DEFAULT_MAXLAG = 70;

module.exports = function(maxLag) {
  return new FilterToobusy(maxLag || DEFAULT_MAXLAG);
};

/**
 * @class
 * @implements {Filter}
 */
let FilterToobusy = function(maxLag) {
  try {
    toobusy = require('toobusy');
  } catch(e) {
  }
  if(!!toobusy) {
    toobusy.maxLag(maxLag);
  }
};

FilterToobusy.prototype.name = 'toobusy';

/**
 * Before filter for rpc
 */
FilterToobusy.prototype.before = function(serverId, msg, opts, next) {
  opts = opts||{};
  if (!!toobusy && toobusy()) {
    rpcLogger.warn('Server too busy for rpc request, serverId:' + serverId + ' msg: ' + msg);
    var err =  new Error('Backend server ' + serverId + ' is too busy now!');
    err.code = 500;
    next(err);
  } else {
    next();
  }
};