-
Notifications
You must be signed in to change notification settings - Fork 6
/
server.js
152 lines (126 loc) · 4.79 KB
/
server.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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
const http = require('http');
require('dotenv').config()
const express = require('express');
const socketio = require('socket.io');
var bodyParser = require('body-parser')
const mongoose = require('mongoose')
const cors = require('cors');
const app = express();
const server = http.createServer(app);
const io = socketio(server);
const route = require('./Route/index');
const adminRouter = require('./Route/admin.router')
const MONGO_URL =process.env.MONGO_URL||"test"
app.use(cors());
app.use('/admin', adminRouter)
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(route);
const users = {};
const usersNames = {};
const usersOnSameNetwork = {};
const socketToRoom = {};
app.get("/", (req, res) => {
res.send({
response: "Server is up and running.",
users,
usersNames
}).status(200);
});
io.on('connection', socket => {
socket.on("join room", (roomID, private) => {
if (users[roomID] && private) {
const length = users[roomID].length;
if (length === 2) {
socket.emit("room full");
return;
}
let name = Math.floor(Math.random() * 50) + 1;
users[roomID].push(socket.id);
usersNames[roomID].push({id:socket.id,name})
} else if (private) {
users[roomID] = [socket.id];
let name = Math.floor(Math.random() * 50) + 1
usersNames[roomID] = [{id:socket.id,name}];
const usersNamesInThisRoom = usersNames[roomID]
socket.emit("usernames", usersNamesInThisRoom);
}
socketToRoom[socket.id] = roomID;
const usersInThisRoom = users[roomID].filter(id => id !== socket.id);
const usersNamesInThisRoom = usersNames[roomID]
socket.emit("usernames", usersNamesInThisRoom);
socket.emit("all users", {usersInThisRoom,usersNamesInThisRoom});
});
socket.on("join room using ip", (roomID) => {
if (users[roomID]) {
const length = users[roomID].length;
if (length === 5) {
socket.emit("room full");
return;
}
let name = Math.floor(Math.random() * 50) + 1;
users[roomID].push(socket.id);
usersNames[roomID].push({id:socket.id,name})
} else {
users[roomID] = [socket.id];
let name = Math.floor(Math.random() * 50) + 1
usersNames[roomID] = [{id:socket.id,name}]
}
socketToRoom[socket.id] = roomID;
const usersInThisRoom = users[roomID].filter(id => id !== socket.id);
const usersNamesInThisRoom = usersNames[roomID].filter(id => id.name !== socket.id);
socket.emit("all users", {usersInThisRoom,usersNamesInThisRoom});
});
socket.on("sending signal", payload => {
const roomID = socketToRoom[socket.id];
const usersNamesInThisRoom = usersNames[roomID]
socket.emit("usernames", usersNamesInThisRoom);
io.to(payload.userToSignal).emit('user joined', {
signal: payload.signal,
callerID: payload.callerID,
username:payload.username
});
});
socket.on("returning signal", payload => {
const roomID = socketToRoom[socket.id];
const usersNamesInThisRoom = usersNames[roomID].filter(id => id.name !== socket.id);
socket.emit("usernames", usersNamesInThisRoom);
io.to(payload.callerID).emit('receiving returned signal', {
signal: payload.signal,
id: socket.id,
username:payload.username
});
});
socket.on('disconnect', () => {
const roomID = socketToRoom[socket.id];
let pos
let room = users[roomID];
if (room) {
room.forEach((id,index) => id == socket.id?pos=index:0);
room = room.filter((id,index) => id !== socket.id);
users[roomID] = room;
usersNames[roomID] = usersNames[roomID].filter((item,index)=> index!==pos)
if(users[roomID].length===0){
delete users[roomID]
delete usersNames[roomID]
}else {
const returningUser = users[roomID][0]
const returningUsers = users[roomID]
io.to(returningUser).emit('user left', {
signal: "user left"
});
returningUsers.forEach(item => io.to(item).emit('usernames',usersNames[roomID]))
returningUsers.forEach(item => io.to(item).emit('user left', {
signal: "user left"
}));
}
}
});
});
const run = async() =>{
MONGO_URL!="test"?await mongoose.connect(MONGO_URL, {
useNewUrlParser: true
}):null
server.listen(process.env.PORT || 8000, () => console.log('server is running on port 8000'));
}
run()