@twilio/webrtc
Advanced tools
Comparing version 1.0.3 to 1.1.0
@@ -0,1 +1,18 @@ | ||
1.1.0 (October 24, 2017) | ||
======================== | ||
New Features | ||
------------ | ||
- Adds Chrome support for getting and setting `maxPacketLifeTime` on | ||
RTCDataChannels by remapping the legacy property `maxRetransmitTime` to | ||
`maxPacketLifeTime`. (JSDK-1572) | ||
Bug Fixes | ||
--------- | ||
- Fixed a bug where our `getStats` function returned | ||
StandardizedTrackStatsReports of the wrong kind in the members of | ||
StandardizedTrackStatsResponse. (JSKD-1605) | ||
1.0.3 (October 13, 2017) | ||
@@ -2,0 +19,0 @@ ======================== |
@@ -72,3 +72,3 @@ /* global webkitRTCPeerConnection, mozRTCPeerConnection */ | ||
}).filter(function(track) { | ||
return track; | ||
return track && track.kind === kind; | ||
}); | ||
@@ -75,0 +75,0 @@ } |
@@ -1,2 +0,2 @@ | ||
/* globals RTCSessionDescription, webkitRTCPeerConnection */ | ||
/* globals RTCDataChannel, RTCSessionDescription, webkitRTCPeerConnection */ | ||
'use strict'; | ||
@@ -38,3 +38,4 @@ | ||
var onsignalingstatechange = null; | ||
util.interceptEvent(this, 'datachannel'); | ||
util.interceptEvent(this, 'signalingstatechange'); | ||
@@ -71,19 +72,2 @@ /* eslint new-cap:0 */ | ||
}, | ||
onsignalingstatechange: { | ||
get: function() { | ||
return onsignalingstatechange; | ||
}, | ||
set: function(_onsignalingstatechange) { | ||
if (onsignalingstatechange) { | ||
this.removeEventListener('signalingstatechange', onsignalingstatechange); | ||
} | ||
if (typeof _onsignalingstatechange === 'function') { | ||
onsignalingstatechange = _onsignalingstatechange; | ||
this.addEventListener('signalingstatechange', onsignalingstatechange); | ||
} else { | ||
onsignalingstatechange = null; | ||
} | ||
} | ||
}, | ||
remoteDescription: { | ||
@@ -110,2 +94,7 @@ enumerable: true, | ||
peerConnection.addEventListener('datachannel', function ondatachannel(event) { | ||
shimDataChannel(event.channel); | ||
self.dispatchEvent(event); | ||
}); | ||
peerConnection.addEventListener('signalingstatechange', function onsignalingstatechange() { | ||
@@ -230,2 +219,9 @@ if (!self._pendingLocalOffer && !self._pendingRemoteOffer) { | ||
ChromeRTCPeerConnection.prototype.createDataChannel = function createDataChannel(label, dataChannelDict) { | ||
dataChannelDict = shimDataChannelInit(dataChannelDict); | ||
var dataChannel = this._peerConnection.createDataChannel(label, dataChannelDict); | ||
shimDataChannel(dataChannel); | ||
return dataChannel; | ||
}; | ||
ChromeRTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() { | ||
@@ -386,2 +382,55 @@ var args = [].slice.call(arguments); | ||
/** | ||
* Check whether or not we need to apply our maxPacketLifeTime shim. We are | ||
* pretty conservative: we'll only apply it if the legacy maxRetransmitTime | ||
* property is available _and_ the standard maxPacketLifeTime property is _not_ | ||
* available (the thinking being that Chrome will land the standards-compliant | ||
* property). | ||
* @returns {boolean} | ||
*/ | ||
function needsMaxPacketLifeTimeShim() { | ||
return 'maxRetransmitTime' in RTCDataChannel.prototype | ||
&& !('maxPacketLifeTime' in RTCDataChannel.prototype); | ||
} | ||
/** | ||
* Shim an RTCDataChannelInit dictionary (if necessary). This function returns | ||
* a copy of the original RTCDataChannelInit. | ||
* @param {RTCDataChannelInit} dataChannelDict | ||
* @returns {RTCDataChannelInit} | ||
*/ | ||
function shimDataChannelInit(dataChannelDict) { | ||
dataChannelDict = Object.assign({}, dataChannelDict); | ||
if (needsMaxPacketLifeTimeShim() && 'maxPacketLifeTime' in dataChannelDict) { | ||
dataChannelDict.maxRetransmitTime = dataChannelDict.maxPacketLifeTime; | ||
} | ||
return dataChannelDict; | ||
} | ||
/** | ||
* Shim an RTCDataChannel (if necessary). This function mutates the | ||
* RTCDataChannel. | ||
* @param {RTCDataChannel} dataChannel | ||
* @returns {RTCDataChannel} | ||
*/ | ||
function shimDataChannel(dataChannel) { | ||
Object.defineProperty(dataChannel, 'maxRetransmits', { | ||
value: dataChannel.maxRetransmits === 65535 | ||
? null | ||
: dataChannel.maxRetransmits | ||
}); | ||
if (needsMaxPacketLifeTimeShim()) { | ||
// NOTE(mroberts): We can rename `maxRetransmitTime` to `maxPacketLifeTime`. | ||
// | ||
// https://bugs.chromium.org/p/chromium/issues/detail?id=696681 | ||
// | ||
Object.defineProperty(dataChannel, 'maxPacketLifeTime', { | ||
value: dataChannel.maxRetransmitTime === 65535 | ||
? null | ||
: dataChannel.maxRetransmitTime | ||
}); | ||
} | ||
return dataChannel; | ||
} | ||
module.exports = ChromeRTCPeerConnection; |
@@ -42,3 +42,3 @@ /* globals mozRTCPeerConnection, RTCPeerConnection */ | ||
var onsignalingstatechange = null; | ||
util.interceptEvent(this, 'signalingstatechange'); | ||
@@ -85,19 +85,2 @@ /* eslint new-cap:0 */ | ||
}, | ||
onsignalingstatechange: { | ||
get: function() { | ||
return onsignalingstatechange; | ||
}, | ||
set: function(_onsignalingstatechange) { | ||
if (onsignalingstatechange) { | ||
this.removeEventListener('signalingstatechange', onsignalingstatechange); | ||
} | ||
if (typeof _onsignalingstatechange === 'function') { | ||
onsignalingstatechange = _onsignalingstatechange; | ||
this.addEventListener('signalingstatechange', onsignalingstatechange); | ||
} else { | ||
onsignalingstatechange = null; | ||
} | ||
} | ||
}, | ||
signalingState: { | ||
@@ -104,0 +87,0 @@ enumerable: true, |
@@ -18,5 +18,6 @@ /* globals RTCPeerConnection, RTCSessionDescription */ | ||
var oniceconnectionstatechange = null; | ||
var onsignalingstatechange = null; | ||
var ontrack = null; | ||
util.interceptEvent(this, 'datachannel'); | ||
util.interceptEvent(this, 'iceconnectionstatechange'); | ||
util.interceptEvent(this, 'signalingstatechange'); | ||
util.interceptEvent(this, 'track'); | ||
@@ -75,53 +76,2 @@ var trackMatcher = new TrackMatcher(); | ||
}, | ||
oniceconnectionstatechange: { | ||
get: function() { | ||
return oniceconnectionstatechange; | ||
}, | ||
set: function(_oniceconnectionstatechange) { | ||
if (oniceconnectionstatechange) { | ||
this.removeEventListener('iceconnectionstatechange', oniceconnectionstatechange); | ||
} | ||
if (typeof _oniceconnectionstatechange === 'function') { | ||
oniceconnectionstatechange = _oniceconnectionstatechange; | ||
this.addEventListener('iceconnectionstatechange', oniceconnectionstatechange); | ||
} else { | ||
oniceconnectionstatechange = null; | ||
} | ||
} | ||
}, | ||
onsignalingstatechange: { | ||
get: function() { | ||
return onsignalingstatechange; | ||
}, | ||
set: function(_onsignalingstatechange) { | ||
if (onsignalingstatechange) { | ||
this.removeEventListener('signalingstatechange', onsignalingstatechange); | ||
} | ||
if (typeof _onsignalingstatechange === 'function') { | ||
onsignalingstatechange = _onsignalingstatechange; | ||
this.addEventListener('signalingstatechange', onsignalingstatechange); | ||
} else { | ||
onsignalingstatechange = null; | ||
} | ||
} | ||
}, | ||
ontrack: { | ||
get: function() { | ||
return ontrack; | ||
}, | ||
set: function(_ontrack) { | ||
if (ontrack) { | ||
this.removeEventListener('track', ontrack); | ||
} | ||
if (typeof _ontrack === 'function') { | ||
ontrack = _ontrack; | ||
this.addEventListener('track', ontrack); | ||
} else { | ||
ontrack = null; | ||
} | ||
} | ||
}, | ||
iceConnectionState: { | ||
@@ -168,2 +118,7 @@ enumerable: true, | ||
peerConnection.addEventListener('datachannel', function ondatachannel(event) { | ||
shimDataChannel(event.channel); | ||
self.dispatchEvent(event); | ||
}); | ||
peerConnection.addEventListener('iceconnectionstatechange', function oniceconnectionstatechange() { | ||
@@ -260,2 +215,8 @@ if (self._isClosed) { | ||
SafariRTCPeerConnection.prototype.createDataChannel = function createDataChannel(label, dataChannelDict) { | ||
var dataChannel = this._peerConnection.createDataChannel(label, dataChannelDict); | ||
shimDataChannel(dataChannel); | ||
return dataChannel; | ||
}; | ||
SafariRTCPeerConnection.prototype.setLocalDescription = function setLocalDescription(description) { | ||
@@ -398,2 +359,22 @@ return setDescription(this, true, description); | ||
/** | ||
* Shim an RTCDataChannel. This function mutates the RTCDataChannel. | ||
* @param {RTCDataChannel} dataChannel | ||
* @returns {RTCDataChannel} | ||
*/ | ||
function shimDataChannel(dataChannel) { | ||
return Object.defineProperties(dataChannel, { | ||
maxPacketLifeTime: { | ||
value: dataChannel.maxPacketLifeTime === 65535 | ||
? null | ||
: dataChannel.maxPacketLifeTime | ||
}, | ||
maxRetransmits: { | ||
value: dataChannel.maxRetransmits === 65535 | ||
? null | ||
: dataChannel.maxRetransmits | ||
} | ||
}); | ||
} | ||
module.exports = SafariRTCPeerConnection; |
@@ -126,2 +126,29 @@ 'use strict'; | ||
/** | ||
* Intercept an event that might otherwise be proxied on an EventTarget. | ||
* @param {EventTarget} target | ||
* @param {string} type | ||
* @returns {void} | ||
*/ | ||
function interceptEvent(target, type) { | ||
var currentListener = null; | ||
Object.defineProperty(target, 'on' + type, { | ||
get: function() { | ||
return currentListener; | ||
}, | ||
set: function(newListener) { | ||
if (currentListener) { | ||
this.removeEventListener(type, currentListener); | ||
} | ||
if (typeof newListener === 'function') { | ||
currentListener = newListener; | ||
this.addEventListener(type, currentListener); | ||
} else { | ||
currentListener = null; | ||
} | ||
} | ||
}); | ||
} | ||
/** | ||
* This is a function for turning a Promise into the kind referenced in the | ||
@@ -212,9 +239,10 @@ * Legacy Interface Extensions section of the WebRTC spec. | ||
module.exports.defer = defer; | ||
module.exports.delegateMethods = delegateMethods; | ||
module.exports.difference = difference; | ||
module.exports.flatMap = flatMap; | ||
module.exports.guessBrowser = guessBrowser; | ||
module.exports.legacyPromise = legacyPromise; | ||
module.exports.makeUUID = makeUUID; | ||
module.exports.proxyProperties = proxyProperties; | ||
exports.defer = defer; | ||
exports.delegateMethods = delegateMethods; | ||
exports.difference = difference; | ||
exports.flatMap = flatMap; | ||
exports.guessBrowser = guessBrowser; | ||
exports.interceptEvent = interceptEvent; | ||
exports.legacyPromise = legacyPromise; | ||
exports.makeUUID = makeUUID; | ||
exports.proxyProperties = proxyProperties; |
{ | ||
"name": "@twilio/webrtc", | ||
"version": "1.0.3", | ||
"version": "1.1.0", | ||
"description": "WebRTC-related APIs and shims used by twilio-video.js", | ||
@@ -5,0 +5,0 @@ "scripts": { |
@@ -75,2 +75,6 @@ twilio-webrtc.js | ||
`MediaStreamTrack`. | ||
* Adds support for getting and setting `maxPacketLifeTime` on RTCDataChannels by | ||
remapping the legacy property `maxRetransmitTime` to `maxPacketLifeTime`. See | ||
[this bug](https://bugs.chromium.org/p/chromium/issues/detail?id=696681) for | ||
more information. | ||
@@ -77,0 +81,0 @@ #### Firefox |
94195
2274
118