101 lines
2.8 KiB
JavaScript
101 lines
2.8 KiB
JavaScript
|
import { defineIntegration, convertIntegrationFnToClass, getClient, captureException } from '@sentry/core';
|
||
|
import { consoleSandbox } from '@sentry/utils';
|
||
|
import { logAndExitProcess } from './utils/errorhandling.js';
|
||
|
|
||
|
const INTEGRATION_NAME = 'OnUnhandledRejection';
|
||
|
|
||
|
const _onUnhandledRejectionIntegration = ((options = {}) => {
|
||
|
const mode = options.mode || 'warn';
|
||
|
|
||
|
return {
|
||
|
name: INTEGRATION_NAME,
|
||
|
// TODO v8: Remove this
|
||
|
setupOnce() {}, // eslint-disable-line @typescript-eslint/no-empty-function
|
||
|
setup(client) {
|
||
|
global.process.on('unhandledRejection', makeUnhandledPromiseHandler(client, { mode }));
|
||
|
},
|
||
|
};
|
||
|
}) ;
|
||
|
|
||
|
const onUnhandledRejectionIntegration = defineIntegration(_onUnhandledRejectionIntegration);
|
||
|
|
||
|
/**
|
||
|
* Global Promise Rejection handler.
|
||
|
* @deprecated Use `onUnhandledRejectionIntegration()` instead.
|
||
|
*/
|
||
|
// eslint-disable-next-line deprecation/deprecation
|
||
|
const OnUnhandledRejection = convertIntegrationFnToClass(
|
||
|
INTEGRATION_NAME,
|
||
|
onUnhandledRejectionIntegration,
|
||
|
)
|
||
|
|
||
|
;
|
||
|
|
||
|
// eslint-disable-next-line deprecation/deprecation
|
||
|
|
||
|
/**
|
||
|
* Send an exception with reason
|
||
|
* @param reason string
|
||
|
* @param promise promise
|
||
|
*
|
||
|
* Exported only for tests.
|
||
|
*/
|
||
|
function makeUnhandledPromiseHandler(
|
||
|
client,
|
||
|
options,
|
||
|
) {
|
||
|
return function sendUnhandledPromise(reason, promise) {
|
||
|
if (getClient() !== client) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
captureException(reason, {
|
||
|
originalException: promise,
|
||
|
captureContext: {
|
||
|
extra: { unhandledPromiseRejection: true },
|
||
|
},
|
||
|
mechanism: {
|
||
|
handled: false,
|
||
|
type: 'onunhandledrejection',
|
||
|
},
|
||
|
});
|
||
|
|
||
|
handleRejection(reason, options);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Handler for `mode` option
|
||
|
|
||
|
*/
|
||
|
function handleRejection(
|
||
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
||
|
reason,
|
||
|
options,
|
||
|
) {
|
||
|
// https://github.com/nodejs/node/blob/7cf6f9e964aa00772965391c23acda6d71972a9a/lib/internal/process/promises.js#L234-L240
|
||
|
const rejectionWarning =
|
||
|
'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().' +
|
||
|
' The promise rejected with the reason:';
|
||
|
|
||
|
/* eslint-disable no-console */
|
||
|
if (options.mode === 'warn') {
|
||
|
consoleSandbox(() => {
|
||
|
console.warn(rejectionWarning);
|
||
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
||
|
console.error(reason && reason.stack ? reason.stack : reason);
|
||
|
});
|
||
|
} else if (options.mode === 'strict') {
|
||
|
consoleSandbox(() => {
|
||
|
console.warn(rejectionWarning);
|
||
|
});
|
||
|
logAndExitProcess(reason);
|
||
|
}
|
||
|
/* eslint-enable no-console */
|
||
|
}
|
||
|
|
||
|
export { OnUnhandledRejection, makeUnhandledPromiseHandler, onUnhandledRejectionIntegration };
|
||
|
//# sourceMappingURL=onunhandledrejection.js.map
|