Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
281 changes: 136 additions & 145 deletions backend/routes/socketRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,184 +7,175 @@ class SocketRoutes {
this.roomController = null;
this.videoCallController = null;
}

// Initialize socket event handlers
initializeSocketHandlers(io) {
// Initialize controllers with io instance
this.roomController = new RoomController(io);
this.videoCallController = new VideoCallController(io);

io.on("connection", (socket) => {
console.log("A user connected", socket.id);

// File management events
socket.on("createFile", (data) => {
const result = this.roomController.handleCreateFile(socket, data);
if (!result.success) {
console.error("Create file error:", result.error);
socket.emit("error", { type: "createFile", message: result.error });
}
});

socket.on("deleteFile", (data) => {
const result = this.roomController.handleDeleteFile(socket, data);
if (!result.success) {
console.error("Delete file error:", result.error);
socket.emit("error", { type: "deleteFile", message: result.error });
}
});

socket.on("renameFile", (data) => {
const result = this.roomController.handleRenameFile(socket, data);
if (!result.success) {
console.error("Rename file error:", result.error);
socket.emit("error", { type: "renameFile", message: result.error });
}
});
console.log("User connected:", socket.id);

socket.on("switchFile", (data) => {
const result = this.roomController.handleSwitchFile(socket, data);
if (!result.success) {
console.error("Switch file error:", result.error);
socket.emit("error", { type: "switchFile", message: result.error });
}
});

socket.on("getFiles", (data) => {
const result = this.roomController.handleGetFiles(socket, data);
if (!result.success) {
console.error("Get files error:", result.error);
}
});

socket.on("fileCodeChange", (data) => {
const result = this.roomController.handleFileCodeChange(socket, data);
if (!result.success) {
console.error("File code change error:", result.error);
}
});
// Register grouped event handlers
this.registerFileEvents(socket);
this.registerRoomEvents(socket);
this.registerChatEvents(socket);
this.registerVideoCallEvents(socket);

socket.on("fileLanguageChange", (data) => {
const result = this.roomController.handleFileLanguageChange(
// Disconnect handling
socket.on("disconnect", () => {
this.handleResult(
socket,
data
this.roomController.handleDisconnect(socket),
"disconnect"
);
if (!result.success) {
console.error("File language change error:", result.error);
}
});

// Legacy filename change event
socket.on("filenameChange", (data) => {
const result = this.roomController.handleFilenameChange(socket, data);
if (!result.success) {
console.error("Filename change error:", result.error);
}
});

// Room-related events
socket.on("join_room", (data) => {
const result = this.roomController.handleJoinRoom(socket, data);
if (!result.success) {
console.error("Join room error:", result.error);
}
this.handleResult(
socket,
this.videoCallController.handleDisconnect(socket),
"disconnect"
);
console.log("User disconnected:", socket.id);
});
});
}

socket.on("codeChange", (data) => {
const result = this.roomController.handleCodeChange(socket, data);
if (!result.success) {
console.error("Code change error:", result.error);
}
});
/**
* Handles controller results and emits standardized error events.
*/
handleResult(socket, result, eventType) {
if (!result.success) {
console.error(`${eventType} error:`, result.error);
socket.emit("error", { type: eventType, message: result.error });
}
}

socket.on("languageChange", (data) => {
const result = this.roomController.handleLanguageChange(socket, data);
if (!result.success) {
console.error("Language change error:", result.error);
/**
* File management socket events
*/
registerFileEvents(socket) {
const events = [
"createFile",
"deleteFile",
"renameFile",
"switchFile",
"getFiles",
"fileCodeChange",
"fileLanguageChange",
];

events.forEach((event) => {
socket.on(event, (data) => {
const methodName = `handle${this.capitalize(event)}`;
if (typeof this.roomController[methodName] === "function") {
const result = this.roomController[methodName](socket, data);
this.handleResult(socket, result, event);
} else {
console.warn(`No handler for ${event}`);
}
});
});
}

socket.on("leaveRoom", () => {
const result = this.roomController.handleLeaveRoom(socket);
if (!result.success) {
console.error("Leave room error:", result.error);
}
});
/**
* Room-related events
*/
registerRoomEvents(socket) {
socket.on("join-room", (data) => {
this.handleResult(
socket,
this.roomController.handleJoinRoom(socket, data),
"join-room"
);
});

socket.on("typing", (data) => {
const result = this.roomController.handleTyping(socket, data);
if (!result.success) {
console.error("Typing error:", result.error);
}
});
socket.on("leave-room", () => {
this.handleResult(
socket,
this.roomController.handleLeaveRoom(socket),
"leave-room"
);
});
}

socket.on("chatMessage", (data) => {
const result = this.roomController.handleChatMessage(socket, data);
if (!result.success) {
console.error("Chat message error:", result.error);
}
});
// it shows who is typing!!
socket.on("typing", ({ roomId, user }) => {
socket.to(roomId).emit("userTyping", { user });
});
/**
* Chat-related events
*/
registerChatEvents(socket) {
socket.on("chatMessage", (data) => {
this.handleResult(
socket,
this.roomController.handleChatMessage(socket, data),
"chatMessage"
);
});

socket.on("stopTyping", ({ roomId, user }) => {
socket.to(roomId).emit("userStopTyping", { user });
});
socket.on("typing", ({ roomId, user }) => {
socket.to(roomId).emit("userTyping", { user });
});

// Video call events
socket.on("join-call", (data) => {
const result = this.videoCallController.handleJoinCall(socket, data);
if (!result.success) {
console.error("Join call error:", result.error);
}
});
socket.on("stopTyping", ({ roomId, user }) => {
socket.to(roomId).emit("userStopTyping", { user });
});
}

socket.on("signal", (data) => {
const result = this.videoCallController.handleSignal(socket, data);
if (!result.success) {
console.error("Signal error:", result.error);
}
});
/**
* Video call events
*/
registerVideoCallEvents(socket) {
socket.on("join-call", (data) => {
this.handleResult(
socket,
this.videoCallController.handleJoinCall(socket, data),
"join-call"
);
});

socket.on("leave-call", (data) => {
const result = this.videoCallController.handleLeaveCall(socket, data);
if (!result.success) {
console.error("Leave call error:", result.error);
}
});
socket.on("leave-call", (data) => {
this.handleResult(
socket,
this.videoCallController.handleLeaveCall(socket, data),
"leave-call"
);
});

socket.on("toggle-camera", () => {
const result = this.videoCallController.handleToggleCamera(socket);
if (!result.success) {
console.error("Toggle camera error:", result.error);
}
});
socket.on("signal", (data) => {
this.handleResult(
socket,
this.videoCallController.handleSignal(socket, data),
"signal"
);
});

socket.on("toggle-microphone", () => {
const result = this.videoCallController.handleToggleMicrophone(socket);
if (!result.success) {
console.error("Toggle microphone error:", result.error);
}
});
socket.on("toggle-camera", () => {
this.handleResult(
socket,
this.videoCallController.handleToggleCamera(socket),
"toggle-camera"
);
});

// Disconnect event
socket.on("disconnect", () => {
const result = this.roomController.handleDisconnect(socket);
if (!result.success) {
console.error("Disconnect error:", result.error);
}
console.log("A user disconnected", socket.id);
});
socket.on("toggle-microphone", () => {
this.handleResult(
socket,
this.videoCallController.handleToggleMicrophone(socket),
"toggle-microphone"
);
});
}

// Get room statistics (for admin/analytics)
/**
* Utility: Capitalize event names for method mapping
*/
capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}

// Analytics
getRoomStats() {
return this.roomController ? this.roomController.getRoomStats() : null;
}

// Get call statistics (for admin/analytics)
getCallStats() {
return this.videoCallController
? this.videoCallController.getCallStats()
Expand Down