Shun Miyazawa 2 лет назад
Родитель
Сommit
d2a59963bb

+ 3 - 2
apps/app/src/server/routes/apiv3/page/update-page.ts

@@ -20,7 +20,7 @@ import {
 import type { PageDocument, PageModel } from '~/server/models/page';
 import { configManager } from '~/server/service/config-manager';
 import { preNotifyService } from '~/server/service/pre-notify';
-import { YjsConnectionManager } from '~/server/service/yjs-connection-manager';
+import { getYjsConnectionManager } from '~/server/service/yjs-connection-manager';
 import Xss from '~/services/xss';
 import XssOption from '~/services/xss/xssOption';
 import loggerFactory from '~/utils/logger';
@@ -83,7 +83,8 @@ export const updatePageHandlersFactory: UpdatePageHandlersFactory = (crowi) => {
     // Reflect the updates in ydoc
     const origin = req.body.origin;
     if (origin === Origin.View || origin === undefined) {
-      await YjsConnectionManager().handleYDocUpdate(req.body.pageId, req.body.body);
+      const yjsConnectionManager = getYjsConnectionManager();
+      await yjsConnectionManager.handleYDocUpdate(req.body.pageId, req.body.body);
     }
 
     // persist activity

+ 2 - 2
apps/app/src/server/service/socket-io.js

@@ -5,7 +5,7 @@ import loggerFactory from '~/utils/logger';
 
 import { RoomPrefix, getRoomNameWithId } from '../util/socket-io-helpers';
 
-import { YjsConnectionManager } from './yjs-connection-manager';
+import { getYjsConnectionManager } from './yjs-connection-manager';
 
 const expressSession = require('express-session');
 const passport = require('passport');
@@ -38,7 +38,7 @@ class SocketIoService {
     this.io.attach(server);
 
     // create the YjsConnectionManager instance
-    this.yjsConnectionManager = YjsConnectionManager(this.io);
+    this.yjsConnectionManager = getYjsConnectionManager(this.io);
 
     // create namespace for admin
     this.adminNamespace = this.io.of('/admin');

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

@@ -5,8 +5,6 @@ import * as Y from 'yjs';
 
 import { getMongoUri } from '../util/mongoose-utils';
 
-let instance: YjsConnectionManagerImpl | undefined;
-
 const MONGODB_PERSISTENCE_COLLECTION_NAME = 'yjs-writings';
 const MONGODB_PERSISTENCE_FLUSH_SIZE = 100;
 
@@ -21,11 +19,7 @@ class YjsConnectionManagerImpl implements YjsConnectionManager {
 
   private mdb: MongodbPersistence;
 
-  constructor(io?: Server) {
-    if (io == null) {
-      throw new Error('io is required');
-    }
-
+  constructor(io: Server) {
     this.ysocketio = new YSocketIO(io);
     this.ysocketio.initialize();
 
@@ -35,9 +29,6 @@ class YjsConnectionManagerImpl implements YjsConnectionManager {
     });
 
     this.getCurrentYdoc = this.getCurrentYdoc.bind(this);
-
-    // eslint-disable-next-line @typescript-eslint/no-this-alias
-    instance = this;
   }
 
   public async handleYDocSync(pageId: string, initialValue: string): Promise<void> {
@@ -94,9 +85,19 @@ class YjsConnectionManagerImpl implements YjsConnectionManager {
 
 }
 
-export const YjsConnectionManager = (io?: Server): YjsConnectionManagerImpl => {
+let instance: YjsConnectionManagerImpl | undefined;
+
+// export the singleton instance
+export const getYjsConnectionManager = (io?: Server): YjsConnectionManagerImpl => {
   if (instance != null) {
     return instance;
   }
-  return new YjsConnectionManagerImpl(io);
+
+  if (io == null) {
+    throw new Error("'io' is required if initialize YjsConnectionManager");
+  }
+
+  // Initialize if instance does not exist
+  instance = new YjsConnectionManagerImpl(io);
+  return instance;
 };