import { ErrorHandlerCallback } from 'react-native/Libraries/vendor/core/ErrorUtils'; import Logger from '../core/logging/logger'; import { isError } from './helpers'; import { reportError } from './reporting'; // Internal variable to keep track of the original error handler. let originalHandler: ErrorHandlerCallback | null = null; // This function is only used in tests to reset the state of the module. export const resetModuleState = () => { originalHandler = null; }; /** * CS error handler which reports fatal errors to cs. */ const csErrorHandler = async ( error: Error, isFatal?: boolean ): Promise => { if (isFatal) { await reportError(error); } }; /** * Adds csErrorHandler to global error handler. */ export const addCsErrorHandler = (): void => { if (!originalHandler) { originalHandler = ErrorUtils.getGlobalHandler(); // Capture the original handler the first time } const wrappedHandler: ErrorHandlerCallback = async ( error: Error, isFatal?: boolean ) => { if (!isError(error)) { originalHandler?.(error, isFatal); return; } await csErrorHandler(error, isFatal); originalHandler?.(error, isFatal); }; ErrorUtils.setGlobalHandler(wrappedHandler); Logger.info('CSErrorHandler is set as JavaScript global error handler.'); }; /** * Restores the original global error handler. */ export const removeCsErrorHandler = (): void => { if (originalHandler) { ErrorUtils.setGlobalHandler(originalHandler); Logger.info('Original JavaScript global error handler has been restored.'); } };