Skip to content

Commit 4a129b6

Browse files
committed
Skip retry for auth errors on ingest endpoint
1 parent 1ac8390 commit 4a129b6

File tree

2 files changed

+43
-0
lines changed

2 files changed

+43
-0
lines changed

packages/vercel-flags-core/src/utils/usage-tracker.test.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -416,6 +416,42 @@ describe('UsageTracker', () => {
416416
expect(requestCount).toBe(3);
417417
});
418418

419+
it('should not retry on 401 response', async () => {
420+
const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
421+
422+
fetchMock.mockResolvedValue(new Response(null, { status: 401 }));
423+
424+
const tracker = createTracker();
425+
426+
tracker.trackRead();
427+
await tracker.flush();
428+
429+
expect(fetchMock).toHaveBeenCalledTimes(1);
430+
expect(errorSpy).toHaveBeenCalledWith(
431+
'@vercel/flags-core: Ingest auth error (401), not retrying',
432+
);
433+
434+
errorSpy.mockRestore();
435+
});
436+
437+
it('should not retry on 403 response', async () => {
438+
const errorSpy = vi.spyOn(console, 'error').mockImplementation(() => {});
439+
440+
fetchMock.mockResolvedValue(new Response(null, { status: 403 }));
441+
442+
const tracker = createTracker();
443+
444+
tracker.trackRead();
445+
await tracker.flush();
446+
447+
expect(fetchMock).toHaveBeenCalledTimes(1);
448+
expect(errorSpy).toHaveBeenCalledWith(
449+
'@vercel/flags-core: Ingest auth error (403), not retrying',
450+
);
451+
452+
errorSpy.mockRestore();
453+
});
454+
419455
it('should retry on fetch error and succeed', async () => {
420456
let requestCount = 0;
421457
fetchMock.mockImplementation(async () => {

packages/vercel-flags-core/src/utils/usage-tracker.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -276,6 +276,13 @@ export class UsageTracker {
276276
break; // Break the loop if the request succeeded
277277
}
278278

279+
if (response.status === 401 || response.status === 403) {
280+
console.error(
281+
`@vercel/flags-core: Ingest auth error (${response.status}), not retrying`,
282+
);
283+
return;
284+
}
285+
279286
throw new Error(
280287
`Ingest endpoint responded with status ${response.status} for ${eventsToSend.length} events on request ${response.headers.get('x-vercel-id')}.\n` +
281288
`Response body: ${await response.text().catch(() => null)}`,

0 commit comments

Comments
 (0)