aboutsummaryrefslogtreecommitdiffstats
path: root/lib/sockets.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2020-03-11 15:10:40 -0700
committerAdam Soltys <[email protected]>2020-03-11 15:10:40 -0700
commitc0888fab024cc9f7c99812bfabf9d7774312dbf7 (patch)
treecad95683af97432f6092a2c2bae10fbb7a588db5 /lib/sockets.js
parentbf2b51f0c2ae9b8f0f330dde6411e45fc0da8a25 (diff)
downloadcoinos-server-c0888fab024cc9f7c99812bfabf9d7774312dbf7.tar.gz
coinos-server-c0888fab024cc9f7c99812bfabf9d7774312dbf7.zip
refactor
Diffstat (limited to 'lib/sockets.js')
-rw-r--r--lib/sockets.js67
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];
+ });
+});