/**
 * Filter for rpc log.
 * Reject rpc request when toobusy
 */
import {getLogger} from 'pinusmod-logger';
import {IRpcFilter} from 'pinusmod-rpc';

let rpcLogger = getLogger('rpc-log', __filename);
let toobusy: any = null;

let DEFAULT_MAXLAG = 70;


export class RpcToobusyFilter implements IRpcFilter {
    constructor(maxLag = DEFAULT_MAXLAG) {
        try {
            toobusy = require('toobusy');
        } catch (e) {
        }
        if (!!toobusy) {
            toobusy.maxLag(maxLag);
        }
    }

    name = 'toobusy';

    /**
     * Before filter for rpc
     */
    before(serverId: string, msg: any, opts: any, next: (target?: Error | string, message?: any, options?: any) => void) {
        opts = opts || {};
        if (!!toobusy && toobusy()) {
            rpcLogger.warn('Server too busy for rpc request, serverId:' + serverId + ' msg: ' + msg);
            let err = new Error('Backend server ' + serverId + ' is too busy now!');
            (err as any).code = 500;
            next(err);
        } else {
            next();
        }
    }
}