aboutsummaryrefslogtreecommitdiff
path: root/server/index.js
blob: e60795f8543e470edef67051d90d25e3484876f6 (plain)
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
import { Server } from "socket.io";
import { port } from "./config.js";
import * as events from "./events.js";

const server = new Server(port);
console.debug(`Listening on port ${port}`);

const rooms = {};

server.on(events.types.CONNECTION, (socket) => {
  const me = socket.id;

  console.debug(`[CONNECT] New client connected with ID ${me}`);

  socket.on(events.types.JOIN, async ({ room }) => {
    socket.join(room);

    if (!rooms[room]) {
      rooms[room] = [];
    }

    rooms[room].push(socket.id);

    const sockets = await server.in(room).fetchSockets();
    sockets.forEach((peer) => {
      if (peer.id !== me) {
        events.addPeer(me, false)(peer);
        events.addPeer(peer.id, true)(socket);
      }
    });
  });

  socket.on(events.types.DISCONNECTING, () => {
    for (const room in rooms) {
      if (rooms[room].includes(me)) {
        rooms[room] = rooms[room].filter((id) => id !== me);
        events.removePeer(me)(socket.to(room));
        if (rooms[room].length === 0) {
          delete rooms[room];
        }
      }
    }
  });

  socket.on(events.types.RELAY_ICE_CANDIDATE, async ({ candidate, peerId }) => {
    events.ICECandidateReceived(me, candidate)(socket.to(peerId));
  });

  socket.on(events.types.RELAY_OFFER, async ({ offer, peerId }) => {
    events.offerReceived(me, offer)(socket.to(peerId));
  });

  socket.on(events.types.RELAY_ANSWER, async ({ answer, peerId }) => {
    events.answerReceived(me, answer)(socket.to(peerId));
  });
});