@@ -16,6 +16,7 @@ import toobusy from 'toobusy-js'
1616
1717const  logSocketIO  =  createModuleLogger ( '@y/socket-io/server' ) 
1818const  PERSIST_INTERVAL  =  number . parseInt ( env . getConf ( 'y-socket-io-server-persist-interval' )  ||  '3000' ) 
19+ const  MAX_PERSIST_INTERVAL  =  number . parseInt ( env . getConf ( 'y-socket-io-server-max-persist-interval' )  ||  '30000' ) 
1920const  REVALIDATE_TIMEOUT  =  number . parseInt ( env . getConf ( 'y-socket-io-server-revalidate-timeout' )  ||  '60000' ) 
2021const  WORKER_DISABLED  =  env . getConf ( 'y-worker-disabled' )  ===  'true' 
2122
@@ -117,6 +118,24 @@ export class YSocketIO {
117118   * @readonly  
118119   */ 
119120  socketUserCache  =  new  Map ( ) 
121+   /** 
122+    * @type  {Map<string, NodeJS.Timeout | null> } 
123+    * @private  
124+    * @readonly  
125+    */ 
126+   debouncedPersistMap  =  new  Map ( ) 
127+   /** 
128+    * @type  {Map<string, Y.Doc> } 
129+    * @private  
130+    * @readonly  
131+    */ 
132+   debouncedPersistDocMap  =  new  Map ( ) 
133+   /** 
134+    * @type  {Map<string, number> } 
135+    * @private  
136+    * @readonly  
137+    */ 
138+   namespacePersistentMap  =  new  Map ( ) 
120139
121140  /** 
122141   * YSocketIO constructor. 
@@ -323,6 +342,7 @@ export class YSocketIO {
323342          this . namespaceMap . delete ( ns ) 
324343          this . namespaceDocMap . get ( ns ) ?. ydoc . destroy ( ) 
325344          this . namespaceDocMap . delete ( ns ) 
345+           this . namespacePersistentMap . delete ( ns ) 
326346        } 
327347      } 
328348    } ) 
@@ -379,6 +399,7 @@ export class YSocketIO {
379399      this . namespaceMap . delete ( namespace ) 
380400      this . namespaceDocMap . get ( namespace ) ?. ydoc . destroy ( ) 
381401      this . namespaceDocMap . delete ( namespace ) 
402+       this . namespacePersistentMap . delete ( namespace ) 
382403    } 
383404
384405    /** @type  {Uint8Array[] } */ 
@@ -429,20 +450,17 @@ export class YSocketIO {
429450      changed  =  getDoc . changed 
430451    } 
431452    assert ( doc ) 
432-     if  ( changed )  this . debouncedPersist ( namespace ,  doc . ydoc ) 
453+     const  lastPersistCalledAt  =  this . namespacePersistentMap . get ( namespace )  ??  0 
454+     const  now  =  Date . now ( ) 
455+     const  shouldPersist  =  now  -  lastPersistCalledAt  >  MAX_PERSIST_INTERVAL 
456+     if  ( changed  ||  shouldPersist )  { 
457+       this . namespacePersistentMap . set ( namespace ,  now ) 
458+       this . debouncedPersist ( namespace ,  doc . ydoc ) 
459+     } 
433460    this . namespaceDocMap . get ( namespace ) ?. ydoc . destroy ( ) 
434461    this . namespaceDocMap . set ( namespace ,  doc ) 
435462  } 
436463
437-   /** 
438-    * @type  {Map<string, NodeJS.Timeout | null> } 
439-    */ 
440-   debouncedPersistMap  =  new  Map ( ) 
441-   /** 
442-    * @type  {Map<string, Y.Doc> } 
443-    */ 
444-   debouncedPersistDocMap  =  new  Map ( ) 
445- 
446464  /** 
447465   * @param  {string } namespace 
448466   * @param  {Y.Doc } doc 
0 commit comments