Files
relay/server/socket/socket.js
2024-11-19 22:49:55 +01:00

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 };