diff options
| author | Adam Soltys <[email protected]> | 2020-05-13 14:31:44 -0700 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2020-05-13 14:31:44 -0700 |
| commit | 816bfa54afd50059d781a9da5dc953611b9fdc66 (patch) | |
| tree | 543ca23173d316ec4f2c53f8b2cd84125bf6f33e /lib/sockets.js | |
| parent | baba2be1a1ae06833ee324948cd1b8d339ed5323 (diff) | |
| download | coinos-server-816bfa54afd50059d781a9da5dc953611b9fdc66.tar.gz coinos-server-816bfa54afd50059d781a9da5dc953611b9fdc66.zip | |
use ws instead of socket.io
Diffstat (limited to 'lib/sockets.js')
| -rw-r--r-- | lib/sockets.js | 81 |
1 files changed, 46 insertions, 35 deletions
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); }); }); |
