From facda2d995e327c8f074642c84e674ee74d21a7d Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 1 Apr 2025 09:40:34 +0200 Subject: [PATCH 1/2] feat(core): Allow delayed sending with offline transport --- packages/core/src/transports/offline.ts | 15 +++++++++++++ .../core/test/lib/transports/offline.test.ts | 21 +++++++++++++++++++ 2 files changed, 36 insertions(+) diff --git a/packages/core/src/transports/offline.ts b/packages/core/src/transports/offline.ts index 0b99baba1e4b..34f8c438529d 100644 --- a/packages/core/src/transports/offline.ts +++ b/packages/core/src/transports/offline.ts @@ -38,8 +38,19 @@ export interface OfflineTransportOptions extends InternalBaseTransportOptions { * @param envelope The envelope that failed to send. * @param error The error that occurred. * @param retryDelay The current retry delay in milliseconds. + * @returns Whether the envelope should be stored. */ shouldStore?: (envelope: Envelope, error: Error, retryDelay: number) => boolean | Promise; + + /** + * Should an attempt be made to send the envelope to Sentry. + * + * If this function is supplied and returns false, `shouldStore` will be called to determine if the envelope should be stored. + * + * @param envelope The envelope that will be sent. + * @returns Whether we should attempt to send the envelope + */ + shouldSend?: (envelope: Envelope) => boolean | Promise; } type Timer = number | { unref?: () => void }; @@ -128,6 +139,10 @@ export function makeOfflineTransport( } try { + if (options.shouldSend && (await options.shouldSend(envelope)) === false) { + throw new Error('Envelope not sent because `shouldSend` callback returned false'); + } + const result = await transport.send(envelope); let delay = MIN_DELAY; diff --git a/packages/core/test/lib/transports/offline.test.ts b/packages/core/test/lib/transports/offline.test.ts index 0dfc550fcd38..fd36f6c7657a 100644 --- a/packages/core/test/lib/transports/offline.test.ts +++ b/packages/core/test/lib/transports/offline.test.ts @@ -353,6 +353,27 @@ describe('makeOfflineTransport', () => { expect(getCalls()).toEqual([]); }); + it('shouldSend can stop envelopes from being sent', async () => { + const { getCalls, store } = createTestStore(); + const { getSendCount, baseTransport } = createTestTransport(new Error()); + let queuedCount = 0; + const transport = makeOfflineTransport(baseTransport)({ + ...transportOptions, + createStore: store, + shouldSend: () => false, + shouldStore: () => { + queuedCount += 1; + return true; + } + }); + const result = transport.send(ERROR_ENVELOPE); + + await expect(result).resolves.toEqual({}); + expect(queuedCount).toEqual(1); + expect(getSendCount()).toEqual(0); + expect(getCalls()).toEqual(['push']); + }); + it('should not store client report envelopes on send failure', async () => { const { getCalls, store } = createTestStore(); const { getSendCount, baseTransport } = createTestTransport(new Error()); From dad169b29263ec3a01c15c7f008d9dce2dd5641c Mon Sep 17 00:00:00 2001 From: Tim Fish Date: Tue, 1 Apr 2025 09:46:16 +0200 Subject: [PATCH 2/2] Lint --- packages/core/test/lib/transports/offline.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/test/lib/transports/offline.test.ts b/packages/core/test/lib/transports/offline.test.ts index fd36f6c7657a..cf3b414c0d0e 100644 --- a/packages/core/test/lib/transports/offline.test.ts +++ b/packages/core/test/lib/transports/offline.test.ts @@ -364,7 +364,7 @@ describe('makeOfflineTransport', () => { shouldStore: () => { queuedCount += 1; return true; - } + }, }); const result = transport.send(ERROR_ENVELOPE);