Current File : //lib/node_modules/pm2/node_modules/@pm2/io/build/main/src/features/notify.js
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const util = require("util");
const semver = require("semver");
const json_1 = require("../utils/json");
const configuration_1 = require("../configuration");
const serviceManager_1 = require("../serviceManager");
const debug_1 = require("debug");
const debug = debug_1.default('axm:notify');
class NotifyOptions {
}
exports.NotifyOptions = NotifyOptions;
exports.NotifyOptionsDefault = {
    level: 'info',
    catchExceptions: true
};
class NotifyFeature {
    constructor() {
        this.options = exports.NotifyOptionsDefault;
        this.levels = ['fatal', 'error', 'warn', 'info', 'debug', 'trace'];
    }
    init(options) {
        if (options) {
            this.options = options;
        }
        configuration_1.default.configureModule({
            error: true
        });
        if (process.env.CATCH_CONTEXT_ON_ERROR === 'true' && (semver.satisfies(process.version, '< 8.0.0') ||
            (semver.satisfies(process.version, '< 10.0.0') && !process.env.FORCE_INSPECTOR))) {
            debug(`Inspector is not available on node version ${process.version} !`);
        }
        if (process.env.CATCH_CONTEXT_ON_ERROR === 'true' && semver.satisfies(process.version, '>= 10.0.0') ||
            (semver.satisfies(process.version, '>= 8.0.0') && process.env.FORCE_INSPECTOR)) {
            debug('Enabling inspector based error reporting');
            const NotifyInspector = require('./notifyInspector').default;
            this.feature = new NotifyInspector();
            this.feature.init(options);
        }
        else {
            this.catchAll();
        }
        return {
            notifyError: this.notifyError
        };
    }
    destroy() {
        if (this.feature) {
            this.feature.destroy();
        }
    }
    notifyError(err, level) {
        if (!(err instanceof Error)) {
            console.trace('[PM2-IO-APM] You should use notify with an Error object');
            return -1;
        }
        if (!level || this.levels.indexOf(level) === -1 && serviceManager_1.ServiceManager.get('transport')) {
            return serviceManager_1.ServiceManager.get('transport').send('process:exception', json_1.default.jsonize(err));
        }
        if (this.levels.indexOf(this.options.level) >= this.levels.indexOf(level) && serviceManager_1.ServiceManager.get('transport')) {
            return serviceManager_1.ServiceManager.get('transport').send('process:exception', json_1.default.jsonize(err));
        }
        return null;
    }
    catchAll(opts) {
        if (opts === undefined) {
            opts = { errors: true };
        }
        if (process.env.exec_mode === 'cluster_mode') {
            return false;
        }
        const self = this;
        function getUncaughtExceptionListener(listener) {
            return function uncaughtListener(err) {
                let error = err && err.stack ? err.stack : err;
                if (listener === 'unhandledRejection') {
                    console.log('You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:');
                }
                console.error(error);
                let errObj;
                if (err) {
                    errObj = self._interpretError(err);
                }
                if (serviceManager_1.ServiceManager.get('transport')) {
                    serviceManager_1.ServiceManager.get('transport').send('process:exception', errObj !== undefined ? errObj : { message: 'No error but ' + listener + ' was caught!' });
                }
                if (!process.listeners(listener).filter(function (listener) {
                    return listener !== uncaughtListener;
                }).length) {
                    if (listener === 'uncaughtException') {
                        process.exit(1);
                    }
                }
            };
        }
        if (opts.errors === true && util.inspect(process.listeners('uncaughtException')).length === 2) {
            process.once('uncaughtException', getUncaughtExceptionListener('uncaughtException'));
            process.once('unhandledRejection', getUncaughtExceptionListener('unhandledRejection'));
        }
        else if (opts.errors === false
            && util.inspect(process.listeners('uncaughtException')).length !== 2) {
            process.removeAllListeners('uncaughtException');
            process.removeAllListeners('unhandledRejection');
        }
    }
    expressErrorHandler() {
        configuration_1.default.configureModule({
            error: true
        });
        return function errorHandler(err, req, res, next) {
            if (res.statusCode < 400)
                res.statusCode = 500;
            err.url = req.url;
            err.component = req.url;
            err.action = req.method;
            err.params = req.body;
            err.session = req.session;
            if (serviceManager_1.ServiceManager.get('transport')) {
                serviceManager_1.ServiceManager.get('transport').send('process:exception', json_1.default.jsonize(err));
            }
            return next(err);
        };
    }
    _interpretError(err) {
        let sErr = {
            message: null,
            stack: null
        };
        if (err instanceof Error) {
            // Error object type processing
            sErr = err;
        }
        else {
            // JSON processing
            sErr.message = err;
            sErr.stack = err;
        }
        return json_1.default.jsonize(sErr);
    }
}
exports.NotifyFeature = NotifyFeature;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2ZlYXR1cmVzL25vdGlmeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLDZCQUE0QjtBQUc1QixpQ0FBZ0M7QUFDaEMsd0NBQXFDO0FBQ3JDLG9EQUE0QztBQUM1QyxzREFBa0Q7QUFFbEQsaUNBQXlCO0FBQ3pCLE1BQU0sS0FBSyxHQUFHLGVBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQTtBQUVqQztDQUdDO0FBSEQsc0NBR0M7QUFFWSxRQUFBLG9CQUFvQixHQUFHO0lBQ2xDLEtBQUssRUFBRSxNQUFNO0lBQ2IsZUFBZSxFQUFFLElBQUk7Q0FDdEIsQ0FBQTtBQVdEO0lBQUE7UUFFVSxZQUFPLEdBQWtCLDRCQUFvQixDQUFBO1FBQzdDLFdBQU0sR0FBa0IsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFBO0lBaUp0RixDQUFDO0lBOUlDLElBQUksQ0FBRSxPQUF1QjtRQUMzQixJQUFJLE9BQU8sRUFBRTtZQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO1NBQ3ZCO1FBRUQsdUJBQWEsQ0FBQyxlQUFlLENBQUM7WUFDNUIsS0FBSyxFQUFHLElBQUk7U0FDYixDQUFDLENBQUE7UUFFRixJQUFJLE9BQU8sQ0FBQyxHQUFHLENBQUMsc0JBQXNCLEtBQUssTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQztZQUM1RixDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRTtZQUN0RixLQUFLLENBQUMsOENBQThDLE9BQU8sQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFBO1NBQ3pF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