This repository was archived by the owner on Dec 15, 2019. It is now read-only.
File tree Expand file tree Collapse file tree 4 files changed +94
-6
lines changed Expand file tree Collapse file tree 4 files changed +94
-6
lines changed Original file line number Diff line number Diff line change 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" ,
Original file line number Diff line number Diff line change 11const compression = require ( 'compression' ) ;
22const express = require ( 'express' ) ;
3+ const server = require ( 'http' ) . createServer ( ) ;
34const fs = require ( 'fs' ) ;
45const cors = require ( 'cors' ) ;
56const path = require ( 'path' ) ;
@@ -31,5 +32,9 @@ app.use(cors());
3132// GraphQL API Module
3233app . 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 ) ;
Original file line number Diff line number Diff line change 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+ } ;
You can’t perform that action at this time.
0 commit comments