@cuboapp/crdt 1.0.16 → 1.0.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/server/index.ts +19 -3
package/package.json
CHANGED
package/src/server/index.ts
CHANGED
|
@@ -597,6 +597,21 @@ export class CuboCrdtServer<M, A = {}, E extends Extract<keyof M, string> = Extr
|
|
|
597
597
|
|
|
598
598
|
let document = this.documents.get(documentName)
|
|
599
599
|
if (document) {
|
|
600
|
+
// Освежаем существующий документ строкой из БД.
|
|
601
|
+
//
|
|
602
|
+
// Раньше документ возвращался как есть, а подписка отправляла клиенту его
|
|
603
|
+
// stateAsUpdate — то есть КЭШ документа, а не только что прочитанную строку.
|
|
604
|
+
// Документ, проспавший мутацию, оставался устаревшим навсегда: даже перезагрузка
|
|
605
|
+
// страницы отдавала старое значение, потому что reconcile брал его же.
|
|
606
|
+
//
|
|
607
|
+
// Стало заметно после того, как документы без подписчиков начали удаляться:
|
|
608
|
+
// документ может быть создан, остаться без подписок, пропустить мутации и
|
|
609
|
+
// «воскреснуть» на новой подписке уже неактуальным.
|
|
610
|
+
//
|
|
611
|
+
// store: false — это не правка от клиента, а синхронизация с БД, писать обратно нечего.
|
|
612
|
+
document.write(row, { expose: 'all', store: false })
|
|
613
|
+
document.setPersistedState(row)
|
|
614
|
+
|
|
600
615
|
return document
|
|
601
616
|
}
|
|
602
617
|
|
|
@@ -650,11 +665,12 @@ export class CuboCrdtServer<M, A = {}, E extends Extract<keyof M, string> = Extr
|
|
|
650
665
|
|
|
651
666
|
if (!existed) {
|
|
652
667
|
this.pushDocumentAction('create', entity, document, document.stateAsUpdate)
|
|
653
|
-
} else {
|
|
654
|
-
document.write(row, { expose: 'all', store: false })
|
|
655
|
-
document.setPersistedState(row)
|
|
656
668
|
}
|
|
657
669
|
|
|
670
|
+
// Для уже существующего документа освежать состояние здесь не нужно —
|
|
671
|
+
// это делает getOrCreateDocument, одинаково для всех путей (рассылка и подписка).
|
|
672
|
+
// write() сам пропускает неизменившиеся ключи, так что лишних update-эвентов нет.
|
|
673
|
+
|
|
658
674
|
if (!this.subscribesByDocument.get(documentName)?.size) {
|
|
659
675
|
this.checkDocumentNeedRemove(documentName)
|
|
660
676
|
}
|