From 816bfa54afd50059d781a9da5dc953611b9fdc66 Mon Sep 17 00:00:00 2001 From: Adam Soltys Date: Wed, 13 May 2020 14:31:44 -0700 Subject: use ws instead of socket.io --- lib/rates.js | 2 +- lib/sockets.js | 81 +++++++++------- package.json | 2 - routes/users.js | 3 +- yarn.lock | 283 +------------------------------------------------------- 5 files changed, 51 insertions(+), 320 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); }); }); diff --git a/package.json b/package.json index b434e051..881097ce 100644 --- a/package.json +++ b/package.json @@ -36,8 +36,6 @@ "pino": "^5.17.0", "request": "~2.88.0", "sequelize": "^5.21.3", - "socket.io": "^2.2.0", - "socket.io-client": "^2.2.0", "uuid": "^3.3.2", "ws": "^7.1.2", "zeromq": "^5.1.0" diff --git a/routes/users.js b/routes/users.js index 6e0d13d1..9089b435 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,7 +1,6 @@ const axios = require("axios"); const bcrypt = require("bcrypt"); const jwt = require("jsonwebtoken"); -const uuidv4 = require("uuid/v4"); const authenticator = require("otplib").authenticator; const pick = (O, ...K) => K.reduce((o, k) => ((o[k] = O[k]), o), {}); @@ -231,7 +230,7 @@ app.post("/user", auth, async (req, res) => { if (user.username !== username && exists) { return res.status(500).send("Username taken"); } else { - sids[username] = sids[user.username]; + sockets[username] = sockets[user.username]; user.username = username; addresses[user.address] = username; addresses[user.liquid] = user.username; diff --git a/yarn.lock b/yarn.lock index ace66b87..a2ffb908 100644 --- a/yarn.lock +++ b/yarn.lock @@ -323,7 +323,7 @@ __metadata: languageName: node linkType: hard -"accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.7": +"accepts@npm:~1.3.5, accepts@npm:~1.3.7": version: 1.3.7 resolution: "accepts@npm:1.3.7" dependencies: @@ -333,13 +333,6 @@ __metadata: languageName: node linkType: hard -"after@npm:0.8.2": - version: 0.8.2 - resolution: "after@npm:0.8.2" - checksum: 2/ac1e164f625a9715daaef092bdc1ceb11d053d95d343d83315c10eced4fdc4ead499f7c25d433aabc26f32cd736370551998a6ce7ab9ad9c2d978cca41852858 - languageName: node - linkType: hard - "agent-base@npm:4, agent-base@npm:^4.2.0, agent-base@npm:^4.3.0": version: 4.3.0 resolution: "agent-base@npm:4.3.0" @@ -518,13 +511,6 @@ __metadata: languageName: node linkType: hard -"arraybuffer.slice@npm:~0.0.7": - version: 0.0.7 - resolution: "arraybuffer.slice@npm:0.0.7" - checksum: 2/d7775846f098c6294029a34fad1dd19e6b90f388eb19d6181ff9265fd9ffae4f5f7b243d3b39275b7ffc7ddc7923ae1df83dff720a0001dc1fb740ea4e3a458c - languageName: node - linkType: hard - "ascli@npm:~1": version: 1.0.1 resolution: "ascli@npm:1.0.1" @@ -635,13 +621,6 @@ __metadata: languageName: node linkType: hard -"backo2@npm:1.0.2": - version: 1.0.2 - resolution: "backo2@npm:1.0.2" - checksum: 2/72f19a0fd2b573f5504adf1f2e74e7658eec000e7732ebd5f622b6b1d520187277a5e8310787906455d02fcf915f35c5c48e54c997bed1a60b95355db8f2ccab - languageName: node - linkType: hard - "balanced-match@npm:^1.0.0": version: 1.0.0 resolution: "balanced-match@npm:1.0.0" @@ -658,20 +637,6 @@ __metadata: languageName: node linkType: hard -"base64-arraybuffer@npm:0.1.5": - version: 0.1.5 - resolution: "base64-arraybuffer@npm:0.1.5" - checksum: 2/9ae66a41b880831fbac1bdb9d1ca79d60fb16209b3da6e176cc1b9336a4d34cd48e05a2b919e443bfd4b03a402b043132dc7d0fa3282c1e74baa2c2daf58fa93 - languageName: node - linkType: hard - -"base64id@npm:2.0.0": - version: 2.0.0 - resolution: "base64id@npm:2.0.0" - checksum: 2/91517053496f8f6ef5c4f0dc8ea8cda43fe0ff9e268e0309f67da438fb680fc7df8bfba10e5d363d63f33e74babda0ac53d2e821e6d158a840d4091df1c16099 - languageName: node - linkType: hard - "bcrypt-pbkdf@npm:^1.0.0": version: 1.0.2 resolution: "bcrypt-pbkdf@npm:1.0.2" @@ -698,15 +663,6 @@ __metadata: languageName: node linkType: hard -"better-assert@npm:~1.0.0": - version: 1.0.2 - resolution: "better-assert@npm:1.0.2" - dependencies: - callsite: 1.0.0 - checksum: 2/bc6a68fcd5da7727878e35961e917132058796b28119dcaf7a6f1d88f6c87d37ffd256d13cd7f0a4e332abac35dd1b4c8a09be43edfcfd1f7939915114fe81f0 - languageName: node - linkType: hard - "bigi@npm:^1.1.0, bigi@npm:^1.4.0": version: 1.4.2 resolution: "bigi@npm:1.4.2" @@ -854,13 +810,6 @@ __metadata: languageName: node linkType: hard -"blob@npm:0.0.5": - version: 0.0.5 - resolution: "blob@npm:0.0.5" - checksum: 2/41fbd9f746890eb809ab232995abac41afeb265ba37a5f35694dee36a906d63ab9626aff3db3868d18ec39e826878c93913cd0a3258cd1c310d451dff369658c - languageName: node - linkType: hard - "bluebird@npm:^3.5.0": version: 3.7.2 resolution: "bluebird@npm:3.7.2" @@ -1066,13 +1015,6 @@ __metadata: languageName: node linkType: hard -"callsite@npm:1.0.0": - version: 1.0.0 - resolution: "callsite@npm:1.0.0" - checksum: 2/5940b23533433f4886dea106cdb16d8a511b36ebaf2ac0bbe0adae547a4259f142d37074f864e12f424927b50cf364fffd1fd75d45a62a622d22984d2375e859 - languageName: node - linkType: hard - "camelcase@npm:5.0.0, camelcase@npm:^5.0.0": version: 5.0.0 resolution: "camelcase@npm:5.0.0" @@ -1348,8 +1290,6 @@ __metadata: prettier: ^1.18.2 request: ~2.88.0 sequelize: ^5.21.3 - socket.io: ^2.2.0 - socket.io-client: ^2.2.0 uuid: ^3.3.2 ws: ^7.1.2 zeromq: ^5.1.0 @@ -1411,27 +1351,6 @@ __metadata: languageName: node linkType: hard -"component-bind@npm:1.0.0": - version: 1.0.0 - resolution: "component-bind@npm:1.0.0" - checksum: 2/afbea09480c570b50fb86d8b4bee5d8b4809c667d8a7072cab0d48832f2cb9ebd62bf61b28722f1560cf7a2b0c2c171f8ef120229ec88e9cf332833cbf2779e8 - languageName: node - linkType: hard - -"component-emitter@npm:1.2.1": - version: 1.2.1 - resolution: "component-emitter@npm:1.2.1" - checksum: 2/faa45682ad4f3796803e254793f843b54c4f10f9fd8d23a1ed37a174dd2cc847a48dd2b6d016aa55465192d752ec2dada71391ac502ce61202816973678587bb - languageName: node - linkType: hard - -"component-inherit@npm:0.0.3": - version: 0.0.3 - resolution: "component-inherit@npm:0.0.3" - checksum: 2/b0caec57577c475a5111ca0a83ae884001c3b4f16f0ff37cf1f0674a71a5419617a65880a691c6bb8a8a4343c96c2e5ec204e40193cabe890aed85b30ba9513e - languageName: node - linkType: hard - "compressible@npm:~2.0.16": version: 2.0.18 resolution: "compressible@npm:2.0.18" @@ -1661,7 +1580,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:*, debug@npm:4, debug@npm:4.1.1, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:~4.1.0": +"debug@npm:*, debug@npm:4, debug@npm:4.1.1, debug@npm:^4.1.0, debug@npm:^4.1.1": version: 4.1.1 resolution: "debug@npm:4.1.1" dependencies: @@ -1679,7 +1598,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:3.1.0, debug@npm:=3.1.0, debug@npm:~3.1.0": +"debug@npm:3.1.0, debug@npm:=3.1.0": version: 3.1.0 resolution: "debug@npm:3.1.0" dependencies: @@ -1972,52 +1891,6 @@ __metadata: languageName: node linkType: hard -"engine.io-client@npm:~3.4.0": - version: 3.4.0 - resolution: "engine.io-client@npm:3.4.0" - dependencies: - component-emitter: 1.2.1 - component-inherit: 0.0.3 - debug: ~4.1.0 - engine.io-parser: ~2.2.0 - has-cors: 1.1.0 - indexof: 0.0.1 - parseqs: 0.0.5 - parseuri: 0.0.5 - ws: ~6.1.0 - xmlhttprequest-ssl: ~1.5.4 - yeast: 0.1.2 - checksum: 2/e293d8dc9ce19276654aa095ecf6d1e10a4b1216fceba2ccf772e0e8ed0431a80ccbbc38809407d7a13f36cf8ca59b04bd5833e926079805c5ed9fc4a8e918b6 - languageName: node - linkType: hard - -"engine.io-parser@npm:~2.2.0": - version: 2.2.0 - resolution: "engine.io-parser@npm:2.2.0" - dependencies: - after: 0.8.2 - arraybuffer.slice: ~0.0.7 - base64-arraybuffer: 0.1.5 - blob: 0.0.5 - has-binary2: ~1.0.2 - checksum: 2/cd467b8b12efa9db52ffb6691ef9ce8a67016cef83b61d548a1fb223c5a39c3b3dcee631deebc10d3c20a94a59fc58c63c70cee549ef947e85550ba5e8aee0af - languageName: node - linkType: hard - -"engine.io@npm:~3.4.0": - version: 3.4.0 - resolution: "engine.io@npm:3.4.0" - dependencies: - accepts: ~1.3.4 - base64id: 2.0.0 - cookie: 0.3.1 - debug: ~4.1.0 - engine.io-parser: ~2.2.0 - ws: ^7.1.2 - checksum: 2/70f1719ff79e15436ef659c89942266608224ed99dfb36e3e0a21ddb485f986f576b33314ef6ef25af644f9a361905ebd502530c34baab73610b042e7f6c9bb5 - languageName: node - linkType: hard - "enquirer@npm:2.3.5": version: 2.3.5 resolution: "enquirer@npm:2.3.5" @@ -2717,22 +2590,6 @@ __metadata: languageName: node linkType: hard -"has-binary2@npm:~1.0.2": - version: 1.0.3 - resolution: "has-binary2@npm:1.0.3" - dependencies: - isarray: 2.0.1 - checksum: 2/1a80bcdcef9336c94c0cdd61b9adff66714a964c956bb6eac6732cdb283dcf507841c56d7d186708c36fe2c6fc3d7b12a63f44fa19dc8ffd61c12e76a2e2f136 - languageName: node - linkType: hard - -"has-cors@npm:1.1.0": - version: 1.1.0 - resolution: "has-cors@npm:1.1.0" - checksum: 2/c8257cbe3fc1c2f49d293879f0c6873c6fa7ba7be44147f9a9023cc421c7842833c3553f46bdc04459f046c1c74eb9c7a98e63fdd2c7713caaddd26b1b7f9043 - languageName: node - linkType: hard - "has-flag@npm:^3.0.0": version: 3.0.0 resolution: "has-flag@npm:3.0.0" @@ -2938,13 +2795,6 @@ __metadata: languageName: node linkType: hard -"indexof@npm:0.0.1": - version: 0.0.1 - resolution: "indexof@npm:0.0.1" - checksum: 2/23dd379c2dec86d0f2d06d96b085bc2d30776d4222b6bea188dc02a742fcb7cab103da94bd1386fdff4c223b3948e7b165e1f5a6f747becc1c306c1f73468f4e - languageName: node - linkType: hard - "inflection@npm:1.12.0, inflection@npm:~1.12.0": version: 1.12.0 resolution: "inflection@npm:1.12.0" @@ -3191,13 +3041,6 @@ __metadata: languageName: node linkType: hard -"isarray@npm:2.0.1": - version: 2.0.1 - resolution: "isarray@npm:2.0.1" - checksum: 2/1387ed49e8cca6aded4ac16a0e6ecf8f0e607ca1d5d5a8e3ab264e506c07a958174951bd1ab638c1f40bf97a122ab5dd15b191d85c7d9966dfa2b40455528984 - languageName: node - linkType: hard - "isarray@npm:~1.0.0": version: 1.0.0 resolution: "isarray@npm:1.0.0" @@ -4103,13 +3946,6 @@ __metadata: languageName: node linkType: hard -"object-component@npm:0.0.3": - version: 0.0.3 - resolution: "object-component@npm:0.0.3" - checksum: 2/ae3417629f7da6f40dc2e50636f40ee33cd2f317cf8744204c24c505e78f9290e36d3ed2812a38e248b34e43982ae8e6e35ed6602655c736fe37de5e39d6d992 - languageName: node - linkType: hard - "object-inspect@npm:^1.7.0": version: 1.7.0 resolution: "object-inspect@npm:1.7.0" @@ -4309,24 +4145,6 @@ __metadata: languageName: node linkType: hard -"parseqs@npm:0.0.5": - version: 0.0.5 - resolution: "parseqs@npm:0.0.5" - dependencies: - better-assert: ~1.0.0 - checksum: 2/46444c9a5bf2ec301bd61cc6020cac30a4e85e58f6d49176aa8773247940029b2df9cac3eabc498810d0c79aad2dcb9f28820fbf9bfdfd067eb0d16ee0c32d51 - languageName: node - linkType: hard - -"parseuri@npm:0.0.5": - version: 0.0.5 - resolution: "parseuri@npm:0.0.5" - dependencies: - better-assert: ~1.0.0 - checksum: 2/5a16cd5292be2c99558efee22e7dca8f35e88612cc9d3be944b1c826c78ecd7bacfa1e18cea9157b6c3ad4bf4c72be08ccba592a19346bf216207a85d181993b - languageName: node - linkType: hard - "parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" @@ -5377,71 +5195,6 @@ resolve@^1.12.0: languageName: node linkType: hard -"socket.io-adapter@npm:~1.1.0": - version: 1.1.2 - resolution: "socket.io-adapter@npm:1.1.2" - checksum: 2/a5cbd66049cb7ca20d24cf0e5f7dd618ff517e6c3ca5f853a6deabfd2f832046e3b7103c4a606ef9e9638bf7802a17e099035812ee59e7c78fed6425bbd000a9 - languageName: node - linkType: hard - -"socket.io-client@npm:2.3.0, socket.io-client@npm:^2.2.0": - version: 2.3.0 - resolution: "socket.io-client@npm:2.3.0" - dependencies: - backo2: 1.0.2 - base64-arraybuffer: 0.1.5 - component-bind: 1.0.0 - component-emitter: 1.2.1 - debug: ~4.1.0 - engine.io-client: ~3.4.0 - has-binary2: ~1.0.2 - has-cors: 1.1.0 - indexof: 0.0.1 - object-component: 0.0.3 - parseqs: 0.0.5 - parseuri: 0.0.5 - socket.io-parser: ~3.3.0 - to-array: 0.1.4 - checksum: 2/e38863a3e26e566cda5459ae83be08dc5036d69ad63dd7ced98bd489e0539281ba683076d380a14e5bcdd939aca5ac1a701219e8e2cedb97459d2245e371b07a - languageName: node - linkType: hard - -"socket.io-parser@npm:~3.3.0": - version: 3.3.0 - resolution: "socket.io-parser@npm:3.3.0" - dependencies: - component-emitter: 1.2.1 - debug: ~3.1.0 - isarray: 2.0.1 - checksum: 2/9765ec0d6813abc4df20a2073ea60911f3820f08482b3a9f9468214b3ce2b99dc5b37e86f42cae0843640973480e02d03ab1cf48d65a7674ecc2ca4513d8e17a - languageName: node - linkType: hard - -"socket.io-parser@npm:~3.4.0": - version: 3.4.0 - resolution: "socket.io-parser@npm:3.4.0" - dependencies: - component-emitter: 1.2.1 - debug: ~4.1.0 - isarray: 2.0.1 - checksum: 2/631acc8adb98eca1cddd3ecc77e6f83d556fab5dff3c6890a8ffa818bbb3cabc5f67ff9cebed430d22364e7185e839b12a585900fa16e293688e78a4359c9bf4 - languageName: node - linkType: hard - -"socket.io@npm:^2.2.0": - version: 2.3.0 - resolution: "socket.io@npm:2.3.0" - dependencies: - debug: ~4.1.0 - engine.io: ~3.4.0 - has-binary2: ~1.0.2 - socket.io-adapter: ~1.1.0 - socket.io-client: 2.3.0 - socket.io-parser: ~3.4.0 - checksum: 2/12368e2b053bbedc1b2f3735cdb2aaeca446314ab2ff72dda3aebc56b74502a2b92abf3c2f1aaa9f98a287f4e390a52fccd7846f09d12353a5691452303fa723 - languageName: node - linkType: hard - "socks-proxy-agent@npm:^4.0.1": version: 4.0.2 resolution: "socks-proxy-agent@npm:4.0.2" @@ -5828,13 +5581,6 @@ resolve@^1.12.0: languageName: node linkType: hard -"to-array@npm:0.1.4": - version: 0.1.4 - resolution: "to-array@npm:0.1.4" - checksum: 2/c25a6d5e97705b08c8259eb92b31532d22d9be32fbd9f8e9fce9bc4a0e687d55284bfd51b3ef00e5cc06770312bffb675065468bf62630f6813d0e8ef8231df5 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -6232,15 +5978,6 @@ resolve@^1.12.0: languageName: node linkType: hard -"ws@npm:~6.1.0": - version: 6.1.4 - resolution: "ws@npm:6.1.4" - dependencies: - async-limiter: ~1.0.0 - checksum: 2/74c224573621110380d29e4c51b92eaec5f87c2fc779eb48873a60704e2ddebcaaadaa2ded3bc90a9b01bc453594dae7118c3c279c6ce6340334eb92c8ff04c2 - languageName: node - linkType: hard - "xdg-basedir@npm:^3.0.0": version: 3.0.0 resolution: "xdg-basedir@npm:3.0.0" @@ -6248,13 +5985,6 @@ resolve@^1.12.0: languageName: node linkType: hard -"xmlhttprequest-ssl@npm:~1.5.4": - version: 1.5.5 - resolution: "xmlhttprequest-ssl@npm:1.5.5" - checksum: 2/8bb71857be6fa5536a12998b5a65c73f6f86d38404a08e373d16cbb96f334148b0afe0041bc91a9cff817552a6a1f855806145a7bf0ac0c4a7beaf40d9f5f282 - languageName: node - linkType: hard - "xregexp@npm:2.0.0": version: 2.0.0 resolution: "xregexp@npm:2.0.0" @@ -6357,13 +6087,6 @@ resolve@^1.12.0: languageName: node linkType: hard -"yeast@npm:0.1.2": - version: 0.1.2 - resolution: "yeast@npm:0.1.2" - checksum: 2/ce326a71c7f25059ef7581121104c21d2837511a95cb44604f9e1825c5722f5b65324fb0b1d20bcfe3975efe45e418106100aa0d0e9fc502f90f3d07d059e177 - languageName: node - linkType: hard - "zeromq@npm:^5.1.0": version: 5.2.0 resolution: "zeromq@npm:5.2.0" -- cgit v1.2.3