mirror of https://github.com/Chocobozzz/PeerTube
				
				
				
			
		
			
				
	
	
		
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			TypeScript
		
	
	
| import * as SocketIO from 'socket.io'
 | |
| import { authenticateSocket } from '../middlewares'
 | |
| import { logger } from '../helpers/logger'
 | |
| import { Server } from 'http'
 | |
| import { UserNotificationModelForApi } from '@server/typings/models/user'
 | |
| 
 | |
| class PeerTubeSocket {
 | |
| 
 | |
|   private static instance: PeerTubeSocket
 | |
| 
 | |
|   private userNotificationSockets: { [ userId: number ]: SocketIO.Socket[] } = {}
 | |
| 
 | |
|   private constructor () {}
 | |
| 
 | |
|   init (server: Server) {
 | |
|     const io = SocketIO(server)
 | |
| 
 | |
|     io.of('/user-notifications')
 | |
|       .use(authenticateSocket)
 | |
|       .on('connection', socket => {
 | |
|         const userId = socket.handshake.query.user.id
 | |
| 
 | |
|         logger.debug('User %d connected on the notification system.', userId)
 | |
| 
 | |
|         if (!this.userNotificationSockets[userId]) this.userNotificationSockets[userId] = []
 | |
| 
 | |
|         this.userNotificationSockets[userId].push(socket)
 | |
| 
 | |
|         socket.on('disconnect', () => {
 | |
|           logger.debug('User %d disconnected from SocketIO notifications.', userId)
 | |
| 
 | |
|           this.userNotificationSockets[userId] = this.userNotificationSockets[userId].filter(s => s !== socket)
 | |
|         })
 | |
|       })
 | |
|   }
 | |
| 
 | |
|   sendNotification (userId: number, notification: UserNotificationModelForApi) {
 | |
|     const sockets = this.userNotificationSockets[userId]
 | |
| 
 | |
|     if (!sockets) return
 | |
| 
 | |
|     const notificationMessage = notification.toFormattedJSON()
 | |
|     for (const socket of sockets) {
 | |
|       socket.emit('new-notification', notificationMessage)
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   static get Instance () {
 | |
|     return this.instance || (this.instance = new this())
 | |
|   }
 | |
| }
 | |
| 
 | |
| // ---------------------------------------------------------------------------
 | |
| 
 | |
| export {
 | |
|   PeerTubeSocket
 | |
| }
 |