@@ -518,6 +518,48 @@ test("does not start a new onStoreDocument if there is already one running (shou
518518 } ) ;
519519} )
520520
521+ test ( "triggers unload only after finishing with a save in progress" , async ( t ) => {
522+ /*
523+ Rough timeline:
524+
525+ 1. ~0ms Client 1 connects
526+ 2. ~10ms Client 1 makes change 1 (triggers debounced save)
527+ 3. ~1000ms Server starts saving change 1 (debounced)
528+ 4. ~1100ms Client 1 disconnects. Document is not unloaded because save is in progress.
529+ 5. ~1500ms Server finishes saving change 1. Document is unloaded
530+ */
531+ await new Promise ( async ( resolve ) => {
532+ const start = Date . now ( )
533+ let saveStarted = false
534+ let saveFinished = false
535+ const server = await newHocuspocus ( {
536+ debounce : 1000 ,
537+ extensions : [ {
538+ async onStoreDocument ( ) {
539+ saveStarted = true
540+ await sleep ( 500 ) // Add pause to simulate long save
541+ saveFinished = true
542+ } ,
543+ async afterUnloadDocument ( data ) {
544+ t . deepEqual ( saveFinished , true , "Unload should occur only after save was finished" ) ;
545+ t . pass ( )
546+ resolve ( "done" ) ;
547+ } ,
548+ } ] ,
549+ } ) ;
550+ const socket1 = newHocuspocusProviderWebsocket ( server ) ;
551+ const provider1 = newHocuspocusProvider ( server , {
552+ websocketProvider : socket1 ,
553+ async onSynced ( ) {
554+ provider1 . document . getArray ( "foo" ) . push ( [ "foo" ] ) ;
555+ setTimeout ( ( ) => { // Wait for sending changes
556+ socket1 . destroy ( ) ;
557+ } , 1100 )
558+ } ,
559+ } ) ;
560+ } )
561+ } )
562+
521563test ( "does not trigger unload prematurely when a save is in progress (unloadImmediately=true)" , async ( t ) => {
522564 /*
523565 Rough timeline:
0 commit comments