@cuboapp/crdt 1.0.16 → 1.0.17

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cuboapp/crdt",
3
- "version": "1.0.16",
3
+ "version": "1.0.17",
4
4
  "description": "CRDT for CUBO",
5
5
  "main": "src/index.ts",
6
6
  "repository": {
@@ -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
  }