File tree Expand file tree Collapse file tree
packages/shared/sdk-client
__tests__/datasource/fdv2 Expand file tree Collapse file tree Original file line number Diff line number Diff 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+
828857it ( 'surfaces a deferred fallback directive when a ping-triggered poll throws' , async ( ) => {
829858 const mockEventSource = createMockEventSource ( ) ;
830859 const mockRequests = createMockRequests ( mockEventSource ) ;
Original file line number Diff line number Diff 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 ) {
You can’t perform that action at this time.
0 commit comments