13088 lines
1.5 MiB
13088 lines
1.5 MiB
diff --git a/node_modules/peerjs/dist/adapter.js b/node_modules/peerjs/dist/adapter.js
|
||
new file mode 100644
|
||
index 0000000..6bfbeb8
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/adapter.js
|
||
@@ -0,0 +1,8 @@
|
||
+"use strict";
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.webRTCAdapter = void 0;
|
||
+var webrtc_adapter_1 = __importDefault(require("webrtc-adapter"));
|
||
+exports.webRTCAdapter = webrtc_adapter_1.default;
|
||
diff --git a/node_modules/peerjs/dist/api.js b/node_modules/peerjs/dist/api.js
|
||
new file mode 100644
|
||
index 0000000..8c091c2
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/api.js
|
||
@@ -0,0 +1,142 @@
|
||
+"use strict";
|
||
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||
+ return new (P || (P = Promise))(function (resolve, reject) {
|
||
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
+ });
|
||
+};
|
||
+var __generator = (this && this.__generator) || function (thisArg, body) {
|
||
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||
+ function verb(n) { return function (v) { return step([n, v]); }; }
|
||
+ function step(op) {
|
||
+ if (f) throw new TypeError("Generator is already executing.");
|
||
+ while (_) try {
|
||
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||
+ if (y = 0, t) op = [op[0] & 2, t.value];
|
||
+ switch (op[0]) {
|
||
+ case 0: case 1: t = op; break;
|
||
+ case 4: _.label++; return { value: op[1], done: false };
|
||
+ case 5: _.label++; y = op[1]; op = [0]; continue;
|
||
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||
+ default:
|
||
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||
+ if (t[2]) _.ops.pop();
|
||
+ _.trys.pop(); continue;
|
||
+ }
|
||
+ op = body.call(thisArg, _);
|
||
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||
+ }
|
||
+};
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.API = void 0;
|
||
+var util_1 = require("./util");
|
||
+var logger_1 = __importDefault(require("./logger"));
|
||
+var API = /** @class */ (function () {
|
||
+ function API(_options) {
|
||
+ this._options = _options;
|
||
+ }
|
||
+ API.prototype._buildUrl = function (method) {
|
||
+ var protocol = this._options.secure ? "https://" : "http://";
|
||
+ var url = protocol +
|
||
+ this._options.host +
|
||
+ ":" +
|
||
+ this._options.port +
|
||
+ this._options.path +
|
||
+ this._options.key +
|
||
+ "/" +
|
||
+ method;
|
||
+ var queryString = "?ts=" + new Date().getTime() + "" + Math.random();
|
||
+ url += queryString;
|
||
+ return url;
|
||
+ };
|
||
+ /** Get a unique ID from the server via XHR and initialize with it. */
|
||
+ API.prototype.retrieveId = function () {
|
||
+ return __awaiter(this, void 0, void 0, function () {
|
||
+ var url, response, error_1, pathError;
|
||
+ return __generator(this, function (_a) {
|
||
+ switch (_a.label) {
|
||
+ case 0:
|
||
+ url = this._buildUrl("id");
|
||
+ _a.label = 1;
|
||
+ case 1:
|
||
+ _a.trys.push([1, 3, , 4]);
|
||
+ return [4 /*yield*/, fetch(url)];
|
||
+ case 2:
|
||
+ response = _a.sent();
|
||
+ if (response.status !== 200) {
|
||
+ throw new Error("Error. Status:" + response.status);
|
||
+ }
|
||
+ return [2 /*return*/, response.text()];
|
||
+ case 3:
|
||
+ error_1 = _a.sent();
|
||
+ logger_1.default.error("Error retrieving ID", error_1);
|
||
+ pathError = "";
|
||
+ if (this._options.path === "/" &&
|
||
+ this._options.host !== util_1.util.CLOUD_HOST) {
|
||
+ pathError =
|
||
+ " If you passed in a `path` to your self-hosted PeerServer, " +
|
||
+ "you'll also need to pass in that same path when creating a new " +
|
||
+ "Peer.";
|
||
+ }
|
||
+ throw new Error("Could not get an ID from the server." + pathError);
|
||
+ case 4: return [2 /*return*/];
|
||
+ }
|
||
+ });
|
||
+ });
|
||
+ };
|
||
+ /** @deprecated */
|
||
+ API.prototype.listAllPeers = function () {
|
||
+ return __awaiter(this, void 0, void 0, function () {
|
||
+ var url, response, helpfulError, error_2;
|
||
+ return __generator(this, function (_a) {
|
||
+ switch (_a.label) {
|
||
+ case 0:
|
||
+ url = this._buildUrl("peers");
|
||
+ _a.label = 1;
|
||
+ case 1:
|
||
+ _a.trys.push([1, 3, , 4]);
|
||
+ return [4 /*yield*/, fetch(url)];
|
||
+ case 2:
|
||
+ response = _a.sent();
|
||
+ if (response.status !== 200) {
|
||
+ if (response.status === 401) {
|
||
+ helpfulError = "";
|
||
+ if (this._options.host === util_1.util.CLOUD_HOST) {
|
||
+ helpfulError =
|
||
+ "It looks like you're using the cloud server. You can email " +
|
||
+ "team@peerjs.com to enable peer listing for your API key.";
|
||
+ }
|
||
+ else {
|
||
+ helpfulError =
|
||
+ "You need to enable `allow_discovery` on your self-hosted " +
|
||
+ "PeerServer to use this feature.";
|
||
+ }
|
||
+ throw new Error("It doesn't look like you have permission to list peers IDs. " +
|
||
+ helpfulError);
|
||
+ }
|
||
+ throw new Error("Error. Status:" + response.status);
|
||
+ }
|
||
+ return [2 /*return*/, response.json()];
|
||
+ case 3:
|
||
+ error_2 = _a.sent();
|
||
+ logger_1.default.error("Error retrieving list peers", error_2);
|
||
+ throw new Error("Could not get list peers from the server." + error_2);
|
||
+ case 4: return [2 /*return*/];
|
||
+ }
|
||
+ });
|
||
+ });
|
||
+ };
|
||
+ return API;
|
||
+}());
|
||
+exports.API = API;
|
||
diff --git a/node_modules/peerjs/dist/baseconnection.js b/node_modules/peerjs/dist/baseconnection.js
|
||
new file mode 100644
|
||
index 0000000..0c4e504
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/baseconnection.js
|
||
@@ -0,0 +1,40 @@
|
||
+"use strict";
|
||
+var __extends = (this && this.__extends) || (function () {
|
||
+ var extendStatics = function (d, b) {
|
||
+ extendStatics = Object.setPrototypeOf ||
|
||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
+ return extendStatics(d, b);
|
||
+ };
|
||
+ return function (d, b) {
|
||
+ if (typeof b !== "function" && b !== null)
|
||
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
+ extendStatics(d, b);
|
||
+ function __() { this.constructor = d; }
|
||
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
+ };
|
||
+})();
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.BaseConnection = void 0;
|
||
+var eventemitter3_1 = require("eventemitter3");
|
||
+var BaseConnection = /** @class */ (function (_super) {
|
||
+ __extends(BaseConnection, _super);
|
||
+ function BaseConnection(peer, provider, options) {
|
||
+ var _this = _super.call(this) || this;
|
||
+ _this.peer = peer;
|
||
+ _this.provider = provider;
|
||
+ _this.options = options;
|
||
+ _this._open = false;
|
||
+ _this.metadata = options.metadata;
|
||
+ return _this;
|
||
+ }
|
||
+ Object.defineProperty(BaseConnection.prototype, "open", {
|
||
+ get: function () {
|
||
+ return this._open;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ return BaseConnection;
|
||
+}(eventemitter3_1.EventEmitter));
|
||
+exports.BaseConnection = BaseConnection;
|
||
diff --git a/node_modules/peerjs/dist/dataconnection.js b/node_modules/peerjs/dist/dataconnection.js
|
||
new file mode 100644
|
||
index 0000000..64262ac
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/dataconnection.js
|
||
@@ -0,0 +1,298 @@
|
||
+"use strict";
|
||
+var __extends = (this && this.__extends) || (function () {
|
||
+ var extendStatics = function (d, b) {
|
||
+ extendStatics = Object.setPrototypeOf ||
|
||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
+ return extendStatics(d, b);
|
||
+ };
|
||
+ return function (d, b) {
|
||
+ if (typeof b !== "function" && b !== null)
|
||
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
+ extendStatics(d, b);
|
||
+ function __() { this.constructor = d; }
|
||
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
+ };
|
||
+})();
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.DataConnection = void 0;
|
||
+var util_1 = require("./util");
|
||
+var logger_1 = __importDefault(require("./logger"));
|
||
+var negotiator_1 = require("./negotiator");
|
||
+var enums_1 = require("./enums");
|
||
+var baseconnection_1 = require("./baseconnection");
|
||
+var encodingQueue_1 = require("./encodingQueue");
|
||
+/**
|
||
+ * Wraps a DataChannel between two Peers.
|
||
+ */
|
||
+// @ts-ignore
|
||
+var DataConnection = /** @class */ (function (_super) {
|
||
+ __extends(DataConnection, _super);
|
||
+ function DataConnection(peerId, provider, options) {
|
||
+ var _this = _super.call(this, peerId, provider, options) || this;
|
||
+ _this.stringify = JSON.stringify;
|
||
+ _this.parse = JSON.parse;
|
||
+ _this._buffer = [];
|
||
+ _this._bufferSize = 0;
|
||
+ _this._buffering = false;
|
||
+ _this._chunkedData = {};
|
||
+ _this._encodingQueue = new encodingQueue_1.EncodingQueue();
|
||
+ _this.connectionId =
|
||
+ _this.options.connectionId || DataConnection.ID_PREFIX + util_1.util.randomToken();
|
||
+ _this.label = _this.options.label || _this.connectionId;
|
||
+ _this.serialization = _this.options.serialization || enums_1.SerializationType.Binary;
|
||
+ _this.reliable = !!_this.options.reliable;
|
||
+ _this._encodingQueue.on('done', function (ab) {
|
||
+ _this._bufferedSend(ab);
|
||
+ });
|
||
+ _this._encodingQueue.on('error', function () {
|
||
+ logger_1.default.error("DC#" + _this.connectionId + ": Error occured in encoding from blob to arraybuffer, close DC");
|
||
+ _this.close();
|
||
+ });
|
||
+ _this._negotiator = new negotiator_1.Negotiator(_this);
|
||
+ _this._negotiator.startConnection(_this.options._payload || {
|
||
+ originator: true
|
||
+ });
|
||
+ return _this;
|
||
+ }
|
||
+ Object.defineProperty(DataConnection.prototype, "type", {
|
||
+ get: function () {
|
||
+ return enums_1.ConnectionType.Data;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(DataConnection.prototype, "dataChannel", {
|
||
+ get: function () {
|
||
+ return this._dc;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(DataConnection.prototype, "bufferSize", {
|
||
+ get: function () { return this._bufferSize; },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ /** Called by the Negotiator when the DataChannel is ready. */
|
||
+ DataConnection.prototype.initialize = function (dc) {
|
||
+ this._dc = dc;
|
||
+ this._configureDataChannel();
|
||
+ };
|
||
+ DataConnection.prototype._configureDataChannel = function () {
|
||
+ var _this = this;
|
||
+ if (!util_1.util.supports.binaryBlob || util_1.util.supports.reliable) {
|
||
+ this.dataChannel.binaryType = "arraybuffer";
|
||
+ }
|
||
+ this.dataChannel.onopen = function () {
|
||
+ logger_1.default.log("DC#" + _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);
|
||
+ _this._handleDataMessage(e);
|
||
+ };
|
||
+ this.dataChannel.onclose = function () {
|
||
+ logger_1.default.log("DC#" + _this.connectionId + " dc closed for:", _this.peer);
|
||
+ _this.close();
|
||
+ };
|
||
+ };
|
||
+ // Handles a DataChannel message.
|
||
+ DataConnection.prototype._handleDataMessage = function (_a) {
|
||
+ var _this = this;
|
||
+ var data = _a.data;
|
||
+ var datatype = data.constructor;
|
||
+ var isBinarySerialization = this.serialization === enums_1.SerializationType.Binary ||
|
||
+ this.serialization === enums_1.SerializationType.BinaryUTF8;
|
||
+ var deserializedData = data;
|
||
+ if (isBinarySerialization) {
|
||
+ if (datatype === Blob) {
|
||
+ // Datatype should never be blob
|
||
+ util_1.util.blobToArrayBuffer(data, function (ab) {
|
||
+ // @ts-ignore
|
||
+ var unpackedData = util_1.util.unpack(ab);
|
||
+ _this.emit(enums_1.ConnectionEventType.Data, unpackedData);
|
||
+ });
|
||
+ return;
|
||
+ }
|
||
+ else if (datatype === ArrayBuffer) {
|
||
+ deserializedData = util_1.util.unpack(data);
|
||
+ }
|
||
+ else if (datatype === String) {
|
||
+ // String fallback for binary data for browsers that don't support binary yet
|
||
+ var ab = util_1.util.binaryStringToArrayBuffer(data);
|
||
+ deserializedData = util_1.util.unpack(ab);
|
||
+ }
|
||
+ }
|
||
+ else if (this.serialization === enums_1.SerializationType.JSON) {
|
||
+ deserializedData = this.parse(data);
|
||
+ }
|
||
+ // Check if we've chunked--if so, piece things back together.
|
||
+ // We're guaranteed that this isn't 0.
|
||
+ if (deserializedData.__peerData) {
|
||
+ this._handleChunk(deserializedData);
|
||
+ return;
|
||
+ }
|
||
+ _super.prototype.emit.call(this, enums_1.ConnectionEventType.Data, deserializedData);
|
||
+ };
|
||
+ DataConnection.prototype._handleChunk = function (data) {
|
||
+ var id = data.__peerData;
|
||
+ var chunkInfo = this._chunkedData[id] || {
|
||
+ data: [],
|
||
+ count: 0,
|
||
+ total: data.total
|
||
+ };
|
||
+ chunkInfo.data[data.n] = data.data;
|
||
+ chunkInfo.count++;
|
||
+ this._chunkedData[id] = chunkInfo;
|
||
+ if (chunkInfo.total === chunkInfo.count) {
|
||
+ // Clean up before making the recursive call to `_handleDataMessage`.
|
||
+ delete this._chunkedData[id];
|
||
+ // We've received all the chunks--time to construct the complete data.
|
||
+ var data_1 = new Blob(chunkInfo.data);
|
||
+ this._handleDataMessage({ data: data_1 });
|
||
+ }
|
||
+ };
|
||
+ /**
|
||
+ * Exposed functionality for users.
|
||
+ */
|
||
+ /** Allows user to close connection. */
|
||
+ DataConnection.prototype.close = function () {
|
||
+ this._buffer = [];
|
||
+ this._bufferSize = 0;
|
||
+ this._chunkedData = {};
|
||
+ if (this._negotiator) {
|
||
+ this._negotiator.cleanup();
|
||
+ // @ts-ignore
|
||
+ this._negotiator = null;
|
||
+ }
|
||
+ if (this.provider) {
|
||
+ this.provider._removeConnection(this);
|
||
+ // @ts-ignore
|
||
+ this.provider = null;
|
||
+ }
|
||
+ if (this.dataChannel) {
|
||
+ this.dataChannel.onopen = null;
|
||
+ this.dataChannel.onmessage = null;
|
||
+ this.dataChannel.onclose = null;
|
||
+ // @ts-ignore
|
||
+ this._dc = null;
|
||
+ }
|
||
+ if (this._encodingQueue) {
|
||
+ this._encodingQueue.destroy();
|
||
+ this._encodingQueue.removeAllListeners();
|
||
+ // @ts-ignore
|
||
+ this._encodingQueue = null;
|
||
+ }
|
||
+ if (!this.open) {
|
||
+ return;
|
||
+ }
|
||
+ this._open = false;
|
||
+ _super.prototype.emit.call(this, enums_1.ConnectionEventType.Close);
|
||
+ };
|
||
+ /** Allows user to send data. */
|
||
+ DataConnection.prototype.send = function (data, chunked) {
|
||
+ if (!this.open) {
|
||
+ _super.prototype.emit.call(this, enums_1.ConnectionEventType.Error, new Error("Connection is not open. You should listen for the `open` event before sending messages."));
|
||
+ return;
|
||
+ }
|
||
+ if (this.serialization === enums_1.SerializationType.JSON) {
|
||
+ this._bufferedSend(this.stringify(data));
|
||
+ }
|
||
+ else if (this.serialization === enums_1.SerializationType.Binary ||
|
||
+ this.serialization === enums_1.SerializationType.BinaryUTF8) {
|
||
+ var blob = util_1.util.pack(data);
|
||
+ if (!chunked && blob.size > util_1.util.chunkedMTU) {
|
||
+ this._sendChunks(blob);
|
||
+ return;
|
||
+ }
|
||
+ if (!util_1.util.supports.binaryBlob) {
|
||
+ // We only do this if we really need to (e.g. blobs are not supported),
|
||
+ // because this conversion is costly.
|
||
+ this._encodingQueue.enque(blob);
|
||
+ }
|
||
+ else {
|
||
+ this._bufferedSend(blob);
|
||
+ }
|
||
+ }
|
||
+ else {
|
||
+ this._bufferedSend(data);
|
||
+ }
|
||
+ };
|
||
+ DataConnection.prototype._bufferedSend = function (msg) {
|
||
+ if (this._buffering || !this._trySend(msg)) {
|
||
+ this._buffer.push(msg);
|
||
+ this._bufferSize = this._buffer.length;
|
||
+ }
|
||
+ };
|
||
+ // Returns true if the send succeeds.
|
||
+ DataConnection.prototype._trySend = function (msg) {
|
||
+ var _this = this;
|
||
+ if (!this.open) {
|
||
+ return false;
|
||
+ }
|
||
+ if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {
|
||
+ this._buffering = true;
|
||
+ setTimeout(function () {
|
||
+ _this._buffering = false;
|
||
+ _this._tryBuffer();
|
||
+ }, 50);
|
||
+ return false;
|
||
+ }
|
||
+ try {
|
||
+ this.dataChannel.send(msg);
|
||
+ }
|
||
+ catch (e) {
|
||
+ logger_1.default.error("DC#:" + this.connectionId + " Error when sending:", e);
|
||
+ this._buffering = true;
|
||
+ this.close();
|
||
+ return false;
|
||
+ }
|
||
+ return true;
|
||
+ };
|
||
+ // Try to send the first message in the buffer.
|
||
+ DataConnection.prototype._tryBuffer = function () {
|
||
+ if (!this.open) {
|
||
+ return;
|
||
+ }
|
||
+ if (this._buffer.length === 0) {
|
||
+ return;
|
||
+ }
|
||
+ var msg = this._buffer[0];
|
||
+ if (this._trySend(msg)) {
|
||
+ this._buffer.shift();
|
||
+ this._bufferSize = this._buffer.length;
|
||
+ this._tryBuffer();
|
||
+ }
|
||
+ };
|
||
+ DataConnection.prototype._sendChunks = function (blob) {
|
||
+ var blobs = util_1.util.chunk(blob);
|
||
+ logger_1.default.log("DC#" + this.connectionId + " Try to send " + blobs.length + " chunks...");
|
||
+ for (var _i = 0, blobs_1 = blobs; _i < blobs_1.length; _i++) {
|
||
+ var blob_1 = blobs_1[_i];
|
||
+ this.send(blob_1, true);
|
||
+ }
|
||
+ };
|
||
+ DataConnection.prototype.handleMessage = function (message) {
|
||
+ var payload = message.payload;
|
||
+ switch (message.type) {
|
||
+ case enums_1.ServerMessageType.Answer:
|
||
+ this._negotiator.handleSDP(message.type, payload.sdp);
|
||
+ break;
|
||
+ case enums_1.ServerMessageType.Candidate:
|
||
+ this._negotiator.handleCandidate(payload.candidate);
|
||
+ break;
|
||
+ default:
|
||
+ logger_1.default.warn("Unrecognized message type:", message.type, "from peer:", this.peer);
|
||
+ break;
|
||
+ }
|
||
+ };
|
||
+ DataConnection.ID_PREFIX = "dc_";
|
||
+ DataConnection.MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;
|
||
+ return DataConnection;
|
||
+}(baseconnection_1.BaseConnection));
|
||
+exports.DataConnection = DataConnection;
|
||
diff --git a/node_modules/peerjs/dist/encodingQueue.js b/node_modules/peerjs/dist/encodingQueue.js
|
||
new file mode 100644
|
||
index 0000000..c9ca6b5
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/encodingQueue.js
|
||
@@ -0,0 +1,88 @@
|
||
+"use strict";
|
||
+var __extends = (this && this.__extends) || (function () {
|
||
+ var extendStatics = function (d, b) {
|
||
+ extendStatics = Object.setPrototypeOf ||
|
||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
+ return extendStatics(d, b);
|
||
+ };
|
||
+ return function (d, b) {
|
||
+ if (typeof b !== "function" && b !== null)
|
||
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
+ extendStatics(d, b);
|
||
+ function __() { this.constructor = d; }
|
||
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
+ };
|
||
+})();
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.EncodingQueue = void 0;
|
||
+var eventemitter3_1 = require("eventemitter3");
|
||
+var logger_1 = __importDefault(require("./logger"));
|
||
+var EncodingQueue = /** @class */ (function (_super) {
|
||
+ __extends(EncodingQueue, _super);
|
||
+ function EncodingQueue() {
|
||
+ var _this = _super.call(this) || this;
|
||
+ _this.fileReader = new FileReader();
|
||
+ _this._queue = [];
|
||
+ _this._processing = false;
|
||
+ _this.fileReader.onload = function (evt) {
|
||
+ _this._processing = false;
|
||
+ if (evt.target) {
|
||
+ _this.emit('done', evt.target.result);
|
||
+ }
|
||
+ _this.doNextTask();
|
||
+ };
|
||
+ _this.fileReader.onerror = function (evt) {
|
||
+ logger_1.default.error("EncodingQueue error:", evt);
|
||
+ _this._processing = false;
|
||
+ _this.destroy();
|
||
+ _this.emit('error', evt);
|
||
+ };
|
||
+ return _this;
|
||
+ }
|
||
+ Object.defineProperty(EncodingQueue.prototype, "queue", {
|
||
+ get: function () {
|
||
+ return this._queue;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(EncodingQueue.prototype, "size", {
|
||
+ get: function () {
|
||
+ return this.queue.length;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(EncodingQueue.prototype, "processing", {
|
||
+ get: function () {
|
||
+ return this._processing;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ EncodingQueue.prototype.enque = function (blob) {
|
||
+ this.queue.push(blob);
|
||
+ if (this.processing)
|
||
+ return;
|
||
+ this.doNextTask();
|
||
+ };
|
||
+ EncodingQueue.prototype.destroy = function () {
|
||
+ this.fileReader.abort();
|
||
+ this._queue = [];
|
||
+ };
|
||
+ EncodingQueue.prototype.doNextTask = function () {
|
||
+ if (this.size === 0)
|
||
+ return;
|
||
+ if (this.processing)
|
||
+ return;
|
||
+ this._processing = true;
|
||
+ // @ts-ignore
|
||
+ this.fileReader.readAsArrayBuffer(this.queue.shift());
|
||
+ };
|
||
+ return EncodingQueue;
|
||
+}(eventemitter3_1.EventEmitter));
|
||
+exports.EncodingQueue = EncodingQueue;
|
||
diff --git a/node_modules/peerjs/dist/enums.js b/node_modules/peerjs/dist/enums.js
|
||
new file mode 100644
|
||
index 0000000..9e551a4
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/enums.js
|
||
@@ -0,0 +1,67 @@
|
||
+"use strict";
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.ServerMessageType = exports.SocketEventType = exports.SerializationType = exports.PeerErrorType = exports.PeerEventType = exports.ConnectionType = exports.ConnectionEventType = void 0;
|
||
+var ConnectionEventType;
|
||
+(function (ConnectionEventType) {
|
||
+ ConnectionEventType["Open"] = "open";
|
||
+ ConnectionEventType["Stream"] = "stream";
|
||
+ ConnectionEventType["Data"] = "data";
|
||
+ ConnectionEventType["Close"] = "close";
|
||
+ ConnectionEventType["Error"] = "error";
|
||
+ ConnectionEventType["IceStateChanged"] = "iceStateChanged";
|
||
+})(ConnectionEventType = exports.ConnectionEventType || (exports.ConnectionEventType = {}));
|
||
+var ConnectionType;
|
||
+(function (ConnectionType) {
|
||
+ ConnectionType["Data"] = "data";
|
||
+ ConnectionType["Media"] = "media";
|
||
+})(ConnectionType = exports.ConnectionType || (exports.ConnectionType = {}));
|
||
+var PeerEventType;
|
||
+(function (PeerEventType) {
|
||
+ PeerEventType["Open"] = "open";
|
||
+ PeerEventType["Close"] = "close";
|
||
+ PeerEventType["Connection"] = "connection";
|
||
+ PeerEventType["Call"] = "call";
|
||
+ PeerEventType["Disconnected"] = "disconnected";
|
||
+ PeerEventType["Error"] = "error";
|
||
+})(PeerEventType = exports.PeerEventType || (exports.PeerEventType = {}));
|
||
+var PeerErrorType;
|
||
+(function (PeerErrorType) {
|
||
+ PeerErrorType["BrowserIncompatible"] = "browser-incompatible";
|
||
+ PeerErrorType["Disconnected"] = "disconnected";
|
||
+ PeerErrorType["InvalidID"] = "invalid-id";
|
||
+ PeerErrorType["InvalidKey"] = "invalid-key";
|
||
+ PeerErrorType["Network"] = "network";
|
||
+ PeerErrorType["PeerUnavailable"] = "peer-unavailable";
|
||
+ PeerErrorType["SslUnavailable"] = "ssl-unavailable";
|
||
+ PeerErrorType["ServerError"] = "server-error";
|
||
+ PeerErrorType["SocketError"] = "socket-error";
|
||
+ PeerErrorType["SocketClosed"] = "socket-closed";
|
||
+ PeerErrorType["UnavailableID"] = "unavailable-id";
|
||
+ PeerErrorType["WebRTC"] = "webrtc";
|
||
+})(PeerErrorType = exports.PeerErrorType || (exports.PeerErrorType = {}));
|
||
+var SerializationType;
|
||
+(function (SerializationType) {
|
||
+ SerializationType["Binary"] = "binary";
|
||
+ SerializationType["BinaryUTF8"] = "binary-utf8";
|
||
+ SerializationType["JSON"] = "json";
|
||
+})(SerializationType = exports.SerializationType || (exports.SerializationType = {}));
|
||
+var SocketEventType;
|
||
+(function (SocketEventType) {
|
||
+ SocketEventType["Message"] = "message";
|
||
+ SocketEventType["Disconnected"] = "disconnected";
|
||
+ SocketEventType["Error"] = "error";
|
||
+ SocketEventType["Close"] = "close";
|
||
+})(SocketEventType = exports.SocketEventType || (exports.SocketEventType = {}));
|
||
+var ServerMessageType;
|
||
+(function (ServerMessageType) {
|
||
+ ServerMessageType["Heartbeat"] = "HEARTBEAT";
|
||
+ ServerMessageType["Candidate"] = "CANDIDATE";
|
||
+ ServerMessageType["Offer"] = "OFFER";
|
||
+ ServerMessageType["Answer"] = "ANSWER";
|
||
+ ServerMessageType["Open"] = "OPEN";
|
||
+ ServerMessageType["Error"] = "ERROR";
|
||
+ ServerMessageType["IdTaken"] = "ID-TAKEN";
|
||
+ ServerMessageType["InvalidKey"] = "INVALID-KEY";
|
||
+ ServerMessageType["Leave"] = "LEAVE";
|
||
+ ServerMessageType["Expire"] = "EXPIRE"; // The offer sent to a peer has expired without response.
|
||
+})(ServerMessageType = exports.ServerMessageType || (exports.ServerMessageType = {}));
|
||
diff --git a/node_modules/peerjs/dist/exports.js b/node_modules/peerjs/dist/exports.js
|
||
new file mode 100644
|
||
index 0000000..d6e2666
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/exports.js
|
||
@@ -0,0 +1,13 @@
|
||
+"use strict";
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.peerjs = void 0;
|
||
+var util_1 = require("./util");
|
||
+var peer_1 = require("./peer");
|
||
+exports.peerjs = {
|
||
+ Peer: peer_1.Peer,
|
||
+ util: util_1.util
|
||
+};
|
||
+exports.default = peer_1.Peer;
|
||
+window.peerjs = exports.peerjs;
|
||
+/** @deprecated Should use peerjs namespace */
|
||
+window.Peer = peer_1.Peer;
|
||
diff --git a/node_modules/peerjs/dist/index.js b/node_modules/peerjs/dist/index.js
|
||
new file mode 100644
|
||
index 0000000..e7d6ac1
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/index.js
|
||
@@ -0,0 +1,27 @@
|
||
+"use strict";
|
||
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||
+ if (k2 === undefined) k2 = k;
|
||
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||
+}) : (function(o, m, k, k2) {
|
||
+ if (k2 === undefined) k2 = k;
|
||
+ o[k2] = m[k];
|
||
+}));
|
||
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
||
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+__exportStar(require("./adapter"), exports);
|
||
+__exportStar(require("./api"), exports);
|
||
+__exportStar(require("./baseconnection"), exports);
|
||
+__exportStar(require("./dataconnection"), exports);
|
||
+__exportStar(require("./encodingQueue"), exports);
|
||
+__exportStar(require("./enums"), exports);
|
||
+__exportStar(require("./exports"), exports);
|
||
+__exportStar(require("./logger"), exports);
|
||
+__exportStar(require("./mediaconnection"), exports);
|
||
+__exportStar(require("./negotiator"), exports);
|
||
+__exportStar(require("./peer"), exports);
|
||
+__exportStar(require("./servermessage"), exports);
|
||
+__exportStar(require("./socket"), exports);
|
||
+__exportStar(require("./supports"), exports);
|
||
+__exportStar(require("./util"), exports);
|
||
diff --git a/node_modules/peerjs/dist/logger.js b/node_modules/peerjs/dist/logger.js
|
||
new file mode 100644
|
||
index 0000000..9a5e883
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/logger.js
|
||
@@ -0,0 +1,87 @@
|
||
+"use strict";
|
||
+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];
|
||
+ return to;
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+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.
|
||
+*/
|
||
+var LogLevel;
|
||
+(function (LogLevel) {
|
||
+ LogLevel[LogLevel["Disabled"] = 0] = "Disabled";
|
||
+ LogLevel[LogLevel["Errors"] = 1] = "Errors";
|
||
+ LogLevel[LogLevel["Warnings"] = 2] = "Warnings";
|
||
+ LogLevel[LogLevel["All"] = 3] = "All";
|
||
+})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));
|
||
+var Logger = /** @class */ (function () {
|
||
+ function Logger() {
|
||
+ this._logLevel = LogLevel.Disabled;
|
||
+ }
|
||
+ Object.defineProperty(Logger.prototype, "logLevel", {
|
||
+ get: function () { return this._logLevel; },
|
||
+ set: function (logLevel) { this._logLevel = logLevel; },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Logger.prototype.log = function () {
|
||
+ var args = [];
|
||
+ for (var _i = 0; _i < arguments.length; _i++) {
|
||
+ args[_i] = arguments[_i];
|
||
+ }
|
||
+ if (this._logLevel >= LogLevel.All) {
|
||
+ this._print.apply(this, __spreadArray([LogLevel.All], args));
|
||
+ }
|
||
+ };
|
||
+ Logger.prototype.warn = function () {
|
||
+ var args = [];
|
||
+ for (var _i = 0; _i < arguments.length; _i++) {
|
||
+ args[_i] = arguments[_i];
|
||
+ }
|
||
+ if (this._logLevel >= LogLevel.Warnings) {
|
||
+ this._print.apply(this, __spreadArray([LogLevel.Warnings], args));
|
||
+ }
|
||
+ };
|
||
+ Logger.prototype.error = function () {
|
||
+ var args = [];
|
||
+ for (var _i = 0; _i < arguments.length; _i++) {
|
||
+ args[_i] = arguments[_i];
|
||
+ }
|
||
+ if (this._logLevel >= LogLevel.Errors) {
|
||
+ this._print.apply(this, __spreadArray([LogLevel.Errors], args));
|
||
+ }
|
||
+ };
|
||
+ Logger.prototype.setLogFunction = function (fn) {
|
||
+ this._print = fn;
|
||
+ };
|
||
+ Logger.prototype._print = function (logLevel) {
|
||
+ var rest = [];
|
||
+ for (var _i = 1; _i < arguments.length; _i++) {
|
||
+ rest[_i - 1] = arguments[_i];
|
||
+ }
|
||
+ var copy = __spreadArray([LOG_PREFIX], rest);
|
||
+ for (var i in copy) {
|
||
+ if (copy[i] instanceof Error) {
|
||
+ copy[i] = "(" + copy[i].name + ") " + copy[i].message;
|
||
+ }
|
||
+ }
|
||
+ if (logLevel >= LogLevel.All) {
|
||
+ console.log.apply(console, copy);
|
||
+ }
|
||
+ else if (logLevel >= LogLevel.Warnings) {
|
||
+ console.warn.apply(console, __spreadArray(["WARNING"], copy));
|
||
+ }
|
||
+ else if (logLevel >= LogLevel.Errors) {
|
||
+ console.error.apply(console, __spreadArray(["ERROR"], copy));
|
||
+ }
|
||
+ };
|
||
+ return Logger;
|
||
+}());
|
||
+exports.default = new Logger();
|
||
diff --git a/node_modules/peerjs/dist/mediaconnection.js b/node_modules/peerjs/dist/mediaconnection.js
|
||
new file mode 100644
|
||
index 0000000..2318160
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/mediaconnection.js
|
||
@@ -0,0 +1,148 @@
|
||
+"use strict";
|
||
+var __extends = (this && this.__extends) || (function () {
|
||
+ var extendStatics = function (d, b) {
|
||
+ extendStatics = Object.setPrototypeOf ||
|
||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
+ return extendStatics(d, b);
|
||
+ };
|
||
+ return function (d, b) {
|
||
+ if (typeof b !== "function" && b !== null)
|
||
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
+ extendStatics(d, b);
|
||
+ function __() { this.constructor = d; }
|
||
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
+ };
|
||
+})();
|
||
+var __assign = (this && this.__assign) || function () {
|
||
+ __assign = Object.assign || function(t) {
|
||
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
+ s = arguments[i];
|
||
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||
+ t[p] = s[p];
|
||
+ }
|
||
+ return t;
|
||
+ };
|
||
+ return __assign.apply(this, arguments);
|
||
+};
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.MediaConnection = void 0;
|
||
+var util_1 = require("./util");
|
||
+var logger_1 = __importDefault(require("./logger"));
|
||
+var negotiator_1 = require("./negotiator");
|
||
+var enums_1 = require("./enums");
|
||
+var baseconnection_1 = require("./baseconnection");
|
||
+/**
|
||
+ * Wraps the streaming interface between two Peers.
|
||
+ */
|
||
+var MediaConnection = /** @class */ (function (_super) {
|
||
+ __extends(MediaConnection, _super);
|
||
+ function MediaConnection(peerId, provider, options) {
|
||
+ var _this = _super.call(this, peerId, provider, options) || this;
|
||
+ _this._localStream = _this.options._stream;
|
||
+ _this.connectionId =
|
||
+ _this.options.connectionId ||
|
||
+ MediaConnection.ID_PREFIX + util_1.util.randomToken();
|
||
+ _this._negotiator = new negotiator_1.Negotiator(_this);
|
||
+ if (_this._localStream) {
|
||
+ _this._negotiator.startConnection({
|
||
+ _stream: _this._localStream,
|
||
+ originator: true
|
||
+ });
|
||
+ }
|
||
+ return _this;
|
||
+ }
|
||
+ Object.defineProperty(MediaConnection.prototype, "type", {
|
||
+ get: function () {
|
||
+ return enums_1.ConnectionType.Media;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(MediaConnection.prototype, "localStream", {
|
||
+ get: function () { return this._localStream; },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(MediaConnection.prototype, "remoteStream", {
|
||
+ get: function () { return this._remoteStream; },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ // @ts-ignore
|
||
+ MediaConnection.prototype.addStream = function (remoteStream) {
|
||
+ logger_1.default.log("Receiving stream", remoteStream);
|
||
+ this._remoteStream = remoteStream;
|
||
+ _super.prototype.emit.call(this, enums_1.ConnectionEventType.Stream, remoteStream); // Should we call this `open`?
|
||
+ };
|
||
+ MediaConnection.prototype.handleMessage = function (message) {
|
||
+ var type = message.type;
|
||
+ var payload = message.payload;
|
||
+ switch (message.type) {
|
||
+ case enums_1.ServerMessageType.Answer:
|
||
+ // Forward to negotiator
|
||
+ this._negotiator.handleSDP(type, payload.sdp);
|
||
+ this._open = true;
|
||
+ break;
|
||
+ case enums_1.ServerMessageType.Candidate:
|
||
+ this._negotiator.handleCandidate(payload.candidate);
|
||
+ break;
|
||
+ default:
|
||
+ logger_1.default.warn("Unrecognized message type:" + type + " from peer:" + this.peer);
|
||
+ break;
|
||
+ }
|
||
+ };
|
||
+ MediaConnection.prototype.answer = function (stream, options) {
|
||
+ if (options === void 0) { options = {}; }
|
||
+ if (this._localStream) {
|
||
+ logger_1.default.warn("Local stream already exists on this MediaConnection. Are you answering a call twice?");
|
||
+ return;
|
||
+ }
|
||
+ this._localStream = stream;
|
||
+ if (options && options.sdpTransform) {
|
||
+ this.options.sdpTransform = options.sdpTransform;
|
||
+ }
|
||
+ this._negotiator.startConnection(__assign(__assign({}, this.options._payload), { _stream: stream }));
|
||
+ // Retrieve lost messages stored because PeerConnection not set up.
|
||
+ var messages = this.provider._getMessages(this.connectionId);
|
||
+ for (var _i = 0, messages_1 = messages; _i < messages_1.length; _i++) {
|
||
+ var message = messages_1[_i];
|
||
+ this.handleMessage(message);
|
||
+ }
|
||
+ this._open = true;
|
||
+ };
|
||
+ /**
|
||
+ * Exposed functionality for users.
|
||
+ */
|
||
+ /** Allows user to close connection. */
|
||
+ MediaConnection.prototype.close = function () {
|
||
+ if (this._negotiator) {
|
||
+ this._negotiator.cleanup();
|
||
+ // @ts-ignore
|
||
+ this._negotiator = null;
|
||
+ }
|
||
+ // @ts-ignore
|
||
+ this._localStream = null;
|
||
+ // @ts-ignore
|
||
+ this._remoteStream = null;
|
||
+ if (this.provider) {
|
||
+ this.provider._removeConnection(this);
|
||
+ // @ts-ignore
|
||
+ this.provider = null;
|
||
+ }
|
||
+ if (this.options && this.options._stream) {
|
||
+ this.options._stream = null;
|
||
+ }
|
||
+ if (!this.open) {
|
||
+ return;
|
||
+ }
|
||
+ this._open = false;
|
||
+ _super.prototype.emit.call(this, enums_1.ConnectionEventType.Close);
|
||
+ };
|
||
+ MediaConnection.ID_PREFIX = "mc_";
|
||
+ return MediaConnection;
|
||
+}(baseconnection_1.BaseConnection));
|
||
+exports.MediaConnection = MediaConnection;
|
||
diff --git a/node_modules/peerjs/dist/negotiator.js b/node_modules/peerjs/dist/negotiator.js
|
||
new file mode 100644
|
||
index 0000000..afd9687
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/negotiator.js
|
||
@@ -0,0 +1,385 @@
|
||
+"use strict";
|
||
+var __assign = (this && this.__assign) || function () {
|
||
+ __assign = Object.assign || function(t) {
|
||
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
+ s = arguments[i];
|
||
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||
+ t[p] = s[p];
|
||
+ }
|
||
+ return t;
|
||
+ };
|
||
+ return __assign.apply(this, arguments);
|
||
+};
|
||
+var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
||
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
||
+ return new (P || (P = Promise))(function (resolve, reject) {
|
||
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
||
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
||
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
||
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
+ });
|
||
+};
|
||
+var __generator = (this && this.__generator) || function (thisArg, body) {
|
||
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
||
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
||
+ function verb(n) { return function (v) { return step([n, v]); }; }
|
||
+ function step(op) {
|
||
+ if (f) throw new TypeError("Generator is already executing.");
|
||
+ while (_) try {
|
||
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||
+ if (y = 0, t) op = [op[0] & 2, t.value];
|
||
+ switch (op[0]) {
|
||
+ case 0: case 1: t = op; break;
|
||
+ case 4: _.label++; return { value: op[1], done: false };
|
||
+ case 5: _.label++; y = op[1]; op = [0]; continue;
|
||
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
||
+ default:
|
||
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
||
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
||
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
||
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
||
+ if (t[2]) _.ops.pop();
|
||
+ _.trys.pop(); continue;
|
||
+ }
|
||
+ op = body.call(thisArg, _);
|
||
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
||
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
||
+ }
|
||
+};
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.Negotiator = void 0;
|
||
+var util_1 = require("./util");
|
||
+var logger_1 = __importDefault(require("./logger"));
|
||
+var enums_1 = require("./enums");
|
||
+/**
|
||
+ * Manages all negotiations between Peers.
|
||
+ */
|
||
+var Negotiator = /** @class */ (function () {
|
||
+ function Negotiator(connection) {
|
||
+ this.connection = connection;
|
||
+ }
|
||
+ /** Returns a PeerConnection object set up correctly (for data, media). */
|
||
+ Negotiator.prototype.startConnection = function (options) {
|
||
+ var peerConnection = this._startPeerConnection();
|
||
+ // Set the connection's PC.
|
||
+ this.connection.peerConnection = peerConnection;
|
||
+ if (this.connection.type === enums_1.ConnectionType.Media && options._stream) {
|
||
+ this._addTracksToConnection(options._stream, peerConnection);
|
||
+ }
|
||
+ // What do we need to do now?
|
||
+ if (options.originator) {
|
||
+ if (this.connection.type === enums_1.ConnectionType.Data) {
|
||
+ var dataConnection = this.connection;
|
||
+ var config = { ordered: !!options.reliable };
|
||
+ var dataChannel = peerConnection.createDataChannel(dataConnection.label, config);
|
||
+ dataConnection.initialize(dataChannel);
|
||
+ }
|
||
+ this._makeOffer();
|
||
+ }
|
||
+ else {
|
||
+ this.handleSDP("OFFER", options.sdp);
|
||
+ }
|
||
+ };
|
||
+ /** Start a PC. */
|
||
+ Negotiator.prototype._startPeerConnection = function () {
|
||
+ logger_1.default.log("Creating RTCPeerConnection.");
|
||
+ var peerConnection = new RTCPeerConnection(this.connection.provider.options.config);
|
||
+ this._setupListeners(peerConnection);
|
||
+ return peerConnection;
|
||
+ };
|
||
+ /** Set up various WebRTC listeners. */
|
||
+ Negotiator.prototype._setupListeners = function (peerConnection) {
|
||
+ var _this = this;
|
||
+ var peerId = this.connection.peer;
|
||
+ var connectionId = this.connection.connectionId;
|
||
+ var connectionType = this.connection.type;
|
||
+ var provider = this.connection.provider;
|
||
+ // ICE CANDIDATES.
|
||
+ logger_1.default.log("Listening for ICE candidates.");
|
||
+ peerConnection.onicecandidate = function (evt) {
|
||
+ if (!evt.candidate || !evt.candidate.candidate)
|
||
+ return;
|
||
+ logger_1.default.log("Received ICE candidates for " + peerId + ":", evt.candidate);
|
||
+ provider.socket.send({
|
||
+ type: enums_1.ServerMessageType.Candidate,
|
||
+ payload: {
|
||
+ candidate: evt.candidate,
|
||
+ type: connectionType,
|
||
+ connectionId: connectionId
|
||
+ },
|
||
+ dst: peerId
|
||
+ });
|
||
+ };
|
||
+ peerConnection.oniceconnectionstatechange = function () {
|
||
+ switch (peerConnection.iceConnectionState) {
|
||
+ case "failed":
|
||
+ logger_1.default.log("iceConnectionState is failed, closing connections to " +
|
||
+ peerId);
|
||
+ _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Negotiation of connection to " + peerId + " failed."));
|
||
+ _this.connection.close();
|
||
+ break;
|
||
+ case "closed":
|
||
+ logger_1.default.log("iceConnectionState is closed, closing connections to " +
|
||
+ peerId);
|
||
+ _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " closed."));
|
||
+ _this.connection.close();
|
||
+ break;
|
||
+ case "disconnected":
|
||
+ logger_1.default.log("iceConnectionState changed to disconnected on the connection with " +
|
||
+ peerId);
|
||
+ break;
|
||
+ case "completed":
|
||
+ peerConnection.onicecandidate = util_1.util.noop;
|
||
+ break;
|
||
+ }
|
||
+ _this.connection.emit(enums_1.ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);
|
||
+ };
|
||
+ // DATACONNECTION.
|
||
+ logger_1.default.log("Listening for data channel");
|
||
+ // Fired between offer and answer, so options should already be saved
|
||
+ // in the options hash.
|
||
+ peerConnection.ondatachannel = function (evt) {
|
||
+ logger_1.default.log("Received data channel");
|
||
+ var dataChannel = evt.channel;
|
||
+ var connection = (provider.getConnection(peerId, connectionId));
|
||
+ connection.initialize(dataChannel);
|
||
+ };
|
||
+ // MEDIACONNECTION.
|
||
+ logger_1.default.log("Listening for remote stream");
|
||
+ peerConnection.ontrack = function (evt) {
|
||
+ logger_1.default.log("Received remote stream");
|
||
+ var stream = evt.streams[0];
|
||
+ var connection = provider.getConnection(peerId, connectionId);
|
||
+ // @ts-ignore
|
||
+ if (connection.type === enums_1.ConnectionType.Media) {
|
||
+ var mediaConnection = connection;
|
||
+ _this._addStreamToMediaConnection(stream, mediaConnection);
|
||
+ }
|
||
+ };
|
||
+ };
|
||
+ Negotiator.prototype.cleanup = function () {
|
||
+ logger_1.default.log("Cleaning up PeerConnection to " + this.connection.peer);
|
||
+ var peerConnection = this.connection.peerConnection;
|
||
+ if (!peerConnection) {
|
||
+ return;
|
||
+ }
|
||
+ // @ts-ignore
|
||
+ this.connection.peerConnection = null;
|
||
+ //unsubscribe from all PeerConnection's events
|
||
+ peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = function () { };
|
||
+ var peerConnectionNotClosed = peerConnection.signalingState !== "closed";
|
||
+ var dataChannelNotClosed = false;
|
||
+ if (this.connection.type === enums_1.ConnectionType.Data) {
|
||
+ var dataConnection = this.connection;
|
||
+ var dataChannel = dataConnection.dataChannel;
|
||
+ if (dataChannel) {
|
||
+ dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== "closed";
|
||
+ }
|
||
+ }
|
||
+ if (peerConnectionNotClosed || dataChannelNotClosed) {
|
||
+ peerConnection.close();
|
||
+ }
|
||
+ };
|
||
+ Negotiator.prototype._makeOffer = function () {
|
||
+ return __awaiter(this, void 0, void 0, function () {
|
||
+ var peerConnection, provider, offer, payload, dataConnection, err_2, err_1_1;
|
||
+ return __generator(this, function (_a) {
|
||
+ switch (_a.label) {
|
||
+ case 0:
|
||
+ peerConnection = this.connection.peerConnection;
|
||
+ provider = this.connection.provider;
|
||
+ _a.label = 1;
|
||
+ case 1:
|
||
+ _a.trys.push([1, 7, , 8]);
|
||
+ return [4 /*yield*/, peerConnection.createOffer(this.connection.options.constraints)];
|
||
+ case 2:
|
||
+ offer = _a.sent();
|
||
+ logger_1.default.log("Created offer.");
|
||
+ if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {
|
||
+ offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;
|
||
+ }
|
||
+ _a.label = 3;
|
||
+ case 3:
|
||
+ _a.trys.push([3, 5, , 6]);
|
||
+ return [4 /*yield*/, peerConnection.setLocalDescription(offer)];
|
||
+ case 4:
|
||
+ _a.sent();
|
||
+ logger_1.default.log("Set localDescription:", offer, "for:" + this.connection.peer);
|
||
+ payload = {
|
||
+ sdp: offer,
|
||
+ type: this.connection.type,
|
||
+ connectionId: this.connection.connectionId,
|
||
+ metadata: this.connection.metadata,
|
||
+ browser: util_1.util.browser
|
||
+ };
|
||
+ if (this.connection.type === enums_1.ConnectionType.Data) {
|
||
+ dataConnection = this.connection;
|
||
+ payload = __assign(__assign({}, payload), { label: dataConnection.label, reliable: dataConnection.reliable, serialization: dataConnection.serialization });
|
||
+ }
|
||
+ provider.socket.send({
|
||
+ type: enums_1.ServerMessageType.Offer,
|
||
+ payload: payload,
|
||
+ dst: this.connection.peer
|
||
+ });
|
||
+ return [3 /*break*/, 6];
|
||
+ case 5:
|
||
+ err_2 = _a.sent();
|
||
+ // TODO: investigate why _makeOffer is being called from the answer
|
||
+ if (err_2 !=
|
||
+ "OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer") {
|
||
+ provider.emitError(enums_1.PeerErrorType.WebRTC, err_2);
|
||
+ logger_1.default.log("Failed to setLocalDescription, ", err_2);
|
||
+ }
|
||
+ return [3 /*break*/, 6];
|
||
+ case 6: return [3 /*break*/, 8];
|
||
+ case 7:
|
||
+ err_1_1 = _a.sent();
|
||
+ provider.emitError(enums_1.PeerErrorType.WebRTC, err_1_1);
|
||
+ logger_1.default.log("Failed to createOffer, ", err_1_1);
|
||
+ return [3 /*break*/, 8];
|
||
+ case 8: return [2 /*return*/];
|
||
+ }
|
||
+ });
|
||
+ });
|
||
+ };
|
||
+ Negotiator.prototype._makeAnswer = function () {
|
||
+ return __awaiter(this, void 0, void 0, function () {
|
||
+ var peerConnection, provider, answer, err_3, err_1_2;
|
||
+ return __generator(this, function (_a) {
|
||
+ switch (_a.label) {
|
||
+ case 0:
|
||
+ peerConnection = this.connection.peerConnection;
|
||
+ provider = this.connection.provider;
|
||
+ _a.label = 1;
|
||
+ case 1:
|
||
+ _a.trys.push([1, 7, , 8]);
|
||
+ return [4 /*yield*/, peerConnection.createAnswer()];
|
||
+ case 2:
|
||
+ answer = _a.sent();
|
||
+ logger_1.default.log("Created answer.");
|
||
+ if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {
|
||
+ answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;
|
||
+ }
|
||
+ _a.label = 3;
|
||
+ case 3:
|
||
+ _a.trys.push([3, 5, , 6]);
|
||
+ return [4 /*yield*/, peerConnection.setLocalDescription(answer)];
|
||
+ case 4:
|
||
+ _a.sent();
|
||
+ logger_1.default.log("Set localDescription:", answer, "for:" + this.connection.peer);
|
||
+ provider.socket.send({
|
||
+ type: enums_1.ServerMessageType.Answer,
|
||
+ payload: {
|
||
+ sdp: answer,
|
||
+ type: this.connection.type,
|
||
+ connectionId: this.connection.connectionId,
|
||
+ browser: util_1.util.browser
|
||
+ },
|
||
+ dst: this.connection.peer
|
||
+ });
|
||
+ return [3 /*break*/, 6];
|
||
+ case 5:
|
||
+ err_3 = _a.sent();
|
||
+ provider.emitError(enums_1.PeerErrorType.WebRTC, err_3);
|
||
+ logger_1.default.log("Failed to setLocalDescription, ", err_3);
|
||
+ return [3 /*break*/, 6];
|
||
+ case 6: return [3 /*break*/, 8];
|
||
+ case 7:
|
||
+ err_1_2 = _a.sent();
|
||
+ provider.emitError(enums_1.PeerErrorType.WebRTC, err_1_2);
|
||
+ logger_1.default.log("Failed to create answer, ", err_1_2);
|
||
+ return [3 /*break*/, 8];
|
||
+ case 8: return [2 /*return*/];
|
||
+ }
|
||
+ });
|
||
+ });
|
||
+ };
|
||
+ /** Handle an SDP. */
|
||
+ Negotiator.prototype.handleSDP = function (type, sdp) {
|
||
+ return __awaiter(this, void 0, void 0, function () {
|
||
+ var peerConnection, provider, self, err_4;
|
||
+ return __generator(this, function (_a) {
|
||
+ switch (_a.label) {
|
||
+ case 0:
|
||
+ sdp = new RTCSessionDescription(sdp);
|
||
+ peerConnection = this.connection.peerConnection;
|
||
+ provider = this.connection.provider;
|
||
+ logger_1.default.log("Setting remote description", sdp);
|
||
+ self = this;
|
||
+ _a.label = 1;
|
||
+ case 1:
|
||
+ _a.trys.push([1, 5, , 6]);
|
||
+ return [4 /*yield*/, peerConnection.setRemoteDescription(sdp)];
|
||
+ case 2:
|
||
+ _a.sent();
|
||
+ logger_1.default.log("Set remoteDescription:" + type + " for:" + this.connection.peer);
|
||
+ if (!(type === "OFFER")) return [3 /*break*/, 4];
|
||
+ return [4 /*yield*/, self._makeAnswer()];
|
||
+ case 3:
|
||
+ _a.sent();
|
||
+ _a.label = 4;
|
||
+ case 4: return [3 /*break*/, 6];
|
||
+ case 5:
|
||
+ err_4 = _a.sent();
|
||
+ provider.emitError(enums_1.PeerErrorType.WebRTC, err_4);
|
||
+ logger_1.default.log("Failed to setRemoteDescription, ", err_4);
|
||
+ return [3 /*break*/, 6];
|
||
+ case 6: return [2 /*return*/];
|
||
+ }
|
||
+ });
|
||
+ });
|
||
+ };
|
||
+ /** Handle a candidate. */
|
||
+ Negotiator.prototype.handleCandidate = function (ice) {
|
||
+ return __awaiter(this, void 0, void 0, function () {
|
||
+ var candidate, sdpMLineIndex, sdpMid, peerConnection, provider, err_5;
|
||
+ return __generator(this, function (_a) {
|
||
+ switch (_a.label) {
|
||
+ case 0:
|
||
+ logger_1.default.log("handleCandidate:", ice);
|
||
+ candidate = ice.candidate;
|
||
+ sdpMLineIndex = ice.sdpMLineIndex;
|
||
+ sdpMid = ice.sdpMid;
|
||
+ peerConnection = this.connection.peerConnection;
|
||
+ provider = this.connection.provider;
|
||
+ _a.label = 1;
|
||
+ case 1:
|
||
+ _a.trys.push([1, 3, , 4]);
|
||
+ return [4 /*yield*/, peerConnection.addIceCandidate(new RTCIceCandidate({
|
||
+ sdpMid: sdpMid,
|
||
+ sdpMLineIndex: sdpMLineIndex,
|
||
+ candidate: candidate
|
||
+ }))];
|
||
+ case 2:
|
||
+ _a.sent();
|
||
+ logger_1.default.log("Added ICE candidate for:" + this.connection.peer);
|
||
+ return [3 /*break*/, 4];
|
||
+ case 3:
|
||
+ err_5 = _a.sent();
|
||
+ provider.emitError(enums_1.PeerErrorType.WebRTC, err_5);
|
||
+ logger_1.default.log("Failed to handleCandidate, ", err_5);
|
||
+ return [3 /*break*/, 4];
|
||
+ case 4: return [2 /*return*/];
|
||
+ }
|
||
+ });
|
||
+ });
|
||
+ };
|
||
+ Negotiator.prototype._addTracksToConnection = function (stream, peerConnection) {
|
||
+ logger_1.default.log("add tracks from stream " + stream.id + " to peer connection");
|
||
+ if (!peerConnection.addTrack) {
|
||
+ return logger_1.default.error("Your browser does't support RTCPeerConnection#addTrack. Ignored.");
|
||
+ }
|
||
+ stream.getTracks().forEach(function (track) {
|
||
+ peerConnection.addTrack(track, stream);
|
||
+ });
|
||
+ };
|
||
+ Negotiator.prototype._addStreamToMediaConnection = function (stream, mediaConnection) {
|
||
+ logger_1.default.log("add stream " + stream.id + " to media connection " + mediaConnection.connectionId);
|
||
+ mediaConnection.addStream(stream);
|
||
+ };
|
||
+ return Negotiator;
|
||
+}());
|
||
+exports.Negotiator = Negotiator;
|
||
diff --git a/node_modules/peerjs/dist/peer.js b/node_modules/peerjs/dist/peer.js
|
||
new file mode 100644
|
||
index 0000000..8928729
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/peer.js
|
||
@@ -0,0 +1,519 @@
|
||
+"use strict";
|
||
+var __extends = (this && this.__extends) || (function () {
|
||
+ var extendStatics = function (d, b) {
|
||
+ extendStatics = Object.setPrototypeOf ||
|
||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
+ return extendStatics(d, b);
|
||
+ };
|
||
+ return function (d, b) {
|
||
+ if (typeof b !== "function" && b !== null)
|
||
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
+ extendStatics(d, b);
|
||
+ function __() { this.constructor = d; }
|
||
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
+ };
|
||
+})();
|
||
+var __assign = (this && this.__assign) || function () {
|
||
+ __assign = Object.assign || function(t) {
|
||
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
+ s = arguments[i];
|
||
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
||
+ t[p] = s[p];
|
||
+ }
|
||
+ return t;
|
||
+ };
|
||
+ return __assign.apply(this, arguments);
|
||
+};
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.Peer = void 0;
|
||
+var eventemitter3_1 = require("eventemitter3");
|
||
+var util_1 = require("./util");
|
||
+var logger_1 = __importDefault(require("./logger"));
|
||
+var socket_1 = require("./socket");
|
||
+var mediaconnection_1 = require("./mediaconnection");
|
||
+var dataconnection_1 = require("./dataconnection");
|
||
+var enums_1 = require("./enums");
|
||
+var api_1 = require("./api");
|
||
+var PeerOptions = /** @class */ (function () {
|
||
+ function PeerOptions() {
|
||
+ }
|
||
+ return PeerOptions;
|
||
+}());
|
||
+/**
|
||
+ * A peer who can initiate connections with other peers.
|
||
+ */
|
||
+var Peer = /** @class */ (function (_super) {
|
||
+ __extends(Peer, _super);
|
||
+ function Peer(id, options) {
|
||
+ var _this = _super.call(this) || this;
|
||
+ _this._id = null;
|
||
+ _this._lastServerId = null;
|
||
+ // States.
|
||
+ _this._destroyed = false; // Connections have been killed
|
||
+ _this._disconnected = false; // Connection to PeerServer killed but P2P connections still active
|
||
+ _this._open = false; // Sockets and such are not yet open.
|
||
+ _this._connections = new Map(); // All connections for this peer.
|
||
+ _this._lostMessages = new Map(); // src => [list of messages]
|
||
+ var userId;
|
||
+ // Deal with overloading
|
||
+ if (id && id.constructor == Object) {
|
||
+ options = id;
|
||
+ }
|
||
+ else if (id) {
|
||
+ userId = id.toString();
|
||
+ }
|
||
+ // Configurize options
|
||
+ options = __assign({ debug: 0, host: util_1.util.CLOUD_HOST, port: util_1.util.CLOUD_PORT, path: "/", key: Peer.DEFAULT_KEY, token: util_1.util.randomToken(), config: util_1.util.defaultConfig }, options);
|
||
+ _this._options = options;
|
||
+ // Detect relative URL host.
|
||
+ if (_this._options.host === "/") {
|
||
+ _this._options.host = window.location.hostname;
|
||
+ }
|
||
+ // Set path correctly.
|
||
+ if (_this._options.path) {
|
||
+ if (_this._options.path[0] !== "/") {
|
||
+ _this._options.path = "/" + _this._options.path;
|
||
+ }
|
||
+ if (_this._options.path[_this._options.path.length - 1] !== "/") {
|
||
+ _this._options.path += "/";
|
||
+ }
|
||
+ }
|
||
+ // Set whether we use SSL to same as current host
|
||
+ if (_this._options.secure === undefined && _this._options.host !== util_1.util.CLOUD_HOST) {
|
||
+ _this._options.secure = util_1.util.isSecure();
|
||
+ }
|
||
+ else if (_this._options.host == util_1.util.CLOUD_HOST) {
|
||
+ _this._options.secure = true;
|
||
+ }
|
||
+ // Set a custom log function if present
|
||
+ if (_this._options.logFunction) {
|
||
+ logger_1.default.setLogFunction(_this._options.logFunction);
|
||
+ }
|
||
+ logger_1.default.logLevel = _this._options.debug || 0;
|
||
+ _this._api = new api_1.API(options);
|
||
+ _this._socket = _this._createServerConnection();
|
||
+ // Sanity checks
|
||
+ // Ensure WebRTC supported
|
||
+ if (!util_1.util.supports.audioVideo && !util_1.util.supports.data) {
|
||
+ _this._delayedAbort(enums_1.PeerErrorType.BrowserIncompatible, "The current browser does not support WebRTC");
|
||
+ return _this;
|
||
+ }
|
||
+ // Ensure alphanumeric id
|
||
+ if (!!userId && !util_1.util.validateId(userId)) {
|
||
+ _this._delayedAbort(enums_1.PeerErrorType.InvalidID, "ID \"" + userId + "\" is invalid");
|
||
+ return _this;
|
||
+ }
|
||
+ if (userId) {
|
||
+ _this._initialize(userId);
|
||
+ }
|
||
+ else {
|
||
+ _this._api.retrieveId()
|
||
+ .then(function (id) { return _this._initialize(id); })
|
||
+ .catch(function (error) { return _this._abort(enums_1.PeerErrorType.ServerError, error); });
|
||
+ }
|
||
+ return _this;
|
||
+ }
|
||
+ Object.defineProperty(Peer.prototype, "id", {
|
||
+ get: function () {
|
||
+ return this._id;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(Peer.prototype, "options", {
|
||
+ get: function () {
|
||
+ return this._options;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(Peer.prototype, "open", {
|
||
+ get: function () {
|
||
+ return this._open;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(Peer.prototype, "socket", {
|
||
+ get: function () {
|
||
+ return this._socket;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(Peer.prototype, "connections", {
|
||
+ /**
|
||
+ * @deprecated
|
||
+ * Return type will change from Object to Map<string,[]>
|
||
+ */
|
||
+ get: function () {
|
||
+ var plainConnections = Object.create(null);
|
||
+ // @ts-ignore
|
||
+ for (var _i = 0, _a = this._connections; _i < _a.length; _i++) {
|
||
+ var _b = _a[_i], k = _b[0], v = _b[1];
|
||
+ plainConnections[k] = v;
|
||
+ }
|
||
+ return plainConnections;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(Peer.prototype, "destroyed", {
|
||
+ get: function () {
|
||
+ return this._destroyed;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Object.defineProperty(Peer.prototype, "disconnected", {
|
||
+ get: function () {
|
||
+ return this._disconnected;
|
||
+ },
|
||
+ enumerable: false,
|
||
+ configurable: true
|
||
+ });
|
||
+ Peer.prototype._createServerConnection = function () {
|
||
+ var _this = this;
|
||
+ var socket = new socket_1.Socket(this._options.secure, this._options.host, this._options.port, this._options.path, this._options.key, this._options.pingInterval);
|
||
+ socket.on(enums_1.SocketEventType.Message, function (data) {
|
||
+ _this._handleMessage(data);
|
||
+ });
|
||
+ socket.on(enums_1.SocketEventType.Error, function (error) {
|
||
+ _this._abort(enums_1.PeerErrorType.SocketError, error);
|
||
+ });
|
||
+ socket.on(enums_1.SocketEventType.Disconnected, function () {
|
||
+ if (_this.disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ _this.emitError(enums_1.PeerErrorType.Network, "Lost connection to server.");
|
||
+ _this.disconnect();
|
||
+ });
|
||
+ socket.on(enums_1.SocketEventType.Close, function () {
|
||
+ if (_this.disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ _this._abort(enums_1.PeerErrorType.SocketClosed, "Underlying socket is already closed.");
|
||
+ });
|
||
+ return socket;
|
||
+ };
|
||
+ /** Initialize a connection with the server. */
|
||
+ Peer.prototype._initialize = function (id) {
|
||
+ this._id = id;
|
||
+ this.socket.start(id, this._options.token);
|
||
+ };
|
||
+ /** Handles messages from the server. */
|
||
+ Peer.prototype._handleMessage = function (message) {
|
||
+ var type = message.type;
|
||
+ var payload = message.payload;
|
||
+ var peerId = message.src;
|
||
+ switch (type) {
|
||
+ case enums_1.ServerMessageType.Open: // The connection to the server is open.
|
||
+ this._lastServerId = this.id;
|
||
+ this._open = true;
|
||
+ this.emit(enums_1.PeerEventType.Open, this.id);
|
||
+ break;
|
||
+ case enums_1.ServerMessageType.Error: // Server error.
|
||
+ this._abort(enums_1.PeerErrorType.ServerError, payload.msg);
|
||
+ break;
|
||
+ case enums_1.ServerMessageType.IdTaken: // The selected ID is taken.
|
||
+ this._abort(enums_1.PeerErrorType.UnavailableID, "ID \"" + 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");
|
||
+ break;
|
||
+ case enums_1.ServerMessageType.Leave: // Another peer has closed its connection to this peer.
|
||
+ logger_1.default.log("Received leave message from " + peerId);
|
||
+ this._cleanupPeer(peerId);
|
||
+ this._connections.delete(peerId);
|
||
+ break;
|
||
+ 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);
|
||
+ break;
|
||
+ case enums_1.ServerMessageType.Offer: {
|
||
+ // we should consider switching this to CALL/CONNECT, but this is the least breaking option.
|
||
+ var connectionId = payload.connectionId;
|
||
+ var connection = this.getConnection(peerId, connectionId);
|
||
+ if (connection) {
|
||
+ connection.close();
|
||
+ logger_1.default.warn("Offer received for existing Connection ID:" + connectionId);
|
||
+ }
|
||
+ // Create a new connection.
|
||
+ if (payload.type === enums_1.ConnectionType.Media) {
|
||
+ connection = new mediaconnection_1.MediaConnection(peerId, this, {
|
||
+ connectionId: connectionId,
|
||
+ _payload: payload,
|
||
+ metadata: payload.metadata
|
||
+ });
|
||
+ this._addConnection(peerId, connection);
|
||
+ this.emit(enums_1.PeerEventType.Call, connection);
|
||
+ }
|
||
+ else if (payload.type === enums_1.ConnectionType.Data) {
|
||
+ connection = new dataconnection_1.DataConnection(peerId, this, {
|
||
+ connectionId: connectionId,
|
||
+ _payload: payload,
|
||
+ metadata: payload.metadata,
|
||
+ label: payload.label,
|
||
+ serialization: payload.serialization,
|
||
+ reliable: payload.reliable
|
||
+ });
|
||
+ this._addConnection(peerId, connection);
|
||
+ this.emit(enums_1.PeerEventType.Connection, connection);
|
||
+ }
|
||
+ else {
|
||
+ logger_1.default.warn("Received malformed connection type:" + payload.type);
|
||
+ return;
|
||
+ }
|
||
+ // Find messages.
|
||
+ var messages = this._getMessages(connectionId);
|
||
+ for (var _i = 0, messages_1 = messages; _i < messages_1.length; _i++) {
|
||
+ var message_1 = messages_1[_i];
|
||
+ connection.handleMessage(message_1);
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ default: {
|
||
+ if (!payload) {
|
||
+ logger_1.default.warn("You received a malformed message from " + peerId + " of type " + type);
|
||
+ return;
|
||
+ }
|
||
+ var connectionId = payload.connectionId;
|
||
+ var connection = this.getConnection(peerId, connectionId);
|
||
+ if (connection && connection.peerConnection) {
|
||
+ // Pass it on.
|
||
+ connection.handleMessage(message);
|
||
+ }
|
||
+ else if (connectionId) {
|
||
+ // Store for possible later use
|
||
+ this._storeMessage(connectionId, message);
|
||
+ }
|
||
+ else {
|
||
+ logger_1.default.warn("You received an unrecognized message:", message);
|
||
+ }
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+ };
|
||
+ /** Stores messages without a set up connection, to be claimed later. */
|
||
+ Peer.prototype._storeMessage = function (connectionId, message) {
|
||
+ if (!this._lostMessages.has(connectionId)) {
|
||
+ this._lostMessages.set(connectionId, []);
|
||
+ }
|
||
+ // @ts-ignore
|
||
+ this._lostMessages.get(connectionId).push(message);
|
||
+ };
|
||
+ /** Retrieve messages from lost message store */
|
||
+ //TODO Change it to private
|
||
+ Peer.prototype._getMessages = function (connectionId) {
|
||
+ var messages = this._lostMessages.get(connectionId);
|
||
+ if (messages) {
|
||
+ this._lostMessages.delete(connectionId);
|
||
+ return messages;
|
||
+ }
|
||
+ return [];
|
||
+ };
|
||
+ /**
|
||
+ * Returns a DataConnection to the specified peer. See documentation for a
|
||
+ * complete list of options.
|
||
+ */
|
||
+ Peer.prototype.connect = function (peer, options) {
|
||
+ if (options === void 0) { options = {}; }
|
||
+ if (this.disconnected) {
|
||
+ logger_1.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.");
|
||
+ this.emitError(enums_1.PeerErrorType.Disconnected, "Cannot connect to new Peer after disconnecting from server.");
|
||
+ // @ts-ignore
|
||
+ return;
|
||
+ }
|
||
+ var dataConnection = new dataconnection_1.DataConnection(peer, this, options);
|
||
+ this._addConnection(peer, dataConnection);
|
||
+ return dataConnection;
|
||
+ };
|
||
+ /**
|
||
+ * Returns a MediaConnection to the specified peer. See documentation for a
|
||
+ * complete list of options.
|
||
+ */
|
||
+ Peer.prototype.call = function (peer, stream, options) {
|
||
+ if (options === void 0) { options = {}; }
|
||
+ if (this.disconnected) {
|
||
+ logger_1.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.");
|
||
+ this.emitError(enums_1.PeerErrorType.Disconnected, "Cannot connect to new Peer after disconnecting from server.");
|
||
+ // @ts-ignore
|
||
+ return;
|
||
+ }
|
||
+ if (!stream) {
|
||
+ logger_1.default.error("To call a peer, you must provide a stream from your browser's `getUserMedia`.");
|
||
+ // @ts-ignore
|
||
+ return;
|
||
+ }
|
||
+ options._stream = stream;
|
||
+ var mediaConnection = new mediaconnection_1.MediaConnection(peer, this, options);
|
||
+ this._addConnection(peer, mediaConnection);
|
||
+ return mediaConnection;
|
||
+ };
|
||
+ /** Add a data/media connection to this peer. */
|
||
+ Peer.prototype._addConnection = function (peerId, connection) {
|
||
+ logger_1.default.log("add connection " + connection.type + ":" + connection.connectionId + " to peerId:" + peerId);
|
||
+ if (!this._connections.has(peerId)) {
|
||
+ this._connections.set(peerId, []);
|
||
+ }
|
||
+ // @ts-ignore
|
||
+ this._connections.get(peerId).push(connection);
|
||
+ };
|
||
+ //TODO should be private
|
||
+ Peer.prototype._removeConnection = function (connection) {
|
||
+ var connections = this._connections.get(connection.peer);
|
||
+ if (connections) {
|
||
+ var index = connections.indexOf(connection);
|
||
+ if (index !== -1) {
|
||
+ connections.splice(index, 1);
|
||
+ }
|
||
+ }
|
||
+ //remove from lost messages
|
||
+ this._lostMessages.delete(connection.connectionId);
|
||
+ };
|
||
+ /** Retrieve a data/media connection for this peer. */
|
||
+ Peer.prototype.getConnection = function (peerId, connectionId) {
|
||
+ var connections = this._connections.get(peerId);
|
||
+ if (!connections) {
|
||
+ return null;
|
||
+ }
|
||
+ for (var _i = 0, connections_1 = connections; _i < connections_1.length; _i++) {
|
||
+ var connection = connections_1[_i];
|
||
+ if (connection.connectionId === connectionId) {
|
||
+ return connection;
|
||
+ }
|
||
+ }
|
||
+ return null;
|
||
+ };
|
||
+ Peer.prototype._delayedAbort = function (type, message) {
|
||
+ var _this = this;
|
||
+ setTimeout(function () {
|
||
+ _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.
|
||
+ */
|
||
+ Peer.prototype._abort = function (type, message) {
|
||
+ logger_1.default.error("Aborting!");
|
||
+ this.emitError(type, message);
|
||
+ if (!this._lastServerId) {
|
||
+ this.destroy();
|
||
+ }
|
||
+ else {
|
||
+ this.disconnect();
|
||
+ }
|
||
+ };
|
||
+ /** Emits a typed error message. */
|
||
+ Peer.prototype.emitError = function (type, err) {
|
||
+ logger_1.default.error("Error:", err);
|
||
+ var error;
|
||
+ if (typeof err === "string") {
|
||
+ error = new Error(err);
|
||
+ }
|
||
+ else {
|
||
+ error = err;
|
||
+ }
|
||
+ 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.
|
||
+ */
|
||
+ Peer.prototype.destroy = function () {
|
||
+ if (this.destroyed) {
|
||
+ return;
|
||
+ }
|
||
+ logger_1.default.log("Destroy peer with ID:" + this.id);
|
||
+ this.disconnect();
|
||
+ this._cleanup();
|
||
+ this._destroyed = true;
|
||
+ this.emit(enums_1.PeerEventType.Close);
|
||
+ };
|
||
+ /** Disconnects every connection on this peer. */
|
||
+ Peer.prototype._cleanup = function () {
|
||
+ // @ts-ignore
|
||
+ for (var _i = 0, _a = this._connections.keys(); _i < _a.length; _i++) {
|
||
+ var peerId = _a[_i];
|
||
+ this._cleanupPeer(peerId);
|
||
+ this._connections.delete(peerId);
|
||
+ }
|
||
+ this.socket.removeAllListeners();
|
||
+ };
|
||
+ /** Closes all connections to this peer. */
|
||
+ Peer.prototype._cleanupPeer = function (peerId) {
|
||
+ var connections = this._connections.get(peerId);
|
||
+ if (!connections)
|
||
+ return;
|
||
+ for (var _i = 0, connections_2 = connections; _i < connections_2.length; _i++) {
|
||
+ var connection = connections_2[_i];
|
||
+ connection.close();
|
||
+ }
|
||
+ };
|
||
+ /**
|
||
+ * 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.
|
||
+ */
|
||
+ Peer.prototype.disconnect = function () {
|
||
+ if (this.disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ var currentId = this.id;
|
||
+ logger_1.default.log("Disconnect peer with ID:" + currentId);
|
||
+ this._disconnected = true;
|
||
+ this._open = false;
|
||
+ this.socket.close();
|
||
+ this._lastServerId = currentId;
|
||
+ this._id = null;
|
||
+ this.emit(enums_1.PeerEventType.Disconnected, currentId);
|
||
+ };
|
||
+ /** Attempts to reconnect with the same ID. */
|
||
+ Peer.prototype.reconnect = function () {
|
||
+ if (this.disconnected && !this.destroyed) {
|
||
+ logger_1.default.log("Attempting reconnection to server with ID " + this._lastServerId);
|
||
+ this._disconnected = false;
|
||
+ this._initialize(this._lastServerId);
|
||
+ }
|
||
+ else if (this.destroyed) {
|
||
+ throw new Error("This peer cannot reconnect to the server. It has already been destroyed.");
|
||
+ }
|
||
+ else if (!this.disconnected && !this.open) {
|
||
+ // 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!");
|
||
+ }
|
||
+ };
|
||
+ /**
|
||
+ * 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.
|
||
+ */
|
||
+ Peer.prototype.listAllPeers = function (cb) {
|
||
+ var _this = this;
|
||
+ if (cb === void 0) { cb = function (_) { }; }
|
||
+ this._api.listAllPeers()
|
||
+ .then(function (peers) { return cb(peers); })
|
||
+ .catch(function (error) { return _this._abort(enums_1.PeerErrorType.ServerError, error); });
|
||
+ };
|
||
+ Peer.DEFAULT_KEY = "peerjs";
|
||
+ return Peer;
|
||
+}(eventemitter3_1.EventEmitter));
|
||
+exports.Peer = Peer;
|
||
diff --git a/node_modules/peerjs/dist/peerjs.js b/node_modules/peerjs/dist/peerjs.js
|
||
deleted file mode 100644
|
||
index b902845..0000000
|
||
--- a/node_modules/peerjs/dist/peerjs.js
|
||
+++ /dev/null
|
||
@@ -1,10318 +0,0 @@
|
||
-// modules are defined as an array
|
||
-// [ module function, map of requires ]
|
||
-//
|
||
-// map of requires is short require name -> numeric require
|
||
-//
|
||
-// anything defined in a previous bundle is accessed via the
|
||
-// orig method which is the require for previous bundles
|
||
-parcelRequire = (function (modules, cache, entry, globalName) {
|
||
- // Save the require from previous bundle to this closure if any
|
||
- var previousRequire = typeof parcelRequire === 'function' && parcelRequire;
|
||
- var nodeRequire = typeof require === 'function' && require;
|
||
-
|
||
- function newRequire(name, jumped) {
|
||
- if (!cache[name]) {
|
||
- if (!modules[name]) {
|
||
- // if we cannot find the module within our internal map or
|
||
- // cache jump to the current global require ie. the last bundle
|
||
- // that was added to the page.
|
||
- var currentRequire = typeof parcelRequire === 'function' && parcelRequire;
|
||
- if (!jumped && currentRequire) {
|
||
- return currentRequire(name, true);
|
||
- }
|
||
-
|
||
- // If there are other bundles on this page the require from the
|
||
- // previous one is saved to 'previousRequire'. Repeat this as
|
||
- // many times as there are bundles until the module is found or
|
||
- // we exhaust the require chain.
|
||
- if (previousRequire) {
|
||
- return previousRequire(name, true);
|
||
- }
|
||
-
|
||
- // Try the node require function if it exists.
|
||
- if (nodeRequire && typeof name === 'string') {
|
||
- return nodeRequire(name);
|
||
- }
|
||
-
|
||
- var err = new Error('Cannot find module \'' + name + '\'');
|
||
- err.code = 'MODULE_NOT_FOUND';
|
||
- throw err;
|
||
- }
|
||
-
|
||
- localRequire.resolve = resolve;
|
||
- localRequire.cache = {};
|
||
-
|
||
- var module = cache[name] = new newRequire.Module(name);
|
||
-
|
||
- modules[name][0].call(module.exports, localRequire, module, module.exports, this);
|
||
- }
|
||
-
|
||
- return cache[name].exports;
|
||
-
|
||
- function localRequire(x){
|
||
- return newRequire(localRequire.resolve(x));
|
||
- }
|
||
-
|
||
- function resolve(x){
|
||
- return modules[name][1][x] || x;
|
||
- }
|
||
- }
|
||
-
|
||
- function Module(moduleName) {
|
||
- this.id = moduleName;
|
||
- this.bundle = newRequire;
|
||
- this.exports = {};
|
||
- }
|
||
-
|
||
- newRequire.isParcelRequire = true;
|
||
- newRequire.Module = Module;
|
||
- newRequire.modules = modules;
|
||
- newRequire.cache = cache;
|
||
- newRequire.parent = previousRequire;
|
||
- newRequire.register = function (id, exports) {
|
||
- modules[id] = [function (require, module) {
|
||
- module.exports = exports;
|
||
- }, {}];
|
||
- };
|
||
-
|
||
- var error;
|
||
- for (var i = 0; i < entry.length; i++) {
|
||
- try {
|
||
- newRequire(entry[i]);
|
||
- } catch (e) {
|
||
- // Save first error but execute all entries
|
||
- if (!error) {
|
||
- error = e;
|
||
- }
|
||
- }
|
||
- }
|
||
-
|
||
- if (entry.length) {
|
||
- // Expose entry point to Node, AMD or browser globals
|
||
- // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js
|
||
- var mainExports = newRequire(entry[entry.length - 1]);
|
||
-
|
||
- // CommonJS
|
||
- if (typeof exports === "object" && typeof module !== "undefined") {
|
||
- module.exports = mainExports;
|
||
-
|
||
- // RequireJS
|
||
- } else if (typeof define === "function" && define.amd) {
|
||
- define(function () {
|
||
- return mainExports;
|
||
- });
|
||
-
|
||
- // <script>
|
||
- } else if (globalName) {
|
||
- this[globalName] = mainExports;
|
||
- }
|
||
- }
|
||
-
|
||
- // Override the current require with this new one
|
||
- parcelRequire = newRequire;
|
||
-
|
||
- if (error) {
|
||
- // throw error from earlier, _after updating parcelRequire_
|
||
- throw error;
|
||
- }
|
||
-
|
||
- return newRequire;
|
||
-})({"EgBh":[function(require,module,exports) {
|
||
-var binaryFeatures = {};
|
||
-binaryFeatures.useBlobBuilder = (function () {
|
||
- try {
|
||
- new Blob([]);
|
||
- return false;
|
||
- } catch (e) {
|
||
- return true;
|
||
- }
|
||
-})();
|
||
-
|
||
-binaryFeatures.useArrayBufferView = !binaryFeatures.useBlobBuilder && (function () {
|
||
- try {
|
||
- return (new Blob([new Uint8Array([])])).size === 0;
|
||
- } catch (e) {
|
||
- return true;
|
||
- }
|
||
-})();
|
||
-
|
||
-module.exports.binaryFeatures = binaryFeatures;
|
||
-var BlobBuilder = module.exports.BlobBuilder;
|
||
-if (typeof window !== 'undefined') {
|
||
- BlobBuilder = module.exports.BlobBuilder = window.WebKitBlobBuilder ||
|
||
- window.MozBlobBuilder || window.MSBlobBuilder || window.BlobBuilder;
|
||
-}
|
||
-
|
||
-function BufferBuilder () {
|
||
- this._pieces = [];
|
||
- this._parts = [];
|
||
-}
|
||
-
|
||
-BufferBuilder.prototype.append = function (data) {
|
||
- if (typeof data === 'number') {
|
||
- this._pieces.push(data);
|
||
- } else {
|
||
- this.flush();
|
||
- this._parts.push(data);
|
||
- }
|
||
-};
|
||
-
|
||
-BufferBuilder.prototype.flush = function () {
|
||
- if (this._pieces.length > 0) {
|
||
- var buf = new Uint8Array(this._pieces);
|
||
- if (!binaryFeatures.useArrayBufferView) {
|
||
- buf = buf.buffer;
|
||
- }
|
||
- this._parts.push(buf);
|
||
- this._pieces = [];
|
||
- }
|
||
-};
|
||
-
|
||
-BufferBuilder.prototype.getBuffer = function () {
|
||
- this.flush();
|
||
- if (binaryFeatures.useBlobBuilder) {
|
||
- var builder = new BlobBuilder();
|
||
- for (var i = 0, ii = this._parts.length; i < ii; i++) {
|
||
- builder.append(this._parts[i]);
|
||
- }
|
||
- return builder.getBlob();
|
||
- } else {
|
||
- return new Blob(this._parts);
|
||
- }
|
||
-};
|
||
-
|
||
-module.exports.BufferBuilder = BufferBuilder;
|
||
-
|
||
-},{}],"kdPp":[function(require,module,exports) {
|
||
-var BufferBuilder = require('./bufferbuilder').BufferBuilder;
|
||
-var binaryFeatures = require('./bufferbuilder').binaryFeatures;
|
||
-
|
||
-var BinaryPack = {
|
||
- unpack: function (data) {
|
||
- var unpacker = new Unpacker(data);
|
||
- return unpacker.unpack();
|
||
- },
|
||
- pack: function (data) {
|
||
- var packer = new Packer();
|
||
- packer.pack(data);
|
||
- var buffer = packer.getBuffer();
|
||
- return buffer;
|
||
- }
|
||
-};
|
||
-
|
||
-module.exports = BinaryPack;
|
||
-
|
||
-function Unpacker (data) {
|
||
- // Data is ArrayBuffer
|
||
- this.index = 0;
|
||
- this.dataBuffer = data;
|
||
- this.dataView = new Uint8Array(this.dataBuffer);
|
||
- this.length = this.dataBuffer.byteLength;
|
||
-}
|
||
-
|
||
-Unpacker.prototype.unpack = function () {
|
||
- var type = this.unpack_uint8();
|
||
- if (type < 0x80) {
|
||
- return type;
|
||
- } else if ((type ^ 0xe0) < 0x20) {
|
||
- return (type ^ 0xe0) - 0x20;
|
||
- }
|
||
-
|
||
- var size;
|
||
- if ((size = type ^ 0xa0) <= 0x0f) {
|
||
- return this.unpack_raw(size);
|
||
- } else if ((size = type ^ 0xb0) <= 0x0f) {
|
||
- return this.unpack_string(size);
|
||
- } else if ((size = type ^ 0x90) <= 0x0f) {
|
||
- return this.unpack_array(size);
|
||
- } else if ((size = type ^ 0x80) <= 0x0f) {
|
||
- return this.unpack_map(size);
|
||
- }
|
||
-
|
||
- switch (type) {
|
||
- case 0xc0:
|
||
- return null;
|
||
- case 0xc1:
|
||
- return undefined;
|
||
- case 0xc2:
|
||
- return false;
|
||
- case 0xc3:
|
||
- return true;
|
||
- case 0xca:
|
||
- return this.unpack_float();
|
||
- case 0xcb:
|
||
- return this.unpack_double();
|
||
- case 0xcc:
|
||
- return this.unpack_uint8();
|
||
- case 0xcd:
|
||
- return this.unpack_uint16();
|
||
- case 0xce:
|
||
- return this.unpack_uint32();
|
||
- case 0xcf:
|
||
- return this.unpack_uint64();
|
||
- case 0xd0:
|
||
- return this.unpack_int8();
|
||
- case 0xd1:
|
||
- return this.unpack_int16();
|
||
- case 0xd2:
|
||
- return this.unpack_int32();
|
||
- case 0xd3:
|
||
- return this.unpack_int64();
|
||
- case 0xd4:
|
||
- return undefined;
|
||
- case 0xd5:
|
||
- return undefined;
|
||
- case 0xd6:
|
||
- return undefined;
|
||
- case 0xd7:
|
||
- return undefined;
|
||
- case 0xd8:
|
||
- size = this.unpack_uint16();
|
||
- return this.unpack_string(size);
|
||
- case 0xd9:
|
||
- size = this.unpack_uint32();
|
||
- return this.unpack_string(size);
|
||
- case 0xda:
|
||
- size = this.unpack_uint16();
|
||
- return this.unpack_raw(size);
|
||
- case 0xdb:
|
||
- size = this.unpack_uint32();
|
||
- return this.unpack_raw(size);
|
||
- case 0xdc:
|
||
- size = this.unpack_uint16();
|
||
- return this.unpack_array(size);
|
||
- case 0xdd:
|
||
- size = this.unpack_uint32();
|
||
- return this.unpack_array(size);
|
||
- case 0xde:
|
||
- size = this.unpack_uint16();
|
||
- return this.unpack_map(size);
|
||
- case 0xdf:
|
||
- size = this.unpack_uint32();
|
||
- return this.unpack_map(size);
|
||
- }
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_uint8 = function () {
|
||
- var byte = this.dataView[this.index] & 0xff;
|
||
- this.index++;
|
||
- return byte;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_uint16 = function () {
|
||
- var bytes = this.read(2);
|
||
- var uint16 =
|
||
- ((bytes[0] & 0xff) * 256) + (bytes[1] & 0xff);
|
||
- this.index += 2;
|
||
- return uint16;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_uint32 = function () {
|
||
- var bytes = this.read(4);
|
||
- var uint32 =
|
||
- ((bytes[0] * 256 +
|
||
- bytes[1]) * 256 +
|
||
- bytes[2]) * 256 +
|
||
- bytes[3];
|
||
- this.index += 4;
|
||
- return uint32;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_uint64 = function () {
|
||
- var bytes = this.read(8);
|
||
- var uint64 =
|
||
- ((((((bytes[0] * 256 +
|
||
- bytes[1]) * 256 +
|
||
- bytes[2]) * 256 +
|
||
- bytes[3]) * 256 +
|
||
- bytes[4]) * 256 +
|
||
- bytes[5]) * 256 +
|
||
- bytes[6]) * 256 +
|
||
- bytes[7];
|
||
- this.index += 8;
|
||
- return uint64;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_int8 = function () {
|
||
- var uint8 = this.unpack_uint8();
|
||
- return (uint8 < 0x80) ? uint8 : uint8 - (1 << 8);
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_int16 = function () {
|
||
- var uint16 = this.unpack_uint16();
|
||
- return (uint16 < 0x8000) ? uint16 : uint16 - (1 << 16);
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_int32 = function () {
|
||
- var uint32 = this.unpack_uint32();
|
||
- return (uint32 < Math.pow(2, 31)) ? uint32
|
||
- : uint32 - Math.pow(2, 32);
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_int64 = function () {
|
||
- var uint64 = this.unpack_uint64();
|
||
- return (uint64 < Math.pow(2, 63)) ? uint64
|
||
- : uint64 - Math.pow(2, 64);
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_raw = function (size) {
|
||
- if (this.length < this.index + size) {
|
||
- throw new Error('BinaryPackFailure: index is out of range' +
|
||
- ' ' + this.index + ' ' + size + ' ' + this.length);
|
||
- }
|
||
- var buf = this.dataBuffer.slice(this.index, this.index + size);
|
||
- this.index += size;
|
||
-
|
||
- // buf = util.bufferToString(buf);
|
||
-
|
||
- return buf;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_string = function (size) {
|
||
- var bytes = this.read(size);
|
||
- var i = 0;
|
||
- var str = '';
|
||
- var c;
|
||
- var code;
|
||
-
|
||
- while (i < size) {
|
||
- c = bytes[i];
|
||
- if (c < 128) {
|
||
- str += String.fromCharCode(c);
|
||
- i++;
|
||
- } else if ((c ^ 0xc0) < 32) {
|
||
- code = ((c ^ 0xc0) << 6) | (bytes[i + 1] & 63);
|
||
- str += String.fromCharCode(code);
|
||
- i += 2;
|
||
- } else {
|
||
- code = ((c & 15) << 12) | ((bytes[i + 1] & 63) << 6) |
|
||
- (bytes[i + 2] & 63);
|
||
- str += String.fromCharCode(code);
|
||
- i += 3;
|
||
- }
|
||
- }
|
||
-
|
||
- this.index += size;
|
||
- return str;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_array = function (size) {
|
||
- var objects = new Array(size);
|
||
- for (var i = 0; i < size; i++) {
|
||
- objects[i] = this.unpack();
|
||
- }
|
||
- return objects;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_map = function (size) {
|
||
- var map = {};
|
||
- for (var i = 0; i < size; i++) {
|
||
- var key = this.unpack();
|
||
- var value = this.unpack();
|
||
- map[key] = value;
|
||
- }
|
||
- return map;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_float = function () {
|
||
- var uint32 = this.unpack_uint32();
|
||
- var sign = uint32 >> 31;
|
||
- var exp = ((uint32 >> 23) & 0xff) - 127;
|
||
- var fraction = (uint32 & 0x7fffff) | 0x800000;
|
||
- return (sign === 0 ? 1 : -1) *
|
||
- fraction * Math.pow(2, exp - 23);
|
||
-};
|
||
-
|
||
-Unpacker.prototype.unpack_double = function () {
|
||
- var h32 = this.unpack_uint32();
|
||
- var l32 = this.unpack_uint32();
|
||
- var sign = h32 >> 31;
|
||
- var exp = ((h32 >> 20) & 0x7ff) - 1023;
|
||
- var hfrac = (h32 & 0xfffff) | 0x100000;
|
||
- var frac = hfrac * Math.pow(2, exp - 20) +
|
||
- l32 * Math.pow(2, exp - 52);
|
||
- return (sign === 0 ? 1 : -1) * frac;
|
||
-};
|
||
-
|
||
-Unpacker.prototype.read = function (length) {
|
||
- var j = this.index;
|
||
- if (j + length <= this.length) {
|
||
- return this.dataView.subarray(j, j + length);
|
||
- } else {
|
||
- throw new Error('BinaryPackFailure: read index out of range');
|
||
- }
|
||
-};
|
||
-
|
||
-function Packer () {
|
||
- this.bufferBuilder = new BufferBuilder();
|
||
-}
|
||
-
|
||
-Packer.prototype.getBuffer = function () {
|
||
- return this.bufferBuilder.getBuffer();
|
||
-};
|
||
-
|
||
-Packer.prototype.pack = function (value) {
|
||
- var type = typeof (value);
|
||
- if (type === 'string') {
|
||
- this.pack_string(value);
|
||
- } else if (type === 'number') {
|
||
- if (Math.floor(value) === value) {
|
||
- this.pack_integer(value);
|
||
- } else {
|
||
- this.pack_double(value);
|
||
- }
|
||
- } else if (type === 'boolean') {
|
||
- if (value === true) {
|
||
- this.bufferBuilder.append(0xc3);
|
||
- } else if (value === false) {
|
||
- this.bufferBuilder.append(0xc2);
|
||
- }
|
||
- } else if (type === 'undefined') {
|
||
- this.bufferBuilder.append(0xc0);
|
||
- } else if (type === 'object') {
|
||
- if (value === null) {
|
||
- this.bufferBuilder.append(0xc0);
|
||
- } else {
|
||
- var constructor = value.constructor;
|
||
- if (constructor == Array) {
|
||
- this.pack_array(value);
|
||
- } else if (constructor == Blob || constructor == File || value instanceof Blob || value instanceof File) {
|
||
- this.pack_bin(value);
|
||
- } else if (constructor == ArrayBuffer) {
|
||
- if (binaryFeatures.useArrayBufferView) {
|
||
- this.pack_bin(new Uint8Array(value));
|
||
- } else {
|
||
- this.pack_bin(value);
|
||
- }
|
||
- } else if ('BYTES_PER_ELEMENT' in value) {
|
||
- if (binaryFeatures.useArrayBufferView) {
|
||
- this.pack_bin(new Uint8Array(value.buffer));
|
||
- } else {
|
||
- this.pack_bin(value.buffer);
|
||
- }
|
||
- } else if ((constructor == Object) || (constructor.toString().startsWith('class'))) {
|
||
- this.pack_object(value);
|
||
- } else if (constructor == Date) {
|
||
- this.pack_string(value.toString());
|
||
- } else if (typeof value.toBinaryPack === 'function') {
|
||
- this.bufferBuilder.append(value.toBinaryPack());
|
||
- } else {
|
||
- throw new Error('Type "' + constructor.toString() + '" not yet supported');
|
||
- }
|
||
- }
|
||
- } else {
|
||
- throw new Error('Type "' + type + '" not yet supported');
|
||
- }
|
||
- this.bufferBuilder.flush();
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_bin = function (blob) {
|
||
- var length = blob.length || blob.byteLength || blob.size;
|
||
- if (length <= 0x0f) {
|
||
- this.pack_uint8(0xa0 + length);
|
||
- } else if (length <= 0xffff) {
|
||
- this.bufferBuilder.append(0xda);
|
||
- this.pack_uint16(length);
|
||
- } else if (length <= 0xffffffff) {
|
||
- this.bufferBuilder.append(0xdb);
|
||
- this.pack_uint32(length);
|
||
- } else {
|
||
- throw new Error('Invalid length');
|
||
- }
|
||
- this.bufferBuilder.append(blob);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_string = function (str) {
|
||
- var length = utf8Length(str);
|
||
-
|
||
- if (length <= 0x0f) {
|
||
- this.pack_uint8(0xb0 + length);
|
||
- } else if (length <= 0xffff) {
|
||
- this.bufferBuilder.append(0xd8);
|
||
- this.pack_uint16(length);
|
||
- } else if (length <= 0xffffffff) {
|
||
- this.bufferBuilder.append(0xd9);
|
||
- this.pack_uint32(length);
|
||
- } else {
|
||
- throw new Error('Invalid length');
|
||
- }
|
||
- this.bufferBuilder.append(str);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_array = function (ary) {
|
||
- var length = ary.length;
|
||
- if (length <= 0x0f) {
|
||
- this.pack_uint8(0x90 + length);
|
||
- } else if (length <= 0xffff) {
|
||
- this.bufferBuilder.append(0xdc);
|
||
- this.pack_uint16(length);
|
||
- } else if (length <= 0xffffffff) {
|
||
- this.bufferBuilder.append(0xdd);
|
||
- this.pack_uint32(length);
|
||
- } else {
|
||
- throw new Error('Invalid length');
|
||
- }
|
||
- for (var i = 0; i < length; i++) {
|
||
- this.pack(ary[i]);
|
||
- }
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_integer = function (num) {
|
||
- if (num >= -0x20 && num <= 0x7f) {
|
||
- this.bufferBuilder.append(num & 0xff);
|
||
- } else if (num >= 0x00 && num <= 0xff) {
|
||
- this.bufferBuilder.append(0xcc);
|
||
- this.pack_uint8(num);
|
||
- } else if (num >= -0x80 && num <= 0x7f) {
|
||
- this.bufferBuilder.append(0xd0);
|
||
- this.pack_int8(num);
|
||
- } else if (num >= 0x0000 && num <= 0xffff) {
|
||
- this.bufferBuilder.append(0xcd);
|
||
- this.pack_uint16(num);
|
||
- } else if (num >= -0x8000 && num <= 0x7fff) {
|
||
- this.bufferBuilder.append(0xd1);
|
||
- this.pack_int16(num);
|
||
- } else if (num >= 0x00000000 && num <= 0xffffffff) {
|
||
- this.bufferBuilder.append(0xce);
|
||
- this.pack_uint32(num);
|
||
- } else if (num >= -0x80000000 && num <= 0x7fffffff) {
|
||
- this.bufferBuilder.append(0xd2);
|
||
- this.pack_int32(num);
|
||
- } else if (num >= -0x8000000000000000 && num <= 0x7FFFFFFFFFFFFFFF) {
|
||
- this.bufferBuilder.append(0xd3);
|
||
- this.pack_int64(num);
|
||
- } else if (num >= 0x0000000000000000 && num <= 0xFFFFFFFFFFFFFFFF) {
|
||
- this.bufferBuilder.append(0xcf);
|
||
- this.pack_uint64(num);
|
||
- } else {
|
||
- throw new Error('Invalid integer');
|
||
- }
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_double = function (num) {
|
||
- var sign = 0;
|
||
- if (num < 0) {
|
||
- sign = 1;
|
||
- num = -num;
|
||
- }
|
||
- var exp = Math.floor(Math.log(num) / Math.LN2);
|
||
- var frac0 = num / Math.pow(2, exp) - 1;
|
||
- var frac1 = Math.floor(frac0 * Math.pow(2, 52));
|
||
- var b32 = Math.pow(2, 32);
|
||
- var h32 = (sign << 31) | ((exp + 1023) << 20) |
|
||
- (frac1 / b32) & 0x0fffff;
|
||
- var l32 = frac1 % b32;
|
||
- this.bufferBuilder.append(0xcb);
|
||
- this.pack_int32(h32);
|
||
- this.pack_int32(l32);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_object = function (obj) {
|
||
- var keys = Object.keys(obj);
|
||
- var length = keys.length;
|
||
- if (length <= 0x0f) {
|
||
- this.pack_uint8(0x80 + length);
|
||
- } else if (length <= 0xffff) {
|
||
- this.bufferBuilder.append(0xde);
|
||
- this.pack_uint16(length);
|
||
- } else if (length <= 0xffffffff) {
|
||
- this.bufferBuilder.append(0xdf);
|
||
- this.pack_uint32(length);
|
||
- } else {
|
||
- throw new Error('Invalid length');
|
||
- }
|
||
- for (var prop in obj) {
|
||
- if (obj.hasOwnProperty(prop)) {
|
||
- this.pack(prop);
|
||
- this.pack(obj[prop]);
|
||
- }
|
||
- }
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_uint8 = function (num) {
|
||
- this.bufferBuilder.append(num);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_uint16 = function (num) {
|
||
- this.bufferBuilder.append(num >> 8);
|
||
- this.bufferBuilder.append(num & 0xff);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_uint32 = function (num) {
|
||
- var n = num & 0xffffffff;
|
||
- this.bufferBuilder.append((n & 0xff000000) >>> 24);
|
||
- this.bufferBuilder.append((n & 0x00ff0000) >>> 16);
|
||
- this.bufferBuilder.append((n & 0x0000ff00) >>> 8);
|
||
- this.bufferBuilder.append((n & 0x000000ff));
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_uint64 = function (num) {
|
||
- var high = num / Math.pow(2, 32);
|
||
- var low = num % Math.pow(2, 32);
|
||
- this.bufferBuilder.append((high & 0xff000000) >>> 24);
|
||
- this.bufferBuilder.append((high & 0x00ff0000) >>> 16);
|
||
- this.bufferBuilder.append((high & 0x0000ff00) >>> 8);
|
||
- this.bufferBuilder.append((high & 0x000000ff));
|
||
- this.bufferBuilder.append((low & 0xff000000) >>> 24);
|
||
- this.bufferBuilder.append((low & 0x00ff0000) >>> 16);
|
||
- this.bufferBuilder.append((low & 0x0000ff00) >>> 8);
|
||
- this.bufferBuilder.append((low & 0x000000ff));
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_int8 = function (num) {
|
||
- this.bufferBuilder.append(num & 0xff);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_int16 = function (num) {
|
||
- this.bufferBuilder.append((num & 0xff00) >> 8);
|
||
- this.bufferBuilder.append(num & 0xff);
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_int32 = function (num) {
|
||
- this.bufferBuilder.append((num >>> 24) & 0xff);
|
||
- this.bufferBuilder.append((num & 0x00ff0000) >>> 16);
|
||
- this.bufferBuilder.append((num & 0x0000ff00) >>> 8);
|
||
- this.bufferBuilder.append((num & 0x000000ff));
|
||
-};
|
||
-
|
||
-Packer.prototype.pack_int64 = function (num) {
|
||
- var high = Math.floor(num / Math.pow(2, 32));
|
||
- var low = num % Math.pow(2, 32);
|
||
- this.bufferBuilder.append((high & 0xff000000) >>> 24);
|
||
- this.bufferBuilder.append((high & 0x00ff0000) >>> 16);
|
||
- this.bufferBuilder.append((high & 0x0000ff00) >>> 8);
|
||
- this.bufferBuilder.append((high & 0x000000ff));
|
||
- this.bufferBuilder.append((low & 0xff000000) >>> 24);
|
||
- this.bufferBuilder.append((low & 0x00ff0000) >>> 16);
|
||
- this.bufferBuilder.append((low & 0x0000ff00) >>> 8);
|
||
- this.bufferBuilder.append((low & 0x000000ff));
|
||
-};
|
||
-
|
||
-function _utf8Replace (m) {
|
||
- var code = m.charCodeAt(0);
|
||
-
|
||
- if (code <= 0x7ff) return '00';
|
||
- if (code <= 0xffff) return '000';
|
||
- if (code <= 0x1fffff) return '0000';
|
||
- if (code <= 0x3ffffff) return '00000';
|
||
- return '000000';
|
||
-}
|
||
-
|
||
-function utf8Length (str) {
|
||
- if (str.length > 600) {
|
||
- // Blob method faster for large strings
|
||
- return (new Blob([str])).size;
|
||
- } else {
|
||
- return str.replace(/[^\u0000-\u007F]/g, _utf8Replace).length;
|
||
- }
|
||
-}
|
||
-
|
||
-},{"./bufferbuilder":"EgBh"}],"iSxC":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.extractVersion = extractVersion;
|
||
-exports.wrapPeerConnectionEvent = wrapPeerConnectionEvent;
|
||
-exports.disableLog = disableLog;
|
||
-exports.disableWarnings = disableWarnings;
|
||
-exports.log = log;
|
||
-exports.deprecated = deprecated;
|
||
-exports.detectBrowser = detectBrowser;
|
||
-exports.compactObject = compactObject;
|
||
-exports.walkStats = walkStats;
|
||
-exports.filterStats = filterStats;
|
||
-
|
||
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-var logDisabled_ = true;
|
||
-var deprecationWarnings_ = true;
|
||
-/**
|
||
- * Extract browser version out of the provided user agent string.
|
||
- *
|
||
- * @param {!string} uastring userAgent string.
|
||
- * @param {!string} expr Regular expression used as match criteria.
|
||
- * @param {!number} pos position in the version string to be returned.
|
||
- * @return {!number} browser version.
|
||
- */
|
||
-
|
||
-function extractVersion(uastring, expr, pos) {
|
||
- var match = uastring.match(expr);
|
||
- return match && match.length >= pos && parseInt(match[pos], 10);
|
||
-} // Wraps the peerconnection event eventNameToWrap in a function
|
||
-// which returns the modified event object (or false to prevent
|
||
-// the event).
|
||
-
|
||
-
|
||
-function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var proto = window.RTCPeerConnection.prototype;
|
||
- var nativeAddEventListener = proto.addEventListener;
|
||
-
|
||
- proto.addEventListener = function (nativeEventName, cb) {
|
||
- if (nativeEventName !== eventNameToWrap) {
|
||
- return nativeAddEventListener.apply(this, arguments);
|
||
- }
|
||
-
|
||
- var wrappedCallback = function (e) {
|
||
- var modifiedEvent = wrapper(e);
|
||
-
|
||
- if (modifiedEvent) {
|
||
- if (cb.handleEvent) {
|
||
- cb.handleEvent(modifiedEvent);
|
||
- } else {
|
||
- cb(modifiedEvent);
|
||
- }
|
||
- }
|
||
- };
|
||
-
|
||
- this._eventMap = this._eventMap || {};
|
||
-
|
||
- if (!this._eventMap[eventNameToWrap]) {
|
||
- this._eventMap[eventNameToWrap] = new Map();
|
||
- }
|
||
-
|
||
- this._eventMap[eventNameToWrap].set(cb, wrappedCallback);
|
||
-
|
||
- return nativeAddEventListener.apply(this, [nativeEventName, wrappedCallback]);
|
||
- };
|
||
-
|
||
- var nativeRemoveEventListener = proto.removeEventListener;
|
||
-
|
||
- proto.removeEventListener = function (nativeEventName, cb) {
|
||
- if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[eventNameToWrap]) {
|
||
- return nativeRemoveEventListener.apply(this, arguments);
|
||
- }
|
||
-
|
||
- if (!this._eventMap[eventNameToWrap].has(cb)) {
|
||
- return nativeRemoveEventListener.apply(this, arguments);
|
||
- }
|
||
-
|
||
- var unwrappedCb = this._eventMap[eventNameToWrap].get(cb);
|
||
-
|
||
- this._eventMap[eventNameToWrap].delete(cb);
|
||
-
|
||
- if (this._eventMap[eventNameToWrap].size === 0) {
|
||
- delete this._eventMap[eventNameToWrap];
|
||
- }
|
||
-
|
||
- if (Object.keys(this._eventMap).length === 0) {
|
||
- delete this._eventMap;
|
||
- }
|
||
-
|
||
- return nativeRemoveEventListener.apply(this, [nativeEventName, unwrappedCb]);
|
||
- };
|
||
-
|
||
- Object.defineProperty(proto, 'on' + eventNameToWrap, {
|
||
- get: function () {
|
||
- return this['_on' + eventNameToWrap];
|
||
- },
|
||
- set: function (cb) {
|
||
- if (this['_on' + eventNameToWrap]) {
|
||
- this.removeEventListener(eventNameToWrap, this['_on' + eventNameToWrap]);
|
||
- delete this['_on' + eventNameToWrap];
|
||
- }
|
||
-
|
||
- if (cb) {
|
||
- this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb);
|
||
- }
|
||
- },
|
||
- enumerable: true,
|
||
- configurable: true
|
||
- });
|
||
-}
|
||
-
|
||
-function disableLog(bool) {
|
||
- if (typeof bool !== 'boolean') {
|
||
- return new Error('Argument type: ' + _typeof(bool) + '. Please use a boolean.');
|
||
- }
|
||
-
|
||
- logDisabled_ = bool;
|
||
- return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled';
|
||
-}
|
||
-/**
|
||
- * Disable or enable deprecation warnings
|
||
- * @param {!boolean} bool set to true to disable warnings.
|
||
- */
|
||
-
|
||
-
|
||
-function disableWarnings(bool) {
|
||
- if (typeof bool !== 'boolean') {
|
||
- return new Error('Argument type: ' + _typeof(bool) + '. Please use a boolean.');
|
||
- }
|
||
-
|
||
- deprecationWarnings_ = !bool;
|
||
- return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');
|
||
-}
|
||
-
|
||
-function log() {
|
||
- if ((typeof window === "undefined" ? "undefined" : _typeof(window)) === 'object') {
|
||
- if (logDisabled_) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (typeof console !== 'undefined' && typeof console.log === 'function') {
|
||
- console.log.apply(console, arguments);
|
||
- }
|
||
- }
|
||
-}
|
||
-/**
|
||
- * Shows a deprecation warning suggesting the modern and spec-compatible API.
|
||
- */
|
||
-
|
||
-
|
||
-function deprecated(oldMethod, newMethod) {
|
||
- if (!deprecationWarnings_) {
|
||
- return;
|
||
- }
|
||
-
|
||
- console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.');
|
||
-}
|
||
-/**
|
||
- * Browser detector.
|
||
- *
|
||
- * @return {object} result containing browser and version
|
||
- * properties.
|
||
- */
|
||
-
|
||
-
|
||
-function detectBrowser(window) {
|
||
- // Returned result object.
|
||
- var result = {
|
||
- browser: null,
|
||
- version: null
|
||
- }; // Fail early if it's not a browser
|
||
-
|
||
- if (typeof window === 'undefined' || !window.navigator) {
|
||
- result.browser = 'Not a browser.';
|
||
- return result;
|
||
- }
|
||
-
|
||
- var {
|
||
- navigator: navigator
|
||
- } = window;
|
||
-
|
||
- if (navigator.mozGetUserMedia) {
|
||
- // Firefox.
|
||
- result.browser = 'firefox';
|
||
- result.version = extractVersion(navigator.userAgent, /Firefox\/(\d+)\./, 1);
|
||
- } else if (navigator.webkitGetUserMedia || window.isSecureContext === false && window.webkitRTCPeerConnection && !window.RTCIceGatherer) {
|
||
- // Chrome, Chromium, Webview, Opera.
|
||
- // Version matches Chrome/WebRTC version.
|
||
- // Chrome 74 removed webkitGetUserMedia on http as well so we need the
|
||
- // more complicated fallback to webkitRTCPeerConnection.
|
||
- result.browser = 'chrome';
|
||
- result.version = extractVersion(navigator.userAgent, /Chrom(e|ium)\/(\d+)\./, 2);
|
||
- } else if (navigator.mediaDevices && navigator.userAgent.match(/Edge\/(\d+).(\d+)$/)) {
|
||
- // Edge.
|
||
- result.browser = 'edge';
|
||
- result.version = extractVersion(navigator.userAgent, /Edge\/(\d+).(\d+)$/, 2);
|
||
- } else if (window.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) {
|
||
- // Safari.
|
||
- result.browser = 'safari';
|
||
- result.version = extractVersion(navigator.userAgent, /AppleWebKit\/(\d+)\./, 1);
|
||
- result.supportsUnifiedPlan = window.RTCRtpTransceiver && 'currentDirection' in window.RTCRtpTransceiver.prototype;
|
||
- } else {
|
||
- // Default fallthrough: not supported.
|
||
- result.browser = 'Not a supported browser.';
|
||
- return result;
|
||
- }
|
||
-
|
||
- return result;
|
||
-}
|
||
-/**
|
||
- * Checks if something is an object.
|
||
- *
|
||
- * @param {*} val The something you want to check.
|
||
- * @return true if val is an object, false otherwise.
|
||
- */
|
||
-
|
||
-
|
||
-function isObject(val) {
|
||
- return Object.prototype.toString.call(val) === '[object Object]';
|
||
-}
|
||
-/**
|
||
- * Remove all empty objects and undefined values
|
||
- * from a nested object -- an enhanced and vanilla version
|
||
- * of Lodash's `compact`.
|
||
- */
|
||
-
|
||
-
|
||
-function compactObject(data) {
|
||
- if (!isObject(data)) {
|
||
- return data;
|
||
- }
|
||
-
|
||
- return Object.keys(data).reduce(function (accumulator, key) {
|
||
- var isObj = isObject(data[key]);
|
||
- var value = isObj ? compactObject(data[key]) : data[key];
|
||
- var isEmptyObject = isObj && !Object.keys(value).length;
|
||
-
|
||
- if (value === undefined || isEmptyObject) {
|
||
- return accumulator;
|
||
- }
|
||
-
|
||
- return Object.assign(accumulator, _defineProperty({}, key, value));
|
||
- }, {});
|
||
-}
|
||
-/* iterates the stats graph recursively. */
|
||
-
|
||
-
|
||
-function walkStats(stats, base, resultSet) {
|
||
- if (!base || resultSet.has(base.id)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- resultSet.set(base.id, base);
|
||
- Object.keys(base).forEach(function (name) {
|
||
- if (name.endsWith('Id')) {
|
||
- walkStats(stats, stats.get(base[name]), resultSet);
|
||
- } else if (name.endsWith('Ids')) {
|
||
- base[name].forEach(function (id) {
|
||
- walkStats(stats, stats.get(id), resultSet);
|
||
- });
|
||
- }
|
||
- });
|
||
-}
|
||
-/* filter getStats for a sender/receiver track. */
|
||
-
|
||
-
|
||
-function filterStats(result, track, outbound) {
|
||
- var streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';
|
||
- var filteredResult = new Map();
|
||
-
|
||
- if (track === null) {
|
||
- return filteredResult;
|
||
- }
|
||
-
|
||
- var trackStats = [];
|
||
- result.forEach(function (value) {
|
||
- if (value.type === 'track' && value.trackIdentifier === track.id) {
|
||
- trackStats.push(value);
|
||
- }
|
||
- });
|
||
- trackStats.forEach(function (trackStat) {
|
||
- result.forEach(function (stats) {
|
||
- if (stats.type === streamStatsType && stats.trackId === trackStat.id) {
|
||
- walkStats(result, stats, filteredResult);
|
||
- }
|
||
- });
|
||
- });
|
||
- return filteredResult;
|
||
-}
|
||
-},{}],"s6SN":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimGetUserMedia = shimGetUserMedia;
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils.js"));
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-var logging = utils.log;
|
||
-
|
||
-function shimGetUserMedia(window, browserDetails) {
|
||
- var navigator = window && window.navigator;
|
||
-
|
||
- if (!navigator.mediaDevices) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var constraintsToChrome_ = function (c) {
|
||
- if (_typeof(c) !== 'object' || c.mandatory || c.optional) {
|
||
- return c;
|
||
- }
|
||
-
|
||
- var cc = {};
|
||
- Object.keys(c).forEach(function (key) {
|
||
- if (key === 'require' || key === 'advanced' || key === 'mediaSource') {
|
||
- return;
|
||
- }
|
||
-
|
||
- var r = _typeof(c[key]) === 'object' ? c[key] : {
|
||
- ideal: c[key]
|
||
- };
|
||
-
|
||
- if (r.exact !== undefined && typeof r.exact === 'number') {
|
||
- r.min = r.max = r.exact;
|
||
- }
|
||
-
|
||
- var oldname_ = function (prefix, name) {
|
||
- if (prefix) {
|
||
- return prefix + name.charAt(0).toUpperCase() + name.slice(1);
|
||
- }
|
||
-
|
||
- return name === 'deviceId' ? 'sourceId' : name;
|
||
- };
|
||
-
|
||
- if (r.ideal !== undefined) {
|
||
- cc.optional = cc.optional || [];
|
||
- var oc = {};
|
||
-
|
||
- if (typeof r.ideal === 'number') {
|
||
- oc[oldname_('min', key)] = r.ideal;
|
||
- cc.optional.push(oc);
|
||
- oc = {};
|
||
- oc[oldname_('max', key)] = r.ideal;
|
||
- cc.optional.push(oc);
|
||
- } else {
|
||
- oc[oldname_('', key)] = r.ideal;
|
||
- cc.optional.push(oc);
|
||
- }
|
||
- }
|
||
-
|
||
- if (r.exact !== undefined && typeof r.exact !== 'number') {
|
||
- cc.mandatory = cc.mandatory || {};
|
||
- cc.mandatory[oldname_('', key)] = r.exact;
|
||
- } else {
|
||
- ['min', 'max'].forEach(function (mix) {
|
||
- if (r[mix] !== undefined) {
|
||
- cc.mandatory = cc.mandatory || {};
|
||
- cc.mandatory[oldname_(mix, key)] = r[mix];
|
||
- }
|
||
- });
|
||
- }
|
||
- });
|
||
-
|
||
- if (c.advanced) {
|
||
- cc.optional = (cc.optional || []).concat(c.advanced);
|
||
- }
|
||
-
|
||
- return cc;
|
||
- };
|
||
-
|
||
- var shimConstraints_ = function (constraints, func) {
|
||
- if (browserDetails.version >= 61) {
|
||
- return func(constraints);
|
||
- }
|
||
-
|
||
- constraints = JSON.parse(JSON.stringify(constraints));
|
||
-
|
||
- if (constraints && _typeof(constraints.audio) === 'object') {
|
||
- var remap = function (obj, a, b) {
|
||
- if (a in obj && !(b in obj)) {
|
||
- obj[b] = obj[a];
|
||
- delete obj[a];
|
||
- }
|
||
- };
|
||
-
|
||
- constraints = JSON.parse(JSON.stringify(constraints));
|
||
- remap(constraints.audio, 'autoGainControl', 'googAutoGainControl');
|
||
- remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression');
|
||
- constraints.audio = constraintsToChrome_(constraints.audio);
|
||
- }
|
||
-
|
||
- if (constraints && _typeof(constraints.video) === 'object') {
|
||
- // Shim facingMode for mobile & surface pro.
|
||
- var face = constraints.video.facingMode;
|
||
- face = face && (_typeof(face) === 'object' ? face : {
|
||
- ideal: face
|
||
- });
|
||
- var getSupportedFacingModeLies = browserDetails.version < 66;
|
||
-
|
||
- if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) {
|
||
- delete constraints.video.facingMode;
|
||
- var matches;
|
||
-
|
||
- if (face.exact === 'environment' || face.ideal === 'environment') {
|
||
- matches = ['back', 'rear'];
|
||
- } else if (face.exact === 'user' || face.ideal === 'user') {
|
||
- matches = ['front'];
|
||
- }
|
||
-
|
||
- if (matches) {
|
||
- // Look for matches in label, or use last cam for back (typical).
|
||
- return navigator.mediaDevices.enumerateDevices().then(function (devices) {
|
||
- devices = devices.filter(function (d) {
|
||
- return d.kind === 'videoinput';
|
||
- });
|
||
- var dev = devices.find(function (d) {
|
||
- return matches.some(function (match) {
|
||
- return d.label.toLowerCase().includes(match);
|
||
- });
|
||
- });
|
||
-
|
||
- if (!dev && devices.length && matches.includes('back')) {
|
||
- dev = devices[devices.length - 1]; // more likely the back cam
|
||
- }
|
||
-
|
||
- if (dev) {
|
||
- constraints.video.deviceId = face.exact ? {
|
||
- exact: dev.deviceId
|
||
- } : {
|
||
- ideal: dev.deviceId
|
||
- };
|
||
- }
|
||
-
|
||
- constraints.video = constraintsToChrome_(constraints.video);
|
||
- logging('chrome: ' + JSON.stringify(constraints));
|
||
- return func(constraints);
|
||
- });
|
||
- }
|
||
- }
|
||
-
|
||
- constraints.video = constraintsToChrome_(constraints.video);
|
||
- }
|
||
-
|
||
- logging('chrome: ' + JSON.stringify(constraints));
|
||
- return func(constraints);
|
||
- };
|
||
-
|
||
- var shimError_ = function (e) {
|
||
- if (browserDetails.version >= 64) {
|
||
- return e;
|
||
- }
|
||
-
|
||
- return {
|
||
- name: {
|
||
- PermissionDeniedError: 'NotAllowedError',
|
||
- PermissionDismissedError: 'NotAllowedError',
|
||
- InvalidStateError: 'NotAllowedError',
|
||
- DevicesNotFoundError: 'NotFoundError',
|
||
- ConstraintNotSatisfiedError: 'OverconstrainedError',
|
||
- TrackStartError: 'NotReadableError',
|
||
- MediaDeviceFailedDueToShutdown: 'NotAllowedError',
|
||
- MediaDeviceKillSwitchOn: 'NotAllowedError',
|
||
- TabCaptureError: 'AbortError',
|
||
- ScreenCaptureError: 'AbortError',
|
||
- DeviceCaptureError: 'AbortError'
|
||
- }[e.name] || e.name,
|
||
- message: e.message,
|
||
- constraint: e.constraint || e.constraintName,
|
||
- toString: function () {
|
||
- return this.name + (this.message && ': ') + this.message;
|
||
- }
|
||
- };
|
||
- };
|
||
-
|
||
- var getUserMedia_ = function (constraints, onSuccess, onError) {
|
||
- shimConstraints_(constraints, function (c) {
|
||
- navigator.webkitGetUserMedia(c, onSuccess, function (e) {
|
||
- if (onError) {
|
||
- onError(shimError_(e));
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
-
|
||
- navigator.getUserMedia = getUserMedia_.bind(navigator); // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia
|
||
- // function which returns a Promise, it does not accept spec-style
|
||
- // constraints.
|
||
-
|
||
- if (navigator.mediaDevices.getUserMedia) {
|
||
- var origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);
|
||
-
|
||
- navigator.mediaDevices.getUserMedia = function (cs) {
|
||
- return shimConstraints_(cs, function (c) {
|
||
- return origGetUserMedia(c).then(function (stream) {
|
||
- if (c.audio && !stream.getAudioTracks().length || c.video && !stream.getVideoTracks().length) {
|
||
- stream.getTracks().forEach(function (track) {
|
||
- track.stop();
|
||
- });
|
||
- throw new DOMException('', 'NotFoundError');
|
||
- }
|
||
-
|
||
- return stream;
|
||
- }, function (e) {
|
||
- return Promise.reject(shimError_(e));
|
||
- });
|
||
- });
|
||
- };
|
||
- }
|
||
-}
|
||
-},{"../utils.js":"iSxC"}],"VHa8":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimGetDisplayMedia = shimGetDisplayMedia;
|
||
-
|
||
-function shimGetDisplayMedia(window, getSourceId) {
|
||
- if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!window.navigator.mediaDevices) {
|
||
- return;
|
||
- } // getSourceId is a function that returns a promise resolving with
|
||
- // the sourceId of the screen/window/tab to be shared.
|
||
-
|
||
-
|
||
- if (typeof getSourceId !== 'function') {
|
||
- console.error('shimGetDisplayMedia: getSourceId argument is not ' + 'a function');
|
||
- return;
|
||
- }
|
||
-
|
||
- window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {
|
||
- return getSourceId(constraints).then(function (sourceId) {
|
||
- var widthSpecified = constraints.video && constraints.video.width;
|
||
- var heightSpecified = constraints.video && constraints.video.height;
|
||
- var frameRateSpecified = constraints.video && constraints.video.frameRate;
|
||
- constraints.video = {
|
||
- mandatory: {
|
||
- chromeMediaSource: 'desktop',
|
||
- chromeMediaSourceId: sourceId,
|
||
- maxFrameRate: frameRateSpecified || 3
|
||
- }
|
||
- };
|
||
-
|
||
- if (widthSpecified) {
|
||
- constraints.video.mandatory.maxWidth = widthSpecified;
|
||
- }
|
||
-
|
||
- if (heightSpecified) {
|
||
- constraints.video.mandatory.maxHeight = heightSpecified;
|
||
- }
|
||
-
|
||
- return window.navigator.mediaDevices.getUserMedia(constraints);
|
||
- });
|
||
- };
|
||
-}
|
||
-},{}],"uI5X":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimMediaStream = shimMediaStream;
|
||
-exports.shimOnTrack = shimOnTrack;
|
||
-exports.shimGetSendersWithDtmf = shimGetSendersWithDtmf;
|
||
-exports.shimGetStats = shimGetStats;
|
||
-exports.shimSenderReceiverGetStats = shimSenderReceiverGetStats;
|
||
-exports.shimAddTrackRemoveTrackWithNative = shimAddTrackRemoveTrackWithNative;
|
||
-exports.shimAddTrackRemoveTrack = shimAddTrackRemoveTrack;
|
||
-exports.shimPeerConnection = shimPeerConnection;
|
||
-exports.fixNegotiationNeeded = fixNegotiationNeeded;
|
||
-Object.defineProperty(exports, "shimGetUserMedia", {
|
||
- enumerable: true,
|
||
- get: function () {
|
||
- return _getusermedia.shimGetUserMedia;
|
||
- }
|
||
-});
|
||
-Object.defineProperty(exports, "shimGetDisplayMedia", {
|
||
- enumerable: true,
|
||
- get: function () {
|
||
- return _getdisplaymedia.shimGetDisplayMedia;
|
||
- }
|
||
-});
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils.js"));
|
||
-
|
||
-var _getusermedia = require("./getusermedia");
|
||
-
|
||
-var _getdisplaymedia = require("./getdisplaymedia");
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-function shimMediaStream(window) {
|
||
- window.MediaStream = window.MediaStream || window.webkitMediaStream;
|
||
-}
|
||
-
|
||
-function shimOnTrack(window) {
|
||
- if (_typeof(window) === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) {
|
||
- Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {
|
||
- get: function () {
|
||
- return this._ontrack;
|
||
- },
|
||
- set: function (f) {
|
||
- if (this._ontrack) {
|
||
- this.removeEventListener('track', this._ontrack);
|
||
- }
|
||
-
|
||
- this.addEventListener('track', this._ontrack = f);
|
||
- },
|
||
- enumerable: true,
|
||
- configurable: true
|
||
- });
|
||
- var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;
|
||
-
|
||
- window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {
|
||
- var _this = this;
|
||
-
|
||
- if (!this._ontrackpoly) {
|
||
- this._ontrackpoly = function (e) {
|
||
- // onaddstream does not fire when a track is added to an existing
|
||
- // stream. But stream.onaddtrack is implemented so we use that.
|
||
- e.stream.addEventListener('addtrack', function (te) {
|
||
- var receiver;
|
||
-
|
||
- if (window.RTCPeerConnection.prototype.getReceivers) {
|
||
- receiver = _this.getReceivers().find(function (r) {
|
||
- return r.track && r.track.id === te.track.id;
|
||
- });
|
||
- } else {
|
||
- receiver = {
|
||
- track: te.track
|
||
- };
|
||
- }
|
||
-
|
||
- var event = new Event('track');
|
||
- event.track = te.track;
|
||
- event.receiver = receiver;
|
||
- event.transceiver = {
|
||
- receiver: receiver
|
||
- };
|
||
- event.streams = [e.stream];
|
||
-
|
||
- _this.dispatchEvent(event);
|
||
- });
|
||
- e.stream.getTracks().forEach(function (track) {
|
||
- var receiver;
|
||
-
|
||
- if (window.RTCPeerConnection.prototype.getReceivers) {
|
||
- receiver = _this.getReceivers().find(function (r) {
|
||
- return r.track && r.track.id === track.id;
|
||
- });
|
||
- } else {
|
||
- receiver = {
|
||
- track: track
|
||
- };
|
||
- }
|
||
-
|
||
- var event = new Event('track');
|
||
- event.track = track;
|
||
- event.receiver = receiver;
|
||
- event.transceiver = {
|
||
- receiver: receiver
|
||
- };
|
||
- event.streams = [e.stream];
|
||
-
|
||
- _this.dispatchEvent(event);
|
||
- });
|
||
- };
|
||
-
|
||
- this.addEventListener('addstream', this._ontrackpoly);
|
||
- }
|
||
-
|
||
- return origSetRemoteDescription.apply(this, arguments);
|
||
- };
|
||
- } else {
|
||
- // even if RTCRtpTransceiver is in window, it is only used and
|
||
- // emitted in unified-plan. Unfortunately this means we need
|
||
- // to unconditionally wrap the event.
|
||
- utils.wrapPeerConnectionEvent(window, 'track', function (e) {
|
||
- if (!e.transceiver) {
|
||
- Object.defineProperty(e, 'transceiver', {
|
||
- value: {
|
||
- receiver: e.receiver
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- return e;
|
||
- });
|
||
- }
|
||
-}
|
||
-
|
||
-function shimGetSendersWithDtmf(window) {
|
||
- // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.
|
||
- if (_typeof(window) === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) {
|
||
- var shimSenderWithDtmf = function (pc, track) {
|
||
- return {
|
||
- track: track,
|
||
-
|
||
- get dtmf() {
|
||
- if (this._dtmf === undefined) {
|
||
- if (track.kind === 'audio') {
|
||
- this._dtmf = pc.createDTMFSender(track);
|
||
- } else {
|
||
- this._dtmf = null;
|
||
- }
|
||
- }
|
||
-
|
||
- return this._dtmf;
|
||
- },
|
||
-
|
||
- _pc: pc
|
||
- };
|
||
- }; // augment addTrack when getSenders is not available.
|
||
-
|
||
-
|
||
- if (!window.RTCPeerConnection.prototype.getSenders) {
|
||
- window.RTCPeerConnection.prototype.getSenders = function getSenders() {
|
||
- this._senders = this._senders || [];
|
||
- return this._senders.slice(); // return a copy of the internal state.
|
||
- };
|
||
-
|
||
- var origAddTrack = window.RTCPeerConnection.prototype.addTrack;
|
||
-
|
||
- window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {
|
||
- var sender = origAddTrack.apply(this, arguments);
|
||
-
|
||
- if (!sender) {
|
||
- sender = shimSenderWithDtmf(this, track);
|
||
-
|
||
- this._senders.push(sender);
|
||
- }
|
||
-
|
||
- return sender;
|
||
- };
|
||
-
|
||
- var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {
|
||
- origRemoveTrack.apply(this, arguments);
|
||
-
|
||
- var idx = this._senders.indexOf(sender);
|
||
-
|
||
- if (idx !== -1) {
|
||
- this._senders.splice(idx, 1);
|
||
- }
|
||
- };
|
||
- }
|
||
-
|
||
- var origAddStream = window.RTCPeerConnection.prototype.addStream;
|
||
-
|
||
- window.RTCPeerConnection.prototype.addStream = function addStream(stream) {
|
||
- var _this2 = this;
|
||
-
|
||
- this._senders = this._senders || [];
|
||
- origAddStream.apply(this, [stream]);
|
||
- stream.getTracks().forEach(function (track) {
|
||
- _this2._senders.push(shimSenderWithDtmf(_this2, track));
|
||
- });
|
||
- };
|
||
-
|
||
- var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {
|
||
- var _this3 = this;
|
||
-
|
||
- this._senders = this._senders || [];
|
||
- origRemoveStream.apply(this, [stream]);
|
||
- stream.getTracks().forEach(function (track) {
|
||
- var sender = _this3._senders.find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
-
|
||
- if (sender) {
|
||
- // remove sender
|
||
- _this3._senders.splice(_this3._senders.indexOf(sender), 1);
|
||
- }
|
||
- });
|
||
- };
|
||
- } else if (_typeof(window) === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {
|
||
- var origGetSenders = window.RTCPeerConnection.prototype.getSenders;
|
||
-
|
||
- window.RTCPeerConnection.prototype.getSenders = function getSenders() {
|
||
- var _this4 = this;
|
||
-
|
||
- var senders = origGetSenders.apply(this, []);
|
||
- senders.forEach(function (sender) {
|
||
- return sender._pc = _this4;
|
||
- });
|
||
- return senders;
|
||
- };
|
||
-
|
||
- Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {
|
||
- get: function () {
|
||
- if (this._dtmf === undefined) {
|
||
- if (this.track.kind === 'audio') {
|
||
- this._dtmf = this._pc.createDTMFSender(this.track);
|
||
- } else {
|
||
- this._dtmf = null;
|
||
- }
|
||
- }
|
||
-
|
||
- return this._dtmf;
|
||
- }
|
||
- });
|
||
- }
|
||
-}
|
||
-
|
||
-function shimGetStats(window) {
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origGetStats = window.RTCPeerConnection.prototype.getStats;
|
||
-
|
||
- window.RTCPeerConnection.prototype.getStats = function getStats() {
|
||
- var _this5 = this;
|
||
-
|
||
- var [selector, onSucc, onErr] = arguments; // If selector is a function then we are in the old style stats so just
|
||
- // pass back the original getStats format to avoid breaking old users.
|
||
-
|
||
- if (arguments.length > 0 && typeof selector === 'function') {
|
||
- return origGetStats.apply(this, arguments);
|
||
- } // When spec-style getStats is supported, return those when called with
|
||
- // either no arguments or the selector argument is null.
|
||
-
|
||
-
|
||
- if (origGetStats.length === 0 && (arguments.length === 0 || typeof selector !== 'function')) {
|
||
- return origGetStats.apply(this, []);
|
||
- }
|
||
-
|
||
- var fixChromeStats_ = function (response) {
|
||
- var standardReport = {};
|
||
- var reports = response.result();
|
||
- reports.forEach(function (report) {
|
||
- var standardStats = {
|
||
- id: report.id,
|
||
- timestamp: report.timestamp,
|
||
- type: {
|
||
- localcandidate: 'local-candidate',
|
||
- remotecandidate: 'remote-candidate'
|
||
- }[report.type] || report.type
|
||
- };
|
||
- report.names().forEach(function (name) {
|
||
- standardStats[name] = report.stat(name);
|
||
- });
|
||
- standardReport[standardStats.id] = standardStats;
|
||
- });
|
||
- return standardReport;
|
||
- }; // shim getStats with maplike support
|
||
-
|
||
-
|
||
- var makeMapStats = function (stats) {
|
||
- return new Map(Object.keys(stats).map(function (key) {
|
||
- return [key, stats[key]];
|
||
- }));
|
||
- };
|
||
-
|
||
- if (arguments.length >= 2) {
|
||
- var successCallbackWrapper_ = function (response) {
|
||
- onSucc(makeMapStats(fixChromeStats_(response)));
|
||
- };
|
||
-
|
||
- return origGetStats.apply(this, [successCallbackWrapper_, selector]);
|
||
- } // promise-support
|
||
-
|
||
-
|
||
- return new Promise(function (resolve, reject) {
|
||
- origGetStats.apply(_this5, [function (response) {
|
||
- resolve(makeMapStats(fixChromeStats_(response)));
|
||
- }, reject]);
|
||
- }).then(onSucc, onErr);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimSenderReceiverGetStats(window) {
|
||
- if (!(_typeof(window) === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) {
|
||
- return;
|
||
- } // shim sender stats.
|
||
-
|
||
-
|
||
- if (!('getStats' in window.RTCRtpSender.prototype)) {
|
||
- var origGetSenders = window.RTCPeerConnection.prototype.getSenders;
|
||
-
|
||
- if (origGetSenders) {
|
||
- window.RTCPeerConnection.prototype.getSenders = function getSenders() {
|
||
- var _this6 = this;
|
||
-
|
||
- var senders = origGetSenders.apply(this, []);
|
||
- senders.forEach(function (sender) {
|
||
- return sender._pc = _this6;
|
||
- });
|
||
- return senders;
|
||
- };
|
||
- }
|
||
-
|
||
- var origAddTrack = window.RTCPeerConnection.prototype.addTrack;
|
||
-
|
||
- if (origAddTrack) {
|
||
- window.RTCPeerConnection.prototype.addTrack = function addTrack() {
|
||
- var sender = origAddTrack.apply(this, arguments);
|
||
- sender._pc = this;
|
||
- return sender;
|
||
- };
|
||
- }
|
||
-
|
||
- window.RTCRtpSender.prototype.getStats = function getStats() {
|
||
- var sender = this;
|
||
- return this._pc.getStats().then(function (result) {
|
||
- return (
|
||
- /* Note: this will include stats of all senders that
|
||
- * send a track with the same id as sender.track as
|
||
- * it is not possible to identify the RTCRtpSender.
|
||
- */
|
||
- utils.filterStats(result, sender.track, true)
|
||
- );
|
||
- });
|
||
- };
|
||
- } // shim receiver stats.
|
||
-
|
||
-
|
||
- if (!('getStats' in window.RTCRtpReceiver.prototype)) {
|
||
- var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;
|
||
-
|
||
- if (origGetReceivers) {
|
||
- window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {
|
||
- var _this7 = this;
|
||
-
|
||
- var receivers = origGetReceivers.apply(this, []);
|
||
- receivers.forEach(function (receiver) {
|
||
- return receiver._pc = _this7;
|
||
- });
|
||
- return receivers;
|
||
- };
|
||
- }
|
||
-
|
||
- utils.wrapPeerConnectionEvent(window, 'track', function (e) {
|
||
- e.receiver._pc = e.srcElement;
|
||
- return e;
|
||
- });
|
||
-
|
||
- window.RTCRtpReceiver.prototype.getStats = function getStats() {
|
||
- var receiver = this;
|
||
- return this._pc.getStats().then(function (result) {
|
||
- return utils.filterStats(result, receiver.track, false);
|
||
- });
|
||
- };
|
||
- }
|
||
-
|
||
- if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) {
|
||
- return;
|
||
- } // shim RTCPeerConnection.getStats(track).
|
||
-
|
||
-
|
||
- var origGetStats = window.RTCPeerConnection.prototype.getStats;
|
||
-
|
||
- window.RTCPeerConnection.prototype.getStats = function getStats() {
|
||
- if (arguments.length > 0 && arguments[0] instanceof window.MediaStreamTrack) {
|
||
- var track = arguments[0];
|
||
- var sender;
|
||
- var receiver;
|
||
- var err;
|
||
- this.getSenders().forEach(function (s) {
|
||
- if (s.track === track) {
|
||
- if (sender) {
|
||
- err = true;
|
||
- } else {
|
||
- sender = s;
|
||
- }
|
||
- }
|
||
- });
|
||
- this.getReceivers().forEach(function (r) {
|
||
- if (r.track === track) {
|
||
- if (receiver) {
|
||
- err = true;
|
||
- } else {
|
||
- receiver = r;
|
||
- }
|
||
- }
|
||
-
|
||
- return r.track === track;
|
||
- });
|
||
-
|
||
- if (err || sender && receiver) {
|
||
- return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError'));
|
||
- } else if (sender) {
|
||
- return sender.getStats();
|
||
- } else if (receiver) {
|
||
- return receiver.getStats();
|
||
- }
|
||
-
|
||
- return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError'));
|
||
- }
|
||
-
|
||
- return origGetStats.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimAddTrackRemoveTrackWithNative(window) {
|
||
- // shim addTrack/removeTrack with native variants in order to make
|
||
- // the interactions with legacy getLocalStreams behave as in other browsers.
|
||
- // Keeps a mapping stream.id => [stream, rtpsenders...]
|
||
- window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {
|
||
- var _this8 = this;
|
||
-
|
||
- this._shimmedLocalStreams = this._shimmedLocalStreams || {};
|
||
- return Object.keys(this._shimmedLocalStreams).map(function (streamId) {
|
||
- return _this8._shimmedLocalStreams[streamId][0];
|
||
- });
|
||
- };
|
||
-
|
||
- var origAddTrack = window.RTCPeerConnection.prototype.addTrack;
|
||
-
|
||
- window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {
|
||
- if (!stream) {
|
||
- return origAddTrack.apply(this, arguments);
|
||
- }
|
||
-
|
||
- this._shimmedLocalStreams = this._shimmedLocalStreams || {};
|
||
- var sender = origAddTrack.apply(this, arguments);
|
||
-
|
||
- if (!this._shimmedLocalStreams[stream.id]) {
|
||
- this._shimmedLocalStreams[stream.id] = [stream, sender];
|
||
- } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {
|
||
- this._shimmedLocalStreams[stream.id].push(sender);
|
||
- }
|
||
-
|
||
- return sender;
|
||
- };
|
||
-
|
||
- var origAddStream = window.RTCPeerConnection.prototype.addStream;
|
||
-
|
||
- window.RTCPeerConnection.prototype.addStream = function addStream(stream) {
|
||
- var _this9 = this;
|
||
-
|
||
- this._shimmedLocalStreams = this._shimmedLocalStreams || {};
|
||
- stream.getTracks().forEach(function (track) {
|
||
- var alreadyExists = _this9.getSenders().find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
-
|
||
- if (alreadyExists) {
|
||
- throw new DOMException('Track already exists.', 'InvalidAccessError');
|
||
- }
|
||
- });
|
||
- var existingSenders = this.getSenders();
|
||
- origAddStream.apply(this, arguments);
|
||
- var newSenders = this.getSenders().filter(function (newSender) {
|
||
- return existingSenders.indexOf(newSender) === -1;
|
||
- });
|
||
- this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);
|
||
- };
|
||
-
|
||
- var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {
|
||
- this._shimmedLocalStreams = this._shimmedLocalStreams || {};
|
||
- delete this._shimmedLocalStreams[stream.id];
|
||
- return origRemoveStream.apply(this, arguments);
|
||
- };
|
||
-
|
||
- var origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {
|
||
- var _this10 = this;
|
||
-
|
||
- this._shimmedLocalStreams = this._shimmedLocalStreams || {};
|
||
-
|
||
- if (sender) {
|
||
- Object.keys(this._shimmedLocalStreams).forEach(function (streamId) {
|
||
- var idx = _this10._shimmedLocalStreams[streamId].indexOf(sender);
|
||
-
|
||
- if (idx !== -1) {
|
||
- _this10._shimmedLocalStreams[streamId].splice(idx, 1);
|
||
- }
|
||
-
|
||
- if (_this10._shimmedLocalStreams[streamId].length === 1) {
|
||
- delete _this10._shimmedLocalStreams[streamId];
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- return origRemoveTrack.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimAddTrackRemoveTrack(window, browserDetails) {
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- } // shim addTrack and removeTrack.
|
||
-
|
||
-
|
||
- if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) {
|
||
- return shimAddTrackRemoveTrackWithNative(window);
|
||
- } // also shim pc.getLocalStreams when addTrack is shimmed
|
||
- // to return the original streams.
|
||
-
|
||
-
|
||
- var origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams;
|
||
-
|
||
- window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {
|
||
- var _this11 = this;
|
||
-
|
||
- var nativeStreams = origGetLocalStreams.apply(this);
|
||
- this._reverseStreams = this._reverseStreams || {};
|
||
- return nativeStreams.map(function (stream) {
|
||
- return _this11._reverseStreams[stream.id];
|
||
- });
|
||
- };
|
||
-
|
||
- var origAddStream = window.RTCPeerConnection.prototype.addStream;
|
||
-
|
||
- window.RTCPeerConnection.prototype.addStream = function addStream(stream) {
|
||
- var _this12 = this;
|
||
-
|
||
- this._streams = this._streams || {};
|
||
- this._reverseStreams = this._reverseStreams || {};
|
||
- stream.getTracks().forEach(function (track) {
|
||
- var alreadyExists = _this12.getSenders().find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
-
|
||
- if (alreadyExists) {
|
||
- throw new DOMException('Track already exists.', 'InvalidAccessError');
|
||
- }
|
||
- }); // Add identity mapping for consistency with addTrack.
|
||
- // Unless this is being used with a stream from addTrack.
|
||
-
|
||
- if (!this._reverseStreams[stream.id]) {
|
||
- var newStream = new window.MediaStream(stream.getTracks());
|
||
- this._streams[stream.id] = newStream;
|
||
- this._reverseStreams[newStream.id] = stream;
|
||
- stream = newStream;
|
||
- }
|
||
-
|
||
- origAddStream.apply(this, [stream]);
|
||
- };
|
||
-
|
||
- var origRemoveStream = window.RTCPeerConnection.prototype.removeStream;
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {
|
||
- this._streams = this._streams || {};
|
||
- this._reverseStreams = this._reverseStreams || {};
|
||
- origRemoveStream.apply(this, [this._streams[stream.id] || stream]);
|
||
- delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id];
|
||
- delete this._streams[stream.id];
|
||
- };
|
||
-
|
||
- window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {
|
||
- var _this13 = this;
|
||
-
|
||
- if (this.signalingState === 'closed') {
|
||
- throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.', 'InvalidStateError');
|
||
- }
|
||
-
|
||
- var streams = [].slice.call(arguments, 1);
|
||
-
|
||
- if (streams.length !== 1 || !streams[0].getTracks().find(function (t) {
|
||
- return t === track;
|
||
- })) {
|
||
- // this is not fully correct but all we can manage without
|
||
- // [[associated MediaStreams]] internal slot.
|
||
- throw new DOMException('The adapter.js addTrack polyfill only supports a single ' + ' stream which is associated with the specified track.', 'NotSupportedError');
|
||
- }
|
||
-
|
||
- var alreadyExists = this.getSenders().find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
-
|
||
- if (alreadyExists) {
|
||
- throw new DOMException('Track already exists.', 'InvalidAccessError');
|
||
- }
|
||
-
|
||
- this._streams = this._streams || {};
|
||
- this._reverseStreams = this._reverseStreams || {};
|
||
- var oldStream = this._streams[stream.id];
|
||
-
|
||
- if (oldStream) {
|
||
- // this is using odd Chrome behaviour, use with caution:
|
||
- // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815
|
||
- // Note: we rely on the high-level addTrack/dtmf shim to
|
||
- // create the sender with a dtmf sender.
|
||
- oldStream.addTrack(track); // Trigger ONN async.
|
||
-
|
||
- Promise.resolve().then(function () {
|
||
- _this13.dispatchEvent(new Event('negotiationneeded'));
|
||
- });
|
||
- } else {
|
||
- var newStream = new window.MediaStream([track]);
|
||
- this._streams[stream.id] = newStream;
|
||
- this._reverseStreams[newStream.id] = stream;
|
||
- this.addStream(newStream);
|
||
- }
|
||
-
|
||
- return this.getSenders().find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
- }; // replace the internal stream id with the external one and
|
||
- // vice versa.
|
||
-
|
||
-
|
||
- function replaceInternalStreamId(pc, description) {
|
||
- var sdp = description.sdp;
|
||
- Object.keys(pc._reverseStreams || []).forEach(function (internalId) {
|
||
- var externalStream = pc._reverseStreams[internalId];
|
||
- var internalStream = pc._streams[externalStream.id];
|
||
- sdp = sdp.replace(new RegExp(internalStream.id, 'g'), externalStream.id);
|
||
- });
|
||
- return new RTCSessionDescription({
|
||
- type: description.type,
|
||
- sdp: sdp
|
||
- });
|
||
- }
|
||
-
|
||
- function replaceExternalStreamId(pc, description) {
|
||
- var sdp = description.sdp;
|
||
- Object.keys(pc._reverseStreams || []).forEach(function (internalId) {
|
||
- var externalStream = pc._reverseStreams[internalId];
|
||
- var internalStream = pc._streams[externalStream.id];
|
||
- sdp = sdp.replace(new RegExp(externalStream.id, 'g'), internalStream.id);
|
||
- });
|
||
- return new RTCSessionDescription({
|
||
- type: description.type,
|
||
- sdp: sdp
|
||
- });
|
||
- }
|
||
-
|
||
- ['createOffer', 'createAnswer'].forEach(function (method) {
|
||
- var nativeMethod = window.RTCPeerConnection.prototype[method];
|
||
-
|
||
- var methodObj = _defineProperty({}, method, function () {
|
||
- var _this14 = this;
|
||
-
|
||
- var args = arguments;
|
||
- var isLegacyCall = arguments.length && typeof arguments[0] === 'function';
|
||
-
|
||
- if (isLegacyCall) {
|
||
- return nativeMethod.apply(this, [function (description) {
|
||
- var desc = replaceInternalStreamId(_this14, description);
|
||
- args[0].apply(null, [desc]);
|
||
- }, function (err) {
|
||
- if (args[1]) {
|
||
- args[1].apply(null, err);
|
||
- }
|
||
- }, arguments[2]]);
|
||
- }
|
||
-
|
||
- return nativeMethod.apply(this, arguments).then(function (description) {
|
||
- return replaceInternalStreamId(_this14, description);
|
||
- });
|
||
- });
|
||
-
|
||
- window.RTCPeerConnection.prototype[method] = methodObj[method];
|
||
- });
|
||
- var origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;
|
||
-
|
||
- window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {
|
||
- if (!arguments.length || !arguments[0].type) {
|
||
- return origSetLocalDescription.apply(this, arguments);
|
||
- }
|
||
-
|
||
- arguments[0] = replaceExternalStreamId(this, arguments[0]);
|
||
- return origSetLocalDescription.apply(this, arguments);
|
||
- }; // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier
|
||
-
|
||
-
|
||
- var origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription');
|
||
- Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', {
|
||
- get: function () {
|
||
- var description = origLocalDescription.get.apply(this);
|
||
-
|
||
- if (description.type === '') {
|
||
- return description;
|
||
- }
|
||
-
|
||
- return replaceInternalStreamId(this, description);
|
||
- }
|
||
- });
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {
|
||
- var _this15 = this;
|
||
-
|
||
- if (this.signalingState === 'closed') {
|
||
- throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.', 'InvalidStateError');
|
||
- } // We can not yet check for sender instanceof RTCRtpSender
|
||
- // since we shim RTPSender. So we check if sender._pc is set.
|
||
-
|
||
-
|
||
- if (!sender._pc) {
|
||
- throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.', 'TypeError');
|
||
- }
|
||
-
|
||
- var isLocal = sender._pc === this;
|
||
-
|
||
- if (!isLocal) {
|
||
- throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError');
|
||
- } // Search for the native stream the senders track belongs to.
|
||
-
|
||
-
|
||
- this._streams = this._streams || {};
|
||
- var stream;
|
||
- Object.keys(this._streams).forEach(function (streamid) {
|
||
- var hasTrack = _this15._streams[streamid].getTracks().find(function (track) {
|
||
- return sender.track === track;
|
||
- });
|
||
-
|
||
- if (hasTrack) {
|
||
- stream = _this15._streams[streamid];
|
||
- }
|
||
- });
|
||
-
|
||
- if (stream) {
|
||
- if (stream.getTracks().length === 1) {
|
||
- // if this is the last track of the stream, remove the stream. This
|
||
- // takes care of any shimmed _senders.
|
||
- this.removeStream(this._reverseStreams[stream.id]);
|
||
- } else {
|
||
- // relying on the same odd chrome behaviour as above.
|
||
- stream.removeTrack(sender.track);
|
||
- }
|
||
-
|
||
- this.dispatchEvent(new Event('negotiationneeded'));
|
||
- }
|
||
- };
|
||
-}
|
||
-
|
||
-function shimPeerConnection(window, browserDetails) {
|
||
- if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {
|
||
- // very basic support for old versions.
|
||
- window.RTCPeerConnection = window.webkitRTCPeerConnection;
|
||
- }
|
||
-
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- } // shim implicit creation of RTCSessionDescription/RTCIceCandidate
|
||
-
|
||
-
|
||
- if (browserDetails.version < 53) {
|
||
- ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {
|
||
- var nativeMethod = window.RTCPeerConnection.prototype[method];
|
||
-
|
||
- var methodObj = _defineProperty({}, method, function () {
|
||
- arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);
|
||
- return nativeMethod.apply(this, arguments);
|
||
- });
|
||
-
|
||
- window.RTCPeerConnection.prototype[method] = methodObj[method];
|
||
- });
|
||
- }
|
||
-} // Attempt to fix ONN in plan-b mode.
|
||
-
|
||
-
|
||
-function fixNegotiationNeeded(window, browserDetails) {
|
||
- utils.wrapPeerConnectionEvent(window, 'negotiationneeded', function (e) {
|
||
- var pc = e.target;
|
||
-
|
||
- if (browserDetails.version < 72 || pc.getConfiguration && pc.getConfiguration().sdpSemantics === 'plan-b') {
|
||
- if (pc.signalingState !== 'stable') {
|
||
- return;
|
||
- }
|
||
- }
|
||
-
|
||
- return e;
|
||
- });
|
||
-}
|
||
-},{"../utils.js":"iSxC","./getusermedia":"s6SN","./getdisplaymedia":"VHa8"}],"NZ1C":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.filterIceServers = filterIceServers;
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils"));
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-// Edge does not like
|
||
-// 1) stun: filtered after 14393 unless ?transport=udp is present
|
||
-// 2) turn: that does not have all of turn:host:port?transport=udp
|
||
-// 3) turn: with ipv6 addresses
|
||
-// 4) turn: occurring muliple times
|
||
-function filterIceServers(iceServers, edgeVersion) {
|
||
- var hasTurn = false;
|
||
- iceServers = JSON.parse(JSON.stringify(iceServers));
|
||
- return iceServers.filter(function (server) {
|
||
- if (server && (server.urls || server.url)) {
|
||
- var urls = server.urls || server.url;
|
||
-
|
||
- if (server.url && !server.urls) {
|
||
- utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');
|
||
- }
|
||
-
|
||
- var isString = typeof urls === 'string';
|
||
-
|
||
- if (isString) {
|
||
- urls = [urls];
|
||
- }
|
||
-
|
||
- urls = urls.filter(function (url) {
|
||
- // filter STUN unconditionally.
|
||
- if (url.indexOf('stun:') === 0) {
|
||
- return false;
|
||
- }
|
||
-
|
||
- var validTurn = url.startsWith('turn') && !url.startsWith('turn:[') && url.includes('transport=udp');
|
||
-
|
||
- if (validTurn && !hasTurn) {
|
||
- hasTurn = true;
|
||
- return true;
|
||
- }
|
||
-
|
||
- return validTurn && !hasTurn;
|
||
- });
|
||
- delete server.url;
|
||
- server.urls = isString ? urls[0] : urls;
|
||
- return !!urls.length;
|
||
- }
|
||
- });
|
||
-}
|
||
-},{"../utils":"iSxC"}],"YHvh":[function(require,module,exports) {
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-// SDP helpers.
|
||
-var SDPUtils = {};
|
||
-
|
||
-// Generate an alphanumeric identifier for cname or mids.
|
||
-// TODO: use UUIDs instead? https://gist.github.com/jed/982883
|
||
-SDPUtils.generateIdentifier = function() {
|
||
- return Math.random().toString(36).substr(2, 10);
|
||
-};
|
||
-
|
||
-// The RTCP CNAME used by all peerconnections from the same JS.
|
||
-SDPUtils.localCName = SDPUtils.generateIdentifier();
|
||
-
|
||
-// Splits SDP into lines, dealing with both CRLF and LF.
|
||
-SDPUtils.splitLines = function(blob) {
|
||
- return blob.trim().split('\n').map(function(line) {
|
||
- return line.trim();
|
||
- });
|
||
-};
|
||
-// Splits SDP into sessionpart and mediasections. Ensures CRLF.
|
||
-SDPUtils.splitSections = function(blob) {
|
||
- var parts = blob.split('\nm=');
|
||
- return parts.map(function(part, index) {
|
||
- return (index > 0 ? 'm=' + part : part).trim() + '\r\n';
|
||
- });
|
||
-};
|
||
-
|
||
-// returns the session description.
|
||
-SDPUtils.getDescription = function(blob) {
|
||
- var sections = SDPUtils.splitSections(blob);
|
||
- return sections && sections[0];
|
||
-};
|
||
-
|
||
-// returns the individual media sections.
|
||
-SDPUtils.getMediaSections = function(blob) {
|
||
- var sections = SDPUtils.splitSections(blob);
|
||
- sections.shift();
|
||
- return sections;
|
||
-};
|
||
-
|
||
-// Returns lines that start with a certain prefix.
|
||
-SDPUtils.matchPrefix = function(blob, prefix) {
|
||
- return SDPUtils.splitLines(blob).filter(function(line) {
|
||
- return line.indexOf(prefix) === 0;
|
||
- });
|
||
-};
|
||
-
|
||
-// Parses an ICE candidate line. Sample input:
|
||
-// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8
|
||
-// rport 55996"
|
||
-SDPUtils.parseCandidate = function(line) {
|
||
- var parts;
|
||
- // Parse both variants.
|
||
- if (line.indexOf('a=candidate:') === 0) {
|
||
- parts = line.substring(12).split(' ');
|
||
- } else {
|
||
- parts = line.substring(10).split(' ');
|
||
- }
|
||
-
|
||
- var candidate = {
|
||
- foundation: parts[0],
|
||
- component: parseInt(parts[1], 10),
|
||
- protocol: parts[2].toLowerCase(),
|
||
- priority: parseInt(parts[3], 10),
|
||
- ip: parts[4],
|
||
- address: parts[4], // address is an alias for ip.
|
||
- port: parseInt(parts[5], 10),
|
||
- // skip parts[6] == 'typ'
|
||
- type: parts[7]
|
||
- };
|
||
-
|
||
- for (var i = 8; i < parts.length; i += 2) {
|
||
- switch (parts[i]) {
|
||
- case 'raddr':
|
||
- candidate.relatedAddress = parts[i + 1];
|
||
- break;
|
||
- case 'rport':
|
||
- candidate.relatedPort = parseInt(parts[i + 1], 10);
|
||
- break;
|
||
- case 'tcptype':
|
||
- candidate.tcpType = parts[i + 1];
|
||
- break;
|
||
- case 'ufrag':
|
||
- candidate.ufrag = parts[i + 1]; // for backward compability.
|
||
- candidate.usernameFragment = parts[i + 1];
|
||
- break;
|
||
- default: // extension handling, in particular ufrag
|
||
- candidate[parts[i]] = parts[i + 1];
|
||
- break;
|
||
- }
|
||
- }
|
||
- return candidate;
|
||
-};
|
||
-
|
||
-// Translates a candidate object into SDP candidate attribute.
|
||
-SDPUtils.writeCandidate = function(candidate) {
|
||
- var sdp = [];
|
||
- sdp.push(candidate.foundation);
|
||
- sdp.push(candidate.component);
|
||
- sdp.push(candidate.protocol.toUpperCase());
|
||
- sdp.push(candidate.priority);
|
||
- sdp.push(candidate.address || candidate.ip);
|
||
- sdp.push(candidate.port);
|
||
-
|
||
- var type = candidate.type;
|
||
- sdp.push('typ');
|
||
- sdp.push(type);
|
||
- if (type !== 'host' && candidate.relatedAddress &&
|
||
- candidate.relatedPort) {
|
||
- sdp.push('raddr');
|
||
- sdp.push(candidate.relatedAddress);
|
||
- sdp.push('rport');
|
||
- sdp.push(candidate.relatedPort);
|
||
- }
|
||
- if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') {
|
||
- sdp.push('tcptype');
|
||
- sdp.push(candidate.tcpType);
|
||
- }
|
||
- if (candidate.usernameFragment || candidate.ufrag) {
|
||
- sdp.push('ufrag');
|
||
- sdp.push(candidate.usernameFragment || candidate.ufrag);
|
||
- }
|
||
- return 'candidate:' + sdp.join(' ');
|
||
-};
|
||
-
|
||
-// Parses an ice-options line, returns an array of option tags.
|
||
-// a=ice-options:foo bar
|
||
-SDPUtils.parseIceOptions = function(line) {
|
||
- return line.substr(14).split(' ');
|
||
-};
|
||
-
|
||
-// Parses an rtpmap line, returns RTCRtpCoddecParameters. Sample input:
|
||
-// a=rtpmap:111 opus/48000/2
|
||
-SDPUtils.parseRtpMap = function(line) {
|
||
- var parts = line.substr(9).split(' ');
|
||
- var parsed = {
|
||
- payloadType: parseInt(parts.shift(), 10) // was: id
|
||
- };
|
||
-
|
||
- parts = parts[0].split('/');
|
||
-
|
||
- parsed.name = parts[0];
|
||
- parsed.clockRate = parseInt(parts[1], 10); // was: clockrate
|
||
- parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1;
|
||
- // legacy alias, got renamed back to channels in ORTC.
|
||
- parsed.numChannels = parsed.channels;
|
||
- return parsed;
|
||
-};
|
||
-
|
||
-// Generate an a=rtpmap line from RTCRtpCodecCapability or
|
||
-// RTCRtpCodecParameters.
|
||
-SDPUtils.writeRtpMap = function(codec) {
|
||
- var pt = codec.payloadType;
|
||
- if (codec.preferredPayloadType !== undefined) {
|
||
- pt = codec.preferredPayloadType;
|
||
- }
|
||
- var channels = codec.channels || codec.numChannels || 1;
|
||
- return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate +
|
||
- (channels !== 1 ? '/' + channels : '') + '\r\n';
|
||
-};
|
||
-
|
||
-// Parses an a=extmap line (headerextension from RFC 5285). Sample input:
|
||
-// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset
|
||
-// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset
|
||
-SDPUtils.parseExtmap = function(line) {
|
||
- var parts = line.substr(9).split(' ');
|
||
- return {
|
||
- id: parseInt(parts[0], 10),
|
||
- direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv',
|
||
- uri: parts[1]
|
||
- };
|
||
-};
|
||
-
|
||
-// Generates a=extmap line from RTCRtpHeaderExtensionParameters or
|
||
-// RTCRtpHeaderExtension.
|
||
-SDPUtils.writeExtmap = function(headerExtension) {
|
||
- return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) +
|
||
- (headerExtension.direction && headerExtension.direction !== 'sendrecv'
|
||
- ? '/' + headerExtension.direction
|
||
- : '') +
|
||
- ' ' + headerExtension.uri + '\r\n';
|
||
-};
|
||
-
|
||
-// Parses an ftmp line, returns dictionary. Sample input:
|
||
-// a=fmtp:96 vbr=on;cng=on
|
||
-// Also deals with vbr=on; cng=on
|
||
-SDPUtils.parseFmtp = function(line) {
|
||
- var parsed = {};
|
||
- var kv;
|
||
- var parts = line.substr(line.indexOf(' ') + 1).split(';');
|
||
- for (var j = 0; j < parts.length; j++) {
|
||
- kv = parts[j].trim().split('=');
|
||
- parsed[kv[0].trim()] = kv[1];
|
||
- }
|
||
- return parsed;
|
||
-};
|
||
-
|
||
-// Generates an a=ftmp line from RTCRtpCodecCapability or RTCRtpCodecParameters.
|
||
-SDPUtils.writeFmtp = function(codec) {
|
||
- var line = '';
|
||
- var pt = codec.payloadType;
|
||
- if (codec.preferredPayloadType !== undefined) {
|
||
- pt = codec.preferredPayloadType;
|
||
- }
|
||
- if (codec.parameters && Object.keys(codec.parameters).length) {
|
||
- var params = [];
|
||
- Object.keys(codec.parameters).forEach(function(param) {
|
||
- if (codec.parameters[param]) {
|
||
- params.push(param + '=' + codec.parameters[param]);
|
||
- } else {
|
||
- params.push(param);
|
||
- }
|
||
- });
|
||
- line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n';
|
||
- }
|
||
- return line;
|
||
-};
|
||
-
|
||
-// Parses an rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:
|
||
-// a=rtcp-fb:98 nack rpsi
|
||
-SDPUtils.parseRtcpFb = function(line) {
|
||
- var parts = line.substr(line.indexOf(' ') + 1).split(' ');
|
||
- return {
|
||
- type: parts.shift(),
|
||
- parameter: parts.join(' ')
|
||
- };
|
||
-};
|
||
-// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.
|
||
-SDPUtils.writeRtcpFb = function(codec) {
|
||
- var lines = '';
|
||
- var pt = codec.payloadType;
|
||
- if (codec.preferredPayloadType !== undefined) {
|
||
- pt = codec.preferredPayloadType;
|
||
- }
|
||
- if (codec.rtcpFeedback && codec.rtcpFeedback.length) {
|
||
- // FIXME: special handling for trr-int?
|
||
- codec.rtcpFeedback.forEach(function(fb) {
|
||
- lines += 'a=rtcp-fb:' + pt + ' ' + fb.type +
|
||
- (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') +
|
||
- '\r\n';
|
||
- });
|
||
- }
|
||
- return lines;
|
||
-};
|
||
-
|
||
-// Parses an RFC 5576 ssrc media attribute. Sample input:
|
||
-// a=ssrc:3735928559 cname:something
|
||
-SDPUtils.parseSsrcMedia = function(line) {
|
||
- var sp = line.indexOf(' ');
|
||
- var parts = {
|
||
- ssrc: parseInt(line.substr(7, sp - 7), 10)
|
||
- };
|
||
- var colon = line.indexOf(':', sp);
|
||
- if (colon > -1) {
|
||
- parts.attribute = line.substr(sp + 1, colon - sp - 1);
|
||
- parts.value = line.substr(colon + 1);
|
||
- } else {
|
||
- parts.attribute = line.substr(sp + 1);
|
||
- }
|
||
- return parts;
|
||
-};
|
||
-
|
||
-SDPUtils.parseSsrcGroup = function(line) {
|
||
- var parts = line.substr(13).split(' ');
|
||
- return {
|
||
- semantics: parts.shift(),
|
||
- ssrcs: parts.map(function(ssrc) {
|
||
- return parseInt(ssrc, 10);
|
||
- })
|
||
- };
|
||
-};
|
||
-
|
||
-// Extracts the MID (RFC 5888) from a media section.
|
||
-// returns the MID or undefined if no mid line was found.
|
||
-SDPUtils.getMid = function(mediaSection) {
|
||
- var mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];
|
||
- if (mid) {
|
||
- return mid.substr(6);
|
||
- }
|
||
-};
|
||
-
|
||
-SDPUtils.parseFingerprint = function(line) {
|
||
- var parts = line.substr(14).split(' ');
|
||
- return {
|
||
- algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.
|
||
- value: parts[1]
|
||
- };
|
||
-};
|
||
-
|
||
-// Extracts DTLS parameters from SDP media section or sessionpart.
|
||
-// FIXME: for consistency with other functions this should only
|
||
-// get the fingerprint line as input. See also getIceParameters.
|
||
-SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {
|
||
- var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,
|
||
- 'a=fingerprint:');
|
||
- // Note: a=setup line is ignored since we use the 'auto' role.
|
||
- // Note2: 'algorithm' is not case sensitive except in Edge.
|
||
- return {
|
||
- role: 'auto',
|
||
- fingerprints: lines.map(SDPUtils.parseFingerprint)
|
||
- };
|
||
-};
|
||
-
|
||
-// Serializes DTLS parameters to SDP.
|
||
-SDPUtils.writeDtlsParameters = function(params, setupType) {
|
||
- var sdp = 'a=setup:' + setupType + '\r\n';
|
||
- params.fingerprints.forEach(function(fp) {
|
||
- sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n';
|
||
- });
|
||
- return sdp;
|
||
-};
|
||
-
|
||
-// Parses a=crypto lines into
|
||
-// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members
|
||
-SDPUtils.parseCryptoLine = function(line) {
|
||
- var parts = line.substr(9).split(' ');
|
||
- return {
|
||
- tag: parseInt(parts[0], 10),
|
||
- cryptoSuite: parts[1],
|
||
- keyParams: parts[2],
|
||
- sessionParams: parts.slice(3),
|
||
- };
|
||
-};
|
||
-
|
||
-SDPUtils.writeCryptoLine = function(parameters) {
|
||
- return 'a=crypto:' + parameters.tag + ' ' +
|
||
- parameters.cryptoSuite + ' ' +
|
||
- (typeof parameters.keyParams === 'object'
|
||
- ? SDPUtils.writeCryptoKeyParams(parameters.keyParams)
|
||
- : parameters.keyParams) +
|
||
- (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') +
|
||
- '\r\n';
|
||
-};
|
||
-
|
||
-// Parses the crypto key parameters into
|
||
-// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*
|
||
-SDPUtils.parseCryptoKeyParams = function(keyParams) {
|
||
- if (keyParams.indexOf('inline:') !== 0) {
|
||
- return null;
|
||
- }
|
||
- var parts = keyParams.substr(7).split('|');
|
||
- return {
|
||
- keyMethod: 'inline',
|
||
- keySalt: parts[0],
|
||
- lifeTime: parts[1],
|
||
- mkiValue: parts[2] ? parts[2].split(':')[0] : undefined,
|
||
- mkiLength: parts[2] ? parts[2].split(':')[1] : undefined,
|
||
- };
|
||
-};
|
||
-
|
||
-SDPUtils.writeCryptoKeyParams = function(keyParams) {
|
||
- return keyParams.keyMethod + ':'
|
||
- + keyParams.keySalt +
|
||
- (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') +
|
||
- (keyParams.mkiValue && keyParams.mkiLength
|
||
- ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength
|
||
- : '');
|
||
-};
|
||
-
|
||
-// Extracts all SDES paramters.
|
||
-SDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {
|
||
- var lines = SDPUtils.matchPrefix(mediaSection + sessionpart,
|
||
- 'a=crypto:');
|
||
- return lines.map(SDPUtils.parseCryptoLine);
|
||
-};
|
||
-
|
||
-// Parses ICE information from SDP media section or sessionpart.
|
||
-// FIXME: for consistency with other functions this should only
|
||
-// get the ice-ufrag and ice-pwd lines as input.
|
||
-SDPUtils.getIceParameters = function(mediaSection, sessionpart) {
|
||
- var ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,
|
||
- 'a=ice-ufrag:')[0];
|
||
- var pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,
|
||
- 'a=ice-pwd:')[0];
|
||
- if (!(ufrag && pwd)) {
|
||
- return null;
|
||
- }
|
||
- return {
|
||
- usernameFragment: ufrag.substr(12),
|
||
- password: pwd.substr(10),
|
||
- };
|
||
-};
|
||
-
|
||
-// Serializes ICE parameters to SDP.
|
||
-SDPUtils.writeIceParameters = function(params) {
|
||
- return 'a=ice-ufrag:' + params.usernameFragment + '\r\n' +
|
||
- 'a=ice-pwd:' + params.password + '\r\n';
|
||
-};
|
||
-
|
||
-// Parses the SDP media section and returns RTCRtpParameters.
|
||
-SDPUtils.parseRtpParameters = function(mediaSection) {
|
||
- var description = {
|
||
- codecs: [],
|
||
- headerExtensions: [],
|
||
- fecMechanisms: [],
|
||
- rtcp: []
|
||
- };
|
||
- var lines = SDPUtils.splitLines(mediaSection);
|
||
- var mline = lines[0].split(' ');
|
||
- for (var i = 3; i < mline.length; i++) { // find all codecs from mline[3..]
|
||
- var pt = mline[i];
|
||
- var rtpmapline = SDPUtils.matchPrefix(
|
||
- mediaSection, 'a=rtpmap:' + pt + ' ')[0];
|
||
- if (rtpmapline) {
|
||
- var codec = SDPUtils.parseRtpMap(rtpmapline);
|
||
- var fmtps = SDPUtils.matchPrefix(
|
||
- mediaSection, 'a=fmtp:' + pt + ' ');
|
||
- // Only the first a=fmtp:<pt> is considered.
|
||
- codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};
|
||
- codec.rtcpFeedback = SDPUtils.matchPrefix(
|
||
- mediaSection, 'a=rtcp-fb:' + pt + ' ')
|
||
- .map(SDPUtils.parseRtcpFb);
|
||
- description.codecs.push(codec);
|
||
- // parse FEC mechanisms from rtpmap lines.
|
||
- switch (codec.name.toUpperCase()) {
|
||
- case 'RED':
|
||
- case 'ULPFEC':
|
||
- description.fecMechanisms.push(codec.name.toUpperCase());
|
||
- break;
|
||
- default: // only RED and ULPFEC are recognized as FEC mechanisms.
|
||
- break;
|
||
- }
|
||
- }
|
||
- }
|
||
- SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(function(line) {
|
||
- description.headerExtensions.push(SDPUtils.parseExtmap(line));
|
||
- });
|
||
- // FIXME: parse rtcp.
|
||
- return description;
|
||
-};
|
||
-
|
||
-// Generates parts of the SDP media section describing the capabilities /
|
||
-// parameters.
|
||
-SDPUtils.writeRtpDescription = function(kind, caps) {
|
||
- var sdp = '';
|
||
-
|
||
- // Build the mline.
|
||
- sdp += 'm=' + kind + ' ';
|
||
- sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.
|
||
- sdp += ' UDP/TLS/RTP/SAVPF ';
|
||
- sdp += caps.codecs.map(function(codec) {
|
||
- if (codec.preferredPayloadType !== undefined) {
|
||
- return codec.preferredPayloadType;
|
||
- }
|
||
- return codec.payloadType;
|
||
- }).join(' ') + '\r\n';
|
||
-
|
||
- sdp += 'c=IN IP4 0.0.0.0\r\n';
|
||
- sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n';
|
||
-
|
||
- // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.
|
||
- caps.codecs.forEach(function(codec) {
|
||
- sdp += SDPUtils.writeRtpMap(codec);
|
||
- sdp += SDPUtils.writeFmtp(codec);
|
||
- sdp += SDPUtils.writeRtcpFb(codec);
|
||
- });
|
||
- var maxptime = 0;
|
||
- caps.codecs.forEach(function(codec) {
|
||
- if (codec.maxptime > maxptime) {
|
||
- maxptime = codec.maxptime;
|
||
- }
|
||
- });
|
||
- if (maxptime > 0) {
|
||
- sdp += 'a=maxptime:' + maxptime + '\r\n';
|
||
- }
|
||
- sdp += 'a=rtcp-mux\r\n';
|
||
-
|
||
- if (caps.headerExtensions) {
|
||
- caps.headerExtensions.forEach(function(extension) {
|
||
- sdp += SDPUtils.writeExtmap(extension);
|
||
- });
|
||
- }
|
||
- // FIXME: write fecMechanisms.
|
||
- return sdp;
|
||
-};
|
||
-
|
||
-// Parses the SDP media section and returns an array of
|
||
-// RTCRtpEncodingParameters.
|
||
-SDPUtils.parseRtpEncodingParameters = function(mediaSection) {
|
||
- var encodingParameters = [];
|
||
- var description = SDPUtils.parseRtpParameters(mediaSection);
|
||
- var hasRed = description.fecMechanisms.indexOf('RED') !== -1;
|
||
- var hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;
|
||
-
|
||
- // filter a=ssrc:... cname:, ignore PlanB-msid
|
||
- var ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')
|
||
- .map(function(line) {
|
||
- return SDPUtils.parseSsrcMedia(line);
|
||
- })
|
||
- .filter(function(parts) {
|
||
- return parts.attribute === 'cname';
|
||
- });
|
||
- var primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;
|
||
- var secondarySsrc;
|
||
-
|
||
- var flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')
|
||
- .map(function(line) {
|
||
- var parts = line.substr(17).split(' ');
|
||
- return parts.map(function(part) {
|
||
- return parseInt(part, 10);
|
||
- });
|
||
- });
|
||
- if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) {
|
||
- secondarySsrc = flows[0][1];
|
||
- }
|
||
-
|
||
- description.codecs.forEach(function(codec) {
|
||
- if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {
|
||
- var encParam = {
|
||
- ssrc: primarySsrc,
|
||
- codecPayloadType: parseInt(codec.parameters.apt, 10)
|
||
- };
|
||
- if (primarySsrc && secondarySsrc) {
|
||
- encParam.rtx = {ssrc: secondarySsrc};
|
||
- }
|
||
- encodingParameters.push(encParam);
|
||
- if (hasRed) {
|
||
- encParam = JSON.parse(JSON.stringify(encParam));
|
||
- encParam.fec = {
|
||
- ssrc: primarySsrc,
|
||
- mechanism: hasUlpfec ? 'red+ulpfec' : 'red'
|
||
- };
|
||
- encodingParameters.push(encParam);
|
||
- }
|
||
- }
|
||
- });
|
||
- if (encodingParameters.length === 0 && primarySsrc) {
|
||
- encodingParameters.push({
|
||
- ssrc: primarySsrc
|
||
- });
|
||
- }
|
||
-
|
||
- // we support both b=AS and b=TIAS but interpret AS as TIAS.
|
||
- var bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');
|
||
- if (bandwidth.length) {
|
||
- if (bandwidth[0].indexOf('b=TIAS:') === 0) {
|
||
- bandwidth = parseInt(bandwidth[0].substr(7), 10);
|
||
- } else if (bandwidth[0].indexOf('b=AS:') === 0) {
|
||
- // use formula from JSEP to convert b=AS to TIAS value.
|
||
- bandwidth = parseInt(bandwidth[0].substr(5), 10) * 1000 * 0.95
|
||
- - (50 * 40 * 8);
|
||
- } else {
|
||
- bandwidth = undefined;
|
||
- }
|
||
- encodingParameters.forEach(function(params) {
|
||
- params.maxBitrate = bandwidth;
|
||
- });
|
||
- }
|
||
- return encodingParameters;
|
||
-};
|
||
-
|
||
-// parses http://draft.ortc.org/#rtcrtcpparameters*
|
||
-SDPUtils.parseRtcpParameters = function(mediaSection) {
|
||
- var rtcpParameters = {};
|
||
-
|
||
- // Gets the first SSRC. Note tha with RTX there might be multiple
|
||
- // SSRCs.
|
||
- var remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')
|
||
- .map(function(line) {
|
||
- return SDPUtils.parseSsrcMedia(line);
|
||
- })
|
||
- .filter(function(obj) {
|
||
- return obj.attribute === 'cname';
|
||
- })[0];
|
||
- if (remoteSsrc) {
|
||
- rtcpParameters.cname = remoteSsrc.value;
|
||
- rtcpParameters.ssrc = remoteSsrc.ssrc;
|
||
- }
|
||
-
|
||
- // Edge uses the compound attribute instead of reducedSize
|
||
- // compound is !reducedSize
|
||
- var rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');
|
||
- rtcpParameters.reducedSize = rsize.length > 0;
|
||
- rtcpParameters.compound = rsize.length === 0;
|
||
-
|
||
- // parses the rtcp-mux attrіbute.
|
||
- // Note that Edge does not support unmuxed RTCP.
|
||
- var mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');
|
||
- rtcpParameters.mux = mux.length > 0;
|
||
-
|
||
- return rtcpParameters;
|
||
-};
|
||
-
|
||
-// parses either a=msid: or a=ssrc:... msid lines and returns
|
||
-// the id of the MediaStream and MediaStreamTrack.
|
||
-SDPUtils.parseMsid = function(mediaSection) {
|
||
- var parts;
|
||
- var spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');
|
||
- if (spec.length === 1) {
|
||
- parts = spec[0].substr(7).split(' ');
|
||
- return {stream: parts[0], track: parts[1]};
|
||
- }
|
||
- var planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')
|
||
- .map(function(line) {
|
||
- return SDPUtils.parseSsrcMedia(line);
|
||
- })
|
||
- .filter(function(msidParts) {
|
||
- return msidParts.attribute === 'msid';
|
||
- });
|
||
- if (planB.length > 0) {
|
||
- parts = planB[0].value.split(' ');
|
||
- return {stream: parts[0], track: parts[1]};
|
||
- }
|
||
-};
|
||
-
|
||
-// SCTP
|
||
-// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back
|
||
-// to draft-ietf-mmusic-sctp-sdp-05
|
||
-SDPUtils.parseSctpDescription = function(mediaSection) {
|
||
- var mline = SDPUtils.parseMLine(mediaSection);
|
||
- var maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');
|
||
- var maxMessageSize;
|
||
- if (maxSizeLine.length > 0) {
|
||
- maxMessageSize = parseInt(maxSizeLine[0].substr(19), 10);
|
||
- }
|
||
- if (isNaN(maxMessageSize)) {
|
||
- maxMessageSize = 65536;
|
||
- }
|
||
- var sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');
|
||
- if (sctpPort.length > 0) {
|
||
- return {
|
||
- port: parseInt(sctpPort[0].substr(12), 10),
|
||
- protocol: mline.fmt,
|
||
- maxMessageSize: maxMessageSize
|
||
- };
|
||
- }
|
||
- var sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');
|
||
- if (sctpMapLines.length > 0) {
|
||
- var parts = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:')[0]
|
||
- .substr(10)
|
||
- .split(' ');
|
||
- return {
|
||
- port: parseInt(parts[0], 10),
|
||
- protocol: parts[1],
|
||
- maxMessageSize: maxMessageSize
|
||
- };
|
||
- }
|
||
-};
|
||
-
|
||
-// SCTP
|
||
-// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers
|
||
-// support by now receiving in this format, unless we originally parsed
|
||
-// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line
|
||
-// protocol of DTLS/SCTP -- without UDP/ or TCP/)
|
||
-SDPUtils.writeSctpDescription = function(media, sctp) {
|
||
- var output = [];
|
||
- if (media.protocol !== 'DTLS/SCTP') {
|
||
- output = [
|
||
- 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\r\n',
|
||
- 'c=IN IP4 0.0.0.0\r\n',
|
||
- 'a=sctp-port:' + sctp.port + '\r\n'
|
||
- ];
|
||
- } else {
|
||
- output = [
|
||
- 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\r\n',
|
||
- 'c=IN IP4 0.0.0.0\r\n',
|
||
- 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n'
|
||
- ];
|
||
- }
|
||
- if (sctp.maxMessageSize !== undefined) {
|
||
- output.push('a=max-message-size:' + sctp.maxMessageSize + '\r\n');
|
||
- }
|
||
- return output.join('');
|
||
-};
|
||
-
|
||
-// Generate a session ID for SDP.
|
||
-// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1
|
||
-// recommends using a cryptographically random +ve 64-bit value
|
||
-// but right now this should be acceptable and within the right range
|
||
-SDPUtils.generateSessionId = function() {
|
||
- return Math.random().toString().substr(2, 21);
|
||
-};
|
||
-
|
||
-// Write boilder plate for start of SDP
|
||
-// sessId argument is optional - if not supplied it will
|
||
-// be generated randomly
|
||
-// sessVersion is optional and defaults to 2
|
||
-// sessUser is optional and defaults to 'thisisadapterortc'
|
||
-SDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {
|
||
- var sessionId;
|
||
- var version = sessVer !== undefined ? sessVer : 2;
|
||
- if (sessId) {
|
||
- sessionId = sessId;
|
||
- } else {
|
||
- sessionId = SDPUtils.generateSessionId();
|
||
- }
|
||
- var user = sessUser || 'thisisadapterortc';
|
||
- // FIXME: sess-id should be an NTP timestamp.
|
||
- return 'v=0\r\n' +
|
||
- 'o=' + user + ' ' + sessionId + ' ' + version +
|
||
- ' IN IP4 127.0.0.1\r\n' +
|
||
- 's=-\r\n' +
|
||
- 't=0 0\r\n';
|
||
-};
|
||
-
|
||
-SDPUtils.writeMediaSection = function(transceiver, caps, type, stream) {
|
||
- var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps);
|
||
-
|
||
- // Map ICE parameters (ufrag, pwd) to SDP.
|
||
- sdp += SDPUtils.writeIceParameters(
|
||
- transceiver.iceGatherer.getLocalParameters());
|
||
-
|
||
- // Map DTLS parameters to SDP.
|
||
- sdp += SDPUtils.writeDtlsParameters(
|
||
- transceiver.dtlsTransport.getLocalParameters(),
|
||
- type === 'offer' ? 'actpass' : 'active');
|
||
-
|
||
- sdp += 'a=mid:' + transceiver.mid + '\r\n';
|
||
-
|
||
- if (transceiver.direction) {
|
||
- sdp += 'a=' + transceiver.direction + '\r\n';
|
||
- } else if (transceiver.rtpSender && transceiver.rtpReceiver) {
|
||
- sdp += 'a=sendrecv\r\n';
|
||
- } else if (transceiver.rtpSender) {
|
||
- sdp += 'a=sendonly\r\n';
|
||
- } else if (transceiver.rtpReceiver) {
|
||
- sdp += 'a=recvonly\r\n';
|
||
- } else {
|
||
- sdp += 'a=inactive\r\n';
|
||
- }
|
||
-
|
||
- if (transceiver.rtpSender) {
|
||
- // spec.
|
||
- var msid = 'msid:' + stream.id + ' ' +
|
||
- transceiver.rtpSender.track.id + '\r\n';
|
||
- sdp += 'a=' + msid;
|
||
-
|
||
- // for Chrome.
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +
|
||
- ' ' + msid;
|
||
- if (transceiver.sendEncodingParameters[0].rtx) {
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +
|
||
- ' ' + msid;
|
||
- sdp += 'a=ssrc-group:FID ' +
|
||
- transceiver.sendEncodingParameters[0].ssrc + ' ' +
|
||
- transceiver.sendEncodingParameters[0].rtx.ssrc +
|
||
- '\r\n';
|
||
- }
|
||
- }
|
||
- // FIXME: this should be written by writeRtpDescription.
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc +
|
||
- ' cname:' + SDPUtils.localCName + '\r\n';
|
||
- if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc +
|
||
- ' cname:' + SDPUtils.localCName + '\r\n';
|
||
- }
|
||
- return sdp;
|
||
-};
|
||
-
|
||
-// Gets the direction from the mediaSection or the sessionpart.
|
||
-SDPUtils.getDirection = function(mediaSection, sessionpart) {
|
||
- // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.
|
||
- var lines = SDPUtils.splitLines(mediaSection);
|
||
- for (var i = 0; i < lines.length; i++) {
|
||
- switch (lines[i]) {
|
||
- case 'a=sendrecv':
|
||
- case 'a=sendonly':
|
||
- case 'a=recvonly':
|
||
- case 'a=inactive':
|
||
- return lines[i].substr(2);
|
||
- default:
|
||
- // FIXME: What should happen here?
|
||
- }
|
||
- }
|
||
- if (sessionpart) {
|
||
- return SDPUtils.getDirection(sessionpart);
|
||
- }
|
||
- return 'sendrecv';
|
||
-};
|
||
-
|
||
-SDPUtils.getKind = function(mediaSection) {
|
||
- var lines = SDPUtils.splitLines(mediaSection);
|
||
- var mline = lines[0].split(' ');
|
||
- return mline[0].substr(2);
|
||
-};
|
||
-
|
||
-SDPUtils.isRejected = function(mediaSection) {
|
||
- return mediaSection.split(' ', 2)[1] === '0';
|
||
-};
|
||
-
|
||
-SDPUtils.parseMLine = function(mediaSection) {
|
||
- var lines = SDPUtils.splitLines(mediaSection);
|
||
- var parts = lines[0].substr(2).split(' ');
|
||
- return {
|
||
- kind: parts[0],
|
||
- port: parseInt(parts[1], 10),
|
||
- protocol: parts[2],
|
||
- fmt: parts.slice(3).join(' ')
|
||
- };
|
||
-};
|
||
-
|
||
-SDPUtils.parseOLine = function(mediaSection) {
|
||
- var line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];
|
||
- var parts = line.substr(2).split(' ');
|
||
- return {
|
||
- username: parts[0],
|
||
- sessionId: parts[1],
|
||
- sessionVersion: parseInt(parts[2], 10),
|
||
- netType: parts[3],
|
||
- addressType: parts[4],
|
||
- address: parts[5]
|
||
- };
|
||
-};
|
||
-
|
||
-// a very naive interpretation of a valid SDP.
|
||
-SDPUtils.isValidSDP = function(blob) {
|
||
- if (typeof blob !== 'string' || blob.length === 0) {
|
||
- return false;
|
||
- }
|
||
- var lines = SDPUtils.splitLines(blob);
|
||
- for (var i = 0; i < lines.length; i++) {
|
||
- if (lines[i].length < 2 || lines[i].charAt(1) !== '=') {
|
||
- return false;
|
||
- }
|
||
- // TODO: check the modifier a bit more.
|
||
- }
|
||
- return true;
|
||
-};
|
||
-
|
||
-// Expose public methods.
|
||
-if (typeof module === 'object') {
|
||
- module.exports = SDPUtils;
|
||
-}
|
||
-
|
||
-},{}],"NJ2u":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-var SDPUtils = require('sdp');
|
||
-
|
||
-function fixStatsType(stat) {
|
||
- return {
|
||
- inboundrtp: 'inbound-rtp',
|
||
- outboundrtp: 'outbound-rtp',
|
||
- candidatepair: 'candidate-pair',
|
||
- localcandidate: 'local-candidate',
|
||
- remotecandidate: 'remote-candidate'
|
||
- }[stat.type] || stat.type;
|
||
-}
|
||
-
|
||
-function writeMediaSection(transceiver, caps, type, stream, dtlsRole) {
|
||
- var sdp = SDPUtils.writeRtpDescription(transceiver.kind, caps); // Map ICE parameters (ufrag, pwd) to SDP.
|
||
-
|
||
- sdp += SDPUtils.writeIceParameters(transceiver.iceGatherer.getLocalParameters()); // Map DTLS parameters to SDP.
|
||
-
|
||
- sdp += SDPUtils.writeDtlsParameters(transceiver.dtlsTransport.getLocalParameters(), type === 'offer' ? 'actpass' : dtlsRole || 'active');
|
||
- sdp += 'a=mid:' + transceiver.mid + '\r\n';
|
||
-
|
||
- if (transceiver.rtpSender && transceiver.rtpReceiver) {
|
||
- sdp += 'a=sendrecv\r\n';
|
||
- } else if (transceiver.rtpSender) {
|
||
- sdp += 'a=sendonly\r\n';
|
||
- } else if (transceiver.rtpReceiver) {
|
||
- sdp += 'a=recvonly\r\n';
|
||
- } else {
|
||
- sdp += 'a=inactive\r\n';
|
||
- }
|
||
-
|
||
- if (transceiver.rtpSender) {
|
||
- var trackId = transceiver.rtpSender._initialTrackId || transceiver.rtpSender.track.id;
|
||
- transceiver.rtpSender._initialTrackId = trackId; // spec.
|
||
-
|
||
- var msid = 'msid:' + (stream ? stream.id : '-') + ' ' + trackId + '\r\n';
|
||
- sdp += 'a=' + msid; // for Chrome. Legacy should no longer be required.
|
||
-
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + ' ' + msid; // RTX
|
||
-
|
||
- if (transceiver.sendEncodingParameters[0].rtx) {
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + ' ' + msid;
|
||
- sdp += 'a=ssrc-group:FID ' + transceiver.sendEncodingParameters[0].ssrc + ' ' + transceiver.sendEncodingParameters[0].rtx.ssrc + '\r\n';
|
||
- }
|
||
- } // FIXME: this should be written by writeRtpDescription.
|
||
-
|
||
-
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].ssrc + ' cname:' + SDPUtils.localCName + '\r\n';
|
||
-
|
||
- if (transceiver.rtpSender && transceiver.sendEncodingParameters[0].rtx) {
|
||
- sdp += 'a=ssrc:' + transceiver.sendEncodingParameters[0].rtx.ssrc + ' cname:' + SDPUtils.localCName + '\r\n';
|
||
- }
|
||
-
|
||
- return sdp;
|
||
-} // Edge does not like
|
||
-// 1) stun: filtered after 14393 unless ?transport=udp is present
|
||
-// 2) turn: that does not have all of turn:host:port?transport=udp
|
||
-// 3) turn: with ipv6 addresses
|
||
-// 4) turn: occurring muliple times
|
||
-
|
||
-
|
||
-function filterIceServers(iceServers, edgeVersion) {
|
||
- var hasTurn = false;
|
||
- iceServers = JSON.parse(JSON.stringify(iceServers));
|
||
- return iceServers.filter(function (server) {
|
||
- if (server && (server.urls || server.url)) {
|
||
- var urls = server.urls || server.url;
|
||
-
|
||
- if (server.url && !server.urls) {
|
||
- console.warn('RTCIceServer.url is deprecated! Use urls instead.');
|
||
- }
|
||
-
|
||
- var isString = typeof urls === 'string';
|
||
-
|
||
- if (isString) {
|
||
- urls = [urls];
|
||
- }
|
||
-
|
||
- urls = urls.filter(function (url) {
|
||
- var validTurn = url.indexOf('turn:') === 0 && url.indexOf('transport=udp') !== -1 && url.indexOf('turn:[') === -1 && !hasTurn;
|
||
-
|
||
- if (validTurn) {
|
||
- hasTurn = true;
|
||
- return true;
|
||
- }
|
||
-
|
||
- return url.indexOf('stun:') === 0 && edgeVersion >= 14393 && url.indexOf('?transport=udp') === -1;
|
||
- });
|
||
- delete server.url;
|
||
- server.urls = isString ? urls[0] : urls;
|
||
- return !!urls.length;
|
||
- }
|
||
- });
|
||
-} // Determines the intersection of local and remote capabilities.
|
||
-
|
||
-
|
||
-function getCommonCapabilities(localCapabilities, remoteCapabilities) {
|
||
- var commonCapabilities = {
|
||
- codecs: [],
|
||
- headerExtensions: [],
|
||
- fecMechanisms: []
|
||
- };
|
||
-
|
||
- var findCodecByPayloadType = function (pt, codecs) {
|
||
- pt = parseInt(pt, 10);
|
||
-
|
||
- for (var i = 0; i < codecs.length; i++) {
|
||
- if (codecs[i].payloadType === pt || codecs[i].preferredPayloadType === pt) {
|
||
- return codecs[i];
|
||
- }
|
||
- }
|
||
- };
|
||
-
|
||
- var rtxCapabilityMatches = function (lRtx, rRtx, lCodecs, rCodecs) {
|
||
- var lCodec = findCodecByPayloadType(lRtx.parameters.apt, lCodecs);
|
||
- var rCodec = findCodecByPayloadType(rRtx.parameters.apt, rCodecs);
|
||
- return lCodec && rCodec && lCodec.name.toLowerCase() === rCodec.name.toLowerCase();
|
||
- };
|
||
-
|
||
- localCapabilities.codecs.forEach(function (lCodec) {
|
||
- for (var i = 0; i < remoteCapabilities.codecs.length; i++) {
|
||
- var rCodec = remoteCapabilities.codecs[i];
|
||
-
|
||
- if (lCodec.name.toLowerCase() === rCodec.name.toLowerCase() && lCodec.clockRate === rCodec.clockRate) {
|
||
- if (lCodec.name.toLowerCase() === 'rtx' && lCodec.parameters && rCodec.parameters.apt) {
|
||
- // for RTX we need to find the local rtx that has a apt
|
||
- // which points to the same local codec as the remote one.
|
||
- if (!rtxCapabilityMatches(lCodec, rCodec, localCapabilities.codecs, remoteCapabilities.codecs)) {
|
||
- continue;
|
||
- }
|
||
- }
|
||
-
|
||
- rCodec = JSON.parse(JSON.stringify(rCodec)); // deepcopy
|
||
- // number of channels is the highest common number of channels
|
||
-
|
||
- rCodec.numChannels = Math.min(lCodec.numChannels, rCodec.numChannels); // push rCodec so we reply with offerer payload type
|
||
-
|
||
- commonCapabilities.codecs.push(rCodec); // determine common feedback mechanisms
|
||
-
|
||
- rCodec.rtcpFeedback = rCodec.rtcpFeedback.filter(function (fb) {
|
||
- for (var j = 0; j < lCodec.rtcpFeedback.length; j++) {
|
||
- if (lCodec.rtcpFeedback[j].type === fb.type && lCodec.rtcpFeedback[j].parameter === fb.parameter) {
|
||
- return true;
|
||
- }
|
||
- }
|
||
-
|
||
- return false;
|
||
- }); // FIXME: also need to determine .parameters
|
||
- // see https://github.com/openpeer/ortc/issues/569
|
||
-
|
||
- break;
|
||
- }
|
||
- }
|
||
- });
|
||
- localCapabilities.headerExtensions.forEach(function (lHeaderExtension) {
|
||
- for (var i = 0; i < remoteCapabilities.headerExtensions.length; i++) {
|
||
- var rHeaderExtension = remoteCapabilities.headerExtensions[i];
|
||
-
|
||
- if (lHeaderExtension.uri === rHeaderExtension.uri) {
|
||
- commonCapabilities.headerExtensions.push(rHeaderExtension);
|
||
- break;
|
||
- }
|
||
- }
|
||
- }); // FIXME: fecMechanisms
|
||
-
|
||
- return commonCapabilities;
|
||
-} // is action=setLocalDescription with type allowed in signalingState
|
||
-
|
||
-
|
||
-function isActionAllowedInSignalingState(action, type, signalingState) {
|
||
- return {
|
||
- offer: {
|
||
- setLocalDescription: ['stable', 'have-local-offer'],
|
||
- setRemoteDescription: ['stable', 'have-remote-offer']
|
||
- },
|
||
- answer: {
|
||
- setLocalDescription: ['have-remote-offer', 'have-local-pranswer'],
|
||
- setRemoteDescription: ['have-local-offer', 'have-remote-pranswer']
|
||
- }
|
||
- }[type][action].indexOf(signalingState) !== -1;
|
||
-}
|
||
-
|
||
-function maybeAddCandidate(iceTransport, candidate) {
|
||
- // Edge's internal representation adds some fields therefore
|
||
- // not all fieldѕ are taken into account.
|
||
- var alreadyAdded = iceTransport.getRemoteCandidates().find(function (remoteCandidate) {
|
||
- return candidate.foundation === remoteCandidate.foundation && candidate.ip === remoteCandidate.ip && candidate.port === remoteCandidate.port && candidate.priority === remoteCandidate.priority && candidate.protocol === remoteCandidate.protocol && candidate.type === remoteCandidate.type;
|
||
- });
|
||
-
|
||
- if (!alreadyAdded) {
|
||
- iceTransport.addRemoteCandidate(candidate);
|
||
- }
|
||
-
|
||
- return !alreadyAdded;
|
||
-}
|
||
-
|
||
-function makeError(name, description) {
|
||
- var e = new Error(description);
|
||
- e.name = name; // legacy error codes from https://heycam.github.io/webidl/#idl-DOMException-error-names
|
||
-
|
||
- e.code = {
|
||
- NotSupportedError: 9,
|
||
- InvalidStateError: 11,
|
||
- InvalidAccessError: 15,
|
||
- TypeError: undefined,
|
||
- OperationError: undefined
|
||
- }[name];
|
||
- return e;
|
||
-}
|
||
-
|
||
-module.exports = function (window, edgeVersion) {
|
||
- // https://w3c.github.io/mediacapture-main/#mediastream
|
||
- // Helper function to add the track to the stream and
|
||
- // dispatch the event ourselves.
|
||
- function addTrackToStreamAndFireEvent(track, stream) {
|
||
- stream.addTrack(track);
|
||
- stream.dispatchEvent(new window.MediaStreamTrackEvent('addtrack', {
|
||
- track: track
|
||
- }));
|
||
- }
|
||
-
|
||
- function removeTrackFromStreamAndFireEvent(track, stream) {
|
||
- stream.removeTrack(track);
|
||
- stream.dispatchEvent(new window.MediaStreamTrackEvent('removetrack', {
|
||
- track: track
|
||
- }));
|
||
- }
|
||
-
|
||
- function fireAddTrack(pc, track, receiver, streams) {
|
||
- var trackEvent = new Event('track');
|
||
- trackEvent.track = track;
|
||
- trackEvent.receiver = receiver;
|
||
- trackEvent.transceiver = {
|
||
- receiver: receiver
|
||
- };
|
||
- trackEvent.streams = streams;
|
||
- window.setTimeout(function () {
|
||
- pc._dispatchEvent('track', trackEvent);
|
||
- });
|
||
- }
|
||
-
|
||
- var RTCPeerConnection = function (config) {
|
||
- var pc = this;
|
||
-
|
||
- var _eventTarget = document.createDocumentFragment();
|
||
-
|
||
- ['addEventListener', 'removeEventListener', 'dispatchEvent'].forEach(function (method) {
|
||
- pc[method] = _eventTarget[method].bind(_eventTarget);
|
||
- });
|
||
- this.canTrickleIceCandidates = null;
|
||
- this.needNegotiation = false;
|
||
- this.localStreams = [];
|
||
- this.remoteStreams = [];
|
||
- this._localDescription = null;
|
||
- this._remoteDescription = null;
|
||
- this.signalingState = 'stable';
|
||
- this.iceConnectionState = 'new';
|
||
- this.connectionState = 'new';
|
||
- this.iceGatheringState = 'new';
|
||
- config = JSON.parse(JSON.stringify(config || {}));
|
||
- this.usingBundle = config.bundlePolicy === 'max-bundle';
|
||
-
|
||
- if (config.rtcpMuxPolicy === 'negotiate') {
|
||
- throw makeError('NotSupportedError', 'rtcpMuxPolicy \'negotiate\' is not supported');
|
||
- } else if (!config.rtcpMuxPolicy) {
|
||
- config.rtcpMuxPolicy = 'require';
|
||
- }
|
||
-
|
||
- switch (config.iceTransportPolicy) {
|
||
- case 'all':
|
||
- case 'relay':
|
||
- break;
|
||
-
|
||
- default:
|
||
- config.iceTransportPolicy = 'all';
|
||
- break;
|
||
- }
|
||
-
|
||
- switch (config.bundlePolicy) {
|
||
- case 'balanced':
|
||
- case 'max-compat':
|
||
- case 'max-bundle':
|
||
- break;
|
||
-
|
||
- default:
|
||
- config.bundlePolicy = 'balanced';
|
||
- break;
|
||
- }
|
||
-
|
||
- config.iceServers = filterIceServers(config.iceServers || [], edgeVersion);
|
||
- this._iceGatherers = [];
|
||
-
|
||
- if (config.iceCandidatePoolSize) {
|
||
- for (var i = config.iceCandidatePoolSize; i > 0; i--) {
|
||
- this._iceGatherers.push(new window.RTCIceGatherer({
|
||
- iceServers: config.iceServers,
|
||
- gatherPolicy: config.iceTransportPolicy
|
||
- }));
|
||
- }
|
||
- } else {
|
||
- config.iceCandidatePoolSize = 0;
|
||
- }
|
||
-
|
||
- this._config = config; // per-track iceGathers, iceTransports, dtlsTransports, rtpSenders, ...
|
||
- // everything that is needed to describe a SDP m-line.
|
||
-
|
||
- this.transceivers = [];
|
||
- this._sdpSessionId = SDPUtils.generateSessionId();
|
||
- this._sdpSessionVersion = 0;
|
||
- this._dtlsRole = undefined; // role for a=setup to use in answers.
|
||
-
|
||
- this._isClosed = false;
|
||
- };
|
||
-
|
||
- Object.defineProperty(RTCPeerConnection.prototype, 'localDescription', {
|
||
- configurable: true,
|
||
- get: function () {
|
||
- return this._localDescription;
|
||
- }
|
||
- });
|
||
- Object.defineProperty(RTCPeerConnection.prototype, 'remoteDescription', {
|
||
- configurable: true,
|
||
- get: function () {
|
||
- return this._remoteDescription;
|
||
- }
|
||
- }); // set up event handlers on prototype
|
||
-
|
||
- RTCPeerConnection.prototype.onicecandidate = null;
|
||
- RTCPeerConnection.prototype.onaddstream = null;
|
||
- RTCPeerConnection.prototype.ontrack = null;
|
||
- RTCPeerConnection.prototype.onremovestream = null;
|
||
- RTCPeerConnection.prototype.onsignalingstatechange = null;
|
||
- RTCPeerConnection.prototype.oniceconnectionstatechange = null;
|
||
- RTCPeerConnection.prototype.onconnectionstatechange = null;
|
||
- RTCPeerConnection.prototype.onicegatheringstatechange = null;
|
||
- RTCPeerConnection.prototype.onnegotiationneeded = null;
|
||
- RTCPeerConnection.prototype.ondatachannel = null;
|
||
-
|
||
- RTCPeerConnection.prototype._dispatchEvent = function (name, event) {
|
||
- if (this._isClosed) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this.dispatchEvent(event);
|
||
-
|
||
- if (typeof this['on' + name] === 'function') {
|
||
- this['on' + name](event);
|
||
- }
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype._emitGatheringStateChange = function () {
|
||
- var event = new Event('icegatheringstatechange');
|
||
-
|
||
- this._dispatchEvent('icegatheringstatechange', event);
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.getConfiguration = function () {
|
||
- return this._config;
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.getLocalStreams = function () {
|
||
- return this.localStreams;
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.getRemoteStreams = function () {
|
||
- return this.remoteStreams;
|
||
- }; // internal helper to create a transceiver object.
|
||
- // (which is not yet the same as the WebRTC 1.0 transceiver)
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._createTransceiver = function (kind, doNotAdd) {
|
||
- var hasBundleTransport = this.transceivers.length > 0;
|
||
- var transceiver = {
|
||
- track: null,
|
||
- iceGatherer: null,
|
||
- iceTransport: null,
|
||
- dtlsTransport: null,
|
||
- localCapabilities: null,
|
||
- remoteCapabilities: null,
|
||
- rtpSender: null,
|
||
- rtpReceiver: null,
|
||
- kind: kind,
|
||
- mid: null,
|
||
- sendEncodingParameters: null,
|
||
- recvEncodingParameters: null,
|
||
- stream: null,
|
||
- associatedRemoteMediaStreams: [],
|
||
- wantReceive: true
|
||
- };
|
||
-
|
||
- if (this.usingBundle && hasBundleTransport) {
|
||
- transceiver.iceTransport = this.transceivers[0].iceTransport;
|
||
- transceiver.dtlsTransport = this.transceivers[0].dtlsTransport;
|
||
- } else {
|
||
- var transports = this._createIceAndDtlsTransports();
|
||
-
|
||
- transceiver.iceTransport = transports.iceTransport;
|
||
- transceiver.dtlsTransport = transports.dtlsTransport;
|
||
- }
|
||
-
|
||
- if (!doNotAdd) {
|
||
- this.transceivers.push(transceiver);
|
||
- }
|
||
-
|
||
- return transceiver;
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.addTrack = function (track, stream) {
|
||
- if (this._isClosed) {
|
||
- throw makeError('InvalidStateError', 'Attempted to call addTrack on a closed peerconnection.');
|
||
- }
|
||
-
|
||
- var alreadyExists = this.transceivers.find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
-
|
||
- if (alreadyExists) {
|
||
- throw makeError('InvalidAccessError', 'Track already exists.');
|
||
- }
|
||
-
|
||
- var transceiver;
|
||
-
|
||
- for (var i = 0; i < this.transceivers.length; i++) {
|
||
- if (!this.transceivers[i].track && this.transceivers[i].kind === track.kind) {
|
||
- transceiver = this.transceivers[i];
|
||
- }
|
||
- }
|
||
-
|
||
- if (!transceiver) {
|
||
- transceiver = this._createTransceiver(track.kind);
|
||
- }
|
||
-
|
||
- this._maybeFireNegotiationNeeded();
|
||
-
|
||
- if (this.localStreams.indexOf(stream) === -1) {
|
||
- this.localStreams.push(stream);
|
||
- }
|
||
-
|
||
- transceiver.track = track;
|
||
- transceiver.stream = stream;
|
||
- transceiver.rtpSender = new window.RTCRtpSender(track, transceiver.dtlsTransport);
|
||
- return transceiver.rtpSender;
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.addStream = function (stream) {
|
||
- var pc = this;
|
||
-
|
||
- if (edgeVersion >= 15025) {
|
||
- stream.getTracks().forEach(function (track) {
|
||
- pc.addTrack(track, stream);
|
||
- });
|
||
- } else {
|
||
- // Clone is necessary for local demos mostly, attaching directly
|
||
- // to two different senders does not work (build 10547).
|
||
- // Fixed in 15025 (or earlier)
|
||
- var clonedStream = stream.clone();
|
||
- stream.getTracks().forEach(function (track, idx) {
|
||
- var clonedTrack = clonedStream.getTracks()[idx];
|
||
- track.addEventListener('enabled', function (event) {
|
||
- clonedTrack.enabled = event.enabled;
|
||
- });
|
||
- });
|
||
- clonedStream.getTracks().forEach(function (track) {
|
||
- pc.addTrack(track, clonedStream);
|
||
- });
|
||
- }
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.removeTrack = function (sender) {
|
||
- if (this._isClosed) {
|
||
- throw makeError('InvalidStateError', 'Attempted to call removeTrack on a closed peerconnection.');
|
||
- }
|
||
-
|
||
- if (!(sender instanceof window.RTCRtpSender)) {
|
||
- throw new TypeError('Argument 1 of RTCPeerConnection.removeTrack ' + 'does not implement interface RTCRtpSender.');
|
||
- }
|
||
-
|
||
- var transceiver = this.transceivers.find(function (t) {
|
||
- return t.rtpSender === sender;
|
||
- });
|
||
-
|
||
- if (!transceiver) {
|
||
- throw makeError('InvalidAccessError', 'Sender was not created by this connection.');
|
||
- }
|
||
-
|
||
- var stream = transceiver.stream;
|
||
- transceiver.rtpSender.stop();
|
||
- transceiver.rtpSender = null;
|
||
- transceiver.track = null;
|
||
- transceiver.stream = null; // remove the stream from the set of local streams
|
||
-
|
||
- var localStreams = this.transceivers.map(function (t) {
|
||
- return t.stream;
|
||
- });
|
||
-
|
||
- if (localStreams.indexOf(stream) === -1 && this.localStreams.indexOf(stream) > -1) {
|
||
- this.localStreams.splice(this.localStreams.indexOf(stream), 1);
|
||
- }
|
||
-
|
||
- this._maybeFireNegotiationNeeded();
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.removeStream = function (stream) {
|
||
- var pc = this;
|
||
- stream.getTracks().forEach(function (track) {
|
||
- var sender = pc.getSenders().find(function (s) {
|
||
- return s.track === track;
|
||
- });
|
||
-
|
||
- if (sender) {
|
||
- pc.removeTrack(sender);
|
||
- }
|
||
- });
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.getSenders = function () {
|
||
- return this.transceivers.filter(function (transceiver) {
|
||
- return !!transceiver.rtpSender;
|
||
- }).map(function (transceiver) {
|
||
- return transceiver.rtpSender;
|
||
- });
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.getReceivers = function () {
|
||
- return this.transceivers.filter(function (transceiver) {
|
||
- return !!transceiver.rtpReceiver;
|
||
- }).map(function (transceiver) {
|
||
- return transceiver.rtpReceiver;
|
||
- });
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype._createIceGatherer = function (sdpMLineIndex, usingBundle) {
|
||
- var pc = this;
|
||
-
|
||
- if (usingBundle && sdpMLineIndex > 0) {
|
||
- return this.transceivers[0].iceGatherer;
|
||
- } else if (this._iceGatherers.length) {
|
||
- return this._iceGatherers.shift();
|
||
- }
|
||
-
|
||
- var iceGatherer = new window.RTCIceGatherer({
|
||
- iceServers: this._config.iceServers,
|
||
- gatherPolicy: this._config.iceTransportPolicy
|
||
- });
|
||
- Object.defineProperty(iceGatherer, 'state', {
|
||
- value: 'new',
|
||
- writable: true
|
||
- });
|
||
- this.transceivers[sdpMLineIndex].bufferedCandidateEvents = [];
|
||
-
|
||
- this.transceivers[sdpMLineIndex].bufferCandidates = function (event) {
|
||
- var end = !event.candidate || Object.keys(event.candidate).length === 0; // polyfill since RTCIceGatherer.state is not implemented in
|
||
- // Edge 10547 yet.
|
||
-
|
||
- iceGatherer.state = end ? 'completed' : 'gathering';
|
||
-
|
||
- if (pc.transceivers[sdpMLineIndex].bufferedCandidateEvents !== null) {
|
||
- pc.transceivers[sdpMLineIndex].bufferedCandidateEvents.push(event);
|
||
- }
|
||
- };
|
||
-
|
||
- iceGatherer.addEventListener('localcandidate', this.transceivers[sdpMLineIndex].bufferCandidates);
|
||
- return iceGatherer;
|
||
- }; // start gathering from an RTCIceGatherer.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._gather = function (mid, sdpMLineIndex) {
|
||
- var pc = this;
|
||
- var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;
|
||
-
|
||
- if (iceGatherer.onlocalcandidate) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var bufferedCandidateEvents = this.transceivers[sdpMLineIndex].bufferedCandidateEvents;
|
||
- this.transceivers[sdpMLineIndex].bufferedCandidateEvents = null;
|
||
- iceGatherer.removeEventListener('localcandidate', this.transceivers[sdpMLineIndex].bufferCandidates);
|
||
-
|
||
- iceGatherer.onlocalcandidate = function (evt) {
|
||
- if (pc.usingBundle && sdpMLineIndex > 0) {
|
||
- // if we know that we use bundle we can drop candidates with
|
||
- // ѕdpMLineIndex > 0. If we don't do this then our state gets
|
||
- // confused since we dispose the extra ice gatherer.
|
||
- return;
|
||
- }
|
||
-
|
||
- var event = new Event('icecandidate');
|
||
- event.candidate = {
|
||
- sdpMid: mid,
|
||
- sdpMLineIndex: sdpMLineIndex
|
||
- };
|
||
- var cand = evt.candidate; // Edge emits an empty object for RTCIceCandidateComplete‥
|
||
-
|
||
- var end = !cand || Object.keys(cand).length === 0;
|
||
-
|
||
- if (end) {
|
||
- // polyfill since RTCIceGatherer.state is not implemented in
|
||
- // Edge 10547 yet.
|
||
- if (iceGatherer.state === 'new' || iceGatherer.state === 'gathering') {
|
||
- iceGatherer.state = 'completed';
|
||
- }
|
||
- } else {
|
||
- if (iceGatherer.state === 'new') {
|
||
- iceGatherer.state = 'gathering';
|
||
- } // RTCIceCandidate doesn't have a component, needs to be added
|
||
-
|
||
-
|
||
- cand.component = 1; // also the usernameFragment. TODO: update SDP to take both variants.
|
||
-
|
||
- cand.ufrag = iceGatherer.getLocalParameters().usernameFragment;
|
||
- var serializedCandidate = SDPUtils.writeCandidate(cand);
|
||
- event.candidate = Object.assign(event.candidate, SDPUtils.parseCandidate(serializedCandidate));
|
||
- event.candidate.candidate = serializedCandidate;
|
||
-
|
||
- event.candidate.toJSON = function () {
|
||
- return {
|
||
- candidate: event.candidate.candidate,
|
||
- sdpMid: event.candidate.sdpMid,
|
||
- sdpMLineIndex: event.candidate.sdpMLineIndex,
|
||
- usernameFragment: event.candidate.usernameFragment
|
||
- };
|
||
- };
|
||
- } // update local description.
|
||
-
|
||
-
|
||
- var sections = SDPUtils.getMediaSections(pc._localDescription.sdp);
|
||
-
|
||
- if (!end) {
|
||
- sections[event.candidate.sdpMLineIndex] += 'a=' + event.candidate.candidate + '\r\n';
|
||
- } else {
|
||
- sections[event.candidate.sdpMLineIndex] += 'a=end-of-candidates\r\n';
|
||
- }
|
||
-
|
||
- pc._localDescription.sdp = SDPUtils.getDescription(pc._localDescription.sdp) + sections.join('');
|
||
- var complete = pc.transceivers.every(function (transceiver) {
|
||
- return transceiver.iceGatherer && transceiver.iceGatherer.state === 'completed';
|
||
- });
|
||
-
|
||
- if (pc.iceGatheringState !== 'gathering') {
|
||
- pc.iceGatheringState = 'gathering';
|
||
-
|
||
- pc._emitGatheringStateChange();
|
||
- } // Emit candidate. Also emit null candidate when all gatherers are
|
||
- // complete.
|
||
-
|
||
-
|
||
- if (!end) {
|
||
- pc._dispatchEvent('icecandidate', event);
|
||
- }
|
||
-
|
||
- if (complete) {
|
||
- pc._dispatchEvent('icecandidate', new Event('icecandidate'));
|
||
-
|
||
- pc.iceGatheringState = 'complete';
|
||
-
|
||
- pc._emitGatheringStateChange();
|
||
- }
|
||
- }; // emit already gathered candidates.
|
||
-
|
||
-
|
||
- window.setTimeout(function () {
|
||
- bufferedCandidateEvents.forEach(function (e) {
|
||
- iceGatherer.onlocalcandidate(e);
|
||
- });
|
||
- }, 0);
|
||
- }; // Create ICE transport and DTLS transport.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._createIceAndDtlsTransports = function () {
|
||
- var pc = this;
|
||
- var iceTransport = new window.RTCIceTransport(null);
|
||
-
|
||
- iceTransport.onicestatechange = function () {
|
||
- pc._updateIceConnectionState();
|
||
-
|
||
- pc._updateConnectionState();
|
||
- };
|
||
-
|
||
- var dtlsTransport = new window.RTCDtlsTransport(iceTransport);
|
||
-
|
||
- dtlsTransport.ondtlsstatechange = function () {
|
||
- pc._updateConnectionState();
|
||
- };
|
||
-
|
||
- dtlsTransport.onerror = function () {
|
||
- // onerror does not set state to failed by itself.
|
||
- Object.defineProperty(dtlsTransport, 'state', {
|
||
- value: 'failed',
|
||
- writable: true
|
||
- });
|
||
-
|
||
- pc._updateConnectionState();
|
||
- };
|
||
-
|
||
- return {
|
||
- iceTransport: iceTransport,
|
||
- dtlsTransport: dtlsTransport
|
||
- };
|
||
- }; // Destroy ICE gatherer, ICE transport and DTLS transport.
|
||
- // Without triggering the callbacks.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._disposeIceAndDtlsTransports = function (sdpMLineIndex) {
|
||
- var iceGatherer = this.transceivers[sdpMLineIndex].iceGatherer;
|
||
-
|
||
- if (iceGatherer) {
|
||
- delete iceGatherer.onlocalcandidate;
|
||
- delete this.transceivers[sdpMLineIndex].iceGatherer;
|
||
- }
|
||
-
|
||
- var iceTransport = this.transceivers[sdpMLineIndex].iceTransport;
|
||
-
|
||
- if (iceTransport) {
|
||
- delete iceTransport.onicestatechange;
|
||
- delete this.transceivers[sdpMLineIndex].iceTransport;
|
||
- }
|
||
-
|
||
- var dtlsTransport = this.transceivers[sdpMLineIndex].dtlsTransport;
|
||
-
|
||
- if (dtlsTransport) {
|
||
- delete dtlsTransport.ondtlsstatechange;
|
||
- delete dtlsTransport.onerror;
|
||
- delete this.transceivers[sdpMLineIndex].dtlsTransport;
|
||
- }
|
||
- }; // Start the RTP Sender and Receiver for a transceiver.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._transceive = function (transceiver, send, recv) {
|
||
- var params = getCommonCapabilities(transceiver.localCapabilities, transceiver.remoteCapabilities);
|
||
-
|
||
- if (send && transceiver.rtpSender) {
|
||
- params.encodings = transceiver.sendEncodingParameters;
|
||
- params.rtcp = {
|
||
- cname: SDPUtils.localCName,
|
||
- compound: transceiver.rtcpParameters.compound
|
||
- };
|
||
-
|
||
- if (transceiver.recvEncodingParameters.length) {
|
||
- params.rtcp.ssrc = transceiver.recvEncodingParameters[0].ssrc;
|
||
- }
|
||
-
|
||
- transceiver.rtpSender.send(params);
|
||
- }
|
||
-
|
||
- if (recv && transceiver.rtpReceiver && params.codecs.length > 0) {
|
||
- // remove RTX field in Edge 14942
|
||
- if (transceiver.kind === 'video' && transceiver.recvEncodingParameters && edgeVersion < 15019) {
|
||
- transceiver.recvEncodingParameters.forEach(function (p) {
|
||
- delete p.rtx;
|
||
- });
|
||
- }
|
||
-
|
||
- if (transceiver.recvEncodingParameters.length) {
|
||
- params.encodings = transceiver.recvEncodingParameters;
|
||
- } else {
|
||
- params.encodings = [{}];
|
||
- }
|
||
-
|
||
- params.rtcp = {
|
||
- compound: transceiver.rtcpParameters.compound
|
||
- };
|
||
-
|
||
- if (transceiver.rtcpParameters.cname) {
|
||
- params.rtcp.cname = transceiver.rtcpParameters.cname;
|
||
- }
|
||
-
|
||
- if (transceiver.sendEncodingParameters.length) {
|
||
- params.rtcp.ssrc = transceiver.sendEncodingParameters[0].ssrc;
|
||
- }
|
||
-
|
||
- transceiver.rtpReceiver.receive(params);
|
||
- }
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.setLocalDescription = function (description) {
|
||
- var pc = this; // Note: pranswer is not supported.
|
||
-
|
||
- if (['offer', 'answer'].indexOf(description.type) === -1) {
|
||
- return Promise.reject(makeError('TypeError', 'Unsupported type "' + description.type + '"'));
|
||
- }
|
||
-
|
||
- if (!isActionAllowedInSignalingState('setLocalDescription', description.type, pc.signalingState) || pc._isClosed) {
|
||
- return Promise.reject(makeError('InvalidStateError', 'Can not set local ' + description.type + ' in state ' + pc.signalingState));
|
||
- }
|
||
-
|
||
- var sections;
|
||
- var sessionpart;
|
||
-
|
||
- if (description.type === 'offer') {
|
||
- // VERY limited support for SDP munging. Limited to:
|
||
- // * changing the order of codecs
|
||
- sections = SDPUtils.splitSections(description.sdp);
|
||
- sessionpart = sections.shift();
|
||
- sections.forEach(function (mediaSection, sdpMLineIndex) {
|
||
- var caps = SDPUtils.parseRtpParameters(mediaSection);
|
||
- pc.transceivers[sdpMLineIndex].localCapabilities = caps;
|
||
- });
|
||
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
|
||
- pc._gather(transceiver.mid, sdpMLineIndex);
|
||
- });
|
||
- } else if (description.type === 'answer') {
|
||
- sections = SDPUtils.splitSections(pc._remoteDescription.sdp);
|
||
- sessionpart = sections.shift();
|
||
- var isIceLite = SDPUtils.matchPrefix(sessionpart, 'a=ice-lite').length > 0;
|
||
- sections.forEach(function (mediaSection, sdpMLineIndex) {
|
||
- var transceiver = pc.transceivers[sdpMLineIndex];
|
||
- var iceGatherer = transceiver.iceGatherer;
|
||
- var iceTransport = transceiver.iceTransport;
|
||
- var dtlsTransport = transceiver.dtlsTransport;
|
||
- var localCapabilities = transceiver.localCapabilities;
|
||
- var remoteCapabilities = transceiver.remoteCapabilities; // treat bundle-only as not-rejected.
|
||
-
|
||
- var rejected = SDPUtils.isRejected(mediaSection) && SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;
|
||
-
|
||
- if (!rejected && !transceiver.rejected) {
|
||
- var remoteIceParameters = SDPUtils.getIceParameters(mediaSection, sessionpart);
|
||
- var remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection, sessionpart);
|
||
-
|
||
- if (isIceLite) {
|
||
- remoteDtlsParameters.role = 'server';
|
||
- }
|
||
-
|
||
- if (!pc.usingBundle || sdpMLineIndex === 0) {
|
||
- pc._gather(transceiver.mid, sdpMLineIndex);
|
||
-
|
||
- if (iceTransport.state === 'new') {
|
||
- iceTransport.start(iceGatherer, remoteIceParameters, isIceLite ? 'controlling' : 'controlled');
|
||
- }
|
||
-
|
||
- if (dtlsTransport.state === 'new') {
|
||
- dtlsTransport.start(remoteDtlsParameters);
|
||
- }
|
||
- } // Calculate intersection of capabilities.
|
||
-
|
||
-
|
||
- var params = getCommonCapabilities(localCapabilities, remoteCapabilities); // Start the RTCRtpSender. The RTCRtpReceiver for this
|
||
- // transceiver has already been started in setRemoteDescription.
|
||
-
|
||
- pc._transceive(transceiver, params.codecs.length > 0, false);
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- pc._localDescription = {
|
||
- type: description.type,
|
||
- sdp: description.sdp
|
||
- };
|
||
-
|
||
- if (description.type === 'offer') {
|
||
- pc._updateSignalingState('have-local-offer');
|
||
- } else {
|
||
- pc._updateSignalingState('stable');
|
||
- }
|
||
-
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.setRemoteDescription = function (description) {
|
||
- var pc = this; // Note: pranswer is not supported.
|
||
-
|
||
- if (['offer', 'answer'].indexOf(description.type) === -1) {
|
||
- return Promise.reject(makeError('TypeError', 'Unsupported type "' + description.type + '"'));
|
||
- }
|
||
-
|
||
- if (!isActionAllowedInSignalingState('setRemoteDescription', description.type, pc.signalingState) || pc._isClosed) {
|
||
- return Promise.reject(makeError('InvalidStateError', 'Can not set remote ' + description.type + ' in state ' + pc.signalingState));
|
||
- }
|
||
-
|
||
- var streams = {};
|
||
- pc.remoteStreams.forEach(function (stream) {
|
||
- streams[stream.id] = stream;
|
||
- });
|
||
- var receiverList = [];
|
||
- var sections = SDPUtils.splitSections(description.sdp);
|
||
- var sessionpart = sections.shift();
|
||
- var isIceLite = SDPUtils.matchPrefix(sessionpart, 'a=ice-lite').length > 0;
|
||
- var usingBundle = SDPUtils.matchPrefix(sessionpart, 'a=group:BUNDLE ').length > 0;
|
||
- pc.usingBundle = usingBundle;
|
||
- var iceOptions = SDPUtils.matchPrefix(sessionpart, 'a=ice-options:')[0];
|
||
-
|
||
- if (iceOptions) {
|
||
- pc.canTrickleIceCandidates = iceOptions.substr(14).split(' ').indexOf('trickle') >= 0;
|
||
- } else {
|
||
- pc.canTrickleIceCandidates = false;
|
||
- }
|
||
-
|
||
- sections.forEach(function (mediaSection, sdpMLineIndex) {
|
||
- var lines = SDPUtils.splitLines(mediaSection);
|
||
- var kind = SDPUtils.getKind(mediaSection); // treat bundle-only as not-rejected.
|
||
-
|
||
- var rejected = SDPUtils.isRejected(mediaSection) && SDPUtils.matchPrefix(mediaSection, 'a=bundle-only').length === 0;
|
||
- var protocol = lines[0].substr(2).split(' ')[2];
|
||
- var direction = SDPUtils.getDirection(mediaSection, sessionpart);
|
||
- var remoteMsid = SDPUtils.parseMsid(mediaSection);
|
||
- var mid = SDPUtils.getMid(mediaSection) || SDPUtils.generateIdentifier(); // Reject datachannels which are not implemented yet.
|
||
-
|
||
- if (rejected || kind === 'application' && (protocol === 'DTLS/SCTP' || protocol === 'UDP/DTLS/SCTP')) {
|
||
- // TODO: this is dangerous in the case where a non-rejected m-line
|
||
- // becomes rejected.
|
||
- pc.transceivers[sdpMLineIndex] = {
|
||
- mid: mid,
|
||
- kind: kind,
|
||
- protocol: protocol,
|
||
- rejected: true
|
||
- };
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!rejected && pc.transceivers[sdpMLineIndex] && pc.transceivers[sdpMLineIndex].rejected) {
|
||
- // recycle a rejected transceiver.
|
||
- pc.transceivers[sdpMLineIndex] = pc._createTransceiver(kind, true);
|
||
- }
|
||
-
|
||
- var transceiver;
|
||
- var iceGatherer;
|
||
- var iceTransport;
|
||
- var dtlsTransport;
|
||
- var rtpReceiver;
|
||
- var sendEncodingParameters;
|
||
- var recvEncodingParameters;
|
||
- var localCapabilities;
|
||
- var track; // FIXME: ensure the mediaSection has rtcp-mux set.
|
||
-
|
||
- var remoteCapabilities = SDPUtils.parseRtpParameters(mediaSection);
|
||
- var remoteIceParameters;
|
||
- var remoteDtlsParameters;
|
||
-
|
||
- if (!rejected) {
|
||
- remoteIceParameters = SDPUtils.getIceParameters(mediaSection, sessionpart);
|
||
- remoteDtlsParameters = SDPUtils.getDtlsParameters(mediaSection, sessionpart);
|
||
- remoteDtlsParameters.role = 'client';
|
||
- }
|
||
-
|
||
- recvEncodingParameters = SDPUtils.parseRtpEncodingParameters(mediaSection);
|
||
- var rtcpParameters = SDPUtils.parseRtcpParameters(mediaSection);
|
||
- var isComplete = SDPUtils.matchPrefix(mediaSection, 'a=end-of-candidates', sessionpart).length > 0;
|
||
- var cands = SDPUtils.matchPrefix(mediaSection, 'a=candidate:').map(function (cand) {
|
||
- return SDPUtils.parseCandidate(cand);
|
||
- }).filter(function (cand) {
|
||
- return cand.component === 1;
|
||
- }); // Check if we can use BUNDLE and dispose transports.
|
||
-
|
||
- if ((description.type === 'offer' || description.type === 'answer') && !rejected && usingBundle && sdpMLineIndex > 0 && pc.transceivers[sdpMLineIndex]) {
|
||
- pc._disposeIceAndDtlsTransports(sdpMLineIndex);
|
||
-
|
||
- pc.transceivers[sdpMLineIndex].iceGatherer = pc.transceivers[0].iceGatherer;
|
||
- pc.transceivers[sdpMLineIndex].iceTransport = pc.transceivers[0].iceTransport;
|
||
- pc.transceivers[sdpMLineIndex].dtlsTransport = pc.transceivers[0].dtlsTransport;
|
||
-
|
||
- if (pc.transceivers[sdpMLineIndex].rtpSender) {
|
||
- pc.transceivers[sdpMLineIndex].rtpSender.setTransport(pc.transceivers[0].dtlsTransport);
|
||
- }
|
||
-
|
||
- if (pc.transceivers[sdpMLineIndex].rtpReceiver) {
|
||
- pc.transceivers[sdpMLineIndex].rtpReceiver.setTransport(pc.transceivers[0].dtlsTransport);
|
||
- }
|
||
- }
|
||
-
|
||
- if (description.type === 'offer' && !rejected) {
|
||
- transceiver = pc.transceivers[sdpMLineIndex] || pc._createTransceiver(kind);
|
||
- transceiver.mid = mid;
|
||
-
|
||
- if (!transceiver.iceGatherer) {
|
||
- transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex, usingBundle);
|
||
- }
|
||
-
|
||
- if (cands.length && transceiver.iceTransport.state === 'new') {
|
||
- if (isComplete && (!usingBundle || sdpMLineIndex === 0)) {
|
||
- transceiver.iceTransport.setRemoteCandidates(cands);
|
||
- } else {
|
||
- cands.forEach(function (candidate) {
|
||
- maybeAddCandidate(transceiver.iceTransport, candidate);
|
||
- });
|
||
- }
|
||
- }
|
||
-
|
||
- localCapabilities = window.RTCRtpReceiver.getCapabilities(kind); // filter RTX until additional stuff needed for RTX is implemented
|
||
- // in adapter.js
|
||
-
|
||
- if (edgeVersion < 15019) {
|
||
- localCapabilities.codecs = localCapabilities.codecs.filter(function (codec) {
|
||
- return codec.name !== 'rtx';
|
||
- });
|
||
- }
|
||
-
|
||
- sendEncodingParameters = transceiver.sendEncodingParameters || [{
|
||
- ssrc: (2 * sdpMLineIndex + 2) * 1001
|
||
- }]; // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams
|
||
-
|
||
- var isNewTrack = false;
|
||
-
|
||
- if (direction === 'sendrecv' || direction === 'sendonly') {
|
||
- isNewTrack = !transceiver.rtpReceiver;
|
||
- rtpReceiver = transceiver.rtpReceiver || new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);
|
||
-
|
||
- if (isNewTrack) {
|
||
- var stream;
|
||
- track = rtpReceiver.track; // FIXME: does not work with Plan B.
|
||
-
|
||
- if (remoteMsid && remoteMsid.stream === '-') {// no-op. a stream id of '-' means: no associated stream.
|
||
- } else if (remoteMsid) {
|
||
- if (!streams[remoteMsid.stream]) {
|
||
- streams[remoteMsid.stream] = new window.MediaStream();
|
||
- Object.defineProperty(streams[remoteMsid.stream], 'id', {
|
||
- get: function () {
|
||
- return remoteMsid.stream;
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- Object.defineProperty(track, 'id', {
|
||
- get: function () {
|
||
- return remoteMsid.track;
|
||
- }
|
||
- });
|
||
- stream = streams[remoteMsid.stream];
|
||
- } else {
|
||
- if (!streams.default) {
|
||
- streams.default = new window.MediaStream();
|
||
- }
|
||
-
|
||
- stream = streams.default;
|
||
- }
|
||
-
|
||
- if (stream) {
|
||
- addTrackToStreamAndFireEvent(track, stream);
|
||
- transceiver.associatedRemoteMediaStreams.push(stream);
|
||
- }
|
||
-
|
||
- receiverList.push([track, rtpReceiver, stream]);
|
||
- }
|
||
- } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track) {
|
||
- transceiver.associatedRemoteMediaStreams.forEach(function (s) {
|
||
- var nativeTrack = s.getTracks().find(function (t) {
|
||
- return t.id === transceiver.rtpReceiver.track.id;
|
||
- });
|
||
-
|
||
- if (nativeTrack) {
|
||
- removeTrackFromStreamAndFireEvent(nativeTrack, s);
|
||
- }
|
||
- });
|
||
- transceiver.associatedRemoteMediaStreams = [];
|
||
- }
|
||
-
|
||
- transceiver.localCapabilities = localCapabilities;
|
||
- transceiver.remoteCapabilities = remoteCapabilities;
|
||
- transceiver.rtpReceiver = rtpReceiver;
|
||
- transceiver.rtcpParameters = rtcpParameters;
|
||
- transceiver.sendEncodingParameters = sendEncodingParameters;
|
||
- transceiver.recvEncodingParameters = recvEncodingParameters; // Start the RTCRtpReceiver now. The RTPSender is started in
|
||
- // setLocalDescription.
|
||
-
|
||
- pc._transceive(pc.transceivers[sdpMLineIndex], false, isNewTrack);
|
||
- } else if (description.type === 'answer' && !rejected) {
|
||
- transceiver = pc.transceivers[sdpMLineIndex];
|
||
- iceGatherer = transceiver.iceGatherer;
|
||
- iceTransport = transceiver.iceTransport;
|
||
- dtlsTransport = transceiver.dtlsTransport;
|
||
- rtpReceiver = transceiver.rtpReceiver;
|
||
- sendEncodingParameters = transceiver.sendEncodingParameters;
|
||
- localCapabilities = transceiver.localCapabilities;
|
||
- pc.transceivers[sdpMLineIndex].recvEncodingParameters = recvEncodingParameters;
|
||
- pc.transceivers[sdpMLineIndex].remoteCapabilities = remoteCapabilities;
|
||
- pc.transceivers[sdpMLineIndex].rtcpParameters = rtcpParameters;
|
||
-
|
||
- if (cands.length && iceTransport.state === 'new') {
|
||
- if ((isIceLite || isComplete) && (!usingBundle || sdpMLineIndex === 0)) {
|
||
- iceTransport.setRemoteCandidates(cands);
|
||
- } else {
|
||
- cands.forEach(function (candidate) {
|
||
- maybeAddCandidate(transceiver.iceTransport, candidate);
|
||
- });
|
||
- }
|
||
- }
|
||
-
|
||
- if (!usingBundle || sdpMLineIndex === 0) {
|
||
- if (iceTransport.state === 'new') {
|
||
- iceTransport.start(iceGatherer, remoteIceParameters, 'controlling');
|
||
- }
|
||
-
|
||
- if (dtlsTransport.state === 'new') {
|
||
- dtlsTransport.start(remoteDtlsParameters);
|
||
- }
|
||
- } // If the offer contained RTX but the answer did not,
|
||
- // remove RTX from sendEncodingParameters.
|
||
-
|
||
-
|
||
- var commonCapabilities = getCommonCapabilities(transceiver.localCapabilities, transceiver.remoteCapabilities);
|
||
- var hasRtx = commonCapabilities.codecs.filter(function (c) {
|
||
- return c.name.toLowerCase() === 'rtx';
|
||
- }).length;
|
||
-
|
||
- if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {
|
||
- delete transceiver.sendEncodingParameters[0].rtx;
|
||
- }
|
||
-
|
||
- pc._transceive(transceiver, direction === 'sendrecv' || direction === 'recvonly', direction === 'sendrecv' || direction === 'sendonly'); // TODO: rewrite to use http://w3c.github.io/webrtc-pc/#set-associated-remote-streams
|
||
-
|
||
-
|
||
- if (rtpReceiver && (direction === 'sendrecv' || direction === 'sendonly')) {
|
||
- track = rtpReceiver.track;
|
||
-
|
||
- if (remoteMsid) {
|
||
- if (!streams[remoteMsid.stream]) {
|
||
- streams[remoteMsid.stream] = new window.MediaStream();
|
||
- }
|
||
-
|
||
- addTrackToStreamAndFireEvent(track, streams[remoteMsid.stream]);
|
||
- receiverList.push([track, rtpReceiver, streams[remoteMsid.stream]]);
|
||
- } else {
|
||
- if (!streams.default) {
|
||
- streams.default = new window.MediaStream();
|
||
- }
|
||
-
|
||
- addTrackToStreamAndFireEvent(track, streams.default);
|
||
- receiverList.push([track, rtpReceiver, streams.default]);
|
||
- }
|
||
- } else {
|
||
- // FIXME: actually the receiver should be created later.
|
||
- delete transceiver.rtpReceiver;
|
||
- }
|
||
- }
|
||
- });
|
||
-
|
||
- if (pc._dtlsRole === undefined) {
|
||
- pc._dtlsRole = description.type === 'offer' ? 'active' : 'passive';
|
||
- }
|
||
-
|
||
- pc._remoteDescription = {
|
||
- type: description.type,
|
||
- sdp: description.sdp
|
||
- };
|
||
-
|
||
- if (description.type === 'offer') {
|
||
- pc._updateSignalingState('have-remote-offer');
|
||
- } else {
|
||
- pc._updateSignalingState('stable');
|
||
- }
|
||
-
|
||
- Object.keys(streams).forEach(function (sid) {
|
||
- var stream = streams[sid];
|
||
-
|
||
- if (stream.getTracks().length) {
|
||
- if (pc.remoteStreams.indexOf(stream) === -1) {
|
||
- pc.remoteStreams.push(stream);
|
||
- var event = new Event('addstream');
|
||
- event.stream = stream;
|
||
- window.setTimeout(function () {
|
||
- pc._dispatchEvent('addstream', event);
|
||
- });
|
||
- }
|
||
-
|
||
- receiverList.forEach(function (item) {
|
||
- var track = item[0];
|
||
- var receiver = item[1];
|
||
-
|
||
- if (stream.id !== item[2].id) {
|
||
- return;
|
||
- }
|
||
-
|
||
- fireAddTrack(pc, track, receiver, [stream]);
|
||
- });
|
||
- }
|
||
- });
|
||
- receiverList.forEach(function (item) {
|
||
- if (item[2]) {
|
||
- return;
|
||
- }
|
||
-
|
||
- fireAddTrack(pc, item[0], item[1], []);
|
||
- }); // check whether addIceCandidate({}) was called within four seconds after
|
||
- // setRemoteDescription.
|
||
-
|
||
- window.setTimeout(function () {
|
||
- if (!(pc && pc.transceivers)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- pc.transceivers.forEach(function (transceiver) {
|
||
- if (transceiver.iceTransport && transceiver.iceTransport.state === 'new' && transceiver.iceTransport.getRemoteCandidates().length > 0) {
|
||
- console.warn('Timeout for addRemoteCandidate. Consider sending ' + 'an end-of-candidates notification');
|
||
- transceiver.iceTransport.addRemoteCandidate({});
|
||
- }
|
||
- });
|
||
- }, 4000);
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.close = function () {
|
||
- this.transceivers.forEach(function (transceiver) {
|
||
- /* not yet
|
||
- if (transceiver.iceGatherer) {
|
||
- transceiver.iceGatherer.close();
|
||
- }
|
||
- */
|
||
- if (transceiver.iceTransport) {
|
||
- transceiver.iceTransport.stop();
|
||
- }
|
||
-
|
||
- if (transceiver.dtlsTransport) {
|
||
- transceiver.dtlsTransport.stop();
|
||
- }
|
||
-
|
||
- if (transceiver.rtpSender) {
|
||
- transceiver.rtpSender.stop();
|
||
- }
|
||
-
|
||
- if (transceiver.rtpReceiver) {
|
||
- transceiver.rtpReceiver.stop();
|
||
- }
|
||
- }); // FIXME: clean up tracks, local streams, remote streams, etc
|
||
-
|
||
- this._isClosed = true;
|
||
-
|
||
- this._updateSignalingState('closed');
|
||
- }; // Update the signaling state.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._updateSignalingState = function (newState) {
|
||
- this.signalingState = newState;
|
||
- var event = new Event('signalingstatechange');
|
||
-
|
||
- this._dispatchEvent('signalingstatechange', event);
|
||
- }; // Determine whether to fire the negotiationneeded event.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._maybeFireNegotiationNeeded = function () {
|
||
- var pc = this;
|
||
-
|
||
- if (this.signalingState !== 'stable' || this.needNegotiation === true) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this.needNegotiation = true;
|
||
- window.setTimeout(function () {
|
||
- if (pc.needNegotiation) {
|
||
- pc.needNegotiation = false;
|
||
- var event = new Event('negotiationneeded');
|
||
-
|
||
- pc._dispatchEvent('negotiationneeded', event);
|
||
- }
|
||
- }, 0);
|
||
- }; // Update the ice connection state.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._updateIceConnectionState = function () {
|
||
- var newState;
|
||
- var states = {
|
||
- 'new': 0,
|
||
- closed: 0,
|
||
- checking: 0,
|
||
- connected: 0,
|
||
- completed: 0,
|
||
- disconnected: 0,
|
||
- failed: 0
|
||
- };
|
||
- this.transceivers.forEach(function (transceiver) {
|
||
- if (transceiver.iceTransport && !transceiver.rejected) {
|
||
- states[transceiver.iceTransport.state]++;
|
||
- }
|
||
- });
|
||
- newState = 'new';
|
||
-
|
||
- if (states.failed > 0) {
|
||
- newState = 'failed';
|
||
- } else if (states.checking > 0) {
|
||
- newState = 'checking';
|
||
- } else if (states.disconnected > 0) {
|
||
- newState = 'disconnected';
|
||
- } else if (states.new > 0) {
|
||
- newState = 'new';
|
||
- } else if (states.connected > 0) {
|
||
- newState = 'connected';
|
||
- } else if (states.completed > 0) {
|
||
- newState = 'completed';
|
||
- }
|
||
-
|
||
- if (newState !== this.iceConnectionState) {
|
||
- this.iceConnectionState = newState;
|
||
- var event = new Event('iceconnectionstatechange');
|
||
-
|
||
- this._dispatchEvent('iceconnectionstatechange', event);
|
||
- }
|
||
- }; // Update the connection state.
|
||
-
|
||
-
|
||
- RTCPeerConnection.prototype._updateConnectionState = function () {
|
||
- var newState;
|
||
- var states = {
|
||
- 'new': 0,
|
||
- closed: 0,
|
||
- connecting: 0,
|
||
- connected: 0,
|
||
- completed: 0,
|
||
- disconnected: 0,
|
||
- failed: 0
|
||
- };
|
||
- this.transceivers.forEach(function (transceiver) {
|
||
- if (transceiver.iceTransport && transceiver.dtlsTransport && !transceiver.rejected) {
|
||
- states[transceiver.iceTransport.state]++;
|
||
- states[transceiver.dtlsTransport.state]++;
|
||
- }
|
||
- }); // ICETransport.completed and connected are the same for this purpose.
|
||
-
|
||
- states.connected += states.completed;
|
||
- newState = 'new';
|
||
-
|
||
- if (states.failed > 0) {
|
||
- newState = 'failed';
|
||
- } else if (states.connecting > 0) {
|
||
- newState = 'connecting';
|
||
- } else if (states.disconnected > 0) {
|
||
- newState = 'disconnected';
|
||
- } else if (states.new > 0) {
|
||
- newState = 'new';
|
||
- } else if (states.connected > 0) {
|
||
- newState = 'connected';
|
||
- }
|
||
-
|
||
- if (newState !== this.connectionState) {
|
||
- this.connectionState = newState;
|
||
- var event = new Event('connectionstatechange');
|
||
-
|
||
- this._dispatchEvent('connectionstatechange', event);
|
||
- }
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.createOffer = function () {
|
||
- var pc = this;
|
||
-
|
||
- if (pc._isClosed) {
|
||
- return Promise.reject(makeError('InvalidStateError', 'Can not call createOffer after close'));
|
||
- }
|
||
-
|
||
- var numAudioTracks = pc.transceivers.filter(function (t) {
|
||
- return t.kind === 'audio';
|
||
- }).length;
|
||
- var numVideoTracks = pc.transceivers.filter(function (t) {
|
||
- return t.kind === 'video';
|
||
- }).length; // Determine number of audio and video tracks we need to send/recv.
|
||
-
|
||
- var offerOptions = arguments[0];
|
||
-
|
||
- if (offerOptions) {
|
||
- // Reject Chrome legacy constraints.
|
||
- if (offerOptions.mandatory || offerOptions.optional) {
|
||
- throw new TypeError('Legacy mandatory/optional constraints not supported.');
|
||
- }
|
||
-
|
||
- if (offerOptions.offerToReceiveAudio !== undefined) {
|
||
- if (offerOptions.offerToReceiveAudio === true) {
|
||
- numAudioTracks = 1;
|
||
- } else if (offerOptions.offerToReceiveAudio === false) {
|
||
- numAudioTracks = 0;
|
||
- } else {
|
||
- numAudioTracks = offerOptions.offerToReceiveAudio;
|
||
- }
|
||
- }
|
||
-
|
||
- if (offerOptions.offerToReceiveVideo !== undefined) {
|
||
- if (offerOptions.offerToReceiveVideo === true) {
|
||
- numVideoTracks = 1;
|
||
- } else if (offerOptions.offerToReceiveVideo === false) {
|
||
- numVideoTracks = 0;
|
||
- } else {
|
||
- numVideoTracks = offerOptions.offerToReceiveVideo;
|
||
- }
|
||
- }
|
||
- }
|
||
-
|
||
- pc.transceivers.forEach(function (transceiver) {
|
||
- if (transceiver.kind === 'audio') {
|
||
- numAudioTracks--;
|
||
-
|
||
- if (numAudioTracks < 0) {
|
||
- transceiver.wantReceive = false;
|
||
- }
|
||
- } else if (transceiver.kind === 'video') {
|
||
- numVideoTracks--;
|
||
-
|
||
- if (numVideoTracks < 0) {
|
||
- transceiver.wantReceive = false;
|
||
- }
|
||
- }
|
||
- }); // Create M-lines for recvonly streams.
|
||
-
|
||
- while (numAudioTracks > 0 || numVideoTracks > 0) {
|
||
- if (numAudioTracks > 0) {
|
||
- pc._createTransceiver('audio');
|
||
-
|
||
- numAudioTracks--;
|
||
- }
|
||
-
|
||
- if (numVideoTracks > 0) {
|
||
- pc._createTransceiver('video');
|
||
-
|
||
- numVideoTracks--;
|
||
- }
|
||
- }
|
||
-
|
||
- var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId, pc._sdpSessionVersion++);
|
||
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
|
||
- // For each track, create an ice gatherer, ice transport,
|
||
- // dtls transport, potentially rtpsender and rtpreceiver.
|
||
- var track = transceiver.track;
|
||
- var kind = transceiver.kind;
|
||
- var mid = transceiver.mid || SDPUtils.generateIdentifier();
|
||
- transceiver.mid = mid;
|
||
-
|
||
- if (!transceiver.iceGatherer) {
|
||
- transceiver.iceGatherer = pc._createIceGatherer(sdpMLineIndex, pc.usingBundle);
|
||
- }
|
||
-
|
||
- var localCapabilities = window.RTCRtpSender.getCapabilities(kind); // filter RTX until additional stuff needed for RTX is implemented
|
||
- // in adapter.js
|
||
-
|
||
- if (edgeVersion < 15019) {
|
||
- localCapabilities.codecs = localCapabilities.codecs.filter(function (codec) {
|
||
- return codec.name !== 'rtx';
|
||
- });
|
||
- }
|
||
-
|
||
- localCapabilities.codecs.forEach(function (codec) {
|
||
- // work around https://bugs.chromium.org/p/webrtc/issues/detail?id=6552
|
||
- // by adding level-asymmetry-allowed=1
|
||
- if (codec.name === 'H264' && codec.parameters['level-asymmetry-allowed'] === undefined) {
|
||
- codec.parameters['level-asymmetry-allowed'] = '1';
|
||
- } // for subsequent offers, we might have to re-use the payload
|
||
- // type of the last offer.
|
||
-
|
||
-
|
||
- if (transceiver.remoteCapabilities && transceiver.remoteCapabilities.codecs) {
|
||
- transceiver.remoteCapabilities.codecs.forEach(function (remoteCodec) {
|
||
- if (codec.name.toLowerCase() === remoteCodec.name.toLowerCase() && codec.clockRate === remoteCodec.clockRate) {
|
||
- codec.preferredPayloadType = remoteCodec.payloadType;
|
||
- }
|
||
- });
|
||
- }
|
||
- });
|
||
- localCapabilities.headerExtensions.forEach(function (hdrExt) {
|
||
- var remoteExtensions = transceiver.remoteCapabilities && transceiver.remoteCapabilities.headerExtensions || [];
|
||
- remoteExtensions.forEach(function (rHdrExt) {
|
||
- if (hdrExt.uri === rHdrExt.uri) {
|
||
- hdrExt.id = rHdrExt.id;
|
||
- }
|
||
- });
|
||
- }); // generate an ssrc now, to be used later in rtpSender.send
|
||
-
|
||
- var sendEncodingParameters = transceiver.sendEncodingParameters || [{
|
||
- ssrc: (2 * sdpMLineIndex + 1) * 1001
|
||
- }];
|
||
-
|
||
- if (track) {
|
||
- // add RTX
|
||
- if (edgeVersion >= 15019 && kind === 'video' && !sendEncodingParameters[0].rtx) {
|
||
- sendEncodingParameters[0].rtx = {
|
||
- ssrc: sendEncodingParameters[0].ssrc + 1
|
||
- };
|
||
- }
|
||
- }
|
||
-
|
||
- if (transceiver.wantReceive) {
|
||
- transceiver.rtpReceiver = new window.RTCRtpReceiver(transceiver.dtlsTransport, kind);
|
||
- }
|
||
-
|
||
- transceiver.localCapabilities = localCapabilities;
|
||
- transceiver.sendEncodingParameters = sendEncodingParameters;
|
||
- }); // always offer BUNDLE and dispose on return if not supported.
|
||
-
|
||
- if (pc._config.bundlePolicy !== 'max-compat') {
|
||
- sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function (t) {
|
||
- return t.mid;
|
||
- }).join(' ') + '\r\n';
|
||
- }
|
||
-
|
||
- sdp += 'a=ice-options:trickle\r\n';
|
||
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
|
||
- sdp += writeMediaSection(transceiver, transceiver.localCapabilities, 'offer', transceiver.stream, pc._dtlsRole);
|
||
- sdp += 'a=rtcp-rsize\r\n';
|
||
-
|
||
- if (transceiver.iceGatherer && pc.iceGatheringState !== 'new' && (sdpMLineIndex === 0 || !pc.usingBundle)) {
|
||
- transceiver.iceGatherer.getLocalCandidates().forEach(function (cand) {
|
||
- cand.component = 1;
|
||
- sdp += 'a=' + SDPUtils.writeCandidate(cand) + '\r\n';
|
||
- });
|
||
-
|
||
- if (transceiver.iceGatherer.state === 'completed') {
|
||
- sdp += 'a=end-of-candidates\r\n';
|
||
- }
|
||
- }
|
||
- });
|
||
- var desc = new window.RTCSessionDescription({
|
||
- type: 'offer',
|
||
- sdp: sdp
|
||
- });
|
||
- return Promise.resolve(desc);
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.createAnswer = function () {
|
||
- var pc = this;
|
||
-
|
||
- if (pc._isClosed) {
|
||
- return Promise.reject(makeError('InvalidStateError', 'Can not call createAnswer after close'));
|
||
- }
|
||
-
|
||
- if (!(pc.signalingState === 'have-remote-offer' || pc.signalingState === 'have-local-pranswer')) {
|
||
- return Promise.reject(makeError('InvalidStateError', 'Can not call createAnswer in signalingState ' + pc.signalingState));
|
||
- }
|
||
-
|
||
- var sdp = SDPUtils.writeSessionBoilerplate(pc._sdpSessionId, pc._sdpSessionVersion++);
|
||
-
|
||
- if (pc.usingBundle) {
|
||
- sdp += 'a=group:BUNDLE ' + pc.transceivers.map(function (t) {
|
||
- return t.mid;
|
||
- }).join(' ') + '\r\n';
|
||
- }
|
||
-
|
||
- sdp += 'a=ice-options:trickle\r\n';
|
||
- var mediaSectionsInOffer = SDPUtils.getMediaSections(pc._remoteDescription.sdp).length;
|
||
- pc.transceivers.forEach(function (transceiver, sdpMLineIndex) {
|
||
- if (sdpMLineIndex + 1 > mediaSectionsInOffer) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (transceiver.rejected) {
|
||
- if (transceiver.kind === 'application') {
|
||
- if (transceiver.protocol === 'DTLS/SCTP') {
|
||
- // legacy fmt
|
||
- sdp += 'm=application 0 DTLS/SCTP 5000\r\n';
|
||
- } else {
|
||
- sdp += 'm=application 0 ' + transceiver.protocol + ' webrtc-datachannel\r\n';
|
||
- }
|
||
- } else if (transceiver.kind === 'audio') {
|
||
- sdp += 'm=audio 0 UDP/TLS/RTP/SAVPF 0\r\n' + 'a=rtpmap:0 PCMU/8000\r\n';
|
||
- } else if (transceiver.kind === 'video') {
|
||
- sdp += 'm=video 0 UDP/TLS/RTP/SAVPF 120\r\n' + 'a=rtpmap:120 VP8/90000\r\n';
|
||
- }
|
||
-
|
||
- sdp += 'c=IN IP4 0.0.0.0\r\n' + 'a=inactive\r\n' + 'a=mid:' + transceiver.mid + '\r\n';
|
||
- return;
|
||
- } // FIXME: look at direction.
|
||
-
|
||
-
|
||
- if (transceiver.stream) {
|
||
- var localTrack;
|
||
-
|
||
- if (transceiver.kind === 'audio') {
|
||
- localTrack = transceiver.stream.getAudioTracks()[0];
|
||
- } else if (transceiver.kind === 'video') {
|
||
- localTrack = transceiver.stream.getVideoTracks()[0];
|
||
- }
|
||
-
|
||
- if (localTrack) {
|
||
- // add RTX
|
||
- if (edgeVersion >= 15019 && transceiver.kind === 'video' && !transceiver.sendEncodingParameters[0].rtx) {
|
||
- transceiver.sendEncodingParameters[0].rtx = {
|
||
- ssrc: transceiver.sendEncodingParameters[0].ssrc + 1
|
||
- };
|
||
- }
|
||
- }
|
||
- } // Calculate intersection of capabilities.
|
||
-
|
||
-
|
||
- var commonCapabilities = getCommonCapabilities(transceiver.localCapabilities, transceiver.remoteCapabilities);
|
||
- var hasRtx = commonCapabilities.codecs.filter(function (c) {
|
||
- return c.name.toLowerCase() === 'rtx';
|
||
- }).length;
|
||
-
|
||
- if (!hasRtx && transceiver.sendEncodingParameters[0].rtx) {
|
||
- delete transceiver.sendEncodingParameters[0].rtx;
|
||
- }
|
||
-
|
||
- sdp += writeMediaSection(transceiver, commonCapabilities, 'answer', transceiver.stream, pc._dtlsRole);
|
||
-
|
||
- if (transceiver.rtcpParameters && transceiver.rtcpParameters.reducedSize) {
|
||
- sdp += 'a=rtcp-rsize\r\n';
|
||
- }
|
||
- });
|
||
- var desc = new window.RTCSessionDescription({
|
||
- type: 'answer',
|
||
- sdp: sdp
|
||
- });
|
||
- return Promise.resolve(desc);
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.addIceCandidate = function (candidate) {
|
||
- var pc = this;
|
||
- var sections;
|
||
-
|
||
- if (candidate && !(candidate.sdpMLineIndex !== undefined || candidate.sdpMid)) {
|
||
- return Promise.reject(new TypeError('sdpMLineIndex or sdpMid required'));
|
||
- } // TODO: needs to go into ops queue.
|
||
-
|
||
-
|
||
- return new Promise(function (resolve, reject) {
|
||
- if (!pc._remoteDescription) {
|
||
- return reject(makeError('InvalidStateError', 'Can not add ICE candidate without a remote description'));
|
||
- } else if (!candidate || candidate.candidate === '') {
|
||
- for (var j = 0; j < pc.transceivers.length; j++) {
|
||
- if (pc.transceivers[j].rejected) {
|
||
- continue;
|
||
- }
|
||
-
|
||
- pc.transceivers[j].iceTransport.addRemoteCandidate({});
|
||
- sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);
|
||
- sections[j] += 'a=end-of-candidates\r\n';
|
||
- pc._remoteDescription.sdp = SDPUtils.getDescription(pc._remoteDescription.sdp) + sections.join('');
|
||
-
|
||
- if (pc.usingBundle) {
|
||
- break;
|
||
- }
|
||
- }
|
||
- } else {
|
||
- var sdpMLineIndex = candidate.sdpMLineIndex;
|
||
-
|
||
- if (candidate.sdpMid) {
|
||
- for (var i = 0; i < pc.transceivers.length; i++) {
|
||
- if (pc.transceivers[i].mid === candidate.sdpMid) {
|
||
- sdpMLineIndex = i;
|
||
- break;
|
||
- }
|
||
- }
|
||
- }
|
||
-
|
||
- var transceiver = pc.transceivers[sdpMLineIndex];
|
||
-
|
||
- if (transceiver) {
|
||
- if (transceiver.rejected) {
|
||
- return resolve();
|
||
- }
|
||
-
|
||
- var cand = Object.keys(candidate.candidate).length > 0 ? SDPUtils.parseCandidate(candidate.candidate) : {}; // Ignore Chrome's invalid candidates since Edge does not like them.
|
||
-
|
||
- if (cand.protocol === 'tcp' && (cand.port === 0 || cand.port === 9)) {
|
||
- return resolve();
|
||
- } // Ignore RTCP candidates, we assume RTCP-MUX.
|
||
-
|
||
-
|
||
- if (cand.component && cand.component !== 1) {
|
||
- return resolve();
|
||
- } // when using bundle, avoid adding candidates to the wrong
|
||
- // ice transport. And avoid adding candidates added in the SDP.
|
||
-
|
||
-
|
||
- if (sdpMLineIndex === 0 || sdpMLineIndex > 0 && transceiver.iceTransport !== pc.transceivers[0].iceTransport) {
|
||
- if (!maybeAddCandidate(transceiver.iceTransport, cand)) {
|
||
- return reject(makeError('OperationError', 'Can not add ICE candidate'));
|
||
- }
|
||
- } // update the remoteDescription.
|
||
-
|
||
-
|
||
- var candidateString = candidate.candidate.trim();
|
||
-
|
||
- if (candidateString.indexOf('a=') === 0) {
|
||
- candidateString = candidateString.substr(2);
|
||
- }
|
||
-
|
||
- sections = SDPUtils.getMediaSections(pc._remoteDescription.sdp);
|
||
- sections[sdpMLineIndex] += 'a=' + (cand.type ? candidateString : 'end-of-candidates') + '\r\n';
|
||
- pc._remoteDescription.sdp = SDPUtils.getDescription(pc._remoteDescription.sdp) + sections.join('');
|
||
- } else {
|
||
- return reject(makeError('OperationError', 'Can not add ICE candidate'));
|
||
- }
|
||
- }
|
||
-
|
||
- resolve();
|
||
- });
|
||
- };
|
||
-
|
||
- RTCPeerConnection.prototype.getStats = function (selector) {
|
||
- if (selector && selector instanceof window.MediaStreamTrack) {
|
||
- var senderOrReceiver = null;
|
||
- this.transceivers.forEach(function (transceiver) {
|
||
- if (transceiver.rtpSender && transceiver.rtpSender.track === selector) {
|
||
- senderOrReceiver = transceiver.rtpSender;
|
||
- } else if (transceiver.rtpReceiver && transceiver.rtpReceiver.track === selector) {
|
||
- senderOrReceiver = transceiver.rtpReceiver;
|
||
- }
|
||
- });
|
||
-
|
||
- if (!senderOrReceiver) {
|
||
- throw makeError('InvalidAccessError', 'Invalid selector.');
|
||
- }
|
||
-
|
||
- return senderOrReceiver.getStats();
|
||
- }
|
||
-
|
||
- var promises = [];
|
||
- this.transceivers.forEach(function (transceiver) {
|
||
- ['rtpSender', 'rtpReceiver', 'iceGatherer', 'iceTransport', 'dtlsTransport'].forEach(function (method) {
|
||
- if (transceiver[method]) {
|
||
- promises.push(transceiver[method].getStats());
|
||
- }
|
||
- });
|
||
- });
|
||
- return Promise.all(promises).then(function (allStats) {
|
||
- var results = new Map();
|
||
- allStats.forEach(function (stats) {
|
||
- stats.forEach(function (stat) {
|
||
- results.set(stat.id, stat);
|
||
- });
|
||
- });
|
||
- return results;
|
||
- });
|
||
- }; // fix low-level stat names and return Map instead of object.
|
||
-
|
||
-
|
||
- var ortcObjects = ['RTCRtpSender', 'RTCRtpReceiver', 'RTCIceGatherer', 'RTCIceTransport', 'RTCDtlsTransport'];
|
||
- ortcObjects.forEach(function (ortcObjectName) {
|
||
- var obj = window[ortcObjectName];
|
||
-
|
||
- if (obj && obj.prototype && obj.prototype.getStats) {
|
||
- var nativeGetstats = obj.prototype.getStats;
|
||
-
|
||
- obj.prototype.getStats = function () {
|
||
- return nativeGetstats.apply(this).then(function (nativeStats) {
|
||
- var mapStats = new Map();
|
||
- Object.keys(nativeStats).forEach(function (id) {
|
||
- nativeStats[id].type = fixStatsType(nativeStats[id]);
|
||
- mapStats.set(id, nativeStats[id]);
|
||
- });
|
||
- return mapStats;
|
||
- });
|
||
- };
|
||
- }
|
||
- }); // legacy callback shims. Should be moved to adapter.js some days.
|
||
-
|
||
- var methods = ['createOffer', 'createAnswer'];
|
||
- methods.forEach(function (method) {
|
||
- var nativeMethod = RTCPeerConnection.prototype[method];
|
||
-
|
||
- RTCPeerConnection.prototype[method] = function () {
|
||
- var args = arguments;
|
||
-
|
||
- if (typeof args[0] === 'function' || typeof args[1] === 'function') {
|
||
- // legacy
|
||
- return nativeMethod.apply(this, [arguments[2]]).then(function (description) {
|
||
- if (typeof args[0] === 'function') {
|
||
- args[0].apply(null, [description]);
|
||
- }
|
||
- }, function (error) {
|
||
- if (typeof args[1] === 'function') {
|
||
- args[1].apply(null, [error]);
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- return nativeMethod.apply(this, arguments);
|
||
- };
|
||
- });
|
||
- methods = ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'];
|
||
- methods.forEach(function (method) {
|
||
- var nativeMethod = RTCPeerConnection.prototype[method];
|
||
-
|
||
- RTCPeerConnection.prototype[method] = function () {
|
||
- var args = arguments;
|
||
-
|
||
- if (typeof args[1] === 'function' || typeof args[2] === 'function') {
|
||
- // legacy
|
||
- return nativeMethod.apply(this, arguments).then(function () {
|
||
- if (typeof args[1] === 'function') {
|
||
- args[1].apply(null);
|
||
- }
|
||
- }, function (error) {
|
||
- if (typeof args[2] === 'function') {
|
||
- args[2].apply(null, [error]);
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- return nativeMethod.apply(this, arguments);
|
||
- };
|
||
- }); // getStats is special. It doesn't have a spec legacy method yet we support
|
||
- // getStats(something, cb) without error callbacks.
|
||
-
|
||
- ['getStats'].forEach(function (method) {
|
||
- var nativeMethod = RTCPeerConnection.prototype[method];
|
||
-
|
||
- RTCPeerConnection.prototype[method] = function () {
|
||
- var args = arguments;
|
||
-
|
||
- if (typeof args[1] === 'function') {
|
||
- return nativeMethod.apply(this, arguments).then(function () {
|
||
- if (typeof args[1] === 'function') {
|
||
- args[1].apply(null);
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- return nativeMethod.apply(this, arguments);
|
||
- };
|
||
- });
|
||
- return RTCPeerConnection;
|
||
-};
|
||
-},{"sdp":"YHvh"}],"YdKx":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimGetUserMedia = shimGetUserMedia;
|
||
-
|
||
-function shimGetUserMedia(window) {
|
||
- var navigator = window && window.navigator;
|
||
-
|
||
- var shimError_ = function (e) {
|
||
- return {
|
||
- name: {
|
||
- PermissionDeniedError: 'NotAllowedError'
|
||
- }[e.name] || e.name,
|
||
- message: e.message,
|
||
- constraint: e.constraint,
|
||
- toString: function () {
|
||
- return this.name;
|
||
- }
|
||
- };
|
||
- }; // getUserMedia error shim.
|
||
-
|
||
-
|
||
- var origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);
|
||
-
|
||
- navigator.mediaDevices.getUserMedia = function (c) {
|
||
- return origGetUserMedia(c).catch(function (e) {
|
||
- return Promise.reject(shimError_(e));
|
||
- });
|
||
- };
|
||
-}
|
||
-},{}],"P3bV":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimGetDisplayMedia = shimGetDisplayMedia;
|
||
-
|
||
-function shimGetDisplayMedia(window) {
|
||
- if (!('getDisplayMedia' in window.navigator)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!window.navigator.mediaDevices) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {
|
||
- return;
|
||
- }
|
||
-
|
||
- window.navigator.mediaDevices.getDisplayMedia = window.navigator.getDisplayMedia.bind(window.navigator);
|
||
-}
|
||
-},{}],"XRic":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimPeerConnection = shimPeerConnection;
|
||
-exports.shimReplaceTrack = shimReplaceTrack;
|
||
-Object.defineProperty(exports, "shimGetUserMedia", {
|
||
- enumerable: true,
|
||
- get: function () {
|
||
- return _getusermedia.shimGetUserMedia;
|
||
- }
|
||
-});
|
||
-Object.defineProperty(exports, "shimGetDisplayMedia", {
|
||
- enumerable: true,
|
||
- get: function () {
|
||
- return _getdisplaymedia.shimGetDisplayMedia;
|
||
- }
|
||
-});
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils"));
|
||
-
|
||
-var _filtericeservers = require("./filtericeservers");
|
||
-
|
||
-var _rtcpeerconnectionShim = _interopRequireDefault(require("rtcpeerconnection-shim"));
|
||
-
|
||
-var _getusermedia = require("./getusermedia");
|
||
-
|
||
-var _getdisplaymedia = require("./getdisplaymedia");
|
||
-
|
||
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function shimPeerConnection(window, browserDetails) {
|
||
- if (window.RTCIceGatherer) {
|
||
- if (!window.RTCIceCandidate) {
|
||
- window.RTCIceCandidate = function RTCIceCandidate(args) {
|
||
- return args;
|
||
- };
|
||
- }
|
||
-
|
||
- if (!window.RTCSessionDescription) {
|
||
- window.RTCSessionDescription = function RTCSessionDescription(args) {
|
||
- return args;
|
||
- };
|
||
- } // this adds an additional event listener to MediaStrackTrack that signals
|
||
- // when a tracks enabled property was changed. Workaround for a bug in
|
||
- // addStream, see below. No longer required in 15025+
|
||
-
|
||
-
|
||
- if (browserDetails.version < 15025) {
|
||
- var origMSTEnabled = Object.getOwnPropertyDescriptor(window.MediaStreamTrack.prototype, 'enabled');
|
||
- Object.defineProperty(window.MediaStreamTrack.prototype, 'enabled', {
|
||
- set: function (value) {
|
||
- origMSTEnabled.set.call(this, value);
|
||
- var ev = new Event('enabled');
|
||
- ev.enabled = value;
|
||
- this.dispatchEvent(ev);
|
||
- }
|
||
- });
|
||
- }
|
||
- } // ORTC defines the DTMF sender a bit different.
|
||
- // https://github.com/w3c/ortc/issues/714
|
||
-
|
||
-
|
||
- if (window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) {
|
||
- Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {
|
||
- get: function () {
|
||
- if (this._dtmf === undefined) {
|
||
- if (this.track.kind === 'audio') {
|
||
- this._dtmf = new window.RTCDtmfSender(this);
|
||
- } else if (this.track.kind === 'video') {
|
||
- this._dtmf = null;
|
||
- }
|
||
- }
|
||
-
|
||
- return this._dtmf;
|
||
- }
|
||
- });
|
||
- } // Edge currently only implements the RTCDtmfSender, not the
|
||
- // RTCDTMFSender alias. See http://draft.ortc.org/#rtcdtmfsender2*
|
||
-
|
||
-
|
||
- if (window.RTCDtmfSender && !window.RTCDTMFSender) {
|
||
- window.RTCDTMFSender = window.RTCDtmfSender;
|
||
- }
|
||
-
|
||
- var RTCPeerConnectionShim = (0, _rtcpeerconnectionShim.default)(window, browserDetails.version);
|
||
-
|
||
- window.RTCPeerConnection = function RTCPeerConnection(config) {
|
||
- if (config && config.iceServers) {
|
||
- config.iceServers = (0, _filtericeservers.filterIceServers)(config.iceServers, browserDetails.version);
|
||
- utils.log('ICE servers after filtering:', config.iceServers);
|
||
- }
|
||
-
|
||
- return new RTCPeerConnectionShim(config);
|
||
- };
|
||
-
|
||
- window.RTCPeerConnection.prototype = RTCPeerConnectionShim.prototype;
|
||
-}
|
||
-
|
||
-function shimReplaceTrack(window) {
|
||
- // ORTC has replaceTrack -- https://github.com/w3c/ortc/issues/614
|
||
- if (window.RTCRtpSender && !('replaceTrack' in window.RTCRtpSender.prototype)) {
|
||
- window.RTCRtpSender.prototype.replaceTrack = window.RTCRtpSender.prototype.setTrack;
|
||
- }
|
||
-}
|
||
-},{"../utils":"iSxC","./filtericeservers":"NZ1C","rtcpeerconnection-shim":"NJ2u","./getusermedia":"YdKx","./getdisplaymedia":"P3bV"}],"GzSv":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimGetUserMedia = shimGetUserMedia;
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils"));
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-function shimGetUserMedia(window, browserDetails) {
|
||
- var navigator = window && window.navigator;
|
||
- var MediaStreamTrack = window && window.MediaStreamTrack;
|
||
-
|
||
- navigator.getUserMedia = function (constraints, onSuccess, onError) {
|
||
- // Replace Firefox 44+'s deprecation warning with unprefixed version.
|
||
- utils.deprecated('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia');
|
||
- navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);
|
||
- };
|
||
-
|
||
- if (!(browserDetails.version > 55 && 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {
|
||
- var remap = function (obj, a, b) {
|
||
- if (a in obj && !(b in obj)) {
|
||
- obj[b] = obj[a];
|
||
- delete obj[a];
|
||
- }
|
||
- };
|
||
-
|
||
- var nativeGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices);
|
||
-
|
||
- navigator.mediaDevices.getUserMedia = function (c) {
|
||
- if (_typeof(c) === 'object' && _typeof(c.audio) === 'object') {
|
||
- c = JSON.parse(JSON.stringify(c));
|
||
- remap(c.audio, 'autoGainControl', 'mozAutoGainControl');
|
||
- remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');
|
||
- }
|
||
-
|
||
- return nativeGetUserMedia(c);
|
||
- };
|
||
-
|
||
- if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {
|
||
- var nativeGetSettings = MediaStreamTrack.prototype.getSettings;
|
||
-
|
||
- MediaStreamTrack.prototype.getSettings = function () {
|
||
- var obj = nativeGetSettings.apply(this, arguments);
|
||
- remap(obj, 'mozAutoGainControl', 'autoGainControl');
|
||
- remap(obj, 'mozNoiseSuppression', 'noiseSuppression');
|
||
- return obj;
|
||
- };
|
||
- }
|
||
-
|
||
- if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {
|
||
- var nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints;
|
||
-
|
||
- MediaStreamTrack.prototype.applyConstraints = function (c) {
|
||
- if (this.kind === 'audio' && _typeof(c) === 'object') {
|
||
- c = JSON.parse(JSON.stringify(c));
|
||
- remap(c, 'autoGainControl', 'mozAutoGainControl');
|
||
- remap(c, 'noiseSuppression', 'mozNoiseSuppression');
|
||
- }
|
||
-
|
||
- return nativeApplyConstraints.apply(this, [c]);
|
||
- };
|
||
- }
|
||
- }
|
||
-}
|
||
-},{"../utils":"iSxC"}],"UuGU":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimGetDisplayMedia = shimGetDisplayMedia;
|
||
-
|
||
-function shimGetDisplayMedia(window, preferredMediaSource) {
|
||
- if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!window.navigator.mediaDevices) {
|
||
- return;
|
||
- }
|
||
-
|
||
- window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {
|
||
- if (!(constraints && constraints.video)) {
|
||
- var err = new DOMException('getDisplayMedia without video ' + 'constraints is undefined');
|
||
- err.name = 'NotFoundError'; // from https://heycam.github.io/webidl/#idl-DOMException-error-names
|
||
-
|
||
- err.code = 8;
|
||
- return Promise.reject(err);
|
||
- }
|
||
-
|
||
- if (constraints.video === true) {
|
||
- constraints.video = {
|
||
- mediaSource: preferredMediaSource
|
||
- };
|
||
- } else {
|
||
- constraints.video.mediaSource = preferredMediaSource;
|
||
- }
|
||
-
|
||
- return window.navigator.mediaDevices.getUserMedia(constraints);
|
||
- };
|
||
-}
|
||
-},{}],"Fzdr":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimOnTrack = shimOnTrack;
|
||
-exports.shimPeerConnection = shimPeerConnection;
|
||
-exports.shimSenderGetStats = shimSenderGetStats;
|
||
-exports.shimReceiverGetStats = shimReceiverGetStats;
|
||
-exports.shimRemoveStream = shimRemoveStream;
|
||
-exports.shimRTCDataChannel = shimRTCDataChannel;
|
||
-exports.shimAddTransceiver = shimAddTransceiver;
|
||
-exports.shimGetParameters = shimGetParameters;
|
||
-exports.shimCreateOffer = shimCreateOffer;
|
||
-exports.shimCreateAnswer = shimCreateAnswer;
|
||
-Object.defineProperty(exports, "shimGetUserMedia", {
|
||
- enumerable: true,
|
||
- get: function () {
|
||
- return _getusermedia.shimGetUserMedia;
|
||
- }
|
||
-});
|
||
-Object.defineProperty(exports, "shimGetDisplayMedia", {
|
||
- enumerable: true,
|
||
- get: function () {
|
||
- return _getdisplaymedia.shimGetDisplayMedia;
|
||
- }
|
||
-});
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils"));
|
||
-
|
||
-var _getusermedia = require("./getusermedia");
|
||
-
|
||
-var _getdisplaymedia = require("./getdisplaymedia");
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-function shimOnTrack(window) {
|
||
- if (_typeof(window) === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {
|
||
- Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {
|
||
- get: function () {
|
||
- return {
|
||
- receiver: this.receiver
|
||
- };
|
||
- }
|
||
- });
|
||
- }
|
||
-}
|
||
-
|
||
-function shimPeerConnection(window, browserDetails) {
|
||
- if (_typeof(window) !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {
|
||
- return; // probably media.peerconnection.enabled=false in about:config
|
||
- }
|
||
-
|
||
- if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {
|
||
- // very basic support for old versions.
|
||
- window.RTCPeerConnection = window.mozRTCPeerConnection;
|
||
- }
|
||
-
|
||
- if (browserDetails.version < 53) {
|
||
- // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.
|
||
- ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate'].forEach(function (method) {
|
||
- var nativeMethod = window.RTCPeerConnection.prototype[method];
|
||
-
|
||
- var methodObj = _defineProperty({}, method, function () {
|
||
- arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);
|
||
- return nativeMethod.apply(this, arguments);
|
||
- });
|
||
-
|
||
- window.RTCPeerConnection.prototype[method] = methodObj[method];
|
||
- });
|
||
- }
|
||
-
|
||
- var modernStatsTypes = {
|
||
- inboundrtp: 'inbound-rtp',
|
||
- outboundrtp: 'outbound-rtp',
|
||
- candidatepair: 'candidate-pair',
|
||
- localcandidate: 'local-candidate',
|
||
- remotecandidate: 'remote-candidate'
|
||
- };
|
||
- var nativeGetStats = window.RTCPeerConnection.prototype.getStats;
|
||
-
|
||
- window.RTCPeerConnection.prototype.getStats = function getStats() {
|
||
- var [selector, onSucc, onErr] = arguments;
|
||
- return nativeGetStats.apply(this, [selector || null]).then(function (stats) {
|
||
- if (browserDetails.version < 53 && !onSucc) {
|
||
- // Shim only promise getStats with spec-hyphens in type names
|
||
- // Leave callback version alone; misc old uses of forEach before Map
|
||
- try {
|
||
- stats.forEach(function (stat) {
|
||
- stat.type = modernStatsTypes[stat.type] || stat.type;
|
||
- });
|
||
- } catch (e) {
|
||
- if (e.name !== 'TypeError') {
|
||
- throw e;
|
||
- } // Avoid TypeError: "type" is read-only, in old versions. 34-43ish
|
||
-
|
||
-
|
||
- stats.forEach(function (stat, i) {
|
||
- stats.set(i, Object.assign({}, stat, {
|
||
- type: modernStatsTypes[stat.type] || stat.type
|
||
- }));
|
||
- });
|
||
- }
|
||
- }
|
||
-
|
||
- return stats;
|
||
- }).then(onSucc, onErr);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimSenderGetStats(window) {
|
||
- if (!(_typeof(window) === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origGetSenders = window.RTCPeerConnection.prototype.getSenders;
|
||
-
|
||
- if (origGetSenders) {
|
||
- window.RTCPeerConnection.prototype.getSenders = function getSenders() {
|
||
- var _this = this;
|
||
-
|
||
- var senders = origGetSenders.apply(this, []);
|
||
- senders.forEach(function (sender) {
|
||
- return sender._pc = _this;
|
||
- });
|
||
- return senders;
|
||
- };
|
||
- }
|
||
-
|
||
- var origAddTrack = window.RTCPeerConnection.prototype.addTrack;
|
||
-
|
||
- if (origAddTrack) {
|
||
- window.RTCPeerConnection.prototype.addTrack = function addTrack() {
|
||
- var sender = origAddTrack.apply(this, arguments);
|
||
- sender._pc = this;
|
||
- return sender;
|
||
- };
|
||
- }
|
||
-
|
||
- window.RTCRtpSender.prototype.getStats = function getStats() {
|
||
- return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map());
|
||
- };
|
||
-}
|
||
-
|
||
-function shimReceiverGetStats(window) {
|
||
- if (!(_typeof(window) === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;
|
||
-
|
||
- if (origGetReceivers) {
|
||
- window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {
|
||
- var _this2 = this;
|
||
-
|
||
- var receivers = origGetReceivers.apply(this, []);
|
||
- receivers.forEach(function (receiver) {
|
||
- return receiver._pc = _this2;
|
||
- });
|
||
- return receivers;
|
||
- };
|
||
- }
|
||
-
|
||
- utils.wrapPeerConnectionEvent(window, 'track', function (e) {
|
||
- e.receiver._pc = e.srcElement;
|
||
- return e;
|
||
- });
|
||
-
|
||
- window.RTCRtpReceiver.prototype.getStats = function getStats() {
|
||
- return this._pc.getStats(this.track);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimRemoveStream(window) {
|
||
- if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) {
|
||
- return;
|
||
- }
|
||
-
|
||
- window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {
|
||
- var _this3 = this;
|
||
-
|
||
- utils.deprecated('removeStream', 'removeTrack');
|
||
- this.getSenders().forEach(function (sender) {
|
||
- if (sender.track && stream.getTracks().includes(sender.track)) {
|
||
- _this3.removeTrack(sender);
|
||
- }
|
||
- });
|
||
- };
|
||
-}
|
||
-
|
||
-function shimRTCDataChannel(window) {
|
||
- // rename DataChannel to RTCDataChannel (native fix in FF60):
|
||
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851
|
||
- if (window.DataChannel && !window.RTCDataChannel) {
|
||
- window.RTCDataChannel = window.DataChannel;
|
||
- }
|
||
-}
|
||
-
|
||
-function shimAddTransceiver(window) {
|
||
- // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647
|
||
- // Firefox ignores the init sendEncodings options passed to addTransceiver
|
||
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918
|
||
- if (!(_typeof(window) === 'object' && window.RTCPeerConnection)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;
|
||
-
|
||
- if (origAddTransceiver) {
|
||
- window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() {
|
||
- this.setParametersPromises = [];
|
||
- var initParameters = arguments[1];
|
||
- var shouldPerformCheck = initParameters && 'sendEncodings' in initParameters;
|
||
-
|
||
- if (shouldPerformCheck) {
|
||
- // If sendEncodings params are provided, validate grammar
|
||
- initParameters.sendEncodings.forEach(function (encodingParam) {
|
||
- if ('rid' in encodingParam) {
|
||
- var ridRegex = /^[a-z0-9]{0,16}$/i;
|
||
-
|
||
- if (!ridRegex.test(encodingParam.rid)) {
|
||
- throw new TypeError('Invalid RID value provided.');
|
||
- }
|
||
- }
|
||
-
|
||
- if ('scaleResolutionDownBy' in encodingParam) {
|
||
- if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) {
|
||
- throw new RangeError('scale_resolution_down_by must be >= 1.0');
|
||
- }
|
||
- }
|
||
-
|
||
- if ('maxFramerate' in encodingParam) {
|
||
- if (!(parseFloat(encodingParam.maxFramerate) >= 0)) {
|
||
- throw new RangeError('max_framerate must be >= 0.0');
|
||
- }
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- var transceiver = origAddTransceiver.apply(this, arguments);
|
||
-
|
||
- if (shouldPerformCheck) {
|
||
- // Check if the init options were applied. If not we do this in an
|
||
- // asynchronous way and save the promise reference in a global object.
|
||
- // This is an ugly hack, but at the same time is way more robust than
|
||
- // checking the sender parameters before and after the createOffer
|
||
- // Also note that after the createoffer we are not 100% sure that
|
||
- // the params were asynchronously applied so we might miss the
|
||
- // opportunity to recreate offer.
|
||
- var {
|
||
- sender: sender
|
||
- } = transceiver;
|
||
- var params = sender.getParameters();
|
||
-
|
||
- if (!('encodings' in params) || // Avoid being fooled by patched getParameters() below.
|
||
- params.encodings.length === 1 && Object.keys(params.encodings[0]).length === 0) {
|
||
- params.encodings = initParameters.sendEncodings;
|
||
- sender.sendEncodings = initParameters.sendEncodings;
|
||
- this.setParametersPromises.push(sender.setParameters(params).then(function () {
|
||
- delete sender.sendEncodings;
|
||
- }).catch(function () {
|
||
- delete sender.sendEncodings;
|
||
- }));
|
||
- }
|
||
- }
|
||
-
|
||
- return transceiver;
|
||
- };
|
||
- }
|
||
-}
|
||
-
|
||
-function shimGetParameters(window) {
|
||
- if (!(_typeof(window) === 'object' && window.RTCRtpSender)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origGetParameters = window.RTCRtpSender.prototype.getParameters;
|
||
-
|
||
- if (origGetParameters) {
|
||
- window.RTCRtpSender.prototype.getParameters = function getParameters() {
|
||
- var params = origGetParameters.apply(this, arguments);
|
||
-
|
||
- if (!('encodings' in params)) {
|
||
- params.encodings = [].concat(this.sendEncodings || [{}]);
|
||
- }
|
||
-
|
||
- return params;
|
||
- };
|
||
- }
|
||
-}
|
||
-
|
||
-function shimCreateOffer(window) {
|
||
- // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647
|
||
- // Firefox ignores the init sendEncodings options passed to addTransceiver
|
||
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918
|
||
- if (!(_typeof(window) === 'object' && window.RTCPeerConnection)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;
|
||
-
|
||
- window.RTCPeerConnection.prototype.createOffer = function createOffer() {
|
||
- var _arguments = arguments,
|
||
- _this4 = this;
|
||
-
|
||
- if (this.setParametersPromises && this.setParametersPromises.length) {
|
||
- return Promise.all(this.setParametersPromises).then(function () {
|
||
- return origCreateOffer.apply(_this4, _arguments);
|
||
- }).finally(function () {
|
||
- _this4.setParametersPromises = [];
|
||
- });
|
||
- }
|
||
-
|
||
- return origCreateOffer.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimCreateAnswer(window) {
|
||
- // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647
|
||
- // Firefox ignores the init sendEncodings options passed to addTransceiver
|
||
- // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918
|
||
- if (!(_typeof(window) === 'object' && window.RTCPeerConnection)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;
|
||
-
|
||
- window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {
|
||
- var _arguments2 = arguments,
|
||
- _this5 = this;
|
||
-
|
||
- if (this.setParametersPromises && this.setParametersPromises.length) {
|
||
- return Promise.all(this.setParametersPromises).then(function () {
|
||
- return origCreateAnswer.apply(_this5, _arguments2);
|
||
- }).finally(function () {
|
||
- _this5.setParametersPromises = [];
|
||
- });
|
||
- }
|
||
-
|
||
- return origCreateAnswer.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-},{"../utils":"iSxC","./getusermedia":"GzSv","./getdisplaymedia":"UuGU"}],"t1lL":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimLocalStreamsAPI = shimLocalStreamsAPI;
|
||
-exports.shimRemoteStreamsAPI = shimRemoteStreamsAPI;
|
||
-exports.shimCallbacksAPI = shimCallbacksAPI;
|
||
-exports.shimGetUserMedia = shimGetUserMedia;
|
||
-exports.shimConstraints = shimConstraints;
|
||
-exports.shimRTCIceServerUrls = shimRTCIceServerUrls;
|
||
-exports.shimTrackEventTransceiver = shimTrackEventTransceiver;
|
||
-exports.shimCreateOfferLegacy = shimCreateOfferLegacy;
|
||
-exports.shimAudioContext = shimAudioContext;
|
||
-
|
||
-var utils = _interopRequireWildcard(require("../utils"));
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-function shimLocalStreamsAPI(window) {
|
||
- if (_typeof(window) !== 'object' || !window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) {
|
||
- window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {
|
||
- if (!this._localStreams) {
|
||
- this._localStreams = [];
|
||
- }
|
||
-
|
||
- return this._localStreams;
|
||
- };
|
||
- }
|
||
-
|
||
- if (!('addStream' in window.RTCPeerConnection.prototype)) {
|
||
- var _addTrack = window.RTCPeerConnection.prototype.addTrack;
|
||
-
|
||
- window.RTCPeerConnection.prototype.addStream = function addStream(stream) {
|
||
- var _this = this;
|
||
-
|
||
- if (!this._localStreams) {
|
||
- this._localStreams = [];
|
||
- }
|
||
-
|
||
- if (!this._localStreams.includes(stream)) {
|
||
- this._localStreams.push(stream);
|
||
- } // Try to emulate Chrome's behaviour of adding in audio-video order.
|
||
- // Safari orders by track id.
|
||
-
|
||
-
|
||
- stream.getAudioTracks().forEach(function (track) {
|
||
- return _addTrack.call(_this, track, stream);
|
||
- });
|
||
- stream.getVideoTracks().forEach(function (track) {
|
||
- return _addTrack.call(_this, track, stream);
|
||
- });
|
||
- };
|
||
-
|
||
- window.RTCPeerConnection.prototype.addTrack = function addTrack(track) {
|
||
- var _this2 = this;
|
||
-
|
||
- for (var _len = arguments.length, streams = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
- streams[_key - 1] = arguments[_key];
|
||
- }
|
||
-
|
||
- if (streams) {
|
||
- streams.forEach(function (stream) {
|
||
- if (!_this2._localStreams) {
|
||
- _this2._localStreams = [stream];
|
||
- } else if (!_this2._localStreams.includes(stream)) {
|
||
- _this2._localStreams.push(stream);
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- return _addTrack.apply(this, arguments);
|
||
- };
|
||
- }
|
||
-
|
||
- if (!('removeStream' in window.RTCPeerConnection.prototype)) {
|
||
- window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {
|
||
- var _this3 = this;
|
||
-
|
||
- if (!this._localStreams) {
|
||
- this._localStreams = [];
|
||
- }
|
||
-
|
||
- var index = this._localStreams.indexOf(stream);
|
||
-
|
||
- if (index === -1) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this._localStreams.splice(index, 1);
|
||
-
|
||
- var tracks = stream.getTracks();
|
||
- this.getSenders().forEach(function (sender) {
|
||
- if (tracks.includes(sender.track)) {
|
||
- _this3.removeTrack(sender);
|
||
- }
|
||
- });
|
||
- };
|
||
- }
|
||
-}
|
||
-
|
||
-function shimRemoteStreamsAPI(window) {
|
||
- if (_typeof(window) !== 'object' || !window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) {
|
||
- window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() {
|
||
- return this._remoteStreams ? this._remoteStreams : [];
|
||
- };
|
||
- }
|
||
-
|
||
- if (!('onaddstream' in window.RTCPeerConnection.prototype)) {
|
||
- Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', {
|
||
- get: function () {
|
||
- return this._onaddstream;
|
||
- },
|
||
- set: function (f) {
|
||
- var _this4 = this;
|
||
-
|
||
- if (this._onaddstream) {
|
||
- this.removeEventListener('addstream', this._onaddstream);
|
||
- this.removeEventListener('track', this._onaddstreampoly);
|
||
- }
|
||
-
|
||
- this.addEventListener('addstream', this._onaddstream = f);
|
||
- this.addEventListener('track', this._onaddstreampoly = function (e) {
|
||
- e.streams.forEach(function (stream) {
|
||
- if (!_this4._remoteStreams) {
|
||
- _this4._remoteStreams = [];
|
||
- }
|
||
-
|
||
- if (_this4._remoteStreams.includes(stream)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- _this4._remoteStreams.push(stream);
|
||
-
|
||
- var event = new Event('addstream');
|
||
- event.stream = stream;
|
||
-
|
||
- _this4.dispatchEvent(event);
|
||
- });
|
||
- });
|
||
- }
|
||
- });
|
||
- var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;
|
||
-
|
||
- window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {
|
||
- var pc = this;
|
||
-
|
||
- if (!this._onaddstreampoly) {
|
||
- this.addEventListener('track', this._onaddstreampoly = function (e) {
|
||
- e.streams.forEach(function (stream) {
|
||
- if (!pc._remoteStreams) {
|
||
- pc._remoteStreams = [];
|
||
- }
|
||
-
|
||
- if (pc._remoteStreams.indexOf(stream) >= 0) {
|
||
- return;
|
||
- }
|
||
-
|
||
- pc._remoteStreams.push(stream);
|
||
-
|
||
- var event = new Event('addstream');
|
||
- event.stream = stream;
|
||
- pc.dispatchEvent(event);
|
||
- });
|
||
- });
|
||
- }
|
||
-
|
||
- return origSetRemoteDescription.apply(pc, arguments);
|
||
- };
|
||
- }
|
||
-}
|
||
-
|
||
-function shimCallbacksAPI(window) {
|
||
- if (_typeof(window) !== 'object' || !window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var prototype = window.RTCPeerConnection.prototype;
|
||
- var origCreateOffer = prototype.createOffer;
|
||
- var origCreateAnswer = prototype.createAnswer;
|
||
- var setLocalDescription = prototype.setLocalDescription;
|
||
- var setRemoteDescription = prototype.setRemoteDescription;
|
||
- var addIceCandidate = prototype.addIceCandidate;
|
||
-
|
||
- prototype.createOffer = function createOffer(successCallback, failureCallback) {
|
||
- var options = arguments.length >= 2 ? arguments[2] : arguments[0];
|
||
- var promise = origCreateOffer.apply(this, [options]);
|
||
-
|
||
- if (!failureCallback) {
|
||
- return promise;
|
||
- }
|
||
-
|
||
- promise.then(successCallback, failureCallback);
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- prototype.createAnswer = function createAnswer(successCallback, failureCallback) {
|
||
- var options = arguments.length >= 2 ? arguments[2] : arguments[0];
|
||
- var promise = origCreateAnswer.apply(this, [options]);
|
||
-
|
||
- if (!failureCallback) {
|
||
- return promise;
|
||
- }
|
||
-
|
||
- promise.then(successCallback, failureCallback);
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- var withCallback = function (description, successCallback, failureCallback) {
|
||
- var promise = setLocalDescription.apply(this, [description]);
|
||
-
|
||
- if (!failureCallback) {
|
||
- return promise;
|
||
- }
|
||
-
|
||
- promise.then(successCallback, failureCallback);
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- prototype.setLocalDescription = withCallback;
|
||
-
|
||
- withCallback = function (description, successCallback, failureCallback) {
|
||
- var promise = setRemoteDescription.apply(this, [description]);
|
||
-
|
||
- if (!failureCallback) {
|
||
- return promise;
|
||
- }
|
||
-
|
||
- promise.then(successCallback, failureCallback);
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- prototype.setRemoteDescription = withCallback;
|
||
-
|
||
- withCallback = function (candidate, successCallback, failureCallback) {
|
||
- var promise = addIceCandidate.apply(this, [candidate]);
|
||
-
|
||
- if (!failureCallback) {
|
||
- return promise;
|
||
- }
|
||
-
|
||
- promise.then(successCallback, failureCallback);
|
||
- return Promise.resolve();
|
||
- };
|
||
-
|
||
- prototype.addIceCandidate = withCallback;
|
||
-}
|
||
-
|
||
-function shimGetUserMedia(window) {
|
||
- var navigator = window && window.navigator;
|
||
-
|
||
- if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
||
- // shim not needed in Safari 12.1
|
||
- var mediaDevices = navigator.mediaDevices;
|
||
-
|
||
- var _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices);
|
||
-
|
||
- navigator.mediaDevices.getUserMedia = function (constraints) {
|
||
- return _getUserMedia(shimConstraints(constraints));
|
||
- };
|
||
- }
|
||
-
|
||
- if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) {
|
||
- navigator.getUserMedia = function getUserMedia(constraints, cb, errcb) {
|
||
- navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb);
|
||
- }.bind(navigator);
|
||
- }
|
||
-}
|
||
-
|
||
-function shimConstraints(constraints) {
|
||
- if (constraints && constraints.video !== undefined) {
|
||
- return Object.assign({}, constraints, {
|
||
- video: utils.compactObject(constraints.video)
|
||
- });
|
||
- }
|
||
-
|
||
- return constraints;
|
||
-}
|
||
-
|
||
-function shimRTCIceServerUrls(window) {
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- } // migrate from non-spec RTCIceServer.url to RTCIceServer.urls
|
||
-
|
||
-
|
||
- var OrigPeerConnection = window.RTCPeerConnection;
|
||
-
|
||
- window.RTCPeerConnection = function RTCPeerConnection(pcConfig, pcConstraints) {
|
||
- if (pcConfig && pcConfig.iceServers) {
|
||
- var newIceServers = [];
|
||
-
|
||
- for (var i = 0; i < pcConfig.iceServers.length; i++) {
|
||
- var server = pcConfig.iceServers[i];
|
||
-
|
||
- if (!server.hasOwnProperty('urls') && server.hasOwnProperty('url')) {
|
||
- utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls');
|
||
- server = JSON.parse(JSON.stringify(server));
|
||
- server.urls = server.url;
|
||
- delete server.url;
|
||
- newIceServers.push(server);
|
||
- } else {
|
||
- newIceServers.push(pcConfig.iceServers[i]);
|
||
- }
|
||
- }
|
||
-
|
||
- pcConfig.iceServers = newIceServers;
|
||
- }
|
||
-
|
||
- return new OrigPeerConnection(pcConfig, pcConstraints);
|
||
- };
|
||
-
|
||
- window.RTCPeerConnection.prototype = OrigPeerConnection.prototype; // wrap static methods. Currently just generateCertificate.
|
||
-
|
||
- if ('generateCertificate' in OrigPeerConnection) {
|
||
- Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {
|
||
- get: function () {
|
||
- return OrigPeerConnection.generateCertificate;
|
||
- }
|
||
- });
|
||
- }
|
||
-}
|
||
-
|
||
-function shimTrackEventTransceiver(window) {
|
||
- // Add event.transceiver member over deprecated event.receiver
|
||
- if (_typeof(window) === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) {
|
||
- Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {
|
||
- get: function () {
|
||
- return {
|
||
- receiver: this.receiver
|
||
- };
|
||
- }
|
||
- });
|
||
- }
|
||
-}
|
||
-
|
||
-function shimCreateOfferLegacy(window) {
|
||
- var origCreateOffer = window.RTCPeerConnection.prototype.createOffer;
|
||
-
|
||
- window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) {
|
||
- if (offerOptions) {
|
||
- if (typeof offerOptions.offerToReceiveAudio !== 'undefined') {
|
||
- // support bit values
|
||
- offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;
|
||
- }
|
||
-
|
||
- var audioTransceiver = this.getTransceivers().find(function (transceiver) {
|
||
- return transceiver.receiver.track.kind === 'audio';
|
||
- });
|
||
-
|
||
- if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {
|
||
- if (audioTransceiver.direction === 'sendrecv') {
|
||
- if (audioTransceiver.setDirection) {
|
||
- audioTransceiver.setDirection('sendonly');
|
||
- } else {
|
||
- audioTransceiver.direction = 'sendonly';
|
||
- }
|
||
- } else if (audioTransceiver.direction === 'recvonly') {
|
||
- if (audioTransceiver.setDirection) {
|
||
- audioTransceiver.setDirection('inactive');
|
||
- } else {
|
||
- audioTransceiver.direction = 'inactive';
|
||
- }
|
||
- }
|
||
- } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) {
|
||
- this.addTransceiver('audio');
|
||
- }
|
||
-
|
||
- if (typeof offerOptions.offerToReceiveVideo !== 'undefined') {
|
||
- // support bit values
|
||
- offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;
|
||
- }
|
||
-
|
||
- var videoTransceiver = this.getTransceivers().find(function (transceiver) {
|
||
- return transceiver.receiver.track.kind === 'video';
|
||
- });
|
||
-
|
||
- if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {
|
||
- if (videoTransceiver.direction === 'sendrecv') {
|
||
- if (videoTransceiver.setDirection) {
|
||
- videoTransceiver.setDirection('sendonly');
|
||
- } else {
|
||
- videoTransceiver.direction = 'sendonly';
|
||
- }
|
||
- } else if (videoTransceiver.direction === 'recvonly') {
|
||
- if (videoTransceiver.setDirection) {
|
||
- videoTransceiver.setDirection('inactive');
|
||
- } else {
|
||
- videoTransceiver.direction = 'inactive';
|
||
- }
|
||
- }
|
||
- } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) {
|
||
- this.addTransceiver('video');
|
||
- }
|
||
- }
|
||
-
|
||
- return origCreateOffer.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimAudioContext(window) {
|
||
- if (_typeof(window) !== 'object' || window.AudioContext) {
|
||
- return;
|
||
- }
|
||
-
|
||
- window.AudioContext = window.webkitAudioContext;
|
||
-}
|
||
-},{"../utils":"iSxC"}],"GOQK":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.shimRTCIceCandidate = shimRTCIceCandidate;
|
||
-exports.shimMaxMessageSize = shimMaxMessageSize;
|
||
-exports.shimSendThrowTypeError = shimSendThrowTypeError;
|
||
-exports.shimConnectionState = shimConnectionState;
|
||
-exports.removeExtmapAllowMixed = removeExtmapAllowMixed;
|
||
-exports.shimAddIceCandidateNullOrEmpty = shimAddIceCandidateNullOrEmpty;
|
||
-
|
||
-var _sdp = _interopRequireDefault(require("sdp"));
|
||
-
|
||
-var utils = _interopRequireWildcard(require("./utils"));
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
||
-
|
||
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function (obj) { return typeof obj; }; } else { _typeof = function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
|
||
-
|
||
-function shimRTCIceCandidate(window) {
|
||
- // foundation is arbitrarily chosen as an indicator for full support for
|
||
- // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface
|
||
- if (!window.RTCIceCandidate || window.RTCIceCandidate && 'foundation' in window.RTCIceCandidate.prototype) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var NativeRTCIceCandidate = window.RTCIceCandidate;
|
||
-
|
||
- window.RTCIceCandidate = function RTCIceCandidate(args) {
|
||
- // Remove the a= which shouldn't be part of the candidate string.
|
||
- if (_typeof(args) === 'object' && args.candidate && args.candidate.indexOf('a=') === 0) {
|
||
- args = JSON.parse(JSON.stringify(args));
|
||
- args.candidate = args.candidate.substr(2);
|
||
- }
|
||
-
|
||
- if (args.candidate && args.candidate.length) {
|
||
- // Augment the native candidate with the parsed fields.
|
||
- var nativeCandidate = new NativeRTCIceCandidate(args);
|
||
-
|
||
- var parsedCandidate = _sdp.default.parseCandidate(args.candidate);
|
||
-
|
||
- var augmentedCandidate = Object.assign(nativeCandidate, parsedCandidate); // Add a serializer that does not serialize the extra attributes.
|
||
-
|
||
- augmentedCandidate.toJSON = function toJSON() {
|
||
- return {
|
||
- candidate: augmentedCandidate.candidate,
|
||
- sdpMid: augmentedCandidate.sdpMid,
|
||
- sdpMLineIndex: augmentedCandidate.sdpMLineIndex,
|
||
- usernameFragment: augmentedCandidate.usernameFragment
|
||
- };
|
||
- };
|
||
-
|
||
- return augmentedCandidate;
|
||
- }
|
||
-
|
||
- return new NativeRTCIceCandidate(args);
|
||
- };
|
||
-
|
||
- window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype; // Hook up the augmented candidate in onicecandidate and
|
||
- // addEventListener('icecandidate', ...)
|
||
-
|
||
- utils.wrapPeerConnectionEvent(window, 'icecandidate', function (e) {
|
||
- if (e.candidate) {
|
||
- Object.defineProperty(e, 'candidate', {
|
||
- value: new window.RTCIceCandidate(e.candidate),
|
||
- writable: 'false'
|
||
- });
|
||
- }
|
||
-
|
||
- return e;
|
||
- });
|
||
-}
|
||
-
|
||
-function shimMaxMessageSize(window, browserDetails) {
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!('sctp' in window.RTCPeerConnection.prototype)) {
|
||
- Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {
|
||
- get: function () {
|
||
- return typeof this._sctp === 'undefined' ? null : this._sctp;
|
||
- }
|
||
- });
|
||
- }
|
||
-
|
||
- var sctpInDescription = function (description) {
|
||
- if (!description || !description.sdp) {
|
||
- return false;
|
||
- }
|
||
-
|
||
- var sections = _sdp.default.splitSections(description.sdp);
|
||
-
|
||
- sections.shift();
|
||
- return sections.some(function (mediaSection) {
|
||
- var mLine = _sdp.default.parseMLine(mediaSection);
|
||
-
|
||
- return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1;
|
||
- });
|
||
- };
|
||
-
|
||
- var getRemoteFirefoxVersion = function (description) {
|
||
- // TODO: Is there a better solution for detecting Firefox?
|
||
- var match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);
|
||
-
|
||
- if (match === null || match.length < 2) {
|
||
- return -1;
|
||
- }
|
||
-
|
||
- var version = parseInt(match[1], 10); // Test for NaN (yes, this is ugly)
|
||
-
|
||
- return version !== version ? -1 : version;
|
||
- };
|
||
-
|
||
- var getCanSendMaxMessageSize = function (remoteIsFirefox) {
|
||
- // Every implementation we know can send at least 64 KiB.
|
||
- // Note: Although Chrome is technically able to send up to 256 KiB, the
|
||
- // data does not reach the other peer reliably.
|
||
- // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419
|
||
- var canSendMaxMessageSize = 65536;
|
||
-
|
||
- if (browserDetails.browser === 'firefox') {
|
||
- if (browserDetails.version < 57) {
|
||
- if (remoteIsFirefox === -1) {
|
||
- // FF < 57 will send in 16 KiB chunks using the deprecated PPID
|
||
- // fragmentation.
|
||
- canSendMaxMessageSize = 16384;
|
||
- } else {
|
||
- // However, other FF (and RAWRTC) can reassemble PPID-fragmented
|
||
- // messages. Thus, supporting ~2 GiB when sending.
|
||
- canSendMaxMessageSize = 2147483637;
|
||
- }
|
||
- } else if (browserDetails.version < 60) {
|
||
- // Currently, all FF >= 57 will reset the remote maximum message size
|
||
- // to the default value when a data channel is created at a later
|
||
- // stage. :(
|
||
- // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831
|
||
- canSendMaxMessageSize = browserDetails.version === 57 ? 65535 : 65536;
|
||
- } else {
|
||
- // FF >= 60 supports sending ~2 GiB
|
||
- canSendMaxMessageSize = 2147483637;
|
||
- }
|
||
- }
|
||
-
|
||
- return canSendMaxMessageSize;
|
||
- };
|
||
-
|
||
- var getMaxMessageSize = function (description, remoteIsFirefox) {
|
||
- // Note: 65536 bytes is the default value from the SDP spec. Also,
|
||
- // every implementation we know supports receiving 65536 bytes.
|
||
- var maxMessageSize = 65536; // FF 57 has a slightly incorrect default remote max message size, so
|
||
- // we need to adjust it here to avoid a failure when sending.
|
||
- // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697
|
||
-
|
||
- if (browserDetails.browser === 'firefox' && browserDetails.version === 57) {
|
||
- maxMessageSize = 65535;
|
||
- }
|
||
-
|
||
- var match = _sdp.default.matchPrefix(description.sdp, 'a=max-message-size:');
|
||
-
|
||
- if (match.length > 0) {
|
||
- maxMessageSize = parseInt(match[0].substr(19), 10);
|
||
- } else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) {
|
||
- // If the maximum message size is not present in the remote SDP and
|
||
- // both local and remote are Firefox, the remote peer can receive
|
||
- // ~2 GiB.
|
||
- maxMessageSize = 2147483637;
|
||
- }
|
||
-
|
||
- return maxMessageSize;
|
||
- };
|
||
-
|
||
- var origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;
|
||
-
|
||
- window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {
|
||
- this._sctp = null; // Chrome decided to not expose .sctp in plan-b mode.
|
||
- // As usual, adapter.js has to do an 'ugly worakaround'
|
||
- // to cover up the mess.
|
||
-
|
||
- if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) {
|
||
- var {
|
||
- sdpSemantics: sdpSemantics
|
||
- } = this.getConfiguration();
|
||
-
|
||
- if (sdpSemantics === 'plan-b') {
|
||
- Object.defineProperty(this, 'sctp', {
|
||
- get: function () {
|
||
- return typeof this._sctp === 'undefined' ? null : this._sctp;
|
||
- },
|
||
- enumerable: true,
|
||
- configurable: true
|
||
- });
|
||
- }
|
||
- }
|
||
-
|
||
- if (sctpInDescription(arguments[0])) {
|
||
- // Check if the remote is FF.
|
||
- var isFirefox = getRemoteFirefoxVersion(arguments[0]); // Get the maximum message size the local peer is capable of sending
|
||
-
|
||
- var canSendMMS = getCanSendMaxMessageSize(isFirefox); // Get the maximum message size of the remote peer.
|
||
-
|
||
- var remoteMMS = getMaxMessageSize(arguments[0], isFirefox); // Determine final maximum message size
|
||
-
|
||
- var maxMessageSize;
|
||
-
|
||
- if (canSendMMS === 0 && remoteMMS === 0) {
|
||
- maxMessageSize = Number.POSITIVE_INFINITY;
|
||
- } else if (canSendMMS === 0 || remoteMMS === 0) {
|
||
- maxMessageSize = Math.max(canSendMMS, remoteMMS);
|
||
- } else {
|
||
- maxMessageSize = Math.min(canSendMMS, remoteMMS);
|
||
- } // Create a dummy RTCSctpTransport object and the 'maxMessageSize'
|
||
- // attribute.
|
||
-
|
||
-
|
||
- var sctp = {};
|
||
- Object.defineProperty(sctp, 'maxMessageSize', {
|
||
- get: function () {
|
||
- return maxMessageSize;
|
||
- }
|
||
- });
|
||
- this._sctp = sctp;
|
||
- }
|
||
-
|
||
- return origSetRemoteDescription.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimSendThrowTypeError(window) {
|
||
- if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) {
|
||
- return;
|
||
- } // Note: Although Firefox >= 57 has a native implementation, the maximum
|
||
- // message size can be reset for all data channels at a later stage.
|
||
- // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831
|
||
-
|
||
-
|
||
- function wrapDcSend(dc, pc) {
|
||
- var origDataChannelSend = dc.send;
|
||
-
|
||
- dc.send = function send() {
|
||
- var data = arguments[0];
|
||
- var length = data.length || data.size || data.byteLength;
|
||
-
|
||
- if (dc.readyState === 'open' && pc.sctp && length > pc.sctp.maxMessageSize) {
|
||
- throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)');
|
||
- }
|
||
-
|
||
- return origDataChannelSend.apply(dc, arguments);
|
||
- };
|
||
- }
|
||
-
|
||
- var origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel;
|
||
-
|
||
- window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() {
|
||
- var dataChannel = origCreateDataChannel.apply(this, arguments);
|
||
- wrapDcSend(dataChannel, this);
|
||
- return dataChannel;
|
||
- };
|
||
-
|
||
- utils.wrapPeerConnectionEvent(window, 'datachannel', function (e) {
|
||
- wrapDcSend(e.channel, e.target);
|
||
- return e;
|
||
- });
|
||
-}
|
||
-/* shims RTCConnectionState by pretending it is the same as iceConnectionState.
|
||
- * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12
|
||
- * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect
|
||
- * since DTLS failures would be hidden. See
|
||
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827
|
||
- * for the Firefox tracking bug.
|
||
- */
|
||
-
|
||
-
|
||
-function shimConnectionState(window) {
|
||
- if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var proto = window.RTCPeerConnection.prototype;
|
||
- Object.defineProperty(proto, 'connectionState', {
|
||
- get: function () {
|
||
- return {
|
||
- completed: 'connected',
|
||
- checking: 'connecting'
|
||
- }[this.iceConnectionState] || this.iceConnectionState;
|
||
- },
|
||
- enumerable: true,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(proto, 'onconnectionstatechange', {
|
||
- get: function () {
|
||
- return this._onconnectionstatechange || null;
|
||
- },
|
||
- set: function (cb) {
|
||
- if (this._onconnectionstatechange) {
|
||
- this.removeEventListener('connectionstatechange', this._onconnectionstatechange);
|
||
- delete this._onconnectionstatechange;
|
||
- }
|
||
-
|
||
- if (cb) {
|
||
- this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb);
|
||
- }
|
||
- },
|
||
- enumerable: true,
|
||
- configurable: true
|
||
- });
|
||
- ['setLocalDescription', 'setRemoteDescription'].forEach(function (method) {
|
||
- var origMethod = proto[method];
|
||
-
|
||
- proto[method] = function () {
|
||
- if (!this._connectionstatechangepoly) {
|
||
- this._connectionstatechangepoly = function (e) {
|
||
- var pc = e.target;
|
||
-
|
||
- if (pc._lastConnectionState !== pc.connectionState) {
|
||
- pc._lastConnectionState = pc.connectionState;
|
||
- var newEvent = new Event('connectionstatechange', e);
|
||
- pc.dispatchEvent(newEvent);
|
||
- }
|
||
-
|
||
- return e;
|
||
- };
|
||
-
|
||
- this.addEventListener('iceconnectionstatechange', this._connectionstatechangepoly);
|
||
- }
|
||
-
|
||
- return origMethod.apply(this, arguments);
|
||
- };
|
||
- });
|
||
-}
|
||
-
|
||
-function removeExtmapAllowMixed(window, browserDetails) {
|
||
- /* remove a=extmap-allow-mixed for webrtc.org < M71 */
|
||
- if (!window.RTCPeerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (browserDetails.browser === 'safari' && browserDetails.version >= 605) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;
|
||
-
|
||
- window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription(desc) {
|
||
- if (desc && desc.sdp && desc.sdp.indexOf('\na=extmap-allow-mixed') !== -1) {
|
||
- var sdp = desc.sdp.split('\n').filter(function (line) {
|
||
- return line.trim() !== 'a=extmap-allow-mixed';
|
||
- }).join('\n'); // Safari enforces read-only-ness of RTCSessionDescription fields.
|
||
-
|
||
- if (window.RTCSessionDescription && desc instanceof window.RTCSessionDescription) {
|
||
- arguments[0] = new window.RTCSessionDescription({
|
||
- type: desc.type,
|
||
- sdp: sdp
|
||
- });
|
||
- } else {
|
||
- desc.sdp = sdp;
|
||
- }
|
||
- }
|
||
-
|
||
- return nativeSRD.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-
|
||
-function shimAddIceCandidateNullOrEmpty(window, browserDetails) {
|
||
- // Support for addIceCandidate(null or undefined)
|
||
- // as well as addIceCandidate({candidate: "", ...})
|
||
- // https://bugs.chromium.org/p/chromium/issues/detail?id=978582
|
||
- // Note: must be called before other polyfills which change the signature.
|
||
- if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;
|
||
-
|
||
- if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) {
|
||
- return;
|
||
- }
|
||
-
|
||
- window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {
|
||
- if (!arguments[0]) {
|
||
- if (arguments[1]) {
|
||
- arguments[1].apply(null);
|
||
- }
|
||
-
|
||
- return Promise.resolve();
|
||
- } // Firefox 68+ emits and processes {candidate: "", ...}, ignore
|
||
- // in older versions.
|
||
- // Native support for ignoring exists for Chrome M77+.
|
||
- // Safari ignores as well, exact version unknown but works in the same
|
||
- // version that also ignores addIceCandidate(null).
|
||
-
|
||
-
|
||
- if ((browserDetails.browser === 'chrome' && browserDetails.version < 78 || browserDetails.browser === 'firefox' && browserDetails.version < 68 || browserDetails.browser === 'safari') && arguments[0] && arguments[0].candidate === '') {
|
||
- return Promise.resolve();
|
||
- }
|
||
-
|
||
- return nativeAddIceCandidate.apply(this, arguments);
|
||
- };
|
||
-}
|
||
-},{"sdp":"YHvh","./utils":"iSxC"}],"KtlG":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.adapterFactory = adapterFactory;
|
||
-
|
||
-var utils = _interopRequireWildcard(require("./utils"));
|
||
-
|
||
-var chromeShim = _interopRequireWildcard(require("./chrome/chrome_shim"));
|
||
-
|
||
-var edgeShim = _interopRequireWildcard(require("./edge/edge_shim"));
|
||
-
|
||
-var firefoxShim = _interopRequireWildcard(require("./firefox/firefox_shim"));
|
||
-
|
||
-var safariShim = _interopRequireWildcard(require("./safari/safari_shim"));
|
||
-
|
||
-var commonShim = _interopRequireWildcard(require("./common_shim"));
|
||
-
|
||
-function _getRequireWildcardCache() { if (typeof WeakMap !== "function") return null; var cache = new WeakMap(); _getRequireWildcardCache = function () { return cache; }; return cache; }
|
||
-
|
||
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
||
-
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-// Browser shims.
|
||
-// Shimming starts here.
|
||
-function adapterFactory() {
|
||
- var {
|
||
- window: window
|
||
- } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
||
- var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
|
||
- shimChrome: true,
|
||
- shimFirefox: true,
|
||
- shimEdge: true,
|
||
- shimSafari: true
|
||
- };
|
||
- // Utils.
|
||
- var logging = utils.log;
|
||
- var browserDetails = utils.detectBrowser(window);
|
||
- var adapter = {
|
||
- browserDetails: browserDetails,
|
||
- commonShim: commonShim,
|
||
- extractVersion: utils.extractVersion,
|
||
- disableLog: utils.disableLog,
|
||
- disableWarnings: utils.disableWarnings
|
||
- }; // Shim browser if found.
|
||
-
|
||
- switch (browserDetails.browser) {
|
||
- case 'chrome':
|
||
- if (!chromeShim || !chromeShim.shimPeerConnection || !options.shimChrome) {
|
||
- logging('Chrome shim is not included in this adapter release.');
|
||
- return adapter;
|
||
- }
|
||
-
|
||
- if (browserDetails.version === null) {
|
||
- logging('Chrome shim can not determine version, not shimming.');
|
||
- return adapter;
|
||
- }
|
||
-
|
||
- logging('adapter.js shimming chrome.'); // Export to the adapter global object visible in the browser.
|
||
-
|
||
- adapter.browserShim = chromeShim; // Must be called before shimPeerConnection.
|
||
-
|
||
- commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);
|
||
- chromeShim.shimGetUserMedia(window, browserDetails);
|
||
- chromeShim.shimMediaStream(window, browserDetails);
|
||
- chromeShim.shimPeerConnection(window, browserDetails);
|
||
- chromeShim.shimOnTrack(window, browserDetails);
|
||
- chromeShim.shimAddTrackRemoveTrack(window, browserDetails);
|
||
- chromeShim.shimGetSendersWithDtmf(window, browserDetails);
|
||
- chromeShim.shimGetStats(window, browserDetails);
|
||
- chromeShim.shimSenderReceiverGetStats(window, browserDetails);
|
||
- chromeShim.fixNegotiationNeeded(window, browserDetails);
|
||
- commonShim.shimRTCIceCandidate(window, browserDetails);
|
||
- commonShim.shimConnectionState(window, browserDetails);
|
||
- commonShim.shimMaxMessageSize(window, browserDetails);
|
||
- commonShim.shimSendThrowTypeError(window, browserDetails);
|
||
- commonShim.removeExtmapAllowMixed(window, browserDetails);
|
||
- break;
|
||
-
|
||
- case 'firefox':
|
||
- if (!firefoxShim || !firefoxShim.shimPeerConnection || !options.shimFirefox) {
|
||
- logging('Firefox shim is not included in this adapter release.');
|
||
- return adapter;
|
||
- }
|
||
-
|
||
- logging('adapter.js shimming firefox.'); // Export to the adapter global object visible in the browser.
|
||
-
|
||
- adapter.browserShim = firefoxShim; // Must be called before shimPeerConnection.
|
||
-
|
||
- commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);
|
||
- firefoxShim.shimGetUserMedia(window, browserDetails);
|
||
- firefoxShim.shimPeerConnection(window, browserDetails);
|
||
- firefoxShim.shimOnTrack(window, browserDetails);
|
||
- firefoxShim.shimRemoveStream(window, browserDetails);
|
||
- firefoxShim.shimSenderGetStats(window, browserDetails);
|
||
- firefoxShim.shimReceiverGetStats(window, browserDetails);
|
||
- firefoxShim.shimRTCDataChannel(window, browserDetails);
|
||
- firefoxShim.shimAddTransceiver(window, browserDetails);
|
||
- firefoxShim.shimGetParameters(window, browserDetails);
|
||
- firefoxShim.shimCreateOffer(window, browserDetails);
|
||
- firefoxShim.shimCreateAnswer(window, browserDetails);
|
||
- commonShim.shimRTCIceCandidate(window, browserDetails);
|
||
- commonShim.shimConnectionState(window, browserDetails);
|
||
- commonShim.shimMaxMessageSize(window, browserDetails);
|
||
- commonShim.shimSendThrowTypeError(window, browserDetails);
|
||
- break;
|
||
-
|
||
- case 'edge':
|
||
- if (!edgeShim || !edgeShim.shimPeerConnection || !options.shimEdge) {
|
||
- logging('MS edge shim is not included in this adapter release.');
|
||
- return adapter;
|
||
- }
|
||
-
|
||
- logging('adapter.js shimming edge.'); // Export to the adapter global object visible in the browser.
|
||
-
|
||
- adapter.browserShim = edgeShim;
|
||
- edgeShim.shimGetUserMedia(window, browserDetails);
|
||
- edgeShim.shimGetDisplayMedia(window, browserDetails);
|
||
- edgeShim.shimPeerConnection(window, browserDetails);
|
||
- edgeShim.shimReplaceTrack(window, browserDetails); // the edge shim implements the full RTCIceCandidate object.
|
||
-
|
||
- commonShim.shimMaxMessageSize(window, browserDetails);
|
||
- commonShim.shimSendThrowTypeError(window, browserDetails);
|
||
- break;
|
||
-
|
||
- case 'safari':
|
||
- if (!safariShim || !options.shimSafari) {
|
||
- logging('Safari shim is not included in this adapter release.');
|
||
- return adapter;
|
||
- }
|
||
-
|
||
- logging('adapter.js shimming safari.'); // Export to the adapter global object visible in the browser.
|
||
-
|
||
- adapter.browserShim = safariShim; // Must be called before shimCallbackAPI.
|
||
-
|
||
- commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails);
|
||
- safariShim.shimRTCIceServerUrls(window, browserDetails);
|
||
- safariShim.shimCreateOfferLegacy(window, browserDetails);
|
||
- safariShim.shimCallbacksAPI(window, browserDetails);
|
||
- safariShim.shimLocalStreamsAPI(window, browserDetails);
|
||
- safariShim.shimRemoteStreamsAPI(window, browserDetails);
|
||
- safariShim.shimTrackEventTransceiver(window, browserDetails);
|
||
- safariShim.shimGetUserMedia(window, browserDetails);
|
||
- safariShim.shimAudioContext(window, browserDetails);
|
||
- commonShim.shimRTCIceCandidate(window, browserDetails);
|
||
- commonShim.shimMaxMessageSize(window, browserDetails);
|
||
- commonShim.shimSendThrowTypeError(window, browserDetails);
|
||
- commonShim.removeExtmapAllowMixed(window, browserDetails);
|
||
- break;
|
||
-
|
||
- default:
|
||
- logging('Unsupported browser!');
|
||
- break;
|
||
- }
|
||
-
|
||
- return adapter;
|
||
-}
|
||
-},{"./utils":"iSxC","./chrome/chrome_shim":"uI5X","./edge/edge_shim":"XRic","./firefox/firefox_shim":"Fzdr","./safari/safari_shim":"t1lL","./common_shim":"GOQK"}],"tI1X":[function(require,module,exports) {
|
||
-/*
|
||
- * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.
|
||
- *
|
||
- * Use of this source code is governed by a BSD-style license
|
||
- * that can be found in the LICENSE file in the root of the source
|
||
- * tree.
|
||
- */
|
||
-
|
||
-/* eslint-env node */
|
||
-'use strict';
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.default = void 0;
|
||
-
|
||
-var _adapter_factory = require("./adapter_factory.js");
|
||
-
|
||
-var adapter = (0, _adapter_factory.adapterFactory)({
|
||
- window: typeof window === 'undefined' ? undefined : window
|
||
-});
|
||
-var _default = adapter;
|
||
-exports.default = _default;
|
||
-},{"./adapter_factory.js":"KtlG"}],"sXtV":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.webRTCAdapter = void 0;
|
||
-
|
||
-var webrtc_adapter_1 = __importDefault(require("webrtc-adapter"));
|
||
-
|
||
-exports.webRTCAdapter = webrtc_adapter_1.default;
|
||
-},{"webrtc-adapter":"tI1X"}],"I31f":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.Supports = void 0;
|
||
-
|
||
-var adapter_1 = require("./adapter");
|
||
-
|
||
-exports.Supports = new (
|
||
-/** @class */
|
||
-function () {
|
||
- function class_1() {
|
||
- this.isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);
|
||
- this.supportedBrowsers = ['firefox', 'chrome', 'safari'];
|
||
- this.minFirefoxVersion = 59;
|
||
- this.minChromeVersion = 72;
|
||
- this.minSafariVersion = 605;
|
||
- }
|
||
-
|
||
- class_1.prototype.isWebRTCSupported = function () {
|
||
- return typeof RTCPeerConnection !== 'undefined';
|
||
- };
|
||
-
|
||
- class_1.prototype.isBrowserSupported = function () {
|
||
- var browser = this.getBrowser();
|
||
- var version = this.getVersion();
|
||
- var validBrowser = this.supportedBrowsers.includes(browser);
|
||
- if (!validBrowser) return false;
|
||
- if (browser === 'chrome') return version >= this.minChromeVersion;
|
||
- if (browser === 'firefox') return version >= this.minFirefoxVersion;
|
||
- if (browser === 'safari') return !this.isIOS && version >= this.minSafariVersion;
|
||
- return false;
|
||
- };
|
||
-
|
||
- class_1.prototype.getBrowser = function () {
|
||
- return adapter_1.webRTCAdapter.browserDetails.browser;
|
||
- };
|
||
-
|
||
- class_1.prototype.getVersion = function () {
|
||
- return adapter_1.webRTCAdapter.browserDetails.version || 0;
|
||
- };
|
||
-
|
||
- 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 (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;
|
||
- var tempPc;
|
||
- var supported = false;
|
||
-
|
||
- try {
|
||
- tempPc = new RTCPeerConnection();
|
||
- tempPc.addTransceiver('audio');
|
||
- supported = true;
|
||
- } catch (e) {} finally {
|
||
- if (tempPc) {
|
||
- tempPc.close();
|
||
- }
|
||
- }
|
||
-
|
||
- return supported;
|
||
- };
|
||
-
|
||
- 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 class_1;
|
||
-}())();
|
||
-},{"./adapter":"sXtV"}],"BHXf":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __createBinding = this && this.__createBinding || (Object.create ? function (o, m, k, k2) {
|
||
- if (k2 === undefined) k2 = k;
|
||
- Object.defineProperty(o, k2, {
|
||
- enumerable: true,
|
||
- get: function get() {
|
||
- return m[k];
|
||
- }
|
||
- });
|
||
-} : function (o, m, k, k2) {
|
||
- if (k2 === undefined) k2 = k;
|
||
- o[k2] = m[k];
|
||
-});
|
||
-
|
||
-var __setModuleDefault = this && this.__setModuleDefault || (Object.create ? function (o, v) {
|
||
- Object.defineProperty(o, "default", {
|
||
- enumerable: true,
|
||
- value: v
|
||
- });
|
||
-} : function (o, v) {
|
||
- o["default"] = v;
|
||
-});
|
||
-
|
||
-var __importStar = this && this.__importStar || function (mod) {
|
||
- if (mod && mod.__esModule) return mod;
|
||
- var result = {};
|
||
- if (mod != null) for (var k in mod) {
|
||
- if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||
- }
|
||
-
|
||
- __setModuleDefault(result, mod);
|
||
-
|
||
- return result;
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.util = void 0;
|
||
-
|
||
-var BinaryPack = __importStar(require("peerjs-js-binarypack"));
|
||
-
|
||
-var supports_1 = require("./supports");
|
||
-
|
||
-var DEFAULT_CONFIG = {
|
||
- iceServers: [{
|
||
- urls: "stun:stun.l.google.com:19302"
|
||
- }, {
|
||
- urls: "turn:0.peerjs.com:3478",
|
||
- username: "peerjs",
|
||
- credential: "peerjsp"
|
||
- }],
|
||
- sdpSemantics: "unified-plan"
|
||
-};
|
||
-exports.util = new (
|
||
-/** @class */
|
||
-function () {
|
||
- function class_1() {
|
||
- this.CLOUD_HOST = "0.peerjs.com";
|
||
- this.CLOUD_PORT = 443; // Browsers that need chunking:
|
||
-
|
||
- this.chunkedBrowsers = {
|
||
- Chrome: 1,
|
||
- chrome: 1
|
||
- };
|
||
- this.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.
|
||
- // Returns browser-agnostic default config
|
||
-
|
||
- this.defaultConfig = DEFAULT_CONFIG;
|
||
- this.browser = supports_1.Supports.getBrowser();
|
||
- this.browserVersion = supports_1.Supports.getVersion(); // Lists which features are supported
|
||
-
|
||
- this.supports = function () {
|
||
- var supported = {
|
||
- browser: supports_1.Supports.isBrowserSupported(),
|
||
- webRTC: supports_1.Supports.isWebRTCSupported(),
|
||
- audioVideo: false,
|
||
- data: false,
|
||
- binaryBlob: false,
|
||
- reliable: false
|
||
- };
|
||
- if (!supported.webRTC) return supported;
|
||
- var pc;
|
||
-
|
||
- try {
|
||
- pc = new RTCPeerConnection(DEFAULT_CONFIG);
|
||
- supported.audioVideo = true;
|
||
- var dc = void 0;
|
||
-
|
||
- try {
|
||
- dc = pc.createDataChannel("_PEERJSTEST", {
|
||
- ordered: true
|
||
- });
|
||
- supported.data = true;
|
||
- supported.reliable = !!dc.ordered; // Binary test
|
||
-
|
||
- try {
|
||
- dc.binaryType = "blob";
|
||
- supported.binaryBlob = !supports_1.Supports.isIOS;
|
||
- } catch (e) {}
|
||
- } catch (e) {} finally {
|
||
- if (dc) {
|
||
- dc.close();
|
||
- }
|
||
- }
|
||
- } catch (e) {} finally {
|
||
- if (pc) {
|
||
- pc.close();
|
||
- }
|
||
- }
|
||
-
|
||
- return supported;
|
||
- }();
|
||
-
|
||
- this.pack = BinaryPack.pack;
|
||
- this.unpack = BinaryPack.unpack; // Binary stuff
|
||
-
|
||
- this._dataCount = 1;
|
||
- }
|
||
-
|
||
- class_1.prototype.noop = function () {}; // Ensure alphanumeric ids
|
||
-
|
||
-
|
||
- class_1.prototype.validateId = function (id) {
|
||
- // Allow empty ids
|
||
- return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);
|
||
- };
|
||
-
|
||
- class_1.prototype.chunk = function (blob) {
|
||
- var chunks = [];
|
||
- var size = blob.size;
|
||
- var total = Math.ceil(size / exports.util.chunkedMTU);
|
||
- var index = 0;
|
||
- var start = 0;
|
||
-
|
||
- while (start < size) {
|
||
- var end = Math.min(size, start + exports.util.chunkedMTU);
|
||
- var b = blob.slice(start, end);
|
||
- var chunk = {
|
||
- __peerData: this._dataCount,
|
||
- n: index,
|
||
- data: b,
|
||
- total: total
|
||
- };
|
||
- chunks.push(chunk);
|
||
- start = end;
|
||
- index++;
|
||
- }
|
||
-
|
||
- this._dataCount++;
|
||
- return chunks;
|
||
- };
|
||
-
|
||
- class_1.prototype.blobToArrayBuffer = function (blob, cb) {
|
||
- var fr = new FileReader();
|
||
-
|
||
- fr.onload = function (evt) {
|
||
- if (evt.target) {
|
||
- cb(evt.target.result);
|
||
- }
|
||
- };
|
||
-
|
||
- fr.readAsArrayBuffer(blob);
|
||
- return fr;
|
||
- };
|
||
-
|
||
- class_1.prototype.binaryStringToArrayBuffer = function (binary) {
|
||
- var byteArray = new Uint8Array(binary.length);
|
||
-
|
||
- for (var i = 0; i < binary.length; i++) {
|
||
- byteArray[i] = binary.charCodeAt(i) & 0xff;
|
||
- }
|
||
-
|
||
- return byteArray.buffer;
|
||
- };
|
||
-
|
||
- class_1.prototype.randomToken = function () {
|
||
- return Math.random().toString(36).substr(2);
|
||
- };
|
||
-
|
||
- class_1.prototype.isSecure = function () {
|
||
- return location.protocol === "https:";
|
||
- };
|
||
-
|
||
- return class_1;
|
||
-}())();
|
||
-},{"peerjs-js-binarypack":"kdPp","./supports":"I31f"}],"JJlS":[function(require,module,exports) {
|
||
-'use strict';
|
||
-
|
||
-var has = Object.prototype.hasOwnProperty
|
||
- , prefix = '~';
|
||
-
|
||
-/**
|
||
- * Constructor to create a storage for our `EE` objects.
|
||
- * An `Events` instance is a plain object whose properties are event names.
|
||
- *
|
||
- * @constructor
|
||
- * @private
|
||
- */
|
||
-function Events() {}
|
||
-
|
||
-//
|
||
-// We try to not inherit from `Object.prototype`. In some engines creating an
|
||
-// instance in this way is faster than calling `Object.create(null)` directly.
|
||
-// If `Object.create(null)` is not supported we prefix the event names with a
|
||
-// character to make sure that the built-in object properties are not
|
||
-// overridden or used as an attack vector.
|
||
-//
|
||
-if (Object.create) {
|
||
- Events.prototype = Object.create(null);
|
||
-
|
||
- //
|
||
- // This hack is needed because the `__proto__` property is still inherited in
|
||
- // some old browsers like Android 4, iPhone 5.1, Opera 11 and Safari 5.
|
||
- //
|
||
- if (!new Events().__proto__) prefix = false;
|
||
-}
|
||
-
|
||
-/**
|
||
- * Representation of a single event listener.
|
||
- *
|
||
- * @param {Function} fn The listener function.
|
||
- * @param {*} context The context to invoke the listener with.
|
||
- * @param {Boolean} [once=false] Specify if the listener is a one-time listener.
|
||
- * @constructor
|
||
- * @private
|
||
- */
|
||
-function EE(fn, context, once) {
|
||
- this.fn = fn;
|
||
- this.context = context;
|
||
- this.once = once || false;
|
||
-}
|
||
-
|
||
-/**
|
||
- * Add a listener for a given event.
|
||
- *
|
||
- * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @param {Function} fn The listener function.
|
||
- * @param {*} context The context to invoke the listener with.
|
||
- * @param {Boolean} once Specify if the listener is a one-time listener.
|
||
- * @returns {EventEmitter}
|
||
- * @private
|
||
- */
|
||
-function addListener(emitter, event, fn, context, once) {
|
||
- if (typeof fn !== 'function') {
|
||
- throw new TypeError('The listener must be a function');
|
||
- }
|
||
-
|
||
- var listener = new EE(fn, context || emitter, once)
|
||
- , evt = prefix ? prefix + event : event;
|
||
-
|
||
- if (!emitter._events[evt]) emitter._events[evt] = listener, emitter._eventsCount++;
|
||
- else if (!emitter._events[evt].fn) emitter._events[evt].push(listener);
|
||
- else emitter._events[evt] = [emitter._events[evt], listener];
|
||
-
|
||
- return emitter;
|
||
-}
|
||
-
|
||
-/**
|
||
- * Clear event by name.
|
||
- *
|
||
- * @param {EventEmitter} emitter Reference to the `EventEmitter` instance.
|
||
- * @param {(String|Symbol)} evt The Event name.
|
||
- * @private
|
||
- */
|
||
-function clearEvent(emitter, evt) {
|
||
- if (--emitter._eventsCount === 0) emitter._events = new Events();
|
||
- else delete emitter._events[evt];
|
||
-}
|
||
-
|
||
-/**
|
||
- * Minimal `EventEmitter` interface that is molded against the Node.js
|
||
- * `EventEmitter` interface.
|
||
- *
|
||
- * @constructor
|
||
- * @public
|
||
- */
|
||
-function EventEmitter() {
|
||
- this._events = new Events();
|
||
- this._eventsCount = 0;
|
||
-}
|
||
-
|
||
-/**
|
||
- * Return an array listing the events for which the emitter has registered
|
||
- * listeners.
|
||
- *
|
||
- * @returns {Array}
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.eventNames = function eventNames() {
|
||
- var names = []
|
||
- , events
|
||
- , name;
|
||
-
|
||
- if (this._eventsCount === 0) return names;
|
||
-
|
||
- for (name in (events = this._events)) {
|
||
- if (has.call(events, name)) names.push(prefix ? name.slice(1) : name);
|
||
- }
|
||
-
|
||
- if (Object.getOwnPropertySymbols) {
|
||
- return names.concat(Object.getOwnPropertySymbols(events));
|
||
- }
|
||
-
|
||
- return names;
|
||
-};
|
||
-
|
||
-/**
|
||
- * Return the listeners registered for a given event.
|
||
- *
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @returns {Array} The registered listeners.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.listeners = function listeners(event) {
|
||
- var evt = prefix ? prefix + event : event
|
||
- , handlers = this._events[evt];
|
||
-
|
||
- if (!handlers) return [];
|
||
- if (handlers.fn) return [handlers.fn];
|
||
-
|
||
- for (var i = 0, l = handlers.length, ee = new Array(l); i < l; i++) {
|
||
- ee[i] = handlers[i].fn;
|
||
- }
|
||
-
|
||
- return ee;
|
||
-};
|
||
-
|
||
-/**
|
||
- * Return the number of listeners listening to a given event.
|
||
- *
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @returns {Number} The number of listeners.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.listenerCount = function listenerCount(event) {
|
||
- var evt = prefix ? prefix + event : event
|
||
- , listeners = this._events[evt];
|
||
-
|
||
- if (!listeners) return 0;
|
||
- if (listeners.fn) return 1;
|
||
- return listeners.length;
|
||
-};
|
||
-
|
||
-/**
|
||
- * Calls each of the listeners registered for a given event.
|
||
- *
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @returns {Boolean} `true` if the event had listeners, else `false`.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.emit = function emit(event, a1, a2, a3, a4, a5) {
|
||
- var evt = prefix ? prefix + event : event;
|
||
-
|
||
- if (!this._events[evt]) return false;
|
||
-
|
||
- var listeners = this._events[evt]
|
||
- , len = arguments.length
|
||
- , args
|
||
- , i;
|
||
-
|
||
- if (listeners.fn) {
|
||
- if (listeners.once) this.removeListener(event, listeners.fn, undefined, true);
|
||
-
|
||
- switch (len) {
|
||
- case 1: return listeners.fn.call(listeners.context), true;
|
||
- case 2: return listeners.fn.call(listeners.context, a1), true;
|
||
- case 3: return listeners.fn.call(listeners.context, a1, a2), true;
|
||
- case 4: return listeners.fn.call(listeners.context, a1, a2, a3), true;
|
||
- case 5: return listeners.fn.call(listeners.context, a1, a2, a3, a4), true;
|
||
- case 6: return listeners.fn.call(listeners.context, a1, a2, a3, a4, a5), true;
|
||
- }
|
||
-
|
||
- for (i = 1, args = new Array(len -1); i < len; i++) {
|
||
- args[i - 1] = arguments[i];
|
||
- }
|
||
-
|
||
- listeners.fn.apply(listeners.context, args);
|
||
- } else {
|
||
- var length = listeners.length
|
||
- , j;
|
||
-
|
||
- for (i = 0; i < length; i++) {
|
||
- if (listeners[i].once) this.removeListener(event, listeners[i].fn, undefined, true);
|
||
-
|
||
- switch (len) {
|
||
- case 1: listeners[i].fn.call(listeners[i].context); break;
|
||
- case 2: listeners[i].fn.call(listeners[i].context, a1); break;
|
||
- case 3: listeners[i].fn.call(listeners[i].context, a1, a2); break;
|
||
- case 4: listeners[i].fn.call(listeners[i].context, a1, a2, a3); break;
|
||
- default:
|
||
- if (!args) for (j = 1, args = new Array(len -1); j < len; j++) {
|
||
- args[j - 1] = arguments[j];
|
||
- }
|
||
-
|
||
- listeners[i].fn.apply(listeners[i].context, args);
|
||
- }
|
||
- }
|
||
- }
|
||
-
|
||
- return true;
|
||
-};
|
||
-
|
||
-/**
|
||
- * Add a listener for a given event.
|
||
- *
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @param {Function} fn The listener function.
|
||
- * @param {*} [context=this] The context to invoke the listener with.
|
||
- * @returns {EventEmitter} `this`.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.on = function on(event, fn, context) {
|
||
- return addListener(this, event, fn, context, false);
|
||
-};
|
||
-
|
||
-/**
|
||
- * Add a one-time listener for a given event.
|
||
- *
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @param {Function} fn The listener function.
|
||
- * @param {*} [context=this] The context to invoke the listener with.
|
||
- * @returns {EventEmitter} `this`.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.once = function once(event, fn, context) {
|
||
- return addListener(this, event, fn, context, true);
|
||
-};
|
||
-
|
||
-/**
|
||
- * Remove the listeners of a given event.
|
||
- *
|
||
- * @param {(String|Symbol)} event The event name.
|
||
- * @param {Function} fn Only remove the listeners that match this function.
|
||
- * @param {*} context Only remove the listeners that have this context.
|
||
- * @param {Boolean} once Only remove one-time listeners.
|
||
- * @returns {EventEmitter} `this`.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.removeListener = function removeListener(event, fn, context, once) {
|
||
- var evt = prefix ? prefix + event : event;
|
||
-
|
||
- if (!this._events[evt]) return this;
|
||
- if (!fn) {
|
||
- clearEvent(this, evt);
|
||
- return this;
|
||
- }
|
||
-
|
||
- var listeners = this._events[evt];
|
||
-
|
||
- if (listeners.fn) {
|
||
- if (
|
||
- listeners.fn === fn &&
|
||
- (!once || listeners.once) &&
|
||
- (!context || listeners.context === context)
|
||
- ) {
|
||
- clearEvent(this, evt);
|
||
- }
|
||
- } else {
|
||
- for (var i = 0, events = [], length = listeners.length; i < length; i++) {
|
||
- if (
|
||
- listeners[i].fn !== fn ||
|
||
- (once && !listeners[i].once) ||
|
||
- (context && listeners[i].context !== context)
|
||
- ) {
|
||
- events.push(listeners[i]);
|
||
- }
|
||
- }
|
||
-
|
||
- //
|
||
- // Reset the array, or remove it completely if we have no more listeners.
|
||
- //
|
||
- if (events.length) this._events[evt] = events.length === 1 ? events[0] : events;
|
||
- else clearEvent(this, evt);
|
||
- }
|
||
-
|
||
- return this;
|
||
-};
|
||
-
|
||
-/**
|
||
- * Remove all listeners, or those of the specified event.
|
||
- *
|
||
- * @param {(String|Symbol)} [event] The event name.
|
||
- * @returns {EventEmitter} `this`.
|
||
- * @public
|
||
- */
|
||
-EventEmitter.prototype.removeAllListeners = function removeAllListeners(event) {
|
||
- var evt;
|
||
-
|
||
- if (event) {
|
||
- evt = prefix ? prefix + event : event;
|
||
- if (this._events[evt]) clearEvent(this, evt);
|
||
- } else {
|
||
- this._events = new Events();
|
||
- this._eventsCount = 0;
|
||
- }
|
||
-
|
||
- return this;
|
||
-};
|
||
-
|
||
-//
|
||
-// Alias methods names because people roll like that.
|
||
-//
|
||
-EventEmitter.prototype.off = EventEmitter.prototype.removeListener;
|
||
-EventEmitter.prototype.addListener = EventEmitter.prototype.on;
|
||
-
|
||
-//
|
||
-// Expose the prefix.
|
||
-//
|
||
-EventEmitter.prefixed = prefix;
|
||
-
|
||
-//
|
||
-// Allow `EventEmitter` to be imported as module namespace.
|
||
-//
|
||
-EventEmitter.EventEmitter = EventEmitter;
|
||
-
|
||
-//
|
||
-// Expose the module.
|
||
-//
|
||
-if ('undefined' !== typeof module) {
|
||
- module.exports = EventEmitter;
|
||
-}
|
||
-
|
||
-},{}],"WOs9":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __read = this && this.__read || function (o, n) {
|
||
- var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||
- if (!m) return o;
|
||
- var i = m.call(o),
|
||
- r,
|
||
- ar = [],
|
||
- e;
|
||
-
|
||
- try {
|
||
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {
|
||
- ar.push(r.value);
|
||
- }
|
||
- } catch (error) {
|
||
- e = {
|
||
- error: error
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (r && !r.done && (m = i["return"])) m.call(i);
|
||
- } finally {
|
||
- if (e) throw e.error;
|
||
- }
|
||
- }
|
||
-
|
||
- 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];
|
||
- }
|
||
-
|
||
- return to;
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-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.
|
||
-*/
|
||
-
|
||
-var LogLevel;
|
||
-
|
||
-(function (LogLevel) {
|
||
- LogLevel[LogLevel["Disabled"] = 0] = "Disabled";
|
||
- LogLevel[LogLevel["Errors"] = 1] = "Errors";
|
||
- LogLevel[LogLevel["Warnings"] = 2] = "Warnings";
|
||
- LogLevel[LogLevel["All"] = 3] = "All";
|
||
-})(LogLevel = exports.LogLevel || (exports.LogLevel = {}));
|
||
-
|
||
-var Logger =
|
||
-/** @class */
|
||
-function () {
|
||
- function Logger() {
|
||
- this._logLevel = LogLevel.Disabled;
|
||
- }
|
||
-
|
||
- Object.defineProperty(Logger.prototype, "logLevel", {
|
||
- get: function get() {
|
||
- return this._logLevel;
|
||
- },
|
||
- set: function set(logLevel) {
|
||
- this._logLevel = logLevel;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
-
|
||
- Logger.prototype.log = function () {
|
||
- var args = [];
|
||
-
|
||
- for (var _i = 0; _i < arguments.length; _i++) {
|
||
- args[_i] = arguments[_i];
|
||
- }
|
||
-
|
||
- if (this._logLevel >= LogLevel.All) {
|
||
- this._print.apply(this, __spreadArray([LogLevel.All], __read(args)));
|
||
- }
|
||
- };
|
||
-
|
||
- Logger.prototype.warn = function () {
|
||
- var args = [];
|
||
-
|
||
- for (var _i = 0; _i < arguments.length; _i++) {
|
||
- args[_i] = arguments[_i];
|
||
- }
|
||
-
|
||
- if (this._logLevel >= LogLevel.Warnings) {
|
||
- this._print.apply(this, __spreadArray([LogLevel.Warnings], __read(args)));
|
||
- }
|
||
- };
|
||
-
|
||
- Logger.prototype.error = function () {
|
||
- var args = [];
|
||
-
|
||
- for (var _i = 0; _i < arguments.length; _i++) {
|
||
- args[_i] = arguments[_i];
|
||
- }
|
||
-
|
||
- if (this._logLevel >= LogLevel.Errors) {
|
||
- this._print.apply(this, __spreadArray([LogLevel.Errors], __read(args)));
|
||
- }
|
||
- };
|
||
-
|
||
- Logger.prototype.setLogFunction = function (fn) {
|
||
- this._print = fn;
|
||
- };
|
||
-
|
||
- Logger.prototype._print = function (logLevel) {
|
||
- var rest = [];
|
||
-
|
||
- for (var _i = 1; _i < arguments.length; _i++) {
|
||
- rest[_i - 1] = arguments[_i];
|
||
- }
|
||
-
|
||
- var copy = __spreadArray([LOG_PREFIX], __read(rest));
|
||
-
|
||
- for (var i in copy) {
|
||
- if (copy[i] instanceof Error) {
|
||
- copy[i] = "(" + copy[i].name + ") " + copy[i].message;
|
||
- }
|
||
- }
|
||
-
|
||
- if (logLevel >= LogLevel.All) {
|
||
- console.log.apply(console, __spreadArray([], __read(copy)));
|
||
- } else if (logLevel >= LogLevel.Warnings) {
|
||
- console.warn.apply(console, __spreadArray(["WARNING"], __read(copy)));
|
||
- } else if (logLevel >= LogLevel.Errors) {
|
||
- console.error.apply(console, __spreadArray(["ERROR"], __read(copy)));
|
||
- }
|
||
- };
|
||
-
|
||
- return Logger;
|
||
-}();
|
||
-
|
||
-exports.default = new Logger();
|
||
-},{}],"ZRYf":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.ServerMessageType = exports.SocketEventType = exports.SerializationType = exports.PeerErrorType = exports.PeerEventType = exports.ConnectionType = exports.ConnectionEventType = void 0;
|
||
-var ConnectionEventType;
|
||
-
|
||
-(function (ConnectionEventType) {
|
||
- ConnectionEventType["Open"] = "open";
|
||
- ConnectionEventType["Stream"] = "stream";
|
||
- ConnectionEventType["Data"] = "data";
|
||
- ConnectionEventType["Close"] = "close";
|
||
- ConnectionEventType["Error"] = "error";
|
||
- ConnectionEventType["IceStateChanged"] = "iceStateChanged";
|
||
-})(ConnectionEventType = exports.ConnectionEventType || (exports.ConnectionEventType = {}));
|
||
-
|
||
-var ConnectionType;
|
||
-
|
||
-(function (ConnectionType) {
|
||
- ConnectionType["Data"] = "data";
|
||
- ConnectionType["Media"] = "media";
|
||
-})(ConnectionType = exports.ConnectionType || (exports.ConnectionType = {}));
|
||
-
|
||
-var PeerEventType;
|
||
-
|
||
-(function (PeerEventType) {
|
||
- PeerEventType["Open"] = "open";
|
||
- PeerEventType["Close"] = "close";
|
||
- PeerEventType["Connection"] = "connection";
|
||
- PeerEventType["Call"] = "call";
|
||
- PeerEventType["Disconnected"] = "disconnected";
|
||
- PeerEventType["Error"] = "error";
|
||
-})(PeerEventType = exports.PeerEventType || (exports.PeerEventType = {}));
|
||
-
|
||
-var PeerErrorType;
|
||
-
|
||
-(function (PeerErrorType) {
|
||
- PeerErrorType["BrowserIncompatible"] = "browser-incompatible";
|
||
- PeerErrorType["Disconnected"] = "disconnected";
|
||
- PeerErrorType["InvalidID"] = "invalid-id";
|
||
- PeerErrorType["InvalidKey"] = "invalid-key";
|
||
- PeerErrorType["Network"] = "network";
|
||
- PeerErrorType["PeerUnavailable"] = "peer-unavailable";
|
||
- PeerErrorType["SslUnavailable"] = "ssl-unavailable";
|
||
- PeerErrorType["ServerError"] = "server-error";
|
||
- PeerErrorType["SocketError"] = "socket-error";
|
||
- PeerErrorType["SocketClosed"] = "socket-closed";
|
||
- PeerErrorType["UnavailableID"] = "unavailable-id";
|
||
- PeerErrorType["WebRTC"] = "webrtc";
|
||
-})(PeerErrorType = exports.PeerErrorType || (exports.PeerErrorType = {}));
|
||
-
|
||
-var SerializationType;
|
||
-
|
||
-(function (SerializationType) {
|
||
- SerializationType["Binary"] = "binary";
|
||
- SerializationType["BinaryUTF8"] = "binary-utf8";
|
||
- SerializationType["JSON"] = "json";
|
||
-})(SerializationType = exports.SerializationType || (exports.SerializationType = {}));
|
||
-
|
||
-var SocketEventType;
|
||
-
|
||
-(function (SocketEventType) {
|
||
- SocketEventType["Message"] = "message";
|
||
- SocketEventType["Disconnected"] = "disconnected";
|
||
- SocketEventType["Error"] = "error";
|
||
- SocketEventType["Close"] = "close";
|
||
-})(SocketEventType = exports.SocketEventType || (exports.SocketEventType = {}));
|
||
-
|
||
-var ServerMessageType;
|
||
-
|
||
-(function (ServerMessageType) {
|
||
- ServerMessageType["Heartbeat"] = "HEARTBEAT";
|
||
- ServerMessageType["Candidate"] = "CANDIDATE";
|
||
- ServerMessageType["Offer"] = "OFFER";
|
||
- ServerMessageType["Answer"] = "ANSWER";
|
||
- ServerMessageType["Open"] = "OPEN";
|
||
- ServerMessageType["Error"] = "ERROR";
|
||
- ServerMessageType["IdTaken"] = "ID-TAKEN";
|
||
- ServerMessageType["InvalidKey"] = "INVALID-KEY";
|
||
- ServerMessageType["Leave"] = "LEAVE";
|
||
- ServerMessageType["Expire"] = "EXPIRE"; // The offer sent to a peer has expired without response.
|
||
-})(ServerMessageType = exports.ServerMessageType || (exports.ServerMessageType = {}));
|
||
-},{}],"wJlv":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __extends = this && this.__extends || function () {
|
||
- var _extendStatics = function extendStatics(d, b) {
|
||
- _extendStatics = Object.setPrototypeOf || {
|
||
- __proto__: []
|
||
- } instanceof Array && function (d, b) {
|
||
- d.__proto__ = b;
|
||
- } || function (d, b) {
|
||
- for (var p in b) {
|
||
- if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
||
- }
|
||
- };
|
||
-
|
||
- return _extendStatics(d, b);
|
||
- };
|
||
-
|
||
- return function (d, b) {
|
||
- if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
-
|
||
- _extendStatics(d, b);
|
||
-
|
||
- function __() {
|
||
- this.constructor = d;
|
||
- }
|
||
-
|
||
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
- };
|
||
-}();
|
||
-
|
||
-var __read = this && this.__read || function (o, n) {
|
||
- var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||
- if (!m) return o;
|
||
- var i = m.call(o),
|
||
- r,
|
||
- ar = [],
|
||
- e;
|
||
-
|
||
- try {
|
||
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {
|
||
- ar.push(r.value);
|
||
- }
|
||
- } catch (error) {
|
||
- e = {
|
||
- error: error
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (r && !r.done && (m = i["return"])) m.call(i);
|
||
- } finally {
|
||
- if (e) throw e.error;
|
||
- }
|
||
- }
|
||
-
|
||
- 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];
|
||
- }
|
||
-
|
||
- return to;
|
||
-};
|
||
-
|
||
-var __values = this && this.__values || function (o) {
|
||
- var s = typeof Symbol === "function" && Symbol.iterator,
|
||
- m = s && o[s],
|
||
- i = 0;
|
||
- if (m) return m.call(o);
|
||
- if (o && typeof o.length === "number") return {
|
||
- next: function next() {
|
||
- if (o && i >= o.length) o = void 0;
|
||
- return {
|
||
- value: o && o[i++],
|
||
- done: !o
|
||
- };
|
||
- }
|
||
- };
|
||
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||
-};
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.Socket = void 0;
|
||
-
|
||
-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.
|
||
- */
|
||
-
|
||
-
|
||
-var Socket =
|
||
-/** @class */
|
||
-function (_super) {
|
||
- __extends(Socket, _super);
|
||
-
|
||
- function Socket(secure, host, port, path, key, pingInterval) {
|
||
- if (pingInterval === void 0) {
|
||
- pingInterval = 5000;
|
||
- }
|
||
-
|
||
- var _this = _super.call(this) || this;
|
||
-
|
||
- _this.pingInterval = pingInterval;
|
||
- _this._disconnected = true;
|
||
- _this._messagesQueue = [];
|
||
- var wsProtocol = secure ? "wss://" : "ws://";
|
||
- _this._baseUrl = wsProtocol + host + ":" + port + path + "peerjs?key=" + key;
|
||
- return _this;
|
||
- }
|
||
-
|
||
- Socket.prototype.start = function (id, token) {
|
||
- var _this = this;
|
||
-
|
||
- this._id = id;
|
||
- var wsUrl = this._baseUrl + "&id=" + id + "&token=" + token;
|
||
-
|
||
- if (!!this._socket || !this._disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this._socket = new WebSocket(wsUrl);
|
||
- this._disconnected = false;
|
||
-
|
||
- this._socket.onmessage = function (event) {
|
||
- var data;
|
||
-
|
||
- try {
|
||
- data = JSON.parse(event.data);
|
||
- logger_1.default.log("Server message received:", data);
|
||
- } catch (e) {
|
||
- logger_1.default.log("Invalid server message", event.data);
|
||
- return;
|
||
- }
|
||
-
|
||
- _this.emit(enums_1.SocketEventType.Message, data);
|
||
- };
|
||
-
|
||
- this._socket.onclose = function (event) {
|
||
- if (_this._disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- logger_1.default.log("Socket closed.", event);
|
||
-
|
||
- _this._cleanup();
|
||
-
|
||
- _this._disconnected = true;
|
||
-
|
||
- _this.emit(enums_1.SocketEventType.Disconnected);
|
||
- }; // Take care of the queue of connections if necessary and make sure Peer knows
|
||
- // socket is open.
|
||
-
|
||
-
|
||
- this._socket.onopen = function () {
|
||
- if (_this._disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- _this._sendQueuedMessages();
|
||
-
|
||
- logger_1.default.log("Socket open");
|
||
-
|
||
- _this._scheduleHeartbeat();
|
||
- };
|
||
- };
|
||
-
|
||
- Socket.prototype._scheduleHeartbeat = function () {
|
||
- var _this = this;
|
||
-
|
||
- this._wsPingTimer = setTimeout(function () {
|
||
- _this._sendHeartbeat();
|
||
- }, this.pingInterval);
|
||
- };
|
||
-
|
||
- Socket.prototype._sendHeartbeat = function () {
|
||
- if (!this._wsOpen()) {
|
||
- logger_1.default.log("Cannot send heartbeat, because socket closed");
|
||
- return;
|
||
- }
|
||
-
|
||
- var message = JSON.stringify({
|
||
- type: enums_1.ServerMessageType.Heartbeat
|
||
- });
|
||
-
|
||
- this._socket.send(message);
|
||
-
|
||
- this._scheduleHeartbeat();
|
||
- };
|
||
- /** Is the websocket currently open? */
|
||
-
|
||
-
|
||
- Socket.prototype._wsOpen = function () {
|
||
- return !!this._socket && this._socket.readyState === 1;
|
||
- };
|
||
- /** Send queued messages. */
|
||
-
|
||
-
|
||
- Socket.prototype._sendQueuedMessages = function () {
|
||
- var e_1, _a; //Create copy of queue and clear it,
|
||
- //because send method push the message back to queue if smth will go wrong
|
||
-
|
||
-
|
||
- var copiedQueue = __spreadArray([], __read(this._messagesQueue));
|
||
-
|
||
- this._messagesQueue = [];
|
||
-
|
||
- try {
|
||
- for (var copiedQueue_1 = __values(copiedQueue), copiedQueue_1_1 = copiedQueue_1.next(); !copiedQueue_1_1.done; copiedQueue_1_1 = copiedQueue_1.next()) {
|
||
- var message = copiedQueue_1_1.value;
|
||
- this.send(message);
|
||
- }
|
||
- } catch (e_1_1) {
|
||
- e_1 = {
|
||
- error: e_1_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (copiedQueue_1_1 && !copiedQueue_1_1.done && (_a = copiedQueue_1.return)) _a.call(copiedQueue_1);
|
||
- } finally {
|
||
- if (e_1) throw e_1.error;
|
||
- }
|
||
- }
|
||
- };
|
||
- /** Exposed send for DC & Peer. */
|
||
-
|
||
-
|
||
- Socket.prototype.send = function (data) {
|
||
- if (this._disconnected) {
|
||
- return;
|
||
- } // If we didn't get an ID yet, we can't yet send anything so we should queue
|
||
- // up these messages.
|
||
-
|
||
-
|
||
- if (!this._id) {
|
||
- this._messagesQueue.push(data);
|
||
-
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!data.type) {
|
||
- this.emit(enums_1.SocketEventType.Error, "Invalid message");
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!this._wsOpen()) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var message = JSON.stringify(data);
|
||
-
|
||
- this._socket.send(message);
|
||
- };
|
||
-
|
||
- Socket.prototype.close = function () {
|
||
- if (this._disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this._cleanup();
|
||
-
|
||
- this._disconnected = true;
|
||
- };
|
||
-
|
||
- Socket.prototype._cleanup = function () {
|
||
- if (this._socket) {
|
||
- this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;
|
||
-
|
||
- this._socket.close();
|
||
-
|
||
- this._socket = undefined;
|
||
- }
|
||
-
|
||
- clearTimeout(this._wsPingTimer);
|
||
- };
|
||
-
|
||
- return Socket;
|
||
-}(eventemitter3_1.EventEmitter);
|
||
-
|
||
-exports.Socket = Socket;
|
||
-},{"eventemitter3":"JJlS","./logger":"WOs9","./enums":"ZRYf"}],"HCdX":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __assign = this && this.__assign || function () {
|
||
- __assign = Object.assign || function (t) {
|
||
- for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
- s = arguments[i];
|
||
-
|
||
- for (var p in s) {
|
||
- if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
||
- }
|
||
- }
|
||
-
|
||
- return t;
|
||
- };
|
||
-
|
||
- return __assign.apply(this, arguments);
|
||
-};
|
||
-
|
||
-var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) {
|
||
- function adopt(value) {
|
||
- return value instanceof P ? value : new P(function (resolve) {
|
||
- resolve(value);
|
||
- });
|
||
- }
|
||
-
|
||
- return new (P || (P = Promise))(function (resolve, reject) {
|
||
- function fulfilled(value) {
|
||
- try {
|
||
- step(generator.next(value));
|
||
- } catch (e) {
|
||
- reject(e);
|
||
- }
|
||
- }
|
||
-
|
||
- function rejected(value) {
|
||
- try {
|
||
- step(generator["throw"](value));
|
||
- } catch (e) {
|
||
- reject(e);
|
||
- }
|
||
- }
|
||
-
|
||
- function step(result) {
|
||
- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
||
- }
|
||
-
|
||
- step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
- });
|
||
-};
|
||
-
|
||
-var __generator = this && this.__generator || function (thisArg, body) {
|
||
- var _ = {
|
||
- label: 0,
|
||
- sent: function sent() {
|
||
- if (t[0] & 1) throw t[1];
|
||
- return t[1];
|
||
- },
|
||
- trys: [],
|
||
- ops: []
|
||
- },
|
||
- f,
|
||
- y,
|
||
- t,
|
||
- g;
|
||
- return g = {
|
||
- next: verb(0),
|
||
- "throw": verb(1),
|
||
- "return": verb(2)
|
||
- }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
|
||
- return this;
|
||
- }), g;
|
||
-
|
||
- function verb(n) {
|
||
- return function (v) {
|
||
- return step([n, v]);
|
||
- };
|
||
- }
|
||
-
|
||
- function step(op) {
|
||
- if (f) throw new TypeError("Generator is already executing.");
|
||
-
|
||
- while (_) {
|
||
- try {
|
||
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||
- if (y = 0, t) op = [op[0] & 2, t.value];
|
||
-
|
||
- switch (op[0]) {
|
||
- case 0:
|
||
- case 1:
|
||
- t = op;
|
||
- break;
|
||
-
|
||
- case 4:
|
||
- _.label++;
|
||
- return {
|
||
- value: op[1],
|
||
- done: false
|
||
- };
|
||
-
|
||
- case 5:
|
||
- _.label++;
|
||
- y = op[1];
|
||
- op = [0];
|
||
- continue;
|
||
-
|
||
- case 7:
|
||
- op = _.ops.pop();
|
||
-
|
||
- _.trys.pop();
|
||
-
|
||
- continue;
|
||
-
|
||
- default:
|
||
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
||
- _ = 0;
|
||
- continue;
|
||
- }
|
||
-
|
||
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
||
- _.label = op[1];
|
||
- break;
|
||
- }
|
||
-
|
||
- if (op[0] === 6 && _.label < t[1]) {
|
||
- _.label = t[1];
|
||
- t = op;
|
||
- break;
|
||
- }
|
||
-
|
||
- if (t && _.label < t[2]) {
|
||
- _.label = t[2];
|
||
-
|
||
- _.ops.push(op);
|
||
-
|
||
- break;
|
||
- }
|
||
-
|
||
- if (t[2]) _.ops.pop();
|
||
-
|
||
- _.trys.pop();
|
||
-
|
||
- continue;
|
||
- }
|
||
-
|
||
- op = body.call(thisArg, _);
|
||
- } catch (e) {
|
||
- op = [6, e];
|
||
- y = 0;
|
||
- } finally {
|
||
- f = t = 0;
|
||
- }
|
||
- }
|
||
-
|
||
- if (op[0] & 5) throw op[1];
|
||
- return {
|
||
- value: op[0] ? op[1] : void 0,
|
||
- done: true
|
||
- };
|
||
- }
|
||
-};
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.Negotiator = void 0;
|
||
-
|
||
-var util_1 = require("./util");
|
||
-
|
||
-var logger_1 = __importDefault(require("./logger"));
|
||
-
|
||
-var enums_1 = require("./enums");
|
||
-/**
|
||
- * Manages all negotiations between Peers.
|
||
- */
|
||
-
|
||
-
|
||
-var Negotiator =
|
||
-/** @class */
|
||
-function () {
|
||
- function Negotiator(connection) {
|
||
- this.connection = connection;
|
||
- }
|
||
- /** Returns a PeerConnection object set up correctly (for data, media). */
|
||
-
|
||
-
|
||
- Negotiator.prototype.startConnection = function (options) {
|
||
- var peerConnection = this._startPeerConnection(); // Set the connection's PC.
|
||
-
|
||
-
|
||
- this.connection.peerConnection = peerConnection;
|
||
-
|
||
- if (this.connection.type === enums_1.ConnectionType.Media && options._stream) {
|
||
- this._addTracksToConnection(options._stream, peerConnection);
|
||
- } // What do we need to do now?
|
||
-
|
||
-
|
||
- if (options.originator) {
|
||
- if (this.connection.type === enums_1.ConnectionType.Data) {
|
||
- var dataConnection = this.connection;
|
||
- var config = {
|
||
- ordered: !!options.reliable
|
||
- };
|
||
- var dataChannel = peerConnection.createDataChannel(dataConnection.label, config);
|
||
- dataConnection.initialize(dataChannel);
|
||
- }
|
||
-
|
||
- this._makeOffer();
|
||
- } else {
|
||
- this.handleSDP("OFFER", options.sdp);
|
||
- }
|
||
- };
|
||
- /** Start a PC. */
|
||
-
|
||
-
|
||
- Negotiator.prototype._startPeerConnection = function () {
|
||
- logger_1.default.log("Creating RTCPeerConnection.");
|
||
- var peerConnection = new RTCPeerConnection(this.connection.provider.options.config);
|
||
-
|
||
- this._setupListeners(peerConnection);
|
||
-
|
||
- return peerConnection;
|
||
- };
|
||
- /** Set up various WebRTC listeners. */
|
||
-
|
||
-
|
||
- Negotiator.prototype._setupListeners = function (peerConnection) {
|
||
- var _this = this;
|
||
-
|
||
- var peerId = this.connection.peer;
|
||
- var connectionId = this.connection.connectionId;
|
||
- var connectionType = this.connection.type;
|
||
- var provider = this.connection.provider; // ICE CANDIDATES.
|
||
-
|
||
- logger_1.default.log("Listening for ICE candidates.");
|
||
-
|
||
- peerConnection.onicecandidate = function (evt) {
|
||
- if (!evt.candidate || !evt.candidate.candidate) return;
|
||
- logger_1.default.log("Received ICE candidates for " + peerId + ":", evt.candidate);
|
||
- provider.socket.send({
|
||
- type: enums_1.ServerMessageType.Candidate,
|
||
- payload: {
|
||
- candidate: evt.candidate,
|
||
- type: connectionType,
|
||
- connectionId: connectionId
|
||
- },
|
||
- dst: peerId
|
||
- });
|
||
- };
|
||
-
|
||
- peerConnection.oniceconnectionstatechange = function () {
|
||
- switch (peerConnection.iceConnectionState) {
|
||
- case "failed":
|
||
- logger_1.default.log("iceConnectionState is failed, closing connections to " + peerId);
|
||
-
|
||
- _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Negotiation of connection to " + peerId + " failed."));
|
||
-
|
||
- _this.connection.close();
|
||
-
|
||
- break;
|
||
-
|
||
- case "closed":
|
||
- logger_1.default.log("iceConnectionState is closed, closing connections to " + peerId);
|
||
-
|
||
- _this.connection.emit(enums_1.ConnectionEventType.Error, new Error("Connection to " + peerId + " closed."));
|
||
-
|
||
- _this.connection.close();
|
||
-
|
||
- break;
|
||
-
|
||
- case "disconnected":
|
||
- logger_1.default.log("iceConnectionState changed to disconnected on the connection with " + peerId);
|
||
- break;
|
||
-
|
||
- case "completed":
|
||
- peerConnection.onicecandidate = util_1.util.noop;
|
||
- break;
|
||
- }
|
||
-
|
||
- _this.connection.emit(enums_1.ConnectionEventType.IceStateChanged, peerConnection.iceConnectionState);
|
||
- }; // DATACONNECTION.
|
||
-
|
||
-
|
||
- logger_1.default.log("Listening for data channel"); // Fired between offer and answer, so options should already be saved
|
||
- // in the options hash.
|
||
-
|
||
- peerConnection.ondatachannel = function (evt) {
|
||
- logger_1.default.log("Received data channel");
|
||
- var dataChannel = evt.channel;
|
||
- var connection = provider.getConnection(peerId, connectionId);
|
||
- connection.initialize(dataChannel);
|
||
- }; // MEDIACONNECTION.
|
||
-
|
||
-
|
||
- logger_1.default.log("Listening for remote stream");
|
||
-
|
||
- peerConnection.ontrack = function (evt) {
|
||
- logger_1.default.log("Received remote stream");
|
||
- var stream = evt.streams[0];
|
||
- var connection = provider.getConnection(peerId, connectionId);
|
||
-
|
||
- if (connection.type === enums_1.ConnectionType.Media) {
|
||
- var mediaConnection = connection;
|
||
-
|
||
- _this._addStreamToMediaConnection(stream, mediaConnection);
|
||
- }
|
||
- };
|
||
- };
|
||
-
|
||
- Negotiator.prototype.cleanup = function () {
|
||
- logger_1.default.log("Cleaning up PeerConnection to " + this.connection.peer);
|
||
- var peerConnection = this.connection.peerConnection;
|
||
-
|
||
- if (!peerConnection) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this.connection.peerConnection = null; //unsubscribe from all PeerConnection's events
|
||
-
|
||
- peerConnection.onicecandidate = peerConnection.oniceconnectionstatechange = peerConnection.ondatachannel = peerConnection.ontrack = function () {};
|
||
-
|
||
- var peerConnectionNotClosed = peerConnection.signalingState !== "closed";
|
||
- var dataChannelNotClosed = false;
|
||
-
|
||
- if (this.connection.type === enums_1.ConnectionType.Data) {
|
||
- var dataConnection = this.connection;
|
||
- var dataChannel = dataConnection.dataChannel;
|
||
-
|
||
- if (dataChannel) {
|
||
- dataChannelNotClosed = !!dataChannel.readyState && dataChannel.readyState !== "closed";
|
||
- }
|
||
- }
|
||
-
|
||
- if (peerConnectionNotClosed || dataChannelNotClosed) {
|
||
- peerConnection.close();
|
||
- }
|
||
- };
|
||
-
|
||
- Negotiator.prototype._makeOffer = function () {
|
||
- return __awaiter(this, void 0, Promise, function () {
|
||
- var peerConnection, provider, offer, payload, dataConnection, err_2, err_1_1;
|
||
- return __generator(this, function (_a) {
|
||
- switch (_a.label) {
|
||
- case 0:
|
||
- peerConnection = this.connection.peerConnection;
|
||
- provider = this.connection.provider;
|
||
- _a.label = 1;
|
||
-
|
||
- case 1:
|
||
- _a.trys.push([1, 7,, 8]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , peerConnection.createOffer(this.connection.options.constraints)];
|
||
-
|
||
- case 2:
|
||
- offer = _a.sent();
|
||
- logger_1.default.log("Created offer.");
|
||
-
|
||
- if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {
|
||
- offer.sdp = this.connection.options.sdpTransform(offer.sdp) || offer.sdp;
|
||
- }
|
||
-
|
||
- _a.label = 3;
|
||
-
|
||
- case 3:
|
||
- _a.trys.push([3, 5,, 6]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , peerConnection.setLocalDescription(offer)];
|
||
-
|
||
- case 4:
|
||
- _a.sent();
|
||
-
|
||
- logger_1.default.log("Set localDescription:", offer, "for:" + this.connection.peer);
|
||
- payload = {
|
||
- sdp: offer,
|
||
- type: this.connection.type,
|
||
- connectionId: this.connection.connectionId,
|
||
- metadata: this.connection.metadata,
|
||
- browser: util_1.util.browser
|
||
- };
|
||
-
|
||
- if (this.connection.type === enums_1.ConnectionType.Data) {
|
||
- dataConnection = this.connection;
|
||
- payload = __assign(__assign({}, payload), {
|
||
- label: dataConnection.label,
|
||
- reliable: dataConnection.reliable,
|
||
- serialization: dataConnection.serialization
|
||
- });
|
||
- }
|
||
-
|
||
- provider.socket.send({
|
||
- type: enums_1.ServerMessageType.Offer,
|
||
- payload: payload,
|
||
- dst: this.connection.peer
|
||
- });
|
||
- return [3
|
||
- /*break*/
|
||
- , 6];
|
||
-
|
||
- case 5:
|
||
- err_2 = _a.sent(); // TODO: investigate why _makeOffer is being called from the answer
|
||
-
|
||
- if (err_2 != "OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer") {
|
||
- provider.emitError(enums_1.PeerErrorType.WebRTC, err_2);
|
||
- logger_1.default.log("Failed to setLocalDescription, ", err_2);
|
||
- }
|
||
-
|
||
- return [3
|
||
- /*break*/
|
||
- , 6];
|
||
-
|
||
- case 6:
|
||
- return [3
|
||
- /*break*/
|
||
- , 8];
|
||
-
|
||
- case 7:
|
||
- err_1_1 = _a.sent();
|
||
- provider.emitError(enums_1.PeerErrorType.WebRTC, err_1_1);
|
||
- logger_1.default.log("Failed to createOffer, ", err_1_1);
|
||
- return [3
|
||
- /*break*/
|
||
- , 8];
|
||
-
|
||
- case 8:
|
||
- return [2
|
||
- /*return*/
|
||
- ];
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
-
|
||
- Negotiator.prototype._makeAnswer = function () {
|
||
- return __awaiter(this, void 0, Promise, function () {
|
||
- var peerConnection, provider, answer, err_3, err_1_2;
|
||
- return __generator(this, function (_a) {
|
||
- switch (_a.label) {
|
||
- case 0:
|
||
- peerConnection = this.connection.peerConnection;
|
||
- provider = this.connection.provider;
|
||
- _a.label = 1;
|
||
-
|
||
- case 1:
|
||
- _a.trys.push([1, 7,, 8]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , peerConnection.createAnswer()];
|
||
-
|
||
- case 2:
|
||
- answer = _a.sent();
|
||
- logger_1.default.log("Created answer.");
|
||
-
|
||
- if (this.connection.options.sdpTransform && typeof this.connection.options.sdpTransform === 'function') {
|
||
- answer.sdp = this.connection.options.sdpTransform(answer.sdp) || answer.sdp;
|
||
- }
|
||
-
|
||
- _a.label = 3;
|
||
-
|
||
- case 3:
|
||
- _a.trys.push([3, 5,, 6]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , peerConnection.setLocalDescription(answer)];
|
||
-
|
||
- case 4:
|
||
- _a.sent();
|
||
-
|
||
- logger_1.default.log("Set localDescription:", answer, "for:" + this.connection.peer);
|
||
- provider.socket.send({
|
||
- type: enums_1.ServerMessageType.Answer,
|
||
- payload: {
|
||
- sdp: answer,
|
||
- type: this.connection.type,
|
||
- connectionId: this.connection.connectionId,
|
||
- browser: util_1.util.browser
|
||
- },
|
||
- dst: this.connection.peer
|
||
- });
|
||
- return [3
|
||
- /*break*/
|
||
- , 6];
|
||
-
|
||
- case 5:
|
||
- err_3 = _a.sent();
|
||
- provider.emitError(enums_1.PeerErrorType.WebRTC, err_3);
|
||
- logger_1.default.log("Failed to setLocalDescription, ", err_3);
|
||
- return [3
|
||
- /*break*/
|
||
- , 6];
|
||
-
|
||
- case 6:
|
||
- return [3
|
||
- /*break*/
|
||
- , 8];
|
||
-
|
||
- case 7:
|
||
- err_1_2 = _a.sent();
|
||
- provider.emitError(enums_1.PeerErrorType.WebRTC, err_1_2);
|
||
- logger_1.default.log("Failed to create answer, ", err_1_2);
|
||
- return [3
|
||
- /*break*/
|
||
- , 8];
|
||
-
|
||
- case 8:
|
||
- return [2
|
||
- /*return*/
|
||
- ];
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
- /** Handle an SDP. */
|
||
-
|
||
-
|
||
- Negotiator.prototype.handleSDP = function (type, sdp) {
|
||
- return __awaiter(this, void 0, Promise, function () {
|
||
- var peerConnection, provider, self, err_4;
|
||
- return __generator(this, function (_a) {
|
||
- switch (_a.label) {
|
||
- case 0:
|
||
- sdp = new RTCSessionDescription(sdp);
|
||
- peerConnection = this.connection.peerConnection;
|
||
- provider = this.connection.provider;
|
||
- logger_1.default.log("Setting remote description", sdp);
|
||
- self = this;
|
||
- _a.label = 1;
|
||
-
|
||
- case 1:
|
||
- _a.trys.push([1, 5,, 6]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , peerConnection.setRemoteDescription(sdp)];
|
||
-
|
||
- case 2:
|
||
- _a.sent();
|
||
-
|
||
- logger_1.default.log("Set remoteDescription:" + type + " for:" + this.connection.peer);
|
||
- if (!(type === "OFFER")) return [3
|
||
- /*break*/
|
||
- , 4];
|
||
- return [4
|
||
- /*yield*/
|
||
- , self._makeAnswer()];
|
||
-
|
||
- case 3:
|
||
- _a.sent();
|
||
-
|
||
- _a.label = 4;
|
||
-
|
||
- case 4:
|
||
- return [3
|
||
- /*break*/
|
||
- , 6];
|
||
-
|
||
- case 5:
|
||
- err_4 = _a.sent();
|
||
- provider.emitError(enums_1.PeerErrorType.WebRTC, err_4);
|
||
- logger_1.default.log("Failed to setRemoteDescription, ", err_4);
|
||
- return [3
|
||
- /*break*/
|
||
- , 6];
|
||
-
|
||
- case 6:
|
||
- return [2
|
||
- /*return*/
|
||
- ];
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
- /** Handle a candidate. */
|
||
-
|
||
-
|
||
- Negotiator.prototype.handleCandidate = function (ice) {
|
||
- return __awaiter(this, void 0, Promise, function () {
|
||
- var candidate, sdpMLineIndex, sdpMid, peerConnection, provider, err_5;
|
||
- return __generator(this, function (_a) {
|
||
- switch (_a.label) {
|
||
- case 0:
|
||
- logger_1.default.log("handleCandidate:", ice);
|
||
- candidate = ice.candidate;
|
||
- sdpMLineIndex = ice.sdpMLineIndex;
|
||
- sdpMid = ice.sdpMid;
|
||
- peerConnection = this.connection.peerConnection;
|
||
- provider = this.connection.provider;
|
||
- _a.label = 1;
|
||
-
|
||
- case 1:
|
||
- _a.trys.push([1, 3,, 4]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , peerConnection.addIceCandidate(new RTCIceCandidate({
|
||
- sdpMid: sdpMid,
|
||
- sdpMLineIndex: sdpMLineIndex,
|
||
- candidate: candidate
|
||
- }))];
|
||
-
|
||
- case 2:
|
||
- _a.sent();
|
||
-
|
||
- logger_1.default.log("Added ICE candidate for:" + this.connection.peer);
|
||
- return [3
|
||
- /*break*/
|
||
- , 4];
|
||
-
|
||
- case 3:
|
||
- err_5 = _a.sent();
|
||
- provider.emitError(enums_1.PeerErrorType.WebRTC, err_5);
|
||
- logger_1.default.log("Failed to handleCandidate, ", err_5);
|
||
- return [3
|
||
- /*break*/
|
||
- , 4];
|
||
-
|
||
- case 4:
|
||
- return [2
|
||
- /*return*/
|
||
- ];
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
-
|
||
- Negotiator.prototype._addTracksToConnection = function (stream, peerConnection) {
|
||
- logger_1.default.log("add tracks from stream " + stream.id + " to peer connection");
|
||
-
|
||
- if (!peerConnection.addTrack) {
|
||
- return logger_1.default.error("Your browser does't support RTCPeerConnection#addTrack. Ignored.");
|
||
- }
|
||
-
|
||
- stream.getTracks().forEach(function (track) {
|
||
- peerConnection.addTrack(track, stream);
|
||
- });
|
||
- };
|
||
-
|
||
- Negotiator.prototype._addStreamToMediaConnection = function (stream, mediaConnection) {
|
||
- logger_1.default.log("add stream " + stream.id + " to media connection " + mediaConnection.connectionId);
|
||
- mediaConnection.addStream(stream);
|
||
- };
|
||
-
|
||
- return Negotiator;
|
||
-}();
|
||
-
|
||
-exports.Negotiator = Negotiator;
|
||
-},{"./util":"BHXf","./logger":"WOs9","./enums":"ZRYf"}],"tQFK":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __extends = this && this.__extends || function () {
|
||
- var _extendStatics = function extendStatics(d, b) {
|
||
- _extendStatics = Object.setPrototypeOf || {
|
||
- __proto__: []
|
||
- } instanceof Array && function (d, b) {
|
||
- d.__proto__ = b;
|
||
- } || function (d, b) {
|
||
- for (var p in b) {
|
||
- if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
||
- }
|
||
- };
|
||
-
|
||
- return _extendStatics(d, b);
|
||
- };
|
||
-
|
||
- return function (d, b) {
|
||
- if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
-
|
||
- _extendStatics(d, b);
|
||
-
|
||
- function __() {
|
||
- this.constructor = d;
|
||
- }
|
||
-
|
||
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
- };
|
||
-}();
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.BaseConnection = void 0;
|
||
-
|
||
-var eventemitter3_1 = require("eventemitter3");
|
||
-
|
||
-var BaseConnection =
|
||
-/** @class */
|
||
-function (_super) {
|
||
- __extends(BaseConnection, _super);
|
||
-
|
||
- function BaseConnection(peer, provider, options) {
|
||
- var _this = _super.call(this) || this;
|
||
-
|
||
- _this.peer = peer;
|
||
- _this.provider = provider;
|
||
- _this.options = options;
|
||
- _this._open = false;
|
||
- _this.metadata = options.metadata;
|
||
- return _this;
|
||
- }
|
||
-
|
||
- Object.defineProperty(BaseConnection.prototype, "open", {
|
||
- get: function get() {
|
||
- return this._open;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- return BaseConnection;
|
||
-}(eventemitter3_1.EventEmitter);
|
||
-
|
||
-exports.BaseConnection = BaseConnection;
|
||
-},{"eventemitter3":"JJlS"}],"dbHP":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __extends = this && this.__extends || function () {
|
||
- var _extendStatics = function extendStatics(d, b) {
|
||
- _extendStatics = Object.setPrototypeOf || {
|
||
- __proto__: []
|
||
- } instanceof Array && function (d, b) {
|
||
- d.__proto__ = b;
|
||
- } || function (d, b) {
|
||
- for (var p in b) {
|
||
- if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
||
- }
|
||
- };
|
||
-
|
||
- return _extendStatics(d, b);
|
||
- };
|
||
-
|
||
- return function (d, b) {
|
||
- if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
-
|
||
- _extendStatics(d, b);
|
||
-
|
||
- function __() {
|
||
- this.constructor = d;
|
||
- }
|
||
-
|
||
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
- };
|
||
-}();
|
||
-
|
||
-var __assign = this && this.__assign || function () {
|
||
- __assign = Object.assign || function (t) {
|
||
- for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
- s = arguments[i];
|
||
-
|
||
- for (var p in s) {
|
||
- if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
||
- }
|
||
- }
|
||
-
|
||
- return t;
|
||
- };
|
||
-
|
||
- return __assign.apply(this, arguments);
|
||
-};
|
||
-
|
||
-var __values = this && this.__values || function (o) {
|
||
- var s = typeof Symbol === "function" && Symbol.iterator,
|
||
- m = s && o[s],
|
||
- i = 0;
|
||
- if (m) return m.call(o);
|
||
- if (o && typeof o.length === "number") return {
|
||
- next: function next() {
|
||
- if (o && i >= o.length) o = void 0;
|
||
- return {
|
||
- value: o && o[i++],
|
||
- done: !o
|
||
- };
|
||
- }
|
||
- };
|
||
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||
-};
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.MediaConnection = void 0;
|
||
-
|
||
-var util_1 = require("./util");
|
||
-
|
||
-var logger_1 = __importDefault(require("./logger"));
|
||
-
|
||
-var negotiator_1 = require("./negotiator");
|
||
-
|
||
-var enums_1 = require("./enums");
|
||
-
|
||
-var baseconnection_1 = require("./baseconnection");
|
||
-/**
|
||
- * Wraps the streaming interface between two Peers.
|
||
- */
|
||
-
|
||
-
|
||
-var MediaConnection =
|
||
-/** @class */
|
||
-function (_super) {
|
||
- __extends(MediaConnection, _super);
|
||
-
|
||
- function MediaConnection(peerId, provider, options) {
|
||
- var _this = _super.call(this, peerId, provider, options) || this;
|
||
-
|
||
- _this._localStream = _this.options._stream;
|
||
- _this.connectionId = _this.options.connectionId || MediaConnection.ID_PREFIX + util_1.util.randomToken();
|
||
- _this._negotiator = new negotiator_1.Negotiator(_this);
|
||
-
|
||
- if (_this._localStream) {
|
||
- _this._negotiator.startConnection({
|
||
- _stream: _this._localStream,
|
||
- originator: true
|
||
- });
|
||
- }
|
||
-
|
||
- return _this;
|
||
- }
|
||
-
|
||
- Object.defineProperty(MediaConnection.prototype, "type", {
|
||
- get: function get() {
|
||
- return enums_1.ConnectionType.Media;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(MediaConnection.prototype, "localStream", {
|
||
- get: function get() {
|
||
- return this._localStream;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(MediaConnection.prototype, "remoteStream", {
|
||
- get: function get() {
|
||
- return this._remoteStream;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
-
|
||
- MediaConnection.prototype.addStream = function (remoteStream) {
|
||
- logger_1.default.log("Receiving stream", remoteStream);
|
||
- this._remoteStream = remoteStream;
|
||
-
|
||
- _super.prototype.emit.call(this, enums_1.ConnectionEventType.Stream, remoteStream); // Should we call this `open`?
|
||
-
|
||
- };
|
||
-
|
||
- MediaConnection.prototype.handleMessage = function (message) {
|
||
- var type = message.type;
|
||
- var payload = message.payload;
|
||
-
|
||
- switch (message.type) {
|
||
- case enums_1.ServerMessageType.Answer:
|
||
- // Forward to negotiator
|
||
- this._negotiator.handleSDP(type, payload.sdp);
|
||
-
|
||
- this._open = true;
|
||
- break;
|
||
-
|
||
- case enums_1.ServerMessageType.Candidate:
|
||
- this._negotiator.handleCandidate(payload.candidate);
|
||
-
|
||
- break;
|
||
-
|
||
- default:
|
||
- logger_1.default.warn("Unrecognized message type:" + type + " from peer:" + this.peer);
|
||
- break;
|
||
- }
|
||
- };
|
||
-
|
||
- MediaConnection.prototype.answer = function (stream, options) {
|
||
- var e_1, _a;
|
||
-
|
||
- if (options === void 0) {
|
||
- options = {};
|
||
- }
|
||
-
|
||
- if (this._localStream) {
|
||
- logger_1.default.warn("Local stream already exists on this MediaConnection. Are you answering a call twice?");
|
||
- return;
|
||
- }
|
||
-
|
||
- this._localStream = stream;
|
||
-
|
||
- if (options && options.sdpTransform) {
|
||
- this.options.sdpTransform = options.sdpTransform;
|
||
- }
|
||
-
|
||
- this._negotiator.startConnection(__assign(__assign({}, this.options._payload), {
|
||
- _stream: stream
|
||
- })); // Retrieve lost messages stored because PeerConnection not set up.
|
||
-
|
||
-
|
||
- var messages = this.provider._getMessages(this.connectionId);
|
||
-
|
||
- try {
|
||
- for (var messages_1 = __values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
|
||
- var message = messages_1_1.value;
|
||
- this.handleMessage(message);
|
||
- }
|
||
- } catch (e_1_1) {
|
||
- e_1 = {
|
||
- error: e_1_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
|
||
- } finally {
|
||
- if (e_1) throw e_1.error;
|
||
- }
|
||
- }
|
||
-
|
||
- this._open = true;
|
||
- };
|
||
- /**
|
||
- * Exposed functionality for users.
|
||
- */
|
||
-
|
||
- /** Allows user to close connection. */
|
||
-
|
||
-
|
||
- MediaConnection.prototype.close = function () {
|
||
- if (this._negotiator) {
|
||
- this._negotiator.cleanup();
|
||
-
|
||
- this._negotiator = null;
|
||
- }
|
||
-
|
||
- this._localStream = null;
|
||
- this._remoteStream = null;
|
||
-
|
||
- if (this.provider) {
|
||
- this.provider._removeConnection(this);
|
||
-
|
||
- this.provider = null;
|
||
- }
|
||
-
|
||
- if (this.options && this.options._stream) {
|
||
- this.options._stream = null;
|
||
- }
|
||
-
|
||
- if (!this.open) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this._open = false;
|
||
-
|
||
- _super.prototype.emit.call(this, enums_1.ConnectionEventType.Close);
|
||
- };
|
||
-
|
||
- MediaConnection.ID_PREFIX = "mc_";
|
||
- return MediaConnection;
|
||
-}(baseconnection_1.BaseConnection);
|
||
-
|
||
-exports.MediaConnection = MediaConnection;
|
||
-},{"./util":"BHXf","./logger":"WOs9","./negotiator":"HCdX","./enums":"ZRYf","./baseconnection":"tQFK"}],"GGp6":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __extends = this && this.__extends || function () {
|
||
- var _extendStatics = function extendStatics(d, b) {
|
||
- _extendStatics = Object.setPrototypeOf || {
|
||
- __proto__: []
|
||
- } instanceof Array && function (d, b) {
|
||
- d.__proto__ = b;
|
||
- } || function (d, b) {
|
||
- for (var p in b) {
|
||
- if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
||
- }
|
||
- };
|
||
-
|
||
- return _extendStatics(d, b);
|
||
- };
|
||
-
|
||
- return function (d, b) {
|
||
- if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
-
|
||
- _extendStatics(d, b);
|
||
-
|
||
- function __() {
|
||
- this.constructor = d;
|
||
- }
|
||
-
|
||
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
- };
|
||
-}();
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.EncodingQueue = void 0;
|
||
-
|
||
-var eventemitter3_1 = require("eventemitter3");
|
||
-
|
||
-var logger_1 = __importDefault(require("./logger"));
|
||
-
|
||
-var EncodingQueue =
|
||
-/** @class */
|
||
-function (_super) {
|
||
- __extends(EncodingQueue, _super);
|
||
-
|
||
- function EncodingQueue() {
|
||
- var _this = _super.call(this) || this;
|
||
-
|
||
- _this.fileReader = new FileReader();
|
||
- _this._queue = [];
|
||
- _this._processing = false;
|
||
-
|
||
- _this.fileReader.onload = function (evt) {
|
||
- _this._processing = false;
|
||
-
|
||
- if (evt.target) {
|
||
- _this.emit('done', evt.target.result);
|
||
- }
|
||
-
|
||
- _this.doNextTask();
|
||
- };
|
||
-
|
||
- _this.fileReader.onerror = function (evt) {
|
||
- logger_1.default.error("EncodingQueue error:", evt);
|
||
- _this._processing = false;
|
||
-
|
||
- _this.destroy();
|
||
-
|
||
- _this.emit('error', evt);
|
||
- };
|
||
-
|
||
- return _this;
|
||
- }
|
||
-
|
||
- Object.defineProperty(EncodingQueue.prototype, "queue", {
|
||
- get: function get() {
|
||
- return this._queue;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(EncodingQueue.prototype, "size", {
|
||
- get: function get() {
|
||
- return this.queue.length;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(EncodingQueue.prototype, "processing", {
|
||
- get: function get() {
|
||
- return this._processing;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
-
|
||
- EncodingQueue.prototype.enque = function (blob) {
|
||
- this.queue.push(blob);
|
||
- if (this.processing) return;
|
||
- this.doNextTask();
|
||
- };
|
||
-
|
||
- EncodingQueue.prototype.destroy = function () {
|
||
- this.fileReader.abort();
|
||
- this._queue = [];
|
||
- };
|
||
-
|
||
- EncodingQueue.prototype.doNextTask = function () {
|
||
- if (this.size === 0) return;
|
||
- if (this.processing) return;
|
||
- this._processing = true;
|
||
- this.fileReader.readAsArrayBuffer(this.queue.shift());
|
||
- };
|
||
-
|
||
- return EncodingQueue;
|
||
-}(eventemitter3_1.EventEmitter);
|
||
-
|
||
-exports.EncodingQueue = EncodingQueue;
|
||
-},{"eventemitter3":"JJlS","./logger":"WOs9"}],"GBTQ":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __extends = this && this.__extends || function () {
|
||
- var _extendStatics = function extendStatics(d, b) {
|
||
- _extendStatics = Object.setPrototypeOf || {
|
||
- __proto__: []
|
||
- } instanceof Array && function (d, b) {
|
||
- d.__proto__ = b;
|
||
- } || function (d, b) {
|
||
- for (var p in b) {
|
||
- if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
||
- }
|
||
- };
|
||
-
|
||
- return _extendStatics(d, b);
|
||
- };
|
||
-
|
||
- return function (d, b) {
|
||
- if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
-
|
||
- _extendStatics(d, b);
|
||
-
|
||
- function __() {
|
||
- this.constructor = d;
|
||
- }
|
||
-
|
||
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
- };
|
||
-}();
|
||
-
|
||
-var __values = this && this.__values || function (o) {
|
||
- var s = typeof Symbol === "function" && Symbol.iterator,
|
||
- m = s && o[s],
|
||
- i = 0;
|
||
- if (m) return m.call(o);
|
||
- if (o && typeof o.length === "number") return {
|
||
- next: function next() {
|
||
- if (o && i >= o.length) o = void 0;
|
||
- return {
|
||
- value: o && o[i++],
|
||
- done: !o
|
||
- };
|
||
- }
|
||
- };
|
||
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||
-};
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.DataConnection = void 0;
|
||
-
|
||
-var util_1 = require("./util");
|
||
-
|
||
-var logger_1 = __importDefault(require("./logger"));
|
||
-
|
||
-var negotiator_1 = require("./negotiator");
|
||
-
|
||
-var enums_1 = require("./enums");
|
||
-
|
||
-var baseconnection_1 = require("./baseconnection");
|
||
-
|
||
-var encodingQueue_1 = require("./encodingQueue");
|
||
-/**
|
||
- * Wraps a DataChannel between two Peers.
|
||
- */
|
||
-
|
||
-
|
||
-var DataConnection =
|
||
-/** @class */
|
||
-function (_super) {
|
||
- __extends(DataConnection, _super);
|
||
-
|
||
- function DataConnection(peerId, provider, options) {
|
||
- var _this = _super.call(this, peerId, provider, options) || this;
|
||
-
|
||
- _this.stringify = JSON.stringify;
|
||
- _this.parse = JSON.parse;
|
||
- _this._buffer = [];
|
||
- _this._bufferSize = 0;
|
||
- _this._buffering = false;
|
||
- _this._chunkedData = {};
|
||
- _this._encodingQueue = new encodingQueue_1.EncodingQueue();
|
||
- _this.connectionId = _this.options.connectionId || DataConnection.ID_PREFIX + util_1.util.randomToken();
|
||
- _this.label = _this.options.label || _this.connectionId;
|
||
- _this.serialization = _this.options.serialization || enums_1.SerializationType.Binary;
|
||
- _this.reliable = !!_this.options.reliable;
|
||
-
|
||
- _this._encodingQueue.on('done', function (ab) {
|
||
- _this._bufferedSend(ab);
|
||
- });
|
||
-
|
||
- _this._encodingQueue.on('error', function () {
|
||
- logger_1.default.error("DC#" + _this.connectionId + ": Error occured in encoding from blob to arraybuffer, close DC");
|
||
-
|
||
- _this.close();
|
||
- });
|
||
-
|
||
- _this._negotiator = new negotiator_1.Negotiator(_this);
|
||
-
|
||
- _this._negotiator.startConnection(_this.options._payload || {
|
||
- originator: true
|
||
- });
|
||
-
|
||
- return _this;
|
||
- }
|
||
-
|
||
- Object.defineProperty(DataConnection.prototype, "type", {
|
||
- get: function get() {
|
||
- return enums_1.ConnectionType.Data;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(DataConnection.prototype, "dataChannel", {
|
||
- get: function get() {
|
||
- return this._dc;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(DataConnection.prototype, "bufferSize", {
|
||
- get: function get() {
|
||
- return this._bufferSize;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- /** Called by the Negotiator when the DataChannel is ready. */
|
||
-
|
||
- DataConnection.prototype.initialize = function (dc) {
|
||
- this._dc = dc;
|
||
-
|
||
- this._configureDataChannel();
|
||
- };
|
||
-
|
||
- DataConnection.prototype._configureDataChannel = function () {
|
||
- var _this = this;
|
||
-
|
||
- if (!util_1.util.supports.binaryBlob || util_1.util.supports.reliable) {
|
||
- this.dataChannel.binaryType = "arraybuffer";
|
||
- }
|
||
-
|
||
- this.dataChannel.onopen = function () {
|
||
- logger_1.default.log("DC#" + _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);
|
||
-
|
||
- _this._handleDataMessage(e);
|
||
- };
|
||
-
|
||
- this.dataChannel.onclose = function () {
|
||
- logger_1.default.log("DC#" + _this.connectionId + " dc closed for:", _this.peer);
|
||
-
|
||
- _this.close();
|
||
- };
|
||
- }; // Handles a DataChannel message.
|
||
-
|
||
-
|
||
- DataConnection.prototype._handleDataMessage = function (_a) {
|
||
- var _this = this;
|
||
-
|
||
- var data = _a.data;
|
||
- var datatype = data.constructor;
|
||
- var isBinarySerialization = this.serialization === enums_1.SerializationType.Binary || this.serialization === enums_1.SerializationType.BinaryUTF8;
|
||
- var deserializedData = data;
|
||
-
|
||
- if (isBinarySerialization) {
|
||
- if (datatype === Blob) {
|
||
- // Datatype should never be blob
|
||
- util_1.util.blobToArrayBuffer(data, function (ab) {
|
||
- var unpackedData = util_1.util.unpack(ab);
|
||
-
|
||
- _this.emit(enums_1.ConnectionEventType.Data, unpackedData);
|
||
- });
|
||
- return;
|
||
- } else if (datatype === ArrayBuffer) {
|
||
- deserializedData = util_1.util.unpack(data);
|
||
- } else if (datatype === String) {
|
||
- // String fallback for binary data for browsers that don't support binary yet
|
||
- var ab = util_1.util.binaryStringToArrayBuffer(data);
|
||
- deserializedData = util_1.util.unpack(ab);
|
||
- }
|
||
- } else if (this.serialization === enums_1.SerializationType.JSON) {
|
||
- deserializedData = this.parse(data);
|
||
- } // Check if we've chunked--if so, piece things back together.
|
||
- // We're guaranteed that this isn't 0.
|
||
-
|
||
-
|
||
- if (deserializedData.__peerData) {
|
||
- this._handleChunk(deserializedData);
|
||
-
|
||
- return;
|
||
- }
|
||
-
|
||
- _super.prototype.emit.call(this, enums_1.ConnectionEventType.Data, deserializedData);
|
||
- };
|
||
-
|
||
- DataConnection.prototype._handleChunk = function (data) {
|
||
- var id = data.__peerData;
|
||
- var chunkInfo = this._chunkedData[id] || {
|
||
- data: [],
|
||
- count: 0,
|
||
- total: data.total
|
||
- };
|
||
- chunkInfo.data[data.n] = data.data;
|
||
- chunkInfo.count++;
|
||
- this._chunkedData[id] = chunkInfo;
|
||
-
|
||
- if (chunkInfo.total === chunkInfo.count) {
|
||
- // Clean up before making the recursive call to `_handleDataMessage`.
|
||
- delete this._chunkedData[id]; // We've received all the chunks--time to construct the complete data.
|
||
-
|
||
- var data_1 = new Blob(chunkInfo.data);
|
||
-
|
||
- this._handleDataMessage({
|
||
- data: data_1
|
||
- });
|
||
- }
|
||
- };
|
||
- /**
|
||
- * Exposed functionality for users.
|
||
- */
|
||
-
|
||
- /** Allows user to close connection. */
|
||
-
|
||
-
|
||
- DataConnection.prototype.close = function () {
|
||
- this._buffer = [];
|
||
- this._bufferSize = 0;
|
||
- this._chunkedData = {};
|
||
-
|
||
- if (this._negotiator) {
|
||
- this._negotiator.cleanup();
|
||
-
|
||
- this._negotiator = null;
|
||
- }
|
||
-
|
||
- if (this.provider) {
|
||
- this.provider._removeConnection(this);
|
||
-
|
||
- this.provider = null;
|
||
- }
|
||
-
|
||
- if (this.dataChannel) {
|
||
- this.dataChannel.onopen = null;
|
||
- this.dataChannel.onmessage = null;
|
||
- this.dataChannel.onclose = null;
|
||
- this._dc = null;
|
||
- }
|
||
-
|
||
- if (this._encodingQueue) {
|
||
- this._encodingQueue.destroy();
|
||
-
|
||
- this._encodingQueue.removeAllListeners();
|
||
-
|
||
- this._encodingQueue = null;
|
||
- }
|
||
-
|
||
- if (!this.open) {
|
||
- return;
|
||
- }
|
||
-
|
||
- this._open = false;
|
||
-
|
||
- _super.prototype.emit.call(this, enums_1.ConnectionEventType.Close);
|
||
- };
|
||
- /** Allows user to send data. */
|
||
-
|
||
-
|
||
- DataConnection.prototype.send = function (data, chunked) {
|
||
- if (!this.open) {
|
||
- _super.prototype.emit.call(this, enums_1.ConnectionEventType.Error, new Error("Connection is not open. You should listen for the `open` event before sending messages."));
|
||
-
|
||
- return;
|
||
- }
|
||
-
|
||
- if (this.serialization === enums_1.SerializationType.JSON) {
|
||
- this._bufferedSend(this.stringify(data));
|
||
- } else if (this.serialization === enums_1.SerializationType.Binary || this.serialization === enums_1.SerializationType.BinaryUTF8) {
|
||
- var blob = util_1.util.pack(data);
|
||
-
|
||
- if (!chunked && blob.size > util_1.util.chunkedMTU) {
|
||
- this._sendChunks(blob);
|
||
-
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!util_1.util.supports.binaryBlob) {
|
||
- // We only do this if we really need to (e.g. blobs are not supported),
|
||
- // because this conversion is costly.
|
||
- this._encodingQueue.enque(blob);
|
||
- } else {
|
||
- this._bufferedSend(blob);
|
||
- }
|
||
- } else {
|
||
- this._bufferedSend(data);
|
||
- }
|
||
- };
|
||
-
|
||
- DataConnection.prototype._bufferedSend = function (msg) {
|
||
- if (this._buffering || !this._trySend(msg)) {
|
||
- this._buffer.push(msg);
|
||
-
|
||
- this._bufferSize = this._buffer.length;
|
||
- }
|
||
- }; // Returns true if the send succeeds.
|
||
-
|
||
-
|
||
- DataConnection.prototype._trySend = function (msg) {
|
||
- var _this = this;
|
||
-
|
||
- if (!this.open) {
|
||
- return false;
|
||
- }
|
||
-
|
||
- if (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {
|
||
- this._buffering = true;
|
||
- setTimeout(function () {
|
||
- _this._buffering = false;
|
||
-
|
||
- _this._tryBuffer();
|
||
- }, 50);
|
||
- return false;
|
||
- }
|
||
-
|
||
- try {
|
||
- this.dataChannel.send(msg);
|
||
- } catch (e) {
|
||
- logger_1.default.error("DC#:" + this.connectionId + " Error when sending:", e);
|
||
- this._buffering = true;
|
||
- this.close();
|
||
- return false;
|
||
- }
|
||
-
|
||
- return true;
|
||
- }; // Try to send the first message in the buffer.
|
||
-
|
||
-
|
||
- DataConnection.prototype._tryBuffer = function () {
|
||
- if (!this.open) {
|
||
- return;
|
||
- }
|
||
-
|
||
- if (this._buffer.length === 0) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var msg = this._buffer[0];
|
||
-
|
||
- if (this._trySend(msg)) {
|
||
- this._buffer.shift();
|
||
-
|
||
- this._bufferSize = this._buffer.length;
|
||
-
|
||
- this._tryBuffer();
|
||
- }
|
||
- };
|
||
-
|
||
- DataConnection.prototype._sendChunks = function (blob) {
|
||
- var e_1, _a;
|
||
-
|
||
- var blobs = util_1.util.chunk(blob);
|
||
- logger_1.default.log("DC#" + this.connectionId + " Try to send " + 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()) {
|
||
- var blob_1 = blobs_1_1.value;
|
||
- this.send(blob_1, true);
|
||
- }
|
||
- } catch (e_1_1) {
|
||
- e_1 = {
|
||
- error: e_1_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (blobs_1_1 && !blobs_1_1.done && (_a = blobs_1.return)) _a.call(blobs_1);
|
||
- } finally {
|
||
- if (e_1) throw e_1.error;
|
||
- }
|
||
- }
|
||
- };
|
||
-
|
||
- DataConnection.prototype.handleMessage = function (message) {
|
||
- var payload = message.payload;
|
||
-
|
||
- switch (message.type) {
|
||
- case enums_1.ServerMessageType.Answer:
|
||
- this._negotiator.handleSDP(message.type, payload.sdp);
|
||
-
|
||
- break;
|
||
-
|
||
- case enums_1.ServerMessageType.Candidate:
|
||
- this._negotiator.handleCandidate(payload.candidate);
|
||
-
|
||
- break;
|
||
-
|
||
- default:
|
||
- logger_1.default.warn("Unrecognized message type:", message.type, "from peer:", this.peer);
|
||
- break;
|
||
- }
|
||
- };
|
||
-
|
||
- DataConnection.ID_PREFIX = "dc_";
|
||
- DataConnection.MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;
|
||
- return DataConnection;
|
||
-}(baseconnection_1.BaseConnection);
|
||
-
|
||
-exports.DataConnection = DataConnection;
|
||
-},{"./util":"BHXf","./logger":"WOs9","./negotiator":"HCdX","./enums":"ZRYf","./baseconnection":"tQFK","./encodingQueue":"GGp6"}],"in7L":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __awaiter = this && this.__awaiter || function (thisArg, _arguments, P, generator) {
|
||
- function adopt(value) {
|
||
- return value instanceof P ? value : new P(function (resolve) {
|
||
- resolve(value);
|
||
- });
|
||
- }
|
||
-
|
||
- return new (P || (P = Promise))(function (resolve, reject) {
|
||
- function fulfilled(value) {
|
||
- try {
|
||
- step(generator.next(value));
|
||
- } catch (e) {
|
||
- reject(e);
|
||
- }
|
||
- }
|
||
-
|
||
- function rejected(value) {
|
||
- try {
|
||
- step(generator["throw"](value));
|
||
- } catch (e) {
|
||
- reject(e);
|
||
- }
|
||
- }
|
||
-
|
||
- function step(result) {
|
||
- result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
|
||
- }
|
||
-
|
||
- step((generator = generator.apply(thisArg, _arguments || [])).next());
|
||
- });
|
||
-};
|
||
-
|
||
-var __generator = this && this.__generator || function (thisArg, body) {
|
||
- var _ = {
|
||
- label: 0,
|
||
- sent: function sent() {
|
||
- if (t[0] & 1) throw t[1];
|
||
- return t[1];
|
||
- },
|
||
- trys: [],
|
||
- ops: []
|
||
- },
|
||
- f,
|
||
- y,
|
||
- t,
|
||
- g;
|
||
- return g = {
|
||
- next: verb(0),
|
||
- "throw": verb(1),
|
||
- "return": verb(2)
|
||
- }, typeof Symbol === "function" && (g[Symbol.iterator] = function () {
|
||
- return this;
|
||
- }), g;
|
||
-
|
||
- function verb(n) {
|
||
- return function (v) {
|
||
- return step([n, v]);
|
||
- };
|
||
- }
|
||
-
|
||
- function step(op) {
|
||
- if (f) throw new TypeError("Generator is already executing.");
|
||
-
|
||
- while (_) {
|
||
- try {
|
||
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
||
- if (y = 0, t) op = [op[0] & 2, t.value];
|
||
-
|
||
- switch (op[0]) {
|
||
- case 0:
|
||
- case 1:
|
||
- t = op;
|
||
- break;
|
||
-
|
||
- case 4:
|
||
- _.label++;
|
||
- return {
|
||
- value: op[1],
|
||
- done: false
|
||
- };
|
||
-
|
||
- case 5:
|
||
- _.label++;
|
||
- y = op[1];
|
||
- op = [0];
|
||
- continue;
|
||
-
|
||
- case 7:
|
||
- op = _.ops.pop();
|
||
-
|
||
- _.trys.pop();
|
||
-
|
||
- continue;
|
||
-
|
||
- default:
|
||
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
||
- _ = 0;
|
||
- continue;
|
||
- }
|
||
-
|
||
- if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
||
- _.label = op[1];
|
||
- break;
|
||
- }
|
||
-
|
||
- if (op[0] === 6 && _.label < t[1]) {
|
||
- _.label = t[1];
|
||
- t = op;
|
||
- break;
|
||
- }
|
||
-
|
||
- if (t && _.label < t[2]) {
|
||
- _.label = t[2];
|
||
-
|
||
- _.ops.push(op);
|
||
-
|
||
- break;
|
||
- }
|
||
-
|
||
- if (t[2]) _.ops.pop();
|
||
-
|
||
- _.trys.pop();
|
||
-
|
||
- continue;
|
||
- }
|
||
-
|
||
- op = body.call(thisArg, _);
|
||
- } catch (e) {
|
||
- op = [6, e];
|
||
- y = 0;
|
||
- } finally {
|
||
- f = t = 0;
|
||
- }
|
||
- }
|
||
-
|
||
- if (op[0] & 5) throw op[1];
|
||
- return {
|
||
- value: op[0] ? op[1] : void 0,
|
||
- done: true
|
||
- };
|
||
- }
|
||
-};
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.API = void 0;
|
||
-
|
||
-var util_1 = require("./util");
|
||
-
|
||
-var logger_1 = __importDefault(require("./logger"));
|
||
-
|
||
-var API =
|
||
-/** @class */
|
||
-function () {
|
||
- function API(_options) {
|
||
- this._options = _options;
|
||
- }
|
||
-
|
||
- API.prototype._buildUrl = function (method) {
|
||
- var protocol = this._options.secure ? "https://" : "http://";
|
||
- var url = protocol + this._options.host + ":" + this._options.port + this._options.path + this._options.key + "/" + method;
|
||
- var queryString = "?ts=" + new Date().getTime() + "" + Math.random();
|
||
- url += queryString;
|
||
- return url;
|
||
- };
|
||
- /** Get a unique ID from the server via XHR and initialize with it. */
|
||
-
|
||
-
|
||
- API.prototype.retrieveId = function () {
|
||
- return __awaiter(this, void 0, Promise, function () {
|
||
- var url, response, error_1, pathError;
|
||
- return __generator(this, function (_a) {
|
||
- switch (_a.label) {
|
||
- case 0:
|
||
- url = this._buildUrl("id");
|
||
- _a.label = 1;
|
||
-
|
||
- case 1:
|
||
- _a.trys.push([1, 3,, 4]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , fetch(url)];
|
||
-
|
||
- case 2:
|
||
- response = _a.sent();
|
||
-
|
||
- if (response.status !== 200) {
|
||
- throw new Error("Error. Status:" + response.status);
|
||
- }
|
||
-
|
||
- return [2
|
||
- /*return*/
|
||
- , response.text()];
|
||
-
|
||
- case 3:
|
||
- error_1 = _a.sent();
|
||
- logger_1.default.error("Error retrieving ID", error_1);
|
||
- pathError = "";
|
||
-
|
||
- if (this._options.path === "/" && this._options.host !== util_1.util.CLOUD_HOST) {
|
||
- pathError = " If you passed in a `path` to your self-hosted PeerServer, " + "you'll also need to pass in that same path when creating a new " + "Peer.";
|
||
- }
|
||
-
|
||
- throw new Error("Could not get an ID from the server." + pathError);
|
||
-
|
||
- case 4:
|
||
- return [2
|
||
- /*return*/
|
||
- ];
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
- /** @deprecated */
|
||
-
|
||
-
|
||
- API.prototype.listAllPeers = function () {
|
||
- return __awaiter(this, void 0, Promise, function () {
|
||
- var url, response, helpfulError, error_2;
|
||
- return __generator(this, function (_a) {
|
||
- switch (_a.label) {
|
||
- case 0:
|
||
- url = this._buildUrl("peers");
|
||
- _a.label = 1;
|
||
-
|
||
- case 1:
|
||
- _a.trys.push([1, 3,, 4]);
|
||
-
|
||
- return [4
|
||
- /*yield*/
|
||
- , fetch(url)];
|
||
-
|
||
- case 2:
|
||
- response = _a.sent();
|
||
-
|
||
- if (response.status !== 200) {
|
||
- if (response.status === 401) {
|
||
- helpfulError = "";
|
||
-
|
||
- if (this._options.host === util_1.util.CLOUD_HOST) {
|
||
- helpfulError = "It looks like you're using the cloud server. You can email " + "team@peerjs.com to enable peer listing for your API key.";
|
||
- } else {
|
||
- helpfulError = "You need to enable `allow_discovery` on your self-hosted " + "PeerServer to use this feature.";
|
||
- }
|
||
-
|
||
- throw new Error("It doesn't look like you have permission to list peers IDs. " + helpfulError);
|
||
- }
|
||
-
|
||
- throw new Error("Error. Status:" + response.status);
|
||
- }
|
||
-
|
||
- return [2
|
||
- /*return*/
|
||
- , response.json()];
|
||
-
|
||
- case 3:
|
||
- error_2 = _a.sent();
|
||
- logger_1.default.error("Error retrieving list peers", error_2);
|
||
- throw new Error("Could not get list peers from the server." + error_2);
|
||
-
|
||
- case 4:
|
||
- return [2
|
||
- /*return*/
|
||
- ];
|
||
- }
|
||
- });
|
||
- });
|
||
- };
|
||
-
|
||
- return API;
|
||
-}();
|
||
-
|
||
-exports.API = API;
|
||
-},{"./util":"BHXf","./logger":"WOs9"}],"Hxpd":[function(require,module,exports) {
|
||
-"use strict";
|
||
-
|
||
-var __extends = this && this.__extends || function () {
|
||
- var _extendStatics = function extendStatics(d, b) {
|
||
- _extendStatics = Object.setPrototypeOf || {
|
||
- __proto__: []
|
||
- } instanceof Array && function (d, b) {
|
||
- d.__proto__ = b;
|
||
- } || function (d, b) {
|
||
- for (var p in b) {
|
||
- if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];
|
||
- }
|
||
- };
|
||
-
|
||
- return _extendStatics(d, b);
|
||
- };
|
||
-
|
||
- return function (d, b) {
|
||
- if (typeof b !== "function" && b !== null) throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
-
|
||
- _extendStatics(d, b);
|
||
-
|
||
- function __() {
|
||
- this.constructor = d;
|
||
- }
|
||
-
|
||
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
- };
|
||
-}();
|
||
-
|
||
-var __assign = this && this.__assign || function () {
|
||
- __assign = Object.assign || function (t) {
|
||
- for (var s, i = 1, n = arguments.length; i < n; i++) {
|
||
- s = arguments[i];
|
||
-
|
||
- for (var p in s) {
|
||
- if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
|
||
- }
|
||
- }
|
||
-
|
||
- return t;
|
||
- };
|
||
-
|
||
- return __assign.apply(this, arguments);
|
||
-};
|
||
-
|
||
-var __values = this && this.__values || function (o) {
|
||
- var s = typeof Symbol === "function" && Symbol.iterator,
|
||
- m = s && o[s],
|
||
- i = 0;
|
||
- if (m) return m.call(o);
|
||
- if (o && typeof o.length === "number") return {
|
||
- next: function next() {
|
||
- if (o && i >= o.length) o = void 0;
|
||
- return {
|
||
- value: o && o[i++],
|
||
- done: !o
|
||
- };
|
||
- }
|
||
- };
|
||
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
|
||
-};
|
||
-
|
||
-var __read = this && this.__read || function (o, n) {
|
||
- var m = typeof Symbol === "function" && o[Symbol.iterator];
|
||
- if (!m) return o;
|
||
- var i = m.call(o),
|
||
- r,
|
||
- ar = [],
|
||
- e;
|
||
-
|
||
- try {
|
||
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {
|
||
- ar.push(r.value);
|
||
- }
|
||
- } catch (error) {
|
||
- e = {
|
||
- error: error
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (r && !r.done && (m = i["return"])) m.call(i);
|
||
- } finally {
|
||
- if (e) throw e.error;
|
||
- }
|
||
- }
|
||
-
|
||
- return ar;
|
||
-};
|
||
-
|
||
-var __importDefault = this && this.__importDefault || function (mod) {
|
||
- return mod && mod.__esModule ? mod : {
|
||
- "default": mod
|
||
- };
|
||
-};
|
||
-
|
||
-Object.defineProperty(exports, "__esModule", {
|
||
- value: true
|
||
-});
|
||
-exports.Peer = void 0;
|
||
-
|
||
-var eventemitter3_1 = require("eventemitter3");
|
||
-
|
||
-var util_1 = require("./util");
|
||
-
|
||
-var logger_1 = __importDefault(require("./logger"));
|
||
-
|
||
-var socket_1 = require("./socket");
|
||
-
|
||
-var mediaconnection_1 = require("./mediaconnection");
|
||
-
|
||
-var dataconnection_1 = require("./dataconnection");
|
||
-
|
||
-var enums_1 = require("./enums");
|
||
-
|
||
-var api_1 = require("./api");
|
||
-
|
||
-var PeerOptions =
|
||
-/** @class */
|
||
-function () {
|
||
- function PeerOptions() {}
|
||
-
|
||
- return PeerOptions;
|
||
-}();
|
||
-/**
|
||
- * A peer who can initiate connections with other peers.
|
||
- */
|
||
-
|
||
-
|
||
-var Peer =
|
||
-/** @class */
|
||
-function (_super) {
|
||
- __extends(Peer, _super);
|
||
-
|
||
- function Peer(id, options) {
|
||
- var _this = _super.call(this) || this;
|
||
-
|
||
- _this._id = null;
|
||
- _this._lastServerId = null; // States.
|
||
-
|
||
- _this._destroyed = false; // Connections have been killed
|
||
-
|
||
- _this._disconnected = false; // Connection to PeerServer killed but P2P connections still active
|
||
-
|
||
- _this._open = false; // Sockets and such are not yet open.
|
||
-
|
||
- _this._connections = new Map(); // All connections for this peer.
|
||
-
|
||
- _this._lostMessages = new Map(); // src => [list of messages]
|
||
-
|
||
- var userId; // Deal with overloading
|
||
-
|
||
- if (id && id.constructor == Object) {
|
||
- options = id;
|
||
- } else if (id) {
|
||
- userId = id.toString();
|
||
- } // Configurize options
|
||
-
|
||
-
|
||
- options = __assign({
|
||
- debug: 0,
|
||
- host: util_1.util.CLOUD_HOST,
|
||
- port: util_1.util.CLOUD_PORT,
|
||
- path: "/",
|
||
- key: Peer.DEFAULT_KEY,
|
||
- token: util_1.util.randomToken(),
|
||
- config: util_1.util.defaultConfig
|
||
- }, options);
|
||
- _this._options = options; // Detect relative URL host.
|
||
-
|
||
- if (_this._options.host === "/") {
|
||
- _this._options.host = window.location.hostname;
|
||
- } // Set path correctly.
|
||
-
|
||
-
|
||
- if (_this._options.path) {
|
||
- if (_this._options.path[0] !== "/") {
|
||
- _this._options.path = "/" + _this._options.path;
|
||
- }
|
||
-
|
||
- if (_this._options.path[_this._options.path.length - 1] !== "/") {
|
||
- _this._options.path += "/";
|
||
- }
|
||
- } // Set whether we use SSL to same as current host
|
||
-
|
||
-
|
||
- if (_this._options.secure === undefined && _this._options.host !== util_1.util.CLOUD_HOST) {
|
||
- _this._options.secure = util_1.util.isSecure();
|
||
- } else if (_this._options.host == util_1.util.CLOUD_HOST) {
|
||
- _this._options.secure = true;
|
||
- } // Set a custom log function if present
|
||
-
|
||
-
|
||
- if (_this._options.logFunction) {
|
||
- logger_1.default.setLogFunction(_this._options.logFunction);
|
||
- }
|
||
-
|
||
- logger_1.default.logLevel = _this._options.debug || 0;
|
||
- _this._api = new api_1.API(options);
|
||
- _this._socket = _this._createServerConnection(); // Sanity checks
|
||
- // Ensure WebRTC supported
|
||
-
|
||
- if (!util_1.util.supports.audioVideo && !util_1.util.supports.data) {
|
||
- _this._delayedAbort(enums_1.PeerErrorType.BrowserIncompatible, "The current browser does not support WebRTC");
|
||
-
|
||
- return _this;
|
||
- } // Ensure alphanumeric id
|
||
-
|
||
-
|
||
- if (!!userId && !util_1.util.validateId(userId)) {
|
||
- _this._delayedAbort(enums_1.PeerErrorType.InvalidID, "ID \"" + userId + "\" is invalid");
|
||
-
|
||
- return _this;
|
||
- }
|
||
-
|
||
- if (userId) {
|
||
- _this._initialize(userId);
|
||
- } else {
|
||
- _this._api.retrieveId().then(function (id) {
|
||
- return _this._initialize(id);
|
||
- }).catch(function (error) {
|
||
- return _this._abort(enums_1.PeerErrorType.ServerError, error);
|
||
- });
|
||
- }
|
||
-
|
||
- return _this;
|
||
- }
|
||
-
|
||
- Object.defineProperty(Peer.prototype, "id", {
|
||
- get: function get() {
|
||
- return this._id;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(Peer.prototype, "options", {
|
||
- get: function get() {
|
||
- return this._options;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(Peer.prototype, "open", {
|
||
- get: function get() {
|
||
- return this._open;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(Peer.prototype, "socket", {
|
||
- get: function get() {
|
||
- return this._socket;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(Peer.prototype, "connections", {
|
||
- /**
|
||
- * @deprecated
|
||
- * Return type will change from Object to Map<string,[]>
|
||
- */
|
||
- get: function get() {
|
||
- var e_1, _a;
|
||
-
|
||
- var plainConnections = Object.create(null);
|
||
-
|
||
- try {
|
||
- for (var _b = __values(this._connections), _c = _b.next(); !_c.done; _c = _b.next()) {
|
||
- var _d = __read(_c.value, 2),
|
||
- k = _d[0],
|
||
- v = _d[1];
|
||
-
|
||
- plainConnections[k] = v;
|
||
- }
|
||
- } catch (e_1_1) {
|
||
- e_1 = {
|
||
- error: e_1_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
||
- } finally {
|
||
- if (e_1) throw e_1.error;
|
||
- }
|
||
- }
|
||
-
|
||
- return plainConnections;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(Peer.prototype, "destroyed", {
|
||
- get: function get() {
|
||
- return this._destroyed;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
- Object.defineProperty(Peer.prototype, "disconnected", {
|
||
- get: function get() {
|
||
- return this._disconnected;
|
||
- },
|
||
- enumerable: false,
|
||
- configurable: true
|
||
- });
|
||
-
|
||
- Peer.prototype._createServerConnection = function () {
|
||
- var _this = this;
|
||
-
|
||
- var socket = new socket_1.Socket(this._options.secure, this._options.host, this._options.port, this._options.path, this._options.key, this._options.pingInterval);
|
||
- socket.on(enums_1.SocketEventType.Message, function (data) {
|
||
- _this._handleMessage(data);
|
||
- });
|
||
- socket.on(enums_1.SocketEventType.Error, function (error) {
|
||
- _this._abort(enums_1.PeerErrorType.SocketError, error);
|
||
- });
|
||
- socket.on(enums_1.SocketEventType.Disconnected, function () {
|
||
- if (_this.disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- _this.emitError(enums_1.PeerErrorType.Network, "Lost connection to server.");
|
||
-
|
||
- _this.disconnect();
|
||
- });
|
||
- socket.on(enums_1.SocketEventType.Close, function () {
|
||
- if (_this.disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- _this._abort(enums_1.PeerErrorType.SocketClosed, "Underlying socket is already closed.");
|
||
- });
|
||
- return socket;
|
||
- };
|
||
- /** Initialize a connection with the server. */
|
||
-
|
||
-
|
||
- Peer.prototype._initialize = function (id) {
|
||
- this._id = id;
|
||
- this.socket.start(id, this._options.token);
|
||
- };
|
||
- /** Handles messages from the server. */
|
||
-
|
||
-
|
||
- Peer.prototype._handleMessage = function (message) {
|
||
- var e_2, _a;
|
||
-
|
||
- var type = message.type;
|
||
- var payload = message.payload;
|
||
- var peerId = message.src;
|
||
-
|
||
- switch (type) {
|
||
- case enums_1.ServerMessageType.Open:
|
||
- // The connection to the server is open.
|
||
- this._lastServerId = this.id;
|
||
- this._open = true;
|
||
- this.emit(enums_1.PeerEventType.Open, this.id);
|
||
- break;
|
||
-
|
||
- case enums_1.ServerMessageType.Error:
|
||
- // Server error.
|
||
- this._abort(enums_1.PeerErrorType.ServerError, payload.msg);
|
||
-
|
||
- break;
|
||
-
|
||
- case enums_1.ServerMessageType.IdTaken:
|
||
- // The selected ID is taken.
|
||
- this._abort(enums_1.PeerErrorType.UnavailableID, "ID \"" + 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");
|
||
-
|
||
- break;
|
||
-
|
||
- case enums_1.ServerMessageType.Leave:
|
||
- // Another peer has closed its connection to this peer.
|
||
- logger_1.default.log("Received leave message from " + peerId);
|
||
-
|
||
- this._cleanupPeer(peerId);
|
||
-
|
||
- this._connections.delete(peerId);
|
||
-
|
||
- break;
|
||
-
|
||
- 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);
|
||
- break;
|
||
-
|
||
- case enums_1.ServerMessageType.Offer:
|
||
- {
|
||
- // we should consider switching this to CALL/CONNECT, but this is the least breaking option.
|
||
- var connectionId = payload.connectionId;
|
||
- var connection = this.getConnection(peerId, connectionId);
|
||
-
|
||
- if (connection) {
|
||
- connection.close();
|
||
- logger_1.default.warn("Offer received for existing Connection ID:" + connectionId);
|
||
- } // Create a new connection.
|
||
-
|
||
-
|
||
- if (payload.type === enums_1.ConnectionType.Media) {
|
||
- connection = new mediaconnection_1.MediaConnection(peerId, this, {
|
||
- connectionId: connectionId,
|
||
- _payload: payload,
|
||
- metadata: payload.metadata
|
||
- });
|
||
-
|
||
- this._addConnection(peerId, connection);
|
||
-
|
||
- this.emit(enums_1.PeerEventType.Call, connection);
|
||
- } else if (payload.type === enums_1.ConnectionType.Data) {
|
||
- connection = new dataconnection_1.DataConnection(peerId, this, {
|
||
- connectionId: connectionId,
|
||
- _payload: payload,
|
||
- metadata: payload.metadata,
|
||
- label: payload.label,
|
||
- serialization: payload.serialization,
|
||
- reliable: payload.reliable
|
||
- });
|
||
-
|
||
- this._addConnection(peerId, connection);
|
||
-
|
||
- this.emit(enums_1.PeerEventType.Connection, connection);
|
||
- } else {
|
||
- logger_1.default.warn("Received malformed connection type:" + payload.type);
|
||
- return;
|
||
- } // Find messages.
|
||
-
|
||
-
|
||
- var messages = this._getMessages(connectionId);
|
||
-
|
||
- try {
|
||
- for (var messages_1 = __values(messages), messages_1_1 = messages_1.next(); !messages_1_1.done; messages_1_1 = messages_1.next()) {
|
||
- var message_1 = messages_1_1.value;
|
||
- connection.handleMessage(message_1);
|
||
- }
|
||
- } catch (e_2_1) {
|
||
- e_2 = {
|
||
- error: e_2_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (messages_1_1 && !messages_1_1.done && (_a = messages_1.return)) _a.call(messages_1);
|
||
- } finally {
|
||
- if (e_2) throw e_2.error;
|
||
- }
|
||
- }
|
||
-
|
||
- break;
|
||
- }
|
||
-
|
||
- default:
|
||
- {
|
||
- if (!payload) {
|
||
- logger_1.default.warn("You received a malformed message from " + peerId + " of type " + type);
|
||
- return;
|
||
- }
|
||
-
|
||
- var connectionId = payload.connectionId;
|
||
- var connection = this.getConnection(peerId, connectionId);
|
||
-
|
||
- if (connection && connection.peerConnection) {
|
||
- // Pass it on.
|
||
- connection.handleMessage(message);
|
||
- } else if (connectionId) {
|
||
- // Store for possible later use
|
||
- this._storeMessage(connectionId, message);
|
||
- } else {
|
||
- logger_1.default.warn("You received an unrecognized message:", message);
|
||
- }
|
||
-
|
||
- break;
|
||
- }
|
||
- }
|
||
- };
|
||
- /** Stores messages without a set up connection, to be claimed later. */
|
||
-
|
||
-
|
||
- Peer.prototype._storeMessage = function (connectionId, message) {
|
||
- if (!this._lostMessages.has(connectionId)) {
|
||
- this._lostMessages.set(connectionId, []);
|
||
- }
|
||
-
|
||
- this._lostMessages.get(connectionId).push(message);
|
||
- };
|
||
- /** Retrieve messages from lost message store */
|
||
- //TODO Change it to private
|
||
-
|
||
-
|
||
- Peer.prototype._getMessages = function (connectionId) {
|
||
- var messages = this._lostMessages.get(connectionId);
|
||
-
|
||
- if (messages) {
|
||
- this._lostMessages.delete(connectionId);
|
||
-
|
||
- return messages;
|
||
- }
|
||
-
|
||
- return [];
|
||
- };
|
||
- /**
|
||
- * Returns a DataConnection to the specified peer. See documentation for a
|
||
- * complete list of options.
|
||
- */
|
||
-
|
||
-
|
||
- Peer.prototype.connect = function (peer, options) {
|
||
- if (options === void 0) {
|
||
- options = {};
|
||
- }
|
||
-
|
||
- if (this.disconnected) {
|
||
- logger_1.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.");
|
||
- this.emitError(enums_1.PeerErrorType.Disconnected, "Cannot connect to new Peer after disconnecting from server.");
|
||
- return;
|
||
- }
|
||
-
|
||
- var dataConnection = new dataconnection_1.DataConnection(peer, this, options);
|
||
-
|
||
- this._addConnection(peer, dataConnection);
|
||
-
|
||
- return dataConnection;
|
||
- };
|
||
- /**
|
||
- * Returns a MediaConnection to the specified peer. See documentation for a
|
||
- * complete list of options.
|
||
- */
|
||
-
|
||
-
|
||
- Peer.prototype.call = function (peer, stream, options) {
|
||
- if (options === void 0) {
|
||
- options = {};
|
||
- }
|
||
-
|
||
- if (this.disconnected) {
|
||
- logger_1.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.");
|
||
- this.emitError(enums_1.PeerErrorType.Disconnected, "Cannot connect to new Peer after disconnecting from server.");
|
||
- return;
|
||
- }
|
||
-
|
||
- if (!stream) {
|
||
- logger_1.default.error("To call a peer, you must provide a stream from your browser's `getUserMedia`.");
|
||
- return;
|
||
- }
|
||
-
|
||
- options._stream = stream;
|
||
- var mediaConnection = new mediaconnection_1.MediaConnection(peer, this, options);
|
||
-
|
||
- this._addConnection(peer, mediaConnection);
|
||
-
|
||
- return mediaConnection;
|
||
- };
|
||
- /** Add a data/media connection to this peer. */
|
||
-
|
||
-
|
||
- Peer.prototype._addConnection = function (peerId, connection) {
|
||
- logger_1.default.log("add connection " + connection.type + ":" + connection.connectionId + " to peerId:" + peerId);
|
||
-
|
||
- if (!this._connections.has(peerId)) {
|
||
- this._connections.set(peerId, []);
|
||
- }
|
||
-
|
||
- this._connections.get(peerId).push(connection);
|
||
- }; //TODO should be private
|
||
-
|
||
-
|
||
- Peer.prototype._removeConnection = function (connection) {
|
||
- var connections = this._connections.get(connection.peer);
|
||
-
|
||
- if (connections) {
|
||
- var index = connections.indexOf(connection);
|
||
-
|
||
- if (index !== -1) {
|
||
- connections.splice(index, 1);
|
||
- }
|
||
- } //remove from lost messages
|
||
-
|
||
-
|
||
- this._lostMessages.delete(connection.connectionId);
|
||
- };
|
||
- /** Retrieve a data/media connection for this peer. */
|
||
-
|
||
-
|
||
- Peer.prototype.getConnection = function (peerId, connectionId) {
|
||
- var e_3, _a;
|
||
-
|
||
- var connections = this._connections.get(peerId);
|
||
-
|
||
- if (!connections) {
|
||
- return null;
|
||
- }
|
||
-
|
||
- try {
|
||
- for (var connections_1 = __values(connections), connections_1_1 = connections_1.next(); !connections_1_1.done; connections_1_1 = connections_1.next()) {
|
||
- var connection = connections_1_1.value;
|
||
-
|
||
- if (connection.connectionId === connectionId) {
|
||
- return connection;
|
||
- }
|
||
- }
|
||
- } catch (e_3_1) {
|
||
- e_3 = {
|
||
- error: e_3_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (connections_1_1 && !connections_1_1.done && (_a = connections_1.return)) _a.call(connections_1);
|
||
- } finally {
|
||
- if (e_3) throw e_3.error;
|
||
- }
|
||
- }
|
||
-
|
||
- return null;
|
||
- };
|
||
-
|
||
- Peer.prototype._delayedAbort = function (type, message) {
|
||
- var _this = this;
|
||
-
|
||
- setTimeout(function () {
|
||
- _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.
|
||
- */
|
||
-
|
||
-
|
||
- Peer.prototype._abort = function (type, message) {
|
||
- logger_1.default.error("Aborting!");
|
||
- this.emitError(type, message);
|
||
-
|
||
- if (!this._lastServerId) {
|
||
- this.destroy();
|
||
- } else {
|
||
- this.disconnect();
|
||
- }
|
||
- };
|
||
- /** Emits a typed error message. */
|
||
-
|
||
-
|
||
- Peer.prototype.emitError = function (type, err) {
|
||
- logger_1.default.error("Error:", err);
|
||
- var error;
|
||
-
|
||
- if (typeof err === "string") {
|
||
- error = new Error(err);
|
||
- } else {
|
||
- error = err;
|
||
- }
|
||
-
|
||
- 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.
|
||
- */
|
||
-
|
||
-
|
||
- Peer.prototype.destroy = function () {
|
||
- if (this.destroyed) {
|
||
- return;
|
||
- }
|
||
-
|
||
- logger_1.default.log("Destroy peer with ID:" + this.id);
|
||
- this.disconnect();
|
||
-
|
||
- this._cleanup();
|
||
-
|
||
- this._destroyed = true;
|
||
- this.emit(enums_1.PeerEventType.Close);
|
||
- };
|
||
- /** Disconnects every connection on this peer. */
|
||
-
|
||
-
|
||
- Peer.prototype._cleanup = function () {
|
||
- var e_4, _a;
|
||
-
|
||
- try {
|
||
- for (var _b = __values(this._connections.keys()), _c = _b.next(); !_c.done; _c = _b.next()) {
|
||
- var peerId = _c.value;
|
||
-
|
||
- this._cleanupPeer(peerId);
|
||
-
|
||
- this._connections.delete(peerId);
|
||
- }
|
||
- } catch (e_4_1) {
|
||
- e_4 = {
|
||
- error: e_4_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
|
||
- } finally {
|
||
- if (e_4) throw e_4.error;
|
||
- }
|
||
- }
|
||
-
|
||
- this.socket.removeAllListeners();
|
||
- };
|
||
- /** Closes all connections to this peer. */
|
||
-
|
||
-
|
||
- Peer.prototype._cleanupPeer = function (peerId) {
|
||
- var e_5, _a;
|
||
-
|
||
- var connections = this._connections.get(peerId);
|
||
-
|
||
- if (!connections) return;
|
||
-
|
||
- try {
|
||
- for (var connections_2 = __values(connections), connections_2_1 = connections_2.next(); !connections_2_1.done; connections_2_1 = connections_2.next()) {
|
||
- var connection = connections_2_1.value;
|
||
- connection.close();
|
||
- }
|
||
- } catch (e_5_1) {
|
||
- e_5 = {
|
||
- error: e_5_1
|
||
- };
|
||
- } finally {
|
||
- try {
|
||
- if (connections_2_1 && !connections_2_1.done && (_a = connections_2.return)) _a.call(connections_2);
|
||
- } finally {
|
||
- if (e_5) throw e_5.error;
|
||
- }
|
||
- }
|
||
- };
|
||
- /**
|
||
- * 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.
|
||
- */
|
||
-
|
||
-
|
||
- Peer.prototype.disconnect = function () {
|
||
- if (this.disconnected) {
|
||
- return;
|
||
- }
|
||
-
|
||
- var currentId = this.id;
|
||
- logger_1.default.log("Disconnect peer with ID:" + currentId);
|
||
- this._disconnected = true;
|
||
- this._open = false;
|
||
- this.socket.close();
|
||
- this._lastServerId = currentId;
|
||
- this._id = null;
|
||
- this.emit(enums_1.PeerEventType.Disconnected, currentId);
|
||
- };
|
||
- /** Attempts to reconnect with the same ID. */
|
||
-
|
||
-
|
||
- Peer.prototype.reconnect = function () {
|
||
- if (this.disconnected && !this.destroyed) {
|
||
- logger_1.default.log("Attempting reconnection to server with ID " + this._lastServerId);
|
||
- this._disconnected = false;
|
||
-
|
||
- this._initialize(this._lastServerId);
|
||
- } else if (this.destroyed) {
|
||
- throw new Error("This peer cannot reconnect to the server. It has already been destroyed.");
|
||
- } else if (!this.disconnected && !this.open) {
|
||
- // 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!");
|
||
- }
|
||
- };
|
||
- /**
|
||
- * 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.
|
||
- */
|
||
-
|
||
-
|
||
- Peer.prototype.listAllPeers = function (cb) {
|
||
- var _this = this;
|
||
-
|
||
- if (cb === void 0) {
|
||
- cb = function cb(_) {};
|
||
- }
|
||
-
|
||
- this._api.listAllPeers().then(function (peers) {
|
||
- return cb(peers);
|
||
- }).catch(function (error) {
|
||
- return _this._abort(enums_1.PeerErrorType.ServerError, error);
|
||
- });
|
||
- };
|
||
-
|
||
- Peer.DEFAULT_KEY = "peerjs";
|
||
- return Peer;
|
||
-}(eventemitter3_1.EventEmitter);
|
||
-
|
||
-exports.Peer = Peer;
|
||
-},{"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: true
|
||
-});
|
||
-exports.peerjs = void 0;
|
||
-
|
||
-var util_1 = require("./util");
|
||
-
|
||
-var peer_1 = require("./peer");
|
||
-
|
||
-exports.peerjs = {
|
||
- Peer: peer_1.Peer,
|
||
- util: util_1.util
|
||
-};
|
||
-exports.default = peer_1.Peer;
|
||
-window.peerjs = exports.peerjs;
|
||
-/** @deprecated Should use peerjs namespace */
|
||
-
|
||
-window.Peer = peer_1.Peer;
|
||
-},{"./util":"BHXf","./peer":"Hxpd"}]},{},["iTK6"], null)
|
||
-//# sourceMappingURL=/peerjs.js.map
|
||
\ No newline at end of file
|
||
diff --git a/node_modules/peerjs/dist/peerjs.js.map b/node_modules/peerjs/dist/peerjs.js.map
|
||
deleted file mode 100644
|
||
index fd1786e..0000000
|
||
--- a/node_modules/peerjs/dist/peerjs.js.map
|
||
+++ /dev/null
|
||
@@ -1 +0,0 @@
|
||
-{"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,EAA4D8J,QAA5D,EAAsE;AACpE,MAAI7C,GAAG,GAAGqC,QAAQ,CAACS,mBAAT,CAA6BzH,WAAW,CAACpE,IAAzC,EAA+C2L,IAA/C,CAAV,CADoE,CAGpE;;AACA5C,EAAAA,GAAG,IAAIqC,QAAQ,CAACU,kBAAT,CACH1H,WAAW,CAAC2H,WAAZ,CAAwBC,kBAAxB,EADG,CAAP,CAJoE,CAOpE;;AACAjD,EAAAA,GAAG,IAAIqC,QAAQ,CAACa,mBAAT,CACH7H,WAAW,CAAC8H,aAAZ,CAA0BF,kBAA1B,EADG,EAEHlP,IAAI,KAAK,OAAT,GAAmB,SAAnB,GAA+B8O,QAAQ,IAAI,QAFxC,CAAP;AAIA7C,EAAAA,GAAG,IAAI,WAAW3E,WAAW,CAAC+H,GAAvB,GAA6B,MAApC;;AAEA,MAAI/H,WAAW,CAACgI,SAAZ,IAAyBhI,WAAW,CAACiI,WAAzC,EAAsD;AACpDtD,IAAAA,GAAG,IAAI,gBAAP;AACD,GAFD,MAEO,IAAI3E,WAAW,CAACgI,SAAhB,EAA2B;AAChCrD,IAAAA,GAAG,IAAI,gBAAP;AACD,GAFM,MAEA,IAAI3E,WAAW,CAACiI,WAAhB,EAA6B;AAClCtD,IAAAA,GAAG,IAAI,gBAAP;AACD,GAFM,MAEA;AACLA,IAAAA,GAAG,IAAI,gBAAP;AACD;;AAED,MAAI3E,WAAW,CAACgI,SAAhB,EAA2B;AACzB,QAAIlP,OAAO,GAAGkH,WAAW,CAACgI,SAAZ,CAAsBE,eAAtB,IACVlI,WAAW,CAACgI,SAAZ,CAAsB3P,KAAtB,CAA4BL,EADhC;AAEAgI,IAAAA,WAAW,CAACgI,SAAZ,CAAsBE,eAAtB,GAAwCpP,OAAxC,CAHyB,CAIzB;;AACA,QAAIqP,IAAI,GAAG,WAAWzK,MAAM,GAAGA,MAAM,CAAC1F,EAAV,GAAe,GAAhC,IAAuC,GAAvC,GACPc,OADO,GACG,MADd;AAEA6L,IAAAA,GAAG,IAAI,OAAOwD,IAAd,CAPyB,CAQzB;;AACAxD,IAAAA,GAAG,IAAI,YAAY3E,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCC,IAAlD,GACH,GADG,GACGF,IADV,CATyB,CAYzB;;AACA,QAAInI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAA1C,EAA+C;AAC7C3D,MAAAA,GAAG,IAAI,YAAY3E,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAAtC,CAA0CD,IAAtD,GACH,GADG,GACGF,IADV;AAEAxD,MAAAA,GAAG,IAAI,sBACH3E,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCC,IADnC,GAC0C,GAD1C,GAEHrI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAAtC,CAA0CD,IAFvC,GAGH,MAHJ;AAID;AACF,GA7CmE,CA8CpE;;;AACA1D,EAAAA,GAAG,IAAI,YAAY3E,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCC,IAAlD,GACH,SADG,GACSrB,QAAQ,CAACuB,UADlB,GAC+B,MADtC;;AAEA,MAAIvI,WAAW,CAACgI,SAAZ,IAAyBhI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAAnE,EAAwE;AACtE3D,IAAAA,GAAG,IAAI,YAAY3E,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAAtC,CAA0CD,IAAtD,GACH,SADG,GACSrB,QAAQ,CAACuB,UADlB,GAC+B,MADtC;AAED;;AACD,SAAO5D,GAAP;AACD,EAED;AACA;AACA;AACA;AACA;;;AACA,SAAS2B,gBAAT,CAA0BC,UAA1B,EAAsCC,WAAtC,EAAmD;AACjD,MAAIC,OAAO,GAAG,KAAd;AACAF,EAAAA,UAAU,GAAG9L,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAe4L,UAAf,CAAX,CAAb;AACA,SAAOA,UAAU,CAAC7K,MAAX,CAAkB,UAASgL,MAAT,EAAiB;AACxC,QAAIA,MAAM,KAAKA,MAAM,CAACC,IAAP,IAAeD,MAAM,CAACE,GAA3B,CAAV,EAA2C;AACzC,UAAID,IAAI,GAAGD,MAAM,CAACC,IAAP,IAAeD,MAAM,CAACE,GAAjC;;AACA,UAAIF,MAAM,CAACE,GAAP,IAAc,CAACF,MAAM,CAACC,IAA1B,EAAgC;AAC9BhR,QAAAA,OAAO,CAACI,IAAR,CAAa,mDAAb;AACD;;AACD,UAAI8Q,QAAQ,GAAG,OAAOF,IAAP,KAAgB,QAA/B;;AACA,UAAIE,QAAJ,EAAc;AACZF,QAAAA,IAAI,GAAG,CAACA,IAAD,CAAP;AACD;;AACDA,MAAAA,IAAI,GAAGA,IAAI,CAACjL,MAAL,CAAY,UAASkL,GAAT,EAAc;AAC/B,YAAIE,SAAS,GAAGF,GAAG,CAAC1F,OAAJ,CAAY,OAAZ,MAAyB,CAAzB,IACZ0F,GAAG,CAAC1F,OAAJ,CAAY,eAAZ,MAAiC,CAAC,CADtB,IAEZ0F,GAAG,CAAC1F,OAAJ,CAAY,QAAZ,MAA0B,CAAC,CAFf,IAGZ,CAACuF,OAHL;;AAKA,YAAIK,SAAJ,EAAe;AACbL,UAAAA,OAAO,GAAG,IAAV;AACA,iBAAO,IAAP;AACD;;AACD,eAAOG,GAAG,CAAC1F,OAAJ,CAAY,OAAZ,MAAyB,CAAzB,IAA8BsF,WAAW,IAAI,KAA7C,IACHI,GAAG,CAAC1F,OAAJ,CAAY,gBAAZ,MAAkC,CAAC,CADvC;AAED,OAZM,CAAP;AAcA,aAAOwF,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,GA5BM,CAAP;AA6BD,EAED;;;AACA,SAASoV,qBAAT,CAA+BC,iBAA/B,EAAkDC,kBAAlD,EAAsE;AACpE,MAAIC,kBAAkB,GAAG;AACvBC,IAAAA,MAAM,EAAE,EADe;AAEvBC,IAAAA,gBAAgB,EAAE,EAFK;AAGvBC,IAAAA,aAAa,EAAE;AAHQ,GAAzB;;AAMA,MAAIC,sBAAsB,GAAG,UAASC,EAAT,EAAaJ,MAAb,EAAqB;AAChDI,IAAAA,EAAE,GAAG3V,QAAQ,CAAC2V,EAAD,EAAK,EAAL,CAAb;;AACA,SAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGL,MAAM,CAACxV,MAA3B,EAAmC6V,CAAC,EAApC,EAAwC;AACtC,UAAIL,MAAM,CAACK,CAAD,CAAN,CAAUC,WAAV,KAA0BF,EAA1B,IACAJ,MAAM,CAACK,CAAD,CAAN,CAAUE,oBAAV,KAAmCH,EADvC,EAC2C;AACzC,eAAOJ,MAAM,CAACK,CAAD,CAAb;AACD;AACF;AACF,GARD;;AAUA,MAAIG,oBAAoB,GAAG,UAASC,IAAT,EAAeC,IAAf,EAAqBC,OAArB,EAA8BC,OAA9B,EAAuC;AAChE,QAAIC,MAAM,GAAGV,sBAAsB,CAACM,IAAI,CAACK,UAAL,CAAgBC,GAAjB,EAAsBJ,OAAtB,CAAnC;AACA,QAAIK,MAAM,GAAGb,sBAAsB,CAACO,IAAI,CAACI,UAAL,CAAgBC,GAAjB,EAAsBH,OAAtB,CAAnC;AACA,WAAOC,MAAM,IAAIG,MAAV,IACHH,MAAM,CAACvR,IAAP,CAAY+D,WAAZ,OAA8B2N,MAAM,CAAC1R,IAAP,CAAY+D,WAAZ,EADlC;AAED,GALD;;AAOAwM,EAAAA,iBAAiB,CAACG,MAAlB,CAAyB3Q,OAAzB,CAAiC,UAASwR,MAAT,EAAiB;AAChD,SAAK,IAAIR,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGP,kBAAkB,CAACE,MAAnB,CAA0BxV,MAA9C,EAAsD6V,CAAC,EAAvD,EAA2D;AACzD,UAAIW,MAAM,GAAGlB,kBAAkB,CAACE,MAAnB,CAA0BK,CAA1B,CAAb;;AACA,UAAIQ,MAAM,CAACvR,IAAP,CAAY+D,WAAZ,OAA8B2N,MAAM,CAAC1R,IAAP,CAAY+D,WAAZ,EAA9B,IACAwN,MAAM,CAACI,SAAP,KAAqBD,MAAM,CAACC,SADhC,EAC2C;AACzC,YAAIJ,MAAM,CAACvR,IAAP,CAAY+D,WAAZ,OAA8B,KAA9B,IACAwN,MAAM,CAACC,UADP,IACqBE,MAAM,CAACF,UAAP,CAAkBC,GAD3C,EACgD;AAC9C;AACA;AACA,cAAI,CAACP,oBAAoB,CAACK,MAAD,EAASG,MAAT,EACrBnB,iBAAiB,CAACG,MADG,EACKF,kBAAkB,CAACE,MADxB,CAAzB,EAC0D;AACxD;AACD;AACF;;AACDgB,QAAAA,MAAM,GAAGnP,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAeiP,MAAf,CAAX,CAAT,CAVyC,CAUI;AAC7C;;AACAA,QAAAA,MAAM,CAACE,WAAP,GAAqBC,IAAI,CAACpQ,GAAL,CAAS8P,MAAM,CAACK,WAAhB,EACjBF,MAAM,CAACE,WADU,CAArB,CAZyC,CAczC;;AACAnB,QAAAA,kBAAkB,CAACC,MAAnB,CAA0BhQ,IAA1B,CAA+BgR,MAA/B,EAfyC,CAiBzC;;AACAA,QAAAA,MAAM,CAACI,YAAP,GAAsBJ,MAAM,CAACI,YAAP,CAAoBtO,MAApB,CAA2B,UAASuO,EAAT,EAAa;AAC5D,eAAK,IAAIC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGT,MAAM,CAACO,YAAP,CAAoB5W,MAAxC,EAAgD8W,CAAC,EAAjD,EAAqD;AACnD,gBAAIT,MAAM,CAACO,YAAP,CAAoBE,CAApB,EAAuBxR,IAAvB,KAAgCuR,EAAE,CAACvR,IAAnC,IACA+Q,MAAM,CAACO,YAAP,CAAoBE,CAApB,EAAuBC,SAAvB,KAAqCF,EAAE,CAACE,SAD5C,EACuD;AACrD,qBAAO,IAAP;AACD;AACF;;AACD,iBAAO,KAAP;AACD,SARqB,CAAtB,CAlByC,CA2BzC;AACA;;AACA;AACD;AACF;AACF,GApCD;AAsCA1B,EAAAA,iBAAiB,CAACI,gBAAlB,CAAmC5Q,OAAnC,CAA2C,UAASmS,gBAAT,EAA2B;AACpE,SAAK,IAAInB,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGP,kBAAkB,CAACG,gBAAnB,CAAoCzV,MAAxD,EACK6V,CAAC,EADN,EACU;AACR,UAAIoB,gBAAgB,GAAG3B,kBAAkB,CAACG,gBAAnB,CAAoCI,CAApC,CAAvB;;AACA,UAAImB,gBAAgB,CAACE,GAAjB,KAAyBD,gBAAgB,CAACC,GAA9C,EAAmD;AACjD3B,QAAAA,kBAAkB,CAACE,gBAAnB,CAAoCjQ,IAApC,CAAyCyR,gBAAzC;AACA;AACD;AACF;AACF,GATD,EA9DoE,CAyEpE;;AACA,SAAO1B,kBAAP;AACD,EAED;;;AACA,SAAS4B,+BAAT,CAAyCC,MAAzC,EAAiD9R,IAAjD,EAAuD4L,cAAvD,EAAuE;AACrE,SAAO;AACLmG,IAAAA,KAAK,EAAE;AACL/E,MAAAA,mBAAmB,EAAE,CAAC,QAAD,EAAW,kBAAX,CADhB;AAELjG,MAAAA,oBAAoB,EAAE,CAAC,QAAD,EAAW,mBAAX;AAFjB,KADF;AAKLiL,IAAAA,MAAM,EAAE;AACNhF,MAAAA,mBAAmB,EAAE,CAAC,mBAAD,EAAsB,qBAAtB,CADf;AAENjG,MAAAA,oBAAoB,EAAE,CAAC,kBAAD,EAAqB,sBAArB;AAFhB;AALH,IASL/G,IATK,EASC8R,MATD,EASStJ,OATT,CASiBoD,cATjB,MASqC,CAAC,CAT7C;AAUD;;AAED,SAASqG,iBAAT,CAA2BC,YAA3B,EAAyCC,SAAzC,EAAoD;AAClD;AACA;AACA,MAAIC,YAAY,GAAGF,YAAY,CAACG,mBAAb,GACdjP,IADc,CACT,UAASkP,eAAT,EAA0B;AAC9B,WAAOH,SAAS,CAACI,UAAV,KAAyBD,eAAe,CAACC,UAAzC,IACHJ,SAAS,CAACK,EAAV,KAAiBF,eAAe,CAACE,EAD9B,IAEHL,SAAS,CAACM,IAAV,KAAmBH,eAAe,CAACG,IAFhC,IAGHN,SAAS,CAACO,QAAV,KAAuBJ,eAAe,CAACI,QAHpC,IAIHP,SAAS,CAACQ,QAAV,KAAuBL,eAAe,CAACK,QAJpC,IAKHR,SAAS,CAACnS,IAAV,KAAmBsS,eAAe,CAACtS,IALvC;AAMD,GARc,CAAnB;;AASA,MAAI,CAACoS,YAAL,EAAmB;AACjBF,IAAAA,YAAY,CAACU,kBAAb,CAAgCT,SAAhC;AACD;;AACD,SAAO,CAACC,YAAR;AACD;;AAGD,SAASS,SAAT,CAAmBrT,IAAnB,EAAyBwM,WAAzB,EAAsC;AACpC,MAAItQ,CAAC,GAAG,IAAIoB,KAAJ,CAAUkP,WAAV,CAAR;AACAtQ,EAAAA,CAAC,CAAC8D,IAAF,GAASA,IAAT,CAFoC,CAGpC;;AACA9D,EAAAA,CAAC,CAACoX,IAAF,GAAS;AACPC,IAAAA,iBAAiB,EAAE,CADZ;AAEPlP,IAAAA,iBAAiB,EAAE,EAFZ;AAGPmP,IAAAA,kBAAkB,EAAE,EAHb;AAIPC,IAAAA,SAAS,EAAEjU,SAJJ;AAKPkU,IAAAA,cAAc,EAAElU;AALT,IAMPQ,IANO,CAAT;AAOA,SAAO9D,CAAP;AACD;;AAEDyX,MAAM,CAACC,OAAP,GAAiB,UAASvY,MAAT,EAAiBiT,WAAjB,EAA8B;AAC7C;AACA;AACA;AACA,WAASuF,4BAAT,CAAsC1T,KAAtC,EAA6CqF,MAA7C,EAAqD;AACnDA,IAAAA,MAAM,CAACmD,QAAP,CAAgBxI,KAAhB;AACAqF,IAAAA,MAAM,CAACwC,aAAP,CAAqB,IAAI3M,MAAM,CAACyY,qBAAX,CAAiC,UAAjC,EACjB;AAAC3T,MAAAA,KAAK,EAAEA;AAAR,KADiB,CAArB;AAED;;AAED,WAAS4T,iCAAT,CAA2C5T,KAA3C,EAAkDqF,MAAlD,EAA0D;AACxDA,IAAAA,MAAM,CAACsD,WAAP,CAAmB3I,KAAnB;AACAqF,IAAAA,MAAM,CAACwC,aAAP,CAAqB,IAAI3M,MAAM,CAACyY,qBAAX,CAAiC,aAAjC,EACjB;AAAC3T,MAAAA,KAAK,EAAEA;AAAR,KADiB,CAArB;AAED;;AAED,WAAS6T,YAAT,CAAsB7L,EAAtB,EAA0BhI,KAA1B,EAAiCuH,QAAjC,EAA2CK,OAA3C,EAAoD;AAClD,QAAIkM,UAAU,GAAG,IAAIpM,KAAJ,CAAU,OAAV,CAAjB;AACAoM,IAAAA,UAAU,CAAC9T,KAAX,GAAmBA,KAAnB;AACA8T,IAAAA,UAAU,CAACvM,QAAX,GAAsBA,QAAtB;AACAuM,IAAAA,UAAU,CAACnM,WAAX,GAAyB;AAACJ,MAAAA,QAAQ,EAAEA;AAAX,KAAzB;AACAuM,IAAAA,UAAU,CAAClM,OAAX,GAAqBA,OAArB;AACA1M,IAAAA,MAAM,CAAC6Y,UAAP,CAAkB,YAAW;AAC3B/L,MAAAA,EAAE,CAACgM,cAAH,CAAkB,OAAlB,EAA2BF,UAA3B;AACD,KAFD;AAGD;;AAED,MAAIzY,iBAAiB,GAAG,UAAS4Y,MAAT,EAAiB;AACvC,QAAIjM,EAAE,GAAG,IAAT;;AAEA,QAAIkM,YAAY,GAAGC,QAAQ,CAACC,sBAAT,EAAnB;;AACA,KAAC,kBAAD,EAAqB,qBAArB,EAA4C,eAA5C,EACKxU,OADL,CACa,UAASkN,MAAT,EAAiB;AACxB9E,MAAAA,EAAE,CAAC8E,MAAD,CAAF,GAAaoH,YAAY,CAACpH,MAAD,CAAZ,CAAqB5H,IAArB,CAA0BgP,YAA1B,CAAb;AACD,KAHL;AAKA,SAAKG,uBAAL,GAA+B,IAA/B;AAEA,SAAKC,eAAL,GAAuB,KAAvB;AAEA,SAAKC,YAAL,GAAoB,EAApB;AACA,SAAKC,aAAL,GAAqB,EAArB;AAEA,SAAKC,iBAAL,GAAyB,IAAzB;AACA,SAAKC,kBAAL,GAA0B,IAA1B;AAEA,SAAKzI,cAAL,GAAsB,QAAtB;AACA,SAAK0I,kBAAL,GAA0B,KAA1B;AACA,SAAKC,eAAL,GAAuB,KAAvB;AACA,SAAKC,iBAAL,GAAyB,KAAzB;AAEAZ,IAAAA,MAAM,GAAG7R,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAe2R,MAAM,IAAI,EAAzB,CAAX,CAAT;AAEA,SAAKa,WAAL,GAAmBb,MAAM,CAACc,YAAP,KAAwB,YAA3C;;AACA,QAAId,MAAM,CAACe,aAAP,KAAyB,WAA7B,EAA0C;AACxC,YAAM9B,SAAS,CAAC,mBAAD,EACX,8CADW,CAAf;AAED,KAHD,MAGO,IAAI,CAACe,MAAM,CAACe,aAAZ,EAA2B;AAChCf,MAAAA,MAAM,CAACe,aAAP,GAAuB,SAAvB;AACD;;AAED,YAAQf,MAAM,CAACgB,kBAAf;AACE,WAAK,KAAL;AACA,WAAK,OAAL;AACE;;AACF;AACEhB,QAAAA,MAAM,CAACgB,kBAAP,GAA4B,KAA5B;AACA;AANJ;;AASA,YAAQhB,MAAM,CAACc,YAAf;AACE,WAAK,UAAL;AACA,WAAK,YAAL;AACA,WAAK,YAAL;AACE;;AACF;AACEd,QAAAA,MAAM,CAACc,YAAP,GAAsB,UAAtB;AACA;AAPJ;;AAUAd,IAAAA,MAAM,CAAC/F,UAAP,GAAoBD,gBAAgB,CAACgG,MAAM,CAAC/F,UAAP,IAAqB,EAAtB,EAA0BC,WAA1B,CAApC;AAEA,SAAK+G,aAAL,GAAqB,EAArB;;AACA,QAAIjB,MAAM,CAACkB,oBAAX,EAAiC;AAC/B,WAAK,IAAIvE,CAAC,GAAGqD,MAAM,CAACkB,oBAApB,EAA0CvE,CAAC,GAAG,CAA9C,EAAiDA,CAAC,EAAlD,EAAsD;AACpD,aAAKsE,aAAL,CAAmB3U,IAAnB,CAAwB,IAAIrF,MAAM,CAACmD,cAAX,CAA0B;AAChD6P,UAAAA,UAAU,EAAE+F,MAAM,CAAC/F,UAD6B;AAEhDkH,UAAAA,YAAY,EAAEnB,MAAM,CAACgB;AAF2B,SAA1B,CAAxB;AAID;AACF,KAPD,MAOO;AACLhB,MAAAA,MAAM,CAACkB,oBAAP,GAA8B,CAA9B;AACD;;AAED,SAAKE,OAAL,GAAepB,MAAf,CAnEuC,CAqEvC;AACA;;AACA,SAAKqB,YAAL,GAAoB,EAApB;AAEA,SAAKC,aAAL,GAAqB5G,QAAQ,CAAC6G,iBAAT,EAArB;AACA,SAAKC,kBAAL,GAA0B,CAA1B;AAEA,SAAKC,SAAL,GAAiBrW,SAAjB,CA5EuC,CA4EX;;AAE5B,SAAKsW,SAAL,GAAiB,KAAjB;AACD,GA/ED;;AAiFA/Y,EAAAA,MAAM,CAACE,cAAP,CAAsBzB,iBAAiB,CAACE,SAAxC,EAAmD,kBAAnD,EAAuE;AACrEyB,IAAAA,YAAY,EAAE,IADuD;AAErEP,IAAAA,GAAG,EAAE,YAAW;AACd,aAAO,KAAKgY,iBAAZ;AACD;AAJoE,GAAvE;AAMA7X,EAAAA,MAAM,CAACE,cAAP,CAAsBzB,iBAAiB,CAACE,SAAxC,EAAmD,mBAAnD,EAAwE;AACtEyB,IAAAA,YAAY,EAAE,IADwD;AAEtEP,IAAAA,GAAG,EAAE,YAAW;AACd,aAAO,KAAKiY,kBAAZ;AACD;AAJqE,GAAxE,EAlH6C,CAyH7C;;AACArZ,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bqa,cAA5B,GAA6C,IAA7C;AACAva,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bsa,WAA5B,GAA0C,IAA1C;AACAxa,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bua,OAA5B,GAAsC,IAAtC;AACAza,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bwa,cAA5B,GAA6C,IAA7C;AACA1a,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bya,sBAA5B,GAAqD,IAArD;AACA3a,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B0a,0BAA5B,GAAyD,IAAzD;AACA5a,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B2a,uBAA5B,GAAsD,IAAtD;AACA7a,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B4a,yBAA5B,GAAwD,IAAxD;AACA9a,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B6a,mBAA5B,GAAkD,IAAlD;AACA/a,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B8a,aAA5B,GAA4C,IAA5C;;AAEAhb,EAAAA,iBAAiB,CAACE,SAAlB,CAA4ByY,cAA5B,GAA6C,UAASnU,IAAT,EAAe4H,KAAf,EAAsB;AACjE,QAAI,KAAKkO,SAAT,EAAoB;AAClB;AACD;;AACD,SAAK9N,aAAL,CAAmBJ,KAAnB;;AACA,QAAI,OAAO,KAAK,OAAO5H,IAAZ,CAAP,KAA6B,UAAjC,EAA6C;AAC3C,WAAK,OAAOA,IAAZ,EAAkB4H,KAAlB;AACD;AACF,GARD;;AAUApM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B+a,yBAA5B,GAAwD,YAAW;AACjE,QAAI7O,KAAK,GAAG,IAAIC,KAAJ,CAAU,yBAAV,CAAZ;;AACA,SAAKsM,cAAL,CAAoB,yBAApB,EAA+CvM,KAA/C;AACD,GAHD;;AAKApM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BwS,gBAA5B,GAA+C,YAAW;AACxD,WAAO,KAAKsH,OAAZ;AACD,GAFD;;AAIAha,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B6P,eAA5B,GAA8C,YAAW;AACvD,WAAO,KAAKmJ,YAAZ;AACD,GAFD;;AAIAlZ,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bgb,gBAA5B,GAA+C,YAAW;AACxD,WAAO,KAAK/B,aAAZ;AACD,GAFD,CA5J6C,CAgK7C;AACA;;;AACAnZ,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bib,kBAA5B,GAAiD,UAASjT,IAAT,EAAekT,QAAf,EAAyB;AACxE,QAAIC,kBAAkB,GAAG,KAAKpB,YAAL,CAAkBva,MAAlB,GAA2B,CAApD;AACA,QAAI4M,WAAW,GAAG;AAChB3H,MAAAA,KAAK,EAAE,IADS;AAEhBsP,MAAAA,WAAW,EAAE,IAFG;AAGhBiD,MAAAA,YAAY,EAAE,IAHE;AAIhB9C,MAAAA,aAAa,EAAE,IAJC;AAKhBW,MAAAA,iBAAiB,EAAE,IALH;AAMhBC,MAAAA,kBAAkB,EAAE,IANJ;AAOhBV,MAAAA,SAAS,EAAE,IAPK;AAQhBC,MAAAA,WAAW,EAAE,IARG;AAShBrM,MAAAA,IAAI,EAAEA,IATU;AAUhBmM,MAAAA,GAAG,EAAE,IAVW;AAWhBK,MAAAA,sBAAsB,EAAE,IAXR;AAYhB4G,MAAAA,sBAAsB,EAAE,IAZR;AAahBtR,MAAAA,MAAM,EAAE,IAbQ;AAchBuR,MAAAA,4BAA4B,EAAE,EAdd;AAehBC,MAAAA,WAAW,EAAE;AAfG,KAAlB;;AAiBA,QAAI,KAAK/B,WAAL,IAAoB4B,kBAAxB,EAA4C;AAC1C/O,MAAAA,WAAW,CAAC4K,YAAZ,GAA2B,KAAK+C,YAAL,CAAkB,CAAlB,EAAqB/C,YAAhD;AACA5K,MAAAA,WAAW,CAAC8H,aAAZ,GAA4B,KAAK6F,YAAL,CAAkB,CAAlB,EAAqB7F,aAAjD;AACD,KAHD,MAGO;AACL,UAAIqH,UAAU,GAAG,KAAKC,2BAAL,EAAjB;;AACApP,MAAAA,WAAW,CAAC4K,YAAZ,GAA2BuE,UAAU,CAACvE,YAAtC;AACA5K,MAAAA,WAAW,CAAC8H,aAAZ,GAA4BqH,UAAU,CAACrH,aAAvC;AACD;;AACD,QAAI,CAACgH,QAAL,EAAe;AACb,WAAKnB,YAAL,CAAkB/U,IAAlB,CAAuBoH,WAAvB;AACD;;AACD,WAAOA,WAAP;AACD,GA/BD;;AAiCAtM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BiN,QAA5B,GAAuC,UAASxI,KAAT,EAAgBqF,MAAhB,EAAwB;AAC7D,QAAI,KAAKsQ,SAAT,EAAoB;AAClB,YAAMzC,SAAS,CAAC,mBAAD,EACX,wDADW,CAAf;AAED;;AAED,QAAI3H,aAAa,GAAG,KAAK+J,YAAL,CAAkB7R,IAAlB,CAAuB,UAAS0F,CAAT,EAAY;AACrD,aAAOA,CAAC,CAACnJ,KAAF,KAAYA,KAAnB;AACD,KAFmB,CAApB;;AAIA,QAAIuL,aAAJ,EAAmB;AACjB,YAAM2H,SAAS,CAAC,oBAAD,EAAuB,uBAAvB,CAAf;AACD;;AAED,QAAIvL,WAAJ;;AACA,SAAK,IAAIiJ,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAK0E,YAAL,CAAkBva,MAAtC,EAA8C6V,CAAC,EAA/C,EAAmD;AACjD,UAAI,CAAC,KAAK0E,YAAL,CAAkB1E,CAAlB,EAAqB5Q,KAAtB,IACA,KAAKsV,YAAL,CAAkB1E,CAAlB,EAAqBrN,IAArB,KAA8BvD,KAAK,CAACuD,IADxC,EAC8C;AAC5CoE,QAAAA,WAAW,GAAG,KAAK2N,YAAL,CAAkB1E,CAAlB,CAAd;AACD;AACF;;AACD,QAAI,CAACjJ,WAAL,EAAkB;AAChBA,MAAAA,WAAW,GAAG,KAAK6O,kBAAL,CAAwBxW,KAAK,CAACuD,IAA9B,CAAd;AACD;;AAED,SAAKyT,2BAAL;;AAEA,QAAI,KAAKzC,YAAL,CAAkB1L,OAAlB,CAA0BxD,MAA1B,MAAsC,CAAC,CAA3C,EAA8C;AAC5C,WAAKkP,YAAL,CAAkBhU,IAAlB,CAAuB8E,MAAvB;AACD;;AAEDsC,IAAAA,WAAW,CAAC3H,KAAZ,GAAoBA,KAApB;AACA2H,IAAAA,WAAW,CAACtC,MAAZ,GAAqBA,MAArB;AACAsC,IAAAA,WAAW,CAACgI,SAAZ,GAAwB,IAAIzU,MAAM,CAACkO,YAAX,CAAwBpJ,KAAxB,EACpB2H,WAAW,CAAC8H,aADQ,CAAxB;AAEA,WAAO9H,WAAW,CAACgI,SAAnB;AACD,GApCD;;AAsCAtU,EAAAA,iBAAiB,CAACE,SAAlB,CAA4ByN,SAA5B,GAAwC,UAAS3D,MAAT,EAAiB;AACvD,QAAI2C,EAAE,GAAG,IAAT;;AACA,QAAImG,WAAW,IAAI,KAAnB,EAA0B;AACxB9I,MAAAA,MAAM,CAACG,SAAP,GAAmB5F,OAAnB,CAA2B,UAASI,KAAT,EAAgB;AACzCgI,QAAAA,EAAE,CAACQ,QAAH,CAAYxI,KAAZ,EAAmBqF,MAAnB;AACD,OAFD;AAGD,KAJD,MAIO;AACL;AACA;AACA;AACA,UAAI4R,YAAY,GAAG5R,MAAM,CAAC6R,KAAP,EAAnB;AACA7R,MAAAA,MAAM,CAACG,SAAP,GAAmB5F,OAAnB,CAA2B,UAASI,KAAT,EAAgB4I,GAAhB,EAAqB;AAC9C,YAAIuO,WAAW,GAAGF,YAAY,CAACzR,SAAb,GAAyBoD,GAAzB,CAAlB;AACA5I,QAAAA,KAAK,CAACvE,gBAAN,CAAuB,SAAvB,EAAkC,UAASgM,KAAT,EAAgB;AAChD0P,UAAAA,WAAW,CAACC,OAAZ,GAAsB3P,KAAK,CAAC2P,OAA5B;AACD,SAFD;AAGD,OALD;AAMAH,MAAAA,YAAY,CAACzR,SAAb,GAAyB5F,OAAzB,CAAiC,UAASI,KAAT,EAAgB;AAC/CgI,QAAAA,EAAE,CAACQ,QAAH,CAAYxI,KAAZ,EAAmBiX,YAAnB;AACD,OAFD;AAGD;AACF,GArBD;;AAuBA5b,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BoN,WAA5B,GAA0C,UAASF,MAAT,EAAiB;AACzD,QAAI,KAAKkN,SAAT,EAAoB;AAClB,YAAMzC,SAAS,CAAC,mBAAD,EACX,2DADW,CAAf;AAED;;AAED,QAAI,EAAEzK,MAAM,YAAYvN,MAAM,CAACkO,YAA3B,CAAJ,EAA8C;AAC5C,YAAM,IAAIkK,SAAJ,CAAc,iDAChB,4CADE,CAAN;AAED;;AAED,QAAI3L,WAAW,GAAG,KAAK2N,YAAL,CAAkB7R,IAAlB,CAAuB,UAASyI,CAAT,EAAY;AACnD,aAAOA,CAAC,CAACyD,SAAF,KAAgBlH,MAAvB;AACD,KAFiB,CAAlB;;AAIA,QAAI,CAACd,WAAL,EAAkB;AAChB,YAAMuL,SAAS,CAAC,oBAAD,EACX,4CADW,CAAf;AAED;;AACD,QAAI7N,MAAM,GAAGsC,WAAW,CAACtC,MAAzB;AAEAsC,IAAAA,WAAW,CAACgI,SAAZ,CAAsBlK,IAAtB;AACAkC,IAAAA,WAAW,CAACgI,SAAZ,GAAwB,IAAxB;AACAhI,IAAAA,WAAW,CAAC3H,KAAZ,GAAoB,IAApB;AACA2H,IAAAA,WAAW,CAACtC,MAAZ,GAAqB,IAArB,CAxByD,CA0BzD;;AACA,QAAIkP,YAAY,GAAG,KAAKe,YAAL,CAAkB7K,GAAlB,CAAsB,UAASyB,CAAT,EAAY;AACnD,aAAOA,CAAC,CAAC7G,MAAT;AACD,KAFkB,CAAnB;;AAGA,QAAIkP,YAAY,CAAC1L,OAAb,CAAqBxD,MAArB,MAAiC,CAAC,CAAlC,IACA,KAAKkP,YAAL,CAAkB1L,OAAlB,CAA0BxD,MAA1B,IAAoC,CAAC,CADzC,EAC4C;AAC1C,WAAKkP,YAAL,CAAkBzL,MAAlB,CAAyB,KAAKyL,YAAL,CAAkB1L,OAAlB,CAA0BxD,MAA1B,CAAzB,EAA4D,CAA5D;AACD;;AAED,SAAK2R,2BAAL;AACD,GApCD;;AAsCA3b,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B2N,YAA5B,GAA2C,UAAS7D,MAAT,EAAiB;AAC1D,QAAI2C,EAAE,GAAG,IAAT;AACA3C,IAAAA,MAAM,CAACG,SAAP,GAAmB5F,OAAnB,CAA2B,UAASI,KAAT,EAAgB;AACzC,UAAIyI,MAAM,GAAGT,EAAE,CAACK,UAAH,GAAgB5E,IAAhB,CAAqB,UAAS0F,CAAT,EAAY;AAC5C,eAAOA,CAAC,CAACnJ,KAAF,KAAYA,KAAnB;AACD,OAFY,CAAb;;AAGA,UAAIyI,MAAJ,EAAY;AACVT,QAAAA,EAAE,CAACW,WAAH,CAAeF,MAAf;AACD;AACF,KAPD;AAQD,GAVD;;AAYApN,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B8M,UAA5B,GAAyC,YAAW;AAClD,WAAO,KAAKiN,YAAL,CAAkBjS,MAAlB,CAAyB,UAASsE,WAAT,EAAsB;AACpD,aAAO,CAAC,CAACA,WAAW,CAACgI,SAArB;AACD,KAFM,EAGNlF,GAHM,CAGF,UAAS9C,WAAT,EAAsB;AACzB,aAAOA,WAAW,CAACgI,SAAnB;AACD,KALM,CAAP;AAMD,GAPD;;AASAtU,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BiM,YAA5B,GAA2C,YAAW;AACpD,WAAO,KAAK8N,YAAL,CAAkBjS,MAAlB,CAAyB,UAASsE,WAAT,EAAsB;AACpD,aAAO,CAAC,CAACA,WAAW,CAACiI,WAArB;AACD,KAFM,EAGNnF,GAHM,CAGF,UAAS9C,WAAT,EAAsB;AACzB,aAAOA,WAAW,CAACiI,WAAnB;AACD,KALM,CAAP;AAMD,GAPD;;AAUAvU,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B8b,kBAA5B,GAAiD,UAASC,aAAT,EAC7CxC,WAD6C,EAChC;AACf,QAAI9M,EAAE,GAAG,IAAT;;AACA,QAAI8M,WAAW,IAAIwC,aAAa,GAAG,CAAnC,EAAsC;AACpC,aAAO,KAAKhC,YAAL,CAAkB,CAAlB,EAAqBhG,WAA5B;AACD,KAFD,MAEO,IAAI,KAAK4F,aAAL,CAAmBna,MAAvB,EAA+B;AACpC,aAAO,KAAKma,aAAL,CAAmBqC,KAAnB,EAAP;AACD;;AACD,QAAIjI,WAAW,GAAG,IAAIpU,MAAM,CAACmD,cAAX,CAA0B;AAC1C6P,MAAAA,UAAU,EAAE,KAAKmH,OAAL,CAAanH,UADiB;AAE1CkH,MAAAA,YAAY,EAAE,KAAKC,OAAL,CAAaJ;AAFe,KAA1B,CAAlB;AAIArY,IAAAA,MAAM,CAACE,cAAP,CAAsBwS,WAAtB,EAAmC,OAAnC,EACI;AAACnQ,MAAAA,KAAK,EAAE,KAAR;AAAeqY,MAAAA,QAAQ,EAAE;AAAzB,KADJ;AAIA,SAAKlC,YAAL,CAAkBgC,aAAlB,EAAiCG,uBAAjC,GAA2D,EAA3D;;AACA,SAAKnC,YAAL,CAAkBgC,aAAlB,EAAiCI,gBAAjC,GAAoD,UAASjQ,KAAT,EAAgB;AAClE,UAAIkQ,GAAG,GAAG,CAAClQ,KAAK,CAAC+K,SAAP,IAAoB5V,MAAM,CAACC,IAAP,CAAY4K,KAAK,CAAC+K,SAAlB,EAA6BzX,MAA7B,KAAwC,CAAtE,CADkE,CAElE;AACA;;AACAuU,MAAAA,WAAW,CAACsI,KAAZ,GAAoBD,GAAG,GAAG,WAAH,GAAiB,WAAxC;;AACA,UAAI3P,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BG,uBAA/B,KAA2D,IAA/D,EAAqE;AACnEzP,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BG,uBAA/B,CAAuDlX,IAAvD,CAA4DkH,KAA5D;AACD;AACF,KARD;;AASA6H,IAAAA,WAAW,CAAC7T,gBAAZ,CAA6B,gBAA7B,EACE,KAAK6Z,YAAL,CAAkBgC,aAAlB,EAAiCI,gBADnC;AAEA,WAAOpI,WAAP;AACD,GA7BD,CArU6C,CAoW7C;;;AACAjU,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bsc,OAA5B,GAAsC,UAASnI,GAAT,EAAc4H,aAAd,EAA6B;AACjE,QAAItP,EAAE,GAAG,IAAT;AACA,QAAIsH,WAAW,GAAG,KAAKgG,YAAL,CAAkBgC,aAAlB,EAAiChI,WAAnD;;AACA,QAAIA,WAAW,CAACwI,gBAAhB,EAAkC;AAChC;AACD;;AACD,QAAIL,uBAAuB,GACzB,KAAKnC,YAAL,CAAkBgC,aAAlB,EAAiCG,uBADnC;AAEA,SAAKnC,YAAL,CAAkBgC,aAAlB,EAAiCG,uBAAjC,GAA2D,IAA3D;AACAnI,IAAAA,WAAW,CAAChT,mBAAZ,CAAgC,gBAAhC,EACE,KAAKgZ,YAAL,CAAkBgC,aAAlB,EAAiCI,gBADnC;;AAEApI,IAAAA,WAAW,CAACwI,gBAAZ,GAA+B,UAASC,GAAT,EAAc;AAC3C,UAAI/P,EAAE,CAAC8M,WAAH,IAAkBwC,aAAa,GAAG,CAAtC,EAAyC;AACvC;AACA;AACA;AACA;AACD;;AACD,UAAI7P,KAAK,GAAG,IAAIC,KAAJ,CAAU,cAAV,CAAZ;AACAD,MAAAA,KAAK,CAAC+K,SAAN,GAAkB;AAACwF,QAAAA,MAAM,EAAEtI,GAAT;AAAc4H,QAAAA,aAAa,EAAEA;AAA7B,OAAlB;AAEA,UAAIW,IAAI,GAAGF,GAAG,CAACvF,SAAf,CAV2C,CAW3C;;AACA,UAAImF,GAAG,GAAG,CAACM,IAAD,IAASrb,MAAM,CAACC,IAAP,CAAYob,IAAZ,EAAkBld,MAAlB,KAA6B,CAAhD;;AACA,UAAI4c,GAAJ,EAAS;AACP;AACA;AACA,YAAIrI,WAAW,CAACsI,KAAZ,KAAsB,KAAtB,IAA+BtI,WAAW,CAACsI,KAAZ,KAAsB,WAAzD,EAAsE;AACpEtI,UAAAA,WAAW,CAACsI,KAAZ,GAAoB,WAApB;AACD;AACF,OAND,MAMO;AACL,YAAItI,WAAW,CAACsI,KAAZ,KAAsB,KAA1B,EAAiC;AAC/BtI,UAAAA,WAAW,CAACsI,KAAZ,GAAoB,WAApB;AACD,SAHI,CAIL;;;AACAK,QAAAA,IAAI,CAACC,SAAL,GAAiB,CAAjB,CALK,CAML;;AACAD,QAAAA,IAAI,CAACE,KAAL,GAAa7I,WAAW,CAACC,kBAAZ,GAAiC6I,gBAA9C;AAEA,YAAIC,mBAAmB,GAAG1J,QAAQ,CAAC2J,cAAT,CAAwBL,IAAxB,CAA1B;AACAxQ,QAAAA,KAAK,CAAC+K,SAAN,GAAkB5V,MAAM,CAAC0C,MAAP,CAAcmI,KAAK,CAAC+K,SAApB,EACd7D,QAAQ,CAAC4J,cAAT,CAAwBF,mBAAxB,CADc,CAAlB;AAGA5Q,QAAAA,KAAK,CAAC+K,SAAN,CAAgBA,SAAhB,GAA4B6F,mBAA5B;;AACA5Q,QAAAA,KAAK,CAAC+K,SAAN,CAAgBgG,MAAhB,GAAyB,YAAW;AAClC,iBAAO;AACLhG,YAAAA,SAAS,EAAE/K,KAAK,CAAC+K,SAAN,CAAgBA,SADtB;AAELwF,YAAAA,MAAM,EAAEvQ,KAAK,CAAC+K,SAAN,CAAgBwF,MAFnB;AAGLV,YAAAA,aAAa,EAAE7P,KAAK,CAAC+K,SAAN,CAAgB8E,aAH1B;AAILc,YAAAA,gBAAgB,EAAE3Q,KAAK,CAAC+K,SAAN,CAAgB4F;AAJ7B,WAAP;AAMD,SAPD;AAQD,OAzC0C,CA2C3C;;;AACA,UAAIK,QAAQ,GAAG9J,QAAQ,CAAC+J,gBAAT,CAA0B1Q,EAAE,CAACyM,iBAAH,CAAqBnI,GAA/C,CAAf;;AACA,UAAI,CAACqL,GAAL,EAAU;AACRc,QAAAA,QAAQ,CAAChR,KAAK,CAAC+K,SAAN,CAAgB8E,aAAjB,CAAR,IACI,OAAO7P,KAAK,CAAC+K,SAAN,CAAgBA,SAAvB,GAAmC,MADvC;AAED,OAHD,MAGO;AACLiG,QAAAA,QAAQ,CAAChR,KAAK,CAAC+K,SAAN,CAAgB8E,aAAjB,CAAR,IACI,yBADJ;AAED;;AACDtP,MAAAA,EAAE,CAACyM,iBAAH,CAAqBnI,GAArB,GACIqC,QAAQ,CAACgK,cAAT,CAAwB3Q,EAAE,CAACyM,iBAAH,CAAqBnI,GAA7C,IACAmM,QAAQ,CAACG,IAAT,CAAc,EAAd,CAFJ;AAGA,UAAIC,QAAQ,GAAG7Q,EAAE,CAACsN,YAAH,CAAgBwD,KAAhB,CAAsB,UAASnR,WAAT,EAAsB;AACzD,eAAOA,WAAW,CAAC2H,WAAZ,IACH3H,WAAW,CAAC2H,WAAZ,CAAwBsI,KAAxB,KAAkC,WADtC;AAED,OAHc,CAAf;;AAKA,UAAI5P,EAAE,CAAC6M,iBAAH,KAAyB,WAA7B,EAA0C;AACxC7M,QAAAA,EAAE,CAAC6M,iBAAH,GAAuB,WAAvB;;AACA7M,QAAAA,EAAE,CAACsO,yBAAH;AACD,OA/D0C,CAiE3C;AACA;;;AACA,UAAI,CAACqB,GAAL,EAAU;AACR3P,QAAAA,EAAE,CAACgM,cAAH,CAAkB,cAAlB,EAAkCvM,KAAlC;AACD;;AACD,UAAIoR,QAAJ,EAAc;AACZ7Q,QAAAA,EAAE,CAACgM,cAAH,CAAkB,cAAlB,EAAkC,IAAItM,KAAJ,CAAU,cAAV,CAAlC;;AACAM,QAAAA,EAAE,CAAC6M,iBAAH,GAAuB,UAAvB;;AACA7M,QAAAA,EAAE,CAACsO,yBAAH;AACD;AACF,KA3ED,CAXiE,CAwFjE;;;AACApb,IAAAA,MAAM,CAAC6Y,UAAP,CAAkB,YAAW;AAC3B0D,MAAAA,uBAAuB,CAAC7X,OAAxB,CAAgC,UAAS7D,CAAT,EAAY;AAC1CuT,QAAAA,WAAW,CAACwI,gBAAZ,CAA6B/b,CAA7B;AACD,OAFD;AAGD,KAJD,EAIG,CAJH;AAKD,GA9FD,CArW6C,CAqc7C;;;AACAV,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bwb,2BAA5B,GAA0D,YAAW;AACnE,QAAI/O,EAAE,GAAG,IAAT;AACA,QAAIuK,YAAY,GAAG,IAAIrX,MAAM,CAAC6d,eAAX,CAA2B,IAA3B,CAAnB;;AACAxG,IAAAA,YAAY,CAACyG,gBAAb,GAAgC,YAAW;AACzChR,MAAAA,EAAE,CAACiR,yBAAH;;AACAjR,MAAAA,EAAE,CAACkR,sBAAH;AACD,KAHD;;AAKA,QAAIzJ,aAAa,GAAG,IAAIvU,MAAM,CAACie,gBAAX,CAA4B5G,YAA5B,CAApB;;AACA9C,IAAAA,aAAa,CAAC2J,iBAAd,GAAkC,YAAW;AAC3CpR,MAAAA,EAAE,CAACkR,sBAAH;AACD,KAFD;;AAGAzJ,IAAAA,aAAa,CAAC4J,OAAd,GAAwB,YAAW;AACjC;AACAzc,MAAAA,MAAM,CAACE,cAAP,CAAsB2S,aAAtB,EAAqC,OAArC,EACI;AAACtQ,QAAAA,KAAK,EAAE,QAAR;AAAkBqY,QAAAA,QAAQ,EAAE;AAA5B,OADJ;;AAEAxP,MAAAA,EAAE,CAACkR,sBAAH;AACD,KALD;;AAOA,WAAO;AACL3G,MAAAA,YAAY,EAAEA,YADT;AAEL9C,MAAAA,aAAa,EAAEA;AAFV,KAAP;AAID,GAvBD,CAtc6C,CA+d7C;AACA;;;AACApU,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B+d,4BAA5B,GAA2D,UACvDhC,aADuD,EACxC;AACjB,QAAIhI,WAAW,GAAG,KAAKgG,YAAL,CAAkBgC,aAAlB,EAAiChI,WAAnD;;AACA,QAAIA,WAAJ,EAAiB;AACf,aAAOA,WAAW,CAACwI,gBAAnB;AACA,aAAO,KAAKxC,YAAL,CAAkBgC,aAAlB,EAAiChI,WAAxC;AACD;;AACD,QAAIiD,YAAY,GAAG,KAAK+C,YAAL,CAAkBgC,aAAlB,EAAiC/E,YAApD;;AACA,QAAIA,YAAJ,EAAkB;AAChB,aAAOA,YAAY,CAACyG,gBAApB;AACA,aAAO,KAAK1D,YAAL,CAAkBgC,aAAlB,EAAiC/E,YAAxC;AACD;;AACD,QAAI9C,aAAa,GAAG,KAAK6F,YAAL,CAAkBgC,aAAlB,EAAiC7H,aAArD;;AACA,QAAIA,aAAJ,EAAmB;AACjB,aAAOA,aAAa,CAAC2J,iBAArB;AACA,aAAO3J,aAAa,CAAC4J,OAArB;AACA,aAAO,KAAK/D,YAAL,CAAkBgC,aAAlB,EAAiC7H,aAAxC;AACD;AACF,GAlBD,CAje6C,CAqf7C;;;AACApU,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Bge,WAA5B,GAA0C,UAAS5R,WAAT,EACtC6R,IADsC,EAChCC,IADgC,EAC1B;AACd,QAAIC,MAAM,GAAGvJ,qBAAqB,CAACxI,WAAW,CAACyI,iBAAb,EAC9BzI,WAAW,CAAC0I,kBADkB,CAAlC;;AAEA,QAAImJ,IAAI,IAAI7R,WAAW,CAACgI,SAAxB,EAAmC;AACjC+J,MAAAA,MAAM,CAACC,SAAP,GAAmBhS,WAAW,CAACoI,sBAA/B;AACA2J,MAAAA,MAAM,CAACE,IAAP,GAAc;AACZC,QAAAA,KAAK,EAAElL,QAAQ,CAACuB,UADJ;AAEZ4J,QAAAA,QAAQ,EAAEnS,WAAW,CAACoS,cAAZ,CAA2BD;AAFzB,OAAd;;AAIA,UAAInS,WAAW,CAACgP,sBAAZ,CAAmC5b,MAAvC,EAA+C;AAC7C2e,QAAAA,MAAM,CAACE,IAAP,CAAY5J,IAAZ,GAAmBrI,WAAW,CAACgP,sBAAZ,CAAmC,CAAnC,EAAsC3G,IAAzD;AACD;;AACDrI,MAAAA,WAAW,CAACgI,SAAZ,CAAsB6J,IAAtB,CAA2BE,MAA3B;AACD;;AACD,QAAID,IAAI,IAAI9R,WAAW,CAACiI,WAApB,IAAmC8J,MAAM,CAACnJ,MAAP,CAAcxV,MAAd,GAAuB,CAA9D,EAAiE;AAC/D;AACA,UAAI4M,WAAW,CAACpE,IAAZ,KAAqB,OAArB,IACGoE,WAAW,CAACgP,sBADf,IAEGxI,WAAW,GAAG,KAFrB,EAE4B;AAC1BxG,QAAAA,WAAW,CAACgP,sBAAZ,CAAmC/W,OAAnC,CAA2C,UAASoa,CAAT,EAAY;AACrD,iBAAOA,CAAC,CAAC/J,GAAT;AACD,SAFD;AAGD;;AACD,UAAItI,WAAW,CAACgP,sBAAZ,CAAmC5b,MAAvC,EAA+C;AAC7C2e,QAAAA,MAAM,CAACC,SAAP,GAAmBhS,WAAW,CAACgP,sBAA/B;AACD,OAFD,MAEO;AACL+C,QAAAA,MAAM,CAACC,SAAP,GAAmB,CAAC,EAAD,CAAnB;AACD;;AACDD,MAAAA,MAAM,CAACE,IAAP,GAAc;AACZE,QAAAA,QAAQ,EAAEnS,WAAW,CAACoS,cAAZ,CAA2BD;AADzB,OAAd;;AAGA,UAAInS,WAAW,CAACoS,cAAZ,CAA2BF,KAA/B,EAAsC;AACpCH,QAAAA,MAAM,CAACE,IAAP,CAAYC,KAAZ,GAAoBlS,WAAW,CAACoS,cAAZ,CAA2BF,KAA/C;AACD;;AACD,UAAIlS,WAAW,CAACoI,sBAAZ,CAAmChV,MAAvC,EAA+C;AAC7C2e,QAAAA,MAAM,CAACE,IAAP,CAAY5J,IAAZ,GAAmBrI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCC,IAAzD;AACD;;AACDrI,MAAAA,WAAW,CAACiI,WAAZ,CAAwBqK,OAAxB,CAAgCP,MAAhC;AACD;AACF,GAxCD;;AA0CAre,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B8R,mBAA5B,GAAkD,UAAShB,WAAT,EAAsB;AACtE,QAAIrE,EAAE,GAAG,IAAT,CADsE,CAGtE;;AACA,QAAI,CAAC,OAAD,EAAU,QAAV,EAAoBa,OAApB,CAA4BwD,WAAW,CAAChM,IAAxC,MAAkD,CAAC,CAAvD,EAA0D;AACxD,aAAOsF,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,WAAD,EAC3B,uBAAuB7G,WAAW,CAAChM,IAAnC,GAA0C,GADf,CAAxB,CAAP;AAED;;AAED,QAAI,CAAC6R,+BAA+B,CAAC,qBAAD,EAChC7F,WAAW,CAAChM,IADoB,EACd2H,EAAE,CAACiE,cADW,CAAhC,IACwCjE,EAAE,CAAC2N,SAD/C,EAC0D;AACxD,aAAOhQ,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,mBAAD,EAC3B,uBAAuB7G,WAAW,CAAChM,IAAnC,GACA,YADA,GACe2H,EAAE,CAACiE,cAFS,CAAxB,CAAP;AAGD;;AAED,QAAIwM,QAAJ;AACA,QAAIyB,WAAJ;;AACA,QAAI7N,WAAW,CAAChM,IAAZ,KAAqB,OAAzB,EAAkC;AAChC;AACA;AACAoY,MAAAA,QAAQ,GAAG9J,QAAQ,CAACwL,aAAT,CAAuB9N,WAAW,CAACC,GAAnC,CAAX;AACA4N,MAAAA,WAAW,GAAGzB,QAAQ,CAAClB,KAAT,EAAd;AACAkB,MAAAA,QAAQ,CAAC7Y,OAAT,CAAiB,UAASwa,YAAT,EAAuB9C,aAAvB,EAAsC;AACrD,YAAIpI,IAAI,GAAGP,QAAQ,CAAC0L,kBAAT,CAA4BD,YAA5B,CAAX;AACApS,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BlH,iBAA/B,GAAmDlB,IAAnD;AACD,OAHD;AAKAlH,MAAAA,EAAE,CAACsN,YAAH,CAAgB1V,OAAhB,CAAwB,UAAS+H,WAAT,EAAsB2P,aAAtB,EAAqC;AAC3DtP,QAAAA,EAAE,CAAC6P,OAAH,CAAWlQ,WAAW,CAAC+H,GAAvB,EAA4B4H,aAA5B;AACD,OAFD;AAGD,KAbD,MAaO,IAAIjL,WAAW,CAAChM,IAAZ,KAAqB,QAAzB,EAAmC;AACxCoY,MAAAA,QAAQ,GAAG9J,QAAQ,CAACwL,aAAT,CAAuBnS,EAAE,CAAC0M,kBAAH,CAAsBpI,GAA7C,CAAX;AACA4N,MAAAA,WAAW,GAAGzB,QAAQ,CAAClB,KAAT,EAAd;AACA,UAAI+C,SAAS,GAAG3L,QAAQ,CAAC4L,WAAT,CAAqBL,WAArB,EACZ,YADY,EACEnf,MADF,GACW,CAD3B;AAEA0d,MAAAA,QAAQ,CAAC7Y,OAAT,CAAiB,UAASwa,YAAT,EAAuB9C,aAAvB,EAAsC;AACrD,YAAI3P,WAAW,GAAGK,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,CAAlB;AACA,YAAIhI,WAAW,GAAG3H,WAAW,CAAC2H,WAA9B;AACA,YAAIiD,YAAY,GAAG5K,WAAW,CAAC4K,YAA/B;AACA,YAAI9C,aAAa,GAAG9H,WAAW,CAAC8H,aAAhC;AACA,YAAIW,iBAAiB,GAAGzI,WAAW,CAACyI,iBAApC;AACA,YAAIC,kBAAkB,GAAG1I,WAAW,CAAC0I,kBAArC,CANqD,CAQrD;;AACA,YAAImK,QAAQ,GAAG7L,QAAQ,CAAC8L,UAAT,CAAoBL,YAApB,KACXzL,QAAQ,CAAC4L,WAAT,CAAqBH,YAArB,EAAmC,eAAnC,EAAoDrf,MAApD,KAA+D,CADnE;;AAGA,YAAI,CAACyf,QAAD,IAAa,CAAC7S,WAAW,CAAC6S,QAA9B,EAAwC;AACtC,cAAIE,mBAAmB,GAAG/L,QAAQ,CAACgM,gBAAT,CACtBP,YADsB,EACRF,WADQ,CAA1B;AAEA,cAAIU,oBAAoB,GAAGjM,QAAQ,CAACkM,iBAAT,CACvBT,YADuB,EACTF,WADS,CAA3B;;AAEA,cAAII,SAAJ,EAAe;AACbM,YAAAA,oBAAoB,CAACE,IAArB,GAA4B,QAA5B;AACD;;AAED,cAAI,CAAC9S,EAAE,CAAC8M,WAAJ,IAAmBwC,aAAa,KAAK,CAAzC,EAA4C;AAC1CtP,YAAAA,EAAE,CAAC6P,OAAH,CAAWlQ,WAAW,CAAC+H,GAAvB,EAA4B4H,aAA5B;;AACA,gBAAI/E,YAAY,CAACqF,KAAb,KAAuB,KAA3B,EAAkC;AAChCrF,cAAAA,YAAY,CAACwI,KAAb,CAAmBzL,WAAnB,EAAgCoL,mBAAhC,EACIJ,SAAS,GAAG,aAAH,GAAmB,YADhC;AAED;;AACD,gBAAI7K,aAAa,CAACmI,KAAd,KAAwB,KAA5B,EAAmC;AACjCnI,cAAAA,aAAa,CAACsL,KAAd,CAAoBH,oBAApB;AACD;AACF,WAlBqC,CAoBtC;;;AACA,cAAIlB,MAAM,GAAGvJ,qBAAqB,CAACC,iBAAD,EAC9BC,kBAD8B,CAAlC,CArBsC,CAwBtC;AACA;;AACArI,UAAAA,EAAE,CAACuR,WAAH,CAAe5R,WAAf,EACI+R,MAAM,CAACnJ,MAAP,CAAcxV,MAAd,GAAuB,CAD3B,EAEI,KAFJ;AAGD;AACF,OA1CD;AA2CD;;AAEDiN,IAAAA,EAAE,CAACyM,iBAAH,GAAuB;AACrBpU,MAAAA,IAAI,EAAEgM,WAAW,CAAChM,IADG;AAErBiM,MAAAA,GAAG,EAAED,WAAW,CAACC;AAFI,KAAvB;;AAIA,QAAID,WAAW,CAAChM,IAAZ,KAAqB,OAAzB,EAAkC;AAChC2H,MAAAA,EAAE,CAACgT,qBAAH,CAAyB,kBAAzB;AACD,KAFD,MAEO;AACLhT,MAAAA,EAAE,CAACgT,qBAAH,CAAyB,QAAzB;AACD;;AAED,WAAOrV,OAAO,CAACgF,OAAR,EAAP;AACD,GA5FD;;AA8FAtP,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B6L,oBAA5B,GAAmD,UAASiF,WAAT,EAAsB;AACvE,QAAIrE,EAAE,GAAG,IAAT,CADuE,CAGvE;;AACA,QAAI,CAAC,OAAD,EAAU,QAAV,EAAoBa,OAApB,CAA4BwD,WAAW,CAAChM,IAAxC,MAAkD,CAAC,CAAvD,EAA0D;AACxD,aAAOsF,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,WAAD,EAC3B,uBAAuB7G,WAAW,CAAChM,IAAnC,GAA0C,GADf,CAAxB,CAAP;AAED;;AAED,QAAI,CAAC6R,+BAA+B,CAAC,sBAAD,EAChC7F,WAAW,CAAChM,IADoB,EACd2H,EAAE,CAACiE,cADW,CAAhC,IACwCjE,EAAE,CAAC2N,SAD/C,EAC0D;AACxD,aAAOhQ,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,mBAAD,EAC3B,wBAAwB7G,WAAW,CAAChM,IAApC,GACA,YADA,GACe2H,EAAE,CAACiE,cAFS,CAAxB,CAAP;AAGD;;AAED,QAAIrE,OAAO,GAAG,EAAd;AACAI,IAAAA,EAAE,CAACwM,aAAH,CAAiB5U,OAAjB,CAAyB,UAASyF,MAAT,EAAiB;AACxCuC,MAAAA,OAAO,CAACvC,MAAM,CAAC1F,EAAR,CAAP,GAAqB0F,MAArB;AACD,KAFD;AAGA,QAAI4V,YAAY,GAAG,EAAnB;AACA,QAAIxC,QAAQ,GAAG9J,QAAQ,CAACwL,aAAT,CAAuB9N,WAAW,CAACC,GAAnC,CAAf;AACA,QAAI4N,WAAW,GAAGzB,QAAQ,CAAClB,KAAT,EAAlB;AACA,QAAI+C,SAAS,GAAG3L,QAAQ,CAAC4L,WAAT,CAAqBL,WAArB,EACZ,YADY,EACEnf,MADF,GACW,CAD3B;AAEA,QAAI+Z,WAAW,GAAGnG,QAAQ,CAAC4L,WAAT,CAAqBL,WAArB,EACd,iBADc,EACKnf,MADL,GACc,CADhC;AAEAiN,IAAAA,EAAE,CAAC8M,WAAH,GAAiBA,WAAjB;AACA,QAAIoG,UAAU,GAAGvM,QAAQ,CAAC4L,WAAT,CAAqBL,WAArB,EACb,gBADa,EACK,CADL,CAAjB;;AAEA,QAAIgB,UAAJ,EAAgB;AACdlT,MAAAA,EAAE,CAACqM,uBAAH,GAA6B6G,UAAU,CAACC,MAAX,CAAkB,EAAlB,EAAsBC,KAAtB,CAA4B,GAA5B,EACxBvS,OADwB,CAChB,SADgB,KACF,CAD3B;AAED,KAHD,MAGO;AACLb,MAAAA,EAAE,CAACqM,uBAAH,GAA6B,KAA7B;AACD;;AAEDoE,IAAAA,QAAQ,CAAC7Y,OAAT,CAAiB,UAASwa,YAAT,EAAuB9C,aAAvB,EAAsC;AACrD,UAAI+D,KAAK,GAAG1M,QAAQ,CAAC2M,UAAT,CAAoBlB,YAApB,CAAZ;AACA,UAAI7W,IAAI,GAAGoL,QAAQ,CAAC4M,OAAT,CAAiBnB,YAAjB,CAAX,CAFqD,CAGrD;;AACA,UAAII,QAAQ,GAAG7L,QAAQ,CAAC8L,UAAT,CAAoBL,YAApB,KACXzL,QAAQ,CAAC4L,WAAT,CAAqBH,YAArB,EAAmC,eAAnC,EAAoDrf,MAApD,KAA+D,CADnE;AAEA,UAAIiY,QAAQ,GAAGqI,KAAK,CAAC,CAAD,CAAL,CAASF,MAAT,CAAgB,CAAhB,EAAmBC,KAAnB,CAAyB,GAAzB,EAA8B,CAA9B,CAAf;AAEA,UAAII,SAAS,GAAG7M,QAAQ,CAAC8M,YAAT,CAAsBrB,YAAtB,EAAoCF,WAApC,CAAhB;AACA,UAAIwB,UAAU,GAAG/M,QAAQ,CAACgN,SAAT,CAAmBvB,YAAnB,CAAjB;AAEA,UAAI1K,GAAG,GAAGf,QAAQ,CAACiN,MAAT,CAAgBxB,YAAhB,KAAiCzL,QAAQ,CAACkN,kBAAT,EAA3C,CAXqD,CAarD;;AACA,UAAIrB,QAAQ,IAAKjX,IAAI,KAAK,aAAT,KAA2ByP,QAAQ,KAAK,WAAb,IACxCA,QAAQ,KAAK,eADA,CAAjB,EACoC;AAClC;AACA;AACAhL,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,IAAiC;AAC/B5H,UAAAA,GAAG,EAAEA,GAD0B;AAE/BnM,UAAAA,IAAI,EAAEA,IAFyB;AAG/ByP,UAAAA,QAAQ,EAAEA,QAHqB;AAI/BwH,UAAAA,QAAQ,EAAE;AAJqB,SAAjC;AAMA;AACD;;AAED,UAAI,CAACA,QAAD,IAAaxS,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,CAAb,IACAtP,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BkD,QADnC,EAC6C;AAC3C;AACAxS,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,IAAiCtP,EAAE,CAACwO,kBAAH,CAAsBjT,IAAtB,EAA4B,IAA5B,CAAjC;AACD;;AAED,UAAIoE,WAAJ;AACA,UAAI2H,WAAJ;AACA,UAAIiD,YAAJ;AACA,UAAI9C,aAAJ;AACA,UAAIG,WAAJ;AACA,UAAIG,sBAAJ;AACA,UAAI4G,sBAAJ;AACA,UAAIvG,iBAAJ;AAEA,UAAIpQ,KAAJ,CA1CqD,CA2CrD;;AACA,UAAIqQ,kBAAkB,GAAG1B,QAAQ,CAAC0L,kBAAT,CAA4BD,YAA5B,CAAzB;AACA,UAAIM,mBAAJ;AACA,UAAIE,oBAAJ;;AACA,UAAI,CAACJ,QAAL,EAAe;AACbE,QAAAA,mBAAmB,GAAG/L,QAAQ,CAACgM,gBAAT,CAA0BP,YAA1B,EAClBF,WADkB,CAAtB;AAEAU,QAAAA,oBAAoB,GAAGjM,QAAQ,CAACkM,iBAAT,CAA2BT,YAA3B,EACnBF,WADmB,CAAvB;AAEAU,QAAAA,oBAAoB,CAACE,IAArB,GAA4B,QAA5B;AACD;;AACDnE,MAAAA,sBAAsB,GAClBhI,QAAQ,CAACmN,0BAAT,CAAoC1B,YAApC,CADJ;AAGA,UAAIL,cAAc,GAAGpL,QAAQ,CAACoN,mBAAT,CAA6B3B,YAA7B,CAArB;AAEA,UAAI4B,UAAU,GAAGrN,QAAQ,CAAC4L,WAAT,CAAqBH,YAArB,EACb,qBADa,EACUF,WADV,EACuBnf,MADvB,GACgC,CADjD;AAEA,UAAIkhB,KAAK,GAAGtN,QAAQ,CAAC4L,WAAT,CAAqBH,YAArB,EAAmC,cAAnC,EACP3P,GADO,CACH,UAASwN,IAAT,EAAe;AAClB,eAAOtJ,QAAQ,CAAC4J,cAAT,CAAwBN,IAAxB,CAAP;AACD,OAHO,EAIP5U,MAJO,CAIA,UAAS4U,IAAT,EAAe;AACrB,eAAOA,IAAI,CAACC,SAAL,KAAmB,CAA1B;AACD,OANO,CAAZ,CA7DqD,CAqErD;;AACA,UAAI,CAAC7L,WAAW,CAAChM,IAAZ,KAAqB,OAArB,IAAgCgM,WAAW,CAAChM,IAAZ,KAAqB,QAAtD,KACA,CAACma,QADD,IACa1F,WADb,IAC4BwC,aAAa,GAAG,CAD5C,IAEAtP,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,CAFJ,EAEoC;AAClCtP,QAAAA,EAAE,CAACsR,4BAAH,CAAgChC,aAAhC;;AACAtP,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BhI,WAA/B,GACItH,EAAE,CAACsN,YAAH,CAAgB,CAAhB,EAAmBhG,WADvB;AAEAtH,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+B/E,YAA/B,GACIvK,EAAE,CAACsN,YAAH,CAAgB,CAAhB,EAAmB/C,YADvB;AAEAvK,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+B7H,aAA/B,GACIzH,EAAE,CAACsN,YAAH,CAAgB,CAAhB,EAAmB7F,aADvB;;AAEA,YAAIzH,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+B3H,SAAnC,EAA8C;AAC5C3H,UAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+B3H,SAA/B,CAAyCuM,YAAzC,CACIlU,EAAE,CAACsN,YAAH,CAAgB,CAAhB,EAAmB7F,aADvB;AAED;;AACD,YAAIzH,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+B1H,WAAnC,EAAgD;AAC9C5H,UAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+B1H,WAA/B,CAA2CsM,YAA3C,CACIlU,EAAE,CAACsN,YAAH,CAAgB,CAAhB,EAAmB7F,aADvB;AAED;AACF;;AACD,UAAIpD,WAAW,CAAChM,IAAZ,KAAqB,OAArB,IAAgC,CAACma,QAArC,EAA+C;AAC7C7S,QAAAA,WAAW,GAAGK,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,KACVtP,EAAE,CAACwO,kBAAH,CAAsBjT,IAAtB,CADJ;AAEAoE,QAAAA,WAAW,CAAC+H,GAAZ,GAAkBA,GAAlB;;AAEA,YAAI,CAAC/H,WAAW,CAAC2H,WAAjB,EAA8B;AAC5B3H,UAAAA,WAAW,CAAC2H,WAAZ,GAA0BtH,EAAE,CAACqP,kBAAH,CAAsBC,aAAtB,EACtBxC,WADsB,CAA1B;AAED;;AAED,YAAImH,KAAK,CAAClhB,MAAN,IAAgB4M,WAAW,CAAC4K,YAAZ,CAAyBqF,KAAzB,KAAmC,KAAvD,EAA8D;AAC5D,cAAIoE,UAAU,KAAK,CAAClH,WAAD,IAAgBwC,aAAa,KAAK,CAAvC,CAAd,EAAyD;AACvD3P,YAAAA,WAAW,CAAC4K,YAAZ,CAAyB4J,mBAAzB,CAA6CF,KAA7C;AACD,WAFD,MAEO;AACLA,YAAAA,KAAK,CAACrc,OAAN,CAAc,UAAS4S,SAAT,EAAoB;AAChCF,cAAAA,iBAAiB,CAAC3K,WAAW,CAAC4K,YAAb,EAA2BC,SAA3B,CAAjB;AACD,aAFD;AAGD;AACF;;AAEDpC,QAAAA,iBAAiB,GAAGlV,MAAM,CAAC2P,cAAP,CAAsBuR,eAAtB,CAAsC7Y,IAAtC,CAApB,CApB6C,CAsB7C;AACA;;AACA,YAAI4K,WAAW,GAAG,KAAlB,EAAyB;AACvBiC,UAAAA,iBAAiB,CAACG,MAAlB,GAA2BH,iBAAiB,CAACG,MAAlB,CAAyBlN,MAAzB,CACvB,UAASgZ,KAAT,EAAgB;AACd,mBAAOA,KAAK,CAACxc,IAAN,KAAe,KAAtB;AACD,WAHsB,CAA3B;AAID;;AAEDkQ,QAAAA,sBAAsB,GAAGpI,WAAW,CAACoI,sBAAZ,IAAsC,CAAC;AAC9DC,UAAAA,IAAI,EAAE,CAAC,IAAIsH,aAAJ,GAAoB,CAArB,IAA0B;AAD8B,SAAD,CAA/D,CA/B6C,CAmC7C;;AACA,YAAIgF,UAAU,GAAG,KAAjB;;AACA,YAAId,SAAS,KAAK,UAAd,IAA4BA,SAAS,KAAK,UAA9C,EAA0D;AACxDc,UAAAA,UAAU,GAAG,CAAC3U,WAAW,CAACiI,WAA1B;AACAA,UAAAA,WAAW,GAAGjI,WAAW,CAACiI,WAAZ,IACV,IAAI1U,MAAM,CAAC2P,cAAX,CAA0BlD,WAAW,CAAC8H,aAAtC,EAAqDlM,IAArD,CADJ;;AAGA,cAAI+Y,UAAJ,EAAgB;AACd,gBAAIjX,MAAJ;AACArF,YAAAA,KAAK,GAAG4P,WAAW,CAAC5P,KAApB,CAFc,CAGd;;AACA,gBAAI0b,UAAU,IAAIA,UAAU,CAACrW,MAAX,KAAsB,GAAxC,EAA6C,CAC3C;AACD,aAFD,MAEO,IAAIqW,UAAJ,EAAgB;AACrB,kBAAI,CAAC9T,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAAZ,EAAiC;AAC/BuC,gBAAAA,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAAP,GAA6B,IAAInK,MAAM,CAAC4L,WAAX,EAA7B;AACAlK,gBAAAA,MAAM,CAACE,cAAP,CAAsB8K,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAA7B,EAAkD,IAAlD,EAAwD;AACtD5I,kBAAAA,GAAG,EAAE,YAAW;AACd,2BAAOif,UAAU,CAACrW,MAAlB;AACD;AAHqD,iBAAxD;AAKD;;AACDzI,cAAAA,MAAM,CAACE,cAAP,CAAsBkD,KAAtB,EAA6B,IAA7B,EAAmC;AACjCvD,gBAAAA,GAAG,EAAE,YAAW;AACd,yBAAOif,UAAU,CAAC1b,KAAlB;AACD;AAHgC,eAAnC;AAKAqF,cAAAA,MAAM,GAAGuC,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAAhB;AACD,aAfM,MAeA;AACL,kBAAI,CAACuC,OAAO,CAAC2U,OAAb,EAAsB;AACpB3U,gBAAAA,OAAO,CAAC2U,OAAR,GAAkB,IAAIrhB,MAAM,CAAC4L,WAAX,EAAlB;AACD;;AACDzB,cAAAA,MAAM,GAAGuC,OAAO,CAAC2U,OAAjB;AACD;;AACD,gBAAIlX,MAAJ,EAAY;AACVqO,cAAAA,4BAA4B,CAAC1T,KAAD,EAAQqF,MAAR,CAA5B;AACAsC,cAAAA,WAAW,CAACiP,4BAAZ,CAAyCrW,IAAzC,CAA8C8E,MAA9C;AACD;;AACD4V,YAAAA,YAAY,CAAC1a,IAAb,CAAkB,CAACP,KAAD,EAAQ4P,WAAR,EAAqBvK,MAArB,CAAlB;AACD;AACF,SAtCD,MAsCO,IAAIsC,WAAW,CAACiI,WAAZ,IAA2BjI,WAAW,CAACiI,WAAZ,CAAwB5P,KAAvD,EAA8D;AACnE2H,UAAAA,WAAW,CAACiP,4BAAZ,CAAyChX,OAAzC,CAAiD,UAASuJ,CAAT,EAAY;AAC3D,gBAAIqT,WAAW,GAAGrT,CAAC,CAAC3D,SAAF,GAAc/B,IAAd,CAAmB,UAASyI,CAAT,EAAY;AAC/C,qBAAOA,CAAC,CAACvM,EAAF,KAASgI,WAAW,CAACiI,WAAZ,CAAwB5P,KAAxB,CAA8BL,EAA9C;AACD,aAFiB,CAAlB;;AAGA,gBAAI6c,WAAJ,EAAiB;AACf5I,cAAAA,iCAAiC,CAAC4I,WAAD,EAAcrT,CAAd,CAAjC;AACD;AACF,WAPD;AAQAxB,UAAAA,WAAW,CAACiP,4BAAZ,GAA2C,EAA3C;AACD;;AAEDjP,QAAAA,WAAW,CAACyI,iBAAZ,GAAgCA,iBAAhC;AACAzI,QAAAA,WAAW,CAAC0I,kBAAZ,GAAiCA,kBAAjC;AACA1I,QAAAA,WAAW,CAACiI,WAAZ,GAA0BA,WAA1B;AACAjI,QAAAA,WAAW,CAACoS,cAAZ,GAA6BA,cAA7B;AACApS,QAAAA,WAAW,CAACoI,sBAAZ,GAAqCA,sBAArC;AACApI,QAAAA,WAAW,CAACgP,sBAAZ,GAAqCA,sBAArC,CA5F6C,CA8F7C;AACA;;AACA3O,QAAAA,EAAE,CAACuR,WAAH,CAAevR,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,CAAf,EACI,KADJ,EAEIgF,UAFJ;AAGD,OAnGD,MAmGO,IAAIjQ,WAAW,CAAChM,IAAZ,KAAqB,QAArB,IAAiC,CAACma,QAAtC,EAAgD;AACrD7S,QAAAA,WAAW,GAAGK,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,CAAd;AACAhI,QAAAA,WAAW,GAAG3H,WAAW,CAAC2H,WAA1B;AACAiD,QAAAA,YAAY,GAAG5K,WAAW,CAAC4K,YAA3B;AACA9C,QAAAA,aAAa,GAAG9H,WAAW,CAAC8H,aAA5B;AACAG,QAAAA,WAAW,GAAGjI,WAAW,CAACiI,WAA1B;AACAG,QAAAA,sBAAsB,GAAGpI,WAAW,CAACoI,sBAArC;AACAK,QAAAA,iBAAiB,GAAGzI,WAAW,CAACyI,iBAAhC;AAEApI,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BX,sBAA/B,GACIA,sBADJ;AAEA3O,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+BjH,kBAA/B,GACIA,kBADJ;AAEArI,QAAAA,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,EAA+ByC,cAA/B,GAAgDA,cAAhD;;AAEA,YAAIkC,KAAK,CAAClhB,MAAN,IAAgBwX,YAAY,CAACqF,KAAb,KAAuB,KAA3C,EAAkD;AAChD,cAAI,CAAC0C,SAAS,IAAI0B,UAAd,MACC,CAAClH,WAAD,IAAgBwC,aAAa,KAAK,CADnC,CAAJ,EAC2C;AACzC/E,YAAAA,YAAY,CAAC4J,mBAAb,CAAiCF,KAAjC;AACD,WAHD,MAGO;AACLA,YAAAA,KAAK,CAACrc,OAAN,CAAc,UAAS4S,SAAT,EAAoB;AAChCF,cAAAA,iBAAiB,CAAC3K,WAAW,CAAC4K,YAAb,EAA2BC,SAA3B,CAAjB;AACD,aAFD;AAGD;AACF;;AAED,YAAI,CAACsC,WAAD,IAAgBwC,aAAa,KAAK,CAAtC,EAAyC;AACvC,cAAI/E,YAAY,CAACqF,KAAb,KAAuB,KAA3B,EAAkC;AAChCrF,YAAAA,YAAY,CAACwI,KAAb,CAAmBzL,WAAnB,EAAgCoL,mBAAhC,EACI,aADJ;AAED;;AACD,cAAIjL,aAAa,CAACmI,KAAd,KAAwB,KAA5B,EAAmC;AACjCnI,YAAAA,aAAa,CAACsL,KAAd,CAAoBH,oBAApB;AACD;AACF,SAlCoD,CAoCrD;AACA;;;AACA,YAAItK,kBAAkB,GAAGH,qBAAqB,CAC5CxI,WAAW,CAACyI,iBADgC,EAE5CzI,WAAW,CAAC0I,kBAFgC,CAA9C;AAIA,YAAIoM,MAAM,GAAGnM,kBAAkB,CAACC,MAAnB,CAA0BlN,MAA1B,CAAiC,UAAStC,CAAT,EAAY;AACxD,iBAAOA,CAAC,CAAClB,IAAF,CAAO+D,WAAP,OAAyB,KAAhC;AACD,SAFY,EAEV7I,MAFH;;AAGA,YAAI,CAAC0hB,MAAD,IAAW9U,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAArD,EAA0D;AACxD,iBAAOtI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAA7C;AACD;;AAEDjI,QAAAA,EAAE,CAACuR,WAAH,CAAe5R,WAAf,EACI6T,SAAS,KAAK,UAAd,IAA4BA,SAAS,KAAK,UAD9C,EAEIA,SAAS,KAAK,UAAd,IAA4BA,SAAS,KAAK,UAF9C,EAjDqD,CAqDrD;;;AACA,YAAI5L,WAAW,KACV4L,SAAS,KAAK,UAAd,IAA4BA,SAAS,KAAK,UADhC,CAAf,EAC4D;AAC1Dxb,UAAAA,KAAK,GAAG4P,WAAW,CAAC5P,KAApB;;AACA,cAAI0b,UAAJ,EAAgB;AACd,gBAAI,CAAC9T,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAAZ,EAAiC;AAC/BuC,cAAAA,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAAP,GAA6B,IAAInK,MAAM,CAAC4L,WAAX,EAA7B;AACD;;AACD4M,YAAAA,4BAA4B,CAAC1T,KAAD,EAAQ4H,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAAf,CAA5B;AACA4V,YAAAA,YAAY,CAAC1a,IAAb,CAAkB,CAACP,KAAD,EAAQ4P,WAAR,EAAqBhI,OAAO,CAAC8T,UAAU,CAACrW,MAAZ,CAA5B,CAAlB;AACD,WAND,MAMO;AACL,gBAAI,CAACuC,OAAO,CAAC2U,OAAb,EAAsB;AACpB3U,cAAAA,OAAO,CAAC2U,OAAR,GAAkB,IAAIrhB,MAAM,CAAC4L,WAAX,EAAlB;AACD;;AACD4M,YAAAA,4BAA4B,CAAC1T,KAAD,EAAQ4H,OAAO,CAAC2U,OAAhB,CAA5B;AACAtB,YAAAA,YAAY,CAAC1a,IAAb,CAAkB,CAACP,KAAD,EAAQ4P,WAAR,EAAqBhI,OAAO,CAAC2U,OAA7B,CAAlB;AACD;AACF,SAhBD,MAgBO;AACL;AACA,iBAAO5U,WAAW,CAACiI,WAAnB;AACD;AACF;AACF,KAvQD;;AAyQA,QAAI5H,EAAE,CAAC0N,SAAH,KAAiBrW,SAArB,EAAgC;AAC9B2I,MAAAA,EAAE,CAAC0N,SAAH,GAAerJ,WAAW,CAAChM,IAAZ,KAAqB,OAArB,GAA+B,QAA/B,GAA0C,SAAzD;AACD;;AAED2H,IAAAA,EAAE,CAAC0M,kBAAH,GAAwB;AACtBrU,MAAAA,IAAI,EAAEgM,WAAW,CAAChM,IADI;AAEtBiM,MAAAA,GAAG,EAAED,WAAW,CAACC;AAFK,KAAxB;;AAIA,QAAID,WAAW,CAAChM,IAAZ,KAAqB,OAAzB,EAAkC;AAChC2H,MAAAA,EAAE,CAACgT,qBAAH,CAAyB,mBAAzB;AACD,KAFD,MAEO;AACLhT,MAAAA,EAAE,CAACgT,qBAAH,CAAyB,QAAzB;AACD;;AACDpe,IAAAA,MAAM,CAACC,IAAP,CAAY+K,OAAZ,EAAqBhI,OAArB,CAA6B,UAAS8c,GAAT,EAAc;AACzC,UAAIrX,MAAM,GAAGuC,OAAO,CAAC8U,GAAD,CAApB;;AACA,UAAIrX,MAAM,CAACG,SAAP,GAAmBzK,MAAvB,EAA+B;AAC7B,YAAIiN,EAAE,CAACwM,aAAH,CAAiB3L,OAAjB,CAAyBxD,MAAzB,MAAqC,CAAC,CAA1C,EAA6C;AAC3C2C,UAAAA,EAAE,CAACwM,aAAH,CAAiBjU,IAAjB,CAAsB8E,MAAtB;AACA,cAAIoC,KAAK,GAAG,IAAIC,KAAJ,CAAU,WAAV,CAAZ;AACAD,UAAAA,KAAK,CAACpC,MAAN,GAAeA,MAAf;AACAnK,UAAAA,MAAM,CAAC6Y,UAAP,CAAkB,YAAW;AAC3B/L,YAAAA,EAAE,CAACgM,cAAH,CAAkB,WAAlB,EAA+BvM,KAA/B;AACD,WAFD;AAGD;;AAEDwT,QAAAA,YAAY,CAACrb,OAAb,CAAqB,UAAS+c,IAAT,EAAe;AAClC,cAAI3c,KAAK,GAAG2c,IAAI,CAAC,CAAD,CAAhB;AACA,cAAIpV,QAAQ,GAAGoV,IAAI,CAAC,CAAD,CAAnB;;AACA,cAAItX,MAAM,CAAC1F,EAAP,KAAcgd,IAAI,CAAC,CAAD,CAAJ,CAAQhd,EAA1B,EAA8B;AAC5B;AACD;;AACDkU,UAAAA,YAAY,CAAC7L,EAAD,EAAKhI,KAAL,EAAYuH,QAAZ,EAAsB,CAAClC,MAAD,CAAtB,CAAZ;AACD,SAPD;AAQD;AACF,KArBD;AAsBA4V,IAAAA,YAAY,CAACrb,OAAb,CAAqB,UAAS+c,IAAT,EAAe;AAClC,UAAIA,IAAI,CAAC,CAAD,CAAR,EAAa;AACX;AACD;;AACD9I,MAAAA,YAAY,CAAC7L,EAAD,EAAK2U,IAAI,CAAC,CAAD,CAAT,EAAcA,IAAI,CAAC,CAAD,CAAlB,EAAuB,EAAvB,CAAZ;AACD,KALD,EAjVuE,CAwVvE;AACA;;AACAzhB,IAAAA,MAAM,CAAC6Y,UAAP,CAAkB,YAAW;AAC3B,UAAI,EAAE/L,EAAE,IAAIA,EAAE,CAACsN,YAAX,CAAJ,EAA8B;AAC5B;AACD;;AACDtN,MAAAA,EAAE,CAACsN,YAAH,CAAgB1V,OAAhB,CAAwB,UAAS+H,WAAT,EAAsB;AAC5C,YAAIA,WAAW,CAAC4K,YAAZ,IACA5K,WAAW,CAAC4K,YAAZ,CAAyBqF,KAAzB,KAAmC,KADnC,IAEAjQ,WAAW,CAAC4K,YAAZ,CAAyBG,mBAAzB,GAA+C3X,MAA/C,GAAwD,CAF5D,EAE+D;AAC7DuC,UAAAA,OAAO,CAACI,IAAR,CAAa,sDACT,mCADJ;AAEAiK,UAAAA,WAAW,CAAC4K,YAAZ,CAAyBU,kBAAzB,CAA4C,EAA5C;AACD;AACF,OARD;AASD,KAbD,EAaG,IAbH;AAeA,WAAOtN,OAAO,CAACgF,OAAR,EAAP;AACD,GA1WD;;AA4WAtP,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BqhB,KAA5B,GAAoC,YAAW;AAC7C,SAAKtH,YAAL,CAAkB1V,OAAlB,CAA0B,UAAS+H,WAAT,EAAsB;AAC9C;;;;;AAKA,UAAIA,WAAW,CAAC4K,YAAhB,EAA8B;AAC5B5K,QAAAA,WAAW,CAAC4K,YAAZ,CAAyB9M,IAAzB;AACD;;AACD,UAAIkC,WAAW,CAAC8H,aAAhB,EAA+B;AAC7B9H,QAAAA,WAAW,CAAC8H,aAAZ,CAA0BhK,IAA1B;AACD;;AACD,UAAIkC,WAAW,CAACgI,SAAhB,EAA2B;AACzBhI,QAAAA,WAAW,CAACgI,SAAZ,CAAsBlK,IAAtB;AACD;;AACD,UAAIkC,WAAW,CAACiI,WAAhB,EAA6B;AAC3BjI,QAAAA,WAAW,CAACiI,WAAZ,CAAwBnK,IAAxB;AACD;AACF,KAlBD,EAD6C,CAoB7C;;AACA,SAAKkQ,SAAL,GAAiB,IAAjB;;AACA,SAAKqF,qBAAL,CAA2B,QAA3B;AACD,GAvBD,CA1+B6C,CAmgC7C;;;AACA3f,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Byf,qBAA5B,GAAoD,UAAS6B,QAAT,EAAmB;AACrE,SAAK5Q,cAAL,GAAsB4Q,QAAtB;AACA,QAAIpV,KAAK,GAAG,IAAIC,KAAJ,CAAU,sBAAV,CAAZ;;AACA,SAAKsM,cAAL,CAAoB,sBAApB,EAA4CvM,KAA5C;AACD,GAJD,CApgC6C,CA0gC7C;;;AACApM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4Byb,2BAA5B,GAA0D,YAAW;AACnE,QAAIhP,EAAE,GAAG,IAAT;;AACA,QAAI,KAAKiE,cAAL,KAAwB,QAAxB,IAAoC,KAAKqI,eAAL,KAAyB,IAAjE,EAAuE;AACrE;AACD;;AACD,SAAKA,eAAL,GAAuB,IAAvB;AACApZ,IAAAA,MAAM,CAAC6Y,UAAP,CAAkB,YAAW;AAC3B,UAAI/L,EAAE,CAACsM,eAAP,EAAwB;AACtBtM,QAAAA,EAAE,CAACsM,eAAH,GAAqB,KAArB;AACA,YAAI7M,KAAK,GAAG,IAAIC,KAAJ,CAAU,mBAAV,CAAZ;;AACAM,QAAAA,EAAE,CAACgM,cAAH,CAAkB,mBAAlB,EAAuCvM,KAAvC;AACD;AACF,KAND,EAMG,CANH;AAOD,GAbD,CA3gC6C,CA0hC7C;;;AACApM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B0d,yBAA5B,GAAwD,YAAW;AACjE,QAAI4D,QAAJ;AACA,QAAIC,MAAM,GAAG;AACX,aAAO,CADI;AAEXC,MAAAA,MAAM,EAAE,CAFG;AAGXC,MAAAA,QAAQ,EAAE,CAHC;AAIXC,MAAAA,SAAS,EAAE,CAJA;AAKXC,MAAAA,SAAS,EAAE,CALA;AAMXC,MAAAA,YAAY,EAAE,CANH;AAOXC,MAAAA,MAAM,EAAE;AAPG,KAAb;AASA,SAAK9H,YAAL,CAAkB1V,OAAlB,CAA0B,UAAS+H,WAAT,EAAsB;AAC9C,UAAIA,WAAW,CAAC4K,YAAZ,IAA4B,CAAC5K,WAAW,CAAC6S,QAA7C,EAAuD;AACrDsC,QAAAA,MAAM,CAACnV,WAAW,CAAC4K,YAAZ,CAAyBqF,KAA1B,CAAN;AACD;AACF,KAJD;AAMAiF,IAAAA,QAAQ,GAAG,KAAX;;AACA,QAAIC,MAAM,CAACM,MAAP,GAAgB,CAApB,EAAuB;AACrBP,MAAAA,QAAQ,GAAG,QAAX;AACD,KAFD,MAEO,IAAIC,MAAM,CAACE,QAAP,GAAkB,CAAtB,EAAyB;AAC9BH,MAAAA,QAAQ,GAAG,UAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACK,YAAP,GAAsB,CAA1B,EAA6B;AAClCN,MAAAA,QAAQ,GAAG,cAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACO,GAAP,GAAa,CAAjB,EAAoB;AACzBR,MAAAA,QAAQ,GAAG,KAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACG,SAAP,GAAmB,CAAvB,EAA0B;AAC/BJ,MAAAA,QAAQ,GAAG,WAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACI,SAAP,GAAmB,CAAvB,EAA0B;AAC/BL,MAAAA,QAAQ,GAAG,WAAX;AACD;;AAED,QAAIA,QAAQ,KAAK,KAAKlI,kBAAtB,EAA0C;AACxC,WAAKA,kBAAL,GAA0BkI,QAA1B;AACA,UAAIpV,KAAK,GAAG,IAAIC,KAAJ,CAAU,0BAAV,CAAZ;;AACA,WAAKsM,cAAL,CAAoB,0BAApB,EAAgDvM,KAAhD;AACD;AACF,GArCD,CA3hC6C,CAkkC7C;;;AACApM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B2d,sBAA5B,GAAqD,YAAW;AAC9D,QAAI2D,QAAJ;AACA,QAAIC,MAAM,GAAG;AACX,aAAO,CADI;AAEXC,MAAAA,MAAM,EAAE,CAFG;AAGXO,MAAAA,UAAU,EAAE,CAHD;AAIXL,MAAAA,SAAS,EAAE,CAJA;AAKXC,MAAAA,SAAS,EAAE,CALA;AAMXC,MAAAA,YAAY,EAAE,CANH;AAOXC,MAAAA,MAAM,EAAE;AAPG,KAAb;AASA,SAAK9H,YAAL,CAAkB1V,OAAlB,CAA0B,UAAS+H,WAAT,EAAsB;AAC9C,UAAIA,WAAW,CAAC4K,YAAZ,IAA4B5K,WAAW,CAAC8H,aAAxC,IACA,CAAC9H,WAAW,CAAC6S,QADjB,EAC2B;AACzBsC,QAAAA,MAAM,CAACnV,WAAW,CAAC4K,YAAZ,CAAyBqF,KAA1B,CAAN;AACAkF,QAAAA,MAAM,CAACnV,WAAW,CAAC8H,aAAZ,CAA0BmI,KAA3B,CAAN;AACD;AACF,KAND,EAX8D,CAkB9D;;AACAkF,IAAAA,MAAM,CAACG,SAAP,IAAoBH,MAAM,CAACI,SAA3B;AAEAL,IAAAA,QAAQ,GAAG,KAAX;;AACA,QAAIC,MAAM,CAACM,MAAP,GAAgB,CAApB,EAAuB;AACrBP,MAAAA,QAAQ,GAAG,QAAX;AACD,KAFD,MAEO,IAAIC,MAAM,CAACQ,UAAP,GAAoB,CAAxB,EAA2B;AAChCT,MAAAA,QAAQ,GAAG,YAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACK,YAAP,GAAsB,CAA1B,EAA6B;AAClCN,MAAAA,QAAQ,GAAG,cAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACO,GAAP,GAAa,CAAjB,EAAoB;AACzBR,MAAAA,QAAQ,GAAG,KAAX;AACD,KAFM,MAEA,IAAIC,MAAM,CAACG,SAAP,GAAmB,CAAvB,EAA0B;AAC/BJ,MAAAA,QAAQ,GAAG,WAAX;AACD;;AAED,QAAIA,QAAQ,KAAK,KAAKjI,eAAtB,EAAuC;AACrC,WAAKA,eAAL,GAAuBiI,QAAvB;AACA,UAAIpV,KAAK,GAAG,IAAIC,KAAJ,CAAU,uBAAV,CAAZ;;AACA,WAAKsM,cAAL,CAAoB,uBAApB,EAA6CvM,KAA7C;AACD;AACF,GAvCD;;AAyCApM,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BgiB,WAA5B,GAA0C,YAAW;AACnD,QAAIvV,EAAE,GAAG,IAAT;;AAEA,QAAIA,EAAE,CAAC2N,SAAP,EAAkB;AAChB,aAAOhQ,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,mBAAD,EAC3B,sCAD2B,CAAxB,CAAP;AAED;;AAED,QAAIsK,cAAc,GAAGxV,EAAE,CAACsN,YAAH,CAAgBjS,MAAhB,CAAuB,UAAS6I,CAAT,EAAY;AACtD,aAAOA,CAAC,CAAC3I,IAAF,KAAW,OAAlB;AACD,KAFoB,EAElBxI,MAFH;AAGA,QAAI0iB,cAAc,GAAGzV,EAAE,CAACsN,YAAH,CAAgBjS,MAAhB,CAAuB,UAAS6I,CAAT,EAAY;AACtD,aAAOA,CAAC,CAAC3I,IAAF,KAAW,OAAlB;AACD,KAFoB,EAElBxI,MAFH,CAXmD,CAenD;;AACA,QAAI2iB,YAAY,GAAG7hB,SAAS,CAAC,CAAD,CAA5B;;AACA,QAAI6hB,YAAJ,EAAkB;AAChB;AACA,UAAIA,YAAY,CAAC1c,SAAb,IAA0B0c,YAAY,CAACzc,QAA3C,EAAqD;AACnD,cAAM,IAAIqS,SAAJ,CACF,sDADE,CAAN;AAED;;AACD,UAAIoK,YAAY,CAACC,mBAAb,KAAqCte,SAAzC,EAAoD;AAClD,YAAIqe,YAAY,CAACC,mBAAb,KAAqC,IAAzC,EAA+C;AAC7CH,UAAAA,cAAc,GAAG,CAAjB;AACD,SAFD,MAEO,IAAIE,YAAY,CAACC,mBAAb,KAAqC,KAAzC,EAAgD;AACrDH,UAAAA,cAAc,GAAG,CAAjB;AACD,SAFM,MAEA;AACLA,UAAAA,cAAc,GAAGE,YAAY,CAACC,mBAA9B;AACD;AACF;;AACD,UAAID,YAAY,CAACE,mBAAb,KAAqCve,SAAzC,EAAoD;AAClD,YAAIqe,YAAY,CAACE,mBAAb,KAAqC,IAAzC,EAA+C;AAC7CH,UAAAA,cAAc,GAAG,CAAjB;AACD,SAFD,MAEO,IAAIC,YAAY,CAACE,mBAAb,KAAqC,KAAzC,EAAgD;AACrDH,UAAAA,cAAc,GAAG,CAAjB;AACD,SAFM,MAEA;AACLA,UAAAA,cAAc,GAAGC,YAAY,CAACE,mBAA9B;AACD;AACF;AACF;;AAED5V,IAAAA,EAAE,CAACsN,YAAH,CAAgB1V,OAAhB,CAAwB,UAAS+H,WAAT,EAAsB;AAC5C,UAAIA,WAAW,CAACpE,IAAZ,KAAqB,OAAzB,EAAkC;AAChCia,QAAAA,cAAc;;AACd,YAAIA,cAAc,GAAG,CAArB,EAAwB;AACtB7V,UAAAA,WAAW,CAACkP,WAAZ,GAA0B,KAA1B;AACD;AACF,OALD,MAKO,IAAIlP,WAAW,CAACpE,IAAZ,KAAqB,OAAzB,EAAkC;AACvCka,QAAAA,cAAc;;AACd,YAAIA,cAAc,GAAG,CAArB,EAAwB;AACtB9V,UAAAA,WAAW,CAACkP,WAAZ,GAA0B,KAA1B;AACD;AACF;AACF,KAZD,EA3CmD,CAyDnD;;AACA,WAAO2G,cAAc,GAAG,CAAjB,IAAsBC,cAAc,GAAG,CAA9C,EAAiD;AAC/C,UAAID,cAAc,GAAG,CAArB,EAAwB;AACtBxV,QAAAA,EAAE,CAACwO,kBAAH,CAAsB,OAAtB;;AACAgH,QAAAA,cAAc;AACf;;AACD,UAAIC,cAAc,GAAG,CAArB,EAAwB;AACtBzV,QAAAA,EAAE,CAACwO,kBAAH,CAAsB,OAAtB;;AACAiH,QAAAA,cAAc;AACf;AACF;;AAED,QAAInR,GAAG,GAAGqC,QAAQ,CAACkP,uBAAT,CAAiC7V,EAAE,CAACuN,aAApC,EACNvN,EAAE,CAACyN,kBAAH,EADM,CAAV;AAEAzN,IAAAA,EAAE,CAACsN,YAAH,CAAgB1V,OAAhB,CAAwB,UAAS+H,WAAT,EAAsB2P,aAAtB,EAAqC;AAC3D;AACA;AACA,UAAItX,KAAK,GAAG2H,WAAW,CAAC3H,KAAxB;AACA,UAAIuD,IAAI,GAAGoE,WAAW,CAACpE,IAAvB;AACA,UAAImM,GAAG,GAAG/H,WAAW,CAAC+H,GAAZ,IAAmBf,QAAQ,CAACkN,kBAAT,EAA7B;AACAlU,MAAAA,WAAW,CAAC+H,GAAZ,GAAkBA,GAAlB;;AAEA,UAAI,CAAC/H,WAAW,CAAC2H,WAAjB,EAA8B;AAC5B3H,QAAAA,WAAW,CAAC2H,WAAZ,GAA0BtH,EAAE,CAACqP,kBAAH,CAAsBC,aAAtB,EACtBtP,EAAE,CAAC8M,WADmB,CAA1B;AAED;;AAED,UAAI1E,iBAAiB,GAAGlV,MAAM,CAACkO,YAAP,CAAoBgT,eAApB,CAAoC7Y,IAApC,CAAxB,CAb2D,CAc3D;AACA;;AACA,UAAI4K,WAAW,GAAG,KAAlB,EAAyB;AACvBiC,QAAAA,iBAAiB,CAACG,MAAlB,GAA2BH,iBAAiB,CAACG,MAAlB,CAAyBlN,MAAzB,CACvB,UAASgZ,KAAT,EAAgB;AACd,iBAAOA,KAAK,CAACxc,IAAN,KAAe,KAAtB;AACD,SAHsB,CAA3B;AAID;;AACDuQ,MAAAA,iBAAiB,CAACG,MAAlB,CAAyB3Q,OAAzB,CAAiC,UAASyc,KAAT,EAAgB;AAC/C;AACA;AACA,YAAIA,KAAK,CAACxc,IAAN,KAAe,MAAf,IACAwc,KAAK,CAAChL,UAAN,CAAiB,yBAAjB,MAAgDhS,SADpD,EAC+D;AAC7Dgd,UAAAA,KAAK,CAAChL,UAAN,CAAiB,yBAAjB,IAA8C,GAA9C;AACD,SAN8C,CAQ/C;AACA;;;AACA,YAAI1J,WAAW,CAAC0I,kBAAZ,IACA1I,WAAW,CAAC0I,kBAAZ,CAA+BE,MADnC,EAC2C;AACzC5I,UAAAA,WAAW,CAAC0I,kBAAZ,CAA+BE,MAA/B,CAAsC3Q,OAAtC,CAA8C,UAASke,WAAT,EAAsB;AAClE,gBAAIzB,KAAK,CAACxc,IAAN,CAAW+D,WAAX,OAA6Bka,WAAW,CAACje,IAAZ,CAAiB+D,WAAjB,EAA7B,IACAyY,KAAK,CAAC7K,SAAN,KAAoBsM,WAAW,CAACtM,SADpC,EAC+C;AAC7C6K,cAAAA,KAAK,CAACvL,oBAAN,GAA6BgN,WAAW,CAACjN,WAAzC;AACD;AACF,WALD;AAMD;AACF,OAnBD;AAoBAT,MAAAA,iBAAiB,CAACI,gBAAlB,CAAmC5Q,OAAnC,CAA2C,UAASme,MAAT,EAAiB;AAC1D,YAAIC,gBAAgB,GAAGrW,WAAW,CAAC0I,kBAAZ,IACnB1I,WAAW,CAAC0I,kBAAZ,CAA+BG,gBADZ,IACgC,EADvD;AAEAwN,QAAAA,gBAAgB,CAACpe,OAAjB,CAAyB,UAASqe,OAAT,EAAkB;AACzC,cAAIF,MAAM,CAAC9L,GAAP,KAAegM,OAAO,CAAChM,GAA3B,EAAgC;AAC9B8L,YAAAA,MAAM,CAACpe,EAAP,GAAYse,OAAO,CAACte,EAApB;AACD;AACF,SAJD;AAKD,OARD,EA1C2D,CAoD3D;;AACA,UAAIoQ,sBAAsB,GAAGpI,WAAW,CAACoI,sBAAZ,IAAsC,CAAC;AAClEC,QAAAA,IAAI,EAAE,CAAC,IAAIsH,aAAJ,GAAoB,CAArB,IAA0B;AADkC,OAAD,CAAnE;;AAGA,UAAItX,KAAJ,EAAW;AACT;AACA,YAAImO,WAAW,IAAI,KAAf,IAAwB5K,IAAI,KAAK,OAAjC,IACA,CAACwM,sBAAsB,CAAC,CAAD,CAAtB,CAA0BE,GAD/B,EACoC;AAClCF,UAAAA,sBAAsB,CAAC,CAAD,CAAtB,CAA0BE,GAA1B,GAAgC;AAC9BD,YAAAA,IAAI,EAAED,sBAAsB,CAAC,CAAD,CAAtB,CAA0BC,IAA1B,GAAiC;AADT,WAAhC;AAGD;AACF;;AAED,UAAIrI,WAAW,CAACkP,WAAhB,EAA6B;AAC3BlP,QAAAA,WAAW,CAACiI,WAAZ,GAA0B,IAAI1U,MAAM,CAAC2P,cAAX,CACtBlD,WAAW,CAAC8H,aADU,EACKlM,IADL,CAA1B;AAED;;AAEDoE,MAAAA,WAAW,CAACyI,iBAAZ,GAAgCA,iBAAhC;AACAzI,MAAAA,WAAW,CAACoI,sBAAZ,GAAqCA,sBAArC;AACD,KAzED,EAvEmD,CAkJnD;;AACA,QAAI/H,EAAE,CAACqN,OAAH,CAAWN,YAAX,KAA4B,YAAhC,EAA8C;AAC5CzI,MAAAA,GAAG,IAAI,oBAAoBtE,EAAE,CAACsN,YAAH,CAAgB7K,GAAhB,CAAoB,UAASyB,CAAT,EAAY;AACzD,eAAOA,CAAC,CAACwD,GAAT;AACD,OAF0B,EAExBkJ,IAFwB,CAEnB,GAFmB,CAApB,GAEQ,MAFf;AAGD;;AACDtM,IAAAA,GAAG,IAAI,2BAAP;AAEAtE,IAAAA,EAAE,CAACsN,YAAH,CAAgB1V,OAAhB,CAAwB,UAAS+H,WAAT,EAAsB2P,aAAtB,EAAqC;AAC3DhL,MAAAA,GAAG,IAAI2C,iBAAiB,CAACtH,WAAD,EAAcA,WAAW,CAACyI,iBAA1B,EACpB,OADoB,EACXzI,WAAW,CAACtC,MADD,EACS2C,EAAE,CAAC0N,SADZ,CAAxB;AAEApJ,MAAAA,GAAG,IAAI,kBAAP;;AAEA,UAAI3E,WAAW,CAAC2H,WAAZ,IAA2BtH,EAAE,CAAC6M,iBAAH,KAAyB,KAApD,KACCyC,aAAa,KAAK,CAAlB,IAAuB,CAACtP,EAAE,CAAC8M,WAD5B,CAAJ,EAC8C;AAC5CnN,QAAAA,WAAW,CAAC2H,WAAZ,CAAwB4O,kBAAxB,GAA6Cte,OAA7C,CAAqD,UAASqY,IAAT,EAAe;AAClEA,UAAAA,IAAI,CAACC,SAAL,GAAiB,CAAjB;AACA5L,UAAAA,GAAG,IAAI,OAAOqC,QAAQ,CAAC2J,cAAT,CAAwBL,IAAxB,CAAP,GAAuC,MAA9C;AACD,SAHD;;AAKA,YAAItQ,WAAW,CAAC2H,WAAZ,CAAwBsI,KAAxB,KAAkC,WAAtC,EAAmD;AACjDtL,UAAAA,GAAG,IAAI,yBAAP;AACD;AACF;AACF,KAhBD;AAkBA,QAAIa,IAAI,GAAG,IAAIjS,MAAM,CAAC0R,qBAAX,CAAiC;AAC1CvM,MAAAA,IAAI,EAAE,OADoC;AAE1CiM,MAAAA,GAAG,EAAEA;AAFqC,KAAjC,CAAX;AAIA,WAAO3G,OAAO,CAACgF,OAAR,CAAgBwC,IAAhB,CAAP;AACD,GAjLD;;AAmLA9R,EAAAA,iBAAiB,CAACE,SAAlB,CAA4B4iB,YAA5B,GAA2C,YAAW;AACpD,QAAInW,EAAE,GAAG,IAAT;;AAEA,QAAIA,EAAE,CAAC2N,SAAP,EAAkB;AAChB,aAAOhQ,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,mBAAD,EAC3B,uCAD2B,CAAxB,CAAP;AAED;;AAED,QAAI,EAAElL,EAAE,CAACiE,cAAH,KAAsB,mBAAtB,IACFjE,EAAE,CAACiE,cAAH,KAAsB,qBADtB,CAAJ,EACkD;AAChD,aAAOtG,OAAO,CAACC,MAAR,CAAesN,SAAS,CAAC,mBAAD,EAC3B,iDAAiDlL,EAAE,CAACiE,cADzB,CAAxB,CAAP;AAED;;AAED,QAAIK,GAAG,GAAGqC,QAAQ,CAACkP,uBAAT,CAAiC7V,EAAE,CAACuN,aAApC,EACNvN,EAAE,CAACyN,kBAAH,EADM,CAAV;;AAEA,QAAIzN,EAAE,CAAC8M,WAAP,EAAoB;AAClBxI,MAAAA,GAAG,IAAI,oBAAoBtE,EAAE,CAACsN,YAAH,CAAgB7K,GAAhB,CAAoB,UAASyB,CAAT,EAAY;AACzD,eAAOA,CAAC,CAACwD,GAAT;AACD,OAF0B,EAExBkJ,IAFwB,CAEnB,GAFmB,CAApB,GAEQ,MAFf;AAGD;;AACDtM,IAAAA,GAAG,IAAI,2BAAP;AAEA,QAAI8R,oBAAoB,GAAGzP,QAAQ,CAAC+J,gBAAT,CACvB1Q,EAAE,CAAC0M,kBAAH,CAAsBpI,GADC,EACIvR,MAD/B;AAEAiN,IAAAA,EAAE,CAACsN,YAAH,CAAgB1V,OAAhB,CAAwB,UAAS+H,WAAT,EAAsB2P,aAAtB,EAAqC;AAC3D,UAAIA,aAAa,GAAG,CAAhB,GAAoB8G,oBAAxB,EAA8C;AAC5C;AACD;;AACD,UAAIzW,WAAW,CAAC6S,QAAhB,EAA0B;AACxB,YAAI7S,WAAW,CAACpE,IAAZ,KAAqB,aAAzB,EAAwC;AACtC,cAAIoE,WAAW,CAACqL,QAAZ,KAAyB,WAA7B,EAA0C;AAAE;AAC1C1G,YAAAA,GAAG,IAAI,oCAAP;AACD,WAFD,MAEO;AACLA,YAAAA,GAAG,IAAI,qBAAqB3E,WAAW,CAACqL,QAAjC,GACH,yBADJ;AAED;AACF,SAPD,MAOO,IAAIrL,WAAW,CAACpE,IAAZ,KAAqB,OAAzB,EAAkC;AACvC+I,UAAAA,GAAG,IAAI,sCACH,0BADJ;AAED,SAHM,MAGA,IAAI3E,WAAW,CAACpE,IAAZ,KAAqB,OAAzB,EAAkC;AACvC+I,UAAAA,GAAG,IAAI,wCACH,4BADJ;AAED;;AACDA,QAAAA,GAAG,IAAI,yBACH,gBADG,GAEH,QAFG,GAEQ3E,WAAW,CAAC+H,GAFpB,GAE0B,MAFjC;AAGA;AACD,OAvB0D,CAyB3D;;;AACA,UAAI/H,WAAW,CAACtC,MAAhB,EAAwB;AACtB,YAAIgZ,UAAJ;;AACA,YAAI1W,WAAW,CAACpE,IAAZ,KAAqB,OAAzB,EAAkC;AAChC8a,UAAAA,UAAU,GAAG1W,WAAW,CAACtC,MAAZ,CAAmBC,cAAnB,GAAoC,CAApC,CAAb;AACD,SAFD,MAEO,IAAIqC,WAAW,CAACpE,IAAZ,KAAqB,OAAzB,EAAkC;AACvC8a,UAAAA,UAAU,GAAG1W,WAAW,CAACtC,MAAZ,CAAmBE,cAAnB,GAAoC,CAApC,CAAb;AACD;;AACD,YAAI8Y,UAAJ,EAAgB;AACd;AACA,cAAIlQ,WAAW,IAAI,KAAf,IAAwBxG,WAAW,CAACpE,IAAZ,KAAqB,OAA7C,IACA,CAACoE,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAD3C,EACgD;AAC9CtI,YAAAA,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAAtC,GAA4C;AAC1CD,cAAAA,IAAI,EAAErI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCC,IAAtC,GAA6C;AADT,aAA5C;AAGD;AACF;AACF,OA1C0D,CA4C3D;;;AACA,UAAIM,kBAAkB,GAAGH,qBAAqB,CAC1CxI,WAAW,CAACyI,iBAD8B,EAE1CzI,WAAW,CAAC0I,kBAF8B,CAA9C;AAIA,UAAIoM,MAAM,GAAGnM,kBAAkB,CAACC,MAAnB,CAA0BlN,MAA1B,CAAiC,UAAStC,CAAT,EAAY;AACxD,eAAOA,CAAC,CAAClB,IAAF,CAAO+D,WAAP,OAAyB,KAAhC;AACD,OAFY,EAEV7I,MAFH;;AAGA,UAAI,CAAC0hB,MAAD,IAAW9U,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAArD,EAA0D;AACxD,eAAOtI,WAAW,CAACoI,sBAAZ,CAAmC,CAAnC,EAAsCE,GAA7C;AACD;;AAED3D,MAAAA,GAAG,IAAI2C,iBAAiB,CAACtH,WAAD,EAAc2I,kBAAd,EACpB,QADoB,EACV3I,WAAW,CAACtC,MADF,EACU2C,EAAE,CAAC0N,SADb,CAAxB;;AAEA,UAAI/N,WAAW,CAACoS,cAAZ,IACApS,WAAW,CAACoS,cAAZ,CAA2BuE,WAD/B,EAC4C;AAC1ChS,QAAAA,GAAG,IAAI,kBAAP;AACD;AACF,KA9DD;AAgEA,QAAIa,IAAI,GAAG,IAAIjS,MAAM,CAAC0R,qBAAX,CAAiC;AAC1CvM,MAAAA,IAAI,EAAE,QADoC;AAE1CiM,MAAAA,GAAG,EAAEA;AAFqC,KAAjC,CAAX;AAIA,WAAO3G,OAAO,CAACgF,OAAR,CAAgBwC,IAAhB,CAAP;AACD,GA9FD;;AAgGA9R,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BgjB,eAA5B,GAA8C,UAAS/L,SAAT,EAAoB;AAChE,QAAIxK,EAAE,GAAG,IAAT;AACA,QAAIyQ,QAAJ;;AACA,QAAIjG,SAAS,IAAI,EAAEA,SAAS,CAAC8E,aAAV,KAA4BjY,SAA5B,IACfmT,SAAS,CAACwF,MADG,CAAjB,EACuB;AACrB,aAAOrS,OAAO,CAACC,MAAR,CAAe,IAAI0N,SAAJ,CAAc,kCAAd,CAAf,CAAP;AACD,KAN+D,CAQhE;;;AACA,WAAO,IAAI3N,OAAJ,CAAY,UAASgF,OAAT,EAAkB/E,MAAlB,EAA0B;AAC3C,UAAI,CAACoC,EAAE,CAAC0M,kBAAR,EAA4B;AAC1B,eAAO9O,MAAM,CAACsN,SAAS,CAAC,mBAAD,EACnB,wDADmB,CAAV,CAAb;AAED,OAHD,MAGO,IAAI,CAACV,SAAD,IAAcA,SAAS,CAACA,SAAV,KAAwB,EAA1C,EAA8C;AACnD,aAAK,IAAIX,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG7J,EAAE,CAACsN,YAAH,CAAgBva,MAApC,EAA4C8W,CAAC,EAA7C,EAAiD;AAC/C,cAAI7J,EAAE,CAACsN,YAAH,CAAgBzD,CAAhB,EAAmB2I,QAAvB,EAAiC;AAC/B;AACD;;AACDxS,UAAAA,EAAE,CAACsN,YAAH,CAAgBzD,CAAhB,EAAmBU,YAAnB,CAAgCU,kBAAhC,CAAmD,EAAnD;AACAwF,UAAAA,QAAQ,GAAG9J,QAAQ,CAAC+J,gBAAT,CAA0B1Q,EAAE,CAAC0M,kBAAH,CAAsBpI,GAAhD,CAAX;AACAmM,UAAAA,QAAQ,CAAC5G,CAAD,CAAR,IAAe,yBAAf;AACA7J,UAAAA,EAAE,CAAC0M,kBAAH,CAAsBpI,GAAtB,GACIqC,QAAQ,CAACgK,cAAT,CAAwB3Q,EAAE,CAAC0M,kBAAH,CAAsBpI,GAA9C,IACAmM,QAAQ,CAACG,IAAT,CAAc,EAAd,CAFJ;;AAGA,cAAI5Q,EAAE,CAAC8M,WAAP,EAAoB;AAClB;AACD;AACF;AACF,OAfM,MAeA;AACL,YAAIwC,aAAa,GAAG9E,SAAS,CAAC8E,aAA9B;;AACA,YAAI9E,SAAS,CAACwF,MAAd,EAAsB;AACpB,eAAK,IAAIpH,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG5I,EAAE,CAACsN,YAAH,CAAgBva,MAApC,EAA4C6V,CAAC,EAA7C,EAAiD;AAC/C,gBAAI5I,EAAE,CAACsN,YAAH,CAAgB1E,CAAhB,EAAmBlB,GAAnB,KAA2B8C,SAAS,CAACwF,MAAzC,EAAiD;AAC/CV,cAAAA,aAAa,GAAG1G,CAAhB;AACA;AACD;AACF;AACF;;AACD,YAAIjJ,WAAW,GAAGK,EAAE,CAACsN,YAAH,CAAgBgC,aAAhB,CAAlB;;AACA,YAAI3P,WAAJ,EAAiB;AACf,cAAIA,WAAW,CAAC6S,QAAhB,EAA0B;AACxB,mBAAO7P,OAAO,EAAd;AACD;;AACD,cAAIsN,IAAI,GAAGrb,MAAM,CAACC,IAAP,CAAY2V,SAAS,CAACA,SAAtB,EAAiCzX,MAAjC,GAA0C,CAA1C,GACP4T,QAAQ,CAAC4J,cAAT,CAAwB/F,SAAS,CAACA,SAAlC,CADO,GACwC,EADnD,CAJe,CAMf;;AACA,cAAIyF,IAAI,CAACjF,QAAL,KAAkB,KAAlB,KAA4BiF,IAAI,CAACnF,IAAL,KAAc,CAAd,IAAmBmF,IAAI,CAACnF,IAAL,KAAc,CAA7D,CAAJ,EAAqE;AACnE,mBAAOnI,OAAO,EAAd;AACD,WATc,CAUf;;;AACA,cAAIsN,IAAI,CAACC,SAAL,IAAkBD,IAAI,CAACC,SAAL,KAAmB,CAAzC,EAA4C;AAC1C,mBAAOvN,OAAO,EAAd;AACD,WAbc,CAcf;AACA;;;AACA,cAAI2M,aAAa,KAAK,CAAlB,IAAwBA,aAAa,GAAG,CAAhB,IACxB3P,WAAW,CAAC4K,YAAZ,KAA6BvK,EAAE,CAACsN,YAAH,CAAgB,CAAhB,EAAmB/C,YADpD,EACmE;AACjE,gBAAI,CAACD,iBAAiB,CAAC3K,WAAW,CAAC4K,YAAb,EAA2B0F,IAA3B,CAAtB,EAAwD;AACtD,qBAAOrS,MAAM,CAACsN,SAAS,CAAC,gBAAD,EACnB,2BADmB,CAAV,CAAb;AAED;AACF,WAtBc,CAwBf;;;AACA,cAAIsL,eAAe,GAAGhM,SAAS,CAACA,SAAV,CAAoBiM,IAApB,EAAtB;;AACA,cAAID,eAAe,CAAC3V,OAAhB,CAAwB,IAAxB,MAAkC,CAAtC,EAAyC;AACvC2V,YAAAA,eAAe,GAAGA,eAAe,CAACrD,MAAhB,CAAuB,CAAvB,CAAlB;AACD;;AACD1C,UAAAA,QAAQ,GAAG9J,QAAQ,CAAC+J,gBAAT,CAA0B1Q,EAAE,CAAC0M,kBAAH,CAAsBpI,GAAhD,CAAX;AACAmM,UAAAA,QAAQ,CAACnB,aAAD,CAAR,IAA2B,QACtBW,IAAI,CAAC5X,IAAL,GAAYme,eAAZ,GAA8B,mBADR,IAErB,MAFN;AAGAxW,UAAAA,EAAE,CAAC0M,kBAAH,CAAsBpI,GAAtB,GACIqC,QAAQ,CAACgK,cAAT,CAAwB3Q,EAAE,CAAC0M,kBAAH,CAAsBpI,GAA9C,IACAmM,QAAQ,CAACG,IAAT,CAAc,EAAd,CAFJ;AAGD,SApCD,MAoCO;AACL,iBAAOhT,MAAM,CAACsN,SAAS,CAAC,gBAAD,EACnB,2BADmB,CAAV,CAAb;AAED;AACF;;AACDvI,MAAAA,OAAO;AACR,KAxEM,CAAP;AAyED,GAlFD;;AAoFAtP,EAAAA,iBAAiB,CAACE,SAAlB,CAA4BkO,QAA5B,GAAuC,UAASC,QAAT,EAAmB;AACxD,QAAIA,QAAQ,IAAIA,QAAQ,YAAYxO,MAAM,CAAC+P,gBAA3C,EAA6D;AAC3D,UAAIyT,gBAAgB,GAAG,IAAvB;AACA,WAAKpJ,YAAL,CAAkB1V,OAAlB,CAA0B,UAAS+H,WAAT,EAAsB;AAC9C,YAAIA,WAAW,CAACgI,SAAZ,IACAhI,WAAW,CAACgI,SAAZ,CAAsB3P,KAAtB,KAAgC0J,QADpC,EAC8C;AAC5CgV,UAAAA,gBAAgB,GAAG/W,WAAW,CAACgI,SAA/B;AACD,SAHD,MAGO,IAAIhI,WAAW,CAACiI,WAAZ,IACPjI,WAAW,CAACiI,WAAZ,CAAwB5P,KAAxB,KAAkC0J,QAD/B,EACyC;AAC9CgV,UAAAA,gBAAgB,GAAG/W,WAAW,CAACiI,WAA/B;AACD;AACF,OARD;;AASA,UAAI,CAAC8O,gBAAL,EAAuB;AACrB,cAAMxL,SAAS,CAAC,oBAAD,EAAuB,mBAAvB,CAAf;AACD;;AACD,aAAOwL,gBAAgB,CAACjV,QAAjB,EAAP;AACD;;AAED,QAAIkV,QAAQ,GAAG,EAAf;AACA,SAAKrJ,YAAL,CAAkB1V,OAAlB,CAA0B,UAAS+H,WAAT,EAAsB;AAC9C,OAAC,WAAD,EAAc,aAAd,EAA6B,aAA7B,EAA4C,cAA5C,EACI,eADJ,EACqB/H,OADrB,CAC6B,UAASkN,MAAT,EAAiB;AACxC,YAAInF,WAAW,CAACmF,MAAD,CAAf,EAAyB;AACvB6R,UAAAA,QAAQ,CAACpe,IAAT,CAAcoH,WAAW,CAACmF,MAAD,CAAX,CAAoBrD,QAApB,EAAd;AACD;AACF,OALL;AAMD,KAPD;AAQA,WAAO9D,OAAO,CAACiZ,GAAR,CAAYD,QAAZ,EAAsBxb,IAAtB,CAA2B,UAAS0b,QAAT,EAAmB;AACnD,UAAIC,OAAO,GAAG,IAAI3iB,GAAJ,EAAd;AACA0iB,MAAAA,QAAQ,CAACjf,OAAT,CAAiB,UAASJ,KAAT,EAAgB;AAC/BA,QAAAA,KAAK,CAACI,OAAN,CAAc,UAAS2K,IAAT,EAAe;AAC3BuU,UAAAA,OAAO,CAAC1iB,GAAR,CAAYmO,IAAI,CAAC5K,EAAjB,EAAqB4K,IAArB;AACD,SAFD;AAGD,OAJD;AAKA,aAAOuU,OAAP;AACD,KARM,CAAP;AASD,GApCD,CAn9C6C,CAy/C7C;;;AACA,MAAIC,WAAW,GAAG,CAAC,cAAD,EAAiB,gBAAjB,EAAmC,gBAAnC,EAChB,iBADgB,EACG,kBADH,CAAlB;AAEAA,EAAAA,WAAW,CAACnf,OAAZ,CAAoB,UAASof,cAAT,EAAyB;AAC3C,QAAIvc,GAAG,GAAGvH,MAAM,CAAC8jB,cAAD,CAAhB;;AACA,QAAIvc,GAAG,IAAIA,GAAG,CAAClH,SAAX,IAAwBkH,GAAG,CAAClH,SAAJ,CAAckO,QAA1C,EAAoD;AAClD,UAAIwV,cAAc,GAAGxc,GAAG,CAAClH,SAAJ,CAAckO,QAAnC;;AACAhH,MAAAA,GAAG,CAAClH,SAAJ,CAAckO,QAAd,GAAyB,YAAW;AAClC,eAAOwV,cAAc,CAACrjB,KAAf,CAAqB,IAArB,EACNuH,IADM,CACD,UAAS+b,WAAT,EAAsB;AAC1B,cAAIC,QAAQ,GAAG,IAAIhjB,GAAJ,EAAf;AACAS,UAAAA,MAAM,CAACC,IAAP,CAAYqiB,WAAZ,EAAyBtf,OAAzB,CAAiC,UAASD,EAAT,EAAa;AAC5Cuf,YAAAA,WAAW,CAACvf,EAAD,CAAX,CAAgBU,IAAhB,GAAuBwO,YAAY,CAACqQ,WAAW,CAACvf,EAAD,CAAZ,CAAnC;AACAwf,YAAAA,QAAQ,CAAC/iB,GAAT,CAAauD,EAAb,EAAiBuf,WAAW,CAACvf,EAAD,CAA5B;AACD,WAHD;AAIA,iBAAOwf,QAAP;AACD,SARM,CAAP;AASD,OAVD;AAWD;AACF,GAhBD,EA5/C6C,CA8gD7C;;AACA,MAAIC,OAAO,GAAG,CAAC,aAAD,EAAgB,cAAhB,CAAd;AACAA,EAAAA,OAAO,CAACxf,OAAR,CAAgB,UAASkN,MAAT,EAAiB;AAC/B,QAAIC,YAAY,GAAG1R,iBAAiB,CAACE,SAAlB,CAA4BuR,MAA5B,CAAnB;;AACAzR,IAAAA,iBAAiB,CAACE,SAAlB,CAA4BuR,MAA5B,IAAsC,YAAW;AAC/C,UAAIG,IAAI,GAAGpR,SAAX;;AACA,UAAI,OAAOoR,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAnB,IACA,OAAOA,IAAI,CAAC,CAAD,CAAX,KAAmB,UADvB,EACmC;AAAE;AACnC,eAAOF,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyB,CAACC,SAAS,CAAC,CAAD,CAAV,CAAzB,EACNsH,IADM,CACD,UAASkJ,WAAT,EAAsB;AAC1B,cAAI,OAAOY,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAvB,EAAmC;AACjCA,YAAAA,IAAI,CAAC,CAAD,CAAJ,CAAQrR,KAAR,CAAc,IAAd,EAAoB,CAACyQ,WAAD,CAApB;AACD;AACF,SALM,EAKJ,UAAStG,KAAT,EAAgB;AACjB,cAAI,OAAOkH,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAvB,EAAmC;AACjCA,YAAAA,IAAI,CAAC,CAAD,CAAJ,CAAQrR,KAAR,CAAc,IAAd,EAAoB,CAACmK,KAAD,CAApB;AACD;AACF,SATM,CAAP;AAUD;;AACD,aAAOgH,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,CAAP;AACD,KAhBD;AAiBD,GAnBD;AAqBAujB,EAAAA,OAAO,GAAG,CAAC,qBAAD,EAAwB,sBAAxB,EAAgD,iBAAhD,CAAV;AACAA,EAAAA,OAAO,CAACxf,OAAR,CAAgB,UAASkN,MAAT,EAAiB;AAC/B,QAAIC,YAAY,GAAG1R,iBAAiB,CAACE,SAAlB,CAA4BuR,MAA5B,CAAnB;;AACAzR,IAAAA,iBAAiB,CAACE,SAAlB,CAA4BuR,MAA5B,IAAsC,YAAW;AAC/C,UAAIG,IAAI,GAAGpR,SAAX;;AACA,UAAI,OAAOoR,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAnB,IACA,OAAOA,IAAI,CAAC,CAAD,CAAX,KAAmB,UADvB,EACmC;AAAE;AACnC,eAAOF,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,EACNsH,IADM,CACD,YAAW;AACf,cAAI,OAAO8J,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAvB,EAAmC;AACjCA,YAAAA,IAAI,CAAC,CAAD,CAAJ,CAAQrR,KAAR,CAAc,IAAd;AACD;AACF,SALM,EAKJ,UAASmK,KAAT,EAAgB;AACjB,cAAI,OAAOkH,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAvB,EAAmC;AACjCA,YAAAA,IAAI,CAAC,CAAD,CAAJ,CAAQrR,KAAR,CAAc,IAAd,EAAoB,CAACmK,KAAD,CAApB;AACD;AACF,SATM,CAAP;AAUD;;AACD,aAAOgH,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,CAAP;AACD,KAhBD;AAiBD,GAnBD,EAtiD6C,CA2jD7C;AACA;;AACA,GAAC,UAAD,EAAa+D,OAAb,CAAqB,UAASkN,MAAT,EAAiB;AACpC,QAAIC,YAAY,GAAG1R,iBAAiB,CAACE,SAAlB,CAA4BuR,MAA5B,CAAnB;;AACAzR,IAAAA,iBAAiB,CAACE,SAAlB,CAA4BuR,MAA5B,IAAsC,YAAW;AAC/C,UAAIG,IAAI,GAAGpR,SAAX;;AACA,UAAI,OAAOoR,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAvB,EAAmC;AACjC,eAAOF,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,EACNsH,IADM,CACD,YAAW;AACf,cAAI,OAAO8J,IAAI,CAAC,CAAD,CAAX,KAAmB,UAAvB,EAAmC;AACjCA,YAAAA,IAAI,CAAC,CAAD,CAAJ,CAAQrR,KAAR,CAAc,IAAd;AACD;AACF,SALM,CAAP;AAMD;;AACD,aAAOmR,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,CAAP;AACD,KAXD;AAYD,GAdD;AAgBA,SAAOR,iBAAP;AACD,CA9kDD;;AClPA;;;;;;;;AAOC;AACD;;;;;;;AAEO,SAASuF,gBAAT,CAA0B1F,MAA1B,EAAkC;AACvC,MAAM6C,SAAS,GAAG7C,MAAM,IAAIA,MAAM,CAAC6C,SAAnC;;AAEA,MAAMgG,UAAU,GAAG,UAAShI,CAAT,EAAY;AAC7B,WAAO;AACL8D,MAAAA,IAAI,EAAE;AAACmE,QAAAA,qBAAqB,EAAE;AAAxB,QAA2CjI,CAAC,CAAC8D,IAA7C,KAAsD9D,CAAC,CAAC8D,IADzD;AAEL8E,MAAAA,OAAO,EAAE5I,CAAC,CAAC4I,OAFN;AAGLC,MAAAA,UAAU,EAAE7I,CAAC,CAAC6I,UAHT;AAILjG,MAAAA,QAJK,cAIM;AACT,eAAO,KAAKkB,IAAZ;AACD;AANI,KAAP;AAQD,GATD,CAHuC,CAcvC;;;AACA,MAAMsF,gBAAgB,GAAGpH,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,CACrBC,IADqB,CAChBnH,SAAS,CAACO,YADM,CAAzB;;AAEAP,EAAAA,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,GAAsC,UAASlE,CAAT,EAAY;AAChD,WAAOoE,gBAAgB,CAACpE,CAAD,CAAhB,CAAoBse,KAApB,CAA0B,UAAAtjB,CAAC;AAAA,aAAI4J,OAAO,CAACC,MAAR,CAAe7B,UAAU,CAAChI,CAAD,CAAzB,CAAJ;AAAA,KAA3B,CAAP;AACD,GAFD;AAGD;;AC9BD;;;;;;;;AAOC;AACD;;;;;;;AAEO,SAAS8J,mBAAT,CAA6B3K,MAA7B,EAAqC;AAC1C,MAAI,EAAE,qBAAqBA,MAAM,CAAC6C,SAA9B,CAAJ,EAA8C;AAC5C;AACD;;AACD,MAAI,CAAE7C,MAAM,CAAC6C,SAAP,CAAiBO,YAAvB,EAAsC;AACpC;AACD;;AACD,MAAIpD,MAAM,CAAC6C,SAAP,CAAiBO,YAAjB,IACF,qBAAqBpD,MAAM,CAAC6C,SAAP,CAAiBO,YADxC,EACsD;AACpD;AACD;;AACDpD,EAAAA,MAAM,CAAC6C,SAAP,CAAiBO,YAAjB,CAA8B0H,eAA9B,GACE9K,MAAM,CAAC6C,SAAP,CAAiBiI,eAAjB,CAAiCd,IAAjC,CAAsChK,MAAM,CAAC6C,SAA7C,CADF;AAED;;ACvBD;;;;;;;;AAOA;AACA;;;;;;;;;;;;;;;;;;;;AAEA;;AACA;;AACA;;AAEA;;AACA;;;;;;;;AAEO,SAAS4P,kBAAT,CAA4BzS,MAA5B,EAAoC2F,cAApC,EAAoD;AACzD,MAAI3F,MAAM,CAACmD,cAAX,EAA2B;AACzB,QAAI,CAACnD,MAAM,CAAC0S,eAAZ,EAA6B;AAC3B1S,MAAAA,MAAM,CAAC0S,eAAP,GAAyB,SAASA,eAAT,CAAyBX,IAAzB,EAA+B;AACtD,eAAOA,IAAP;AACD,OAFD;AAGD;;AACD,QAAI,CAAC/R,MAAM,CAAC0R,qBAAZ,EAAmC;AACjC1R,MAAAA,MAAM,CAAC0R,qBAAP,GAA+B,SAASA,qBAAT,CAA+BK,IAA/B,EAAqC;AAClE,eAAOA,IAAP;AACD,OAFD;AAGD,KAVwB,CAWzB;AACA;AACA;;;AACA,QAAIpM,cAAc,CAAC/C,OAAf,GAAyB,KAA7B,EAAoC;AAClC,UAAMwhB,cAAc,GAAG1iB,MAAM,CAAC2Q,wBAAP,CACnBrS,MAAM,CAAC+P,gBAAP,CAAwB1P,SADL,EACgB,SADhB,CAAvB;AAEAqB,MAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAAC+P,gBAAP,CAAwB1P,SAA9C,EAAyD,SAAzD,EAAoE;AAClEa,QAAAA,GADkE,YAC9D+C,KAD8D,EACvD;AACTmgB,UAAAA,cAAc,CAACljB,GAAf,CAAmBwC,IAAnB,CAAwB,IAAxB,EAA8BO,KAA9B;AACA,cAAMogB,EAAE,GAAG,IAAI7X,KAAJ,CAAU,SAAV,CAAX;AACA6X,UAAAA,EAAE,CAACnI,OAAH,GAAajY,KAAb;AACA,eAAK0I,aAAL,CAAmB0X,EAAnB;AACD;AANiE,OAApE;AAQD;AACF,GA3BwD,CA6BzD;AACA;;;AACA,MAAIrkB,MAAM,CAACkO,YAAP,IAAuB,EAAE,UAAUlO,MAAM,CAACkO,YAAP,CAAoB7N,SAAhC,CAA3B,EAAuE;AACrEqB,IAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAACkO,YAAP,CAAoB7N,SAA1C,EAAqD,MAArD,EAA6D;AAC3DkB,MAAAA,GAD2D,cACrD;AACJ,YAAI,KAAKyL,KAAL,KAAe7I,SAAnB,EAA8B;AAC5B,cAAI,KAAKW,KAAL,CAAWuD,IAAX,KAAoB,OAAxB,EAAiC;AAC/B,iBAAK2E,KAAL,GAAa,IAAIhN,MAAM,CAACskB,aAAX,CAAyB,IAAzB,CAAb;AACD,WAFD,MAEO,IAAI,KAAKxf,KAAL,CAAWuD,IAAX,KAAoB,OAAxB,EAAiC;AACtC,iBAAK2E,KAAL,GAAa,IAAb;AACD;AACF;;AACD,eAAO,KAAKA,KAAZ;AACD;AAV0D,KAA7D;AAYD,GA5CwD,CA6CzD;AACA;;;AACA,MAAIhN,MAAM,CAACskB,aAAP,IAAwB,CAACtkB,MAAM,CAACukB,aAApC,EAAmD;AACjDvkB,IAAAA,MAAM,CAACukB,aAAP,GAAuBvkB,MAAM,CAACskB,aAA9B;AACD;;AAED,MAAME,qBAAqB,GAAG,oCAAsBxkB,MAAtB,EAC1B2F,cAAc,CAAC/C,OADW,CAA9B;;AAEA5C,EAAAA,MAAM,CAACG,iBAAP,GAA2B,SAASA,iBAAT,CAA2B4Y,MAA3B,EAAmC;AAC5D,QAAIA,MAAM,IAAIA,MAAM,CAAC/F,UAArB,EAAiC;AAC/B+F,MAAAA,MAAM,CAAC/F,UAAP,GAAoB,wCAAiB+F,MAAM,CAAC/F,UAAxB,EAClBrN,cAAc,CAAC/C,OADG,CAApB;AAEA6C,MAAAA,KAAK,CAACtD,GAAN,CAAU,8BAAV,EAA0C4W,MAAM,CAAC/F,UAAjD;AACD;;AACD,WAAO,IAAIwR,qBAAJ,CAA0BzL,MAA1B,CAAP;AACD,GAPD;;AAQA/Y,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,GAAqCmkB,qBAAqB,CAACnkB,SAA3D;AACD;;AAEM,SAASokB,gBAAT,CAA0BzkB,MAA1B,EAAkC;AACvC;AACA,MAAIA,MAAM,CAACkO,YAAP,IACA,EAAE,kBAAkBlO,MAAM,CAACkO,YAAP,CAAoB7N,SAAxC,CADJ,EACwD;AACtDL,IAAAA,MAAM,CAACkO,YAAP,CAAoB7N,SAApB,CAA8BqkB,YAA9B,GACI1kB,MAAM,CAACkO,YAAP,CAAoB7N,SAApB,CAA8BskB,QADlC;AAED;AACF;;ACxFD;;;;;;;;AAOA;AACA;;;;;;;AAEA;;;;;;;;AAEO,SAASjf,gBAAT,CAA0B1F,MAA1B,EAAkC2F,cAAlC,EAAkD;AACvD,MAAM9C,SAAS,GAAG7C,MAAM,IAAIA,MAAM,CAAC6C,SAAnC;AACA,MAAMkN,gBAAgB,GAAG/P,MAAM,IAAIA,MAAM,CAAC+P,gBAA1C;;AAEAlN,EAAAA,SAAS,CAACkH,YAAV,GAAyB,UAAS/C,WAAT,EAAsB6C,SAAtB,EAAiCC,OAAjC,EAA0C;AACjE;AACArE,IAAAA,KAAK,CAACpD,UAAN,CAAiB,wBAAjB,EACI,qCADJ;AAEAQ,IAAAA,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,CAAoC/C,WAApC,EAAiDiB,IAAjD,CAAsD4B,SAAtD,EAAiEC,OAAjE;AACD,GALD;;AAOA,MAAI,EAAEnE,cAAc,CAAC/C,OAAf,GAAyB,EAAzB,IACF,qBAAqBC,SAAS,CAACO,YAAV,CAAuB0E,uBAAvB,EADrB,CAAJ,EAC4E;AAC1E,QAAMR,KAAK,GAAG,UAASC,GAAT,EAAcC,CAAd,EAAiBC,CAAjB,EAAoB;AAChC,UAAID,CAAC,IAAID,GAAL,IAAY,EAAEE,CAAC,IAAIF,GAAP,CAAhB,EAA6B;AAC3BA,QAAAA,GAAG,CAACE,CAAD,CAAH,GAASF,GAAG,CAACC,CAAD,CAAZ;AACA,eAAOD,GAAG,CAACC,CAAD,CAAV;AACD;AACF,KALD;;AAOA,QAAMod,kBAAkB,GAAG/hB,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,CACvBC,IADuB,CAClBnH,SAAS,CAACO,YADQ,CAA3B;;AAEAP,IAAAA,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,GAAsC,UAASlE,CAAT,EAAY;AAChD,UAAI,QAAOA,CAAP,MAAa,QAAb,IAAyB,QAAOA,CAAC,CAACwB,KAAT,MAAmB,QAAhD,EAA0D;AACxDxB,QAAAA,CAAC,GAAGqB,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAevB,CAAf,CAAX,CAAJ;AACAyB,QAAAA,KAAK,CAACzB,CAAC,CAACwB,KAAH,EAAU,iBAAV,EAA6B,oBAA7B,CAAL;AACAC,QAAAA,KAAK,CAACzB,CAAC,CAACwB,KAAH,EAAU,kBAAV,EAA8B,qBAA9B,CAAL;AACD;;AACD,aAAOud,kBAAkB,CAAC/e,CAAD,CAAzB;AACD,KAPD;;AASA,QAAIkK,gBAAgB,IAAIA,gBAAgB,CAAC1P,SAAjB,CAA2BwkB,WAAnD,EAAgE;AAC9D,UAAMC,iBAAiB,GAAG/U,gBAAgB,CAAC1P,SAAjB,CAA2BwkB,WAArD;;AACA9U,MAAAA,gBAAgB,CAAC1P,SAAjB,CAA2BwkB,WAA3B,GAAyC,YAAW;AAClD,YAAMtd,GAAG,GAAGud,iBAAiB,CAACpkB,KAAlB,CAAwB,IAAxB,EAA8BC,SAA9B,CAAZ;AACA2G,QAAAA,KAAK,CAACC,GAAD,EAAM,oBAAN,EAA4B,iBAA5B,CAAL;AACAD,QAAAA,KAAK,CAACC,GAAD,EAAM,qBAAN,EAA6B,kBAA7B,CAAL;AACA,eAAOA,GAAP;AACD,OALD;AAMD;;AAED,QAAIwI,gBAAgB,IAAIA,gBAAgB,CAAC1P,SAAjB,CAA2B0kB,gBAAnD,EAAqE;AACnE,UAAMC,sBAAsB,GAC1BjV,gBAAgB,CAAC1P,SAAjB,CAA2B0kB,gBAD7B;;AAEAhV,MAAAA,gBAAgB,CAAC1P,SAAjB,CAA2B0kB,gBAA3B,GAA8C,UAASlf,CAAT,EAAY;AACxD,YAAI,KAAKwC,IAAL,KAAc,OAAd,IAAyB,QAAOxC,CAAP,MAAa,QAA1C,EAAoD;AAClDA,UAAAA,CAAC,GAAGqB,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAevB,CAAf,CAAX,CAAJ;AACAyB,UAAAA,KAAK,CAACzB,CAAD,EAAI,iBAAJ,EAAuB,oBAAvB,CAAL;AACAyB,UAAAA,KAAK,CAACzB,CAAD,EAAI,kBAAJ,EAAwB,qBAAxB,CAAL;AACD;;AACD,eAAOmf,sBAAsB,CAACtkB,KAAvB,CAA6B,IAA7B,EAAmC,CAACmF,CAAD,CAAnC,CAAP;AACD,OAPD;AAQD;AACF;AACF;;AClED;;;;;;;;AAOA;AACA;;;;;;;AAEO,SAAS8E,mBAAT,CAA6B3K,MAA7B,EAAqCilB,oBAArC,EAA2D;AAChE,MAAIjlB,MAAM,CAAC6C,SAAP,CAAiBO,YAAjB,IACF,qBAAqBpD,MAAM,CAAC6C,SAAP,CAAiBO,YADxC,EACsD;AACpD;AACD;;AACD,MAAI,CAAEpD,MAAM,CAAC6C,SAAP,CAAiBO,YAAvB,EAAsC;AACpC;AACD;;AACDpD,EAAAA,MAAM,CAAC6C,SAAP,CAAiBO,YAAjB,CAA8B0H,eAA9B,GACE,SAASA,eAAT,CAAyB9D,WAAzB,EAAsC;AACpC,QAAI,EAAEA,WAAW,IAAIA,WAAW,CAACU,KAA7B,CAAJ,EAAyC;AACvC,UAAMsI,GAAG,GAAG,IAAIxF,YAAJ,CAAiB,mCACzB,0BADQ,CAAZ;AAEAwF,MAAAA,GAAG,CAACrL,IAAJ,GAAW,eAAX,CAHuC,CAIvC;;AACAqL,MAAAA,GAAG,CAACiI,IAAJ,GAAW,CAAX;AACA,aAAOxN,OAAO,CAACC,MAAR,CAAesF,GAAf,CAAP;AACD;;AACD,QAAIhJ,WAAW,CAACU,KAAZ,KAAsB,IAA1B,EAAgC;AAC9BV,MAAAA,WAAW,CAACU,KAAZ,GAAoB;AAACwd,QAAAA,WAAW,EAAED;AAAd,OAApB;AACD,KAFD,MAEO;AACLje,MAAAA,WAAW,CAACU,KAAZ,CAAkBwd,WAAlB,GAAgCD,oBAAhC;AACD;;AACD,WAAOjlB,MAAM,CAAC6C,SAAP,CAAiBO,YAAjB,CAA8B2G,YAA9B,CAA2C/C,WAA3C,CAAP;AACD,GAhBH;AAiBD;;ACnCD;;;;;;;;AAOA;AACA;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA;;AACA;;AACA;;;;;;;;;;AAEO,SAAS8E,WAAT,CAAqB9L,MAArB,EAA6B;AAClC,MAAI,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACmlB,aAArC,IACC,cAAcnlB,MAAM,CAACmlB,aAAP,CAAqB9kB,SADpC,IAEA,EAAE,iBAAiBL,MAAM,CAACmlB,aAAP,CAAqB9kB,SAAxC,CAFJ,EAEwD;AACtDqB,IAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAACmlB,aAAP,CAAqB9kB,SAA3C,EAAsD,aAAtD,EAAqE;AACnEkB,MAAAA,GADmE,cAC7D;AACJ,eAAO;AAAC8K,UAAAA,QAAQ,EAAE,KAAKA;AAAhB,SAAP;AACD;AAHkE,KAArE;AAKD;AACF;;AAEM,SAASoG,kBAAT,CAA4BzS,MAA5B,EAAoC2F,cAApC,EAAoD;AACzD,MAAI,QAAO3F,MAAP,MAAkB,QAAlB,IACA,EAAEA,MAAM,CAACG,iBAAP,IAA4BH,MAAM,CAAColB,oBAArC,CADJ,EACgE;AAC9D,WAD8D,CACtD;AACT;;AACD,MAAI,CAACplB,MAAM,CAACG,iBAAR,IAA6BH,MAAM,CAAColB,oBAAxC,EAA8D;AAC5D;AACAplB,IAAAA,MAAM,CAACG,iBAAP,GAA2BH,MAAM,CAAColB,oBAAlC;AACD;;AAED,MAAIzf,cAAc,CAAC/C,OAAf,GAAyB,EAA7B,EAAiC;AAC/B;AACA,KAAC,qBAAD,EAAwB,sBAAxB,EAAgD,iBAAhD,EACK8B,OADL,CACa,UAASkN,MAAT,EAAiB;AACxB,UAAMC,YAAY,GAAG7R,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCuR,MAAnC,CAArB;;AACA,UAAME,SAAS,uBAAKF,MAAL,cAAe;AAC5BjR,QAAAA,SAAS,CAAC,CAAD,CAAT,GAAe,KAAMiR,MAAM,KAAK,iBAAZ,GAChB5R,MAAM,CAAC0S,eADS,GAEhB1S,MAAM,CAAC0R,qBAFI,EAEmB/Q,SAAS,CAAC,CAAD,CAF5B,CAAf;AAGA,eAAOkR,YAAY,CAACnR,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,CAAP;AACD,OALc,CAAf;;AAMAX,MAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCuR,MAAnC,IAA6CE,SAAS,CAACF,MAAD,CAAtD;AACD,KAVL;AAWD;;AAED,MAAMyT,gBAAgB,GAAG;AACvBzR,IAAAA,UAAU,EAAE,aADW;AAEvBC,IAAAA,WAAW,EAAE,cAFU;AAGvBC,IAAAA,aAAa,EAAE,gBAHQ;AAIvB5E,IAAAA,cAAc,EAAE,iBAJO;AAKvBC,IAAAA,eAAe,EAAE;AALM,GAAzB;AAQA,MAAMmW,cAAc,GAAGtlB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCkO,QAA1D;;AACAvO,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCkO,QAAnC,GAA8C,SAASA,QAAT,GAAoB;AAChE,QAAM,CAACC,QAAD,EAAWC,MAAX,EAAmBC,KAAnB,IAA4B/N,SAAlC;AACA,WAAO2kB,cAAc,CAAC5kB,KAAf,CAAqB,IAArB,EAA2B,CAAC8N,QAAQ,IAAI,IAAb,CAA3B,EACJvG,IADI,CACC,UAAA3D,KAAK,EAAI;AACb,UAAIqB,cAAc,CAAC/C,OAAf,GAAyB,EAAzB,IAA+B,CAAC6L,MAApC,EAA4C;AAC1C;AACA;AACA,YAAI;AACFnK,UAAAA,KAAK,CAACI,OAAN,CAAc,UAAA2K,IAAI,EAAI;AACpBA,YAAAA,IAAI,CAAClK,IAAL,GAAYkgB,gBAAgB,CAAChW,IAAI,CAAClK,IAAN,CAAhB,IAA+BkK,IAAI,CAAClK,IAAhD;AACD,WAFD;AAGD,SAJD,CAIE,OAAOtE,CAAP,EAAU;AACV,cAAIA,CAAC,CAAC8D,IAAF,KAAW,WAAf,EAA4B;AAC1B,kBAAM9D,CAAN;AACD,WAHS,CAIV;;;AACAyD,UAAAA,KAAK,CAACI,OAAN,CAAc,UAAC2K,IAAD,EAAOqG,CAAP,EAAa;AACzBpR,YAAAA,KAAK,CAACpD,GAAN,CAAUwU,CAAV,EAAahU,MAAM,CAAC0C,MAAP,CAAc,EAAd,EAAkBiL,IAAlB,EAAwB;AACnClK,cAAAA,IAAI,EAAEkgB,gBAAgB,CAAChW,IAAI,CAAClK,IAAN,CAAhB,IAA+BkK,IAAI,CAAClK;AADP,aAAxB,CAAb;AAGD,WAJD;AAKD;AACF;;AACD,aAAOb,KAAP;AACD,KAtBI,EAuBJ2D,IAvBI,CAuBCwG,MAvBD,EAuBSC,KAvBT,CAAP;AAwBD,GA1BD;AA2BD;;AAEM,SAAS6W,kBAAT,CAA4BvlB,MAA5B,EAAoC;AACzC,MAAI,EAAE,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACG,iBAArC,IACFH,MAAM,CAACkO,YADP,CAAJ,EAC0B;AACxB;AACD;;AACD,MAAIlO,MAAM,CAACkO,YAAP,IAAuB,cAAclO,MAAM,CAACkO,YAAP,CAAoB7N,SAA7D,EAAwE;AACtE;AACD;;AACD,MAAM8N,cAAc,GAAGnO,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC8M,UAA1D;;AACA,MAAIgB,cAAJ,EAAoB;AAClBnO,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC8M,UAAnC,GAAgD,SAASA,UAAT,GAAsB;AAAA;;AACpE,UAAMiB,OAAO,GAAGD,cAAc,CAACzN,KAAf,CAAqB,IAArB,EAA2B,EAA3B,CAAhB;AACA0N,MAAAA,OAAO,CAAC1J,OAAR,CAAgB,UAAA6I,MAAM;AAAA,eAAIA,MAAM,CAACL,GAAP,GAAa,KAAjB;AAAA,OAAtB;AACA,aAAOkB,OAAP;AACD,KAJD;AAKD;;AAED,MAAMf,YAAY,GAAGrN,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCiN,QAAxD;;AACA,MAAID,YAAJ,EAAkB;AAChBrN,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCiN,QAAnC,GAA8C,SAASA,QAAT,GAAoB;AAChE,UAAMC,MAAM,GAAGF,YAAY,CAAC3M,KAAb,CAAmB,IAAnB,EAAyBC,SAAzB,CAAf;AACA4M,MAAAA,MAAM,CAACL,GAAP,GAAa,IAAb;AACA,aAAOK,MAAP;AACD,KAJD;AAKD;;AACDvN,EAAAA,MAAM,CAACkO,YAAP,CAAoB7N,SAApB,CAA8BkO,QAA9B,GAAyC,SAASA,QAAT,GAAoB;AAC3D,WAAO,KAAKzJ,KAAL,GAAa,KAAKoI,GAAL,CAASqB,QAAT,CAAkB,KAAKzJ,KAAvB,CAAb,GACH2F,OAAO,CAACgF,OAAR,CAAgB,IAAIxO,GAAJ,EAAhB,CADJ;AAED,GAHD;AAID;;AAEM,SAASukB,oBAAT,CAA8BxlB,MAA9B,EAAsC;AAC3C,MAAI,EAAE,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACG,iBAArC,IACFH,MAAM,CAACkO,YADP,CAAJ,EAC0B;AACxB;AACD;;AACD,MAAIlO,MAAM,CAACkO,YAAP,IAAuB,cAAclO,MAAM,CAAC2P,cAAP,CAAsBtP,SAA/D,EAA0E;AACxE;AACD;;AACD,MAAMuP,gBAAgB,GAAG5P,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCiM,YAA5D;;AACA,MAAIsD,gBAAJ,EAAsB;AACpB5P,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCiM,YAAnC,GAAkD,SAASA,YAAT,GAAwB;AAAA;;AACxE,UAAMuD,SAAS,GAAGD,gBAAgB,CAAClP,KAAjB,CAAuB,IAAvB,EAA6B,EAA7B,CAAlB;AACAmP,MAAAA,SAAS,CAACnL,OAAV,CAAkB,UAAA2H,QAAQ;AAAA,eAAIA,QAAQ,CAACa,GAAT,GAAe,MAAnB;AAAA,OAA1B;AACA,aAAO2C,SAAP;AACD,KAJD;AAKD;;AACDpK,EAAAA,KAAK,CAAC1F,uBAAN,CAA8BC,MAA9B,EAAsC,OAAtC,EAA+C,UAAAa,CAAC,EAAI;AAClDA,IAAAA,CAAC,CAACwL,QAAF,CAAWa,GAAX,GAAiBrM,CAAC,CAACiP,UAAnB;AACA,WAAOjP,CAAP;AACD,GAHD;;AAIAb,EAAAA,MAAM,CAAC2P,cAAP,CAAsBtP,SAAtB,CAAgCkO,QAAhC,GAA2C,SAASA,QAAT,GAAoB;AAC7D,WAAO,KAAKrB,GAAL,CAASqB,QAAT,CAAkB,KAAKzJ,KAAvB,CAAP;AACD,GAFD;AAGD;;AAEM,SAAS2gB,gBAAT,CAA0BzlB,MAA1B,EAAkC;AACvC,MAAI,CAACA,MAAM,CAACG,iBAAR,IACA,kBAAkBH,MAAM,CAACG,iBAAP,CAAyBE,SAD/C,EAC0D;AACxD;AACD;;AACDL,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC2N,YAAnC,GACE,SAASA,YAAT,CAAsB7D,MAAtB,EAA8B;AAAA;;AAC5B1E,IAAAA,KAAK,CAACpD,UAAN,CAAiB,cAAjB,EAAiC,aAAjC;AACA,SAAK8K,UAAL,GAAkBzI,OAAlB,CAA0B,UAAA6I,MAAM,EAAI;AAClC,UAAIA,MAAM,CAACzI,KAAP,IAAgBqF,MAAM,CAACG,SAAP,GAAmB3B,QAAnB,CAA4B4E,MAAM,CAACzI,KAAnC,CAApB,EAA+D;AAC7D,QAAA,MAAI,CAAC2I,WAAL,CAAiBF,MAAjB;AACD;AACF,KAJD;AAKD,GARH;AASD;;AAEM,SAASmY,kBAAT,CAA4B1lB,MAA5B,EAAoC;AACzC;AACA;AACA,MAAIA,MAAM,CAAC2lB,WAAP,IAAsB,CAAC3lB,MAAM,CAAC4lB,cAAlC,EAAkD;AAChD5lB,IAAAA,MAAM,CAAC4lB,cAAP,GAAwB5lB,MAAM,CAAC2lB,WAA/B;AACD;AACF;;AAEM,SAASE,kBAAT,CAA4B7lB,MAA5B,EAAoC;AACzC;AACA;AACA;AACA,MAAI,EAAE,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACG,iBAAvC,CAAJ,EAA+D;AAC7D;AACD;;AACD,MAAM2lB,kBAAkB,GAAG9lB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC0lB,cAA9D;;AACA,MAAID,kBAAJ,EAAwB;AACtB9lB,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC0lB,cAAnC,GACE,SAASA,cAAT,GAA0B;AACxB,WAAKC,qBAAL,GAA6B,EAA7B;AACA,UAAMC,cAAc,GAAGtlB,SAAS,CAAC,CAAD,CAAhC;AACA,UAAMulB,kBAAkB,GAAGD,cAAc,IACf,mBAAmBA,cAD7C;;AAEA,UAAIC,kBAAJ,EAAwB;AACtB;AACAD,QAAAA,cAAc,CAACE,aAAf,CAA6BzhB,OAA7B,CAAqC,UAAC0hB,aAAD,EAAmB;AACtD,cAAI,SAASA,aAAb,EAA4B;AAC1B,gBAAMC,QAAQ,GAAG,mBAAjB;;AACA,gBAAI,CAACA,QAAQ,CAACC,IAAT,CAAcF,aAAa,CAACG,GAA5B,CAAL,EAAuC;AACrC,oBAAM,IAAInO,SAAJ,CAAc,6BAAd,CAAN;AACD;AACF;;AACD,cAAI,2BAA2BgO,aAA/B,EAA8C;AAC5C,gBAAI,EAAEI,UAAU,CAACJ,aAAa,CAACK,qBAAf,CAAV,IAAmD,GAArD,CAAJ,EAA+D;AAC7D,oBAAM,IAAIC,UAAJ,CAAe,yCAAf,CAAN;AACD;AACF;;AACD,cAAI,kBAAkBN,aAAtB,EAAqC;AACnC,gBAAI,EAAEI,UAAU,CAACJ,aAAa,CAACO,YAAf,CAAV,IAA0C,CAA5C,CAAJ,EAAoD;AAClD,oBAAM,IAAID,UAAJ,CAAe,8BAAf,CAAN;AACD;AACF;AACF,SAjBD;AAkBD;;AACD,UAAMja,WAAW,GAAGqZ,kBAAkB,CAACplB,KAAnB,CAAyB,IAAzB,EAA+BC,SAA/B,CAApB;;AACA,UAAIulB,kBAAJ,EAAwB;AACtB;AACA;AACA;AACA;AACA;AACA;AACA;AACA,YAAM;AAAC3Y,UAAAA,MAAM,EAANA;AAAD,YAAWd,WAAjB;AACA,YAAM+R,MAAM,GAAGjR,MAAM,CAACqZ,aAAP,EAAf;;AACA,YAAI,EAAE,eAAepI,MAAjB,KACA;AACCA,QAAAA,MAAM,CAACC,SAAP,CAAiB5e,MAAjB,KAA4B,CAA5B,IACA6B,MAAM,CAACC,IAAP,CAAY6c,MAAM,CAACC,SAAP,CAAiB,CAAjB,CAAZ,EAAiC5e,MAAjC,KAA4C,CAHjD,EAGqD;AACnD2e,UAAAA,MAAM,CAACC,SAAP,GAAmBwH,cAAc,CAACE,aAAlC;AACA5Y,UAAAA,MAAM,CAAC4Y,aAAP,GAAuBF,cAAc,CAACE,aAAtC;AACA,eAAKH,qBAAL,CAA2B3gB,IAA3B,CAAgCkI,MAAM,CAACsZ,aAAP,CAAqBrI,MAArB,EAC7BvW,IAD6B,CACxB,YAAM;AACV,mBAAOsF,MAAM,CAAC4Y,aAAd;AACD,WAH6B,EAG3BhC,KAH2B,CAGrB,YAAM;AACb,mBAAO5W,MAAM,CAAC4Y,aAAd;AACD,WAL6B,CAAhC;AAOD;AACF;;AACD,aAAO1Z,WAAP;AACD,KAtDH;AAuDD;AACF;;AAEM,SAASqa,iBAAT,CAA2B9mB,MAA3B,EAAmC;AACxC,MAAI,EAAE,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACkO,YAAvC,CAAJ,EAA0D;AACxD;AACD;;AACD,MAAM6Y,iBAAiB,GAAG/mB,MAAM,CAACkO,YAAP,CAAoB7N,SAApB,CAA8BumB,aAAxD;;AACA,MAAIG,iBAAJ,EAAuB;AACrB/mB,IAAAA,MAAM,CAACkO,YAAP,CAAoB7N,SAApB,CAA8BumB,aAA9B,GACE,SAASA,aAAT,GAAyB;AACvB,UAAMpI,MAAM,GAAGuI,iBAAiB,CAACrmB,KAAlB,CAAwB,IAAxB,EAA8BC,SAA9B,CAAf;;AACA,UAAI,EAAE,eAAe6d,MAAjB,CAAJ,EAA8B;AAC5BA,QAAAA,MAAM,CAACC,SAAP,GAAmB,GAAG3X,MAAH,CAAU,KAAKqf,aAAL,IAAsB,CAAC,EAAD,CAAhC,CAAnB;AACD;;AACD,aAAO3H,MAAP;AACD,KAPH;AAQD;AACF;;AAEM,SAASwI,eAAT,CAAyBhnB,MAAzB,EAAiC;AACtC;AACA;AACA;AACA,MAAI,EAAE,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACG,iBAAvC,CAAJ,EAA+D;AAC7D;AACD;;AACD,MAAM8mB,eAAe,GAAGjnB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgiB,WAA3D;;AACAriB,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgiB,WAAnC,GAAiD,SAASA,WAAT,GAAuB;AAAA;AAAA;;AACtE,QAAI,KAAK2D,qBAAL,IAA8B,KAAKA,qBAAL,CAA2BnmB,MAA7D,EAAqE;AACnE,aAAO4K,OAAO,CAACiZ,GAAR,CAAY,KAAKsC,qBAAjB,EACN/d,IADM,CACD,YAAM;AACV,eAAOgf,eAAe,CAACvmB,KAAhB,CAAsB,MAAtB,EAA4BC,UAA5B,CAAP;AACD,OAHM,EAINumB,OAJM,CAIE,YAAM;AACb,QAAA,MAAI,CAAClB,qBAAL,GAA6B,EAA7B;AACD,OANM,CAAP;AAOD;;AACD,WAAOiB,eAAe,CAACvmB,KAAhB,CAAsB,IAAtB,EAA4BC,SAA5B,CAAP;AACD,GAXD;AAYD;;AAEM,SAASwmB,gBAAT,CAA0BnnB,MAA1B,EAAkC;AACvC;AACA;AACA;AACA,MAAI,EAAE,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACG,iBAAvC,CAAJ,EAA+D;AAC7D;AACD;;AACD,MAAMinB,gBAAgB,GAAGpnB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC4iB,YAA5D;;AACAjjB,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC4iB,YAAnC,GAAkD,SAASA,YAAT,GAAwB;AAAA;AAAA;;AACxE,QAAI,KAAK+C,qBAAL,IAA8B,KAAKA,qBAAL,CAA2BnmB,MAA7D,EAAqE;AACnE,aAAO4K,OAAO,CAACiZ,GAAR,CAAY,KAAKsC,qBAAjB,EACN/d,IADM,CACD,YAAM;AACV,eAAOmf,gBAAgB,CAAC1mB,KAAjB,CAAuB,MAAvB,EAA6BC,WAA7B,CAAP;AACD,OAHM,EAINumB,OAJM,CAIE,YAAM;AACb,QAAA,MAAI,CAAClB,qBAAL,GAA6B,EAA7B;AACD,OANM,CAAP;AAOD;;AACD,WAAOoB,gBAAgB,CAAC1mB,KAAjB,CAAuB,IAAvB,EAA6BC,SAA7B,CAAP;AACD,GAXD;AAYD;;ACvSD;;;;;;;AAOA;;;;;;;;;;;;;;;AACA;;;;;;;;AAEO,SAAS0mB,mBAAT,CAA6BrnB,MAA7B,EAAqC;AAC1C,MAAI,QAAOA,MAAP,MAAkB,QAAlB,IAA8B,CAACA,MAAM,CAACG,iBAA1C,EAA6D;AAC3D;AACD;;AACD,MAAI,EAAE,qBAAqBH,MAAM,CAACG,iBAAP,CAAyBE,SAAhD,CAAJ,EAAgE;AAC9DL,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6P,eAAnC,GACE,SAASA,eAAT,GAA2B;AACzB,UAAI,CAAC,KAAKoX,aAAV,EAAyB;AACvB,aAAKA,aAAL,GAAqB,EAArB;AACD;;AACD,aAAO,KAAKA,aAAZ;AACD,KANH;AAOD;;AACD,MAAI,EAAE,eAAetnB,MAAM,CAACG,iBAAP,CAAyBE,SAA1C,CAAJ,EAA0D;AACxD,QAAMknB,SAAS,GAAGvnB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCiN,QAArD;;AACAtN,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCyN,SAAnC,GAA+C,SAASA,SAAT,CAAmB3D,MAAnB,EAA2B;AAAA;;AACxE,UAAI,CAAC,KAAKmd,aAAV,EAAyB;AACvB,aAAKA,aAAL,GAAqB,EAArB;AACD;;AACD,UAAI,CAAC,KAAKA,aAAL,CAAmB3e,QAAnB,CAA4BwB,MAA5B,CAAL,EAA0C;AACxC,aAAKmd,aAAL,CAAmBjiB,IAAnB,CAAwB8E,MAAxB;AACD,OANuE,CAOxE;AACA;;;AACAA,MAAAA,MAAM,CAACC,cAAP,GAAwB1F,OAAxB,CAAgC,UAAAI,KAAK;AAAA,eAAIyiB,SAAS,CAAC7jB,IAAV,CAAe,KAAf,EAAqBoB,KAArB,EACvCqF,MADuC,CAAJ;AAAA,OAArC;AAEAA,MAAAA,MAAM,CAACE,cAAP,GAAwB3F,OAAxB,CAAgC,UAAAI,KAAK;AAAA,eAAIyiB,SAAS,CAAC7jB,IAAV,CAAe,KAAf,EAAqBoB,KAArB,EACvCqF,MADuC,CAAJ;AAAA,OAArC;AAED,KAbD;;AAeAnK,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCiN,QAAnC,GACE,SAASA,QAAT,CAAkBxI,KAAlB,EAAqC;AAAA;;AAAA,wCAAT4H,OAAS;AAATA,QAAAA,OAAS;AAAA;;AACnC,UAAIA,OAAJ,EAAa;AACXA,QAAAA,OAAO,CAAChI,OAAR,CAAgB,UAACyF,MAAD,EAAY;AAC1B,cAAI,CAAC,MAAI,CAACmd,aAAV,EAAyB;AACvB,YAAA,MAAI,CAACA,aAAL,GAAqB,CAACnd,MAAD,CAArB;AACD,WAFD,MAEO,IAAI,CAAC,MAAI,CAACmd,aAAL,CAAmB3e,QAAnB,CAA4BwB,MAA5B,CAAL,EAA0C;AAC/C,YAAA,MAAI,CAACmd,aAAL,CAAmBjiB,IAAnB,CAAwB8E,MAAxB;AACD;AACF,SAND;AAOD;;AACD,aAAOod,SAAS,CAAC7mB,KAAV,CAAgB,IAAhB,EAAsBC,SAAtB,CAAP;AACD,KAZH;AAaD;;AACD,MAAI,EAAE,kBAAkBX,MAAM,CAACG,iBAAP,CAAyBE,SAA7C,CAAJ,EAA6D;AAC3DL,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC2N,YAAnC,GACE,SAASA,YAAT,CAAsB7D,MAAtB,EAA8B;AAAA;;AAC5B,UAAI,CAAC,KAAKmd,aAAV,EAAyB;AACvB,aAAKA,aAAL,GAAqB,EAArB;AACD;;AACD,UAAME,KAAK,GAAG,KAAKF,aAAL,CAAmB3Z,OAAnB,CAA2BxD,MAA3B,CAAd;;AACA,UAAIqd,KAAK,KAAK,CAAC,CAAf,EAAkB;AAChB;AACD;;AACD,WAAKF,aAAL,CAAmB1Z,MAAnB,CAA0B4Z,KAA1B,EAAiC,CAAjC;;AACA,UAAMC,MAAM,GAAGtd,MAAM,CAACG,SAAP,EAAf;AACA,WAAK6C,UAAL,GAAkBzI,OAAlB,CAA0B,UAAA6I,MAAM,EAAI;AAClC,YAAIka,MAAM,CAAC9e,QAAP,CAAgB4E,MAAM,CAACzI,KAAvB,CAAJ,EAAmC;AACjC,UAAA,MAAI,CAAC2I,WAAL,CAAiBF,MAAjB;AACD;AACF,OAJD;AAKD,KAhBH;AAiBD;AACF;;AAEM,SAASma,oBAAT,CAA8B1nB,MAA9B,EAAsC;AAC3C,MAAI,QAAOA,MAAP,MAAkB,QAAlB,IAA8B,CAACA,MAAM,CAACG,iBAA1C,EAA6D;AAC3D;AACD;;AACD,MAAI,EAAE,sBAAsBH,MAAM,CAACG,iBAAP,CAAyBE,SAAjD,CAAJ,EAAiE;AAC/DL,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgb,gBAAnC,GACE,SAASA,gBAAT,GAA4B;AAC1B,aAAO,KAAKsM,cAAL,GAAsB,KAAKA,cAA3B,GAA4C,EAAnD;AACD,KAHH;AAID;;AACD,MAAI,EAAE,iBAAiB3nB,MAAM,CAACG,iBAAP,CAAyBE,SAA5C,CAAJ,EAA4D;AAC1DqB,IAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAACG,iBAAP,CAAyBE,SAA/C,EAA0D,aAA1D,EAAyE;AACvEkB,MAAAA,GADuE,cACjE;AACJ,eAAO,KAAKqmB,YAAZ;AACD,OAHsE;AAIvE1mB,MAAAA,GAJuE,YAInE8K,CAJmE,EAIhE;AAAA;;AACL,YAAI,KAAK4b,YAAT,EAAuB;AACrB,eAAKxmB,mBAAL,CAAyB,WAAzB,EAAsC,KAAKwmB,YAA3C;AACA,eAAKxmB,mBAAL,CAAyB,OAAzB,EAAkC,KAAKymB,gBAAvC;AACD;;AACD,aAAKtnB,gBAAL,CAAsB,WAAtB,EAAmC,KAAKqnB,YAAL,GAAoB5b,CAAvD;AACA,aAAKzL,gBAAL,CAAsB,OAAtB,EAA+B,KAAKsnB,gBAAL,GAAwB,UAAChnB,CAAD,EAAO;AAC5DA,UAAAA,CAAC,CAAC6L,OAAF,CAAUhI,OAAV,CAAkB,UAAAyF,MAAM,EAAI;AAC1B,gBAAI,CAAC,MAAI,CAACwd,cAAV,EAA0B;AACxB,cAAA,MAAI,CAACA,cAAL,GAAsB,EAAtB;AACD;;AACD,gBAAI,MAAI,CAACA,cAAL,CAAoBhf,QAApB,CAA6BwB,MAA7B,CAAJ,EAA0C;AACxC;AACD;;AACD,YAAA,MAAI,CAACwd,cAAL,CAAoBtiB,IAApB,CAAyB8E,MAAzB;;AACA,gBAAMoC,KAAK,GAAG,IAAIC,KAAJ,CAAU,WAAV,CAAd;AACAD,YAAAA,KAAK,CAACpC,MAAN,GAAeA,MAAf;;AACA,YAAA,MAAI,CAACwC,aAAL,CAAmBJ,KAAnB;AACD,WAXD;AAYD,SAbD;AAcD;AAxBsE,KAAzE;AA0BA,QAAMN,wBAAwB,GAC5BjM,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6L,oBADrC;;AAEAlM,IAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6L,oBAAnC,GACE,SAASA,oBAAT,GAAgC;AAC9B,UAAMY,EAAE,GAAG,IAAX;;AACA,UAAI,CAAC,KAAK+a,gBAAV,EAA4B;AAC1B,aAAKtnB,gBAAL,CAAsB,OAAtB,EAA+B,KAAKsnB,gBAAL,GAAwB,UAAShnB,CAAT,EAAY;AACjEA,UAAAA,CAAC,CAAC6L,OAAF,CAAUhI,OAAV,CAAkB,UAAAyF,MAAM,EAAI;AAC1B,gBAAI,CAAC2C,EAAE,CAAC6a,cAAR,EAAwB;AACtB7a,cAAAA,EAAE,CAAC6a,cAAH,GAAoB,EAApB;AACD;;AACD,gBAAI7a,EAAE,CAAC6a,cAAH,CAAkBha,OAAlB,CAA0BxD,MAA1B,KAAqC,CAAzC,EAA4C;AAC1C;AACD;;AACD2C,YAAAA,EAAE,CAAC6a,cAAH,CAAkBtiB,IAAlB,CAAuB8E,MAAvB;;AACA,gBAAMoC,KAAK,GAAG,IAAIC,KAAJ,CAAU,WAAV,CAAd;AACAD,YAAAA,KAAK,CAACpC,MAAN,GAAeA,MAAf;AACA2C,YAAAA,EAAE,CAACH,aAAH,CAAiBJ,KAAjB;AACD,WAXD;AAYD,SAbD;AAcD;;AACD,aAAON,wBAAwB,CAACvL,KAAzB,CAA+BoM,EAA/B,EAAmCnM,SAAnC,CAAP;AACD,KApBH;AAqBD;AACF;;AAEM,SAASmnB,gBAAT,CAA0B9nB,MAA1B,EAAkC;AACvC,MAAI,QAAOA,MAAP,MAAkB,QAAlB,IAA8B,CAACA,MAAM,CAACG,iBAA1C,EAA6D;AAC3D;AACD;;AACD,MAAME,SAAS,GAAGL,MAAM,CAACG,iBAAP,CAAyBE,SAA3C;AACA,MAAM4mB,eAAe,GAAG5mB,SAAS,CAACgiB,WAAlC;AACA,MAAM+E,gBAAgB,GAAG/mB,SAAS,CAAC4iB,YAAnC;AACA,MAAM9Q,mBAAmB,GAAG9R,SAAS,CAAC8R,mBAAtC;AACA,MAAMjG,oBAAoB,GAAG7L,SAAS,CAAC6L,oBAAvC;AACA,MAAMmX,eAAe,GAAGhjB,SAAS,CAACgjB,eAAlC;;AAEAhjB,EAAAA,SAAS,CAACgiB,WAAV,GACE,SAASA,WAAT,CAAqB0F,eAArB,EAAsCC,eAAtC,EAAuD;AACrD,QAAMC,OAAO,GAAItnB,SAAS,CAACd,MAAV,IAAoB,CAArB,GAA0Bc,SAAS,CAAC,CAAD,CAAnC,GAAyCA,SAAS,CAAC,CAAD,CAAlE;AACA,QAAMunB,OAAO,GAAGjB,eAAe,CAACvmB,KAAhB,CAAsB,IAAtB,EAA4B,CAACunB,OAAD,CAA5B,CAAhB;;AACA,QAAI,CAACD,eAAL,EAAsB;AACpB,aAAOE,OAAP;AACD;;AACDA,IAAAA,OAAO,CAACjgB,IAAR,CAAa8f,eAAb,EAA8BC,eAA9B;AACA,WAAOvd,OAAO,CAACgF,OAAR,EAAP;AACD,GATH;;AAWApP,EAAAA,SAAS,CAAC4iB,YAAV,GACE,SAASA,YAAT,CAAsB8E,eAAtB,EAAuCC,eAAvC,EAAwD;AACtD,QAAMC,OAAO,GAAItnB,SAAS,CAACd,MAAV,IAAoB,CAArB,GAA0Bc,SAAS,CAAC,CAAD,CAAnC,GAAyCA,SAAS,CAAC,CAAD,CAAlE;AACA,QAAMunB,OAAO,GAAGd,gBAAgB,CAAC1mB,KAAjB,CAAuB,IAAvB,EAA6B,CAACunB,OAAD,CAA7B,CAAhB;;AACA,QAAI,CAACD,eAAL,EAAsB;AACpB,aAAOE,OAAP;AACD;;AACDA,IAAAA,OAAO,CAACjgB,IAAR,CAAa8f,eAAb,EAA8BC,eAA9B;AACA,WAAOvd,OAAO,CAACgF,OAAR,EAAP;AACD,GATH;;AAWA,MAAI0Y,YAAY,GAAG,UAAShX,WAAT,EAAsB4W,eAAtB,EAAuCC,eAAvC,EAAwD;AACzE,QAAME,OAAO,GAAG/V,mBAAmB,CAACzR,KAApB,CAA0B,IAA1B,EAAgC,CAACyQ,WAAD,CAAhC,CAAhB;;AACA,QAAI,CAAC6W,eAAL,EAAsB;AACpB,aAAOE,OAAP;AACD;;AACDA,IAAAA,OAAO,CAACjgB,IAAR,CAAa8f,eAAb,EAA8BC,eAA9B;AACA,WAAOvd,OAAO,CAACgF,OAAR,EAAP;AACD,GAPD;;AAQApP,EAAAA,SAAS,CAAC8R,mBAAV,GAAgCgW,YAAhC;;AAEAA,EAAAA,YAAY,GAAG,UAAShX,WAAT,EAAsB4W,eAAtB,EAAuCC,eAAvC,EAAwD;AACrE,QAAME,OAAO,GAAGhc,oBAAoB,CAACxL,KAArB,CAA2B,IAA3B,EAAiC,CAACyQ,WAAD,CAAjC,CAAhB;;AACA,QAAI,CAAC6W,eAAL,EAAsB;AACpB,aAAOE,OAAP;AACD;;AACDA,IAAAA,OAAO,CAACjgB,IAAR,CAAa8f,eAAb,EAA8BC,eAA9B;AACA,WAAOvd,OAAO,CAACgF,OAAR,EAAP;AACD,GAPD;;AAQApP,EAAAA,SAAS,CAAC6L,oBAAV,GAAiCic,YAAjC;;AAEAA,EAAAA,YAAY,GAAG,UAAS7Q,SAAT,EAAoByQ,eAApB,EAAqCC,eAArC,EAAsD;AACnE,QAAME,OAAO,GAAG7E,eAAe,CAAC3iB,KAAhB,CAAsB,IAAtB,EAA4B,CAAC4W,SAAD,CAA5B,CAAhB;;AACA,QAAI,CAAC0Q,eAAL,EAAsB;AACpB,aAAOE,OAAP;AACD;;AACDA,IAAAA,OAAO,CAACjgB,IAAR,CAAa8f,eAAb,EAA8BC,eAA9B;AACA,WAAOvd,OAAO,CAACgF,OAAR,EAAP;AACD,GAPD;;AAQApP,EAAAA,SAAS,CAACgjB,eAAV,GAA4B8E,YAA5B;AACD;;AAEM,SAASziB,gBAAT,CAA0B1F,MAA1B,EAAkC;AACvC,MAAM6C,SAAS,GAAG7C,MAAM,IAAIA,MAAM,CAAC6C,SAAnC;;AAEA,MAAIA,SAAS,CAACO,YAAV,IAA0BP,SAAS,CAACO,YAAV,CAAuB2G,YAArD,EAAmE;AACjE;AACA,QAAM3G,YAAY,GAAGP,SAAS,CAACO,YAA/B;;AACA,QAAMglB,aAAa,GAAGhlB,YAAY,CAAC2G,YAAb,CAA0BC,IAA1B,CAA+B5G,YAA/B,CAAtB;;AACAP,IAAAA,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,GAAsC,UAAC/C,WAAD,EAAiB;AACrD,aAAOohB,aAAa,CAACC,eAAe,CAACrhB,WAAD,CAAhB,CAApB;AACD,KAFD;AAGD;;AAED,MAAI,CAACnE,SAAS,CAACkH,YAAX,IAA2BlH,SAAS,CAACO,YAArC,IACFP,SAAS,CAACO,YAAV,CAAuB2G,YADzB,EACuC;AACrClH,IAAAA,SAAS,CAACkH,YAAV,GAAyB,SAASA,YAAT,CAAsB/C,WAAtB,EAAmCvG,EAAnC,EAAuC6nB,KAAvC,EAA8C;AACrEzlB,MAAAA,SAAS,CAACO,YAAV,CAAuB2G,YAAvB,CAAoC/C,WAApC,EACCiB,IADD,CACMxH,EADN,EACU6nB,KADV;AAED,KAHwB,CAGvBte,IAHuB,CAGlBnH,SAHkB,CAAzB;AAID;AACF;;AAEM,SAASwlB,eAAT,CAAyBrhB,WAAzB,EAAsC;AAC3C,MAAIA,WAAW,IAAIA,WAAW,CAACU,KAAZ,KAAsBvD,SAAzC,EAAoD;AAClD,WAAOzC,MAAM,CAAC0C,MAAP,CAAc,EAAd,EACL4C,WADK,EAEL;AAACU,MAAAA,KAAK,EAAEjC,KAAK,CAAC9B,aAAN,CAAoBqD,WAAW,CAACU,KAAhC;AAAR,KAFK,CAAP;AAID;;AAED,SAAOV,WAAP;AACD;;AAEM,SAASuhB,oBAAT,CAA8BvoB,MAA9B,EAAsC;AAC3C,MAAI,CAACA,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD,GAH0C,CAI3C;;;AACA,MAAMqoB,kBAAkB,GAAGxoB,MAAM,CAACG,iBAAlC;;AACAH,EAAAA,MAAM,CAACG,iBAAP,GACE,SAASA,iBAAT,CAA2BsoB,QAA3B,EAAqCC,aAArC,EAAoD;AAClD,QAAID,QAAQ,IAAIA,QAAQ,CAACzV,UAAzB,EAAqC;AACnC,UAAM2V,aAAa,GAAG,EAAtB;;AACA,WAAK,IAAIjT,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG+S,QAAQ,CAACzV,UAAT,CAAoBnT,MAAxC,EAAgD6V,CAAC,EAAjD,EAAqD;AACnD,YAAIvC,MAAM,GAAGsV,QAAQ,CAACzV,UAAT,CAAoB0C,CAApB,CAAb;;AACA,YAAI,CAACvC,MAAM,CAACyV,cAAP,CAAsB,MAAtB,CAAD,IACAzV,MAAM,CAACyV,cAAP,CAAsB,KAAtB,CADJ,EACkC;AAChCnjB,UAAAA,KAAK,CAACpD,UAAN,CAAiB,kBAAjB,EAAqC,mBAArC;AACA8Q,UAAAA,MAAM,GAAGjM,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAe+L,MAAf,CAAX,CAAT;AACAA,UAAAA,MAAM,CAACC,IAAP,GAAcD,MAAM,CAACE,GAArB;AACA,iBAAOF,MAAM,CAACE,GAAd;AACAsV,UAAAA,aAAa,CAACtjB,IAAd,CAAmB8N,MAAnB;AACD,SAPD,MAOO;AACLwV,UAAAA,aAAa,CAACtjB,IAAd,CAAmBojB,QAAQ,CAACzV,UAAT,CAAoB0C,CAApB,CAAnB;AACD;AACF;;AACD+S,MAAAA,QAAQ,CAACzV,UAAT,GAAsB2V,aAAtB;AACD;;AACD,WAAO,IAAIH,kBAAJ,CAAuBC,QAAvB,EAAiCC,aAAjC,CAAP;AACD,GApBH;;AAqBA1oB,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,GAAqCmoB,kBAAkB,CAACnoB,SAAxD,CA3B2C,CA4B3C;;AACA,MAAI,yBAAyBmoB,kBAA7B,EAAiD;AAC/C9mB,IAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAACG,iBAA7B,EAAgD,qBAAhD,EAAuE;AACrEoB,MAAAA,GADqE,cAC/D;AACJ,eAAOinB,kBAAkB,CAACK,mBAA1B;AACD;AAHoE,KAAvE;AAKD;AACF;;AAEM,SAASC,yBAAT,CAAmC9oB,MAAnC,EAA2C;AAChD;AACA,MAAI,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACmlB,aAArC,IACA,cAAcnlB,MAAM,CAACmlB,aAAP,CAAqB9kB,SADnC,IAEA,EAAE,iBAAiBL,MAAM,CAACmlB,aAAP,CAAqB9kB,SAAxC,CAFJ,EAEwD;AACtDqB,IAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAACmlB,aAAP,CAAqB9kB,SAA3C,EAAsD,aAAtD,EAAqE;AACnEkB,MAAAA,GADmE,cAC7D;AACJ,eAAO;AAAC8K,UAAAA,QAAQ,EAAE,KAAKA;AAAhB,SAAP;AACD;AAHkE,KAArE;AAKD;AACF;;AAEM,SAAS0c,qBAAT,CAA+B/oB,MAA/B,EAAuC;AAC5C,MAAMinB,eAAe,GAAGjnB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgiB,WAA3D;;AACAriB,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgiB,WAAnC,GACE,SAASA,WAAT,CAAqBG,YAArB,EAAmC;AACjC,QAAIA,YAAJ,EAAkB;AAChB,UAAI,OAAOA,YAAY,CAACC,mBAApB,KAA4C,WAAhD,EAA6D;AAC3D;AACAD,QAAAA,YAAY,CAACC,mBAAb,GACE,CAAC,CAACD,YAAY,CAACC,mBADjB;AAED;;AACD,UAAMuG,gBAAgB,GAAG,KAAKC,eAAL,GAAuB1gB,IAAvB,CAA4B,UAAAkE,WAAW;AAAA,eAC9DA,WAAW,CAACJ,QAAZ,CAAqBvH,KAArB,CAA2BuD,IAA3B,KAAoC,OAD0B;AAAA,OAAvC,CAAzB;;AAEA,UAAIma,YAAY,CAACC,mBAAb,KAAqC,KAArC,IAA8CuG,gBAAlD,EAAoE;AAClE,YAAIA,gBAAgB,CAAC1I,SAAjB,KAA+B,UAAnC,EAA+C;AAC7C,cAAI0I,gBAAgB,CAACE,YAArB,EAAmC;AACjCF,YAAAA,gBAAgB,CAACE,YAAjB,CAA8B,UAA9B;AACD,WAFD,MAEO;AACLF,YAAAA,gBAAgB,CAAC1I,SAAjB,GAA6B,UAA7B;AACD;AACF,SAND,MAMO,IAAI0I,gBAAgB,CAAC1I,SAAjB,KAA+B,UAAnC,EAA+C;AACpD,cAAI0I,gBAAgB,CAACE,YAArB,EAAmC;AACjCF,YAAAA,gBAAgB,CAACE,YAAjB,CAA8B,UAA9B;AACD,WAFD,MAEO;AACLF,YAAAA,gBAAgB,CAAC1I,SAAjB,GAA6B,UAA7B;AACD;AACF;AACF,OAdD,MAcO,IAAIkC,YAAY,CAACC,mBAAb,KAAqC,IAArC,IACP,CAACuG,gBADE,EACgB;AACrB,aAAKjD,cAAL,CAAoB,OAApB;AACD;;AAED,UAAI,OAAOvD,YAAY,CAACE,mBAApB,KAA4C,WAAhD,EAA6D;AAC3D;AACAF,QAAAA,YAAY,CAACE,mBAAb,GACE,CAAC,CAACF,YAAY,CAACE,mBADjB;AAED;;AACD,UAAMyG,gBAAgB,GAAG,KAAKF,eAAL,GAAuB1gB,IAAvB,CAA4B,UAAAkE,WAAW;AAAA,eAC9DA,WAAW,CAACJ,QAAZ,CAAqBvH,KAArB,CAA2BuD,IAA3B,KAAoC,OAD0B;AAAA,OAAvC,CAAzB;;AAEA,UAAIma,YAAY,CAACE,mBAAb,KAAqC,KAArC,IAA8CyG,gBAAlD,EAAoE;AAClE,YAAIA,gBAAgB,CAAC7I,SAAjB,KAA+B,UAAnC,EAA+C;AAC7C,cAAI6I,gBAAgB,CAACD,YAArB,EAAmC;AACjCC,YAAAA,gBAAgB,CAACD,YAAjB,CAA8B,UAA9B;AACD,WAFD,MAEO;AACLC,YAAAA,gBAAgB,CAAC7I,SAAjB,GAA6B,UAA7B;AACD;AACF,SAND,MAMO,IAAI6I,gBAAgB,CAAC7I,SAAjB,KAA+B,UAAnC,EAA+C;AACpD,cAAI6I,gBAAgB,CAACD,YAArB,EAAmC;AACjCC,YAAAA,gBAAgB,CAACD,YAAjB,CAA8B,UAA9B;AACD,WAFD,MAEO;AACLC,YAAAA,gBAAgB,CAAC7I,SAAjB,GAA6B,UAA7B;AACD;AACF;AACF,OAdD,MAcO,IAAIkC,YAAY,CAACE,mBAAb,KAAqC,IAArC,IACP,CAACyG,gBADE,EACgB;AACrB,aAAKpD,cAAL,CAAoB,OAApB;AACD;AACF;;AACD,WAAOkB,eAAe,CAACvmB,KAAhB,CAAsB,IAAtB,EAA4BC,SAA5B,CAAP;AACD,GAxDH;AAyDD;;AAEM,SAASyoB,gBAAT,CAA0BppB,MAA1B,EAAkC;AACvC,MAAI,QAAOA,MAAP,MAAkB,QAAlB,IAA8BA,MAAM,CAACqpB,YAAzC,EAAuD;AACrD;AACD;;AACDrpB,EAAAA,MAAM,CAACqpB,YAAP,GAAsBrpB,MAAM,CAACspB,kBAA7B;AACD;;AC/VD;;;;;;;;AAOA;AACA;;;;;;;;;;;;AAEA;;AACA;;;;;;;;;;AAEO,SAASC,mBAAT,CAA6BvpB,MAA7B,EAAqC;AAC1C;AACA;AACA,MAAI,CAACA,MAAM,CAAC0S,eAAR,IAA4B1S,MAAM,CAAC0S,eAAP,IAA0B,gBACtD1S,MAAM,CAAC0S,eAAP,CAAuBrS,SAD3B,EACuC;AACrC;AACD;;AAED,MAAMmpB,qBAAqB,GAAGxpB,MAAM,CAAC0S,eAArC;;AACA1S,EAAAA,MAAM,CAAC0S,eAAP,GAAyB,SAASA,eAAT,CAAyBX,IAAzB,EAA+B;AACtD;AACA,QAAI,QAAOA,IAAP,MAAgB,QAAhB,IAA4BA,IAAI,CAACuF,SAAjC,IACAvF,IAAI,CAACuF,SAAL,CAAe3J,OAAf,CAAuB,IAAvB,MAAiC,CADrC,EACwC;AACtCoE,MAAAA,IAAI,GAAG7K,IAAI,CAACC,KAAL,CAAWD,IAAI,CAACE,SAAL,CAAe2K,IAAf,CAAX,CAAP;AACAA,MAAAA,IAAI,CAACuF,SAAL,GAAiBvF,IAAI,CAACuF,SAAL,CAAe2I,MAAf,CAAsB,CAAtB,CAAjB;AACD;;AAED,QAAIlO,IAAI,CAACuF,SAAL,IAAkBvF,IAAI,CAACuF,SAAL,CAAezX,MAArC,EAA6C;AAC3C;AACA,UAAM4pB,eAAe,GAAG,IAAID,qBAAJ,CAA0BzX,IAA1B,CAAxB;;AACA,UAAM2X,eAAe,GAAGjW,aAAS4J,cAAT,CAAwBtL,IAAI,CAACuF,SAA7B,CAAxB;;AACA,UAAMqS,kBAAkB,GAAGjoB,MAAM,CAAC0C,MAAP,CAAcqlB,eAAd,EACvBC,eADuB,CAA3B,CAJ2C,CAO3C;;AACAC,MAAAA,kBAAkB,CAACrM,MAAnB,GAA4B,SAASA,MAAT,GAAkB;AAC5C,eAAO;AACLhG,UAAAA,SAAS,EAAEqS,kBAAkB,CAACrS,SADzB;AAELwF,UAAAA,MAAM,EAAE6M,kBAAkB,CAAC7M,MAFtB;AAGLV,UAAAA,aAAa,EAAEuN,kBAAkB,CAACvN,aAH7B;AAILc,UAAAA,gBAAgB,EAAEyM,kBAAkB,CAACzM;AAJhC,SAAP;AAMD,OAPD;;AAQA,aAAOyM,kBAAP;AACD;;AACD,WAAO,IAAIH,qBAAJ,CAA0BzX,IAA1B,CAAP;AACD,GA3BD;;AA4BA/R,EAAAA,MAAM,CAAC0S,eAAP,CAAuBrS,SAAvB,GAAmCmpB,qBAAqB,CAACnpB,SAAzD,CArC0C,CAuC1C;AACA;;AACAoF,EAAAA,KAAK,CAAC1F,uBAAN,CAA8BC,MAA9B,EAAsC,cAAtC,EAAsD,UAAAa,CAAC,EAAI;AACzD,QAAIA,CAAC,CAACyW,SAAN,EAAiB;AACf5V,MAAAA,MAAM,CAACE,cAAP,CAAsBf,CAAtB,EAAyB,WAAzB,EAAsC;AACpCoD,QAAAA,KAAK,EAAE,IAAIjE,MAAM,CAAC0S,eAAX,CAA2B7R,CAAC,CAACyW,SAA7B,CAD6B;AAEpCgF,QAAAA,QAAQ,EAAE;AAF0B,OAAtC;AAID;;AACD,WAAOzb,CAAP;AACD,GARD;AASD;;AAEM,SAAS+oB,kBAAT,CAA4B5pB,MAA5B,EAAoC2F,cAApC,EAAoD;AACzD,MAAI,CAAC3F,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD;;AAED,MAAI,EAAE,UAAUH,MAAM,CAACG,iBAAP,CAAyBE,SAArC,CAAJ,EAAqD;AACnDqB,IAAAA,MAAM,CAACE,cAAP,CAAsB5B,MAAM,CAACG,iBAAP,CAAyBE,SAA/C,EAA0D,MAA1D,EAAkE;AAChEkB,MAAAA,GADgE,cAC1D;AACJ,eAAO,OAAO,KAAKsoB,KAAZ,KAAsB,WAAtB,GAAoC,IAApC,GAA2C,KAAKA,KAAvD;AACD;AAH+D,KAAlE;AAKD;;AAED,MAAMC,iBAAiB,GAAG,UAAS3Y,WAAT,EAAsB;AAC9C,QAAI,CAACA,WAAD,IAAgB,CAACA,WAAW,CAACC,GAAjC,EAAsC;AACpC,aAAO,KAAP;AACD;;AACD,QAAMmM,QAAQ,GAAG9J,aAASwL,aAAT,CAAuB9N,WAAW,CAACC,GAAnC,CAAjB;;AACAmM,IAAAA,QAAQ,CAAClB,KAAT;AACA,WAAOkB,QAAQ,CAAC/U,IAAT,CAAc,UAAA0W,YAAY,EAAI;AACnC,UAAM6K,KAAK,GAAGtW,aAASuW,UAAT,CAAoB9K,YAApB,CAAd;;AACA,aAAO6K,KAAK,IAAIA,KAAK,CAAC1hB,IAAN,KAAe,aAAxB,IACA0hB,KAAK,CAACjS,QAAN,CAAenK,OAAf,CAAuB,MAAvB,MAAmC,CAAC,CAD3C;AAED,KAJM,CAAP;AAKD,GAXD;;AAaA,MAAMsc,uBAAuB,GAAG,UAAS9Y,WAAT,EAAsB;AACpD;AACA,QAAMvR,KAAK,GAAGuR,WAAW,CAACC,GAAZ,CAAgBxR,KAAhB,CAAsB,iCAAtB,CAAd;;AACA,QAAIA,KAAK,KAAK,IAAV,IAAkBA,KAAK,CAACC,MAAN,GAAe,CAArC,EAAwC;AACtC,aAAO,CAAC,CAAR;AACD;;AACD,QAAM+C,OAAO,GAAG9C,QAAQ,CAACF,KAAK,CAAC,CAAD,CAAN,EAAW,EAAX,CAAxB,CANoD,CAOpD;;AACA,WAAOgD,OAAO,KAAKA,OAAZ,GAAsB,CAAC,CAAvB,GAA2BA,OAAlC;AACD,GATD;;AAWA,MAAMsnB,wBAAwB,GAAG,UAASC,eAAT,EAA0B;AACzD;AACA;AACA;AACA;AACA,QAAIC,qBAAqB,GAAG,KAA5B;;AACA,QAAIzkB,cAAc,CAAChD,OAAf,KAA2B,SAA/B,EAA0C;AACxC,UAAIgD,cAAc,CAAC/C,OAAf,GAAyB,EAA7B,EAAiC;AAC/B,YAAIunB,eAAe,KAAK,CAAC,CAAzB,EAA4B;AAC1B;AACA;AACAC,UAAAA,qBAAqB,GAAG,KAAxB;AACD,SAJD,MAIO;AACL;AACA;AACAA,UAAAA,qBAAqB,GAAG,UAAxB;AACD;AACF,OAVD,MAUO,IAAIzkB,cAAc,CAAC/C,OAAf,GAAyB,EAA7B,EAAiC;AACtC;AACA;AACA;AACA;AACAwnB,QAAAA,qBAAqB,GACnBzkB,cAAc,CAAC/C,OAAf,KAA2B,EAA3B,GAAgC,KAAhC,GAAwC,KAD1C;AAED,OAPM,MAOA;AACL;AACAwnB,QAAAA,qBAAqB,GAAG,UAAxB;AACD;AACF;;AACD,WAAOA,qBAAP;AACD,GA9BD;;AAgCA,MAAMC,iBAAiB,GAAG,UAASlZ,WAAT,EAAsBgZ,eAAtB,EAAuC;AAC/D;AACA;AACA,QAAIG,cAAc,GAAG,KAArB,CAH+D,CAK/D;AACA;AACA;;AACA,QAAI3kB,cAAc,CAAChD,OAAf,KAA2B,SAA3B,IACIgD,cAAc,CAAC/C,OAAf,KAA2B,EADnC,EACuC;AACrC0nB,MAAAA,cAAc,GAAG,KAAjB;AACD;;AAED,QAAM1qB,KAAK,GAAG6T,aAAS4L,WAAT,CAAqBlO,WAAW,CAACC,GAAjC,EACZ,qBADY,CAAd;;AAEA,QAAIxR,KAAK,CAACC,MAAN,GAAe,CAAnB,EAAsB;AACpByqB,MAAAA,cAAc,GAAGxqB,QAAQ,CAACF,KAAK,CAAC,CAAD,CAAL,CAASqgB,MAAT,CAAgB,EAAhB,CAAD,EAAsB,EAAtB,CAAzB;AACD,KAFD,MAEO,IAAIta,cAAc,CAAChD,OAAf,KAA2B,SAA3B,IACCwnB,eAAe,KAAK,CAAC,CAD1B,EAC6B;AAClC;AACA;AACA;AACAG,MAAAA,cAAc,GAAG,UAAjB;AACD;;AACD,WAAOA,cAAP;AACD,GAzBD;;AA2BA,MAAMre,wBAAwB,GAC1BjM,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6L,oBADvC;;AAEAlM,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6L,oBAAnC,GACE,SAASA,oBAAT,GAAgC;AAC9B,SAAK2d,KAAL,GAAa,IAAb,CAD8B,CAE9B;AACA;AACA;;AACA,QAAIlkB,cAAc,CAAChD,OAAf,KAA2B,QAA3B,IAAuCgD,cAAc,CAAC/C,OAAf,IAA0B,EAArE,EAAyE;AACvE,UAAM;AAACkQ,QAAAA,YAAY,EAAZA;AAAD,UAAiB,KAAKD,gBAAL,EAAvB;;AACA,UAAIC,YAAY,KAAK,QAArB,EAA+B;AAC7BpR,QAAAA,MAAM,CAACE,cAAP,CAAsB,IAAtB,EAA4B,MAA5B,EAAoC;AAClCL,UAAAA,GADkC,cAC5B;AACJ,mBAAO,OAAO,KAAKsoB,KAAZ,KAAsB,WAAtB,GAAoC,IAApC,GAA2C,KAAKA,KAAvD;AACD,WAHiC;AAIlChoB,UAAAA,UAAU,EAAE,IAJsB;AAKlCC,UAAAA,YAAY,EAAE;AALoB,SAApC;AAOD;AACF;;AAED,QAAIgoB,iBAAiB,CAACnpB,SAAS,CAAC,CAAD,CAAV,CAArB,EAAqC;AACnC;AACA,UAAM4pB,SAAS,GAAGN,uBAAuB,CAACtpB,SAAS,CAAC,CAAD,CAAV,CAAzC,CAFmC,CAInC;;AACA,UAAM6pB,UAAU,GAAGN,wBAAwB,CAACK,SAAD,CAA3C,CALmC,CAOnC;;AACA,UAAME,SAAS,GAAGJ,iBAAiB,CAAC1pB,SAAS,CAAC,CAAD,CAAV,EAAe4pB,SAAf,CAAnC,CARmC,CAUnC;;AACA,UAAID,cAAJ;;AACA,UAAIE,UAAU,KAAK,CAAf,IAAoBC,SAAS,KAAK,CAAtC,EAAyC;AACvCH,QAAAA,cAAc,GAAGI,MAAM,CAACC,iBAAxB;AACD,OAFD,MAEO,IAAIH,UAAU,KAAK,CAAf,IAAoBC,SAAS,KAAK,CAAtC,EAAyC;AAC9CH,QAAAA,cAAc,GAAG9T,IAAI,CAACnQ,GAAL,CAASmkB,UAAT,EAAqBC,SAArB,CAAjB;AACD,OAFM,MAEA;AACLH,QAAAA,cAAc,GAAG9T,IAAI,CAACpQ,GAAL,CAASokB,UAAT,EAAqBC,SAArB,CAAjB;AACD,OAlBkC,CAoBnC;AACA;;;AACA,UAAMG,IAAI,GAAG,EAAb;AACAlpB,MAAAA,MAAM,CAACE,cAAP,CAAsBgpB,IAAtB,EAA4B,gBAA5B,EAA8C;AAC5CrpB,QAAAA,GAD4C,cACtC;AACJ,iBAAO+oB,cAAP;AACD;AAH2C,OAA9C;AAKA,WAAKT,KAAL,GAAae,IAAb;AACD;;AAED,WAAO3e,wBAAwB,CAACvL,KAAzB,CAA+B,IAA/B,EAAqCC,SAArC,CAAP;AACD,GAnDH;AAoDD;;AAEM,SAASkqB,sBAAT,CAAgC7qB,MAAhC,EAAwC;AAC7C,MAAI,EAAEA,MAAM,CAACG,iBAAP,IACF,uBAAuBH,MAAM,CAACG,iBAAP,CAAyBE,SADhD,CAAJ,EACgE;AAC9D;AACD,GAJ4C,CAM7C;AACA;AACA;;;AAEA,WAASyqB,UAAT,CAAoBC,EAApB,EAAwBje,EAAxB,EAA4B;AAC1B,QAAMke,mBAAmB,GAAGD,EAAE,CAACzM,IAA/B;;AACAyM,IAAAA,EAAE,CAACzM,IAAH,GAAU,SAASA,IAAT,GAAgB;AACxB,UAAM1a,IAAI,GAAGjD,SAAS,CAAC,CAAD,CAAtB;AACA,UAAMd,MAAM,GAAG+D,IAAI,CAAC/D,MAAL,IAAe+D,IAAI,CAACnC,IAApB,IAA4BmC,IAAI,CAACqnB,UAAhD;;AACA,UAAIF,EAAE,CAACG,UAAH,KAAkB,MAAlB,IACApe,EAAE,CAAC8d,IADH,IACW/qB,MAAM,GAAGiN,EAAE,CAAC8d,IAAH,CAAQN,cADhC,EACgD;AAC9C,cAAM,IAAIlS,SAAJ,CAAc,8CAClBtL,EAAE,CAAC8d,IAAH,CAAQN,cADU,GACO,SADrB,CAAN;AAED;;AACD,aAAOU,mBAAmB,CAACtqB,KAApB,CAA0BqqB,EAA1B,EAA8BpqB,SAA9B,CAAP;AACD,KATD;AAUD;;AACD,MAAMwqB,qBAAqB,GACzBnrB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC+qB,iBADrC;;AAEAprB,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC+qB,iBAAnC,GACE,SAASA,iBAAT,GAA6B;AAC3B,QAAMC,WAAW,GAAGF,qBAAqB,CAACzqB,KAAtB,CAA4B,IAA5B,EAAkCC,SAAlC,CAApB;AACAmqB,IAAAA,UAAU,CAACO,WAAD,EAAc,IAAd,CAAV;AACA,WAAOA,WAAP;AACD,GALH;;AAMA5lB,EAAAA,KAAK,CAAC1F,uBAAN,CAA8BC,MAA9B,EAAsC,aAAtC,EAAqD,UAAAa,CAAC,EAAI;AACxDiqB,IAAAA,UAAU,CAACjqB,CAAC,CAACyqB,OAAH,EAAYzqB,CAAC,CAAC+R,MAAd,CAAV;AACA,WAAO/R,CAAP;AACD,GAHD;AAID;AAGD;;;;;;;;;AAOO,SAAS0qB,mBAAT,CAA6BvrB,MAA7B,EAAqC;AAC1C,MAAI,CAACA,MAAM,CAACG,iBAAR,IACA,qBAAqBH,MAAM,CAACG,iBAAP,CAAyBE,SADlD,EAC6D;AAC3D;AACD;;AACD,MAAMD,KAAK,GAAGJ,MAAM,CAACG,iBAAP,CAAyBE,SAAvC;AACAqB,EAAAA,MAAM,CAACE,cAAP,CAAsBxB,KAAtB,EAA6B,iBAA7B,EAAgD;AAC9CmB,IAAAA,GAD8C,cACxC;AACJ,aAAO;AACLygB,QAAAA,SAAS,EAAE,WADN;AAELF,QAAAA,QAAQ,EAAE;AAFL,QAGL,KAAKrI,kBAHA,KAGuB,KAAKA,kBAHnC;AAID,KAN6C;AAO9C5X,IAAAA,UAAU,EAAE,IAPkC;AAQ9CC,IAAAA,YAAY,EAAE;AARgC,GAAhD;AAUAJ,EAAAA,MAAM,CAACE,cAAP,CAAsBxB,KAAtB,EAA6B,yBAA7B,EAAwD;AACtDmB,IAAAA,GADsD,cAChD;AACJ,aAAO,KAAKiqB,wBAAL,IAAiC,IAAxC;AACD,KAHqD;AAItDtqB,IAAAA,GAJsD,YAIlDT,EAJkD,EAI9C;AACN,UAAI,KAAK+qB,wBAAT,EAAmC;AACjC,aAAKpqB,mBAAL,CAAyB,uBAAzB,EACI,KAAKoqB,wBADT;AAEA,eAAO,KAAKA,wBAAZ;AACD;;AACD,UAAI/qB,EAAJ,EAAQ;AACN,aAAKF,gBAAL,CAAsB,uBAAtB,EACI,KAAKirB,wBAAL,GAAgC/qB,EADpC;AAED;AACF,KAdqD;AAetDoB,IAAAA,UAAU,EAAE,IAf0C;AAgBtDC,IAAAA,YAAY,EAAE;AAhBwC,GAAxD;AAmBA,GAAC,qBAAD,EAAwB,sBAAxB,EAAgD4C,OAAhD,CAAwD,UAACkN,MAAD,EAAY;AAClE,QAAM6Z,UAAU,GAAGrrB,KAAK,CAACwR,MAAD,CAAxB;;AACAxR,IAAAA,KAAK,CAACwR,MAAD,CAAL,GAAgB,YAAW;AACzB,UAAI,CAAC,KAAK8Z,0BAAV,EAAsC;AACpC,aAAKA,0BAAL,GAAkC,UAAA7qB,CAAC,EAAI;AACrC,cAAMiM,EAAE,GAAGjM,CAAC,CAAC+R,MAAb;;AACA,cAAI9F,EAAE,CAAC6e,oBAAH,KAA4B7e,EAAE,CAAC4M,eAAnC,EAAoD;AAClD5M,YAAAA,EAAE,CAAC6e,oBAAH,GAA0B7e,EAAE,CAAC4M,eAA7B;AACA,gBAAMkS,QAAQ,GAAG,IAAIpf,KAAJ,CAAU,uBAAV,EAAmC3L,CAAnC,CAAjB;AACAiM,YAAAA,EAAE,CAACH,aAAH,CAAiBif,QAAjB;AACD;;AACD,iBAAO/qB,CAAP;AACD,SARD;;AASA,aAAKN,gBAAL,CAAsB,0BAAtB,EACE,KAAKmrB,0BADP;AAED;;AACD,aAAOD,UAAU,CAAC/qB,KAAX,CAAiB,IAAjB,EAAuBC,SAAvB,CAAP;AACD,KAfD;AAgBD,GAlBD;AAmBD;;AAEM,SAASkrB,sBAAT,CAAgC7rB,MAAhC,EAAwC2F,cAAxC,EAAwD;AAC7D;AACA,MAAI,CAAC3F,MAAM,CAACG,iBAAZ,EAA+B;AAC7B;AACD;;AACD,MAAIwF,cAAc,CAAChD,OAAf,KAA2B,QAA3B,IAAuCgD,cAAc,CAAC/C,OAAf,IAA0B,EAArE,EAAyE;AACvE;AACD;;AACD,MAAI+C,cAAc,CAAChD,OAAf,KAA2B,QAA3B,IAAuCgD,cAAc,CAAC/C,OAAf,IAA0B,GAArE,EAA0E;AACxE;AACD;;AACD,MAAMkpB,SAAS,GAAG9rB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6L,oBAArD;;AACAlM,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmC6L,oBAAnC,GACA,SAASA,oBAAT,CAA8B+F,IAA9B,EAAoC;AAClC,QAAIA,IAAI,IAAIA,IAAI,CAACb,GAAb,IAAoBa,IAAI,CAACb,GAAL,CAASzD,OAAT,CAAiB,wBAAjB,MAA+C,CAAC,CAAxE,EAA2E;AACzE,UAAMyD,GAAG,GAAGa,IAAI,CAACb,GAAL,CAAS8O,KAAT,CAAe,IAAf,EAAqB/X,MAArB,CAA4B,UAAC4jB,IAAD,EAAU;AAChD,eAAOA,IAAI,CAACxI,IAAL,OAAgB,sBAAvB;AACD,OAFW,EAET7F,IAFS,CAEJ,IAFI,CAAZ,CADyE,CAIzE;;AACA,UAAI1d,MAAM,CAAC0R,qBAAP,IACAO,IAAI,YAAYjS,MAAM,CAAC0R,qBAD3B,EACkD;AAChD/Q,QAAAA,SAAS,CAAC,CAAD,CAAT,GAAe,IAAIX,MAAM,CAAC0R,qBAAX,CAAiC;AAC9CvM,UAAAA,IAAI,EAAE8M,IAAI,CAAC9M,IADmC;AAE9CiM,UAAAA,GAAG,EAAHA;AAF8C,SAAjC,CAAf;AAID,OAND,MAMO;AACLa,QAAAA,IAAI,CAACb,GAAL,GAAWA,GAAX;AACD;AACF;;AACD,WAAO0a,SAAS,CAACprB,KAAV,CAAgB,IAAhB,EAAsBC,SAAtB,CAAP;AACD,GAlBD;AAmBD;;AAEM,SAASqrB,8BAAT,CAAwChsB,MAAxC,EAAgD2F,cAAhD,EAAgE;AACrE;AACA;AACA;AACA;AACA,MAAI,EAAE3F,MAAM,CAACG,iBAAP,IAA4BH,MAAM,CAACG,iBAAP,CAAyBE,SAAvD,CAAJ,EAAuE;AACrE;AACD;;AACD,MAAM4rB,qBAAqB,GACvBjsB,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgjB,eADvC;;AAEA,MAAI,CAAC4I,qBAAD,IAA0BA,qBAAqB,CAACpsB,MAAtB,KAAiC,CAA/D,EAAkE;AAChE;AACD;;AACDG,EAAAA,MAAM,CAACG,iBAAP,CAAyBE,SAAzB,CAAmCgjB,eAAnC,GACE,SAASA,eAAT,GAA2B;AACzB,QAAI,CAAC1iB,SAAS,CAAC,CAAD,CAAd,EAAmB;AACjB,UAAIA,SAAS,CAAC,CAAD,CAAb,EAAkB;AAChBA,QAAAA,SAAS,CAAC,CAAD,CAAT,CAAaD,KAAb,CAAmB,IAAnB;AACD;;AACD,aAAO+J,OAAO,CAACgF,OAAR,EAAP;AACD,KANwB,CAOzB;AACA;AACA;AACA;AACA;;;AACA,QAAI,CAAE9J,cAAc,CAAChD,OAAf,KAA2B,QAA3B,IAAuCgD,cAAc,CAAC/C,OAAf,GAAyB,EAAjE,IACI+C,cAAc,CAAChD,OAAf,KAA2B,SAA3B,IACGgD,cAAc,CAAC/C,OAAf,GAAyB,EAFhC,IAGI+C,cAAc,CAAChD,OAAf,KAA2B,QAHhC,KAIGhC,SAAS,CAAC,CAAD,CAJZ,IAImBA,SAAS,CAAC,CAAD,CAAT,CAAa2W,SAAb,KAA2B,EAJlD,EAIsD;AACpD,aAAO7M,OAAO,CAACgF,OAAR,EAAP;AACD;;AACD,WAAOwc,qBAAqB,CAACvrB,KAAtB,CAA4B,IAA5B,EAAkCC,SAAlC,CAAP;AACD,GArBH;AAsBD;;;;;;;;;AC3XD;;AAGA;;AACA;;AACA;;AACA;;AACA;;;;;;AAdA;;;;;;;AASE;AAOF;AACO,SAASurB,cAAT,GAKJ;AAAA,MAL4B;AAAClsB,IAAAA,MAAM,EAANA;AAAD,GAK5B,uEALuC,EAKvC;AAAA,MAL2CioB,OAK3C,uEALqD;AACtDkE,IAAAA,UAAU,EAAE,IAD0C;AAEtDC,IAAAA,WAAW,EAAE,IAFyC;AAGtDC,IAAAA,QAAQ,EAAE,IAH4C;AAItDC,IAAAA,UAAU,EAAE;AAJ0C,GAKrD;AACD;AACA,MAAM9mB,OAAO,GAAGC,KAAK,CAACtD,GAAtB;AACA,MAAMwD,cAAc,GAAGF,KAAK,CAAChD,aAAN,CAAoBzC,MAApB,CAAvB;AAEA,MAAMusB,OAAO,GAAG;AACd5mB,IAAAA,cAAc,EAAdA,cADc;AAEd6mB,IAAAA,UAAU,EAAVA,UAFc;AAGdhtB,IAAAA,cAAc,EAAEiG,KAAK,CAACjG,cAHR;AAIduC,IAAAA,UAAU,EAAE0D,KAAK,CAAC1D,UAJJ;AAKdG,IAAAA,eAAe,EAAEuD,KAAK,CAACvD;AALT,GAAhB,CALC,CAaD;;AACA,UAAQyD,cAAc,CAAChD,OAAvB;AACE,SAAK,QAAL;AACE,UAAI,CAAC8pB,UAAD,IAAe,CAACA,UAAU,CAACha,kBAA3B,IACA,CAACwV,OAAO,CAACkE,UADb,EACyB;AACvB3mB,QAAAA,OAAO,CAAC,sDAAD,CAAP;AACA,eAAO+mB,OAAP;AACD;;AACD,UAAI5mB,cAAc,CAAC/C,OAAf,KAA2B,IAA/B,EAAqC;AACnC4C,QAAAA,OAAO,CAAC,sDAAD,CAAP;AACA,eAAO+mB,OAAP;AACD;;AACD/mB,MAAAA,OAAO,CAAC,6BAAD,CAAP,CAVF,CAWE;;AACA+mB,MAAAA,OAAO,CAACG,WAAR,GAAsBD,UAAtB,CAZF,CAcE;;AACAD,MAAAA,UAAU,CAACR,8BAAX,CAA0ChsB,MAA1C,EAAkD2F,cAAlD;AAEA8mB,MAAAA,UAAU,CAAC/mB,gBAAX,CAA4B1F,MAA5B,EAAoC2F,cAApC;AACA8mB,MAAAA,UAAU,CAAC9gB,eAAX,CAA2B3L,MAA3B,EAAmC2F,cAAnC;AACA8mB,MAAAA,UAAU,CAACha,kBAAX,CAA8BzS,MAA9B,EAAsC2F,cAAtC;AACA8mB,MAAAA,UAAU,CAAC3gB,WAAX,CAAuB9L,MAAvB,EAA+B2F,cAA/B;AACA8mB,MAAAA,UAAU,CAAChc,uBAAX,CAAmCzQ,MAAnC,EAA2C2F,cAA3C;AACA8mB,MAAAA,UAAU,CAAC7f,sBAAX,CAAkC5M,MAAlC,EAA0C2F,cAA1C;AACA8mB,MAAAA,UAAU,CAACpe,YAAX,CAAwBrO,MAAxB,EAAgC2F,cAAhC;AACA8mB,MAAAA,UAAU,CAAC/c,0BAAX,CAAsC1P,MAAtC,EAA8C2F,cAA9C;AACA8mB,MAAAA,UAAU,CAAC9Z,oBAAX,CAAgC3S,MAAhC,EAAwC2F,cAAxC;AAEA6mB,MAAAA,UAAU,CAACjD,mBAAX,CAA+BvpB,MAA/B,EAAuC2F,cAAvC;AACA6mB,MAAAA,UAAU,CAACjB,mBAAX,CAA+BvrB,MAA/B,EAAuC2F,cAAvC;AACA6mB,MAAAA,UAAU,CAAC5C,kBAAX,CAA8B5pB,MAA9B,EAAsC2F,cAAtC;AACA6mB,MAAAA,UAAU,CAAC3B,sBAAX,CAAkC7qB,MAAlC,EAA0C2F,cAA1C;AACA6mB,MAAAA,UAAU,CAACX,sBAAX,CAAkC7rB,MAAlC,EAA0C2F,cAA1C;AACA;;AACF,SAAK,SAAL;AACE,UAAI,CAACgnB,WAAD,IAAgB,CAACA,WAAW,CAACla,kBAA7B,IACA,CAACwV,OAAO,CAACmE,WADb,EAC0B;AACxB5mB,QAAAA,OAAO,CAAC,uDAAD,CAAP;AACA,eAAO+mB,OAAP;AACD;;AACD/mB,MAAAA,OAAO,CAAC,8BAAD,CAAP,CANF,CAOE;;AACA+mB,MAAAA,OAAO,CAACG,WAAR,GAAsBC,WAAtB,CARF,CAUE;;AACAH,MAAAA,UAAU,CAACR,8BAAX,CAA0ChsB,MAA1C,EAAkD2F,cAAlD;AAEAgnB,MAAAA,WAAW,CAACjnB,gBAAZ,CAA6B1F,MAA7B,EAAqC2F,cAArC;AACAgnB,MAAAA,WAAW,CAACla,kBAAZ,CAA+BzS,MAA/B,EAAuC2F,cAAvC;AACAgnB,MAAAA,WAAW,CAAC7gB,WAAZ,CAAwB9L,MAAxB,EAAgC2F,cAAhC;AACAgnB,MAAAA,WAAW,CAAClH,gBAAZ,CAA6BzlB,MAA7B,EAAqC2F,cAArC;AACAgnB,MAAAA,WAAW,CAACpH,kBAAZ,CAA+BvlB,MAA/B,EAAuC2F,cAAvC;AACAgnB,MAAAA,WAAW,CAACnH,oBAAZ,CAAiCxlB,MAAjC,EAAyC2F,cAAzC;AACAgnB,MAAAA,WAAW,CAACjH,kBAAZ,CAA+B1lB,MAA/B,EAAuC2F,cAAvC;AACAgnB,MAAAA,WAAW,CAAC9G,kBAAZ,CAA+B7lB,MAA/B,EAAuC2F,cAAvC;AACAgnB,MAAAA,WAAW,CAAC7F,iBAAZ,CAA8B9mB,MAA9B,EAAsC2F,cAAtC;AACAgnB,MAAAA,WAAW,CAAC3F,eAAZ,CAA4BhnB,MAA5B,EAAoC2F,cAApC;AACAgnB,MAAAA,WAAW,CAACxF,gBAAZ,CAA6BnnB,MAA7B,EAAqC2F,cAArC;AAEA6mB,MAAAA,UAAU,CAACjD,mBAAX,CAA+BvpB,MAA/B,EAAuC2F,cAAvC;AACA6mB,MAAAA,UAAU,CAACjB,mBAAX,CAA+BvrB,MAA/B,EAAuC2F,cAAvC;AACA6mB,MAAAA,UAAU,CAAC5C,kBAAX,CAA8B5pB,MAA9B,EAAsC2F,cAAtC;AACA6mB,MAAAA,UAAU,CAAC3B,sBAAX,CAAkC7qB,MAAlC,EAA0C2F,cAA1C;AACA;;AACF,SAAK,MAAL;AACE,UAAI,CAACinB,QAAD,IAAa,CAACA,QAAQ,CAACna,kBAAvB,IAA6C,CAACwV,OAAO,CAACoE,QAA1D,EAAoE;AAClE7mB,QAAAA,OAAO,CAAC,uDAAD,CAAP;AACA,eAAO+mB,OAAP;AACD;;AACD/mB,MAAAA,OAAO,CAAC,2BAAD,CAAP,CALF,CAME;;AACA+mB,MAAAA,OAAO,CAACG,WAAR,GAAsBE,QAAtB;AAEAA,MAAAA,QAAQ,CAAClnB,gBAAT,CAA0B1F,MAA1B,EAAkC2F,cAAlC;AACAinB,MAAAA,QAAQ,CAACjiB,mBAAT,CAA6B3K,MAA7B,EAAqC2F,cAArC;AACAinB,MAAAA,QAAQ,CAACna,kBAAT,CAA4BzS,MAA5B,EAAoC2F,cAApC;AACAinB,MAAAA,QAAQ,CAACnI,gBAAT,CAA0BzkB,MAA1B,EAAkC2F,cAAlC,EAZF,CAcE;;AAEA6mB,MAAAA,UAAU,CAAC5C,kBAAX,CAA8B5pB,MAA9B,EAAsC2F,cAAtC;AACA6mB,MAAAA,UAAU,CAAC3B,sBAAX,CAAkC7qB,MAAlC,EAA0C2F,cAA1C;AACA;;AACF,SAAK,QAAL;AACE,UAAI,CAACknB,UAAD,IAAe,CAAC5E,OAAO,CAACqE,UAA5B,EAAwC;AACtC9mB,QAAAA,OAAO,CAAC,sDAAD,CAAP;AACA,eAAO+mB,OAAP;AACD;;AACD/mB,MAAAA,OAAO,CAAC,6BAAD,CAAP,CALF,CAME;;AACA+mB,MAAAA,OAAO,CAACG,WAAR,GAAsBG,UAAtB,CAPF,CASE;;AACAL,MAAAA,UAAU,CAACR,8BAAX,CAA0ChsB,MAA1C,EAAkD2F,cAAlD;AAEAknB,MAAAA,UAAU,CAACtE,oBAAX,CAAgCvoB,MAAhC,EAAwC2F,cAAxC;AACAknB,MAAAA,UAAU,CAAC9D,qBAAX,CAAiC/oB,MAAjC,EAAyC2F,cAAzC;AACAknB,MAAAA,UAAU,CAAC/E,gBAAX,CAA4B9nB,MAA5B,EAAoC2F,cAApC;AACAknB,MAAAA,UAAU,CAACxF,mBAAX,CAA+BrnB,MAA/B,EAAuC2F,cAAvC;AACAknB,MAAAA,UAAU,CAACnF,oBAAX,CAAgC1nB,MAAhC,EAAwC2F,cAAxC;AACAknB,MAAAA,UAAU,CAAC/D,yBAAX,CAAqC9oB,MAArC,EAA6C2F,cAA7C;AACAknB,MAAAA,UAAU,CAACnnB,gBAAX,CAA4B1F,MAA5B,EAAoC2F,cAApC;AACAknB,MAAAA,UAAU,CAACzD,gBAAX,CAA4BppB,MAA5B,EAAoC2F,cAApC;AAEA6mB,MAAAA,UAAU,CAACjD,mBAAX,CAA+BvpB,MAA/B,EAAuC2F,cAAvC;AACA6mB,MAAAA,UAAU,CAAC5C,kBAAX,CAA8B5pB,MAA9B,EAAsC2F,cAAtC;AACA6mB,MAAAA,UAAU,CAAC3B,sBAAX,CAAkC7qB,MAAlC,EAA0C2F,cAA1C;AACA6mB,MAAAA,UAAU,CAACX,sBAAX,CAAkC7rB,MAAlC,EAA0C2F,cAA1C;AACA;;AACF;AACEH,MAAAA,OAAO,CAAC,sBAAD,CAAP;AACA;AA/GJ;;AAkHA,SAAO+mB,OAAP;AACD;;ACvJD;;;;;;;;AAOA;AAEA;;;;;;;AAEA;;AAEA,IAAMA,OAAO,GACX,qCAAe;AAACvsB,EAAAA,MAAM,EAAE,OAAOA,MAAP,KAAkB,WAAlB,GAAgCmE,SAAhC,GAA4CnE;AAArD,CAAf,CADF;eAEeusB;;;;;;;;;;;;;;;;ACff,IAAA,gBAAA,GAAA,eAAA,CAAA,OAAA,CAAA,gBAAA,CAAA,CAAA;;AAES,OAAA,CAAA,aAAA,GAFF,gBAAA,CAAA,OAEE;;;;;;;;;ACFT,IAAA,SAAA,GAAA,OAAA,CAAA,WAAA,CAAA;;AAEa,OAAA,CAAA,QAAA,GAAW;AAAA;AAAA,YAAA;AAAI,WAAA,OAAA,GAAA;AACjB,SAAA,KAAA,GAAQ,CAAC,MAAD,EAAS,QAAT,EAAmB,MAAnB,EAA2B,QAA3B,CAAoC,SAAS,CAAC,QAA9C,CAAR;AACA,SAAA,iBAAA,GAAoB,CAAC,SAAD,EAAY,QAAZ,EAAsB,QAAtB,CAApB;AAEA,SAAA,iBAAA,GAAoB,EAApB;AACA,SAAA,gBAAA,GAAmB,EAAnB;AACA,SAAA,gBAAA,GAAmB,GAAnB;AA+DV;;AA7DC,EAAA,OAAA,CAAA,SAAA,CAAA,iBAAA,GAAA,YAAA;AACE,WAAO,OAAO,iBAAP,KAA6B,WAApC;AACD,GAFD;;AAIA,EAAA,OAAA,CAAA,SAAA,CAAA,kBAAA,GAAA,YAAA;AACE,QAAM,OAAO,GAAG,KAAK,UAAL,EAAhB;AACA,QAAM,OAAO,GAAG,KAAK,UAAL,EAAhB;AAEA,QAAM,YAAY,GAAG,KAAK,iBAAL,CAAuB,QAAvB,CAAgC,OAAhC,CAArB;AAEA,QAAI,CAAC,YAAL,EAAmB,OAAO,KAAP;AAEnB,QAAI,OAAO,KAAK,QAAhB,EAA0B,OAAO,OAAO,IAAI,KAAK,gBAAvB;AAC1B,QAAI,OAAO,KAAK,SAAhB,EAA2B,OAAO,OAAO,IAAI,KAAK,iBAAvB;AAC3B,QAAI,OAAO,KAAK,QAAhB,EAA0B,OAAO,CAAC,KAAK,KAAN,IAAe,OAAO,IAAI,KAAK,gBAAtC;AAE1B,WAAO,KAAP;AACD,GAbD;;AAeA,EAAA,OAAA,CAAA,SAAA,CAAA,UAAA,GAAA,YAAA;AACE,WAAO,SAAA,CAAA,aAAA,CAAc,cAAd,CAA6B,OAApC;AACD,GAFD;;AAIA,EAAA,OAAA,CAAA,SAAA,CAAA,UAAA,GAAA,YAAA;AACE,WAAO,SAAA,CAAA,aAAA,CAAc,cAAd,CAA6B,OAA7B,IAAwC,CAA/C;AACD,GAFD;;AAIA,EAAA,OAAA,CAAA,SAAA,CAAA,sBAAA,GAAA,YAAA;AACE,QAAM,OAAO,GAAG,KAAK,UAAL,EAAhB;AACA,QAAM,OAAO,GAAG,SAAA,CAAA,aAAA,CAAc,cAAd,CAA6B,OAA7B,IAAwC,CAAxD;AAEA,QAAI,OAAO,KAAK,QAAZ,IAAwB,OAAO,GAAG,EAAtC,EAA0C,OAAO,KAAP;AAC1C,QAAI,OAAO,KAAK,SAAZ,IAAyB,OAAO,IAAI,EAAxC,EAA4C,OAAO,IAAP;AAC5C,QAAI,CAAC,MAAM,CAAC,iBAAR,IAA6B,EAAE,sBAAsB,iBAAiB,CAAC,SAA1C,CAAjC,EAAuF,OAAO,KAAP;AAEvF,QAAI,MAAJ;AACA,QAAI,SAAS,GAAG,KAAhB;;AAEA,QAAI;AACF,MAAA,MAAM,GAAG,IAAI,iBAAJ,EAAT;AACA,MAAA,MAAM,CAAC,cAAP,CAAsB,OAAtB;AACA,MAAA,SAAS,GAAG,IAAZ;AACD,KAJD,CAIE,OAAO,CAAP,EAAU,CAAG,CAJf,SAKQ;AACN,UAAI,MAAJ,EAAY;AACV,QAAA,MAAM,CAAC,KAAP;AACD;AACF;;AAED,WAAO,SAAP;AACD,GAvBD;;AAyBA,EAAA,OAAA,CAAA,SAAA,CAAA,QAAA,GAAA,YAAA;AACE,WAAO,6BACG,KAAK,UAAL,EADH,GACoB,iBADpB,GAEG,KAAK,UAAL,EAFH,GAEoB,eAFpB,GAGC,KAAK,KAHN,GAGW,2BAHX,GAIa,KAAK,iBAAL,EAJb,GAIqC,4BAJrC,GAKc,KAAK,kBAAL,EALd,GAKuC,gCALvC,GAMkB,KAAK,sBAAL,EANzB;AAOD,GARD;;AASF,SAAA,OAAA;AArE4B,CAAJ,EAAA,GAAX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACFb,IAAA,UAAA,GAAA,YAAA,CAAA,OAAA,CAAA,sBAAA,CAAA,CAAA;;AACA,IAAA,UAAA,GAAA,OAAA,CAAA,YAAA,CAAA;;AAGA,IAAM,cAAc,GAAG;AACrB,EAAA,UAAU,EAAE,CACV;AAAE,IAAA,IAAI,EAAE;AAAR,GADU,EAEV;AAAE,IAAA,IAAI,EAAE,wBAAR;AAAkC,IAAA,QAAQ,EAAE,QAA5C;AAAsD,IAAA,UAAU,EAAE;AAAlE,GAFU,CADS;AAKrB,EAAA,YAAY,EAAE;AALO,CAAvB;AAQa,OAAA,CAAA,IAAA,GAAO;AAAA;AAAA,YAAA;AAAI,WAAA,OAAA,GAAA;AAGb,SAAA,UAAA,GAAa,cAAb;AACA,SAAA,UAAA,GAAa,GAAb,CAJa,CAMtB;;AACS,SAAA,eAAA,GAAkB;AAAE,MAAA,MAAM,EAAE,CAAV;AAAa,MAAA,MAAM,EAAE;AAArB,KAAlB;AACA,SAAA,UAAA,GAAa,KAAb,CARa,CAQO;AAE7B;;AACS,SAAA,aAAA,GAAgB,cAAhB;AAEA,SAAA,OAAA,GAAU,UAAA,CAAA,QAAA,CAAS,UAAT,EAAV;AACA,SAAA,cAAA,GAAiB,UAAA,CAAA,QAAA,CAAS,UAAT,EAAjB,CAda,CAgBtB;;AACS,SAAA,QAAA,GAAY,YAAA;AACnB,UAAM,SAAS,GAAoB;AACjC,QAAA,OAAO,EAAE,UAAA,CAAA,QAAA,CAAS,kBAAT,EADwB;AAEjC,QAAA,MAAM,EAAE,UAAA,CAAA,QAAA,CAAS,iBAAT,EAFyB;AAGjC,QAAA,UAAU,EAAE,KAHqB;AAIjC,QAAA,IAAI,EAAE,KAJ2B;AAKjC,QAAA,UAAU,EAAE,KALqB;AAMjC,QAAA,QAAQ,EAAE;AANuB,OAAnC;AASA,UAAI,CAAC,SAAS,CAAC,MAAf,EAAuB,OAAO,SAAP;AAEvB,UAAI,EAAJ;;AAEA,UAAI;AACF,QAAA,EAAE,GAAG,IAAI,iBAAJ,CAAsB,cAAtB,CAAL;AAEA,QAAA,SAAS,CAAC,UAAV,GAAuB,IAAvB;AAEA,YAAI,EAAE,GAAA,KAAA,CAAN;;AAEA,YAAI;AACF,UAAA,EAAE,GAAG,EAAE,CAAC,iBAAH,CAAqB,aAArB,EAAoC;AAAE,YAAA,OAAO,EAAE;AAAX,WAApC,CAAL;AACA,UAAA,SAAS,CAAC,IAAV,GAAiB,IAAjB;AACA,UAAA,SAAS,CAAC,QAAV,GAAqB,CAAC,CAAC,EAAE,CAAC,OAA1B,CAHE,CAKF;;AACA,cAAI;AACF,YAAA,EAAE,CAAC,UAAH,GAAgB,MAAhB;AACA,YAAA,SAAS,CAAC,UAAV,GAAuB,CAAC,UAAA,CAAA,QAAA,CAAS,KAAjC;AACD,WAHD,CAGE,OAAO,CAAP,EAAU,CACX;AACF,SAXD,CAWE,OAAO,CAAP,EAAU,CACX,CAZD,SAYU;AACR,cAAI,EAAJ,EAAQ;AACN,YAAA,EAAE,CAAC,KAAH;AACD;AACF;AACF,OAxBD,CAwBE,OAAO,CAAP,EAAU,CACX,CAzBD,SAyBU;AACR,YAAI,EAAJ,EAAQ;AACN,UAAA,EAAE,CAAC,KAAH;AACD;AACF;;AAED,aAAO,SAAP;AACD,KA9CmB,EAAX;;AAsDT,SAAA,IAAA,GAAO,UAAU,CAAC,IAAlB;AACA,SAAA,MAAA,GAAS,UAAU,CAAC,MAApB,CAxEsB,CA0EtB;;AAEQ,SAAA,UAAA,GAAqB,CAArB;AAiET;;AA5IC,EAAA,OAAA,CAAA,SAAA,CAAA,IAAA,GAAA,YAAA,CAAgB,CAAhB,CADkB,CAiElB;;;AACA,EAAA,OAAA,CAAA,SAAA,CAAA,UAAA,GAAA,UAAW,EAAX,EAAqB;AACnB;AACA,WAAO,CAAC,EAAD,IAAO,uCAAuC,IAAvC,CAA4C,EAA5C,CAAd;AACD,GAHD;;AAYA,EAAA,OAAA,CAAA,SAAA,CAAA,KAAA,GAAA,UAAM,IAAN,EAAgB;AACd,QAAM,MAAM,GAAG,EAAf;AACA,QAAM,IAAI,GAAG,IAAI,CAAC,IAAlB;AACA,QAAM,KAAK,GAAG,IAAI,CAAC,IAAL,CAAU,IAAI,GAAG,OAAA,CAAA,IAAA,CAAK,UAAtB,CAAd;AAEA,QAAI,KAAK,GAAG,CAAZ;AACA,QAAI,KAAK,GAAG,CAAZ;;AAEA,WAAO,KAAK,GAAG,IAAf,EAAqB;AACnB,UAAM,GAAG,GAAG,IAAI,CAAC,GAAL,CAAS,IAAT,EAAe,KAAK,GAAG,OAAA,CAAA,IAAA,CAAK,UAA5B,CAAZ;AACA,UAAM,CAAC,GAAG,IAAI,CAAC,KAAL,CAAW,KAAX,EAAkB,GAAlB,CAAV;AAEA,UAAM,KAAK,GAAG;AACZ,QAAA,UAAU,EAAE,KAAK,UADL;AAEZ,QAAA,CAAC,EAAE,KAFS;AAGZ,QAAA,IAAI,EAAE,CAHM;AAIZ,QAAA,KAAK,EAAA;AAJO,OAAd;AAOA,MAAA,MAAM,CAAC,IAAP,CAAY,KAAZ;AAEA,MAAA,KAAK,GAAG,GAAR;AACA,MAAA,KAAK;AACN;;AAED,SAAK,UAAL;AAEA,WAAO,MAAP;AACD,GA5BD;;AA8BA,EAAA,OAAA,CAAA,SAAA,CAAA,iBAAA,GAAA,UAAkB,IAAlB,EAA8B,EAA9B,EAAmE;AACjE,QAAM,EAAE,GAAG,IAAI,UAAJ,EAAX;;AAEA,IAAA,EAAE,CAAC,MAAH,GAAY,UAAU,GAAV,EAAa;AACvB,UAAI,GAAG,CAAC,MAAR,EAAgB;AACd,QAAA,EAAE,CAAC,GAAG,CAAC,MAAJ,CAAW,MAAZ,CAAF;AACD;AACF,KAJD;;AAMA,IAAA,EAAE,CAAC,iBAAH,CAAqB,IAArB;AAEA,WAAO,EAAP;AACD,GAZD;;AAcA,EAAA,OAAA,CAAA,SAAA,CAAA,yBAAA,GAAA,UAA0B,MAA1B,EAAwC;AACtC,QAAM,SAAS,GAAG,IAAI,UAAJ,CAAe,MAAM,CAAC,MAAtB,CAAlB;;AAEA,SAAK,IAAI,CAAC,GAAG,CAAb,EAAgB,CAAC,GAAG,MAAM,CAAC,MAA3B,EAAmC,CAAC,EAApC,EAAwC;AACtC,MAAA,SAAS,CAAC,CAAD,CAAT,GAAe,MAAM,CAAC,UAAP,CAAkB,CAAlB,IAAuB,IAAtC;AACD;;AAED,WAAO,SAAS,CAAC,MAAjB;AACD,GARD;;AAUA,EAAA,OAAA,CAAA,SAAA,CAAA,WAAA,GAAA,YAAA;AACE,WAAO,IAAI,CAAC,MAAL,GACJ,QADI,CACK,EADL,EAEJ,MAFI,CAEG,CAFH,CAAP;AAGD,GAJD;;AAMA,EAAA,OAAA,CAAA,SAAA,CAAA,QAAA,GAAA,YAAA;AACE,WAAO,QAAQ,CAAC,QAAT,KAAsB,QAA7B;AACD,GAFD;;AAGF,SAAA,OAAA;AA7IwB,CAAJ,EAAA,GAAP;;ACZb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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:<pt> 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<object> = [];\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 = <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 = <DataConnection>(\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 = <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 = <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<void> {\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 = <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<void> {\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<void> {\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<void> {\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<string> {\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<any[]> {\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<string, BaseConnection[]> = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map<string, ServerMessage[]> = 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<string,[]> \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(<any>window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(<any>window).Peer = Peer;\n"]}
|
||
\ No newline at end of file
|
||
diff --git a/node_modules/peerjs/dist/peerjs.min.js b/node_modules/peerjs/dist/peerjs.min.js
|
||
index d6fe8fa..bb59225 100644
|
||
--- a/node_modules/peerjs/dist/peerjs.min.js
|
||
+++ b/node_modules/peerjs/dist/peerjs.min.js
|
||
@@ -1,70 +1,13 @@
|
||
-parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"EgBh":[function(require,module,exports) {
|
||
-var e={};e.useBlobBuilder=function(){try{return new Blob([]),!1}catch(e){return!0}}(),e.useArrayBufferView=!e.useBlobBuilder&&function(){try{return 0===new Blob([new Uint8Array([])]).size}catch(e){return!0}}(),module.exports.binaryFeatures=e;var r=module.exports.BlobBuilder;function t(){this._pieces=[],this._parts=[]}"undefined"!=typeof window&&(r=module.exports.BlobBuilder=window.WebKitBlobBuilder||window.MozBlobBuilder||window.MSBlobBuilder||window.BlobBuilder),t.prototype.append=function(e){"number"==typeof e?this._pieces.push(e):(this.flush(),this._parts.push(e))},t.prototype.flush=function(){if(this._pieces.length>0){var r=new Uint8Array(this._pieces);e.useArrayBufferView||(r=r.buffer),this._parts.push(r),this._pieces=[]}},t.prototype.getBuffer=function(){if(this.flush(),e.useBlobBuilder){for(var t=new r,i=0,u=this._parts.length;i<u;i++)t.append(this._parts[i]);return t.getBlob()}return new Blob(this._parts)},module.exports.BufferBuilder=t;
|
||
-},{}],"kdPp":[function(require,module,exports) {
|
||
-var t=require("./bufferbuilder").BufferBuilder,e=require("./bufferbuilder").binaryFeatures,i={unpack:function(t){return new r(t).unpack()},pack:function(t){var e=new n;return e.pack(t),e.getBuffer()}};function r(t){this.index=0,this.dataBuffer=t,this.dataView=new Uint8Array(this.dataBuffer),this.length=this.dataBuffer.byteLength}function n(){this.bufferBuilder=new t}function u(t){var e=t.charCodeAt(0);return e<=2047?"00":e<=65535?"000":e<=2097151?"0000":e<=67108863?"00000":"000000"}function a(t){return t.length>600?new Blob([t]).size:t.replace(/[^\u0000-\u007F]/g,u).length}module.exports=i,r.prototype.unpack=function(){var t,e=this.unpack_uint8();if(e<128)return e;if((224^e)<32)return(224^e)-32;if((t=160^e)<=15)return this.unpack_raw(t);if((t=176^e)<=15)return this.unpack_string(t);if((t=144^e)<=15)return this.unpack_array(t);if((t=128^e)<=15)return this.unpack_map(t);switch(e){case 192:return null;case 193:return;case 194:return!1;case 195:return!0;case 202:return this.unpack_float();case 203:return this.unpack_double();case 204:return this.unpack_uint8();case 205:return this.unpack_uint16();case 206:return this.unpack_uint32();case 207:return this.unpack_uint64();case 208:return this.unpack_int8();case 209:return this.unpack_int16();case 210:return this.unpack_int32();case 211:return this.unpack_int64();case 212:case 213:case 214:case 215:return;case 216:return t=this.unpack_uint16(),this.unpack_string(t);case 217:return t=this.unpack_uint32(),this.unpack_string(t);case 218:return t=this.unpack_uint16(),this.unpack_raw(t);case 219:return t=this.unpack_uint32(),this.unpack_raw(t);case 220:return t=this.unpack_uint16(),this.unpack_array(t);case 221:return t=this.unpack_uint32(),this.unpack_array(t);case 222:return t=this.unpack_uint16(),this.unpack_map(t);case 223:return t=this.unpack_uint32(),this.unpack_map(t)}},r.prototype.unpack_uint8=function(){var t=255&this.dataView[this.index];return this.index++,t},r.prototype.unpack_uint16=function(){var t=this.read(2),e=256*(255&t[0])+(255&t[1]);return this.index+=2,e},r.prototype.unpack_uint32=function(){var t=this.read(4),e=256*(256*(256*t[0]+t[1])+t[2])+t[3];return this.index+=4,e},r.prototype.unpack_uint64=function(){var t=this.read(8),e=256*(256*(256*(256*(256*(256*(256*t[0]+t[1])+t[2])+t[3])+t[4])+t[5])+t[6])+t[7];return this.index+=8,e},r.prototype.unpack_int8=function(){var t=this.unpack_uint8();return t<128?t:t-256},r.prototype.unpack_int16=function(){var t=this.unpack_uint16();return t<32768?t:t-65536},r.prototype.unpack_int32=function(){var t=this.unpack_uint32();return t<Math.pow(2,31)?t:t-Math.pow(2,32)},r.prototype.unpack_int64=function(){var t=this.unpack_uint64();return t<Math.pow(2,63)?t:t-Math.pow(2,64)},r.prototype.unpack_raw=function(t){if(this.length<this.index+t)throw new Error("BinaryPackFailure: index is out of range "+this.index+" "+t+" "+this.length);var e=this.dataBuffer.slice(this.index,this.index+t);return this.index+=t,e},r.prototype.unpack_string=function(t){for(var e,i,r=this.read(t),n=0,u="";n<t;)(e=r[n])<128?(u+=String.fromCharCode(e),n++):(192^e)<32?(i=(192^e)<<6|63&r[n+1],u+=String.fromCharCode(i),n+=2):(i=(15&e)<<12|(63&r[n+1])<<6|63&r[n+2],u+=String.fromCharCode(i),n+=3);return this.index+=t,u},r.prototype.unpack_array=function(t){for(var e=new Array(t),i=0;i<t;i++)e[i]=this.unpack();return e},r.prototype.unpack_map=function(t){for(var e={},i=0;i<t;i++){var r=this.unpack(),n=this.unpack();e[r]=n}return e},r.prototype.unpack_float=function(){var t=this.unpack_uint32(),e=(t>>23&255)-127;return(0===t>>31?1:-1)*(8388607&t|8388608)*Math.pow(2,e-23)},r.prototype.unpack_double=function(){var t=this.unpack_uint32(),e=this.unpack_uint32(),i=(t>>20&2047)-1023;return(0===t>>31?1:-1)*((1048575&t|1048576)*Math.pow(2,i-20)+e*Math.pow(2,i-52))},r.prototype.read=function(t){var e=this.index;if(e+t<=this.length)return this.dataView.subarray(e,e+t);throw new Error("BinaryPackFailure: read index out of range")},n.prototype.getBuffer=function(){return this.bufferBuilder.getBuffer()},n.prototype.pack=function(t){var i=typeof t;if("string"===i)this.pack_string(t);else if("number"===i)Math.floor(t)===t?this.pack_integer(t):this.pack_double(t);else if("boolean"===i)!0===t?this.bufferBuilder.append(195):!1===t&&this.bufferBuilder.append(194);else if("undefined"===i)this.bufferBuilder.append(192);else{if("object"!==i)throw new Error('Type "'+i+'" not yet supported');if(null===t)this.bufferBuilder.append(192);else{var r=t.constructor;if(r==Array)this.pack_array(t);else if(r==Blob||r==File||t instanceof Blob||t instanceof File)this.pack_bin(t);else if(r==ArrayBuffer)e.useArrayBufferView?this.pack_bin(new Uint8Array(t)):this.pack_bin(t);else if("BYTES_PER_ELEMENT"in t)e.useArrayBufferView?this.pack_bin(new Uint8Array(t.buffer)):this.pack_bin(t.buffer);else if(r==Object||r.toString().startsWith("class"))this.pack_object(t);else if(r==Date)this.pack_string(t.toString());else{if("function"!=typeof t.toBinaryPack)throw new Error('Type "'+r.toString()+'" not yet supported');this.bufferBuilder.append(t.toBinaryPack())}}}this.bufferBuilder.flush()},n.prototype.pack_bin=function(t){var e=t.length||t.byteLength||t.size;if(e<=15)this.pack_uint8(160+e);else if(e<=65535)this.bufferBuilder.append(218),this.pack_uint16(e);else{if(!(e<=4294967295))throw new Error("Invalid length");this.bufferBuilder.append(219),this.pack_uint32(e)}this.bufferBuilder.append(t)},n.prototype.pack_string=function(t){var e=a(t);if(e<=15)this.pack_uint8(176+e);else if(e<=65535)this.bufferBuilder.append(216),this.pack_uint16(e);else{if(!(e<=4294967295))throw new Error("Invalid length");this.bufferBuilder.append(217),this.pack_uint32(e)}this.bufferBuilder.append(t)},n.prototype.pack_array=function(t){var e=t.length;if(e<=15)this.pack_uint8(144+e);else if(e<=65535)this.bufferBuilder.append(220),this.pack_uint16(e);else{if(!(e<=4294967295))throw new Error("Invalid length");this.bufferBuilder.append(221),this.pack_uint32(e)}for(var i=0;i<e;i++)this.pack(t[i])},n.prototype.pack_integer=function(t){if(t>=-32&&t<=127)this.bufferBuilder.append(255&t);else if(t>=0&&t<=255)this.bufferBuilder.append(204),this.pack_uint8(t);else if(t>=-128&&t<=127)this.bufferBuilder.append(208),this.pack_int8(t);else if(t>=0&&t<=65535)this.bufferBuilder.append(205),this.pack_uint16(t);else if(t>=-32768&&t<=32767)this.bufferBuilder.append(209),this.pack_int16(t);else if(t>=0&&t<=4294967295)this.bufferBuilder.append(206),this.pack_uint32(t);else if(t>=-2147483648&&t<=2147483647)this.bufferBuilder.append(210),this.pack_int32(t);else if(t>=-0x8000000000000000&&t<=0x8000000000000000)this.bufferBuilder.append(211),this.pack_int64(t);else{if(!(t>=0&&t<=0x10000000000000000))throw new Error("Invalid integer");this.bufferBuilder.append(207),this.pack_uint64(t)}},n.prototype.pack_double=function(t){var e=0;t<0&&(e=1,t=-t);var i=Math.floor(Math.log(t)/Math.LN2),r=t/Math.pow(2,i)-1,n=Math.floor(r*Math.pow(2,52)),u=Math.pow(2,32),a=e<<31|i+1023<<20|n/u&1048575,p=n%u;this.bufferBuilder.append(203),this.pack_int32(a),this.pack_int32(p)},n.prototype.pack_object=function(t){var e=Object.keys(t).length;if(e<=15)this.pack_uint8(128+e);else if(e<=65535)this.bufferBuilder.append(222),this.pack_uint16(e);else{if(!(e<=4294967295))throw new Error("Invalid length");this.bufferBuilder.append(223),this.pack_uint32(e)}for(var i in t)t.hasOwnProperty(i)&&(this.pack(i),this.pack(t[i]))},n.prototype.pack_uint8=function(t){this.bufferBuilder.append(t)},n.prototype.pack_uint16=function(t){this.bufferBuilder.append(t>>8),this.bufferBuilder.append(255&t)},n.prototype.pack_uint32=function(t){var e=4294967295&t;this.bufferBuilder.append((4278190080&e)>>>24),this.bufferBuilder.append((16711680&e)>>>16),this.bufferBuilder.append((65280&e)>>>8),this.bufferBuilder.append(255&e)},n.prototype.pack_uint64=function(t){var e=t/Math.pow(2,32),i=t%Math.pow(2,32);this.bufferBuilder.append((4278190080&e)>>>24),this.bufferBuilder.append((16711680&e)>>>16),this.bufferBuilder.append((65280&e)>>>8),this.bufferBuilder.append(255&e),this.bufferBuilder.append((4278190080&i)>>>24),this.bufferBuilder.append((16711680&i)>>>16),this.bufferBuilder.append((65280&i)>>>8),this.bufferBuilder.append(255&i)},n.prototype.pack_int8=function(t){this.bufferBuilder.append(255&t)},n.prototype.pack_int16=function(t){this.bufferBuilder.append((65280&t)>>8),this.bufferBuilder.append(255&t)},n.prototype.pack_int32=function(t){this.bufferBuilder.append(t>>>24&255),this.bufferBuilder.append((16711680&t)>>>16),this.bufferBuilder.append((65280&t)>>>8),this.bufferBuilder.append(255&t)},n.prototype.pack_int64=function(t){var e=Math.floor(t/Math.pow(2,32)),i=t%Math.pow(2,32);this.bufferBuilder.append((4278190080&e)>>>24),this.bufferBuilder.append((16711680&e)>>>16),this.bufferBuilder.append((65280&e)>>>8),this.bufferBuilder.append(255&e),this.bufferBuilder.append((4278190080&i)>>>24),this.bufferBuilder.append((16711680&i)>>>16),this.bufferBuilder.append((65280&i)>>>8),this.bufferBuilder.append(255&i)};
|
||
-},{"./bufferbuilder":"EgBh"}],"iSxC":[function(require,module,exports) {
|
||
-"use strict";function e(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function t(e){return(t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}Object.defineProperty(exports,"__esModule",{value:!0}),exports.extractVersion=o,exports.wrapPeerConnectionEvent=i,exports.disableLog=s,exports.disableWarnings=a,exports.log=p,exports.deprecated=u,exports.detectBrowser=c,exports.compactObject=f,exports.walkStats=l,exports.filterStats=v;var n=!0,r=!0;function o(e,t,n){var r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function i(e,t,n){if(e.RTCPeerConnection){var r=e.RTCPeerConnection.prototype,o=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return o.apply(this,arguments);var i=function(e){var t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,i),o.apply(this,[e,i])};var i=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return i.apply(this,arguments);if(!this._eventMap[t].has(n))return i.apply(this,arguments);var r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,i.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get:function(){return this["_on"+t]},set:function(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}}function s(e){return"boolean"!=typeof e?new Error("Argument type: "+t(e)+". Please use a boolean."):(n=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function a(e){return"boolean"!=typeof e?new Error("Argument type: "+t(e)+". Please use a boolean."):(r=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function p(){if("object"===("undefined"==typeof window?"undefined":t(window))){if(n)return;"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments)}}function u(e,t){r&&console.warn(e+" is deprecated, please use "+t+" instead.")}function c(e){var t={browser:null,version:null};if(void 0===e||!e.navigator)return t.browser="Not a browser.",t;var{navigator:n}=e;if(n.mozGetUserMedia)t.browser="firefox",t.version=o(n.userAgent,/Firefox\/(\d+)\./,1);else if(n.webkitGetUserMedia||!1===e.isSecureContext&&e.webkitRTCPeerConnection&&!e.RTCIceGatherer)t.browser="chrome",t.version=o(n.userAgent,/Chrom(e|ium)\/(\d+)\./,2);else if(n.mediaDevices&&n.userAgent.match(/Edge\/(\d+).(\d+)$/))t.browser="edge",t.version=o(n.userAgent,/Edge\/(\d+).(\d+)$/,2);else{if(!e.RTCPeerConnection||!n.userAgent.match(/AppleWebKit\/(\d+)\./))return t.browser="Not a supported browser.",t;t.browser="safari",t.version=o(n.userAgent,/AppleWebKit\/(\d+)\./,1),t.supportsUnifiedPlan=e.RTCRtpTransceiver&&"currentDirection"in e.RTCRtpTransceiver.prototype}return t}function d(e){return"[object Object]"===Object.prototype.toString.call(e)}function f(t){return d(t)?Object.keys(t).reduce(function(n,r){var o=d(t[r]),i=o?f(t[r]):t[r],s=o&&!Object.keys(i).length;return void 0===i||s?n:Object.assign(n,e({},r,i))},{}):t}function l(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach(function(r){r.endsWith("Id")?l(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach(function(t){l(e,e.get(t),n)})}))}function v(e,t,n){var r=n?"outbound-rtp":"inbound-rtp",o=new Map;if(null===t)return o;var i=[];return e.forEach(function(e){"track"===e.type&&e.trackIdentifier===t.id&&i.push(e)}),i.forEach(function(t){e.forEach(function(n){n.type===r&&n.trackId===t.id&&l(e,n,o)})}),o}
|
||
-},{}],"s6SN":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetUserMedia=i;var e=t(require("../utils.js"));function r(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return r=function(){return e},e}function t(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=r();if(t&&t.has(e))return t.get(e);var o={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(o,i,a):o[i]=e[i]}return o.default=e,t&&t.set(e,o),o}function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}var n=e.log;function i(e,r){var t=e&&e.navigator;if(t.mediaDevices){var i=function(e){if("object"!==o(e)||e.mandatory||e.optional)return e;var r={};return Object.keys(e).forEach(function(t){if("require"!==t&&"advanced"!==t&&"mediaSource"!==t){var n="object"===o(e[t])?e[t]:{ideal:e[t]};void 0!==n.exact&&"number"==typeof n.exact&&(n.min=n.max=n.exact);var i=function(e,r){return e?e+r.charAt(0).toUpperCase()+r.slice(1):"deviceId"===r?"sourceId":r};if(void 0!==n.ideal){r.optional=r.optional||[];var a={};"number"==typeof n.ideal?(a[i("min",t)]=n.ideal,r.optional.push(a),(a={})[i("max",t)]=n.ideal,r.optional.push(a)):(a[i("",t)]=n.ideal,r.optional.push(a))}void 0!==n.exact&&"number"!=typeof n.exact?(r.mandatory=r.mandatory||{},r.mandatory[i("",t)]=n.exact):["min","max"].forEach(function(e){void 0!==n[e]&&(r.mandatory=r.mandatory||{},r.mandatory[i(e,t)]=n[e])})}}),e.advanced&&(r.optional=(r.optional||[]).concat(e.advanced)),r},a=function(e,a){if(r.version>=61)return a(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"===o(e.audio)){var c=function(e,r,t){r in e&&!(t in e)&&(e[t]=e[r],delete e[r])};c((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),c(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=i(e.audio)}if(e&&"object"===o(e.video)){var d=e.video.facingMode;d=d&&("object"===o(d)?d:{ideal:d});var u,s=r.version<66;if(d&&("user"===d.exact||"environment"===d.exact||"user"===d.ideal||"environment"===d.ideal)&&(!t.mediaDevices.getSupportedConstraints||!t.mediaDevices.getSupportedConstraints().facingMode||s))if(delete e.video.facingMode,"environment"===d.exact||"environment"===d.ideal?u=["back","rear"]:"user"!==d.exact&&"user"!==d.ideal||(u=["front"]),u)return t.mediaDevices.enumerateDevices().then(function(r){var t=(r=r.filter(function(e){return"videoinput"===e.kind})).find(function(e){return u.some(function(r){return e.label.toLowerCase().includes(r)})});return!t&&r.length&&u.includes("back")&&(t=r[r.length-1]),t&&(e.video.deviceId=d.exact?{exact:t.deviceId}:{ideal:t.deviceId}),e.video=i(e.video),n("chrome: "+JSON.stringify(e)),a(e)});e.video=i(e.video)}return n("chrome: "+JSON.stringify(e)),a(e)},c=function(e){return r.version>=64?e:{name:{PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"}[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString:function(){return this.name+(this.message&&": ")+this.message}}};if(t.getUserMedia=function(e,r,o){a(e,function(e){t.webkitGetUserMedia(e,r,function(e){o&&o(c(e))})})}.bind(t),t.mediaDevices.getUserMedia){var d=t.mediaDevices.getUserMedia.bind(t.mediaDevices);t.mediaDevices.getUserMedia=function(e){return a(e,function(e){return d(e).then(function(r){if(e.audio&&!r.getAudioTracks().length||e.video&&!r.getVideoTracks().length)throw r.getTracks().forEach(function(e){e.stop()}),new DOMException("","NotFoundError");return r},function(e){return Promise.reject(c(e))})})}}}}
|
||
-},{"../utils.js":"iSxC"}],"VHa8":[function(require,module,exports) {
|
||
-"use strict";function e(e,i){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof i?e.navigator.mediaDevices.getDisplayMedia=function(a){return i(a).then(function(i){var t=a.video&&a.video.width,o=a.video&&a.video.height,d=a.video&&a.video.frameRate;return a.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:i,maxFrameRate:d||3}},t&&(a.video.mandatory.maxWidth=t),o&&(a.video.mandatory.maxHeight=o),e.navigator.mediaDevices.getUserMedia(a)})}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=e;
|
||
-},{}],"uI5X":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimMediaStream=a,exports.shimOnTrack=c,exports.shimGetSendersWithDtmf=p,exports.shimGetStats=d,exports.shimSenderReceiverGetStats=h,exports.shimAddTrackRemoveTrackWithNative=f,exports.shimAddTrackRemoveTrack=m,exports.shimPeerConnection=u,exports.fixNegotiationNeeded=l,Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return t.shimGetUserMedia}}),Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return r.shimGetDisplayMedia}});var e=i(require("../utils.js")),t=require("./getusermedia"),r=require("./getdisplaymedia");function n(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return n=function(){return e},e}function i(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=n();if(t&&t.has(e))return t.get(e);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var o in e)if(Object.prototype.hasOwnProperty.call(e,o)){var s=i?Object.getOwnPropertyDescriptor(e,o):null;s&&(s.get||s.set)?Object.defineProperty(r,o,s):r[o]=e[o]}return r.default=e,t&&t.set(e,r),r}function o(e,t,r){return t in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function s(e){return(s="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function c(t){if("object"!==s(t)||!t.RTCPeerConnection||"ontrack"in t.RTCPeerConnection.prototype)e.wrapPeerConnectionEvent(t,"track",function(e){return e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e});else{Object.defineProperty(t.RTCPeerConnection.prototype,"ontrack",{get:function(){return this._ontrack},set:function(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});var r=t.RTCPeerConnection.prototype.setRemoteDescription;t.RTCPeerConnection.prototype.setRemoteDescription=function(){var e=this;return this._ontrackpoly||(this._ontrackpoly=function(r){r.stream.addEventListener("addtrack",function(n){var i;i=t.RTCPeerConnection.prototype.getReceivers?e.getReceivers().find(function(e){return e.track&&e.track.id===n.track.id}):{track:n.track};var o=new Event("track");o.track=n.track,o.receiver=i,o.transceiver={receiver:i},o.streams=[r.stream],e.dispatchEvent(o)}),r.stream.getTracks().forEach(function(n){var i;i=t.RTCPeerConnection.prototype.getReceivers?e.getReceivers().find(function(e){return e.track&&e.track.id===n.id}):{track:n};var o=new Event("track");o.track=n,o.receiver=i,o.transceiver={receiver:i},o.streams=[r.stream],e.dispatchEvent(o)})},this.addEventListener("addstream",this._ontrackpoly)),r.apply(this,arguments)}}}function p(e){if("object"===s(e)&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){var t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};var r=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){var i=r.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};var n=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){n.apply(this,arguments);var t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}var i=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){var r=this;this._senders=this._senders||[],i.apply(this,[e]),e.getTracks().forEach(function(e){r._senders.push(t(r,e))})};var o=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;this._senders=this._senders||[],o.apply(this,[e]),e.getTracks().forEach(function(e){var r=t._senders.find(function(t){return t.track===e});r&&t._senders.splice(t._senders.indexOf(r),1)})}}else if("object"===s(e)&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){var a=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){var e=this,t=a.apply(this,[]);return t.forEach(function(t){return t._pc=e}),t},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function d(e){if(e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){var e=this,[r,n,i]=arguments;if(arguments.length>0&&"function"==typeof r)return t.apply(this,arguments);if(0===t.length&&(0===arguments.length||"function"!=typeof r))return t.apply(this,[]);var o=function(e){var t={};return e.result().forEach(function(e){var r={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach(function(t){r[t]=e.stat(t)}),t[r.id]=r}),t},s=function(e){return new Map(Object.keys(e).map(function(t){return[t,e[t]]}))};if(arguments.length>=2){return t.apply(this,[function(e){n(s(o(e)))},r])}return new Promise(function(r,n){t.apply(e,[function(e){r(s(o(e)))},n])}).then(n,i)}}}function h(t){if("object"===s(t)&&t.RTCPeerConnection&&t.RTCRtpSender&&t.RTCRtpReceiver){if(!("getStats"in t.RTCRtpSender.prototype)){var r=t.RTCPeerConnection.prototype.getSenders;r&&(t.RTCPeerConnection.prototype.getSenders=function(){var e=this,t=r.apply(this,[]);return t.forEach(function(t){return t._pc=e}),t});var n=t.RTCPeerConnection.prototype.addTrack;n&&(t.RTCPeerConnection.prototype.addTrack=function(){var e=n.apply(this,arguments);return e._pc=this,e}),t.RTCRtpSender.prototype.getStats=function(){var t=this;return this._pc.getStats().then(function(r){return e.filterStats(r,t.track,!0)})}}if(!("getStats"in t.RTCRtpReceiver.prototype)){var i=t.RTCPeerConnection.prototype.getReceivers;i&&(t.RTCPeerConnection.prototype.getReceivers=function(){var e=this,t=i.apply(this,[]);return t.forEach(function(t){return t._pc=e}),t}),e.wrapPeerConnectionEvent(t,"track",function(e){return e.receiver._pc=e.srcElement,e}),t.RTCRtpReceiver.prototype.getStats=function(){var t=this;return this._pc.getStats().then(function(r){return e.filterStats(r,t.track,!1)})}}if("getStats"in t.RTCRtpSender.prototype&&"getStats"in t.RTCRtpReceiver.prototype){var o=t.RTCPeerConnection.prototype.getStats;t.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof t.MediaStreamTrack){var e,r,n,i=arguments[0];return this.getSenders().forEach(function(t){t.track===i&&(e?n=!0:e=t)}),this.getReceivers().forEach(function(e){return e.track===i&&(r?n=!0:r=e),e.track===i}),n||e&&r?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):e?e.getStats():r?r.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return o.apply(this,arguments)}}}}function f(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){var e=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(function(t){return e._shimmedLocalStreams[t][0]})};var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){if(!r)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};var n=t.apply(this,arguments);return this._shimmedLocalStreams[r.id]?-1===this._shimmedLocalStreams[r.id].indexOf(n)&&this._shimmedLocalStreams[r.id].push(n):this._shimmedLocalStreams[r.id]=[r,n],n};var r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){var t=this;this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach(function(e){if(t.getSenders().find(function(t){return t.track===e}))throw new DOMException("Track already exists.","InvalidAccessError")});var n=this.getSenders();r.apply(this,arguments);var i=this.getSenders().filter(function(e){return-1===n.indexOf(e)});this._shimmedLocalStreams[e.id]=[e].concat(i)};var n=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],n.apply(this,arguments)};var i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){var t=this;return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach(function(r){var n=t._shimmedLocalStreams[r].indexOf(e);-1!==n&&t._shimmedLocalStreams[r].splice(n,1),1===t._shimmedLocalStreams[r].length&&delete t._shimmedLocalStreams[r]}),i.apply(this,arguments)}}function m(e,t){if(e.RTCPeerConnection){if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return f(e);var r=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){var e=this,t=r.apply(this);return this._reverseStreams=this._reverseStreams||{},t.map(function(t){return e._reverseStreams[t.id]})};var n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){var r=this;if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach(function(e){if(r.getSenders().find(function(t){return t.track===e}))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[t.id]){var i=new e.MediaStream(t.getTracks());this._streams[t.id]=i,this._reverseStreams[i.id]=t,t=i}n.apply(this,[t])};var i=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,r){var n=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");var i=[].slice.call(arguments,1);if(1!==i.length||!i[0].getTracks().find(function(e){return e===t}))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(function(e){return e.track===t}))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};var o=this._streams[r.id];if(o)o.addTrack(t),Promise.resolve().then(function(){n.dispatchEvent(new Event("negotiationneeded"))});else{var s=new e.MediaStream([t]);this._streams[r.id]=s,this._reverseStreams[s.id]=r,this.addStream(s)}return this.getSenders().find(function(e){return e.track===t})},["createOffer","createAnswer"].forEach(function(t){var r=e.RTCPeerConnection.prototype[t],n=o({},t,function(){var e=this,t=arguments;return arguments.length&&"function"==typeof arguments[0]?r.apply(this,[function(r){var n=c(e,r);t[0].apply(null,[n])},function(e){t[1]&&t[1].apply(null,e)},arguments[2]]):r.apply(this,arguments).then(function(t){return c(e,t)})});e.RTCPeerConnection.prototype[t]=n[t]});var s=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=(e=this,t=arguments[0],r=t.sdp,Object.keys(e._reverseStreams||[]).forEach(function(t){var n=e._reverseStreams[t],i=e._streams[n.id];r=r.replace(new RegExp(n.id,"g"),i.id)}),new RTCSessionDescription({type:t.type,sdp:r})),s.apply(this,arguments)):s.apply(this,arguments);var e,t,r};var a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get:function(){var e=a.get.apply(this);return""===e.type?e:c(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){var t,r=this;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(!(e._pc===this))throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{},Object.keys(this._streams).forEach(function(n){r._streams[n].getTracks().find(function(t){return e.track===t})&&(t=r._streams[n])}),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function c(e,t){var r=t.sdp;return Object.keys(e._reverseStreams||[]).forEach(function(t){var n=e._reverseStreams[t],i=e._streams[n.id];r=r.replace(new RegExp(i.id,"g"),n.id)}),new RTCSessionDescription({type:t.type,sdp:r})}}function u(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){var r=e.RTCPeerConnection.prototype[t],n=o({},t,function(){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),r.apply(this,arguments)});e.RTCPeerConnection.prototype[t]=n[t]})}function l(t,r){e.wrapPeerConnectionEvent(t,"negotiationneeded",function(e){var t=e.target;if(!(r.version<72||t.getConfiguration&&"plan-b"===t.getConfiguration().sdpSemantics)||"stable"===t.signalingState)return e})}
|
||
-},{"../utils.js":"iSxC","./getusermedia":"s6SN","./getdisplaymedia":"VHa8"}],"NZ1C":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.filterIceServers=n;var r=t(require("../utils"));function e(){if("function"!=typeof WeakMap)return null;var r=new WeakMap;return e=function(){return r},r}function t(r){if(r&&r.__esModule)return r;if(null===r||"object"!=typeof r&&"function"!=typeof r)return{default:r};var t=e();if(t&&t.has(r))return t.get(r);var n={},u=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in r)if(Object.prototype.hasOwnProperty.call(r,i)){var f=u?Object.getOwnPropertyDescriptor(r,i):null;f&&(f.get||f.set)?Object.defineProperty(n,i,f):n[i]=r[i]}return n.default=r,t&&t.set(r,n),n}function n(e,t){var n=!1;return(e=JSON.parse(JSON.stringify(e))).filter(function(e){if(e&&(e.urls||e.url)){var t=e.urls||e.url;e.url&&!e.urls&&r.deprecated("RTCIceServer.url","RTCIceServer.urls");var u="string"==typeof t;return u&&(t=[t]),t=t.filter(function(r){if(0===r.indexOf("stun:"))return!1;var e=r.startsWith("turn")&&!r.startsWith("turn:[")&&r.includes("transport=udp");return e&&!n?(n=!0,!0):e&&!n}),delete e.url,e.urls=u?t[0]:t,!!t.length}})}
|
||
-},{"../utils":"iSxC"}],"YHvh":[function(require,module,exports) {
|
||
-"use strict";var r={generateIdentifier:function(){return Math.random().toString(36).substr(2,10)}};r.localCName=r.generateIdentifier(),r.splitLines=function(r){return r.trim().split("\n").map(function(r){return r.trim()})},r.splitSections=function(r){return r.split("\nm=").map(function(r,e){return(e>0?"m="+r:r).trim()+"\r\n"})},r.getDescription=function(e){var t=r.splitSections(e);return t&&t[0]},r.getMediaSections=function(e){var t=r.splitSections(e);return t.shift(),t},r.matchPrefix=function(e,t){return r.splitLines(e).filter(function(r){return 0===r.indexOf(t)})},r.parseCandidate=function(r){for(var e,t={foundation:(e=0===r.indexOf("a=candidate:")?r.substring(12).split(" "):r.substring(10).split(" "))[0],component:parseInt(e[1],10),protocol:e[2].toLowerCase(),priority:parseInt(e[3],10),ip:e[4],address:e[4],port:parseInt(e[5],10),type:e[7]},a=8;a<e.length;a+=2)switch(e[a]){case"raddr":t.relatedAddress=e[a+1];break;case"rport":t.relatedPort=parseInt(e[a+1],10);break;case"tcptype":t.tcpType=e[a+1];break;case"ufrag":t.ufrag=e[a+1],t.usernameFragment=e[a+1];break;default:t[e[a]]=e[a+1]}return t},r.writeCandidate=function(r){var e=[];e.push(r.foundation),e.push(r.component),e.push(r.protocol.toUpperCase()),e.push(r.priority),e.push(r.address||r.ip),e.push(r.port);var t=r.type;return e.push("typ"),e.push(t),"host"!==t&&r.relatedAddress&&r.relatedPort&&(e.push("raddr"),e.push(r.relatedAddress),e.push("rport"),e.push(r.relatedPort)),r.tcpType&&"tcp"===r.protocol.toLowerCase()&&(e.push("tcptype"),e.push(r.tcpType)),(r.usernameFragment||r.ufrag)&&(e.push("ufrag"),e.push(r.usernameFragment||r.ufrag)),"candidate:"+e.join(" ")},r.parseIceOptions=function(r){return r.substr(14).split(" ")},r.parseRtpMap=function(r){var e=r.substr(9).split(" "),t={payloadType:parseInt(e.shift(),10)};return e=e[0].split("/"),t.name=e[0],t.clockRate=parseInt(e[1],10),t.channels=3===e.length?parseInt(e[2],10):1,t.numChannels=t.channels,t},r.writeRtpMap=function(r){var e=r.payloadType;void 0!==r.preferredPayloadType&&(e=r.preferredPayloadType);var t=r.channels||r.numChannels||1;return"a=rtpmap:"+e+" "+r.name+"/"+r.clockRate+(1!==t?"/"+t:"")+"\r\n"},r.parseExtmap=function(r){var e=r.substr(9).split(" ");return{id:parseInt(e[0],10),direction:e[0].indexOf("/")>0?e[0].split("/")[1]:"sendrecv",uri:e[1]}},r.writeExtmap=function(r){return"a=extmap:"+(r.id||r.preferredId)+(r.direction&&"sendrecv"!==r.direction?"/"+r.direction:"")+" "+r.uri+"\r\n"},r.parseFmtp=function(r){for(var e,t={},a=r.substr(r.indexOf(" ")+1).split(";"),n=0;n<a.length;n++)t[(e=a[n].trim().split("="))[0].trim()]=e[1];return t},r.writeFmtp=function(r){var e="",t=r.payloadType;if(void 0!==r.preferredPayloadType&&(t=r.preferredPayloadType),r.parameters&&Object.keys(r.parameters).length){var a=[];Object.keys(r.parameters).forEach(function(e){r.parameters[e]?a.push(e+"="+r.parameters[e]):a.push(e)}),e+="a=fmtp:"+t+" "+a.join(";")+"\r\n"}return e},r.parseRtcpFb=function(r){var e=r.substr(r.indexOf(" ")+1).split(" ");return{type:e.shift(),parameter:e.join(" ")}},r.writeRtcpFb=function(r){var e="",t=r.payloadType;return void 0!==r.preferredPayloadType&&(t=r.preferredPayloadType),r.rtcpFeedback&&r.rtcpFeedback.length&&r.rtcpFeedback.forEach(function(r){e+="a=rtcp-fb:"+t+" "+r.type+(r.parameter&&r.parameter.length?" "+r.parameter:"")+"\r\n"}),e},r.parseSsrcMedia=function(r){var e=r.indexOf(" "),t={ssrc:parseInt(r.substr(7,e-7),10)},a=r.indexOf(":",e);return a>-1?(t.attribute=r.substr(e+1,a-e-1),t.value=r.substr(a+1)):t.attribute=r.substr(e+1),t},r.parseSsrcGroup=function(r){var e=r.substr(13).split(" ");return{semantics:e.shift(),ssrcs:e.map(function(r){return parseInt(r,10)})}},r.getMid=function(e){var t=r.matchPrefix(e,"a=mid:")[0];if(t)return t.substr(6)},r.parseFingerprint=function(r){var e=r.substr(14).split(" ");return{algorithm:e[0].toLowerCase(),value:e[1]}},r.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:r.matchPrefix(e+t,"a=fingerprint:").map(r.parseFingerprint)}},r.writeDtlsParameters=function(r,e){var t="a=setup:"+e+"\r\n";return r.fingerprints.forEach(function(r){t+="a=fingerprint:"+r.algorithm+" "+r.value+"\r\n"}),t},r.parseCryptoLine=function(r){var e=r.substr(9).split(" ");return{tag:parseInt(e[0],10),cryptoSuite:e[1],keyParams:e[2],sessionParams:e.slice(3)}},r.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?r.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},r.parseCryptoKeyParams=function(r){if(0!==r.indexOf("inline:"))return null;var e=r.substr(7).split("|");return{keyMethod:"inline",keySalt:e[0],lifeTime:e[1],mkiValue:e[2]?e[2].split(":")[0]:void 0,mkiLength:e[2]?e[2].split(":")[1]:void 0}},r.writeCryptoKeyParams=function(r){return r.keyMethod+":"+r.keySalt+(r.lifeTime?"|"+r.lifeTime:"")+(r.mkiValue&&r.mkiLength?"|"+r.mkiValue+":"+r.mkiLength:"")},r.getCryptoParameters=function(e,t){return r.matchPrefix(e+t,"a=crypto:").map(r.parseCryptoLine)},r.getIceParameters=function(e,t){var a=r.matchPrefix(e+t,"a=ice-ufrag:")[0],n=r.matchPrefix(e+t,"a=ice-pwd:")[0];return a&&n?{usernameFragment:a.substr(12),password:n.substr(10)}:null},r.writeIceParameters=function(r){return"a=ice-ufrag:"+r.usernameFragment+"\r\na=ice-pwd:"+r.password+"\r\n"},r.parseRtpParameters=function(e){for(var t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},a=r.splitLines(e)[0].split(" "),n=3;n<a.length;n++){var s=a[n],i=r.matchPrefix(e,"a=rtpmap:"+s+" ")[0];if(i){var p=r.parseRtpMap(i),c=r.matchPrefix(e,"a=fmtp:"+s+" ");switch(p.parameters=c.length?r.parseFmtp(c[0]):{},p.rtcpFeedback=r.matchPrefix(e,"a=rtcp-fb:"+s+" ").map(r.parseRtcpFb),t.codecs.push(p),p.name.toUpperCase()){case"RED":case"ULPFEC":t.fecMechanisms.push(p.name.toUpperCase())}}}return r.matchPrefix(e,"a=extmap:").forEach(function(e){t.headerExtensions.push(r.parseExtmap(e))}),t},r.writeRtpDescription=function(e,t){var a="";a+="m="+e+" ",a+=t.codecs.length>0?"9":"0",a+=" UDP/TLS/RTP/SAVPF ",a+=t.codecs.map(function(r){return void 0!==r.preferredPayloadType?r.preferredPayloadType:r.payloadType}).join(" ")+"\r\n",a+="c=IN IP4 0.0.0.0\r\n",a+="a=rtcp:9 IN IP4 0.0.0.0\r\n",t.codecs.forEach(function(e){a+=r.writeRtpMap(e),a+=r.writeFmtp(e),a+=r.writeRtcpFb(e)});var n=0;return t.codecs.forEach(function(r){r.maxptime>n&&(n=r.maxptime)}),n>0&&(a+="a=maxptime:"+n+"\r\n"),a+="a=rtcp-mux\r\n",t.headerExtensions&&t.headerExtensions.forEach(function(e){a+=r.writeExtmap(e)}),a},r.parseRtpEncodingParameters=function(e){var t,a=[],n=r.parseRtpParameters(e),s=-1!==n.fecMechanisms.indexOf("RED"),i=-1!==n.fecMechanisms.indexOf("ULPFEC"),p=r.matchPrefix(e,"a=ssrc:").map(function(e){return r.parseSsrcMedia(e)}).filter(function(r){return"cname"===r.attribute}),c=p.length>0&&p[0].ssrc,o=r.matchPrefix(e,"a=ssrc-group:FID").map(function(r){return r.substr(17).split(" ").map(function(r){return parseInt(r,10)})});o.length>0&&o[0].length>1&&o[0][0]===c&&(t=o[0][1]),n.codecs.forEach(function(r){if("RTX"===r.name.toUpperCase()&&r.parameters.apt){var e={ssrc:c,codecPayloadType:parseInt(r.parameters.apt,10)};c&&t&&(e.rtx={ssrc:t}),a.push(e),s&&((e=JSON.parse(JSON.stringify(e))).fec={ssrc:c,mechanism:i?"red+ulpfec":"red"},a.push(e))}}),0===a.length&&c&&a.push({ssrc:c});var u=r.matchPrefix(e,"b=");return u.length&&(u=0===u[0].indexOf("b=TIAS:")?parseInt(u[0].substr(7),10):0===u[0].indexOf("b=AS:")?1e3*parseInt(u[0].substr(5),10)*.95-16e3:void 0,a.forEach(function(r){r.maxBitrate=u})),a},r.parseRtcpParameters=function(e){var t={},a=r.matchPrefix(e,"a=ssrc:").map(function(e){return r.parseSsrcMedia(e)}).filter(function(r){return"cname"===r.attribute})[0];a&&(t.cname=a.value,t.ssrc=a.ssrc);var n=r.matchPrefix(e,"a=rtcp-rsize");t.reducedSize=n.length>0,t.compound=0===n.length;var s=r.matchPrefix(e,"a=rtcp-mux");return t.mux=s.length>0,t},r.parseMsid=function(e){var t,a=r.matchPrefix(e,"a=msid:");if(1===a.length)return{stream:(t=a[0].substr(7).split(" "))[0],track:t[1]};var n=r.matchPrefix(e,"a=ssrc:").map(function(e){return r.parseSsrcMedia(e)}).filter(function(r){return"msid"===r.attribute});return n.length>0?{stream:(t=n[0].value.split(" "))[0],track:t[1]}:void 0},r.parseSctpDescription=function(e){var t,a=r.parseMLine(e),n=r.matchPrefix(e,"a=max-message-size:");n.length>0&&(t=parseInt(n[0].substr(19),10)),isNaN(t)&&(t=65536);var s=r.matchPrefix(e,"a=sctp-port:");if(s.length>0)return{port:parseInt(s[0].substr(12),10),protocol:a.fmt,maxMessageSize:t};if(r.matchPrefix(e,"a=sctpmap:").length>0){var i=r.matchPrefix(e,"a=sctpmap:")[0].substr(10).split(" ");return{port:parseInt(i[0],10),protocol:i[1],maxMessageSize:t}}},r.writeSctpDescription=function(r,e){var t=[];return t="DTLS/SCTP"!==r.protocol?["m="+r.kind+" 9 "+r.protocol+" "+e.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+e.port+"\r\n"]:["m="+r.kind+" 9 "+r.protocol+" "+e.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+e.port+" "+e.protocol+" 65535\r\n"],void 0!==e.maxMessageSize&&t.push("a=max-message-size:"+e.maxMessageSize+"\r\n"),t.join("")},r.generateSessionId=function(){return Math.random().toString().substr(2,21)},r.writeSessionBoilerplate=function(e,t,a){var n=void 0!==t?t:2;return"v=0\r\no="+(a||"thisisadapterortc")+" "+(e||r.generateSessionId())+" "+n+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},r.writeMediaSection=function(e,t,a,n){var s=r.writeRtpDescription(e.kind,t);if(s+=r.writeIceParameters(e.iceGatherer.getLocalParameters()),s+=r.writeDtlsParameters(e.dtlsTransport.getLocalParameters(),"offer"===a?"actpass":"active"),s+="a=mid:"+e.mid+"\r\n",e.direction?s+="a="+e.direction+"\r\n":e.rtpSender&&e.rtpReceiver?s+="a=sendrecv\r\n":e.rtpSender?s+="a=sendonly\r\n":e.rtpReceiver?s+="a=recvonly\r\n":s+="a=inactive\r\n",e.rtpSender){var i="msid:"+n.id+" "+e.rtpSender.track.id+"\r\n";s+="a="+i,s+="a=ssrc:"+e.sendEncodingParameters[0].ssrc+" "+i,e.sendEncodingParameters[0].rtx&&(s+="a=ssrc:"+e.sendEncodingParameters[0].rtx.ssrc+" "+i,s+="a=ssrc-group:FID "+e.sendEncodingParameters[0].ssrc+" "+e.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return s+="a=ssrc:"+e.sendEncodingParameters[0].ssrc+" cname:"+r.localCName+"\r\n",e.rtpSender&&e.sendEncodingParameters[0].rtx&&(s+="a=ssrc:"+e.sendEncodingParameters[0].rtx.ssrc+" cname:"+r.localCName+"\r\n"),s},r.getDirection=function(e,t){for(var a=r.splitLines(e),n=0;n<a.length;n++)switch(a[n]){case"a=sendrecv":case"a=sendonly":case"a=recvonly":case"a=inactive":return a[n].substr(2)}return t?r.getDirection(t):"sendrecv"},r.getKind=function(e){return r.splitLines(e)[0].split(" ")[0].substr(2)},r.isRejected=function(r){return"0"===r.split(" ",2)[1]},r.parseMLine=function(e){var t=r.splitLines(e)[0].substr(2).split(" ");return{kind:t[0],port:parseInt(t[1],10),protocol:t[2],fmt:t.slice(3).join(" ")}},r.parseOLine=function(e){var t=r.matchPrefix(e,"o=")[0].substr(2).split(" ");return{username:t[0],sessionId:t[1],sessionVersion:parseInt(t[2],10),netType:t[3],addressType:t[4],address:t[5]}},r.isValidSDP=function(e){if("string"!=typeof e||0===e.length)return!1;for(var t=r.splitLines(e),a=0;a<t.length;a++)if(t[a].length<2||"="!==t[a].charAt(1))return!1;return!0},"object"==typeof module&&(module.exports=r);
|
||
-},{}],"NJ2u":[function(require,module,exports) {
|
||
-"use strict";var e=require("sdp");function t(e){return{inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type}function r(t,r,n,a,i){var s=e.writeRtpDescription(t.kind,r);if(s+=e.writeIceParameters(t.iceGatherer.getLocalParameters()),s+=e.writeDtlsParameters(t.dtlsTransport.getLocalParameters(),"offer"===n?"actpass":i||"active"),s+="a=mid:"+t.mid+"\r\n",t.rtpSender&&t.rtpReceiver?s+="a=sendrecv\r\n":t.rtpSender?s+="a=sendonly\r\n":t.rtpReceiver?s+="a=recvonly\r\n":s+="a=inactive\r\n",t.rtpSender){var o=t.rtpSender._initialTrackId||t.rtpSender.track.id;t.rtpSender._initialTrackId=o;var c="msid:"+(a?a.id:"-")+" "+o+"\r\n";s+="a="+c,s+="a=ssrc:"+t.sendEncodingParameters[0].ssrc+" "+c,t.sendEncodingParameters[0].rtx&&(s+="a=ssrc:"+t.sendEncodingParameters[0].rtx.ssrc+" "+c,s+="a=ssrc-group:FID "+t.sendEncodingParameters[0].ssrc+" "+t.sendEncodingParameters[0].rtx.ssrc+"\r\n")}return s+="a=ssrc:"+t.sendEncodingParameters[0].ssrc+" cname:"+e.localCName+"\r\n",t.rtpSender&&t.sendEncodingParameters[0].rtx&&(s+="a=ssrc:"+t.sendEncodingParameters[0].rtx.ssrc+" cname:"+e.localCName+"\r\n"),s}function n(e,t){var r=!1;return(e=JSON.parse(JSON.stringify(e))).filter(function(e){if(e&&(e.urls||e.url)){var n=e.urls||e.url;e.url&&!e.urls&&console.warn("RTCIceServer.url is deprecated! Use urls instead.");var a="string"==typeof n;return a&&(n=[n]),n=n.filter(function(e){return 0===e.indexOf("turn:")&&-1!==e.indexOf("transport=udp")&&-1===e.indexOf("turn:[")&&!r?(r=!0,!0):0===e.indexOf("stun:")&&t>=14393&&-1===e.indexOf("?transport=udp")}),delete e.url,e.urls=a?n[0]:n,!!n.length}})}function a(e,t){var r={codecs:[],headerExtensions:[],fecMechanisms:[]},n=function(e,t){e=parseInt(e,10);for(var r=0;r<t.length;r++)if(t[r].payloadType===e||t[r].preferredPayloadType===e)return t[r]},a=function(e,t,r,a){var i=n(e.parameters.apt,r),s=n(t.parameters.apt,a);return i&&s&&i.name.toLowerCase()===s.name.toLowerCase()};return e.codecs.forEach(function(n){for(var i=0;i<t.codecs.length;i++){var s=t.codecs[i];if(n.name.toLowerCase()===s.name.toLowerCase()&&n.clockRate===s.clockRate){if("rtx"===n.name.toLowerCase()&&n.parameters&&s.parameters.apt&&!a(n,s,e.codecs,t.codecs))continue;(s=JSON.parse(JSON.stringify(s))).numChannels=Math.min(n.numChannels,s.numChannels),r.codecs.push(s),s.rtcpFeedback=s.rtcpFeedback.filter(function(e){for(var t=0;t<n.rtcpFeedback.length;t++)if(n.rtcpFeedback[t].type===e.type&&n.rtcpFeedback[t].parameter===e.parameter)return!0;return!1});break}}}),e.headerExtensions.forEach(function(e){for(var n=0;n<t.headerExtensions.length;n++){var a=t.headerExtensions[n];if(e.uri===a.uri){r.headerExtensions.push(a);break}}}),r}function i(e,t,r){return-1!=={offer:{setLocalDescription:["stable","have-local-offer"],setRemoteDescription:["stable","have-remote-offer"]},answer:{setLocalDescription:["have-remote-offer","have-local-pranswer"],setRemoteDescription:["have-local-offer","have-remote-pranswer"]}}[t][e].indexOf(r)}function s(e,t){var r=e.getRemoteCandidates().find(function(e){return t.foundation===e.foundation&&t.ip===e.ip&&t.port===e.port&&t.priority===e.priority&&t.protocol===e.protocol&&t.type===e.type});return r||e.addRemoteCandidate(t),!r}function o(e,t){var r=new Error(t);return r.name=e,r.code={NotSupportedError:9,InvalidStateError:11,InvalidAccessError:15,TypeError:void 0,OperationError:void 0}[e],r}module.exports=function(c,d){function p(e,t){t.addTrack(e),t.dispatchEvent(new c.MediaStreamTrackEvent("addtrack",{track:e}))}function l(e,t,r,n){var a=new Event("track");a.track=t,a.receiver=r,a.transceiver={receiver:r},a.streams=n,c.setTimeout(function(){e._dispatchEvent("track",a)})}var f=function(t){var r=this,a=document.createDocumentFragment();if(["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){r[e]=a[e].bind(a)}),this.canTrickleIceCandidates=null,this.needNegotiation=!1,this.localStreams=[],this.remoteStreams=[],this._localDescription=null,this._remoteDescription=null,this.signalingState="stable",this.iceConnectionState="new",this.connectionState="new",this.iceGatheringState="new",t=JSON.parse(JSON.stringify(t||{})),this.usingBundle="max-bundle"===t.bundlePolicy,"negotiate"===t.rtcpMuxPolicy)throw o("NotSupportedError","rtcpMuxPolicy 'negotiate' is not supported");switch(t.rtcpMuxPolicy||(t.rtcpMuxPolicy="require"),t.iceTransportPolicy){case"all":case"relay":break;default:t.iceTransportPolicy="all"}switch(t.bundlePolicy){case"balanced":case"max-compat":case"max-bundle":break;default:t.bundlePolicy="balanced"}if(t.iceServers=n(t.iceServers||[],d),this._iceGatherers=[],t.iceCandidatePoolSize)for(var i=t.iceCandidatePoolSize;i>0;i--)this._iceGatherers.push(new c.RTCIceGatherer({iceServers:t.iceServers,gatherPolicy:t.iceTransportPolicy}));else t.iceCandidatePoolSize=0;this._config=t,this.transceivers=[],this._sdpSessionId=e.generateSessionId(),this._sdpSessionVersion=0,this._dtlsRole=void 0,this._isClosed=!1};Object.defineProperty(f.prototype,"localDescription",{configurable:!0,get:function(){return this._localDescription}}),Object.defineProperty(f.prototype,"remoteDescription",{configurable:!0,get:function(){return this._remoteDescription}}),f.prototype.onicecandidate=null,f.prototype.onaddstream=null,f.prototype.ontrack=null,f.prototype.onremovestream=null,f.prototype.onsignalingstatechange=null,f.prototype.oniceconnectionstatechange=null,f.prototype.onconnectionstatechange=null,f.prototype.onicegatheringstatechange=null,f.prototype.onnegotiationneeded=null,f.prototype.ondatachannel=null,f.prototype._dispatchEvent=function(e,t){this._isClosed||(this.dispatchEvent(t),"function"==typeof this["on"+e]&&this["on"+e](t))},f.prototype._emitGatheringStateChange=function(){var e=new Event("icegatheringstatechange");this._dispatchEvent("icegatheringstatechange",e)},f.prototype.getConfiguration=function(){return this._config},f.prototype.getLocalStreams=function(){return this.localStreams},f.prototype.getRemoteStreams=function(){return this.remoteStreams},f.prototype._createTransceiver=function(e,t){var r=this.transceivers.length>0,n={track:null,iceGatherer:null,iceTransport:null,dtlsTransport:null,localCapabilities:null,remoteCapabilities:null,rtpSender:null,rtpReceiver:null,kind:e,mid:null,sendEncodingParameters:null,recvEncodingParameters:null,stream:null,associatedRemoteMediaStreams:[],wantReceive:!0};if(this.usingBundle&&r)n.iceTransport=this.transceivers[0].iceTransport,n.dtlsTransport=this.transceivers[0].dtlsTransport;else{var a=this._createIceAndDtlsTransports();n.iceTransport=a.iceTransport,n.dtlsTransport=a.dtlsTransport}return t||this.transceivers.push(n),n},f.prototype.addTrack=function(e,t){if(this._isClosed)throw o("InvalidStateError","Attempted to call addTrack on a closed peerconnection.");var r;if(this.transceivers.find(function(t){return t.track===e}))throw o("InvalidAccessError","Track already exists.");for(var n=0;n<this.transceivers.length;n++)this.transceivers[n].track||this.transceivers[n].kind!==e.kind||(r=this.transceivers[n]);return r||(r=this._createTransceiver(e.kind)),this._maybeFireNegotiationNeeded(),-1===this.localStreams.indexOf(t)&&this.localStreams.push(t),r.track=e,r.stream=t,r.rtpSender=new c.RTCRtpSender(e,r.dtlsTransport),r.rtpSender},f.prototype.addStream=function(e){var t=this;if(d>=15025)e.getTracks().forEach(function(r){t.addTrack(r,e)});else{var r=e.clone();e.getTracks().forEach(function(e,t){var n=r.getTracks()[t];e.addEventListener("enabled",function(e){n.enabled=e.enabled})}),r.getTracks().forEach(function(e){t.addTrack(e,r)})}},f.prototype.removeTrack=function(e){if(this._isClosed)throw o("InvalidStateError","Attempted to call removeTrack on a closed peerconnection.");if(!(e instanceof c.RTCRtpSender))throw new TypeError("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.");var t=this.transceivers.find(function(t){return t.rtpSender===e});if(!t)throw o("InvalidAccessError","Sender was not created by this connection.");var r=t.stream;t.rtpSender.stop(),t.rtpSender=null,t.track=null,t.stream=null,-1===this.transceivers.map(function(e){return e.stream}).indexOf(r)&&this.localStreams.indexOf(r)>-1&&this.localStreams.splice(this.localStreams.indexOf(r),1),this._maybeFireNegotiationNeeded()},f.prototype.removeStream=function(e){var t=this;e.getTracks().forEach(function(e){var r=t.getSenders().find(function(t){return t.track===e});r&&t.removeTrack(r)})},f.prototype.getSenders=function(){return this.transceivers.filter(function(e){return!!e.rtpSender}).map(function(e){return e.rtpSender})},f.prototype.getReceivers=function(){return this.transceivers.filter(function(e){return!!e.rtpReceiver}).map(function(e){return e.rtpReceiver})},f.prototype._createIceGatherer=function(e,t){var r=this;if(t&&e>0)return this.transceivers[0].iceGatherer;if(this._iceGatherers.length)return this._iceGatherers.shift();var n=new c.RTCIceGatherer({iceServers:this._config.iceServers,gatherPolicy:this._config.iceTransportPolicy});return Object.defineProperty(n,"state",{value:"new",writable:!0}),this.transceivers[e].bufferedCandidateEvents=[],this.transceivers[e].bufferCandidates=function(t){var a=!t.candidate||0===Object.keys(t.candidate).length;n.state=a?"completed":"gathering",null!==r.transceivers[e].bufferedCandidateEvents&&r.transceivers[e].bufferedCandidateEvents.push(t)},n.addEventListener("localcandidate",this.transceivers[e].bufferCandidates),n},f.prototype._gather=function(t,r){var n=this,a=this.transceivers[r].iceGatherer;if(!a.onlocalcandidate){var i=this.transceivers[r].bufferedCandidateEvents;this.transceivers[r].bufferedCandidateEvents=null,a.removeEventListener("localcandidate",this.transceivers[r].bufferCandidates),a.onlocalcandidate=function(i){if(!(n.usingBundle&&r>0)){var s=new Event("icecandidate");s.candidate={sdpMid:t,sdpMLineIndex:r};var o=i.candidate,c=!o||0===Object.keys(o).length;if(c)"new"!==a.state&&"gathering"!==a.state||(a.state="completed");else{"new"===a.state&&(a.state="gathering"),o.component=1,o.ufrag=a.getLocalParameters().usernameFragment;var d=e.writeCandidate(o);s.candidate=Object.assign(s.candidate,e.parseCandidate(d)),s.candidate.candidate=d,s.candidate.toJSON=function(){return{candidate:s.candidate.candidate,sdpMid:s.candidate.sdpMid,sdpMLineIndex:s.candidate.sdpMLineIndex,usernameFragment:s.candidate.usernameFragment}}}var p=e.getMediaSections(n._localDescription.sdp);p[s.candidate.sdpMLineIndex]+=c?"a=end-of-candidates\r\n":"a="+s.candidate.candidate+"\r\n",n._localDescription.sdp=e.getDescription(n._localDescription.sdp)+p.join("");var l=n.transceivers.every(function(e){return e.iceGatherer&&"completed"===e.iceGatherer.state});"gathering"!==n.iceGatheringState&&(n.iceGatheringState="gathering",n._emitGatheringStateChange()),c||n._dispatchEvent("icecandidate",s),l&&(n._dispatchEvent("icecandidate",new Event("icecandidate")),n.iceGatheringState="complete",n._emitGatheringStateChange())}},c.setTimeout(function(){i.forEach(function(e){a.onlocalcandidate(e)})},0)}},f.prototype._createIceAndDtlsTransports=function(){var e=this,t=new c.RTCIceTransport(null);t.onicestatechange=function(){e._updateIceConnectionState(),e._updateConnectionState()};var r=new c.RTCDtlsTransport(t);return r.ondtlsstatechange=function(){e._updateConnectionState()},r.onerror=function(){Object.defineProperty(r,"state",{value:"failed",writable:!0}),e._updateConnectionState()},{iceTransport:t,dtlsTransport:r}},f.prototype._disposeIceAndDtlsTransports=function(e){var t=this.transceivers[e].iceGatherer;t&&(delete t.onlocalcandidate,delete this.transceivers[e].iceGatherer);var r=this.transceivers[e].iceTransport;r&&(delete r.onicestatechange,delete this.transceivers[e].iceTransport);var n=this.transceivers[e].dtlsTransport;n&&(delete n.ondtlsstatechange,delete n.onerror,delete this.transceivers[e].dtlsTransport)},f.prototype._transceive=function(t,r,n){var i=a(t.localCapabilities,t.remoteCapabilities);r&&t.rtpSender&&(i.encodings=t.sendEncodingParameters,i.rtcp={cname:e.localCName,compound:t.rtcpParameters.compound},t.recvEncodingParameters.length&&(i.rtcp.ssrc=t.recvEncodingParameters[0].ssrc),t.rtpSender.send(i)),n&&t.rtpReceiver&&i.codecs.length>0&&("video"===t.kind&&t.recvEncodingParameters&&d<15019&&t.recvEncodingParameters.forEach(function(e){delete e.rtx}),t.recvEncodingParameters.length?i.encodings=t.recvEncodingParameters:i.encodings=[{}],i.rtcp={compound:t.rtcpParameters.compound},t.rtcpParameters.cname&&(i.rtcp.cname=t.rtcpParameters.cname),t.sendEncodingParameters.length&&(i.rtcp.ssrc=t.sendEncodingParameters[0].ssrc),t.rtpReceiver.receive(i))},f.prototype.setLocalDescription=function(t){var r,n,s=this;if(-1===["offer","answer"].indexOf(t.type))return Promise.reject(o("TypeError",'Unsupported type "'+t.type+'"'));if(!i("setLocalDescription",t.type,s.signalingState)||s._isClosed)return Promise.reject(o("InvalidStateError","Can not set local "+t.type+" in state "+s.signalingState));if("offer"===t.type)r=e.splitSections(t.sdp),n=r.shift(),r.forEach(function(t,r){var n=e.parseRtpParameters(t);s.transceivers[r].localCapabilities=n}),s.transceivers.forEach(function(e,t){s._gather(e.mid,t)});else if("answer"===t.type){r=e.splitSections(s._remoteDescription.sdp),n=r.shift();var c=e.matchPrefix(n,"a=ice-lite").length>0;r.forEach(function(t,r){var i=s.transceivers[r],o=i.iceGatherer,d=i.iceTransport,p=i.dtlsTransport,l=i.localCapabilities,f=i.remoteCapabilities;if(!(e.isRejected(t)&&0===e.matchPrefix(t,"a=bundle-only").length)&&!i.rejected){var u=e.getIceParameters(t,n),v=e.getDtlsParameters(t,n);c&&(v.role="server"),s.usingBundle&&0!==r||(s._gather(i.mid,r),"new"===d.state&&d.start(o,u,c?"controlling":"controlled"),"new"===p.state&&p.start(v));var h=a(l,f);s._transceive(i,h.codecs.length>0,!1)}})}return s._localDescription={type:t.type,sdp:t.sdp},"offer"===t.type?s._updateSignalingState("have-local-offer"):s._updateSignalingState("stable"),Promise.resolve()},f.prototype.setRemoteDescription=function(t){var r=this;if(-1===["offer","answer"].indexOf(t.type))return Promise.reject(o("TypeError",'Unsupported type "'+t.type+'"'));if(!i("setRemoteDescription",t.type,r.signalingState)||r._isClosed)return Promise.reject(o("InvalidStateError","Can not set remote "+t.type+" in state "+r.signalingState));var n={};r.remoteStreams.forEach(function(e){n[e.id]=e});var f=[],u=e.splitSections(t.sdp),v=u.shift(),h=e.matchPrefix(v,"a=ice-lite").length>0,m=e.matchPrefix(v,"a=group:BUNDLE ").length>0;r.usingBundle=m;var g=e.matchPrefix(v,"a=ice-options:")[0];return r.canTrickleIceCandidates=!!g&&g.substr(14).split(" ").indexOf("trickle")>=0,u.forEach(function(i,o){var l=e.splitLines(i),u=e.getKind(i),g=e.isRejected(i)&&0===e.matchPrefix(i,"a=bundle-only").length,y=l[0].substr(2).split(" ")[2],S=e.getDirection(i,v),T=e.parseMsid(i),E=e.getMid(i)||e.generateIdentifier();if(g||"application"===u&&("DTLS/SCTP"===y||"UDP/DTLS/SCTP"===y))r.transceivers[o]={mid:E,kind:u,protocol:y,rejected:!0};else{var C,P,w,R,_,k,b,x,D;!g&&r.transceivers[o]&&r.transceivers[o].rejected&&(r.transceivers[o]=r._createTransceiver(u,!0));var I,L,M=e.parseRtpParameters(i);g||(I=e.getIceParameters(i,v),(L=e.getDtlsParameters(i,v)).role="client"),b=e.parseRtpEncodingParameters(i);var O=e.parseRtcpParameters(i),G=e.matchPrefix(i,"a=end-of-candidates",v).length>0,j=e.matchPrefix(i,"a=candidate:").map(function(t){return e.parseCandidate(t)}).filter(function(e){return 1===e.component});if(("offer"===t.type||"answer"===t.type)&&!g&&m&&o>0&&r.transceivers[o]&&(r._disposeIceAndDtlsTransports(o),r.transceivers[o].iceGatherer=r.transceivers[0].iceGatherer,r.transceivers[o].iceTransport=r.transceivers[0].iceTransport,r.transceivers[o].dtlsTransport=r.transceivers[0].dtlsTransport,r.transceivers[o].rtpSender&&r.transceivers[o].rtpSender.setTransport(r.transceivers[0].dtlsTransport),r.transceivers[o].rtpReceiver&&r.transceivers[o].rtpReceiver.setTransport(r.transceivers[0].dtlsTransport)),"offer"!==t.type||g){if("answer"===t.type&&!g){P=(C=r.transceivers[o]).iceGatherer,w=C.iceTransport,R=C.dtlsTransport,_=C.rtpReceiver,k=C.sendEncodingParameters,x=C.localCapabilities,r.transceivers[o].recvEncodingParameters=b,r.transceivers[o].remoteCapabilities=M,r.transceivers[o].rtcpParameters=O,j.length&&"new"===w.state&&(!h&&!G||m&&0!==o?j.forEach(function(e){s(C.iceTransport,e)}):w.setRemoteCandidates(j)),m&&0!==o||("new"===w.state&&w.start(P,I,"controlling"),"new"===R.state&&R.start(L)),!a(C.localCapabilities,C.remoteCapabilities).codecs.filter(function(e){return"rtx"===e.name.toLowerCase()}).length&&C.sendEncodingParameters[0].rtx&&delete C.sendEncodingParameters[0].rtx,r._transceive(C,"sendrecv"===S||"recvonly"===S,"sendrecv"===S||"sendonly"===S),!_||"sendrecv"!==S&&"sendonly"!==S?delete C.rtpReceiver:(D=_.track,T?(n[T.stream]||(n[T.stream]=new c.MediaStream),p(D,n[T.stream]),f.push([D,_,n[T.stream]])):(n.default||(n.default=new c.MediaStream),p(D,n.default),f.push([D,_,n.default])))}}else{(C=r.transceivers[o]||r._createTransceiver(u)).mid=E,C.iceGatherer||(C.iceGatherer=r._createIceGatherer(o,m)),j.length&&"new"===C.iceTransport.state&&(!G||m&&0!==o?j.forEach(function(e){s(C.iceTransport,e)}):C.iceTransport.setRemoteCandidates(j)),x=c.RTCRtpReceiver.getCapabilities(u),d<15019&&(x.codecs=x.codecs.filter(function(e){return"rtx"!==e.name})),k=C.sendEncodingParameters||[{ssrc:1001*(2*o+2)}];var N,A=!1;if("sendrecv"===S||"sendonly"===S){if(A=!C.rtpReceiver,_=C.rtpReceiver||new c.RTCRtpReceiver(C.dtlsTransport,u),A)D=_.track,T&&"-"===T.stream||(T?(n[T.stream]||(n[T.stream]=new c.MediaStream,Object.defineProperty(n[T.stream],"id",{get:function(){return T.stream}})),Object.defineProperty(D,"id",{get:function(){return T.track}}),N=n[T.stream]):(n.default||(n.default=new c.MediaStream),N=n.default)),N&&(p(D,N),C.associatedRemoteMediaStreams.push(N)),f.push([D,_,N])}else C.rtpReceiver&&C.rtpReceiver.track&&(C.associatedRemoteMediaStreams.forEach(function(e){var t,r,n=e.getTracks().find(function(e){return e.id===C.rtpReceiver.track.id});n&&(t=n,(r=e).removeTrack(t),r.dispatchEvent(new c.MediaStreamTrackEvent("removetrack",{track:t})))}),C.associatedRemoteMediaStreams=[]);C.localCapabilities=x,C.remoteCapabilities=M,C.rtpReceiver=_,C.rtcpParameters=O,C.sendEncodingParameters=k,C.recvEncodingParameters=b,r._transceive(r.transceivers[o],!1,A)}}}),void 0===r._dtlsRole&&(r._dtlsRole="offer"===t.type?"active":"passive"),r._remoteDescription={type:t.type,sdp:t.sdp},"offer"===t.type?r._updateSignalingState("have-remote-offer"):r._updateSignalingState("stable"),Object.keys(n).forEach(function(e){var t=n[e];if(t.getTracks().length){if(-1===r.remoteStreams.indexOf(t)){r.remoteStreams.push(t);var a=new Event("addstream");a.stream=t,c.setTimeout(function(){r._dispatchEvent("addstream",a)})}f.forEach(function(e){var n=e[0],a=e[1];t.id===e[2].id&&l(r,n,a,[t])})}}),f.forEach(function(e){e[2]||l(r,e[0],e[1],[])}),c.setTimeout(function(){r&&r.transceivers&&r.transceivers.forEach(function(e){e.iceTransport&&"new"===e.iceTransport.state&&e.iceTransport.getRemoteCandidates().length>0&&(console.warn("Timeout for addRemoteCandidate. Consider sending an end-of-candidates notification"),e.iceTransport.addRemoteCandidate({}))})},4e3),Promise.resolve()},f.prototype.close=function(){this.transceivers.forEach(function(e){e.iceTransport&&e.iceTransport.stop(),e.dtlsTransport&&e.dtlsTransport.stop(),e.rtpSender&&e.rtpSender.stop(),e.rtpReceiver&&e.rtpReceiver.stop()}),this._isClosed=!0,this._updateSignalingState("closed")},f.prototype._updateSignalingState=function(e){this.signalingState=e;var t=new Event("signalingstatechange");this._dispatchEvent("signalingstatechange",t)},f.prototype._maybeFireNegotiationNeeded=function(){var e=this;"stable"===this.signalingState&&!0!==this.needNegotiation&&(this.needNegotiation=!0,c.setTimeout(function(){if(e.needNegotiation){e.needNegotiation=!1;var t=new Event("negotiationneeded");e._dispatchEvent("negotiationneeded",t)}},0))},f.prototype._updateIceConnectionState=function(){var e,t={new:0,closed:0,checking:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(e){e.iceTransport&&!e.rejected&&t[e.iceTransport.state]++}),e="new",t.failed>0?e="failed":t.checking>0?e="checking":t.disconnected>0?e="disconnected":t.new>0?e="new":t.connected>0?e="connected":t.completed>0&&(e="completed"),e!==this.iceConnectionState){this.iceConnectionState=e;var r=new Event("iceconnectionstatechange");this._dispatchEvent("iceconnectionstatechange",r)}},f.prototype._updateConnectionState=function(){var e,t={new:0,closed:0,connecting:0,connected:0,completed:0,disconnected:0,failed:0};if(this.transceivers.forEach(function(e){e.iceTransport&&e.dtlsTransport&&!e.rejected&&(t[e.iceTransport.state]++,t[e.dtlsTransport.state]++)}),t.connected+=t.completed,e="new",t.failed>0?e="failed":t.connecting>0?e="connecting":t.disconnected>0?e="disconnected":t.new>0?e="new":t.connected>0&&(e="connected"),e!==this.connectionState){this.connectionState=e;var r=new Event("connectionstatechange");this._dispatchEvent("connectionstatechange",r)}},f.prototype.createOffer=function(){var t=this;if(t._isClosed)return Promise.reject(o("InvalidStateError","Can not call createOffer after close"));var n=t.transceivers.filter(function(e){return"audio"===e.kind}).length,a=t.transceivers.filter(function(e){return"video"===e.kind}).length,i=arguments[0];if(i){if(i.mandatory||i.optional)throw new TypeError("Legacy mandatory/optional constraints not supported.");void 0!==i.offerToReceiveAudio&&(n=!0===i.offerToReceiveAudio?1:!1===i.offerToReceiveAudio?0:i.offerToReceiveAudio),void 0!==i.offerToReceiveVideo&&(a=!0===i.offerToReceiveVideo?1:!1===i.offerToReceiveVideo?0:i.offerToReceiveVideo)}for(t.transceivers.forEach(function(e){"audio"===e.kind?--n<0&&(e.wantReceive=!1):"video"===e.kind&&--a<0&&(e.wantReceive=!1)});n>0||a>0;)n>0&&(t._createTransceiver("audio"),n--),a>0&&(t._createTransceiver("video"),a--);var s=e.writeSessionBoilerplate(t._sdpSessionId,t._sdpSessionVersion++);t.transceivers.forEach(function(r,n){var a=r.track,i=r.kind,s=r.mid||e.generateIdentifier();r.mid=s,r.iceGatherer||(r.iceGatherer=t._createIceGatherer(n,t.usingBundle));var o=c.RTCRtpSender.getCapabilities(i);d<15019&&(o.codecs=o.codecs.filter(function(e){return"rtx"!==e.name})),o.codecs.forEach(function(e){"H264"===e.name&&void 0===e.parameters["level-asymmetry-allowed"]&&(e.parameters["level-asymmetry-allowed"]="1"),r.remoteCapabilities&&r.remoteCapabilities.codecs&&r.remoteCapabilities.codecs.forEach(function(t){e.name.toLowerCase()===t.name.toLowerCase()&&e.clockRate===t.clockRate&&(e.preferredPayloadType=t.payloadType)})}),o.headerExtensions.forEach(function(e){(r.remoteCapabilities&&r.remoteCapabilities.headerExtensions||[]).forEach(function(t){e.uri===t.uri&&(e.id=t.id)})});var p=r.sendEncodingParameters||[{ssrc:1001*(2*n+1)}];a&&d>=15019&&"video"===i&&!p[0].rtx&&(p[0].rtx={ssrc:p[0].ssrc+1}),r.wantReceive&&(r.rtpReceiver=new c.RTCRtpReceiver(r.dtlsTransport,i)),r.localCapabilities=o,r.sendEncodingParameters=p}),"max-compat"!==t._config.bundlePolicy&&(s+="a=group:BUNDLE "+t.transceivers.map(function(e){return e.mid}).join(" ")+"\r\n"),s+="a=ice-options:trickle\r\n",t.transceivers.forEach(function(n,a){s+=r(n,n.localCapabilities,"offer",n.stream,t._dtlsRole),s+="a=rtcp-rsize\r\n",!n.iceGatherer||"new"===t.iceGatheringState||0!==a&&t.usingBundle||(n.iceGatherer.getLocalCandidates().forEach(function(t){t.component=1,s+="a="+e.writeCandidate(t)+"\r\n"}),"completed"===n.iceGatherer.state&&(s+="a=end-of-candidates\r\n"))});var p=new c.RTCSessionDescription({type:"offer",sdp:s});return Promise.resolve(p)},f.prototype.createAnswer=function(){var t=this;if(t._isClosed)return Promise.reject(o("InvalidStateError","Can not call createAnswer after close"));if("have-remote-offer"!==t.signalingState&&"have-local-pranswer"!==t.signalingState)return Promise.reject(o("InvalidStateError","Can not call createAnswer in signalingState "+t.signalingState));var n=e.writeSessionBoilerplate(t._sdpSessionId,t._sdpSessionVersion++);t.usingBundle&&(n+="a=group:BUNDLE "+t.transceivers.map(function(e){return e.mid}).join(" ")+"\r\n"),n+="a=ice-options:trickle\r\n";var i=e.getMediaSections(t._remoteDescription.sdp).length;t.transceivers.forEach(function(e,s){if(!(s+1>i)){if(e.rejected)return"application"===e.kind?"DTLS/SCTP"===e.protocol?n+="m=application 0 DTLS/SCTP 5000\r\n":n+="m=application 0 "+e.protocol+" webrtc-datachannel\r\n":"audio"===e.kind?n+="m=audio 0 UDP/TLS/RTP/SAVPF 0\r\na=rtpmap:0 PCMU/8000\r\n":"video"===e.kind&&(n+="m=video 0 UDP/TLS/RTP/SAVPF 120\r\na=rtpmap:120 VP8/90000\r\n"),void(n+="c=IN IP4 0.0.0.0\r\na=inactive\r\na=mid:"+e.mid+"\r\n");var o;if(e.stream)"audio"===e.kind?o=e.stream.getAudioTracks()[0]:"video"===e.kind&&(o=e.stream.getVideoTracks()[0]),o&&d>=15019&&"video"===e.kind&&!e.sendEncodingParameters[0].rtx&&(e.sendEncodingParameters[0].rtx={ssrc:e.sendEncodingParameters[0].ssrc+1});var c=a(e.localCapabilities,e.remoteCapabilities);!c.codecs.filter(function(e){return"rtx"===e.name.toLowerCase()}).length&&e.sendEncodingParameters[0].rtx&&delete e.sendEncodingParameters[0].rtx,n+=r(e,c,"answer",e.stream,t._dtlsRole),e.rtcpParameters&&e.rtcpParameters.reducedSize&&(n+="a=rtcp-rsize\r\n")}});var s=new c.RTCSessionDescription({type:"answer",sdp:n});return Promise.resolve(s)},f.prototype.addIceCandidate=function(t){var r,n=this;return t&&void 0===t.sdpMLineIndex&&!t.sdpMid?Promise.reject(new TypeError("sdpMLineIndex or sdpMid required")):new Promise(function(a,i){if(!n._remoteDescription)return i(o("InvalidStateError","Can not add ICE candidate without a remote description"));if(t&&""!==t.candidate){var c=t.sdpMLineIndex;if(t.sdpMid)for(var d=0;d<n.transceivers.length;d++)if(n.transceivers[d].mid===t.sdpMid){c=d;break}var p=n.transceivers[c];if(!p)return i(o("OperationError","Can not add ICE candidate"));if(p.rejected)return a();var l=Object.keys(t.candidate).length>0?e.parseCandidate(t.candidate):{};if("tcp"===l.protocol&&(0===l.port||9===l.port))return a();if(l.component&&1!==l.component)return a();if((0===c||c>0&&p.iceTransport!==n.transceivers[0].iceTransport)&&!s(p.iceTransport,l))return i(o("OperationError","Can not add ICE candidate"));var f=t.candidate.trim();0===f.indexOf("a=")&&(f=f.substr(2)),(r=e.getMediaSections(n._remoteDescription.sdp))[c]+="a="+(l.type?f:"end-of-candidates")+"\r\n",n._remoteDescription.sdp=e.getDescription(n._remoteDescription.sdp)+r.join("")}else for(var u=0;u<n.transceivers.length&&(n.transceivers[u].rejected||(n.transceivers[u].iceTransport.addRemoteCandidate({}),(r=e.getMediaSections(n._remoteDescription.sdp))[u]+="a=end-of-candidates\r\n",n._remoteDescription.sdp=e.getDescription(n._remoteDescription.sdp)+r.join(""),!n.usingBundle));u++);a()})},f.prototype.getStats=function(e){if(e&&e instanceof c.MediaStreamTrack){var t=null;if(this.transceivers.forEach(function(r){r.rtpSender&&r.rtpSender.track===e?t=r.rtpSender:r.rtpReceiver&&r.rtpReceiver.track===e&&(t=r.rtpReceiver)}),!t)throw o("InvalidAccessError","Invalid selector.");return t.getStats()}var r=[];return this.transceivers.forEach(function(e){["rtpSender","rtpReceiver","iceGatherer","iceTransport","dtlsTransport"].forEach(function(t){e[t]&&r.push(e[t].getStats())})}),Promise.all(r).then(function(e){var t=new Map;return e.forEach(function(e){e.forEach(function(e){t.set(e.id,e)})}),t})};["RTCRtpSender","RTCRtpReceiver","RTCIceGatherer","RTCIceTransport","RTCDtlsTransport"].forEach(function(e){var r=c[e];if(r&&r.prototype&&r.prototype.getStats){var n=r.prototype.getStats;r.prototype.getStats=function(){return n.apply(this).then(function(e){var r=new Map;return Object.keys(e).forEach(function(n){e[n].type=t(e[n]),r.set(n,e[n])}),r})}}});var u=["createOffer","createAnswer"];return u.forEach(function(e){var t=f.prototype[e];f.prototype[e]=function(){var e=arguments;return"function"==typeof e[0]||"function"==typeof e[1]?t.apply(this,[arguments[2]]).then(function(t){"function"==typeof e[0]&&e[0].apply(null,[t])},function(t){"function"==typeof e[1]&&e[1].apply(null,[t])}):t.apply(this,arguments)}}),(u=["setLocalDescription","setRemoteDescription","addIceCandidate"]).forEach(function(e){var t=f.prototype[e];f.prototype[e]=function(){var e=arguments;return"function"==typeof e[1]||"function"==typeof e[2]?t.apply(this,arguments).then(function(){"function"==typeof e[1]&&e[1].apply(null)},function(t){"function"==typeof e[2]&&e[2].apply(null,[t])}):t.apply(this,arguments)}}),["getStats"].forEach(function(e){var t=f.prototype[e];f.prototype[e]=function(){var e=arguments;return"function"==typeof e[1]?t.apply(this,arguments).then(function(){"function"==typeof e[1]&&e[1].apply(null)}):t.apply(this,arguments)}}),f};
|
||
-},{"sdp":"YHvh"}],"YdKx":[function(require,module,exports) {
|
||
-"use strict";function e(e){var r=e&&e.navigator,t=r.mediaDevices.getUserMedia.bind(r.mediaDevices);r.mediaDevices.getUserMedia=function(e){return t(e).catch(function(e){return Promise.reject(function(e){return{name:{PermissionDeniedError:"NotAllowedError"}[e.name]||e.name,message:e.message,constraint:e.constraint,toString:function(){return this.name}}}(e))})}}Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetUserMedia=e;
|
||
-},{}],"P3bV":[function(require,module,exports) {
|
||
-"use strict";function e(e){"getDisplayMedia"in e.navigator&&e.navigator.mediaDevices&&(e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||(e.navigator.mediaDevices.getDisplayMedia=e.navigator.getDisplayMedia.bind(e.navigator)))}Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=e;
|
||
-},{}],"XRic":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimPeerConnection=p,exports.shimReplaceTrack=a,Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return n.shimGetUserMedia}}),Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return i.shimGetDisplayMedia}});var e=s(require("../utils")),t=require("./filtericeservers"),r=o(require("rtcpeerconnection-shim")),n=require("./getusermedia"),i=require("./getdisplaymedia");function o(e){return e&&e.__esModule?e:{default:e}}function c(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return c=function(){return e},e}function s(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=c();if(t&&t.has(e))return t.get(e);var r={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var o=n?Object.getOwnPropertyDescriptor(e,i):null;o&&(o.get||o.set)?Object.defineProperty(r,i,o):r[i]=e[i]}return r.default=e,t&&t.set(e,r),r}function p(n,i){if(n.RTCIceGatherer&&(n.RTCIceCandidate||(n.RTCIceCandidate=function(e){return e}),n.RTCSessionDescription||(n.RTCSessionDescription=function(e){return e}),i.version<15025)){var o=Object.getOwnPropertyDescriptor(n.MediaStreamTrack.prototype,"enabled");Object.defineProperty(n.MediaStreamTrack.prototype,"enabled",{set:function(e){o.set.call(this,e);var t=new Event("enabled");t.enabled=e,this.dispatchEvent(t)}})}!n.RTCRtpSender||"dtmf"in n.RTCRtpSender.prototype||Object.defineProperty(n.RTCRtpSender.prototype,"dtmf",{get:function(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=new n.RTCDtmfSender(this):"video"===this.track.kind&&(this._dtmf=null)),this._dtmf}}),n.RTCDtmfSender&&!n.RTCDTMFSender&&(n.RTCDTMFSender=n.RTCDtmfSender);var c=(0,r.default)(n,i.version);n.RTCPeerConnection=function(r){return r&&r.iceServers&&(r.iceServers=(0,t.filterIceServers)(r.iceServers,i.version),e.log("ICE servers after filtering:",r.iceServers)),new c(r)},n.RTCPeerConnection.prototype=c.prototype}function a(e){!e.RTCRtpSender||"replaceTrack"in e.RTCRtpSender.prototype||(e.RTCRtpSender.prototype.replaceTrack=e.RTCRtpSender.prototype.setTrack)}
|
||
-},{"../utils":"iSxC","./filtericeservers":"NZ1C","rtcpeerconnection-shim":"NJ2u","./getusermedia":"YdKx","./getdisplaymedia":"P3bV"}],"GzSv":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetUserMedia=n;var e=o(require("../utils"));function t(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return t=function(){return e},e}function o(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var o=t();if(o&&o.has(e))return o.get(e);var r={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(r,i,a):r[i]=e[i]}return r.default=e,o&&o.set(e,r),r}function r(e){return(r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function n(t,o){var n=t&&t.navigator,i=t&&t.MediaStreamTrack;if(n.getUserMedia=function(t,o,r){e.deprecated("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(t).then(o,r)},!(o.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){var a=function(e,t,o){t in e&&!(o in e)&&(e[o]=e[t],delete e[t])},s=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(e){return"object"===r(e)&&"object"===r(e.audio)&&(e=JSON.parse(JSON.stringify(e)),a(e.audio,"autoGainControl","mozAutoGainControl"),a(e.audio,"noiseSuppression","mozNoiseSuppression")),s(e)},i&&i.prototype.getSettings){var p=i.prototype.getSettings;i.prototype.getSettings=function(){var e=p.apply(this,arguments);return a(e,"mozAutoGainControl","autoGainControl"),a(e,"mozNoiseSuppression","noiseSuppression"),e}}if(i&&i.prototype.applyConstraints){var u=i.prototype.applyConstraints;i.prototype.applyConstraints=function(e){return"audio"===this.kind&&"object"===r(e)&&(e=JSON.parse(JSON.stringify(e)),a(e,"autoGainControl","mozAutoGainControl"),a(e,"noiseSuppression","mozNoiseSuppression")),u.apply(this,[e])}}}}
|
||
-},{"../utils":"iSxC"}],"UuGU":[function(require,module,exports) {
|
||
-"use strict";function e(e,i){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(a){if(!a||!a.video){var t=new DOMException("getDisplayMedia without video constraints is undefined");return t.name="NotFoundError",t.code=8,Promise.reject(t)}return!0===a.video?a.video={mediaSource:i}:a.video.mediaSource=i,e.navigator.mediaDevices.getUserMedia(a)})}Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimGetDisplayMedia=e;
|
||
-},{}],"Fzdr":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimOnTrack=s,exports.shimPeerConnection=c,exports.shimSenderGetStats=p,exports.shimReceiverGetStats=u,exports.shimRemoveStream=f,exports.shimRTCDataChannel=d,exports.shimAddTransceiver=C,exports.shimGetParameters=y,exports.shimCreateOffer=l,exports.shimCreateAnswer=m,Object.defineProperty(exports,"shimGetUserMedia",{enumerable:!0,get:function(){return t.shimGetUserMedia}}),Object.defineProperty(exports,"shimGetDisplayMedia",{enumerable:!0,get:function(){return n.shimGetDisplayMedia}});var e=o(require("../utils")),t=require("./getusermedia"),n=require("./getdisplaymedia");function r(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return r=function(){return e},e}function o(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=r();if(t&&t.has(e))return t.get(e);var n={},o=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var a=o?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(n,i,a):n[i]=e[i]}return n.default=e,t&&t.set(e,n),n}function i(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e){return(a="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function s(e){"object"===a(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})}function c(e,t){if("object"===a(e)&&(e.RTCPeerConnection||e.mozRTCPeerConnection)){!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){var n=e.RTCPeerConnection.prototype[t],r=i({},t,function(){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)});e.RTCPeerConnection.prototype[t]=r[t]});var n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){var[e,o,i]=arguments;return r.apply(this,[e||null]).then(function(e){if(t.version<53&&!o)try{e.forEach(function(e){e.type=n[e.type]||e.type})}catch(r){if("TypeError"!==r.name)throw r;e.forEach(function(t,r){e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))})}return e}).then(o,i)}}}function p(e){if("object"===a(e)&&e.RTCPeerConnection&&e.RTCRtpSender&&!(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)){var t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){var e=this,n=t.apply(this,[]);return n.forEach(function(t){return t._pc=e}),n});var n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){var e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}}function u(t){if("object"===a(t)&&t.RTCPeerConnection&&t.RTCRtpSender&&!(t.RTCRtpSender&&"getStats"in t.RTCRtpReceiver.prototype)){var n=t.RTCPeerConnection.prototype.getReceivers;n&&(t.RTCPeerConnection.prototype.getReceivers=function(){var e=this,t=n.apply(this,[]);return t.forEach(function(t){return t._pc=e}),t}),e.wrapPeerConnectionEvent(t,"track",function(e){return e.receiver._pc=e.srcElement,e}),t.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}}function f(t){!t.RTCPeerConnection||"removeStream"in t.RTCPeerConnection.prototype||(t.RTCPeerConnection.prototype.removeStream=function(t){var n=this;e.deprecated("removeStream","removeTrack"),this.getSenders().forEach(function(e){e.track&&t.getTracks().includes(e.track)&&n.removeTrack(e)})})}function d(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function C(e){if("object"===a(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];var e=arguments[1],n=e&&"sendEncodings"in e;n&&e.sendEncodings.forEach(function(e){if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")});var r=t.apply(this,arguments);if(n){var{sender:o}=r,i=o.getParameters();"encodings"in i&&(1!==i.encodings.length||0!==Object.keys(i.encodings[0]).length)||(i.encodings=e.sendEncodings,o.sendEncodings=e.sendEncodings,this.setParametersPromises.push(o.setParameters(i).then(function(){delete o.sendEncodings}).catch(function(){delete o.sendEncodings})))}return r})}}function y(e){if("object"===a(e)&&e.RTCRtpSender){var t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){var e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}}function l(e){if("object"===a(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){var e=arguments,n=this;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(function(){return t.apply(n,e)}).finally(function(){n.setParametersPromises=[]}):t.apply(this,arguments)}}}function m(e){if("object"===a(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){var e=arguments,n=this;return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(function(){return t.apply(n,e)}).finally(function(){n.setParametersPromises=[]}):t.apply(this,arguments)}}}
|
||
-},{"../utils":"iSxC","./getusermedia":"GzSv","./getdisplaymedia":"UuGU"}],"t1lL":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimLocalStreamsAPI=n,exports.shimRemoteStreamsAPI=i,exports.shimCallbacksAPI=a,exports.shimGetUserMedia=c,exports.shimConstraints=s,exports.shimRTCIceServerUrls=d,exports.shimTrackEventTransceiver=f,exports.shimCreateOfferLegacy=p,exports.shimAudioContext=u;var e=r(require("../utils"));function t(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return t=function(){return e},e}function r(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var r=t();if(r&&r.has(e))return r.get(e);var o={},n=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var a=n?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(o,i,a):o[i]=e[i]}return o.default=e,r&&r.set(e,o),o}function o(e){return(o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function n(e){if("object"===o(e)&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){var r=this;this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach(function(o){return t.call(r,o,e)}),e.getVideoTracks().forEach(function(o){return t.call(r,o,e)})},e.RTCPeerConnection.prototype.addTrack=function(e){for(var r=this,o=arguments.length,n=new Array(o>1?o-1:0),i=1;i<o;i++)n[i-1]=arguments[i];return n&&n.forEach(function(e){r._localStreams?r._localStreams.includes(e)||r._localStreams.push(e):r._localStreams=[e]}),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){var t=this;this._localStreams||(this._localStreams=[]);var r=this._localStreams.indexOf(e);if(-1!==r){this._localStreams.splice(r,1);var o=e.getTracks();this.getSenders().forEach(function(e){o.includes(e.track)&&t.removeTrack(e)})}})}}function i(e){if("object"===o(e)&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get:function(){return this._onaddstream},set:function(e){var t=this;this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=function(e){e.streams.forEach(function(e){if(t._remoteStreams||(t._remoteStreams=[]),!t._remoteStreams.includes(e)){t._remoteStreams.push(e);var r=new Event("addstream");r.stream=e,t.dispatchEvent(r)}})})}});var t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){var e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach(function(t){if(e._remoteStreams||(e._remoteStreams=[]),!(e._remoteStreams.indexOf(t)>=0)){e._remoteStreams.push(t);var r=new Event("addstream");r.stream=t,e.dispatchEvent(r)}})}),t.apply(e,arguments)}}}function a(e){if("object"===o(e)&&e.RTCPeerConnection){var t=e.RTCPeerConnection.prototype,r=t.createOffer,n=t.createAnswer,i=t.setLocalDescription,a=t.setRemoteDescription,c=t.addIceCandidate;t.createOffer=function(e,t){var o=arguments.length>=2?arguments[2]:arguments[0],n=r.apply(this,[o]);return t?(n.then(e,t),Promise.resolve()):n},t.createAnswer=function(e,t){var r=arguments.length>=2?arguments[2]:arguments[0],o=n.apply(this,[r]);return t?(o.then(e,t),Promise.resolve()):o};var s=function(e,t,r){var o=i.apply(this,[e]);return r?(o.then(t,r),Promise.resolve()):o};t.setLocalDescription=s,s=function(e,t,r){var o=a.apply(this,[e]);return r?(o.then(t,r),Promise.resolve()):o},t.setRemoteDescription=s,s=function(e,t,r){var o=c.apply(this,[e]);return r?(o.then(t,r),Promise.resolve()):o},t.addIceCandidate=s}}function c(e){var t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){var r=t.mediaDevices,o=r.getUserMedia.bind(r);t.mediaDevices.getUserMedia=function(e){return o(s(e))}}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,r,o){t.mediaDevices.getUserMedia(e).then(r,o)}.bind(t))}function s(t){return t&&void 0!==t.video?Object.assign({},t,{video:e.compactObject(t.video)}):t}function d(t){if(t.RTCPeerConnection){var r=t.RTCPeerConnection;t.RTCPeerConnection=function(t,o){if(t&&t.iceServers){for(var n=[],i=0;i<t.iceServers.length;i++){var a=t.iceServers[i];!a.hasOwnProperty("urls")&&a.hasOwnProperty("url")?(e.deprecated("RTCIceServer.url","RTCIceServer.urls"),(a=JSON.parse(JSON.stringify(a))).urls=a.url,delete a.url,n.push(a)):n.push(t.iceServers[i])}t.iceServers=n}return new r(t,o)},t.RTCPeerConnection.prototype=r.prototype,"generateCertificate"in r&&Object.defineProperty(t.RTCPeerConnection,"generateCertificate",{get:function(){return r.generateCertificate}})}}function f(e){"object"===o(e)&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get:function(){return{receiver:this.receiver}}})}function p(e){var t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);var r=this.getTransceivers().find(function(e){return"audio"===e.receiver.track.kind});!1===e.offerToReceiveAudio&&r?"sendrecv"===r.direction?r.setDirection?r.setDirection("sendonly"):r.direction="sendonly":"recvonly"===r.direction&&(r.setDirection?r.setDirection("inactive"):r.direction="inactive"):!0!==e.offerToReceiveAudio||r||this.addTransceiver("audio"),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);var o=this.getTransceivers().find(function(e){return"video"===e.receiver.track.kind});!1===e.offerToReceiveVideo&&o?"sendrecv"===o.direction?o.setDirection?o.setDirection("sendonly"):o.direction="sendonly":"recvonly"===o.direction&&(o.setDirection?o.setDirection("inactive"):o.direction="inactive"):!0!==e.offerToReceiveVideo||o||this.addTransceiver("video")}return t.apply(this,arguments)}}function u(e){"object"!==o(e)||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}
|
||
-},{"../utils":"iSxC"}],"GOQK":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.shimRTCIceCandidate=a,exports.shimMaxMessageSize=c,exports.shimSendThrowTypeError=s,exports.shimConnectionState=p,exports.removeExtmapAllowMixed=d,exports.shimAddIceCandidateNullOrEmpty=u;var e=r(require("sdp")),t=o(require("./utils"));function n(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return n=function(){return e},e}function o(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=n();if(t&&t.has(e))return t.get(e);var o={},r=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var i in e)if(Object.prototype.hasOwnProperty.call(e,i)){var a=r?Object.getOwnPropertyDescriptor(e,i):null;a&&(a.get||a.set)?Object.defineProperty(o,i,a):o[i]=e[i]}return o.default=e,t&&t.set(e,o),o}function r(e){return e&&e.__esModule?e:{default:e}}function i(e){return(i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function a(n){if(n.RTCIceCandidate&&!(n.RTCIceCandidate&&"foundation"in n.RTCIceCandidate.prototype)){var o=n.RTCIceCandidate;n.RTCIceCandidate=function(t){if("object"===i(t)&&t.candidate&&0===t.candidate.indexOf("a=")&&((t=JSON.parse(JSON.stringify(t))).candidate=t.candidate.substr(2)),t.candidate&&t.candidate.length){var n=new o(t),r=e.default.parseCandidate(t.candidate),a=Object.assign(n,r);return a.toJSON=function(){return{candidate:a.candidate,sdpMid:a.sdpMid,sdpMLineIndex:a.sdpMLineIndex,usernameFragment:a.usernameFragment}},a}return new o(t)},n.RTCIceCandidate.prototype=o.prototype,t.wrapPeerConnectionEvent(n,"icecandidate",function(e){return e.candidate&&Object.defineProperty(e,"candidate",{value:new n.RTCIceCandidate(e.candidate),writable:"false"}),e})}}function c(t,n){if(t.RTCPeerConnection){"sctp"in t.RTCPeerConnection.prototype||Object.defineProperty(t.RTCPeerConnection.prototype,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp}});var o=t.RTCPeerConnection.prototype.setRemoteDescription;t.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===n.browser&&n.version>=76){var{sdpSemantics:t}=this.getConfiguration();"plan-b"===t&&Object.defineProperty(this,"sctp",{get:function(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(function(t){if(!t||!t.sdp)return!1;var n=e.default.splitSections(t.sdp);return n.shift(),n.some(function(t){var n=e.default.parseMLine(t);return n&&"application"===n.kind&&-1!==n.protocol.indexOf("SCTP")})}(arguments[0])){var r,i=function(e){var t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;var n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),a=(p=i,d=65536,"firefox"===n.browser&&(d=n.version<57?-1===p?16384:2147483637:n.version<60?57===n.version?65535:65536:2147483637),d),c=function(t,o){var r=65536;"firefox"===n.browser&&57===n.version&&(r=65535);var i=e.default.matchPrefix(t.sdp,"a=max-message-size:");return i.length>0?r=parseInt(i[0].substr(19),10):"firefox"===n.browser&&-1!==o&&(r=2147483637),r}(arguments[0],i);r=0===a&&0===c?Number.POSITIVE_INFINITY:0===a||0===c?Math.max(a,c):Math.min(a,c);var s={};Object.defineProperty(s,"maxMessageSize",{get:function(){return r}}),this._sctp=s}var p,d;return o.apply(this,arguments)}}}function s(e){if(e.RTCPeerConnection&&"createDataChannel"in e.RTCPeerConnection.prototype){var n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){var e=n.apply(this,arguments);return o(e,this),e},t.wrapPeerConnectionEvent(e,"datachannel",function(e){return o(e.channel,e.target),e})}function o(e,t){var n=e.send;e.send=function(){var o=arguments[0],r=o.length||o.size||o.byteLength;if("open"===e.readyState&&t.sctp&&r>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}}function p(e){if(e.RTCPeerConnection&&!("connectionState"in e.RTCPeerConnection.prototype)){var t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get:function(){return{completed:"connected",checking:"connecting"}[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get:function(){return this._onconnectionstatechange||null},set:function(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(function(e){var n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=function(e){var t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;var n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}})}}function d(e,t){if(e.RTCPeerConnection&&!("chrome"===t.browser&&t.version>=71||"safari"===t.browser&&t.version>=605)){var n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){var o=t.sdp.split("\n").filter(function(e){return"a=extmap-allow-mixed"!==e.trim()}).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:o}):t.sdp=o}return n.apply(this,arguments)}}}function u(e,t){if(e.RTCPeerConnection&&e.RTCPeerConnection.prototype){var n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}}
|
||
-},{"sdp":"YHvh","./utils":"iSxC"}],"KtlG":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.adapterFactory=o;var e=m(require("./utils")),i=m(require("./chrome/chrome_shim")),r=m(require("./edge/edge_shim")),s=m(require("./firefox/firefox_shim")),t=m(require("./safari/safari_shim")),a=m(require("./common_shim"));function n(){if("function"!=typeof WeakMap)return null;var e=new WeakMap;return n=function(){return e},e}function m(e){if(e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var i=n();if(i&&i.has(e))return i.get(e);var r={},s=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t)){var a=s?Object.getOwnPropertyDescriptor(e,t):null;a&&(a.get||a.set)?Object.defineProperty(r,t,a):r[t]=e[t]}return r.default=e,i&&i.set(e,r),r}function o(){var{window:n}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},m=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{shimChrome:!0,shimFirefox:!0,shimEdge:!0,shimSafari:!0},o=e.log,h=e.detectBrowser(n),d={browserDetails:h,commonShim:a,extractVersion:e.extractVersion,disableLog:e.disableLog,disableWarnings:e.disableWarnings};switch(h.browser){case"chrome":if(!i||!i.shimPeerConnection||!m.shimChrome)return o("Chrome shim is not included in this adapter release."),d;if(null===h.version)return o("Chrome shim can not determine version, not shimming."),d;o("adapter.js shimming chrome."),d.browserShim=i,a.shimAddIceCandidateNullOrEmpty(n,h),i.shimGetUserMedia(n,h),i.shimMediaStream(n,h),i.shimPeerConnection(n,h),i.shimOnTrack(n,h),i.shimAddTrackRemoveTrack(n,h),i.shimGetSendersWithDtmf(n,h),i.shimGetStats(n,h),i.shimSenderReceiverGetStats(n,h),i.fixNegotiationNeeded(n,h),a.shimRTCIceCandidate(n,h),a.shimConnectionState(n,h),a.shimMaxMessageSize(n,h),a.shimSendThrowTypeError(n,h),a.removeExtmapAllowMixed(n,h);break;case"firefox":if(!s||!s.shimPeerConnection||!m.shimFirefox)return o("Firefox shim is not included in this adapter release."),d;o("adapter.js shimming firefox."),d.browserShim=s,a.shimAddIceCandidateNullOrEmpty(n,h),s.shimGetUserMedia(n,h),s.shimPeerConnection(n,h),s.shimOnTrack(n,h),s.shimRemoveStream(n,h),s.shimSenderGetStats(n,h),s.shimReceiverGetStats(n,h),s.shimRTCDataChannel(n,h),s.shimAddTransceiver(n,h),s.shimGetParameters(n,h),s.shimCreateOffer(n,h),s.shimCreateAnswer(n,h),a.shimRTCIceCandidate(n,h),a.shimConnectionState(n,h),a.shimMaxMessageSize(n,h),a.shimSendThrowTypeError(n,h);break;case"edge":if(!r||!r.shimPeerConnection||!m.shimEdge)return o("MS edge shim is not included in this adapter release."),d;o("adapter.js shimming edge."),d.browserShim=r,r.shimGetUserMedia(n,h),r.shimGetDisplayMedia(n,h),r.shimPeerConnection(n,h),r.shimReplaceTrack(n,h),a.shimMaxMessageSize(n,h),a.shimSendThrowTypeError(n,h);break;case"safari":if(!t||!m.shimSafari)return o("Safari shim is not included in this adapter release."),d;o("adapter.js shimming safari."),d.browserShim=t,a.shimAddIceCandidateNullOrEmpty(n,h),t.shimRTCIceServerUrls(n,h),t.shimCreateOfferLegacy(n,h),t.shimCallbacksAPI(n,h),t.shimLocalStreamsAPI(n,h),t.shimRemoteStreamsAPI(n,h),t.shimTrackEventTransceiver(n,h),t.shimGetUserMedia(n,h),t.shimAudioContext(n,h),a.shimRTCIceCandidate(n,h),a.shimMaxMessageSize(n,h),a.shimSendThrowTypeError(n,h),a.removeExtmapAllowMixed(n,h);break;default:o("Unsupported browser!")}return d}
|
||
-},{"./utils":"iSxC","./chrome/chrome_shim":"uI5X","./edge/edge_shim":"XRic","./firefox/firefox_shim":"Fzdr","./safari/safari_shim":"t1lL","./common_shim":"GOQK"}],"tI1X":[function(require,module,exports) {
|
||
-"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=require("./adapter_factory.js"),t=(0,e.adapterFactory)({window:"undefined"==typeof window?void 0:window}),d=t;exports.default=d;
|
||
-},{"./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}());
|
||
-},{"./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;i<r;){var a=Math.min(r,i+exports.util.chunkedMTU),u=e.slice(i,a),s={__peerData:this._dataCount,n:n,data:u,total:o};t.push(s),i=a,n++}return this._dataCount++,t},e.prototype.blobToArrayBuffer=function(e,t){var r=new FileReader;return r.onload=function(e){e.target&&t(e.target.result)},r.readAsArrayBuffer(e),r},e.prototype.binaryStringToArrayBuffer=function(e){for(var t=new Uint8Array(e.length),r=0;r<e.length;r++)t[r]=255&e.charCodeAt(r);return t.buffer},e.prototype.randomToken=function(){return Math.random().toString(36).substr(2)},e.prototype.isSecure=function(){return"https:"===location.protocol},e}());
|
||
-},{"peerjs-js-binarypack":"kdPp","./supports":"I31f"}],"JJlS":[function(require,module,exports) {
|
||
-"use strict";var e=Object.prototype.hasOwnProperty,t="~";function n(){}function r(e,t,n){this.fn=e,this.context=t,this.once=n||!1}function o(e,n,o,s,i){if("function"!=typeof o)throw new TypeError("The listener must be a function");var c=new r(o,s||e,i),f=t?t+n:n;return e._events[f]?e._events[f].fn?e._events[f]=[e._events[f],c]:e._events[f].push(c):(e._events[f]=c,e._eventsCount++),e}function s(e,t){0==--e._eventsCount?e._events=new n:delete e._events[t]}function i(){this._events=new n,this._eventsCount=0}Object.create&&(n.prototype=Object.create(null),(new n).__proto__||(t=!1)),i.prototype.eventNames=function(){var n,r,o=[];if(0===this._eventsCount)return o;for(r in n=this._events)e.call(n,r)&&o.push(t?r.slice(1):r);return Object.getOwnPropertySymbols?o.concat(Object.getOwnPropertySymbols(n)):o},i.prototype.listeners=function(e){var n=t?t+e:e,r=this._events[n];if(!r)return[];if(r.fn)return[r.fn];for(var o=0,s=r.length,i=new Array(s);o<s;o++)i[o]=r[o].fn;return i},i.prototype.listenerCount=function(e){var n=t?t+e:e,r=this._events[n];return r?r.fn?1:r.length:0},i.prototype.emit=function(e,n,r,o,s,i){var c=t?t+e:e;if(!this._events[c])return!1;var f,u,a=this._events[c],l=arguments.length;if(a.fn){switch(a.once&&this.removeListener(e,a.fn,void 0,!0),l){case 1:return a.fn.call(a.context),!0;case 2:return a.fn.call(a.context,n),!0;case 3:return a.fn.call(a.context,n,r),!0;case 4:return a.fn.call(a.context,n,r,o),!0;case 5:return a.fn.call(a.context,n,r,o,s),!0;case 6:return a.fn.call(a.context,n,r,o,s,i),!0}for(u=1,f=new Array(l-1);u<l;u++)f[u-1]=arguments[u];a.fn.apply(a.context,f)}else{var v,h=a.length;for(u=0;u<h;u++)switch(a[u].once&&this.removeListener(e,a[u].fn,void 0,!0),l){case 1:a[u].fn.call(a[u].context);break;case 2:a[u].fn.call(a[u].context,n);break;case 3:a[u].fn.call(a[u].context,n,r);break;case 4:a[u].fn.call(a[u].context,n,r,o);break;default:if(!f)for(v=1,f=new Array(l-1);v<l;v++)f[v-1]=arguments[v];a[u].fn.apply(a[u].context,f)}}return!0},i.prototype.on=function(e,t,n){return o(this,e,t,n,!1)},i.prototype.once=function(e,t,n){return o(this,e,t,n,!0)},i.prototype.removeListener=function(e,n,r,o){var i=t?t+e:e;if(!this._events[i])return this;if(!n)return s(this,i),this;var c=this._events[i];if(c.fn)c.fn!==n||o&&!c.once||r&&c.context!==r||s(this,i);else{for(var f=0,u=[],a=c.length;f<a;f++)(c[f].fn!==n||o&&!c[f].once||r&&c[f].context!==r)&&u.push(c[f]);u.length?this._events[i]=1===u.length?u[0]:u:s(this,i)}return this},i.prototype.removeAllListeners=function(e){var r;return e?(r=t?t+e:e,this._events[r]&&s(this,r)):(this._events=new n,this._eventsCount=0),this},i.prototype.off=i.prototype.removeListener,i.prototype.addListener=i.prototype.on,i.prefixed=t,i.EventEmitter=i,"undefined"!=typeof module&&(module.exports=i);
|
||
-},{}],"WOs9":[function(require,module,exports) {
|
||
-"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){for(var o=0,t=e.length,n=r.length;o<t;o++,n++)r[n]=e[o];return r};Object.defineProperty(exports,"__esModule",{value:!0}),exports.LogLevel=void 0;var o,t="PeerJS: ";!function(r){r[r.Disabled=0]="Disabled",r[r.Errors=1]="Errors",r[r.Warnings=2]="Warnings",r[r.All=3]="All"}(o=exports.LogLevel||(exports.LogLevel={}));var n=function(){function n(){this._logLevel=o.Disabled}return Object.defineProperty(n.prototype,"logLevel",{get:function(){return this._logLevel},set:function(r){this._logLevel=r},enumerable:!1,configurable:!0}),n.prototype.log=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];this._logLevel>=o.All&&this._print.apply(this,e([o.All],r(t)))},n.prototype.warn=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];this._logLevel>=o.Warnings&&this._print.apply(this,e([o.Warnings],r(t)))},n.prototype.error=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];this._logLevel>=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<arguments.length;i++)l[i-1]=arguments[i];var s=e([t],r(l));for(var a in s)s[a]instanceof Error&&(s[a]="("+s[a].name+") "+s[a].message);n>=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;
|
||
-},{}],"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<o;n++,s++)e[s]=t[n];return e},o=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],o=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&o>=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;
|
||
-},{"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;t<o;t++)for(var i in n=arguments[t])Object.prototype.hasOwnProperty.call(n,i)&&(e[i]=n[i]);return e}).apply(this,arguments)},n=this&&this.__awaiter||function(e,n,t,o){return new(t||(t=Promise))(function(i,r){function c(e){try{s(o.next(e))}catch(n){r(n)}}function a(e){try{s(o.throw(e))}catch(n){r(n)}}function s(e){var n;e.done?i(e.value):(n=e.value,n instanceof t?n:new t(function(e){e(n)})).then(c,a)}s((o=o.apply(e,n||[])).next())})},t=this&&this.__generator||function(e,n){var t,o,i,r,c={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return r={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(r[Symbol.iterator]=function(){return this}),r;function a(r){return function(a){return function(r){if(t)throw new TypeError("Generator is already executing.");for(;c;)try{if(t=1,o&&(i=2&r[0]?o.return:r[0]?o.throw||((i=o.return)&&i.call(o),0):o.next)&&!(i=i.call(o,r[1])).done)return i;switch(o=0,i&&(r=[2&r[0],i.value]),r[0]){case 0:case 1:i=r;break;case 4:return c.label++,{value:r[1],done:!1};case 5:c.label++,o=r[1],r=[0];continue;case 7:r=c.ops.pop(),c.trys.pop();continue;default:if(!(i=(i=c.trys).length>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]<i[3])){c.label=r[1];break}if(6===r[0]&&c.label<i[1]){c.label=i[1],i=r;break}if(i&&c.label<i[2]){c.label=i[2],c.ops.push(r);break}i[2]&&c.ops.pop(),c.trys.pop();continue}r=n.call(e,c)}catch(a){r=[6,a],o=0}finally{t=i=0}if(5&r[0])throw r[1];return{value:r[0]?r[1]:void 0,done:!0}}([r,a])}}},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.Negotiator=void 0;var i=require("./util"),r=o(require("./logger")),c=require("./enums"),a=function(){function o(e){this.connection=e}return o.prototype.startConnection=function(e){var n=this._startPeerConnection();if(this.connection.peerConnection=n,this.connection.type===c.ConnectionType.Media&&e._stream&&this._addTracksToConnection(e._stream,n),e.originator){if(this.connection.type===c.ConnectionType.Data){var t=this.connection,o={ordered:!!e.reliable},i=n.createDataChannel(t.label,o);t.initialize(i)}this._makeOffer()}else this.handleSDP("OFFER",e.sdp)},o.prototype._startPeerConnection=function(){r.default.log("Creating RTCPeerConnection.");var e=new RTCPeerConnection(this.connection.provider.options.config);return this._setupListeners(e),e},o.prototype._setupListeners=function(e){var n=this,t=this.connection.peer,o=this.connection.connectionId,a=this.connection.type,s=this.connection.provider;r.default.log("Listening for ICE candidates."),e.onicecandidate=function(e){e.candidate&&e.candidate.candidate&&(r.default.log("Received ICE candidates for "+t+":",e.candidate),s.socket.send({type:c.ServerMessageType.Candidate,payload:{candidate:e.candidate,type:a,connectionId:o},dst:t}))},e.oniceconnectionstatechange=function(){switch(e.iceConnectionState){case"failed":r.default.log("iceConnectionState is failed, closing connections to "+t),n.connection.emit(c.ConnectionEventType.Error,new Error("Negotiation of connection to "+t+" failed.")),n.connection.close();break;case"closed":r.default.log("iceConnectionState is closed, closing connections to "+t),n.connection.emit(c.ConnectionEventType.Error,new Error("Connection to "+t+" closed.")),n.connection.close();break;case"disconnected":r.default.log("iceConnectionState changed to disconnected on the connection with "+t);break;case"completed":e.onicecandidate=i.util.noop}n.connection.emit(c.ConnectionEventType.IceStateChanged,e.iceConnectionState)},r.default.log("Listening for data channel"),e.ondatachannel=function(e){r.default.log("Received data channel");var n=e.channel;s.getConnection(t,o).initialize(n)},r.default.log("Listening for remote stream"),e.ontrack=function(e){r.default.log("Received remote stream");var i=e.streams[0],a=s.getConnection(t,o);if(a.type===c.ConnectionType.Media){var d=a;n._addStreamToMediaConnection(i,d)}}},o.prototype.cleanup=function(){r.default.log("Cleaning up PeerConnection to "+this.connection.peer);var e=this.connection.peerConnection;if(e){this.connection.peerConnection=null,e.onicecandidate=e.oniceconnectionstatechange=e.ondatachannel=e.ontrack=function(){};var n="closed"!==e.signalingState,t=!1;if(this.connection.type===c.ConnectionType.Data){var o=this.connection.dataChannel;o&&(t=!!o.readyState&&"closed"!==o.readyState)}(n||t)&&e.close()}},o.prototype._makeOffer=function(){return n(this,void 0,Promise,function(){var n,o,a,s,d,l,u;return t(this,function(t){switch(t.label){case 0:n=this.connection.peerConnection,o=this.connection.provider,t.label=1;case 1:return t.trys.push([1,7,,8]),[4,n.createOffer(this.connection.options.constraints)];case 2:a=t.sent(),r.default.log("Created offer."),this.connection.options.sdpTransform&&"function"==typeof this.connection.options.sdpTransform&&(a.sdp=this.connection.options.sdpTransform(a.sdp)||a.sdp),t.label=3;case 3:return t.trys.push([3,5,,6]),[4,n.setLocalDescription(a)];case 4:return t.sent(),r.default.log("Set localDescription:",a,"for:"+this.connection.peer),s={sdp:a,type:this.connection.type,connectionId:this.connection.connectionId,metadata:this.connection.metadata,browser:i.util.browser},this.connection.type===c.ConnectionType.Data&&(d=this.connection,s=e(e({},s),{label:d.label,reliable:d.reliable,serialization:d.serialization})),o.socket.send({type:c.ServerMessageType.Offer,payload:s,dst:this.connection.peer}),[3,6];case 5:return"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer"!=(l=t.sent())&&(o.emitError(c.PeerErrorType.WebRTC,l),r.default.log("Failed to setLocalDescription, ",l)),[3,6];case 6:return[3,8];case 7:return u=t.sent(),o.emitError(c.PeerErrorType.WebRTC,u),r.default.log("Failed to createOffer, ",u),[3,8];case 8:return[2]}})})},o.prototype._makeAnswer=function(){return n(this,void 0,Promise,function(){var e,n,o,a,s;return t(this,function(t){switch(t.label){case 0:e=this.connection.peerConnection,n=this.connection.provider,t.label=1;case 1:return t.trys.push([1,7,,8]),[4,e.createAnswer()];case 2:o=t.sent(),r.default.log("Created answer."),this.connection.options.sdpTransform&&"function"==typeof this.connection.options.sdpTransform&&(o.sdp=this.connection.options.sdpTransform(o.sdp)||o.sdp),t.label=3;case 3:return t.trys.push([3,5,,6]),[4,e.setLocalDescription(o)];case 4:return t.sent(),r.default.log("Set localDescription:",o,"for:"+this.connection.peer),n.socket.send({type:c.ServerMessageType.Answer,payload:{sdp:o,type:this.connection.type,connectionId:this.connection.connectionId,browser:i.util.browser},dst:this.connection.peer}),[3,6];case 5:return a=t.sent(),n.emitError(c.PeerErrorType.WebRTC,a),r.default.log("Failed to setLocalDescription, ",a),[3,6];case 6:return[3,8];case 7:return s=t.sent(),n.emitError(c.PeerErrorType.WebRTC,s),r.default.log("Failed to create answer, ",s),[3,8];case 8:return[2]}})})},o.prototype.handleSDP=function(e,o){return n(this,void 0,Promise,function(){var n,i,a,s;return t(this,function(t){switch(t.label){case 0:o=new RTCSessionDescription(o),n=this.connection.peerConnection,i=this.connection.provider,r.default.log("Setting remote description",o),a=this,t.label=1;case 1:return t.trys.push([1,5,,6]),[4,n.setRemoteDescription(o)];case 2:return t.sent(),r.default.log("Set remoteDescription:"+e+" for:"+this.connection.peer),"OFFER"!==e?[3,4]:[4,a._makeAnswer()];case 3:t.sent(),t.label=4;case 4:return[3,6];case 5:return s=t.sent(),i.emitError(c.PeerErrorType.WebRTC,s),r.default.log("Failed to setRemoteDescription, ",s),[3,6];case 6:return[2]}})})},o.prototype.handleCandidate=function(e){return n(this,void 0,Promise,function(){var n,o,i,a,s,d;return t(this,function(t){switch(t.label){case 0:r.default.log("handleCandidate:",e),n=e.candidate,o=e.sdpMLineIndex,i=e.sdpMid,a=this.connection.peerConnection,s=this.connection.provider,t.label=1;case 1:return t.trys.push([1,3,,4]),[4,a.addIceCandidate(new RTCIceCandidate({sdpMid:i,sdpMLineIndex:o,candidate:n}))];case 2:return t.sent(),r.default.log("Added ICE candidate for:"+this.connection.peer),[3,4];case 3:return d=t.sent(),s.emitError(c.PeerErrorType.WebRTC,d),r.default.log("Failed to handleCandidate, ",d),[3,4];case 4:return[2]}})})},o.prototype._addTracksToConnection=function(e,n){if(r.default.log("add tracks from stream "+e.id+" to peer connection"),!n.addTrack)return r.default.error("Your browser does't support RTCPeerConnection#addTrack. Ignored.");e.getTracks().forEach(function(t){n.addTrack(t,e)})},o.prototype._addStreamToMediaConnection=function(e,n){r.default.log("add stream "+e.id+" to media connection "+n.connectionId),n.addStream(e)},o}();exports.Negotiator=a;
|
||
-},{"./util":"BHXf","./logger":"WOs9","./enums":"ZRYf"}],"tQFK":[function(require,module,exports) {
|
||
-"use strict";var t=this&&this.__extends||function(){var t=function(e,n){return(t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&(t[n]=e[n])})(e,n)};return function(e,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=e}t(e,n),e.prototype=null===n?Object.create(n):(o.prototype=n.prototype,new o)}}();Object.defineProperty(exports,"__esModule",{value:!0}),exports.BaseConnection=void 0;var e=require("eventemitter3"),n=function(e){function n(t,n,o){var r=e.call(this)||this;return r.peer=t,r.provider=n,r.options=o,r._open=!1,r.metadata=o.metadata,r}return t(n,e),Object.defineProperty(n.prototype,"open",{get:function(){return this._open},enumerable:!1,configurable:!0}),n}(e.EventEmitter);exports.BaseConnection=n;
|
||
-},{"eventemitter3":"JJlS"}],"dbHP":[function(require,module,exports) {
|
||
-"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<r;o++)for(var n in t=arguments[o])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e}).apply(this,arguments)},o=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,o=t&&e[t],r=0;if(o)return o.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=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;
|
||
-},{"./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;
|
||
-},{"./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]<n[3])){i.label=s[1];break}if(6===s[0]&&i.label<n[1]){i.label=n[1],n=s;break}if(n&&i.label<n[2]){i.label=n[2],i.ops.push(s);break}n[2]&&i.ops.pop(),i.trys.pop();continue}s=e.call(t,i)}catch(u){s=[6,u],o=0}finally{r=n=0}if(5&s[0])throw s[1];return{value:s[0]?s[1]:void 0,done:!0}}([s,u])}}},r=this&&this.__importDefault||function(t){return t&&t.__esModule?t:{default:t}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.API=void 0;var o=require("./util"),n=r(require("./logger")),s=function(){function r(t){this._options=t}return r.prototype._buildUrl=function(t){var e=(this._options.secure?"https://":"http://")+this._options.host+":"+this._options.port+this._options.path+this._options.key+"/"+t;return e+="?ts="+(new Date).getTime()+Math.random()},r.prototype.retrieveId=function(){return t(this,void 0,Promise,function(){var t,r,s,i;return e(this,function(e){switch(e.label){case 0:t=this._buildUrl("id"),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,fetch(t)];case 2:if(200!==(r=e.sent()).status)throw new Error("Error. Status:"+r.status);return[2,r.text()];case 3:throw s=e.sent(),n.default.error("Error retrieving ID",s),i="","/"===this._options.path&&this._options.host!==o.util.CLOUD_HOST&&(i=" If you passed in a `path` to your self-hosted PeerServer, you'll also need to pass in that same path when creating a new Peer."),new Error("Could not get an ID from the server."+i);case 4:return[2]}})})},r.prototype.listAllPeers=function(){return t(this,void 0,Promise,function(){var t,r,s,i;return e(this,function(e){switch(e.label){case 0:t=this._buildUrl("peers"),e.label=1;case 1:return e.trys.push([1,3,,4]),[4,fetch(t)];case 2:if(200!==(r=e.sent()).status){if(401===r.status)throw s="",s=this._options.host===o.util.CLOUD_HOST?"It looks like you're using the cloud server. You can email team@peerjs.com to enable peer listing for your API key.":"You need to enable `allow_discovery` on your self-hosted PeerServer to use this feature.",new Error("It doesn't look like you have permission to list peers IDs. "+s);throw new Error("Error. Status:"+r.status)}return[2,r.json()];case 3:throw i=e.sent(),n.default.error("Error retrieving list peers",i),new Error("Could not get list peers from the server."+i);case 4:return[2]}})})},r}();exports.API=s;
|
||
-},{"./util":"BHXf","./logger":"WOs9"}],"Hxpd":[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 r(){this.constructor=t}e(t,n),t.prototype=null===n?Object.create(n):(r.prototype=n.prototype,new r)}}(),t=this&&this.__assign||function(){return(t=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var o in t=arguments[n])Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o]);return e}).apply(this,arguments)},n=this&&this.__values||function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=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;
|
||
-},{"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)
|
||
-//# sourceMappingURL=/peerjs.min.js.map
|
||
\ No newline at end of file
|
||
+"use strict";
|
||
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||
+ if (k2 === undefined) k2 = k;
|
||
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||
+}) : (function(o, m, k, k2) {
|
||
+ if (k2 === undefined) k2 = k;
|
||
+ o[k2] = m[k];
|
||
+}));
|
||
+var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
||
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+__exportStar(require("./index"), exports);
|
||
diff --git a/node_modules/peerjs/dist/peerjs.min.js.map b/node_modules/peerjs/dist/peerjs.min.js.map
|
||
deleted file mode 100644
|
||
index 14c2560..0000000
|
||
--- a/node_modules/peerjs/dist/peerjs.min.js.map
|
||
+++ /dev/null
|
||
@@ -1 +0,0 @@
|
||
-{"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:<pt> 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<object> = [];\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 = <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 = <DataConnection>(\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 = <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 = <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<void> {\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 = <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<void> {\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<void> {\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<void> {\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<string> {\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<any[]> {\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<string, BaseConnection[]> = new Map(); // All connections for this peer.\n private readonly _lostMessages: Map<string, ServerMessage[]> = 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<string,[]> \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(<any>window).peerjs = peerjs;\n/** @deprecated Should use peerjs namespace */\n(<any>window).Peer = Peer;\n"]}
|
||
\ No newline at end of file
|
||
diff --git a/node_modules/peerjs/dist/servermessage.js b/node_modules/peerjs/dist/servermessage.js
|
||
new file mode 100644
|
||
index 0000000..3cee119
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/servermessage.js
|
||
@@ -0,0 +1,9 @@
|
||
+"use strict";
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.ServerMessage = void 0;
|
||
+var ServerMessage = /** @class */ (function () {
|
||
+ function ServerMessage() {
|
||
+ }
|
||
+ return ServerMessage;
|
||
+}());
|
||
+exports.ServerMessage = ServerMessage;
|
||
diff --git a/node_modules/peerjs/dist/socket.js b/node_modules/peerjs/dist/socket.js
|
||
new file mode 100644
|
||
index 0000000..fcc4000
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/socket.js
|
||
@@ -0,0 +1,155 @@
|
||
+"use strict";
|
||
+var __extends = (this && this.__extends) || (function () {
|
||
+ var extendStatics = function (d, b) {
|
||
+ extendStatics = Object.setPrototypeOf ||
|
||
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
||
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
|
||
+ return extendStatics(d, b);
|
||
+ };
|
||
+ return function (d, b) {
|
||
+ if (typeof b !== "function" && b !== null)
|
||
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
||
+ extendStatics(d, b);
|
||
+ function __() { this.constructor = d; }
|
||
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||
+ };
|
||
+})();
|
||
+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];
|
||
+ return to;
|
||
+};
|
||
+var __importDefault = (this && this.__importDefault) || function (mod) {
|
||
+ return (mod && mod.__esModule) ? mod : { "default": mod };
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.Socket = void 0;
|
||
+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.
|
||
+ */
|
||
+var Socket = /** @class */ (function (_super) {
|
||
+ __extends(Socket, _super);
|
||
+ function Socket(secure, host, port, path, key, pingInterval) {
|
||
+ if (pingInterval === void 0) { pingInterval = 5000; }
|
||
+ var _this = _super.call(this) || this;
|
||
+ _this.pingInterval = pingInterval;
|
||
+ _this._disconnected = true;
|
||
+ _this._messagesQueue = [];
|
||
+ var wsProtocol = secure ? "wss://" : "ws://";
|
||
+ _this._baseUrl = wsProtocol + host + ":" + port + path + "peerjs?key=" + key;
|
||
+ return _this;
|
||
+ }
|
||
+ Socket.prototype.start = function (id, token) {
|
||
+ var _this = this;
|
||
+ this._id = id;
|
||
+ var wsUrl = this._baseUrl + "&id=" + id + "&token=" + token;
|
||
+ if (!!this._socket || !this._disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ this._socket = new WebSocket(wsUrl);
|
||
+ this._disconnected = false;
|
||
+ this._socket.onmessage = function (event) {
|
||
+ var data;
|
||
+ try {
|
||
+ data = JSON.parse(event.data);
|
||
+ logger_1.default.log("Server message received:", data);
|
||
+ }
|
||
+ catch (e) {
|
||
+ logger_1.default.log("Invalid server message", event.data);
|
||
+ return;
|
||
+ }
|
||
+ _this.emit(enums_1.SocketEventType.Message, data);
|
||
+ };
|
||
+ this._socket.onclose = function (event) {
|
||
+ if (_this._disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ logger_1.default.log("Socket closed.", event);
|
||
+ _this._cleanup();
|
||
+ _this._disconnected = true;
|
||
+ _this.emit(enums_1.SocketEventType.Disconnected);
|
||
+ };
|
||
+ // Take care of the queue of connections if necessary and make sure Peer knows
|
||
+ // socket is open.
|
||
+ this._socket.onopen = function () {
|
||
+ if (_this._disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ _this._sendQueuedMessages();
|
||
+ logger_1.default.log("Socket open");
|
||
+ _this._scheduleHeartbeat();
|
||
+ };
|
||
+ };
|
||
+ Socket.prototype._scheduleHeartbeat = function () {
|
||
+ var _this = this;
|
||
+ this._wsPingTimer = setTimeout(function () {
|
||
+ _this._sendHeartbeat();
|
||
+ }, this.pingInterval);
|
||
+ };
|
||
+ Socket.prototype._sendHeartbeat = function () {
|
||
+ if (!this._wsOpen()) {
|
||
+ logger_1.default.log("Cannot send heartbeat, because socket closed");
|
||
+ return;
|
||
+ }
|
||
+ var message = JSON.stringify({ type: enums_1.ServerMessageType.Heartbeat });
|
||
+ this._socket.send(message);
|
||
+ this._scheduleHeartbeat();
|
||
+ };
|
||
+ /** Is the websocket currently open? */
|
||
+ Socket.prototype._wsOpen = function () {
|
||
+ return !!this._socket && this._socket.readyState === 1;
|
||
+ };
|
||
+ /** Send queued messages. */
|
||
+ Socket.prototype._sendQueuedMessages = function () {
|
||
+ //Create copy of queue and clear it,
|
||
+ //because send method push the message back to queue if smth will go wrong
|
||
+ var copiedQueue = __spreadArray([], this._messagesQueue);
|
||
+ this._messagesQueue = [];
|
||
+ for (var _i = 0, copiedQueue_1 = copiedQueue; _i < copiedQueue_1.length; _i++) {
|
||
+ var message = copiedQueue_1[_i];
|
||
+ this.send(message);
|
||
+ }
|
||
+ };
|
||
+ /** Exposed send for DC & Peer. */
|
||
+ Socket.prototype.send = function (data) {
|
||
+ if (this._disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ // If we didn't get an ID yet, we can't yet send anything so we should queue
|
||
+ // up these messages.
|
||
+ if (!this._id) {
|
||
+ this._messagesQueue.push(data);
|
||
+ return;
|
||
+ }
|
||
+ if (!data.type) {
|
||
+ this.emit(enums_1.SocketEventType.Error, "Invalid message");
|
||
+ return;
|
||
+ }
|
||
+ if (!this._wsOpen()) {
|
||
+ return;
|
||
+ }
|
||
+ var message = JSON.stringify(data);
|
||
+ this._socket.send(message);
|
||
+ };
|
||
+ Socket.prototype.close = function () {
|
||
+ if (this._disconnected) {
|
||
+ return;
|
||
+ }
|
||
+ this._cleanup();
|
||
+ this._disconnected = true;
|
||
+ };
|
||
+ Socket.prototype._cleanup = function () {
|
||
+ if (this._socket) {
|
||
+ this._socket.onopen = this._socket.onmessage = this._socket.onclose = null;
|
||
+ this._socket.close();
|
||
+ this._socket = undefined;
|
||
+ }
|
||
+ clearTimeout(this._wsPingTimer);
|
||
+ };
|
||
+ return Socket;
|
||
+}(eventemitter3_1.EventEmitter));
|
||
+exports.Socket = Socket;
|
||
diff --git a/node_modules/peerjs/dist/supports.js b/node_modules/peerjs/dist/supports.js
|
||
new file mode 100644
|
||
index 0000000..92fe0df
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/supports.js
|
||
@@ -0,0 +1,64 @@
|
||
+"use strict";
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.Supports = void 0;
|
||
+var adapter_1 = require("./adapter");
|
||
+exports.Supports = new /** @class */ (function () {
|
||
+ function class_1() {
|
||
+ this.isIOS = ['iPad', 'iPhone', 'iPod'].includes(navigator.platform);
|
||
+ this.supportedBrowsers = ['firefox', 'chrome', 'safari'];
|
||
+ this.minFirefoxVersion = 59;
|
||
+ this.minChromeVersion = 72;
|
||
+ this.minSafariVersion = 605;
|
||
+ }
|
||
+ class_1.prototype.isWebRTCSupported = function () {
|
||
+ return typeof RTCPeerConnection !== 'undefined';
|
||
+ };
|
||
+ class_1.prototype.isBrowserSupported = function () {
|
||
+ var browser = this.getBrowser();
|
||
+ var version = this.getVersion();
|
||
+ var validBrowser = this.supportedBrowsers.includes(browser);
|
||
+ if (!validBrowser)
|
||
+ return false;
|
||
+ if (browser === 'chrome')
|
||
+ return version >= this.minChromeVersion;
|
||
+ if (browser === 'firefox')
|
||
+ return version >= this.minFirefoxVersion;
|
||
+ if (browser === 'safari')
|
||
+ return !this.isIOS && version >= this.minSafariVersion;
|
||
+ return false;
|
||
+ };
|
||
+ class_1.prototype.getBrowser = function () {
|
||
+ return adapter_1.webRTCAdapter.browserDetails.browser;
|
||
+ };
|
||
+ class_1.prototype.getVersion = function () {
|
||
+ return adapter_1.webRTCAdapter.browserDetails.version || 0;
|
||
+ };
|
||
+ 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 (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype))
|
||
+ return false;
|
||
+ var tempPc;
|
||
+ var supported = false;
|
||
+ try {
|
||
+ tempPc = new RTCPeerConnection();
|
||
+ tempPc.addTransceiver('audio');
|
||
+ supported = true;
|
||
+ }
|
||
+ catch (e) { }
|
||
+ finally {
|
||
+ if (tempPc) {
|
||
+ tempPc.close();
|
||
+ }
|
||
+ }
|
||
+ return supported;
|
||
+ };
|
||
+ 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 class_1;
|
||
+}());
|
||
diff --git a/node_modules/peerjs/dist/util.js b/node_modules/peerjs/dist/util.js
|
||
new file mode 100644
|
||
index 0000000..ce7f523
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/dist/util.js
|
||
@@ -0,0 +1,150 @@
|
||
+"use strict";
|
||
+var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
||
+ if (k2 === undefined) k2 = k;
|
||
+ Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
||
+}) : (function(o, m, k, k2) {
|
||
+ if (k2 === undefined) k2 = k;
|
||
+ o[k2] = m[k];
|
||
+}));
|
||
+var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
||
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
|
||
+}) : function(o, v) {
|
||
+ o["default"] = v;
|
||
+});
|
||
+var __importStar = (this && this.__importStar) || function (mod) {
|
||
+ if (mod && mod.__esModule) return mod;
|
||
+ var result = {};
|
||
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
||
+ __setModuleDefault(result, mod);
|
||
+ return result;
|
||
+};
|
||
+Object.defineProperty(exports, "__esModule", { value: true });
|
||
+exports.util = void 0;
|
||
+var BinaryPack = __importStar(require("peerjs-js-binarypack"));
|
||
+var supports_1 = require("./supports");
|
||
+var DEFAULT_CONFIG = {
|
||
+ iceServers: [
|
||
+ { urls: "stun:stun.l.google.com:19302" },
|
||
+ { urls: "turn:0.peerjs.com:3478", username: "peerjs", credential: "peerjsp" }
|
||
+ ],
|
||
+ sdpSemantics: "unified-plan"
|
||
+};
|
||
+exports.util = new /** @class */ (function () {
|
||
+ function class_1() {
|
||
+ this.CLOUD_HOST = "0.peerjs.com";
|
||
+ this.CLOUD_PORT = 443;
|
||
+ // Browsers that need chunking:
|
||
+ this.chunkedBrowsers = { Chrome: 1, chrome: 1 };
|
||
+ this.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.
|
||
+ // Returns browser-agnostic default config
|
||
+ this.defaultConfig = DEFAULT_CONFIG;
|
||
+ this.browser = supports_1.Supports.getBrowser();
|
||
+ this.browserVersion = supports_1.Supports.getVersion();
|
||
+ // Lists which features are supported
|
||
+ this.supports = (function () {
|
||
+ var supported = {
|
||
+ browser: supports_1.Supports.isBrowserSupported(),
|
||
+ webRTC: supports_1.Supports.isWebRTCSupported(),
|
||
+ audioVideo: false,
|
||
+ data: false,
|
||
+ binaryBlob: false,
|
||
+ reliable: false,
|
||
+ };
|
||
+ if (!supported.webRTC)
|
||
+ return supported;
|
||
+ var pc;
|
||
+ try {
|
||
+ pc = new RTCPeerConnection(DEFAULT_CONFIG);
|
||
+ supported.audioVideo = true;
|
||
+ var dc = void 0;
|
||
+ try {
|
||
+ dc = pc.createDataChannel("_PEERJSTEST", { ordered: true });
|
||
+ supported.data = true;
|
||
+ supported.reliable = !!dc.ordered;
|
||
+ // Binary test
|
||
+ try {
|
||
+ dc.binaryType = "blob";
|
||
+ supported.binaryBlob = !supports_1.Supports.isIOS;
|
||
+ }
|
||
+ catch (e) {
|
||
+ }
|
||
+ }
|
||
+ catch (e) {
|
||
+ }
|
||
+ finally {
|
||
+ // @ts-ignore
|
||
+ if (dc) {
|
||
+ dc.close();
|
||
+ }
|
||
+ }
|
||
+ }
|
||
+ catch (e) {
|
||
+ }
|
||
+ finally {
|
||
+ // @ts-ignore
|
||
+ if (pc) {
|
||
+ pc.close();
|
||
+ }
|
||
+ }
|
||
+ return supported;
|
||
+ })();
|
||
+ this.pack = BinaryPack.pack;
|
||
+ this.unpack = BinaryPack.unpack;
|
||
+ // Binary stuff
|
||
+ this._dataCount = 1;
|
||
+ }
|
||
+ class_1.prototype.noop = function () { };
|
||
+ // Ensure alphanumeric ids
|
||
+ class_1.prototype.validateId = function (id) {
|
||
+ // Allow empty ids
|
||
+ return !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);
|
||
+ };
|
||
+ class_1.prototype.chunk = function (blob) {
|
||
+ var chunks = [];
|
||
+ var size = blob.size;
|
||
+ var total = Math.ceil(size / exports.util.chunkedMTU);
|
||
+ var index = 0;
|
||
+ var start = 0;
|
||
+ while (start < size) {
|
||
+ var end = Math.min(size, start + exports.util.chunkedMTU);
|
||
+ var b = blob.slice(start, end);
|
||
+ var chunk = {
|
||
+ __peerData: this._dataCount,
|
||
+ n: index,
|
||
+ data: b,
|
||
+ total: total,
|
||
+ };
|
||
+ chunks.push(chunk);
|
||
+ start = end;
|
||
+ index++;
|
||
+ }
|
||
+ this._dataCount++;
|
||
+ return chunks;
|
||
+ };
|
||
+ class_1.prototype.blobToArrayBuffer = function (blob, cb) {
|
||
+ var fr = new FileReader();
|
||
+ fr.onload = function (evt) {
|
||
+ if (evt.target) {
|
||
+ cb(evt.target.result);
|
||
+ }
|
||
+ };
|
||
+ fr.readAsArrayBuffer(blob);
|
||
+ return fr;
|
||
+ };
|
||
+ class_1.prototype.binaryStringToArrayBuffer = function (binary) {
|
||
+ var byteArray = new Uint8Array(binary.length);
|
||
+ for (var i = 0; i < binary.length; i++) {
|
||
+ byteArray[i] = binary.charCodeAt(i) & 0xff;
|
||
+ }
|
||
+ return byteArray.buffer;
|
||
+ };
|
||
+ class_1.prototype.randomToken = function () {
|
||
+ return Math.random()
|
||
+ .toString(36)
|
||
+ .substr(2);
|
||
+ };
|
||
+ class_1.prototype.isSecure = function () {
|
||
+ return location.protocol === "https:";
|
||
+ };
|
||
+ return class_1;
|
||
+}());
|
||
diff --git a/node_modules/peerjs/lib/baseconnection.ts b/node_modules/peerjs/lib/baseconnection.ts
|
||
index 8256fed..6ba8577 100644
|
||
--- a/node_modules/peerjs/lib/baseconnection.ts
|
||
+++ b/node_modules/peerjs/lib/baseconnection.ts
|
||
@@ -7,8 +7,10 @@ export abstract class BaseConnection extends EventEmitter {
|
||
protected _open = false;
|
||
|
||
readonly metadata: any;
|
||
+ // @ts-ignore
|
||
connectionId: string;
|
||
|
||
+ // @ts-ignore
|
||
peerConnection: RTCPeerConnection;
|
||
|
||
abstract get type(): ConnectionType;
|
||
diff --git a/node_modules/peerjs/lib/dataconnection.ts b/node_modules/peerjs/lib/dataconnection.ts
|
||
index aec3c05..a30e090 100644
|
||
--- a/node_modules/peerjs/lib/dataconnection.ts
|
||
+++ b/node_modules/peerjs/lib/dataconnection.ts
|
||
@@ -16,6 +16,7 @@ import { DataConnection as IDataConnection } from '../index';
|
||
/**
|
||
* Wraps a DataChannel between two Peers.
|
||
*/
|
||
+// @ts-ignore
|
||
export class DataConnection extends BaseConnection implements IDataConnection {
|
||
private static readonly ID_PREFIX = "dc_";
|
||
private static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;
|
||
@@ -42,6 +43,7 @@ export class DataConnection extends BaseConnection implements IDataConnection {
|
||
}
|
||
} = {};
|
||
|
||
+ // @ts-ignore
|
||
private _dc: RTCDataChannel;
|
||
private _encodingQueue = new EncodingQueue();
|
||
|
||
@@ -120,6 +122,7 @@ export class DataConnection extends BaseConnection implements IDataConnection {
|
||
if (datatype === Blob) {
|
||
// Datatype should never be blob
|
||
util.blobToArrayBuffer(data as Blob, (ab) => {
|
||
+ // @ts-ignore
|
||
const unpackedData = util.unpack(ab);
|
||
this.emit(ConnectionEventType.Data, unpackedData);
|
||
});
|
||
@@ -179,12 +182,14 @@ export class DataConnection extends BaseConnection implements IDataConnection {
|
||
|
||
if (this._negotiator) {
|
||
this._negotiator.cleanup();
|
||
+ // @ts-ignore
|
||
this._negotiator = null;
|
||
}
|
||
|
||
if (this.provider) {
|
||
this.provider._removeConnection(this);
|
||
|
||
+ // @ts-ignore
|
||
this.provider = null;
|
||
}
|
||
|
||
@@ -192,12 +197,14 @@ export class DataConnection extends BaseConnection implements IDataConnection {
|
||
this.dataChannel.onopen = null;
|
||
this.dataChannel.onmessage = null;
|
||
this.dataChannel.onclose = null;
|
||
+ // @ts-ignore
|
||
this._dc = null;
|
||
}
|
||
|
||
if (this._encodingQueue) {
|
||
this._encodingQueue.destroy();
|
||
this._encodingQueue.removeAllListeners();
|
||
+ // @ts-ignore
|
||
this._encodingQueue = null;
|
||
}
|
||
|
||
diff --git a/node_modules/peerjs/lib/encodingQueue.ts b/node_modules/peerjs/lib/encodingQueue.ts
|
||
index f0b3e40..7322ecf 100644
|
||
--- a/node_modules/peerjs/lib/encodingQueue.ts
|
||
+++ b/node_modules/peerjs/lib/encodingQueue.ts
|
||
@@ -59,6 +59,7 @@ export class EncodingQueue extends EventEmitter {
|
||
|
||
this._processing = true;
|
||
|
||
+ // @ts-ignore
|
||
this.fileReader.readAsArrayBuffer(this.queue.shift());
|
||
}
|
||
}
|
||
\ No newline at end of file
|
||
diff --git a/node_modules/peerjs/lib/index.ts b/node_modules/peerjs/lib/index.ts
|
||
new file mode 100644
|
||
index 0000000..a613237
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/lib/index.ts
|
||
@@ -0,0 +1,15 @@
|
||
+export * from './adapter';
|
||
+export * from './api';
|
||
+export * from './baseconnection';
|
||
+export * from './dataconnection';
|
||
+export * from './encodingQueue';
|
||
+export * from './enums';
|
||
+export * from './exports';
|
||
+export * from './logger';
|
||
+export * from './mediaconnection';
|
||
+export * from './negotiator';
|
||
+export * from './peer';
|
||
+export * from './servermessage';
|
||
+export * from './socket';
|
||
+export * from './supports';
|
||
+export * from './util';
|
||
diff --git a/node_modules/peerjs/lib/mediaconnection.ts b/node_modules/peerjs/lib/mediaconnection.ts
|
||
index 2f5d0ff..df160e2 100644
|
||
--- a/node_modules/peerjs/lib/mediaconnection.ts
|
||
+++ b/node_modules/peerjs/lib/mediaconnection.ts
|
||
@@ -15,6 +15,7 @@ export class MediaConnection extends BaseConnection {
|
||
|
||
private _negotiator: Negotiator;
|
||
private _localStream: MediaStream;
|
||
+// @ts-ignore
|
||
private _remoteStream: MediaStream;
|
||
|
||
get type() {
|
||
@@ -42,6 +43,7 @@ export class MediaConnection extends BaseConnection {
|
||
}
|
||
}
|
||
|
||
+// @ts-ignore
|
||
addStream(remoteStream) {
|
||
logger.log("Receiving stream", remoteStream);
|
||
|
||
@@ -101,15 +103,19 @@ export class MediaConnection extends BaseConnection {
|
||
close(): void {
|
||
if (this._negotiator) {
|
||
this._negotiator.cleanup();
|
||
+// @ts-ignore
|
||
this._negotiator = null;
|
||
}
|
||
|
||
+// @ts-ignore
|
||
this._localStream = null;
|
||
+// @ts-ignore
|
||
this._remoteStream = null;
|
||
|
||
if (this.provider) {
|
||
this.provider._removeConnection(this);
|
||
|
||
+// @ts-ignore
|
||
this.provider = null;
|
||
}
|
||
|
||
diff --git a/node_modules/peerjs/lib/negotiator.ts b/node_modules/peerjs/lib/negotiator.ts
|
||
index 26e7044..226f8b8 100644
|
||
--- a/node_modules/peerjs/lib/negotiator.ts
|
||
+++ b/node_modules/peerjs/lib/negotiator.ts
|
||
@@ -143,6 +143,7 @@ export class Negotiator {
|
||
const stream = evt.streams[0];
|
||
const connection = provider.getConnection(peerId, connectionId);
|
||
|
||
+// @ts-ignore
|
||
if (connection.type === ConnectionType.Media) {
|
||
const mediaConnection = <MediaConnection>connection;
|
||
|
||
@@ -160,6 +161,7 @@ export class Negotiator {
|
||
return;
|
||
}
|
||
|
||
+// @ts-ignore
|
||
this.connection.peerConnection = null;
|
||
|
||
//unsubscribe from all PeerConnection's events
|
||
diff --git a/node_modules/peerjs/lib/peer.ts b/node_modules/peerjs/lib/peer.ts
|
||
index 8f11659..565733b 100644
|
||
--- a/node_modules/peerjs/lib/peer.ts
|
||
+++ b/node_modules/peerjs/lib/peer.ts
|
||
@@ -72,6 +72,7 @@ export class Peer extends EventEmitter {
|
||
get connections(): Object {
|
||
const plainConnections = Object.create(null);
|
||
|
||
+// @ts-ignore
|
||
for (let [k, v] of this._connections) {
|
||
plainConnections[k] = v;
|
||
}
|
||
@@ -312,6 +313,7 @@ export class Peer extends EventEmitter {
|
||
this._lostMessages.set(connectionId, []);
|
||
}
|
||
|
||
+// @ts-ignore
|
||
this._lostMessages.get(connectionId).push(message);
|
||
}
|
||
|
||
@@ -344,6 +346,7 @@ export class Peer extends EventEmitter {
|
||
PeerErrorType.Disconnected,
|
||
"Cannot connect to new Peer after disconnecting from server."
|
||
);
|
||
+// @ts-ignore
|
||
return;
|
||
}
|
||
|
||
@@ -367,6 +370,7 @@ export class Peer extends EventEmitter {
|
||
PeerErrorType.Disconnected,
|
||
"Cannot connect to new Peer after disconnecting from server."
|
||
);
|
||
+// @ts-ignore
|
||
return;
|
||
}
|
||
|
||
@@ -374,6 +378,7 @@ export class Peer extends EventEmitter {
|
||
logger.error(
|
||
"To call a peer, you must provide a stream from your browser's `getUserMedia`."
|
||
);
|
||
+// @ts-ignore
|
||
return;
|
||
}
|
||
|
||
@@ -391,6 +396,7 @@ export class Peer extends EventEmitter {
|
||
if (!this._connections.has(peerId)) {
|
||
this._connections.set(peerId, []);
|
||
}
|
||
+// @ts-ignore
|
||
this._connections.get(peerId).push(connection);
|
||
}
|
||
|
||
@@ -489,6 +495,7 @@ export class Peer extends EventEmitter {
|
||
|
||
/** Disconnects every connection on this peer. */
|
||
private _cleanup(): void {
|
||
+// @ts-ignore
|
||
for (let peerId of this._connections.keys()) {
|
||
this._cleanupPeer(peerId);
|
||
this._connections.delete(peerId);
|
||
diff --git a/node_modules/peerjs/lib/peerjs.min.ts b/node_modules/peerjs/lib/peerjs.min.ts
|
||
new file mode 100644
|
||
index 0000000..ea465c2
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/lib/peerjs.min.ts
|
||
@@ -0,0 +1 @@
|
||
+export * from './index';
|
||
diff --git a/node_modules/peerjs/lib/servermessage.ts b/node_modules/peerjs/lib/servermessage.ts
|
||
index 7e0b577..4bcbbca 100644
|
||
--- a/node_modules/peerjs/lib/servermessage.ts
|
||
+++ b/node_modules/peerjs/lib/servermessage.ts
|
||
@@ -1,7 +1,9 @@
|
||
import { ServerMessageType } from "./enums";
|
||
|
||
export class ServerMessage {
|
||
+ // @ts-ignore
|
||
type: ServerMessageType;
|
||
payload: any;
|
||
+ // @ts-ignore
|
||
src: string;
|
||
}
|
||
diff --git a/node_modules/peerjs/lib/supports.ts b/node_modules/peerjs/lib/supports.ts
|
||
index ff5b6d6..6a7e431 100644
|
||
--- a/node_modules/peerjs/lib/supports.ts
|
||
+++ b/node_modules/peerjs/lib/supports.ts
|
||
@@ -43,7 +43,7 @@ export const Supports = new class {
|
||
if (browser === 'firefox' && version >= 59) return true;
|
||
if (!window.RTCRtpTransceiver || !('currentDirection' in RTCRtpTransceiver.prototype)) return false;
|
||
|
||
- let tempPc: RTCPeerConnection;
|
||
+ let tempPc: RTCPeerConnection | undefined;
|
||
let supported = false;
|
||
|
||
try {
|
||
diff --git a/node_modules/peerjs/lib/util.ts b/node_modules/peerjs/lib/util.ts
|
||
index c2cf7a1..d6ec8f2 100644
|
||
--- a/node_modules/peerjs/lib/util.ts
|
||
+++ b/node_modules/peerjs/lib/util.ts
|
||
@@ -61,12 +61,14 @@ export const util = new class {
|
||
}
|
||
} catch (e) {
|
||
} finally {
|
||
+// @ts-ignore
|
||
if (dc) {
|
||
dc.close();
|
||
}
|
||
}
|
||
} catch (e) {
|
||
} finally {
|
||
+// @ts-ignore
|
||
if (pc) {
|
||
pc.close();
|
||
}
|
||
diff --git a/node_modules/peerjs/tsconfig.json b/node_modules/peerjs/tsconfig.json
|
||
new file mode 100644
|
||
index 0000000..c138caf
|
||
--- /dev/null
|
||
+++ b/node_modules/peerjs/tsconfig.json
|
||
@@ -0,0 +1,75 @@
|
||
+{
|
||
+ "compilerOptions": {
|
||
+ /* Visit https://aka.ms/tsconfig.json to read more about this file */
|
||
+
|
||
+ /* Basic Options */
|
||
+ // "incremental": true, /* Enable incremental compilation */
|
||
+ "target": "es5", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019', 'ES2020', or 'ESNEXT'. */
|
||
+ "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', 'es2020', or 'ESNext'. */
|
||
+ // "lib": [], /* Specify library files to be included in the compilation. */
|
||
+ // "allowJs": true, /* Allow javascript files to be compiled. */
|
||
+ // "checkJs": true, /* Report errors in .js files. */
|
||
+ // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', 'react', 'react-jsx' or 'react-jsxdev'. */
|
||
+ // "declaration": true, /* Generates corresponding '.d.ts' file. */
|
||
+ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */
|
||
+ // "sourceMap": true, /* Generates corresponding '.map' file. */
|
||
+ // "outFile": "./", /* Concatenate and emit output to single file. */
|
||
+ "outDir": "./dist", /* Redirect output structure to the directory. */
|
||
+ // "rootDir": "./", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */
|
||
+ // "composite": true, /* Enable project compilation */
|
||
+ // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */
|
||
+ // "removeComments": true, /* Do not emit comments to output. */
|
||
+ // "noEmit": true, /* Do not emit outputs. */
|
||
+ // "importHelpers": true, /* Import emit helpers from 'tslib'. */
|
||
+ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */
|
||
+ // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */
|
||
+
|
||
+ /* Strict Type-Checking Options */
|
||
+ "strict": true, /* Enable all strict type-checking options. */
|
||
+ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */
|
||
+ // "strictNullChecks": true, /* Enable strict null checks. */
|
||
+ // "strictFunctionTypes": true, /* Enable strict checking of function types. */
|
||
+ // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */
|
||
+ // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */
|
||
+ // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */
|
||
+ // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */
|
||
+
|
||
+ /* Additional Checks */
|
||
+ "noUnusedLocals": false, /* Report errors on unused locals. */
|
||
+ "noUnusedParameters": false, /* Report errors on unused parameters. */
|
||
+ "noImplicitReturns": false, /* Report error when not all code paths in function return a value. */
|
||
+ "noFallthroughCasesInSwitch": false, /* Report errors for fallthrough cases in switch statement. */
|
||
+ "noUncheckedIndexedAccess": false, /* Include 'undefined' in index signature results */
|
||
+ "noPropertyAccessFromIndexSignature": false, /* Require undeclared properties from index signatures to use element accesses. */
|
||
+
|
||
+ /* Module Resolution Options */
|
||
+ // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */
|
||
+ // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */
|
||
+ // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */
|
||
+ // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */
|
||
+ // "typeRoots": [], /* List of folders to include type definitions from. */
|
||
+ // "types": [], /* Type declaration files to be included in compilation. */
|
||
+ // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */
|
||
+ "esModuleInterop": true, /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */
|
||
+ // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */
|
||
+ // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */
|
||
+
|
||
+ /* Source Map Options */
|
||
+ // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */
|
||
+ // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */
|
||
+ // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */
|
||
+ // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */
|
||
+
|
||
+ /* Experimental Options */
|
||
+ // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */
|
||
+ // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */
|
||
+
|
||
+ /* Advanced Options */
|
||
+ "skipLibCheck": true, /* Skip type checking of declaration files. */
|
||
+ "forceConsistentCasingInFileNames": true /* Disallow inconsistently-cased references to the same file. */
|
||
+ },
|
||
+ "include": [
|
||
+ "index.d.ts",
|
||
+ "lib"
|
||
+ ]
|
||
+}
|