Repository URL to install this package:
|
Version:
0.9.2-rc0 ▾
|
// (c) Copyright 2023 Supertenant Ltd. - all rights reserved.
// See LICENSE file in project root for license terms.
'use strict';
/** @type {import('@supertenant/core/src/logger').GenericLogger} */
let logger;
logger = require('../logger').getLogger('util/uncaughtExceptionHandler', newLogger => {
logger = newLogger;
});
const unhandledRejectionEventName = 'unhandledRejection';
let unhandledRejectionDeprecationWarningHasBeenEmitted = false;
/** @type {import('../util/normalizeConfig').CollectorConfig} */
let config;
// see
// https://nodejs.org/api/cli.html#cli_unhandled_rejections_mode /
// https://github.com/nodejs/node/pull/26599
let unhandledRejectionsMode = 'warn/default';
for (let i = 0; i < process.execArgv.length; i++) {
if (process.execArgv[i] === '--unhandled-rejections=none') {
unhandledRejectionsMode = 'none';
} else if (process.execArgv[i] === '--unhandled-rejections=strict') {
unhandledRejectionsMode = 'strict';
}
}
/**
* @typedef {Object} SerializedErrorObject
* @property {string} name
* @property {string} message
* @property {string} stack
*/
/**
* @param {import('../util/normalizeConfig').CollectorConfig} _config
*/
exports.init = function (_config) {
config = _config;
};
exports.activate = function () {
activateUnhandledPromiseRejectionHandling();
};
exports.deactivate = function () {
process.removeListener(unhandledRejectionEventName, onUnhandledRejection);
};
function activateUnhandledPromiseRejectionHandling() {
if (config.reportUnhandledPromiseRejections) {
if (unhandledRejectionsMode === 'strict') {
logger.warn(
'Node.js has been started with --unhandled-rejections=strict, therefore reporting unhandled promise ' +
'rejections will not be enabled.'
);
return;
}
process.on(unhandledRejectionEventName, onUnhandledRejection);
logger.info('Reporting unhandled promise rejections is enabled.');
} else {
logger.info('Reporting unhandled promise rejections is disabled.');
}
}
/**
* @param {Error} reason
*/
function onUnhandledRejection(reason) {
if (unhandledRejectionsMode !== 'none') {
// Best effort to emit the same log messages that Node.js does by default (when no handler for the
// unhandledRejection event is installed.
// eslint-disable-next-line no-console
console.warn('UnhandledPromiseRejectionWarning:', reason);
// eslint-disable-next-line no-console
console.warn(
'UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing ' +
'inside of an async function without a catch block, or by rejecting a promise which was not handled with ' +
'.catch().'
);
if (!unhandledRejectionDeprecationWarningHasBeenEmitted) {
// eslint-disable-next-line no-console
console.warn(
'[DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise ' +
'rejections that are not handled will terminate the Node.js process with a non-zero exit code.'
);
unhandledRejectionDeprecationWarningHasBeenEmitted = true;
}
}
}