From 124dd3eb75a7d7ef7babe374eac77c7e4541b199 Mon Sep 17 00:00:00 2001 From: James Berry Date: Tue, 31 Jan 2023 13:53:51 +0000 Subject: [PATCH 1/5] feat/console-plugin/add-unhandledrejection-handler --- .../rrweb/src/plugins/console/record/index.ts | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/packages/rrweb/src/plugins/console/record/index.ts b/packages/rrweb/src/plugins/console/record/index.ts index 47cd513695..0f172fe8d1 100644 --- a/packages/rrweb/src/plugins/console/record/index.ts +++ b/packages/rrweb/src/plugins/console/record/index.ts @@ -132,6 +132,26 @@ function initLogObserver( cancelHandlers.push(() => { if (window) window.removeEventListener('error', errorHandler); }); + const unhandledrejectionHandler = (event: PromiseRejectionEvent) => { + const error = event.reason as Error; + const trace: string[] = ErrorStackParser.parse( + error, + ).map((stackFrame: StackFrame) => stackFrame.toString()); + const payload = [stringify(error.message, logOptions.stringifyOptions)]; + cb({ + level: 'error', + trace, + payload, + }); + }; + window.addEventListener('unhandledrejection', unhandledrejectionHandler); + cancelHandlers.push(() => { + if (window) + window.removeEventListener( + 'unhandledrejection', + unhandledrejectionHandler, + ); + }); } } for (const levelType of logOptions.level) { From 50b930ee776c2aede78527124158977d8a7e2887 Mon Sep 17 00:00:00 2001 From: James Berry Date: Thu, 2 Feb 2023 03:34:23 +0000 Subject: [PATCH 2/5] better error --- packages/rrweb/src/plugins/console/record/index.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/packages/rrweb/src/plugins/console/record/index.ts b/packages/rrweb/src/plugins/console/record/index.ts index 0f172fe8d1..26a22efbe8 100644 --- a/packages/rrweb/src/plugins/console/record/index.ts +++ b/packages/rrweb/src/plugins/console/record/index.ts @@ -133,7 +133,10 @@ function initLogObserver( if (window) window.removeEventListener('error', errorHandler); }); const unhandledrejectionHandler = (event: PromiseRejectionEvent) => { - const error = event.reason as Error; + const error = + event.reason instanceof Error + ? event.reason + : new Error(`Uncaught (in promise) ${event.reason as string}`); const trace: string[] = ErrorStackParser.parse( error, ).map((stackFrame: StackFrame) => stackFrame.toString()); From 01165e81e507880b0679c5a08262b314546fab9e Mon Sep 17 00:00:00 2001 From: Yun Feng Date: Thu, 2 Feb 2023 14:52:34 +1100 Subject: [PATCH 3/5] change the window object to the passed in 'win' --- .../rrweb/src/plugins/console/record/index.ts | 74 +++++++++---------- 1 file changed, 34 insertions(+), 40 deletions(-) diff --git a/packages/rrweb/src/plugins/console/record/index.ts b/packages/rrweb/src/plugins/console/record/index.ts index 26a22efbe8..0ab0dafd2b 100644 --- a/packages/rrweb/src/plugins/console/record/index.ts +++ b/packages/rrweb/src/plugins/console/record/index.ts @@ -114,48 +114,42 @@ function initLogObserver( const cancelHandlers: listenerHandler[] = []; // add listener to thrown errors if (logOptions.level.includes('error')) { - if (window) { - const errorHandler = (event: ErrorEvent) => { - const message = event.message, - error = event.error as Error; - const trace: string[] = ErrorStackParser.parse( - error, - ).map((stackFrame: StackFrame) => stackFrame.toString()); - const payload = [stringify(message, logOptions.stringifyOptions)]; - cb({ - level: 'error', - trace, - payload, - }); - }; - window.addEventListener('error', errorHandler); - cancelHandlers.push(() => { - if (window) window.removeEventListener('error', errorHandler); + const errorHandler = (event: ErrorEvent) => { + const message = event.message, + error = event.error as Error; + const trace: string[] = ErrorStackParser.parse( + error, + ).map((stackFrame: StackFrame) => stackFrame.toString()); + const payload = [stringify(message, logOptions.stringifyOptions)]; + cb({ + level: 'error', + trace, + payload, }); - const unhandledrejectionHandler = (event: PromiseRejectionEvent) => { - const error = - event.reason instanceof Error - ? event.reason - : new Error(`Uncaught (in promise) ${event.reason as string}`); - const trace: string[] = ErrorStackParser.parse( - error, - ).map((stackFrame: StackFrame) => stackFrame.toString()); - const payload = [stringify(error.message, logOptions.stringifyOptions)]; - cb({ - level: 'error', - trace, - payload, - }); - }; - window.addEventListener('unhandledrejection', unhandledrejectionHandler); - cancelHandlers.push(() => { - if (window) - window.removeEventListener( - 'unhandledrejection', - unhandledrejectionHandler, - ); + }; + win.addEventListener('error', errorHandler); + cancelHandlers.push(() => { + win.removeEventListener('error', errorHandler); + }); + const unhandledrejectionHandler = (event: PromiseRejectionEvent) => { + const error = + event.reason instanceof Error + ? event.reason + : new Error(`Uncaught (in promise) ${event.reason as string}`); + const trace: string[] = ErrorStackParser.parse( + error, + ).map((stackFrame: StackFrame) => stackFrame.toString()); + const payload = [stringify(error.message, logOptions.stringifyOptions)]; + cb({ + level: 'error', + trace, + payload, }); - } + }; + win.addEventListener('unhandledrejection', unhandledrejectionHandler); + cancelHandlers.push(() => { + win.removeEventListener('unhandledrejection', unhandledrejectionHandler); + }); } for (const levelType of logOptions.level) { cancelHandlers.push(replace(logger, levelType)); From 69484f4f2d8d9bc39f674d69ca9b7a78bc32a5ac Mon Sep 17 00:00:00 2001 From: James Berry Date: Thu, 2 Feb 2023 04:28:52 +0000 Subject: [PATCH 4/5] empty From 1911f628b00143f463cb5b2d297a5ea0d0a24e7c Mon Sep 17 00:00:00 2001 From: Yun Feng Date: Thu, 2 Feb 2023 15:53:37 +1100 Subject: [PATCH 5/5] improve serialized error messages --- .../rrweb/src/plugins/console/record/index.ts | 22 ++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/packages/rrweb/src/plugins/console/record/index.ts b/packages/rrweb/src/plugins/console/record/index.ts index 0ab0dafd2b..221292c486 100644 --- a/packages/rrweb/src/plugins/console/record/index.ts +++ b/packages/rrweb/src/plugins/console/record/index.ts @@ -132,14 +132,26 @@ function initLogObserver( win.removeEventListener('error', errorHandler); }); const unhandledrejectionHandler = (event: PromiseRejectionEvent) => { - const error = - event.reason instanceof Error - ? event.reason - : new Error(`Uncaught (in promise) ${event.reason as string}`); + let error: Error; + let payload: string[]; + if (event.reason instanceof Error) { + error = event.reason; + payload = [ + stringify( + `Uncaught (in promise) ${error.name}: ${error.message}`, + logOptions.stringifyOptions, + ), + ]; + } else { + error = new Error(); + payload = [ + stringify('Uncaught (in promise)', logOptions.stringifyOptions), + stringify(event.reason, logOptions.stringifyOptions), + ]; + } const trace: string[] = ErrorStackParser.parse( error, ).map((stackFrame: StackFrame) => stackFrame.toString()); - const payload = [stringify(error.message, logOptions.stringifyOptions)]; cb({ level: 'error', trace,