Anton Shestakov <av6@dwimlabs.net>, Fri, 08 Apr 2016 22:13:02 +0800
register: progress bar on top
coffee/webrtc.coffee
Permissions: -rw-r--r--
class Tram.WebRTCInterface constructor: (@contact) -> @peerJid = @contact.get('jid') init: (@initiator, constraints) -> if constraints.audio || constraints.video navigator.getUserMedia(constraints, @connect, @fail) @call = calls.add(jid: @peerJid) @pc = new RTCPeerConnection(iceServers: Tram.config.iceServers) @call.set('local/stream', stream) @pc.onicecandidate = (event) => @sendPayload(event.candidate, 'ice') @pc.onaddstream = (event) => @call.set('remote/stream', event.stream) @contact.set('callstate', 'established') el = stanza.getElementsByTagName('payload')[0] signal = JSON.parse(el.firstChild.nodeValue) if signal.type is 'offer' else if signal.type is 'answer' @pc.addIceCandidate(new RTCIceCandidate(signal)) sendPayload: (data, type) -> payload = JSON.stringify(data) msg = $msg(to: @peerJid, type: 'chat') .c('payload', xmlns: Tram.NS.WEBRTC, type: type).t(payload) msg = $msg(to: @peerJid, type: 'chat') .c('intent', xmlns: Tram.NS.WEBRTC).t(intent) @pc.createOffer((offer) => @pc.setLocalDescription(offer, => @sendPayload(@pc.localDescription, 'offer') @pc.setRemoteDescription(new RTCSessionDescription(offer), => @pc.createAnswer((answer) => @pc.setLocalDescription(answer, => @sendPayload(@pc.localDescription, 'answer') receiveAnswer: (answer) -> @pc.setRemoteDescription(new RTCSessionDescription(answer)) @contact.unset('callstate') @call.unset('remote/stream') @call.unset('local/stream') #@pc?.removeStream?(@rstream) #@pc?.removeStream?(@lstream) if stream.getAudioTracks? for track in stream.getAudioTracks() if stream.getVideoTracks? for track in stream.getVideoTracks()