From 205480f9dcf1cf211bd6e45e71d0b514880be24a Mon Sep 17 00:00:00 2001 From: Vadim Korolik Date: Fri, 17 Jun 2022 12:24:19 -0700 Subject: [PATCH] improve error handling in rrdom During live mode, we encounter rrdom errors related to the replay of iframes. Ensure we handle these errors correctly rather than crashing. --- packages/rrdom/package.json | 2 +- packages/rrdom/src/diff.ts | 16 ++++++++-------- packages/rrweb/package.json | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/rrdom/package.json b/packages/rrdom/package.json index cff62be9..0e7f747d 100644 --- a/packages/rrdom/package.json +++ b/packages/rrdom/package.json @@ -1,6 +1,6 @@ { "name": "@highlight-run/rrdom", - "version": "0.1.8", + "version": "0.1.9", "scripts": { "dev": "rollup -c -w", "bundle": "rollup --config", diff --git a/packages/rrdom/src/diff.ts b/packages/rrdom/src/diff.ts index 900d7d61..e0f097f1 100644 --- a/packages/rrdom/src/diff.ts +++ b/packages/rrdom/src/diff.ts @@ -283,22 +283,22 @@ function diffChildren( ) { try { parentNode.insertBefore(oldStartNode, oldEndNode.nextSibling); + } catch (e) { + console.error(e, parentNode, oldStartNode, oldEndNode); diff(oldStartNode, newEndNode, replayer, rrnodeMirror); oldStartNode = oldChildren[++oldStartIndex]; newEndNode = newChildren[--newEndIndex]; - } catch (e) { - console.error(e, parentNode, oldStartNode, oldEndNode); } } else if ( replayer.mirror.getId(oldEndNode) === rrnodeMirror.getId(newStartNode) ) { try { parentNode.insertBefore(oldEndNode, oldStartNode); + } catch (e) { + console.error(e, parentNode, oldEndNode, oldStartNode); diff(oldEndNode, newStartNode, replayer, rrnodeMirror); oldEndNode = oldChildren[--oldEndIndex]; newStartNode = newChildren[++newStartIndex]; - } catch (e) { - console.error(e, parentNode, oldEndNode, oldStartNode); } } else { if (!oldIdToIndex) { @@ -314,10 +314,10 @@ function diffChildren( const nodeToMove = oldChildren[indexInOld]!; try { parentNode.insertBefore(nodeToMove, oldStartNode); - diff(nodeToMove, newStartNode, replayer, rrnodeMirror); - oldChildren[indexInOld] = undefined; } catch (e) { console.error(e, parentNode, nodeToMove, oldStartNode); + diff(nodeToMove, newStartNode, replayer, rrnodeMirror); + oldChildren[indexInOld] = undefined; } } else { const newNode = createOrGetNode( @@ -341,9 +341,9 @@ function diffChildren( } try { parentNode.insertBefore(newNode, oldStartNode || null); - diff(newNode, newStartNode, replayer, rrnodeMirror); } catch (e) { console.error(e, parentNode, newNode, oldStartNode || null); + diff(newNode, newStartNode, replayer, rrnodeMirror); } } newStartNode = newChildren[++newStartIndex]; @@ -367,9 +367,9 @@ function diffChildren( ); try { parentNode.insertBefore(newNode, referenceNode); - diff(newNode, newChildren[newStartIndex], replayer, rrnodeMirror); } catch (e) { console.error(e, parentNode, newNode, referenceNode); + diff(newNode, newChildren[newStartIndex], replayer, rrnodeMirror); } } } else if (newStartIndex > newEndIndex) { diff --git a/packages/rrweb/package.json b/packages/rrweb/package.json index 1c508245..a0ab5b3a 100644 --- a/packages/rrweb/package.json +++ b/packages/rrweb/package.json @@ -1,6 +1,6 @@ { "name": "@highlight-run/rrweb", - "version": "2.0.9", + "version": "2.0.10", "description": "record and replay the web", "scripts": { "prepare": "npm run prepack",