From ab05b77d1e3dace9c6abc47a16ecd4a206cf0dac Mon Sep 17 00:00:00 2001 From: MoumitaM Date: Tue, 30 Jul 2024 11:09:08 +0530 Subject: [PATCH] chore: ignore non-errors while creating error payload --- .../__tests__/errorReporting/utils.test.ts | 8 ---- .../src/errorReporting/event/event.ts | 27 +++++-------- .../src/errorReporting/index.ts | 2 +- .../src/errorReporting/utils.ts | 4 -- .../ErrorHandler/processError.test.ts | 2 +- .../src/services/ErrorHandler/processError.ts | 40 +++++++++---------- 6 files changed, 33 insertions(+), 50 deletions(-) diff --git a/packages/analytics-js-plugins/__tests__/errorReporting/utils.test.ts b/packages/analytics-js-plugins/__tests__/errorReporting/utils.test.ts index 18011e4788..8e9d3f89ba 100644 --- a/packages/analytics-js-plugins/__tests__/errorReporting/utils.test.ts +++ b/packages/analytics-js-plugins/__tests__/errorReporting/utils.test.ts @@ -115,14 +115,6 @@ describe('Error Reporting utilities', () => { expect(isRudderSDKError(event)).toBe(expectedValue); }, ); - - it('should return false if the error message contains "a non-error"', () => { - const event = { - message: 'a non-error', - }; - - expect(isRudderSDKError(event)).toBe(false); - }); }); describe('getErrorContext', () => { diff --git a/packages/analytics-js-plugins/src/errorReporting/event/event.ts b/packages/analytics-js-plugins/src/errorReporting/event/event.ts index 31cd6e00a3..6e4bb48717 100644 --- a/packages/analytics-js-plugins/src/errorReporting/event/event.ts +++ b/packages/analytics-js-plugins/src/errorReporting/event/event.ts @@ -73,14 +73,10 @@ const normaliseError = ( let error; let internalFrames = 0; - const createAndLogInputError = (reason: string) => { + const logInputError = (reason: string) => { const verb = component === 'error cause' ? 'was' : 'received'; if (logger) logger.warn(`${component} ${verb} a non-error: "${reason}"`); - const err = new Error( - `${component} ${verb} a non-error. See "${component}" tab for more detail.`, - ); - err.name = 'InvalidError'; - return err; + return undefined; }; // In some cases: @@ -95,8 +91,7 @@ const normaliseError = ( if (isError(maybeError)) { error = maybeError; } else { - error = createAndLogInputError(typeof maybeError); - internalFrames += 2; + error = logInputError(typeof maybeError); } } else { switch (typeof maybeError) { @@ -107,8 +102,7 @@ const normaliseError = ( internalFrames += 1; break; case 'function': - error = createAndLogInputError('function'); - internalFrames += 2; + error = logInputError('function'); break; case 'object': if (maybeError !== null && isError(maybeError)) { @@ -118,17 +112,15 @@ const normaliseError = ( error.name = maybeError.name || maybeError.errorClass; internalFrames += 1; } else { - error = createAndLogInputError(maybeError === null ? 'null' : 'unsupported object'); - internalFrames += 2; + error = logInputError(maybeError === null ? 'null' : 'unsupported object'); } break; default: - error = createAndLogInputError('nothing'); - internalFrames += 2; + error = logInputError('nothing'); } } - if (!hasStack(error)) { + if (error && !hasStack(error)) { // in IE10/11 a new Error() doesn't have a stacktrace until you throw it, so try that here try { throw error; @@ -137,7 +129,7 @@ const normaliseError = ( error = e; // if the error only got a stacktrace after we threw it here, we know it // will only have one extra internal frame from this function, regardless - // of whether it went through createAndLogInputError() or not + // of whether it went through logInputError() or not internalFrames = 1; } } @@ -166,6 +158,9 @@ class ErrorFormat implements IErrorFormat { component, logger, ); + if (!error) { + return undefined; + } let event; try { const stacktrace = getStacktrace( diff --git a/packages/analytics-js-plugins/src/errorReporting/index.ts b/packages/analytics-js-plugins/src/errorReporting/index.ts index e4ebc2a33d..c26fd242b4 100644 --- a/packages/analytics-js-plugins/src/errorReporting/index.ts +++ b/packages/analytics-js-plugins/src/errorReporting/index.ts @@ -84,7 +84,7 @@ const ErrorReporting = (): ExtensionPlugin => ({ ); // filter errors - if (!isRudderSDKError(errorPayload.errors[0])) { + if (!errorPayload || !isRudderSDKError(errorPayload.errors[0])) { return; } diff --git a/packages/analytics-js-plugins/src/errorReporting/utils.ts b/packages/analytics-js-plugins/src/errorReporting/utils.ts index ff075fa22a..67064228ce 100644 --- a/packages/analytics-js-plugins/src/errorReporting/utils.ts +++ b/packages/analytics-js-plugins/src/errorReporting/utils.ts @@ -144,10 +144,6 @@ const getBugsnagErrorEvent = ( const isRudderSDKError = (event: any) => { const errorOrigin = event.stacktrace?.[0]?.file; - const errorMessage = event.message; - if (errorMessage && typeof errorMessage === 'string' && errorMessage.includes('a non-error')) { - return false; - } if (!errorOrigin || typeof errorOrigin !== 'string') { return false; diff --git a/packages/analytics-js/__tests__/services/ErrorHandler/processError.test.ts b/packages/analytics-js/__tests__/services/ErrorHandler/processError.test.ts index af249ebdd4..81c246313d 100644 --- a/packages/analytics-js/__tests__/services/ErrorHandler/processError.test.ts +++ b/packages/analytics-js/__tests__/services/ErrorHandler/processError.test.ts @@ -95,7 +95,7 @@ describe('ErrorHandler - getNormalizedErrorForUnhandledError', () => { expect(normalizedError).toBeUndefined(); }); - it.skip('should return error instance for Event argument value with SDK script target', () => { + it('should return error instance for Event argument value with SDK script target', () => { const event = new Event('dummyError'); const targetElement = document.createElement('script'); targetElement.dataset.loader = 'RS_JS_SDK'; diff --git a/packages/analytics-js/src/services/ErrorHandler/processError.ts b/packages/analytics-js/src/services/ErrorHandler/processError.ts index 8b329763ce..3f1aebed9c 100644 --- a/packages/analytics-js/src/services/ErrorHandler/processError.ts +++ b/packages/analytics-js/src/services/ErrorHandler/processError.ts @@ -39,26 +39,26 @@ const getNormalizedErrorForUnhandledError = (error: SDKError): SDKError | undefi return error; } // TODO: remove this block once all device mode integrations start using the v3 script loader module (TS) - // if (error instanceof Event) { - // const eventTarget = error.target as ErrorTarget; - // // Discard all the non-script loading errors - // if (eventTarget && eventTarget.localName !== 'script') { - // return undefined; - // } - // // Discard script errors that are not originated at SDK or from native SDKs - // if ( - // eventTarget?.dataset && - // (eventTarget.dataset.loader !== LOAD_ORIGIN || - // eventTarget.dataset.isnonnativesdk !== 'true') - // ) { - // return undefined; - // } - // const errorMessage = `Error in loading a third-party script from URL ${eventTarget?.src} with ID ${eventTarget?.id}.`; - // return Object.create(error, { - // message: { value: errorMessage }, - // }); - // } - return undefined; + if (error instanceof Event) { + const eventTarget = error.target as ErrorTarget; + // Discard all the non-script loading errors + if (eventTarget && eventTarget.localName !== 'script') { + return undefined; + } + // Discard script errors that are not originated at SDK or from native SDKs + if ( + eventTarget?.dataset && + (eventTarget.dataset.loader !== LOAD_ORIGIN || + eventTarget.dataset.isnonnativesdk !== 'true') + ) { + return undefined; + } + const errorMessage = `Error in loading a third-party script from URL ${eventTarget?.src} with ID ${eventTarget?.id}.`; + return Object.create(error, { + message: { value: errorMessage }, + }); + } + return error; } catch (e) { return e; }