aboutsummaryrefslogtreecommitdiffstats
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
parentbaba2be1a1ae06833ee324948cd1b8d339ed5323 (diff)
downloadcoinos-server-816bfa54afd50059d781a9da5dc953611b9fdc66.tar.gz
coinos-server-816bfa54afd50059d781a9da5dc953611b9fdc66.zip
use ws instead of socket.io
-rw-r--r--lib/rates.js2
-rw-r--r--lib/sockets.js81
-rw-r--r--package.json2
-rw-r--r--routes/users.js3
-rw-r--r--yarn.lock283
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"