UNPKG

@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
"use strict"; 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;