diff --git a/apps/mobile/src/__tests__/lib/observe.test.ts b/apps/mobile/src/__tests__/lib/observe.test.ts index 80db114..87610a4 100644 --- a/apps/mobile/src/__tests__/lib/observe.test.ts +++ b/apps/mobile/src/__tests__/lib/observe.test.ts @@ -75,12 +75,26 @@ describe('observe', () => { expect.objectContaining({ severity: 'fatal', body: 'boom', - attributes: { isFatal: true }, }) ); expect(previousHandler).toHaveBeenCalledWith(error, true); }); + it('does not log xprem_js_crash for non-fatal errors but still delegates', () => { + const previousHandler = jest.fn(); + const getInstalledHandler = installFakeErrorUtils(previousHandler); + + withFreshObserveModule(({ installObserveGlobalErrorHandler }) => { + installObserveGlobalErrorHandler(); + }); + + const error = new Error('handled'); + getInstalledHandler()(error, false); + + expect(logEventMock).not.toHaveBeenCalled(); + expect(previousHandler).toHaveBeenCalledWith(error, false); + }); + it('still calls the previous handler when Observe.logEvent throws', () => { const previousHandler = jest.fn(); const getInstalledHandler = installFakeErrorUtils(previousHandler); @@ -92,8 +106,8 @@ describe('observe', () => { installObserveGlobalErrorHandler(); }); - getInstalledHandler()(new Error('boom'), false); + getInstalledHandler()(new Error('boom'), true); - expect(previousHandler).toHaveBeenCalledWith(expect.any(Error), false); + expect(previousHandler).toHaveBeenCalledWith(expect.any(Error), true); }); }); diff --git a/apps/mobile/src/lib/observe.ts b/apps/mobile/src/lib/observe.ts index cf4389c..e5397b3 100644 --- a/apps/mobile/src/lib/observe.ts +++ b/apps/mobile/src/lib/observe.ts @@ -50,15 +50,18 @@ export function installObserveGlobalErrorHandler() { const previousHandler = errorUtils.getGlobalHandler(); errorUtils.setGlobalHandler((error, isFatal) => { - try { - const message = error instanceof Error ? error.message : String(error); - Observe.logEvent("xprem_js_crash", { - severity: "fatal", - body: message, - attributes: { isFatal: Boolean(isFatal) }, - }); - } catch (observeError) { - console.warn("[Observe] Failed to log xprem_js_crash:", observeError); + // Only fatal errors count as a crash; non-fatal handled errors would + // otherwise skew update-health tracking. + if (isFatal) { + try { + const message = error instanceof Error ? error.message : String(error); + Observe.logEvent("xprem_js_crash", { + severity: "fatal", + body: message, + }); + } catch (observeError) { + console.warn("[Observe] Failed to log xprem_js_crash:", observeError); + } } previousHandler(error, isFatal);