Skip to content

Commit ff0a597

Browse files
committed
chore: bot comment
1 parent 3a7388a commit ff0a597

2 files changed

Lines changed: 36 additions & 4 deletions

File tree

packages/shared/sdk-client/__tests__/datasource/fdv2/StreamingFDv2Base.test.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -825,6 +825,35 @@ it('merges a deferred fallback directive into a successful ping-triggered poll r
825825
base.close();
826826
});
827827

828+
it('backfills the deferred TTL into a ping-triggered poll result that already signals fallback without one', async () => {
829+
const mockEventSource = createMockEventSource();
830+
const mockRequests = createMockRequests(mockEventSource);
831+
const pingHandler: PingHandler = {
832+
handlePing: jest.fn().mockResolvedValue({
833+
type: 'changeSet',
834+
payload: { events: [], selector: undefined },
835+
fdv1Fallback: true,
836+
}),
837+
};
838+
const base = createBase(mockRequests, logger, { pingHandler });
839+
base.start();
840+
841+
mockEventSource.onopen({
842+
type: 'open',
843+
headers: { 'x-ld-fd-fallback': 'true', 'x-ld-fd-fallback-ttl': '75' },
844+
});
845+
846+
const { calls } = mockEventSource.addEventListener.mock;
847+
const pingListener = calls.find((c: any[]) => c[0] === 'ping')?.[1];
848+
await pingListener();
849+
850+
const result = await base.takeResult();
851+
expect(result.fdv1Fallback).toBe(true);
852+
expect(result.fdv1FallbackTtlMs).toBe(75000);
853+
854+
base.close();
855+
});
856+
828857
it('surfaces a deferred fallback directive when a ping-triggered poll throws', async () => {
829858
const mockEventSource = createMockEventSource();
830859
const mockRequests = createMockRequests(mockEventSource);

packages/shared/sdk-client/src/datasource/fdv2/StreamingFDv2Base.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -317,14 +317,17 @@ export function createStreamingBase(config: {
317317
}
318318

319319
// Trust the poll's own fallback signal (e.g. from its own HTTP
320-
// response headers) over a directive deferred at onopen. Only
321-
// backfill from the deferred directive when the poll result doesn't
322-
// already indicate fallback, so an onopen directive still surfaces
323-
// even while ping-triggered polls keep succeeding.
320+
// response headers) over a directive deferred at onopen, so an
321+
// onopen directive still surfaces even while ping-triggered polls
322+
// keep succeeding. Still backfill the TTL alone when the poll's own
323+
// fallback signal did not carry one, so a deferred TTL is not lost
324+
// just because the poll also happened to indicate fallback.
324325
const fallback = resolveFallback();
325326
if (!result.fdv1Fallback && fallback.fdv1Fallback) {
326327
result.fdv1Fallback = true;
327328
result.fdv1FallbackTtlMs = fallback.fdv1FallbackTtlMs;
329+
} else if (result.fdv1Fallback && result.fdv1FallbackTtlMs === undefined) {
330+
result.fdv1FallbackTtlMs = fallback.fdv1FallbackTtlMs;
328331
}
329332
resultQueue.put(result);
330333
} catch (err: any) {

0 commit comments

Comments
 (0)