Помоги сделать GitVerse лучше — пройди опрос
/
server.js 
125 строк · 3.1 Кб
1
const path = require('path');
2
const express = require('express');
3
const app = express();
4
const server = require('http').createServer(app);
5
const io = require('socket.io')(server);
6

7
const ACTIONS = require('./src/new/socket/actions');
8
const PORT =  3001;
9

10
const usersMap = new Map()
11

12
function getClientRooms() { // Функция возвращает списко всех комнат
13
  const {rooms} = io.sockets.adapter;
14

15
  return Array.from(rooms.keys()).filter(roomID => roomID.split(':')[0] =='room');
16
}
17

18
function shareRoomsInfo() { // Отправляет списко всех комнат всем сокетам
19
  io.emit(ACTIONS.SHARE_ROOMS, {
20
    rooms: getClientRooms()
21
  })
22
}
23

24
io.on('connection', socket => {
25
  shareRoomsInfo();
26

27
  socket.on(ACTIONS.JOIN, config => {
28
    
29
    const {room: roomID} = config;
30
    const {user} = config;
31
    const {rooms: joinedRooms} = socket;
32
    console.log(`Пользователь вошел в комнату ${roomID}`)
33

34
    if (Array.from(joinedRooms).includes(roomID)) {
35
      return console.warn(`Already joined to ${roomID}`);
36
    }
37

38
    const clients = Array.from(io.sockets.adapter.rooms.get(`room:${roomID}`) || []);
39
    
40
    usersMap.set(socket.id, {
41
      ...user,
42
      socketId:socket.id,
43
    })
44
    const usersArray = Array.from(usersMap);
45
    io.emit(ACTIONS.SHARE_USERS, usersArray);
46

47
    clients.forEach(clientID => {
48
      const user = usersMap.get(clientID)
49
      io.to(clientID).emit(ACTIONS.ADD_PEER, {
50
        peerID: socket.id,
51
        createOffer: false,
52
        user
53
      });
54

55
      
56

57
      socket.emit(ACTIONS.ADD_PEER, {
58
        peerID: clientID,
59
        createOffer: true,
60
        user
61
      });
62
    });
63

64
    socket.join(`room:${roomID}`);
65
    shareRoomsInfo();
66
  });
67

68
  function leaveRoom() {
69
    const {rooms} = socket;
70
    console.log(`Пользователь покинул в комнату`)
71
    Array.from(rooms)
72
      .forEach(roomID => {
73
        if(roomID.split(':')[0]=='room'){
74
          const clients = Array.from(io.sockets.adapter.rooms.get(roomID) || []);
75
          clients
76
            .forEach(clientID => {
77
            io.to(clientID).emit(ACTIONS.REMOVE_PEER, {
78
              peerID: socket.id,
79
            });
80
  
81
            socket.emit(ACTIONS.REMOVE_PEER, {
82
              peerID: clientID,
83
            });
84
          });
85
  
86
          socket.leave(`room:${roomID}`);
87
        }
88

89
      });
90

91
    shareRoomsInfo();
92
  }
93

94
  socket.on(ACTIONS.LEAVE, leaveRoom);
95
  socket.on('disconnecting', leaveRoom);
96

97
  socket.on(ACTIONS.RELAY_SDP, ({peerID, sessionDescription}) => {
98
    console.log(`RELAY_SDP `)
99
    io.to(peerID).emit(ACTIONS.SESSION_DESCRIPTION, {
100
      peerID: socket.id,
101
      sessionDescription,
102
    });
103
  });
104

105
  socket.on(ACTIONS.RELAY_ICE, ({peerID, iceCandidate}) => {
106
    console.log(`RELAY_ICE ${peerID}`)
107
    io.to(peerID).emit(ACTIONS.ICE_CANDIDATE, {
108
      peerID: socket.id,
109
      iceCandidate,
110
    });
111
  });
112

113
});
114

115
const publicPath = path.join(__dirname, 'build');
116

117
app.use(express.static(publicPath));
118

119
app.get('*', (req, res) => {
120
  res.sendFile(path.join(publicPath, 'index.html'));
121
});
122

123
server.listen(PORT, () => {
124
  console.log('Server Started!')
125
})

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.