diff options
Diffstat (limited to 'lib/sockets.js')
| -rw-r--r-- | lib/sockets.js | 67 |
1 files changed, 67 insertions, 0 deletions
diff --git a/lib/sockets.js b/lib/sockets.js new file mode 100644 index 00000000..3ebf86d7 --- /dev/null +++ b/lib/sockets.js @@ -0,0 +1,67 @@ +const jwt = require("jsonwebtoken"); +const io = require("socket.io"); +const Sequelize = require("sequelize"); + +/* eslint-disable-next-line */ +const pick = (O, ...K) => K.reduce((o, k) => ((o[k] = O[k]), o), {}); +const 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) => { + l.info("socket open", socket.request.user); + const user = await db.User.findOne({ + include: [ + { + model: db.Payment, + as: "payments", + order: [["id", "DESC"]], + received: { + [Sequelize.Op.ne]: null + }, + limit: 12 + } + ], + where: { + username: socket.request.user + } + }); + + callback(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]; + }); +}); |
