-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathserver.js
More file actions
48 lines (39 loc) · 1.1 KB
/
server.js
File metadata and controls
48 lines (39 loc) · 1.1 KB
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
const WebSocket = require('ws');
const uuidv4 = require('uuid');
const wss = new WebSocket.Server({ port: 8085 });
// 1 socket === 1 user
let sockets = {};
wss.on('connection', (ws, request) => {
// update list of users
sockets = { ...sockets, [request.url.split('/').pop()]: { ws } };
// broadcast to all users new user is added
broadcast();
// subscribe to on message
ws.on('message', (data) => {
// parse message
const request = JSON.parse(data);
// get to user
const to = sockets[request.to];
if (!to || to.ws.readyState !== WebSocket.OPEN) {
// closed
ws.send(JSON.stringify({ success: false }));
return;
}
const message = {
type: 'chatMessage',
id: uuidv4.v4(),
msg: request.msg,
from: request.from,
to: request.to,
};
to.ws.send(JSON.stringify(message));
ws.send(JSON.stringify(message));
});
});
const broadcast = () => {
const allUsers = Object.keys(sockets);
const response = { type: 'allUsers', users: allUsers };
allUsers.forEach((id) => {
sockets[id].ws.send(JSON.stringify(response));
});
};