Browse Source

fix(WS): 'SOCKETS_LEAVE_SONG_ROOMS' and 'EMIT_TO_ROOM' now resolve correctly

Signed-off-by: Jonathan <theflametrooper@gmail.com>
Jonathan 4 years ago
parent
commit
3c0a43ff41
5 changed files with 47 additions and 50 deletions
  1. 8 4
      backend/logic/actions/stations.js
  2. 12 13
      backend/logic/stations.js
  3. 3 3
      backend/logic/tasks.js
  4. 0 12
      backend/logic/utils.js
  5. 24 18
      backend/logic/ws.js

+ 8 - 4
backend/logic/actions/stations.js

@@ -45,9 +45,10 @@ CacheModule.runJob("SUB", {
 					room: "home"
 				});
 
-				Object.keys(sockets).forEach(socketKey => {
-					const socket = sockets[socketKey];
+				sockets.forEach(async socketId => {
+					const socket = await WSModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId }, this);
 					const { session } = socket;
+
 					if (session.sessionId) {
 						CacheModule.runJob("HGET", {
 							table: "sessions",
@@ -369,9 +370,11 @@ CacheModule.runJob("SUB", {
 				const sockets = await WSModule.runJob("GET_SOCKETS_FOR_ROOM", {
 					room: "home"
 				});
-				Object.keys(sockets).forEach(socketKey => {
-					const socket = sockets[socketKey];
+
+				sockets.forEach(async socketId => {
+					const socket = await WSModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId }, this);
 					const { session } = socket;
+
 					if (session.sessionId) {
 						CacheModule.runJob("HGET", {
 							table: "sessions",
@@ -1043,6 +1046,7 @@ export default {
 					return cb({ status: "failure", message: err });
 				}
 				this.log("SUCCESS", "STATIONS_VOTE_SKIP", `Vote skipping "${stationId}" successful.`);
+
 				CacheModule.runJob("PUB", {
 					channel: "station.voteSkipSong",
 					value: stationId

+ 12 - 13
backend/logic/stations.js

@@ -937,10 +937,7 @@ class _StationsModule extends CoreClass {
 								if (session.sessionId) {
 									CacheModule.runJob(
 										"HGET",
-										{
-											table: "sessions",
-											key: session.sessionId
-										},
+										{ table: "sessions", key: session.sessionId },
 										this
 										// eslint-disable-next-line no-loop-func
 									).then(session => {
@@ -996,15 +993,17 @@ class _StationsModule extends CoreClass {
 								});
 							}
 						} else {
-							WSModule.runJob("SOCKETS_LEAVE_SONG_ROOMS", {
-								sockets: await WSModule.runJob(
-									"GET_SOCKETS_FOR_ROOM",
-									{ room: `station.${station._id}` },
-									this
-								)
-							})
-								.then()
-								.catch();
+							WSModule.runJob(
+								"SOCKETS_LEAVE_SONG_ROOMS",
+								{
+									sockets: await WSModule.runJob(
+										"GET_SOCKETS_FOR_ROOM",
+										{ room: `station.${station._id}` },
+										this
+									)
+								},
+								this
+							).then(() => {});
 						}
 
 						resolve({ station });

+ 3 - 3
backend/logic/tasks.js

@@ -362,11 +362,11 @@ class _TasksModule extends CoreClass {
 				(socketId, next) => {
 					WSModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId }).then(async socket => {
 						const stationId = StationsModule.userList[socketId];
-						const room = await WSModule.runJob("GET_SOCKETS_FOR_ROOM", { room: `station.${stationId}` });
+						const room = await WSModule.runJob("GET_SOCKETS_FOR_ROOM", {
+							room: `station.${stationId}`
+						});
 
 						if (!socket || !room.includes(socketId)) {
-							console.log("yes");
-
 							if (stationsCountUpdated.indexOf(stationId) === -1) stationsCountUpdated.push(stationId);
 							if (stationsUpdated.indexOf(stationId) === -1) stationsUpdated.push(String(stationId));
 

+ 0 - 12
backend/logic/utils.js

@@ -143,18 +143,6 @@ class _UtilsModule extends CoreClass {
 		return new Promise(resolve => resolve(randomChars.join("")));
 	}
 
-	/**
-	 * Returns a socket object from a socket identifier
-	 *
-	 * @param {object} payload - object that contains the payload
-	 * @param {string} payload.socketId - the socket id
-	 * @returns {Promise} - returns promise (reject, resolve)
-	 */
-	async GET_SOCKET_FROM_ID(payload) {
-		const ws = await WSModule.runJob("WS", {}, this);
-		return new Promise(resolve => resolve(ws.sockets.sockets[payload.socketId]));
-	}
-
 	/**
 	 * Creates a random number within a range
 	 *

+ 24 - 18
backend/logic/ws.js

@@ -97,11 +97,13 @@ class _WSModule extends CoreClass {
 			const { clients } = WSModule._io;
 
 			if (clients)
-				return clients.forEach(socket => {
-					if (socket.session.socketId === payload.socketId) resolve(socket);
+				// eslint-disable-next-line consistent-return
+				clients.forEach(socket => {
+					if (socket.session.socketId === payload.socketId) return resolve(socket);
 				});
 
-			return reject();
+			// socket doesn't exist
+			return resolve();
 		});
 	}
 
@@ -284,6 +286,7 @@ class _WSModule extends CoreClass {
 					// get every socketId (and thus every socket) in the room, and dispatch to each
 					const socket = await WSModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId }, this);
 					socket.dispatch(...payload.args);
+					return resolve();
 				});
 
 			return resolve();
@@ -323,7 +326,10 @@ class _WSModule extends CoreClass {
 	 */
 	SOCKETS_JOIN_SONG_ROOM(payload) {
 		return new Promise(resolve => {
-			payload.sockets.forEach(socketId => WSModule.runJob("SOCKET_JOIN_SONG_ROOM", { socketId }, this));
+			payload.sockets.forEach(async socketId => {
+				await WSModule.runJob("SOCKET_JOIN_SONG_ROOM", { socketId }, this);
+			});
+
 			return resolve();
 		});
 	}
@@ -336,20 +342,20 @@ class _WSModule extends CoreClass {
 	 * @returns {Promise} - returns promise (reject, resolve)
 	 */
 	SOCKETS_LEAVE_SONG_ROOMS(payload) {
-		return new Promise(resolve => {
-			payload.sockets.forEach(async socketId => {
-				const rooms = await WSModule.runJob("GET_ROOMS_FOR_SOCKET", { socketId }, this);
-
-				rooms.forEach(room => {
-					if (room.indexOf("song.") !== -1)
-						WSModule.rooms[room] = WSModule.rooms[room].filter(
-							participant => participant !== payload.socketId
-						);
-				});
-			});
-
-			resolve();
-		});
+		return new Promise(resolve =>
+			Promise.allSettled(
+				payload.sockets.map(async socketId => {
+					const rooms = await WSModule.runJob("GET_ROOMS_FOR_SOCKET", { socketId }, this);
+
+					rooms.forEach(room => {
+						if (room.indexOf("song.") !== -1)
+							WSModule.rooms[room] = WSModule.rooms[room].filter(
+								participant => participant !== payload.socketId
+							);
+					});
+				})
+			).then(() => resolve())
+		);
 	}
 
 	/**