From 25a4f5ab6c7311f2e8e5e1a4d232c2820adf910e Mon Sep 17 00:00:00 2001 From: Justin Halsall Date: Thu, 9 Feb 2023 08:48:57 +0100 Subject: [PATCH] [fix] Don't trigger Finish event when in liveMode (#1115) --- packages/rrweb/src/replay/index.ts | 5 ++++- packages/rrweb/test/replayer.test.ts | 29 +++++++++++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/packages/rrweb/src/replay/index.ts b/packages/rrweb/src/replay/index.ts index ce4dc6d8..dabfef88 100644 --- a/packages/rrweb/src/replay/index.ts +++ b/packages/rrweb/src/replay/index.ts @@ -709,7 +709,10 @@ export class Replayer { // events are kept sorted by timestamp, check if this is the last event const last_index = this.service.state.context.events.length - 1; - if (event === this.service.state.context.events[last_index]) { + if ( + !this.config.liveMode && + event === this.service.state.context.events[last_index] + ) { const finish = () => { if (last_index < this.service.state.context.events.length - 1) { // more events have been added since the setTimeout diff --git a/packages/rrweb/test/replayer.test.ts b/packages/rrweb/test/replayer.test.ts index 6d94a47c..900f0eeb 100644 --- a/packages/rrweb/test/replayer.test.ts +++ b/packages/rrweb/test/replayer.test.ts @@ -20,6 +20,7 @@ import StyleSheetTextMutation from './events/style-sheet-text-mutation'; import canvasInIframe from './events/canvas-in-iframe'; import adoptedStyleSheet from './events/adopted-style-sheet'; import adoptedStyleSheetModification from './events/adopted-style-sheet-modification'; +import { ReplayerEvents } from '@rrweb/types'; interface ISuite { code: string; @@ -27,6 +28,9 @@ interface ISuite { page: puppeteer.Page; } +type IWindow = Window & + typeof globalThis & { rrweb: typeof import('../src'); events: typeof events }; + describe('replayer', function () { jest.setTimeout(10_000); @@ -45,7 +49,7 @@ describe('replayer', function () { page = await browser.newPage(); await page.goto('about:blank'); await page.evaluate(code); - await page.evaluate(`let events = ${JSON.stringify(events)}`); + await page.evaluate(`var events = ${JSON.stringify(events)}`); page.on('console', (msg) => console.log('PAGE LOG:', msg.text())); }); @@ -679,6 +683,29 @@ describe('replayer', function () { expect(status).toEqual('live'); }); + it("shouldn't trigger ReplayerEvents.Finish in live mode", async () => { + const status = await page.evaluate((FinishState) => { + return new Promise((resolve) => { + const win = window as IWindow; + let triggeredFinish = false; + const { Replayer } = win.rrweb; + const replayer = new Replayer([], { + liveMode: true, + }); + replayer.on(FinishState, () => { + triggeredFinish = true; + }); + replayer.startLive(); + replayer.addEvent(win.events[0]); + requestAnimationFrame(() => { + resolve(triggeredFinish); + }); + }); + }, ReplayerEvents.Finish); + + expect(status).toEqual(false); + }); + it('replays same timestamp events in correct order', async () => { await page.evaluate(`events = ${JSON.stringify(orderingEvents)}`); await page.evaluate(`