From c9cde44af12115c320d1c5c06e1ba53ebfbb279c Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Wed, 25 Oct 2023 13:46:56 +0200 Subject: [PATCH] ref: Avoid unnecessary cloning of objects or arrays --- packages/rrweb/src/record/observer.ts | 27 +++++-------------- .../rrweb/src/record/observers/canvas/2d.ts | 2 +- .../record/observers/canvas/serialize-args.ts | 2 +- .../src/record/observers/canvas/webgl.ts | 2 +- 4 files changed, 9 insertions(+), 24 deletions(-) diff --git a/packages/rrweb/src/record/observer.ts b/packages/rrweb/src/record/observer.ts index 69d5f68195..93949e2851 100644 --- a/packages/rrweb/src/record/observer.ts +++ b/packages/rrweb/src/record/observer.ts @@ -430,15 +430,6 @@ function initViewportResizeObserver( return on('resize', updateDimension, win); } -function wrapEventWithUserTriggeredFlag( - v: inputValue, - enable: boolean, -): inputValue { - const value = { ...v }; - if (!enable) delete value.userTriggered; - return value; -} - export const INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT']; const lastInputValueMap: WeakMap = new WeakMap(); function initInputObserver({ @@ -527,10 +518,9 @@ function initInputObserver({ cbWithDedup( target, - callbackWrapper(wrapEventWithUserTriggeredFlag)( - { text, isChecked, userTriggered }, - userTriggeredOnInput, - ), + userTriggeredOnInput + ? { text, isChecked, userTriggered } + : { text, isChecked }, ); // if a radio was checked // the other radios with the same name attribute will be unchecked. @@ -549,14 +539,9 @@ function initInputObserver({ }); cbWithDedup( el, - callbackWrapper(wrapEventWithUserTriggeredFlag)( - { - text, - isChecked: !isChecked, - userTriggered: false, - }, - userTriggeredOnInput, - ), + userTriggeredOnInput + ? { text, isChecked: !isChecked, userTriggered: false } + : { text, isChecked: !isChecked }, ); } }); diff --git a/packages/rrweb/src/record/observers/canvas/2d.ts b/packages/rrweb/src/record/observers/canvas/2d.ts index 09e566e762..cdd4701145 100644 --- a/packages/rrweb/src/record/observers/canvas/2d.ts +++ b/packages/rrweb/src/record/observers/canvas/2d.ts @@ -53,7 +53,7 @@ export default function initCanvas2DMutationObserver( // Using setTimeout as toDataURL can be heavy // and we'd rather not block the main thread setTimeout(() => { - const recordArgs = serializeArgs([...args], win, this); + const recordArgs = serializeArgs(args, win, this); cb(this.canvas, { type: CanvasContext['2D'], property: prop, diff --git a/packages/rrweb/src/record/observers/canvas/serialize-args.ts b/packages/rrweb/src/record/observers/canvas/serialize-args.ts index 8ada721938..809b5c871b 100644 --- a/packages/rrweb/src/record/observers/canvas/serialize-args.ts +++ b/packages/rrweb/src/record/observers/canvas/serialize-args.ts @@ -133,7 +133,7 @@ export const serializeArgs = ( win: IWindow, ctx: RenderingContext, ) => { - return [...args].map((arg) => serializeArg(arg, win, ctx)); + return args.map((arg) => serializeArg(arg, win, ctx)); }; export const isInstanceOfWebGLObject = ( diff --git a/packages/rrweb/src/record/observers/canvas/webgl.ts b/packages/rrweb/src/record/observers/canvas/webgl.ts index 5fb34c1985..d4d597872e 100644 --- a/packages/rrweb/src/record/observers/canvas/webgl.ts +++ b/packages/rrweb/src/record/observers/canvas/webgl.ts @@ -60,7 +60,7 @@ function patchGLPrototype( true, ) ) { - const recordArgs = serializeArgs([...args], win, this); + const recordArgs = serializeArgs(args, win, this); const mutation: canvasMutationWithType = { type, property: prop,