From 510bd8ffadb26ab6acc53044af5571b3b18ade31 Mon Sep 17 00:00:00 2001 From: Jackson Huang Date: Wed, 5 Jun 2024 18:01:20 -0700 Subject: [PATCH] fix(rrweb): exteranl function errors should be tagged --- packages/rrweb/src/record/error-handler.ts | 17 +++++++++++++++++ packages/rrweb/src/record/observer.ts | 8 ++++---- 2 files changed, 21 insertions(+), 4 deletions(-) diff --git a/packages/rrweb/src/record/error-handler.ts b/packages/rrweb/src/record/error-handler.ts index 99e392dae7..34b1c0bcec 100644 --- a/packages/rrweb/src/record/error-handler.ts +++ b/packages/rrweb/src/record/error-handler.ts @@ -1,6 +1,8 @@ import type { ErrorHandler } from '../types'; type Callback = (...args: unknown[]) => unknown; +type GenericFunction = (...args: any[]) => any; +type ExternalError = Error & {_external_: boolean} let errorHandler: ErrorHandler | undefined; @@ -34,3 +36,18 @@ export const callbackWrapper = (cb: T): T => { return rrwebWrapped; }; + +export function externalFunctionWrapper(func: T): (...args: Parameters) => ReturnType { + return (...args: Parameters) => { + try { + return func(...args); + } catch (error) { + try { + (error as ExternalError)._external_ = true; + } catch { + // in case we can't assign, don't do anything. + } + throw error + }; +} +} diff --git a/packages/rrweb/src/record/observer.ts b/packages/rrweb/src/record/observer.ts index 327c851d11..d3c7be277d 100644 --- a/packages/rrweb/src/record/observer.ts +++ b/packages/rrweb/src/record/observer.ts @@ -47,7 +47,7 @@ import { patch, throttle, } from '../utils'; -import { callbackWrapper } from './error-handler'; +import { callbackWrapper, externalFunctionWrapper } from './error-handler'; import MutationBuffer from './mutation'; type WindowWithStoredMutationObserver = IWindow & { @@ -665,7 +665,7 @@ function initStyleSheetObserver( adds: [{ rule, index }], }); } - return target.apply(thisArg, argumentsList); + return externalFunctionWrapper(target.apply)(thisArg, argumentsList); }, ), }); @@ -694,7 +694,7 @@ function initStyleSheetObserver( removes: [{ index }], }); } - return target.apply(thisArg, argumentsList); + return externalFunctionWrapper(target.apply)(thisArg, argumentsList); }, ), }); @@ -726,7 +726,7 @@ function initStyleSheetObserver( replace: text, }); } - return target.apply(thisArg, argumentsList); + return externalFunctionWrapper(target.apply)(thisArg, argumentsList); }, ), });