From e40a66db2118a59a09c8e11c17ff3b7db019509c Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 16 Sep 2025 11:20:43 +0200 Subject: [PATCH 1/3] fix(core): Fix error handling when sending envelopes --- packages/core/src/client.ts | 25 +++++++++++++------------ packages/core/test/lib/client.test.ts | 2 +- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts index 88fab9107874..3343ddf5f54a 100644 --- a/packages/core/src/client.ts +++ b/packages/core/src/client.ts @@ -415,10 +415,9 @@ export abstract class Client { env = addItemToEnvelope(env, createAttachmentEnvelopeItem(attachment)); } - const promise = this.sendEnvelope(env); - if (promise) { - promise.then(sendResponse => this.emit('afterSendEvent', event, sendResponse), null); - } + // sendEnvelope should not throw + // eslint-disable-next-line @typescript-eslint/no-floating-promises + this.sendEnvelope(env).then(sendResponse => this.emit('afterSendEvent', event, sendResponse)); } /** @@ -876,16 +875,18 @@ export abstract class Client { public sendEnvelope(envelope: Envelope): PromiseLike { this.emit('beforeEnvelope', envelope); - if (this._isEnabled() && this._transport) { - return this._transport.send(envelope).then(null, reason => { - DEBUG_BUILD && debug.error('Error while sending envelope:', reason); - return reason; - }); + if (!this._isEnabled() || !this._transport) { + DEBUG_BUILD && debug.error('Transport disabled'); + return resolvedSyncPromise({}); } - DEBUG_BUILD && debug.error('Transport disabled'); - - return resolvedSyncPromise({}); + return this._transport.send(envelope).then( + response => response, + reason => { + DEBUG_BUILD && debug.error('Error while sending envelope:', reason); + return {}; + }, + ); } /* eslint-enable @typescript-eslint/unified-signatures */ diff --git a/packages/core/test/lib/client.test.ts b/packages/core/test/lib/client.test.ts index cb44d7212945..b7767a7e6c58 100644 --- a/packages/core/test/lib/client.test.ts +++ b/packages/core/test/lib/client.test.ts @@ -2268,7 +2268,7 @@ describe('Client', () => { expect(mockSend).toBeCalledTimes(1); expect(callback).toBeCalledTimes(1); - expect(callback).toBeCalledWith(errorEvent, 'send error'); + expect(callback).toBeCalledWith(errorEvent, {}); }); it('passes the response to the hook', async () => { From a008c7bc93849117635dc337906cab5aed0687e9 Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 16 Sep 2025 11:31:08 +0200 Subject: [PATCH 2/3] less changes --- packages/core/src/client.ts | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/packages/core/src/client.ts b/packages/core/src/client.ts index 3343ddf5f54a..75a0d5ed49d2 100644 --- a/packages/core/src/client.ts +++ b/packages/core/src/client.ts @@ -875,18 +875,15 @@ export abstract class Client { public sendEnvelope(envelope: Envelope): PromiseLike { this.emit('beforeEnvelope', envelope); - if (!this._isEnabled() || !this._transport) { - DEBUG_BUILD && debug.error('Transport disabled'); - return resolvedSyncPromise({}); - } - - return this._transport.send(envelope).then( - response => response, - reason => { + if (this._isEnabled() && this._transport) { + return this._transport.send(envelope).then(null, reason => { DEBUG_BUILD && debug.error('Error while sending envelope:', reason); return {}; - }, - ); + }); + } + + DEBUG_BUILD && debug.error('Transport disabled'); + return resolvedSyncPromise({}); } /* eslint-enable @typescript-eslint/unified-signatures */ From 42bc9f09bd7953fc850fed543389ee3e92764cdf Mon Sep 17 00:00:00 2001 From: Francesco Novy Date: Tue, 16 Sep 2025 13:25:04 +0200 Subject: [PATCH 3/3] small ref --- .../replay-internal/src/coreHandlers/handleAfterSendEvent.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts b/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts index 827fc6f5b99b..4df1b62532ac 100644 --- a/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts +++ b/packages/replay-internal/src/coreHandlers/handleAfterSendEvent.ts @@ -14,11 +14,10 @@ export function handleAfterSendEvent(replay: ReplayContainer): AfterSendEventCal return; } - const statusCode = sendResponse?.statusCode; + const statusCode = sendResponse.statusCode; // We only want to do stuff on successful error sending, otherwise you get error replays without errors attached - // If not using the base transport, we allow `undefined` response (as a custom transport may not implement this correctly yet) - // If we do use the base transport, we skip if we encountered an non-OK status code + // We skip if we encountered an non-OK status code if (!statusCode || statusCode < 200 || statusCode >= 300) { return; }