From 5dd746bb5e788f476e46ceaf47de2503baf5438c Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Mon, 7 Oct 2024 18:31:54 -0400 Subject: [PATCH 1/2] fix(replay): Try/catch `sendBufferedReplayOrFlush` to prevent cycles It is possible that an error gets thrown outside of flushing (we should be catching exceptions in flush and do no re-throw), which our core SDK error handler would catch due to global rejection handler and trigger replay SDK to flush again. --- .../src/coreHandlers/handleAfterSendEvent.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts b/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts index 74a4f8869d0f..fcba6efa41e6 100644 --- a/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts +++ b/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts @@ -68,10 +68,14 @@ function handleErrorEvent(replay: ReplayContainer, event: ErrorEvent): void { return; } - setTimeout(() => { - // Capture current event buffer as new replay - // This should never reject - // eslint-disable-next-line @typescript-eslint/no-floating-promises - replay.sendBufferedReplayOrFlush(); + setTimeout(async () => { + try { + // Capture current event buffer as new replay + // This should never reject + // eslint-disable-next-line @typescript-eslint/no-floating-promises + await replay.sendBufferedReplayOrFlush(); + } catch (err) { + replay.handleException(err); + } }); } From 0d75613ad8babb8c19a6da9c5f0cce65a44f2261 Mon Sep 17 00:00:00 2001 From: Billy Vong Date: Mon, 7 Oct 2024 18:32:33 -0400 Subject: [PATCH 2/2] remove comments --- .../replay-internal/src/coreHandlers/handleAfterSendEvent.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts b/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts index fcba6efa41e6..956e1fe5c63f 100644 --- a/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts +++ b/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts @@ -71,8 +71,6 @@ function handleErrorEvent(replay: ReplayContainer, event: ErrorEvent): void { setTimeout(async () => { try { // Capture current event buffer as new replay - // This should never reject - // eslint-disable-next-line @typescript-eslint/no-floating-promises await replay.sendBufferedReplayOrFlush(); } catch (err) { replay.handleException(err);