/**
 * Filter for toobusy.
 * if the process is toobusy, just skip the new request
 */
import {getLogger} from 'pinusmod-logger';
import {IHandlerFilter} from '../../interfaces/IHandlerFilter';
import {RouteRecord} from '../../util/constants';
import {HandlerCallback} from '../../common/service/handlerService';
import {FrontendOrBackendSession} from '../../server/server';

let conLogger = getLogger('con-log', __filename);
let toobusy: any = null;
let DEFAULT_MAXLAG = 70;


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

    before(routeRecord: RouteRecord, msg: any, session: FrontendOrBackendSession, next: HandlerCallback) {
        if (!!toobusy && toobusy()) {
            conLogger.warn('[toobusy] reject request msg: ' + msg);
            let err = new Error('Server toobusy!');
            (err as any).code = 500;
            next(err);
        } else {
            next(null);
        }
    }
}