Fix socket notification with multiple user tabs
authorChocobozzz <me@florianbigard.com>
Thu, 22 Aug 2019 08:33:22 +0000 (10:33 +0200)
committerChocobozzz <me@florianbigard.com>
Thu, 22 Aug 2019 08:33:58 +0000 (10:33 +0200)
server/lib/peertube-socket.ts

index eb84ecd4bbb134a3216f2ca62576b9459f0a7274..17748fd1813186509ab5c63a54ebfc8771475703 100644 (file)
@@ -8,7 +8,7 @@ class PeerTubeSocket {
 
   private static instance: PeerTubeSocket
 
-  private userNotificationSockets: { [ userId: number ]: SocketIO.Socket } = {}
+  private userNotificationSockets: { [ userId: number ]: SocketIO.Socket[] } = {}
 
   private constructor () {}
 
@@ -22,22 +22,26 @@ class PeerTubeSocket {
 
         logger.debug('User %d connected on the notification system.', userId)
 
-        this.userNotificationSockets[userId] = socket
+        if (!this.userNotificationSockets[userId]) this.userNotificationSockets[userId] = []
+
+        this.userNotificationSockets[userId].push(socket)
 
         socket.on('disconnect', () => {
           logger.debug('User %d disconnected from SocketIO notifications.', userId)
 
-          delete this.userNotificationSockets[userId]
+          this.userNotificationSockets[userId] = this.userNotificationSockets[userId].filter(s => s !== socket)
         })
       })
   }
 
   sendNotification (userId: number, notification: UserNotificationModel) {
-    const socket = this.userNotificationSockets[userId]
+    const sockets = this.userNotificationSockets[userId]
 
-    if (!socket) return
+    if (!sockets) return
 
-    socket.emit('new-notification', notification.toFormattedJSON())
+    for (const socket of sockets) {
+      socket.emit('new-notification', notification.toFormattedJSON())
+    }
   }
 
   static get Instance () {