From 535f8d1d3edcc302f8e9cbd4359e880bd81053c5 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Wed, 13 Dec 2023 18:35:01 -0500 Subject: [PATCH 1/3] feat(canvas): Bind `mutationCb` outside of `getCanvasManager` From what I can tell, `record` ends up getting bundled separate from `getCanvasManager` in user-land code and canvas mutation events end up not being transmitted. --- packages/rrweb/src/record/index.ts | 70 +++++++++++++++++------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/packages/rrweb/src/record/index.ts b/packages/rrweb/src/record/index.ts index 21da1c633e..15f4b0c041 100644 --- a/packages/rrweb/src/record/index.ts +++ b/packages/rrweb/src/record/index.ts @@ -337,16 +337,14 @@ function record( const processedNodeManager = new ProcessedNodeManager(); - const canvasManager: CanvasManagerInterface = getCanvasManager - ? getCanvasManager({ - recordCanvas, - blockClass, - blockSelector, - unblockSelector, - sampling: sampling['canvas'], - dataURLOptions, - }) - : new CanvasManagerNoop(); + const canvasManager: CanvasManagerInterface = _getCanvasManager(getCanvasManager, { + recordCanvas, + blockClass, + blockSelector, + unblockSelector, + sampling: sampling['canvas'], + dataURLOptions, + }); const shadowDomManager: ShadowDomManagerInterface = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' && @@ -733,27 +731,39 @@ record.takeFullSnapshot = takeFullSnapshot; export default record; -const wrappedCanvasMutationEmit = (p: canvasMutationParam) => - wrappedEmit( - wrapEvent({ - type: EventType.IncrementalSnapshot, - data: { - source: IncrementalSource.CanvasMutation, - ...p, - }, - }), - ); +type PrivateOptions = 'mutationCb' | 'win' | 'mirror'; +type PublicGetCanvasManagerOptions = Omit< + CanvasManagerConstructorOptions, + PrivateOptions +>; + +interface PrivateGetCanvasManagerOptions extends PublicGetCanvasManagerOptions, Pick {} + +function _getCanvasManager( + getCanvasManagerFn: undefined | ((options: PrivateGetCanvasManagerOptions) => CanvasManagerInterface), + options: PublicGetCanvasManagerOptions +) { + return getCanvasManagerFn + ? getCanvasManagerFn({ + ...options, + mirror, + win: window, + mutationCb: (p: canvasMutationParam) => + wrappedEmit( + wrapEvent({ + type: EventType.IncrementalSnapshot, + data: { + source: IncrementalSource.CanvasMutation, + ...p, + }, + }), + ), + }) + : new CanvasManagerNoop(); +} export function getCanvasManager( - options: Omit< - CanvasManagerConstructorOptions, - 'mutationCb' | 'win' | 'mirror' - >, + options: PublicGetCanvasManagerOptions, ): CanvasManagerInterface { - return new CanvasManager({ - ...options, - mutationCb: wrappedCanvasMutationEmit, - win: window, - mirror, - }); + return new CanvasManager(options as CanvasManagerConstructorOptions); } From 3af09c1219354ab5fc89d0cb42629e97799f7d83 Mon Sep 17 00:00:00 2001 From: billyvg Date: Thu, 14 Dec 2023 00:59:52 +0000 Subject: [PATCH 2/3] Apply formatting changes --- packages/rrweb/src/record/index.ts | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/packages/rrweb/src/record/index.ts b/packages/rrweb/src/record/index.ts index 15f4b0c041..d10b07bf93 100644 --- a/packages/rrweb/src/record/index.ts +++ b/packages/rrweb/src/record/index.ts @@ -337,14 +337,17 @@ function record( const processedNodeManager = new ProcessedNodeManager(); - const canvasManager: CanvasManagerInterface = _getCanvasManager(getCanvasManager, { - recordCanvas, - blockClass, - blockSelector, - unblockSelector, - sampling: sampling['canvas'], - dataURLOptions, - }); + const canvasManager: CanvasManagerInterface = _getCanvasManager( + getCanvasManager, + { + recordCanvas, + blockClass, + blockSelector, + unblockSelector, + sampling: sampling['canvas'], + dataURLOptions, + }, + ); const shadowDomManager: ShadowDomManagerInterface = typeof __RRWEB_EXCLUDE_SHADOW_DOM__ === 'boolean' && @@ -737,11 +740,15 @@ type PublicGetCanvasManagerOptions = Omit< PrivateOptions >; -interface PrivateGetCanvasManagerOptions extends PublicGetCanvasManagerOptions, Pick {} +interface PrivateGetCanvasManagerOptions + extends PublicGetCanvasManagerOptions, + Pick {} function _getCanvasManager( - getCanvasManagerFn: undefined | ((options: PrivateGetCanvasManagerOptions) => CanvasManagerInterface), - options: PublicGetCanvasManagerOptions + getCanvasManagerFn: + | undefined + | ((options: PrivateGetCanvasManagerOptions) => CanvasManagerInterface), + options: PublicGetCanvasManagerOptions, ) { return getCanvasManagerFn ? getCanvasManagerFn({ From de4b42dfe08f84cfd6023b9e80a04732f92544af Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Wed, 13 Dec 2023 20:00:16 -0500 Subject: [PATCH 3/3] empty