From 97e5cc000c68a407df13cc1519fa8c65ab8473c3 Mon Sep 17 00:00:00 2001 From: Victor Vasquez Date: Wed, 23 Feb 2022 10:55:39 -0300 Subject: [PATCH] add transceiver to mediaConnection --- dist/peerjs.js | 222 ++++++++++++++++++++++------------------- dist/peerjs.js.map | 2 +- dist/peerjs.min.js | 16 +-- dist/peerjs.min.js.map | 2 +- lib/mediaconnection.ts | 7 +- lib/negotiator.ts | 15 ++- 6 files changed, 148 insertions(+), 116 deletions(-) diff --git a/dist/peerjs.js b/dist/peerjs.js index b902845f0..b1acffc99 100644 --- a/dist/peerjs.js +++ b/dist/peerjs.js @@ -6615,8 +6615,8 @@ function () { class_1.prototype.isUnifiedPlanSupported = function () { var browser = this.getBrowser(); var version = adapter_1.webRTCAdapter.browserDetails.version || 0; - if (browser === 'chrome' && version < 72) return false; - if (browser === 'firefox' && version >= 59) return true; + if (browser === 'chrome' && version < this.minChromeVersion) return false; + if (browser === 'firefox' && version >= this.minFirefoxVersion) return true; if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false; var tempPc; var supported = false; @@ -6635,7 +6635,7 @@ function () { }; class_1.prototype.toString = function () { - return "Supports: \n browser:" + this.getBrowser() + " \n version:" + this.getVersion() + " \n isIOS:" + this.isIOS + " \n isWebRTCSupported:" + this.isWebRTCSupported() + " \n isBrowserSupported:" + this.isBrowserSupported() + " \n isUnifiedPlanSupported:" + this.isUnifiedPlanSupported(); + return "Supports: \n browser:".concat(this.getBrowser(), " \n version:").concat(this.getVersion(), " \n isIOS:").concat(this.isIOS, " \n isWebRTCSupported:").concat(this.isWebRTCSupported(), " \n isBrowserSupported:").concat(this.isBrowserSupported(), " \n isUnifiedPlanSupported:").concat(this.isUnifiedPlanSupported()); }; return class_1; @@ -7196,12 +7196,14 @@ var __read = this && this.__read || function (o, n) { return ar; }; -var __spreadArray = this && this.__spreadArray || function (to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) { - to[j] = from[i]; +var __spreadArray = this && this.__spreadArray || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } } - - return to; + return to.concat(ar || Array.prototype.slice.call(from)); }; Object.defineProperty(exports, "__esModule", { @@ -7209,12 +7211,12 @@ Object.defineProperty(exports, "__esModule", { }); exports.LogLevel = void 0; var LOG_PREFIX = 'PeerJS: '; -/* -Prints log messages depending on the debug level passed in. Defaults to 0. -0 Prints no logs. -1 Prints only errors. -2 Prints errors and warnings. -3 Prints all logs. +/* +Prints log messages depending on the debug level passed in. Defaults to 0. +0 Prints no logs. +1 Prints only errors. +2 Prints errors and warnings. +3 Prints all logs. */ var LogLevel; @@ -7252,7 +7254,7 @@ function () { } if (this._logLevel >= LogLevel.All) { - this._print.apply(this, __spreadArray([LogLevel.All], __read(args))); + this._print.apply(this, __spreadArray([LogLevel.All], __read(args), false)); } }; @@ -7264,7 +7266,7 @@ function () { } if (this._logLevel >= LogLevel.Warnings) { - this._print.apply(this, __spreadArray([LogLevel.Warnings], __read(args))); + this._print.apply(this, __spreadArray([LogLevel.Warnings], __read(args), false)); } }; @@ -7276,7 +7278,7 @@ function () { } if (this._logLevel >= LogLevel.Errors) { - this._print.apply(this, __spreadArray([LogLevel.Errors], __read(args))); + this._print.apply(this, __spreadArray([LogLevel.Errors], __read(args), false)); } }; @@ -7291,7 +7293,7 @@ function () { rest[_i - 1] = arguments[_i]; } - var copy = __spreadArray([LOG_PREFIX], __read(rest)); + var copy = __spreadArray([LOG_PREFIX], __read(rest), false); for (var i in copy) { if (copy[i] instanceof Error) { @@ -7300,11 +7302,11 @@ function () { } if (logLevel >= LogLevel.All) { - console.log.apply(console, __spreadArray([], __read(copy))); + console.log.apply(console, __spreadArray([], __read(copy), false)); } else if (logLevel >= LogLevel.Warnings) { - console.warn.apply(console, __spreadArray(["WARNING"], __read(copy))); + console.warn.apply(console, __spreadArray(["WARNING"], __read(copy), false)); } else if (logLevel >= LogLevel.Errors) { - console.error.apply(console, __spreadArray(["ERROR"], __read(copy))); + console.error.apply(console, __spreadArray(["ERROR"], __read(copy), false)); } }; @@ -7454,12 +7456,14 @@ var __read = this && this.__read || function (o, n) { return ar; }; -var __spreadArray = this && this.__spreadArray || function (to, from) { - for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) { - to[j] = from[i]; +var __spreadArray = this && this.__spreadArray || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } } - - return to; + return to.concat(ar || Array.prototype.slice.call(from)); }; var __values = this && this.__values || function (o) { @@ -7495,9 +7499,9 @@ var eventemitter3_1 = require("eventemitter3"); var logger_1 = __importDefault(require("./logger")); var enums_1 = require("./enums"); -/** - * An abstraction on top of WebSockets to provide fastest - * possible connection for peers. +/** + * An abstraction on top of WebSockets to provide fastest + * possible connection for peers. */ @@ -7525,7 +7529,7 @@ function (_super) { var _this = this; this._id = id; - var wsUrl = this._baseUrl + "&id=" + id + "&token=" + token; + var wsUrl = "".concat(this._baseUrl, "&id=").concat(id, "&token=").concat(token); if (!!this._socket || !this._disconnected) { return; @@ -7613,7 +7617,7 @@ function (_super) { //because send method push the message back to queue if smth will go wrong - var copiedQueue = __spreadArray([], __read(this._messagesQueue)); + var copiedQueue = __spreadArray([], __read(this._messagesQueue), false); this._messagesQueue = []; @@ -7868,8 +7872,8 @@ var util_1 = require("./util"); var logger_1 = __importDefault(require("./logger")); var enums_1 = require("./enums"); -/** - * Manages all negotiations between Peers. +/** + * Manages all negotiations between Peers. */ @@ -7889,7 +7893,7 @@ function () { this.connection.peerConnection = peerConnection; if (this.connection.type === enums_1.ConnectionType.Media && options._stream) { - this._addTracksToConnection(options._stream, peerConnection); + this._addTracksToConnection(options._stream, peerConnection, options._addTransceivers); } // What do we need to do now? @@ -7934,7 +7938,7 @@ function () { peerConnection.onicecandidate = function (evt) { if (!evt.candidate || !evt.candidate.candidate) return; - logger_1.default.log("Received ICE candidates for " + peerId + ":", evt.candidate); + logger_1.default.log("Received ICE candidates for ".concat(peerId, ":"), evt.candidate); provider.socket.send({ type: enums_1.ServerMessageType.Candidate, payload: { @@ -8071,7 +8075,7 @@ function () { case 4: _a.sent(); - logger_1.default.log("Set localDescription:", offer, "for:" + this.connection.peer); + logger_1.default.log("Set localDescription:", offer, "for:".concat(this.connection.peer)); payload = { sdp: offer, type: this.connection.type, @@ -8169,7 +8173,7 @@ function () { case 4: _a.sent(); - logger_1.default.log("Set localDescription:", answer, "for:" + this.connection.peer); + logger_1.default.log("Set localDescription:", answer, "for:".concat(this.connection.peer)); provider.socket.send({ type: enums_1.ServerMessageType.Answer, payload: { @@ -8239,7 +8243,7 @@ function () { case 2: _a.sent(); - logger_1.default.log("Set remoteDescription:" + type + " for:" + this.connection.peer); + logger_1.default.log("Set remoteDescription:".concat(type, " for:").concat(this.connection.peer)); if (!(type === "OFFER")) return [3 /*break*/ , 4]; @@ -8304,7 +8308,7 @@ function () { case 2: _a.sent(); - logger_1.default.log("Added ICE candidate for:" + this.connection.peer); + logger_1.default.log("Added ICE candidate for:".concat(this.connection.peer)); return [3 /*break*/ , 4]; @@ -8326,8 +8330,8 @@ function () { }); }; - Negotiator.prototype._addTracksToConnection = function (stream, peerConnection) { - logger_1.default.log("add tracks from stream " + stream.id + " to peer connection"); + Negotiator.prototype._addTracksToConnection = function (stream, peerConnection, addTransceivers) { + logger_1.default.log("add tracks from stream ".concat(stream.id, " to peer connection")); if (!peerConnection.addTrack) { return logger_1.default.error("Your browser does't support RTCPeerConnection#addTrack. Ignored."); @@ -8336,10 +8340,20 @@ function () { stream.getTracks().forEach(function (track) { peerConnection.addTrack(track, stream); }); + + if (addTransceivers) { + if (stream.getVideoTracks().length == 0) { + peerConnection.addTransceiver("video"); + } + + if (stream.getAudioTracks().length == 0) { + peerConnection.addTransceiver("audio"); + } + } }; Negotiator.prototype._addStreamToMediaConnection = function (stream, mediaConnection) { - logger_1.default.log("add stream " + stream.id + " to media connection " + mediaConnection.connectionId); + logger_1.default.log("add stream ".concat(stream.id, " to media connection ").concat(mediaConnection.connectionId)); mediaConnection.addStream(stream); }; @@ -8496,8 +8510,8 @@ var negotiator_1 = require("./negotiator"); var enums_1 = require("./enums"); var baseconnection_1 = require("./baseconnection"); -/** - * Wraps the streaming interface between two Peers. +/** + * Wraps the streaming interface between two Peers. */ @@ -8511,12 +8525,14 @@ function (_super) { _this._localStream = _this.options._stream; _this.connectionId = _this.options.connectionId || MediaConnection.ID_PREFIX + util_1.util.randomToken(); + _this._addTransceivers = _this.options.addTransceivers || false; _this._negotiator = new negotiator_1.Negotiator(_this); if (_this._localStream) { _this._negotiator.startConnection({ _stream: _this._localStream, - originator: true + originator: true, + _addTransceivers: _this._addTransceivers }); } @@ -8571,7 +8587,7 @@ function (_super) { break; default: - logger_1.default.warn("Unrecognized message type:" + type + " from peer:" + this.peer); + logger_1.default.warn("Unrecognized message type:".concat(type, " from peer:").concat(this.peer)); break; } }; @@ -8620,8 +8636,8 @@ function (_super) { this._open = true; }; - /** - * Exposed functionality for users. + /** + * Exposed functionality for users. */ /** Allows user to close connection. */ @@ -8855,8 +8871,8 @@ var enums_1 = require("./enums"); var baseconnection_1 = require("./baseconnection"); var encodingQueue_1 = require("./encodingQueue"); -/** - * Wraps a DataChannel between two Peers. +/** + * Wraps a DataChannel between two Peers. */ @@ -8885,7 +8901,7 @@ function (_super) { }); _this._encodingQueue.on('error', function () { - logger_1.default.error("DC#" + _this.connectionId + ": Error occured in encoding from blob to arraybuffer, close DC"); + logger_1.default.error("DC#".concat(_this.connectionId, ": Error occured in encoding from blob to arraybuffer, close DC")); _this.close(); }); @@ -8936,20 +8952,20 @@ function (_super) { } this.dataChannel.onopen = function () { - logger_1.default.log("DC#" + _this.connectionId + " dc connection success"); + logger_1.default.log("DC#".concat(_this.connectionId, " dc connection success")); _this._open = true; _this.emit(enums_1.ConnectionEventType.Open); }; this.dataChannel.onmessage = function (e) { - logger_1.default.log("DC#" + _this.connectionId + " dc onmessage:", e.data); + logger_1.default.log("DC#".concat(_this.connectionId, " dc onmessage:"), e.data); _this._handleDataMessage(e); }; this.dataChannel.onclose = function () { - logger_1.default.log("DC#" + _this.connectionId + " dc closed for:", _this.peer); + logger_1.default.log("DC#".concat(_this.connectionId, " dc closed for:"), _this.peer); _this.close(); }; @@ -9017,8 +9033,8 @@ function (_super) { }); } }; - /** - * Exposed functionality for users. + /** + * Exposed functionality for users. */ /** Allows user to close connection. */ @@ -9126,7 +9142,7 @@ function (_super) { try { this.dataChannel.send(msg); } catch (e) { - logger_1.default.error("DC#:" + this.connectionId + " Error when sending:", e); + logger_1.default.error("DC#:".concat(this.connectionId, " Error when sending:"), e); this._buffering = true; this.close(); return false; @@ -9160,7 +9176,7 @@ function (_super) { var e_1, _a; var blobs = util_1.util.chunk(blob); - logger_1.default.log("DC#" + this.connectionId + " Try to send " + blobs.length + " chunks..."); + logger_1.default.log("DC#".concat(this.connectionId, " Try to send ").concat(blobs.length, " chunks...")); try { for (var blobs_1 = __values(blobs), blobs_1_1 = blobs_1.next(); !blobs_1_1.done; blobs_1_1 = blobs_1.next()) { @@ -9404,7 +9420,7 @@ function () { response = _a.sent(); if (response.status !== 200) { - throw new Error("Error. Status:" + response.status); + throw new Error("Error. Status:".concat(response.status)); } return [2 @@ -9465,7 +9481,7 @@ function () { throw new Error("It doesn't look like you have permission to list peers IDs. " + helpfulError); } - throw new Error("Error. Status:" + response.status); + throw new Error("Error. Status:".concat(response.status)); } return [2 @@ -9615,8 +9631,8 @@ function () { return PeerOptions; }(); -/** - * A peer who can initiate connections with other peers. +/** + * A peer who can initiate connections with other peers. */ @@ -9701,7 +9717,7 @@ function (_super) { if (!!userId && !util_1.util.validateId(userId)) { - _this._delayedAbort(enums_1.PeerErrorType.InvalidID, "ID \"" + userId + "\" is invalid"); + _this._delayedAbort(enums_1.PeerErrorType.InvalidID, "ID \"".concat(userId, "\" is invalid")); return _this; } @@ -9748,9 +9764,9 @@ function (_super) { configurable: true }); Object.defineProperty(Peer.prototype, "connections", { - /** - * @deprecated - * Return type will change from Object to Map + /** + * @deprecated + * Return type will change from Object to Map */ get: function get() { var e_1, _a; @@ -9858,19 +9874,19 @@ function (_super) { case enums_1.ServerMessageType.IdTaken: // The selected ID is taken. - this._abort(enums_1.PeerErrorType.UnavailableID, "ID \"" + this.id + "\" is taken"); + this._abort(enums_1.PeerErrorType.UnavailableID, "ID \"".concat(this.id, "\" is taken")); break; case enums_1.ServerMessageType.InvalidKey: // The given API key cannot be found. - this._abort(enums_1.PeerErrorType.InvalidKey, "API KEY \"" + this._options.key + "\" is invalid"); + this._abort(enums_1.PeerErrorType.InvalidKey, "API KEY \"".concat(this._options.key, "\" is invalid")); break; case enums_1.ServerMessageType.Leave: // Another peer has closed its connection to this peer. - logger_1.default.log("Received leave message from " + peerId); + logger_1.default.log("Received leave message from ".concat(peerId)); this._cleanupPeer(peerId); @@ -9880,7 +9896,7 @@ function (_super) { case enums_1.ServerMessageType.Expire: // The offer sent to a peer has expired without response. - this.emitError(enums_1.PeerErrorType.PeerUnavailable, "Could not connect to peer " + peerId); + this.emitError(enums_1.PeerErrorType.PeerUnavailable, "Could not connect to peer ".concat(peerId)); break; case enums_1.ServerMessageType.Offer: @@ -9891,7 +9907,7 @@ function (_super) { if (connection) { connection.close(); - logger_1.default.warn("Offer received for existing Connection ID:" + connectionId); + logger_1.default.warn("Offer received for existing Connection ID:".concat(connectionId)); } // Create a new connection. @@ -9919,7 +9935,7 @@ function (_super) { this.emit(enums_1.PeerEventType.Connection, connection); } else { - logger_1.default.warn("Received malformed connection type:" + payload.type); + logger_1.default.warn("Received malformed connection type:".concat(payload.type)); return; } // Find messages. @@ -9949,7 +9965,7 @@ function (_super) { default: { if (!payload) { - logger_1.default.warn("You received a malformed message from " + peerId + " of type " + type); + logger_1.default.warn("You received a malformed message from ".concat(peerId, " of type ").concat(type)); return; } @@ -9995,9 +10011,9 @@ function (_super) { return []; }; - /** - * Returns a DataConnection to the specified peer. See documentation for a - * complete list of options. + /** + * Returns a DataConnection to the specified peer. See documentation for a + * complete list of options. */ @@ -10018,9 +10034,9 @@ function (_super) { return dataConnection; }; - /** - * Returns a MediaConnection to the specified peer. See documentation for a - * complete list of options. + /** + * Returns a MediaConnection to the specified peer. See documentation for a + * complete list of options. */ @@ -10051,7 +10067,7 @@ function (_super) { Peer.prototype._addConnection = function (peerId, connection) { - logger_1.default.log("add connection " + connection.type + ":" + connection.connectionId + " to peerId:" + peerId); + logger_1.default.log("add connection ".concat(connection.type, ":").concat(connection.connectionId, " to peerId:").concat(peerId)); if (!this._connections.has(peerId)) { this._connections.set(peerId, []); @@ -10117,10 +10133,10 @@ function (_super) { _this._abort(type, message); }, 0); }; - /** - * Emits an error message and destroys the Peer. - * The Peer is not destroyed if it's in a disconnected state, in which case - * it retains its disconnected state and its existing connections. + /** + * Emits an error message and destroys the Peer. + * The Peer is not destroyed if it's in a disconnected state, in which case + * it retains its disconnected state and its existing connections. */ @@ -10150,11 +10166,11 @@ function (_super) { error.type = type; this.emit(enums_1.PeerEventType.Error, error); }; - /** - * Destroys the Peer: closes all active connections as well as the connection - * to the server. - * Warning: The peer can no longer create or accept connections after being - * destroyed. + /** + * Destroys the Peer: closes all active connections as well as the connection + * to the server. + * Warning: The peer can no longer create or accept connections after being + * destroyed. */ @@ -10163,7 +10179,7 @@ function (_super) { return; } - logger_1.default.log("Destroy peer with ID:" + this.id); + logger_1.default.log("Destroy peer with ID:".concat(this.id)); this.disconnect(); this._cleanup(); @@ -10226,11 +10242,11 @@ function (_super) { } } }; - /** - * Disconnects the Peer's connection to the PeerServer. Does not close any - * active connections. - * Warning: The peer can no longer create or accept connections after being - * disconnected. It also cannot reconnect to the server. + /** + * Disconnects the Peer's connection to the PeerServer. Does not close any + * active connections. + * Warning: The peer can no longer create or accept connections after being + * disconnected. It also cannot reconnect to the server. */ @@ -10240,7 +10256,7 @@ function (_super) { } var currentId = this.id; - logger_1.default.log("Disconnect peer with ID:" + currentId); + logger_1.default.log("Disconnect peer with ID:".concat(currentId)); this._disconnected = true; this._open = false; this.socket.close(); @@ -10253,7 +10269,7 @@ function (_super) { Peer.prototype.reconnect = function () { if (this.disconnected && !this.destroyed) { - logger_1.default.log("Attempting reconnection to server with ID " + this._lastServerId); + logger_1.default.log("Attempting reconnection to server with ID ".concat(this._lastServerId)); this._disconnected = false; this._initialize(this._lastServerId); @@ -10263,14 +10279,14 @@ function (_super) { // Do nothing. We're still connecting the first time. logger_1.default.error("In a hurry? We're still trying to make the initial connection!"); } else { - throw new Error("Peer " + this.id + " cannot reconnect because it is not disconnected from the server!"); + throw new Error("Peer ".concat(this.id, " cannot reconnect because it is not disconnected from the server!")); } }; - /** - * Get a list of available peer IDs. If you're running your own server, you'll - * want to set allow_discovery: true in the PeerServer options. If you're using - * the cloud server, email team@peerjs.com to get the functionality enabled for - * your key. + /** + * Get a list of available peer IDs. If you're running your own server, you'll + * want to set allow_discovery: true in the PeerServer options. If you're using + * the cloud server, email team@peerjs.com to get the functionality enabled for + * your key. */ diff --git a/dist/peerjs.js.map b/dist/peerjs.js.map index fd1786e1a..54076b6da 100644 --- a/dist/peerjs.js.map +++ b/dist/peerjs.js.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","../node_modules/peerjs-js-binarypack/lib/binarypack.js","../node_modules/webrtc-adapter/src/js/utils.js","../node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","../node_modules/sdp/sdp.js","../node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","../node_modules/webrtc-adapter/src/js/edge/getusermedia.js","../node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/edge/edge_shim.js","../node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/webrtc-adapter/src/js/adapter_core.js","adapter.ts","supports.ts","util.ts","../node_modules/eventemitter3/index.js","logger.ts","enums.ts","socket.ts","negotiator.ts","baseconnection.ts","mediaconnection.ts","encodingQueue.ts","dataconnection.ts","api.ts","peer.ts","exports.ts"],"names":["logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","length","parseInt","wrapPeerConnectionEvent","window","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","get","delete","size","Object","keys","defineProperty","enumerable","configurable","disableLog","bool","Error","disableWarnings","log","console","deprecated","oldMethod","newMethod","warn","detectBrowser","result","browser","version","navigator","mozGetUserMedia","userAgent","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","RTCIceGatherer","mediaDevices","supportsUnifiedPlan","RTCRtpTransceiver","isObject","val","toString","call","compactObject","data","reduce","accumulator","key","isObj","value","isEmptyObject","undefined","assign","walkStats","stats","base","resultSet","id","forEach","name","endsWith","filterStats","track","outbound","streamStatsType","filteredResult","trackStats","type","trackIdentifier","push","trackStat","trackId","logging","utils","shimGetUserMedia","browserDetails","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","then","devices","filter","d","kind","dev","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia_","onSuccess","onError","getUserMedia","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","error","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","event","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","successCallbackWrapper_","resolve","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","alreadyExists","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","signalingState","t","oldStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","method","nativeMethod","methodObj","args","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","shimPeerConnection","RTCIceCandidate","fixNegotiationNeeded","target","getConfiguration","sdpSemantics","filterIceServers","iceServers","edgeVersion","hasTurn","server","urls","url","isString","validTurn","startsWith","SDPUtils","require","fixStatsType","inboundrtp","outboundrtp","candidatepair","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","i","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","Math","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","code","NotSupportedError","InvalidAccessError","TypeError","OperationError","module","exports","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","removeTrackFromStreamAndFireEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","config","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","enabled","_createIceGatherer","sdpMLineIndex","shift","writable","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","getCapabilities","codec","isNewTrack","default","nativeTrack","hasRtx","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","addIceCandidate","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjects","ortcObjectName","nativeGetstats","nativeStats","mapStats","methods","catch","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","shimReplaceTrack","replaceTrack","setTrack","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","ridRegex","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","finally","shimCreateAnswer","origCreateAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","index","tracks","shimRemoteStreamsAPI","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","successCallback","failureCallback","options","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","hasOwnProperty","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","audioTransceiver","getTransceivers","setDirection","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","shimMaxMessageSize","_sctp","sctpInDescription","mLine","parseMLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeExtmapAllowMixed","nativeSRD","line","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1gBA;;;;;;;;AAOC;AACD;;;;;;;;;;;;;;;;;;;;AAEA,IAAIA,YAAY,GAAG,IAAnB;AACA,IAAIC,oBAAoB,GAAG,IAA3B;AAEA;;;;;;;;;AAQO,SAASC,cAAT,CAAwBC,QAAxB,EAAkCC,IAAlC,EAAwCC,GAAxC,EAA6C;AAClD,MAAMC,KAAK,GAAGH,QAAQ,CAACG,KAAT,CAAeF,IAAf,CAAd;AACA,SAAOE,KAAK,IAAIA,KAAK,CAACC,MAAN,IAAgBF,GAAzB,IAAgCG,QAAQ,CAACF,KAAK,CAACD,GAAD,CAAN,EAAa,EAAb,CAA/C;AACD,EAED;AACA;AACA;;;AACO,SAASI,uBAAT,CAAiCC,MAAjC,EAAyCC,eAAzC,EAA0DC,OAA1D,EAAmE;AACxE,MAAI,CAACF,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD;;AACD,MAAMC,KAAK,GAAGJ,MAAM,CAACG,iBAAP,CAAyBE,SAAvC;AACA,MAAMC,sBAA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lB,EAA2B;AACzBA,UAAAA,OAAO,GAAG,IAAV;AACA,iBAAO,IAAP;AACD;;AACD,eAAOK,SAAS,IAAI,CAACL,OAArB;AACD,OAdM,CAAP;AAgBA,aAAOC,MAAM,CAACE,GAAd;AACAF,MAAAA,MAAM,CAACC,IAAP,GAAcE,QAAQ,GAAGF,IAAI,CAAC,CAAD,CAAP,GAAaA,IAAnC;AACA,aAAO,CAAC,CAACA,IAAI,CAACvT,MAAd;AACD;AACF,GA9BM,CAAP;AA+BD;;AClDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzzBA;;;;;;;;AAOC;AACD;;AAEA,IAAI4T,QAAQ,GAAGC,OAAO,CAAC,KAAD,CAAtB;;AAEA,SAASC,YAAT,CAAsBtE,IAAtB,EAA4B;AAC1B,SAAO;AACLuE,IAAAA,UAAU,EAAE,aADP;AAELC,IAAAA,WAAW,EAAE,cAFR;AAGLC,IAAAA,aAAa,EAAE,gBAHV;AAIL5E,IAAAA,cAAc,EAAE,iBAJX;AAKLC,IAAAA,eAAe,EAAE;AALZ,IAMLE,IAAI,CAAClK,IANA,KAMSkK,IAAI,CAAClK,IANrB;AAOD;;AAED,SAAS4O,iBAAT,CAA2BtH,WAA3B,EAAwCuH,IAAxC,EAA8C7O,IAA9C,EAAoDgF,MAApD,EAA4D8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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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","file":"peerjs.js","sourceRoot":"../lib","sourcesContent":["var binaryFeatures = {};\r\nbinaryFeatures.useBlobBuilder = (function () {\r\n try {\r\n new Blob([]);\r\n return false;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nbinaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {\r\n try {\r\n return (new Blob([new Uint8Array([])])).size === 0;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nmodule.exports.binaryFeatures = binaryFeatures;\r\nvar BlobBuilder = module.exports.BlobBuilder;\r\nif (typeof window !== 'undefined') {\r\n BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||\r\n window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;\r\n}\r\n\r\nfunction BufferBuilder () {\r\n this._pieces = [];\r\n this._parts = [];\r\n}\r\n\r\nBufferBuilder.prototype.append = function (data) {\r\n if (typeof data === 'number') {\r\n this._pieces.push(data);\r\n } else {\r\n this.flush();\r\n this._parts.push(data);\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.flush = function () {\r\n if (this._pieces.length > 0) {\r\n var buf = new Uint8Array(this._pieces);\r\n if (!binaryFeatures.useArrayBufferView) {\r\n buf = buf.buffer;\r\n }\r\n this._parts.push(buf);\r\n this._pieces = [];\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.getBuffer = function () {\r\n this.flush();\r\n if (binaryFeatures.useBlobBuilder) {\r\n var builder = new BlobBuilder();\r\n for (var i = 0, ii = this._parts.length; i < ii; i++) {\r\n builder.append(this._parts[i]);\r\n }\r\n return builder.getBlob();\r\n } else {\r\n return new Blob(this._parts);\r\n }\r\n};\r\n\r\nmodule.exports.BufferBuilder = BufferBuilder;\r\n","var BufferBuilder = require('./bufferbuilder').BufferBuilder;\r\nvar binaryFeatures = require('./bufferbuilder').binaryFeatures;\r\n\r\nvar BinaryPack = {\r\n unpack: function (data) {\r\n var unpacker = new Unpacker(data);\r\n return unpacker.unpack();\r\n },\r\n pack: function (data) {\r\n var packer = new Packer();\r\n packer.pack(data);\r\n var buffer = packer.getBuffer();\r\n return buffer;\r\n }\r\n};\r\n\r\nmodule.exports = BinaryPack;\r\n\r\nfunction Unpacker (data) {\r\n // Data is ArrayBuffer\r\n this.index = 0;\r\n this.dataBuffer = data;\r\n this.dataView = new Uint8Array(this.dataBuffer);\r\n this.length = this.dataBuffer.byteLength;\r\n}\r\n\r\nUnpacker.prototype.unpack = function () {\r\n var type = this.unpack_uint8();\r\n if (type < 0x80) {\r\n return type;\r\n } else if ((type ^ 0xe0) < 0x20) {\r\n return (type ^ 0xe0) - 0x20;\r\n }\r\n\r\n var size;\r\n if ((size = type ^ 0xa0) <= 0x0f) {\r\n return this.unpack_raw(size);\r\n } else if ((size = type ^ 0xb0) <= 0x0f) {\r\n return this.unpack_string(size);\r\n } else if ((size = type ^ 0x90) <= 0x0f) {\r\n return this.unpack_array(size);\r\n } else if ((size = type ^ 0x80) <= 0x0f) {\r\n return this.unpack_map(size);\r\n }\r\n\r\n switch (type) {\r\n case 0xc0:\r\n return null;\r\n case 0xc1:\r\n return undefined;\r\n case 0xc2:\r\n return false;\r\n case 0xc3:\r\n return true;\r\n case 0xca:\r\n return this.unpack_float();\r\n case 0xcb:\r\n return this.unpack_double();\r\n case 0xcc:\r\n return this.unpack_uint8();\r\n case 0xcd:\r\n return this.unpack_uint16();\r\n case 0xce:\r\n return this.unpack_uint32();\r\n case 0xcf:\r\n return this.unpack_uint64();\r\n case 0xd0:\r\n return this.unpack_int8();\r\n case 0xd1:\r\n return this.unpack_int16();\r\n case 0xd2:\r\n return this.unpack_int32();\r\n case 0xd3:\r\n return this.unpack_int64();\r\n case 0xd4:\r\n return undefined;\r\n case 0xd5:\r\n return undefined;\r\n case 0xd6:\r\n return undefined;\r\n case 0xd7:\r\n return undefined;\r\n case 0xd8:\r\n size = this.unpack_uint16();\r\n return this.unpack_string(size);\r\n case 0xd9:\r\n size = this.unpack_uint32();\r\n return this.unpack_string(size);\r\n case 0xda:\r\n size = this.unpack_uint16();\r\n return this.unpack_raw(size);\r\n case 0xdb:\r\n size = this.unpack_uint32();\r\n return this.unpack_raw(size);\r\n case 0xdc:\r\n size = this.unpack_uint16();\r\n return this.unpack_array(size);\r\n case 0xdd:\r\n size = this.unpack_uint32();\r\n return this.unpack_array(size);\r\n case 0xde:\r\n size = this.unpack_uint16();\r\n return this.unpack_map(size);\r\n case 0xdf:\r\n size = this.unpack_uint32();\r\n return this.unpack_map(size);\r\n }\r\n};\r\n\r\nUnpacker.prototype.unpack_uint8 = function () {\r\n var byte = this.dataView[this.index] & 0xff;\r\n this.index++;\r\n return byte;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint16 = function () {\r\n var bytes = this.read(2);\r\n var uint16 =\r\n ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);\r\n this.index += 2;\r\n return uint16;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint32 = function () {\r\n var bytes = this.read(4);\r\n var uint32 =\r\n ((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3];\r\n this.index += 4;\r\n return uint32;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint64 = function () {\r\n var bytes = this.read(8);\r\n var uint64 =\r\n ((((((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3]) * 256 +\r\n bytes[4]) * 256 +\r\n bytes[5]) * 256 +\r\n bytes[6]) * 256 +\r\n bytes[7];\r\n this.index += 8;\r\n return uint64;\r\n};\r\n\r\nUnpacker.prototype.unpack_int8 = function () {\r\n var uint8 = this.unpack_uint8();\r\n return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);\r\n};\r\n\r\nUnpacker.prototype.unpack_int16 = function () {\r\n var uint16 = this.unpack_uint16();\r\n return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);\r\n};\r\n\r\nUnpacker.prototype.unpack_int32 = function () {\r\n var uint32 = this.unpack_uint32();\r\n return (uint32 < Math.pow(2, 31)) ? uint32\r\n : uint32 - Math.pow(2, 32);\r\n};\r\n\r\nUnpacker.prototype.unpack_int64 = function () {\r\n var uint64 = this.unpack_uint64();\r\n return (uint64 < Math.pow(2, 63)) ? uint64\r\n : uint64 - Math.pow(2, 64);\r\n};\r\n\r\nUnpacker.prototype.unpack_raw = function (size) {\r\n if (this.length < this.index + size) {\r\n throw new Error('BinaryPackFailure: index is out of range' +\r\n ' ' + this.index + ' ' + size + ' ' + this.length);\r\n }\r\n var buf = this.dataBuffer.slice(this.index, this.index + size);\r\n this.index += size;\r\n\r\n // buf = util.bufferToString(buf);\r\n\r\n return buf;\r\n};\r\n\r\nUnpacker.prototype.unpack_string = function (size) {\r\n var bytes = this.read(size);\r\n var i = 0;\r\n var str = '';\r\n var c;\r\n var code;\r\n\r\n while (i < size) {\r\n c = bytes[i];\r\n if (c < 128) {\r\n str += String.fromCharCode(c);\r\n i++;\r\n } else if ((c ^ 0xc0) < 32) {\r\n code = ((c ^ 0xc0) << 6) | (bytes[i + 1] & 63);\r\n str += String.fromCharCode(code);\r\n i += 2;\r\n } else {\r\n code = ((c & 15) << 12) | ((bytes[i + 1] & 63) << 6) |\r\n (bytes[i + 2] & 63);\r\n str += String.fromCharCode(code);\r\n i += 3;\r\n }\r\n }\r\n\r\n this.index += size;\r\n return str;\r\n};\r\n\r\nUnpacker.prototype.unpack_array = function (size) {\r\n var objects = new Array(size);\r\n for (var i = 0; i < size; i++) {\r\n objects[i] = this.unpack();\r\n }\r\n return objects;\r\n};\r\n\r\nUnpacker.prototype.unpack_map = function (size) {\r\n var map = {};\r\n for (var i = 0; i < size; i++) {\r\n var key = this.unpack();\r\n var value = this.unpack();\r\n map[key] = value;\r\n }\r\n return map;\r\n};\r\n\r\nUnpacker.prototype.unpack_float = function () {\r\n var uint32 = this.unpack_uint32();\r\n var sign = uint32 >> 31;\r\n var exp = ((uint32 >> 23) & 0xff) - 127;\r\n var fraction = (uint32 & 0x7fffff) | 0x800000;\r\n return (sign === 0 ? 1 : -1) *\r\n fraction * Math.pow(2, exp - 23);\r\n};\r\n\r\nUnpacker.prototype.unpack_double = function () {\r\n var h32 = this.unpack_uint32();\r\n var l32 = this.unpack_uint32();\r\n var sign = h32 >> 31;\r\n var exp = ((h32 >> 20) & 0x7ff) - 1023;\r\n var hfrac = (h32 & 0xfffff) | 0x100000;\r\n var frac = hfrac * Math.pow(2, exp - 20) +\r\n l32 * Math.pow(2, exp - 52);\r\n return (sign === 0 ? 1 : -1) * frac;\r\n};\r\n\r\nUnpacker.prototype.read = function (length) {\r\n var j = this.index;\r\n if (j + length <= this.length) {\r\n return this.dataView.subarray(j, j + length);\r\n } else {\r\n throw new Error('BinaryPackFailure: read index out of range');\r\n }\r\n};\r\n\r\nfunction Packer () {\r\n this.bufferBuilder = new BufferBuilder();\r\n}\r\n\r\nPacker.prototype.getBuffer = function () {\r\n return this.bufferBuilder.getBuffer();\r\n};\r\n\r\nPacker.prototype.pack = function (value) {\r\n var type = typeof (value);\r\n if (type === 'string') {\r\n this.pack_string(value);\r\n } else if (type === 'number') {\r\n if (Math.floor(value) === value) {\r\n this.pack_integer(value);\r\n } else {\r\n this.pack_double(value);\r\n }\r\n } else if (type === 'boolean') {\r\n if (value === true) {\r\n this.bufferBuilder.append(0xc3);\r\n } else if (value === false) {\r\n this.bufferBuilder.append(0xc2);\r\n }\r\n } else if (type === 'undefined') {\r\n this.bufferBuilder.append(0xc0);\r\n } else if (type === 'object') {\r\n if (value === null) {\r\n this.bufferBuilder.append(0xc0);\r\n } else {\r\n var constructor = value.constructor;\r\n if (constructor == Array) {\r\n this.pack_array(value);\r\n } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {\r\n this.pack_bin(value);\r\n } else if (constructor == ArrayBuffer) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value));\r\n } else {\r\n this.pack_bin(value);\r\n }\r\n } else if ('BYTES_PER_ELEMENT' in value) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value.buffer));\r\n } else {\r\n this.pack_bin(value.buffer);\r\n }\r\n } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {\r\n this.pack_object(value);\r\n } else if (constructor == Date) {\r\n this.pack_string(value.toString());\r\n } else if (typeof value.toBinaryPack === 'function') {\r\n this.bufferBuilder.append(value.toBinaryPack());\r\n } else {\r\n throw new Error('Type \"' + constructor.toString() + '\" not yet supported');\r\n }\r\n }\r\n } else {\r\n throw new Error('Type \"' + type + '\" not yet supported');\r\n }\r\n this.bufferBuilder.flush();\r\n};\r\n\r\nPacker.prototype.pack_bin = function (blob) {\r\n var length = blob.length || blob.byteLength || blob.size;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xa0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xda);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdb);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(blob);\r\n};\r\n\r\nPacker.prototype.pack_string = function (str) {\r\n var length = utf8Length(str);\r\n\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xb0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xd8);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xd9);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(str);\r\n};\r\n\r\nPacker.prototype.pack_array = function (ary) {\r\n var length = ary.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x90 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xdc);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdd);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var i = 0; i < length; i++) {\r\n this.pack(ary[i]);\r\n }\r\n};\r\n\r\nPacker.prototype.pack_integer = function (num) {\r\n if (num >= -0x20 && num <= 0x7f) {\r\n this.bufferBuilder.append(num & 0xff);\r\n } else if (num >= 0x00 && num <= 0xff) {\r\n this.bufferBuilder.append(0xcc);\r\n this.pack_uint8(num);\r\n } else if (num >= -0x80 && num <= 0x7f) {\r\n this.bufferBuilder.append(0xd0);\r\n this.pack_int8(num);\r\n } else if (num >= 0x0000 && num <= 0xffff) {\r\n this.bufferBuilder.append(0xcd);\r\n this.pack_uint16(num);\r\n } else if (num >= -0x8000 && num <= 0x7fff) {\r\n this.bufferBuilder.append(0xd1);\r\n this.pack_int16(num);\r\n } else if (num >= 0x00000000 && num <= 0xffffffff) {\r\n this.bufferBuilder.append(0xce);\r\n this.pack_uint32(num);\r\n } else if (num >= -0x80000000 && num <= 0x7fffffff) {\r\n this.bufferBuilder.append(0xd2);\r\n this.pack_int32(num);\r\n } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xd3);\r\n this.pack_int64(num);\r\n } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xcf);\r\n this.pack_uint64(num);\r\n } else {\r\n throw new Error('Invalid integer');\r\n }\r\n};\r\n\r\nPacker.prototype.pack_double = function (num) {\r\n var sign = 0;\r\n if (num < 0) {\r\n sign = 1;\r\n num = -num;\r\n }\r\n var exp = Math.floor(Math.log(num) / Math.LN2);\r\n var frac0 = num / Math.pow(2, exp) - 1;\r\n var frac1 = Math.floor(frac0 * Math.pow(2, 52));\r\n var b32 = Math.pow(2, 32);\r\n var h32 = (sign << 31) | ((exp + 1023) << 20) |\r\n (frac1 / b32) & 0x0fffff;\r\n var l32 = frac1 % b32;\r\n this.bufferBuilder.append(0xcb);\r\n this.pack_int32(h32);\r\n this.pack_int32(l32);\r\n};\r\n\r\nPacker.prototype.pack_object = function (obj) {\r\n var keys = Object.keys(obj);\r\n var length = keys.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x80 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xde);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdf);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n this.pack(prop);\r\n this.pack(obj[prop]);\r\n }\r\n }\r\n};\r\n\r\nPacker.prototype.pack_uint8 = function (num) {\r\n this.bufferBuilder.append(num);\r\n};\r\n\r\nPacker.prototype.pack_uint16 = function (num) {\r\n this.bufferBuilder.append(num >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_uint32 = function (num) {\r\n var n = num & 0xffffffff;\r\n this.bufferBuilder.append((n & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((n & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((n & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((n & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_uint64 = function (num) {\r\n var high = num / Math.pow(2, 32);\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int8 = function (num) {\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int16 = function (num) {\r\n this.bufferBuilder.append((num & 0xff00) >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int32 = function (num) {\r\n this.bufferBuilder.append((num >>> 24) & 0xff);\r\n this.bufferBuilder.append((num & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((num & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((num & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int64 = function (num) {\r\n var high = Math.floor(num / Math.pow(2, 32));\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nfunction _utf8Replace (m) {\r\n var code = m.charCodeAt(0);\r\n\r\n if (code <= 0x7ff) return '00';\r\n if (code <= 0xffff) return '000';\r\n if (code <= 0x1fffff) return '0000';\r\n if (code <= 0x3ffffff) return '00000';\r\n return '000000';\r\n}\r\n\r\nfunction utf8Length (str) {\r\n if (str.length > 600) {\r\n // Blob method faster for large strings\r\n return (new Blob([str])).size;\r\n } else {\r\n return str.replace(/[^\\u0000-\\u007F]/g, _utf8Replace).length;\r\n }\r\n}\r\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n !window.RTCIceGatherer)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n let hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(server => {\n if (server && (server.urls || server.url)) {\n let urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n const isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(url => {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n const validTurn = url.startsWith('turn') &&\n !url.startsWith('turn:[') &&\n url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n const shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n };\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window, browserDetails) {\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n const origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set(value) {\n origMSTEnabled.set.call(this, value);\n const ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = filterIceServers(config.iceServers,\n browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n const initParameters = arguments[1];\n const shouldPerformCheck = initParameters &&\n 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = initParameters.sendEncodings;\n sender.sendEncodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window, browserDetails);\n edgeShim.shimGetDisplayMedia(window, browserDetails);\n edgeShim.shimPeerConnection(window, browserDetails);\n edgeShim.shimReplaceTrack(window, browserDetails);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import webRTCAdapter from \"webrtc-adapter\";\n\nexport { webRTCAdapter };\n","import { webRTCAdapter } from './adapter';\n\nexport const Supports = new class {\n readonly isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);\n readonly supportedBrowsers = ['firefox', 'chrome', 'safari'];\n\n readonly minFirefoxVersion = 59;\n readonly minChromeVersion = 72;\n readonly minSafariVersion = 605;\n\n isWebRTCSupported(): boolean {\n return typeof RTCPeerConnection !== 'undefined';\n }\n\n isBrowserSupported(): boolean {\n const browser = this.getBrowser();\n const version = this.getVersion();\n\n const validBrowser = this.supportedBrowsers.includes(browser);\n\n if (!validBrowser) return false;\n\n if (browser === 'chrome') return version >= this.minChromeVersion;\n if (browser === 'firefox') return version >= this.minFirefoxVersion;\n if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;\n\n return false;\n }\n\n getBrowser(): string {\n return webRTCAdapter.browserDetails.browser;\n }\n\n getVersion(): number {\n return webRTCAdapter.browserDetails.version || 0;\n }\n\n isUnifiedPlanSupported(): boolean {\n const browser = this.getBrowser();\n const version = webRTCAdapter.browserDetails.version || 0;\n\n if (browser === 'chrome' && version < 72) return false;\n if (browser === 'firefox' && version >= 59) return true;\n if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;\n\n let tempPc: RTCPeerConnection;\n let supported = false;\n\n try {\n tempPc = new RTCPeerConnection();\n tempPc.addTransceiver('audio');\n supported = true;\n } catch (e) { }\n finally {\n if (tempPc) {\n tempPc.close();\n }\n }\n\n return supported;\n }\n\n toString(): string {\n return `Supports: \n browser:${this.getBrowser()} \n version:${this.getVersion()} \n isIOS:${this.isIOS} \n isWebRTCSupported:${this.isWebRTCSupported()} \n isBrowserSupported:${this.isBrowserSupported()} \n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\n }\n}","import * as BinaryPack from \"peerjs-js-binarypack\";\nimport { Supports } from './supports';\nimport { UtilSupportsObj } from '..';\n\nconst DEFAULT_CONFIG = {\n iceServers: [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"turn:0.peerjs.com:3478\", username: \"peerjs\", credential: \"peerjsp\" }\n ],\n sdpSemantics: \"unified-plan\"\n};\n\nexport const util = new class {\n noop(): void { }\n\n readonly CLOUD_HOST = \"0.peerjs.com\";\n readonly CLOUD_PORT = 443;\n\n // Browsers that need chunking:\n readonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\n readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\n\n // Returns browser-agnostic default config\n readonly defaultConfig = DEFAULT_CONFIG;\n\n readonly browser = Supports.getBrowser();\n readonly browserVersion = Supports.getVersion();\n\n // Lists which features are supported\n readonly supports = (function () {\n const supported: UtilSupportsObj = {\n browser: Supports.isBrowserSupported(),\n webRTC: Supports.isWebRTCSupported(),\n audioVideo: false,\n data: false,\n binaryBlob: false,\n reliable: false,\n };\n\n if (!supported.webRTC) return supported;\n\n let pc: RTCPeerConnection;\n\n try {\n pc = new RTCPeerConnection(DEFAULT_CONFIG);\n\n supported.audioVideo = true;\n\n let dc: RTCDataChannel;\n\n try {\n dc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\n supported.data = true;\n supported.reliable = !!dc.ordered;\n\n // Binary test\n try {\n dc.binaryType = \"blob\";\n supported.binaryBlob = !Supports.isIOS;\n } catch (e) {\n }\n } catch (e) {\n } finally {\n if (dc) {\n dc.close();\n }\n }\n } catch (e) {\n } finally {\n if (pc) {\n pc.close();\n }\n }\n\n return supported;\n })();\n\n // Ensure alphanumeric ids\n validateId(id: string): boolean {\n // Allow empty ids\n return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\n }\n\n pack = BinaryPack.pack;\n unpack = BinaryPack.unpack;\n\n // Binary stuff\n\n private _dataCount: number = 1;\n\n chunk(blob: Blob): { __peerData: number, n: number, total: number, data: Blob }[] {\n const chunks = [];\n const size = blob.size;\n const total = Math.ceil(size / util.chunkedMTU);\n\n let index = 0;\n let start = 0;\n\n while (start < size) {\n const end = Math.min(size, start + util.chunkedMTU);\n const b = blob.slice(start, end);\n\n const chunk = {\n __peerData: this._dataCount,\n n: index,\n data: b,\n total,\n };\n\n chunks.push(chunk);\n\n start = end;\n index++;\n }\n\n this._dataCount++;\n\n return chunks;\n }\n\n blobToArrayBuffer(blob: Blob, cb: (arg: ArrayBuffer | null) => void): FileReader {\n const fr = new FileReader();\n\n fr.onload = function (evt) {\n if (evt.target) {\n cb(evt.target.result as ArrayBuffer);\n }\n };\n\n fr.readAsArrayBuffer(blob);\n\n return fr;\n }\n\n binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\n const byteArray = new Uint8Array(binary.length);\n\n for (let i = 0; i < binary.length; i++) {\n byteArray[i] = binary.charCodeAt(i) & 0xff;\n }\n\n return byteArray.buffer;\n }\n\n randomToken(): string {\n return Math.random()\n .toString(36)\n .substr(2);\n }\n\n isSecure(): boolean {\n return location.protocol === \"https:\";\n }\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = 'PeerJS: ';\n\n/*\nPrints log messages depending on the debug level passed in. Defaults to 0.\n0 Prints no logs.\n1 Prints only errors.\n2 Prints errors and warnings.\n3 Prints all logs.\n*/\nexport enum LogLevel {\n Disabled,\n Errors,\n Warnings,\n All\n}\n\nclass Logger {\n private _logLevel = LogLevel.Disabled;\n\n get logLevel(): LogLevel { return this._logLevel; }\n\n set logLevel(logLevel: LogLevel) { this._logLevel = logLevel; }\n\n log(...args: any[]) {\n if (this._logLevel >= LogLevel.All) {\n this._print(LogLevel.All, ...args);\n }\n }\n\n warn(...args: any[]) {\n if (this._logLevel >= LogLevel.Warnings) {\n this._print(LogLevel.Warnings, ...args);\n }\n }\n\n error(...args: any[]) {\n if (this._logLevel >= LogLevel.Errors) {\n this._print(LogLevel.Errors, ...args);\n }\n }\n\n setLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\n this._print = fn;\n }\n\n private _print(logLevel: LogLevel, ...rest: any[]): void {\n const copy = [LOG_PREFIX, ...rest];\n\n for (let i in copy) {\n if (copy[i] instanceof Error) {\n copy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\n\n }\n }\n\n if (logLevel >= LogLevel.All) {\n console.log(...copy);\n } else if (logLevel >= LogLevel.Warnings) {\n console.warn(\"WARNING\", ...copy);\n } else if (logLevel >= LogLevel.Errors) {\n console.error(\"ERROR\", ...copy);\n }\n }\n}\n\nexport default new Logger();","export enum ConnectionEventType {\n Open = \"open\",\n Stream = \"stream\",\n Data = \"data\",\n Close = \"close\",\n Error = \"error\",\n IceStateChanged = \"iceStateChanged\"\n}\n\nexport enum ConnectionType {\n Data = \"data\",\n Media = \"media\"\n}\n\nexport enum PeerEventType {\n Open = \"open\",\n Close = \"close\",\n Connection = \"connection\",\n Call = \"call\",\n Disconnected = \"disconnected\",\n Error = \"error\"\n}\n\nexport enum PeerErrorType {\n BrowserIncompatible = \"browser-incompatible\",\n Disconnected = \"disconnected\",\n InvalidID = \"invalid-id\",\n InvalidKey = \"invalid-key\",\n Network = \"network\",\n PeerUnavailable = \"peer-unavailable\",\n SslUnavailable = \"ssl-unavailable\",\n ServerError = \"server-error\",\n SocketError = \"socket-error\",\n SocketClosed = \"socket-closed\",\n UnavailableID = \"unavailable-id\",\n WebRTC = \"webrtc\"\n}\n\nexport enum SerializationType {\n Binary = \"binary\",\n BinaryUTF8 = \"binary-utf8\",\n JSON = \"json\"\n}\n\nexport enum SocketEventType {\n Message = \"message\",\n Disconnected = \"disconnected\",\n Error = \"error\",\n Close = \"close\"\n}\n\nexport enum ServerMessageType {\n Heartbeat = \"HEARTBEAT\",\n Candidate = \"CANDIDATE\",\n Offer = \"OFFER\",\n Answer = \"ANSWER\",\n Open = \"OPEN\", // The connection to the server is open.\n Error = \"ERROR\", // Server error.\n IdTaken = \"ID-TAKEN\", // The selected ID is taken.\n InvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\n Leave = \"LEAVE\", // Another peer has closed its connection to this peer.\n Expire = \"EXPIRE\" // The offer sent to a peer has expired without response.\n\n}","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\nimport { SocketEventType, ServerMessageType } from \"./enums\";\n\n/**\n * An abstraction on top of WebSockets to provide fastest\n * possible connection for peers.\n */\nexport class Socket extends EventEmitter {\n private _disconnected: boolean = true;\n private _id?: string;\n private _messagesQueue: Array = [];\n private _socket?: WebSocket;\n private _wsPingTimer?: any;\n private readonly _baseUrl: string;\n\n constructor(\n secure: any,\n host: string,\n port: number,\n path: string,\n key: string,\n private readonly pingInterval: number = 5000,\n ) {\n super();\n\n const wsProtocol = secure ? \"wss://\" : \"ws://\";\n\n this._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\n }\n\n start(id: string, token: string): void {\n this._id = id;\n\n const wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\n\n if (!!this._socket || !this._disconnected) {\n return;\n }\n\n this._socket = new WebSocket(wsUrl);\n this._disconnected = false;\n\n this._socket.onmessage = (event) => {\n let data;\n\n try {\n data = JSON.parse(event.data);\n logger.log(\"Server message received:\", data);\n } catch (e) {\n logger.log(\"Invalid server message\", event.data);\n return;\n }\n\n this.emit(SocketEventType.Message, data);\n };\n\n this._socket.onclose = (event) => {\n if (this._disconnected) {\n return;\n }\n\n logger.log(\"Socket closed.\", event);\n\n this._cleanup();\n this._disconnected = true;\n\n this.emit(SocketEventType.Disconnected);\n };\n\n // Take care of the queue of connections if necessary and make sure Peer knows\n // socket is open.\n this._socket.onopen = () => {\n if (this._disconnected) {\n return;\n }\n\n this._sendQueuedMessages();\n\n logger.log(\"Socket open\");\n\n this._scheduleHeartbeat();\n };\n }\n\n private _scheduleHeartbeat(): void {\n this._wsPingTimer = setTimeout(() => {\n this._sendHeartbeat();\n }, this.pingInterval);\n }\n\n private _sendHeartbeat(): void {\n if (!this._wsOpen()) {\n logger.log(`Cannot send heartbeat, because socket closed`);\n return;\n }\n\n const message = JSON.stringify({ type: ServerMessageType.Heartbeat });\n\n this._socket!.send(message);\n\n this._scheduleHeartbeat();\n }\n\n /** Is the websocket currently open? */\n private _wsOpen(): boolean {\n return !!this._socket && this._socket.readyState === 1;\n }\n\n /** Send queued messages. */\n private _sendQueuedMessages(): void {\n //Create copy of queue and clear it,\n //because send method push the message back to queue if smth will go wrong\n const copiedQueue = [...this._messagesQueue];\n this._messagesQueue = [];\n\n for (const message of copiedQueue) {\n this.send(message);\n }\n }\n\n /** Exposed send for DC & Peer. */\n send(data: any): void {\n if (this._disconnected) {\n return;\n }\n\n // If we didn't get an ID yet, we can't yet send anything so we should queue\n // up these messages.\n if (!this._id) {\n this._messagesQueue.push(data);\n return;\n }\n\n if (!data.type) {\n this.emit(SocketEventType.Error, \"Invalid message\");\n return;\n }\n\n if (!this._wsOpen()) {\n return;\n }\n\n const message = JSON.stringify(data);\n\n this._socket!.send(message);\n }\n\n close(): void {\n if (this._disconnected) {\n return;\n }\n\n this._cleanup();\n\n this._disconnected = true;\n }\n\n private _cleanup(): void {\n if (this._socket) {\n this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;\n this._socket.close();\n this._socket = undefined;\n }\n\n clearTimeout(this._wsPingTimer!);\n }\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport { ConnectionType, PeerErrorType, ConnectionEventType, ServerMessageType } from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\n\n/**\n * Manages all negotiations between Peers.\n */\nexport class Negotiator {\n constructor(readonly connection: BaseConnection) { }\n\n /** Returns a PeerConnection object set up correctly (for data, media). */\n startConnection(options: any) {\n const peerConnection = this._startPeerConnection();\n\n // Set the connection's PC.\n this.connection.peerConnection = peerConnection;\n\n if (this.connection.type === ConnectionType.Media && options._stream) {\n this._addTracksToConnection(options._stream, peerConnection);\n }\n\n // What do we need to do now?\n if (options.originator) {\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = this.connection;\n\n const config: RTCDataChannelInit = { ordered: !!options.reliable };\n\n const dataChannel = peerConnection.createDataChannel(\n dataConnection.label,\n config\n );\n dataConnection.initialize(dataChannel);\n }\n\n this._makeOffer();\n } else {\n this.handleSDP(\"OFFER\", options.sdp);\n }\n }\n\n /** Start a PC. */\n private _startPeerConnection(): RTCPeerConnection {\n logger.log(\"Creating RTCPeerConnection.\");\n\n const peerConnection = new RTCPeerConnection(this.connection.provider.options.config);\n\n this._setupListeners(peerConnection);\n\n return peerConnection;\n }\n\n /** Set up various WebRTC listeners. */\n private _setupListeners(\n peerConnection: RTCPeerConnection\n ) {\n const peerId = this.connection.peer;\n const connectionId = this.connection.connectionId;\n const connectionType = this.connection.type;\n const provider = this.connection.provider;\n\n // ICE CANDIDATES.\n logger.log(\"Listening for ICE candidates.\");\n\n peerConnection.onicecandidate = (evt) => {\n if (!evt.candidate || !evt.candidate.candidate) return;\n\n logger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\n\n provider.socket.send({\n type: ServerMessageType.Candidate,\n payload: {\n candidate: evt.candidate,\n type: connectionType,\n connectionId: connectionId\n },\n dst: peerId\n });\n };\n\n peerConnection.oniceconnectionstatechange = () => {\n switch (peerConnection.iceConnectionState) {\n case \"failed\":\n logger.log(\n \"iceConnectionState is failed, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Negotiation of connection to \" + peerId + \" failed.\")\n );\n this.connection.close();\n break;\n case \"closed\":\n logger.log(\n \"iceConnectionState is closed, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Connection to \" + peerId + \" closed.\")\n );\n this.connection.close();\n break;\n case \"disconnected\":\n logger.log(\n \"iceConnectionState changed to disconnected on the connection with \" +\n peerId\n );\n break;\n case \"completed\":\n peerConnection.onicecandidate = util.noop;\n break;\n }\n\n this.connection.emit(ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);\n };\n\n // DATACONNECTION.\n logger.log(\"Listening for data channel\");\n // Fired between offer and answer, so options should already be saved\n // in the options hash.\n peerConnection.ondatachannel = (evt) => {\n logger.log(\"Received data channel\");\n\n const dataChannel = evt.channel;\n const connection = (\n provider.getConnection(peerId, connectionId)\n );\n\n connection.initialize(dataChannel);\n };\n\n // MEDIACONNECTION.\n logger.log(\"Listening for remote stream\");\n\n peerConnection.ontrack = (evt) => {\n logger.log(\"Received remote stream\");\n\n const stream = evt.streams[0];\n const connection = provider.getConnection(peerId, connectionId);\n\n if (connection.type === ConnectionType.Media) {\n const mediaConnection = connection;\n\n this._addStreamToMediaConnection(stream, mediaConnection);\n }\n };\n }\n\n cleanup(): void {\n logger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\n\n const peerConnection = this.connection.peerConnection;\n\n if (!peerConnection) {\n return;\n }\n\n this.connection.peerConnection = null;\n\n //unsubscribe from all PeerConnection's events\n peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = () => { };\n\n const peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\n let dataChannelNotClosed = false;\n\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = this.connection;\n const dataChannel = dataConnection.dataChannel;\n\n if (dataChannel) {\n dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== \"closed\";\n }\n }\n\n if (peerConnectionNotClosed || dataChannelNotClosed) {\n peerConnection.close();\n }\n }\n\n private async _makeOffer(): Promise {\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n const offer = await peerConnection.createOffer(\n this.connection.options.constraints\n );\n\n logger.log(\"Created offer.\");\n\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\n offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;\n }\n\n try {\n await peerConnection.setLocalDescription(offer);\n\n logger.log(\"Set localDescription:\", offer, `for:${this.connection.peer}`);\n\n let payload: any = {\n sdp: offer,\n type: this.connection.type,\n connectionId: this.connection.connectionId,\n metadata: this.connection.metadata,\n browser: util.browser\n };\n\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = this.connection;\n\n payload = {\n ...payload,\n label: dataConnection.label,\n reliable: dataConnection.reliable,\n serialization: dataConnection.serialization\n };\n }\n\n provider.socket.send({\n type: ServerMessageType.Offer,\n payload,\n dst: this.connection.peer\n });\n } catch (err) {\n // TODO: investigate why _makeOffer is being called from the answer\n if (\n err !=\n \"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\n ) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setLocalDescription, \", err);\n }\n }\n } catch (err_1) {\n provider.emitError(PeerErrorType.WebRTC, err_1);\n logger.log(\"Failed to createOffer, \", err_1);\n }\n }\n\n private async _makeAnswer(): Promise {\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n const answer = await peerConnection.createAnswer();\n logger.log(\"Created answer.\");\n\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\n answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;\n }\n\n try {\n await peerConnection.setLocalDescription(answer);\n\n logger.log(`Set localDescription:`, answer, `for:${this.connection.peer}`);\n\n provider.socket.send({\n type: ServerMessageType.Answer,\n payload: {\n sdp: answer,\n type: this.connection.type,\n connectionId: this.connection.connectionId,\n browser: util.browser\n },\n dst: this.connection.peer\n });\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setLocalDescription, \", err);\n }\n } catch (err_1) {\n provider.emitError(PeerErrorType.WebRTC, err_1);\n logger.log(\"Failed to create answer, \", err_1);\n }\n }\n\n /** Handle an SDP. */\n async handleSDP(\n type: string,\n sdp: any\n ): Promise {\n sdp = new RTCSessionDescription(sdp);\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n logger.log(\"Setting remote description\", sdp);\n\n const self = this;\n\n try {\n await peerConnection.setRemoteDescription(sdp);\n logger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\n if (type === \"OFFER\") {\n await self._makeAnswer();\n }\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setRemoteDescription, \", err);\n }\n }\n\n /** Handle a candidate. */\n async handleCandidate(ice: any): Promise {\n logger.log(`handleCandidate:`, ice);\n\n const candidate = ice.candidate;\n const sdpMLineIndex = ice.sdpMLineIndex;\n const sdpMid = ice.sdpMid;\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n await peerConnection.addIceCandidate(\n new RTCIceCandidate({\n sdpMid: sdpMid,\n sdpMLineIndex: sdpMLineIndex,\n candidate: candidate\n })\n );\n logger.log(`Added ICE candidate for:${this.connection.peer}`);\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to handleCandidate, \", err);\n }\n }\n\n private _addTracksToConnection(\n stream: MediaStream,\n peerConnection: RTCPeerConnection\n ): void {\n logger.log(`add tracks from stream ${stream.id} to peer connection`);\n\n if (!peerConnection.addTrack) {\n return logger.error(\n `Your browser does't support RTCPeerConnection#addTrack. Ignored.`\n );\n }\n\n stream.getTracks().forEach(track => {\n peerConnection.addTrack(track, stream);\n });\n }\n\n private _addStreamToMediaConnection(\n stream: MediaStream,\n mediaConnection: MediaConnection\n ): void {\n logger.log(\n `add stream ${stream.id} to media connection ${\n mediaConnection.connectionId\n }`\n );\n\n mediaConnection.addStream(stream);\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { Peer } from \"./peer\";\nimport { ServerMessage } from \"./servermessage\";\nimport { ConnectionType } from \"./enums\";\n\nexport abstract class BaseConnection extends EventEmitter {\n protected _open = false;\n\n readonly metadata: any;\n connectionId: string;\n\n peerConnection: RTCPeerConnection;\n\n abstract get type(): ConnectionType;\n\n get open() {\n return this._open;\n }\n\n constructor(\n readonly peer: string,\n public provider: Peer,\n readonly options: any\n ) {\n super();\n\n this.metadata = options.metadata;\n }\n\n abstract close(): void;\n\n abstract handleMessage(message: ServerMessage): void;\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport { ConnectionType, ConnectionEventType, ServerMessageType } from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { AnswerOption } from \"..\";\n\n/**\n * Wraps the streaming interface between two Peers.\n */\nexport class MediaConnection extends BaseConnection {\n private static readonly ID_PREFIX = \"mc_\";\n\n private _negotiator: Negotiator;\n private _localStream: MediaStream;\n private _remoteStream: MediaStream;\n\n get type() {\n return ConnectionType.Media;\n }\n\n get localStream(): MediaStream { return this._localStream; }\n get remoteStream(): MediaStream { return this._remoteStream; }\n\n constructor(peerId: string, provider: Peer, options: any) {\n super(peerId, provider, options);\n\n this._localStream = this.options._stream;\n this.connectionId =\n this.options.connectionId ||\n MediaConnection.ID_PREFIX + util.randomToken();\n\n this._negotiator = new Negotiator(this);\n\n if (this._localStream) {\n this._negotiator.startConnection({\n _stream: this._localStream,\n originator: true\n });\n }\n }\n\n addStream(remoteStream) {\n logger.log(\"Receiving stream\", remoteStream);\n\n this._remoteStream = remoteStream;\n super.emit(ConnectionEventType.Stream, remoteStream); // Should we call this `open`?\n }\n\n handleMessage(message: ServerMessage): void {\n const type = message.type;\n const payload = message.payload;\n\n switch (message.type) {\n case ServerMessageType.Answer:\n // Forward to negotiator\n this._negotiator.handleSDP(type, payload.sdp);\n this._open = true;\n break;\n case ServerMessageType.Candidate:\n this._negotiator.handleCandidate(payload.candidate);\n break;\n default:\n logger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\n break;\n }\n }\n\n answer(stream: MediaStream, options: AnswerOption = {}): void {\n if (this._localStream) {\n logger.warn(\n \"Local stream already exists on this MediaConnection. Are you answering a call twice?\"\n );\n return;\n }\n\n this._localStream = stream;\n\n if (options && options.sdpTransform) {\n this.options.sdpTransform = options.sdpTransform;\n }\n\n this._negotiator.startConnection({ ...this.options._payload, _stream: stream });\n // Retrieve lost messages stored because PeerConnection not set up.\n const messages = this.provider._getMessages(this.connectionId);\n\n for (let message of messages) {\n this.handleMessage(message);\n }\n\n this._open = true;\n }\n\n /**\n * Exposed functionality for users.\n */\n\n /** Allows user to close connection. */\n close(): void {\n if (this._negotiator) {\n this._negotiator.cleanup();\n this._negotiator = null;\n }\n\n this._localStream = null;\n this._remoteStream = null;\n\n if (this.provider) {\n this.provider._removeConnection(this);\n\n this.provider = null;\n }\n\n if (this.options && this.options._stream) {\n this.options._stream = null;\n }\n\n if (!this.open) {\n return;\n }\n\n this._open = false;\n\n super.emit(ConnectionEventType.Close);\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\n\nexport class EncodingQueue extends EventEmitter {\n readonly fileReader: FileReader = new FileReader();\n\n private _queue: Blob[] = [];\n private _processing: boolean = false;\n\n constructor() {\n super();\n\n this.fileReader.onload = (evt) => {\n this._processing = false;\n\n if (evt.target) {\n this.emit('done', evt.target.result as ArrayBuffer);\n }\n\n this.doNextTask();\n };\n\n this.fileReader.onerror = (evt) => {\n logger.error(`EncodingQueue error:`, evt);\n this._processing = false;\n this.destroy();\n this.emit('error', evt);\n }\n }\n\n get queue(): Blob[] {\n return this._queue;\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get processing(): boolean {\n return this._processing;\n }\n\n enque(blob: Blob): void {\n this.queue.push(blob);\n\n if (this.processing) return;\n\n this.doNextTask();\n }\n\n destroy(): void {\n this.fileReader.abort();\n this._queue = [];\n }\n\n private doNextTask(): void {\n if (this.size === 0) return;\n if (this.processing) return;\n\n this._processing = true;\n\n this.fileReader.readAsArrayBuffer(this.queue.shift());\n }\n}","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport {\n ConnectionType,\n ConnectionEventType,\n SerializationType,\n ServerMessageType\n} from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { EncodingQueue } from './encodingQueue';\nimport { DataConnection as IDataConnection } from '../index';\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport class DataConnection extends BaseConnection implements IDataConnection {\n private static readonly ID_PREFIX = \"dc_\";\n private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\n\n private _negotiator: Negotiator;\n readonly label: string;\n readonly serialization: SerializationType;\n readonly reliable: boolean;\n stringify: (data: any) => string = JSON.stringify;\n parse: (data: string) => any = JSON.parse;\n\n get type() {\n return ConnectionType.Data;\n }\n\n private _buffer: any[] = [];\n private _bufferSize = 0;\n private _buffering = false;\n private _chunkedData: {\n [id: number]: {\n data: Blob[],\n count: number,\n total: number\n }\n } = {};\n\n private _dc: RTCDataChannel;\n private _encodingQueue = new EncodingQueue();\n\n get dataChannel(): RTCDataChannel {\n return this._dc;\n }\n\n get bufferSize(): number { return this._bufferSize; }\n\n constructor(peerId: string, provider: Peer, options: any) {\n super(peerId, provider, options);\n\n this.connectionId =\n this.options.connectionId || DataConnection.ID_PREFIX + util.randomToken();\n\n this.label = this.options.label || this.connectionId;\n this.serialization = this.options.serialization || SerializationType.Binary;\n this.reliable = !!this.options.reliable;\n\n this._encodingQueue.on('done', (ab: ArrayBuffer) => {\n this._bufferedSend(ab);\n });\n\n this._encodingQueue.on('error', () => {\n logger.error(`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`);\n this.close();\n });\n\n this._negotiator = new Negotiator(this);\n\n this._negotiator.startConnection(\n this.options._payload || {\n originator: true\n }\n );\n }\n\n /** Called by the Negotiator when the DataChannel is ready. */\n initialize(dc: RTCDataChannel): void {\n this._dc = dc;\n this._configureDataChannel();\n }\n\n private _configureDataChannel(): void {\n if (!util.supports.binaryBlob || util.supports.reliable) {\n this.dataChannel.binaryType = \"arraybuffer\";\n }\n\n this.dataChannel.onopen = () => {\n logger.log(`DC#${this.connectionId} dc connection success`);\n this._open = true;\n this.emit(ConnectionEventType.Open);\n };\n\n this.dataChannel.onmessage = (e) => {\n logger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\n this._handleDataMessage(e);\n };\n\n this.dataChannel.onclose = () => {\n logger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n this.close();\n };\n }\n\n // Handles a DataChannel message.\n private _handleDataMessage({ data }: { data: Blob | ArrayBuffer | string }): void {\n const datatype = data.constructor;\n\n const isBinarySerialization = this.serialization === SerializationType.Binary ||\n this.serialization === SerializationType.BinaryUTF8;\n\n let deserializedData: any = data;\n\n if (isBinarySerialization) {\n if (datatype === Blob) {\n // Datatype should never be blob\n util.blobToArrayBuffer(data as Blob, (ab) => {\n const unpackedData = util.unpack(ab);\n this.emit(ConnectionEventType.Data, unpackedData);\n });\n return;\n } else if (datatype === ArrayBuffer) {\n deserializedData = util.unpack(data as ArrayBuffer);\n } else if (datatype === String) {\n // String fallback for binary data for browsers that don't support binary yet\n const ab = util.binaryStringToArrayBuffer(data as string);\n deserializedData = util.unpack(ab);\n }\n } else if (this.serialization === SerializationType.JSON) {\n deserializedData = this.parse(data as string);\n }\n\n // Check if we've chunked--if so, piece things back together.\n // We're guaranteed that this isn't 0.\n if (deserializedData.__peerData) {\n this._handleChunk(deserializedData);\n return;\n }\n\n super.emit(ConnectionEventType.Data, deserializedData);\n }\n\n private _handleChunk(data: { __peerData: number, n: number, total: number, data: Blob }): void {\n const id = data.__peerData;\n const chunkInfo = this._chunkedData[id] || {\n data: [],\n count: 0,\n total: data.total\n };\n\n chunkInfo.data[data.n] = data.data;\n chunkInfo.count++;\n this._chunkedData[id] = chunkInfo;\n\n if (chunkInfo.total === chunkInfo.count) {\n // Clean up before making the recursive call to `_handleDataMessage`.\n delete this._chunkedData[id];\n\n // We've received all the chunks--time to construct the complete data.\n const data = new Blob(chunkInfo.data);\n this._handleDataMessage({ data });\n }\n }\n\n /**\n * Exposed functionality for users.\n */\n\n /** Allows user to close connection. */\n close(): void {\n this._buffer = [];\n this._bufferSize = 0;\n this._chunkedData = {};\n\n if (this._negotiator) {\n this._negotiator.cleanup();\n this._negotiator = null;\n }\n\n if (this.provider) {\n this.provider._removeConnection(this);\n\n this.provider = null;\n }\n\n if (this.dataChannel) {\n this.dataChannel.onopen = null;\n this.dataChannel.onmessage = null;\n this.dataChannel.onclose = null;\n this._dc = null;\n }\n\n if (this._encodingQueue) {\n this._encodingQueue.destroy();\n this._encodingQueue.removeAllListeners();\n this._encodingQueue = null;\n }\n\n if (!this.open) {\n return;\n }\n\n this._open = false;\n\n super.emit(ConnectionEventType.Close);\n }\n\n /** Allows user to send data. */\n send(data: any, chunked?: boolean): void {\n if (!this.open) {\n super.emit(\n ConnectionEventType.Error,\n new Error(\n \"Connection is not open. You should listen for the `open` event before sending messages.\"\n )\n );\n return;\n }\n\n if (this.serialization === SerializationType.JSON) {\n this._bufferedSend(this.stringify(data));\n } else if (\n this.serialization === SerializationType.Binary ||\n this.serialization === SerializationType.BinaryUTF8\n ) {\n const blob = util.pack(data);\n\n if (!chunked && blob.size > util.chunkedMTU) {\n this._sendChunks(blob);\n return;\n }\n\n if (!util.supports.binaryBlob) {\n // We only do this if we really need to (e.g. blobs are not supported),\n // because this conversion is costly.\n this._encodingQueue.enque(blob);\n } else {\n this._bufferedSend(blob);\n }\n } else {\n this._bufferedSend(data);\n }\n }\n\n private _bufferedSend(msg: any): void {\n if (this._buffering || !this._trySend(msg)) {\n this._buffer.push(msg);\n this._bufferSize = this._buffer.length;\n }\n }\n\n // Returns true if the send succeeds.\n private _trySend(msg: any): boolean {\n if (!this.open) {\n return false;\n }\n\n if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\n this._buffering = true;\n setTimeout(() => {\n this._buffering = false;\n this._tryBuffer();\n }, 50);\n\n return false;\n }\n\n try {\n this.dataChannel.send(msg);\n } catch (e) {\n logger.error(`DC#:${this.connectionId} Error when sending:`, e);\n this._buffering = true;\n\n this.close();\n\n return false;\n }\n\n return true;\n }\n\n // Try to send the first message in the buffer.\n private _tryBuffer(): void {\n if (!this.open) {\n return;\n }\n\n if (this._buffer.length === 0) {\n return;\n }\n\n const msg = this._buffer[0];\n\n if (this._trySend(msg)) {\n this._buffer.shift();\n this._bufferSize = this._buffer.length;\n this._tryBuffer();\n }\n }\n\n private _sendChunks(blob: Blob): void {\n const blobs = util.chunk(blob);\n logger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\n\n for (let blob of blobs) {\n this.send(blob, true);\n }\n }\n\n handleMessage(message: ServerMessage): void {\n const payload = message.payload;\n\n switch (message.type) {\n case ServerMessageType.Answer:\n this._negotiator.handleSDP(message.type, payload.sdp);\n break;\n case ServerMessageType.Candidate:\n this._negotiator.handleCandidate(payload.candidate);\n break;\n default:\n logger.warn(\n \"Unrecognized message type:\",\n message.type,\n \"from peer:\",\n this.peer\n );\n break;\n }\n }\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\n\nexport class API {\n constructor(private readonly _options: any) { }\n\n private _buildUrl(method: string): string {\n const protocol = this._options.secure ? \"https://\" : \"http://\";\n let url =\n protocol +\n this._options.host +\n \":\" +\n this._options.port +\n this._options.path +\n this._options.key +\n \"/\" +\n method;\n const queryString = \"?ts=\" + new Date().getTime() + \"\" + Math.random();\n url += queryString;\n\n return url;\n }\n\n /** Get a unique ID from the server via XHR and initialize with it. */\n async retrieveId(): Promise {\n const url = this._buildUrl(\"id\");\n\n try {\n const response = await fetch(url);\n\n if (response.status !== 200) {\n throw new Error(`Error. Status:${response.status}`);\n }\n\n return response.text();\n } catch (error) {\n logger.error(\"Error retrieving ID\", error);\n\n let pathError = \"\";\n\n if (\n this._options.path === \"/\" &&\n this._options.host !== util.CLOUD_HOST\n ) {\n pathError =\n \" If you passed in a `path` to your self-hosted PeerServer, \" +\n \"you'll also need to pass in that same path when creating a new \" +\n \"Peer.\";\n }\n\n throw new Error(\"Could not get an ID from the server.\" + pathError);\n }\n }\n\n /** @deprecated */\n async listAllPeers(): Promise {\n const url = this._buildUrl(\"peers\");\n\n try {\n const response = await fetch(url);\n\n if (response.status !== 200) {\n if (response.status === 401) {\n let helpfulError = \"\";\n\n if (this._options.host === util.CLOUD_HOST) {\n helpfulError =\n \"It looks like you're using the cloud server. You can email \" +\n \"team@peerjs.com to enable peer listing for your API key.\";\n } else {\n helpfulError =\n \"You need to enable `allow_discovery` on your self-hosted \" +\n \"PeerServer to use this feature.\";\n }\n\n throw new Error(\"It doesn't look like you have permission to list peers IDs. \" +\n helpfulError);\n }\n\n throw new Error(`Error. Status:${response.status}`);\n }\n\n return response.json();\n } catch (error) {\n logger.error(\"Error retrieving list peers\", error);\n\n throw new Error(\"Could not get list peers from the server.\" + error);\n }\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { util } from \"./util\";\nimport logger, { LogLevel } from \"./logger\";\nimport { Socket } from \"./socket\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport {\n ConnectionType,\n PeerErrorType,\n PeerEventType,\n SocketEventType,\n ServerMessageType\n} from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { API } from \"./api\";\nimport { PeerConnectOption, PeerJSOption } from \"..\";\n\nclass PeerOptions implements PeerJSOption {\n debug?: LogLevel; // 1: Errors, 2: Warnings, 3: All logs\n host?: string;\n port?: number;\n path?: string;\n key?: string;\n token?: string;\n config?: any;\n secure?: boolean;\n pingInterval?: number;\n logFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\n}\n\n/**\n * A peer who can initiate connections with other peers.\n */\nexport class Peer extends EventEmitter {\n private static readonly DEFAULT_KEY = \"peerjs\";\n\n private readonly _options: PeerOptions;\n private readonly _api: API;\n private readonly _socket: Socket;\n\n private _id: string | null = null;\n private _lastServerId: string | null = null;\n\n // States.\n private _destroyed = false; // Connections have been killed\n private _disconnected = false; // Connection to PeerServer killed but P2P connections still active\n private _open = false; // Sockets and such are not yet open.\n private readonly _connections: Map = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map = new Map(); // src => [list of messages]\n\n get id() {\n return this._id;\n }\n\n get options() {\n return this._options;\n }\n\n get open() {\n return this._open;\n }\n\n get socket() {\n return this._socket;\n }\n\n /**\n * @deprecated \n * Return type will change from Object to Map \n */\n get connections(): Object {\n const plainConnections = Object.create(null);\n\n for (let [k, v] of this._connections) {\n plainConnections[k] = v;\n }\n\n return plainConnections;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n get disconnected() {\n return this._disconnected;\n }\n\n constructor(id?: string | PeerOptions, options?: PeerOptions) {\n super();\n\n let userId: string | undefined;\n\n // Deal with overloading\n if (id && id.constructor == Object) {\n options = id as PeerOptions;\n } else if (id) {\n userId = id.toString();\n }\n\n // Configurize options\n options = {\n debug: 0, // 1: Errors, 2: Warnings, 3: All logs\n host: util.CLOUD_HOST,\n port: util.CLOUD_PORT,\n path: \"/\",\n key: Peer.DEFAULT_KEY,\n token: util.randomToken(),\n config: util.defaultConfig,\n ...options\n };\n this._options = options;\n\n // Detect relative URL host.\n if (this._options.host === \"/\") {\n this._options.host = window.location.hostname;\n }\n\n // Set path correctly.\n if (this._options.path) {\n if (this._options.path[0] !== \"/\") {\n this._options.path = \"/\" + this._options.path;\n }\n if (this._options.path[this._options.path.length - 1] !== \"/\") {\n this._options.path += \"/\";\n }\n }\n\n // Set whether we use SSL to same as current host\n if (this._options.secure === undefined && this._options.host !== util.CLOUD_HOST) {\n this._options.secure = util.isSecure();\n } else if (this._options.host == util.CLOUD_HOST) {\n this._options.secure = true;\n }\n // Set a custom log function if present\n if (this._options.logFunction) {\n logger.setLogFunction(this._options.logFunction);\n }\n\n logger.logLevel = this._options.debug || 0;\n\n this._api = new API(options);\n this._socket = this._createServerConnection();\n\n // Sanity checks\n // Ensure WebRTC supported\n if (!util.supports.audioVideo && !util.supports.data) {\n this._delayedAbort(\n PeerErrorType.BrowserIncompatible,\n \"The current browser does not support WebRTC\"\n );\n return;\n }\n\n // Ensure alphanumeric id\n if (!!userId && !util.validateId(userId)) {\n this._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\n return;\n }\n\n if (userId) {\n this._initialize(userId);\n } else {\n this._api.retrieveId()\n .then(id => this._initialize(id))\n .catch(error => this._abort(PeerErrorType.ServerError, error));\n }\n }\n\n private _createServerConnection(): Socket {\n const socket = new Socket(\n this._options.secure,\n this._options.host!,\n this._options.port!,\n this._options.path!,\n this._options.key!,\n this._options.pingInterval\n );\n\n socket.on(SocketEventType.Message, (data: ServerMessage) => {\n this._handleMessage(data);\n });\n\n socket.on(SocketEventType.Error, (error: string) => {\n this._abort(PeerErrorType.SocketError, error);\n });\n\n socket.on(SocketEventType.Disconnected, () => {\n if (this.disconnected) {\n return;\n }\n\n this.emitError(PeerErrorType.Network, \"Lost connection to server.\");\n this.disconnect();\n });\n\n socket.on(SocketEventType.Close, () => {\n if (this.disconnected) {\n return;\n }\n\n this._abort(PeerErrorType.SocketClosed, \"Underlying socket is already closed.\");\n });\n\n return socket;\n }\n\n /** Initialize a connection with the server. */\n private _initialize(id: string): void {\n this._id = id;\n this.socket.start(id, this._options.token!);\n }\n\n /** Handles messages from the server. */\n private _handleMessage(message: ServerMessage): void {\n const type = message.type;\n const payload = message.payload;\n const peerId = message.src;\n\n switch (type) {\n case ServerMessageType.Open: // The connection to the server is open.\n this._lastServerId = this.id;\n this._open = true;\n this.emit(PeerEventType.Open, this.id);\n break;\n case ServerMessageType.Error: // Server error.\n this._abort(PeerErrorType.ServerError, payload.msg);\n break;\n case ServerMessageType.IdTaken: // The selected ID is taken.\n this._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\n break;\n case ServerMessageType.InvalidKey: // The given API key cannot be found.\n this._abort(PeerErrorType.InvalidKey, `API KEY \"${this._options.key}\" is invalid`);\n break;\n case ServerMessageType.Leave: // Another peer has closed its connection to this peer.\n logger.log(`Received leave message from ${peerId}`);\n this._cleanupPeer(peerId);\n this._connections.delete(peerId);\n break;\n case ServerMessageType.Expire: // The offer sent to a peer has expired without response.\n this.emitError(PeerErrorType.PeerUnavailable, `Could not connect to peer ${peerId}`);\n break;\n case ServerMessageType.Offer: {\n // we should consider switching this to CALL/CONNECT, but this is the least breaking option.\n const connectionId = payload.connectionId;\n let connection = this.getConnection(peerId, connectionId);\n\n if (connection) {\n connection.close();\n logger.warn(`Offer received for existing Connection ID:${connectionId}`);\n }\n\n // Create a new connection.\n if (payload.type === ConnectionType.Media) {\n connection = new MediaConnection(peerId, this, {\n connectionId: connectionId,\n _payload: payload,\n metadata: payload.metadata\n });\n this._addConnection(peerId, connection);\n this.emit(PeerEventType.Call, connection);\n } else if (payload.type === ConnectionType.Data) {\n connection = new DataConnection(peerId, this, {\n connectionId: connectionId,\n _payload: payload,\n metadata: payload.metadata,\n label: payload.label,\n serialization: payload.serialization,\n reliable: payload.reliable\n });\n this._addConnection(peerId, connection);\n this.emit(PeerEventType.Connection, connection);\n } else {\n logger.warn(`Received malformed connection type:${payload.type}`);\n return;\n }\n\n // Find messages.\n const messages = this._getMessages(connectionId);\n for (let message of messages) {\n connection.handleMessage(message);\n }\n\n break;\n }\n default: {\n if (!payload) {\n logger.warn(`You received a malformed message from ${peerId} of type ${type}`);\n return;\n }\n\n const connectionId = payload.connectionId;\n const connection = this.getConnection(peerId, connectionId);\n\n if (connection && connection.peerConnection) {\n // Pass it on.\n connection.handleMessage(message);\n } else if (connectionId) {\n // Store for possible later use\n this._storeMessage(connectionId, message);\n } else {\n logger.warn(\"You received an unrecognized message:\", message);\n }\n break;\n }\n }\n }\n\n /** Stores messages without a set up connection, to be claimed later. */\n private _storeMessage(connectionId: string, message: ServerMessage): void {\n if (!this._lostMessages.has(connectionId)) {\n this._lostMessages.set(connectionId, []);\n }\n\n this._lostMessages.get(connectionId).push(message);\n }\n\n /** Retrieve messages from lost message store */\n //TODO Change it to private\n public _getMessages(connectionId: string): ServerMessage[] {\n const messages = this._lostMessages.get(connectionId);\n\n if (messages) {\n this._lostMessages.delete(connectionId);\n return messages;\n }\n\n return [];\n }\n\n /**\n * Returns a DataConnection to the specified peer. See documentation for a\n * complete list of options.\n */\n connect(peer: string, options: PeerConnectOption = {}): DataConnection {\n if (this.disconnected) {\n logger.warn(\n \"You cannot connect to a new Peer because you called \" +\n \".disconnect() on this Peer and ended your connection with the \" +\n \"server. You can create a new Peer to reconnect, or call reconnect \" +\n \"on this peer if you believe its ID to still be available.\"\n );\n this.emitError(\n PeerErrorType.Disconnected,\n \"Cannot connect to new Peer after disconnecting from server.\"\n );\n return;\n }\n\n const dataConnection = new DataConnection(peer, this, options);\n this._addConnection(peer, dataConnection);\n return dataConnection;\n }\n\n /**\n * Returns a MediaConnection to the specified peer. See documentation for a\n * complete list of options.\n */\n call(peer: string, stream: MediaStream, options: any = {}): MediaConnection {\n if (this.disconnected) {\n logger.warn(\n \"You cannot connect to a new Peer because you called \" +\n \".disconnect() on this Peer and ended your connection with the \" +\n \"server. You can create a new Peer to reconnect.\"\n );\n this.emitError(\n PeerErrorType.Disconnected,\n \"Cannot connect to new Peer after disconnecting from server.\"\n );\n return;\n }\n\n if (!stream) {\n logger.error(\n \"To call a peer, you must provide a stream from your browser's `getUserMedia`.\"\n );\n return;\n }\n\n options._stream = stream;\n\n const mediaConnection = new MediaConnection(peer, this, options);\n this._addConnection(peer, mediaConnection);\n return mediaConnection;\n }\n\n /** Add a data/media connection to this peer. */\n private _addConnection(peerId: string, connection: BaseConnection): void {\n logger.log(`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`);\n\n if (!this._connections.has(peerId)) {\n this._connections.set(peerId, []);\n }\n this._connections.get(peerId).push(connection);\n }\n\n //TODO should be private\n _removeConnection(connection: BaseConnection): void {\n const connections = this._connections.get(connection.peer);\n\n if (connections) {\n const index = connections.indexOf(connection);\n\n if (index !== -1) {\n connections.splice(index, 1);\n }\n }\n\n //remove from lost messages\n this._lostMessages.delete(connection.connectionId);\n }\n\n /** Retrieve a data/media connection for this peer. */\n getConnection(peerId: string, connectionId: string): null | BaseConnection {\n const connections = this._connections.get(peerId);\n if (!connections) {\n return null;\n }\n\n for (let connection of connections) {\n if (connection.connectionId === connectionId) {\n return connection;\n }\n }\n\n return null;\n }\n\n private _delayedAbort(type: PeerErrorType, message: string | Error): void {\n setTimeout(() => {\n this._abort(type, message);\n }, 0);\n }\n\n /**\n * Emits an error message and destroys the Peer.\n * The Peer is not destroyed if it's in a disconnected state, in which case\n * it retains its disconnected state and its existing connections.\n */\n private _abort(type: PeerErrorType, message: string | Error): void {\n logger.error(\"Aborting!\");\n\n this.emitError(type, message);\n\n if (!this._lastServerId) {\n this.destroy();\n } else {\n this.disconnect();\n }\n }\n\n /** Emits a typed error message. */\n emitError(type: PeerErrorType, err: string | Error): void {\n logger.error(\"Error:\", err);\n\n let error: Error & { type?: PeerErrorType };\n\n if (typeof err === \"string\") {\n error = new Error(err);\n } else {\n error = err as Error;\n }\n\n error.type = type;\n\n this.emit(PeerEventType.Error, error);\n }\n\n /**\n * Destroys the Peer: closes all active connections as well as the connection\n * to the server.\n * Warning: The peer can no longer create or accept connections after being\n * destroyed.\n */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n logger.log(`Destroy peer with ID:${this.id}`);\n\n this.disconnect();\n this._cleanup();\n\n this._destroyed = true;\n\n this.emit(PeerEventType.Close);\n }\n\n /** Disconnects every connection on this peer. */\n private _cleanup(): void {\n for (let peerId of this._connections.keys()) {\n this._cleanupPeer(peerId);\n this._connections.delete(peerId);\n }\n\n this.socket.removeAllListeners();\n }\n\n /** Closes all connections to this peer. */\n private _cleanupPeer(peerId: string): void {\n const connections = this._connections.get(peerId);\n\n if (!connections) return;\n\n for (let connection of connections) {\n connection.close();\n }\n }\n\n /**\n * Disconnects the Peer's connection to the PeerServer. Does not close any\n * active connections.\n * Warning: The peer can no longer create or accept connections after being\n * disconnected. It also cannot reconnect to the server.\n */\n disconnect(): void {\n if (this.disconnected) {\n return;\n }\n\n const currentId = this.id;\n\n logger.log(`Disconnect peer with ID:${currentId}`);\n\n this._disconnected = true;\n this._open = false;\n\n this.socket.close();\n\n this._lastServerId = currentId;\n this._id = null;\n\n this.emit(PeerEventType.Disconnected, currentId);\n }\n\n /** Attempts to reconnect with the same ID. */\n reconnect(): void {\n if (this.disconnected && !this.destroyed) {\n logger.log(`Attempting reconnection to server with ID ${this._lastServerId}`);\n this._disconnected = false;\n this._initialize(this._lastServerId!);\n } else if (this.destroyed) {\n throw new Error(\"This peer cannot reconnect to the server. It has already been destroyed.\");\n } else if (!this.disconnected && !this.open) {\n // Do nothing. We're still connecting the first time.\n logger.error(\"In a hurry? We're still trying to make the initial connection!\");\n } else {\n throw new Error(`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`);\n }\n }\n\n /**\n * Get a list of available peer IDs. If you're running your own server, you'll\n * want to set allow_discovery: true in the PeerServer options. If you're using\n * the cloud server, email team@peerjs.com to get the functionality enabled for\n * your key.\n */\n listAllPeers(cb = (_: any[]) => { }): void {\n this._api.listAllPeers()\n .then(peers => cb(peers))\n .catch(error => this._abort(PeerErrorType.ServerError, error));\n }\n}\n","import { util } from \"./util\";\nimport { Peer } from \"./peer\";\n\nexport const peerjs = {\n Peer,\n util\n};\n\nexport default Peer;\n\n(window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(window).Peer = Peer;\n"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","../node_modules/peerjs-js-binarypack/lib/binarypack.js","../node_modules/webrtc-adapter/src/js/utils.js","../node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","../node_modules/sdp/sdp.js","../node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","../node_modules/webrtc-adapter/src/js/edge/getusermedia.js","../node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/edge/edge_shim.js","../node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/webrtc-adapter/src/js/adapter_core.js","adapter.ts","supports.ts","util.ts","../node_modules/eventemitter3/index.js","logger.ts","enums.ts","socket.ts","negotiator.ts","baseconnection.ts","mediaconnection.ts","encodingQueue.ts","dataconnection.ts","api.ts","peer.ts","exports.ts"],"names":["logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","length","parseInt","wrapPeerConnectionEvent","window","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","get","delete","size","Object","keys","defineProperty","enumerable","configurable","disableLog","bool","Error","disableWarnings","log","console","deprecated","oldMethod","newMethod","warn","detectBrowser","result","browser","version","navigator","mozGetUserMedia","userAgent","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","RTCIceGatherer","mediaDevices","supportsUnifiedPlan","RTCRtpTransceiver","isObject","val","toString","call","compactObject","data","reduce","accumulator","key","isObj","value","isEmptyObject","undefined","assign","walkStats","stats","base","resultSet","id","forEach","name","endsWith","filterStats","track","outbound","streamStatsType","filteredResult","trackStats","type","trackIdentifier","push","trackStat","trackId","logging","utils","shimGetUserMedia","browserDetails","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","then","devices","filter","d","kind","dev","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia_","onSuccess","onError","getUserMedia","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","error","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","event","Event","transceiver","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","successCallbackWrapper_","resolve","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","alreadyExists","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","signalingState","t","oldStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","method","nativeMethod","methodObj","args","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","isLocal","streamid","hasTrack","shimPeerConnection","RTCIceCandidate","fixNegotiationNeeded","target","getConfiguration","sdpSemantics","filterIceServers","iceServers","edgeVersion","hasTurn","server","urls","url","isString","validTurn","startsWith","SDPUtils","require","fixStatsType","inboundrtp","outboundrtp","candidatepair","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","i","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","Math","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","code","NotSupportedError","InvalidAccessError","TypeError","OperationError","module","exports","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","removeTrackFromStreamAndFireEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","config","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","enabled","_createIceGatherer","sdpMLineIndex","shift","writable","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","rejected","isRejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","getCapabilities","codec","isNewTrack","default","nativeTrack","hasRtx","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","remoteExtensions","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","addIceCandidate","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjects","ortcObjectName","nativeGetstats","nativeStats","mapStats","methods","catch","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","shimReplaceTrack","replaceTrack","setTrack","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","ridRegex","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","finally","shimCreateAnswer","origCreateAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","index","tracks","shimRemoteStreamsAPI","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","successCallback","failureCallback","options","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","hasOwnProperty","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","audioTransceiver","getTransceivers","setDirection","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","shimMaxMessageSize","_sctp","sctpInDescription","mLine","parseMLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","maxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeExtmapAllowMixed","nativeSRD","line","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1gBA;;;;;;;;AAOC;AACD;;;;;;;;;;;;;;;;;;;;AAEA,IAAIA,YAAY,GAAG,IAAnB;AACA,IAAIC,oBAAoB,GAAG,IAA3B;AAEA;;;;;;;;;AAQO,SAASC,cAAT,CAAwBC,QAAxB,EAAkCC,IAAlC,EAAwCC,GAAxC,EAA6C;AAClD,MAAMC,KAAK,GAAGH,QAAQ,CAACG,KAAT,CAAeF,IAAf,CAAd;AACA,SAAOE,KAAK,IAAIA,KAAK,CAACC,MAAN,IAAgBF,GAAzB,IAAgCG,QAAQ,CAACF,KAAK,CAACD,GAAD,CAAN,EAAa,EAAb,CAA/C;AACD,EAED;AACA;AACA;;;AACO,SAASI,uBAAT,CAAiCC,MAAjC,EAAyCC,eAAzC,EAA0DC,OAA1D,EAAmE;AACxE,MAAI,CAACF,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD;;AACD,MAAMC,KAAK,GAAGJ,MAAM,CAACG,iBAAP,CAAyBE,SAAvC;AACA,MAAMC,sBAA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lB,EAA2B;AACzBA,UAAAA,OAAO,GAAG,IAAV;AACA,iBAAO,IAAP;AACD;;AACD,eAAOK,SAAS,IAAI,CAACL,OAArB;AACD,OAdM,CAAP;AAgBA,aAAOC,MAAM,CAACE,GAAd;AACAF,MAAAA,MAAM,CAACC,IAAP,GAAcE,QAAQ,GAAGF,IAAI,CAAC,CAAD,CAAP,GAAaA,IAAnC;AACA,aAAO,CAAC,CAACA,IAAI,CAACvT,MAAd;AACD;AACF,GA9BM,CAAP;AA+BD;;AClDD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzzBA;;;;;;;;AAOC;AACD;;AAEA,IAAI4T,QAAQ,GAAGC,OAAO,CAAC,KAAD,CAAtB;;AAEA,SAASC,YAAT,CAAsBtE,IAAtB,EAA4B;AAC1B,SAAO;AACLuE,IAAAA,UAAU,EAAE,aADP;AAELC,IAAAA,WAAW,EAAE,cAFR;AAGLC,IAAAA,aAAa,EAAE,gBAHV;AAIL5E,IAAAA,cAAc,EAAE,iBAJX;AAKLC,IAAAA,eAAe,EAAE;AALZ,IAMLE,IAAI,CAAClK,IANA,KAMSkK,IAAI,CAAClK,IANrB;AAOD;;AAED,SAAS4O,iBAAT,CAA2BtH,WAA3B,EAAwCuH,IAAxC,EAA8C7O,IAA9C,EAAoDgF,MAApD,EAA4D8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CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AA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","file":"peerjs.js","sourceRoot":"..\\lib","sourcesContent":["var binaryFeatures = {};\r\nbinaryFeatures.useBlobBuilder = (function () {\r\n try {\r\n new Blob([]);\r\n return false;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nbinaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {\r\n try {\r\n return (new Blob([new Uint8Array([])])).size === 0;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nmodule.exports.binaryFeatures = binaryFeatures;\r\nvar BlobBuilder = module.exports.BlobBuilder;\r\nif (typeof window !== 'undefined') {\r\n BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||\r\n window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;\r\n}\r\n\r\nfunction BufferBuilder () {\r\n this._pieces = [];\r\n this._parts = [];\r\n}\r\n\r\nBufferBuilder.prototype.append = function (data) {\r\n if (typeof data === 'number') {\r\n this._pieces.push(data);\r\n } else {\r\n this.flush();\r\n this._parts.push(data);\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.flush = function () {\r\n if (this._pieces.length > 0) {\r\n var buf = new Uint8Array(this._pieces);\r\n if (!binaryFeatures.useArrayBufferView) {\r\n buf = buf.buffer;\r\n }\r\n this._parts.push(buf);\r\n this._pieces = [];\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.getBuffer = function () {\r\n this.flush();\r\n if (binaryFeatures.useBlobBuilder) {\r\n var builder = new BlobBuilder();\r\n for (var i = 0, ii = this._parts.length; i < ii; i++) {\r\n builder.append(this._parts[i]);\r\n }\r\n return builder.getBlob();\r\n } else {\r\n return new Blob(this._parts);\r\n }\r\n};\r\n\r\nmodule.exports.BufferBuilder = BufferBuilder;\r\n","var BufferBuilder = require('./bufferbuilder').BufferBuilder;\r\nvar binaryFeatures = require('./bufferbuilder').binaryFeatures;\r\n\r\nvar BinaryPack = {\r\n unpack: function (data) {\r\n var unpacker = new Unpacker(data);\r\n return unpacker.unpack();\r\n },\r\n pack: function (data) {\r\n var packer = new Packer();\r\n packer.pack(data);\r\n var buffer = packer.getBuffer();\r\n return buffer;\r\n }\r\n};\r\n\r\nmodule.exports = BinaryPack;\r\n\r\nfunction Unpacker (data) {\r\n // Data is ArrayBuffer\r\n this.index = 0;\r\n this.dataBuffer = data;\r\n this.dataView = new Uint8Array(this.dataBuffer);\r\n this.length = this.dataBuffer.byteLength;\r\n}\r\n\r\nUnpacker.prototype.unpack = function () {\r\n var type = this.unpack_uint8();\r\n if (type < 0x80) {\r\n return type;\r\n } else if ((type ^ 0xe0) < 0x20) {\r\n return (type ^ 0xe0) - 0x20;\r\n }\r\n\r\n var size;\r\n if ((size = type ^ 0xa0) <= 0x0f) {\r\n return this.unpack_raw(size);\r\n } else if ((size = type ^ 0xb0) <= 0x0f) {\r\n return this.unpack_string(size);\r\n } else if ((size = type ^ 0x90) <= 0x0f) {\r\n return this.unpack_array(size);\r\n } else if ((size = type ^ 0x80) <= 0x0f) {\r\n return this.unpack_map(size);\r\n }\r\n\r\n switch (type) {\r\n case 0xc0:\r\n return null;\r\n case 0xc1:\r\n return undefined;\r\n case 0xc2:\r\n return false;\r\n case 0xc3:\r\n return true;\r\n case 0xca:\r\n return this.unpack_float();\r\n case 0xcb:\r\n return this.unpack_double();\r\n case 0xcc:\r\n return this.unpack_uint8();\r\n case 0xcd:\r\n return this.unpack_uint16();\r\n case 0xce:\r\n return this.unpack_uint32();\r\n case 0xcf:\r\n return this.unpack_uint64();\r\n case 0xd0:\r\n return this.unpack_int8();\r\n case 0xd1:\r\n return this.unpack_int16();\r\n case 0xd2:\r\n return this.unpack_int32();\r\n case 0xd3:\r\n return this.unpack_int64();\r\n case 0xd4:\r\n return undefined;\r\n case 0xd5:\r\n return undefined;\r\n case 0xd6:\r\n return undefined;\r\n case 0xd7:\r\n return undefined;\r\n case 0xd8:\r\n size = this.unpack_uint16();\r\n return this.unpack_string(size);\r\n case 0xd9:\r\n size = this.unpack_uint32();\r\n return this.unpack_string(size);\r\n case 0xda:\r\n size = this.unpack_uint16();\r\n return this.unpack_raw(size);\r\n case 0xdb:\r\n size = this.unpack_uint32();\r\n return this.unpack_raw(size);\r\n case 0xdc:\r\n size = this.unpack_uint16();\r\n return this.unpack_array(size);\r\n case 0xdd:\r\n size = this.unpack_uint32();\r\n return this.unpack_array(size);\r\n case 0xde:\r\n size = this.unpack_uint16();\r\n return this.unpack_map(size);\r\n case 0xdf:\r\n size = this.unpack_uint32();\r\n return this.unpack_map(size);\r\n }\r\n};\r\n\r\nUnpacker.prototype.unpack_uint8 = function () {\r\n var byte = this.dataView[this.index] & 0xff;\r\n this.index++;\r\n return byte;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint16 = function () {\r\n var bytes = this.read(2);\r\n var uint16 =\r\n ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);\r\n this.index += 2;\r\n return uint16;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint32 = function () {\r\n var bytes = this.read(4);\r\n var uint32 =\r\n ((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3];\r\n this.index += 4;\r\n return uint32;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint64 = function () {\r\n var bytes = this.read(8);\r\n var uint64 =\r\n ((((((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3]) * 256 +\r\n bytes[4]) * 256 +\r\n bytes[5]) * 256 +\r\n bytes[6]) * 256 +\r\n bytes[7];\r\n this.index += 8;\r\n return uint64;\r\n};\r\n\r\nUnpacker.prototype.unpack_int8 = function () {\r\n var uint8 = this.unpack_uint8();\r\n return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);\r\n};\r\n\r\nUnpacker.prototype.unpack_int16 = function () {\r\n var uint16 = this.unpack_uint16();\r\n return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);\r\n};\r\n\r\nUnpacker.prototype.unpack_int32 = function () {\r\n var uint32 = this.unpack_uint32();\r\n return (uint32 < Math.pow(2, 31)) ? uint32\r\n : uint32 - Math.pow(2, 32);\r\n};\r\n\r\nUnpacker.prototype.unpack_int64 = function () {\r\n var uint64 = this.unpack_uint64();\r\n return (uint64 < Math.pow(2, 63)) ? uint64\r\n : uint64 - Math.pow(2, 64);\r\n};\r\n\r\nUnpacker.prototype.unpack_raw = function (size) {\r\n if (this.length < this.index + size) {\r\n throw new Error('BinaryPackFailure: index is out of range' +\r\n ' ' + this.index + ' ' + size + ' ' + this.length);\r\n }\r\n var buf = this.dataBuffer.slice(this.index, this.index + size);\r\n this.index += size;\r\n\r\n // buf = util.bufferToString(buf);\r\n\r\n return buf;\r\n};\r\n\r\nUnpacker.prototype.unpack_string = function (size) {\r\n var bytes = this.read(size);\r\n var i = 0;\r\n var str = '';\r\n var c;\r\n var code;\r\n\r\n while (i < size) {\r\n c = bytes[i];\r\n if (c < 128) {\r\n str += String.fromCharCode(c);\r\n i++;\r\n } else if ((c ^ 0xc0) < 32) {\r\n code = ((c ^ 0xc0) << 6) | (bytes[i + 1] & 63);\r\n str += String.fromCharCode(code);\r\n i += 2;\r\n } else {\r\n code = ((c & 15) << 12) | ((bytes[i + 1] & 63) << 6) |\r\n (bytes[i + 2] & 63);\r\n str += String.fromCharCode(code);\r\n i += 3;\r\n }\r\n }\r\n\r\n this.index += size;\r\n return str;\r\n};\r\n\r\nUnpacker.prototype.unpack_array = function (size) {\r\n var objects = new Array(size);\r\n for (var i = 0; i < size; i++) {\r\n objects[i] = this.unpack();\r\n }\r\n return objects;\r\n};\r\n\r\nUnpacker.prototype.unpack_map = function (size) {\r\n var map = {};\r\n for (var i = 0; i < size; i++) {\r\n var key = this.unpack();\r\n var value = this.unpack();\r\n map[key] = value;\r\n }\r\n return map;\r\n};\r\n\r\nUnpacker.prototype.unpack_float = function () {\r\n var uint32 = this.unpack_uint32();\r\n var sign = uint32 >> 31;\r\n var exp = ((uint32 >> 23) & 0xff) - 127;\r\n var fraction = (uint32 & 0x7fffff) | 0x800000;\r\n return (sign === 0 ? 1 : -1) *\r\n fraction * Math.pow(2, exp - 23);\r\n};\r\n\r\nUnpacker.prototype.unpack_double = function () {\r\n var h32 = this.unpack_uint32();\r\n var l32 = this.unpack_uint32();\r\n var sign = h32 >> 31;\r\n var exp = ((h32 >> 20) & 0x7ff) - 1023;\r\n var hfrac = (h32 & 0xfffff) | 0x100000;\r\n var frac = hfrac * Math.pow(2, exp - 20) +\r\n l32 * Math.pow(2, exp - 52);\r\n return (sign === 0 ? 1 : -1) * frac;\r\n};\r\n\r\nUnpacker.prototype.read = function (length) {\r\n var j = this.index;\r\n if (j + length <= this.length) {\r\n return this.dataView.subarray(j, j + length);\r\n } else {\r\n throw new Error('BinaryPackFailure: read index out of range');\r\n }\r\n};\r\n\r\nfunction Packer () {\r\n this.bufferBuilder = new BufferBuilder();\r\n}\r\n\r\nPacker.prototype.getBuffer = function () {\r\n return this.bufferBuilder.getBuffer();\r\n};\r\n\r\nPacker.prototype.pack = function (value) {\r\n var type = typeof (value);\r\n if (type === 'string') {\r\n this.pack_string(value);\r\n } else if (type === 'number') {\r\n if (Math.floor(value) === value) {\r\n this.pack_integer(value);\r\n } else {\r\n this.pack_double(value);\r\n }\r\n } else if (type === 'boolean') {\r\n if (value === true) {\r\n this.bufferBuilder.append(0xc3);\r\n } else if (value === false) {\r\n this.bufferBuilder.append(0xc2);\r\n }\r\n } else if (type === 'undefined') {\r\n this.bufferBuilder.append(0xc0);\r\n } else if (type === 'object') {\r\n if (value === null) {\r\n this.bufferBuilder.append(0xc0);\r\n } else {\r\n var constructor = value.constructor;\r\n if (constructor == Array) {\r\n this.pack_array(value);\r\n } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {\r\n this.pack_bin(value);\r\n } else if (constructor == ArrayBuffer) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value));\r\n } else {\r\n this.pack_bin(value);\r\n }\r\n } else if ('BYTES_PER_ELEMENT' in value) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value.buffer));\r\n } else {\r\n this.pack_bin(value.buffer);\r\n }\r\n } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {\r\n this.pack_object(value);\r\n } else if (constructor == Date) {\r\n this.pack_string(value.toString());\r\n } else if (typeof value.toBinaryPack === 'function') {\r\n this.bufferBuilder.append(value.toBinaryPack());\r\n } else {\r\n throw new Error('Type \"' + constructor.toString() + '\" not yet supported');\r\n }\r\n }\r\n } else {\r\n throw new Error('Type \"' + type + '\" not yet supported');\r\n }\r\n this.bufferBuilder.flush();\r\n};\r\n\r\nPacker.prototype.pack_bin = function (blob) {\r\n var length = blob.length || blob.byteLength || blob.size;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xa0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xda);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdb);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(blob);\r\n};\r\n\r\nPacker.prototype.pack_string = function (str) {\r\n var length = utf8Length(str);\r\n\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xb0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xd8);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xd9);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(str);\r\n};\r\n\r\nPacker.prototype.pack_array = function (ary) {\r\n var length = ary.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x90 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xdc);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdd);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var i = 0; i < length; i++) {\r\n this.pack(ary[i]);\r\n }\r\n};\r\n\r\nPacker.prototype.pack_integer = function (num) {\r\n if (num >= -0x20 && num <= 0x7f) {\r\n this.bufferBuilder.append(num & 0xff);\r\n } else if (num >= 0x00 && num <= 0xff) {\r\n this.bufferBuilder.append(0xcc);\r\n this.pack_uint8(num);\r\n } else if (num >= -0x80 && num <= 0x7f) {\r\n this.bufferBuilder.append(0xd0);\r\n this.pack_int8(num);\r\n } else if (num >= 0x0000 && num <= 0xffff) {\r\n this.bufferBuilder.append(0xcd);\r\n this.pack_uint16(num);\r\n } else if (num >= -0x8000 && num <= 0x7fff) {\r\n this.bufferBuilder.append(0xd1);\r\n this.pack_int16(num);\r\n } else if (num >= 0x00000000 && num <= 0xffffffff) {\r\n this.bufferBuilder.append(0xce);\r\n this.pack_uint32(num);\r\n } else if (num >= -0x80000000 && num <= 0x7fffffff) {\r\n this.bufferBuilder.append(0xd2);\r\n this.pack_int32(num);\r\n } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xd3);\r\n this.pack_int64(num);\r\n } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xcf);\r\n this.pack_uint64(num);\r\n } else {\r\n throw new Error('Invalid integer');\r\n }\r\n};\r\n\r\nPacker.prototype.pack_double = function (num) {\r\n var sign = 0;\r\n if (num < 0) {\r\n sign = 1;\r\n num = -num;\r\n }\r\n var exp = Math.floor(Math.log(num) / Math.LN2);\r\n var frac0 = num / Math.pow(2, exp) - 1;\r\n var frac1 = Math.floor(frac0 * Math.pow(2, 52));\r\n var b32 = Math.pow(2, 32);\r\n var h32 = (sign << 31) | ((exp + 1023) << 20) |\r\n (frac1 / b32) & 0x0fffff;\r\n var l32 = frac1 % b32;\r\n this.bufferBuilder.append(0xcb);\r\n this.pack_int32(h32);\r\n this.pack_int32(l32);\r\n};\r\n\r\nPacker.prototype.pack_object = function (obj) {\r\n var keys = Object.keys(obj);\r\n var length = keys.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x80 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xde);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdf);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n this.pack(prop);\r\n this.pack(obj[prop]);\r\n }\r\n }\r\n};\r\n\r\nPacker.prototype.pack_uint8 = function (num) {\r\n this.bufferBuilder.append(num);\r\n};\r\n\r\nPacker.prototype.pack_uint16 = function (num) {\r\n this.bufferBuilder.append(num >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_uint32 = function (num) {\r\n var n = num & 0xffffffff;\r\n this.bufferBuilder.append((n & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((n & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((n & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((n & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_uint64 = function (num) {\r\n var high = num / Math.pow(2, 32);\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int8 = function (num) {\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int16 = function (num) {\r\n this.bufferBuilder.append((num & 0xff00) >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int32 = function (num) {\r\n this.bufferBuilder.append((num >>> 24) & 0xff);\r\n this.bufferBuilder.append((num & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((num & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((num & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int64 = function (num) {\r\n var high = Math.floor(num / Math.pow(2, 32));\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nfunction _utf8Replace (m) {\r\n var code = m.charCodeAt(0);\r\n\r\n if (code <= 0x7ff) return '00';\r\n if (code <= 0xffff) return '000';\r\n if (code <= 0x1fffff) return '0000';\r\n if (code <= 0x3ffffff) return '00000';\r\n return '000000';\r\n}\r\n\r\nfunction utf8Length (str) {\r\n if (str.length > 600) {\r\n // Blob method faster for large strings\r\n return (new Blob([str])).size;\r\n } else {\r\n return str.replace(/[^\\u0000-\\u007F]/g, _utf8Replace).length;\r\n }\r\n}\r\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n !window.RTCIceGatherer)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n let hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(server => {\n if (server && (server.urls || server.url)) {\n let urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n const isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(url => {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n const validTurn = url.startsWith('turn') &&\n !url.startsWith('turn:[') &&\n url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n const shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n };\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window, browserDetails) {\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n const origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set(value) {\n origMSTEnabled.set.call(this, value);\n const ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = filterIceServers(config.iceServers,\n browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n const initParameters = arguments[1];\n const shouldPerformCheck = initParameters &&\n 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = initParameters.sendEncodings;\n sender.sendEncodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window, browserDetails);\n edgeShim.shimGetDisplayMedia(window, browserDetails);\n edgeShim.shimPeerConnection(window, browserDetails);\n edgeShim.shimReplaceTrack(window, browserDetails);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import webRTCAdapter from \"webrtc-adapter\";\r\n\r\nexport { webRTCAdapter };\r\n","import { webRTCAdapter } from './adapter';\r\n\r\nexport const Supports = new class {\r\n readonly isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);\r\n readonly supportedBrowsers = ['firefox', 'chrome', 'safari'];\r\n\r\n readonly minFirefoxVersion = 59;\r\n readonly minChromeVersion = 72;\r\n readonly minSafariVersion = 605;\r\n\r\n isWebRTCSupported(): boolean {\r\n return typeof RTCPeerConnection !== 'undefined';\r\n }\r\n\r\n isBrowserSupported(): boolean {\r\n const browser = this.getBrowser();\r\n const version = this.getVersion();\r\n\r\n const validBrowser = this.supportedBrowsers.includes(browser);\r\n\r\n if (!validBrowser) return false;\r\n\r\n if (browser === 'chrome') return version >= this.minChromeVersion;\r\n if (browser === 'firefox') return version >= this.minFirefoxVersion;\r\n if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;\r\n\r\n return false;\r\n }\r\n\r\n getBrowser(): string {\r\n return webRTCAdapter.browserDetails.browser;\r\n }\r\n\r\n getVersion(): number {\r\n return webRTCAdapter.browserDetails.version || 0;\r\n }\r\n\r\n isUnifiedPlanSupported(): boolean {\r\n const browser = this.getBrowser();\r\n const version = webRTCAdapter.browserDetails.version || 0;\r\n\r\n if (browser === 'chrome' && version < this.minChromeVersion) return false;\r\n if (browser === 'firefox' && version >= this.minFirefoxVersion) return true;\r\n if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;\r\n\r\n let tempPc: RTCPeerConnection;\r\n let supported = false;\r\n\r\n try {\r\n tempPc = new RTCPeerConnection();\r\n tempPc.addTransceiver('audio');\r\n supported = true;\r\n } catch (e) { }\r\n finally {\r\n if (tempPc) {\r\n tempPc.close();\r\n }\r\n }\r\n\r\n return supported;\r\n }\r\n\r\n toString(): string {\r\n return `Supports: \r\n browser:${this.getBrowser()} \r\n version:${this.getVersion()} \r\n isIOS:${this.isIOS} \r\n isWebRTCSupported:${this.isWebRTCSupported()} \r\n isBrowserSupported:${this.isBrowserSupported()} \r\n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\r\n }\r\n}\r\n","import * as BinaryPack from \"peerjs-js-binarypack\";\r\nimport { Supports } from './supports';\r\nimport { UtilSupportsObj } from '..';\r\n\r\nconst DEFAULT_CONFIG = {\r\n iceServers: [\r\n { urls: \"stun:stun.l.google.com:19302\" },\r\n { urls: \"turn:0.peerjs.com:3478\", username: \"peerjs\", credential: \"peerjsp\" }\r\n ],\r\n sdpSemantics: \"unified-plan\"\r\n};\r\n\r\nexport const util = new class {\r\n noop(): void { }\r\n\r\n readonly CLOUD_HOST = \"0.peerjs.com\";\r\n readonly CLOUD_PORT = 443;\r\n\r\n // Browsers that need chunking:\r\n readonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\r\n readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\r\n\r\n // Returns browser-agnostic default config\r\n readonly defaultConfig = DEFAULT_CONFIG;\r\n\r\n readonly browser = Supports.getBrowser();\r\n readonly browserVersion = Supports.getVersion();\r\n\r\n // Lists which features are supported\r\n readonly supports = (function () {\r\n const supported: UtilSupportsObj = {\r\n browser: Supports.isBrowserSupported(),\r\n webRTC: Supports.isWebRTCSupported(),\r\n audioVideo: false,\r\n data: false,\r\n binaryBlob: false,\r\n reliable: false,\r\n };\r\n\r\n if (!supported.webRTC) return supported;\r\n\r\n let pc: RTCPeerConnection;\r\n\r\n try {\r\n pc = new RTCPeerConnection(DEFAULT_CONFIG);\r\n\r\n supported.audioVideo = true;\r\n\r\n let dc: RTCDataChannel;\r\n\r\n try {\r\n dc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\r\n supported.data = true;\r\n supported.reliable = !!dc.ordered;\r\n\r\n // Binary test\r\n try {\r\n dc.binaryType = \"blob\";\r\n supported.binaryBlob = !Supports.isIOS;\r\n } catch (e) {\r\n }\r\n } catch (e) {\r\n } finally {\r\n if (dc) {\r\n dc.close();\r\n }\r\n }\r\n } catch (e) {\r\n } finally {\r\n if (pc) {\r\n pc.close();\r\n }\r\n }\r\n\r\n return supported;\r\n })();\r\n\r\n // Ensure alphanumeric ids\r\n validateId(id: string): boolean {\r\n // Allow empty ids\r\n return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\r\n }\r\n\r\n pack = BinaryPack.pack;\r\n unpack = BinaryPack.unpack;\r\n\r\n // Binary stuff\r\n\r\n private _dataCount: number = 1;\r\n\r\n chunk(blob: Blob): { __peerData: number, n: number, total: number, data: Blob }[] {\r\n const chunks = [];\r\n const size = blob.size;\r\n const total = Math.ceil(size / util.chunkedMTU);\r\n\r\n let index = 0;\r\n let start = 0;\r\n\r\n while (start < size) {\r\n const end = Math.min(size, start + util.chunkedMTU);\r\n const b = blob.slice(start, end);\r\n\r\n const chunk = {\r\n __peerData: this._dataCount,\r\n n: index,\r\n data: b,\r\n total,\r\n };\r\n\r\n chunks.push(chunk);\r\n\r\n start = end;\r\n index++;\r\n }\r\n\r\n this._dataCount++;\r\n\r\n return chunks;\r\n }\r\n\r\n blobToArrayBuffer(blob: Blob, cb: (arg: ArrayBuffer | null) => void): FileReader {\r\n const fr = new FileReader();\r\n\r\n fr.onload = function (evt) {\r\n if (evt.target) {\r\n cb(evt.target.result as ArrayBuffer);\r\n }\r\n };\r\n\r\n fr.readAsArrayBuffer(blob);\r\n\r\n return fr;\r\n }\r\n\r\n binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\r\n const byteArray = new Uint8Array(binary.length);\r\n\r\n for (let i = 0; i < binary.length; i++) {\r\n byteArray[i] = binary.charCodeAt(i) & 0xff;\r\n }\r\n\r\n return byteArray.buffer;\r\n }\r\n\r\n randomToken(): string {\r\n return Math.random()\r\n .toString(36)\r\n .substr(2);\r\n }\r\n\r\n isSecure(): boolean {\r\n return location.protocol === \"https:\";\r\n }\r\n}\r\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = 'PeerJS: ';\r\n\r\n/*\r\nPrints log messages depending on the debug level passed in. Defaults to 0.\r\n0 Prints no logs.\r\n1 Prints only errors.\r\n2 Prints errors and warnings.\r\n3 Prints all logs.\r\n*/\r\nexport enum LogLevel {\r\n Disabled,\r\n Errors,\r\n Warnings,\r\n All\r\n}\r\n\r\nclass Logger {\r\n private _logLevel = LogLevel.Disabled;\r\n\r\n get logLevel(): LogLevel { return this._logLevel; }\r\n\r\n set logLevel(logLevel: LogLevel) { this._logLevel = logLevel; }\r\n\r\n log(...args: any[]) {\r\n if (this._logLevel >= LogLevel.All) {\r\n this._print(LogLevel.All, ...args);\r\n }\r\n }\r\n\r\n warn(...args: any[]) {\r\n if (this._logLevel >= LogLevel.Warnings) {\r\n this._print(LogLevel.Warnings, ...args);\r\n }\r\n }\r\n\r\n error(...args: any[]) {\r\n if (this._logLevel >= LogLevel.Errors) {\r\n this._print(LogLevel.Errors, ...args);\r\n }\r\n }\r\n\r\n setLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\r\n this._print = fn;\r\n }\r\n\r\n private _print(logLevel: LogLevel, ...rest: any[]): void {\r\n const copy = [LOG_PREFIX, ...rest];\r\n\r\n for (let i in copy) {\r\n if (copy[i] instanceof Error) {\r\n copy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\r\n\r\n }\r\n }\r\n\r\n if (logLevel >= LogLevel.All) {\r\n console.log(...copy);\r\n } else if (logLevel >= LogLevel.Warnings) {\r\n console.warn(\"WARNING\", ...copy);\r\n } else if (logLevel >= LogLevel.Errors) {\r\n console.error(\"ERROR\", ...copy);\r\n }\r\n }\r\n}\r\n\r\nexport default new Logger();","export enum ConnectionEventType {\r\n Open = \"open\",\r\n Stream = \"stream\",\r\n Data = \"data\",\r\n Close = \"close\",\r\n Error = \"error\",\r\n IceStateChanged = \"iceStateChanged\"\r\n}\r\n\r\nexport enum ConnectionType {\r\n Data = \"data\",\r\n Media = \"media\"\r\n}\r\n\r\nexport enum PeerEventType {\r\n Open = \"open\",\r\n Close = \"close\",\r\n Connection = \"connection\",\r\n Call = \"call\",\r\n Disconnected = \"disconnected\",\r\n Error = \"error\"\r\n}\r\n\r\nexport enum PeerErrorType {\r\n BrowserIncompatible = \"browser-incompatible\",\r\n Disconnected = \"disconnected\",\r\n InvalidID = \"invalid-id\",\r\n InvalidKey = \"invalid-key\",\r\n Network = \"network\",\r\n PeerUnavailable = \"peer-unavailable\",\r\n SslUnavailable = \"ssl-unavailable\",\r\n ServerError = \"server-error\",\r\n SocketError = \"socket-error\",\r\n SocketClosed = \"socket-closed\",\r\n UnavailableID = \"unavailable-id\",\r\n WebRTC = \"webrtc\"\r\n}\r\n\r\nexport enum SerializationType {\r\n Binary = \"binary\",\r\n BinaryUTF8 = \"binary-utf8\",\r\n JSON = \"json\"\r\n}\r\n\r\nexport enum SocketEventType {\r\n Message = \"message\",\r\n Disconnected = \"disconnected\",\r\n Error = \"error\",\r\n Close = \"close\"\r\n}\r\n\r\nexport enum ServerMessageType {\r\n Heartbeat = \"HEARTBEAT\",\r\n Candidate = \"CANDIDATE\",\r\n Offer = \"OFFER\",\r\n Answer = \"ANSWER\",\r\n Open = \"OPEN\", // The connection to the server is open.\r\n Error = \"ERROR\", // Server error.\r\n IdTaken = \"ID-TAKEN\", // The selected ID is taken.\r\n InvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\r\n Leave = \"LEAVE\", // Another peer has closed its connection to this peer.\r\n Expire = \"EXPIRE\" // The offer sent to a peer has expired without response.\r\n\r\n}","import { EventEmitter } from \"eventemitter3\";\r\nimport logger from \"./logger\";\r\nimport { SocketEventType, ServerMessageType } from \"./enums\";\r\n\r\n/**\r\n * An abstraction on top of WebSockets to provide fastest\r\n * possible connection for peers.\r\n */\r\nexport class Socket extends EventEmitter {\r\n private _disconnected: boolean = true;\r\n private _id?: string;\r\n private _messagesQueue: Array = [];\r\n private _socket?: WebSocket;\r\n private _wsPingTimer?: any;\r\n private readonly _baseUrl: string;\r\n\r\n constructor(\r\n secure: any,\r\n host: string,\r\n port: number,\r\n path: string,\r\n key: string,\r\n private readonly pingInterval: number = 5000,\r\n ) {\r\n super();\r\n\r\n const wsProtocol = secure ? \"wss://\" : \"ws://\";\r\n\r\n this._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\r\n }\r\n\r\n start(id: string, token: string): void {\r\n this._id = id;\r\n\r\n const wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\r\n\r\n if (!!this._socket || !this._disconnected) {\r\n return;\r\n }\r\n\r\n this._socket = new WebSocket(wsUrl);\r\n this._disconnected = false;\r\n\r\n this._socket.onmessage = (event) => {\r\n let data;\r\n\r\n try {\r\n data = JSON.parse(event.data);\r\n logger.log(\"Server message received:\", data);\r\n } catch (e) {\r\n logger.log(\"Invalid server message\", event.data);\r\n return;\r\n }\r\n\r\n this.emit(SocketEventType.Message, data);\r\n };\r\n\r\n this._socket.onclose = (event) => {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n logger.log(\"Socket closed.\", event);\r\n\r\n this._cleanup();\r\n this._disconnected = true;\r\n\r\n this.emit(SocketEventType.Disconnected);\r\n };\r\n\r\n // Take care of the queue of connections if necessary and make sure Peer knows\r\n // socket is open.\r\n this._socket.onopen = () => {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n this._sendQueuedMessages();\r\n\r\n logger.log(\"Socket open\");\r\n\r\n this._scheduleHeartbeat();\r\n };\r\n }\r\n\r\n private _scheduleHeartbeat(): void {\r\n this._wsPingTimer = setTimeout(() => {\r\n this._sendHeartbeat();\r\n }, this.pingInterval);\r\n }\r\n\r\n private _sendHeartbeat(): void {\r\n if (!this._wsOpen()) {\r\n logger.log(`Cannot send heartbeat, because socket closed`);\r\n return;\r\n }\r\n\r\n const message = JSON.stringify({ type: ServerMessageType.Heartbeat });\r\n\r\n this._socket!.send(message);\r\n\r\n this._scheduleHeartbeat();\r\n }\r\n\r\n /** Is the websocket currently open? */\r\n private _wsOpen(): boolean {\r\n return !!this._socket && this._socket.readyState === 1;\r\n }\r\n\r\n /** Send queued messages. */\r\n private _sendQueuedMessages(): void {\r\n //Create copy of queue and clear it,\r\n //because send method push the message back to queue if smth will go wrong\r\n const copiedQueue = [...this._messagesQueue];\r\n this._messagesQueue = [];\r\n\r\n for (const message of copiedQueue) {\r\n this.send(message);\r\n }\r\n }\r\n\r\n /** Exposed send for DC & Peer. */\r\n send(data: any): void {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n // If we didn't get an ID yet, we can't yet send anything so we should queue\r\n // up these messages.\r\n if (!this._id) {\r\n this._messagesQueue.push(data);\r\n return;\r\n }\r\n\r\n if (!data.type) {\r\n this.emit(SocketEventType.Error, \"Invalid message\");\r\n return;\r\n }\r\n\r\n if (!this._wsOpen()) {\r\n return;\r\n }\r\n\r\n const message = JSON.stringify(data);\r\n\r\n this._socket!.send(message);\r\n }\r\n\r\n close(): void {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n this._cleanup();\r\n\r\n this._disconnected = true;\r\n }\r\n\r\n private _cleanup(): void {\r\n if (this._socket) {\r\n this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;\r\n this._socket.close();\r\n this._socket = undefined;\r\n }\r\n\r\n clearTimeout(this._wsPingTimer!);\r\n }\r\n}\r\n","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\nimport { MediaConnection } from \"./mediaconnection\";\r\nimport { DataConnection } from \"./dataconnection\";\r\nimport { ConnectionType, PeerErrorType, ConnectionEventType, ServerMessageType } from \"./enums\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\n\r\n/**\r\n * Manages all negotiations between Peers.\r\n */\r\nexport class Negotiator {\r\n constructor(readonly connection: BaseConnection) { }\r\n\r\n /** Returns a PeerConnection object set up correctly (for data, media). */\r\n startConnection(options: any) {\r\n const peerConnection = this._startPeerConnection();\r\n\r\n // Set the connection's PC.\r\n this.connection.peerConnection = peerConnection;\r\n\r\n if (this.connection.type === ConnectionType.Media && options._stream) {\r\n this._addTracksToConnection(options._stream, peerConnection, options._addTransceivers);\r\n }\r\n\r\n // What do we need to do now?\r\n if (options.originator) {\r\n if (this.connection.type === ConnectionType.Data) {\r\n const dataConnection = this.connection;\r\n\r\n const config: RTCDataChannelInit = { ordered: !!options.reliable };\r\n\r\n const dataChannel = peerConnection.createDataChannel(\r\n dataConnection.label,\r\n config\r\n );\r\n dataConnection.initialize(dataChannel);\r\n }\r\n\r\n this._makeOffer();\r\n } else {\r\n this.handleSDP(\"OFFER\", options.sdp);\r\n }\r\n }\r\n\r\n /** Start a PC. */\r\n private _startPeerConnection(): RTCPeerConnection {\r\n logger.log(\"Creating RTCPeerConnection.\");\r\n\r\n const peerConnection = new RTCPeerConnection(this.connection.provider.options.config);\r\n\r\n this._setupListeners(peerConnection);\r\n\r\n return peerConnection;\r\n }\r\n\r\n /** Set up various WebRTC listeners. */\r\n private _setupListeners(\r\n peerConnection: RTCPeerConnection\r\n ) {\r\n const peerId = this.connection.peer;\r\n const connectionId = this.connection.connectionId;\r\n const connectionType = this.connection.type;\r\n const provider = this.connection.provider;\r\n\r\n // ICE CANDIDATES.\r\n logger.log(\"Listening for ICE candidates.\");\r\n\r\n peerConnection.onicecandidate = (evt) => {\r\n if (!evt.candidate || !evt.candidate.candidate) return;\r\n\r\n logger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\r\n\r\n provider.socket.send({\r\n type: ServerMessageType.Candidate,\r\n payload: {\r\n candidate: evt.candidate,\r\n type: connectionType,\r\n connectionId: connectionId\r\n },\r\n dst: peerId\r\n });\r\n };\r\n\r\n peerConnection.oniceconnectionstatechange = () => {\r\n switch (peerConnection.iceConnectionState) {\r\n case \"failed\":\r\n logger.log(\r\n \"iceConnectionState is failed, closing connections to \" +\r\n peerId\r\n );\r\n this.connection.emit(\r\n ConnectionEventType.Error,\r\n new Error(\"Negotiation of connection to \" + peerId + \" failed.\")\r\n );\r\n this.connection.close();\r\n break;\r\n case \"closed\":\r\n logger.log(\r\n \"iceConnectionState is closed, closing connections to \" +\r\n peerId\r\n );\r\n this.connection.emit(\r\n ConnectionEventType.Error,\r\n new Error(\"Connection to \" + peerId + \" closed.\")\r\n );\r\n this.connection.close();\r\n break;\r\n case \"disconnected\":\r\n logger.log(\r\n \"iceConnectionState changed to disconnected on the connection with \" +\r\n peerId\r\n );\r\n break;\r\n case \"completed\":\r\n peerConnection.onicecandidate = util.noop;\r\n break;\r\n }\r\n\r\n this.connection.emit(ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);\r\n };\r\n\r\n // DATACONNECTION.\r\n logger.log(\"Listening for data channel\");\r\n // Fired between offer and answer, so options should already be saved\r\n // in the options hash.\r\n peerConnection.ondatachannel = (evt) => {\r\n logger.log(\"Received data channel\");\r\n\r\n const dataChannel = evt.channel;\r\n const connection = (\r\n provider.getConnection(peerId, connectionId)\r\n );\r\n\r\n connection.initialize(dataChannel);\r\n };\r\n\r\n // MEDIACONNECTION.\r\n logger.log(\"Listening for remote stream\");\r\n\r\n peerConnection.ontrack = (evt) => {\r\n logger.log(\"Received remote stream\");\r\n\r\n const stream = evt.streams[0];\r\n const connection = provider.getConnection(peerId, connectionId);\r\n\r\n if (connection.type === ConnectionType.Media) {\r\n const mediaConnection = connection;\r\n\r\n this._addStreamToMediaConnection(stream, mediaConnection);\r\n }\r\n };\r\n }\r\n\r\n cleanup(): void {\r\n logger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\r\n\r\n const peerConnection = this.connection.peerConnection;\r\n\r\n if (!peerConnection) {\r\n return;\r\n }\r\n\r\n this.connection.peerConnection = null;\r\n\r\n //unsubscribe from all PeerConnection's events\r\n peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = () => { };\r\n\r\n const peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\r\n let dataChannelNotClosed = false;\r\n\r\n if (this.connection.type === ConnectionType.Data) {\r\n const dataConnection = this.connection;\r\n const dataChannel = dataConnection.dataChannel;\r\n\r\n if (dataChannel) {\r\n dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== \"closed\";\r\n }\r\n }\r\n\r\n if (peerConnectionNotClosed || dataChannelNotClosed) {\r\n peerConnection.close();\r\n }\r\n }\r\n\r\n private async _makeOffer(): Promise {\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n try {\r\n const offer = await peerConnection.createOffer(\r\n this.connection.options.constraints\r\n );\r\n\r\n logger.log(\"Created offer.\");\r\n\r\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\r\n offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;\r\n }\r\n\r\n try {\r\n await peerConnection.setLocalDescription(offer);\r\n\r\n logger.log(\"Set localDescription:\", offer, `for:${this.connection.peer}`);\r\n\r\n let payload: any = {\r\n sdp: offer,\r\n type: this.connection.type,\r\n connectionId: this.connection.connectionId,\r\n metadata: this.connection.metadata,\r\n browser: util.browser\r\n };\r\n\r\n if (this.connection.type === ConnectionType.Data) {\r\n const dataConnection = this.connection;\r\n\r\n payload = {\r\n ...payload,\r\n label: dataConnection.label,\r\n reliable: dataConnection.reliable,\r\n serialization: dataConnection.serialization\r\n };\r\n }\r\n\r\n provider.socket.send({\r\n type: ServerMessageType.Offer,\r\n payload,\r\n dst: this.connection.peer\r\n });\r\n } catch (err) {\r\n // TODO: investigate why _makeOffer is being called from the answer\r\n if (\r\n err !=\r\n \"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\r\n ) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to setLocalDescription, \", err);\r\n }\r\n }\r\n } catch (err_1) {\r\n provider.emitError(PeerErrorType.WebRTC, err_1);\r\n logger.log(\"Failed to createOffer, \", err_1);\r\n }\r\n }\r\n\r\n private async _makeAnswer(): Promise {\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n try {\r\n const answer = await peerConnection.createAnswer();\r\n logger.log(\"Created answer.\");\r\n\r\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\r\n answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;\r\n }\r\n\r\n try {\r\n await peerConnection.setLocalDescription(answer);\r\n\r\n logger.log(`Set localDescription:`, answer, `for:${this.connection.peer}`);\r\n\r\n provider.socket.send({\r\n type: ServerMessageType.Answer,\r\n payload: {\r\n sdp: answer,\r\n type: this.connection.type,\r\n connectionId: this.connection.connectionId,\r\n browser: util.browser\r\n },\r\n dst: this.connection.peer\r\n });\r\n } catch (err) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to setLocalDescription, \", err);\r\n }\r\n } catch (err_1) {\r\n provider.emitError(PeerErrorType.WebRTC, err_1);\r\n logger.log(\"Failed to create answer, \", err_1);\r\n }\r\n }\r\n\r\n /** Handle an SDP. */\r\n async handleSDP(\r\n type: string,\r\n sdp: any\r\n ): Promise {\r\n sdp = new RTCSessionDescription(sdp);\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n logger.log(\"Setting remote description\", sdp);\r\n\r\n const self = this;\r\n\r\n try {\r\n await peerConnection.setRemoteDescription(sdp);\r\n logger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\r\n if (type === \"OFFER\") {\r\n await self._makeAnswer();\r\n }\r\n } catch (err) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to setRemoteDescription, \", err);\r\n }\r\n }\r\n\r\n /** Handle a candidate. */\r\n async handleCandidate(ice: any): Promise {\r\n logger.log(`handleCandidate:`, ice);\r\n\r\n const candidate = ice.candidate;\r\n const sdpMLineIndex = ice.sdpMLineIndex;\r\n const sdpMid = ice.sdpMid;\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n try {\r\n await peerConnection.addIceCandidate(\r\n new RTCIceCandidate({\r\n sdpMid: sdpMid,\r\n sdpMLineIndex: sdpMLineIndex,\r\n candidate: candidate\r\n })\r\n );\r\n logger.log(`Added ICE candidate for:${this.connection.peer}`);\r\n } catch (err) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to handleCandidate, \", err);\r\n }\r\n }\r\n\r\n private _addTracksToConnection(\r\n stream: MediaStream,\r\n peerConnection: RTCPeerConnection,\r\n addTransceivers: Boolean\r\n ): void {\r\n logger.log(`add tracks from stream ${stream.id} to peer connection`);\r\n\r\n if (!peerConnection.addTrack) {\r\n return logger.error(\r\n `Your browser does't support RTCPeerConnection#addTrack. Ignored.`\r\n );\r\n }\r\n\r\n stream.getTracks().forEach(track => {\r\n peerConnection.addTrack(track, stream);\r\n });\r\n\r\n if (addTransceivers) {\r\n if (stream.getVideoTracks().length == 0) {\r\n peerConnection.addTransceiver(\"video\");\r\n }\r\n\r\n if (stream.getAudioTracks().length == 0) {\r\n peerConnection.addTransceiver(\"audio\");\r\n }\r\n }\r\n }\r\n\r\n private _addStreamToMediaConnection(\r\n stream: MediaStream,\r\n mediaConnection: MediaConnection\r\n ): void {\r\n logger.log(\r\n `add stream ${stream.id} to media connection ${\r\n mediaConnection.connectionId\r\n }`\r\n );\r\n\r\n mediaConnection.addStream(stream);\r\n }\r\n}\r\n","import { EventEmitter } from \"eventemitter3\";\r\nimport { Peer } from \"./peer\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { ConnectionType } from \"./enums\";\r\n\r\nexport abstract class BaseConnection extends EventEmitter {\r\n protected _open = false;\r\n\r\n readonly metadata: any;\r\n connectionId: string;\r\n\r\n peerConnection: RTCPeerConnection;\r\n\r\n abstract get type(): ConnectionType;\r\n\r\n get open() {\r\n return this._open;\r\n }\r\n\r\n constructor(\r\n readonly peer: string,\r\n public provider: Peer,\r\n readonly options: any\r\n ) {\r\n super();\r\n\r\n this.metadata = options.metadata;\r\n }\r\n\r\n abstract close(): void;\r\n\r\n abstract handleMessage(message: ServerMessage): void;\r\n}\r\n","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\nimport { Negotiator } from \"./negotiator\";\r\nimport { ConnectionType, ConnectionEventType, ServerMessageType } from \"./enums\";\r\nimport { Peer } from \"./peer\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { AnswerOption } from \"..\";\r\n\r\n/**\r\n * Wraps the streaming interface between two Peers.\r\n */\r\nexport class MediaConnection extends BaseConnection {\r\n private static readonly ID_PREFIX = \"mc_\";\r\n\r\n private _negotiator: Negotiator;\r\n private _localStream: MediaStream;\r\n private _remoteStream: MediaStream;\r\n private _addTransceivers: Boolean;\r\n\r\n get type() {\r\n return ConnectionType.Media;\r\n }\r\n\r\n get localStream(): MediaStream { return this._localStream; }\r\n get remoteStream(): MediaStream { return this._remoteStream; }\r\n\r\n constructor(peerId: string, provider: Peer, options: any) {\r\n super(peerId, provider, options);\r\n\r\n this._localStream = this.options._stream;\r\n this.connectionId =\r\n this.options.connectionId ||\r\n MediaConnection.ID_PREFIX + util.randomToken();\r\n\r\n this._addTransceivers =\r\n this.options.addTransceivers || false;\r\n\r\n this._negotiator = new Negotiator(this);\r\n\r\n if (this._localStream) {\r\n this._negotiator.startConnection({\r\n _stream: this._localStream,\r\n originator: true,\r\n _addTransceivers: this._addTransceivers\r\n });\r\n }\r\n }\r\n\r\n addStream(remoteStream) {\r\n logger.log(\"Receiving stream\", remoteStream);\r\n\r\n this._remoteStream = remoteStream;\r\n super.emit(ConnectionEventType.Stream, remoteStream); // Should we call this `open`?\r\n }\r\n\r\n handleMessage(message: ServerMessage): void {\r\n const type = message.type;\r\n const payload = message.payload;\r\n\r\n switch (message.type) {\r\n case ServerMessageType.Answer:\r\n // Forward to negotiator\r\n this._negotiator.handleSDP(type, payload.sdp);\r\n this._open = true;\r\n break;\r\n case ServerMessageType.Candidate:\r\n this._negotiator.handleCandidate(payload.candidate);\r\n break;\r\n default:\r\n logger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\r\n break;\r\n }\r\n }\r\n\r\n answer(stream: MediaStream, options: AnswerOption = {}): void {\r\n if (this._localStream) {\r\n logger.warn(\r\n \"Local stream already exists on this MediaConnection. Are you answering a call twice?\"\r\n );\r\n return;\r\n }\r\n\r\n this._localStream = stream;\r\n\r\n if (options && options.sdpTransform) {\r\n this.options.sdpTransform = options.sdpTransform;\r\n }\r\n\r\n this._negotiator.startConnection({ ...this.options._payload, _stream: stream });\r\n // Retrieve lost messages stored because PeerConnection not set up.\r\n const messages = this.provider._getMessages(this.connectionId);\r\n\r\n for (let message of messages) {\r\n this.handleMessage(message);\r\n }\r\n\r\n this._open = true;\r\n }\r\n\r\n /**\r\n * Exposed functionality for users.\r\n */\r\n\r\n /** Allows user to close connection. */\r\n close(): void {\r\n if (this._negotiator) {\r\n this._negotiator.cleanup();\r\n this._negotiator = null;\r\n }\r\n\r\n this._localStream = null;\r\n this._remoteStream = null;\r\n\r\n if (this.provider) {\r\n this.provider._removeConnection(this);\r\n\r\n this.provider = null;\r\n }\r\n\r\n if (this.options && this.options._stream) {\r\n this.options._stream = null;\r\n }\r\n\r\n if (!this.open) {\r\n return;\r\n }\r\n\r\n this._open = false;\r\n\r\n super.emit(ConnectionEventType.Close);\r\n }\r\n}\r\n","import { EventEmitter } from \"eventemitter3\";\r\nimport logger from \"./logger\";\r\n\r\nexport class EncodingQueue extends EventEmitter {\r\n readonly fileReader: FileReader = new FileReader();\r\n\r\n private _queue: Blob[] = [];\r\n private _processing: boolean = false;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.fileReader.onload = (evt) => {\r\n this._processing = false;\r\n\r\n if (evt.target) {\r\n this.emit('done', evt.target.result as ArrayBuffer);\r\n }\r\n\r\n this.doNextTask();\r\n };\r\n\r\n this.fileReader.onerror = (evt) => {\r\n logger.error(`EncodingQueue error:`, evt);\r\n this._processing = false;\r\n this.destroy();\r\n this.emit('error', evt);\r\n }\r\n }\r\n\r\n get queue(): Blob[] {\r\n return this._queue;\r\n }\r\n\r\n get size(): number {\r\n return this.queue.length;\r\n }\r\n\r\n get processing(): boolean {\r\n return this._processing;\r\n }\r\n\r\n enque(blob: Blob): void {\r\n this.queue.push(blob);\r\n\r\n if (this.processing) return;\r\n\r\n this.doNextTask();\r\n }\r\n\r\n destroy(): void {\r\n this.fileReader.abort();\r\n this._queue = [];\r\n }\r\n\r\n private doNextTask(): void {\r\n if (this.size === 0) return;\r\n if (this.processing) return;\r\n\r\n this._processing = true;\r\n\r\n this.fileReader.readAsArrayBuffer(this.queue.shift());\r\n }\r\n}","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\nimport { Negotiator } from \"./negotiator\";\r\nimport {\r\n ConnectionType,\r\n ConnectionEventType,\r\n SerializationType,\r\n ServerMessageType\r\n} from \"./enums\";\r\nimport { Peer } from \"./peer\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { EncodingQueue } from './encodingQueue';\r\nimport { DataConnection as IDataConnection } from '../index';\r\n\r\n/**\r\n * Wraps a DataChannel between two Peers.\r\n */\r\nexport class DataConnection extends BaseConnection implements IDataConnection {\r\n private static readonly ID_PREFIX = \"dc_\";\r\n private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\r\n\r\n private _negotiator: Negotiator;\r\n readonly label: string;\r\n readonly serialization: SerializationType;\r\n readonly reliable: boolean;\r\n stringify: (data: any) => string = JSON.stringify;\r\n parse: (data: string) => any = JSON.parse;\r\n\r\n get type() {\r\n return ConnectionType.Data;\r\n }\r\n\r\n private _buffer: any[] = [];\r\n private _bufferSize = 0;\r\n private _buffering = false;\r\n private _chunkedData: {\r\n [id: number]: {\r\n data: Blob[],\r\n count: number,\r\n total: number\r\n }\r\n } = {};\r\n\r\n private _dc: RTCDataChannel;\r\n private _encodingQueue = new EncodingQueue();\r\n\r\n get dataChannel(): RTCDataChannel {\r\n return this._dc;\r\n }\r\n\r\n get bufferSize(): number { return this._bufferSize; }\r\n\r\n constructor(peerId: string, provider: Peer, options: any) {\r\n super(peerId, provider, options);\r\n\r\n this.connectionId =\r\n this.options.connectionId || DataConnection.ID_PREFIX + util.randomToken();\r\n\r\n this.label = this.options.label || this.connectionId;\r\n this.serialization = this.options.serialization || SerializationType.Binary;\r\n this.reliable = !!this.options.reliable;\r\n\r\n this._encodingQueue.on('done', (ab: ArrayBuffer) => {\r\n this._bufferedSend(ab);\r\n });\r\n\r\n this._encodingQueue.on('error', () => {\r\n logger.error(`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`);\r\n this.close();\r\n });\r\n\r\n this._negotiator = new Negotiator(this);\r\n\r\n this._negotiator.startConnection(\r\n this.options._payload || {\r\n originator: true\r\n }\r\n );\r\n }\r\n\r\n /** Called by the Negotiator when the DataChannel is ready. */\r\n initialize(dc: RTCDataChannel): void {\r\n this._dc = dc;\r\n this._configureDataChannel();\r\n }\r\n\r\n private _configureDataChannel(): void {\r\n if (!util.supports.binaryBlob || util.supports.reliable) {\r\n this.dataChannel.binaryType = \"arraybuffer\";\r\n }\r\n\r\n this.dataChannel.onopen = () => {\r\n logger.log(`DC#${this.connectionId} dc connection success`);\r\n this._open = true;\r\n this.emit(ConnectionEventType.Open);\r\n };\r\n\r\n this.dataChannel.onmessage = (e) => {\r\n logger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\r\n this._handleDataMessage(e);\r\n };\r\n\r\n this.dataChannel.onclose = () => {\r\n logger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\r\n this.close();\r\n };\r\n }\r\n\r\n // Handles a DataChannel message.\r\n private _handleDataMessage({ data }: { data: Blob | ArrayBuffer | string }): void {\r\n const datatype = data.constructor;\r\n\r\n const isBinarySerialization = this.serialization === SerializationType.Binary ||\r\n this.serialization === SerializationType.BinaryUTF8;\r\n\r\n let deserializedData: any = data;\r\n\r\n if (isBinarySerialization) {\r\n if (datatype === Blob) {\r\n // Datatype should never be blob\r\n util.blobToArrayBuffer(data as Blob, (ab) => {\r\n const unpackedData = util.unpack(ab);\r\n this.emit(ConnectionEventType.Data, unpackedData);\r\n });\r\n return;\r\n } else if (datatype === ArrayBuffer) {\r\n deserializedData = util.unpack(data as ArrayBuffer);\r\n } else if (datatype === String) {\r\n // String fallback for binary data for browsers that don't support binary yet\r\n const ab = util.binaryStringToArrayBuffer(data as string);\r\n deserializedData = util.unpack(ab);\r\n }\r\n } else if (this.serialization === SerializationType.JSON) {\r\n deserializedData = this.parse(data as string);\r\n }\r\n\r\n // Check if we've chunked--if so, piece things back together.\r\n // We're guaranteed that this isn't 0.\r\n if (deserializedData.__peerData) {\r\n this._handleChunk(deserializedData);\r\n return;\r\n }\r\n\r\n super.emit(ConnectionEventType.Data, deserializedData);\r\n }\r\n\r\n private _handleChunk(data: { __peerData: number, n: number, total: number, data: Blob }): void {\r\n const id = data.__peerData;\r\n const chunkInfo = this._chunkedData[id] || {\r\n data: [],\r\n count: 0,\r\n total: data.total\r\n };\r\n\r\n chunkInfo.data[data.n] = data.data;\r\n chunkInfo.count++;\r\n this._chunkedData[id] = chunkInfo;\r\n\r\n if (chunkInfo.total === chunkInfo.count) {\r\n // Clean up before making the recursive call to `_handleDataMessage`.\r\n delete this._chunkedData[id];\r\n\r\n // We've received all the chunks--time to construct the complete data.\r\n const data = new Blob(chunkInfo.data);\r\n this._handleDataMessage({ data });\r\n }\r\n }\r\n\r\n /**\r\n * Exposed functionality for users.\r\n */\r\n\r\n /** Allows user to close connection. */\r\n close(): void {\r\n this._buffer = [];\r\n this._bufferSize = 0;\r\n this._chunkedData = {};\r\n\r\n if (this._negotiator) {\r\n this._negotiator.cleanup();\r\n this._negotiator = null;\r\n }\r\n\r\n if (this.provider) {\r\n this.provider._removeConnection(this);\r\n\r\n this.provider = null;\r\n }\r\n\r\n if (this.dataChannel) {\r\n this.dataChannel.onopen = null;\r\n this.dataChannel.onmessage = null;\r\n this.dataChannel.onclose = null;\r\n this._dc = null;\r\n }\r\n\r\n if (this._encodingQueue) {\r\n this._encodingQueue.destroy();\r\n this._encodingQueue.removeAllListeners();\r\n this._encodingQueue = null;\r\n }\r\n\r\n if (!this.open) {\r\n return;\r\n }\r\n\r\n this._open = false;\r\n\r\n super.emit(ConnectionEventType.Close);\r\n }\r\n\r\n /** Allows user to send data. */\r\n send(data: any, chunked?: boolean): void {\r\n if (!this.open) {\r\n super.emit(\r\n ConnectionEventType.Error,\r\n new Error(\r\n \"Connection is not open. You should listen for the `open` event before sending messages.\"\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (this.serialization === SerializationType.JSON) {\r\n this._bufferedSend(this.stringify(data));\r\n } else if (\r\n this.serialization === SerializationType.Binary ||\r\n this.serialization === SerializationType.BinaryUTF8\r\n ) {\r\n const blob = util.pack(data);\r\n\r\n if (!chunked && blob.size > util.chunkedMTU) {\r\n this._sendChunks(blob);\r\n return;\r\n }\r\n\r\n if (!util.supports.binaryBlob) {\r\n // We only do this if we really need to (e.g. blobs are not supported),\r\n // because this conversion is costly.\r\n this._encodingQueue.enque(blob);\r\n } else {\r\n this._bufferedSend(blob);\r\n }\r\n } else {\r\n this._bufferedSend(data);\r\n }\r\n }\r\n\r\n private _bufferedSend(msg: any): void {\r\n if (this._buffering || !this._trySend(msg)) {\r\n this._buffer.push(msg);\r\n this._bufferSize = this._buffer.length;\r\n }\r\n }\r\n\r\n // Returns true if the send succeeds.\r\n private _trySend(msg: any): boolean {\r\n if (!this.open) {\r\n return false;\r\n }\r\n\r\n if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\r\n this._buffering = true;\r\n setTimeout(() => {\r\n this._buffering = false;\r\n this._tryBuffer();\r\n }, 50);\r\n\r\n return false;\r\n }\r\n\r\n try {\r\n this.dataChannel.send(msg);\r\n } catch (e) {\r\n logger.error(`DC#:${this.connectionId} Error when sending:`, e);\r\n this._buffering = true;\r\n\r\n this.close();\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Try to send the first message in the buffer.\r\n private _tryBuffer(): void {\r\n if (!this.open) {\r\n return;\r\n }\r\n\r\n if (this._buffer.length === 0) {\r\n return;\r\n }\r\n\r\n const msg = this._buffer[0];\r\n\r\n if (this._trySend(msg)) {\r\n this._buffer.shift();\r\n this._bufferSize = this._buffer.length;\r\n this._tryBuffer();\r\n }\r\n }\r\n\r\n private _sendChunks(blob: Blob): void {\r\n const blobs = util.chunk(blob);\r\n logger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\r\n\r\n for (let blob of blobs) {\r\n this.send(blob, true);\r\n }\r\n }\r\n\r\n handleMessage(message: ServerMessage): void {\r\n const payload = message.payload;\r\n\r\n switch (message.type) {\r\n case ServerMessageType.Answer:\r\n this._negotiator.handleSDP(message.type, payload.sdp);\r\n break;\r\n case ServerMessageType.Candidate:\r\n this._negotiator.handleCandidate(payload.candidate);\r\n break;\r\n default:\r\n logger.warn(\r\n \"Unrecognized message type:\",\r\n message.type,\r\n \"from peer:\",\r\n this.peer\r\n );\r\n break;\r\n }\r\n }\r\n}\r\n","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\n\r\nexport class API {\r\n constructor(private readonly _options: any) { }\r\n\r\n private _buildUrl(method: string): string {\r\n const protocol = this._options.secure ? \"https://\" : \"http://\";\r\n let url =\r\n protocol +\r\n this._options.host +\r\n \":\" +\r\n this._options.port +\r\n this._options.path +\r\n this._options.key +\r\n \"/\" +\r\n method;\r\n const queryString = \"?ts=\" + new Date().getTime() + \"\" + Math.random();\r\n url += queryString;\r\n\r\n return url;\r\n }\r\n\r\n /** Get a unique ID from the server via XHR and initialize with it. */\r\n async retrieveId(): Promise {\r\n const url = this._buildUrl(\"id\");\r\n\r\n try {\r\n const response = await fetch(url);\r\n\r\n if (response.status !== 200) {\r\n throw new Error(`Error. Status:${response.status}`);\r\n }\r\n\r\n return response.text();\r\n } catch (error) {\r\n logger.error(\"Error retrieving ID\", error);\r\n\r\n let pathError = \"\";\r\n\r\n if (\r\n this._options.path === \"/\" &&\r\n this._options.host !== util.CLOUD_HOST\r\n ) {\r\n pathError =\r\n \" If you passed in a `path` to your self-hosted PeerServer, \" +\r\n \"you'll also need to pass in that same path when creating a new \" +\r\n \"Peer.\";\r\n }\r\n\r\n throw new Error(\"Could not get an ID from the server.\" + pathError);\r\n }\r\n }\r\n\r\n /** @deprecated */\r\n async listAllPeers(): Promise {\r\n const url = this._buildUrl(\"peers\");\r\n\r\n try {\r\n const response = await fetch(url);\r\n\r\n if (response.status !== 200) {\r\n if (response.status === 401) {\r\n let helpfulError = \"\";\r\n\r\n if (this._options.host === util.CLOUD_HOST) {\r\n helpfulError =\r\n \"It looks like you're using the cloud server. You can email \" +\r\n \"team@peerjs.com to enable peer listing for your API key.\";\r\n } else {\r\n helpfulError =\r\n \"You need to enable `allow_discovery` on your self-hosted \" +\r\n \"PeerServer to use this feature.\";\r\n }\r\n\r\n throw new Error(\"It doesn't look like you have permission to list peers IDs. \" +\r\n helpfulError);\r\n }\r\n\r\n throw new Error(`Error. Status:${response.status}`);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n logger.error(\"Error retrieving list peers\", error);\r\n\r\n throw new Error(\"Could not get list peers from the server.\" + error);\r\n }\r\n }\r\n}\r\n","import { EventEmitter } from \"eventemitter3\";\r\nimport { util } from \"./util\";\r\nimport logger, { LogLevel } from \"./logger\";\r\nimport { Socket } from \"./socket\";\r\nimport { MediaConnection } from \"./mediaconnection\";\r\nimport { DataConnection } from \"./dataconnection\";\r\nimport {\r\n ConnectionType,\r\n PeerErrorType,\r\n PeerEventType,\r\n SocketEventType,\r\n ServerMessageType\r\n} from \"./enums\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { API } from \"./api\";\r\nimport { PeerConnectOption, PeerJSOption } from \"..\";\r\n\r\nclass PeerOptions implements PeerJSOption {\r\n debug?: LogLevel; // 1: Errors, 2: Warnings, 3: All logs\r\n host?: string;\r\n port?: number;\r\n path?: string;\r\n key?: string;\r\n token?: string;\r\n config?: any;\r\n secure?: boolean;\r\n pingInterval?: number;\r\n logFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\r\n}\r\n\r\n/**\r\n * A peer who can initiate connections with other peers.\r\n */\r\nexport class Peer extends EventEmitter {\r\n private static readonly DEFAULT_KEY = \"peerjs\";\r\n\r\n private readonly _options: PeerOptions;\r\n private readonly _api: API;\r\n private readonly _socket: Socket;\r\n\r\n private _id: string | null = null;\r\n private _lastServerId: string | null = null;\r\n\r\n // States.\r\n private _destroyed = false; // Connections have been killed\r\n private _disconnected = false; // Connection to PeerServer killed but P2P connections still active\r\n private _open = false; // Sockets and such are not yet open.\r\n private readonly _connections: Map = new Map(); // All connections for this peer.\r\n private readonly _lostMessages: Map = new Map(); // src => [list of messages]\r\n\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n get options() {\r\n return this._options;\r\n }\r\n\r\n get open() {\r\n return this._open;\r\n }\r\n\r\n get socket() {\r\n return this._socket;\r\n }\r\n\r\n /**\r\n * @deprecated \r\n * Return type will change from Object to Map \r\n */\r\n get connections(): Object {\r\n const plainConnections = Object.create(null);\r\n\r\n for (let [k, v] of this._connections) {\r\n plainConnections[k] = v;\r\n }\r\n\r\n return plainConnections;\r\n }\r\n\r\n get destroyed() {\r\n return this._destroyed;\r\n }\r\n get disconnected() {\r\n return this._disconnected;\r\n }\r\n\r\n constructor(id?: string | PeerOptions, options?: PeerOptions) {\r\n super();\r\n\r\n let userId: string | undefined;\r\n\r\n // Deal with overloading\r\n if (id && id.constructor == Object) {\r\n options = id as PeerOptions;\r\n } else if (id) {\r\n userId = id.toString();\r\n }\r\n\r\n // Configurize options\r\n options = {\r\n debug: 0, // 1: Errors, 2: Warnings, 3: All logs\r\n host: util.CLOUD_HOST,\r\n port: util.CLOUD_PORT,\r\n path: \"/\",\r\n key: Peer.DEFAULT_KEY,\r\n token: util.randomToken(),\r\n config: util.defaultConfig,\r\n ...options\r\n };\r\n this._options = options;\r\n\r\n // Detect relative URL host.\r\n if (this._options.host === \"/\") {\r\n this._options.host = window.location.hostname;\r\n }\r\n\r\n // Set path correctly.\r\n if (this._options.path) {\r\n if (this._options.path[0] !== \"/\") {\r\n this._options.path = \"/\" + this._options.path;\r\n }\r\n if (this._options.path[this._options.path.length - 1] !== \"/\") {\r\n this._options.path += \"/\";\r\n }\r\n }\r\n\r\n // Set whether we use SSL to same as current host\r\n if (this._options.secure === undefined && this._options.host !== util.CLOUD_HOST) {\r\n this._options.secure = util.isSecure();\r\n } else if (this._options.host == util.CLOUD_HOST) {\r\n this._options.secure = true;\r\n }\r\n // Set a custom log function if present\r\n if (this._options.logFunction) {\r\n logger.setLogFunction(this._options.logFunction);\r\n }\r\n\r\n logger.logLevel = this._options.debug || 0;\r\n\r\n this._api = new API(options);\r\n this._socket = this._createServerConnection();\r\n\r\n // Sanity checks\r\n // Ensure WebRTC supported\r\n if (!util.supports.audioVideo && !util.supports.data) {\r\n this._delayedAbort(\r\n PeerErrorType.BrowserIncompatible,\r\n \"The current browser does not support WebRTC\"\r\n );\r\n return;\r\n }\r\n\r\n // Ensure alphanumeric id\r\n if (!!userId && !util.validateId(userId)) {\r\n this._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\r\n return;\r\n }\r\n\r\n if (userId) {\r\n this._initialize(userId);\r\n } else {\r\n this._api.retrieveId()\r\n .then(id => this._initialize(id))\r\n .catch(error => this._abort(PeerErrorType.ServerError, error));\r\n }\r\n }\r\n\r\n private _createServerConnection(): Socket {\r\n const socket = new Socket(\r\n this._options.secure,\r\n this._options.host!,\r\n this._options.port!,\r\n this._options.path!,\r\n this._options.key!,\r\n this._options.pingInterval\r\n );\r\n\r\n socket.on(SocketEventType.Message, (data: ServerMessage) => {\r\n this._handleMessage(data);\r\n });\r\n\r\n socket.on(SocketEventType.Error, (error: string) => {\r\n this._abort(PeerErrorType.SocketError, error);\r\n });\r\n\r\n socket.on(SocketEventType.Disconnected, () => {\r\n if (this.disconnected) {\r\n return;\r\n }\r\n\r\n this.emitError(PeerErrorType.Network, \"Lost connection to server.\");\r\n this.disconnect();\r\n });\r\n\r\n socket.on(SocketEventType.Close, () => {\r\n if (this.disconnected) {\r\n return;\r\n }\r\n\r\n this._abort(PeerErrorType.SocketClosed, \"Underlying socket is already closed.\");\r\n });\r\n\r\n return socket;\r\n }\r\n\r\n /** Initialize a connection with the server. */\r\n private _initialize(id: string): void {\r\n this._id = id;\r\n this.socket.start(id, this._options.token!);\r\n }\r\n\r\n /** Handles messages from the server. */\r\n private _handleMessage(message: ServerMessage): void {\r\n const type = message.type;\r\n const payload = message.payload;\r\n const peerId = message.src;\r\n\r\n switch (type) {\r\n case ServerMessageType.Open: // The connection to the server is open.\r\n this._lastServerId = this.id;\r\n this._open = true;\r\n this.emit(PeerEventType.Open, this.id);\r\n break;\r\n case ServerMessageType.Error: // Server error.\r\n this._abort(PeerErrorType.ServerError, payload.msg);\r\n break;\r\n case ServerMessageType.IdTaken: // The selected ID is taken.\r\n this._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\r\n break;\r\n case ServerMessageType.InvalidKey: // The given API key cannot be found.\r\n this._abort(PeerErrorType.InvalidKey, `API KEY \"${this._options.key}\" is invalid`);\r\n break;\r\n case ServerMessageType.Leave: // Another peer has closed its connection to this peer.\r\n logger.log(`Received leave message from ${peerId}`);\r\n this._cleanupPeer(peerId);\r\n this._connections.delete(peerId);\r\n break;\r\n case ServerMessageType.Expire: // The offer sent to a peer has expired without response.\r\n this.emitError(PeerErrorType.PeerUnavailable, `Could not connect to peer ${peerId}`);\r\n break;\r\n case ServerMessageType.Offer: {\r\n // we should consider switching this to CALL/CONNECT, but this is the least breaking option.\r\n const connectionId = payload.connectionId;\r\n let connection = this.getConnection(peerId, connectionId);\r\n\r\n if (connection) {\r\n connection.close();\r\n logger.warn(`Offer received for existing Connection ID:${connectionId}`);\r\n }\r\n\r\n // Create a new connection.\r\n if (payload.type === ConnectionType.Media) {\r\n connection = new MediaConnection(peerId, this, {\r\n connectionId: connectionId,\r\n _payload: payload,\r\n metadata: payload.metadata\r\n });\r\n this._addConnection(peerId, connection);\r\n this.emit(PeerEventType.Call, connection);\r\n } else if (payload.type === ConnectionType.Data) {\r\n connection = new DataConnection(peerId, this, {\r\n connectionId: connectionId,\r\n _payload: payload,\r\n metadata: payload.metadata,\r\n label: payload.label,\r\n serialization: payload.serialization,\r\n reliable: payload.reliable\r\n });\r\n this._addConnection(peerId, connection);\r\n this.emit(PeerEventType.Connection, connection);\r\n } else {\r\n logger.warn(`Received malformed connection type:${payload.type}`);\r\n return;\r\n }\r\n\r\n // Find messages.\r\n const messages = this._getMessages(connectionId);\r\n for (let message of messages) {\r\n connection.handleMessage(message);\r\n }\r\n\r\n break;\r\n }\r\n default: {\r\n if (!payload) {\r\n logger.warn(`You received a malformed message from ${peerId} of type ${type}`);\r\n return;\r\n }\r\n\r\n const connectionId = payload.connectionId;\r\n const connection = this.getConnection(peerId, connectionId);\r\n\r\n if (connection && connection.peerConnection) {\r\n // Pass it on.\r\n connection.handleMessage(message);\r\n } else if (connectionId) {\r\n // Store for possible later use\r\n this._storeMessage(connectionId, message);\r\n } else {\r\n logger.warn(\"You received an unrecognized message:\", message);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /** Stores messages without a set up connection, to be claimed later. */\r\n private _storeMessage(connectionId: string, message: ServerMessage): void {\r\n if (!this._lostMessages.has(connectionId)) {\r\n this._lostMessages.set(connectionId, []);\r\n }\r\n\r\n this._lostMessages.get(connectionId).push(message);\r\n }\r\n\r\n /** Retrieve messages from lost message store */\r\n //TODO Change it to private\r\n public _getMessages(connectionId: string): ServerMessage[] {\r\n const messages = this._lostMessages.get(connectionId);\r\n\r\n if (messages) {\r\n this._lostMessages.delete(connectionId);\r\n return messages;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Returns a DataConnection to the specified peer. See documentation for a\r\n * complete list of options.\r\n */\r\n connect(peer: string, options: PeerConnectOption = {}): DataConnection {\r\n if (this.disconnected) {\r\n logger.warn(\r\n \"You cannot connect to a new Peer because you called \" +\r\n \".disconnect() on this Peer and ended your connection with the \" +\r\n \"server. You can create a new Peer to reconnect, or call reconnect \" +\r\n \"on this peer if you believe its ID to still be available.\"\r\n );\r\n this.emitError(\r\n PeerErrorType.Disconnected,\r\n \"Cannot connect to new Peer after disconnecting from server.\"\r\n );\r\n return;\r\n }\r\n\r\n const dataConnection = new DataConnection(peer, this, options);\r\n this._addConnection(peer, dataConnection);\r\n return dataConnection;\r\n }\r\n\r\n /**\r\n * Returns a MediaConnection to the specified peer. See documentation for a\r\n * complete list of options.\r\n */\r\n call(peer: string, stream: MediaStream, options: any = {}): MediaConnection {\r\n if (this.disconnected) {\r\n logger.warn(\r\n \"You cannot connect to a new Peer because you called \" +\r\n \".disconnect() on this Peer and ended your connection with the \" +\r\n \"server. You can create a new Peer to reconnect.\"\r\n );\r\n this.emitError(\r\n PeerErrorType.Disconnected,\r\n \"Cannot connect to new Peer after disconnecting from server.\"\r\n );\r\n return;\r\n }\r\n\r\n if (!stream) {\r\n logger.error(\r\n \"To call a peer, you must provide a stream from your browser's `getUserMedia`.\"\r\n );\r\n return;\r\n }\r\n\r\n options._stream = stream;\r\n\r\n const mediaConnection = new MediaConnection(peer, this, options);\r\n this._addConnection(peer, mediaConnection);\r\n return mediaConnection;\r\n }\r\n\r\n /** Add a data/media connection to this peer. */\r\n private _addConnection(peerId: string, connection: BaseConnection): void {\r\n logger.log(`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`);\r\n\r\n if (!this._connections.has(peerId)) {\r\n this._connections.set(peerId, []);\r\n }\r\n this._connections.get(peerId).push(connection);\r\n }\r\n\r\n //TODO should be private\r\n _removeConnection(connection: BaseConnection): void {\r\n const connections = this._connections.get(connection.peer);\r\n\r\n if (connections) {\r\n const index = connections.indexOf(connection);\r\n\r\n if (index !== -1) {\r\n connections.splice(index, 1);\r\n }\r\n }\r\n\r\n //remove from lost messages\r\n this._lostMessages.delete(connection.connectionId);\r\n }\r\n\r\n /** Retrieve a data/media connection for this peer. */\r\n getConnection(peerId: string, connectionId: string): null | BaseConnection {\r\n const connections = this._connections.get(peerId);\r\n if (!connections) {\r\n return null;\r\n }\r\n\r\n for (let connection of connections) {\r\n if (connection.connectionId === connectionId) {\r\n return connection;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _delayedAbort(type: PeerErrorType, message: string | Error): void {\r\n setTimeout(() => {\r\n this._abort(type, message);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Emits an error message and destroys the Peer.\r\n * The Peer is not destroyed if it's in a disconnected state, in which case\r\n * it retains its disconnected state and its existing connections.\r\n */\r\n private _abort(type: PeerErrorType, message: string | Error): void {\r\n logger.error(\"Aborting!\");\r\n\r\n this.emitError(type, message);\r\n\r\n if (!this._lastServerId) {\r\n this.destroy();\r\n } else {\r\n this.disconnect();\r\n }\r\n }\r\n\r\n /** Emits a typed error message. */\r\n emitError(type: PeerErrorType, err: string | Error): void {\r\n logger.error(\"Error:\", err);\r\n\r\n let error: Error & { type?: PeerErrorType };\r\n\r\n if (typeof err === \"string\") {\r\n error = new Error(err);\r\n } else {\r\n error = err as Error;\r\n }\r\n\r\n error.type = type;\r\n\r\n this.emit(PeerEventType.Error, error);\r\n }\r\n\r\n /**\r\n * Destroys the Peer: closes all active connections as well as the connection\r\n * to the server.\r\n * Warning: The peer can no longer create or accept connections after being\r\n * destroyed.\r\n */\r\n destroy(): void {\r\n if (this.destroyed) {\r\n return;\r\n }\r\n\r\n logger.log(`Destroy peer with ID:${this.id}`);\r\n\r\n this.disconnect();\r\n this._cleanup();\r\n\r\n this._destroyed = true;\r\n\r\n this.emit(PeerEventType.Close);\r\n }\r\n\r\n /** Disconnects every connection on this peer. */\r\n private _cleanup(): void {\r\n for (let peerId of this._connections.keys()) {\r\n this._cleanupPeer(peerId);\r\n this._connections.delete(peerId);\r\n }\r\n\r\n this.socket.removeAllListeners();\r\n }\r\n\r\n /** Closes all connections to this peer. */\r\n private _cleanupPeer(peerId: string): void {\r\n const connections = this._connections.get(peerId);\r\n\r\n if (!connections) return;\r\n\r\n for (let connection of connections) {\r\n connection.close();\r\n }\r\n }\r\n\r\n /**\r\n * Disconnects the Peer's connection to the PeerServer. Does not close any\r\n * active connections.\r\n * Warning: The peer can no longer create or accept connections after being\r\n * disconnected. It also cannot reconnect to the server.\r\n */\r\n disconnect(): void {\r\n if (this.disconnected) {\r\n return;\r\n }\r\n\r\n const currentId = this.id;\r\n\r\n logger.log(`Disconnect peer with ID:${currentId}`);\r\n\r\n this._disconnected = true;\r\n this._open = false;\r\n\r\n this.socket.close();\r\n\r\n this._lastServerId = currentId;\r\n this._id = null;\r\n\r\n this.emit(PeerEventType.Disconnected, currentId);\r\n }\r\n\r\n /** Attempts to reconnect with the same ID. */\r\n reconnect(): void {\r\n if (this.disconnected && !this.destroyed) {\r\n logger.log(`Attempting reconnection to server with ID ${this._lastServerId}`);\r\n this._disconnected = false;\r\n this._initialize(this._lastServerId!);\r\n } else if (this.destroyed) {\r\n throw new Error(\"This peer cannot reconnect to the server. It has already been destroyed.\");\r\n } else if (!this.disconnected && !this.open) {\r\n // Do nothing. We're still connecting the first time.\r\n logger.error(\"In a hurry? We're still trying to make the initial connection!\");\r\n } else {\r\n throw new Error(`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`);\r\n }\r\n }\r\n\r\n /**\r\n * Get a list of available peer IDs. If you're running your own server, you'll\r\n * want to set allow_discovery: true in the PeerServer options. If you're using\r\n * the cloud server, email team@peerjs.com to get the functionality enabled for\r\n * your key.\r\n */\r\n listAllPeers(cb = (_: any[]) => { }): void {\r\n this._api.listAllPeers()\r\n .then(peers => cb(peers))\r\n .catch(error => this._abort(PeerErrorType.ServerError, error));\r\n }\r\n}\r\n","import { util } from \"./util\";\r\nimport { Peer } from \"./peer\";\r\n\r\nexport const peerjs = {\r\n Peer,\r\n util\r\n};\r\n\r\nexport default Peer;\r\n\r\n(window).peerjs = peerjs;\r\n/** @deprecated Should use peerjs namespace */\r\n(window).Peer = Peer;\r\n"]} \ No newline at end of file diff --git a/dist/peerjs.min.js b/dist/peerjs.min.js index d6fe8fa48..eb4c921b5 100644 --- a/dist/peerjs.min.js +++ b/dist/peerjs.min.js @@ -39,31 +39,31 @@ var t=require("./bufferbuilder").BufferBuilder,e=require("./bufferbuilder").bina },{"./adapter_factory.js":"KtlG"}],"sXtV":[function(require,module,exports) { "use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.webRTCAdapter=void 0;var t=e(require("webrtc-adapter"));exports.webRTCAdapter=t.default; },{"webrtc-adapter":"tI1X"}],"I31f":[function(require,module,exports) { -"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Supports=void 0;var r=require("./adapter");exports.Supports=new(function(){function e(){this.isIOS=["iPad","iPhone","iPod"].includes(navigator.platform),this.supportedBrowsers=["firefox","chrome","safari"],this.minFirefoxVersion=59,this.minChromeVersion=72,this.minSafariVersion=605}return e.prototype.isWebRTCSupported=function(){return"undefined"!=typeof RTCPeerConnection},e.prototype.isBrowserSupported=function(){var r=this.getBrowser(),e=this.getVersion();return!!this.supportedBrowsers.includes(r)&&("chrome"===r?e>=this.minChromeVersion:"firefox"===r?e>=this.minFirefoxVersion:"safari"===r&&(!this.isIOS&&e>=this.minSafariVersion))},e.prototype.getBrowser=function(){return r.webRTCAdapter.browserDetails.browser},e.prototype.getVersion=function(){return r.webRTCAdapter.browserDetails.version||0},e.prototype.isUnifiedPlanSupported=function(){var e,i=this.getBrowser(),t=r.webRTCAdapter.browserDetails.version||0;if("chrome"===i&&t<72)return!1;if("firefox"===i&&t>=59)return!0;if(!(window.RTCRtpTransceiver&&"currentDirection"in RTCRtpTransceiver.prototype))return!1;var o=!1;try{(e=new RTCPeerConnection).addTransceiver("audio"),o=!0}catch(s){}finally{e&&e.close()}return o},e.prototype.toString=function(){return"Supports: \n browser:"+this.getBrowser()+" \n version:"+this.getVersion()+" \n isIOS:"+this.isIOS+" \n isWebRTCSupported:"+this.isWebRTCSupported()+" \n isBrowserSupported:"+this.isBrowserSupported()+" \n isUnifiedPlanSupported:"+this.isUnifiedPlanSupported()},e}()); +"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.Supports=void 0;var r=require("./adapter");exports.Supports=new(function(){function e(){this.isIOS=["iPad","iPhone","iPod"].includes(navigator.platform),this.supportedBrowsers=["firefox","chrome","safari"],this.minFirefoxVersion=59,this.minChromeVersion=72,this.minSafariVersion=605}return e.prototype.isWebRTCSupported=function(){return"undefined"!=typeof RTCPeerConnection},e.prototype.isBrowserSupported=function(){var r=this.getBrowser(),e=this.getVersion();return!!this.supportedBrowsers.includes(r)&&("chrome"===r?e>=this.minChromeVersion:"firefox"===r?e>=this.minFirefoxVersion:"safari"===r&&(!this.isIOS&&e>=this.minSafariVersion))},e.prototype.getBrowser=function(){return r.webRTCAdapter.browserDetails.browser},e.prototype.getVersion=function(){return r.webRTCAdapter.browserDetails.version||0},e.prototype.isUnifiedPlanSupported=function(){var e,i=this.getBrowser(),t=r.webRTCAdapter.browserDetails.version||0;if("chrome"===i&&t=this.minFirefoxVersion)return!0;if(!(window.RTCRtpTransceiver&&"currentDirection"in RTCRtpTransceiver.prototype))return!1;var o=!1;try{(e=new RTCPeerConnection).addTransceiver("audio"),o=!0}catch(n){}finally{e&&e.close()}return o},e.prototype.toString=function(){return"Supports: \n browser:".concat(this.getBrowser()," \n version:").concat(this.getVersion()," \n isIOS:").concat(this.isIOS," \n isWebRTCSupported:").concat(this.isWebRTCSupported()," \n isBrowserSupported:").concat(this.isBrowserSupported()," \n isUnifiedPlanSupported:").concat(this.isUnifiedPlanSupported())},e}()); },{"./adapter":"sXtV"}],"BHXf":[function(require,module,exports) { "use strict";var e=this&&this.__createBinding||(Object.create?function(e,t,r,o){void 0===o&&(o=r),Object.defineProperty(e,o,{enumerable:!0,get:function(){return t[r]}})}:function(e,t,r,o){void 0===o&&(o=r),e[o]=t[r]}),t=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(r){if(r&&r.__esModule)return r;var o={};if(null!=r)for(var n in r)"default"!==n&&Object.prototype.hasOwnProperty.call(r,n)&&e(o,r,n);return t(o,r),o};Object.defineProperty(exports,"__esModule",{value:!0}),exports.util=void 0;var o=r(require("peerjs-js-binarypack")),n=require("./supports"),i={iceServers:[{urls:"stun:stun.l.google.com:19302"},{urls:"turn:0.peerjs.com:3478",username:"peerjs",credential:"peerjsp"}],sdpSemantics:"unified-plan"};exports.util=new(function(){function e(){this.CLOUD_HOST="0.peerjs.com",this.CLOUD_PORT=443,this.chunkedBrowsers={Chrome:1,chrome:1},this.chunkedMTU=16300,this.defaultConfig=i,this.browser=n.Supports.getBrowser(),this.browserVersion=n.Supports.getVersion(),this.supports=function(){var e,t={browser:n.Supports.isBrowserSupported(),webRTC:n.Supports.isWebRTCSupported(),audioVideo:!1,data:!1,binaryBlob:!1,reliable:!1};if(!t.webRTC)return t;try{e=new RTCPeerConnection(i),t.audioVideo=!0;var r=void 0;try{r=e.createDataChannel("_PEERJSTEST",{ordered:!0}),t.data=!0,t.reliable=!!r.ordered;try{r.binaryType="blob",t.binaryBlob=!n.Supports.isIOS}catch(o){}}catch(o){}finally{r&&r.close()}}catch(o){}finally{e&&e.close()}return t}(),this.pack=o.pack,this.unpack=o.unpack,this._dataCount=1}return e.prototype.noop=function(){},e.prototype.validateId=function(e){return!e||/^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(e)},e.prototype.chunk=function(e){for(var t=[],r=e.size,o=Math.ceil(r/exports.util.chunkedMTU),n=0,i=0;i0)&&!(t=l.next()).done;)i.push(t.value)}catch(s){n={error:s}}finally{try{t&&!t.done&&(o=l.return)&&o.call(l)}finally{if(n)throw n.error}}return i},e=this&&this.__spreadArray||function(r,e){for(var o=0,t=e.length,n=r.length;o=o.All&&this._print.apply(this,e([o.All],r(t)))},n.prototype.warn=function(){for(var t=[],n=0;n=o.Warnings&&this._print.apply(this,e([o.Warnings],r(t)))},n.prototype.error=function(){for(var t=[],n=0;n=o.Errors&&this._print.apply(this,e([o.Errors],r(t)))},n.prototype.setLogFunction=function(r){this._print=r},n.prototype._print=function(n){for(var l=[],i=1;i=o.All?console.log.apply(console,e([],r(s))):n>=o.Warnings?console.warn.apply(console,e(["WARNING"],r(s))):n>=o.Errors&&console.error.apply(console,e(["ERROR"],r(s)))},n}();exports.default=new n; +"use strict";var r=this&&this.__read||function(r,e){var o="function"==typeof Symbol&&r[Symbol.iterator];if(!o)return r;var t,n,l=o.call(r),i=[];try{for(;(void 0===e||e-- >0)&&!(t=l.next()).done;)i.push(t.value)}catch(s){n={error:s}}finally{try{t&&!t.done&&(o=l.return)&&o.call(l)}finally{if(n)throw n.error}}return i},e=this&&this.__spreadArray||function(r,e,o){if(o||2===arguments.length)for(var t,n=0,l=e.length;n=o.All&&this._print.apply(this,e([o.All],r(t),!1))},n.prototype.warn=function(){for(var t=[],n=0;n=o.Warnings&&this._print.apply(this,e([o.Warnings],r(t),!1))},n.prototype.error=function(){for(var t=[],n=0;n=o.Errors&&this._print.apply(this,e([o.Errors],r(t),!1))},n.prototype.setLogFunction=function(r){this._print=r},n.prototype._print=function(n){for(var l=[],i=1;i=o.All?console.log.apply(console,e([],r(s),!1)):n>=o.Warnings?console.warn.apply(console,e(["WARNING"],r(s),!1)):n>=o.Errors&&console.error.apply(console,e(["ERROR"],r(s),!1))},n}();exports.default=new n; },{}],"ZRYf":[function(require,module,exports) { "use strict";var e,r,o,n,t,a,i;Object.defineProperty(exports,"__esModule",{value:!0}),exports.ServerMessageType=exports.SocketEventType=exports.SerializationType=exports.PeerErrorType=exports.PeerEventType=exports.ConnectionType=exports.ConnectionEventType=void 0,function(e){e.Open="open",e.Stream="stream",e.Data="data",e.Close="close",e.Error="error",e.IceStateChanged="iceStateChanged"}(e=exports.ConnectionEventType||(exports.ConnectionEventType={})),function(e){e.Data="data",e.Media="media"}(r=exports.ConnectionType||(exports.ConnectionType={})),function(e){e.Open="open",e.Close="close",e.Connection="connection",e.Call="call",e.Disconnected="disconnected",e.Error="error"}(o=exports.PeerEventType||(exports.PeerEventType={})),function(e){e.BrowserIncompatible="browser-incompatible",e.Disconnected="disconnected",e.InvalidID="invalid-id",e.InvalidKey="invalid-key",e.Network="network",e.PeerUnavailable="peer-unavailable",e.SslUnavailable="ssl-unavailable",e.ServerError="server-error",e.SocketError="socket-error",e.SocketClosed="socket-closed",e.UnavailableID="unavailable-id",e.WebRTC="webrtc"}(n=exports.PeerErrorType||(exports.PeerErrorType={})),function(e){e.Binary="binary",e.BinaryUTF8="binary-utf8",e.JSON="json"}(t=exports.SerializationType||(exports.SerializationType={})),function(e){e.Message="message",e.Disconnected="disconnected",e.Error="error",e.Close="close"}(a=exports.SocketEventType||(exports.SocketEventType={})),function(e){e.Heartbeat="HEARTBEAT",e.Candidate="CANDIDATE",e.Offer="OFFER",e.Answer="ANSWER",e.Open="OPEN",e.Error="ERROR",e.IdTaken="ID-TAKEN",e.InvalidKey="INVALID-KEY",e.Leave="LEAVE",e.Expire="EXPIRE"}(i=exports.ServerMessageType||(exports.ServerMessageType={})); },{}],"wJlv":[function(require,module,exports) { -"use strict";var e=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function o(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new o)}}(),t=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,s,r=n.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(o=r.next()).done;)i.push(o.value)}catch(c){s={error:c}}finally{try{o&&!o.done&&(n=r.return)&&n.call(r)}finally{if(s)throw s.error}}return i},n=this&&this.__spreadArray||function(e,t){for(var n=0,o=t.length,s=e.length;n=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Socket=void 0;var r=require("eventemitter3"),i=s(require("./logger")),c=require("./enums"),a=function(s){function r(e,t,n,o,r,i){void 0===i&&(i=5e3);var c=s.call(this)||this;c.pingInterval=i,c._disconnected=!0,c._messagesQueue=[];var a=e?"wss://":"ws://";return c._baseUrl=a+t+":"+n+o+"peerjs?key="+r,c}return e(r,s),r.prototype.start=function(e,t){var n=this;this._id=e;var o=this._baseUrl+"&id="+e+"&token="+t;!this._socket&&this._disconnected&&(this._socket=new WebSocket(o),this._disconnected=!1,this._socket.onmessage=function(e){var t;try{t=JSON.parse(e.data),i.default.log("Server message received:",t)}catch(o){return void i.default.log("Invalid server message",e.data)}n.emit(c.SocketEventType.Message,t)},this._socket.onclose=function(e){n._disconnected||(i.default.log("Socket closed.",e),n._cleanup(),n._disconnected=!0,n.emit(c.SocketEventType.Disconnected))},this._socket.onopen=function(){n._disconnected||(n._sendQueuedMessages(),i.default.log("Socket open"),n._scheduleHeartbeat())})},r.prototype._scheduleHeartbeat=function(){var e=this;this._wsPingTimer=setTimeout(function(){e._sendHeartbeat()},this.pingInterval)},r.prototype._sendHeartbeat=function(){if(this._wsOpen()){var e=JSON.stringify({type:c.ServerMessageType.Heartbeat});this._socket.send(e),this._scheduleHeartbeat()}else i.default.log("Cannot send heartbeat, because socket closed")},r.prototype._wsOpen=function(){return!!this._socket&&1===this._socket.readyState},r.prototype._sendQueuedMessages=function(){var e,s,r=n([],t(this._messagesQueue));this._messagesQueue=[];try{for(var i=o(r),c=i.next();!c.done;c=i.next()){var a=c.value;this.send(a)}}catch(u){e={error:u}}finally{try{c&&!c.done&&(s=i.return)&&s.call(i)}finally{if(e)throw e.error}}},r.prototype.send=function(e){if(!this._disconnected)if(this._id)if(e.type){if(this._wsOpen()){var t=JSON.stringify(e);this._socket.send(t)}}else this.emit(c.SocketEventType.Error,"Invalid message");else this._messagesQueue.push(e)},r.prototype.close=function(){this._disconnected||(this._cleanup(),this._disconnected=!0)},r.prototype._cleanup=function(){this._socket&&(this._socket.onopen=this._socket.onmessage=this._socket.onclose=null,this._socket.close(),this._socket=void 0),clearTimeout(this._wsPingTimer)},r}(r.EventEmitter);exports.Socket=a; +"use strict";var e=this&&this.__extends||function(){var e=function(t,o){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])})(t,o)};return function(t,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function n(){this.constructor=t}e(t,o),t.prototype=null===o?Object.create(o):(n.prototype=o.prototype,new n)}}(),t=this&&this.__read||function(e,t){var o="function"==typeof Symbol&&e[Symbol.iterator];if(!o)return e;var n,s,r=o.call(e),i=[];try{for(;(void 0===t||t-- >0)&&!(n=r.next()).done;)i.push(n.value)}catch(c){s={error:c}}finally{try{n&&!n.done&&(o=r.return)&&o.call(r)}finally{if(s)throw s.error}}return i},o=this&&this.__spreadArray||function(e,t,o){if(o||2===arguments.length)for(var n,s=0,r=t.length;s=e.length&&(e=void 0),{value:e&&e[n++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},s=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Socket=void 0;var r=require("eventemitter3"),i=s(require("./logger")),c=require("./enums"),a=function(s){function r(e,t,o,n,r,i){void 0===i&&(i=5e3);var c=s.call(this)||this;c.pingInterval=i,c._disconnected=!0,c._messagesQueue=[];var a=e?"wss://":"ws://";return c._baseUrl=a+t+":"+o+n+"peerjs?key="+r,c}return e(r,s),r.prototype.start=function(e,t){var o=this;this._id=e;var n="".concat(this._baseUrl,"&id=").concat(e,"&token=").concat(t);!this._socket&&this._disconnected&&(this._socket=new WebSocket(n),this._disconnected=!1,this._socket.onmessage=function(e){var t;try{t=JSON.parse(e.data),i.default.log("Server message received:",t)}catch(n){return void i.default.log("Invalid server message",e.data)}o.emit(c.SocketEventType.Message,t)},this._socket.onclose=function(e){o._disconnected||(i.default.log("Socket closed.",e),o._cleanup(),o._disconnected=!0,o.emit(c.SocketEventType.Disconnected))},this._socket.onopen=function(){o._disconnected||(o._sendQueuedMessages(),i.default.log("Socket open"),o._scheduleHeartbeat())})},r.prototype._scheduleHeartbeat=function(){var e=this;this._wsPingTimer=setTimeout(function(){e._sendHeartbeat()},this.pingInterval)},r.prototype._sendHeartbeat=function(){if(this._wsOpen()){var e=JSON.stringify({type:c.ServerMessageType.Heartbeat});this._socket.send(e),this._scheduleHeartbeat()}else i.default.log("Cannot send heartbeat, because socket closed")},r.prototype._wsOpen=function(){return!!this._socket&&1===this._socket.readyState},r.prototype._sendQueuedMessages=function(){var e,s,r=o([],t(this._messagesQueue),!1);this._messagesQueue=[];try{for(var i=n(r),c=i.next();!c.done;c=i.next()){var a=c.value;this.send(a)}}catch(u){e={error:u}}finally{try{c&&!c.done&&(s=i.return)&&s.call(i)}finally{if(e)throw e.error}}},r.prototype.send=function(e){if(!this._disconnected)if(this._id)if(e.type){if(this._wsOpen()){var t=JSON.stringify(e);this._socket.send(t)}}else this.emit(c.SocketEventType.Error,"Invalid message");else this._messagesQueue.push(e)},r.prototype.close=function(){this._disconnected||(this._cleanup(),this._disconnected=!0)},r.prototype._cleanup=function(){this._socket&&(this._socket.onopen=this._socket.onmessage=this._socket.onclose=null,this._socket.close(),this._socket=void 0),clearTimeout(this._wsPingTimer)},r}(r.EventEmitter);exports.Socket=a; },{"eventemitter3":"JJlS","./logger":"WOs9","./enums":"ZRYf"}],"HCdX":[function(require,module,exports) { -"use strict";var e=this&&this.__assign||function(){return(e=Object.assign||function(e){for(var n,t=1,o=arguments.length;t0&&i[i.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]0&&i[i.length-1])&&(6===r[0]||2===r[0])){c=0;continue}if(3===r[0]&&(!i||r[1]>i[0]&&r[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MediaConnection=void 0;var n=require("./util"),i=r(require("./logger")),a=require("./negotiator"),s=require("./enums"),l=require("./baseconnection"),c=function(r){function l(e,t,o){var i=r.call(this,e,t,o)||this;return i._localStream=i.options._stream,i.connectionId=i.options.connectionId||l.ID_PREFIX+n.util.randomToken(),i._negotiator=new a.Negotiator(i),i._localStream&&i._negotiator.startConnection({_stream:i._localStream,originator:!0}),i}return e(l,r),Object.defineProperty(l.prototype,"type",{get:function(){return s.ConnectionType.Media},enumerable:!1,configurable:!0}),Object.defineProperty(l.prototype,"localStream",{get:function(){return this._localStream},enumerable:!1,configurable:!0}),Object.defineProperty(l.prototype,"remoteStream",{get:function(){return this._remoteStream},enumerable:!1,configurable:!0}),l.prototype.addStream=function(e){i.default.log("Receiving stream",e),this._remoteStream=e,r.prototype.emit.call(this,s.ConnectionEventType.Stream,e)},l.prototype.handleMessage=function(e){var t=e.type,o=e.payload;switch(e.type){case s.ServerMessageType.Answer:this._negotiator.handleSDP(t,o.sdp),this._open=!0;break;case s.ServerMessageType.Candidate:this._negotiator.handleCandidate(o.candidate);break;default:i.default.warn("Unrecognized message type:"+t+" from peer:"+this.peer)}},l.prototype.answer=function(e,r){var n,a;if(void 0===r&&(r={}),this._localStream)i.default.warn("Local stream already exists on this MediaConnection. Are you answering a call twice?");else{this._localStream=e,r&&r.sdpTransform&&(this.options.sdpTransform=r.sdpTransform),this._negotiator.startConnection(t(t({},this.options._payload),{_stream:e}));var s=this.provider._getMessages(this.connectionId);try{for(var l=o(s),c=l.next();!c.done;c=l.next()){var p=c.value;this.handleMessage(p)}}catch(u){n={error:u}}finally{try{c&&!c.done&&(a=l.return)&&a.call(l)}finally{if(n)throw n.error}}this._open=!0}},l.prototype.close=function(){this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this._localStream=null,this._remoteStream=null,this.provider&&(this.provider._removeConnection(this),this.provider=null),this.options&&this.options._stream&&(this.options._stream=null),this.open&&(this._open=!1,r.prototype.emit.call(this,s.ConnectionEventType.Close))},l.ID_PREFIX="mc_",l}(l.BaseConnection);exports.MediaConnection=c; +"use strict";var e=this&&this.__extends||function(){var e=function(t,o){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])})(t,o)};return function(t,o){if("function"!=typeof o&&null!==o)throw new TypeError("Class extends value "+String(o)+" is not a constructor or null");function r(){this.constructor=t}e(t,o),t.prototype=null===o?Object.create(o):(r.prototype=o.prototype,new r)}}(),t=this&&this.__assign||function(){return(t=Object.assign||function(e){for(var t,o=1,r=arguments.length;o=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.MediaConnection=void 0;var n=require("./util"),i=r(require("./logger")),a=require("./negotiator"),s=require("./enums"),c=require("./baseconnection"),l=function(r){function c(e,t,o){var i=r.call(this,e,t,o)||this;return i._localStream=i.options._stream,i.connectionId=i.options.connectionId||c.ID_PREFIX+n.util.randomToken(),i._addTransceivers=i.options.addTransceivers||!1,i._negotiator=new a.Negotiator(i),i._localStream&&i._negotiator.startConnection({_stream:i._localStream,originator:!0,_addTransceivers:i._addTransceivers}),i}return e(c,r),Object.defineProperty(c.prototype,"type",{get:function(){return s.ConnectionType.Media},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"localStream",{get:function(){return this._localStream},enumerable:!1,configurable:!0}),Object.defineProperty(c.prototype,"remoteStream",{get:function(){return this._remoteStream},enumerable:!1,configurable:!0}),c.prototype.addStream=function(e){i.default.log("Receiving stream",e),this._remoteStream=e,r.prototype.emit.call(this,s.ConnectionEventType.Stream,e)},c.prototype.handleMessage=function(e){var t=e.type,o=e.payload;switch(e.type){case s.ServerMessageType.Answer:this._negotiator.handleSDP(t,o.sdp),this._open=!0;break;case s.ServerMessageType.Candidate:this._negotiator.handleCandidate(o.candidate);break;default:i.default.warn("Unrecognized message type:".concat(t," from peer:").concat(this.peer))}},c.prototype.answer=function(e,r){var n,a;if(void 0===r&&(r={}),this._localStream)i.default.warn("Local stream already exists on this MediaConnection. Are you answering a call twice?");else{this._localStream=e,r&&r.sdpTransform&&(this.options.sdpTransform=r.sdpTransform),this._negotiator.startConnection(t(t({},this.options._payload),{_stream:e}));var s=this.provider._getMessages(this.connectionId);try{for(var c=o(s),l=c.next();!l.done;l=c.next()){var p=l.value;this.handleMessage(p)}}catch(u){n={error:u}}finally{try{l&&!l.done&&(a=c.return)&&a.call(c)}finally{if(n)throw n.error}}this._open=!0}},c.prototype.close=function(){this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this._localStream=null,this._remoteStream=null,this.provider&&(this.provider._removeConnection(this),this.provider=null),this.options&&this.options._stream&&(this.options._stream=null),this.open&&(this._open=!1,r.prototype.emit.call(this,s.ConnectionEventType.Close))},c.ID_PREFIX="mc_",c}(c.BaseConnection);exports.MediaConnection=l; },{"./util":"BHXf","./logger":"WOs9","./negotiator":"HCdX","./enums":"ZRYf","./baseconnection":"tQFK"}],"GGp6":[function(require,module,exports) { "use strict";var e=this&&this.__extends||function(){var e=function(t,r){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])})(t,r)};return function(t,r){if("function"!=typeof r&&null!==r)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");function o(){this.constructor=t}e(t,r),t.prototype=null===r?Object.create(r):(o.prototype=r.prototype,new o)}}(),t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.EncodingQueue=void 0;var r=require("eventemitter3"),o=t(require("./logger")),n=function(t){function r(){var e=t.call(this)||this;return e.fileReader=new FileReader,e._queue=[],e._processing=!1,e.fileReader.onload=function(t){e._processing=!1,t.target&&e.emit("done",t.target.result),e.doNextTask()},e.fileReader.onerror=function(t){o.default.error("EncodingQueue error:",t),e._processing=!1,e.destroy(),e.emit("error",t)},e}return e(r,t),Object.defineProperty(r.prototype,"queue",{get:function(){return this._queue},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"size",{get:function(){return this.queue.length},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,"processing",{get:function(){return this._processing},enumerable:!1,configurable:!0}),r.prototype.enque=function(e){this.queue.push(e),this.processing||this.doNextTask()},r.prototype.destroy=function(){this.fileReader.abort(),this._queue=[]},r.prototype.doNextTask=function(){0!==this.size&&(this.processing||(this._processing=!0,this.fileReader.readAsArrayBuffer(this.queue.shift())))},r}(r.EventEmitter);exports.EncodingQueue=n; },{"eventemitter3":"JJlS","./logger":"WOs9"}],"GBTQ":[function(require,module,exports) { -"use strict";var e=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),t=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],i=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataConnection=void 0;var i=require("./util"),o=n(require("./logger")),r=require("./negotiator"),a=require("./enums"),s=require("./baseconnection"),u=require("./encodingQueue"),l=function(n){function s(e,t,l){var f=n.call(this,e,t,l)||this;return f.stringify=JSON.stringify,f.parse=JSON.parse,f._buffer=[],f._bufferSize=0,f._buffering=!1,f._chunkedData={},f._encodingQueue=new u.EncodingQueue,f.connectionId=f.options.connectionId||s.ID_PREFIX+i.util.randomToken(),f.label=f.options.label||f.connectionId,f.serialization=f.options.serialization||a.SerializationType.Binary,f.reliable=!!f.options.reliable,f._encodingQueue.on("done",function(e){f._bufferedSend(e)}),f._encodingQueue.on("error",function(){o.default.error("DC#"+f.connectionId+": Error occured in encoding from blob to arraybuffer, close DC"),f.close()}),f._negotiator=new r.Negotiator(f),f._negotiator.startConnection(f.options._payload||{originator:!0}),f}return e(s,n),Object.defineProperty(s.prototype,"type",{get:function(){return a.ConnectionType.Data},enumerable:!1,configurable:!0}),Object.defineProperty(s.prototype,"dataChannel",{get:function(){return this._dc},enumerable:!1,configurable:!0}),Object.defineProperty(s.prototype,"bufferSize",{get:function(){return this._bufferSize},enumerable:!1,configurable:!0}),s.prototype.initialize=function(e){this._dc=e,this._configureDataChannel()},s.prototype._configureDataChannel=function(){var e=this;i.util.supports.binaryBlob&&!i.util.supports.reliable||(this.dataChannel.binaryType="arraybuffer"),this.dataChannel.onopen=function(){o.default.log("DC#"+e.connectionId+" dc connection success"),e._open=!0,e.emit(a.ConnectionEventType.Open)},this.dataChannel.onmessage=function(t){o.default.log("DC#"+e.connectionId+" dc onmessage:",t.data),e._handleDataMessage(t)},this.dataChannel.onclose=function(){o.default.log("DC#"+e.connectionId+" dc closed for:",e.peer),e.close()}},s.prototype._handleDataMessage=function(e){var t=this,o=e.data,r=o.constructor,s=o;if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){if(r===Blob)return void i.util.blobToArrayBuffer(o,function(e){var n=i.util.unpack(e);t.emit(a.ConnectionEventType.Data,n)});if(r===ArrayBuffer)s=i.util.unpack(o);else if(r===String){var u=i.util.binaryStringToArrayBuffer(o);s=i.util.unpack(u)}}else this.serialization===a.SerializationType.JSON&&(s=this.parse(o));s.__peerData?this._handleChunk(s):n.prototype.emit.call(this,a.ConnectionEventType.Data,s)},s.prototype._handleChunk=function(e){var t=e.__peerData,n=this._chunkedData[t]||{data:[],count:0,total:e.total};if(n.data[e.n]=e.data,n.count++,this._chunkedData[t]=n,n.total===n.count){delete this._chunkedData[t];var i=new Blob(n.data);this._handleDataMessage({data:i})}},s.prototype.close=function(){this._buffer=[],this._bufferSize=0,this._chunkedData={},this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this.provider&&(this.provider._removeConnection(this),this.provider=null),this.dataChannel&&(this.dataChannel.onopen=null,this.dataChannel.onmessage=null,this.dataChannel.onclose=null,this._dc=null),this._encodingQueue&&(this._encodingQueue.destroy(),this._encodingQueue.removeAllListeners(),this._encodingQueue=null),this.open&&(this._open=!1,n.prototype.emit.call(this,a.ConnectionEventType.Close))},s.prototype.send=function(e,t){if(this.open)if(this.serialization===a.SerializationType.JSON)this._bufferedSend(this.stringify(e));else if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){var o=i.util.pack(e);if(!t&&o.size>i.util.chunkedMTU)return void this._sendChunks(o);i.util.supports.binaryBlob?this._bufferedSend(o):this._encodingQueue.enque(o)}else this._bufferedSend(e);else n.prototype.emit.call(this,a.ConnectionEventType.Error,new Error("Connection is not open. You should listen for the `open` event before sending messages."))},s.prototype._bufferedSend=function(e){!this._buffering&&this._trySend(e)||(this._buffer.push(e),this._bufferSize=this._buffer.length)},s.prototype._trySend=function(e){var t=this;if(!this.open)return!1;if(this.dataChannel.bufferedAmount>s.MAX_BUFFERED_AMOUNT)return this._buffering=!0,setTimeout(function(){t._buffering=!1,t._tryBuffer()},50),!1;try{this.dataChannel.send(e)}catch(n){return o.default.error("DC#:"+this.connectionId+" Error when sending:",n),this._buffering=!0,this.close(),!1}return!0},s.prototype._tryBuffer=function(){if(this.open&&0!==this._buffer.length){var e=this._buffer[0];this._trySend(e)&&(this._buffer.shift(),this._bufferSize=this._buffer.length,this._tryBuffer())}},s.prototype._sendChunks=function(e){var n,r,a=i.util.chunk(e);o.default.log("DC#"+this.connectionId+" Try to send "+a.length+" chunks...");try{for(var s=t(a),u=s.next();!u.done;u=s.next()){var l=u.value;this.send(l,!0)}}catch(f){n={error:f}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}},s.prototype.handleMessage=function(e){var t=e.payload;switch(e.type){case a.ServerMessageType.Answer:this._negotiator.handleSDP(e.type,t.sdp);break;case a.ServerMessageType.Candidate:this._negotiator.handleCandidate(t.candidate);break;default:o.default.warn("Unrecognized message type:",e.type,"from peer:",this.peer)}},s.ID_PREFIX="dc_",s.MAX_BUFFERED_AMOUNT=8388608,s}(s.BaseConnection);exports.DataConnection=l; +"use strict";var e=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function i(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(i.prototype=n.prototype,new i)}}(),t=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],i=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&i>=e.length&&(e=void 0),{value:e&&e[i++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DataConnection=void 0;var i=require("./util"),o=n(require("./logger")),r=require("./negotiator"),a=require("./enums"),s=require("./baseconnection"),u=require("./encodingQueue"),l=function(n){function s(e,t,l){var c=n.call(this,e,t,l)||this;return c.stringify=JSON.stringify,c.parse=JSON.parse,c._buffer=[],c._bufferSize=0,c._buffering=!1,c._chunkedData={},c._encodingQueue=new u.EncodingQueue,c.connectionId=c.options.connectionId||s.ID_PREFIX+i.util.randomToken(),c.label=c.options.label||c.connectionId,c.serialization=c.options.serialization||a.SerializationType.Binary,c.reliable=!!c.options.reliable,c._encodingQueue.on("done",function(e){c._bufferedSend(e)}),c._encodingQueue.on("error",function(){o.default.error("DC#".concat(c.connectionId,": Error occured in encoding from blob to arraybuffer, close DC")),c.close()}),c._negotiator=new r.Negotiator(c),c._negotiator.startConnection(c.options._payload||{originator:!0}),c}return e(s,n),Object.defineProperty(s.prototype,"type",{get:function(){return a.ConnectionType.Data},enumerable:!1,configurable:!0}),Object.defineProperty(s.prototype,"dataChannel",{get:function(){return this._dc},enumerable:!1,configurable:!0}),Object.defineProperty(s.prototype,"bufferSize",{get:function(){return this._bufferSize},enumerable:!1,configurable:!0}),s.prototype.initialize=function(e){this._dc=e,this._configureDataChannel()},s.prototype._configureDataChannel=function(){var e=this;i.util.supports.binaryBlob&&!i.util.supports.reliable||(this.dataChannel.binaryType="arraybuffer"),this.dataChannel.onopen=function(){o.default.log("DC#".concat(e.connectionId," dc connection success")),e._open=!0,e.emit(a.ConnectionEventType.Open)},this.dataChannel.onmessage=function(t){o.default.log("DC#".concat(e.connectionId," dc onmessage:"),t.data),e._handleDataMessage(t)},this.dataChannel.onclose=function(){o.default.log("DC#".concat(e.connectionId," dc closed for:"),e.peer),e.close()}},s.prototype._handleDataMessage=function(e){var t=this,o=e.data,r=o.constructor,s=o;if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){if(r===Blob)return void i.util.blobToArrayBuffer(o,function(e){var n=i.util.unpack(e);t.emit(a.ConnectionEventType.Data,n)});if(r===ArrayBuffer)s=i.util.unpack(o);else if(r===String){var u=i.util.binaryStringToArrayBuffer(o);s=i.util.unpack(u)}}else this.serialization===a.SerializationType.JSON&&(s=this.parse(o));s.__peerData?this._handleChunk(s):n.prototype.emit.call(this,a.ConnectionEventType.Data,s)},s.prototype._handleChunk=function(e){var t=e.__peerData,n=this._chunkedData[t]||{data:[],count:0,total:e.total};if(n.data[e.n]=e.data,n.count++,this._chunkedData[t]=n,n.total===n.count){delete this._chunkedData[t];var i=new Blob(n.data);this._handleDataMessage({data:i})}},s.prototype.close=function(){this._buffer=[],this._bufferSize=0,this._chunkedData={},this._negotiator&&(this._negotiator.cleanup(),this._negotiator=null),this.provider&&(this.provider._removeConnection(this),this.provider=null),this.dataChannel&&(this.dataChannel.onopen=null,this.dataChannel.onmessage=null,this.dataChannel.onclose=null,this._dc=null),this._encodingQueue&&(this._encodingQueue.destroy(),this._encodingQueue.removeAllListeners(),this._encodingQueue=null),this.open&&(this._open=!1,n.prototype.emit.call(this,a.ConnectionEventType.Close))},s.prototype.send=function(e,t){if(this.open)if(this.serialization===a.SerializationType.JSON)this._bufferedSend(this.stringify(e));else if(this.serialization===a.SerializationType.Binary||this.serialization===a.SerializationType.BinaryUTF8){var o=i.util.pack(e);if(!t&&o.size>i.util.chunkedMTU)return void this._sendChunks(o);i.util.supports.binaryBlob?this._bufferedSend(o):this._encodingQueue.enque(o)}else this._bufferedSend(e);else n.prototype.emit.call(this,a.ConnectionEventType.Error,new Error("Connection is not open. You should listen for the `open` event before sending messages."))},s.prototype._bufferedSend=function(e){!this._buffering&&this._trySend(e)||(this._buffer.push(e),this._bufferSize=this._buffer.length)},s.prototype._trySend=function(e){var t=this;if(!this.open)return!1;if(this.dataChannel.bufferedAmount>s.MAX_BUFFERED_AMOUNT)return this._buffering=!0,setTimeout(function(){t._buffering=!1,t._tryBuffer()},50),!1;try{this.dataChannel.send(e)}catch(n){return o.default.error("DC#:".concat(this.connectionId," Error when sending:"),n),this._buffering=!0,this.close(),!1}return!0},s.prototype._tryBuffer=function(){if(this.open&&0!==this._buffer.length){var e=this._buffer[0];this._trySend(e)&&(this._buffer.shift(),this._bufferSize=this._buffer.length,this._tryBuffer())}},s.prototype._sendChunks=function(e){var n,r,a=i.util.chunk(e);o.default.log("DC#".concat(this.connectionId," Try to send ").concat(a.length," chunks..."));try{for(var s=t(a),u=s.next();!u.done;u=s.next()){var l=u.value;this.send(l,!0)}}catch(c){n={error:c}}finally{try{u&&!u.done&&(r=s.return)&&r.call(s)}finally{if(n)throw n.error}}},s.prototype.handleMessage=function(e){var t=e.payload;switch(e.type){case a.ServerMessageType.Answer:this._negotiator.handleSDP(e.type,t.sdp);break;case a.ServerMessageType.Candidate:this._negotiator.handleCandidate(t.candidate);break;default:o.default.warn("Unrecognized message type:",e.type,"from peer:",this.peer)}},s.ID_PREFIX="dc_",s.MAX_BUFFERED_AMOUNT=8388608,s}(s.BaseConnection);exports.DataConnection=l; },{"./util":"BHXf","./logger":"WOs9","./negotiator":"HCdX","./enums":"ZRYf","./baseconnection":"tQFK","./encodingQueue":"GGp6"}],"in7L":[function(require,module,exports) { -"use strict";var t=this&&this.__awaiter||function(t,e,r,o){return new(r||(r=Promise))(function(n,s){function i(t){try{a(o.next(t))}catch(e){s(e)}}function u(t){try{a(o.throw(t))}catch(e){s(e)}}function a(t){var e;t.done?n(t.value):(e=t.value,e instanceof r?e:new r(function(t){t(e)})).then(i,u)}a((o=o.apply(t,e||[])).next())})},e=this&&this.__generator||function(t,e){var r,o,n,s,i={label:0,sent:function(){if(1&n[0])throw n[1];return n[1]},trys:[],ops:[]};return s={next:u(0),throw:u(1),return:u(2)},"function"==typeof Symbol&&(s[Symbol.iterator]=function(){return this}),s;function u(s){return function(u){return function(s){if(r)throw new TypeError("Generator is already executing.");for(;i;)try{if(r=1,o&&(n=2&s[0]?o.return:s[0]?o.throw||((n=o.return)&&n.call(o),0):o.next)&&!(n=n.call(o,s[1])).done)return n;switch(o=0,n&&(s=[2&s[0],n.value]),s[0]){case 0:case 1:n=s;break;case 4:return i.label++,{value:s[1],done:!1};case 5:i.label++,o=s[1],s=[0];continue;case 7:s=i.ops.pop(),i.trys.pop();continue;default:if(!(n=(n=i.trys).length>0&&n[n.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1]0&&n[n.length-1])&&(6===s[0]||2===s[0])){i=0;continue}if(3===s[0]&&(!n||s[1]>n[0]&&s[1]=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},r=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,o,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(r=i.next()).done;)s.push(r.value)}catch(a){o={error:a}}finally{try{r&&!r.done&&(n=i.return)&&n.call(i)}finally{if(o)throw o.error}}return s},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Peer=void 0;var i=require("eventemitter3"),s=require("./util"),a=o(require("./logger")),c=require("./socket"),l=require("./mediaconnection"),u=require("./dataconnection"),d=require("./enums"),p=require("./api"),h=function(){return function(){}}(),f=function(o){function i(e,n){var r,c=o.call(this)||this;return c._id=null,c._lastServerId=null,c._destroyed=!1,c._disconnected=!1,c._open=!1,c._connections=new Map,c._lostMessages=new Map,e&&e.constructor==Object?n=e:e&&(r=e.toString()),n=t({debug:0,host:s.util.CLOUD_HOST,port:s.util.CLOUD_PORT,path:"/",key:i.DEFAULT_KEY,token:s.util.randomToken(),config:s.util.defaultConfig},n),c._options=n,"/"===c._options.host&&(c._options.host=window.location.hostname),c._options.path&&("/"!==c._options.path[0]&&(c._options.path="/"+c._options.path),"/"!==c._options.path[c._options.path.length-1]&&(c._options.path+="/")),void 0===c._options.secure&&c._options.host!==s.util.CLOUD_HOST?c._options.secure=s.util.isSecure():c._options.host==s.util.CLOUD_HOST&&(c._options.secure=!0),c._options.logFunction&&a.default.setLogFunction(c._options.logFunction),a.default.logLevel=c._options.debug||0,c._api=new p.API(n),c._socket=c._createServerConnection(),s.util.supports.audioVideo||s.util.supports.data?r&&!s.util.validateId(r)?(c._delayedAbort(d.PeerErrorType.InvalidID,'ID "'+r+'" is invalid'),c):(r?c._initialize(r):c._api.retrieveId().then(function(e){return c._initialize(e)}).catch(function(e){return c._abort(d.PeerErrorType.ServerError,e)}),c):(c._delayedAbort(d.PeerErrorType.BrowserIncompatible,"The current browser does not support WebRTC"),c)}return e(i,o),Object.defineProperty(i.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"options",{get:function(){return this._options},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"socket",{get:function(){return this._socket},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"connections",{get:function(){var e,t,o=Object.create(null);try{for(var i=n(this._connections),s=i.next();!s.done;s=i.next()){var a=r(s.value,2),c=a[0],l=a[1];o[c]=l}}catch(u){e={error:u}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return o},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"disconnected",{get:function(){return this._disconnected},enumerable:!1,configurable:!0}),i.prototype._createServerConnection=function(){var e=this,t=new c.Socket(this._options.secure,this._options.host,this._options.port,this._options.path,this._options.key,this._options.pingInterval);return t.on(d.SocketEventType.Message,function(t){e._handleMessage(t)}),t.on(d.SocketEventType.Error,function(t){e._abort(d.PeerErrorType.SocketError,t)}),t.on(d.SocketEventType.Disconnected,function(){e.disconnected||(e.emitError(d.PeerErrorType.Network,"Lost connection to server."),e.disconnect())}),t.on(d.SocketEventType.Close,function(){e.disconnected||e._abort(d.PeerErrorType.SocketClosed,"Underlying socket is already closed.")}),t},i.prototype._initialize=function(e){this._id=e,this.socket.start(e,this._options.token)},i.prototype._handleMessage=function(e){var t,r,o=e.type,i=e.payload,s=e.src;switch(o){case d.ServerMessageType.Open:this._lastServerId=this.id,this._open=!0,this.emit(d.PeerEventType.Open,this.id);break;case d.ServerMessageType.Error:this._abort(d.PeerErrorType.ServerError,i.msg);break;case d.ServerMessageType.IdTaken:this._abort(d.PeerErrorType.UnavailableID,'ID "'+this.id+'" is taken');break;case d.ServerMessageType.InvalidKey:this._abort(d.PeerErrorType.InvalidKey,'API KEY "'+this._options.key+'" is invalid');break;case d.ServerMessageType.Leave:a.default.log("Received leave message from "+s),this._cleanupPeer(s),this._connections.delete(s);break;case d.ServerMessageType.Expire:this.emitError(d.PeerErrorType.PeerUnavailable,"Could not connect to peer "+s);break;case d.ServerMessageType.Offer:var c=i.connectionId;if((_=this.getConnection(s,c))&&(_.close(),a.default.warn("Offer received for existing Connection ID:"+c)),i.type===d.ConnectionType.Media)_=new l.MediaConnection(s,this,{connectionId:c,_payload:i,metadata:i.metadata}),this._addConnection(s,_),this.emit(d.PeerEventType.Call,_);else{if(i.type!==d.ConnectionType.Data)return void a.default.warn("Received malformed connection type:"+i.type);_=new u.DataConnection(s,this,{connectionId:c,_payload:i,metadata:i.metadata,label:i.label,serialization:i.serialization,reliable:i.reliable}),this._addConnection(s,_),this.emit(d.PeerEventType.Connection,_)}var p=this._getMessages(c);try{for(var h=n(p),f=h.next();!f.done;f=h.next()){var y=f.value;_.handleMessage(y)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(r=h.return)&&r.call(h)}finally{if(t)throw t.error}}break;default:if(!i)return void a.default.warn("You received a malformed message from "+s+" of type "+o);var _;c=i.connectionId;(_=this.getConnection(s,c))&&_.peerConnection?_.handleMessage(e):c?this._storeMessage(c,e):a.default.warn("You received an unrecognized message:",e)}},i.prototype._storeMessage=function(e,t){this._lostMessages.has(e)||this._lostMessages.set(e,[]),this._lostMessages.get(e).push(t)},i.prototype._getMessages=function(e){var t=this._lostMessages.get(e);return t?(this._lostMessages.delete(e),t):[]},i.prototype.connect=function(e,t){if(void 0===t&&(t={}),this.disconnected)return a.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect, or call reconnect on this peer if you believe its ID to still be available."),void this.emitError(d.PeerErrorType.Disconnected,"Cannot connect to new Peer after disconnecting from server.");var n=new u.DataConnection(e,this,t);return this._addConnection(e,n),n},i.prototype.call=function(e,t,n){if(void 0===n&&(n={}),this.disconnected)return a.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect."),void this.emitError(d.PeerErrorType.Disconnected,"Cannot connect to new Peer after disconnecting from server.");if(t){n._stream=t;var r=new l.MediaConnection(e,this,n);return this._addConnection(e,r),r}a.default.error("To call a peer, you must provide a stream from your browser's `getUserMedia`.")},i.prototype._addConnection=function(e,t){a.default.log("add connection "+t.type+":"+t.connectionId+" to peerId:"+e),this._connections.has(e)||this._connections.set(e,[]),this._connections.get(e).push(t)},i.prototype._removeConnection=function(e){var t=this._connections.get(e.peer);if(t){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}this._lostMessages.delete(e.connectionId)},i.prototype.getConnection=function(e,t){var r,o,i=this._connections.get(e);if(!i)return null;try{for(var s=n(i),a=s.next();!a.done;a=s.next()){var c=a.value;if(c.connectionId===t)return c}}catch(l){r={error:l}}finally{try{a&&!a.done&&(o=s.return)&&o.call(s)}finally{if(r)throw r.error}}return null},i.prototype._delayedAbort=function(e,t){var n=this;setTimeout(function(){n._abort(e,t)},0)},i.prototype._abort=function(e,t){a.default.error("Aborting!"),this.emitError(e,t),this._lastServerId?this.disconnect():this.destroy()},i.prototype.emitError=function(e,t){var n;a.default.error("Error:",t),(n="string"==typeof t?new Error(t):t).type=e,this.emit(d.PeerEventType.Error,n)},i.prototype.destroy=function(){this.destroyed||(a.default.log("Destroy peer with ID:"+this.id),this.disconnect(),this._cleanup(),this._destroyed=!0,this.emit(d.PeerEventType.Close))},i.prototype._cleanup=function(){var e,t;try{for(var r=n(this._connections.keys()),o=r.next();!o.done;o=r.next()){var i=o.value;this._cleanupPeer(i),this._connections.delete(i)}}catch(s){e={error:s}}finally{try{o&&!o.done&&(t=r.return)&&t.call(r)}finally{if(e)throw e.error}}this.socket.removeAllListeners()},i.prototype._cleanupPeer=function(e){var t,r,o=this._connections.get(e);if(o)try{for(var i=n(o),s=i.next();!s.done;s=i.next()){s.value.close()}}catch(a){t={error:a}}finally{try{s&&!s.done&&(r=i.return)&&r.call(i)}finally{if(t)throw t.error}}},i.prototype.disconnect=function(){if(!this.disconnected){var e=this.id;a.default.log("Disconnect peer with ID:"+e),this._disconnected=!0,this._open=!1,this.socket.close(),this._lastServerId=e,this._id=null,this.emit(d.PeerEventType.Disconnected,e)}},i.prototype.reconnect=function(){if(this.disconnected&&!this.destroyed)a.default.log("Attempting reconnection to server with ID "+this._lastServerId),this._disconnected=!1,this._initialize(this._lastServerId);else{if(this.destroyed)throw new Error("This peer cannot reconnect to the server. It has already been destroyed.");if(this.disconnected||this.open)throw new Error("Peer "+this.id+" cannot reconnect because it is not disconnected from the server!");a.default.error("In a hurry? We're still trying to make the initial connection!")}},i.prototype.listAllPeers=function(e){var t=this;void 0===e&&(e=function(e){}),this._api.listAllPeers().then(function(t){return e(t)}).catch(function(e){return t._abort(d.PeerErrorType.ServerError,e)})},i.DEFAULT_KEY="peerjs",i}(i.EventEmitter);exports.Peer=f; +"use strict";var e=this&&this.__extends||function(){var e=function(t,n){return(e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n])})(t,n)};return function(t,n){if("function"!=typeof n&&null!==n)throw new TypeError("Class extends value "+String(n)+" is not a constructor or null");function o(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new o)}}(),t=this&&this.__assign||function(){return(t=Object.assign||function(e){for(var t,n=1,o=arguments.length;n=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")},o=this&&this.__read||function(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var o,r,i=n.call(e),s=[];try{for(;(void 0===t||t-- >0)&&!(o=i.next()).done;)s.push(o.value)}catch(c){r={error:c}}finally{try{o&&!o.done&&(n=i.return)&&n.call(i)}finally{if(r)throw r.error}}return s},r=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Peer=void 0;var i=require("eventemitter3"),s=require("./util"),c=r(require("./logger")),a=require("./socket"),l=require("./mediaconnection"),u=require("./dataconnection"),d=require("./enums"),p=require("./api"),h=function(){return function(){}}(),f=function(r){function i(e,n){var o,a=r.call(this)||this;return a._id=null,a._lastServerId=null,a._destroyed=!1,a._disconnected=!1,a._open=!1,a._connections=new Map,a._lostMessages=new Map,e&&e.constructor==Object?n=e:e&&(o=e.toString()),n=t({debug:0,host:s.util.CLOUD_HOST,port:s.util.CLOUD_PORT,path:"/",key:i.DEFAULT_KEY,token:s.util.randomToken(),config:s.util.defaultConfig},n),a._options=n,"/"===a._options.host&&(a._options.host=window.location.hostname),a._options.path&&("/"!==a._options.path[0]&&(a._options.path="/"+a._options.path),"/"!==a._options.path[a._options.path.length-1]&&(a._options.path+="/")),void 0===a._options.secure&&a._options.host!==s.util.CLOUD_HOST?a._options.secure=s.util.isSecure():a._options.host==s.util.CLOUD_HOST&&(a._options.secure=!0),a._options.logFunction&&c.default.setLogFunction(a._options.logFunction),c.default.logLevel=a._options.debug||0,a._api=new p.API(n),a._socket=a._createServerConnection(),s.util.supports.audioVideo||s.util.supports.data?o&&!s.util.validateId(o)?(a._delayedAbort(d.PeerErrorType.InvalidID,'ID "'.concat(o,'" is invalid')),a):(o?a._initialize(o):a._api.retrieveId().then(function(e){return a._initialize(e)}).catch(function(e){return a._abort(d.PeerErrorType.ServerError,e)}),a):(a._delayedAbort(d.PeerErrorType.BrowserIncompatible,"The current browser does not support WebRTC"),a)}return e(i,r),Object.defineProperty(i.prototype,"id",{get:function(){return this._id},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"options",{get:function(){return this._options},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"socket",{get:function(){return this._socket},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"connections",{get:function(){var e,t,r=Object.create(null);try{for(var i=n(this._connections),s=i.next();!s.done;s=i.next()){var c=o(s.value,2),a=c[0],l=c[1];r[a]=l}}catch(u){e={error:u}}finally{try{s&&!s.done&&(t=i.return)&&t.call(i)}finally{if(e)throw e.error}}return r},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"destroyed",{get:function(){return this._destroyed},enumerable:!1,configurable:!0}),Object.defineProperty(i.prototype,"disconnected",{get:function(){return this._disconnected},enumerable:!1,configurable:!0}),i.prototype._createServerConnection=function(){var e=this,t=new a.Socket(this._options.secure,this._options.host,this._options.port,this._options.path,this._options.key,this._options.pingInterval);return t.on(d.SocketEventType.Message,function(t){e._handleMessage(t)}),t.on(d.SocketEventType.Error,function(t){e._abort(d.PeerErrorType.SocketError,t)}),t.on(d.SocketEventType.Disconnected,function(){e.disconnected||(e.emitError(d.PeerErrorType.Network,"Lost connection to server."),e.disconnect())}),t.on(d.SocketEventType.Close,function(){e.disconnected||e._abort(d.PeerErrorType.SocketClosed,"Underlying socket is already closed.")}),t},i.prototype._initialize=function(e){this._id=e,this.socket.start(e,this._options.token)},i.prototype._handleMessage=function(e){var t,o,r=e.type,i=e.payload,s=e.src;switch(r){case d.ServerMessageType.Open:this._lastServerId=this.id,this._open=!0,this.emit(d.PeerEventType.Open,this.id);break;case d.ServerMessageType.Error:this._abort(d.PeerErrorType.ServerError,i.msg);break;case d.ServerMessageType.IdTaken:this._abort(d.PeerErrorType.UnavailableID,'ID "'.concat(this.id,'" is taken'));break;case d.ServerMessageType.InvalidKey:this._abort(d.PeerErrorType.InvalidKey,'API KEY "'.concat(this._options.key,'" is invalid'));break;case d.ServerMessageType.Leave:c.default.log("Received leave message from ".concat(s)),this._cleanupPeer(s),this._connections.delete(s);break;case d.ServerMessageType.Expire:this.emitError(d.PeerErrorType.PeerUnavailable,"Could not connect to peer ".concat(s));break;case d.ServerMessageType.Offer:var a=i.connectionId;if((_=this.getConnection(s,a))&&(_.close(),c.default.warn("Offer received for existing Connection ID:".concat(a))),i.type===d.ConnectionType.Media)_=new l.MediaConnection(s,this,{connectionId:a,_payload:i,metadata:i.metadata}),this._addConnection(s,_),this.emit(d.PeerEventType.Call,_);else{if(i.type!==d.ConnectionType.Data)return void c.default.warn("Received malformed connection type:".concat(i.type));_=new u.DataConnection(s,this,{connectionId:a,_payload:i,metadata:i.metadata,label:i.label,serialization:i.serialization,reliable:i.reliable}),this._addConnection(s,_),this.emit(d.PeerEventType.Connection,_)}var p=this._getMessages(a);try{for(var h=n(p),f=h.next();!f.done;f=h.next()){var y=f.value;_.handleMessage(y)}}catch(v){t={error:v}}finally{try{f&&!f.done&&(o=h.return)&&o.call(h)}finally{if(t)throw t.error}}break;default:if(!i)return void c.default.warn("You received a malformed message from ".concat(s," of type ").concat(r));var _;a=i.connectionId;(_=this.getConnection(s,a))&&_.peerConnection?_.handleMessage(e):a?this._storeMessage(a,e):c.default.warn("You received an unrecognized message:",e)}},i.prototype._storeMessage=function(e,t){this._lostMessages.has(e)||this._lostMessages.set(e,[]),this._lostMessages.get(e).push(t)},i.prototype._getMessages=function(e){var t=this._lostMessages.get(e);return t?(this._lostMessages.delete(e),t):[]},i.prototype.connect=function(e,t){if(void 0===t&&(t={}),this.disconnected)return c.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect, or call reconnect on this peer if you believe its ID to still be available."),void this.emitError(d.PeerErrorType.Disconnected,"Cannot connect to new Peer after disconnecting from server.");var n=new u.DataConnection(e,this,t);return this._addConnection(e,n),n},i.prototype.call=function(e,t,n){if(void 0===n&&(n={}),this.disconnected)return c.default.warn("You cannot connect to a new Peer because you called .disconnect() on this Peer and ended your connection with the server. You can create a new Peer to reconnect."),void this.emitError(d.PeerErrorType.Disconnected,"Cannot connect to new Peer after disconnecting from server.");if(t){n._stream=t;var o=new l.MediaConnection(e,this,n);return this._addConnection(e,o),o}c.default.error("To call a peer, you must provide a stream from your browser's `getUserMedia`.")},i.prototype._addConnection=function(e,t){c.default.log("add connection ".concat(t.type,":").concat(t.connectionId," to peerId:").concat(e)),this._connections.has(e)||this._connections.set(e,[]),this._connections.get(e).push(t)},i.prototype._removeConnection=function(e){var t=this._connections.get(e.peer);if(t){var n=t.indexOf(e);-1!==n&&t.splice(n,1)}this._lostMessages.delete(e.connectionId)},i.prototype.getConnection=function(e,t){var o,r,i=this._connections.get(e);if(!i)return null;try{for(var s=n(i),c=s.next();!c.done;c=s.next()){var a=c.value;if(a.connectionId===t)return a}}catch(l){o={error:l}}finally{try{c&&!c.done&&(r=s.return)&&r.call(s)}finally{if(o)throw o.error}}return null},i.prototype._delayedAbort=function(e,t){var n=this;setTimeout(function(){n._abort(e,t)},0)},i.prototype._abort=function(e,t){c.default.error("Aborting!"),this.emitError(e,t),this._lastServerId?this.disconnect():this.destroy()},i.prototype.emitError=function(e,t){var n;c.default.error("Error:",t),(n="string"==typeof t?new Error(t):t).type=e,this.emit(d.PeerEventType.Error,n)},i.prototype.destroy=function(){this.destroyed||(c.default.log("Destroy peer with ID:".concat(this.id)),this.disconnect(),this._cleanup(),this._destroyed=!0,this.emit(d.PeerEventType.Close))},i.prototype._cleanup=function(){var e,t;try{for(var o=n(this._connections.keys()),r=o.next();!r.done;r=o.next()){var i=r.value;this._cleanupPeer(i),this._connections.delete(i)}}catch(s){e={error:s}}finally{try{r&&!r.done&&(t=o.return)&&t.call(o)}finally{if(e)throw e.error}}this.socket.removeAllListeners()},i.prototype._cleanupPeer=function(e){var t,o,r=this._connections.get(e);if(r)try{for(var i=n(r),s=i.next();!s.done;s=i.next()){s.value.close()}}catch(c){t={error:c}}finally{try{s&&!s.done&&(o=i.return)&&o.call(i)}finally{if(t)throw t.error}}},i.prototype.disconnect=function(){if(!this.disconnected){var e=this.id;c.default.log("Disconnect peer with ID:".concat(e)),this._disconnected=!0,this._open=!1,this.socket.close(),this._lastServerId=e,this._id=null,this.emit(d.PeerEventType.Disconnected,e)}},i.prototype.reconnect=function(){if(this.disconnected&&!this.destroyed)c.default.log("Attempting reconnection to server with ID ".concat(this._lastServerId)),this._disconnected=!1,this._initialize(this._lastServerId);else{if(this.destroyed)throw new Error("This peer cannot reconnect to the server. It has already been destroyed.");if(this.disconnected||this.open)throw new Error("Peer ".concat(this.id," cannot reconnect because it is not disconnected from the server!"));c.default.error("In a hurry? We're still trying to make the initial connection!")}},i.prototype.listAllPeers=function(e){var t=this;void 0===e&&(e=function(e){}),this._api.listAllPeers().then(function(t){return e(t)}).catch(function(e){return t._abort(d.PeerErrorType.ServerError,e)})},i.DEFAULT_KEY="peerjs",i}(i.EventEmitter);exports.Peer=f; },{"eventemitter3":"JJlS","./util":"BHXf","./logger":"WOs9","./socket":"wJlv","./mediaconnection":"dbHP","./dataconnection":"GBTQ","./enums":"ZRYf","./api":"in7L"}],"iTK6":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.peerjs=void 0;var e=require("./util"),r=require("./peer");exports.peerjs={Peer:r.Peer,util:e.util},exports.default=r.Peer,window.peerjs=exports.peerjs,window.Peer=r.Peer; },{"./util":"BHXf","./peer":"Hxpd"}]},{},["iTK6"], null) diff --git a/dist/peerjs.min.js.map b/dist/peerjs.min.js.map index 14c2560cf..8fd60e376 100644 --- a/dist/peerjs.min.js.map +++ b/dist/peerjs.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","../node_modules/peerjs-js-binarypack/lib/binarypack.js","../node_modules/webrtc-adapter/src/js/utils.js","../node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","../node_modules/sdp/sdp.js","../node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","../node_modules/webrtc-adapter/src/js/edge/getusermedia.js","../node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/edge/edge_shim.js","../node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/webrtc-adapter/src/js/adapter_core.js","adapter.ts","supports.ts","util.ts","../node_modules/eventemitter3/index.js","logger.ts","enums.ts","socket.ts","negotiator.ts","baseconnection.ts","mediaconnection.ts","encodingQueue.ts","dataconnection.ts","api.ts","peer.ts","exports.ts"],"names":["logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","length","parseInt","wrapPeerConnectionEvent","window","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","get","delete","size","Object","keys","defineProperty","enumerable","configurable","disableLog","bool","Error","disableWarnings","log","console","deprecated","oldMethod","newMethod","warn","detectBrowser","result","browser","version","navigator","mozGetUserMedia","userAgent","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","RTCIceGatherer","mediaDevices","supportsUnifiedPlan","RTCRtpTransceiver","isObject","val","toString","call","compactObject","data","reduce","accumulator","key","isObj","value","isEmptyObject","undefined","assign","walkStats","stats","base","resultSet","id","forEach","name","endsWith","filterStats","track","outbound","streamStatsType","filteredResult","trackStats","type","trackIdentifier","push","trackStat","trackId","logging","utils","shimGetUserMedia","browserDetails","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","matches","getSupportedConstraints","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","transceiver","receiver","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","event","Event","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","resolve","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","alreadyExists","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","signalingState","t","oldStream","method","nativeMethod","methodObj","args","isLegacyCall","description","desc","replaceInternalStreamId","origSetLocalDescription","setLocalDescription","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","origLocalDescription","getOwnPropertyDescriptor","streamid","shimPeerConnection","RTCIceCandidate","fixNegotiationNeeded","target","getConfiguration","sdpSemantics","filterIceServers","iceServers","edgeVersion","hasTurn","server","urls","url","isString","validTurn","startsWith","SDPUtils","require","fixStatsType","inboundrtp","outboundrtp","candidatepair","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","i","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","Math","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","code","NotSupportedError","InvalidAccessError","TypeError","OperationError","module","exports","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","config","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","enabled","_createIceGatherer","sdpMLineIndex","shift","writable","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","isRejected","rejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","default","getCapabilities","codec","isNewTrack","nativeTrack","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","addIceCandidate","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjectName","nativeGetstats","nativeStats","mapStats","methods","catch","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","shimReplaceTrack","replaceTrack","setTrack","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","finally","shimCreateAnswer","origCreateAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","index","tracks","shimRemoteStreamsAPI","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","successCallback","failureCallback","options","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","hasOwnProperty","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","audioTransceiver","getTransceivers","setDirection","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","shimMaxMessageSize","_sctp","sctpInDescription","mLine","parseMLine","isFirefox","maxMessageSize","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","remoteMMS","getMaxMessageSize","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","byteLength","readyState","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeExtmapAllowMixed","nativeSRD","line","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":"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","file":"peerjs.min.js","sourceRoot":"../lib","sourcesContent":["var binaryFeatures = {};\r\nbinaryFeatures.useBlobBuilder = (function () {\r\n try {\r\n new Blob([]);\r\n return false;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nbinaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {\r\n try {\r\n return (new Blob([new Uint8Array([])])).size === 0;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nmodule.exports.binaryFeatures = binaryFeatures;\r\nvar BlobBuilder = module.exports.BlobBuilder;\r\nif (typeof window !== 'undefined') {\r\n BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||\r\n window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;\r\n}\r\n\r\nfunction BufferBuilder () {\r\n this._pieces = [];\r\n this._parts = [];\r\n}\r\n\r\nBufferBuilder.prototype.append = function (data) {\r\n if (typeof data === 'number') {\r\n this._pieces.push(data);\r\n } else {\r\n this.flush();\r\n this._parts.push(data);\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.flush = function () {\r\n if (this._pieces.length > 0) {\r\n var buf = new Uint8Array(this._pieces);\r\n if (!binaryFeatures.useArrayBufferView) {\r\n buf = buf.buffer;\r\n }\r\n this._parts.push(buf);\r\n this._pieces = [];\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.getBuffer = function () {\r\n this.flush();\r\n if (binaryFeatures.useBlobBuilder) {\r\n var builder = new BlobBuilder();\r\n for (var i = 0, ii = this._parts.length; i < ii; i++) {\r\n builder.append(this._parts[i]);\r\n }\r\n return builder.getBlob();\r\n } else {\r\n return new Blob(this._parts);\r\n }\r\n};\r\n\r\nmodule.exports.BufferBuilder = BufferBuilder;\r\n","var BufferBuilder = require('./bufferbuilder').BufferBuilder;\r\nvar binaryFeatures = require('./bufferbuilder').binaryFeatures;\r\n\r\nvar BinaryPack = {\r\n unpack: function (data) {\r\n var unpacker = new Unpacker(data);\r\n return unpacker.unpack();\r\n },\r\n pack: function (data) {\r\n var packer = new Packer();\r\n packer.pack(data);\r\n var buffer = packer.getBuffer();\r\n return buffer;\r\n }\r\n};\r\n\r\nmodule.exports = BinaryPack;\r\n\r\nfunction Unpacker (data) {\r\n // Data is ArrayBuffer\r\n this.index = 0;\r\n this.dataBuffer = data;\r\n this.dataView = new Uint8Array(this.dataBuffer);\r\n this.length = this.dataBuffer.byteLength;\r\n}\r\n\r\nUnpacker.prototype.unpack = function () {\r\n var type = this.unpack_uint8();\r\n if (type < 0x80) {\r\n return type;\r\n } else if ((type ^ 0xe0) < 0x20) {\r\n return (type ^ 0xe0) - 0x20;\r\n }\r\n\r\n var size;\r\n if ((size = type ^ 0xa0) <= 0x0f) {\r\n return this.unpack_raw(size);\r\n } else if ((size = type ^ 0xb0) <= 0x0f) {\r\n return this.unpack_string(size);\r\n } else if ((size = type ^ 0x90) <= 0x0f) {\r\n return this.unpack_array(size);\r\n } else if ((size = type ^ 0x80) <= 0x0f) {\r\n return this.unpack_map(size);\r\n }\r\n\r\n switch (type) {\r\n case 0xc0:\r\n return null;\r\n case 0xc1:\r\n return undefined;\r\n case 0xc2:\r\n return false;\r\n case 0xc3:\r\n return true;\r\n case 0xca:\r\n return this.unpack_float();\r\n case 0xcb:\r\n return this.unpack_double();\r\n case 0xcc:\r\n return this.unpack_uint8();\r\n case 0xcd:\r\n return this.unpack_uint16();\r\n case 0xce:\r\n return this.unpack_uint32();\r\n case 0xcf:\r\n return this.unpack_uint64();\r\n case 0xd0:\r\n return this.unpack_int8();\r\n case 0xd1:\r\n return this.unpack_int16();\r\n case 0xd2:\r\n return this.unpack_int32();\r\n case 0xd3:\r\n return this.unpack_int64();\r\n case 0xd4:\r\n return undefined;\r\n case 0xd5:\r\n return undefined;\r\n case 0xd6:\r\n return undefined;\r\n case 0xd7:\r\n return undefined;\r\n case 0xd8:\r\n size = this.unpack_uint16();\r\n return this.unpack_string(size);\r\n case 0xd9:\r\n size = this.unpack_uint32();\r\n return this.unpack_string(size);\r\n case 0xda:\r\n size = this.unpack_uint16();\r\n return this.unpack_raw(size);\r\n case 0xdb:\r\n size = this.unpack_uint32();\r\n return this.unpack_raw(size);\r\n case 0xdc:\r\n size = this.unpack_uint16();\r\n return this.unpack_array(size);\r\n case 0xdd:\r\n size = this.unpack_uint32();\r\n return this.unpack_array(size);\r\n case 0xde:\r\n size = this.unpack_uint16();\r\n return this.unpack_map(size);\r\n case 0xdf:\r\n size = this.unpack_uint32();\r\n return this.unpack_map(size);\r\n }\r\n};\r\n\r\nUnpacker.prototype.unpack_uint8 = function () {\r\n var byte = this.dataView[this.index] & 0xff;\r\n this.index++;\r\n return byte;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint16 = function () {\r\n var bytes = this.read(2);\r\n var uint16 =\r\n ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);\r\n this.index += 2;\r\n return uint16;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint32 = function () {\r\n var bytes = this.read(4);\r\n var uint32 =\r\n ((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3];\r\n this.index += 4;\r\n return uint32;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint64 = function () {\r\n var bytes = this.read(8);\r\n var uint64 =\r\n ((((((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3]) * 256 +\r\n bytes[4]) * 256 +\r\n bytes[5]) * 256 +\r\n bytes[6]) * 256 +\r\n bytes[7];\r\n this.index += 8;\r\n return uint64;\r\n};\r\n\r\nUnpacker.prototype.unpack_int8 = function () {\r\n var uint8 = this.unpack_uint8();\r\n return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);\r\n};\r\n\r\nUnpacker.prototype.unpack_int16 = function () {\r\n var uint16 = this.unpack_uint16();\r\n return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);\r\n};\r\n\r\nUnpacker.prototype.unpack_int32 = function () {\r\n var uint32 = this.unpack_uint32();\r\n return (uint32 < Math.pow(2, 31)) ? uint32\r\n : uint32 - Math.pow(2, 32);\r\n};\r\n\r\nUnpacker.prototype.unpack_int64 = function () {\r\n var uint64 = this.unpack_uint64();\r\n return (uint64 < Math.pow(2, 63)) ? uint64\r\n : uint64 - Math.pow(2, 64);\r\n};\r\n\r\nUnpacker.prototype.unpack_raw = function (size) {\r\n if (this.length < this.index + size) {\r\n throw new Error('BinaryPackFailure: index is out of range' +\r\n ' ' + this.index + ' ' + size + ' ' + this.length);\r\n }\r\n var buf = this.dataBuffer.slice(this.index, this.index + size);\r\n this.index += size;\r\n\r\n // buf = util.bufferToString(buf);\r\n\r\n return buf;\r\n};\r\n\r\nUnpacker.prototype.unpack_string = function (size) {\r\n var bytes = this.read(size);\r\n var i = 0;\r\n var str = '';\r\n var c;\r\n var code;\r\n\r\n while (i < size) {\r\n c = bytes[i];\r\n if (c < 128) {\r\n str += String.fromCharCode(c);\r\n i++;\r\n } else if ((c ^ 0xc0) < 32) {\r\n code = ((c ^ 0xc0) << 6) | (bytes[i + 1] & 63);\r\n str += String.fromCharCode(code);\r\n i += 2;\r\n } else {\r\n code = ((c & 15) << 12) | ((bytes[i + 1] & 63) << 6) |\r\n (bytes[i + 2] & 63);\r\n str += String.fromCharCode(code);\r\n i += 3;\r\n }\r\n }\r\n\r\n this.index += size;\r\n return str;\r\n};\r\n\r\nUnpacker.prototype.unpack_array = function (size) {\r\n var objects = new Array(size);\r\n for (var i = 0; i < size; i++) {\r\n objects[i] = this.unpack();\r\n }\r\n return objects;\r\n};\r\n\r\nUnpacker.prototype.unpack_map = function (size) {\r\n var map = {};\r\n for (var i = 0; i < size; i++) {\r\n var key = this.unpack();\r\n var value = this.unpack();\r\n map[key] = value;\r\n }\r\n return map;\r\n};\r\n\r\nUnpacker.prototype.unpack_float = function () {\r\n var uint32 = this.unpack_uint32();\r\n var sign = uint32 >> 31;\r\n var exp = ((uint32 >> 23) & 0xff) - 127;\r\n var fraction = (uint32 & 0x7fffff) | 0x800000;\r\n return (sign === 0 ? 1 : -1) *\r\n fraction * Math.pow(2, exp - 23);\r\n};\r\n\r\nUnpacker.prototype.unpack_double = function () {\r\n var h32 = this.unpack_uint32();\r\n var l32 = this.unpack_uint32();\r\n var sign = h32 >> 31;\r\n var exp = ((h32 >> 20) & 0x7ff) - 1023;\r\n var hfrac = (h32 & 0xfffff) | 0x100000;\r\n var frac = hfrac * Math.pow(2, exp - 20) +\r\n l32 * Math.pow(2, exp - 52);\r\n return (sign === 0 ? 1 : -1) * frac;\r\n};\r\n\r\nUnpacker.prototype.read = function (length) {\r\n var j = this.index;\r\n if (j + length <= this.length) {\r\n return this.dataView.subarray(j, j + length);\r\n } else {\r\n throw new Error('BinaryPackFailure: read index out of range');\r\n }\r\n};\r\n\r\nfunction Packer () {\r\n this.bufferBuilder = new BufferBuilder();\r\n}\r\n\r\nPacker.prototype.getBuffer = function () {\r\n return this.bufferBuilder.getBuffer();\r\n};\r\n\r\nPacker.prototype.pack = function (value) {\r\n var type = typeof (value);\r\n if (type === 'string') {\r\n this.pack_string(value);\r\n } else if (type === 'number') {\r\n if (Math.floor(value) === value) {\r\n this.pack_integer(value);\r\n } else {\r\n this.pack_double(value);\r\n }\r\n } else if (type === 'boolean') {\r\n if (value === true) {\r\n this.bufferBuilder.append(0xc3);\r\n } else if (value === false) {\r\n this.bufferBuilder.append(0xc2);\r\n }\r\n } else if (type === 'undefined') {\r\n this.bufferBuilder.append(0xc0);\r\n } else if (type === 'object') {\r\n if (value === null) {\r\n this.bufferBuilder.append(0xc0);\r\n } else {\r\n var constructor = value.constructor;\r\n if (constructor == Array) {\r\n this.pack_array(value);\r\n } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {\r\n this.pack_bin(value);\r\n } else if (constructor == ArrayBuffer) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value));\r\n } else {\r\n this.pack_bin(value);\r\n }\r\n } else if ('BYTES_PER_ELEMENT' in value) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value.buffer));\r\n } else {\r\n this.pack_bin(value.buffer);\r\n }\r\n } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {\r\n this.pack_object(value);\r\n } else if (constructor == Date) {\r\n this.pack_string(value.toString());\r\n } else if (typeof value.toBinaryPack === 'function') {\r\n this.bufferBuilder.append(value.toBinaryPack());\r\n } else {\r\n throw new Error('Type \"' + constructor.toString() + '\" not yet supported');\r\n }\r\n }\r\n } else {\r\n throw new Error('Type \"' + type + '\" not yet supported');\r\n }\r\n this.bufferBuilder.flush();\r\n};\r\n\r\nPacker.prototype.pack_bin = function (blob) {\r\n var length = blob.length || blob.byteLength || blob.size;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xa0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xda);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdb);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(blob);\r\n};\r\n\r\nPacker.prototype.pack_string = function (str) {\r\n var length = utf8Length(str);\r\n\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xb0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xd8);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xd9);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(str);\r\n};\r\n\r\nPacker.prototype.pack_array = function (ary) {\r\n var length = ary.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x90 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xdc);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdd);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var i = 0; i < length; i++) {\r\n this.pack(ary[i]);\r\n }\r\n};\r\n\r\nPacker.prototype.pack_integer = function (num) {\r\n if (num >= -0x20 && num <= 0x7f) {\r\n this.bufferBuilder.append(num & 0xff);\r\n } else if (num >= 0x00 && num <= 0xff) {\r\n this.bufferBuilder.append(0xcc);\r\n this.pack_uint8(num);\r\n } else if (num >= -0x80 && num <= 0x7f) {\r\n this.bufferBuilder.append(0xd0);\r\n this.pack_int8(num);\r\n } else if (num >= 0x0000 && num <= 0xffff) {\r\n this.bufferBuilder.append(0xcd);\r\n this.pack_uint16(num);\r\n } else if (num >= -0x8000 && num <= 0x7fff) {\r\n this.bufferBuilder.append(0xd1);\r\n this.pack_int16(num);\r\n } else if (num >= 0x00000000 && num <= 0xffffffff) {\r\n this.bufferBuilder.append(0xce);\r\n this.pack_uint32(num);\r\n } else if (num >= -0x80000000 && num <= 0x7fffffff) {\r\n this.bufferBuilder.append(0xd2);\r\n this.pack_int32(num);\r\n } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xd3);\r\n this.pack_int64(num);\r\n } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xcf);\r\n this.pack_uint64(num);\r\n } else {\r\n throw new Error('Invalid integer');\r\n }\r\n};\r\n\r\nPacker.prototype.pack_double = function (num) {\r\n var sign = 0;\r\n if (num < 0) {\r\n sign = 1;\r\n num = -num;\r\n }\r\n var exp = Math.floor(Math.log(num) / Math.LN2);\r\n var frac0 = num / Math.pow(2, exp) - 1;\r\n var frac1 = Math.floor(frac0 * Math.pow(2, 52));\r\n var b32 = Math.pow(2, 32);\r\n var h32 = (sign << 31) | ((exp + 1023) << 20) |\r\n (frac1 / b32) & 0x0fffff;\r\n var l32 = frac1 % b32;\r\n this.bufferBuilder.append(0xcb);\r\n this.pack_int32(h32);\r\n this.pack_int32(l32);\r\n};\r\n\r\nPacker.prototype.pack_object = function (obj) {\r\n var keys = Object.keys(obj);\r\n var length = keys.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x80 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xde);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdf);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n this.pack(prop);\r\n this.pack(obj[prop]);\r\n }\r\n }\r\n};\r\n\r\nPacker.prototype.pack_uint8 = function (num) {\r\n this.bufferBuilder.append(num);\r\n};\r\n\r\nPacker.prototype.pack_uint16 = function (num) {\r\n this.bufferBuilder.append(num >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_uint32 = function (num) {\r\n var n = num & 0xffffffff;\r\n this.bufferBuilder.append((n & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((n & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((n & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((n & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_uint64 = function (num) {\r\n var high = num / Math.pow(2, 32);\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int8 = function (num) {\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int16 = function (num) {\r\n this.bufferBuilder.append((num & 0xff00) >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int32 = function (num) {\r\n this.bufferBuilder.append((num >>> 24) & 0xff);\r\n this.bufferBuilder.append((num & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((num & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((num & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int64 = function (num) {\r\n var high = Math.floor(num / Math.pow(2, 32));\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nfunction _utf8Replace (m) {\r\n var code = m.charCodeAt(0);\r\n\r\n if (code <= 0x7ff) return '00';\r\n if (code <= 0xffff) return '000';\r\n if (code <= 0x1fffff) return '0000';\r\n if (code <= 0x3ffffff) return '00000';\r\n return '000000';\r\n}\r\n\r\nfunction utf8Length (str) {\r\n if (str.length > 600) {\r\n // Blob method faster for large strings\r\n return (new Blob([str])).size;\r\n } else {\r\n return str.replace(/[^\\u0000-\\u007F]/g, _utf8Replace).length;\r\n }\r\n}\r\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n !window.RTCIceGatherer)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n let hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(server => {\n if (server && (server.urls || server.url)) {\n let urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n const isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(url => {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n const validTurn = url.startsWith('turn') &&\n !url.startsWith('turn:[') &&\n url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n const shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n };\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window, browserDetails) {\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n const origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set(value) {\n origMSTEnabled.set.call(this, value);\n const ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = filterIceServers(config.iceServers,\n browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n const initParameters = arguments[1];\n const shouldPerformCheck = initParameters &&\n 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = initParameters.sendEncodings;\n sender.sendEncodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window, browserDetails);\n edgeShim.shimGetDisplayMedia(window, browserDetails);\n edgeShim.shimPeerConnection(window, browserDetails);\n edgeShim.shimReplaceTrack(window, browserDetails);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import webRTCAdapter from \"webrtc-adapter\";\n\nexport { webRTCAdapter };\n","import { webRTCAdapter } from './adapter';\n\nexport const Supports = new class {\n readonly isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);\n readonly supportedBrowsers = ['firefox', 'chrome', 'safari'];\n\n readonly minFirefoxVersion = 59;\n readonly minChromeVersion = 72;\n readonly minSafariVersion = 605;\n\n isWebRTCSupported(): boolean {\n return typeof RTCPeerConnection !== 'undefined';\n }\n\n isBrowserSupported(): boolean {\n const browser = this.getBrowser();\n const version = this.getVersion();\n\n const validBrowser = this.supportedBrowsers.includes(browser);\n\n if (!validBrowser) return false;\n\n if (browser === 'chrome') return version >= this.minChromeVersion;\n if (browser === 'firefox') return version >= this.minFirefoxVersion;\n if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;\n\n return false;\n }\n\n getBrowser(): string {\n return webRTCAdapter.browserDetails.browser;\n }\n\n getVersion(): number {\n return webRTCAdapter.browserDetails.version || 0;\n }\n\n isUnifiedPlanSupported(): boolean {\n const browser = this.getBrowser();\n const version = webRTCAdapter.browserDetails.version || 0;\n\n if (browser === 'chrome' && version < 72) return false;\n if (browser === 'firefox' && version >= 59) return true;\n if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;\n\n let tempPc: RTCPeerConnection;\n let supported = false;\n\n try {\n tempPc = new RTCPeerConnection();\n tempPc.addTransceiver('audio');\n supported = true;\n } catch (e) { }\n finally {\n if (tempPc) {\n tempPc.close();\n }\n }\n\n return supported;\n }\n\n toString(): string {\n return `Supports: \n browser:${this.getBrowser()} \n version:${this.getVersion()} \n isIOS:${this.isIOS} \n isWebRTCSupported:${this.isWebRTCSupported()} \n isBrowserSupported:${this.isBrowserSupported()} \n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\n }\n}","import * as BinaryPack from \"peerjs-js-binarypack\";\nimport { Supports } from './supports';\nimport { UtilSupportsObj } from '..';\n\nconst DEFAULT_CONFIG = {\n iceServers: [\n { urls: \"stun:stun.l.google.com:19302\" },\n { urls: \"turn:0.peerjs.com:3478\", username: \"peerjs\", credential: \"peerjsp\" }\n ],\n sdpSemantics: \"unified-plan\"\n};\n\nexport const util = new class {\n noop(): void { }\n\n readonly CLOUD_HOST = \"0.peerjs.com\";\n readonly CLOUD_PORT = 443;\n\n // Browsers that need chunking:\n readonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\n readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\n\n // Returns browser-agnostic default config\n readonly defaultConfig = DEFAULT_CONFIG;\n\n readonly browser = Supports.getBrowser();\n readonly browserVersion = Supports.getVersion();\n\n // Lists which features are supported\n readonly supports = (function () {\n const supported: UtilSupportsObj = {\n browser: Supports.isBrowserSupported(),\n webRTC: Supports.isWebRTCSupported(),\n audioVideo: false,\n data: false,\n binaryBlob: false,\n reliable: false,\n };\n\n if (!supported.webRTC) return supported;\n\n let pc: RTCPeerConnection;\n\n try {\n pc = new RTCPeerConnection(DEFAULT_CONFIG);\n\n supported.audioVideo = true;\n\n let dc: RTCDataChannel;\n\n try {\n dc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\n supported.data = true;\n supported.reliable = !!dc.ordered;\n\n // Binary test\n try {\n dc.binaryType = \"blob\";\n supported.binaryBlob = !Supports.isIOS;\n } catch (e) {\n }\n } catch (e) {\n } finally {\n if (dc) {\n dc.close();\n }\n }\n } catch (e) {\n } finally {\n if (pc) {\n pc.close();\n }\n }\n\n return supported;\n })();\n\n // Ensure alphanumeric ids\n validateId(id: string): boolean {\n // Allow empty ids\n return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\n }\n\n pack = BinaryPack.pack;\n unpack = BinaryPack.unpack;\n\n // Binary stuff\n\n private _dataCount: number = 1;\n\n chunk(blob: Blob): { __peerData: number, n: number, total: number, data: Blob }[] {\n const chunks = [];\n const size = blob.size;\n const total = Math.ceil(size / util.chunkedMTU);\n\n let index = 0;\n let start = 0;\n\n while (start < size) {\n const end = Math.min(size, start + util.chunkedMTU);\n const b = blob.slice(start, end);\n\n const chunk = {\n __peerData: this._dataCount,\n n: index,\n data: b,\n total,\n };\n\n chunks.push(chunk);\n\n start = end;\n index++;\n }\n\n this._dataCount++;\n\n return chunks;\n }\n\n blobToArrayBuffer(blob: Blob, cb: (arg: ArrayBuffer | null) => void): FileReader {\n const fr = new FileReader();\n\n fr.onload = function (evt) {\n if (evt.target) {\n cb(evt.target.result as ArrayBuffer);\n }\n };\n\n fr.readAsArrayBuffer(blob);\n\n return fr;\n }\n\n binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\n const byteArray = new Uint8Array(binary.length);\n\n for (let i = 0; i < binary.length; i++) {\n byteArray[i] = binary.charCodeAt(i) & 0xff;\n }\n\n return byteArray.buffer;\n }\n\n randomToken(): string {\n return Math.random()\n .toString(36)\n .substr(2);\n }\n\n isSecure(): boolean {\n return location.protocol === \"https:\";\n }\n}\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = 'PeerJS: ';\n\n/*\nPrints log messages depending on the debug level passed in. Defaults to 0.\n0 Prints no logs.\n1 Prints only errors.\n2 Prints errors and warnings.\n3 Prints all logs.\n*/\nexport enum LogLevel {\n Disabled,\n Errors,\n Warnings,\n All\n}\n\nclass Logger {\n private _logLevel = LogLevel.Disabled;\n\n get logLevel(): LogLevel { return this._logLevel; }\n\n set logLevel(logLevel: LogLevel) { this._logLevel = logLevel; }\n\n log(...args: any[]) {\n if (this._logLevel >= LogLevel.All) {\n this._print(LogLevel.All, ...args);\n }\n }\n\n warn(...args: any[]) {\n if (this._logLevel >= LogLevel.Warnings) {\n this._print(LogLevel.Warnings, ...args);\n }\n }\n\n error(...args: any[]) {\n if (this._logLevel >= LogLevel.Errors) {\n this._print(LogLevel.Errors, ...args);\n }\n }\n\n setLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\n this._print = fn;\n }\n\n private _print(logLevel: LogLevel, ...rest: any[]): void {\n const copy = [LOG_PREFIX, ...rest];\n\n for (let i in copy) {\n if (copy[i] instanceof Error) {\n copy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\n\n }\n }\n\n if (logLevel >= LogLevel.All) {\n console.log(...copy);\n } else if (logLevel >= LogLevel.Warnings) {\n console.warn(\"WARNING\", ...copy);\n } else if (logLevel >= LogLevel.Errors) {\n console.error(\"ERROR\", ...copy);\n }\n }\n}\n\nexport default new Logger();","export enum ConnectionEventType {\n Open = \"open\",\n Stream = \"stream\",\n Data = \"data\",\n Close = \"close\",\n Error = \"error\",\n IceStateChanged = \"iceStateChanged\"\n}\n\nexport enum ConnectionType {\n Data = \"data\",\n Media = \"media\"\n}\n\nexport enum PeerEventType {\n Open = \"open\",\n Close = \"close\",\n Connection = \"connection\",\n Call = \"call\",\n Disconnected = \"disconnected\",\n Error = \"error\"\n}\n\nexport enum PeerErrorType {\n BrowserIncompatible = \"browser-incompatible\",\n Disconnected = \"disconnected\",\n InvalidID = \"invalid-id\",\n InvalidKey = \"invalid-key\",\n Network = \"network\",\n PeerUnavailable = \"peer-unavailable\",\n SslUnavailable = \"ssl-unavailable\",\n ServerError = \"server-error\",\n SocketError = \"socket-error\",\n SocketClosed = \"socket-closed\",\n UnavailableID = \"unavailable-id\",\n WebRTC = \"webrtc\"\n}\n\nexport enum SerializationType {\n Binary = \"binary\",\n BinaryUTF8 = \"binary-utf8\",\n JSON = \"json\"\n}\n\nexport enum SocketEventType {\n Message = \"message\",\n Disconnected = \"disconnected\",\n Error = \"error\",\n Close = \"close\"\n}\n\nexport enum ServerMessageType {\n Heartbeat = \"HEARTBEAT\",\n Candidate = \"CANDIDATE\",\n Offer = \"OFFER\",\n Answer = \"ANSWER\",\n Open = \"OPEN\", // The connection to the server is open.\n Error = \"ERROR\", // Server error.\n IdTaken = \"ID-TAKEN\", // The selected ID is taken.\n InvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\n Leave = \"LEAVE\", // Another peer has closed its connection to this peer.\n Expire = \"EXPIRE\" // The offer sent to a peer has expired without response.\n\n}","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\nimport { SocketEventType, ServerMessageType } from \"./enums\";\n\n/**\n * An abstraction on top of WebSockets to provide fastest\n * possible connection for peers.\n */\nexport class Socket extends EventEmitter {\n private _disconnected: boolean = true;\n private _id?: string;\n private _messagesQueue: Array = [];\n private _socket?: WebSocket;\n private _wsPingTimer?: any;\n private readonly _baseUrl: string;\n\n constructor(\n secure: any,\n host: string,\n port: number,\n path: string,\n key: string,\n private readonly pingInterval: number = 5000,\n ) {\n super();\n\n const wsProtocol = secure ? \"wss://\" : \"ws://\";\n\n this._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\n }\n\n start(id: string, token: string): void {\n this._id = id;\n\n const wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\n\n if (!!this._socket || !this._disconnected) {\n return;\n }\n\n this._socket = new WebSocket(wsUrl);\n this._disconnected = false;\n\n this._socket.onmessage = (event) => {\n let data;\n\n try {\n data = JSON.parse(event.data);\n logger.log(\"Server message received:\", data);\n } catch (e) {\n logger.log(\"Invalid server message\", event.data);\n return;\n }\n\n this.emit(SocketEventType.Message, data);\n };\n\n this._socket.onclose = (event) => {\n if (this._disconnected) {\n return;\n }\n\n logger.log(\"Socket closed.\", event);\n\n this._cleanup();\n this._disconnected = true;\n\n this.emit(SocketEventType.Disconnected);\n };\n\n // Take care of the queue of connections if necessary and make sure Peer knows\n // socket is open.\n this._socket.onopen = () => {\n if (this._disconnected) {\n return;\n }\n\n this._sendQueuedMessages();\n\n logger.log(\"Socket open\");\n\n this._scheduleHeartbeat();\n };\n }\n\n private _scheduleHeartbeat(): void {\n this._wsPingTimer = setTimeout(() => {\n this._sendHeartbeat();\n }, this.pingInterval);\n }\n\n private _sendHeartbeat(): void {\n if (!this._wsOpen()) {\n logger.log(`Cannot send heartbeat, because socket closed`);\n return;\n }\n\n const message = JSON.stringify({ type: ServerMessageType.Heartbeat });\n\n this._socket!.send(message);\n\n this._scheduleHeartbeat();\n }\n\n /** Is the websocket currently open? */\n private _wsOpen(): boolean {\n return !!this._socket && this._socket.readyState === 1;\n }\n\n /** Send queued messages. */\n private _sendQueuedMessages(): void {\n //Create copy of queue and clear it,\n //because send method push the message back to queue if smth will go wrong\n const copiedQueue = [...this._messagesQueue];\n this._messagesQueue = [];\n\n for (const message of copiedQueue) {\n this.send(message);\n }\n }\n\n /** Exposed send for DC & Peer. */\n send(data: any): void {\n if (this._disconnected) {\n return;\n }\n\n // If we didn't get an ID yet, we can't yet send anything so we should queue\n // up these messages.\n if (!this._id) {\n this._messagesQueue.push(data);\n return;\n }\n\n if (!data.type) {\n this.emit(SocketEventType.Error, \"Invalid message\");\n return;\n }\n\n if (!this._wsOpen()) {\n return;\n }\n\n const message = JSON.stringify(data);\n\n this._socket!.send(message);\n }\n\n close(): void {\n if (this._disconnected) {\n return;\n }\n\n this._cleanup();\n\n this._disconnected = true;\n }\n\n private _cleanup(): void {\n if (this._socket) {\n this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;\n this._socket.close();\n this._socket = undefined;\n }\n\n clearTimeout(this._wsPingTimer!);\n }\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport { ConnectionType, PeerErrorType, ConnectionEventType, ServerMessageType } from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\n\n/**\n * Manages all negotiations between Peers.\n */\nexport class Negotiator {\n constructor(readonly connection: BaseConnection) { }\n\n /** Returns a PeerConnection object set up correctly (for data, media). */\n startConnection(options: any) {\n const peerConnection = this._startPeerConnection();\n\n // Set the connection's PC.\n this.connection.peerConnection = peerConnection;\n\n if (this.connection.type === ConnectionType.Media && options._stream) {\n this._addTracksToConnection(options._stream, peerConnection);\n }\n\n // What do we need to do now?\n if (options.originator) {\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = this.connection;\n\n const config: RTCDataChannelInit = { ordered: !!options.reliable };\n\n const dataChannel = peerConnection.createDataChannel(\n dataConnection.label,\n config\n );\n dataConnection.initialize(dataChannel);\n }\n\n this._makeOffer();\n } else {\n this.handleSDP(\"OFFER\", options.sdp);\n }\n }\n\n /** Start a PC. */\n private _startPeerConnection(): RTCPeerConnection {\n logger.log(\"Creating RTCPeerConnection.\");\n\n const peerConnection = new RTCPeerConnection(this.connection.provider.options.config);\n\n this._setupListeners(peerConnection);\n\n return peerConnection;\n }\n\n /** Set up various WebRTC listeners. */\n private _setupListeners(\n peerConnection: RTCPeerConnection\n ) {\n const peerId = this.connection.peer;\n const connectionId = this.connection.connectionId;\n const connectionType = this.connection.type;\n const provider = this.connection.provider;\n\n // ICE CANDIDATES.\n logger.log(\"Listening for ICE candidates.\");\n\n peerConnection.onicecandidate = (evt) => {\n if (!evt.candidate || !evt.candidate.candidate) return;\n\n logger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\n\n provider.socket.send({\n type: ServerMessageType.Candidate,\n payload: {\n candidate: evt.candidate,\n type: connectionType,\n connectionId: connectionId\n },\n dst: peerId\n });\n };\n\n peerConnection.oniceconnectionstatechange = () => {\n switch (peerConnection.iceConnectionState) {\n case \"failed\":\n logger.log(\n \"iceConnectionState is failed, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Negotiation of connection to \" + peerId + \" failed.\")\n );\n this.connection.close();\n break;\n case \"closed\":\n logger.log(\n \"iceConnectionState is closed, closing connections to \" +\n peerId\n );\n this.connection.emit(\n ConnectionEventType.Error,\n new Error(\"Connection to \" + peerId + \" closed.\")\n );\n this.connection.close();\n break;\n case \"disconnected\":\n logger.log(\n \"iceConnectionState changed to disconnected on the connection with \" +\n peerId\n );\n break;\n case \"completed\":\n peerConnection.onicecandidate = util.noop;\n break;\n }\n\n this.connection.emit(ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);\n };\n\n // DATACONNECTION.\n logger.log(\"Listening for data channel\");\n // Fired between offer and answer, so options should already be saved\n // in the options hash.\n peerConnection.ondatachannel = (evt) => {\n logger.log(\"Received data channel\");\n\n const dataChannel = evt.channel;\n const connection = (\n provider.getConnection(peerId, connectionId)\n );\n\n connection.initialize(dataChannel);\n };\n\n // MEDIACONNECTION.\n logger.log(\"Listening for remote stream\");\n\n peerConnection.ontrack = (evt) => {\n logger.log(\"Received remote stream\");\n\n const stream = evt.streams[0];\n const connection = provider.getConnection(peerId, connectionId);\n\n if (connection.type === ConnectionType.Media) {\n const mediaConnection = connection;\n\n this._addStreamToMediaConnection(stream, mediaConnection);\n }\n };\n }\n\n cleanup(): void {\n logger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\n\n const peerConnection = this.connection.peerConnection;\n\n if (!peerConnection) {\n return;\n }\n\n this.connection.peerConnection = null;\n\n //unsubscribe from all PeerConnection's events\n peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = () => { };\n\n const peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\n let dataChannelNotClosed = false;\n\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = this.connection;\n const dataChannel = dataConnection.dataChannel;\n\n if (dataChannel) {\n dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== \"closed\";\n }\n }\n\n if (peerConnectionNotClosed || dataChannelNotClosed) {\n peerConnection.close();\n }\n }\n\n private async _makeOffer(): Promise {\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n const offer = await peerConnection.createOffer(\n this.connection.options.constraints\n );\n\n logger.log(\"Created offer.\");\n\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\n offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;\n }\n\n try {\n await peerConnection.setLocalDescription(offer);\n\n logger.log(\"Set localDescription:\", offer, `for:${this.connection.peer}`);\n\n let payload: any = {\n sdp: offer,\n type: this.connection.type,\n connectionId: this.connection.connectionId,\n metadata: this.connection.metadata,\n browser: util.browser\n };\n\n if (this.connection.type === ConnectionType.Data) {\n const dataConnection = this.connection;\n\n payload = {\n ...payload,\n label: dataConnection.label,\n reliable: dataConnection.reliable,\n serialization: dataConnection.serialization\n };\n }\n\n provider.socket.send({\n type: ServerMessageType.Offer,\n payload,\n dst: this.connection.peer\n });\n } catch (err) {\n // TODO: investigate why _makeOffer is being called from the answer\n if (\n err !=\n \"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\n ) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setLocalDescription, \", err);\n }\n }\n } catch (err_1) {\n provider.emitError(PeerErrorType.WebRTC, err_1);\n logger.log(\"Failed to createOffer, \", err_1);\n }\n }\n\n private async _makeAnswer(): Promise {\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n const answer = await peerConnection.createAnswer();\n logger.log(\"Created answer.\");\n\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\n answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;\n }\n\n try {\n await peerConnection.setLocalDescription(answer);\n\n logger.log(`Set localDescription:`, answer, `for:${this.connection.peer}`);\n\n provider.socket.send({\n type: ServerMessageType.Answer,\n payload: {\n sdp: answer,\n type: this.connection.type,\n connectionId: this.connection.connectionId,\n browser: util.browser\n },\n dst: this.connection.peer\n });\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setLocalDescription, \", err);\n }\n } catch (err_1) {\n provider.emitError(PeerErrorType.WebRTC, err_1);\n logger.log(\"Failed to create answer, \", err_1);\n }\n }\n\n /** Handle an SDP. */\n async handleSDP(\n type: string,\n sdp: any\n ): Promise {\n sdp = new RTCSessionDescription(sdp);\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n logger.log(\"Setting remote description\", sdp);\n\n const self = this;\n\n try {\n await peerConnection.setRemoteDescription(sdp);\n logger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\n if (type === \"OFFER\") {\n await self._makeAnswer();\n }\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to setRemoteDescription, \", err);\n }\n }\n\n /** Handle a candidate. */\n async handleCandidate(ice: any): Promise {\n logger.log(`handleCandidate:`, ice);\n\n const candidate = ice.candidate;\n const sdpMLineIndex = ice.sdpMLineIndex;\n const sdpMid = ice.sdpMid;\n const peerConnection = this.connection.peerConnection;\n const provider = this.connection.provider;\n\n try {\n await peerConnection.addIceCandidate(\n new RTCIceCandidate({\n sdpMid: sdpMid,\n sdpMLineIndex: sdpMLineIndex,\n candidate: candidate\n })\n );\n logger.log(`Added ICE candidate for:${this.connection.peer}`);\n } catch (err) {\n provider.emitError(PeerErrorType.WebRTC, err);\n logger.log(\"Failed to handleCandidate, \", err);\n }\n }\n\n private _addTracksToConnection(\n stream: MediaStream,\n peerConnection: RTCPeerConnection\n ): void {\n logger.log(`add tracks from stream ${stream.id} to peer connection`);\n\n if (!peerConnection.addTrack) {\n return logger.error(\n `Your browser does't support RTCPeerConnection#addTrack. Ignored.`\n );\n }\n\n stream.getTracks().forEach(track => {\n peerConnection.addTrack(track, stream);\n });\n }\n\n private _addStreamToMediaConnection(\n stream: MediaStream,\n mediaConnection: MediaConnection\n ): void {\n logger.log(\n `add stream ${stream.id} to media connection ${\n mediaConnection.connectionId\n }`\n );\n\n mediaConnection.addStream(stream);\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { Peer } from \"./peer\";\nimport { ServerMessage } from \"./servermessage\";\nimport { ConnectionType } from \"./enums\";\n\nexport abstract class BaseConnection extends EventEmitter {\n protected _open = false;\n\n readonly metadata: any;\n connectionId: string;\n\n peerConnection: RTCPeerConnection;\n\n abstract get type(): ConnectionType;\n\n get open() {\n return this._open;\n }\n\n constructor(\n readonly peer: string,\n public provider: Peer,\n readonly options: any\n ) {\n super();\n\n this.metadata = options.metadata;\n }\n\n abstract close(): void;\n\n abstract handleMessage(message: ServerMessage): void;\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport { ConnectionType, ConnectionEventType, ServerMessageType } from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { AnswerOption } from \"..\";\n\n/**\n * Wraps the streaming interface between two Peers.\n */\nexport class MediaConnection extends BaseConnection {\n private static readonly ID_PREFIX = \"mc_\";\n\n private _negotiator: Negotiator;\n private _localStream: MediaStream;\n private _remoteStream: MediaStream;\n\n get type() {\n return ConnectionType.Media;\n }\n\n get localStream(): MediaStream { return this._localStream; }\n get remoteStream(): MediaStream { return this._remoteStream; }\n\n constructor(peerId: string, provider: Peer, options: any) {\n super(peerId, provider, options);\n\n this._localStream = this.options._stream;\n this.connectionId =\n this.options.connectionId ||\n MediaConnection.ID_PREFIX + util.randomToken();\n\n this._negotiator = new Negotiator(this);\n\n if (this._localStream) {\n this._negotiator.startConnection({\n _stream: this._localStream,\n originator: true\n });\n }\n }\n\n addStream(remoteStream) {\n logger.log(\"Receiving stream\", remoteStream);\n\n this._remoteStream = remoteStream;\n super.emit(ConnectionEventType.Stream, remoteStream); // Should we call this `open`?\n }\n\n handleMessage(message: ServerMessage): void {\n const type = message.type;\n const payload = message.payload;\n\n switch (message.type) {\n case ServerMessageType.Answer:\n // Forward to negotiator\n this._negotiator.handleSDP(type, payload.sdp);\n this._open = true;\n break;\n case ServerMessageType.Candidate:\n this._negotiator.handleCandidate(payload.candidate);\n break;\n default:\n logger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\n break;\n }\n }\n\n answer(stream: MediaStream, options: AnswerOption = {}): void {\n if (this._localStream) {\n logger.warn(\n \"Local stream already exists on this MediaConnection. Are you answering a call twice?\"\n );\n return;\n }\n\n this._localStream = stream;\n\n if (options && options.sdpTransform) {\n this.options.sdpTransform = options.sdpTransform;\n }\n\n this._negotiator.startConnection({ ...this.options._payload, _stream: stream });\n // Retrieve lost messages stored because PeerConnection not set up.\n const messages = this.provider._getMessages(this.connectionId);\n\n for (let message of messages) {\n this.handleMessage(message);\n }\n\n this._open = true;\n }\n\n /**\n * Exposed functionality for users.\n */\n\n /** Allows user to close connection. */\n close(): void {\n if (this._negotiator) {\n this._negotiator.cleanup();\n this._negotiator = null;\n }\n\n this._localStream = null;\n this._remoteStream = null;\n\n if (this.provider) {\n this.provider._removeConnection(this);\n\n this.provider = null;\n }\n\n if (this.options && this.options._stream) {\n this.options._stream = null;\n }\n\n if (!this.open) {\n return;\n }\n\n this._open = false;\n\n super.emit(ConnectionEventType.Close);\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\n\nexport class EncodingQueue extends EventEmitter {\n readonly fileReader: FileReader = new FileReader();\n\n private _queue: Blob[] = [];\n private _processing: boolean = false;\n\n constructor() {\n super();\n\n this.fileReader.onload = (evt) => {\n this._processing = false;\n\n if (evt.target) {\n this.emit('done', evt.target.result as ArrayBuffer);\n }\n\n this.doNextTask();\n };\n\n this.fileReader.onerror = (evt) => {\n logger.error(`EncodingQueue error:`, evt);\n this._processing = false;\n this.destroy();\n this.emit('error', evt);\n }\n }\n\n get queue(): Blob[] {\n return this._queue;\n }\n\n get size(): number {\n return this.queue.length;\n }\n\n get processing(): boolean {\n return this._processing;\n }\n\n enque(blob: Blob): void {\n this.queue.push(blob);\n\n if (this.processing) return;\n\n this.doNextTask();\n }\n\n destroy(): void {\n this.fileReader.abort();\n this._queue = [];\n }\n\n private doNextTask(): void {\n if (this.size === 0) return;\n if (this.processing) return;\n\n this._processing = true;\n\n this.fileReader.readAsArrayBuffer(this.queue.shift());\n }\n}","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport {\n ConnectionType,\n ConnectionEventType,\n SerializationType,\n ServerMessageType\n} from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { EncodingQueue } from './encodingQueue';\nimport { DataConnection as IDataConnection } from '../index';\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport class DataConnection extends BaseConnection implements IDataConnection {\n private static readonly ID_PREFIX = \"dc_\";\n private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\n\n private _negotiator: Negotiator;\n readonly label: string;\n readonly serialization: SerializationType;\n readonly reliable: boolean;\n stringify: (data: any) => string = JSON.stringify;\n parse: (data: string) => any = JSON.parse;\n\n get type() {\n return ConnectionType.Data;\n }\n\n private _buffer: any[] = [];\n private _bufferSize = 0;\n private _buffering = false;\n private _chunkedData: {\n [id: number]: {\n data: Blob[],\n count: number,\n total: number\n }\n } = {};\n\n private _dc: RTCDataChannel;\n private _encodingQueue = new EncodingQueue();\n\n get dataChannel(): RTCDataChannel {\n return this._dc;\n }\n\n get bufferSize(): number { return this._bufferSize; }\n\n constructor(peerId: string, provider: Peer, options: any) {\n super(peerId, provider, options);\n\n this.connectionId =\n this.options.connectionId || DataConnection.ID_PREFIX + util.randomToken();\n\n this.label = this.options.label || this.connectionId;\n this.serialization = this.options.serialization || SerializationType.Binary;\n this.reliable = !!this.options.reliable;\n\n this._encodingQueue.on('done', (ab: ArrayBuffer) => {\n this._bufferedSend(ab);\n });\n\n this._encodingQueue.on('error', () => {\n logger.error(`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`);\n this.close();\n });\n\n this._negotiator = new Negotiator(this);\n\n this._negotiator.startConnection(\n this.options._payload || {\n originator: true\n }\n );\n }\n\n /** Called by the Negotiator when the DataChannel is ready. */\n initialize(dc: RTCDataChannel): void {\n this._dc = dc;\n this._configureDataChannel();\n }\n\n private _configureDataChannel(): void {\n if (!util.supports.binaryBlob || util.supports.reliable) {\n this.dataChannel.binaryType = \"arraybuffer\";\n }\n\n this.dataChannel.onopen = () => {\n logger.log(`DC#${this.connectionId} dc connection success`);\n this._open = true;\n this.emit(ConnectionEventType.Open);\n };\n\n this.dataChannel.onmessage = (e) => {\n logger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\n this._handleDataMessage(e);\n };\n\n this.dataChannel.onclose = () => {\n logger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n this.close();\n };\n }\n\n // Handles a DataChannel message.\n private _handleDataMessage({ data }: { data: Blob | ArrayBuffer | string }): void {\n const datatype = data.constructor;\n\n const isBinarySerialization = this.serialization === SerializationType.Binary ||\n this.serialization === SerializationType.BinaryUTF8;\n\n let deserializedData: any = data;\n\n if (isBinarySerialization) {\n if (datatype === Blob) {\n // Datatype should never be blob\n util.blobToArrayBuffer(data as Blob, (ab) => {\n const unpackedData = util.unpack(ab);\n this.emit(ConnectionEventType.Data, unpackedData);\n });\n return;\n } else if (datatype === ArrayBuffer) {\n deserializedData = util.unpack(data as ArrayBuffer);\n } else if (datatype === String) {\n // String fallback for binary data for browsers that don't support binary yet\n const ab = util.binaryStringToArrayBuffer(data as string);\n deserializedData = util.unpack(ab);\n }\n } else if (this.serialization === SerializationType.JSON) {\n deserializedData = this.parse(data as string);\n }\n\n // Check if we've chunked--if so, piece things back together.\n // We're guaranteed that this isn't 0.\n if (deserializedData.__peerData) {\n this._handleChunk(deserializedData);\n return;\n }\n\n super.emit(ConnectionEventType.Data, deserializedData);\n }\n\n private _handleChunk(data: { __peerData: number, n: number, total: number, data: Blob }): void {\n const id = data.__peerData;\n const chunkInfo = this._chunkedData[id] || {\n data: [],\n count: 0,\n total: data.total\n };\n\n chunkInfo.data[data.n] = data.data;\n chunkInfo.count++;\n this._chunkedData[id] = chunkInfo;\n\n if (chunkInfo.total === chunkInfo.count) {\n // Clean up before making the recursive call to `_handleDataMessage`.\n delete this._chunkedData[id];\n\n // We've received all the chunks--time to construct the complete data.\n const data = new Blob(chunkInfo.data);\n this._handleDataMessage({ data });\n }\n }\n\n /**\n * Exposed functionality for users.\n */\n\n /** Allows user to close connection. */\n close(): void {\n this._buffer = [];\n this._bufferSize = 0;\n this._chunkedData = {};\n\n if (this._negotiator) {\n this._negotiator.cleanup();\n this._negotiator = null;\n }\n\n if (this.provider) {\n this.provider._removeConnection(this);\n\n this.provider = null;\n }\n\n if (this.dataChannel) {\n this.dataChannel.onopen = null;\n this.dataChannel.onmessage = null;\n this.dataChannel.onclose = null;\n this._dc = null;\n }\n\n if (this._encodingQueue) {\n this._encodingQueue.destroy();\n this._encodingQueue.removeAllListeners();\n this._encodingQueue = null;\n }\n\n if (!this.open) {\n return;\n }\n\n this._open = false;\n\n super.emit(ConnectionEventType.Close);\n }\n\n /** Allows user to send data. */\n send(data: any, chunked?: boolean): void {\n if (!this.open) {\n super.emit(\n ConnectionEventType.Error,\n new Error(\n \"Connection is not open. You should listen for the `open` event before sending messages.\"\n )\n );\n return;\n }\n\n if (this.serialization === SerializationType.JSON) {\n this._bufferedSend(this.stringify(data));\n } else if (\n this.serialization === SerializationType.Binary ||\n this.serialization === SerializationType.BinaryUTF8\n ) {\n const blob = util.pack(data);\n\n if (!chunked && blob.size > util.chunkedMTU) {\n this._sendChunks(blob);\n return;\n }\n\n if (!util.supports.binaryBlob) {\n // We only do this if we really need to (e.g. blobs are not supported),\n // because this conversion is costly.\n this._encodingQueue.enque(blob);\n } else {\n this._bufferedSend(blob);\n }\n } else {\n this._bufferedSend(data);\n }\n }\n\n private _bufferedSend(msg: any): void {\n if (this._buffering || !this._trySend(msg)) {\n this._buffer.push(msg);\n this._bufferSize = this._buffer.length;\n }\n }\n\n // Returns true if the send succeeds.\n private _trySend(msg: any): boolean {\n if (!this.open) {\n return false;\n }\n\n if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\n this._buffering = true;\n setTimeout(() => {\n this._buffering = false;\n this._tryBuffer();\n }, 50);\n\n return false;\n }\n\n try {\n this.dataChannel.send(msg);\n } catch (e) {\n logger.error(`DC#:${this.connectionId} Error when sending:`, e);\n this._buffering = true;\n\n this.close();\n\n return false;\n }\n\n return true;\n }\n\n // Try to send the first message in the buffer.\n private _tryBuffer(): void {\n if (!this.open) {\n return;\n }\n\n if (this._buffer.length === 0) {\n return;\n }\n\n const msg = this._buffer[0];\n\n if (this._trySend(msg)) {\n this._buffer.shift();\n this._bufferSize = this._buffer.length;\n this._tryBuffer();\n }\n }\n\n private _sendChunks(blob: Blob): void {\n const blobs = util.chunk(blob);\n logger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\n\n for (let blob of blobs) {\n this.send(blob, true);\n }\n }\n\n handleMessage(message: ServerMessage): void {\n const payload = message.payload;\n\n switch (message.type) {\n case ServerMessageType.Answer:\n this._negotiator.handleSDP(message.type, payload.sdp);\n break;\n case ServerMessageType.Candidate:\n this._negotiator.handleCandidate(payload.candidate);\n break;\n default:\n logger.warn(\n \"Unrecognized message type:\",\n message.type,\n \"from peer:\",\n this.peer\n );\n break;\n }\n }\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\n\nexport class API {\n constructor(private readonly _options: any) { }\n\n private _buildUrl(method: string): string {\n const protocol = this._options.secure ? \"https://\" : \"http://\";\n let url =\n protocol +\n this._options.host +\n \":\" +\n this._options.port +\n this._options.path +\n this._options.key +\n \"/\" +\n method;\n const queryString = \"?ts=\" + new Date().getTime() + \"\" + Math.random();\n url += queryString;\n\n return url;\n }\n\n /** Get a unique ID from the server via XHR and initialize with it. */\n async retrieveId(): Promise {\n const url = this._buildUrl(\"id\");\n\n try {\n const response = await fetch(url);\n\n if (response.status !== 200) {\n throw new Error(`Error. Status:${response.status}`);\n }\n\n return response.text();\n } catch (error) {\n logger.error(\"Error retrieving ID\", error);\n\n let pathError = \"\";\n\n if (\n this._options.path === \"/\" &&\n this._options.host !== util.CLOUD_HOST\n ) {\n pathError =\n \" If you passed in a `path` to your self-hosted PeerServer, \" +\n \"you'll also need to pass in that same path when creating a new \" +\n \"Peer.\";\n }\n\n throw new Error(\"Could not get an ID from the server.\" + pathError);\n }\n }\n\n /** @deprecated */\n async listAllPeers(): Promise {\n const url = this._buildUrl(\"peers\");\n\n try {\n const response = await fetch(url);\n\n if (response.status !== 200) {\n if (response.status === 401) {\n let helpfulError = \"\";\n\n if (this._options.host === util.CLOUD_HOST) {\n helpfulError =\n \"It looks like you're using the cloud server. You can email \" +\n \"team@peerjs.com to enable peer listing for your API key.\";\n } else {\n helpfulError =\n \"You need to enable `allow_discovery` on your self-hosted \" +\n \"PeerServer to use this feature.\";\n }\n\n throw new Error(\"It doesn't look like you have permission to list peers IDs. \" +\n helpfulError);\n }\n\n throw new Error(`Error. Status:${response.status}`);\n }\n\n return response.json();\n } catch (error) {\n logger.error(\"Error retrieving list peers\", error);\n\n throw new Error(\"Could not get list peers from the server.\" + error);\n }\n }\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport { util } from \"./util\";\nimport logger, { LogLevel } from \"./logger\";\nimport { Socket } from \"./socket\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport {\n ConnectionType,\n PeerErrorType,\n PeerEventType,\n SocketEventType,\n ServerMessageType\n} from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { API } from \"./api\";\nimport { PeerConnectOption, PeerJSOption } from \"..\";\n\nclass PeerOptions implements PeerJSOption {\n debug?: LogLevel; // 1: Errors, 2: Warnings, 3: All logs\n host?: string;\n port?: number;\n path?: string;\n key?: string;\n token?: string;\n config?: any;\n secure?: boolean;\n pingInterval?: number;\n logFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\n}\n\n/**\n * A peer who can initiate connections with other peers.\n */\nexport class Peer extends EventEmitter {\n private static readonly DEFAULT_KEY = \"peerjs\";\n\n private readonly _options: PeerOptions;\n private readonly _api: API;\n private readonly _socket: Socket;\n\n private _id: string | null = null;\n private _lastServerId: string | null = null;\n\n // States.\n private _destroyed = false; // Connections have been killed\n private _disconnected = false; // Connection to PeerServer killed but P2P connections still active\n private _open = false; // Sockets and such are not yet open.\n private readonly _connections: Map = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map = new Map(); // src => [list of messages]\n\n get id() {\n return this._id;\n }\n\n get options() {\n return this._options;\n }\n\n get open() {\n return this._open;\n }\n\n get socket() {\n return this._socket;\n }\n\n /**\n * @deprecated \n * Return type will change from Object to Map \n */\n get connections(): Object {\n const plainConnections = Object.create(null);\n\n for (let [k, v] of this._connections) {\n plainConnections[k] = v;\n }\n\n return plainConnections;\n }\n\n get destroyed() {\n return this._destroyed;\n }\n get disconnected() {\n return this._disconnected;\n }\n\n constructor(id?: string | PeerOptions, options?: PeerOptions) {\n super();\n\n let userId: string | undefined;\n\n // Deal with overloading\n if (id && id.constructor == Object) {\n options = id as PeerOptions;\n } else if (id) {\n userId = id.toString();\n }\n\n // Configurize options\n options = {\n debug: 0, // 1: Errors, 2: Warnings, 3: All logs\n host: util.CLOUD_HOST,\n port: util.CLOUD_PORT,\n path: \"/\",\n key: Peer.DEFAULT_KEY,\n token: util.randomToken(),\n config: util.defaultConfig,\n ...options\n };\n this._options = options;\n\n // Detect relative URL host.\n if (this._options.host === \"/\") {\n this._options.host = window.location.hostname;\n }\n\n // Set path correctly.\n if (this._options.path) {\n if (this._options.path[0] !== \"/\") {\n this._options.path = \"/\" + this._options.path;\n }\n if (this._options.path[this._options.path.length - 1] !== \"/\") {\n this._options.path += \"/\";\n }\n }\n\n // Set whether we use SSL to same as current host\n if (this._options.secure === undefined && this._options.host !== util.CLOUD_HOST) {\n this._options.secure = util.isSecure();\n } else if (this._options.host == util.CLOUD_HOST) {\n this._options.secure = true;\n }\n // Set a custom log function if present\n if (this._options.logFunction) {\n logger.setLogFunction(this._options.logFunction);\n }\n\n logger.logLevel = this._options.debug || 0;\n\n this._api = new API(options);\n this._socket = this._createServerConnection();\n\n // Sanity checks\n // Ensure WebRTC supported\n if (!util.supports.audioVideo && !util.supports.data) {\n this._delayedAbort(\n PeerErrorType.BrowserIncompatible,\n \"The current browser does not support WebRTC\"\n );\n return;\n }\n\n // Ensure alphanumeric id\n if (!!userId && !util.validateId(userId)) {\n this._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\n return;\n }\n\n if (userId) {\n this._initialize(userId);\n } else {\n this._api.retrieveId()\n .then(id => this._initialize(id))\n .catch(error => this._abort(PeerErrorType.ServerError, error));\n }\n }\n\n private _createServerConnection(): Socket {\n const socket = new Socket(\n this._options.secure,\n this._options.host!,\n this._options.port!,\n this._options.path!,\n this._options.key!,\n this._options.pingInterval\n );\n\n socket.on(SocketEventType.Message, (data: ServerMessage) => {\n this._handleMessage(data);\n });\n\n socket.on(SocketEventType.Error, (error: string) => {\n this._abort(PeerErrorType.SocketError, error);\n });\n\n socket.on(SocketEventType.Disconnected, () => {\n if (this.disconnected) {\n return;\n }\n\n this.emitError(PeerErrorType.Network, \"Lost connection to server.\");\n this.disconnect();\n });\n\n socket.on(SocketEventType.Close, () => {\n if (this.disconnected) {\n return;\n }\n\n this._abort(PeerErrorType.SocketClosed, \"Underlying socket is already closed.\");\n });\n\n return socket;\n }\n\n /** Initialize a connection with the server. */\n private _initialize(id: string): void {\n this._id = id;\n this.socket.start(id, this._options.token!);\n }\n\n /** Handles messages from the server. */\n private _handleMessage(message: ServerMessage): void {\n const type = message.type;\n const payload = message.payload;\n const peerId = message.src;\n\n switch (type) {\n case ServerMessageType.Open: // The connection to the server is open.\n this._lastServerId = this.id;\n this._open = true;\n this.emit(PeerEventType.Open, this.id);\n break;\n case ServerMessageType.Error: // Server error.\n this._abort(PeerErrorType.ServerError, payload.msg);\n break;\n case ServerMessageType.IdTaken: // The selected ID is taken.\n this._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\n break;\n case ServerMessageType.InvalidKey: // The given API key cannot be found.\n this._abort(PeerErrorType.InvalidKey, `API KEY \"${this._options.key}\" is invalid`);\n break;\n case ServerMessageType.Leave: // Another peer has closed its connection to this peer.\n logger.log(`Received leave message from ${peerId}`);\n this._cleanupPeer(peerId);\n this._connections.delete(peerId);\n break;\n case ServerMessageType.Expire: // The offer sent to a peer has expired without response.\n this.emitError(PeerErrorType.PeerUnavailable, `Could not connect to peer ${peerId}`);\n break;\n case ServerMessageType.Offer: {\n // we should consider switching this to CALL/CONNECT, but this is the least breaking option.\n const connectionId = payload.connectionId;\n let connection = this.getConnection(peerId, connectionId);\n\n if (connection) {\n connection.close();\n logger.warn(`Offer received for existing Connection ID:${connectionId}`);\n }\n\n // Create a new connection.\n if (payload.type === ConnectionType.Media) {\n connection = new MediaConnection(peerId, this, {\n connectionId: connectionId,\n _payload: payload,\n metadata: payload.metadata\n });\n this._addConnection(peerId, connection);\n this.emit(PeerEventType.Call, connection);\n } else if (payload.type === ConnectionType.Data) {\n connection = new DataConnection(peerId, this, {\n connectionId: connectionId,\n _payload: payload,\n metadata: payload.metadata,\n label: payload.label,\n serialization: payload.serialization,\n reliable: payload.reliable\n });\n this._addConnection(peerId, connection);\n this.emit(PeerEventType.Connection, connection);\n } else {\n logger.warn(`Received malformed connection type:${payload.type}`);\n return;\n }\n\n // Find messages.\n const messages = this._getMessages(connectionId);\n for (let message of messages) {\n connection.handleMessage(message);\n }\n\n break;\n }\n default: {\n if (!payload) {\n logger.warn(`You received a malformed message from ${peerId} of type ${type}`);\n return;\n }\n\n const connectionId = payload.connectionId;\n const connection = this.getConnection(peerId, connectionId);\n\n if (connection && connection.peerConnection) {\n // Pass it on.\n connection.handleMessage(message);\n } else if (connectionId) {\n // Store for possible later use\n this._storeMessage(connectionId, message);\n } else {\n logger.warn(\"You received an unrecognized message:\", message);\n }\n break;\n }\n }\n }\n\n /** Stores messages without a set up connection, to be claimed later. */\n private _storeMessage(connectionId: string, message: ServerMessage): void {\n if (!this._lostMessages.has(connectionId)) {\n this._lostMessages.set(connectionId, []);\n }\n\n this._lostMessages.get(connectionId).push(message);\n }\n\n /** Retrieve messages from lost message store */\n //TODO Change it to private\n public _getMessages(connectionId: string): ServerMessage[] {\n const messages = this._lostMessages.get(connectionId);\n\n if (messages) {\n this._lostMessages.delete(connectionId);\n return messages;\n }\n\n return [];\n }\n\n /**\n * Returns a DataConnection to the specified peer. See documentation for a\n * complete list of options.\n */\n connect(peer: string, options: PeerConnectOption = {}): DataConnection {\n if (this.disconnected) {\n logger.warn(\n \"You cannot connect to a new Peer because you called \" +\n \".disconnect() on this Peer and ended your connection with the \" +\n \"server. You can create a new Peer to reconnect, or call reconnect \" +\n \"on this peer if you believe its ID to still be available.\"\n );\n this.emitError(\n PeerErrorType.Disconnected,\n \"Cannot connect to new Peer after disconnecting from server.\"\n );\n return;\n }\n\n const dataConnection = new DataConnection(peer, this, options);\n this._addConnection(peer, dataConnection);\n return dataConnection;\n }\n\n /**\n * Returns a MediaConnection to the specified peer. See documentation for a\n * complete list of options.\n */\n call(peer: string, stream: MediaStream, options: any = {}): MediaConnection {\n if (this.disconnected) {\n logger.warn(\n \"You cannot connect to a new Peer because you called \" +\n \".disconnect() on this Peer and ended your connection with the \" +\n \"server. You can create a new Peer to reconnect.\"\n );\n this.emitError(\n PeerErrorType.Disconnected,\n \"Cannot connect to new Peer after disconnecting from server.\"\n );\n return;\n }\n\n if (!stream) {\n logger.error(\n \"To call a peer, you must provide a stream from your browser's `getUserMedia`.\"\n );\n return;\n }\n\n options._stream = stream;\n\n const mediaConnection = new MediaConnection(peer, this, options);\n this._addConnection(peer, mediaConnection);\n return mediaConnection;\n }\n\n /** Add a data/media connection to this peer. */\n private _addConnection(peerId: string, connection: BaseConnection): void {\n logger.log(`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`);\n\n if (!this._connections.has(peerId)) {\n this._connections.set(peerId, []);\n }\n this._connections.get(peerId).push(connection);\n }\n\n //TODO should be private\n _removeConnection(connection: BaseConnection): void {\n const connections = this._connections.get(connection.peer);\n\n if (connections) {\n const index = connections.indexOf(connection);\n\n if (index !== -1) {\n connections.splice(index, 1);\n }\n }\n\n //remove from lost messages\n this._lostMessages.delete(connection.connectionId);\n }\n\n /** Retrieve a data/media connection for this peer. */\n getConnection(peerId: string, connectionId: string): null | BaseConnection {\n const connections = this._connections.get(peerId);\n if (!connections) {\n return null;\n }\n\n for (let connection of connections) {\n if (connection.connectionId === connectionId) {\n return connection;\n }\n }\n\n return null;\n }\n\n private _delayedAbort(type: PeerErrorType, message: string | Error): void {\n setTimeout(() => {\n this._abort(type, message);\n }, 0);\n }\n\n /**\n * Emits an error message and destroys the Peer.\n * The Peer is not destroyed if it's in a disconnected state, in which case\n * it retains its disconnected state and its existing connections.\n */\n private _abort(type: PeerErrorType, message: string | Error): void {\n logger.error(\"Aborting!\");\n\n this.emitError(type, message);\n\n if (!this._lastServerId) {\n this.destroy();\n } else {\n this.disconnect();\n }\n }\n\n /** Emits a typed error message. */\n emitError(type: PeerErrorType, err: string | Error): void {\n logger.error(\"Error:\", err);\n\n let error: Error & { type?: PeerErrorType };\n\n if (typeof err === \"string\") {\n error = new Error(err);\n } else {\n error = err as Error;\n }\n\n error.type = type;\n\n this.emit(PeerEventType.Error, error);\n }\n\n /**\n * Destroys the Peer: closes all active connections as well as the connection\n * to the server.\n * Warning: The peer can no longer create or accept connections after being\n * destroyed.\n */\n destroy(): void {\n if (this.destroyed) {\n return;\n }\n\n logger.log(`Destroy peer with ID:${this.id}`);\n\n this.disconnect();\n this._cleanup();\n\n this._destroyed = true;\n\n this.emit(PeerEventType.Close);\n }\n\n /** Disconnects every connection on this peer. */\n private _cleanup(): void {\n for (let peerId of this._connections.keys()) {\n this._cleanupPeer(peerId);\n this._connections.delete(peerId);\n }\n\n this.socket.removeAllListeners();\n }\n\n /** Closes all connections to this peer. */\n private _cleanupPeer(peerId: string): void {\n const connections = this._connections.get(peerId);\n\n if (!connections) return;\n\n for (let connection of connections) {\n connection.close();\n }\n }\n\n /**\n * Disconnects the Peer's connection to the PeerServer. Does not close any\n * active connections.\n * Warning: The peer can no longer create or accept connections after being\n * disconnected. It also cannot reconnect to the server.\n */\n disconnect(): void {\n if (this.disconnected) {\n return;\n }\n\n const currentId = this.id;\n\n logger.log(`Disconnect peer with ID:${currentId}`);\n\n this._disconnected = true;\n this._open = false;\n\n this.socket.close();\n\n this._lastServerId = currentId;\n this._id = null;\n\n this.emit(PeerEventType.Disconnected, currentId);\n }\n\n /** Attempts to reconnect with the same ID. */\n reconnect(): void {\n if (this.disconnected && !this.destroyed) {\n logger.log(`Attempting reconnection to server with ID ${this._lastServerId}`);\n this._disconnected = false;\n this._initialize(this._lastServerId!);\n } else if (this.destroyed) {\n throw new Error(\"This peer cannot reconnect to the server. It has already been destroyed.\");\n } else if (!this.disconnected && !this.open) {\n // Do nothing. We're still connecting the first time.\n logger.error(\"In a hurry? We're still trying to make the initial connection!\");\n } else {\n throw new Error(`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`);\n }\n }\n\n /**\n * Get a list of available peer IDs. If you're running your own server, you'll\n * want to set allow_discovery: true in the PeerServer options. If you're using\n * the cloud server, email team@peerjs.com to get the functionality enabled for\n * your key.\n */\n listAllPeers(cb = (_: any[]) => { }): void {\n this._api.listAllPeers()\n .then(peers => cb(peers))\n .catch(error => this._abort(PeerErrorType.ServerError, error));\n }\n}\n","import { util } from \"./util\";\nimport { Peer } from \"./peer\";\n\nexport const peerjs = {\n Peer,\n util\n};\n\nexport default Peer;\n\n(window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(window).Peer = Peer;\n"]} \ No newline at end of file +{"version":3,"sources":["../node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","../node_modules/peerjs-js-binarypack/lib/binarypack.js","../node_modules/webrtc-adapter/src/js/utils.js","../node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","../node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","../node_modules/webrtc-adapter/src/js/edge/filtericeservers.js","../node_modules/sdp/sdp.js","../node_modules/rtcpeerconnection-shim/rtcpeerconnection.js","../node_modules/webrtc-adapter/src/js/edge/getusermedia.js","../node_modules/webrtc-adapter/src/js/edge/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/edge/edge_shim.js","../node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","../node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","../node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","../node_modules/webrtc-adapter/src/js/safari/safari_shim.js","../node_modules/webrtc-adapter/src/js/common_shim.js","../node_modules/webrtc-adapter/src/js/adapter_factory.js","../node_modules/webrtc-adapter/src/js/adapter_core.js","adapter.ts","supports.ts","util.ts","../node_modules/eventemitter3/index.js","logger.ts","enums.ts","socket.ts","negotiator.ts","baseconnection.ts","mediaconnection.ts","encodingQueue.ts","dataconnection.ts","api.ts","peer.ts","exports.ts"],"names":["logDisabled_","deprecationWarnings_","extractVersion","uastring","expr","pos","match","length","parseInt","wrapPeerConnectionEvent","window","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","get","delete","size","Object","keys","defineProperty","enumerable","configurable","disableLog","bool","Error","disableWarnings","log","console","deprecated","oldMethod","newMethod","warn","detectBrowser","result","browser","version","navigator","mozGetUserMedia","userAgent","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","RTCIceGatherer","mediaDevices","supportsUnifiedPlan","RTCRtpTransceiver","isObject","val","toString","call","compactObject","data","reduce","accumulator","key","isObj","value","isEmptyObject","undefined","assign","walkStats","stats","base","resultSet","id","forEach","name","endsWith","filterStats","track","outbound","streamStatsType","filteredResult","trackStats","type","trackIdentifier","push","trackStat","trackId","logging","utils","shimGetUserMedia","browserDetails","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","matches","getSupportedConstraints","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","message","constraint","constraintName","getUserMedia","onSuccess","onError","bind","origGetUserMedia","cs","stream","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","Promise","reject","shimGetDisplayMedia","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","shimMediaStream","MediaStream","webkitMediaStream","shimOnTrack","transceiver","receiver","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","event","Event","streams","dispatchEvent","shimGetSendersWithDtmf","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","shimGetStats","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","resolve","shimSenderReceiverGetStats","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","shimAddTrackRemoveTrackWithNative","getLocalStreams","_shimmedLocalStreams","streamId","alreadyExists","existingSenders","newSenders","newSender","shimAddTrackRemoveTrack","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","signalingState","t","oldStream","method","nativeMethod","methodObj","args","isLegacyCall","description","desc","replaceInternalStreamId","origSetLocalDescription","setLocalDescription","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","replaceExternalStreamId","origLocalDescription","getOwnPropertyDescriptor","streamid","shimPeerConnection","RTCIceCandidate","fixNegotiationNeeded","target","getConfiguration","sdpSemantics","filterIceServers","iceServers","edgeVersion","hasTurn","server","urls","url","isString","validTurn","startsWith","SDPUtils","require","fixStatsType","inboundrtp","outboundrtp","candidatepair","writeMediaSection","caps","dtlsRole","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","i","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","Math","rtcpFeedback","fb","j","parameter","lHeaderExtension","rHeaderExtension","uri","isActionAllowedInSignalingState","action","offer","answer","maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","makeError","code","NotSupportedError","InvalidAccessError","TypeError","OperationError","module","exports","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","config","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","generateSessionId","_sdpSessionVersion","_dtlsRole","_isClosed","onicecandidate","onaddstream","ontrack","onremovestream","onsignalingstatechange","oniceconnectionstatechange","onconnectionstatechange","onicegatheringstatechange","onnegotiationneeded","ondatachannel","_emitGatheringStateChange","getRemoteStreams","_createTransceiver","doNotAdd","hasBundleTransport","recvEncodingParameters","associatedRemoteMediaStreams","wantReceive","transports","_createIceAndDtlsTransports","_maybeFireNegotiationNeeded","clonedStream","clone","clonedTrack","enabled","_createIceGatherer","sdpMLineIndex","shift","writable","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","component","ufrag","usernameFragment","serializedCandidate","writeCandidate","parseCandidate","toJSON","sections","getMediaSections","getDescription","join","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","params","encodings","rtcp","cname","compound","rtcpParameters","p","receive","sessionpart","splitSections","mediaSection","parseRtpParameters","isIceLite","matchPrefix","isRejected","rejected","remoteIceParameters","getIceParameters","remoteDtlsParameters","getDtlsParameters","role","start","_updateSignalingState","receiverList","iceOptions","substr","split","lines","splitLines","getKind","direction","getDirection","remoteMsid","parseMsid","getMid","generateIdentifier","parseRtpEncodingParameters","parseRtcpParameters","isComplete","cands","setTransport","setRemoteCandidates","default","getCapabilities","codec","isNewTrack","nativeTrack","sid","item","close","newState","states","closed","checking","connected","completed","disconnected","failed","new","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","writeSessionBoilerplate","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","reducedSize","addIceCandidate","candidateString","trim","senderOrReceiver","promises","all","allStats","results","ortcObjectName","nativeGetstats","nativeStats","mapStats","methods","catch","origMSTEnabled","ev","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","shimReplaceTrack","replaceTrack","setTrack","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","preferredMediaSource","mediaSource","RTCTrackEvent","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","shimSenderGetStats","shimReceiverGetStats","shimRemoveStream","shimRTCDataChannel","DataChannel","RTCDataChannel","shimAddTransceiver","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","test","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","setParameters","shimGetParameters","origGetParameters","shimCreateOffer","origCreateOffer","finally","shimCreateAnswer","origCreateAnswer","shimLocalStreamsAPI","_localStreams","_addTrack","index","tracks","shimRemoteStreamsAPI","_remoteStreams","_onaddstream","_onaddstreampoly","shimCallbacksAPI","successCallback","failureCallback","options","promise","withCallback","_getUserMedia","shimConstraints","errcb","shimRTCIceServerUrls","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","hasOwnProperty","generateCertificate","shimTrackEventTransceiver","shimCreateOfferLegacy","audioTransceiver","getTransceivers","setDirection","videoTransceiver","shimAudioContext","AudioContext","webkitAudioContext","shimRTCIceCandidate","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","shimMaxMessageSize","_sctp","sctpInDescription","mLine","parseMLine","isFirefox","maxMessageSize","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","remoteMMS","getMaxMessageSize","Number","POSITIVE_INFINITY","sctp","shimSendThrowTypeError","origCreateDataChannel","createDataChannel","dataChannel","wrapDcSend","channel","dc","origDataChannelSend","byteLength","readyState","shimConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","removeExtmapAllowMixed","nativeSRD","line","shimAddIceCandidateNullOrEmpty","nativeAddIceCandidate","adapterFactory","shimChrome","shimFirefox","shimEdge","shimSafari","adapter","commonShim","chromeShim","browserShim","firefoxShim","edgeShim","safariShim"],"mappings":"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","file":"peerjs.min.js","sourceRoot":"..\\lib","sourcesContent":["var binaryFeatures = {};\r\nbinaryFeatures.useBlobBuilder = (function () {\r\n try {\r\n new Blob([]);\r\n return false;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nbinaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {\r\n try {\r\n return (new Blob([new Uint8Array([])])).size === 0;\r\n } catch (e) {\r\n return true;\r\n }\r\n})();\r\n\r\nmodule.exports.binaryFeatures = binaryFeatures;\r\nvar BlobBuilder = module.exports.BlobBuilder;\r\nif (typeof window !== 'undefined') {\r\n BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||\r\n window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;\r\n}\r\n\r\nfunction BufferBuilder () {\r\n this._pieces = [];\r\n this._parts = [];\r\n}\r\n\r\nBufferBuilder.prototype.append = function (data) {\r\n if (typeof data === 'number') {\r\n this._pieces.push(data);\r\n } else {\r\n this.flush();\r\n this._parts.push(data);\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.flush = function () {\r\n if (this._pieces.length > 0) {\r\n var buf = new Uint8Array(this._pieces);\r\n if (!binaryFeatures.useArrayBufferView) {\r\n buf = buf.buffer;\r\n }\r\n this._parts.push(buf);\r\n this._pieces = [];\r\n }\r\n};\r\n\r\nBufferBuilder.prototype.getBuffer = function () {\r\n this.flush();\r\n if (binaryFeatures.useBlobBuilder) {\r\n var builder = new BlobBuilder();\r\n for (var i = 0, ii = this._parts.length; i < ii; i++) {\r\n builder.append(this._parts[i]);\r\n }\r\n return builder.getBlob();\r\n } else {\r\n return new Blob(this._parts);\r\n }\r\n};\r\n\r\nmodule.exports.BufferBuilder = BufferBuilder;\r\n","var BufferBuilder = require('./bufferbuilder').BufferBuilder;\r\nvar binaryFeatures = require('./bufferbuilder').binaryFeatures;\r\n\r\nvar BinaryPack = {\r\n unpack: function (data) {\r\n var unpacker = new Unpacker(data);\r\n return unpacker.unpack();\r\n },\r\n pack: function (data) {\r\n var packer = new Packer();\r\n packer.pack(data);\r\n var buffer = packer.getBuffer();\r\n return buffer;\r\n }\r\n};\r\n\r\nmodule.exports = BinaryPack;\r\n\r\nfunction Unpacker (data) {\r\n // Data is ArrayBuffer\r\n this.index = 0;\r\n this.dataBuffer = data;\r\n this.dataView = new Uint8Array(this.dataBuffer);\r\n this.length = this.dataBuffer.byteLength;\r\n}\r\n\r\nUnpacker.prototype.unpack = function () {\r\n var type = this.unpack_uint8();\r\n if (type < 0x80) {\r\n return type;\r\n } else if ((type ^ 0xe0) < 0x20) {\r\n return (type ^ 0xe0) - 0x20;\r\n }\r\n\r\n var size;\r\n if ((size = type ^ 0xa0) <= 0x0f) {\r\n return this.unpack_raw(size);\r\n } else if ((size = type ^ 0xb0) <= 0x0f) {\r\n return this.unpack_string(size);\r\n } else if ((size = type ^ 0x90) <= 0x0f) {\r\n return this.unpack_array(size);\r\n } else if ((size = type ^ 0x80) <= 0x0f) {\r\n return this.unpack_map(size);\r\n }\r\n\r\n switch (type) {\r\n case 0xc0:\r\n return null;\r\n case 0xc1:\r\n return undefined;\r\n case 0xc2:\r\n return false;\r\n case 0xc3:\r\n return true;\r\n case 0xca:\r\n return this.unpack_float();\r\n case 0xcb:\r\n return this.unpack_double();\r\n case 0xcc:\r\n return this.unpack_uint8();\r\n case 0xcd:\r\n return this.unpack_uint16();\r\n case 0xce:\r\n return this.unpack_uint32();\r\n case 0xcf:\r\n return this.unpack_uint64();\r\n case 0xd0:\r\n return this.unpack_int8();\r\n case 0xd1:\r\n return this.unpack_int16();\r\n case 0xd2:\r\n return this.unpack_int32();\r\n case 0xd3:\r\n return this.unpack_int64();\r\n case 0xd4:\r\n return undefined;\r\n case 0xd5:\r\n return undefined;\r\n case 0xd6:\r\n return undefined;\r\n case 0xd7:\r\n return undefined;\r\n case 0xd8:\r\n size = this.unpack_uint16();\r\n return this.unpack_string(size);\r\n case 0xd9:\r\n size = this.unpack_uint32();\r\n return this.unpack_string(size);\r\n case 0xda:\r\n size = this.unpack_uint16();\r\n return this.unpack_raw(size);\r\n case 0xdb:\r\n size = this.unpack_uint32();\r\n return this.unpack_raw(size);\r\n case 0xdc:\r\n size = this.unpack_uint16();\r\n return this.unpack_array(size);\r\n case 0xdd:\r\n size = this.unpack_uint32();\r\n return this.unpack_array(size);\r\n case 0xde:\r\n size = this.unpack_uint16();\r\n return this.unpack_map(size);\r\n case 0xdf:\r\n size = this.unpack_uint32();\r\n return this.unpack_map(size);\r\n }\r\n};\r\n\r\nUnpacker.prototype.unpack_uint8 = function () {\r\n var byte = this.dataView[this.index] & 0xff;\r\n this.index++;\r\n return byte;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint16 = function () {\r\n var bytes = this.read(2);\r\n var uint16 =\r\n ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);\r\n this.index += 2;\r\n return uint16;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint32 = function () {\r\n var bytes = this.read(4);\r\n var uint32 =\r\n ((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3];\r\n this.index += 4;\r\n return uint32;\r\n};\r\n\r\nUnpacker.prototype.unpack_uint64 = function () {\r\n var bytes = this.read(8);\r\n var uint64 =\r\n ((((((bytes[0] * 256 +\r\n bytes[1]) * 256 +\r\n bytes[2]) * 256 +\r\n bytes[3]) * 256 +\r\n bytes[4]) * 256 +\r\n bytes[5]) * 256 +\r\n bytes[6]) * 256 +\r\n bytes[7];\r\n this.index += 8;\r\n return uint64;\r\n};\r\n\r\nUnpacker.prototype.unpack_int8 = function () {\r\n var uint8 = this.unpack_uint8();\r\n return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);\r\n};\r\n\r\nUnpacker.prototype.unpack_int16 = function () {\r\n var uint16 = this.unpack_uint16();\r\n return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);\r\n};\r\n\r\nUnpacker.prototype.unpack_int32 = function () {\r\n var uint32 = this.unpack_uint32();\r\n return (uint32 < Math.pow(2, 31)) ? uint32\r\n : uint32 - Math.pow(2, 32);\r\n};\r\n\r\nUnpacker.prototype.unpack_int64 = function () {\r\n var uint64 = this.unpack_uint64();\r\n return (uint64 < Math.pow(2, 63)) ? uint64\r\n : uint64 - Math.pow(2, 64);\r\n};\r\n\r\nUnpacker.prototype.unpack_raw = function (size) {\r\n if (this.length < this.index + size) {\r\n throw new Error('BinaryPackFailure: index is out of range' +\r\n ' ' + this.index + ' ' + size + ' ' + this.length);\r\n }\r\n var buf = this.dataBuffer.slice(this.index, this.index + size);\r\n this.index += size;\r\n\r\n // buf = util.bufferToString(buf);\r\n\r\n return buf;\r\n};\r\n\r\nUnpacker.prototype.unpack_string = function (size) {\r\n var bytes = this.read(size);\r\n var i = 0;\r\n var str = '';\r\n var c;\r\n var code;\r\n\r\n while (i < size) {\r\n c = bytes[i];\r\n if (c < 128) {\r\n str += String.fromCharCode(c);\r\n i++;\r\n } else if ((c ^ 0xc0) < 32) {\r\n code = ((c ^ 0xc0) << 6) | (bytes[i + 1] & 63);\r\n str += String.fromCharCode(code);\r\n i += 2;\r\n } else {\r\n code = ((c & 15) << 12) | ((bytes[i + 1] & 63) << 6) |\r\n (bytes[i + 2] & 63);\r\n str += String.fromCharCode(code);\r\n i += 3;\r\n }\r\n }\r\n\r\n this.index += size;\r\n return str;\r\n};\r\n\r\nUnpacker.prototype.unpack_array = function (size) {\r\n var objects = new Array(size);\r\n for (var i = 0; i < size; i++) {\r\n objects[i] = this.unpack();\r\n }\r\n return objects;\r\n};\r\n\r\nUnpacker.prototype.unpack_map = function (size) {\r\n var map = {};\r\n for (var i = 0; i < size; i++) {\r\n var key = this.unpack();\r\n var value = this.unpack();\r\n map[key] = value;\r\n }\r\n return map;\r\n};\r\n\r\nUnpacker.prototype.unpack_float = function () {\r\n var uint32 = this.unpack_uint32();\r\n var sign = uint32 >> 31;\r\n var exp = ((uint32 >> 23) & 0xff) - 127;\r\n var fraction = (uint32 & 0x7fffff) | 0x800000;\r\n return (sign === 0 ? 1 : -1) *\r\n fraction * Math.pow(2, exp - 23);\r\n};\r\n\r\nUnpacker.prototype.unpack_double = function () {\r\n var h32 = this.unpack_uint32();\r\n var l32 = this.unpack_uint32();\r\n var sign = h32 >> 31;\r\n var exp = ((h32 >> 20) & 0x7ff) - 1023;\r\n var hfrac = (h32 & 0xfffff) | 0x100000;\r\n var frac = hfrac * Math.pow(2, exp - 20) +\r\n l32 * Math.pow(2, exp - 52);\r\n return (sign === 0 ? 1 : -1) * frac;\r\n};\r\n\r\nUnpacker.prototype.read = function (length) {\r\n var j = this.index;\r\n if (j + length <= this.length) {\r\n return this.dataView.subarray(j, j + length);\r\n } else {\r\n throw new Error('BinaryPackFailure: read index out of range');\r\n }\r\n};\r\n\r\nfunction Packer () {\r\n this.bufferBuilder = new BufferBuilder();\r\n}\r\n\r\nPacker.prototype.getBuffer = function () {\r\n return this.bufferBuilder.getBuffer();\r\n};\r\n\r\nPacker.prototype.pack = function (value) {\r\n var type = typeof (value);\r\n if (type === 'string') {\r\n this.pack_string(value);\r\n } else if (type === 'number') {\r\n if (Math.floor(value) === value) {\r\n this.pack_integer(value);\r\n } else {\r\n this.pack_double(value);\r\n }\r\n } else if (type === 'boolean') {\r\n if (value === true) {\r\n this.bufferBuilder.append(0xc3);\r\n } else if (value === false) {\r\n this.bufferBuilder.append(0xc2);\r\n }\r\n } else if (type === 'undefined') {\r\n this.bufferBuilder.append(0xc0);\r\n } else if (type === 'object') {\r\n if (value === null) {\r\n this.bufferBuilder.append(0xc0);\r\n } else {\r\n var constructor = value.constructor;\r\n if (constructor == Array) {\r\n this.pack_array(value);\r\n } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {\r\n this.pack_bin(value);\r\n } else if (constructor == ArrayBuffer) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value));\r\n } else {\r\n this.pack_bin(value);\r\n }\r\n } else if ('BYTES_PER_ELEMENT' in value) {\r\n if (binaryFeatures.useArrayBufferView) {\r\n this.pack_bin(new Uint8Array(value.buffer));\r\n } else {\r\n this.pack_bin(value.buffer);\r\n }\r\n } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {\r\n this.pack_object(value);\r\n } else if (constructor == Date) {\r\n this.pack_string(value.toString());\r\n } else if (typeof value.toBinaryPack === 'function') {\r\n this.bufferBuilder.append(value.toBinaryPack());\r\n } else {\r\n throw new Error('Type \"' + constructor.toString() + '\" not yet supported');\r\n }\r\n }\r\n } else {\r\n throw new Error('Type \"' + type + '\" not yet supported');\r\n }\r\n this.bufferBuilder.flush();\r\n};\r\n\r\nPacker.prototype.pack_bin = function (blob) {\r\n var length = blob.length || blob.byteLength || blob.size;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xa0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xda);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdb);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(blob);\r\n};\r\n\r\nPacker.prototype.pack_string = function (str) {\r\n var length = utf8Length(str);\r\n\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0xb0 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xd8);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xd9);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n this.bufferBuilder.append(str);\r\n};\r\n\r\nPacker.prototype.pack_array = function (ary) {\r\n var length = ary.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x90 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xdc);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdd);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var i = 0; i < length; i++) {\r\n this.pack(ary[i]);\r\n }\r\n};\r\n\r\nPacker.prototype.pack_integer = function (num) {\r\n if (num >= -0x20 && num <= 0x7f) {\r\n this.bufferBuilder.append(num & 0xff);\r\n } else if (num >= 0x00 && num <= 0xff) {\r\n this.bufferBuilder.append(0xcc);\r\n this.pack_uint8(num);\r\n } else if (num >= -0x80 && num <= 0x7f) {\r\n this.bufferBuilder.append(0xd0);\r\n this.pack_int8(num);\r\n } else if (num >= 0x0000 && num <= 0xffff) {\r\n this.bufferBuilder.append(0xcd);\r\n this.pack_uint16(num);\r\n } else if (num >= -0x8000 && num <= 0x7fff) {\r\n this.bufferBuilder.append(0xd1);\r\n this.pack_int16(num);\r\n } else if (num >= 0x00000000 && num <= 0xffffffff) {\r\n this.bufferBuilder.append(0xce);\r\n this.pack_uint32(num);\r\n } else if (num >= -0x80000000 && num <= 0x7fffffff) {\r\n this.bufferBuilder.append(0xd2);\r\n this.pack_int32(num);\r\n } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xd3);\r\n this.pack_int64(num);\r\n } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {\r\n this.bufferBuilder.append(0xcf);\r\n this.pack_uint64(num);\r\n } else {\r\n throw new Error('Invalid integer');\r\n }\r\n};\r\n\r\nPacker.prototype.pack_double = function (num) {\r\n var sign = 0;\r\n if (num < 0) {\r\n sign = 1;\r\n num = -num;\r\n }\r\n var exp = Math.floor(Math.log(num) / Math.LN2);\r\n var frac0 = num / Math.pow(2, exp) - 1;\r\n var frac1 = Math.floor(frac0 * Math.pow(2, 52));\r\n var b32 = Math.pow(2, 32);\r\n var h32 = (sign << 31) | ((exp + 1023) << 20) |\r\n (frac1 / b32) & 0x0fffff;\r\n var l32 = frac1 % b32;\r\n this.bufferBuilder.append(0xcb);\r\n this.pack_int32(h32);\r\n this.pack_int32(l32);\r\n};\r\n\r\nPacker.prototype.pack_object = function (obj) {\r\n var keys = Object.keys(obj);\r\n var length = keys.length;\r\n if (length <= 0x0f) {\r\n this.pack_uint8(0x80 + length);\r\n } else if (length <= 0xffff) {\r\n this.bufferBuilder.append(0xde);\r\n this.pack_uint16(length);\r\n } else if (length <= 0xffffffff) {\r\n this.bufferBuilder.append(0xdf);\r\n this.pack_uint32(length);\r\n } else {\r\n throw new Error('Invalid length');\r\n }\r\n for (var prop in obj) {\r\n if (obj.hasOwnProperty(prop)) {\r\n this.pack(prop);\r\n this.pack(obj[prop]);\r\n }\r\n }\r\n};\r\n\r\nPacker.prototype.pack_uint8 = function (num) {\r\n this.bufferBuilder.append(num);\r\n};\r\n\r\nPacker.prototype.pack_uint16 = function (num) {\r\n this.bufferBuilder.append(num >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_uint32 = function (num) {\r\n var n = num & 0xffffffff;\r\n this.bufferBuilder.append((n & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((n & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((n & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((n & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_uint64 = function (num) {\r\n var high = num / Math.pow(2, 32);\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int8 = function (num) {\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int16 = function (num) {\r\n this.bufferBuilder.append((num & 0xff00) >> 8);\r\n this.bufferBuilder.append(num & 0xff);\r\n};\r\n\r\nPacker.prototype.pack_int32 = function (num) {\r\n this.bufferBuilder.append((num >>> 24) & 0xff);\r\n this.bufferBuilder.append((num & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((num & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((num & 0x000000ff));\r\n};\r\n\r\nPacker.prototype.pack_int64 = function (num) {\r\n var high = Math.floor(num / Math.pow(2, 32));\r\n var low = num % Math.pow(2, 32);\r\n this.bufferBuilder.append((high & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((high & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((high & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((high & 0x000000ff));\r\n this.bufferBuilder.append((low & 0xff000000) >>> 24);\r\n this.bufferBuilder.append((low & 0x00ff0000) >>> 16);\r\n this.bufferBuilder.append((low & 0x0000ff00) >>> 8);\r\n this.bufferBuilder.append((low & 0x000000ff));\r\n};\r\n\r\nfunction _utf8Replace (m) {\r\n var code = m.charCodeAt(0);\r\n\r\n if (code <= 0x7ff) return '00';\r\n if (code <= 0xffff) return '000';\r\n if (code <= 0x1fffff) return '0000';\r\n if (code <= 0x3ffffff) return '00000';\r\n return '000000';\r\n}\r\n\r\nfunction utf8Length (str) {\r\n if (str.length > 600) {\r\n // Blob method faster for large strings\r\n return (new Blob([str])).size;\r\n } else {\r\n return str.replace(/[^\\u0000-\\u007F]/g, _utf8Replace).length;\r\n }\r\n}\r\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection &&\n !window.RTCIceGatherer)) {\n // Chrome, Chromium, Webview, Opera.\n // Version matches Chrome/WebRTC version.\n // Chrome 74 removed webkitGetUserMedia on http as well so we need the\n // more complicated fallback to webkitRTCPeerConnection.\n result.browser = 'chrome';\n result.version = extractVersion(navigator.userAgent,\n /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (navigator.mediaDevices &&\n navigator.userAgent.match(/Edge\\/(\\d+).(\\d+)$/)) { // Edge.\n result.browser = 'edge';\n result.version = extractVersion(navigator.userAgent,\n /Edge\\/(\\d+).(\\d+)$/, 2);\n } else if (window.RTCPeerConnection &&\n navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) { // Safari.\n result.browser = 'safari';\n result.version = extractVersion(navigator.userAgent,\n /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window.RTCRtpTransceiver &&\n 'currentDirection' in window.RTCRtpTransceiver.prototype;\n } else { // Default fallthrough: not supported.\n result.browser = 'Not a supported browser.';\n return result;\n }\n\n return result;\n}\n\n/**\n * Checks if something is an object.\n *\n * @param {*} val The something you want to check.\n * @return true if val is an object, false otherwise.\n */\nfunction isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\n\n/**\n * Remove all empty objects and undefined values\n * from a nested object -- an enhanced and vanilla version\n * of Lodash's `compact`.\n */\nexport function compactObject(data) {\n if (!isObject(data)) {\n return data;\n }\n\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = isObject(data[key]);\n const value = isObj ? compactObject(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) {\n return accumulator;\n }\n return Object.assign(accumulator, {[key]: value});\n }, {});\n}\n\n/* iterates the stats graph recursively. */\nexport function walkStats(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) {\n return;\n }\n resultSet.set(base.id, base);\n Object.keys(base).forEach(name => {\n if (name.endsWith('Id')) {\n walkStats(stats, stats.get(base[name]), resultSet);\n } else if (name.endsWith('Ids')) {\n base[name].forEach(id => {\n walkStats(stats, stats.get(id), resultSet);\n });\n }\n });\n}\n\n/* filter getStats for a sender/receiver track. */\nexport function filterStats(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) {\n return filteredResult;\n }\n const trackStats = [];\n result.forEach(value => {\n if (value.type === 'track' &&\n value.trackIdentifier === track.id) {\n trackStats.push(value);\n }\n });\n trackStats.forEach(trackStat => {\n result.forEach(stats => {\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) {\n walkStats(result, stats, filteredResult);\n }\n });\n });\n return filteredResult;\n}\n\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\nconst logging = utils.log;\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n\n if (!navigator.mediaDevices) {\n return;\n }\n\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) {\n return c;\n }\n const cc = {};\n Object.keys(c).forEach(key => {\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') {\n return;\n }\n const r = (typeof c[key] === 'object') ? c[key] : {ideal: c[key]};\n if (r.exact !== undefined && typeof r.exact === 'number') {\n r.min = r.max = r.exact;\n }\n const oldname_ = function(prefix, name) {\n if (prefix) {\n return prefix + name.charAt(0).toUpperCase() + name.slice(1);\n }\n return (name === 'deviceId') ? 'sourceId' : name;\n };\n if (r.ideal !== undefined) {\n cc.optional = cc.optional || [];\n let oc = {};\n if (typeof r.ideal === 'number') {\n oc[oldname_('min', key)] = r.ideal;\n cc.optional.push(oc);\n oc = {};\n oc[oldname_('max', key)] = r.ideal;\n cc.optional.push(oc);\n } else {\n oc[oldname_('', key)] = r.ideal;\n cc.optional.push(oc);\n }\n }\n if (r.exact !== undefined && typeof r.exact !== 'number') {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_('', key)] = r.exact;\n } else {\n ['min', 'max'].forEach(mix => {\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n }\n });\n if (c.advanced) {\n cc.optional = (cc.optional || []).concat(c.advanced);\n }\n return cc;\n };\n\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) {\n return func(constraints);\n }\n constraints = JSON.parse(JSON.stringify(constraints));\n if (constraints && typeof constraints.audio === 'object') {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n constraints = JSON.parse(JSON.stringify(constraints));\n remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');\n remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');\n constraints.audio = constraintsToChrome_(constraints.audio);\n }\n if (constraints && typeof constraints.video === 'object') {\n // Shim facingMode for mobile & surface pro.\n let face = constraints.video.facingMode;\n face = face && ((typeof face === 'object') ? face : {ideal: face});\n const getSupportedFacingModeLies = browserDetails.version < 66;\n\n if ((face && (face.exact === 'user' || face.exact === 'environment' ||\n face.ideal === 'user' || face.ideal === 'environment')) &&\n !(navigator.mediaDevices.getSupportedConstraints &&\n navigator.mediaDevices.getSupportedConstraints().facingMode &&\n !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') {\n matches = ['back', 'rear'];\n } else if (face.exact === 'user' || face.ideal === 'user') {\n matches = ['front'];\n }\n if (matches) {\n // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices()\n .then(devices => {\n devices = devices.filter(d => d.kind === 'videoinput');\n let dev = devices.find(d => matches.some(match =>\n d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) {\n dev = devices[devices.length - 1]; // more likely the back cam\n }\n if (dev) {\n constraints.video.deviceId = face.exact ? {exact: dev.deviceId} :\n {ideal: dev.deviceId};\n }\n constraints.video = constraintsToChrome_(constraints.video);\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) {\n return e;\n }\n return {\n name: {\n PermissionDeniedError: 'NotAllowedError',\n PermissionDismissedError: 'NotAllowedError',\n InvalidStateError: 'NotAllowedError',\n DevicesNotFoundError: 'NotFoundError',\n ConstraintNotSatisfiedError: 'OverconstrainedError',\n TrackStartError: 'NotReadableError',\n MediaDeviceFailedDueToShutdown: 'NotAllowedError',\n MediaDeviceKillSwitchOn: 'NotAllowedError',\n TabCaptureError: 'AbortError',\n ScreenCaptureError: 'AbortError',\n DeviceCaptureError: 'AbortError'\n }[e.name] || e.name,\n message: e.message,\n constraint: e.constraint || e.constraintName,\n toString() {\n return this.name + (this.message && ': ') + this.message;\n }\n };\n };\n\n const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, c => {\n navigator.webkitGetUserMedia(c, onSuccess, e => {\n if (onError) {\n onError(shimError_(e));\n }\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\n\n // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia\n // function which returns a Promise, it does not accept spec-style\n // constraints.\n if (navigator.mediaDevices.getUserMedia) {\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(cs) {\n return shimConstraints_(cs, c => origGetUserMedia(c).then(stream => {\n if (c.audio && !stream.getAudioTracks().length ||\n c.video && !stream.getVideoTracks().length) {\n stream.getTracks().forEach(track => {\n track.stop();\n });\n throw new DOMException('', 'NotFoundError');\n }\n return stream;\n }, e => Promise.reject(shimError_(e))));\n };\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\nexport function shimGetDisplayMedia(window, getSourceId) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n // getSourceId is a function that returns a promise resolving with\n // the sourceId of the screen/window/tab to be shared.\n if (typeof getSourceId !== 'function') {\n console.error('shimGetDisplayMedia: getSourceId argument is not ' +\n 'a function');\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n return getSourceId(constraints)\n .then(sourceId => {\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video &&\n constraints.video.height;\n const frameRateSpecified = constraints.video &&\n constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) {\n constraints.video.mandatory.maxWidth = widthSpecified;\n }\n if (heightSpecified) {\n constraints.video.mandatory.maxHeight = heightSpecified;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\nimport * as utils from '../utils.js';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nexport function filterIceServers(iceServers, edgeVersion) {\n let hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(server => {\n if (server && (server.urls || server.url)) {\n let urls = server.urls || server.url;\n if (server.url && !server.urls) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n }\n const isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(url => {\n // filter STUN unconditionally.\n if (url.indexOf('stun:') === 0) {\n return false;\n }\n\n const validTurn = url.startsWith('turn') &&\n !url.startsWith('turn:[') &&\n url.includes('transport=udp');\n if (validTurn && !hasTurn) {\n hasTurn = true;\n return true;\n }\n return validTurn && !hasTurn;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nvar SDPUtils = {};\n\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\nSDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substr(2, 10);\n};\n\n// The RTCP CNAME used by all peerconnections from the same JS.\nSDPUtils.localCName = SDPUtils.generateIdentifier();\n\n// Splits SDP into lines, dealing with both CRLF and LF.\nSDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map(function(line) {\n return line.trim();\n });\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n var parts = blob.split('\\nm=');\n return parts.map(function(part, index) {\n return (index > 0 ? 'm=' + part : part).trim() + '\\r\\n';\n });\n};\n\n// returns the session description.\nSDPUtils.getDescription = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n var sections = SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n\n// Returns lines that start with a certain prefix.\nSDPUtils.matchPrefix = function(blob, prefix) {\n return SDPUtils.splitLines(blob).filter(function(line) {\n return line.indexOf(prefix) === 0;\n });\n};\n\n// Parses an ICE candidate line. Sample input:\n// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8\n// rport 55996\"\nSDPUtils.parseCandidate = function(line) {\n var parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) {\n parts = line.substring(12).split(' ');\n } else {\n parts = line.substring(10).split(' ');\n }\n\n var candidate = {\n foundation: parts[0],\n component: parseInt(parts[1], 10),\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4], // address is an alias for ip.\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n\n for (var i = 8; i < parts.length; i += 2) {\n switch (parts[i]) {\n case 'raddr':\n candidate.relatedAddress = parts[i + 1];\n break;\n case 'rport':\n candidate.relatedPort = parseInt(parts[i + 1], 10);\n break;\n case 'tcptype':\n candidate.tcpType = parts[i + 1];\n break;\n case 'ufrag':\n candidate.ufrag = parts[i + 1]; // for backward compability.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag\n candidate[parts[i]] = parts[i + 1];\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\nSDPUtils.writeCandidate = function(candidate) {\n var sdp = [];\n sdp.push(candidate.foundation);\n sdp.push(candidate.component);\n sdp.push(candidate.protocol.toUpperCase());\n sdp.push(candidate.priority);\n sdp.push(candidate.address || candidate.ip);\n sdp.push(candidate.port);\n\n var type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress &&\n candidate.relatedPort) {\n sdp.push('raddr');\n sdp.push(candidate.relatedAddress);\n sdp.push('rport');\n sdp.push(candidate.relatedPort);\n }\n if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {\n sdp.push('tcptype');\n sdp.push(candidate.tcpType);\n }\n if (candidate.usernameFragment || candidate.ufrag) {\n sdp.push('ufrag');\n sdp.push(candidate.usernameFragment || candidate.ufrag);\n }\n return 'candidate:' + sdp.join(' ');\n};\n\n// Parses an ice-options line, returns an array of option tags.\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substr(14).split(' ');\n};\n\n// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n var parts = line.substr(9).split(' ');\n var parsed = {\n payloadType: parseInt(parts.shift(), 10) // was: id\n };\n\n parts = parts[0].split('/');\n\n parsed.name = parts[0];\n parsed.clockRate = parseInt(parts[1], 10); // was: clockrate\n parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;\n // legacy alias, got renamed back to channels in ORTC.\n parsed.numChannels = parsed.channels;\n return parsed;\n};\n\n// Generate an a=rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n var channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +\n (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n\n// Parses an a=extmap line (headerextension from RFC 5285). Sample input:\n// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset\n// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset\nSDPUtils.parseExtmap = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n id: parseInt(parts[0], 10),\n direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',\n uri: parts[1]\n };\n};\n\n// Generates a=extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\nSDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +\n (headerExtension.direction && headerExtension.direction !== 'sendrecv'\n ? '/' + headerExtension.direction\n : '') +\n ' ' + headerExtension.uri + '\\r\\n';\n};\n\n// Parses an ftmp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\nSDPUtils.parseFmtp = function(line) {\n var parsed = {};\n var kv;\n var parts = line.substr(line.indexOf(' ') + 1).split(';');\n for (var j = 0; j < parts.length; j++) {\n kv = parts[j].trim().split('=');\n parsed[kv[0].trim()] = kv[1];\n }\n return parsed;\n};\n\n// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n var line = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n var params = [];\n Object.keys(codec.parameters).forEach(function(param) {\n if (codec.parameters[param]) {\n params.push(param + '=' + codec.parameters[param]);\n } else {\n params.push(param);\n }\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n\n// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n var parts = line.substr(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' ')\n };\n};\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n var lines = '';\n var pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) {\n // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach(function(fb) {\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +\n (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +\n '\\r\\n';\n });\n }\n return lines;\n};\n\n// Parses an RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n var sp = line.indexOf(' ');\n var parts = {\n ssrc: parseInt(line.substr(7, sp - 7), 10)\n };\n var colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substr(sp + 1, colon - sp - 1);\n parts.value = line.substr(colon + 1);\n } else {\n parts.attribute = line.substr(sp + 1);\n }\n return parts;\n};\n\nSDPUtils.parseSsrcGroup = function(line) {\n var parts = line.substr(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(function(ssrc) {\n return parseInt(ssrc, 10);\n })\n };\n};\n\n// Extracts the MID (RFC 5888) from a media section.\n// returns the MID or undefined if no mid line was found.\nSDPUtils.getMid = function(mediaSection) {\n var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substr(6);\n }\n};\n\nSDPUtils.parseFingerprint = function(line) {\n var parts = line.substr(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1]\n };\n};\n\n// Extracts DTLS parameters from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the fingerprint line as input. See also getIceParameters.\nSDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role.\n // Note2: 'algorithm' is not case sensitive except in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map(SDPUtils.parseFingerprint)\n };\n};\n\n// Serializes DTLS parameters to SDP.\nSDPUtils.writeDtlsParameters = function(params, setupType) {\n var sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(function(fp) {\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\nSDPUtils.parseCryptoLine = function(line) {\n var parts = line.substr(9).split(' ');\n return {\n tag: parseInt(parts[0], 10),\n cryptoSuite: parts[1],\n keyParams: parts[2],\n sessionParams: parts.slice(3),\n };\n};\n\nSDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' +\n parameters.cryptoSuite + ' ' +\n (typeof parameters.keyParams === 'object'\n ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)\n : parameters.keyParams) +\n (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +\n '\\r\\n';\n};\n\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\nSDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) {\n return null;\n }\n var parts = keyParams.substr(7).split('|');\n return {\n keyMethod: 'inline',\n keySalt: parts[0],\n lifeTime: parts[1],\n mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,\n mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,\n };\n};\n\nSDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':'\n + keyParams.keySalt +\n (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +\n (keyParams.mkiValue && keyParams.mkiLength\n ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength\n : '');\n};\n\n// Extracts all SDES paramters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=crypto:');\n return lines.map(SDPUtils.parseCryptoLine);\n};\n\n// Parses ICE information from SDP media section or sessionpart.\n// FIXME: for consistency with other functions this should only\n// get the ice-ufrag and ice-pwd lines as input.\nSDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substr(12),\n password: pwd.substr(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n return 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n var description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n var pt = mline[i];\n var rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n var codec = SDPUtils.parseRtpMap(rtpmapline);\n var fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n // FIXME: parse rtcp.\n return description;\n};\n\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\nSDPUtils.writeRtpDescription = function(kind, caps) {\n var sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' UDP/TLS/RTP/SAVPF ';\n sdp += caps.codecs.map(function(codec) {\n if (codec.preferredPayloadType !== undefined) {\n return codec.preferredPayloadType;\n }\n return codec.payloadType;\n }).join(' ') + '\\r\\n';\n\n sdp += 'c=IN IP4 0.0.0.0\\r\\n';\n sdp += 'a=rtcp:9 IN IP4 0.0.0.0\\r\\n';\n\n // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach(function(codec) {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n var maxptime = 0;\n caps.codecs.forEach(function(codec) {\n if (codec.maxptime > maxptime) {\n maxptime = codec.maxptime;\n }\n });\n if (maxptime > 0) {\n sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n }\n sdp += 'a=rtcp-mux\\r\\n';\n\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(function(extension) {\n sdp += SDPUtils.writeExtmap(extension);\n });\n }\n // FIXME: write fecMechanisms.\n return sdp;\n};\n\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\nSDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n var encodingParameters = [];\n var description = SDPUtils.parseRtpParameters(mediaSection);\n var hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(parts) {\n return parts.attribute === 'cname';\n });\n var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n var secondarySsrc;\n\n var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(function(line) {\n var parts = line.substr(17).split(' ');\n return parts.map(function(part) {\n return parseInt(part, 10);\n });\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {\n secondarySsrc = flows[0][1];\n }\n\n description.codecs.forEach(function(codec) {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n var encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) {\n encParam.rtx = {ssrc: secondarySsrc};\n }\n encodingParameters.push(encParam);\n if (hasRed) {\n encParam = JSON.parse(JSON.stringify(encParam));\n encParam.fec = {\n ssrc: primarySsrc,\n mechanism: hasUlpfec ? 'red+ulpfec' : 'red'\n };\n encodingParameters.push(encParam);\n }\n }\n });\n if (encodingParameters.length === 0 && primarySsrc) {\n encodingParameters.push({\n ssrc: primarySsrc\n });\n }\n\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substr(7), 10);\n } else if (bandwidth[0].indexOf('b=AS:') === 0) {\n // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(function(params) {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n var rtcpParameters = {};\n\n // Gets the first SSRC. Note tha with RTX there might be multiple\n // SSRCs.\n var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(obj) {\n return obj.attribute === 'cname';\n })[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\nSDPUtils.parseMsid = function(mediaSection) {\n var parts;\n var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substr(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(function(line) {\n return SDPUtils.parseSsrcMedia(line);\n })\n .filter(function(msidParts) {\n return msidParts.attribute === 'msid';\n });\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n};\n\n// SCTP\n// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back\n// to draft-ietf-mmusic-sctp-sdp-05\nSDPUtils.parseSctpDescription = function(mediaSection) {\n var mline = SDPUtils.parseMLine(mediaSection);\n var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n var maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substr(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n }\n var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]\n .substr(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\n };\n }\n};\n\n// SCTP\n// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers\n// support by now receiving in this format, unless we originally parsed\n// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line\n// protocol of DTLS/SCTP -- without UDP/ or TCP/)\nSDPUtils.writeSctpDescription = function(media, sctp) {\n var output = [];\n if (media.protocol !== 'DTLS/SCTP') {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctp-port:' + sctp.port + '\\r\\n'\n ];\n } else {\n output = [\n 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\\r\\n',\n 'c=IN IP4 0.0.0.0\\r\\n',\n 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\\r\\n'\n ];\n }\n if (sctp.maxMessageSize !== undefined) {\n output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n }\n return output.join('');\n};\n\n// Generate a session ID for SDP.\n// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1\n// recommends using a cryptographically random +ve 64-bit value\n// but right now this should be acceptable and within the right range\nSDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 21);\n};\n\n// Write boilder plate for start of SDP\n// sessId argument is optional - if not supplied it will\n// be generated randomly\n// sessVersion is optional and defaults to 2\n// sessUser is optional and defaults to 'thisisadapterortc'\nSDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n var sessionId;\n var version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n var user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return 'v=0\\r\\n' +\n 'o=' + user + ' ' + sessionId + ' ' + version +\n ' IN IP4 127.0.0.1\\r\\n' +\n 's=-\\r\\n' +\n 't=0 0\\r\\n';\n};\n\nSDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.direction) {\n sdp += 'a=' + transceiver.direction + '\\r\\n';\n } else if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n // spec.\n var msid = 'msid:' + stream.id + ' ' +\n transceiver.rtpSender.track.id + '\\r\\n';\n sdp += 'a=' + msid;\n\n // for Chrome.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n};\n\n// Gets the direction from the mediaSection or the sessionpart.\nSDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n var lines = SDPUtils.splitLines(mediaSection);\n for (var i = 0; i < lines.length; i++) {\n switch (lines[i]) {\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substr(2);\n default:\n // FIXME: What should happen here?\n }\n }\n if (sessionpart) {\n return SDPUtils.getDirection(sessionpart);\n }\n return 'sendrecv';\n};\n\nSDPUtils.getKind = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var mline = lines[0].split(' ');\n return mline[0].substr(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n var lines = SDPUtils.splitLines(mediaSection);\n var parts = lines[0].substr(2).split(' ');\n return {\n kind: parts[0],\n port: parseInt(parts[1], 10),\n protocol: parts[2],\n fmt: parts.slice(3).join(' ')\n };\n};\n\nSDPUtils.parseOLine = function(mediaSection) {\n var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n var parts = line.substr(2).split(' ');\n return {\n username: parts[0],\n sessionId: parts[1],\n sessionVersion: parseInt(parts[2], 10),\n netType: parts[3],\n addressType: parts[4],\n address: parts[5]\n };\n};\n\n// a very naive interpretation of a valid SDP.\nSDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) {\n return false;\n }\n var lines = SDPUtils.splitLines(blob);\n for (var i = 0; i < lines.length; i++) {\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {\n return false;\n }\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n\n// Expose public methods.\nif (typeof module === 'object') {\n module.exports = SDPUtils;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nvar SDPUtils = require('sdp');\n\nfunction fixStatsType(stat) {\n return {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[stat.type] || stat.type;\n}\n\nfunction writeMediaSection(transceiver, caps, type, stream, dtlsRole) {\n var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);\n\n // Map ICE parameters (ufrag, pwd) to SDP.\n sdp += SDPUtils.writeIceParameters(\n transceiver.iceGatherer.getLocalParameters());\n\n // Map DTLS parameters to SDP.\n sdp += SDPUtils.writeDtlsParameters(\n transceiver.dtlsTransport.getLocalParameters(),\n type === 'offer' ? 'actpass' : dtlsRole || 'active');\n\n sdp += 'a=mid:' + transceiver.mid + '\\r\\n';\n\n if (transceiver.rtpSender && transceiver.rtpReceiver) {\n sdp += 'a=sendrecv\\r\\n';\n } else if (transceiver.rtpSender) {\n sdp += 'a=sendonly\\r\\n';\n } else if (transceiver.rtpReceiver) {\n sdp += 'a=recvonly\\r\\n';\n } else {\n sdp += 'a=inactive\\r\\n';\n }\n\n if (transceiver.rtpSender) {\n var trackId = transceiver.rtpSender._initialTrackId ||\n transceiver.rtpSender.track.id;\n transceiver.rtpSender._initialTrackId = trackId;\n // spec.\n var msid = 'msid:' + (stream ? stream.id : '-') + ' ' +\n trackId + '\\r\\n';\n sdp += 'a=' + msid;\n // for Chrome. Legacy should no longer be required.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' ' + msid;\n\n // RTX\n if (transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' ' + msid;\n sdp += 'a=ssrc-group:FID ' +\n transceiver.sendEncodingParameters[0].ssrc + ' ' +\n transceiver.sendEncodingParameters[0].rtx.ssrc +\n '\\r\\n';\n }\n }\n // FIXME: this should be written by writeRtpDescription.\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {\n sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +\n ' cname:' + SDPUtils.localCName + '\\r\\n';\n }\n return sdp;\n}\n\n// Edge does not like\n// 1) stun: filtered after 14393 unless ?transport=udp is present\n// 2) turn: that does not have all of turn:host:port?transport=udp\n// 3) turn: with ipv6 addresses\n// 4) turn: occurring muliple times\nfunction filterIceServers(iceServers, edgeVersion) {\n var hasTurn = false;\n iceServers = JSON.parse(JSON.stringify(iceServers));\n return iceServers.filter(function(server) {\n if (server && (server.urls || server.url)) {\n var urls = server.urls || server.url;\n if (server.url && !server.urls) {\n console.warn('RTCIceServer.url is deprecated! Use urls instead.');\n }\n var isString = typeof urls === 'string';\n if (isString) {\n urls = [urls];\n }\n urls = urls.filter(function(url) {\n var validTurn = url.indexOf('turn:') === 0 &&\n url.indexOf('transport=udp') !== -1 &&\n url.indexOf('turn:[') === -1 &&\n !hasTurn;\n\n if (validTurn) {\n hasTurn = true;\n return true;\n }\n return url.indexOf('stun:') === 0 && edgeVersion >= 14393 &&\n url.indexOf('?transport=udp') === -1;\n });\n\n delete server.url;\n server.urls = isString ? urls[0] : urls;\n return !!urls.length;\n }\n });\n}\n\n// Determines the intersection of local and remote capabilities.\nfunction getCommonCapabilities(localCapabilities, remoteCapabilities) {\n var commonCapabilities = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: []\n };\n\n var findCodecByPayloadType = function(pt, codecs) {\n pt = parseInt(pt, 10);\n for (var i = 0; i < codecs.length; i++) {\n if (codecs[i].payloadType === pt ||\n codecs[i].preferredPayloadType === pt) {\n return codecs[i];\n }\n }\n };\n\n var rtxCapabilityMatches = function(lRtx, rRtx, lCodecs, rCodecs) {\n var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);\n var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);\n return lCodec && rCodec &&\n lCodec.name.toLowerCase() === rCodec.name.toLowerCase();\n };\n\n localCapabilities.codecs.forEach(function(lCodec) {\n for (var i = 0; i < remoteCapabilities.codecs.length; i++) {\n var rCodec = remoteCapabilities.codecs[i];\n if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() &&\n lCodec.clockRate === rCodec.clockRate) {\n if (lCodec.name.toLowerCase() === 'rtx' &&\n lCodec.parameters && rCodec.parameters.apt) {\n // for RTX we need to find the local rtx that has a apt\n // which points to the same local codec as the remote one.\n if (!rtxCapabilityMatches(lCodec, rCodec,\n localCapabilities.codecs, remoteCapabilities.codecs)) {\n continue;\n }\n }\n rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy\n // number of channels is the highest common number of channels\n rCodec.numChannels = Math.min(lCodec.numChannels,\n rCodec.numChannels);\n // push rCodec so we reply with offerer payload type\n commonCapabilities.codecs.push(rCodec);\n\n // determine common feedback mechanisms\n rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function(fb) {\n for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {\n if (lCodec.rtcpFeedback[j].type === fb.type &&\n lCodec.rtcpFeedback[j].parameter === fb.parameter) {\n return true;\n }\n }\n return false;\n });\n // FIXME: also need to determine .parameters\n // see https://github.com/openpeer/ortc/issues/569\n break;\n }\n }\n });\n\n localCapabilities.headerExtensions.forEach(function(lHeaderExtension) {\n for (var i = 0; i < remoteCapabilities.headerExtensions.length;\n i++) {\n var rHeaderExtension = remoteCapabilities.headerExtensions[i];\n if (lHeaderExtension.uri === rHeaderExtension.uri) {\n commonCapabilities.headerExtensions.push(rHeaderExtension);\n break;\n }\n }\n });\n\n // FIXME: fecMechanisms\n return commonCapabilities;\n}\n\n// is action=setLocalDescription with type allowed in signalingState\nfunction isActionAllowedInSignalingState(action, type, signalingState) {\n return {\n offer: {\n setLocalDescription: ['stable', 'have-local-offer'],\n setRemoteDescription: ['stable', 'have-remote-offer']\n },\n answer: {\n setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],\n setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']\n }\n }[type][action].indexOf(signalingState) !== -1;\n}\n\nfunction maybeAddCandidate(iceTransport, candidate) {\n // Edge's internal representation adds some fields therefore\n // not all fieldѕ are taken into account.\n var alreadyAdded = iceTransport.getRemoteCandidates()\n .find(function(remoteCandidate) {\n return candidate.foundation === remoteCandidate.foundation &&\n candidate.ip === remoteCandidate.ip &&\n candidate.port === remoteCandidate.port &&\n candidate.priority === remoteCandidate.priority &&\n candidate.protocol === remoteCandidate.protocol &&\n candidate.type === remoteCandidate.type;\n });\n if (!alreadyAdded) {\n iceTransport.addRemoteCandidate(candidate);\n }\n return !alreadyAdded;\n}\n\n\nfunction makeError(name, description) {\n var e = new Error(description);\n e.name = name;\n // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names\n e.code = {\n NotSupportedError: 9,\n InvalidStateError: 11,\n InvalidAccessError: 15,\n TypeError: undefined,\n OperationError: undefined\n }[name];\n return e;\n}\n\nmodule.exports = function(window, edgeVersion) {\n // https://w3c.github.io/mediacapture-main/#mediastream\n // Helper function to add the track to the stream and\n // dispatch the event ourselves.\n function addTrackToStreamAndFireEvent(track, stream) {\n stream.addTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack',\n {track: track}));\n }\n\n function removeTrackFromStreamAndFireEvent(track, stream) {\n stream.removeTrack(track);\n stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack',\n {track: track}));\n }\n\n function fireAddTrack(pc, track, receiver, streams) {\n var trackEvent = new Event('track');\n trackEvent.track = track;\n trackEvent.receiver = receiver;\n trackEvent.transceiver = {receiver: receiver};\n trackEvent.streams = streams;\n window.setTimeout(function() {\n pc._dispatchEvent('track', trackEvent);\n });\n }\n\n var RTCPeerConnection = function(config) {\n var pc = this;\n\n var _eventTarget = document.createDocumentFragment();\n ['addEventListener', 'removeEventListener', 'dispatchEvent']\n .forEach(function(method) {\n pc[method] = _eventTarget[method].bind(_eventTarget);\n });\n\n this.canTrickleIceCandidates = null;\n\n this.needNegotiation = false;\n\n this.localStreams = [];\n this.remoteStreams = [];\n\n this._localDescription = null;\n this._remoteDescription = null;\n\n this.signalingState = 'stable';\n this.iceConnectionState = 'new';\n this.connectionState = 'new';\n this.iceGatheringState = 'new';\n\n config = JSON.parse(JSON.stringify(config || {}));\n\n this.usingBundle = config.bundlePolicy === 'max-bundle';\n if (config.rtcpMuxPolicy === 'negotiate') {\n throw(makeError('NotSupportedError',\n 'rtcpMuxPolicy \\'negotiate\\' is not supported'));\n } else if (!config.rtcpMuxPolicy) {\n config.rtcpMuxPolicy = 'require';\n }\n\n switch (config.iceTransportPolicy) {\n case 'all':\n case 'relay':\n break;\n default:\n config.iceTransportPolicy = 'all';\n break;\n }\n\n switch (config.bundlePolicy) {\n case 'balanced':\n case 'max-compat':\n case 'max-bundle':\n break;\n default:\n config.bundlePolicy = 'balanced';\n break;\n }\n\n config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);\n\n this._iceGatherers = [];\n if (config.iceCandidatePoolSize) {\n for (var i = config.iceCandidatePoolSize; i > 0; i--) {\n this._iceGatherers.push(new window.RTCIceGatherer({\n iceServers: config.iceServers,\n gatherPolicy: config.iceTransportPolicy\n }));\n }\n } else {\n config.iceCandidatePoolSize = 0;\n }\n\n this._config = config;\n\n // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...\n // everything that is needed to describe a SDP m-line.\n this.transceivers = [];\n\n this._sdpSessionId = SDPUtils.generateSessionId();\n this._sdpSessionVersion = 0;\n\n this._dtlsRole = undefined; // role for a=setup to use in answers.\n\n this._isClosed = false;\n };\n\n Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {\n configurable: true,\n get: function() {\n return this._localDescription;\n }\n });\n Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {\n configurable: true,\n get: function() {\n return this._remoteDescription;\n }\n });\n\n // set up event handlers on prototype\n RTCPeerConnection.prototype.onicecandidate = null;\n RTCPeerConnection.prototype.onaddstream = null;\n RTCPeerConnection.prototype.ontrack = null;\n RTCPeerConnection.prototype.onremovestream = null;\n RTCPeerConnection.prototype.onsignalingstatechange = null;\n RTCPeerConnection.prototype.oniceconnectionstatechange = null;\n RTCPeerConnection.prototype.onconnectionstatechange = null;\n RTCPeerConnection.prototype.onicegatheringstatechange = null;\n RTCPeerConnection.prototype.onnegotiationneeded = null;\n RTCPeerConnection.prototype.ondatachannel = null;\n\n RTCPeerConnection.prototype._dispatchEvent = function(name, event) {\n if (this._isClosed) {\n return;\n }\n this.dispatchEvent(event);\n if (typeof this['on' + name] === 'function') {\n this['on' + name](event);\n }\n };\n\n RTCPeerConnection.prototype._emitGatheringStateChange = function() {\n var event = new Event('icegatheringstatechange');\n this._dispatchEvent('icegatheringstatechange', event);\n };\n\n RTCPeerConnection.prototype.getConfiguration = function() {\n return this._config;\n };\n\n RTCPeerConnection.prototype.getLocalStreams = function() {\n return this.localStreams;\n };\n\n RTCPeerConnection.prototype.getRemoteStreams = function() {\n return this.remoteStreams;\n };\n\n // internal helper to create a transceiver object.\n // (which is not yet the same as the WebRTC 1.0 transceiver)\n RTCPeerConnection.prototype._createTransceiver = function(kind, doNotAdd) {\n var hasBundleTransport = this.transceivers.length > 0;\n var transceiver = {\n track: null,\n iceGatherer: null,\n iceTransport: null,\n dtlsTransport: null,\n localCapabilities: null,\n remoteCapabilities: null,\n rtpSender: null,\n rtpReceiver: null,\n kind: kind,\n mid: null,\n sendEncodingParameters: null,\n recvEncodingParameters: null,\n stream: null,\n associatedRemoteMediaStreams: [],\n wantReceive: true\n };\n if (this.usingBundle && hasBundleTransport) {\n transceiver.iceTransport = this.transceivers[0].iceTransport;\n transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;\n } else {\n var transports = this._createIceAndDtlsTransports();\n transceiver.iceTransport = transports.iceTransport;\n transceiver.dtlsTransport = transports.dtlsTransport;\n }\n if (!doNotAdd) {\n this.transceivers.push(transceiver);\n }\n return transceiver;\n };\n\n RTCPeerConnection.prototype.addTrack = function(track, stream) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call addTrack on a closed peerconnection.');\n }\n\n var alreadyExists = this.transceivers.find(function(s) {\n return s.track === track;\n });\n\n if (alreadyExists) {\n throw makeError('InvalidAccessError', 'Track already exists.');\n }\n\n var transceiver;\n for (var i = 0; i < this.transceivers.length; i++) {\n if (!this.transceivers[i].track &&\n this.transceivers[i].kind === track.kind) {\n transceiver = this.transceivers[i];\n }\n }\n if (!transceiver) {\n transceiver = this._createTransceiver(track.kind);\n }\n\n this._maybeFireNegotiationNeeded();\n\n if (this.localStreams.indexOf(stream) === -1) {\n this.localStreams.push(stream);\n }\n\n transceiver.track = track;\n transceiver.stream = stream;\n transceiver.rtpSender = new window.RTCRtpSender(track,\n transceiver.dtlsTransport);\n return transceiver.rtpSender;\n };\n\n RTCPeerConnection.prototype.addStream = function(stream) {\n var pc = this;\n if (edgeVersion >= 15025) {\n stream.getTracks().forEach(function(track) {\n pc.addTrack(track, stream);\n });\n } else {\n // Clone is necessary for local demos mostly, attaching directly\n // to two different senders does not work (build 10547).\n // Fixed in 15025 (or earlier)\n var clonedStream = stream.clone();\n stream.getTracks().forEach(function(track, idx) {\n var clonedTrack = clonedStream.getTracks()[idx];\n track.addEventListener('enabled', function(event) {\n clonedTrack.enabled = event.enabled;\n });\n });\n clonedStream.getTracks().forEach(function(track) {\n pc.addTrack(track, clonedStream);\n });\n }\n };\n\n RTCPeerConnection.prototype.removeTrack = function(sender) {\n if (this._isClosed) {\n throw makeError('InvalidStateError',\n 'Attempted to call removeTrack on a closed peerconnection.');\n }\n\n if (!(sender instanceof window.RTCRtpSender)) {\n throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.');\n }\n\n var transceiver = this.transceivers.find(function(t) {\n return t.rtpSender === sender;\n });\n\n if (!transceiver) {\n throw makeError('InvalidAccessError',\n 'Sender was not created by this connection.');\n }\n var stream = transceiver.stream;\n\n transceiver.rtpSender.stop();\n transceiver.rtpSender = null;\n transceiver.track = null;\n transceiver.stream = null;\n\n // remove the stream from the set of local streams\n var localStreams = this.transceivers.map(function(t) {\n return t.stream;\n });\n if (localStreams.indexOf(stream) === -1 &&\n this.localStreams.indexOf(stream) > -1) {\n this.localStreams.splice(this.localStreams.indexOf(stream), 1);\n }\n\n this._maybeFireNegotiationNeeded();\n };\n\n RTCPeerConnection.prototype.removeStream = function(stream) {\n var pc = this;\n stream.getTracks().forEach(function(track) {\n var sender = pc.getSenders().find(function(s) {\n return s.track === track;\n });\n if (sender) {\n pc.removeTrack(sender);\n }\n });\n };\n\n RTCPeerConnection.prototype.getSenders = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpSender;\n })\n .map(function(transceiver) {\n return transceiver.rtpSender;\n });\n };\n\n RTCPeerConnection.prototype.getReceivers = function() {\n return this.transceivers.filter(function(transceiver) {\n return !!transceiver.rtpReceiver;\n })\n .map(function(transceiver) {\n return transceiver.rtpReceiver;\n });\n };\n\n\n RTCPeerConnection.prototype._createIceGatherer = function(sdpMLineIndex,\n usingBundle) {\n var pc = this;\n if (usingBundle && sdpMLineIndex > 0) {\n return this.transceivers[0].iceGatherer;\n } else if (this._iceGatherers.length) {\n return this._iceGatherers.shift();\n }\n var iceGatherer = new window.RTCIceGatherer({\n iceServers: this._config.iceServers,\n gatherPolicy: this._config.iceTransportPolicy\n });\n Object.defineProperty(iceGatherer, 'state',\n {value: 'new', writable: true}\n );\n\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];\n this.transceivers[sdpMLineIndex].bufferCandidates = function(event) {\n var end = !event.candidate || Object.keys(event.candidate).length === 0;\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n iceGatherer.state = end ? 'completed' : 'gathering';\n if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {\n pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);\n }\n };\n iceGatherer.addEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n return iceGatherer;\n };\n\n // start gathering from an RTCIceGatherer.\n RTCPeerConnection.prototype._gather = function(mid, sdpMLineIndex) {\n var pc = this;\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer.onlocalcandidate) {\n return;\n }\n var bufferedCandidateEvents =\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents;\n this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;\n iceGatherer.removeEventListener('localcandidate',\n this.transceivers[sdpMLineIndex].bufferCandidates);\n iceGatherer.onlocalcandidate = function(evt) {\n if (pc.usingBundle && sdpMLineIndex > 0) {\n // if we know that we use bundle we can drop candidates with\n // ѕdpMLineIndex > 0. If we don't do this then our state gets\n // confused since we dispose the extra ice gatherer.\n return;\n }\n var event = new Event('icecandidate');\n event.candidate = {sdpMid: mid, sdpMLineIndex: sdpMLineIndex};\n\n var cand = evt.candidate;\n // Edge emits an empty object for RTCIceCandidateComplete‥\n var end = !cand || Object.keys(cand).length === 0;\n if (end) {\n // polyfill since RTCIceGatherer.state is not implemented in\n // Edge 10547 yet.\n if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {\n iceGatherer.state = 'completed';\n }\n } else {\n if (iceGatherer.state === 'new') {\n iceGatherer.state = 'gathering';\n }\n // RTCIceCandidate doesn't have a component, needs to be added\n cand.component = 1;\n // also the usernameFragment. TODO: update SDP to take both variants.\n cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;\n\n var serializedCandidate = SDPUtils.writeCandidate(cand);\n event.candidate = Object.assign(event.candidate,\n SDPUtils.parseCandidate(serializedCandidate));\n\n event.candidate.candidate = serializedCandidate;\n event.candidate.toJSON = function() {\n return {\n candidate: event.candidate.candidate,\n sdpMid: event.candidate.sdpMid,\n sdpMLineIndex: event.candidate.sdpMLineIndex,\n usernameFragment: event.candidate.usernameFragment\n };\n };\n }\n\n // update local description.\n var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);\n if (!end) {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=' + event.candidate.candidate + '\\r\\n';\n } else {\n sections[event.candidate.sdpMLineIndex] +=\n 'a=end-of-candidates\\r\\n';\n }\n pc._localDescription.sdp =\n SDPUtils.getDescription(pc._localDescription.sdp) +\n sections.join('');\n var complete = pc.transceivers.every(function(transceiver) {\n return transceiver.iceGatherer &&\n transceiver.iceGatherer.state === 'completed';\n });\n\n if (pc.iceGatheringState !== 'gathering') {\n pc.iceGatheringState = 'gathering';\n pc._emitGatheringStateChange();\n }\n\n // Emit candidate. Also emit null candidate when all gatherers are\n // complete.\n if (!end) {\n pc._dispatchEvent('icecandidate', event);\n }\n if (complete) {\n pc._dispatchEvent('icecandidate', new Event('icecandidate'));\n pc.iceGatheringState = 'complete';\n pc._emitGatheringStateChange();\n }\n };\n\n // emit already gathered candidates.\n window.setTimeout(function() {\n bufferedCandidateEvents.forEach(function(e) {\n iceGatherer.onlocalcandidate(e);\n });\n }, 0);\n };\n\n // Create ICE transport and DTLS transport.\n RTCPeerConnection.prototype._createIceAndDtlsTransports = function() {\n var pc = this;\n var iceTransport = new window.RTCIceTransport(null);\n iceTransport.onicestatechange = function() {\n pc._updateIceConnectionState();\n pc._updateConnectionState();\n };\n\n var dtlsTransport = new window.RTCDtlsTransport(iceTransport);\n dtlsTransport.ondtlsstatechange = function() {\n pc._updateConnectionState();\n };\n dtlsTransport.onerror = function() {\n // onerror does not set state to failed by itself.\n Object.defineProperty(dtlsTransport, 'state',\n {value: 'failed', writable: true});\n pc._updateConnectionState();\n };\n\n return {\n iceTransport: iceTransport,\n dtlsTransport: dtlsTransport\n };\n };\n\n // Destroy ICE gatherer, ICE transport and DTLS transport.\n // Without triggering the callbacks.\n RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function(\n sdpMLineIndex) {\n var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;\n if (iceGatherer) {\n delete iceGatherer.onlocalcandidate;\n delete this.transceivers[sdpMLineIndex].iceGatherer;\n }\n var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;\n if (iceTransport) {\n delete iceTransport.onicestatechange;\n delete this.transceivers[sdpMLineIndex].iceTransport;\n }\n var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;\n if (dtlsTransport) {\n delete dtlsTransport.ondtlsstatechange;\n delete dtlsTransport.onerror;\n delete this.transceivers[sdpMLineIndex].dtlsTransport;\n }\n };\n\n // Start the RTP Sender and Receiver for a transceiver.\n RTCPeerConnection.prototype._transceive = function(transceiver,\n send, recv) {\n var params = getCommonCapabilities(transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n if (send && transceiver.rtpSender) {\n params.encodings = transceiver.sendEncodingParameters;\n params.rtcp = {\n cname: SDPUtils.localCName,\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.recvEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;\n }\n transceiver.rtpSender.send(params);\n }\n if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {\n // remove RTX field in Edge 14942\n if (transceiver.kind === 'video'\n && transceiver.recvEncodingParameters\n && edgeVersion < 15019) {\n transceiver.recvEncodingParameters.forEach(function(p) {\n delete p.rtx;\n });\n }\n if (transceiver.recvEncodingParameters.length) {\n params.encodings = transceiver.recvEncodingParameters;\n } else {\n params.encodings = [{}];\n }\n params.rtcp = {\n compound: transceiver.rtcpParameters.compound\n };\n if (transceiver.rtcpParameters.cname) {\n params.rtcp.cname = transceiver.rtcpParameters.cname;\n }\n if (transceiver.sendEncodingParameters.length) {\n params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;\n }\n transceiver.rtpReceiver.receive(params);\n }\n };\n\n RTCPeerConnection.prototype.setLocalDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setLocalDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set local ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var sections;\n var sessionpart;\n if (description.type === 'offer') {\n // VERY limited support for SDP munging. Limited to:\n // * changing the order of codecs\n sections = SDPUtils.splitSections(description.sdp);\n sessionpart = sections.shift();\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var caps = SDPUtils.parseRtpParameters(mediaSection);\n pc.transceivers[sdpMLineIndex].localCapabilities = caps;\n });\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n });\n } else if (description.type === 'answer') {\n sections = SDPUtils.splitSections(pc._remoteDescription.sdp);\n sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var transceiver = pc.transceivers[sdpMLineIndex];\n var iceGatherer = transceiver.iceGatherer;\n var iceTransport = transceiver.iceTransport;\n var dtlsTransport = transceiver.dtlsTransport;\n var localCapabilities = transceiver.localCapabilities;\n var remoteCapabilities = transceiver.remoteCapabilities;\n\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n\n if (!rejected && !transceiver.rejected) {\n var remoteIceParameters = SDPUtils.getIceParameters(\n mediaSection, sessionpart);\n var remoteDtlsParameters = SDPUtils.getDtlsParameters(\n mediaSection, sessionpart);\n if (isIceLite) {\n remoteDtlsParameters.role = 'server';\n }\n\n if (!pc.usingBundle || sdpMLineIndex === 0) {\n pc._gather(transceiver.mid, sdpMLineIndex);\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n isIceLite ? 'controlling' : 'controlled');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // Calculate intersection of capabilities.\n var params = getCommonCapabilities(localCapabilities,\n remoteCapabilities);\n\n // Start the RTCRtpSender. The RTCRtpReceiver for this\n // transceiver has already been started in setRemoteDescription.\n pc._transceive(transceiver,\n params.codecs.length > 0,\n false);\n }\n });\n }\n\n pc._localDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-local-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.setRemoteDescription = function(description) {\n var pc = this;\n\n // Note: pranswer is not supported.\n if (['offer', 'answer'].indexOf(description.type) === -1) {\n return Promise.reject(makeError('TypeError',\n 'Unsupported type \"' + description.type + '\"'));\n }\n\n if (!isActionAllowedInSignalingState('setRemoteDescription',\n description.type, pc.signalingState) || pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not set remote ' + description.type +\n ' in state ' + pc.signalingState));\n }\n\n var streams = {};\n pc.remoteStreams.forEach(function(stream) {\n streams[stream.id] = stream;\n });\n var receiverList = [];\n var sections = SDPUtils.splitSections(description.sdp);\n var sessionpart = sections.shift();\n var isIceLite = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-lite').length > 0;\n var usingBundle = SDPUtils.matchPrefix(sessionpart,\n 'a=group:BUNDLE ').length > 0;\n pc.usingBundle = usingBundle;\n var iceOptions = SDPUtils.matchPrefix(sessionpart,\n 'a=ice-options:')[0];\n if (iceOptions) {\n pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ')\n .indexOf('trickle') >= 0;\n } else {\n pc.canTrickleIceCandidates = false;\n }\n\n sections.forEach(function(mediaSection, sdpMLineIndex) {\n var lines = SDPUtils.splitLines(mediaSection);\n var kind = SDPUtils.getKind(mediaSection);\n // treat bundle-only as not-rejected.\n var rejected = SDPUtils.isRejected(mediaSection) &&\n SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;\n var protocol = lines[0].substr(2).split(' ')[2];\n\n var direction = SDPUtils.getDirection(mediaSection, sessionpart);\n var remoteMsid = SDPUtils.parseMsid(mediaSection);\n\n var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier();\n\n // Reject datachannels which are not implemented yet.\n if (rejected || (kind === 'application' && (protocol === 'DTLS/SCTP' ||\n protocol === 'UDP/DTLS/SCTP'))) {\n // TODO: this is dangerous in the case where a non-rejected m-line\n // becomes rejected.\n pc.transceivers[sdpMLineIndex] = {\n mid: mid,\n kind: kind,\n protocol: protocol,\n rejected: true\n };\n return;\n }\n\n if (!rejected && pc.transceivers[sdpMLineIndex] &&\n pc.transceivers[sdpMLineIndex].rejected) {\n // recycle a rejected transceiver.\n pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);\n }\n\n var transceiver;\n var iceGatherer;\n var iceTransport;\n var dtlsTransport;\n var rtpReceiver;\n var sendEncodingParameters;\n var recvEncodingParameters;\n var localCapabilities;\n\n var track;\n // FIXME: ensure the mediaSection has rtcp-mux set.\n var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);\n var remoteIceParameters;\n var remoteDtlsParameters;\n if (!rejected) {\n remoteIceParameters = SDPUtils.getIceParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection,\n sessionpart);\n remoteDtlsParameters.role = 'client';\n }\n recvEncodingParameters =\n SDPUtils.parseRtpEncodingParameters(mediaSection);\n\n var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);\n\n var isComplete = SDPUtils.matchPrefix(mediaSection,\n 'a=end-of-candidates', sessionpart).length > 0;\n var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:')\n .map(function(cand) {\n return SDPUtils.parseCandidate(cand);\n })\n .filter(function(cand) {\n return cand.component === 1;\n });\n\n // Check if we can use BUNDLE and dispose transports.\n if ((description.type === 'offer' || description.type === 'answer') &&\n !rejected && usingBundle && sdpMLineIndex > 0 &&\n pc.transceivers[sdpMLineIndex]) {\n pc._disposeIceAndDtlsTransports(sdpMLineIndex);\n pc.transceivers[sdpMLineIndex].iceGatherer =\n pc.transceivers[0].iceGatherer;\n pc.transceivers[sdpMLineIndex].iceTransport =\n pc.transceivers[0].iceTransport;\n pc.transceivers[sdpMLineIndex].dtlsTransport =\n pc.transceivers[0].dtlsTransport;\n if (pc.transceivers[sdpMLineIndex].rtpSender) {\n pc.transceivers[sdpMLineIndex].rtpSender.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n if (pc.transceivers[sdpMLineIndex].rtpReceiver) {\n pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(\n pc.transceivers[0].dtlsTransport);\n }\n }\n if (description.type === 'offer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex] ||\n pc._createTransceiver(kind);\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n usingBundle);\n }\n\n if (cands.length && transceiver.iceTransport.state === 'new') {\n if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {\n transceiver.iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n localCapabilities = window.RTCRtpReceiver.getCapabilities(kind);\n\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n\n sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 2) * 1001\n }];\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n var isNewTrack = false;\n if (direction === 'sendrecv' || direction === 'sendonly') {\n isNewTrack = !transceiver.rtpReceiver;\n rtpReceiver = transceiver.rtpReceiver ||\n new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);\n\n if (isNewTrack) {\n var stream;\n track = rtpReceiver.track;\n // FIXME: does not work with Plan B.\n if (remoteMsid && remoteMsid.stream === '-') {\n // no-op. a stream id of '-' means: no associated stream.\n } else if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n Object.defineProperty(streams[remoteMsid.stream], 'id', {\n get: function() {\n return remoteMsid.stream;\n }\n });\n }\n Object.defineProperty(track, 'id', {\n get: function() {\n return remoteMsid.track;\n }\n });\n stream = streams[remoteMsid.stream];\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n stream = streams.default;\n }\n if (stream) {\n addTrackToStreamAndFireEvent(track, stream);\n transceiver.associatedRemoteMediaStreams.push(stream);\n }\n receiverList.push([track, rtpReceiver, stream]);\n }\n } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {\n transceiver.associatedRemoteMediaStreams.forEach(function(s) {\n var nativeTrack = s.getTracks().find(function(t) {\n return t.id === transceiver.rtpReceiver.track.id;\n });\n if (nativeTrack) {\n removeTrackFromStreamAndFireEvent(nativeTrack, s);\n }\n });\n transceiver.associatedRemoteMediaStreams = [];\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.remoteCapabilities = remoteCapabilities;\n transceiver.rtpReceiver = rtpReceiver;\n transceiver.rtcpParameters = rtcpParameters;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n transceiver.recvEncodingParameters = recvEncodingParameters;\n\n // Start the RTCRtpReceiver now. The RTPSender is started in\n // setLocalDescription.\n pc._transceive(pc.transceivers[sdpMLineIndex],\n false,\n isNewTrack);\n } else if (description.type === 'answer' && !rejected) {\n transceiver = pc.transceivers[sdpMLineIndex];\n iceGatherer = transceiver.iceGatherer;\n iceTransport = transceiver.iceTransport;\n dtlsTransport = transceiver.dtlsTransport;\n rtpReceiver = transceiver.rtpReceiver;\n sendEncodingParameters = transceiver.sendEncodingParameters;\n localCapabilities = transceiver.localCapabilities;\n\n pc.transceivers[sdpMLineIndex].recvEncodingParameters =\n recvEncodingParameters;\n pc.transceivers[sdpMLineIndex].remoteCapabilities =\n remoteCapabilities;\n pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;\n\n if (cands.length && iceTransport.state === 'new') {\n if ((isIceLite || isComplete) &&\n (!usingBundle || sdpMLineIndex === 0)) {\n iceTransport.setRemoteCandidates(cands);\n } else {\n cands.forEach(function(candidate) {\n maybeAddCandidate(transceiver.iceTransport, candidate);\n });\n }\n }\n\n if (!usingBundle || sdpMLineIndex === 0) {\n if (iceTransport.state === 'new') {\n iceTransport.start(iceGatherer, remoteIceParameters,\n 'controlling');\n }\n if (dtlsTransport.state === 'new') {\n dtlsTransport.start(remoteDtlsParameters);\n }\n }\n\n // If the offer contained RTX but the answer did not,\n // remove RTX from sendEncodingParameters.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n pc._transceive(transceiver,\n direction === 'sendrecv' || direction === 'recvonly',\n direction === 'sendrecv' || direction === 'sendonly');\n\n // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams\n if (rtpReceiver &&\n (direction === 'sendrecv' || direction === 'sendonly')) {\n track = rtpReceiver.track;\n if (remoteMsid) {\n if (!streams[remoteMsid.stream]) {\n streams[remoteMsid.stream] = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);\n receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);\n } else {\n if (!streams.default) {\n streams.default = new window.MediaStream();\n }\n addTrackToStreamAndFireEvent(track, streams.default);\n receiverList.push([track, rtpReceiver, streams.default]);\n }\n } else {\n // FIXME: actually the receiver should be created later.\n delete transceiver.rtpReceiver;\n }\n }\n });\n\n if (pc._dtlsRole === undefined) {\n pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';\n }\n\n pc._remoteDescription = {\n type: description.type,\n sdp: description.sdp\n };\n if (description.type === 'offer') {\n pc._updateSignalingState('have-remote-offer');\n } else {\n pc._updateSignalingState('stable');\n }\n Object.keys(streams).forEach(function(sid) {\n var stream = streams[sid];\n if (stream.getTracks().length) {\n if (pc.remoteStreams.indexOf(stream) === -1) {\n pc.remoteStreams.push(stream);\n var event = new Event('addstream');\n event.stream = stream;\n window.setTimeout(function() {\n pc._dispatchEvent('addstream', event);\n });\n }\n\n receiverList.forEach(function(item) {\n var track = item[0];\n var receiver = item[1];\n if (stream.id !== item[2].id) {\n return;\n }\n fireAddTrack(pc, track, receiver, [stream]);\n });\n }\n });\n receiverList.forEach(function(item) {\n if (item[2]) {\n return;\n }\n fireAddTrack(pc, item[0], item[1], []);\n });\n\n // check whether addIceCandidate({}) was called within four seconds after\n // setRemoteDescription.\n window.setTimeout(function() {\n if (!(pc && pc.transceivers)) {\n return;\n }\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport &&\n transceiver.iceTransport.state === 'new' &&\n transceiver.iceTransport.getRemoteCandidates().length > 0) {\n console.warn('Timeout for addRemoteCandidate. Consider sending ' +\n 'an end-of-candidates notification');\n transceiver.iceTransport.addRemoteCandidate({});\n }\n });\n }, 4000);\n\n return Promise.resolve();\n };\n\n RTCPeerConnection.prototype.close = function() {\n this.transceivers.forEach(function(transceiver) {\n /* not yet\n if (transceiver.iceGatherer) {\n transceiver.iceGatherer.close();\n }\n */\n if (transceiver.iceTransport) {\n transceiver.iceTransport.stop();\n }\n if (transceiver.dtlsTransport) {\n transceiver.dtlsTransport.stop();\n }\n if (transceiver.rtpSender) {\n transceiver.rtpSender.stop();\n }\n if (transceiver.rtpReceiver) {\n transceiver.rtpReceiver.stop();\n }\n });\n // FIXME: clean up tracks, local streams, remote streams, etc\n this._isClosed = true;\n this._updateSignalingState('closed');\n };\n\n // Update the signaling state.\n RTCPeerConnection.prototype._updateSignalingState = function(newState) {\n this.signalingState = newState;\n var event = new Event('signalingstatechange');\n this._dispatchEvent('signalingstatechange', event);\n };\n\n // Determine whether to fire the negotiationneeded event.\n RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function() {\n var pc = this;\n if (this.signalingState !== 'stable' || this.needNegotiation === true) {\n return;\n }\n this.needNegotiation = true;\n window.setTimeout(function() {\n if (pc.needNegotiation) {\n pc.needNegotiation = false;\n var event = new Event('negotiationneeded');\n pc._dispatchEvent('negotiationneeded', event);\n }\n }, 0);\n };\n\n // Update the ice connection state.\n RTCPeerConnection.prototype._updateIceConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n checking: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n }\n });\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.checking > 0) {\n newState = 'checking';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n } else if (states.completed > 0) {\n newState = 'completed';\n }\n\n if (newState !== this.iceConnectionState) {\n this.iceConnectionState = newState;\n var event = new Event('iceconnectionstatechange');\n this._dispatchEvent('iceconnectionstatechange', event);\n }\n };\n\n // Update the connection state.\n RTCPeerConnection.prototype._updateConnectionState = function() {\n var newState;\n var states = {\n 'new': 0,\n closed: 0,\n connecting: 0,\n connected: 0,\n completed: 0,\n disconnected: 0,\n failed: 0\n };\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.iceTransport && transceiver.dtlsTransport &&\n !transceiver.rejected) {\n states[transceiver.iceTransport.state]++;\n states[transceiver.dtlsTransport.state]++;\n }\n });\n // ICETransport.completed and connected are the same for this purpose.\n states.connected += states.completed;\n\n newState = 'new';\n if (states.failed > 0) {\n newState = 'failed';\n } else if (states.connecting > 0) {\n newState = 'connecting';\n } else if (states.disconnected > 0) {\n newState = 'disconnected';\n } else if (states.new > 0) {\n newState = 'new';\n } else if (states.connected > 0) {\n newState = 'connected';\n }\n\n if (newState !== this.connectionState) {\n this.connectionState = newState;\n var event = new Event('connectionstatechange');\n this._dispatchEvent('connectionstatechange', event);\n }\n };\n\n RTCPeerConnection.prototype.createOffer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createOffer after close'));\n }\n\n var numAudioTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'audio';\n }).length;\n var numVideoTracks = pc.transceivers.filter(function(t) {\n return t.kind === 'video';\n }).length;\n\n // Determine number of audio and video tracks we need to send/recv.\n var offerOptions = arguments[0];\n if (offerOptions) {\n // Reject Chrome legacy constraints.\n if (offerOptions.mandatory || offerOptions.optional) {\n throw new TypeError(\n 'Legacy mandatory/optional constraints not supported.');\n }\n if (offerOptions.offerToReceiveAudio !== undefined) {\n if (offerOptions.offerToReceiveAudio === true) {\n numAudioTracks = 1;\n } else if (offerOptions.offerToReceiveAudio === false) {\n numAudioTracks = 0;\n } else {\n numAudioTracks = offerOptions.offerToReceiveAudio;\n }\n }\n if (offerOptions.offerToReceiveVideo !== undefined) {\n if (offerOptions.offerToReceiveVideo === true) {\n numVideoTracks = 1;\n } else if (offerOptions.offerToReceiveVideo === false) {\n numVideoTracks = 0;\n } else {\n numVideoTracks = offerOptions.offerToReceiveVideo;\n }\n }\n }\n\n pc.transceivers.forEach(function(transceiver) {\n if (transceiver.kind === 'audio') {\n numAudioTracks--;\n if (numAudioTracks < 0) {\n transceiver.wantReceive = false;\n }\n } else if (transceiver.kind === 'video') {\n numVideoTracks--;\n if (numVideoTracks < 0) {\n transceiver.wantReceive = false;\n }\n }\n });\n\n // Create M-lines for recvonly streams.\n while (numAudioTracks > 0 || numVideoTracks > 0) {\n if (numAudioTracks > 0) {\n pc._createTransceiver('audio');\n numAudioTracks--;\n }\n if (numVideoTracks > 0) {\n pc._createTransceiver('video');\n numVideoTracks--;\n }\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n // For each track, create an ice gatherer, ice transport,\n // dtls transport, potentially rtpsender and rtpreceiver.\n var track = transceiver.track;\n var kind = transceiver.kind;\n var mid = transceiver.mid || SDPUtils.generateIdentifier();\n transceiver.mid = mid;\n\n if (!transceiver.iceGatherer) {\n transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex,\n pc.usingBundle);\n }\n\n var localCapabilities = window.RTCRtpSender.getCapabilities(kind);\n // filter RTX until additional stuff needed for RTX is implemented\n // in adapter.js\n if (edgeVersion < 15019) {\n localCapabilities.codecs = localCapabilities.codecs.filter(\n function(codec) {\n return codec.name !== 'rtx';\n });\n }\n localCapabilities.codecs.forEach(function(codec) {\n // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552\n // by adding level-asymmetry-allowed=1\n if (codec.name === 'H264' &&\n codec.parameters['level-asymmetry-allowed'] === undefined) {\n codec.parameters['level-asymmetry-allowed'] = '1';\n }\n\n // for subsequent offers, we might have to re-use the payload\n // type of the last offer.\n if (transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.codecs) {\n transceiver.remoteCapabilities.codecs.forEach(function(remoteCodec) {\n if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() &&\n codec.clockRate === remoteCodec.clockRate) {\n codec.preferredPayloadType = remoteCodec.payloadType;\n }\n });\n }\n });\n localCapabilities.headerExtensions.forEach(function(hdrExt) {\n var remoteExtensions = transceiver.remoteCapabilities &&\n transceiver.remoteCapabilities.headerExtensions || [];\n remoteExtensions.forEach(function(rHdrExt) {\n if (hdrExt.uri === rHdrExt.uri) {\n hdrExt.id = rHdrExt.id;\n }\n });\n });\n\n // generate an ssrc now, to be used later in rtpSender.send\n var sendEncodingParameters = transceiver.sendEncodingParameters || [{\n ssrc: (2 * sdpMLineIndex + 1) * 1001\n }];\n if (track) {\n // add RTX\n if (edgeVersion >= 15019 && kind === 'video' &&\n !sendEncodingParameters[0].rtx) {\n sendEncodingParameters[0].rtx = {\n ssrc: sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n\n if (transceiver.wantReceive) {\n transceiver.rtpReceiver = new window.RTCRtpReceiver(\n transceiver.dtlsTransport, kind);\n }\n\n transceiver.localCapabilities = localCapabilities;\n transceiver.sendEncodingParameters = sendEncodingParameters;\n });\n\n // always offer BUNDLE and dispose on return if not supported.\n if (pc._config.bundlePolicy !== 'max-compat') {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n sdp += writeMediaSection(transceiver, transceiver.localCapabilities,\n 'offer', transceiver.stream, pc._dtlsRole);\n sdp += 'a=rtcp-rsize\\r\\n';\n\n if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' &&\n (sdpMLineIndex === 0 || !pc.usingBundle)) {\n transceiver.iceGatherer.getLocalCandidates().forEach(function(cand) {\n cand.component = 1;\n sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\\r\\n';\n });\n\n if (transceiver.iceGatherer.state === 'completed') {\n sdp += 'a=end-of-candidates\\r\\n';\n }\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'offer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.createAnswer = function() {\n var pc = this;\n\n if (pc._isClosed) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer after close'));\n }\n\n if (!(pc.signalingState === 'have-remote-offer' ||\n pc.signalingState === 'have-local-pranswer')) {\n return Promise.reject(makeError('InvalidStateError',\n 'Can not call createAnswer in signalingState ' + pc.signalingState));\n }\n\n var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId,\n pc._sdpSessionVersion++);\n if (pc.usingBundle) {\n sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function(t) {\n return t.mid;\n }).join(' ') + '\\r\\n';\n }\n sdp += 'a=ice-options:trickle\\r\\n';\n\n var mediaSectionsInOffer = SDPUtils.getMediaSections(\n pc._remoteDescription.sdp).length;\n pc.transceivers.forEach(function(transceiver, sdpMLineIndex) {\n if (sdpMLineIndex + 1 > mediaSectionsInOffer) {\n return;\n }\n if (transceiver.rejected) {\n if (transceiver.kind === 'application') {\n if (transceiver.protocol === 'DTLS/SCTP') { // legacy fmt\n sdp += 'm=application 0 DTLS/SCTP 5000\\r\\n';\n } else {\n sdp += 'm=application 0 ' + transceiver.protocol +\n ' webrtc-datachannel\\r\\n';\n }\n } else if (transceiver.kind === 'audio') {\n sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\\r\\n' +\n 'a=rtpmap:0 PCMU/8000\\r\\n';\n } else if (transceiver.kind === 'video') {\n sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\\r\\n' +\n 'a=rtpmap:120 VP8/90000\\r\\n';\n }\n sdp += 'c=IN IP4 0.0.0.0\\r\\n' +\n 'a=inactive\\r\\n' +\n 'a=mid:' + transceiver.mid + '\\r\\n';\n return;\n }\n\n // FIXME: look at direction.\n if (transceiver.stream) {\n var localTrack;\n if (transceiver.kind === 'audio') {\n localTrack = transceiver.stream.getAudioTracks()[0];\n } else if (transceiver.kind === 'video') {\n localTrack = transceiver.stream.getVideoTracks()[0];\n }\n if (localTrack) {\n // add RTX\n if (edgeVersion >= 15019 && transceiver.kind === 'video' &&\n !transceiver.sendEncodingParameters[0].rtx) {\n transceiver.sendEncodingParameters[0].rtx = {\n ssrc: transceiver.sendEncodingParameters[0].ssrc + 1\n };\n }\n }\n }\n\n // Calculate intersection of capabilities.\n var commonCapabilities = getCommonCapabilities(\n transceiver.localCapabilities,\n transceiver.remoteCapabilities);\n\n var hasRtx = commonCapabilities.codecs.filter(function(c) {\n return c.name.toLowerCase() === 'rtx';\n }).length;\n if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {\n delete transceiver.sendEncodingParameters[0].rtx;\n }\n\n sdp += writeMediaSection(transceiver, commonCapabilities,\n 'answer', transceiver.stream, pc._dtlsRole);\n if (transceiver.rtcpParameters &&\n transceiver.rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n });\n\n var desc = new window.RTCSessionDescription({\n type: 'answer',\n sdp: sdp\n });\n return Promise.resolve(desc);\n };\n\n RTCPeerConnection.prototype.addIceCandidate = function(candidate) {\n var pc = this;\n var sections;\n if (candidate && !(candidate.sdpMLineIndex !== undefined ||\n candidate.sdpMid)) {\n return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));\n }\n\n // TODO: needs to go into ops queue.\n return new Promise(function(resolve, reject) {\n if (!pc._remoteDescription) {\n return reject(makeError('InvalidStateError',\n 'Can not add ICE candidate without a remote description'));\n } else if (!candidate || candidate.candidate === '') {\n for (var j = 0; j < pc.transceivers.length; j++) {\n if (pc.transceivers[j].rejected) {\n continue;\n }\n pc.transceivers[j].iceTransport.addRemoteCandidate({});\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[j] += 'a=end-of-candidates\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n if (pc.usingBundle) {\n break;\n }\n }\n } else {\n var sdpMLineIndex = candidate.sdpMLineIndex;\n if (candidate.sdpMid) {\n for (var i = 0; i < pc.transceivers.length; i++) {\n if (pc.transceivers[i].mid === candidate.sdpMid) {\n sdpMLineIndex = i;\n break;\n }\n }\n }\n var transceiver = pc.transceivers[sdpMLineIndex];\n if (transceiver) {\n if (transceiver.rejected) {\n return resolve();\n }\n var cand = Object.keys(candidate.candidate).length > 0 ?\n SDPUtils.parseCandidate(candidate.candidate) : {};\n // Ignore Chrome's invalid candidates since Edge does not like them.\n if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {\n return resolve();\n }\n // Ignore RTCP candidates, we assume RTCP-MUX.\n if (cand.component && cand.component !== 1) {\n return resolve();\n }\n // when using bundle, avoid adding candidates to the wrong\n // ice transport. And avoid adding candidates added in the SDP.\n if (sdpMLineIndex === 0 || (sdpMLineIndex > 0 &&\n transceiver.iceTransport !== pc.transceivers[0].iceTransport)) {\n if (!maybeAddCandidate(transceiver.iceTransport, cand)) {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n\n // update the remoteDescription.\n var candidateString = candidate.candidate.trim();\n if (candidateString.indexOf('a=') === 0) {\n candidateString = candidateString.substr(2);\n }\n sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);\n sections[sdpMLineIndex] += 'a=' +\n (cand.type ? candidateString : 'end-of-candidates')\n + '\\r\\n';\n pc._remoteDescription.sdp =\n SDPUtils.getDescription(pc._remoteDescription.sdp) +\n sections.join('');\n } else {\n return reject(makeError('OperationError',\n 'Can not add ICE candidate'));\n }\n }\n resolve();\n });\n };\n\n RTCPeerConnection.prototype.getStats = function(selector) {\n if (selector && selector instanceof window.MediaStreamTrack) {\n var senderOrReceiver = null;\n this.transceivers.forEach(function(transceiver) {\n if (transceiver.rtpSender &&\n transceiver.rtpSender.track === selector) {\n senderOrReceiver = transceiver.rtpSender;\n } else if (transceiver.rtpReceiver &&\n transceiver.rtpReceiver.track === selector) {\n senderOrReceiver = transceiver.rtpReceiver;\n }\n });\n if (!senderOrReceiver) {\n throw makeError('InvalidAccessError', 'Invalid selector.');\n }\n return senderOrReceiver.getStats();\n }\n\n var promises = [];\n this.transceivers.forEach(function(transceiver) {\n ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport',\n 'dtlsTransport'].forEach(function(method) {\n if (transceiver[method]) {\n promises.push(transceiver[method].getStats());\n }\n });\n });\n return Promise.all(promises).then(function(allStats) {\n var results = new Map();\n allStats.forEach(function(stats) {\n stats.forEach(function(stat) {\n results.set(stat.id, stat);\n });\n });\n return results;\n });\n };\n\n // fix low-level stat names and return Map instead of object.\n var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer',\n 'RTCIceTransport', 'RTCDtlsTransport'];\n ortcObjects.forEach(function(ortcObjectName) {\n var obj = window[ortcObjectName];\n if (obj && obj.prototype && obj.prototype.getStats) {\n var nativeGetstats = obj.prototype.getStats;\n obj.prototype.getStats = function() {\n return nativeGetstats.apply(this)\n .then(function(nativeStats) {\n var mapStats = new Map();\n Object.keys(nativeStats).forEach(function(id) {\n nativeStats[id].type = fixStatsType(nativeStats[id]);\n mapStats.set(id, nativeStats[id]);\n });\n return mapStats;\n });\n };\n }\n });\n\n // legacy callback shims. Should be moved to adapter.js some days.\n var methods = ['createOffer', 'createAnswer'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[0] === 'function' ||\n typeof args[1] === 'function') { // legacy\n return nativeMethod.apply(this, [arguments[2]])\n .then(function(description) {\n if (typeof args[0] === 'function') {\n args[0].apply(null, [description]);\n }\n }, function(error) {\n if (typeof args[1] === 'function') {\n args[1].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];\n methods.forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function' ||\n typeof args[2] === 'function') { // legacy\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n }, function(error) {\n if (typeof args[2] === 'function') {\n args[2].apply(null, [error]);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n // getStats is special. It doesn't have a spec legacy method yet we support\n // getStats(something, cb) without error callbacks.\n ['getStats'].forEach(function(method) {\n var nativeMethod = RTCPeerConnection.prototype[method];\n RTCPeerConnection.prototype[method] = function() {\n var args = arguments;\n if (typeof args[1] === 'function') {\n return nativeMethod.apply(this, arguments)\n .then(function() {\n if (typeof args[1] === 'function') {\n args[1].apply(null);\n }\n });\n }\n return nativeMethod.apply(this, arguments);\n };\n });\n\n return RTCPeerConnection;\n};\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n const shimError_ = function(e) {\n return {\n name: {PermissionDeniedError: 'NotAllowedError'}[e.name] || e.name,\n message: e.message,\n constraint: e.constraint,\n toString() {\n return this.name;\n }\n };\n };\n\n // getUserMedia error shim.\n const origGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n return origGetUserMedia(c).catch(e => Promise.reject(shimError_(e)));\n };\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n /* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window) {\n if (!('getDisplayMedia' in window.navigator)) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n window.navigator.getDisplayMedia.bind(window.navigator);\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nimport {filterIceServers} from './filtericeservers';\nimport shimRTCPeerConnection from 'rtcpeerconnection-shim';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimPeerConnection(window, browserDetails) {\n if (window.RTCIceGatherer) {\n if (!window.RTCIceCandidate) {\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n return args;\n };\n }\n if (!window.RTCSessionDescription) {\n window.RTCSessionDescription = function RTCSessionDescription(args) {\n return args;\n };\n }\n // this adds an additional event listener to MediaStrackTrack that signals\n // when a tracks enabled property was changed. Workaround for a bug in\n // addStream, see below. No longer required in 15025+\n if (browserDetails.version < 15025) {\n const origMSTEnabled = Object.getOwnPropertyDescriptor(\n window.MediaStreamTrack.prototype, 'enabled');\n Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {\n set(value) {\n origMSTEnabled.set.call(this, value);\n const ev = new Event('enabled');\n ev.enabled = value;\n this.dispatchEvent(ev);\n }\n });\n }\n }\n\n // ORTC defines the DTMF sender a bit different.\n // https://github.com/w3c/ortc/issues/714\n if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = new window.RTCDtmfSender(this);\n } else if (this.track.kind === 'video') {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n // Edge currently only implements the RTCDtmfSender, not the\n // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*\n if (window.RTCDtmfSender && !window.RTCDTMFSender) {\n window.RTCDTMFSender = window.RTCDtmfSender;\n }\n\n const RTCPeerConnectionShim = shimRTCPeerConnection(window,\n browserDetails.version);\n window.RTCPeerConnection = function RTCPeerConnection(config) {\n if (config && config.iceServers) {\n config.iceServers = filterIceServers(config.iceServers,\n browserDetails.version);\n utils.log('ICE servers after filtering:', config.iceServers);\n }\n return new RTCPeerConnectionShim(config);\n };\n window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;\n}\n\nexport function shimReplaceTrack(window) {\n // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614\n if (window.RTCRtpSender &&\n !('replaceTrack' in window.RTCRtpSender.prototype)) {\n window.RTCRtpSender.prototype.replaceTrack =\n window.RTCRtpSender.prototype.setTrack;\n }\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n const initParameters = arguments[1];\n const shouldPerformCheck = initParameters &&\n 'sendEncodings' in initParameters;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n initParameters.sendEncodings.forEach((encodingParam) => {\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) {\n throw new TypeError('Invalid RID value provided.');\n }\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {\n throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {\n throw new RangeError('max_framerate must be >= 0.0');\n }\n }\n });\n }\n const transceiver = origAddTransceiver.apply(this, arguments);\n if (shouldPerformCheck) {\n // Check if the init options were applied. If not we do this in an\n // asynchronous way and save the promise reference in a global object.\n // This is an ugly hack, but at the same time is way more robust than\n // checking the sender parameters before and after the createOffer\n // Also note that after the createoffer we are not 100% sure that\n // the params were asynchronously applied so we might miss the\n // opportunity to recreate offer.\n const {sender} = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) ||\n // Avoid being fooled by patched getParameters() below.\n (params.encodings.length === 1 &&\n Object.keys(params.encodings[0]).length === 0)) {\n params.encodings = initParameters.sendEncodings;\n sender.sendEncodings = initParameters.sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params)\n .then(() => {\n delete sender.sendEncodings;\n }).catch(() => {\n delete sender.sendEncodings;\n })\n );\n }\n }\n return transceiver;\n };\n }\n}\n\nexport function shimGetParameters(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) {\n return;\n }\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) {\n window.RTCRtpSender.prototype.getParameters =\n function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) {\n params.encodings = [].concat(this.sendEncodings || [{}]);\n }\n return params;\n };\n }\n}\n\nexport function shimCreateOffer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateOffer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimCreateAnswer(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) {\n return Promise.all(this.setParametersPromises)\n .then(() => {\n return origCreateAnswer.apply(this, arguments);\n })\n .finally(() => {\n this.setParametersPromises = [];\n });\n }\n return origCreateAnswer.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n'use strict';\nimport * as utils from '../utils';\n\nexport function shimLocalStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n return this._localStreams;\n };\n }\n if (!('addStream' in window.RTCPeerConnection.prototype)) {\n const _addTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n // Try to emulate Chrome's behaviour of adding in audio-video order.\n // Safari orders by track id.\n stream.getAudioTracks().forEach(track => _addTrack.call(this, track,\n stream));\n stream.getVideoTracks().forEach(track => _addTrack.call(this, track,\n stream));\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, ...streams) {\n if (streams) {\n streams.forEach((stream) => {\n if (!this._localStreams) {\n this._localStreams = [stream];\n } else if (!this._localStreams.includes(stream)) {\n this._localStreams.push(stream);\n }\n });\n }\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n if (!this._localStreams) {\n this._localStreams = [];\n }\n const index = this._localStreams.indexOf(stream);\n if (index === -1) {\n return;\n }\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach(sender => {\n if (tracks.includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n }\n}\n\nexport function shimRemoteStreamsAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {\n window.RTCPeerConnection.prototype.getRemoteStreams =\n function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\n };\n }\n if (!('onaddstream' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {\n get() {\n return this._onaddstream;\n },\n set(f) {\n if (this._onaddstream) {\n this.removeEventListener('addstream', this._onaddstream);\n this.removeEventListener('track', this._onaddstreampoly);\n }\n this.addEventListener('addstream', this._onaddstream = f);\n this.addEventListener('track', this._onaddstreampoly = (e) => {\n e.streams.forEach(stream => {\n if (!this._remoteStreams) {\n this._remoteStreams = [];\n }\n if (this._remoteStreams.includes(stream)) {\n return;\n }\n this._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n this.dispatchEvent(event);\n });\n });\n }\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) {\n this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach(stream => {\n if (!pc._remoteStreams) {\n pc._remoteStreams = [];\n }\n if (pc._remoteStreams.indexOf(stream) >= 0) {\n return;\n }\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n }\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\n\nexport function shimCallbacksAPI(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) {\n return;\n }\n const prototype = window.RTCPeerConnection.prototype;\n const origCreateOffer = prototype.createOffer;\n const origCreateAnswer = prototype.createAnswer;\n const setLocalDescription = prototype.setLocalDescription;\n const setRemoteDescription = prototype.setRemoteDescription;\n const addIceCandidate = prototype.addIceCandidate;\n\n prototype.createOffer =\n function createOffer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n prototype.createAnswer =\n function createAnswer(successCallback, failureCallback) {\n const options = (arguments.length >= 2) ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [options]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [description]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [candidate]);\n if (!failureCallback) {\n return promise;\n }\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\n\nexport function shimGetUserMedia(window) {\n const navigator = window && window.navigator;\n\n if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {\n // shim not needed in Safari 12.1\n const mediaDevices = navigator.mediaDevices;\n const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);\n navigator.mediaDevices.getUserMedia = (constraints) => {\n return _getUserMedia(shimConstraints(constraints));\n };\n }\n\n if (!navigator.getUserMedia && navigator.mediaDevices &&\n navigator.mediaDevices.getUserMedia) {\n navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints)\n .then(cb, errcb);\n }.bind(navigator);\n }\n}\n\nexport function shimConstraints(constraints) {\n if (constraints && constraints.video !== undefined) {\n return Object.assign({},\n constraints,\n {video: utils.compactObject(constraints.video)}\n );\n }\n\n return constraints;\n}\n\nexport function shimRTCIceServerUrls(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection =\n function RTCPeerConnection(pcConfig, pcConstraints) {\n if (pcConfig && pcConfig.iceServers) {\n const newIceServers = [];\n for (let i = 0; i < pcConfig.iceServers.length; i++) {\n let server = pcConfig.iceServers[i];\n if (!server.hasOwnProperty('urls') &&\n server.hasOwnProperty('url')) {\n utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');\n server = JSON.parse(JSON.stringify(server));\n server.urls = server.url;\n delete server.url;\n newIceServers.push(server);\n } else {\n newIceServers.push(pcConfig.iceServers[i]);\n }\n }\n pcConfig.iceServers = newIceServers;\n }\n return new OrigPeerConnection(pcConfig, pcConstraints);\n };\n window.RTCPeerConnection.prototype = OrigPeerConnection.prototype;\n // wrap static methods. Currently just generateCertificate.\n if ('generateCertificate' in OrigPeerConnection) {\n Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get() {\n return OrigPeerConnection.generateCertificate;\n }\n });\n }\n}\n\nexport function shimTrackEventTransceiver(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent &&\n 'receiver' in window.RTCTrackEvent.prototype &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimCreateOfferLegacy(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer =\n function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveAudio =\n !!offerOptions.offerToReceiveAudio;\n }\n const audioTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('sendonly');\n } else {\n audioTransceiver.direction = 'sendonly';\n }\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) {\n audioTransceiver.setDirection('inactive');\n } else {\n audioTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveAudio === true &&\n !audioTransceiver) {\n this.addTransceiver('audio');\n }\n\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {\n // support bit values\n offerOptions.offerToReceiveVideo =\n !!offerOptions.offerToReceiveVideo;\n }\n const videoTransceiver = this.getTransceivers().find(transceiver =>\n transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('sendonly');\n } else {\n videoTransceiver.direction = 'sendonly';\n }\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) {\n videoTransceiver.setDirection('inactive');\n } else {\n videoTransceiver.direction = 'inactive';\n }\n }\n } else if (offerOptions.offerToReceiveVideo === true &&\n !videoTransceiver) {\n this.addTransceiver('video');\n }\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\n\nexport function shimAudioContext(window) {\n if (typeof window !== 'object' || window.AudioContext) {\n return;\n }\n window.AudioContext = window.webkitAudioContext;\n}\n","/*\n * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport SDPUtils from 'sdp';\nimport * as utils from './utils';\n\nexport function shimRTCIceCandidate(window) {\n // foundation is arbitrarily chosen as an indicator for full support for\n // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'foundation' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n const NativeRTCIceCandidate = window.RTCIceCandidate;\n window.RTCIceCandidate = function RTCIceCandidate(args) {\n // Remove the a= which shouldn't be part of the candidate string.\n if (typeof args === 'object' && args.candidate &&\n args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substr(2);\n }\n\n if (args.candidate && args.candidate.length) {\n // Augment the native candidate with the parsed fields.\n const nativeCandidate = new NativeRTCIceCandidate(args);\n const parsedCandidate = SDPUtils.parseCandidate(args.candidate);\n const augmentedCandidate = Object.assign(nativeCandidate,\n parsedCandidate);\n\n // Add a serializer that does not serialize the extra attributes.\n augmentedCandidate.toJSON = function toJSON() {\n return {\n candidate: augmentedCandidate.candidate,\n sdpMid: augmentedCandidate.sdpMid,\n sdpMLineIndex: augmentedCandidate.sdpMLineIndex,\n usernameFragment: augmentedCandidate.usernameFragment,\n };\n };\n return augmentedCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n }\n return e;\n });\n}\n\nexport function shimMaxMessageSize(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n if (!('sctp' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n }\n\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) {\n return false;\n }\n const sections = SDPUtils.splitSections(description.sdp);\n sections.shift();\n return sections.some(mediaSection => {\n const mLine = SDPUtils.parseMLine(mediaSection);\n return mLine && mLine.kind === 'application'\n && mLine.protocol.indexOf('SCTP') !== -1;\n });\n };\n\n const getRemoteFirefoxVersion = function(description) {\n // TODO: Is there a better solution for detecting Firefox?\n const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\\d+)/);\n if (match === null || match.length < 2) {\n return -1;\n }\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\n };\n\n const getCanSendMaxMessageSize = function(remoteIsFirefox) {\n // Every implementation we know can send at least 64 KiB.\n // Note: Although Chrome is technically able to send up to 256 KiB, the\n // data does not reach the other peer reliably.\n // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419\n let canSendMaxMessageSize = 65536;\n if (browserDetails.browser === 'firefox') {\n if (browserDetails.version < 57) {\n if (remoteIsFirefox === -1) {\n // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n } else {\n // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n }\n } else if (browserDetails.version < 60) {\n // Currently, all FF >= 57 will reset the remote maximum message size\n // to the default value when a data channel is created at a later\n // stage. :(\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n canSendMaxMessageSize =\n browserDetails.version === 57 ? 65535 : 65536;\n } else {\n // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n }\n return canSendMaxMessageSize;\n };\n\n const getMaxMessageSize = function(description, remoteIsFirefox) {\n // Note: 65536 bytes is the default value from the SDP spec. Also,\n // every implementation we know supports receiving 65536 bytes.\n let maxMessageSize = 65536;\n\n // FF 57 has a slightly incorrect default remote max message size, so\n // we need to adjust it here to avoid a failure when sending.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697\n if (browserDetails.browser === 'firefox'\n && browserDetails.version === 57) {\n maxMessageSize = 65535;\n }\n\n const match = SDPUtils.matchPrefix(description.sdp,\n 'a=max-message-size:');\n if (match.length > 0) {\n maxMessageSize = parseInt(match[0].substr(19), 10);\n } else if (browserDetails.browser === 'firefox' &&\n remoteIsFirefox !== -1) {\n // If the maximum message size is not present in the remote SDP and\n // both local and remote are Firefox, the remote peer can receive\n // ~2 GiB.\n maxMessageSize = 2147483637;\n }\n return maxMessageSize;\n };\n\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n this._sctp = null;\n // Chrome decided to not expose .sctp in plan-b mode.\n // As usual, adapter.js has to do an 'ugly worakaround'\n // to cover up the mess.\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {\n const {sdpSemantics} = this.getConfiguration();\n if (sdpSemantics === 'plan-b') {\n Object.defineProperty(this, 'sctp', {\n get() {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n },\n enumerable: true,\n configurable: true,\n });\n }\n }\n\n if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) {\n maxMessageSize = Number.POSITIVE_INFINITY;\n } else if (canSendMMS === 0 || remoteMMS === 0) {\n maxMessageSize = Math.max(canSendMMS, remoteMMS);\n } else {\n maxMessageSize = Math.min(canSendMMS, remoteMMS);\n }\n\n // Create a dummy RTCSctpTransport object and the 'maxMessageSize'\n // attribute.\n const sctp = {};\n Object.defineProperty(sctp, 'maxMessageSize', {\n get() {\n return maxMessageSize;\n }\n });\n this._sctp = sctp;\n }\n\n return origSetRemoteDescription.apply(this, arguments);\n };\n}\n\nexport function shimSendThrowTypeError(window) {\n if (!(window.RTCPeerConnection &&\n 'createDataChannel' in window.RTCPeerConnection.prototype)) {\n return;\n }\n\n // Note: Although Firefox >= 57 has a native implementation, the maximum\n // message size can be reset for all data channels at a later stage.\n // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831\n\n function wrapDcSend(dc, pc) {\n const origDataChannelSend = dc.send;\n dc.send = function send() {\n const data = arguments[0];\n const length = data.length || data.size || data.byteLength;\n if (dc.readyState === 'open' &&\n pc.sctp && length > pc.sctp.maxMessageSize) {\n throw new TypeError('Message too large (can send a maximum of ' +\n pc.sctp.maxMessageSize + ' bytes)');\n }\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel =\n window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel =\n function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n utils.wrapPeerConnectionEvent(window, 'datachannel', e => {\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\n\n\n/* shims RTCConnectionState by pretending it is the same as iceConnectionState.\n * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12\n * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect\n * since DTLS failures would be hidden. See\n * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827\n * for the Firefox tracking bug.\n */\nexport function shimConnectionState(window) {\n if (!window.RTCPeerConnection ||\n 'connectionState' in window.RTCPeerConnection.prototype) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n Object.defineProperty(proto, 'connectionState', {\n get() {\n return {\n completed: 'connected',\n checking: 'connecting'\n }[this.iceConnectionState] || this.iceConnectionState;\n },\n enumerable: true,\n configurable: true\n });\n Object.defineProperty(proto, 'onconnectionstatechange', {\n get() {\n return this._onconnectionstatechange || null;\n },\n set(cb) {\n if (this._onconnectionstatechange) {\n this.removeEventListener('connectionstatechange',\n this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) {\n this.addEventListener('connectionstatechange',\n this._onconnectionstatechange = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n\n ['setLocalDescription', 'setRemoteDescription'].forEach((method) => {\n const origMethod = proto[method];\n proto[method] = function() {\n if (!this._connectionstatechangepoly) {\n this._connectionstatechangepoly = e => {\n const pc = e.target;\n if (pc._lastConnectionState !== pc.connectionState) {\n pc._lastConnectionState = pc.connectionState;\n const newEvent = new Event('connectionstatechange', e);\n pc.dispatchEvent(newEvent);\n }\n return e;\n };\n this.addEventListener('iceconnectionstatechange',\n this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\n\nexport function removeExtmapAllowMixed(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */\n if (!window.RTCPeerConnection) {\n return;\n }\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {\n return;\n }\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {\n return;\n }\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription(desc) {\n if (desc && desc.sdp && desc.sdp.indexOf('\\na=extmap-allow-mixed') !== -1) {\n const sdp = desc.sdp.split('\\n').filter((line) => {\n return line.trim() !== 'a=extmap-allow-mixed';\n }).join('\\n');\n // Safari enforces read-only-ness of RTCSessionDescription fields.\n if (window.RTCSessionDescription &&\n desc instanceof window.RTCSessionDescription) {\n arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp,\n });\n } else {\n desc.sdp = sdp;\n }\n }\n return nativeSRD.apply(this, arguments);\n };\n}\n\nexport function shimAddIceCandidateNullOrEmpty(window, browserDetails) {\n // Support for addIceCandidate(null or undefined)\n // as well as addIceCandidate({candidate: \"\", ...})\n // https://bugs.chromium.org/p/chromium/issues/detail?id=978582\n // Note: must be called before other polyfills which change the signature.\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeAddIceCandidate =\n window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.addIceCandidate =\n function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) {\n arguments[1].apply(null);\n }\n return Promise.resolve();\n }\n // Firefox 68+ emits and processes {candidate: \"\", ...}, ignore\n // in older versions.\n // Native support for ignoring exists for Chrome M77+.\n // Safari ignores as well, exact version unknown but works in the same\n // version that also ignores addIceCandidate(null).\n if (((browserDetails.browser === 'chrome' && browserDetails.version < 78)\n || (browserDetails.browser === 'firefox'\n && browserDetails.version < 68)\n || (browserDetails.browser === 'safari'))\n && arguments[0] && arguments[0].candidate === '') {\n return Promise.resolve();\n }\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\nimport * as utils from './utils';\n\n // Browser shims.\nimport * as chromeShim from './chrome/chrome_shim';\nimport * as edgeShim from './edge/edge_shim';\nimport * as firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimEdge: true,\n shimSafari: true,\n}) {\n // Utils.\n const logging = utils.log;\n const browserDetails = utils.detectBrowser(window);\n\n const adapter = {\n browserDetails,\n commonShim,\n extractVersion: utils.extractVersion,\n disableLog: utils.disableLog,\n disableWarnings: utils.disableWarnings\n };\n\n // Shim browser if found.\n switch (browserDetails.browser) {\n case 'chrome':\n if (!chromeShim || !chromeShim.shimPeerConnection ||\n !options.shimChrome) {\n logging('Chrome shim is not included in this adapter release.');\n return adapter;\n }\n if (browserDetails.version === null) {\n logging('Chrome shim can not determine version, not shimming.');\n return adapter;\n }\n logging('adapter.js shimming chrome.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = chromeShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n chromeShim.shimGetUserMedia(window, browserDetails);\n chromeShim.shimMediaStream(window, browserDetails);\n chromeShim.shimPeerConnection(window, browserDetails);\n chromeShim.shimOnTrack(window, browserDetails);\n chromeShim.shimAddTrackRemoveTrack(window, browserDetails);\n chromeShim.shimGetSendersWithDtmf(window, browserDetails);\n chromeShim.shimGetStats(window, browserDetails);\n chromeShim.shimSenderReceiverGetStats(window, browserDetails);\n chromeShim.fixNegotiationNeeded(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n case 'firefox':\n if (!firefoxShim || !firefoxShim.shimPeerConnection ||\n !options.shimFirefox) {\n logging('Firefox shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming firefox.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = firefoxShim;\n\n // Must be called before shimPeerConnection.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n firefoxShim.shimGetUserMedia(window, browserDetails);\n firefoxShim.shimPeerConnection(window, browserDetails);\n firefoxShim.shimOnTrack(window, browserDetails);\n firefoxShim.shimRemoveStream(window, browserDetails);\n firefoxShim.shimSenderGetStats(window, browserDetails);\n firefoxShim.shimReceiverGetStats(window, browserDetails);\n firefoxShim.shimRTCDataChannel(window, browserDetails);\n firefoxShim.shimAddTransceiver(window, browserDetails);\n firefoxShim.shimGetParameters(window, browserDetails);\n firefoxShim.shimCreateOffer(window, browserDetails);\n firefoxShim.shimCreateAnswer(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimConnectionState(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'edge':\n if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {\n logging('MS edge shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming edge.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = edgeShim;\n\n edgeShim.shimGetUserMedia(window, browserDetails);\n edgeShim.shimGetDisplayMedia(window, browserDetails);\n edgeShim.shimPeerConnection(window, browserDetails);\n edgeShim.shimReplaceTrack(window, browserDetails);\n\n // the edge shim implements the full RTCIceCandidate object.\n\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n break;\n case 'safari':\n if (!safariShim || !options.shimSafari) {\n logging('Safari shim is not included in this adapter release.');\n return adapter;\n }\n logging('adapter.js shimming safari.');\n // Export to the adapter global object visible in the browser.\n adapter.browserShim = safariShim;\n\n // Must be called before shimCallbackAPI.\n commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);\n\n safariShim.shimRTCIceServerUrls(window, browserDetails);\n safariShim.shimCreateOfferLegacy(window, browserDetails);\n safariShim.shimCallbacksAPI(window, browserDetails);\n safariShim.shimLocalStreamsAPI(window, browserDetails);\n safariShim.shimRemoteStreamsAPI(window, browserDetails);\n safariShim.shimTrackEventTransceiver(window, browserDetails);\n safariShim.shimGetUserMedia(window, browserDetails);\n safariShim.shimAudioContext(window, browserDetails);\n\n commonShim.shimRTCIceCandidate(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import webRTCAdapter from \"webrtc-adapter\";\r\n\r\nexport { webRTCAdapter };\r\n","import { webRTCAdapter } from './adapter';\r\n\r\nexport const Supports = new class {\r\n readonly isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);\r\n readonly supportedBrowsers = ['firefox', 'chrome', 'safari'];\r\n\r\n readonly minFirefoxVersion = 59;\r\n readonly minChromeVersion = 72;\r\n readonly minSafariVersion = 605;\r\n\r\n isWebRTCSupported(): boolean {\r\n return typeof RTCPeerConnection !== 'undefined';\r\n }\r\n\r\n isBrowserSupported(): boolean {\r\n const browser = this.getBrowser();\r\n const version = this.getVersion();\r\n\r\n const validBrowser = this.supportedBrowsers.includes(browser);\r\n\r\n if (!validBrowser) return false;\r\n\r\n if (browser === 'chrome') return version >= this.minChromeVersion;\r\n if (browser === 'firefox') return version >= this.minFirefoxVersion;\r\n if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;\r\n\r\n return false;\r\n }\r\n\r\n getBrowser(): string {\r\n return webRTCAdapter.browserDetails.browser;\r\n }\r\n\r\n getVersion(): number {\r\n return webRTCAdapter.browserDetails.version || 0;\r\n }\r\n\r\n isUnifiedPlanSupported(): boolean {\r\n const browser = this.getBrowser();\r\n const version = webRTCAdapter.browserDetails.version || 0;\r\n\r\n if (browser === 'chrome' && version < this.minChromeVersion) return false;\r\n if (browser === 'firefox' && version >= this.minFirefoxVersion) return true;\r\n if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;\r\n\r\n let tempPc: RTCPeerConnection;\r\n let supported = false;\r\n\r\n try {\r\n tempPc = new RTCPeerConnection();\r\n tempPc.addTransceiver('audio');\r\n supported = true;\r\n } catch (e) { }\r\n finally {\r\n if (tempPc) {\r\n tempPc.close();\r\n }\r\n }\r\n\r\n return supported;\r\n }\r\n\r\n toString(): string {\r\n return `Supports: \r\n browser:${this.getBrowser()} \r\n version:${this.getVersion()} \r\n isIOS:${this.isIOS} \r\n isWebRTCSupported:${this.isWebRTCSupported()} \r\n isBrowserSupported:${this.isBrowserSupported()} \r\n isUnifiedPlanSupported:${this.isUnifiedPlanSupported()}`;\r\n }\r\n}\r\n","import * as BinaryPack from \"peerjs-js-binarypack\";\r\nimport { Supports } from './supports';\r\nimport { UtilSupportsObj } from '..';\r\n\r\nconst DEFAULT_CONFIG = {\r\n iceServers: [\r\n { urls: \"stun:stun.l.google.com:19302\" },\r\n { urls: \"turn:0.peerjs.com:3478\", username: \"peerjs\", credential: \"peerjsp\" }\r\n ],\r\n sdpSemantics: \"unified-plan\"\r\n};\r\n\r\nexport const util = new class {\r\n noop(): void { }\r\n\r\n readonly CLOUD_HOST = \"0.peerjs.com\";\r\n readonly CLOUD_PORT = 443;\r\n\r\n // Browsers that need chunking:\r\n readonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\r\n readonly chunkedMTU = 16300; // The original 60000 bytes setting does not work when sending data from Firefox to Chrome, which is \"cut off\" after 16384 bytes and delivered individually.\r\n\r\n // Returns browser-agnostic default config\r\n readonly defaultConfig = DEFAULT_CONFIG;\r\n\r\n readonly browser = Supports.getBrowser();\r\n readonly browserVersion = Supports.getVersion();\r\n\r\n // Lists which features are supported\r\n readonly supports = (function () {\r\n const supported: UtilSupportsObj = {\r\n browser: Supports.isBrowserSupported(),\r\n webRTC: Supports.isWebRTCSupported(),\r\n audioVideo: false,\r\n data: false,\r\n binaryBlob: false,\r\n reliable: false,\r\n };\r\n\r\n if (!supported.webRTC) return supported;\r\n\r\n let pc: RTCPeerConnection;\r\n\r\n try {\r\n pc = new RTCPeerConnection(DEFAULT_CONFIG);\r\n\r\n supported.audioVideo = true;\r\n\r\n let dc: RTCDataChannel;\r\n\r\n try {\r\n dc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\r\n supported.data = true;\r\n supported.reliable = !!dc.ordered;\r\n\r\n // Binary test\r\n try {\r\n dc.binaryType = \"blob\";\r\n supported.binaryBlob = !Supports.isIOS;\r\n } catch (e) {\r\n }\r\n } catch (e) {\r\n } finally {\r\n if (dc) {\r\n dc.close();\r\n }\r\n }\r\n } catch (e) {\r\n } finally {\r\n if (pc) {\r\n pc.close();\r\n }\r\n }\r\n\r\n return supported;\r\n })();\r\n\r\n // Ensure alphanumeric ids\r\n validateId(id: string): boolean {\r\n // Allow empty ids\r\n return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\r\n }\r\n\r\n pack = BinaryPack.pack;\r\n unpack = BinaryPack.unpack;\r\n\r\n // Binary stuff\r\n\r\n private _dataCount: number = 1;\r\n\r\n chunk(blob: Blob): { __peerData: number, n: number, total: number, data: Blob }[] {\r\n const chunks = [];\r\n const size = blob.size;\r\n const total = Math.ceil(size / util.chunkedMTU);\r\n\r\n let index = 0;\r\n let start = 0;\r\n\r\n while (start < size) {\r\n const end = Math.min(size, start + util.chunkedMTU);\r\n const b = blob.slice(start, end);\r\n\r\n const chunk = {\r\n __peerData: this._dataCount,\r\n n: index,\r\n data: b,\r\n total,\r\n };\r\n\r\n chunks.push(chunk);\r\n\r\n start = end;\r\n index++;\r\n }\r\n\r\n this._dataCount++;\r\n\r\n return chunks;\r\n }\r\n\r\n blobToArrayBuffer(blob: Blob, cb: (arg: ArrayBuffer | null) => void): FileReader {\r\n const fr = new FileReader();\r\n\r\n fr.onload = function (evt) {\r\n if (evt.target) {\r\n cb(evt.target.result as ArrayBuffer);\r\n }\r\n };\r\n\r\n fr.readAsArrayBuffer(blob);\r\n\r\n return fr;\r\n }\r\n\r\n binaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\r\n const byteArray = new Uint8Array(binary.length);\r\n\r\n for (let i = 0; i < binary.length; i++) {\r\n byteArray[i] = binary.charCodeAt(i) & 0xff;\r\n }\r\n\r\n return byteArray.buffer;\r\n }\r\n\r\n randomToken(): string {\r\n return Math.random()\r\n .toString(36)\r\n .substr(2);\r\n }\r\n\r\n isSecure(): boolean {\r\n return location.protocol === \"https:\";\r\n }\r\n}\r\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty\n , prefix = '~';\n\n/**\n * Constructor to create a storage for our `EE` objects.\n * An `Events` instance is a plain object whose properties are event names.\n *\n * @constructor\n * @private\n */\nfunction Events() {}\n\n//\n// We try to not inherit from `Object.prototype`. In some engines creating an\n// instance in this way is faster than calling `Object.create(null)` directly.\n// If `Object.create(null)` is not supported we prefix the event names with a\n// character to make sure that the built-in object properties are not\n// overridden or used as an attack vector.\n//\nif (Object.create) {\n Events.prototype = Object.create(null);\n\n //\n // This hack is needed because the `__proto__` property is still inherited in\n // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.\n //\n if (!new Events().__proto__) prefix = false;\n}\n\n/**\n * Representation of a single event listener.\n *\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} [once=false] Specify if the listener is a one-time listener.\n * @constructor\n * @private\n */\nfunction EE(fn, context, once) {\n this.fn = fn;\n this.context = context;\n this.once = once || false;\n}\n\n/**\n * Add a listener for a given event.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} context The context to invoke the listener with.\n * @param {Boolean} once Specify if the listener is a one-time listener.\n * @returns {EventEmitter}\n * @private\n */\nfunction addListener(emitter, event, fn, context, once) {\n if (typeof fn !== 'function') {\n throw new TypeError('The listener must be a function');\n }\n\n var listener = new EE(fn, context || emitter, once)\n , evt = prefix ? prefix + event : event;\n\n if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;\n else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);\n else emitter._events[evt] = [emitter._events[evt], listener];\n\n return emitter;\n}\n\n/**\n * Clear event by name.\n *\n * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.\n * @param {(String|Symbol)} evt The Event name.\n * @private\n */\nfunction clearEvent(emitter, evt) {\n if (--emitter._eventsCount === 0) emitter._events = new Events();\n else delete emitter._events[evt];\n}\n\n/**\n * Minimal `EventEmitter` interface that is molded against the Node.js\n * `EventEmitter` interface.\n *\n * @constructor\n * @public\n */\nfunction EventEmitter() {\n this._events = new Events();\n this._eventsCount = 0;\n}\n\n/**\n * Return an array listing the events for which the emitter has registered\n * listeners.\n *\n * @returns {Array}\n * @public\n */\nEventEmitter.prototype.eventNames = function eventNames() {\n var names = []\n , events\n , name;\n\n if (this._eventsCount === 0) return names;\n\n for (name in (events = this._events)) {\n if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);\n }\n\n if (Object.getOwnPropertySymbols) {\n return names.concat(Object.getOwnPropertySymbols(events));\n }\n\n return names;\n};\n\n/**\n * Return the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Array} The registered listeners.\n * @public\n */\nEventEmitter.prototype.listeners = function listeners(event) {\n var evt = prefix ? prefix + event : event\n , handlers = this._events[evt];\n\n if (!handlers) return [];\n if (handlers.fn) return [handlers.fn];\n\n for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {\n ee[i] = handlers[i].fn;\n }\n\n return ee;\n};\n\n/**\n * Return the number of listeners listening to a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Number} The number of listeners.\n * @public\n */\nEventEmitter.prototype.listenerCount = function listenerCount(event) {\n var evt = prefix ? prefix + event : event\n , listeners = this._events[evt];\n\n if (!listeners) return 0;\n if (listeners.fn) return 1;\n return listeners.length;\n};\n\n/**\n * Calls each of the listeners registered for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @returns {Boolean} `true` if the event had listeners, else `false`.\n * @public\n */\nEventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return false;\n\n var listeners = this._events[evt]\n , len = arguments.length\n , args\n , i;\n\n if (listeners.fn) {\n if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);\n\n switch (len) {\n case 1: return listeners.fn.call(listeners.context), true;\n case 2: return listeners.fn.call(listeners.context, a1), true;\n case 3: return listeners.fn.call(listeners.context, a1, a2), true;\n case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;\n case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;\n case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;\n }\n\n for (i = 1, args = new Array(len -1); i < len; i++) {\n args[i - 1] = arguments[i];\n }\n\n listeners.fn.apply(listeners.context, args);\n } else {\n var length = listeners.length\n , j;\n\n for (i = 0; i < length; i++) {\n if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);\n\n switch (len) {\n case 1: listeners[i].fn.call(listeners[i].context); break;\n case 2: listeners[i].fn.call(listeners[i].context, a1); break;\n case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;\n case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;\n default:\n if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {\n args[j - 1] = arguments[j];\n }\n\n listeners[i].fn.apply(listeners[i].context, args);\n }\n }\n }\n\n return true;\n};\n\n/**\n * Add a listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.on = function on(event, fn, context) {\n return addListener(this, event, fn, context, false);\n};\n\n/**\n * Add a one-time listener for a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn The listener function.\n * @param {*} [context=this] The context to invoke the listener with.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.once = function once(event, fn, context) {\n return addListener(this, event, fn, context, true);\n};\n\n/**\n * Remove the listeners of a given event.\n *\n * @param {(String|Symbol)} event The event name.\n * @param {Function} fn Only remove the listeners that match this function.\n * @param {*} context Only remove the listeners that have this context.\n * @param {Boolean} once Only remove one-time listeners.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {\n var evt = prefix ? prefix + event : event;\n\n if (!this._events[evt]) return this;\n if (!fn) {\n clearEvent(this, evt);\n return this;\n }\n\n var listeners = this._events[evt];\n\n if (listeners.fn) {\n if (\n listeners.fn === fn &&\n (!once || listeners.once) &&\n (!context || listeners.context === context)\n ) {\n clearEvent(this, evt);\n }\n } else {\n for (var i = 0, events = [], length = listeners.length; i < length; i++) {\n if (\n listeners[i].fn !== fn ||\n (once && !listeners[i].once) ||\n (context && listeners[i].context !== context)\n ) {\n events.push(listeners[i]);\n }\n }\n\n //\n // Reset the array, or remove it completely if we have no more listeners.\n //\n if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;\n else clearEvent(this, evt);\n }\n\n return this;\n};\n\n/**\n * Remove all listeners, or those of the specified event.\n *\n * @param {(String|Symbol)} [event] The event name.\n * @returns {EventEmitter} `this`.\n * @public\n */\nEventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {\n var evt;\n\n if (event) {\n evt = prefix ? prefix + event : event;\n if (this._events[evt]) clearEvent(this, evt);\n } else {\n this._events = new Events();\n this._eventsCount = 0;\n }\n\n return this;\n};\n\n//\n// Alias methods names because people roll like that.\n//\nEventEmitter.prototype.off = EventEmitter.prototype.removeListener;\nEventEmitter.prototype.addListener = EventEmitter.prototype.on;\n\n//\n// Expose the prefix.\n//\nEventEmitter.prefixed = prefix;\n\n//\n// Allow `EventEmitter` to be imported as module namespace.\n//\nEventEmitter.EventEmitter = EventEmitter;\n\n//\n// Expose the module.\n//\nif ('undefined' !== typeof module) {\n module.exports = EventEmitter;\n}\n","const LOG_PREFIX = 'PeerJS: ';\r\n\r\n/*\r\nPrints log messages depending on the debug level passed in. Defaults to 0.\r\n0 Prints no logs.\r\n1 Prints only errors.\r\n2 Prints errors and warnings.\r\n3 Prints all logs.\r\n*/\r\nexport enum LogLevel {\r\n Disabled,\r\n Errors,\r\n Warnings,\r\n All\r\n}\r\n\r\nclass Logger {\r\n private _logLevel = LogLevel.Disabled;\r\n\r\n get logLevel(): LogLevel { return this._logLevel; }\r\n\r\n set logLevel(logLevel: LogLevel) { this._logLevel = logLevel; }\r\n\r\n log(...args: any[]) {\r\n if (this._logLevel >= LogLevel.All) {\r\n this._print(LogLevel.All, ...args);\r\n }\r\n }\r\n\r\n warn(...args: any[]) {\r\n if (this._logLevel >= LogLevel.Warnings) {\r\n this._print(LogLevel.Warnings, ...args);\r\n }\r\n }\r\n\r\n error(...args: any[]) {\r\n if (this._logLevel >= LogLevel.Errors) {\r\n this._print(LogLevel.Errors, ...args);\r\n }\r\n }\r\n\r\n setLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\r\n this._print = fn;\r\n }\r\n\r\n private _print(logLevel: LogLevel, ...rest: any[]): void {\r\n const copy = [LOG_PREFIX, ...rest];\r\n\r\n for (let i in copy) {\r\n if (copy[i] instanceof Error) {\r\n copy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\r\n\r\n }\r\n }\r\n\r\n if (logLevel >= LogLevel.All) {\r\n console.log(...copy);\r\n } else if (logLevel >= LogLevel.Warnings) {\r\n console.warn(\"WARNING\", ...copy);\r\n } else if (logLevel >= LogLevel.Errors) {\r\n console.error(\"ERROR\", ...copy);\r\n }\r\n }\r\n}\r\n\r\nexport default new Logger();","export enum ConnectionEventType {\r\n Open = \"open\",\r\n Stream = \"stream\",\r\n Data = \"data\",\r\n Close = \"close\",\r\n Error = \"error\",\r\n IceStateChanged = \"iceStateChanged\"\r\n}\r\n\r\nexport enum ConnectionType {\r\n Data = \"data\",\r\n Media = \"media\"\r\n}\r\n\r\nexport enum PeerEventType {\r\n Open = \"open\",\r\n Close = \"close\",\r\n Connection = \"connection\",\r\n Call = \"call\",\r\n Disconnected = \"disconnected\",\r\n Error = \"error\"\r\n}\r\n\r\nexport enum PeerErrorType {\r\n BrowserIncompatible = \"browser-incompatible\",\r\n Disconnected = \"disconnected\",\r\n InvalidID = \"invalid-id\",\r\n InvalidKey = \"invalid-key\",\r\n Network = \"network\",\r\n PeerUnavailable = \"peer-unavailable\",\r\n SslUnavailable = \"ssl-unavailable\",\r\n ServerError = \"server-error\",\r\n SocketError = \"socket-error\",\r\n SocketClosed = \"socket-closed\",\r\n UnavailableID = \"unavailable-id\",\r\n WebRTC = \"webrtc\"\r\n}\r\n\r\nexport enum SerializationType {\r\n Binary = \"binary\",\r\n BinaryUTF8 = \"binary-utf8\",\r\n JSON = \"json\"\r\n}\r\n\r\nexport enum SocketEventType {\r\n Message = \"message\",\r\n Disconnected = \"disconnected\",\r\n Error = \"error\",\r\n Close = \"close\"\r\n}\r\n\r\nexport enum ServerMessageType {\r\n Heartbeat = \"HEARTBEAT\",\r\n Candidate = \"CANDIDATE\",\r\n Offer = \"OFFER\",\r\n Answer = \"ANSWER\",\r\n Open = \"OPEN\", // The connection to the server is open.\r\n Error = \"ERROR\", // Server error.\r\n IdTaken = \"ID-TAKEN\", // The selected ID is taken.\r\n InvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\r\n Leave = \"LEAVE\", // Another peer has closed its connection to this peer.\r\n Expire = \"EXPIRE\" // The offer sent to a peer has expired without response.\r\n\r\n}","import { EventEmitter } from \"eventemitter3\";\r\nimport logger from \"./logger\";\r\nimport { SocketEventType, ServerMessageType } from \"./enums\";\r\n\r\n/**\r\n * An abstraction on top of WebSockets to provide fastest\r\n * possible connection for peers.\r\n */\r\nexport class Socket extends EventEmitter {\r\n private _disconnected: boolean = true;\r\n private _id?: string;\r\n private _messagesQueue: Array = [];\r\n private _socket?: WebSocket;\r\n private _wsPingTimer?: any;\r\n private readonly _baseUrl: string;\r\n\r\n constructor(\r\n secure: any,\r\n host: string,\r\n port: number,\r\n path: string,\r\n key: string,\r\n private readonly pingInterval: number = 5000,\r\n ) {\r\n super();\r\n\r\n const wsProtocol = secure ? \"wss://\" : \"ws://\";\r\n\r\n this._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\r\n }\r\n\r\n start(id: string, token: string): void {\r\n this._id = id;\r\n\r\n const wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\r\n\r\n if (!!this._socket || !this._disconnected) {\r\n return;\r\n }\r\n\r\n this._socket = new WebSocket(wsUrl);\r\n this._disconnected = false;\r\n\r\n this._socket.onmessage = (event) => {\r\n let data;\r\n\r\n try {\r\n data = JSON.parse(event.data);\r\n logger.log(\"Server message received:\", data);\r\n } catch (e) {\r\n logger.log(\"Invalid server message\", event.data);\r\n return;\r\n }\r\n\r\n this.emit(SocketEventType.Message, data);\r\n };\r\n\r\n this._socket.onclose = (event) => {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n logger.log(\"Socket closed.\", event);\r\n\r\n this._cleanup();\r\n this._disconnected = true;\r\n\r\n this.emit(SocketEventType.Disconnected);\r\n };\r\n\r\n // Take care of the queue of connections if necessary and make sure Peer knows\r\n // socket is open.\r\n this._socket.onopen = () => {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n this._sendQueuedMessages();\r\n\r\n logger.log(\"Socket open\");\r\n\r\n this._scheduleHeartbeat();\r\n };\r\n }\r\n\r\n private _scheduleHeartbeat(): void {\r\n this._wsPingTimer = setTimeout(() => {\r\n this._sendHeartbeat();\r\n }, this.pingInterval);\r\n }\r\n\r\n private _sendHeartbeat(): void {\r\n if (!this._wsOpen()) {\r\n logger.log(`Cannot send heartbeat, because socket closed`);\r\n return;\r\n }\r\n\r\n const message = JSON.stringify({ type: ServerMessageType.Heartbeat });\r\n\r\n this._socket!.send(message);\r\n\r\n this._scheduleHeartbeat();\r\n }\r\n\r\n /** Is the websocket currently open? */\r\n private _wsOpen(): boolean {\r\n return !!this._socket && this._socket.readyState === 1;\r\n }\r\n\r\n /** Send queued messages. */\r\n private _sendQueuedMessages(): void {\r\n //Create copy of queue and clear it,\r\n //because send method push the message back to queue if smth will go wrong\r\n const copiedQueue = [...this._messagesQueue];\r\n this._messagesQueue = [];\r\n\r\n for (const message of copiedQueue) {\r\n this.send(message);\r\n }\r\n }\r\n\r\n /** Exposed send for DC & Peer. */\r\n send(data: any): void {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n // If we didn't get an ID yet, we can't yet send anything so we should queue\r\n // up these messages.\r\n if (!this._id) {\r\n this._messagesQueue.push(data);\r\n return;\r\n }\r\n\r\n if (!data.type) {\r\n this.emit(SocketEventType.Error, \"Invalid message\");\r\n return;\r\n }\r\n\r\n if (!this._wsOpen()) {\r\n return;\r\n }\r\n\r\n const message = JSON.stringify(data);\r\n\r\n this._socket!.send(message);\r\n }\r\n\r\n close(): void {\r\n if (this._disconnected) {\r\n return;\r\n }\r\n\r\n this._cleanup();\r\n\r\n this._disconnected = true;\r\n }\r\n\r\n private _cleanup(): void {\r\n if (this._socket) {\r\n this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;\r\n this._socket.close();\r\n this._socket = undefined;\r\n }\r\n\r\n clearTimeout(this._wsPingTimer!);\r\n }\r\n}\r\n","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\nimport { MediaConnection } from \"./mediaconnection\";\r\nimport { DataConnection } from \"./dataconnection\";\r\nimport { ConnectionType, PeerErrorType, ConnectionEventType, ServerMessageType } from \"./enums\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\n\r\n/**\r\n * Manages all negotiations between Peers.\r\n */\r\nexport class Negotiator {\r\n constructor(readonly connection: BaseConnection) { }\r\n\r\n /** Returns a PeerConnection object set up correctly (for data, media). */\r\n startConnection(options: any) {\r\n const peerConnection = this._startPeerConnection();\r\n\r\n // Set the connection's PC.\r\n this.connection.peerConnection = peerConnection;\r\n\r\n if (this.connection.type === ConnectionType.Media && options._stream) {\r\n this._addTracksToConnection(options._stream, peerConnection, options._addTransceivers);\r\n }\r\n\r\n // What do we need to do now?\r\n if (options.originator) {\r\n if (this.connection.type === ConnectionType.Data) {\r\n const dataConnection = this.connection;\r\n\r\n const config: RTCDataChannelInit = { ordered: !!options.reliable };\r\n\r\n const dataChannel = peerConnection.createDataChannel(\r\n dataConnection.label,\r\n config\r\n );\r\n dataConnection.initialize(dataChannel);\r\n }\r\n\r\n this._makeOffer();\r\n } else {\r\n this.handleSDP(\"OFFER\", options.sdp);\r\n }\r\n }\r\n\r\n /** Start a PC. */\r\n private _startPeerConnection(): RTCPeerConnection {\r\n logger.log(\"Creating RTCPeerConnection.\");\r\n\r\n const peerConnection = new RTCPeerConnection(this.connection.provider.options.config);\r\n\r\n this._setupListeners(peerConnection);\r\n\r\n return peerConnection;\r\n }\r\n\r\n /** Set up various WebRTC listeners. */\r\n private _setupListeners(\r\n peerConnection: RTCPeerConnection\r\n ) {\r\n const peerId = this.connection.peer;\r\n const connectionId = this.connection.connectionId;\r\n const connectionType = this.connection.type;\r\n const provider = this.connection.provider;\r\n\r\n // ICE CANDIDATES.\r\n logger.log(\"Listening for ICE candidates.\");\r\n\r\n peerConnection.onicecandidate = (evt) => {\r\n if (!evt.candidate || !evt.candidate.candidate) return;\r\n\r\n logger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\r\n\r\n provider.socket.send({\r\n type: ServerMessageType.Candidate,\r\n payload: {\r\n candidate: evt.candidate,\r\n type: connectionType,\r\n connectionId: connectionId\r\n },\r\n dst: peerId\r\n });\r\n };\r\n\r\n peerConnection.oniceconnectionstatechange = () => {\r\n switch (peerConnection.iceConnectionState) {\r\n case \"failed\":\r\n logger.log(\r\n \"iceConnectionState is failed, closing connections to \" +\r\n peerId\r\n );\r\n this.connection.emit(\r\n ConnectionEventType.Error,\r\n new Error(\"Negotiation of connection to \" + peerId + \" failed.\")\r\n );\r\n this.connection.close();\r\n break;\r\n case \"closed\":\r\n logger.log(\r\n \"iceConnectionState is closed, closing connections to \" +\r\n peerId\r\n );\r\n this.connection.emit(\r\n ConnectionEventType.Error,\r\n new Error(\"Connection to \" + peerId + \" closed.\")\r\n );\r\n this.connection.close();\r\n break;\r\n case \"disconnected\":\r\n logger.log(\r\n \"iceConnectionState changed to disconnected on the connection with \" +\r\n peerId\r\n );\r\n break;\r\n case \"completed\":\r\n peerConnection.onicecandidate = util.noop;\r\n break;\r\n }\r\n\r\n this.connection.emit(ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);\r\n };\r\n\r\n // DATACONNECTION.\r\n logger.log(\"Listening for data channel\");\r\n // Fired between offer and answer, so options should already be saved\r\n // in the options hash.\r\n peerConnection.ondatachannel = (evt) => {\r\n logger.log(\"Received data channel\");\r\n\r\n const dataChannel = evt.channel;\r\n const connection = (\r\n provider.getConnection(peerId, connectionId)\r\n );\r\n\r\n connection.initialize(dataChannel);\r\n };\r\n\r\n // MEDIACONNECTION.\r\n logger.log(\"Listening for remote stream\");\r\n\r\n peerConnection.ontrack = (evt) => {\r\n logger.log(\"Received remote stream\");\r\n\r\n const stream = evt.streams[0];\r\n const connection = provider.getConnection(peerId, connectionId);\r\n\r\n if (connection.type === ConnectionType.Media) {\r\n const mediaConnection = connection;\r\n\r\n this._addStreamToMediaConnection(stream, mediaConnection);\r\n }\r\n };\r\n }\r\n\r\n cleanup(): void {\r\n logger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\r\n\r\n const peerConnection = this.connection.peerConnection;\r\n\r\n if (!peerConnection) {\r\n return;\r\n }\r\n\r\n this.connection.peerConnection = null;\r\n\r\n //unsubscribe from all PeerConnection's events\r\n peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = () => { };\r\n\r\n const peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\r\n let dataChannelNotClosed = false;\r\n\r\n if (this.connection.type === ConnectionType.Data) {\r\n const dataConnection = this.connection;\r\n const dataChannel = dataConnection.dataChannel;\r\n\r\n if (dataChannel) {\r\n dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== \"closed\";\r\n }\r\n }\r\n\r\n if (peerConnectionNotClosed || dataChannelNotClosed) {\r\n peerConnection.close();\r\n }\r\n }\r\n\r\n private async _makeOffer(): Promise {\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n try {\r\n const offer = await peerConnection.createOffer(\r\n this.connection.options.constraints\r\n );\r\n\r\n logger.log(\"Created offer.\");\r\n\r\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\r\n offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;\r\n }\r\n\r\n try {\r\n await peerConnection.setLocalDescription(offer);\r\n\r\n logger.log(\"Set localDescription:\", offer, `for:${this.connection.peer}`);\r\n\r\n let payload: any = {\r\n sdp: offer,\r\n type: this.connection.type,\r\n connectionId: this.connection.connectionId,\r\n metadata: this.connection.metadata,\r\n browser: util.browser\r\n };\r\n\r\n if (this.connection.type === ConnectionType.Data) {\r\n const dataConnection = this.connection;\r\n\r\n payload = {\r\n ...payload,\r\n label: dataConnection.label,\r\n reliable: dataConnection.reliable,\r\n serialization: dataConnection.serialization\r\n };\r\n }\r\n\r\n provider.socket.send({\r\n type: ServerMessageType.Offer,\r\n payload,\r\n dst: this.connection.peer\r\n });\r\n } catch (err) {\r\n // TODO: investigate why _makeOffer is being called from the answer\r\n if (\r\n err !=\r\n \"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\r\n ) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to setLocalDescription, \", err);\r\n }\r\n }\r\n } catch (err_1) {\r\n provider.emitError(PeerErrorType.WebRTC, err_1);\r\n logger.log(\"Failed to createOffer, \", err_1);\r\n }\r\n }\r\n\r\n private async _makeAnswer(): Promise {\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n try {\r\n const answer = await peerConnection.createAnswer();\r\n logger.log(\"Created answer.\");\r\n\r\n if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {\r\n answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;\r\n }\r\n\r\n try {\r\n await peerConnection.setLocalDescription(answer);\r\n\r\n logger.log(`Set localDescription:`, answer, `for:${this.connection.peer}`);\r\n\r\n provider.socket.send({\r\n type: ServerMessageType.Answer,\r\n payload: {\r\n sdp: answer,\r\n type: this.connection.type,\r\n connectionId: this.connection.connectionId,\r\n browser: util.browser\r\n },\r\n dst: this.connection.peer\r\n });\r\n } catch (err) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to setLocalDescription, \", err);\r\n }\r\n } catch (err_1) {\r\n provider.emitError(PeerErrorType.WebRTC, err_1);\r\n logger.log(\"Failed to create answer, \", err_1);\r\n }\r\n }\r\n\r\n /** Handle an SDP. */\r\n async handleSDP(\r\n type: string,\r\n sdp: any\r\n ): Promise {\r\n sdp = new RTCSessionDescription(sdp);\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n logger.log(\"Setting remote description\", sdp);\r\n\r\n const self = this;\r\n\r\n try {\r\n await peerConnection.setRemoteDescription(sdp);\r\n logger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\r\n if (type === \"OFFER\") {\r\n await self._makeAnswer();\r\n }\r\n } catch (err) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to setRemoteDescription, \", err);\r\n }\r\n }\r\n\r\n /** Handle a candidate. */\r\n async handleCandidate(ice: any): Promise {\r\n logger.log(`handleCandidate:`, ice);\r\n\r\n const candidate = ice.candidate;\r\n const sdpMLineIndex = ice.sdpMLineIndex;\r\n const sdpMid = ice.sdpMid;\r\n const peerConnection = this.connection.peerConnection;\r\n const provider = this.connection.provider;\r\n\r\n try {\r\n await peerConnection.addIceCandidate(\r\n new RTCIceCandidate({\r\n sdpMid: sdpMid,\r\n sdpMLineIndex: sdpMLineIndex,\r\n candidate: candidate\r\n })\r\n );\r\n logger.log(`Added ICE candidate for:${this.connection.peer}`);\r\n } catch (err) {\r\n provider.emitError(PeerErrorType.WebRTC, err);\r\n logger.log(\"Failed to handleCandidate, \", err);\r\n }\r\n }\r\n\r\n private _addTracksToConnection(\r\n stream: MediaStream,\r\n peerConnection: RTCPeerConnection,\r\n addTransceivers: Boolean\r\n ): void {\r\n logger.log(`add tracks from stream ${stream.id} to peer connection`);\r\n\r\n if (!peerConnection.addTrack) {\r\n return logger.error(\r\n `Your browser does't support RTCPeerConnection#addTrack. Ignored.`\r\n );\r\n }\r\n\r\n stream.getTracks().forEach(track => {\r\n peerConnection.addTrack(track, stream);\r\n });\r\n\r\n if (addTransceivers) {\r\n if (stream.getVideoTracks().length == 0) {\r\n peerConnection.addTransceiver(\"video\");\r\n }\r\n\r\n if (stream.getAudioTracks().length == 0) {\r\n peerConnection.addTransceiver(\"audio\");\r\n }\r\n }\r\n }\r\n\r\n private _addStreamToMediaConnection(\r\n stream: MediaStream,\r\n mediaConnection: MediaConnection\r\n ): void {\r\n logger.log(\r\n `add stream ${stream.id} to media connection ${\r\n mediaConnection.connectionId\r\n }`\r\n );\r\n\r\n mediaConnection.addStream(stream);\r\n }\r\n}\r\n","import { EventEmitter } from \"eventemitter3\";\r\nimport { Peer } from \"./peer\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { ConnectionType } from \"./enums\";\r\n\r\nexport abstract class BaseConnection extends EventEmitter {\r\n protected _open = false;\r\n\r\n readonly metadata: any;\r\n connectionId: string;\r\n\r\n peerConnection: RTCPeerConnection;\r\n\r\n abstract get type(): ConnectionType;\r\n\r\n get open() {\r\n return this._open;\r\n }\r\n\r\n constructor(\r\n readonly peer: string,\r\n public provider: Peer,\r\n readonly options: any\r\n ) {\r\n super();\r\n\r\n this.metadata = options.metadata;\r\n }\r\n\r\n abstract close(): void;\r\n\r\n abstract handleMessage(message: ServerMessage): void;\r\n}\r\n","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\nimport { Negotiator } from \"./negotiator\";\r\nimport { ConnectionType, ConnectionEventType, ServerMessageType } from \"./enums\";\r\nimport { Peer } from \"./peer\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { AnswerOption } from \"..\";\r\n\r\n/**\r\n * Wraps the streaming interface between two Peers.\r\n */\r\nexport class MediaConnection extends BaseConnection {\r\n private static readonly ID_PREFIX = \"mc_\";\r\n\r\n private _negotiator: Negotiator;\r\n private _localStream: MediaStream;\r\n private _remoteStream: MediaStream;\r\n private _addTransceivers: Boolean;\r\n\r\n get type() {\r\n return ConnectionType.Media;\r\n }\r\n\r\n get localStream(): MediaStream { return this._localStream; }\r\n get remoteStream(): MediaStream { return this._remoteStream; }\r\n\r\n constructor(peerId: string, provider: Peer, options: any) {\r\n super(peerId, provider, options);\r\n\r\n this._localStream = this.options._stream;\r\n this.connectionId =\r\n this.options.connectionId ||\r\n MediaConnection.ID_PREFIX + util.randomToken();\r\n\r\n this._addTransceivers =\r\n this.options.addTransceivers || false;\r\n\r\n this._negotiator = new Negotiator(this);\r\n\r\n if (this._localStream) {\r\n this._negotiator.startConnection({\r\n _stream: this._localStream,\r\n originator: true,\r\n _addTransceivers: this._addTransceivers\r\n });\r\n }\r\n }\r\n\r\n addStream(remoteStream) {\r\n logger.log(\"Receiving stream\", remoteStream);\r\n\r\n this._remoteStream = remoteStream;\r\n super.emit(ConnectionEventType.Stream, remoteStream); // Should we call this `open`?\r\n }\r\n\r\n handleMessage(message: ServerMessage): void {\r\n const type = message.type;\r\n const payload = message.payload;\r\n\r\n switch (message.type) {\r\n case ServerMessageType.Answer:\r\n // Forward to negotiator\r\n this._negotiator.handleSDP(type, payload.sdp);\r\n this._open = true;\r\n break;\r\n case ServerMessageType.Candidate:\r\n this._negotiator.handleCandidate(payload.candidate);\r\n break;\r\n default:\r\n logger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\r\n break;\r\n }\r\n }\r\n\r\n answer(stream: MediaStream, options: AnswerOption = {}): void {\r\n if (this._localStream) {\r\n logger.warn(\r\n \"Local stream already exists on this MediaConnection. Are you answering a call twice?\"\r\n );\r\n return;\r\n }\r\n\r\n this._localStream = stream;\r\n\r\n if (options && options.sdpTransform) {\r\n this.options.sdpTransform = options.sdpTransform;\r\n }\r\n\r\n this._negotiator.startConnection({ ...this.options._payload, _stream: stream });\r\n // Retrieve lost messages stored because PeerConnection not set up.\r\n const messages = this.provider._getMessages(this.connectionId);\r\n\r\n for (let message of messages) {\r\n this.handleMessage(message);\r\n }\r\n\r\n this._open = true;\r\n }\r\n\r\n /**\r\n * Exposed functionality for users.\r\n */\r\n\r\n /** Allows user to close connection. */\r\n close(): void {\r\n if (this._negotiator) {\r\n this._negotiator.cleanup();\r\n this._negotiator = null;\r\n }\r\n\r\n this._localStream = null;\r\n this._remoteStream = null;\r\n\r\n if (this.provider) {\r\n this.provider._removeConnection(this);\r\n\r\n this.provider = null;\r\n }\r\n\r\n if (this.options && this.options._stream) {\r\n this.options._stream = null;\r\n }\r\n\r\n if (!this.open) {\r\n return;\r\n }\r\n\r\n this._open = false;\r\n\r\n super.emit(ConnectionEventType.Close);\r\n }\r\n}\r\n","import { EventEmitter } from \"eventemitter3\";\r\nimport logger from \"./logger\";\r\n\r\nexport class EncodingQueue extends EventEmitter {\r\n readonly fileReader: FileReader = new FileReader();\r\n\r\n private _queue: Blob[] = [];\r\n private _processing: boolean = false;\r\n\r\n constructor() {\r\n super();\r\n\r\n this.fileReader.onload = (evt) => {\r\n this._processing = false;\r\n\r\n if (evt.target) {\r\n this.emit('done', evt.target.result as ArrayBuffer);\r\n }\r\n\r\n this.doNextTask();\r\n };\r\n\r\n this.fileReader.onerror = (evt) => {\r\n logger.error(`EncodingQueue error:`, evt);\r\n this._processing = false;\r\n this.destroy();\r\n this.emit('error', evt);\r\n }\r\n }\r\n\r\n get queue(): Blob[] {\r\n return this._queue;\r\n }\r\n\r\n get size(): number {\r\n return this.queue.length;\r\n }\r\n\r\n get processing(): boolean {\r\n return this._processing;\r\n }\r\n\r\n enque(blob: Blob): void {\r\n this.queue.push(blob);\r\n\r\n if (this.processing) return;\r\n\r\n this.doNextTask();\r\n }\r\n\r\n destroy(): void {\r\n this.fileReader.abort();\r\n this._queue = [];\r\n }\r\n\r\n private doNextTask(): void {\r\n if (this.size === 0) return;\r\n if (this.processing) return;\r\n\r\n this._processing = true;\r\n\r\n this.fileReader.readAsArrayBuffer(this.queue.shift());\r\n }\r\n}","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\nimport { Negotiator } from \"./negotiator\";\r\nimport {\r\n ConnectionType,\r\n ConnectionEventType,\r\n SerializationType,\r\n ServerMessageType\r\n} from \"./enums\";\r\nimport { Peer } from \"./peer\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { EncodingQueue } from './encodingQueue';\r\nimport { DataConnection as IDataConnection } from '../index';\r\n\r\n/**\r\n * Wraps a DataChannel between two Peers.\r\n */\r\nexport class DataConnection extends BaseConnection implements IDataConnection {\r\n private static readonly ID_PREFIX = \"dc_\";\r\n private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\r\n\r\n private _negotiator: Negotiator;\r\n readonly label: string;\r\n readonly serialization: SerializationType;\r\n readonly reliable: boolean;\r\n stringify: (data: any) => string = JSON.stringify;\r\n parse: (data: string) => any = JSON.parse;\r\n\r\n get type() {\r\n return ConnectionType.Data;\r\n }\r\n\r\n private _buffer: any[] = [];\r\n private _bufferSize = 0;\r\n private _buffering = false;\r\n private _chunkedData: {\r\n [id: number]: {\r\n data: Blob[],\r\n count: number,\r\n total: number\r\n }\r\n } = {};\r\n\r\n private _dc: RTCDataChannel;\r\n private _encodingQueue = new EncodingQueue();\r\n\r\n get dataChannel(): RTCDataChannel {\r\n return this._dc;\r\n }\r\n\r\n get bufferSize(): number { return this._bufferSize; }\r\n\r\n constructor(peerId: string, provider: Peer, options: any) {\r\n super(peerId, provider, options);\r\n\r\n this.connectionId =\r\n this.options.connectionId || DataConnection.ID_PREFIX + util.randomToken();\r\n\r\n this.label = this.options.label || this.connectionId;\r\n this.serialization = this.options.serialization || SerializationType.Binary;\r\n this.reliable = !!this.options.reliable;\r\n\r\n this._encodingQueue.on('done', (ab: ArrayBuffer) => {\r\n this._bufferedSend(ab);\r\n });\r\n\r\n this._encodingQueue.on('error', () => {\r\n logger.error(`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`);\r\n this.close();\r\n });\r\n\r\n this._negotiator = new Negotiator(this);\r\n\r\n this._negotiator.startConnection(\r\n this.options._payload || {\r\n originator: true\r\n }\r\n );\r\n }\r\n\r\n /** Called by the Negotiator when the DataChannel is ready. */\r\n initialize(dc: RTCDataChannel): void {\r\n this._dc = dc;\r\n this._configureDataChannel();\r\n }\r\n\r\n private _configureDataChannel(): void {\r\n if (!util.supports.binaryBlob || util.supports.reliable) {\r\n this.dataChannel.binaryType = \"arraybuffer\";\r\n }\r\n\r\n this.dataChannel.onopen = () => {\r\n logger.log(`DC#${this.connectionId} dc connection success`);\r\n this._open = true;\r\n this.emit(ConnectionEventType.Open);\r\n };\r\n\r\n this.dataChannel.onmessage = (e) => {\r\n logger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\r\n this._handleDataMessage(e);\r\n };\r\n\r\n this.dataChannel.onclose = () => {\r\n logger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\r\n this.close();\r\n };\r\n }\r\n\r\n // Handles a DataChannel message.\r\n private _handleDataMessage({ data }: { data: Blob | ArrayBuffer | string }): void {\r\n const datatype = data.constructor;\r\n\r\n const isBinarySerialization = this.serialization === SerializationType.Binary ||\r\n this.serialization === SerializationType.BinaryUTF8;\r\n\r\n let deserializedData: any = data;\r\n\r\n if (isBinarySerialization) {\r\n if (datatype === Blob) {\r\n // Datatype should never be blob\r\n util.blobToArrayBuffer(data as Blob, (ab) => {\r\n const unpackedData = util.unpack(ab);\r\n this.emit(ConnectionEventType.Data, unpackedData);\r\n });\r\n return;\r\n } else if (datatype === ArrayBuffer) {\r\n deserializedData = util.unpack(data as ArrayBuffer);\r\n } else if (datatype === String) {\r\n // String fallback for binary data for browsers that don't support binary yet\r\n const ab = util.binaryStringToArrayBuffer(data as string);\r\n deserializedData = util.unpack(ab);\r\n }\r\n } else if (this.serialization === SerializationType.JSON) {\r\n deserializedData = this.parse(data as string);\r\n }\r\n\r\n // Check if we've chunked--if so, piece things back together.\r\n // We're guaranteed that this isn't 0.\r\n if (deserializedData.__peerData) {\r\n this._handleChunk(deserializedData);\r\n return;\r\n }\r\n\r\n super.emit(ConnectionEventType.Data, deserializedData);\r\n }\r\n\r\n private _handleChunk(data: { __peerData: number, n: number, total: number, data: Blob }): void {\r\n const id = data.__peerData;\r\n const chunkInfo = this._chunkedData[id] || {\r\n data: [],\r\n count: 0,\r\n total: data.total\r\n };\r\n\r\n chunkInfo.data[data.n] = data.data;\r\n chunkInfo.count++;\r\n this._chunkedData[id] = chunkInfo;\r\n\r\n if (chunkInfo.total === chunkInfo.count) {\r\n // Clean up before making the recursive call to `_handleDataMessage`.\r\n delete this._chunkedData[id];\r\n\r\n // We've received all the chunks--time to construct the complete data.\r\n const data = new Blob(chunkInfo.data);\r\n this._handleDataMessage({ data });\r\n }\r\n }\r\n\r\n /**\r\n * Exposed functionality for users.\r\n */\r\n\r\n /** Allows user to close connection. */\r\n close(): void {\r\n this._buffer = [];\r\n this._bufferSize = 0;\r\n this._chunkedData = {};\r\n\r\n if (this._negotiator) {\r\n this._negotiator.cleanup();\r\n this._negotiator = null;\r\n }\r\n\r\n if (this.provider) {\r\n this.provider._removeConnection(this);\r\n\r\n this.provider = null;\r\n }\r\n\r\n if (this.dataChannel) {\r\n this.dataChannel.onopen = null;\r\n this.dataChannel.onmessage = null;\r\n this.dataChannel.onclose = null;\r\n this._dc = null;\r\n }\r\n\r\n if (this._encodingQueue) {\r\n this._encodingQueue.destroy();\r\n this._encodingQueue.removeAllListeners();\r\n this._encodingQueue = null;\r\n }\r\n\r\n if (!this.open) {\r\n return;\r\n }\r\n\r\n this._open = false;\r\n\r\n super.emit(ConnectionEventType.Close);\r\n }\r\n\r\n /** Allows user to send data. */\r\n send(data: any, chunked?: boolean): void {\r\n if (!this.open) {\r\n super.emit(\r\n ConnectionEventType.Error,\r\n new Error(\r\n \"Connection is not open. You should listen for the `open` event before sending messages.\"\r\n )\r\n );\r\n return;\r\n }\r\n\r\n if (this.serialization === SerializationType.JSON) {\r\n this._bufferedSend(this.stringify(data));\r\n } else if (\r\n this.serialization === SerializationType.Binary ||\r\n this.serialization === SerializationType.BinaryUTF8\r\n ) {\r\n const blob = util.pack(data);\r\n\r\n if (!chunked && blob.size > util.chunkedMTU) {\r\n this._sendChunks(blob);\r\n return;\r\n }\r\n\r\n if (!util.supports.binaryBlob) {\r\n // We only do this if we really need to (e.g. blobs are not supported),\r\n // because this conversion is costly.\r\n this._encodingQueue.enque(blob);\r\n } else {\r\n this._bufferedSend(blob);\r\n }\r\n } else {\r\n this._bufferedSend(data);\r\n }\r\n }\r\n\r\n private _bufferedSend(msg: any): void {\r\n if (this._buffering || !this._trySend(msg)) {\r\n this._buffer.push(msg);\r\n this._bufferSize = this._buffer.length;\r\n }\r\n }\r\n\r\n // Returns true if the send succeeds.\r\n private _trySend(msg: any): boolean {\r\n if (!this.open) {\r\n return false;\r\n }\r\n\r\n if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\r\n this._buffering = true;\r\n setTimeout(() => {\r\n this._buffering = false;\r\n this._tryBuffer();\r\n }, 50);\r\n\r\n return false;\r\n }\r\n\r\n try {\r\n this.dataChannel.send(msg);\r\n } catch (e) {\r\n logger.error(`DC#:${this.connectionId} Error when sending:`, e);\r\n this._buffering = true;\r\n\r\n this.close();\r\n\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n\r\n // Try to send the first message in the buffer.\r\n private _tryBuffer(): void {\r\n if (!this.open) {\r\n return;\r\n }\r\n\r\n if (this._buffer.length === 0) {\r\n return;\r\n }\r\n\r\n const msg = this._buffer[0];\r\n\r\n if (this._trySend(msg)) {\r\n this._buffer.shift();\r\n this._bufferSize = this._buffer.length;\r\n this._tryBuffer();\r\n }\r\n }\r\n\r\n private _sendChunks(blob: Blob): void {\r\n const blobs = util.chunk(blob);\r\n logger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\r\n\r\n for (let blob of blobs) {\r\n this.send(blob, true);\r\n }\r\n }\r\n\r\n handleMessage(message: ServerMessage): void {\r\n const payload = message.payload;\r\n\r\n switch (message.type) {\r\n case ServerMessageType.Answer:\r\n this._negotiator.handleSDP(message.type, payload.sdp);\r\n break;\r\n case ServerMessageType.Candidate:\r\n this._negotiator.handleCandidate(payload.candidate);\r\n break;\r\n default:\r\n logger.warn(\r\n \"Unrecognized message type:\",\r\n message.type,\r\n \"from peer:\",\r\n this.peer\r\n );\r\n break;\r\n }\r\n }\r\n}\r\n","import { util } from \"./util\";\r\nimport logger from \"./logger\";\r\n\r\nexport class API {\r\n constructor(private readonly _options: any) { }\r\n\r\n private _buildUrl(method: string): string {\r\n const protocol = this._options.secure ? \"https://\" : \"http://\";\r\n let url =\r\n protocol +\r\n this._options.host +\r\n \":\" +\r\n this._options.port +\r\n this._options.path +\r\n this._options.key +\r\n \"/\" +\r\n method;\r\n const queryString = \"?ts=\" + new Date().getTime() + \"\" + Math.random();\r\n url += queryString;\r\n\r\n return url;\r\n }\r\n\r\n /** Get a unique ID from the server via XHR and initialize with it. */\r\n async retrieveId(): Promise {\r\n const url = this._buildUrl(\"id\");\r\n\r\n try {\r\n const response = await fetch(url);\r\n\r\n if (response.status !== 200) {\r\n throw new Error(`Error. Status:${response.status}`);\r\n }\r\n\r\n return response.text();\r\n } catch (error) {\r\n logger.error(\"Error retrieving ID\", error);\r\n\r\n let pathError = \"\";\r\n\r\n if (\r\n this._options.path === \"/\" &&\r\n this._options.host !== util.CLOUD_HOST\r\n ) {\r\n pathError =\r\n \" If you passed in a `path` to your self-hosted PeerServer, \" +\r\n \"you'll also need to pass in that same path when creating a new \" +\r\n \"Peer.\";\r\n }\r\n\r\n throw new Error(\"Could not get an ID from the server.\" + pathError);\r\n }\r\n }\r\n\r\n /** @deprecated */\r\n async listAllPeers(): Promise {\r\n const url = this._buildUrl(\"peers\");\r\n\r\n try {\r\n const response = await fetch(url);\r\n\r\n if (response.status !== 200) {\r\n if (response.status === 401) {\r\n let helpfulError = \"\";\r\n\r\n if (this._options.host === util.CLOUD_HOST) {\r\n helpfulError =\r\n \"It looks like you're using the cloud server. You can email \" +\r\n \"team@peerjs.com to enable peer listing for your API key.\";\r\n } else {\r\n helpfulError =\r\n \"You need to enable `allow_discovery` on your self-hosted \" +\r\n \"PeerServer to use this feature.\";\r\n }\r\n\r\n throw new Error(\"It doesn't look like you have permission to list peers IDs. \" +\r\n helpfulError);\r\n }\r\n\r\n throw new Error(`Error. Status:${response.status}`);\r\n }\r\n\r\n return response.json();\r\n } catch (error) {\r\n logger.error(\"Error retrieving list peers\", error);\r\n\r\n throw new Error(\"Could not get list peers from the server.\" + error);\r\n }\r\n }\r\n}\r\n","import { EventEmitter } from \"eventemitter3\";\r\nimport { util } from \"./util\";\r\nimport logger, { LogLevel } from \"./logger\";\r\nimport { Socket } from \"./socket\";\r\nimport { MediaConnection } from \"./mediaconnection\";\r\nimport { DataConnection } from \"./dataconnection\";\r\nimport {\r\n ConnectionType,\r\n PeerErrorType,\r\n PeerEventType,\r\n SocketEventType,\r\n ServerMessageType\r\n} from \"./enums\";\r\nimport { BaseConnection } from \"./baseconnection\";\r\nimport { ServerMessage } from \"./servermessage\";\r\nimport { API } from \"./api\";\r\nimport { PeerConnectOption, PeerJSOption } from \"..\";\r\n\r\nclass PeerOptions implements PeerJSOption {\r\n debug?: LogLevel; // 1: Errors, 2: Warnings, 3: All logs\r\n host?: string;\r\n port?: number;\r\n path?: string;\r\n key?: string;\r\n token?: string;\r\n config?: any;\r\n secure?: boolean;\r\n pingInterval?: number;\r\n logFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\r\n}\r\n\r\n/**\r\n * A peer who can initiate connections with other peers.\r\n */\r\nexport class Peer extends EventEmitter {\r\n private static readonly DEFAULT_KEY = \"peerjs\";\r\n\r\n private readonly _options: PeerOptions;\r\n private readonly _api: API;\r\n private readonly _socket: Socket;\r\n\r\n private _id: string | null = null;\r\n private _lastServerId: string | null = null;\r\n\r\n // States.\r\n private _destroyed = false; // Connections have been killed\r\n private _disconnected = false; // Connection to PeerServer killed but P2P connections still active\r\n private _open = false; // Sockets and such are not yet open.\r\n private readonly _connections: Map = new Map(); // All connections for this peer.\r\n private readonly _lostMessages: Map = new Map(); // src => [list of messages]\r\n\r\n get id() {\r\n return this._id;\r\n }\r\n\r\n get options() {\r\n return this._options;\r\n }\r\n\r\n get open() {\r\n return this._open;\r\n }\r\n\r\n get socket() {\r\n return this._socket;\r\n }\r\n\r\n /**\r\n * @deprecated \r\n * Return type will change from Object to Map \r\n */\r\n get connections(): Object {\r\n const plainConnections = Object.create(null);\r\n\r\n for (let [k, v] of this._connections) {\r\n plainConnections[k] = v;\r\n }\r\n\r\n return plainConnections;\r\n }\r\n\r\n get destroyed() {\r\n return this._destroyed;\r\n }\r\n get disconnected() {\r\n return this._disconnected;\r\n }\r\n\r\n constructor(id?: string | PeerOptions, options?: PeerOptions) {\r\n super();\r\n\r\n let userId: string | undefined;\r\n\r\n // Deal with overloading\r\n if (id && id.constructor == Object) {\r\n options = id as PeerOptions;\r\n } else if (id) {\r\n userId = id.toString();\r\n }\r\n\r\n // Configurize options\r\n options = {\r\n debug: 0, // 1: Errors, 2: Warnings, 3: All logs\r\n host: util.CLOUD_HOST,\r\n port: util.CLOUD_PORT,\r\n path: \"/\",\r\n key: Peer.DEFAULT_KEY,\r\n token: util.randomToken(),\r\n config: util.defaultConfig,\r\n ...options\r\n };\r\n this._options = options;\r\n\r\n // Detect relative URL host.\r\n if (this._options.host === \"/\") {\r\n this._options.host = window.location.hostname;\r\n }\r\n\r\n // Set path correctly.\r\n if (this._options.path) {\r\n if (this._options.path[0] !== \"/\") {\r\n this._options.path = \"/\" + this._options.path;\r\n }\r\n if (this._options.path[this._options.path.length - 1] !== \"/\") {\r\n this._options.path += \"/\";\r\n }\r\n }\r\n\r\n // Set whether we use SSL to same as current host\r\n if (this._options.secure === undefined && this._options.host !== util.CLOUD_HOST) {\r\n this._options.secure = util.isSecure();\r\n } else if (this._options.host == util.CLOUD_HOST) {\r\n this._options.secure = true;\r\n }\r\n // Set a custom log function if present\r\n if (this._options.logFunction) {\r\n logger.setLogFunction(this._options.logFunction);\r\n }\r\n\r\n logger.logLevel = this._options.debug || 0;\r\n\r\n this._api = new API(options);\r\n this._socket = this._createServerConnection();\r\n\r\n // Sanity checks\r\n // Ensure WebRTC supported\r\n if (!util.supports.audioVideo && !util.supports.data) {\r\n this._delayedAbort(\r\n PeerErrorType.BrowserIncompatible,\r\n \"The current browser does not support WebRTC\"\r\n );\r\n return;\r\n }\r\n\r\n // Ensure alphanumeric id\r\n if (!!userId && !util.validateId(userId)) {\r\n this._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\r\n return;\r\n }\r\n\r\n if (userId) {\r\n this._initialize(userId);\r\n } else {\r\n this._api.retrieveId()\r\n .then(id => this._initialize(id))\r\n .catch(error => this._abort(PeerErrorType.ServerError, error));\r\n }\r\n }\r\n\r\n private _createServerConnection(): Socket {\r\n const socket = new Socket(\r\n this._options.secure,\r\n this._options.host!,\r\n this._options.port!,\r\n this._options.path!,\r\n this._options.key!,\r\n this._options.pingInterval\r\n );\r\n\r\n socket.on(SocketEventType.Message, (data: ServerMessage) => {\r\n this._handleMessage(data);\r\n });\r\n\r\n socket.on(SocketEventType.Error, (error: string) => {\r\n this._abort(PeerErrorType.SocketError, error);\r\n });\r\n\r\n socket.on(SocketEventType.Disconnected, () => {\r\n if (this.disconnected) {\r\n return;\r\n }\r\n\r\n this.emitError(PeerErrorType.Network, \"Lost connection to server.\");\r\n this.disconnect();\r\n });\r\n\r\n socket.on(SocketEventType.Close, () => {\r\n if (this.disconnected) {\r\n return;\r\n }\r\n\r\n this._abort(PeerErrorType.SocketClosed, \"Underlying socket is already closed.\");\r\n });\r\n\r\n return socket;\r\n }\r\n\r\n /** Initialize a connection with the server. */\r\n private _initialize(id: string): void {\r\n this._id = id;\r\n this.socket.start(id, this._options.token!);\r\n }\r\n\r\n /** Handles messages from the server. */\r\n private _handleMessage(message: ServerMessage): void {\r\n const type = message.type;\r\n const payload = message.payload;\r\n const peerId = message.src;\r\n\r\n switch (type) {\r\n case ServerMessageType.Open: // The connection to the server is open.\r\n this._lastServerId = this.id;\r\n this._open = true;\r\n this.emit(PeerEventType.Open, this.id);\r\n break;\r\n case ServerMessageType.Error: // Server error.\r\n this._abort(PeerErrorType.ServerError, payload.msg);\r\n break;\r\n case ServerMessageType.IdTaken: // The selected ID is taken.\r\n this._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\r\n break;\r\n case ServerMessageType.InvalidKey: // The given API key cannot be found.\r\n this._abort(PeerErrorType.InvalidKey, `API KEY \"${this._options.key}\" is invalid`);\r\n break;\r\n case ServerMessageType.Leave: // Another peer has closed its connection to this peer.\r\n logger.log(`Received leave message from ${peerId}`);\r\n this._cleanupPeer(peerId);\r\n this._connections.delete(peerId);\r\n break;\r\n case ServerMessageType.Expire: // The offer sent to a peer has expired without response.\r\n this.emitError(PeerErrorType.PeerUnavailable, `Could not connect to peer ${peerId}`);\r\n break;\r\n case ServerMessageType.Offer: {\r\n // we should consider switching this to CALL/CONNECT, but this is the least breaking option.\r\n const connectionId = payload.connectionId;\r\n let connection = this.getConnection(peerId, connectionId);\r\n\r\n if (connection) {\r\n connection.close();\r\n logger.warn(`Offer received for existing Connection ID:${connectionId}`);\r\n }\r\n\r\n // Create a new connection.\r\n if (payload.type === ConnectionType.Media) {\r\n connection = new MediaConnection(peerId, this, {\r\n connectionId: connectionId,\r\n _payload: payload,\r\n metadata: payload.metadata\r\n });\r\n this._addConnection(peerId, connection);\r\n this.emit(PeerEventType.Call, connection);\r\n } else if (payload.type === ConnectionType.Data) {\r\n connection = new DataConnection(peerId, this, {\r\n connectionId: connectionId,\r\n _payload: payload,\r\n metadata: payload.metadata,\r\n label: payload.label,\r\n serialization: payload.serialization,\r\n reliable: payload.reliable\r\n });\r\n this._addConnection(peerId, connection);\r\n this.emit(PeerEventType.Connection, connection);\r\n } else {\r\n logger.warn(`Received malformed connection type:${payload.type}`);\r\n return;\r\n }\r\n\r\n // Find messages.\r\n const messages = this._getMessages(connectionId);\r\n for (let message of messages) {\r\n connection.handleMessage(message);\r\n }\r\n\r\n break;\r\n }\r\n default: {\r\n if (!payload) {\r\n logger.warn(`You received a malformed message from ${peerId} of type ${type}`);\r\n return;\r\n }\r\n\r\n const connectionId = payload.connectionId;\r\n const connection = this.getConnection(peerId, connectionId);\r\n\r\n if (connection && connection.peerConnection) {\r\n // Pass it on.\r\n connection.handleMessage(message);\r\n } else if (connectionId) {\r\n // Store for possible later use\r\n this._storeMessage(connectionId, message);\r\n } else {\r\n logger.warn(\"You received an unrecognized message:\", message);\r\n }\r\n break;\r\n }\r\n }\r\n }\r\n\r\n /** Stores messages without a set up connection, to be claimed later. */\r\n private _storeMessage(connectionId: string, message: ServerMessage): void {\r\n if (!this._lostMessages.has(connectionId)) {\r\n this._lostMessages.set(connectionId, []);\r\n }\r\n\r\n this._lostMessages.get(connectionId).push(message);\r\n }\r\n\r\n /** Retrieve messages from lost message store */\r\n //TODO Change it to private\r\n public _getMessages(connectionId: string): ServerMessage[] {\r\n const messages = this._lostMessages.get(connectionId);\r\n\r\n if (messages) {\r\n this._lostMessages.delete(connectionId);\r\n return messages;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n /**\r\n * Returns a DataConnection to the specified peer. See documentation for a\r\n * complete list of options.\r\n */\r\n connect(peer: string, options: PeerConnectOption = {}): DataConnection {\r\n if (this.disconnected) {\r\n logger.warn(\r\n \"You cannot connect to a new Peer because you called \" +\r\n \".disconnect() on this Peer and ended your connection with the \" +\r\n \"server. You can create a new Peer to reconnect, or call reconnect \" +\r\n \"on this peer if you believe its ID to still be available.\"\r\n );\r\n this.emitError(\r\n PeerErrorType.Disconnected,\r\n \"Cannot connect to new Peer after disconnecting from server.\"\r\n );\r\n return;\r\n }\r\n\r\n const dataConnection = new DataConnection(peer, this, options);\r\n this._addConnection(peer, dataConnection);\r\n return dataConnection;\r\n }\r\n\r\n /**\r\n * Returns a MediaConnection to the specified peer. See documentation for a\r\n * complete list of options.\r\n */\r\n call(peer: string, stream: MediaStream, options: any = {}): MediaConnection {\r\n if (this.disconnected) {\r\n logger.warn(\r\n \"You cannot connect to a new Peer because you called \" +\r\n \".disconnect() on this Peer and ended your connection with the \" +\r\n \"server. You can create a new Peer to reconnect.\"\r\n );\r\n this.emitError(\r\n PeerErrorType.Disconnected,\r\n \"Cannot connect to new Peer after disconnecting from server.\"\r\n );\r\n return;\r\n }\r\n\r\n if (!stream) {\r\n logger.error(\r\n \"To call a peer, you must provide a stream from your browser's `getUserMedia`.\"\r\n );\r\n return;\r\n }\r\n\r\n options._stream = stream;\r\n\r\n const mediaConnection = new MediaConnection(peer, this, options);\r\n this._addConnection(peer, mediaConnection);\r\n return mediaConnection;\r\n }\r\n\r\n /** Add a data/media connection to this peer. */\r\n private _addConnection(peerId: string, connection: BaseConnection): void {\r\n logger.log(`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`);\r\n\r\n if (!this._connections.has(peerId)) {\r\n this._connections.set(peerId, []);\r\n }\r\n this._connections.get(peerId).push(connection);\r\n }\r\n\r\n //TODO should be private\r\n _removeConnection(connection: BaseConnection): void {\r\n const connections = this._connections.get(connection.peer);\r\n\r\n if (connections) {\r\n const index = connections.indexOf(connection);\r\n\r\n if (index !== -1) {\r\n connections.splice(index, 1);\r\n }\r\n }\r\n\r\n //remove from lost messages\r\n this._lostMessages.delete(connection.connectionId);\r\n }\r\n\r\n /** Retrieve a data/media connection for this peer. */\r\n getConnection(peerId: string, connectionId: string): null | BaseConnection {\r\n const connections = this._connections.get(peerId);\r\n if (!connections) {\r\n return null;\r\n }\r\n\r\n for (let connection of connections) {\r\n if (connection.connectionId === connectionId) {\r\n return connection;\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _delayedAbort(type: PeerErrorType, message: string | Error): void {\r\n setTimeout(() => {\r\n this._abort(type, message);\r\n }, 0);\r\n }\r\n\r\n /**\r\n * Emits an error message and destroys the Peer.\r\n * The Peer is not destroyed if it's in a disconnected state, in which case\r\n * it retains its disconnected state and its existing connections.\r\n */\r\n private _abort(type: PeerErrorType, message: string | Error): void {\r\n logger.error(\"Aborting!\");\r\n\r\n this.emitError(type, message);\r\n\r\n if (!this._lastServerId) {\r\n this.destroy();\r\n } else {\r\n this.disconnect();\r\n }\r\n }\r\n\r\n /** Emits a typed error message. */\r\n emitError(type: PeerErrorType, err: string | Error): void {\r\n logger.error(\"Error:\", err);\r\n\r\n let error: Error & { type?: PeerErrorType };\r\n\r\n if (typeof err === \"string\") {\r\n error = new Error(err);\r\n } else {\r\n error = err as Error;\r\n }\r\n\r\n error.type = type;\r\n\r\n this.emit(PeerEventType.Error, error);\r\n }\r\n\r\n /**\r\n * Destroys the Peer: closes all active connections as well as the connection\r\n * to the server.\r\n * Warning: The peer can no longer create or accept connections after being\r\n * destroyed.\r\n */\r\n destroy(): void {\r\n if (this.destroyed) {\r\n return;\r\n }\r\n\r\n logger.log(`Destroy peer with ID:${this.id}`);\r\n\r\n this.disconnect();\r\n this._cleanup();\r\n\r\n this._destroyed = true;\r\n\r\n this.emit(PeerEventType.Close);\r\n }\r\n\r\n /** Disconnects every connection on this peer. */\r\n private _cleanup(): void {\r\n for (let peerId of this._connections.keys()) {\r\n this._cleanupPeer(peerId);\r\n this._connections.delete(peerId);\r\n }\r\n\r\n this.socket.removeAllListeners();\r\n }\r\n\r\n /** Closes all connections to this peer. */\r\n private _cleanupPeer(peerId: string): void {\r\n const connections = this._connections.get(peerId);\r\n\r\n if (!connections) return;\r\n\r\n for (let connection of connections) {\r\n connection.close();\r\n }\r\n }\r\n\r\n /**\r\n * Disconnects the Peer's connection to the PeerServer. Does not close any\r\n * active connections.\r\n * Warning: The peer can no longer create or accept connections after being\r\n * disconnected. It also cannot reconnect to the server.\r\n */\r\n disconnect(): void {\r\n if (this.disconnected) {\r\n return;\r\n }\r\n\r\n const currentId = this.id;\r\n\r\n logger.log(`Disconnect peer with ID:${currentId}`);\r\n\r\n this._disconnected = true;\r\n this._open = false;\r\n\r\n this.socket.close();\r\n\r\n this._lastServerId = currentId;\r\n this._id = null;\r\n\r\n this.emit(PeerEventType.Disconnected, currentId);\r\n }\r\n\r\n /** Attempts to reconnect with the same ID. */\r\n reconnect(): void {\r\n if (this.disconnected && !this.destroyed) {\r\n logger.log(`Attempting reconnection to server with ID ${this._lastServerId}`);\r\n this._disconnected = false;\r\n this._initialize(this._lastServerId!);\r\n } else if (this.destroyed) {\r\n throw new Error(\"This peer cannot reconnect to the server. It has already been destroyed.\");\r\n } else if (!this.disconnected && !this.open) {\r\n // Do nothing. We're still connecting the first time.\r\n logger.error(\"In a hurry? We're still trying to make the initial connection!\");\r\n } else {\r\n throw new Error(`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`);\r\n }\r\n }\r\n\r\n /**\r\n * Get a list of available peer IDs. If you're running your own server, you'll\r\n * want to set allow_discovery: true in the PeerServer options. If you're using\r\n * the cloud server, email team@peerjs.com to get the functionality enabled for\r\n * your key.\r\n */\r\n listAllPeers(cb = (_: any[]) => { }): void {\r\n this._api.listAllPeers()\r\n .then(peers => cb(peers))\r\n .catch(error => this._abort(PeerErrorType.ServerError, error));\r\n }\r\n}\r\n","import { util } from \"./util\";\r\nimport { Peer } from \"./peer\";\r\n\r\nexport const peerjs = {\r\n Peer,\r\n util\r\n};\r\n\r\nexport default Peer;\r\n\r\n(window).peerjs = peerjs;\r\n/** @deprecated Should use peerjs namespace */\r\n(window).Peer = Peer;\r\n"]} \ No newline at end of file diff --git a/lib/mediaconnection.ts b/lib/mediaconnection.ts index 2f5d0ffda..c1dc9bb31 100644 --- a/lib/mediaconnection.ts +++ b/lib/mediaconnection.ts @@ -16,6 +16,7 @@ export class MediaConnection extends BaseConnection { private _negotiator: Negotiator; private _localStream: MediaStream; private _remoteStream: MediaStream; + private _addTransceivers: Boolean; get type() { return ConnectionType.Media; @@ -32,12 +33,16 @@ export class MediaConnection extends BaseConnection { this.options.connectionId || MediaConnection.ID_PREFIX + util.randomToken(); + this._addTransceivers = + this.options.addTransceivers || false; + this._negotiator = new Negotiator(this); if (this._localStream) { this._negotiator.startConnection({ _stream: this._localStream, - originator: true + originator: true, + _addTransceivers: this._addTransceivers }); } } diff --git a/lib/negotiator.ts b/lib/negotiator.ts index 26e7044e1..87b34809e 100644 --- a/lib/negotiator.ts +++ b/lib/negotiator.ts @@ -19,7 +19,7 @@ export class Negotiator { this.connection.peerConnection = peerConnection; if (this.connection.type === ConnectionType.Media && options._stream) { - this._addTracksToConnection(options._stream, peerConnection); + this._addTracksToConnection(options._stream, peerConnection, options._addTransceivers); } // What do we need to do now? @@ -331,7 +331,8 @@ export class Negotiator { private _addTracksToConnection( stream: MediaStream, - peerConnection: RTCPeerConnection + peerConnection: RTCPeerConnection, + addTransceivers: Boolean ): void { logger.log(`add tracks from stream ${stream.id} to peer connection`); @@ -344,6 +345,16 @@ export class Negotiator { stream.getTracks().forEach(track => { peerConnection.addTrack(track, stream); }); + + if (addTransceivers) { + if (stream.getVideoTracks().length == 0) { + peerConnection.addTransceiver("video"); + } + + if (stream.getAudioTracks().length == 0) { + peerConnection.addTransceiver("audio"); + } + } } private _addStreamToMediaConnection(