mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Keep original socket.io server for non-subdir clients
This commit is contained in:
		
							parent
							
								
									ef82e8b0d0
								
							
						
					
					
						commit
						843dd0b1b2
					
				| @ -84,7 +84,6 @@ class Server { | ||||
|     Logger.logManager = new LogManager() | ||||
| 
 | ||||
|     this.server = null | ||||
|     this.io = null | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
| @ -441,18 +440,11 @@ class Server { | ||||
|   async stop() { | ||||
|     Logger.info('=== Stopping Server ===') | ||||
|     Watcher.close() | ||||
|     Logger.info('Watcher Closed') | ||||
| 
 | ||||
|     return new Promise((resolve) => { | ||||
|       SocketAuthority.close((err) => { | ||||
|         if (err) { | ||||
|           Logger.error('Failed to close server', err) | ||||
|         } else { | ||||
|           Logger.info('Server successfully closed') | ||||
|         } | ||||
|         resolve() | ||||
|       }) | ||||
|     }) | ||||
|     Logger.info('[Server] Watcher Closed') | ||||
|     await SocketAuthority.close() | ||||
|     Logger.info('[Server] Closing HTTP Server') | ||||
|     await new Promise((resolve) => this.server.close(resolve)) | ||||
|     Logger.info('[Server] HTTP Server Closed') | ||||
|   } | ||||
| } | ||||
| module.exports = Server | ||||
|  | ||||
| @ -14,7 +14,7 @@ const Auth = require('./Auth') | ||||
| class SocketAuthority { | ||||
|   constructor() { | ||||
|     this.Server = null | ||||
|     this.io = null | ||||
|     this.socketIoServers = [] | ||||
| 
 | ||||
|     /** @type {Object.<string, SocketClient>} */ | ||||
|     this.clients = {} | ||||
| @ -89,25 +89,46 @@ class SocketAuthority { | ||||
|    * | ||||
|    * @param {Function} callback | ||||
|    */ | ||||
|   close(callback) { | ||||
|     Logger.info('[SocketAuthority] Shutting down') | ||||
|     // This will close all open socket connections, and also close the underlying http server
 | ||||
|     if (this.io) this.io.close(callback) | ||||
|     else callback() | ||||
|   async close() { | ||||
|     Logger.info('[SocketAuthority] closing...') | ||||
|     const closePromises = this.socketIoServers.map((io) => { | ||||
|       return new Promise((resolve) => { | ||||
|         Logger.info(`[SocketAuthority] Closing Socket.IO server: ${io.path}`) | ||||
|         io.close(() => { | ||||
|           Logger.info(`[SocketAuthority] Socket.IO server closed: ${io.path}`) | ||||
|           resolve() | ||||
|         }) | ||||
|       }) | ||||
|     }) | ||||
|     await Promise.all(closePromises) | ||||
|     Logger.info('[SocketAuthority] closed') | ||||
|     this.socketIoServers = [] | ||||
|   } | ||||
| 
 | ||||
|   initialize(Server) { | ||||
|     this.Server = Server | ||||
| 
 | ||||
|     this.io = new SocketIO.Server(this.Server.server, { | ||||
|     const socketIoOptions = { | ||||
|       cors: { | ||||
|         origin: '*', | ||||
|         methods: ['GET', 'POST'] | ||||
|       }, | ||||
|       path: `${global.RouterBasePath}/socket.io` | ||||
|     }) | ||||
|       } | ||||
|     } | ||||
| 
 | ||||
|     this.io.on('connection', (socket) => { | ||||
|     const ioServer = new SocketIO.Server(Server.server, socketIoOptions) | ||||
|     ioServer.path = '/socket.io' | ||||
|     this.socketIoServers.push(ioServer) | ||||
| 
 | ||||
|     if (global.RouterBasePath) { | ||||
|       // open a separate socket.io server for the router base path, keeping the original server open for legacy clients
 | ||||
|       const ioBasePath = `${global.RouterBasePath}/socket.io` | ||||
|       const ioBasePathServer = new SocketIO.Server(Server.server, { ...socketIoOptions, path: ioBasePath }) | ||||
|       ioBasePathServer.path = ioBasePath | ||||
|       this.socketIoServers.push(ioBasePathServer) | ||||
|     } | ||||
| 
 | ||||
|     this.socketIoServers.forEach((io) => { | ||||
|       io.on('connection', (socket) => { | ||||
|         this.clients[socket.id] = { | ||||
|           id: socket.id, | ||||
|           socket, | ||||
| @ -115,7 +136,7 @@ class SocketAuthority { | ||||
|         } | ||||
|         socket.sheepClient = this.clients[socket.id] | ||||
| 
 | ||||
|       Logger.info('[SocketAuthority] Socket Connected', socket.id) | ||||
|         Logger.info(`[SocketAuthority] Socket Connected to ${io.path}`, socket.id) | ||||
| 
 | ||||
|         // Required for associating a User with a socket
 | ||||
|         socket.on('auth', (token) => this.authenticateSocket(socket, token)) | ||||
| @ -167,6 +188,7 @@ class SocketAuthority { | ||||
|           socket.emit('pong') | ||||
|         }) | ||||
|       }) | ||||
|     }) | ||||
|   } | ||||
| 
 | ||||
|   /** | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user