77 lines
2.3 KiB
JavaScript
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);
|
|
} |