Skip to content
This repository was archived by the owner on Dec 15, 2019. It is now read-only.

Commit 861f24c

Browse files
committed
Add websocket handler
1 parent 11a19fa commit 861f24c

File tree

4 files changed

+94
-6
lines changed

4 files changed

+94
-6
lines changed

package-lock.json

Lines changed: 13 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@
2828
"mongodb": "^3.1.10",
2929
"mongoose": "^5.4.0",
3030
"multer": "^1.4.1",
31-
"pm2": "^3.2.9"
31+
"pm2": "^3.2.9",
32+
"ws": "^6.1.3"
3233
},
3334
"devDependencies": {
3435
"eslint": "^5.10.0",

src/app.js

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
const compression = require('compression');
22
const express = require('express');
3+
const server = require('http').createServer();
34
const fs = require('fs');
45
const cors = require('cors');
56
const path = require('path');
@@ -31,5 +32,9 @@ app.use(cors());
3132
// GraphQL API Module
3233
app.use('/api', require('./api/api'));
3334

34-
// Start
35-
app.listen(config.server.port);
35+
// Spawn Websocket
36+
require('./websocket')(server);
37+
38+
// Add express http-server
39+
server.on('request', app);
40+
server.listen(config.server.port);

src/websocket.js

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
const userModel = require('./models/user');
2+
const WebSocket = require('ws');
3+
4+
module.exports = server => {
5+
const wss = new WebSocket.Server({server: server});
6+
const userMap = {};
7+
8+
wss.on('connection', ws => {
9+
let user;
10+
11+
ws.on('message', async message => {
12+
13+
// Try to parse message
14+
try {
15+
message = JSON.parse(message);
16+
} catch (ignored) {
17+
return;
18+
}
19+
20+
const {type, value} = message;
21+
switch (type) {
22+
case 'register': {
23+
if (typeof value === 'string' && value) {
24+
user = await userModel.findOne({apikeys: {$elemMatch: {key: value}}});
25+
26+
if (!user) {
27+
return;
28+
}
29+
30+
const userid = user.id;
31+
if (!(userid in userMap)) {
32+
userMap[userid] = [];
33+
}
34+
35+
userMap[userid].push(ws);
36+
}
37+
38+
break;
39+
}
40+
case 'broadcast': {
41+
if (user) {
42+
const socketList = userMap[user.id];
43+
44+
// Broadcast message
45+
for (let i = 0, l = socketList.length; i < l; i++) {
46+
const socket = socketList[i];
47+
48+
if (socket !== ws) {
49+
socket.send(JSON.stringify(value));
50+
}
51+
}
52+
}
53+
break;
54+
}
55+
}
56+
});
57+
58+
ws.on('close', () => {
59+
60+
// Check if socket was registered
61+
if (user) {
62+
const socketList = userMap[user.id];
63+
const idx = socketList.indexOf(ws);
64+
65+
// Remove socket
66+
if (~idx) {
67+
socketList.splice(idx, 1);
68+
}
69+
}
70+
});
71+
});
72+
};

0 commit comments

Comments
 (0)