@@ -665,7 +665,7 @@ describe("sync driver — streaming pullOnce", () => {
665665 get ( target , prop , receiver ) {
666666 if ( prop === "hasObjects" ) {
667667 return async ( hashes : Uint8Array [ ] ) => {
668- sampledRevs . push ( readWatermark ( b . db , "fetchRev" ) ) ;
668+ sampledRevs . push ( readFetchCursor ( b . db ) . rev ) ;
669669 return Reflect . get ( target , prop , receiver ) . call ( target , hashes ) ;
670670 } ;
671671 }
@@ -684,7 +684,7 @@ describe("sync driver — streaming pullOnce", () => {
684684 expect ( sampledRevs [ i ] ) . toBeGreaterThan ( sampledRevs [ i - 1 ] ) ;
685685 }
686686 // End state still matches the remote.
687- expect ( readWatermark ( b . db , "fetchRev" ) ) . toBe ( remoteFinalRev ) ;
687+ expect ( readFetchCursor ( b . db ) . rev ) . toBe ( remoteFinalRev ) ;
688688 } finally {
689689 a . close ( ) ;
690690 b . close ( ) ;
@@ -798,6 +798,33 @@ describe("sync driver — streaming pullOnce", () => {
798798 b . close ( ) ;
799799 }
800800 } ) ;
801+
802+ it ( "lets a peer push supersede a partial pull cursor" , async ( ) => {
803+ const a = makePeer ( ) ;
804+ const b = makePeer ( ) ;
805+ try {
806+ const providerA = new SQLiteWorkspaceProvider ( a . db , { now : ( ) => 1 } ) ;
807+ const providerB = new SQLiteWorkspaceProvider ( b . db , { now : ( ) => 1 } ) ;
808+ providerA . writeFileSync ( "/before-stale-path.txt" , "pushed" ) ;
809+ const pushedRev = currentRev ( a . db ) ;
810+
811+ writeFetchCursor ( b . db , { rev : pushedRev , path : "/zzzz" } ) ;
812+
813+ expect ( await pushOnce ( a . db , b . rpc ) ) . toBeGreaterThan ( 0 ) ;
814+ expect ( readFetchCursor ( b . db ) ) . toEqual ( { rev : pushedRev , path : null } ) ;
815+ expect ( providerB . readFileSync ( "/before-stale-path.txt" , "utf8" ) ) . toBe ( "pushed" ) ;
816+
817+ providerA . writeFileSync ( "/after-push.txt" , "pulled later" ) ;
818+ const pulled = await pullOnce ( b . db , a . rpc ) ;
819+
820+ expect ( pulled . applied ) . toBe ( 1 ) ;
821+ expect ( providerB . readFileSync ( "/after-push.txt" , "utf8" ) ) . toBe ( "pulled later" ) ;
822+ expect ( readFetchCursor ( b . db ) ) . toEqual ( { rev : currentRev ( a . db ) , path : null } ) ;
823+ } finally {
824+ a . close ( ) ;
825+ b . close ( ) ;
826+ }
827+ } ) ;
801828} ) ;
802829
803830describe ( "sync driver — push atomicity" , ( ) => {
@@ -875,11 +902,11 @@ describe("sync driver — reconcileWatermarks", () => {
875902 // (currentRev = 1 from initializeSchema seeding the root).
876903 const local = new Database ( new SQLiteTestStorage ( ) ) ;
877904 initializeSchema ( local , ( ) => 1000 ) ;
878- writeWatermark ( local , "fetchRev" , 42 ) ;
905+ writeFetchCursor ( local , { rev : 42 , path : null } ) ;
879906 writeWatermark ( local , "pushRev" , 0 ) ;
880907
881908 await reconcileWatermarks ( local , remote . rpc ) ;
882- expect ( readWatermark ( local , "fetchRev" ) ) . toBe ( 0 ) ;
909+ expect ( readFetchCursor ( local ) ) . toEqual ( { rev : 0 , path : null } ) ;
883910 expect ( readWatermark ( local , "pushRev" ) ) . toBe ( 0 ) ;
884911 } finally {
885912 remote . close ( ) ;
@@ -893,7 +920,7 @@ describe("sync driver — reconcileWatermarks", () => {
893920 // which is echoed as appliedPushCursor on the wire, is 0/null.
894921 const local = new Database ( new SQLiteTestStorage ( ) ) ;
895922 initializeSchema ( local , ( ) => 1000 ) ;
896- writeWatermark ( local , "fetchRev" , 0 ) ;
923+ writeFetchCursor ( local , { rev : 0 , path : null } ) ;
897924 writeWatermark ( local , "pushRev" , 17 ) ;
898925
899926 await reconcileWatermarks ( local , remote . rpc ) ;
@@ -913,11 +940,11 @@ describe("sync driver — reconcileWatermarks", () => {
913940 const local = new Database ( new SQLiteTestStorage ( ) ) ;
914941 initializeSchema ( local , ( ) => 1000 ) ;
915942 const remoteCurrent = currentRev ( remote . db ) ;
916- writeWatermark ( local , "fetchRev" , remoteCurrent ) ;
943+ writeFetchCursor ( local , { rev : remoteCurrent , path : null } ) ;
917944 writeWatermark ( local , "pushRev" , 0 ) ;
918945
919946 await reconcileWatermarks ( local , remote . rpc ) ;
920- expect ( readWatermark ( local , "fetchRev" ) ) . toBe ( remoteCurrent ) ;
947+ expect ( readFetchCursor ( local ) ) . toEqual ( { rev : remoteCurrent , path : null } ) ;
921948 expect ( readWatermark ( local , "pushRev" ) ) . toBe ( 0 ) ;
922949 } finally {
923950 remote . close ( ) ;
0 commit comments