webrtc-adapter
Advanced tools
Comparing version 2.1.0 to 3.0.0
@@ -197,106 +197,87 @@ (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | ||
// The RTCPeerConnection object. | ||
window.RTCPeerConnection = function(pcConfig, pcConstraints) { | ||
// Translate iceTransportPolicy to iceTransports, | ||
// see https://code.google.com/p/webrtc/issues/detail?id=4869 | ||
logging('PeerConnection'); | ||
if (pcConfig && pcConfig.iceTransportPolicy) { | ||
pcConfig.iceTransports = pcConfig.iceTransportPolicy; | ||
if (!window.RTCPeerConnection) { | ||
window.RTCPeerConnection = function(pcConfig, pcConstraints) { | ||
// Translate iceTransportPolicy to iceTransports, | ||
// see https://code.google.com/p/webrtc/issues/detail?id=4869 | ||
// this was fixed in M56 along with unprefixing RTCPeerConnection. | ||
logging('PeerConnection'); | ||
if (pcConfig && pcConfig.iceTransportPolicy) { | ||
pcConfig.iceTransports = pcConfig.iceTransportPolicy; | ||
} | ||
return new webkitRTCPeerConnection(pcConfig, pcConstraints); | ||
}; | ||
window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype; | ||
// wrap static methods. Currently just generateCertificate. | ||
if (webkitRTCPeerConnection.generateCertificate) { | ||
Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { | ||
get: function() { | ||
return webkitRTCPeerConnection.generateCertificate; | ||
} | ||
}); | ||
} | ||
} | ||
var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints); | ||
var origGetStats = pc.getStats.bind(pc); | ||
pc.getStats = function(selector, successCallback, errorCallback) { | ||
var self = this; | ||
var args = arguments; | ||
var origGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, | ||
successCallback, errorCallback) { | ||
var self = this; | ||
var args = arguments; | ||
// If selector is a function then we are in the old style stats so just | ||
// pass back the original getStats format to avoid breaking old users. | ||
if (arguments.length > 0 && typeof selector === 'function') { | ||
return origGetStats(selector, successCallback); | ||
} | ||
// If selector is a function then we are in the old style stats so just | ||
// pass back the original getStats format to avoid breaking old users. | ||
if (arguments.length > 0 && typeof selector === 'function') { | ||
return origGetStats.apply(this, arguments); | ||
} | ||
var fixChromeStats_ = function(response) { | ||
var standardReport = {}; | ||
var reports = response.result(); | ||
reports.forEach(function(report) { | ||
var standardStats = { | ||
id: report.id, | ||
timestamp: report.timestamp, | ||
type: report.type | ||
}; | ||
report.names().forEach(function(name) { | ||
standardStats[name] = report.stat(name); | ||
}); | ||
standardReport[standardStats.id] = standardStats; | ||
}); | ||
// When spec-style getStats is supported, return those. | ||
if (origGetStats.length === 0) { | ||
return origGetStats.apply(this, arguments); | ||
} | ||
return standardReport; | ||
}; | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats, legacyStats) { | ||
var map = new Map(Object.keys(stats).map(function(key) { | ||
return[key, stats[key]]; | ||
})); | ||
legacyStats = legacyStats || stats; | ||
Object.keys(legacyStats).forEach(function(key) { | ||
map[key] = legacyStats[key]; | ||
var fixChromeStats_ = function(response) { | ||
var standardReport = {}; | ||
var reports = response.result(); | ||
reports.forEach(function(report) { | ||
var standardStats = { | ||
id: report.id, | ||
timestamp: report.timestamp, | ||
type: { | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}[report.type] || report.type | ||
}; | ||
report.names().forEach(function(name) { | ||
standardStats[name] = report.stat(name); | ||
}); | ||
return map; | ||
}; | ||
standardReport[standardStats.id] = standardStats; | ||
}); | ||
if (arguments.length >= 2) { | ||
var successCallbackWrapper_ = function(response) { | ||
args[1](makeMapStats(fixChromeStats_(response))); | ||
}; | ||
return standardReport; | ||
}; | ||
return origGetStats.apply(this, [successCallbackWrapper_, | ||
arguments[0]]); | ||
} | ||
// promise-support | ||
return new Promise(function(resolve, reject) { | ||
if (args.length === 1 && typeof selector === 'object') { | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response))); | ||
}, reject]); | ||
} else { | ||
// Preserve legacy chrome stats only on legacy access of stats obj | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response), | ||
response.result())); | ||
}, reject]); | ||
} | ||
}).then(successCallback, errorCallback); | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
return new Map(Object.keys(stats).map(function(key) { | ||
return[key, stats[key]]; | ||
})); | ||
}; | ||
return pc; | ||
}; | ||
window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype; | ||
if (arguments.length >= 2) { | ||
var successCallbackWrapper_ = function(response) { | ||
args[1](makeMapStats(fixChromeStats_(response))); | ||
}; | ||
// wrap static methods. Currently just generateCertificate. | ||
if (webkitRTCPeerConnection.generateCertificate) { | ||
Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { | ||
get: function() { | ||
return webkitRTCPeerConnection.generateCertificate; | ||
} | ||
}); | ||
} | ||
return origGetStats.apply(this, [successCallbackWrapper_, | ||
arguments[0]]); | ||
} | ||
['createOffer', 'createAnswer'].forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var self = this; | ||
if (arguments.length < 1 || (arguments.length === 1 && | ||
typeof arguments[0] === 'object')) { | ||
var opts = arguments.length === 1 ? arguments[0] : undefined; | ||
return new Promise(function(resolve, reject) { | ||
nativeMethod.apply(self, [resolve, reject, opts]); | ||
}); | ||
} | ||
return nativeMethod.apply(this, arguments); | ||
}; | ||
}); | ||
// promise-support | ||
return new Promise(function(resolve, reject) { | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response))); | ||
}, reject]); | ||
}).then(successCallback, errorCallback); | ||
}; | ||
@@ -307,4 +288,4 @@ // add promise support -- natively available in Chrome 51 | ||
.forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
var args = arguments; | ||
@@ -330,7 +311,26 @@ var self = this; | ||
// promise support for createOffer and createAnswer. Available (without | ||
// bugs) since M52: crbug/619289 | ||
if (browserDetails.version < 52) { | ||
['createOffer', 'createAnswer'].forEach(function(method) { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
var self = this; | ||
if (arguments.length < 1 || (arguments.length === 1 && | ||
typeof arguments[0] === 'object')) { | ||
var opts = arguments.length === 1 ? arguments[0] : undefined; | ||
return new Promise(function(resolve, reject) { | ||
nativeMethod.apply(self, [resolve, reject, opts]); | ||
}); | ||
} | ||
return nativeMethod.apply(this, arguments); | ||
}; | ||
}); | ||
} | ||
// shim implicit creation of RTCSessionDescription/RTCIceCandidate | ||
['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'] | ||
.forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
arguments[0] = new ((method === 'addIceCandidate') ? | ||
@@ -700,22 +700,38 @@ RTCIceCandidate : RTCSessionDescription)(arguments[0]); | ||
if (browserDetails.version < 48) { | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
var map = new Map(); | ||
Object.keys(stats).forEach(function(key) { | ||
map.set(key, stats[key]); | ||
map[key] = stats[key]; | ||
}); | ||
return map; | ||
}; | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
var map = new Map(); | ||
Object.keys(stats).forEach(function(key) { | ||
map.set(key, stats[key]); | ||
map[key] = stats[key]; | ||
}); | ||
return map; | ||
}; | ||
var nativeGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) { | ||
return nativeGetStats.apply(this, [selector || null]) | ||
.then(function(stats) { | ||
return makeMapStats(stats); | ||
}) | ||
.then(onSucc, onErr); | ||
}; | ||
} | ||
var modernStatsTypes = { | ||
inboundrtp: 'inbound-rtp', | ||
outboundrtp: 'outbound-rtp', | ||
candidatepair: 'candidate-pair', | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}; | ||
var nativeGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) { | ||
return nativeGetStats.apply(this, [selector || null]) | ||
.then(function(stats) { | ||
if (browserDetails.version < 48) { | ||
stats = makeMapStats(stats); | ||
} | ||
if (browserDetails.version < 53 && !onSucc) { | ||
// Shim only promise getStats with spec-hyphens in type names | ||
// Leave callback version alone; misc old uses of forEach before Map | ||
stats.forEach(function(stat) { | ||
stat.type = modernStatsTypes[stat.type] || stat.type; | ||
}); | ||
} | ||
return stats; | ||
}) | ||
.then(onSucc, onErr); | ||
}; | ||
} | ||
@@ -722,0 +738,0 @@ }; |
@@ -197,106 +197,87 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.adapter = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ | ||
// The RTCPeerConnection object. | ||
window.RTCPeerConnection = function(pcConfig, pcConstraints) { | ||
// Translate iceTransportPolicy to iceTransports, | ||
// see https://code.google.com/p/webrtc/issues/detail?id=4869 | ||
logging('PeerConnection'); | ||
if (pcConfig && pcConfig.iceTransportPolicy) { | ||
pcConfig.iceTransports = pcConfig.iceTransportPolicy; | ||
if (!window.RTCPeerConnection) { | ||
window.RTCPeerConnection = function(pcConfig, pcConstraints) { | ||
// Translate iceTransportPolicy to iceTransports, | ||
// see https://code.google.com/p/webrtc/issues/detail?id=4869 | ||
// this was fixed in M56 along with unprefixing RTCPeerConnection. | ||
logging('PeerConnection'); | ||
if (pcConfig && pcConfig.iceTransportPolicy) { | ||
pcConfig.iceTransports = pcConfig.iceTransportPolicy; | ||
} | ||
return new webkitRTCPeerConnection(pcConfig, pcConstraints); | ||
}; | ||
window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype; | ||
// wrap static methods. Currently just generateCertificate. | ||
if (webkitRTCPeerConnection.generateCertificate) { | ||
Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { | ||
get: function() { | ||
return webkitRTCPeerConnection.generateCertificate; | ||
} | ||
}); | ||
} | ||
} | ||
var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints); | ||
var origGetStats = pc.getStats.bind(pc); | ||
pc.getStats = function(selector, successCallback, errorCallback) { | ||
var self = this; | ||
var args = arguments; | ||
var origGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, | ||
successCallback, errorCallback) { | ||
var self = this; | ||
var args = arguments; | ||
// If selector is a function then we are in the old style stats so just | ||
// pass back the original getStats format to avoid breaking old users. | ||
if (arguments.length > 0 && typeof selector === 'function') { | ||
return origGetStats(selector, successCallback); | ||
} | ||
// If selector is a function then we are in the old style stats so just | ||
// pass back the original getStats format to avoid breaking old users. | ||
if (arguments.length > 0 && typeof selector === 'function') { | ||
return origGetStats.apply(this, arguments); | ||
} | ||
var fixChromeStats_ = function(response) { | ||
var standardReport = {}; | ||
var reports = response.result(); | ||
reports.forEach(function(report) { | ||
var standardStats = { | ||
id: report.id, | ||
timestamp: report.timestamp, | ||
type: report.type | ||
}; | ||
report.names().forEach(function(name) { | ||
standardStats[name] = report.stat(name); | ||
}); | ||
standardReport[standardStats.id] = standardStats; | ||
}); | ||
// When spec-style getStats is supported, return those. | ||
if (origGetStats.length === 0) { | ||
return origGetStats.apply(this, arguments); | ||
} | ||
return standardReport; | ||
}; | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats, legacyStats) { | ||
var map = new Map(Object.keys(stats).map(function(key) { | ||
return[key, stats[key]]; | ||
})); | ||
legacyStats = legacyStats || stats; | ||
Object.keys(legacyStats).forEach(function(key) { | ||
map[key] = legacyStats[key]; | ||
var fixChromeStats_ = function(response) { | ||
var standardReport = {}; | ||
var reports = response.result(); | ||
reports.forEach(function(report) { | ||
var standardStats = { | ||
id: report.id, | ||
timestamp: report.timestamp, | ||
type: { | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}[report.type] || report.type | ||
}; | ||
report.names().forEach(function(name) { | ||
standardStats[name] = report.stat(name); | ||
}); | ||
return map; | ||
}; | ||
standardReport[standardStats.id] = standardStats; | ||
}); | ||
if (arguments.length >= 2) { | ||
var successCallbackWrapper_ = function(response) { | ||
args[1](makeMapStats(fixChromeStats_(response))); | ||
}; | ||
return standardReport; | ||
}; | ||
return origGetStats.apply(this, [successCallbackWrapper_, | ||
arguments[0]]); | ||
} | ||
// promise-support | ||
return new Promise(function(resolve, reject) { | ||
if (args.length === 1 && typeof selector === 'object') { | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response))); | ||
}, reject]); | ||
} else { | ||
// Preserve legacy chrome stats only on legacy access of stats obj | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response), | ||
response.result())); | ||
}, reject]); | ||
} | ||
}).then(successCallback, errorCallback); | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
return new Map(Object.keys(stats).map(function(key) { | ||
return[key, stats[key]]; | ||
})); | ||
}; | ||
return pc; | ||
}; | ||
window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype; | ||
if (arguments.length >= 2) { | ||
var successCallbackWrapper_ = function(response) { | ||
args[1](makeMapStats(fixChromeStats_(response))); | ||
}; | ||
// wrap static methods. Currently just generateCertificate. | ||
if (webkitRTCPeerConnection.generateCertificate) { | ||
Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { | ||
get: function() { | ||
return webkitRTCPeerConnection.generateCertificate; | ||
} | ||
}); | ||
} | ||
return origGetStats.apply(this, [successCallbackWrapper_, | ||
arguments[0]]); | ||
} | ||
['createOffer', 'createAnswer'].forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var self = this; | ||
if (arguments.length < 1 || (arguments.length === 1 && | ||
typeof arguments[0] === 'object')) { | ||
var opts = arguments.length === 1 ? arguments[0] : undefined; | ||
return new Promise(function(resolve, reject) { | ||
nativeMethod.apply(self, [resolve, reject, opts]); | ||
}); | ||
} | ||
return nativeMethod.apply(this, arguments); | ||
}; | ||
}); | ||
// promise-support | ||
return new Promise(function(resolve, reject) { | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response))); | ||
}, reject]); | ||
}).then(successCallback, errorCallback); | ||
}; | ||
@@ -307,4 +288,4 @@ // add promise support -- natively available in Chrome 51 | ||
.forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
var args = arguments; | ||
@@ -330,7 +311,26 @@ var self = this; | ||
// promise support for createOffer and createAnswer. Available (without | ||
// bugs) since M52: crbug/619289 | ||
if (browserDetails.version < 52) { | ||
['createOffer', 'createAnswer'].forEach(function(method) { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
var self = this; | ||
if (arguments.length < 1 || (arguments.length === 1 && | ||
typeof arguments[0] === 'object')) { | ||
var opts = arguments.length === 1 ? arguments[0] : undefined; | ||
return new Promise(function(resolve, reject) { | ||
nativeMethod.apply(self, [resolve, reject, opts]); | ||
}); | ||
} | ||
return nativeMethod.apply(this, arguments); | ||
}; | ||
}); | ||
} | ||
// shim implicit creation of RTCSessionDescription/RTCIceCandidate | ||
['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'] | ||
.forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
arguments[0] = new ((method === 'addIceCandidate') ? | ||
@@ -700,22 +700,38 @@ RTCIceCandidate : RTCSessionDescription)(arguments[0]); | ||
if (browserDetails.version < 48) { | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
var map = new Map(); | ||
Object.keys(stats).forEach(function(key) { | ||
map.set(key, stats[key]); | ||
map[key] = stats[key]; | ||
}); | ||
return map; | ||
}; | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
var map = new Map(); | ||
Object.keys(stats).forEach(function(key) { | ||
map.set(key, stats[key]); | ||
map[key] = stats[key]; | ||
}); | ||
return map; | ||
}; | ||
var nativeGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) { | ||
return nativeGetStats.apply(this, [selector || null]) | ||
.then(function(stats) { | ||
return makeMapStats(stats); | ||
}) | ||
.then(onSucc, onErr); | ||
}; | ||
} | ||
var modernStatsTypes = { | ||
inboundrtp: 'inbound-rtp', | ||
outboundrtp: 'outbound-rtp', | ||
candidatepair: 'candidate-pair', | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}; | ||
var nativeGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) { | ||
return nativeGetStats.apply(this, [selector || null]) | ||
.then(function(stats) { | ||
if (browserDetails.version < 48) { | ||
stats = makeMapStats(stats); | ||
} | ||
if (browserDetails.version < 53 && !onSucc) { | ||
// Shim only promise getStats with spec-hyphens in type names | ||
// Leave callback version alone; misc old uses of forEach before Map | ||
stats.forEach(function(stat) { | ||
stat.type = modernStatsTypes[stat.type] || stat.type; | ||
}); | ||
} | ||
return stats; | ||
}) | ||
.then(onSucc, onErr); | ||
}; | ||
} | ||
@@ -722,0 +738,0 @@ }; |
{ | ||
"name": "webrtc-adapter", | ||
"version": "2.1.0", | ||
"version": "3.0.0", | ||
"description": "A shim to insulate apps from WebRTC spec changes and browser prefix differences", | ||
@@ -25,3 +25,4 @@ "license": "BSD-3-Clause", | ||
"engines": { | ||
"npm": "^3.10.0" | ||
"npm": "^3.10.0", | ||
"node": "^6.0.0" | ||
}, | ||
@@ -28,0 +29,0 @@ "devDependencies": { |
@@ -32,4 +32,2 @@ [![Build Status](https://travis-ci.org/webrtc/adapter.svg)](https://travis-ci.org/webrtc/adapter) | ||
Due to using the `gh-pages` branch as a version, you cannot use the bower package version for making sure you are using the correct version, rather you have to statically link the `adapter-version` file yourself, e.g. if you want version 1.0.5 you have to use the following file: `bower_components/webrtc-adapter/adapter-1.0.5.js`. | ||
##### NPM | ||
@@ -36,0 +34,0 @@ In node_modules/webrtc-adapter/out/ folder you will find 4 files: |
@@ -100,106 +100,87 @@ | ||
// The RTCPeerConnection object. | ||
window.RTCPeerConnection = function(pcConfig, pcConstraints) { | ||
// Translate iceTransportPolicy to iceTransports, | ||
// see https://code.google.com/p/webrtc/issues/detail?id=4869 | ||
logging('PeerConnection'); | ||
if (pcConfig && pcConfig.iceTransportPolicy) { | ||
pcConfig.iceTransports = pcConfig.iceTransportPolicy; | ||
if (!window.RTCPeerConnection) { | ||
window.RTCPeerConnection = function(pcConfig, pcConstraints) { | ||
// Translate iceTransportPolicy to iceTransports, | ||
// see https://code.google.com/p/webrtc/issues/detail?id=4869 | ||
// this was fixed in M56 along with unprefixing RTCPeerConnection. | ||
logging('PeerConnection'); | ||
if (pcConfig && pcConfig.iceTransportPolicy) { | ||
pcConfig.iceTransports = pcConfig.iceTransportPolicy; | ||
} | ||
return new webkitRTCPeerConnection(pcConfig, pcConstraints); | ||
}; | ||
window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype; | ||
// wrap static methods. Currently just generateCertificate. | ||
if (webkitRTCPeerConnection.generateCertificate) { | ||
Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { | ||
get: function() { | ||
return webkitRTCPeerConnection.generateCertificate; | ||
} | ||
}); | ||
} | ||
} | ||
var pc = new webkitRTCPeerConnection(pcConfig, pcConstraints); | ||
var origGetStats = pc.getStats.bind(pc); | ||
pc.getStats = function(selector, successCallback, errorCallback) { | ||
var self = this; | ||
var args = arguments; | ||
var origGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, | ||
successCallback, errorCallback) { | ||
var self = this; | ||
var args = arguments; | ||
// If selector is a function then we are in the old style stats so just | ||
// pass back the original getStats format to avoid breaking old users. | ||
if (arguments.length > 0 && typeof selector === 'function') { | ||
return origGetStats(selector, successCallback); | ||
} | ||
// If selector is a function then we are in the old style stats so just | ||
// pass back the original getStats format to avoid breaking old users. | ||
if (arguments.length > 0 && typeof selector === 'function') { | ||
return origGetStats.apply(this, arguments); | ||
} | ||
var fixChromeStats_ = function(response) { | ||
var standardReport = {}; | ||
var reports = response.result(); | ||
reports.forEach(function(report) { | ||
var standardStats = { | ||
id: report.id, | ||
timestamp: report.timestamp, | ||
type: report.type | ||
}; | ||
report.names().forEach(function(name) { | ||
standardStats[name] = report.stat(name); | ||
}); | ||
standardReport[standardStats.id] = standardStats; | ||
}); | ||
// When spec-style getStats is supported, return those. | ||
if (origGetStats.length === 0) { | ||
return origGetStats.apply(this, arguments); | ||
} | ||
return standardReport; | ||
}; | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats, legacyStats) { | ||
var map = new Map(Object.keys(stats).map(function(key) { | ||
return[key, stats[key]]; | ||
})); | ||
legacyStats = legacyStats || stats; | ||
Object.keys(legacyStats).forEach(function(key) { | ||
map[key] = legacyStats[key]; | ||
var fixChromeStats_ = function(response) { | ||
var standardReport = {}; | ||
var reports = response.result(); | ||
reports.forEach(function(report) { | ||
var standardStats = { | ||
id: report.id, | ||
timestamp: report.timestamp, | ||
type: { | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}[report.type] || report.type | ||
}; | ||
report.names().forEach(function(name) { | ||
standardStats[name] = report.stat(name); | ||
}); | ||
return map; | ||
}; | ||
standardReport[standardStats.id] = standardStats; | ||
}); | ||
if (arguments.length >= 2) { | ||
var successCallbackWrapper_ = function(response) { | ||
args[1](makeMapStats(fixChromeStats_(response))); | ||
}; | ||
return standardReport; | ||
}; | ||
return origGetStats.apply(this, [successCallbackWrapper_, | ||
arguments[0]]); | ||
} | ||
// promise-support | ||
return new Promise(function(resolve, reject) { | ||
if (args.length === 1 && typeof selector === 'object') { | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response))); | ||
}, reject]); | ||
} else { | ||
// Preserve legacy chrome stats only on legacy access of stats obj | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response), | ||
response.result())); | ||
}, reject]); | ||
} | ||
}).then(successCallback, errorCallback); | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
return new Map(Object.keys(stats).map(function(key) { | ||
return[key, stats[key]]; | ||
})); | ||
}; | ||
return pc; | ||
}; | ||
window.RTCPeerConnection.prototype = webkitRTCPeerConnection.prototype; | ||
if (arguments.length >= 2) { | ||
var successCallbackWrapper_ = function(response) { | ||
args[1](makeMapStats(fixChromeStats_(response))); | ||
}; | ||
// wrap static methods. Currently just generateCertificate. | ||
if (webkitRTCPeerConnection.generateCertificate) { | ||
Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { | ||
get: function() { | ||
return webkitRTCPeerConnection.generateCertificate; | ||
} | ||
}); | ||
} | ||
return origGetStats.apply(this, [successCallbackWrapper_, | ||
arguments[0]]); | ||
} | ||
['createOffer', 'createAnswer'].forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var self = this; | ||
if (arguments.length < 1 || (arguments.length === 1 && | ||
typeof arguments[0] === 'object')) { | ||
var opts = arguments.length === 1 ? arguments[0] : undefined; | ||
return new Promise(function(resolve, reject) { | ||
nativeMethod.apply(self, [resolve, reject, opts]); | ||
}); | ||
} | ||
return nativeMethod.apply(this, arguments); | ||
}; | ||
}); | ||
// promise-support | ||
return new Promise(function(resolve, reject) { | ||
origGetStats.apply(self, [ | ||
function(response) { | ||
resolve(makeMapStats(fixChromeStats_(response))); | ||
}, reject]); | ||
}).then(successCallback, errorCallback); | ||
}; | ||
@@ -210,4 +191,4 @@ // add promise support -- natively available in Chrome 51 | ||
.forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
var args = arguments; | ||
@@ -233,7 +214,26 @@ var self = this; | ||
// promise support for createOffer and createAnswer. Available (without | ||
// bugs) since M52: crbug/619289 | ||
if (browserDetails.version < 52) { | ||
['createOffer', 'createAnswer'].forEach(function(method) { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
var self = this; | ||
if (arguments.length < 1 || (arguments.length === 1 && | ||
typeof arguments[0] === 'object')) { | ||
var opts = arguments.length === 1 ? arguments[0] : undefined; | ||
return new Promise(function(resolve, reject) { | ||
nativeMethod.apply(self, [resolve, reject, opts]); | ||
}); | ||
} | ||
return nativeMethod.apply(this, arguments); | ||
}; | ||
}); | ||
} | ||
// shim implicit creation of RTCSessionDescription/RTCIceCandidate | ||
['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'] | ||
.forEach(function(method) { | ||
var nativeMethod = webkitRTCPeerConnection.prototype[method]; | ||
webkitRTCPeerConnection.prototype[method] = function() { | ||
var nativeMethod = RTCPeerConnection.prototype[method]; | ||
RTCPeerConnection.prototype[method] = function() { | ||
arguments[0] = new ((method === 'addIceCandidate') ? | ||
@@ -240,0 +240,0 @@ RTCIceCandidate : RTCSessionDescription)(arguments[0]); |
@@ -154,4 +154,3 @@ /* | ||
} | ||
} else if (event.candidate.candidate.indexOf('typ endOfCandidates') | ||
=== -1) { | ||
} else { | ||
sections[event.candidate.sdpMLineIndex + 1] += | ||
@@ -293,10 +292,2 @@ 'a=' + event.candidate.candidate + '\r\n'; | ||
} | ||
// Emit a candidate with type endOfCandidates to make the samples | ||
// work. Edge requires addIceCandidate with this empty candidate | ||
// to start checking. The real solution is to signal | ||
// end-of-candidates to the other side when getting the null | ||
// candidate but some apps (like the samples) don't do that. | ||
event.candidate.candidate = | ||
'candidate:1 1 udp 1 0.0.0.0 9 typ endOfCandidates'; | ||
} else { | ||
@@ -310,4 +301,3 @@ // RTCIceCandidate doesn't have a component, needs to be added | ||
var sections = SDPUtils.splitSections(self.localDescription.sdp); | ||
if (event.candidate.candidate.indexOf('typ endOfCandidates') | ||
=== -1) { | ||
if (!end) { | ||
sections[event.candidate.sdpMLineIndex + 1] += | ||
@@ -320,4 +310,5 @@ 'a=' + event.candidate.candidate + '\r\n'; | ||
self.localDescription.sdp = sections.join(''); | ||
var complete = self.transceivers.every(function(transceiver) { | ||
var transceivers = self._pendingOffer ? self._pendingOffer : | ||
self.transceivers; | ||
var complete = transceivers.every(function(transceiver) { | ||
return transceiver.iceGatherer && | ||
@@ -331,3 +322,5 @@ transceiver.iceGatherer.state === 'completed'; | ||
case 'new': | ||
self._localIceCandidatesBuffer.push(event); | ||
if (!end) { | ||
self._localIceCandidatesBuffer.push(event); | ||
} | ||
if (end && complete) { | ||
@@ -340,5 +333,7 @@ self._localIceCandidatesBuffer.push( | ||
self._emitBufferedCandidates(); | ||
self.dispatchEvent(event); | ||
if (self.onicecandidate !== null) { | ||
self.onicecandidate(event); | ||
if (!end) { | ||
self.dispatchEvent(event); | ||
if (self.onicecandidate !== null) { | ||
self.onicecandidate(event); | ||
} | ||
} | ||
@@ -455,17 +450,2 @@ if (complete) { | ||
mediaSection, sessionpart); | ||
if (isIceLite) { | ||
var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:') | ||
.map(function(cand) { | ||
return SDPUtils.parseCandidate(cand); | ||
}) | ||
.filter(function(cand) { | ||
return cand.component === '1'; | ||
}); | ||
// ice-lite only includes host candidates in the SDP so we can | ||
// use setRemoteCandidates (which implies an | ||
// RTCIceCandidateComplete) | ||
if (cands.length) { | ||
iceTransport.setRemoteCandidates(cands); | ||
} | ||
} | ||
var remoteDtlsParameters = SDPUtils.getDtlsParameters( | ||
@@ -629,3 +609,3 @@ mediaSection, sessionpart); | ||
if (isComplete) { | ||
if (isComplete && (!self.usingBundle || sdpMLineIndex === 0)) { | ||
transports.iceTransport.setRemoteCandidates(cands); | ||
@@ -764,3 +744,3 @@ } | ||
trackEvent.streams = [stream]; | ||
self.dispatchEvent(event); | ||
self.dispatchEvent(trackEvent); | ||
if (self.ontrack !== null) { | ||
@@ -1056,5 +1036,8 @@ window.setTimeout(function() { | ||
if (!candidate) { | ||
this.transceivers.forEach(function(transceiver) { | ||
transceiver.iceTransport.addRemoteCandidate({}); | ||
}); | ||
for (var j = 0; j < this.transceivers.length; j++) { | ||
this.transceivers[j].iceTransport.addRemoteCandidate({}); | ||
if (this.usingBundle) { | ||
return; | ||
} | ||
} | ||
} else { | ||
@@ -1082,6 +1065,2 @@ var mLineIndex = candidate.sdpMLineIndex; | ||
} | ||
// A dirty hack to make samples work. | ||
if (cand.type === 'endOfCandidates') { | ||
cand = {}; | ||
} | ||
transceiver.iceTransport.addRemoteCandidate(cand); | ||
@@ -1114,2 +1093,12 @@ | ||
arguments[1]; | ||
var fixStatsType = function(stat) { | ||
stat.type = { | ||
inboundrtp: 'inbound-rtp', | ||
outboundrtp: 'outbound-rtp', | ||
candidatepair: 'candidate-pair', | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}[stat.type] || stat.type; | ||
return stat; | ||
}; | ||
return new Promise(function(resolve) { | ||
@@ -1121,4 +1110,4 @@ // shim getStats with maplike support | ||
Object.keys(result).forEach(function(id) { | ||
result[id].type = fixStatsType(result[id]); | ||
results.set(id, result[id]); | ||
results[id] = result[id]; | ||
}); | ||
@@ -1125,0 +1114,0 @@ }); |
@@ -133,22 +133,38 @@ /* | ||
if (browserDetails.version < 48) { | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
var map = new Map(); | ||
Object.keys(stats).forEach(function(key) { | ||
map.set(key, stats[key]); | ||
map[key] = stats[key]; | ||
}); | ||
return map; | ||
}; | ||
// shim getStats with maplike support | ||
var makeMapStats = function(stats) { | ||
var map = new Map(); | ||
Object.keys(stats).forEach(function(key) { | ||
map.set(key, stats[key]); | ||
map[key] = stats[key]; | ||
}); | ||
return map; | ||
}; | ||
var nativeGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) { | ||
return nativeGetStats.apply(this, [selector || null]) | ||
.then(function(stats) { | ||
return makeMapStats(stats); | ||
}) | ||
.then(onSucc, onErr); | ||
}; | ||
} | ||
var modernStatsTypes = { | ||
inboundrtp: 'inbound-rtp', | ||
outboundrtp: 'outbound-rtp', | ||
candidatepair: 'candidate-pair', | ||
localcandidate: 'local-candidate', | ||
remotecandidate: 'remote-candidate' | ||
}; | ||
var nativeGetStats = RTCPeerConnection.prototype.getStats; | ||
RTCPeerConnection.prototype.getStats = function(selector, onSucc, onErr) { | ||
return nativeGetStats.apply(this, [selector || null]) | ||
.then(function(stats) { | ||
if (browserDetails.version < 48) { | ||
stats = makeMapStats(stats); | ||
} | ||
if (browserDetails.version < 53 && !onSucc) { | ||
// Shim only promise getStats with spec-hyphens in type names | ||
// Leave callback version alone; misc old uses of forEach before Map | ||
stats.forEach(function(stat) { | ||
stat.type = modernStatsTypes[stat.type] || stat.type; | ||
}); | ||
} | ||
return stats; | ||
}) | ||
.then(onSucc, onErr); | ||
}; | ||
} | ||
@@ -155,0 +171,0 @@ }; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
581863
11835
3
56
48