-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
155 lines (111 loc) · 4.43 KB
/
app.js
File metadata and controls
155 lines (111 loc) · 4.43 KB
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
153
154
155
const express = require('express');
var cors = require('cors')
const app = express();
const http = require('http');
const server = http.createServer(app);
const { Server } = require("socket.io");
const generateRandom = require('./utils/random');
const port = process.env.PORT || 3000;
const io = new Server(server, {
cors: {
origin: "*",
},
});
const socketIdToUser = new Map();
const socketIdToRoomId = new Map();
const socketIdToPeerId = new Map();
app.use(cors());
app.get('/', (req, res) => {
res.send("ok")
});
app.use('/compile', require('./routes/compiler'));
app.get('/room/:roomId', async (req, res) => {
var roomId = req.params.roomId;
//get all room client-sockets
roomClientSockets = await io.in(roomId).fetchSockets();
var roomClients = [];
roomClientSockets.filter((client) => roomClients.push(client.id));
res.send(roomClients);
});
io.on('connection', (socket) => {
console.log(socket.id, ' connected');
/* Create Room */
socket.on('create-room', () => {
// Generate Random Room ID
var roomId = generateRandom()
// Join Room with random Id
socket.join(roomId);
socketIdToRoomId.set(socket.id, roomId);
console.log(socket.id, ' has joined room ', roomId);
// Sending response user succesfully join the room
socket.emit("joined-room", { roomId: roomId });
});
/* Join Room */
socket.on('join-room', async (data) => {
const { roomId } = data;
//Get room clients
roomClients = await io.in(roomId).fetchSockets();
//room user max 2
if (roomClients.length < 2) {
socket.join(roomId);
socketIdToRoomId.set(socket.id, roomId);
console.log(socket.id, ' has joined room ', roomId);
// Sending response user succesfully join the room
socket.emit("joined-room", { roomId: roomId });
console.log(roomClients.length);
}
else {
// Sending response room is full
socket.emit("join-room-error", { message: "room is full" });
console.log(roomId, ' room is full');
}
});
socket.on("join-meeting", async (data) => {
const { user, roomId, peerId, } = data;
socketIdToPeerId.set(socket.id, peerId);
socketIdToUser.set(socket.id, user);
//Get room clients
roomClients = await io.in(roomId).fetchSockets();
if (roomClients.length == 1) {
socket.emit("joined-meeting");
return;
}
if (roomClients.length == 2) {
var anotherClient = roomClients.filter((client) => client.id != socket.id);
var peer = socketIdToPeerId.get(anotherClient[0].id);
socket.emit("joined-meeting-call", { peerId: peer });
for (const index in roomClients) {
if (roomClients[index].id != socket.id) {
var existedUser = socketIdToUser.get(roomClients[index].id)
var newUser = socketIdToUser.get(socket.id)
// send new user to existed user data
socket.emit('recived-existed-user', { user: existedUser });
// send existed user to new user data
io.to(roomClients[index].id).emit('new-user-joined', { user: newUser });
}
}
}
});
socket.on('code-change', async (data) => {
const { roomId, code } = data;
var roomClients = await io.in(roomId).fetchSockets();
if (roomClients.length == 0) return;
var anotherClient = roomClients.filter((client) => client.id != socket.id);
if (anotherClient.length == 0) return;
io.to(anotherClient[0].id).emit('code-change', { code: code });
});
socket.on('send-message', ({ text, username, room }) => {
io.to(room).emit('recived-message', { text: text, username: username, time: new Date() });
})
/* client disconnect */
socket.on('disconnect', () => {
var roomId = socketIdToRoomId.get(socket.id);
var user = socketIdToUser.get(socket.id);
socket.to(roomId).emit('disconnected', { user: user });
socketIdToUser.delete(socket.id);
socketIdToPeerId.delete(socket.id);
socketIdToRoomId.delete(socket.id);
console.warn(socket.id, roomId, ' disconnected');
})
});
server.listen(port, () => console.log(`Example app listening on port ${port}!`));