Skip to content

Commit 254f4e9

Browse files
committed
fix: also call persist if last call too old
1 parent 6b48d12 commit 254f4e9

File tree

1 file changed

+28
-10
lines changed

1 file changed

+28
-10
lines changed

src/y-socket-io/y-socket-io.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import toobusy from 'toobusy-js'
1616

1717
const logSocketIO = createModuleLogger('@y/socket-io/server')
1818
const 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')
1920
const REVALIDATE_TIMEOUT = number.parseInt(env.getConf('y-socket-io-server-revalidate-timeout') || '60000')
2021
const 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

Comments
 (0)