chat/server/src/socketio.js

77 lines
2.3 KiB
JavaScript

import { Server as SocketIOServer } from "socket.io";
import { randomUUID } from "crypto";
import server from "./server.js";
import Message from "./models/Message.js";
export var io = new SocketIOServer(server, {
cors: {origin: "*"},
maxHttpBufferSize: 16e6,
perMessageDeflate: true
});
io.on("connection", socket => {
socket.ip = socket.handshake.headers["x-forwarded-for"]?.split(',')[0] || socket.handshake.address;
console.debug("connection from", socket.ip, "socket id", socket.id);
socket.on("user", user => {
user = {
name: user.name?.trim()?.substring(0,32),
color: user.color?.trim()?.substring(0,32),
website: user.website?.trim()?.substring(0,1000),
uuid: user.uuid?.substring(0,128) || "A"+randomUUID(),
secret: user.secret?.substring(0,128),
socketid: socket.id,
ip: socket.ip,
agent: socket.handshake.headers["user-agent"]
};
console.debug("user", user);
socket.data.user = user;
broadcastUsers();
});
socket.once("user", async user => {
//await newMessage({color: "#00FF00", content:`${user.name} connected`});
socket.on("disconnect", () => {
//newMessage({color: "#FF0000", content: `${socket.data.user.name} disconnected`});
broadcastUsers();
});
socket.on("message", message => {
newMessage({
content: message.content,
user: {...socket.data.user}
}).catch(error => {
console.error(socket.id, error.message);
});
});
socket.on("type", () => {
io.emit("type", socket.id);
});
socket.on("mouse", (x, y) => {
//socket.broadcast.emit("mouse", x, y, socket.id);
// see own cursor (test)
io.emit("mouse", x, y, socket.id);
});
Message.getMessages({secret: user.secret}).then(messages => {
socket.emit("messages", messages);
});
});
});
async function broadcastUsers() {
var users = await io.fetchSockets().then(sockets => sockets.filter(socket => socket.data.user).map(socket => {
var user = Object.assign({}, socket.data.user);
delete user.ip;
delete user.secret;
return user;
}));
io.emit("users", users);
}
async function newMessage(message) {
message = new Message(message);
message.timestamp = new Date();
message = await message.save();
message = message.toObject();
console.debug("message", message);
delete message.user.ip;
delete message.user.secret;
io.emit("message", message);
}