@dynatrace/react-native-plugin
Version:
This plugin gives you the ability to use the Dynatrace Mobile agent in your react native application.
64 lines (63 loc) • 2.84 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports._reportErrorToDynatrace = exports.registerErrorHandler = void 0;
const react_native_1 = require("react-native");
const DynatraceInternal_1 = require("./DynatraceInternal");
const Dynatrace_1 = require("./Dynatrace");
const StringUtils_1 = require("./util/StringUtils");
const ConsoleLogger_1 = require("./logging/ConsoleLogger");
let _isReportFatalErrorAsCrash = true;
const _isReactNativeGlobal = (globalScope) => globalScope.ErrorUtils !== undefined;
const logger = new ConsoleLogger_1.ConsoleLogger('ErrorHandler');
const registerErrorHandler = (reportFatalErrorAsCrash) => {
if (global !== undefined && _isReactNativeGlobal(global)) {
_isReportFatalErrorAsCrash = reportFatalErrorAsCrash;
const oldHandler = global.ErrorUtils.getGlobalHandler();
global.ErrorUtils.setGlobalHandler((error, isFatal) => {
(0, exports._reportErrorToDynatrace)(error, isFatal, oldHandler);
});
const setter = global.ErrorUtils.setGlobalHandler;
global.ErrorUtils.setGlobalHandler = (errorHandler) => {
setter((error, isFatal) => {
(0, exports._reportErrorToDynatrace)(error, isFatal, errorHandler);
});
};
}
};
exports.registerErrorHandler = registerErrorHandler;
const _reportErrorToDynatrace = (exception, isFatal, oldHandler) => {
if (exception != null && isExceptionAnError(exception)) {
if (!StringUtils_1.StringUtils.isStringNullEmptyOrUndefined(exception.name)) {
if (isFatal === undefined) {
isFatal = false;
}
DynatraceInternal_1.DynatraceInternal.reportErrorFromHandler(isFatal, String(exception.name), adjustedReason(exception.message), exception.stack != null ? exception.stack : '', _isReportFatalErrorAsCrash);
logger.debug(`_reportErrorToDynatrace(${exception}, ${isFatal})`);
}
}
else {
Dynatrace_1.Dynatrace.reportError(String(exception), -1);
logger.debug(`_reportErrorToDynatrace(${exception}, -1)`);
}
if (oldHandler !== undefined) {
if (react_native_1.Platform.OS === 'ios') {
setTimeout(() => {
oldHandler(exception, isFatal);
}, 200);
}
else {
oldHandler(exception, isFatal);
}
}
};
exports._reportErrorToDynatrace = _reportErrorToDynatrace;
const adjustedReason = (reason) => {
if (!StringUtils_1.StringUtils.isStringNullEmptyOrUndefined(reason)) {
const reasonNewLineIndex = reason.indexOf('\n');
if (reasonNewLineIndex !== -1) {
reason = reason.substring(0, reasonNewLineIndex);
}
}
return reason;
};
const isExceptionAnError = (exception) => exception.message !== undefined;