-
Notifications
You must be signed in to change notification settings - Fork 0
/
server.js
121 lines (103 loc) · 3.78 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
const path = require('path');
const express = require('express');
const app = express();
const socketIO = require('socket.io');
const port = process.env.PORT || 8080;
const env = process.env.NODE_ENV || 'development';
// Redirect to https
app.get('*', (req, res, next) => {
if (req.headers['x-forwarded-proto'] !== 'https' && env !== 'development') {
return res.redirect(['https://', req.get('Host'), req.url].join(''));
}
next();
});
app.use(express.static(path.join(__dirname, 'public')));
app.use(express.static(path.join(__dirname, 'node_modules')));
const server = require('http').createServer(app);
server.listen(port, () => {
console.log(`listening on port ${port}`);
});
/**
* Socket.io events
*/
const io = socketIO(server);
io.sockets.on('connection', function (socket) {
/**
* Log actions to the client
*/
function log() {
const array = ['Server:'];
array.push.apply(array, arguments);
socket.emit('log', array);
}
/**
* Handle message from a client
* If toId is provided message will be sent ONLY to the client with that id
* If toId is NOT provided and room IS provided message will be broadcast to that room
* If NONE is provided message will be sent to all clients
*/
socket.on('message', (message, toId = null, room = null) => {
log('Client ' + socket.id + ' said: ', message);
if (toId) {
console.log('From ', socket.id, ' to ', toId, message.type);
io.to(toId).emit('message', message, socket.id);
} else if (room) {
console.log('From ', socket.id, ' to room: ', room, message.type);
socket.broadcast.to(room).emit('message', message, socket.id);
} else {
console.log('From ', socket.id, ' to everyone ', message.type);
socket.broadcast.emit('message', message, socket.id);
}
});
let roomAdmin; // save admins socket id (will get overwritten if new room gets created)
/**
* When room gets created or someone joins it
*/
socket.on('create or join', (room) => {
log('Create or Join room: ' + room);
// Get number of clients in the room
const clientsInRoom = io.sockets.adapter.rooms.get(room);
let numClients = clientsInRoom ? clientsInRoom.size : 0;
if (numClients === 0) {
// Create room
socket.join(room);
roomAdmin = socket.id;
socket.emit('created', room, socket.id);
} else {
log('Client ' + socket.id + ' joined room ' + room);
// Join room
io.sockets.in(room).emit('join', room); // Notify users in room
socket.join(room);
io.to(socket.id).emit('joined', room, socket.id); // Notify client that they joined a room
io.sockets.in(room).emit('ready', socket.id); // Room is ready for creating connections
}
});
/**
* Kick participant from a call
*/
socket.on('kickout', (socketId, room) => {
if (socket.id === roomAdmin) {
socket.broadcast.emit('kickout', socketId);
io.sockets.sockets.get(socketId).leave(room);
} else {
console.log('not an admin');
}
});
// participant leaves room
socket.on('leave room', (room) => {
socket.leave(room);
socket.emit('left room', room);
socket.broadcast.to(room).emit('message', { type: 'leave' }, socket.id);
});
/**
* When participant leaves notify other participants
*/
socket.on('disconnecting', () => {
socket.rooms.forEach((room) => {
if (room === socket.id) return;
socket.broadcast
.to(room)
.emit('message', { type: 'leave' }, socket.id);
});
});
});