File: source/ice-connection.js
/**
* Function that filters and configures the ICE servers received from Signaling
* based on the <code>init()</code> configuration and returns the updated
* list of ICE servers to be used when constructing Peer connection.
* @method _setIceServers
* @private
* @for Skylink
* @since 0.5.4
*/
Skylink.prototype._setIceServers = function(passedIceServers) {
var self = this;
var iceServerName = null;
var iceServerProtocol = 'stun';
var iceServerPorts = {
udp: [3478, 19302, 19303, 19304],
tcp: [80, 443],
both: [19305, 19306, 19307, 19308]
};
var iceServers = [
// Public
{ urls: [] },
// Private
{ urls: [] }
];
// Note: Provide only 1 single TURN! turn:xxxx.io for custom TURN servers. Ignores custom ports.
passedIceServers.forEach(function (server) {
if (server.url.indexOf('stun:') === 0) {
if (server.url.indexOf('temasys') > 0) {
// server[?transport=xxx]
iceServerName = (server.url.split(':')[1] || '').split('?')[0] || null;
} else {
iceServers[0].urls.push(server.url);
}
} else if (server.url.indexOf('turn:') === 0 && server.url.indexOf('@') > 0 && server.credential &&
!(iceServers[1].username || iceServers[1].credential)) {
var parts = server.url.split(':');
var urlParts = (parts[1] || '').split('@');
// server[?transport=xxx]
iceServerName = (urlParts[1] || '').split('?')[0];
iceServers[1].username = urlParts[0];
iceServers[1].credential = server.credential;
iceServerProtocol = 'turn';
}
});
if (self._initOptions.iceServer) {
iceServers = [{
urls: self._initOptions.iceServer.urls,
username: iceServers[1].username || null,
credential: iceServers[1].credential || null
}];
} else {
iceServerName = iceServerName || 'turn.temasys.io';
if (iceServerProtocol === 'turn' && !self._initOptions.enableTURNServer && !self._initOptions.forceTURNSSL) {
iceServerProtocol = 'stun';
} else if (AdapterJS.webrtcDetectedBrowser === 'edge') {
iceServerPorts.udp = [3478];
iceServerPorts.tcp = [];
iceServerPorts.both = [];
iceServerProtocol = 'turn';
} else if (self._initOptions.forceTURNSSL) {
if (AdapterJS.webrtcDetectedBrowser === 'firefox' && AdapterJS.webrtcDetectedVersion < 53) {
iceServerPorts.udp = [];
iceServerPorts.tcp = [443];
iceServerPorts.both = [];
iceServerProtocol = 'turn';
} else {
iceServerPorts.udp = [];
iceServerProtocol = 'turns';
}
// Limit the number of ports..
} else if (AdapterJS.webrtcDetectedBrowser === 'firefox') {
iceServerPorts.udp = [3478];
iceServerPorts.tcp = [443, 80];
}
if (self._initOptions.TURNServerTransport === self.TURN_TRANSPORT.UDP && !self._initOptions.forceTURNSSL) {
iceServerPorts.udp = iceServerPorts.udp.concat(iceServerPorts.both);
iceServerPorts.tcp = [];
iceServerPorts.both = [];
} else if (self._initOptions.TURNServerTransport === self.TURN_TRANSPORT.TCP) {
iceServerPorts.tcp = iceServerPorts.tcp.concat(iceServerPorts.both);
iceServerPorts.udp = [];
iceServerPorts.both = [];
} else if (self._initOptions.TURNServerTransport === self.TURN_TRANSPORT.NONE) {
iceServerPorts.tcp = [];
iceServerPorts.udp = [];
}
if (iceServerProtocol === 'stun') {
iceServerPorts.tcp = [];
}
if (iceServerProtocol === 'stun' && !self._initOptions.enableSTUNServer) {
iceServers = [];
} else {
iceServerPorts.tcp.forEach(function (tcpPort) {
iceServers[1].urls.push(iceServerProtocol + ':' + iceServerName + ':' + tcpPort + '?transport=tcp');
});
iceServerPorts.udp.forEach(function (udpPort) {
iceServers[1].urls.push(iceServerProtocol + ':' + iceServerName + ':' + udpPort + '?transport=udp');
});
iceServerPorts.both.forEach(function (bothPort) {
iceServers[1].urls.push(iceServerProtocol + ':' + iceServerName + ':' + bothPort);
});
if (!self._initOptions.usePublicSTUN) {
iceServers.splice(0, 1);
}
}
}
log.log('Output iceServers configuration:', iceServers);
return {
iceServers: iceServers
};
};