-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwebsocket.js
105 lines (80 loc) · 2.29 KB
/
websocket.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
const WebSocket = require('ws');
const jwt = require("jsonwebtoken");
const User = require("./models/User");
const Chat = require("./models/Chat");
const dotenv = require("dotenv");
//Connessione Moongose
require("./db").connect();
dotenv.config({
path: ".env",
});
const wss = new WebSocket.Server({ port: process.env.WEBSOCKET_PORT ?? 3000 });
let users = [];
wss.on('connection', function connection(ws, req) {
let access_token = req.headers.cookie?.split("; ").map(x => x.split("=")).find(x => x[0] == "access-token")[1];
let connected_user;
if (!access_token) {
ws.close();
return;
}
// Verifica token
try {
const decoded = jwt.verify(access_token, process.env.JWT_SECRET);
users[decoded.user.id] = ws;
connected_user = decoded.user.id;
} catch (error) {
ws.close();
return;
}
ws.on('message', async function message(data_) {
try {
if (data_ == "ping") return ws.send("pong");
const data = JSON.parse(data_);
if(!data.message) return("Empty message");
try {
const receiver = await User.findById(data.to_user);
if (!receiver) return("Receiver not found");
const sender = await User.findById(connected_user);
if (!sender) return("Sender not found");
let chat = await Chat.findOne({
partecipanti: {
$all: [sender._id, receiver._id],
},
});
if (!chat) {
chat = new Chat({
partecipanti: [sender._id, receiver._id],
messaggi: [],
});
}
chat.messaggi.push({
testo: data.message,
inviato_da: sender._id,
});
chat.ultimo_messaggio = new Date();
chat.save();
const packet = {
message: data.message,
user_id: sender._id,
user_name: sender.name,
user_email: sender.email,
user_avatar: sender.avatar
};
if (users[receiver._id]) users[receiver._id].send(JSON.stringify(packet));
} catch (error) {
console.log(error);
ws.close();
}
} catch (error) {
console.log(error);
ws.close();
}
});
ws.on('close', function close() {
try {
delete users[connected_user];
} catch (error) {
console.log(error);
}
});
});