@@ -275,17 +275,15 @@ describe('native client sync behavior', () => {
275275 await expectConverged ( h ) ;
276276 } ) ;
277277
278- it ( 'surfaces a failed native refresh through the sync barrier until a later refresh succeeds ' , async ( ) => {
279- const { server, token } = seedDevice ( [ 'user_1' ] ) ;
278+ it ( 'converges after a failed native refresh' , async ( ) => {
279+ const { server, token, sessionIds } = seedDevice ( [ 'user_1' , 'user_2' ] , 'user_1' ) ;
280280 const h = await start ( { server, jsDeviceToken : token , nativeDeviceToken : token } ) ;
281- const failure = new Error ( 'native refresh failed' ) ;
282281
283- h . native . failNextClientRefresh ( failure ) ;
284- await h . run ( ( ) => h . js . updateProfile ( ) ) ;
285- await expect ( h . run ( ( ) => h . awaitJsToNativeSync ( ) ) ) . rejects . toBe ( failure ) ;
282+ h . native . failNextClientRefresh ( new Error ( 'native refresh failed' ) ) ;
283+ await h . run ( ( ) => h . js . setActive ( { session : sessionIds . user_2 } ) ) ;
284+ await h . settle ( ) ;
286285
287- await h . run ( ( ) => h . js . updateProfile ( ) ) ;
288- await expect ( h . run ( ( ) => h . awaitJsToNativeSync ( ) ) ) . resolves . toBeUndefined ( ) ;
286+ expect ( h . native . activeSessionId ) . toBe ( sessionIds . user_2 ) ;
289287 await expectConverged ( h ) ;
290288 } ) ;
291289
@@ -370,7 +368,6 @@ describe('native client sync behavior', () => {
370368 expect ( await h . jsDeviceToken ( ) ) . toBe ( rotatedToken ) ;
371369 expect ( h . native . token ) . toBe ( token ) ;
372370 expect ( h . nativeModuleCalls . filter ( call => call !== 'configureNative' && call !== 'addListener' ) ) . toEqual ( [ ] ) ;
373- await expect ( h . run ( ( ) => h . awaitJsToNativeSync ( ) ) ) . resolves . toBeUndefined ( ) ;
374371 } ) ;
375372
376373 it ( 'mirrors the shared device token into the app token cache' , async ( ) => {
@@ -397,64 +394,6 @@ describe('native client sync behavior', () => {
397394 } ) ;
398395 } ) ;
399396
400- describe ( 'explicit synchronization barrier (biometric flows)' , ( ) => {
401- it ( 'lets a native operation observe the latest JS state and JS observe the native result' , async ( ) => {
402- const { server, token, sessionIds } = seedDevice ( [ 'user_1' , 'user_2' ] , 'user_1' ) ;
403- const h = await start ( { server, jsDeviceToken : token , nativeDeviceToken : token } ) ;
404-
405- await h . run ( async ( ) => {
406- await h . js . setActive ( { session : sessionIds . user_2 } ) ;
407- await h . awaitJsToNativeSync ( ) ;
408- } ) ;
409- expect ( h . native . activeSessionId ) . toBe ( sessionIds . user_2 ) ;
410-
411- h . native . holdChangeNotifications ( ) ;
412- await h . run ( async ( ) => {
413- await h . native . setActiveSession ( sessionIds . user_1 ) ;
414- await h . pullNativeToJs ( ) ;
415- } ) ;
416- expect ( h . js . session ?. id ) . toBe ( sessionIds . user_1 ) ;
417-
418- await h . run ( ( ) => h . native . releaseChangeNotifications ( ) ) ;
419- await h . settle ( ) ;
420- expect ( h . js . session ?. id ) . toBe ( sessionIds . user_1 ) ;
421- await expectConverged ( h ) ;
422- } ) ;
423-
424- it ( 'lets JS observe a session created by a native sign-in once the pull resolves' , async ( ) => {
425- const h = await start ( ) ;
426-
427- await h . run ( ( ) => h . awaitJsToNativeSync ( ) ) ;
428- h . native . holdChangeNotifications ( ) ;
429- const sessionId = await h . run ( async ( ) => {
430- const createdSessionId = await h . native . signIn ( 'user_1' ) ;
431- await h . pullNativeToJs ( ) ;
432- return createdSessionId ;
433- } ) ;
434-
435- expect ( h . js . client ?. signedInSessions . map ( session => session . id ) ) . toContain ( sessionId ) ;
436- expect ( h . js . session ?. id ) . toBe ( sessionId ) ;
437- } ) ;
438-
439- it ( 'rejects with environment_unavailable when native does not finish a refresh in time' , async ( ) => {
440- const h = await start ( { delayNativeStartup : true } ) ;
441- await h . run ( ( ) => h . js . signIn ( 'user_1' ) ) ;
442-
443- vi . useFakeTimers ( ) ;
444- try {
445- const barrier = expect ( h . awaitJsToNativeSync ( ) ) . rejects . toMatchObject ( { code : 'environment_unavailable' } ) ;
446- await vi . advanceTimersByTimeAsync ( 5_000 ) ;
447- await barrier ;
448- } finally {
449- vi . useRealTimers ( ) ;
450- }
451-
452- await h . run ( ( ) => h . releaseNativeStartup ( ) ) ;
453- await expect ( h . run ( ( ) => h . awaitJsToNativeSync ( ) ) ) . resolves . toBeUndefined ( ) ;
454- await expectConverged ( h ) ;
455- } ) ;
456- } ) ;
457-
458397 describe ( 'without native client sync' , ( ) => {
459398 it . each ( [
460399 [ 'sync is disabled' , { disableNativeClientSync : true } ] ,
0 commit comments