Browse Source

Listen only once at server startup

Shun Miyazawa 1 year ago
parent
commit
a593e37ccb

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

@@ -7,7 +7,7 @@ import loggerFactory from '~/utils/logger';
 
 import { RoomPrefix, getRoomNameWithId } from '../util/socket-io-helpers';
 
-import { getYjsConnectionManager } from './yjs-connection-manager';
+import { getYjsConnectionManager, extractPageIdFromYdocId } from './yjs-connection-manager';
 
 
 const expressSession = require('express-session');
@@ -170,6 +170,15 @@ class SocketIoService {
   setupYjsConnection() {
     const yjsConnectionManager = getYjsConnectionManager();
     this.io.on('connection', (socket) => {
+
+      yjsConnectionManager.ysocketioInstance.on('awareness-update', async(update) => {
+        const pageId = extractPageIdFromYdocId(update.name);
+        const awarenessStateSize = update.awareness.states.size;
+        this.io
+          .in(getRoomNameWithId(RoomPrefix.PAGE, pageId))
+          .emit(SocketEventName.YjsAwarenessStateUpdated, awarenessStateSize);
+      });
+
       socket.on(GlobalSocketEventName.YDocSync, async({ pageId, initialValue }) => {
 
         // Emit to the client in the room of the target pageId.
@@ -177,13 +186,6 @@ class SocketIoService {
           .in(getRoomNameWithId(RoomPrefix.PAGE, pageId))
           .emit(SocketEventName.YjsDraftUpdated, CurrentPageYjsDraftData);
 
-        yjsConnectionManager.ysocketio.on('awareness-update', async(update) => {
-          const awarenessStateSize = update.awareness.states.size;
-          this.getDefaultSocket()
-            .in(getRoomNameWithId(RoomPrefix.PAGE, pageId))
-            .emit(SocketEventName.YjsAwarenessStateUpdated, awarenessStateSize);
-        });
-
         try {
           await yjsConnectionManager.handleYDocSync(pageId, initialValue);
         }

+ 5 - 0
apps/app/src/server/service/yjs-connection-manager.ts

@@ -8,6 +8,11 @@ import { getMongoUri } from '../util/mongoose-utils';
 const MONGODB_PERSISTENCE_COLLECTION_NAME = 'yjs-writings';
 const MONGODB_PERSISTENCE_FLUSH_SIZE = 100;
 
+export const extractPageIdFromYdocId = (ydocId: string): string | undefined => {
+  const result = ydocId.match(/yjs\/(.*)/);
+  return result?.[1];
+};
+
 class YjsConnectionManager {
 
   private static instance: YjsConnectionManager;