aboutsummaryrefslogtreecommitdiffstats
path: root/lib/sockets.js
blob: 6679b2cf87ab801526fd73ab32c70ebe69b3da70 (plain) (blame)
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
const jwt = require("jsonwebtoken");
const io = require("socket.io");

/* eslint-disable-next-line */
const pick = (O, ...K) => K.reduce((o, k) => ((o[k] = O[k]), o), {});
sids = {};

socket = io(server, { origins: "*:*" });
emit = (username, msg, data) => {
  if (data.username !== undefined) data = pick(data, ...whitelist);

  if (!sids[username]) return;
  sids[username].map((sid, i) => {
    try {
      socket.to(sid).emit(msg, data);
    } catch (e) {
      sids[username].splice(i, 1);
    }
  });
};

socket.use((socket, next) => {
  try {
    let token = socket.handshake.query.token;
    let user = jwt.decode(token).username;
    socket.request.user = user;
    sids[user] ? sids[user].push(socket.id) : (sids[user] = [socket.id]);
    sids[socket.id] = user;
  } catch (e) {
    l.error("error creating socket", e);
  }
  next();
});

socket.sockets.on("connect", async socket => {
  socket.emit("connected");
  if (app.get("rates")) socket.emit("rate", app.get("rates").ask);
  socket.on("getuser", async (data, callback) => {
    let { user } = socket.request;
    l.info("socket open", user);
    callback(await getUser(user));
  });

  socket.on("disconnect", s => {
    let user = sids[socket.id];
    l.info("socket closed", user);
    sids[user].splice(sids[user].indexOf(socket.id), 1);
    delete sids[socket.id];
  });
});