Skip to content

Commit

Permalink
Implement room instancing in socketio-server.js (#458)
Browse files Browse the repository at this point in the history
  • Loading branch information
vincentfretin committed Mar 22, 2024
1 parent 4ce20ff commit 1d0977d
Showing 1 changed file with 52 additions and 13 deletions.
65 changes: 52 additions & 13 deletions server/socketio-server.js
Expand Up @@ -9,6 +9,9 @@ process.title = "networked-aframe-server";
// Get port or default to 8080
const port = process.env.PORT || 8080;

// Threshold for instancing a room
const maxOccupantsInRoom = 50;

// Setup and configure Express http server.
const app = express();

Expand All @@ -32,7 +35,7 @@ app.use(express.static(path.resolve(__dirname, "..", "examples")));
const webServer = http.createServer(app);
const io = require("socket.io")(webServer);

const rooms = {};
const rooms = new Map();

io.on("connection", socket => {
console.log("user connected", socket.id);
Expand All @@ -42,22 +45,56 @@ io.on("connection", socket => {
socket.on("joinRoom", data => {
const { room } = data;

if (!rooms[room]) {
rooms[room] = {
curRoom = room;
let roomInfo = rooms.get(room);
if (!roomInfo) {
roomInfo = {
name: room,
occupants: {},
occupantsCount: 0
};
rooms.set(room, roomInfo);
}

if (roomInfo.occupantsCount >= maxOccupantsInRoom) {
// If room is full, search for spot in other instances
let availableRoomFound = false;
const roomPrefix = `${room}--`;
let numberOfInstances = 1;
for (const [roomName, roomData] of rooms.entries()) {
if (roomName.startsWith(roomPrefix)) {
numberOfInstances++;
if (roomData.occupantsCount < maxOccupantsInRoom) {
availableRoomFound = true;
curRoom = roomName;
roomInfo = roomData;
break;
}
}
}

if (!availableRoomFound) {
// No available room found, create a new one
const newRoomNumber = numberOfInstances + 1;
curRoom = `${roomPrefix}${newRoomNumber}`;
roomInfo = {
name: curRoom,
occupants: {},
occupantsCount: 0
};
rooms.set(curRoom, roomInfo)
}
}

const joinedTime = Date.now();
rooms[room].occupants[socket.id] = joinedTime;
curRoom = room;
roomInfo.occupants[socket.id] = joinedTime;
roomInfo.occupantsCount++;

console.log(`${socket.id} joined room ${room}`);
socket.join(room);
console.log(`${socket.id} joined room ${curRoom}`);
socket.join(curRoom);

socket.emit("connectSuccess", { joinedTime });
const occupants = rooms[room].occupants;
const occupants = roomInfo.occupants;
io.in(curRoom).emit("occupantsChanged", { occupants });
});

Expand All @@ -71,16 +108,18 @@ io.on("connection", socket => {

socket.on("disconnect", () => {
console.log('disconnected: ', socket.id, curRoom);
if (rooms[curRoom]) {
const roomInfo = rooms.get(curRoom);
if (roomInfo) {
console.log("user disconnected", socket.id);

delete rooms[curRoom].occupants[socket.id];
const occupants = rooms[curRoom].occupants;
delete roomInfo.occupants[socket.id];
roomInfo.occupantsCount--;
const occupants = roomInfo.occupants;
socket.to(curRoom).broadcast.emit("occupantsChanged", { occupants });

if (Object.keys(occupants).length === 0) {
if (roomInfo.occupantsCount === 0) {
console.log("everybody left room");
delete rooms[curRoom];
rooms.delete(curRoom);
}
}
});
Expand Down

0 comments on commit 1d0977d

Please sign in to comment.