-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
113 lines (95 loc) · 3.4 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
const express = require('express'), app = express()
const http = require('http')
const WebSocket = require('ws')
const path = require('path')
const config = require('config')
const { saveMessage, getPreviousMsgs } = require('./controllers/messageController')
const PORT = config.get('port')
/**
* Wrapper that will emit files processed by webpack to a server.
*/
require('dotenv').config()
if(process.env.NODE_ENV !== 'production') {
const webpack = require('webpack')
const webpackDevMiddleware = require('webpack-dev-middleware')
const webpackConfig = require('./webpack.dev')
const compiler = webpack(webpackConfig)
app.use(webpackDevMiddleware(compiler, {
publicPath: webpackConfig.output.publicPath
}))
}
// connect mongoDB
const mongoose = require('mongoose')
mongoose.connect(config.get('mongoID') , {useNewUrlParser: true, useUnifiedTopology: true}, (err) => {
if(err) throw err;
})
const server = http.createServer(app)
const wss = new WebSocket.Server({ server })
app.use('/chat', express.static(path.join(__dirname, '/build')))
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
// sign in
app.use('/auth', require('./routes/signin'))
// sign up
app.use('/auth', require('./routes/signup'))
app.get('/', (req, res) => {
res.redirect(`http://localhost:${PORT}/chat`)
})
app.use('/chat/room', require('./routes/chatRoom'))
wss.on('connection', async function connection(ws, req) {
// receive data from client
ws.on('message', async function incoming(message) {
let rawMessage = JSON.parse(message)
if(rawMessage.type === 'setUserData') {
/**
* After downloading the client, the client sends the user's data to the server,
* the server sets the data and sends the previous messages to the client
*/
let { id, username } = rawMessage
ws.user = { id, username }
return await sendPreviousMessages(ws)
}
else if(rawMessage.type === 'setRoomUserData') {
let { id, username } = rawMessage
return ws.user = { id, username }
}
else if(rawMessage.type === 'roomMessage') {
return await sendMessagesToRoom(ws, rawMessage)
}
message = JSON.stringify( { type: 'message', ...rawMessage } )
sendMessages(ws, message)
let response = await saveMessage(message)
})
})
wss.on('close', function close() {
console.log('connection closed')
})
/**
* @param {object} ws
* @param {string} message - JSON object from received message
*/
function sendMessages(ws, message) {
wss.clients.forEach(client => {
client.send(message);
})
}
async function sendMessagesToRoom(ws, rawMessage) {
let { users: roomUsers } = rawMessage.roomObj
let currentUserId = ws.user.id
wss.clients.forEach(client => {
let { id: user_id } = client.user
if( roomUsers.includes(user_id) && user_id !== currentUserId ) {
client.send(
JSON.stringify(rawMessage)
)
}
})
ws.send(JSON.stringify(rawMessage))
}
async function sendPreviousMessages(ws) {
let rawPreviousMsgs = await getPreviousMsgs()
let previousMsgs = rawPreviousMsgs.map(messageObj => messageObj.message)
ws.send( JSON.stringify({ type: 'previousMsgs', previousMsgs }) )
}
server.listen(PORT)