class Self { uuid = null connections = [] constructor() { this.connections.push(new Stream(this.id(), {audio: true, video: true})) } start(isCaller) { for(var i of this.connections) i.start(isCaller) } id() { this.uuid = this.get("uuid") if (!this.uuid) { s4 = () => Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1) this.uuid = s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); this.set("uuid", this.uuid) } return this.uuid } get(k) { var name = k + "="; var decodedCookie = decodeURIComponent(document.cookie); var ca = decodedCookie.split(';'); for(var i = 0; i this.gotIceCandidate(e); this.peerConnection.ontrack = (e) => this.gotRemoteStream(e); this.peerConnection.addStream(this.localStream); if(isCaller) { this.peerConnection .createOffer({ 'iceRestart': true, 'voiceActivityDetection': true, }) .then((d) => this.createdDescription(d)) .catch((m) => this.errorHandler(m)); } } getUserMediaSuccess(stream) { this.localVideo = document.getElementById('localVideo'); this.remoteVideo = document.getElementById('remoteVideo'); this.localStream = stream; this.localVideo.srcObject = stream; } gotMessageFromServer(message) { if(!this.peerConnection) start(false); var signal = JSON.parse(message.data); // Ignore messages from ourself if(signal.uuid == this.id) return; if(signal.sdp) { this.peerConnection.setRemoteDescription(new RTCSessionDescription(signal.sdp)).then(function() { // Only create answers in response to offers if(signal.sdp.type == 'offer') { this.peerConnection .createAnswer() .then((d) => this.createdDescription(d)) .catch((e) => this.errorHandler(e)); } }).catch((e) => this.errorHandler(e)); } else if(signal.ice) { this.peerConnection .addIceCandidate(new RTCIceCandidate(signal.ice)) .catch((e) => this.errorHandler(e)); } } gotIceCandidate(event) { if(event.candidate != null) { this.serverConnection .send(JSON.stringify({ 'ice': event.candidate, 'uuid': this.id, })); } } createdDescription(description) { console.log('got description'); this.peerConnection .setLocalDescription(description) .then(() => { this.serverConnection.send(JSON.stringify({ 'sdp': this.peerConnection.localDescription, 'uuid': this.id, })); }) .catch((e) => this.errorHandler(e)); } gotRemoteStream(event) { console.log('got remote stream'); this.remoteVideo.srcObject = event.streams[0]; } errorHandler(error) { console.log(error); } } var self function pageReady() { self = new Self() } function start(isCaller) { self.start(isCaller) }