forked from team-genjutsu/miragejs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmirageSockets.js
executable file
·132 lines (102 loc) · 3.48 KB
/
mirageSockets.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
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.once('disconnect', function() {
console.log('disconnect triggered');
// console.log('room: ', rooms[0])
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);
socket.disconnect();
});
}
ele.members.splice(ele.members.indexOf(member), 1);
if (!rooms[idx].members.length) rooms.splice(idx, 1);
}
});
// console.log('after going through and disconnecting sockets',rooms)
connections.splice(connections.indexOf(socket), 1);
// console.log(socket.id + ' left room ' + member.roomId)
// console.log('room: ', rooms[0])
});
//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
});
};