File size: 2,179 Bytes
87ce2bc
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Broadcaster - WebRTC Room</title>
    <link rel="stylesheet" href="/styles.css" />
  </head>
  <body>
    <h1>Broadcaster - Room: <span id="roomName"></span></h1>
    <video id="localVideo" autoplay muted playsinline></video>
    <script src="/socket.io/socket.io.js"></script>
    <script>
      const socket = io();
      const roomName = window.location.pathname.split("/").pop();
      document.getElementById("roomName").textContent = roomName;
      let peer;

      socket.emit("join-room", { roomName, type: "broadcaster" });

      async function startStream() {
        const stream = await navigator.mediaDevices.getUserMedia({
          video: true,
          audio: true,
        });
        document.getElementById("localVideo").srcObject = stream;

        // Wait for viewer
        socket.on("signal", async ({ from, data }) => {
          if (!peer) {
            peer = new RTCPeerConnection();
            stream.getTracks().forEach((track) => peer.addTrack(track, stream));
            peer.onicecandidate = (e) => {
              if (e.candidate)
                socket.emit("signal", {
                  to: from,
                  data: { candidate: e.candidate },
                });
            };
            peer.onnegotiationneeded = async () => {
              const offer = await peer.createOffer();
              await peer.setLocalDescription(offer);
              socket.emit("signal", {
                to: from,
                data: { desc: peer.localDescription },
              });
            };
          }
          if (data.desc) {
            await peer.setRemoteDescription(data.desc);
            if (data.desc.type === "offer") {
              const answer = await peer.createAnswer();
              await peer.setLocalDescription(answer);
              socket.emit("signal", {
                to: from,
                data: { desc: peer.localDescription },
              });
            }
          }
          if (data.candidate) await peer.addIceCandidate(data.candidate);
        });
      }
      startStream();
    </script>
  </body>
</html>