|
|
|
@ -47,6 +47,10 @@ angular.module('MatrixCall', []) |
|
|
|
|
this.call_id = "c" + new Date().getTime(); |
|
|
|
|
this.state = 'fledgling'; |
|
|
|
|
this.didConnect = false; |
|
|
|
|
|
|
|
|
|
// a queue for candidates waiting to go out. We try to amalgamate candidates into a single candidate message where possible
|
|
|
|
|
this.candidateSendQueue = []; |
|
|
|
|
this.candidateSendTries = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
MatrixCall.prototype.createPeerConnection = function() { |
|
|
|
@ -174,12 +178,7 @@ angular.module('MatrixCall', []) |
|
|
|
|
MatrixCall.prototype.gotLocalIceCandidate = function(event) { |
|
|
|
|
console.log(event); |
|
|
|
|
if (event.candidate) { |
|
|
|
|
var content = { |
|
|
|
|
version: 0, |
|
|
|
|
call_id: this.call_id, |
|
|
|
|
candidate: event.candidate |
|
|
|
|
}; |
|
|
|
|
this.sendEventWithRetry('m.call.candidate', content); |
|
|
|
|
this.sendCandidate(event.candidate); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -370,5 +369,53 @@ angular.module('MatrixCall', []) |
|
|
|
|
}, delayMs); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
// Sends candidates with are sent in a special way because we try to amalgamate them into one message
|
|
|
|
|
MatrixCall.prototype.sendCandidate = function(content) { |
|
|
|
|
this.candidateSendQueue.push(content); |
|
|
|
|
var self = this; |
|
|
|
|
if (this.candidateSendTries == 0) $timeout(function() { self.sendCandidateQueue(); }, 100); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
MatrixCall.prototype.sendCandidateQueue = function(content) { |
|
|
|
|
if (this.candidateSendQueue.length == 0) return; |
|
|
|
|
|
|
|
|
|
var cands = this.candidateSendQueue; |
|
|
|
|
this.candidateSendQueue = []; |
|
|
|
|
++this.candidateSendTries; |
|
|
|
|
var content = { |
|
|
|
|
version: 0, |
|
|
|
|
call_id: this.call_id, |
|
|
|
|
candidates: cands |
|
|
|
|
}; |
|
|
|
|
var self = this; |
|
|
|
|
console.log("Attempting to send "+cands.length+" candidates"); |
|
|
|
|
matrixService.sendEvent(self.room_id, 'm.call.candidates', undefined, content).then(function() { self.candsSent(); }, function(error) { self.candsSendFailed(cands, error); } ); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
MatrixCall.prototype.candsSent = function() { |
|
|
|
|
this.candidateSendTries = 0; |
|
|
|
|
this.sendCandidateQueue(); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
MatrixCall.prototype.candsSendFailed = function(cands, error) { |
|
|
|
|
for (var i = 0; i < cands.length; ++i) { |
|
|
|
|
this.candidateSendQueue.push(cands[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (this.candidateSendTries > 5) { |
|
|
|
|
console.log("Failed to send candidates on attempt "+ev.tries+". Giving up for now."); |
|
|
|
|
this.candidateSendTries = 0; |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
var delayMs = 500 * Math.pow(2, this.candidateSendTries); |
|
|
|
|
++this.candidateSendTries; |
|
|
|
|
console.log("Failed to send candidates. Retrying in "+delayMs+"ms"); |
|
|
|
|
var self = this; |
|
|
|
|
$timeout(function() { |
|
|
|
|
self.sendCandidateQueue(); |
|
|
|
|
}, delayMs); |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
return MatrixCall; |
|
|
|
|
}]); |
|
|
|
|