From b7f778d686d4f321795575aaab1f22d55907510a Mon Sep 17 00:00:00 2001 From: Aishanee Shah Date: Tue, 10 Mar 2026 02:39:34 +0000 Subject: [PATCH] feat(core): add 'Incomplete JSON segment' to retryable errors --- packages/core/src/utils/retry.test.ts | 19 +++++++++++++++++++ packages/core/src/utils/retry.ts | 9 +++++++-- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/packages/core/src/utils/retry.test.ts b/packages/core/src/utils/retry.test.ts index f63a5ed723..77fce2a1cb 100644 --- a/packages/core/src/utils/retry.test.ts +++ b/packages/core/src/utils/retry.test.ts @@ -350,6 +350,25 @@ describe('retryWithBackoff', () => { expect(mockFn).toHaveBeenCalledTimes(2); }); + it("should retry on 'Incomplete JSON segment' when retryFetchErrors is true", async () => { + const mockFn = vi.fn(); + mockFn.mockRejectedValueOnce( + new Error('Incomplete JSON segment at the end'), + ); + mockFn.mockResolvedValueOnce('success'); + + const promise = retryWithBackoff(mockFn, { + retryFetchErrors: true, + initialDelayMs: 10, + }); + + await vi.runAllTimersAsync(); + + const result = await promise; + expect(result).toBe('success'); + expect(mockFn).toHaveBeenCalledTimes(2); + }); + it('should retry on common network error codes (ECONNRESET)', async () => { const mockFn = vi.fn(); const error = new Error('read ECONNRESET'); diff --git a/packages/core/src/utils/retry.ts b/packages/core/src/utils/retry.ts index a16e823e74..8ce8e1934a 100644 --- a/packages/core/src/utils/retry.ts +++ b/packages/core/src/utils/retry.ts @@ -100,6 +100,7 @@ function getNetworkErrorCode(error: unknown): string | undefined { } const FETCH_FAILED_MESSAGE = 'fetch failed'; +const INCOMPLETE_JSON_MESSAGE = 'incomplete json segment'; /** * Default predicate function to determine if a retry should be attempted. @@ -119,8 +120,12 @@ export function isRetryableError( } if (retryFetchErrors && error instanceof Error) { - // Check for generic fetch failed message (case-insensitive) - if (error.message.toLowerCase().includes(FETCH_FAILED_MESSAGE)) { + const lowerMessage = error.message.toLowerCase(); + // Check for generic fetch failed message or incomplete JSON segment (common stream error) + if ( + lowerMessage.includes(FETCH_FAILED_MESSAGE) || + lowerMessage.includes(INCOMPLETE_JSON_MESSAGE) + ) { return true; } }