-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathsockLogic.js
124 lines (99 loc) · 3.28 KB
/
sockLogic.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
module.exports = function (server) {
'use strict';
const io = require('socket.io').listen(server);
const connections = [];
const rooms = [];
//room constructor
function Room(obj) {
this.id = obj.roomId;
this.members = [];
this.addMember = function(member) {
this.members.push(member)
}
}
//member constructor
function Member(socketId, roomId, initiator) {
this.id = socketId;
this.roomId = roomId
this.initiator = initiator;
this.signalId = null;
}
io.sockets.on('connection', function(socket) {
connections.push(socket);
console.log(socket.id + ' joined!')
//disconnecting users
socket.on('severe', function() {
console.log('disconnect triggered')
let member,
room,
otherMem;
// index;
rooms.forEach(function(ele, idx) {
member = ele.members.filter(client => client.id === socket.id)[0];
if (member) {
if (rooms[idx].members.length > 0) {
rooms[idx].members.forEach((el, id) => {
io.to(el.id).emit('updateChatters', member);
})
}
ele.members.splice(ele.members.indexOf(member), 1);
if (!rooms[idx].members.length) rooms.splice(idx, 1);
}
})
connections.splice(connections.indexOf(socket), 1);
console.log(socket.id + ' left room ' + member.roomId)
socket.disconnect();
})
//join room logic
socket.on('joinRoom', (payload) => {
payload = JSON.parse(payload);
let roomCheck = rooms.filter(room => room.id === payload);
if (roomCheck.length > 0) {
if (roomCheck[0].members > 1) {
io.to(socket.id).emit('process', JSON.stringify(false));
} else {
io.to(socket.id).emit('process', JSON.stringify(true));
}
} else {
io.to(socket.id).emit('process', JSON.stringify(true));
}
})
//initiate
socket.on('initiate', (payload) => {
payload = JSON.parse(payload);
let existingRoom = rooms.filter(room => room.id === payload.roomId),
room,
member;
if (existingRoom.length === 0) {
room = new Room(payload);
member = new Member(socket.id, payload.roomId, true)
room.addMember(member);
rooms.push(room);
} else if (existingRoom[0].members.length === 1) {
member = new Member(socket.id, payload.roomId, false)
existingRoom[0].addMember(member)
existingRoom[0].members.forEach((ele, idx) => {
io.to(ele.id).emit('readyConnect', JSON.stringify('both connected'));
})
}
io.to(socket.id).emit('initiated', JSON.stringify(member));
});
//beginning of signaling
socket.on('message', function(payload) {
let sharedRoom = rooms.filter(room => room.id === payload.roomID)[0];
// not used for anything yet but maybe for chatroom fallback?
// if (payload.who === 'all') {
// sharedRoom.members.forEach((ele, idx) => {
// io.to(ele.id).emit('message', payload.data);
// });
// } else
if (payload.who === 'other') {
sharedRoom.members.forEach((ele, idx) => {
if (ele.id !== socket.id){
io.to(ele.id).emit('message', payload.data);
}
});
}
}); //end of signaling
})
};