diff --git a/libs/strophejingle.bundle.js b/libs/strophejingle.bundle.js index c7eec7b78..0d9761e37 100644 --- a/libs/strophejingle.bundle.js +++ b/libs/strophejingle.bundle.js @@ -1644,99 +1644,19 @@ JingleSession.prototype.sendIceCandidate = function (candidate) { if (this.usetrickle) { if (this.usedrip) { if (this.drip_container.length === 0) { - // start 10ms callout + // start 20ms callout window.setTimeout(function () { if (self.drip_container.length === 0) return; - var allcands = self.drip_container; + self.sendIceCandidates(self.drip_container); self.drip_container = []; - var cand = $iq({to: self.peerjid, type: 'set'}) - .c('jingle', {xmlns: 'urn:xmpp:jingle:1', - action: 'transport-info', - initiator: self.initiator, - sid: self.sid}); - for (var mid = 0; mid < self.localSDP.media.length; mid++) { - var cands = allcands.filter(function (el) { return el.sdpMLineIndex == mid; }); - if (cands.length > 0) { - var ice = SDPUtil.iceparams(self.localSDP.media[mid], self.localSDP.session); - ice.xmlns = 'urn:xmpp:jingle:transports:ice-udp:1'; - cand.c('content', {creator: self.initiator == self.me ? 'initiator' : 'responder', - name: cands[0].sdpMid - }).c('transport', ice); - for (var i = 0; i < cands.length; i++) { - cand.c('candidate', SDPUtil.candidateToJingle(cands[i].candidate)).up(); - } - // add fingerprint - if (SDPUtil.find_line(self.localSDP.media[mid], 'a=fingerprint:', self.localSDP.session)) { - var tmp = SDPUtil.parse_fingerprint(SDPUtil.find_line(self.localSDP.media[mid], 'a=fingerprint:', self.localSDP.session)); - tmp.required = true; - cand.c('fingerprint').t(tmp.fingerprint); - delete tmp.fingerprint; - cand.attrs(tmp); - cand.up(); - } - cand.up(); // transport - cand.up(); // content - } - } - // might merge last-candidate notification into this, but it is called alot later. See webrtc issue #2340 - //console.log('was this the last candidate', self.lasticecandidate); - self.connection.sendIQ(cand, - function () { - var ack = {}; - ack.source = 'transportinfo'; - $(document).trigger('ack.jingle', [self.sid, ack]); - }, - function (stanza) { - var error = ($(stanza).find('error').length) ? { - code: $(stanza).find('error').attr('code'), - reason: $(stanza).find('error :first')[0].tagName, - }:{}; - error.source = 'transportinfo'; - $(document).trigger('error.jingle', [self.sid, error]); - }, - 10000); - }, 10); + }, 20); + } this.drip_container.push(event.candidate); return; + } else { + self.sendIceCandidate([event.candidate]); } - // map to transport-info - var cand = $iq({to: this.peerjid, type: 'set'}) - .c('jingle', {xmlns: 'urn:xmpp:jingle:1', - action: 'transport-info', - initiator: this.initiator, - sid: this.sid}) - .c('content', {creator: this.initiator == this.me ? 'initiator' : 'responder', - name: candidate.sdpMid - }) - .c('transport', ice) - .c('candidate', jcand); - cand.up(); - // add fingerprint - if (SDPUtil.find_line(this.localSDP.media[candidate.sdpMLineIndex], 'a=fingerprint:', this.localSDP.session)) { - var tmp = SDPUtil.parse_fingerprint(SDPUtil.find_line(this.localSDP.media[candidate.sdpMLineIndex], 'a=fingerprint:', this.localSDP.session)); - tmp.required = true; - cand.c('fingerprint').t(tmp.fingerprint); - delete tmp.fingerprint; - cand.attrs(tmp); - cand.up(); - } - this.connection.sendIQ(cand, - function () { - var ack = {}; - ack.source = 'transportinfo'; - $(document).trigger('ack.jingle', [self.sid, ack]); - }, - function (stanza) { - console.error('transport info error'); - var error = ($(stanza).find('error').length) ? { - code: $(stanza).find('error').attr('code'), - reason: $(stanza).find('error :first')[0].tagName, - }:{}; - error.source = 'transportinfo'; - $(document).trigger('error.jingle', [self.sid, error]); - }, - 10000); } } else { //console.log('sendIceCandidate: last candidate.'); @@ -1779,6 +1699,57 @@ JingleSession.prototype.sendIceCandidate = function (candidate) { } }; +JingleSession.prototype.sendIceCandidates = function (candidates) { + console.log('sendIceCandidates', candidates); + var cand = $iq({to: this.peerjid, type: 'set'}) + .c('jingle', {xmlns: 'urn:xmpp:jingle:1', + action: 'transport-info', + initiator: this.initiator, + sid: this.sid}); + for (var mid = 0; mid < this.localSDP.media.length; mid++) { + var cands = candidates.filter(function (el) { return el.sdpMLineIndex == mid; }); + if (cands.length > 0) { + var ice = SDPUtil.iceparams(this.localSDP.media[mid], this.localSDP.session); + ice.xmlns = 'urn:xmpp:jingle:transports:ice-udp:1'; + cand.c('content', {creator: this.initiator == this.me ? 'initiator' : 'responder', + name: cands[0].sdpMid + }).c('transport', ice); + for (var i = 0; i < cands.length; i++) { + cand.c('candidate', SDPUtil.candidateToJingle(cands[i].candidate)).up(); + } + // add fingerprint + if (SDPUtil.find_line(this.localSDP.media[mid], 'a=fingerprint:', this.localSDP.session)) { + var tmp = SDPUtil.parse_fingerprint(SDPUtil.find_line(this.localSDP.media[mid], 'a=fingerprint:', this.localSDP.session)); + tmp.required = true; + cand.c('fingerprint').t(tmp.fingerprint); + delete tmp.fingerprint; + cand.attrs(tmp); + cand.up(); + } + cand.up(); // transport + cand.up(); // content + } + } + // might merge last-candidate notification into this, but it is called alot later. See webrtc issue #2340 + //console.log('was this the last candidate', this.lasticecandidate); + this.connection.sendIQ(cand, + function () { + var ack = {}; + ack.source = 'transportinfo'; + $(document).trigger('ack.jingle', [this.sid, ack]); + }, + function (stanza) { + var error = ($(stanza).find('error').length) ? { + code: $(stanza).find('error').attr('code'), + reason: $(stanza).find('error :first')[0].tagName, + }:{}; + error.source = 'transportinfo'; + $(document).trigger('error.jingle', [this.sid, error]); + }, + 10000); +}; + + JingleSession.prototype.sendOffer = function () { //console.log('sendOffer...'); var self = this;