Просмотр исходного кода

Reflect the latest revision in ydoc

Shun Miyazawa 1 год назад
Родитель
Сommit
1b77aaca28

+ 6 - 3
apps/app/src/server/service/page/index.ts

@@ -4462,9 +4462,12 @@ class PageService implements IPageService {
     const yjsConnectionManager = getYjsConnectionManager();
     await yjsConnectionManager.mdbInstance.clearDocument(pageId);
 
-    // const Revision = mongoose.model<IRevisionHasId>('Revision');
-    // const revision = await Revision.findOne({ pageId }).sort({ createdAt: -1 });
-    // await yjsConnectionManager.handleYDocUpdate(pageId, 'hoge');
+    const Revision = mongoose.model<IRevisionHasId>('Revision');
+    const revision = await Revision.findOne({ pageId }).sort({ createdAt: -1 });
+
+    if (revision != null) {
+      await yjsConnectionManager.handleYDocUpdate(pageId, revision.body);
+    }
   }
 
   async hasRevisionBodyDiff(pageId: string, comparisonTarget?: string): Promise<boolean> {

+ 12 - 9
apps/app/src/server/service/yjs-connection-manager.ts

@@ -59,7 +59,6 @@ class YjsConnectionManager {
     }
 
     const persistedYdoc = await this.getPersistedYdoc(pageId);
-    const persistedStateVector = Y.encodeStateVector(persistedYdoc);
 
     await this.mdb.flushDocument(pageId);
 
@@ -69,13 +68,7 @@ class YjsConnectionManager {
       currentYdoc.getText('codemirror').insert(0, initialValue);
     }
 
-    const diff = Y.encodeStateAsUpdate(currentYdoc, persistedStateVector);
-
-    if (diff.reduce((prev, curr) => prev + curr, 0) > 0) {
-      this.mdb.storeUpdate(pageId, diff);
-    }
-
-    Y.applyUpdate(currentYdoc, Y.encodeStateAsUpdate(persistedYdoc));
+    await this.syncWithPersistedYdoc(pageId, currentYdoc, persistedYdoc);
 
     currentYdoc.on('update', async(update) => {
       await this.mdb.storeUpdate(pageId, update);
@@ -99,7 +92,17 @@ class YjsConnectionManager {
     const currentMarkdownLength = currentYdoc.getText('codemirror').length;
     currentYdoc.getText('codemirror').delete(0, currentMarkdownLength);
     currentYdoc.getText('codemirror').insert(0, newValue);
-    Y.encodeStateAsUpdate(currentYdoc);
+
+    const persistedYdoc = await this.getPersistedYdoc(pageId);
+    await this.syncWithPersistedYdoc(pageId, currentYdoc, persistedYdoc);
+  }
+
+  private async syncWithPersistedYdoc(pageId: string, currentYdoc: Ydoc, persistedYdoc: Y.Doc): Promise<void> {
+    const persistedStateVector = Y.encodeStateVector(persistedYdoc);
+    const diff = Y.encodeStateAsUpdate(currentYdoc, persistedStateVector);
+    if (diff.reduce((prev, curr) => prev + curr, 0) > 0) {
+      await this.mdb.storeUpdate(pageId, diff);
+    }
   }
 
   public getCurrentYdoc(pageId: string): Ydoc | undefined {