aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2020-05-13 14:31:44 -0700
committerAdam Soltys <[email protected]>2020-05-13 14:31:44 -0700
commit816bfa54afd50059d781a9da5dc953611b9fdc66 (patch)
tree543ca23173d316ec4f2c53f8b2cd84125bf6f33e /lib
parentbaba2be1a1ae06833ee324948cd1b8d339ed5323 (diff)
downloadcoinos-server-816bfa54afd50059d781a9da5dc953611b9fdc66.tar.gz
coinos-server-816bfa54afd50059d781a9da5dc953611b9fdc66.zip
use ws instead of socket.io
Diffstat (limited to 'lib')
-rw-r--r--lib/rates.js2
-rw-r--r--lib/sockets.js81
2 files changed, 47 insertions, 36 deletions
diff --git a/lib/rates.js b/lib/rates.js
index 702e586e..b6c38a50 100644
--- a/lib/rates.js
+++ b/lib/rates.js
@@ -29,7 +29,7 @@ let fetchRates;
})();
setInterval(() => {
- socket.emit("rates", app.get("rates"));
+ broadcast("rates", app.get("rates"));
}, 1000);
setInterval(() => {
diff --git a/lib/sockets.js b/lib/sockets.js
index 6679b2cf..16f42214 100644
--- a/lib/sockets.js
+++ b/lib/sockets.js
@@ -1,50 +1,61 @@
const jwt = require("jsonwebtoken");
-const io = require("socket.io");
+const uuidv4 = require("uuid/v4");
+const WebSocket = require("ws");
+
+wss = new WebSocket.Server({ clientTracking: false, noServer: true });
/* eslint-disable-next-line */
const pick = (O, ...K) => K.reduce((o, k) => ((o[k] = O[k]), o), {});
-sids = {};
+sockets = {};
-socket = io(server, { origins: "*:*" });
-emit = (username, msg, data) => {
+emit = (username, type, 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);
- }
- });
+ if (!sockets[username]) return;
+ for (id in sockets[username]) {
+ const ws = sockets[username][id];
+ ws.send(JSON.stringify({ type, data }));
+ }
};
-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();
+broadcast = (type, data) => {
+ for (const username in sockets) {
+ for (const id in sockets[username]) {
+ const ws = sockets[username][id];
+ ws.send(JSON.stringify({ type, data }));
+ }
+ };
+}
+
+server.on("upgrade", function (request, socket, head) {
+ wss.handleUpgrade(request, socket, head, function (ws) {
+ wss.emit("connection", ws, request);
+ });
});
-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));
+const names = {};
+
+wss.on("connection", function (ws) {
+ const id = uuidv4();
+
+ ws.on("message", async (token) => {
+ try {
+ const username = jwt.decode(token).username;
+ if (!sockets[username]) sockets[username] = {};
+ sockets[username][id] = ws;
+ names[id] = username;
+
+ ws.send(JSON.stringify({ type: "rates", data: app.get("rates") }));
+ ws.send(JSON.stringify({ type: "login", data: await getUser(username) }));
+ l.info("socket open", username);
+ } catch (e) {
+ l.error("problem opening socket", e.message);
+ }
});
- 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];
+ ws.on("close", function () {
+ const username = names[id];
+ delete sockets[username][id];
+ l.info("socket closed", username);
});
});