111 lines
3.1 KiB
JavaScript
111 lines
3.1 KiB
JavaScript
const { Server } = require("socket.io");
|
|
const { insertMessage } = require("../db/db");
|
|
const { isValidUsername } = require("../utils/filter");
|
|
const { verifyJwtToken } = require("../auth/jwt");
|
|
const console = require("node:console");
|
|
|
|
function initializeSocket(io) {
|
|
io.use((socket, next) => {
|
|
const token = socket.handshake.auth.token;
|
|
if (!token) {
|
|
console.log("(socket) Not logged in");
|
|
return next(new Error("(socket) Not logged in"));
|
|
}
|
|
|
|
try {
|
|
const { username, user_id } = verifyJwtToken(token);
|
|
if (!username || !user_id) {
|
|
console.log("(socket) Invalid token payload");
|
|
return next(new Error("(socket) Invalid token payload"));
|
|
}
|
|
|
|
socket.username = username;
|
|
|
|
if (!isValidUsername(username)) {
|
|
console.log("(socket) Invalid username");
|
|
return;
|
|
}
|
|
|
|
socket.user_id = user_id;
|
|
console.log(
|
|
`(socket) socket id: ${socket.id}, username: ${username}, user_id: ${user_id}`,
|
|
);
|
|
next();
|
|
} catch (error) {
|
|
console.error("(socket) Token verification failed:", error.message);
|
|
next(new Error("(socket) Invalid token"));
|
|
}
|
|
});
|
|
|
|
io.on("connection", async (socket) => {
|
|
const username = socket.username;
|
|
if (!username) {
|
|
socket.on("disconnect", () => {
|
|
console.log(
|
|
"(socket)",
|
|
socket.id,
|
|
" disconnected due to: invalid username/token",
|
|
);
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (!isValidUsername(username)) {
|
|
socket.on("disconnect", () => {
|
|
console.log(
|
|
"(socket)",
|
|
socket.id,
|
|
" disconnected due to: invalid username/token",
|
|
);
|
|
});
|
|
return;
|
|
}
|
|
socket.join(username); // join username room
|
|
|
|
socket.on("chat message", async (msg, callback) => {
|
|
const { message, recipient } = msg;
|
|
const sender = username;
|
|
if (!message || !recipient) {
|
|
callback({ status: "error", message: "Invalid message or recipient" });
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const insertedMessage = await insertMessage(sender, recipient, message);
|
|
if (!insertedMessage) {
|
|
callback({ status: "error", message: "Failed to insert message" });
|
|
return;
|
|
}
|
|
|
|
const { message_id, timestamp } = insertedMessage;
|
|
console.log("(socket) received from chat message", msg);
|
|
|
|
io.to(username).to(recipient).emit("chat message", {
|
|
sender,
|
|
message,
|
|
recipient,
|
|
message_id,
|
|
});
|
|
console.log("(socket) sent on 'chat message' socket: ", {
|
|
sender,
|
|
message,
|
|
recipient,
|
|
timestamp,
|
|
message_id,
|
|
});
|
|
|
|
callback({ status: "ok", tempId: msg.tempId });
|
|
} catch (e) {
|
|
console.error("(socket) Failed to insert message ", e);
|
|
callback({ status: "error", message: "Internal server error" });
|
|
}
|
|
});
|
|
|
|
socket.on("disconnect", (reason) => {
|
|
console.log("(socket)", socket.id, " disconnected due to: ", reason);
|
|
});
|
|
});
|
|
}
|
|
|
|
module.exports = { initializeSocket };
|