ulduldp commited on
Commit
8709680
·
verified ·
1 Parent(s): 4ef1170

Create script.js

Browse files
Files changed (1) hide show
  1. public/script.js +88 -0
public/script.js ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ const socket = io();
2
+
3
+ const urlParams = new URLSearchParams(window.location.search);
4
+ const roomId = urlParams.get("room");
5
+ const name = urlParams.get("name");
6
+
7
+ document.getElementById("roomTitle").innerText = "Room: " + roomId;
8
+
9
+ let localStream;
10
+ let peers = {};
11
+
12
+ async function start() {
13
+ localStream = await navigator.mediaDevices.getUserMedia({ audio: true });
14
+
15
+ socket.emit("join-room", { roomId, name });
16
+
17
+ socket.on("all-users", (users) => {
18
+ for (let id in users) {
19
+ if (id !== socket.id) createPeer(id);
20
+ addUser(users[id]);
21
+ }
22
+ });
23
+
24
+ socket.on("user-joined", ({ id, name }) => {
25
+ createPeer(id);
26
+ addUser(name);
27
+ });
28
+
29
+ socket.on("signal", async ({ from, data }) => {
30
+ if (!peers[from]) createPeer(from, false);
31
+
32
+ if (data.sdp) {
33
+ await peers[from].setRemoteDescription(data.sdp);
34
+ if (data.sdp.type === "offer") {
35
+ const answer = await peers[from].createAnswer();
36
+ await peers[from].setLocalDescription(answer);
37
+ socket.emit("signal", { to: from, data: { sdp: peers[from].localDescription } });
38
+ }
39
+ }
40
+
41
+ if (data.candidate) {
42
+ await peers[from].addIceCandidate(data.candidate);
43
+ }
44
+ });
45
+
46
+ socket.on("user-left", (id) => {
47
+ if (peers[id]) peers[id].close();
48
+ });
49
+ }
50
+
51
+ function createPeer(id, initiator = true) {
52
+ const peer = new RTCPeerConnection();
53
+
54
+ localStream.getTracks().forEach(track => peer.addTrack(track, localStream));
55
+
56
+ peer.onicecandidate = (e) => {
57
+ if (e.candidate) {
58
+ socket.emit("signal", {
59
+ to: id,
60
+ data: { candidate: e.candidate }
61
+ });
62
+ }
63
+ };
64
+
65
+ peer.ontrack = (e) => {
66
+ const audio = document.createElement("audio");
67
+ audio.srcObject = e.streams[0];
68
+ audio.autoplay = true;
69
+ document.body.appendChild(audio);
70
+ };
71
+
72
+ peers[id] = peer;
73
+
74
+ if (initiator) {
75
+ peer.createOffer().then(offer => {
76
+ peer.setLocalDescription(offer);
77
+ socket.emit("signal", { to: id, data: { sdp: offer } });
78
+ });
79
+ }
80
+ }
81
+
82
+ function addUser(name) {
83
+ const div = document.createElement("div");
84
+ div.innerText = "👤 " + name;
85
+ document.getElementById("users").appendChild(div);
86
+ }
87
+
88
+ start();