Browse Source

fix(socket.io -> WS): 'song' rooms now work as expected

Signed-off-by: Jonathan <theflametrooper@gmail.com>
Jonathan 4 years ago
parent
commit
7729bfd5e8

+ 5 - 21
backend/logic/actions/stations.js

@@ -41,7 +41,7 @@ CacheModule.runJob("SUB", {
 					args: ["event:userCount.updated", stationId, count]
 				});
 			else {
-				const sockets = await IOModule.runJob("GET_ROOM_SOCKETS", {
+				const sockets = await IOModule.runJob("GET_SOCKETS_FOR_ROOM", {
 					room: "home"
 				});
 
@@ -366,7 +366,7 @@ CacheModule.runJob("SUB", {
 					args: ["event:stations.created", station]
 				});
 			else {
-				const sockets = await IOModule.runJob("GET_ROOM_SOCKETS", {
+				const sockets = await IOModule.runJob("GET_SOCKETS_FOR_ROOM", {
 					room: "home"
 				});
 				Object.keys(sockets).forEach(socketKey => {
@@ -400,8 +400,6 @@ export default {
 	 * @param {Function} cb - callback
 	 */
 	index(session, cb) {
-		console.log("called");
-
 		async.waterfall(
 			[
 				next => {
@@ -770,13 +768,7 @@ export default {
 
 					data.currentSong.skipVotes = data.currentSong.skipVotes.length;
 
-					return SongsModule.runJob(
-						"GET_SONG_FROM_ID",
-						{
-							songId: data.currentSong.songId
-						},
-						this
-					)
+					return SongsModule.runJob("GET_SONG_FROM_ID", { songId: data.currentSong.songId }, this)
 						.then(response => {
 							const { song } = response;
 							if (song) {
@@ -1034,16 +1026,8 @@ export default {
 
 				(station, next) => {
 					skipVotes = station.currentSong.skipVotes.length;
-					IOModule.runJob(
-						"GET_ROOM_SOCKETS",
-						{
-							room: `station.${stationId}`
-						},
-						this
-					)
-						.then(sockets => {
-							next(null, sockets);
-						})
+					IOModule.runJob("GET_SOCKETS_FOR_ROOM", { room: `station.${stationId}` }, this)
+						.then(sockets => next(null, sockets))
 						.catch(next);
 				},
 

+ 62 - 42
backend/logic/io.js

@@ -63,8 +63,6 @@ class _IOModule extends CoreClass {
 			this._io.on("connection", async (socket, req) => {
 				socket.dispatch = (...args) => socket.send(JSON.stringify(args));
 
-				console.log(socket.actions);
-
 				socket.actions = new EventEmitter();
 				socket.actions.setMaxListeners(0);
 				socket.listen = (target, cb) => socket.actions.addListener(target, args => cb(args));
@@ -257,14 +255,12 @@ class _IOModule extends CoreClass {
 	 *
 	 * @param {object} payload - object that contains the payload
 	 * @param {string} payload.socketId - the id of the socket which should join the room
-	 * @param {object} payload.room - the object representing the room the socket should join
+	 * @param {string} payload.room - the name of the room
 	 * @returns {Promise} - returns promise (reject, resolve)
 	 */
 	async SOCKET_JOIN_ROOM(payload) {
 		const { room, socketId } = payload;
 
-		console.log("JOIN_ROOM", payload.room);
-
 		// leave all other rooms
 		await IOModule.runJob("SOCKET_LEAVE_ROOMS", { socketId }, this);
 
@@ -297,59 +293,64 @@ class _IOModule extends CoreClass {
 		});
 	}
 
-	// UNKNOWN
-	// eslint-disable-next-line require-jsdoc
+	/**
+	 * Allows a socket to join a 'song' room
+	 *
+	 * @param {object} payload - object that contains the payload
+	 * @param {string} payload.socketId - the id of the socket which should join the room
+	 * @param {string} payload.room - the name of the room
+	 * @returns {Promise} - returns promise (reject, resolve)
+	 */
 	async SOCKET_JOIN_SONG_ROOM(payload) {
-		// socketId, room
-		const socket = await IOModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId: payload.socketId }, this);
+		const { room, socketId } = payload;
 
-		return new Promise(resolve => {
-			const { rooms } = socket;
-			Object.keys(rooms).forEach(roomKey => {
-				const room = rooms[roomKey];
-				if (room.indexOf("song.") !== -1) socket.leave(room);
-			});
+		// leave any other song rooms the user is in
+		await IOModule.runJob("SOCKETS_LEAVE_SONG_ROOMS", { sockets: [socketId] }, this);
 
-			socket.join(payload.room);
+		return new Promise(resolve => {
+			// join the room
+			if (IOModule.rooms[room]) IOModule.rooms[room].push(socketId);
+			else IOModule.rooms[room] = [socketId];
 
 			return resolve();
 		});
 	}
 
-	// UNKNOWN
-	// eslint-disable-next-line require-jsdoc
+	/**
+	 * Allows multiple sockets to join a 'song' room
+	 *
+	 * @param {object} payload - object that contains the payload
+	 * @param {Array} payload.sockets - array of socketIds
+	 * @param {object} payload.room - the name of the room
+	 * @returns {Promise} - returns promise (reject, resolve)
+	 */
 	SOCKETS_JOIN_SONG_ROOM(payload) {
-		// sockets, room
 		return new Promise(resolve => {
-			Object.keys(payload.sockets).forEach(socketKey => {
-				const socket = payload.sockets[socketKey];
-
-				const { rooms } = socket;
-				Object.keys(rooms).forEach(roomKey => {
-					const room = rooms[roomKey];
-					if (room.indexOf("song.") !== -1) socket.leave(room);
-				});
-
-				socket.join(payload.room);
-			});
-
+			payload.sockets.forEach(socketId => IOModule.runJob("SOCKET_JOIN_SONG_ROOM", { socketId }, this));
 			return resolve();
 		});
 	}
 
-	// UNKNOWN
-	// eslint-disable-next-line require-jsdoc
+	/**
+	 * Allows multiple sockets to leave any 'song' rooms they are in
+	 *
+	 * @param {object} payload - object that contains the payload
+	 * @param {Array} payload.sockets - array of socketIds
+	 * @returns {Promise} - returns promise (reject, resolve)
+	 */
 	SOCKETS_LEAVE_SONG_ROOMS(payload) {
-		// sockets
 		return new Promise(resolve => {
-			Object.keys(payload.sockets).forEach(socketKey => {
-				const socket = payload.sockets[socketKey];
-				const { rooms } = socket;
-				Object.keys(rooms).forEach(roomKey => {
-					const room = rooms[roomKey];
-					if (room.indexOf("song.") !== -1) socket.leave(room);
+			payload.sockets.forEach(async socketId => {
+				const rooms = await IOModule.runJob("GET_ROOMS_FOR_SOCKET", { socketId }, this);
+
+				rooms.forEach(room => {
+					if (room.indexOf("song.") !== -1)
+						IOModule.rooms[room] = IOModule.rooms[room].filter(
+							participant => participant !== payload.socketId
+						);
 				});
 			});
+
 			resolve();
 		});
 	}
@@ -361,13 +362,32 @@ class _IOModule extends CoreClass {
 	 * @param {string} payload.room - the name of the room
 	 * @returns {Promise} - returns promise (reject, resolve)
 	 */
-	async GET_ROOM_SOCKETS(payload) {
+	async GET_SOCKETS_FOR_ROOM(payload) {
 		return new Promise(resolve => {
 			if (IOModule.rooms[payload.room]) return resolve(IOModule.rooms[payload.room]);
 			return resolve([]);
 		});
 	}
 
+	/**
+	 * Gets any rooms a socket is connected to
+	 *
+	 * @param {object} payload - object that contains the payload
+	 * @param {string} payload.socketId - the id of the socket to check the rooms for
+	 * @returns {Promise} - returns promise (reject, resolve)
+	 */
+	async GET_ROOMS_FOR_SOCKET(payload) {
+		return new Promise(resolve => {
+			const rooms = [];
+
+			Object.keys(IOModule.rooms).forEach(room => {
+				if (IOModule.rooms[room].includes(payload.socketId)) rooms.push(room);
+			});
+
+			return resolve(rooms);
+		});
+	}
+
 	/**
 	 * Handles io.use
 	 *
@@ -487,7 +507,7 @@ class _IOModule extends CoreClass {
 
 				socket.dispatch("keep.event:banned", socket.banishment.ban);
 
-				return socket.disconnect(true); // need to fix
+				return socket.disconnect(true); // doesn't work - need to fix
 			}
 
 			IOModule.log("INFO", "IO_CONNECTION", `User connected. IP: ${socket.ip}.${sessionInfo}`);

+ 9 - 12
backend/logic/stations.js

@@ -928,11 +928,12 @@ class _StationsModule extends CoreClass {
 								.then()
 								.catch();
 						} else {
-							const sockets = await IOModule.runJob("GET_ROOM_SOCKETS", { room: "home" }, this);
+							const sockets = await IOModule.runJob("GET_SOCKETS_FOR_ROOM", { room: "home" }, this);
 
-							Object.keys(sockets).forEach(socketKey => {
-								const socket = sockets[socketKey];
+							sockets.forEach(async socketId => {
+								const socket = await IOModule.runJob("SOCKET_FROM_SOCKET_ID", { socketId }, this);
 								const { session } = socket;
+
 								if (session.sessionId) {
 									CacheModule.runJob(
 										"HGET",
@@ -981,10 +982,8 @@ class _StationsModule extends CoreClass {
 						if (station.currentSong !== null && station.currentSong.songId !== undefined) {
 							IOModule.runJob("SOCKETS_JOIN_SONG_ROOM", {
 								sockets: await IOModule.runJob(
-									"GET_ROOM_SOCKETS",
-									{
-										room: `station.${station._id}`
-									},
+									"GET_SOCKETS_FOR_ROOM",
+									{ room: `station.${station._id}` },
 									this
 								),
 								room: `song.${station.currentSong.songId}`
@@ -999,10 +998,8 @@ class _StationsModule extends CoreClass {
 						} else {
 							IOModule.runJob("SOCKETS_LEAVE_SONG_ROOMS", {
 								sockets: await IOModule.runJob(
-									"GET_ROOM_SOCKETS",
-									{
-										room: `station.${station._id}`
-									},
+									"GET_SOCKETS_FOR_ROOM",
+									{ room: `station.${station._id}` },
 									this
 								)
 							})
@@ -1125,7 +1122,7 @@ class _StationsModule extends CoreClass {
 	 */
 	GET_SOCKETS_THAT_CAN_KNOW_ABOUT_STATION(payload) {
 		return new Promise((resolve, reject) => {
-			IOModule.runJob("GET_ROOM_SOCKETS", { room: payload.room }, this)
+			IOModule.runJob("GET_SOCKETS_FOR_ROOM", { room: payload.room }, this)
 				.then(socketsObject => {
 					const sockets = Object.keys(socketsObject).map(socketKey => socketsObject[socketKey]);
 					let socketsThatCan = [];

+ 3 - 2
backend/logic/tasks.js

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

+ 1 - 0
frontend/src/App.vue

@@ -109,6 +109,7 @@ export default {
 		}
 
 		io.onConnect(true, () => {
+			console.log("APP.VUE", "onConnect(true, () => {})");
 			this.socketConnected = true;
 		});
 		io.onConnectError(true, () => {

+ 2 - 0
frontend/src/io.js

@@ -38,6 +38,8 @@ export default {
 	},
 
 	onConnect(...args) {
+		console.log("on connect io.js", args);
+
 		if (args[0] === true) callbacks.onConnect.persist.push(args[1]);
 		else callbacks.onConnect.temp.push(args[0]);
 	},

+ 1 - 13
frontend/src/main.js

@@ -150,10 +150,9 @@ lofig.fetchConfig().then(config => {
 
 	// const { serverDomain } = config;
 	io.init("ws://localhost:8080/ws");
+
 	io.getSocket(socket => {
 		socket.on("ready", (loggedIn, role, username, userId) => {
-			console.log("READY", loggedIn, role, username, userId);
-
 			store.dispatch("user/auth/authData", {
 				loggedIn,
 				role,
@@ -246,14 +245,3 @@ new Vue({
 	el: "#root",
 	render: wrapper => wrapper(App)
 });
-
-// const ws = new WebSocket("ws://localhost:8080/ws");
-
-// ws.onopen = () => {
-// 	// eslint-disable-next-line no-alert
-// 	alert("Now connected");
-// };
-
-// ws.onmessage = e => {
-// 	console.log("Message from server:", e.data);
-// };