{"mappings":"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","sources":["node_modules/peerjs-js-binarypack/lib/bufferbuilder.js","node_modules/@swc/helpers/src/_define_property.js","node_modules/@swc/helpers/src/_array_like_to_array.js","node_modules/@swc/helpers/src/_sliced_to_array.js","node_modules/@swc/helpers/src/_array_with_holes.js","node_modules/@swc/helpers/src/_iterable_to_array.js","node_modules/@swc/helpers/src/_unsupported_iterable_to_array.js","node_modules/@swc/helpers/src/_non_iterable_rest.js","node_modules/@swc/helpers/src/_type_of.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/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/edge/filtericeservers.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_core.js","lib/supports.ts","lib/util.ts","node_modules/webrtc-adapter/src/js/adapter_factory.js","node_modules/eventemitter3/index.js","lib/logger.ts","lib/enums.ts","package.json","lib/socket.ts","lib/negotiator.ts","lib/baseconnection.ts","lib/mediaconnection.ts","lib/encodingQueue.ts","lib/dataconnection.ts","lib/api.ts","lib/peer.ts","lib/global.ts"],"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","export default function _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n","export default function _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n  return arr2;\n}\n","import arrayWithHoles from './_array_with_holes';\nimport iterableToArrayLimit from './_iterable_to_array';\nimport nonIterableRest from './_non_iterable_rest';\nimport unsupportedIterableToArray from './_unsupported_iterable_to_array';\n\nexport default function _slicedToArray(arr, i) {\n  return arrayWithHoles(arr) || iterableToArrayLimit(arr, i) || unsupportedIterableToArray(arr, i) || nonIterableRest();\n}\n","export default function _arrayWithHoles(arr) {\n  if (Array.isArray(arr)) return arr;\n}\n","export default function _iterableToArray(iter) {\n  if (typeof Symbol !== \"undefined\" && iter[Symbol.iterator] != null || iter[\"@@iterator\"] != null) return Array.from(iter);\n}\n","import _arrayLikeToArray from './_array_like_to_array';\n\nexport default function _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(n);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))\n    return _arrayLikeToArray(o, minLen);\n}\n","export default function _nonIterableRest() {\n  throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n","export default function _typeof(obj) {\n    \"@swc/helpers - typeof\";\n    return obj && obj.constructor === Symbol ? \"symbol\" : typeof obj;\n};\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","/* 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) 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","/*\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 */\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_import from \"webrtc-adapter\";\n\nconst webRTCAdapter: typeof webRTCAdapter_import =\n\t//@ts-ignore\n\twebRTCAdapter_import.default || webRTCAdapter_import;\n\nexport const Supports = new (class {\n\treadonly isIOS = [\"iPad\", \"iPhone\", \"iPod\"].includes(navigator.platform);\n\treadonly supportedBrowsers = [\"firefox\", \"chrome\", \"safari\"];\n\n\treadonly minFirefoxVersion = 59;\n\treadonly minChromeVersion = 72;\n\treadonly minSafariVersion = 605;\n\n\tisWebRTCSupported(): boolean {\n\t\treturn typeof RTCPeerConnection !== \"undefined\";\n\t}\n\n\tisBrowserSupported(): boolean {\n\t\tconst browser = this.getBrowser();\n\t\tconst version = this.getVersion();\n\n\t\tconst validBrowser = this.supportedBrowsers.includes(browser);\n\n\t\tif (!validBrowser) return false;\n\n\t\tif (browser === \"chrome\") return version >= this.minChromeVersion;\n\t\tif (browser === \"firefox\") return version >= this.minFirefoxVersion;\n\t\tif (browser === \"safari\")\n\t\t\treturn !this.isIOS && version >= this.minSafariVersion;\n\n\t\treturn false;\n\t}\n\n\tgetBrowser(): string {\n\t\treturn webRTCAdapter.browserDetails.browser;\n\t}\n\n\tgetVersion(): number {\n\t\treturn webRTCAdapter.browserDetails.version || 0;\n\t}\n\n\tisUnifiedPlanSupported(): boolean {\n\t\tconst browser = this.getBrowser();\n\t\tconst version = webRTCAdapter.browserDetails.version || 0;\n\n\t\tif (browser === \"chrome\" && version < this.minChromeVersion) return false;\n\t\tif (browser === \"firefox\" && version >= this.minFirefoxVersion) return true;\n\t\tif (\n\t\t\t!window.RTCRtpTransceiver ||\n\t\t\t!(\"currentDirection\" in RTCRtpTransceiver.prototype)\n\t\t)\n\t\t\treturn false;\n\n\t\tlet tempPc: RTCPeerConnection;\n\t\tlet supported = false;\n\n\t\ttry {\n\t\t\ttempPc = new RTCPeerConnection();\n\t\t\ttempPc.addTransceiver(\"audio\");\n\t\t\tsupported = true;\n\t\t} catch (e) {\n\t\t} finally {\n\t\t\tif (tempPc) {\n\t\t\t\ttempPc.close();\n\t\t\t}\n\t\t}\n\n\t\treturn supported;\n\t}\n\n\ttoString(): string {\n\t\treturn `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\t}\n})();\n","// Types aren’t accurate\n//@ts-ignore\nimport BinaryPack from \"peerjs-js-binarypack\";\nimport { Supports } from \"./supports\";\n\nexport interface UtilSupportsObj {\n\tbrowser: boolean;\n\twebRTC: boolean;\n\taudioVideo: boolean;\n\tdata: boolean;\n\tbinaryBlob: boolean;\n\treliable: boolean;\n}\n\nconst DEFAULT_CONFIG = {\n\ticeServers: [\n\t\t{ urls: \"stun:stun.l.google.com:19302\" },\n\t\t{\n\t\t\turls: [\n\t\t\t\t\"turn:eu-0.turn.peerjs.com:3478\",\n\t\t\t\t\"turn:eu-1.turn.peerjs.com:3478\",\n\t\t\t],\n\t\t\tusername: \"peerjs\",\n\t\t\tcredential: \"peerjsp\",\n\t\t},\n\t\t{\n\t\t\turls: [\n\t\t\t\t\"turn:us-0.turn.peerjs.com:3478\",\n\t\t\t\t\"turn:us-1.turn.peerjs.com:3478\",\n\t\t\t],\n\t\t\tusername: \"peerjs\",\n\t\t\tcredential: \"peerjsp\",\n\t\t},\n\t],\n\tsdpSemantics: \"unified-plan\",\n};\n\nclass Util {\n\tnoop(): void {}\n\n\treadonly CLOUD_HOST = \"0.peerjs.com\";\n\treadonly CLOUD_PORT = 443;\n\n\t// Browsers that need chunking:\n\treadonly chunkedBrowsers = { Chrome: 1, chrome: 1 };\n\treadonly 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\t// Returns browser-agnostic default config\n\treadonly defaultConfig = DEFAULT_CONFIG;\n\n\treadonly browser = Supports.getBrowser();\n\treadonly browserVersion = Supports.getVersion();\n\n\t// Lists which features are supported\n\treadonly supports = (function () {\n\t\tconst supported: UtilSupportsObj = {\n\t\t\tbrowser: Supports.isBrowserSupported(),\n\t\t\twebRTC: Supports.isWebRTCSupported(),\n\t\t\taudioVideo: false,\n\t\t\tdata: false,\n\t\t\tbinaryBlob: false,\n\t\t\treliable: false,\n\t\t};\n\n\t\tif (!supported.webRTC) return supported;\n\n\t\tlet pc: RTCPeerConnection;\n\n\t\ttry {\n\t\t\tpc = new RTCPeerConnection(DEFAULT_CONFIG);\n\n\t\t\tsupported.audioVideo = true;\n\n\t\t\tlet dc: RTCDataChannel;\n\n\t\t\ttry {\n\t\t\t\tdc = pc.createDataChannel(\"_PEERJSTEST\", { ordered: true });\n\t\t\t\tsupported.data = true;\n\t\t\t\tsupported.reliable = !!dc.ordered;\n\n\t\t\t\t// Binary test\n\t\t\t\ttry {\n\t\t\t\t\tdc.binaryType = \"blob\";\n\t\t\t\t\tsupported.binaryBlob = !Supports.isIOS;\n\t\t\t\t} catch (e) {}\n\t\t\t} catch (e) {\n\t\t\t} finally {\n\t\t\t\tif (dc) {\n\t\t\t\t\tdc.close();\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (e) {\n\t\t} finally {\n\t\t\tif (pc) {\n\t\t\t\tpc.close();\n\t\t\t}\n\t\t}\n\n\t\treturn supported;\n\t})();\n\n\t// Ensure alphanumeric ids\n\tvalidateId(id: string): boolean {\n\t\t// Allow empty ids\n\t\treturn !id || /^[A-Za-z0-9]+(?:[ _-][A-Za-z0-9]+)*$/.test(id);\n\t}\n\n\tpack = BinaryPack.pack;\n\tunpack = BinaryPack.unpack;\n\n\t// Binary stuff\n\n\tprivate _dataCount: number = 1;\n\n\tchunk(\n\t\tblob: Blob,\n\t): { __peerData: number; n: number; total: number; data: Blob }[] {\n\t\tconst chunks = [];\n\t\tconst size = blob.size;\n\t\tconst total = Math.ceil(size / util.chunkedMTU);\n\n\t\tlet index = 0;\n\t\tlet start = 0;\n\n\t\twhile (start < size) {\n\t\t\tconst end = Math.min(size, start + util.chunkedMTU);\n\t\t\tconst b = blob.slice(start, end);\n\n\t\t\tconst chunk = {\n\t\t\t\t__peerData: this._dataCount,\n\t\t\t\tn: index,\n\t\t\t\tdata: b,\n\t\t\t\ttotal,\n\t\t\t};\n\n\t\t\tchunks.push(chunk);\n\n\t\t\tstart = end;\n\t\t\tindex++;\n\t\t}\n\n\t\tthis._dataCount++;\n\n\t\treturn chunks;\n\t}\n\n\tblobToArrayBuffer(\n\t\tblob: Blob,\n\t\tcb: (arg: ArrayBuffer | null) => void,\n\t): FileReader {\n\t\tconst fr = new FileReader();\n\n\t\tfr.onload = function (evt) {\n\t\t\tif (evt.target) {\n\t\t\t\tcb(evt.target.result as ArrayBuffer);\n\t\t\t}\n\t\t};\n\n\t\tfr.readAsArrayBuffer(blob);\n\n\t\treturn fr;\n\t}\n\n\tbinaryStringToArrayBuffer(binary: string): ArrayBuffer | SharedArrayBuffer {\n\t\tconst byteArray = new Uint8Array(binary.length);\n\n\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\tbyteArray[i] = binary.charCodeAt(i) & 0xff;\n\t\t}\n\n\t\treturn byteArray.buffer;\n\t}\n\n\trandomToken(): string {\n\t\treturn Math.random().toString(36).slice(2);\n\t}\n\n\tisSecure(): boolean {\n\t\treturn location.protocol === \"https:\";\n\t}\n}\nexport const util = new Util();\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","'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\tDisabled,\n\tErrors,\n\tWarnings,\n\tAll,\n}\n\nclass Logger {\n\tprivate _logLevel = LogLevel.Disabled;\n\n\tget logLevel(): LogLevel {\n\t\treturn this._logLevel;\n\t}\n\n\tset logLevel(logLevel: LogLevel) {\n\t\tthis._logLevel = logLevel;\n\t}\n\n\tlog(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.All) {\n\t\t\tthis._print(LogLevel.All, ...args);\n\t\t}\n\t}\n\n\twarn(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.Warnings) {\n\t\t\tthis._print(LogLevel.Warnings, ...args);\n\t\t}\n\t}\n\n\terror(...args: any[]) {\n\t\tif (this._logLevel >= LogLevel.Errors) {\n\t\t\tthis._print(LogLevel.Errors, ...args);\n\t\t}\n\t}\n\n\tsetLogFunction(fn: (logLevel: LogLevel, ..._: any[]) => void): void {\n\t\tthis._print = fn;\n\t}\n\n\tprivate _print(logLevel: LogLevel, ...rest: any[]): void {\n\t\tconst copy = [LOG_PREFIX, ...rest];\n\n\t\tfor (let i in copy) {\n\t\t\tif (copy[i] instanceof Error) {\n\t\t\t\tcopy[i] = \"(\" + copy[i].name + \") \" + copy[i].message;\n\t\t\t}\n\t\t}\n\n\t\tif (logLevel >= LogLevel.All) {\n\t\t\tconsole.log(...copy);\n\t\t} else if (logLevel >= LogLevel.Warnings) {\n\t\t\tconsole.warn(\"WARNING\", ...copy);\n\t\t} else if (logLevel >= LogLevel.Errors) {\n\t\t\tconsole.error(\"ERROR\", ...copy);\n\t\t}\n\t}\n}\n\nexport default new Logger();\n","export enum ConnectionEventType {\n\tOpen = \"open\",\n\tStream = \"stream\",\n\tData = \"data\",\n\tClose = \"close\",\n\tError = \"error\",\n\tIceStateChanged = \"iceStateChanged\",\n}\n\nexport enum ConnectionType {\n\tData = \"data\",\n\tMedia = \"media\",\n}\n\nexport type PeerEventType =\n\t| \"open\"\n\t| \"close\"\n\t| \"connection\"\n\t| \"call\"\n\t| \"disconnected\"\n\t| \"error\";\n\nexport enum PeerErrorType {\n\tBrowserIncompatible = \"browser-incompatible\",\n\tDisconnected = \"disconnected\",\n\tInvalidID = \"invalid-id\",\n\tInvalidKey = \"invalid-key\",\n\tNetwork = \"network\",\n\tPeerUnavailable = \"peer-unavailable\",\n\tSslUnavailable = \"ssl-unavailable\",\n\tServerError = \"server-error\",\n\tSocketError = \"socket-error\",\n\tSocketClosed = \"socket-closed\",\n\tUnavailableID = \"unavailable-id\",\n\tWebRTC = \"webrtc\",\n}\n\nexport enum SerializationType {\n\tBinary = \"binary\",\n\tBinaryUTF8 = \"binary-utf8\",\n\tJSON = \"json\",\n}\n\nexport enum SocketEventType {\n\tMessage = \"message\",\n\tDisconnected = \"disconnected\",\n\tError = \"error\",\n\tClose = \"close\",\n}\n\nexport enum ServerMessageType {\n\tHeartbeat = \"HEARTBEAT\",\n\tCandidate = \"CANDIDATE\",\n\tOffer = \"OFFER\",\n\tAnswer = \"ANSWER\",\n\tOpen = \"OPEN\", // The connection to the server is open.\n\tError = \"ERROR\", // Server error.\n\tIdTaken = \"ID-TAKEN\", // The selected ID is taken.\n\tInvalidKey = \"INVALID-KEY\", // The given API key cannot be found.\n\tLeave = \"LEAVE\", // Another peer has closed its connection to this peer.\n\tExpire = \"EXPIRE\", // The offer sent to a peer has expired without response.\n}\n","{\n\t\"name\": \"peerjs\",\n\t\"version\": \"1.4.5\",\n\t\"keywords\": [\n\t\t\"peerjs\",\n\t\t\"webrtc\",\n\t\t\"p2p\",\n\t\t\"rtc\"\n\t],\n\t\"description\": \"PeerJS client\",\n\t\"homepage\": \"https://peerjs.com\",\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/peers/peerjs/issues\"\n\t},\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/peers/peerjs\"\n\t},\n\t\"license\": \"MIT\",\n\t\"contributors\": [\n\t\t\"Michelle Bu <michelle@michellebu.com>\",\n\t\t\"afrokick <devbyru@gmail.com>\",\n\t\t\"ericz <really.ez@gmail.com>\",\n\t\t\"Jairo <kidandcat@gmail.com>\",\n\t\t\"Jonas Gloning <34194370+jonasgloning@users.noreply.github.com>\",\n\t\t\"Jairo Caro-Accino Viciana <jairo@galax.be>\",\n\t\t\"Carlos Caballero <carlos.caballero.gonzalez@gmail.com>\",\n\t\t\"hc <hheennrryy@gmail.com>\",\n\t\t\"Muhammad Asif <capripio@gmail.com>\",\n\t\t\"PrashoonB <prashoonbhattacharjee@gmail.com>\",\n\t\t\"akotynski <aleksanderkotbury@gmail.com>\",\n\t\t\"Harsh Bardhan Mishra <47351025+HarshCasper@users.noreply.github.com>\",\n\t\t\"Jairooo <jairocaro@msn.com>\",\n\t\t\"lmb <i@lmb.io>\",\n\t\t\"Moritz Stückler <moritz.stueckler@gmail.com>\",\n\t\t\"Denis Lukov <denismassters@gmail.com>\",\n\t\t\"DUODVK <kurmanov.work@gmail.com>\",\n\t\t\"Hans Oksendahl <hansoksendahl@gmail.com>\",\n\t\t\"Jess <jessachandler@gmail.com>\",\n\t\t\"khankuan <khankuan@gmail.com>\",\n\t\t\"Matthias Lohr <matthias@lohr.me>\",\n\t\t\"Philipp Hancke <fippo@andyet.net>\",\n\t\t\"Simon <crydotsnakegithub@gmail.com>\",\n\t\t\"XiZhao <kwang1imsa@gmail.com>\",\n\t\t\"=frank tree <=frnktrb@googlemail.com>\",\n\t\t\"Alberto Torres <kungfoobar@gmail.com>\",\n\t\t\"Alex Chuev <alex@chuev.com>\",\n\t\t\"alxnull <alxnull@e.mail.de>\",\n\t\t\"Andre Eckardt <aeckardt@outlook.com>\",\n\t\t\"Arpit Solanki <solankiarpit1997@gmail.com>\",\n\t\t\"Artur Zayats <zag2art@gmail.com>\",\n\t\t\"Ben Parnell <benjaminparnell.94@gmail.com>\",\n\t\t\"Benny Lichtner <bennlich@gmail.com>\",\n\t\t\"bob.barstead@exaptive.com <bob.barstead@exaptive.com>\",\n\t\t\"chandika <chandika@gmail.com>\",\n\t\t\"Chris Cowan <agentme49@gmail.com>\",\n\t\t\"Christopher Van <cvan@users.noreply.github.com>\",\n\t\t\"Diwank Singh Tomer <singh@diwank.name>\",\n\t\t\"eddieherm <edhermoso@gmail.com>\",\n\t\t\"Eduardo Pinho <enet4mikeenet@gmail.com>\",\n\t\t\"emersion <contact@emersion.fr>\",\n\t\t\"Evandro Zanatta <ezanatta@tray.net.br>\",\n\t\t\"fresheneesz <bitetrudpublic@gmail.com>\",\n\t\t\"Gardner Bickford <gardner@users.noreply.github.com>\",\n\t\t\"Gian Luca <gianluca.cecchi@cynny.com>\",\n\t\t\"Hizkia Felix <hizkifw@gmail.com>\",\n\t\t\"Hristo Oskov <hristo.oskov@gmail.com>\",\n\t\t\"Ilya Konanykhin <ilya.konanykhin@gmail.com>\",\n\t\t\"Isaac Madwed <i.madwed@gmail.com>\",\n\t\t\"jasonbarry <jasbarry@me.com>\",\n\t\t\"Jefferson Felix <me@jsfelix.dev>\",\n\t\t\"Jonathan Burke <jonathan.burke.1311@googlemail.com>\",\n\t\t\"Jonathan Mayol <mayoljonathan@gmail.com>\",\n\t\t\"jonnyf <github@jonathanfoss.co.uk>\",\n\t\t\"JooYoung <qkdlql@naver.com>\",\n\t\t\"Jordan Austin <jrax86@gmail.com>\",\n\t\t\"Josh Hamit <josh.hamit@gmail.com>\",\n\t\t\"Kevin Mai-Husan Chia <mhchia@users.noreply.github.com>\",\n\t\t\"Kyrylo Shegeda <shegeda@ualberta.ca>\",\n\t\t\"PatrickJS <github@gdi2290.com>\",\n\t\t\"Pepijn de Vos <pepijndevos@gmail.com>\",\n\t\t\"Rolf Erik Lekang <me@rolflekang.com>\",\n\t\t\"Sören Balko <Soeren.Balko@gmail.com>\",\n\t\t\"Steve Blaurock <sblaurock@gmail.com>\",\n\t\t\"Tobias Speicher <rootcommander@gmail.com>\",\n\t\t\"xizhao <kevin.wang@cloudera.com>\",\n\t\t\"Yemel Jardi <angel.jardi@gmail.com>\",\n\t\t\"Yuki Ito <yuki@gnnk.net>\"\n\t],\n\t\"funding\": {\n\t\t\"type\": \"opencollective\",\n\t\t\"url\": \"https://opencollective.com/peer\"\n\t},\n\t\"collective\": {\n\t\t\"type\": \"opencollective\",\n\t\t\"url\": \"https://opencollective.com/peer\"\n\t},\n\t\"files\": [\n\t\t\"dist/*\"\n\t],\n\t\"type\": \"module\",\n\t\"sideEffects\": [\n\t\t\"lib/global.ts\",\n\t\t\"lib/supports.ts\"\n\t],\n\t\"main\": \"dist/bundler.cjs\",\n\t\"module\": \"dist/bundler.mjs\",\n\t\"browser-minified\": \"dist/peerjs.min.cjs\",\n\t\"browser-unminified\": \"dist/peerjs.cjs\",\n\t\"types\": \"dist/types.d.ts\",\n\t\"engines\": {\n\t\t\"node\": \">= 10\"\n\t},\n\t\"targets\": {\n\t\t\"types\": {\n\t\t\t\"source\": \"lib/exports.ts\"\n\t\t},\n\t\t\"main\": {\n\t\t\t\"source\": \"lib/exports.ts\",\n\t\t\t\"sourceMap\": {\n\t\t\t\t\"inlineSources\": true\n\t\t\t}\n\t\t},\n\t\t\"module\": {\n\t\t\t\"source\": \"lib/exports.ts\",\n\t\t\t\"includeNodeModules\": [\n\t\t\t\t\"eventemitter3\"\n\t\t\t],\n\t\t\t\"sourceMap\": {\n\t\t\t\t\"inlineSources\": true\n\t\t\t}\n\t\t},\n\t\t\"browser-minified\": {\n\t\t\t\"includeNodeModules\": true,\n\t\t\t\"context\": \"browser\",\n\t\t\t\"optimize\": true,\n\t\t\t\"engines\": {\n\t\t\t\t\"browsers\": \"cover 99%, not dead\"\n\t\t\t},\n\t\t\t\"source\": \"lib/global.ts\"\n\t\t},\n\t\t\"browser-unminified\": {\n\t\t\t\"includeNodeModules\": true,\n\t\t\t\"context\": \"browser\",\n\t\t\t\"optimize\": false,\n\t\t\t\"engines\": {\n\t\t\t\t\"browsers\": \"cover 99%, not dead\"\n\t\t\t},\n\t\t\t\"source\": \"lib/global.ts\"\n\t\t}\n\t},\n\t\"scripts\": {\n\t\t\"check\": \"tsc --noEmit\",\n\t\t\"watch\": \"parcel watch\",\n\t\t\"build\": \"rm -rf dist && parcel build && cp dist/peerjs.cjs dist/peerjs.js && cp dist/peerjs.min.cjs dist/peerjs.min.js\",\n\t\t\"prepublishOnly\": \"npm run build\",\n\t\t\"test\": \"mocha -r ts-node/register -r jsdom-global/register test/**/*.ts\",\n\t\t\"format\": \"prettier --write .\",\n\t\t\"semantic-release\": \"semantic-release\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@parcel/config-default\": \"^2.5.0\",\n\t\t\"@parcel/packager-ts\": \"^2.5.0\",\n\t\t\"@parcel/transformer-typescript-tsc\": \"^2.5.0\",\n\t\t\"@parcel/transformer-typescript-types\": \"^2.5.0\",\n\t\t\"@semantic-release/changelog\": \"^6.0.1\",\n\t\t\"@semantic-release/git\": \"^10.0.1\",\n\t\t\"@types/chai\": \"^4.3.0\",\n\t\t\"@types/mocha\": \"^9.1.0\",\n\t\t\"@types/node\": \"^17.0.18\",\n\t\t\"chai\": \"^4.3.6\",\n\t\t\"jsdom\": \"^19.0.0\",\n\t\t\"jsdom-global\": \"^3.0.2\",\n\t\t\"mocha\": \"^9.2.0\",\n\t\t\"mock-socket\": \"8.0.5\",\n\t\t\"parcel\": \"^2.5.0\",\n\t\t\"parcel-transformer-tsc-sourcemaps\": \"^1.0.2\",\n\t\t\"prettier\": \"^2.6.2\",\n\t\t\"semantic-release\": \"^19.0.2\",\n\t\t\"standard\": \"^16.0.4\",\n\t\t\"ts-node\": \"^10.5.0\",\n\t\t\"typescript\": \"^4.5.5\"\n\t},\n\t\"dependencies\": {\n\t\t\"@swc/helpers\": \"^0.3.13\",\n\t\t\"eventemitter3\": \"^4.0.7\",\n\t\t\"peerjs-js-binarypack\": \"1.0.1\",\n\t\t\"webrtc-adapter\": \"^7.7.1\"\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\nimport { SocketEventType, ServerMessageType } from \"./enums\";\nimport { version } from \"../package.json\";\n\n/**\n * An abstraction on top of WebSockets to provide fastest\n * possible connection for peers.\n */\nexport class Socket extends EventEmitter {\n\tprivate _disconnected: boolean = true;\n\tprivate _id?: string;\n\tprivate _messagesQueue: Array<object> = [];\n\tprivate _socket?: WebSocket;\n\tprivate _wsPingTimer?: any;\n\tprivate readonly _baseUrl: string;\n\n\tconstructor(\n\t\tsecure: any,\n\t\thost: string,\n\t\tport: number,\n\t\tpath: string,\n\t\tkey: string,\n\t\tprivate readonly pingInterval: number = 5000,\n\t) {\n\t\tsuper();\n\n\t\tconst wsProtocol = secure ? \"wss://\" : \"ws://\";\n\n\t\tthis._baseUrl = wsProtocol + host + \":\" + port + path + \"peerjs?key=\" + key;\n\t}\n\n\tstart(id: string, token: string): void {\n\t\tthis._id = id;\n\n\t\tconst wsUrl = `${this._baseUrl}&id=${id}&token=${token}`;\n\n\t\tif (!!this._socket || !this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._socket = new WebSocket(wsUrl + \"&version=\" + version);\n\t\tthis._disconnected = false;\n\n\t\tthis._socket.onmessage = (event) => {\n\t\t\tlet data;\n\n\t\t\ttry {\n\t\t\t\tdata = JSON.parse(event.data);\n\t\t\t\tlogger.log(\"Server message received:\", data);\n\t\t\t} catch (e) {\n\t\t\t\tlogger.log(\"Invalid server message\", event.data);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emit(SocketEventType.Message, data);\n\t\t};\n\n\t\tthis._socket.onclose = (event) => {\n\t\t\tif (this._disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlogger.log(\"Socket closed.\", event);\n\n\t\t\tthis._cleanup();\n\t\t\tthis._disconnected = true;\n\n\t\t\tthis.emit(SocketEventType.Disconnected);\n\t\t};\n\n\t\t// Take care of the queue of connections if necessary and make sure Peer knows\n\t\t// socket is open.\n\t\tthis._socket.onopen = () => {\n\t\t\tif (this._disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._sendQueuedMessages();\n\n\t\t\tlogger.log(\"Socket open\");\n\n\t\t\tthis._scheduleHeartbeat();\n\t\t};\n\t}\n\n\tprivate _scheduleHeartbeat(): void {\n\t\tthis._wsPingTimer = setTimeout(() => {\n\t\t\tthis._sendHeartbeat();\n\t\t}, this.pingInterval);\n\t}\n\n\tprivate _sendHeartbeat(): void {\n\t\tif (!this._wsOpen()) {\n\t\t\tlogger.log(`Cannot send heartbeat, because socket closed`);\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = JSON.stringify({ type: ServerMessageType.Heartbeat });\n\n\t\tthis._socket!.send(message);\n\n\t\tthis._scheduleHeartbeat();\n\t}\n\n\t/** Is the websocket currently open? */\n\tprivate _wsOpen(): boolean {\n\t\treturn !!this._socket && this._socket.readyState === 1;\n\t}\n\n\t/** Send queued messages. */\n\tprivate _sendQueuedMessages(): void {\n\t\t//Create copy of queue and clear it,\n\t\t//because send method push the message back to queue if smth will go wrong\n\t\tconst copiedQueue = [...this._messagesQueue];\n\t\tthis._messagesQueue = [];\n\n\t\tfor (const message of copiedQueue) {\n\t\t\tthis.send(message);\n\t\t}\n\t}\n\n\t/** Exposed send for DC & Peer. */\n\tsend(data: any): void {\n\t\tif (this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\t// If we didn't get an ID yet, we can't yet send anything so we should queue\n\t\t// up these messages.\n\t\tif (!this._id) {\n\t\t\tthis._messagesQueue.push(data);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!data.type) {\n\t\t\tthis.emit(SocketEventType.Error, \"Invalid message\");\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._wsOpen()) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst message = JSON.stringify(data);\n\n\t\tthis._socket!.send(message);\n\t}\n\n\tclose(): void {\n\t\tif (this._disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._cleanup();\n\n\t\tthis._disconnected = true;\n\t}\n\n\tprivate _cleanup(): void {\n\t\tif (this._socket) {\n\t\t\tthis._socket.onopen =\n\t\t\t\tthis._socket.onmessage =\n\t\t\t\tthis._socket.onclose =\n\t\t\t\t\tnull;\n\t\t\tthis._socket.close();\n\t\t\tthis._socket = undefined;\n\t\t}\n\n\t\tclearTimeout(this._wsPingTimer!);\n\t}\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { MediaConnection } from \"./mediaconnection\";\nimport { DataConnection } from \"./dataconnection\";\nimport {\n\tConnectionType,\n\tPeerErrorType,\n\tConnectionEventType,\n\tServerMessageType,\n} from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\n\n/**\n * Manages all negotiations between Peers.\n */\nexport class Negotiator {\n\tconstructor(readonly connection: BaseConnection) {}\n\n\t/** Returns a PeerConnection object set up correctly (for data, media). */\n\tstartConnection(options: any) {\n\t\tconst peerConnection = this._startPeerConnection();\n\n\t\t// Set the connection's PC.\n\t\tthis.connection.peerConnection = peerConnection;\n\n\t\tif (this.connection.type === ConnectionType.Media && options._stream) {\n\t\t\tthis._addTracksToConnection(options._stream, peerConnection);\n\t\t}\n\n\t\t// What do we need to do now?\n\t\tif (options.originator) {\n\t\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\t\tconst dataConnection = <DataConnection>this.connection;\n\n\t\t\t\tconst config: RTCDataChannelInit = { ordered: !!options.reliable };\n\n\t\t\t\tconst dataChannel = peerConnection.createDataChannel(\n\t\t\t\t\tdataConnection.label,\n\t\t\t\t\tconfig,\n\t\t\t\t);\n\t\t\t\tdataConnection.initialize(dataChannel);\n\t\t\t}\n\n\t\t\tthis._makeOffer();\n\t\t} else {\n\t\t\tthis.handleSDP(\"OFFER\", options.sdp);\n\t\t}\n\t}\n\n\t/** Start a PC. */\n\tprivate _startPeerConnection(): RTCPeerConnection {\n\t\tlogger.log(\"Creating RTCPeerConnection.\");\n\n\t\tconst peerConnection = new RTCPeerConnection(\n\t\t\tthis.connection.provider.options.config,\n\t\t);\n\n\t\tthis._setupListeners(peerConnection);\n\n\t\treturn peerConnection;\n\t}\n\n\t/** Set up various WebRTC listeners. */\n\tprivate _setupListeners(peerConnection: RTCPeerConnection) {\n\t\tconst peerId = this.connection.peer;\n\t\tconst connectionId = this.connection.connectionId;\n\t\tconst connectionType = this.connection.type;\n\t\tconst provider = this.connection.provider;\n\n\t\t// ICE CANDIDATES.\n\t\tlogger.log(\"Listening for ICE candidates.\");\n\n\t\tpeerConnection.onicecandidate = (evt) => {\n\t\t\tif (!evt.candidate || !evt.candidate.candidate) return;\n\n\t\t\tlogger.log(`Received ICE candidates for ${peerId}:`, evt.candidate);\n\n\t\t\tprovider.socket.send({\n\t\t\t\ttype: ServerMessageType.Candidate,\n\t\t\t\tpayload: {\n\t\t\t\t\tcandidate: evt.candidate,\n\t\t\t\t\ttype: connectionType,\n\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t},\n\t\t\t\tdst: peerId,\n\t\t\t});\n\t\t};\n\n\t\tpeerConnection.oniceconnectionstatechange = () => {\n\t\t\tswitch (peerConnection.iceConnectionState) {\n\t\t\t\tcase \"failed\":\n\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\"iceConnectionState is failed, closing connections to \" + peerId,\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.emit(\n\t\t\t\t\t\tConnectionEventType.Error,\n\t\t\t\t\t\tnew Error(\"Negotiation of connection to \" + peerId + \" failed.\"),\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.close();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"closed\":\n\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\"iceConnectionState is closed, closing connections to \" + peerId,\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.emit(\n\t\t\t\t\t\tConnectionEventType.Error,\n\t\t\t\t\t\tnew Error(\"Connection to \" + peerId + \" closed.\"),\n\t\t\t\t\t);\n\t\t\t\t\tthis.connection.close();\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"disconnected\":\n\t\t\t\t\tlogger.log(\n\t\t\t\t\t\t\"iceConnectionState changed to disconnected on the connection with \" +\n\t\t\t\t\t\t\tpeerId,\n\t\t\t\t\t);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"completed\":\n\t\t\t\t\tpeerConnection.onicecandidate = util.noop;\n\t\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tthis.connection.emit(\n\t\t\t\tConnectionEventType.IceStateChanged,\n\t\t\t\tpeerConnection.iceConnectionState,\n\t\t\t);\n\t\t};\n\n\t\t// DATACONNECTION.\n\t\tlogger.log(\"Listening for data channel\");\n\t\t// Fired between offer and answer, so options should already be saved\n\t\t// in the options hash.\n\t\tpeerConnection.ondatachannel = (evt) => {\n\t\t\tlogger.log(\"Received data channel\");\n\n\t\t\tconst dataChannel = evt.channel;\n\t\t\tconst connection = <DataConnection>(\n\t\t\t\tprovider.getConnection(peerId, connectionId)\n\t\t\t);\n\n\t\t\tconnection.initialize(dataChannel);\n\t\t};\n\n\t\t// MEDIACONNECTION.\n\t\tlogger.log(\"Listening for remote stream\");\n\n\t\tpeerConnection.ontrack = (evt) => {\n\t\t\tlogger.log(\"Received remote stream\");\n\n\t\t\tconst stream = evt.streams[0];\n\t\t\tconst connection = provider.getConnection(peerId, connectionId);\n\n\t\t\tif (connection.type === ConnectionType.Media) {\n\t\t\t\tconst mediaConnection = <MediaConnection>connection;\n\n\t\t\t\tthis._addStreamToMediaConnection(stream, mediaConnection);\n\t\t\t}\n\t\t};\n\t}\n\n\tcleanup(): void {\n\t\tlogger.log(\"Cleaning up PeerConnection to \" + this.connection.peer);\n\n\t\tconst peerConnection = this.connection.peerConnection;\n\n\t\tif (!peerConnection) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis.connection.peerConnection = null;\n\n\t\t//unsubscribe from all PeerConnection's events\n\t\tpeerConnection.onicecandidate =\n\t\t\tpeerConnection.oniceconnectionstatechange =\n\t\t\tpeerConnection.ondatachannel =\n\t\t\tpeerConnection.ontrack =\n\t\t\t\t() => {};\n\n\t\tconst peerConnectionNotClosed = peerConnection.signalingState !== \"closed\";\n\t\tlet dataChannelNotClosed = false;\n\n\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\tconst dataConnection = <DataConnection>this.connection;\n\t\t\tconst dataChannel = dataConnection.dataChannel;\n\n\t\t\tif (dataChannel) {\n\t\t\t\tdataChannelNotClosed =\n\t\t\t\t\t!!dataChannel.readyState && dataChannel.readyState !== \"closed\";\n\t\t\t}\n\t\t}\n\n\t\tif (peerConnectionNotClosed || dataChannelNotClosed) {\n\t\t\tpeerConnection.close();\n\t\t}\n\t}\n\n\tprivate async _makeOffer(): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\ttry {\n\t\t\tconst offer = await peerConnection.createOffer(\n\t\t\t\tthis.connection.options.constraints,\n\t\t\t);\n\n\t\t\tlogger.log(\"Created offer.\");\n\n\t\t\tif (\n\t\t\t\tthis.connection.options.sdpTransform &&\n\t\t\t\ttypeof this.connection.options.sdpTransform === \"function\"\n\t\t\t) {\n\t\t\t\toffer.sdp =\n\t\t\t\t\tthis.connection.options.sdpTransform(offer.sdp) || offer.sdp;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait peerConnection.setLocalDescription(offer);\n\n\t\t\t\tlogger.log(\n\t\t\t\t\t\"Set localDescription:\",\n\t\t\t\t\toffer,\n\t\t\t\t\t`for:${this.connection.peer}`,\n\t\t\t\t);\n\n\t\t\t\tlet payload: any = {\n\t\t\t\t\tsdp: offer,\n\t\t\t\t\ttype: this.connection.type,\n\t\t\t\t\tconnectionId: this.connection.connectionId,\n\t\t\t\t\tmetadata: this.connection.metadata,\n\t\t\t\t\tbrowser: util.browser,\n\t\t\t\t};\n\n\t\t\t\tif (this.connection.type === ConnectionType.Data) {\n\t\t\t\t\tconst dataConnection = <DataConnection>this.connection;\n\n\t\t\t\t\tpayload = {\n\t\t\t\t\t\t...payload,\n\t\t\t\t\t\tlabel: dataConnection.label,\n\t\t\t\t\t\treliable: dataConnection.reliable,\n\t\t\t\t\t\tserialization: dataConnection.serialization,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tprovider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Offer,\n\t\t\t\t\tpayload,\n\t\t\t\t\tdst: this.connection.peer,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\t// TODO: investigate why _makeOffer is being called from the answer\n\t\t\t\tif (\n\t\t\t\t\terr !=\n\t\t\t\t\t\"OperationError: Failed to set local offer sdp: Called in wrong state: kHaveRemoteOffer\"\n\t\t\t\t) {\n\t\t\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\t\t\tlogger.log(\"Failed to setLocalDescription, \", err);\n\t\t\t\t}\n\t\t\t}\n\t\t} catch (err_1) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err_1);\n\t\t\tlogger.log(\"Failed to createOffer, \", err_1);\n\t\t}\n\t}\n\n\tprivate async _makeAnswer(): Promise<void> {\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\ttry {\n\t\t\tconst answer = await peerConnection.createAnswer();\n\t\t\tlogger.log(\"Created answer.\");\n\n\t\t\tif (\n\t\t\t\tthis.connection.options.sdpTransform &&\n\t\t\t\ttypeof this.connection.options.sdpTransform === \"function\"\n\t\t\t) {\n\t\t\t\tanswer.sdp =\n\t\t\t\t\tthis.connection.options.sdpTransform(answer.sdp) || answer.sdp;\n\t\t\t}\n\n\t\t\ttry {\n\t\t\t\tawait peerConnection.setLocalDescription(answer);\n\n\t\t\t\tlogger.log(\n\t\t\t\t\t`Set localDescription:`,\n\t\t\t\t\tanswer,\n\t\t\t\t\t`for:${this.connection.peer}`,\n\t\t\t\t);\n\n\t\t\t\tprovider.socket.send({\n\t\t\t\t\ttype: ServerMessageType.Answer,\n\t\t\t\t\tpayload: {\n\t\t\t\t\t\tsdp: answer,\n\t\t\t\t\t\ttype: this.connection.type,\n\t\t\t\t\t\tconnectionId: this.connection.connectionId,\n\t\t\t\t\t\tbrowser: util.browser,\n\t\t\t\t\t},\n\t\t\t\t\tdst: this.connection.peer,\n\t\t\t\t});\n\t\t\t} catch (err) {\n\t\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\t\tlogger.log(\"Failed to setLocalDescription, \", err);\n\t\t\t}\n\t\t} catch (err_1) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err_1);\n\t\t\tlogger.log(\"Failed to create answer, \", err_1);\n\t\t}\n\t}\n\n\t/** Handle an SDP. */\n\tasync handleSDP(type: string, sdp: any): Promise<void> {\n\t\tsdp = new RTCSessionDescription(sdp);\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\tlogger.log(\"Setting remote description\", sdp);\n\n\t\tconst self = this;\n\n\t\ttry {\n\t\t\tawait peerConnection.setRemoteDescription(sdp);\n\t\t\tlogger.log(`Set remoteDescription:${type} for:${this.connection.peer}`);\n\t\t\tif (type === \"OFFER\") {\n\t\t\t\tawait self._makeAnswer();\n\t\t\t}\n\t\t} catch (err) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\tlogger.log(\"Failed to setRemoteDescription, \", err);\n\t\t}\n\t}\n\n\t/** Handle a candidate. */\n\tasync handleCandidate(ice: any): Promise<void> {\n\t\tlogger.log(`handleCandidate:`, ice);\n\n\t\tconst candidate = ice.candidate;\n\t\tconst sdpMLineIndex = ice.sdpMLineIndex;\n\t\tconst sdpMid = ice.sdpMid;\n\t\tconst peerConnection = this.connection.peerConnection;\n\t\tconst provider = this.connection.provider;\n\n\t\ttry {\n\t\t\tawait peerConnection.addIceCandidate(\n\t\t\t\tnew RTCIceCandidate({\n\t\t\t\t\tsdpMid: sdpMid,\n\t\t\t\t\tsdpMLineIndex: sdpMLineIndex,\n\t\t\t\t\tcandidate: candidate,\n\t\t\t\t}),\n\t\t\t);\n\t\t\tlogger.log(`Added ICE candidate for:${this.connection.peer}`);\n\t\t} catch (err) {\n\t\t\tprovider.emitError(PeerErrorType.WebRTC, err);\n\t\t\tlogger.log(\"Failed to handleCandidate, \", err);\n\t\t}\n\t}\n\n\tprivate _addTracksToConnection(\n\t\tstream: MediaStream,\n\t\tpeerConnection: RTCPeerConnection,\n\t): void {\n\t\tlogger.log(`add tracks from stream ${stream.id} to peer connection`);\n\n\t\tif (!peerConnection.addTrack) {\n\t\t\treturn logger.error(\n\t\t\t\t`Your browser does't support RTCPeerConnection#addTrack. Ignored.`,\n\t\t\t);\n\t\t}\n\n\t\tstream.getTracks().forEach((track) => {\n\t\t\tpeerConnection.addTrack(track, stream);\n\t\t});\n\t}\n\n\tprivate _addStreamToMediaConnection(\n\t\tstream: MediaStream,\n\t\tmediaConnection: MediaConnection,\n\t): void {\n\t\tlogger.log(\n\t\t\t`add stream ${stream.id} to media connection ${mediaConnection.connectionId}`,\n\t\t);\n\n\t\tmediaConnection.addStream(stream);\n\t}\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\tprotected _open = false;\n\n\treadonly metadata: any;\n\tconnectionId: string;\n\n\tpeerConnection: RTCPeerConnection;\n\n\tabstract get type(): ConnectionType;\n\n\tget open() {\n\t\treturn this._open;\n\t}\n\n\tconstructor(\n\t\treadonly peer: string,\n\t\tpublic provider: Peer,\n\t\treadonly options: any,\n\t) {\n\t\tsuper();\n\n\t\tthis.metadata = options.metadata;\n\t}\n\n\tabstract close(): void;\n\n\tabstract handleMessage(message: ServerMessage): void;\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport {\n\tConnectionType,\n\tConnectionEventType,\n\tServerMessageType,\n} from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport type { AnswerOption } from \"./optionInterfaces\";\n\n/**\n * Wraps the streaming interface between two Peers.\n */\nexport class MediaConnection extends BaseConnection {\n\tprivate static readonly ID_PREFIX = \"mc_\";\n\n\tprivate _negotiator: Negotiator;\n\tprivate _localStream: MediaStream;\n\tprivate _remoteStream: MediaStream;\n\n\tget type() {\n\t\treturn ConnectionType.Media;\n\t}\n\n\tget localStream(): MediaStream {\n\t\treturn this._localStream;\n\t}\n\tget remoteStream(): MediaStream {\n\t\treturn this._remoteStream;\n\t}\n\n\tconstructor(peerId: string, provider: Peer, options: any) {\n\t\tsuper(peerId, provider, options);\n\n\t\tthis._localStream = this.options._stream;\n\t\tthis.connectionId =\n\t\t\tthis.options.connectionId ||\n\t\t\tMediaConnection.ID_PREFIX + util.randomToken();\n\n\t\tthis._negotiator = new Negotiator(this);\n\n\t\tif (this._localStream) {\n\t\t\tthis._negotiator.startConnection({\n\t\t\t\t_stream: this._localStream,\n\t\t\t\toriginator: true,\n\t\t\t});\n\t\t}\n\t}\n\n\taddStream(remoteStream) {\n\t\tlogger.log(\"Receiving stream\", remoteStream);\n\n\t\tthis._remoteStream = remoteStream;\n\t\tsuper.emit(ConnectionEventType.Stream, remoteStream); // Should we call this `open`?\n\t}\n\n\thandleMessage(message: ServerMessage): void {\n\t\tconst type = message.type;\n\t\tconst payload = message.payload;\n\n\t\tswitch (message.type) {\n\t\t\tcase ServerMessageType.Answer:\n\t\t\t\t// Forward to negotiator\n\t\t\t\tthis._negotiator.handleSDP(type, payload.sdp);\n\t\t\t\tthis._open = true;\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Candidate:\n\t\t\t\tthis._negotiator.handleCandidate(payload.candidate);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlogger.warn(`Unrecognized message type:${type} from peer:${this.peer}`);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tanswer(stream: MediaStream, options: AnswerOption = {}): void {\n\t\tif (this._localStream) {\n\t\t\tlogger.warn(\n\t\t\t\t\"Local stream already exists on this MediaConnection. Are you answering a call twice?\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tthis._localStream = stream;\n\n\t\tif (options && options.sdpTransform) {\n\t\t\tthis.options.sdpTransform = options.sdpTransform;\n\t\t}\n\n\t\tthis._negotiator.startConnection({\n\t\t\t...this.options._payload,\n\t\t\t_stream: stream,\n\t\t});\n\t\t// Retrieve lost messages stored because PeerConnection not set up.\n\t\tconst messages = this.provider._getMessages(this.connectionId);\n\n\t\tfor (let message of messages) {\n\t\t\tthis.handleMessage(message);\n\t\t}\n\n\t\tthis._open = true;\n\t}\n\n\t/**\n\t * Exposed functionality for users.\n\t */\n\n\t/** Allows user to close connection. */\n\tclose(): void {\n\t\tif (this._negotiator) {\n\t\t\tthis._negotiator.cleanup();\n\t\t\tthis._negotiator = null;\n\t\t}\n\n\t\tthis._localStream = null;\n\t\tthis._remoteStream = null;\n\n\t\tif (this.provider) {\n\t\t\tthis.provider._removeConnection(this);\n\n\t\t\tthis.provider = null;\n\t\t}\n\n\t\tif (this.options && this.options._stream) {\n\t\t\tthis.options._stream = null;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._open = false;\n\n\t\tsuper.emit(ConnectionEventType.Close);\n\t}\n}\n","import { EventEmitter } from \"eventemitter3\";\nimport logger from \"./logger\";\n\nexport class EncodingQueue extends EventEmitter {\n\treadonly fileReader: FileReader = new FileReader();\n\n\tprivate _queue: Blob[] = [];\n\tprivate _processing: boolean = false;\n\n\tconstructor() {\n\t\tsuper();\n\n\t\tthis.fileReader.onload = (evt) => {\n\t\t\tthis._processing = false;\n\n\t\t\tif (evt.target) {\n\t\t\t\tthis.emit(\"done\", evt.target.result as ArrayBuffer);\n\t\t\t}\n\n\t\t\tthis.doNextTask();\n\t\t};\n\n\t\tthis.fileReader.onerror = (evt) => {\n\t\t\tlogger.error(`EncodingQueue error:`, evt);\n\t\t\tthis._processing = false;\n\t\t\tthis.destroy();\n\t\t\tthis.emit(\"error\", evt);\n\t\t};\n\t}\n\n\tget queue(): Blob[] {\n\t\treturn this._queue;\n\t}\n\n\tget size(): number {\n\t\treturn this.queue.length;\n\t}\n\n\tget processing(): boolean {\n\t\treturn this._processing;\n\t}\n\n\tenque(blob: Blob): void {\n\t\tthis.queue.push(blob);\n\n\t\tif (this.processing) return;\n\n\t\tthis.doNextTask();\n\t}\n\n\tdestroy(): void {\n\t\tthis.fileReader.abort();\n\t\tthis._queue = [];\n\t}\n\n\tprivate doNextTask(): void {\n\t\tif (this.size === 0) return;\n\t\tif (this.processing) return;\n\n\t\tthis._processing = true;\n\n\t\tthis.fileReader.readAsArrayBuffer(this.queue.shift());\n\t}\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { Negotiator } from \"./negotiator\";\nimport {\n\tConnectionType,\n\tConnectionEventType,\n\tSerializationType,\n\tServerMessageType,\n} from \"./enums\";\nimport { Peer } from \"./peer\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { EncodingQueue } from \"./encodingQueue\";\nimport type { DataConnection as IDataConnection } from \"./dataconnection\";\n\n/**\n * Wraps a DataChannel between two Peers.\n */\nexport class DataConnection extends BaseConnection implements IDataConnection {\n\tprivate static readonly ID_PREFIX = \"dc_\";\n\tprivate static readonly MAX_BUFFERED_AMOUNT = 8 * 1024 * 1024;\n\n\tprivate _negotiator: Negotiator;\n\treadonly label: string;\n\treadonly serialization: SerializationType;\n\treadonly reliable: boolean;\n\tstringify: (data: any) => string = JSON.stringify;\n\tparse: (data: string) => any = JSON.parse;\n\n\tget type() {\n\t\treturn ConnectionType.Data;\n\t}\n\n\tprivate _buffer: any[] = [];\n\tprivate _bufferSize = 0;\n\tprivate _buffering = false;\n\tprivate _chunkedData: {\n\t\t[id: number]: {\n\t\t\tdata: Blob[];\n\t\t\tcount: number;\n\t\t\ttotal: number;\n\t\t};\n\t} = {};\n\n\tprivate _dc: RTCDataChannel;\n\tprivate _encodingQueue = new EncodingQueue();\n\n\tget dataChannel(): RTCDataChannel {\n\t\treturn this._dc;\n\t}\n\n\tget bufferSize(): number {\n\t\treturn this._bufferSize;\n\t}\n\n\tconstructor(peerId: string, provider: Peer, options: any) {\n\t\tsuper(peerId, provider, options);\n\n\t\tthis.connectionId =\n\t\t\tthis.options.connectionId ||\n\t\t\tDataConnection.ID_PREFIX + util.randomToken();\n\n\t\tthis.label = this.options.label || this.connectionId;\n\t\tthis.serialization = this.options.serialization || SerializationType.Binary;\n\t\tthis.reliable = !!this.options.reliable;\n\n\t\tthis._encodingQueue.on(\"done\", (ab: ArrayBuffer) => {\n\t\t\tthis._bufferedSend(ab);\n\t\t});\n\n\t\tthis._encodingQueue.on(\"error\", () => {\n\t\t\tlogger.error(\n\t\t\t\t`DC#${this.connectionId}: Error occured in encoding from blob to arraybuffer, close DC`,\n\t\t\t);\n\t\t\tthis.close();\n\t\t});\n\n\t\tthis._negotiator = new Negotiator(this);\n\n\t\tthis._negotiator.startConnection(\n\t\t\tthis.options._payload || {\n\t\t\t\toriginator: true,\n\t\t\t},\n\t\t);\n\t}\n\n\t/** Called by the Negotiator when the DataChannel is ready. */\n\tinitialize(dc: RTCDataChannel): void {\n\t\tthis._dc = dc;\n\t\tthis._configureDataChannel();\n\t}\n\n\tprivate _configureDataChannel(): void {\n\t\tif (!util.supports.binaryBlob || util.supports.reliable) {\n\t\t\tthis.dataChannel.binaryType = \"arraybuffer\";\n\t\t}\n\n\t\tthis.dataChannel.onopen = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc connection success`);\n\t\t\tthis._open = true;\n\t\t\tthis.emit(ConnectionEventType.Open);\n\t\t};\n\n\t\tthis.dataChannel.onmessage = (e) => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc onmessage:`, e.data);\n\t\t\tthis._handleDataMessage(e);\n\t\t};\n\n\t\tthis.dataChannel.onclose = () => {\n\t\t\tlogger.log(`DC#${this.connectionId} dc closed for:`, this.peer);\n\t\t\tthis.close();\n\t\t};\n\t}\n\n\t// Handles a DataChannel message.\n\tprivate _handleDataMessage({\n\t\tdata,\n\t}: {\n\t\tdata: Blob | ArrayBuffer | string;\n\t}): void {\n\t\tconst datatype = data.constructor;\n\n\t\tconst isBinarySerialization =\n\t\t\tthis.serialization === SerializationType.Binary ||\n\t\t\tthis.serialization === SerializationType.BinaryUTF8;\n\n\t\tlet deserializedData: any = data;\n\n\t\tif (isBinarySerialization) {\n\t\t\tif (datatype === Blob) {\n\t\t\t\t// Datatype should never be blob\n\t\t\t\tutil.blobToArrayBuffer(data as Blob, (ab) => {\n\t\t\t\t\tconst unpackedData = util.unpack(ab);\n\t\t\t\t\tthis.emit(ConnectionEventType.Data, unpackedData);\n\t\t\t\t});\n\t\t\t\treturn;\n\t\t\t} else if (datatype === ArrayBuffer) {\n\t\t\t\tdeserializedData = util.unpack(data as ArrayBuffer);\n\t\t\t} else if (datatype === String) {\n\t\t\t\t// String fallback for binary data for browsers that don't support binary yet\n\t\t\t\tconst ab = util.binaryStringToArrayBuffer(data as string);\n\t\t\t\tdeserializedData = util.unpack(ab);\n\t\t\t}\n\t\t} else if (this.serialization === SerializationType.JSON) {\n\t\t\tdeserializedData = this.parse(data as string);\n\t\t}\n\n\t\t// Check if we've chunked--if so, piece things back together.\n\t\t// We're guaranteed that this isn't 0.\n\t\tif (deserializedData.__peerData) {\n\t\t\tthis._handleChunk(deserializedData);\n\t\t\treturn;\n\t\t}\n\n\t\tsuper.emit(ConnectionEventType.Data, deserializedData);\n\t}\n\n\tprivate _handleChunk(data: {\n\t\t__peerData: number;\n\t\tn: number;\n\t\ttotal: number;\n\t\tdata: Blob;\n\t}): void {\n\t\tconst id = data.__peerData;\n\t\tconst chunkInfo = this._chunkedData[id] || {\n\t\t\tdata: [],\n\t\t\tcount: 0,\n\t\t\ttotal: data.total,\n\t\t};\n\n\t\tchunkInfo.data[data.n] = data.data;\n\t\tchunkInfo.count++;\n\t\tthis._chunkedData[id] = chunkInfo;\n\n\t\tif (chunkInfo.total === chunkInfo.count) {\n\t\t\t// Clean up before making the recursive call to `_handleDataMessage`.\n\t\t\tdelete this._chunkedData[id];\n\n\t\t\t// We've received all the chunks--time to construct the complete data.\n\t\t\tconst data = new Blob(chunkInfo.data);\n\t\t\tthis._handleDataMessage({ data });\n\t\t}\n\t}\n\n\t/**\n\t * Exposed functionality for users.\n\t */\n\n\t/** Allows user to close connection. */\n\tclose(): void {\n\t\tthis._buffer = [];\n\t\tthis._bufferSize = 0;\n\t\tthis._chunkedData = {};\n\n\t\tif (this._negotiator) {\n\t\t\tthis._negotiator.cleanup();\n\t\t\tthis._negotiator = null;\n\t\t}\n\n\t\tif (this.provider) {\n\t\t\tthis.provider._removeConnection(this);\n\n\t\t\tthis.provider = null;\n\t\t}\n\n\t\tif (this.dataChannel) {\n\t\t\tthis.dataChannel.onopen = null;\n\t\t\tthis.dataChannel.onmessage = null;\n\t\t\tthis.dataChannel.onclose = null;\n\t\t\tthis._dc = null;\n\t\t}\n\n\t\tif (this._encodingQueue) {\n\t\t\tthis._encodingQueue.destroy();\n\t\t\tthis._encodingQueue.removeAllListeners();\n\t\t\tthis._encodingQueue = null;\n\t\t}\n\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._open = false;\n\n\t\tsuper.emit(ConnectionEventType.Close);\n\t}\n\n\t/** Allows user to send data. */\n\tsend(data: any, chunked?: boolean): void {\n\t\tif (!this.open) {\n\t\t\tsuper.emit(\n\t\t\t\tConnectionEventType.Error,\n\t\t\t\tnew Error(\n\t\t\t\t\t\"Connection is not open. You should listen for the `open` event before sending messages.\",\n\t\t\t\t),\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (this.serialization === SerializationType.JSON) {\n\t\t\tthis._bufferedSend(this.stringify(data));\n\t\t} else if (\n\t\t\tthis.serialization === SerializationType.Binary ||\n\t\t\tthis.serialization === SerializationType.BinaryUTF8\n\t\t) {\n\t\t\tconst blob = util.pack(data);\n\n\t\t\tif (!chunked && blob.size > util.chunkedMTU) {\n\t\t\t\tthis._sendChunks(blob);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (!util.supports.binaryBlob) {\n\t\t\t\t// We only do this if we really need to (e.g. blobs are not supported),\n\t\t\t\t// because this conversion is costly.\n\t\t\t\tthis._encodingQueue.enque(blob);\n\t\t\t} else {\n\t\t\t\tthis._bufferedSend(blob);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._bufferedSend(data);\n\t\t}\n\t}\n\n\tprivate _bufferedSend(msg: any): void {\n\t\tif (this._buffering || !this._trySend(msg)) {\n\t\t\tthis._buffer.push(msg);\n\t\t\tthis._bufferSize = this._buffer.length;\n\t\t}\n\t}\n\n\t// Returns true if the send succeeds.\n\tprivate _trySend(msg: any): boolean {\n\t\tif (!this.open) {\n\t\t\treturn false;\n\t\t}\n\n\t\tif (this.dataChannel.bufferedAmount > DataConnection.MAX_BUFFERED_AMOUNT) {\n\t\t\tthis._buffering = true;\n\t\t\tsetTimeout(() => {\n\t\t\t\tthis._buffering = false;\n\t\t\t\tthis._tryBuffer();\n\t\t\t}, 50);\n\n\t\t\treturn false;\n\t\t}\n\n\t\ttry {\n\t\t\tthis.dataChannel.send(msg);\n\t\t} catch (e) {\n\t\t\tlogger.error(`DC#:${this.connectionId} Error when sending:`, e);\n\t\t\tthis._buffering = true;\n\n\t\t\tthis.close();\n\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t}\n\n\t// Try to send the first message in the buffer.\n\tprivate _tryBuffer(): void {\n\t\tif (!this.open) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (this._buffer.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst msg = this._buffer[0];\n\n\t\tif (this._trySend(msg)) {\n\t\t\tthis._buffer.shift();\n\t\t\tthis._bufferSize = this._buffer.length;\n\t\t\tthis._tryBuffer();\n\t\t}\n\t}\n\n\tprivate _sendChunks(blob: Blob): void {\n\t\tconst blobs = util.chunk(blob);\n\t\tlogger.log(`DC#${this.connectionId} Try to send ${blobs.length} chunks...`);\n\n\t\tfor (let blob of blobs) {\n\t\t\tthis.send(blob, true);\n\t\t}\n\t}\n\n\thandleMessage(message: ServerMessage): void {\n\t\tconst payload = message.payload;\n\n\t\tswitch (message.type) {\n\t\t\tcase ServerMessageType.Answer:\n\t\t\t\tthis._negotiator.handleSDP(message.type, payload.sdp);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Candidate:\n\t\t\t\tthis._negotiator.handleCandidate(payload.candidate);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tlogger.warn(\n\t\t\t\t\t\"Unrecognized message type:\",\n\t\t\t\t\tmessage.type,\n\t\t\t\t\t\"from peer:\",\n\t\t\t\t\tthis.peer,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t}\n\t}\n}\n","import { util } from \"./util\";\nimport logger from \"./logger\";\nimport { PeerJSOption } from \"./optionInterfaces\";\nimport { version } from \"../package.json\";\n\nexport class API {\n\tconstructor(private readonly _options: PeerJSOption) {}\n\n\tprivate _buildRequest(method: string): Promise<Response> {\n\t\tconst protocol = this._options.secure ? \"https\" : \"http\";\n\t\tconst { host, port, path, key } = this._options;\n\t\tconst url = new URL(`${protocol}://${host}:${port}${path}${key}/${method}`);\n\t\t// TODO: Why timestamp, why random?\n\t\turl.searchParams.set(\"ts\", `${Date.now()}${Math.random()}`);\n\t\turl.searchParams.set(\"version\", version);\n\t\treturn fetch(url.href, {\n\t\t\treferrerPolicy: this._options.referrerPolicy,\n\t\t});\n\t}\n\n\t/** Get a unique ID from the server via XHR and initialize with it. */\n\tasync retrieveId(): Promise<string> {\n\t\ttry {\n\t\t\tconst response = await this._buildRequest(\"id\");\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tthrow new Error(`Error. Status:${response.status}`);\n\t\t\t}\n\n\t\t\treturn response.text();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error retrieving ID\", error);\n\n\t\t\tlet pathError = \"\";\n\n\t\t\tif (\n\t\t\t\tthis._options.path === \"/\" &&\n\t\t\t\tthis._options.host !== util.CLOUD_HOST\n\t\t\t) {\n\t\t\t\tpathError =\n\t\t\t\t\t\" If you passed in a `path` to your self-hosted PeerServer, \" +\n\t\t\t\t\t\"you'll also need to pass in that same path when creating a new \" +\n\t\t\t\t\t\"Peer.\";\n\t\t\t}\n\n\t\t\tthrow new Error(\"Could not get an ID from the server.\" + pathError);\n\t\t}\n\t}\n\n\t/** @deprecated */\n\tasync listAllPeers(): Promise<any[]> {\n\t\ttry {\n\t\t\tconst response = await this._buildRequest(\"peers\");\n\n\t\t\tif (response.status !== 200) {\n\t\t\t\tif (response.status === 401) {\n\t\t\t\t\tlet helpfulError = \"\";\n\n\t\t\t\t\tif (this._options.host === util.CLOUD_HOST) {\n\t\t\t\t\t\thelpfulError =\n\t\t\t\t\t\t\t\"It looks like you're using the cloud server. You can email \" +\n\t\t\t\t\t\t\t\"team@peerjs.com to enable peer listing for your API key.\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\thelpfulError =\n\t\t\t\t\t\t\t\"You need to enable `allow_discovery` on your self-hosted \" +\n\t\t\t\t\t\t\t\"PeerServer to use this feature.\";\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new Error(\n\t\t\t\t\t\t\"It doesn't look like you have permission to list peers IDs. \" +\n\t\t\t\t\t\t\thelpfulError,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tthrow new Error(`Error. Status:${response.status}`);\n\t\t\t}\n\n\t\t\treturn response.json();\n\t\t} catch (error) {\n\t\t\tlogger.error(\"Error retrieving list peers\", error);\n\n\t\t\tthrow new Error(\"Could not get list peers from the server.\" + error);\n\t\t}\n\t}\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\tConnectionType,\n\tPeerErrorType,\n\tSocketEventType,\n\tServerMessageType,\n} from \"./enums\";\nimport { BaseConnection } from \"./baseconnection\";\nimport { ServerMessage } from \"./servermessage\";\nimport { API } from \"./api\";\nimport type {\n\tPeerConnectOption,\n\tPeerJSOption,\n\tCallOption,\n} from \"./optionInterfaces\";\n\nclass PeerOptions implements PeerJSOption {\n\tdebug?: LogLevel; // 1: Errors, 2: Warnings, 3: All logs\n\thost?: string;\n\tport?: number;\n\tpath?: string;\n\tkey?: string;\n\ttoken?: string;\n\tconfig?: any;\n\tsecure?: boolean;\n\tpingInterval?: number;\n\treferrerPolicy?: ReferrerPolicy;\n\tlogFunction?: (logLevel: LogLevel, ...rest: any[]) => void;\n}\n\ntype PeerEvents = {\n\t/**\n\t * Emitted when a connection to the PeerServer is established.\n\t */\n\topen: (id: string) => void;\n\t/**\n\t * Emitted when a new data connection is established from a remote peer.\n\t */\n\tconnection: (dataConnection: DataConnection) => void;\n\t/**\n\t * Emitted when a remote peer attempts to call you.\n\t */\n\tcall: (mediaConnection: MediaConnection) => void;\n\t/**\n\t * Emitted when the peer is destroyed and can no longer accept or create any new connections.\n\t */\n\tclose: () => void;\n\t/**\n\t * Emitted when the peer is disconnected from the signalling server\n\t */\n\tdisconnected: (currentId: string) => void;\n\t/**\n\t * Errors on the peer are almost always fatal and will destroy the peer.\n\t */\n\terror: (error: Error) => void;\n};\n/**\n * A peer who can initiate connections with other peers.\n */\nexport class Peer extends EventEmitter<PeerEvents> {\n\tprivate static readonly DEFAULT_KEY = \"peerjs\";\n\n\tprivate readonly _options: PeerOptions;\n\tprivate readonly _api: API;\n\tprivate readonly _socket: Socket;\n\n\tprivate _id: string | null = null;\n\tprivate _lastServerId: string | null = null;\n\n\t// States.\n\tprivate _destroyed = false; // Connections have been killed\n\tprivate _disconnected = false; // Connection to PeerServer killed but P2P connections still active\n\tprivate _open = false; // Sockets and such are not yet open.\n\tprivate readonly _connections: Map<string, BaseConnection[]> = new Map(); // All connections for this peer.\n\tprivate readonly _lostMessages: Map<string, ServerMessage[]> = new Map(); // src => [list of messages]\n\t/**\n\t * The brokering ID of this peer\n\t */\n\tget id() {\n\t\treturn this._id;\n\t}\n\n\tget options() {\n\t\treturn this._options;\n\t}\n\n\tget open() {\n\t\treturn this._open;\n\t}\n\n\tget socket() {\n\t\treturn this._socket;\n\t}\n\n\t/**\n\t * A hash of all connections associated with this peer, keyed by the remote peer's ID.\n\t * @deprecated\n\t * Return type will change from Object to Map<string,[]>\n\t */\n\tget connections(): Object {\n\t\tconst plainConnections = Object.create(null);\n\n\t\tfor (let [k, v] of this._connections) {\n\t\t\tplainConnections[k] = v;\n\t\t}\n\n\t\treturn plainConnections;\n\t}\n\n\t/**\n\t * true if this peer and all of its connections can no longer be used.\n\t */\n\tget destroyed() {\n\t\treturn this._destroyed;\n\t}\n\t/**\n\t * false if there is an active connection to the PeerServer.\n\t */\n\tget disconnected() {\n\t\treturn this._disconnected;\n\t}\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t */\n\tconstructor();\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t * @param options for specifying details about PeerServer\n\t */\n\tconstructor(options: PeerOptions);\n\n\t/**\n\t * A peer can connect to other peers and listen for connections.\n\t * @param id Other peers can connect to this peer using the provided ID.\n\t *     If no ID is given, one will be generated by the brokering server.\n\t * @param options for specifying details about PeerServer\n\t */\n\tconstructor(id: string, options?: PeerOptions);\n\n\tconstructor(id?: string | PeerOptions, options?: PeerOptions) {\n\t\tsuper();\n\n\t\tlet userId: string | undefined;\n\n\t\t// Deal with overloading\n\t\tif (id && id.constructor == Object) {\n\t\t\toptions = id as PeerOptions;\n\t\t} else if (id) {\n\t\t\tuserId = id.toString();\n\t\t}\n\n\t\t// Configurize options\n\t\toptions = {\n\t\t\tdebug: 0, // 1: Errors, 2: Warnings, 3: All logs\n\t\t\thost: util.CLOUD_HOST,\n\t\t\tport: util.CLOUD_PORT,\n\t\t\tpath: \"/\",\n\t\t\tkey: Peer.DEFAULT_KEY,\n\t\t\ttoken: util.randomToken(),\n\t\t\tconfig: util.defaultConfig,\n\t\t\treferrerPolicy: \"strict-origin-when-cross-origin\",\n\t\t\t...options,\n\t\t};\n\t\tthis._options = options;\n\n\t\t// Detect relative URL host.\n\t\tif (this._options.host === \"/\") {\n\t\t\tthis._options.host = window.location.hostname;\n\t\t}\n\n\t\t// Set path correctly.\n\t\tif (this._options.path) {\n\t\t\tif (this._options.path[0] !== \"/\") {\n\t\t\t\tthis._options.path = \"/\" + this._options.path;\n\t\t\t}\n\t\t\tif (this._options.path[this._options.path.length - 1] !== \"/\") {\n\t\t\t\tthis._options.path += \"/\";\n\t\t\t}\n\t\t}\n\n\t\t// Set whether we use SSL to same as current host\n\t\tif (\n\t\t\tthis._options.secure === undefined &&\n\t\t\tthis._options.host !== util.CLOUD_HOST\n\t\t) {\n\t\t\tthis._options.secure = util.isSecure();\n\t\t} else if (this._options.host == util.CLOUD_HOST) {\n\t\t\tthis._options.secure = true;\n\t\t}\n\t\t// Set a custom log function if present\n\t\tif (this._options.logFunction) {\n\t\t\tlogger.setLogFunction(this._options.logFunction);\n\t\t}\n\n\t\tlogger.logLevel = this._options.debug || 0;\n\n\t\tthis._api = new API(options);\n\t\tthis._socket = this._createServerConnection();\n\n\t\t// Sanity checks\n\t\t// Ensure WebRTC supported\n\t\tif (!util.supports.audioVideo && !util.supports.data) {\n\t\t\tthis._delayedAbort(\n\t\t\t\tPeerErrorType.BrowserIncompatible,\n\t\t\t\t\"The current browser does not support WebRTC\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\t// Ensure alphanumeric id\n\t\tif (!!userId && !util.validateId(userId)) {\n\t\t\tthis._delayedAbort(PeerErrorType.InvalidID, `ID \"${userId}\" is invalid`);\n\t\t\treturn;\n\t\t}\n\n\t\tif (userId) {\n\t\t\tthis._initialize(userId);\n\t\t} else {\n\t\t\tthis._api\n\t\t\t\t.retrieveId()\n\t\t\t\t.then((id) => this._initialize(id))\n\t\t\t\t.catch((error) => this._abort(PeerErrorType.ServerError, error));\n\t\t}\n\t}\n\n\tprivate _createServerConnection(): Socket {\n\t\tconst socket = new Socket(\n\t\t\tthis._options.secure,\n\t\t\tthis._options.host!,\n\t\t\tthis._options.port!,\n\t\t\tthis._options.path!,\n\t\t\tthis._options.key!,\n\t\t\tthis._options.pingInterval,\n\t\t);\n\n\t\tsocket.on(SocketEventType.Message, (data: ServerMessage) => {\n\t\t\tthis._handleMessage(data);\n\t\t});\n\n\t\tsocket.on(SocketEventType.Error, (error: string) => {\n\t\t\tthis._abort(PeerErrorType.SocketError, error);\n\t\t});\n\n\t\tsocket.on(SocketEventType.Disconnected, () => {\n\t\t\tif (this.disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis.emitError(PeerErrorType.Network, \"Lost connection to server.\");\n\t\t\tthis.disconnect();\n\t\t});\n\n\t\tsocket.on(SocketEventType.Close, () => {\n\t\t\tif (this.disconnected) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tthis._abort(\n\t\t\t\tPeerErrorType.SocketClosed,\n\t\t\t\t\"Underlying socket is already closed.\",\n\t\t\t);\n\t\t});\n\n\t\treturn socket;\n\t}\n\n\t/** Initialize a connection with the server. */\n\tprivate _initialize(id: string): void {\n\t\tthis._id = id;\n\t\tthis.socket.start(id, this._options.token!);\n\t}\n\n\t/** Handles messages from the server. */\n\tprivate _handleMessage(message: ServerMessage): void {\n\t\tconst type = message.type;\n\t\tconst payload = message.payload;\n\t\tconst peerId = message.src;\n\n\t\tswitch (type) {\n\t\t\tcase ServerMessageType.Open: // The connection to the server is open.\n\t\t\t\tthis._lastServerId = this.id;\n\t\t\t\tthis._open = true;\n\t\t\t\tthis.emit(\"open\", this.id);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Error: // Server error.\n\t\t\t\tthis._abort(PeerErrorType.ServerError, payload.msg);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.IdTaken: // The selected ID is taken.\n\t\t\t\tthis._abort(PeerErrorType.UnavailableID, `ID \"${this.id}\" is taken`);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.InvalidKey: // The given API key cannot be found.\n\t\t\t\tthis._abort(\n\t\t\t\t\tPeerErrorType.InvalidKey,\n\t\t\t\t\t`API KEY \"${this._options.key}\" is invalid`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Leave: // Another peer has closed its connection to this peer.\n\t\t\t\tlogger.log(`Received leave message from ${peerId}`);\n\t\t\t\tthis._cleanupPeer(peerId);\n\t\t\t\tthis._connections.delete(peerId);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Expire: // The offer sent to a peer has expired without response.\n\t\t\t\tthis.emitError(\n\t\t\t\t\tPeerErrorType.PeerUnavailable,\n\t\t\t\t\t`Could not connect to peer ${peerId}`,\n\t\t\t\t);\n\t\t\t\tbreak;\n\t\t\tcase ServerMessageType.Offer: {\n\t\t\t\t// we should consider switching this to CALL/CONNECT, but this is the least breaking option.\n\t\t\t\tconst connectionId = payload.connectionId;\n\t\t\t\tlet connection = this.getConnection(peerId, connectionId);\n\n\t\t\t\tif (connection) {\n\t\t\t\t\tconnection.close();\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`Offer received for existing Connection ID:${connectionId}`,\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\t// Create a new connection.\n\t\t\t\tif (payload.type === ConnectionType.Media) {\n\t\t\t\t\tconst mediaConnection = new MediaConnection(peerId, this, {\n\t\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t\t\t_payload: payload,\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t});\n\t\t\t\t\tconnection = mediaConnection;\n\t\t\t\t\tthis._addConnection(peerId, connection);\n\t\t\t\t\tthis.emit(\"call\", mediaConnection);\n\t\t\t\t} else if (payload.type === ConnectionType.Data) {\n\t\t\t\t\tconst dataConnection = new DataConnection(peerId, this, {\n\t\t\t\t\t\tconnectionId: connectionId,\n\t\t\t\t\t\t_payload: payload,\n\t\t\t\t\t\tmetadata: payload.metadata,\n\t\t\t\t\t\tlabel: payload.label,\n\t\t\t\t\t\tserialization: payload.serialization,\n\t\t\t\t\t\treliable: payload.reliable,\n\t\t\t\t\t});\n\t\t\t\t\tconnection = dataConnection;\n\t\t\t\t\tthis._addConnection(peerId, connection);\n\t\t\t\t\tthis.emit(\"connection\", dataConnection);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(`Received malformed connection type:${payload.type}`);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Find messages.\n\t\t\t\tconst messages = this._getMessages(connectionId);\n\t\t\t\tfor (let message of messages) {\n\t\t\t\t\tconnection.handleMessage(message);\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault: {\n\t\t\t\tif (!payload) {\n\t\t\t\t\tlogger.warn(\n\t\t\t\t\t\t`You received a malformed message from ${peerId} of type ${type}`,\n\t\t\t\t\t);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst connectionId = payload.connectionId;\n\t\t\t\tconst connection = this.getConnection(peerId, connectionId);\n\n\t\t\t\tif (connection && connection.peerConnection) {\n\t\t\t\t\t// Pass it on.\n\t\t\t\t\tconnection.handleMessage(message);\n\t\t\t\t} else if (connectionId) {\n\t\t\t\t\t// Store for possible later use\n\t\t\t\t\tthis._storeMessage(connectionId, message);\n\t\t\t\t} else {\n\t\t\t\t\tlogger.warn(\"You received an unrecognized message:\", message);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/** Stores messages without a set up connection, to be claimed later. */\n\tprivate _storeMessage(connectionId: string, message: ServerMessage): void {\n\t\tif (!this._lostMessages.has(connectionId)) {\n\t\t\tthis._lostMessages.set(connectionId, []);\n\t\t}\n\n\t\tthis._lostMessages.get(connectionId).push(message);\n\t}\n\n\t/** Retrieve messages from lost message store */\n\t//TODO Change it to private\n\tpublic _getMessages(connectionId: string): ServerMessage[] {\n\t\tconst messages = this._lostMessages.get(connectionId);\n\n\t\tif (messages) {\n\t\t\tthis._lostMessages.delete(connectionId);\n\t\t\treturn messages;\n\t\t}\n\n\t\treturn [];\n\t}\n\n\t/**\n\t * Connects to the remote peer specified by id and returns a data connection.\n\t * @param peer The brokering ID of the remote peer (their peer.id).\n\t * @param options for specifying details about Peer Connection\n\t */\n\tconnect(peer: string, options: PeerConnectOption = {}): DataConnection {\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Peer because you called \" +\n\t\t\t\t\t\".disconnect() on this Peer and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Peer to reconnect, or call reconnect \" +\n\t\t\t\t\t\"on this peer if you believe its ID to still be available.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tPeerErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Peer after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst dataConnection = new DataConnection(peer, this, options);\n\t\tthis._addConnection(peer, dataConnection);\n\t\treturn dataConnection;\n\t}\n\n\t/**\n\t * Calls the remote peer specified by id and returns a media connection.\n\t * @param peer The brokering ID of the remote peer (their peer.id).\n\t * @param stream The caller's media stream\n\t * @param options Metadata associated with the connection, passed in by whoever initiated the connection.\n\t */\n\tcall(\n\t\tpeer: string,\n\t\tstream: MediaStream,\n\t\toptions: CallOption = {},\n\t): MediaConnection {\n\t\tif (this.disconnected) {\n\t\t\tlogger.warn(\n\t\t\t\t\"You cannot connect to a new Peer because you called \" +\n\t\t\t\t\t\".disconnect() on this Peer and ended your connection with the \" +\n\t\t\t\t\t\"server. You can create a new Peer to reconnect.\",\n\t\t\t);\n\t\t\tthis.emitError(\n\t\t\t\tPeerErrorType.Disconnected,\n\t\t\t\t\"Cannot connect to new Peer after disconnecting from server.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tif (!stream) {\n\t\t\tlogger.error(\n\t\t\t\t\"To call a peer, you must provide a stream from your browser's `getUserMedia`.\",\n\t\t\t);\n\t\t\treturn;\n\t\t}\n\n\t\tconst mediaConnection = new MediaConnection(peer, this, {\n\t\t\t...options,\n\t\t\t_stream: stream,\n\t\t});\n\t\tthis._addConnection(peer, mediaConnection);\n\t\treturn mediaConnection;\n\t}\n\n\t/** Add a data/media connection to this peer. */\n\tprivate _addConnection(peerId: string, connection: BaseConnection): void {\n\t\tlogger.log(\n\t\t\t`add connection ${connection.type}:${connection.connectionId} to peerId:${peerId}`,\n\t\t);\n\n\t\tif (!this._connections.has(peerId)) {\n\t\t\tthis._connections.set(peerId, []);\n\t\t}\n\t\tthis._connections.get(peerId).push(connection);\n\t}\n\n\t//TODO should be private\n\t_removeConnection(connection: BaseConnection): void {\n\t\tconst connections = this._connections.get(connection.peer);\n\n\t\tif (connections) {\n\t\t\tconst index = connections.indexOf(connection);\n\n\t\t\tif (index !== -1) {\n\t\t\t\tconnections.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\t//remove from lost messages\n\t\tthis._lostMessages.delete(connection.connectionId);\n\t}\n\n\t/** Retrieve a data/media connection for this peer. */\n\tgetConnection(peerId: string, connectionId: string): null | BaseConnection {\n\t\tconst connections = this._connections.get(peerId);\n\t\tif (!connections) {\n\t\t\treturn null;\n\t\t}\n\n\t\tfor (let connection of connections) {\n\t\t\tif (connection.connectionId === connectionId) {\n\t\t\t\treturn connection;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate _delayedAbort(type: PeerErrorType, message: string | Error): void {\n\t\tsetTimeout(() => {\n\t\t\tthis._abort(type, message);\n\t\t}, 0);\n\t}\n\n\t/**\n\t * Emits an error message and destroys the Peer.\n\t * The Peer is not destroyed if it's in a disconnected state, in which case\n\t * it retains its disconnected state and its existing connections.\n\t */\n\tprivate _abort(type: PeerErrorType, message: string | Error): void {\n\t\tlogger.error(\"Aborting!\");\n\n\t\tthis.emitError(type, message);\n\n\t\tif (!this._lastServerId) {\n\t\t\tthis.destroy();\n\t\t} else {\n\t\t\tthis.disconnect();\n\t\t}\n\t}\n\n\t/** Emits a typed error message. */\n\temitError(type: PeerErrorType, err: string | Error): void {\n\t\tlogger.error(\"Error:\", err);\n\n\t\tlet error: Error & { type?: PeerErrorType };\n\n\t\tif (typeof err === \"string\") {\n\t\t\terror = new Error(err);\n\t\t} else {\n\t\t\terror = err as Error;\n\t\t}\n\n\t\terror.type = type;\n\n\t\tthis.emit(\"error\", error);\n\t}\n\n\t/**\n\t * Destroys the Peer: closes all active connections as well as the connection\n\t *  to the server.\n\t * Warning: The peer can no longer create or accept connections after being\n\t *  destroyed.\n\t */\n\tdestroy(): void {\n\t\tif (this.destroyed) {\n\t\t\treturn;\n\t\t}\n\n\t\tlogger.log(`Destroy peer with ID:${this.id}`);\n\n\t\tthis.disconnect();\n\t\tthis._cleanup();\n\n\t\tthis._destroyed = true;\n\n\t\tthis.emit(\"close\");\n\t}\n\n\t/** Disconnects every connection on this peer. */\n\tprivate _cleanup(): void {\n\t\tfor (let peerId of this._connections.keys()) {\n\t\t\tthis._cleanupPeer(peerId);\n\t\t\tthis._connections.delete(peerId);\n\t\t}\n\n\t\tthis.socket.removeAllListeners();\n\t}\n\n\t/** Closes all connections to this peer. */\n\tprivate _cleanupPeer(peerId: string): void {\n\t\tconst connections = this._connections.get(peerId);\n\n\t\tif (!connections) return;\n\n\t\tfor (let connection of connections) {\n\t\t\tconnection.close();\n\t\t}\n\t}\n\n\t/**\n\t * Disconnects the Peer's connection to the PeerServer. Does not close any\n\t *  active connections.\n\t * Warning: The peer can no longer create or accept connections after being\n\t *  disconnected. It also cannot reconnect to the server.\n\t */\n\tdisconnect(): void {\n\t\tif (this.disconnected) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst currentId = this.id;\n\n\t\tlogger.log(`Disconnect peer with ID:${currentId}`);\n\n\t\tthis._disconnected = true;\n\t\tthis._open = false;\n\n\t\tthis.socket.close();\n\n\t\tthis._lastServerId = currentId;\n\t\tthis._id = null;\n\n\t\tthis.emit(\"disconnected\", currentId);\n\t}\n\n\t/** Attempts to reconnect with the same ID. */\n\treconnect(): void {\n\t\tif (this.disconnected && !this.destroyed) {\n\t\t\tlogger.log(\n\t\t\t\t`Attempting reconnection to server with ID ${this._lastServerId}`,\n\t\t\t);\n\t\t\tthis._disconnected = false;\n\t\t\tthis._initialize(this._lastServerId!);\n\t\t} else if (this.destroyed) {\n\t\t\tthrow new Error(\n\t\t\t\t\"This peer cannot reconnect to the server. It has already been destroyed.\",\n\t\t\t);\n\t\t} else if (!this.disconnected && !this.open) {\n\t\t\t// Do nothing. We're still connecting the first time.\n\t\t\tlogger.error(\n\t\t\t\t\"In a hurry? We're still trying to make the initial connection!\",\n\t\t\t);\n\t\t} else {\n\t\t\tthrow new Error(\n\t\t\t\t`Peer ${this.id} cannot reconnect because it is not disconnected from the server!`,\n\t\t\t);\n\t\t}\n\t}\n\n\t/**\n\t * Get a list of available peer IDs. If you're running your own server, you'll\n\t * want to set allow_discovery: true in the PeerServer options. If you're using\n\t * the cloud server, email team@peerjs.com to get the functionality enabled for\n\t * your key.\n\t */\n\tlistAllPeers(cb = (_: any[]) => {}): void {\n\t\tthis._api\n\t\t\t.listAllPeers()\n\t\t\t.then((peers) => cb(peers))\n\t\t\t.catch((error) => this._abort(PeerErrorType.ServerError, error));\n\t}\n}\n","import { util } from \"./util\";\nimport { Peer } from \"./peer\";\n\n(<any>window).peerjs = {\n\tPeer,\n\tutil,\n};\n/** @deprecated Should use peerjs namespace */\n(<any>window).Peer = Peer;\n"],"names":["$d0deb92b62ba37af$export$509f631d27be0664","$d0deb92b62ba37af$export$562ca14a3ed92113","$e390062f01ce1e86$export$2e2bcd8739ae039","obj","key","value","Object","defineProperty","enumerable","configurable","writable","$4c7d96c815e59b01$export$2e2bcd8739ae039","arr","len","length","i","arr2","Array","$d63c5c95d463670a$export$2e2bcd8739ae039","isArray","$daa6837517a3654a$export$2e2bcd8739ae039","iter","Symbol","iterator","from","$1024183ffa47274a$export$2e2bcd8739ae039","o","minLen","n","prototype","toString","call","slice","constructor","name","test","$a3a7f41c9af2e516$export$2e2bcd8739ae039","TypeError","$154286670c1756ef$export$2e2bcd8739ae039","$b826c41e2a74be3e$export$2e2bcd8739ae039","$d0deb92b62ba37af$var$binaryFeatures","useBlobBuilder","Blob","e","useArrayBufferView","Uint8Array","size","$d0deb92b62ba37af$var$BlobBuilder","$d0deb92b62ba37af$var$BufferBuilder","this","_pieces","_parts","window","WebKitBlobBuilder","MozBlobBuilder","MSBlobBuilder","BlobBuilder","append","data","push","flush","buf","buffer","getBuffer","builder","ii","getBlob","$b610f1050453c3d7$var$Unpacker","index","dataBuffer","dataView","byteLength","$b610f1050453c3d7$var$Packer","bufferBuilder","$b610f1050453c3d7$require$BufferBuilder","$b610f1050453c3d7$var$_utf8Replace","m","code","charCodeAt","$b610f1050453c3d7$exports","unpack","pack","packer","type","unpack_uint8","unpack_raw","unpack_string","unpack_array","unpack_map","unpack_float","unpack_double","unpack_uint16","unpack_uint32","unpack_uint64","unpack_int8","unpack_int16","unpack_int32","unpack_int64","_byte","bytes","read","uint16","uint32","uint64","uint8","Math","pow","Error","c","str","String","fromCharCode","objects","map","exp","h32","l32","j","subarray","pack_string","floor","pack_integer","pack_double","pack_array","File","pack_bin","ArrayBuffer","$b610f1050453c3d7$require$binaryFeatures","startsWith","pack_object","Date","toBinaryPack","blob","pack_uint8","pack_uint16","pack_uint32","replace","$b610f1050453c3d7$var$utf8Length","ary","num","pack_int8","pack_int16","pack_int32","pack_int64","pack_uint64","sign","log","LN2","frac0","frac1","b32","keys","prop","hasOwnProperty","high","low","$0d0b08961b0081c3$var$logDisabled_","$0d0b08961b0081c3$var$deprecationWarnings_","$0d0b08961b0081c3$export$e3c02be309be1f23","uastring","expr","pos","match","parseInt","$0d0b08961b0081c3$export$1f48841962b828b1","eventNameToWrap","wrapper","RTCPeerConnection","proto","nativeAddEventListener","addEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","modifiedEvent","handleEvent","_eventMap","Map","set","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","get","$0d0b08961b0081c3$export$afbfee8cc06fd3e4","bool","$0d0b08961b0081c3$export$51516be4b019e41e","$0d0b08961b0081c3$export$bef1f36f5486a6a3","console","$0d0b08961b0081c3$export$cdd73fc4100a6ef4","oldMethod","newMethod","warn","$0d0b08961b0081c3$export$2d31490a0c05f094","result","browser","version","navigator","mozGetUserMedia","userAgent","webkitGetUserMedia","isSecureContext","webkitRTCPeerConnection","RTCIceGatherer","mediaDevices","supportsUnifiedPlan","RTCRtpTransceiver","$0d0b08961b0081c3$var$isObject","val","$0d0b08961b0081c3$export$15384eac40dc88c8","reduce","accumulator","isObj","isEmptyObject","undefined","assign","$0d0b08961b0081c3$export$571b373e75babb58","stats","base","resultSet","id","forEach","endsWith","$0d0b08961b0081c3$export$93439ffc3f787d51","track","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","$cda7b3c7a363854f$var$logging","$cda7b3c7a363854f$export$1ed4910f4d37dc5e","browserDetails","constraintsToChrome_","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","oc","mix","advanced","concat","shimConstraints_","constraints","func","JSON","parse","stringify","audio","remap","a","b","video","face","facingMode","matches","getSupportedFacingModeLies","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","$f9be0d611c397b4f$export$97270b87351d9c04","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","$f1b9f505f654c99a$export$33ee24e7a300bcd1","MediaStream","webkitMediaStream","$f1b9f505f654c99a$export$f358708f68ab068","_ontrack","f","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","_this1","event","Event","transceiver","streams","dispatchEvent","$f1b9f505f654c99a$export$a41a030a2842f5d6","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","_this","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","$f1b9f505f654c99a$export$90608323826f0b17","origGetStats","getStats","_arguments","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","successCallbackWrapper_","resolve","$f1b9f505f654c99a$export$f2f0f2338114eb4b","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","$f1b9f505f654c99a$export$30e3cdd46f8d5100","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","$f1b9f505f654c99a$export$9588259fcf4ebc91","replaceInternalStreamId","description","sdp","_reverseStreams","internalId","externalStream","internalStream","_streams","RegExp","RTCSessionDescription","replaceExternalStreamId","origGetLocalStreams","nativeStreams","newStream","signalingState","t","alreadyExists","oldStream","method","nativeMethod","methodObj","args","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","streamid","$f1b9f505f654c99a$export$852a08dda9a55ea7","RTCIceCandidate","$f1b9f505f654c99a$export$341293bbeaae37cb","target","getConfiguration","sdpSemantics","$ca3a0d10766caa3d$var$SDPUtils","$ec1e93c8a4e94ef3$var$writeMediaSection","caps","dtlsRole","$ca3a0d10766caa3d$exports","writeRtpDescription","writeIceParameters","iceGatherer","getLocalParameters","writeDtlsParameters","dtlsTransport","mid","rtpSender","rtpReceiver","_initialTrackId","msid","sendEncodingParameters","ssrc","rtx","localCName","$ec1e93c8a4e94ef3$var$getCommonCapabilities","localCapabilities","remoteCapabilities","commonCapabilities","codecs","headerExtensions","fecMechanisms","findCodecByPayloadType","pt","payloadType","preferredPayloadType","rtxCapabilityMatches","lRtx","rRtx","lCodecs","rCodecs","lCodec","parameters","apt","rCodec","clockRate","numChannels","rtcpFeedback","fb","parameter","lHeaderExtension","rHeaderExtension","uri","$ec1e93c8a4e94ef3$var$isActionAllowedInSignalingState","action","offer","answer","$ec1e93c8a4e94ef3$var$maybeAddCandidate","iceTransport","candidate","alreadyAdded","getRemoteCandidates","remoteCandidate","foundation","ip","port","priority","protocol","addRemoteCandidate","$ec1e93c8a4e94ef3$var$makeError","NotSupportedError","InvalidAccessError","OperationError","$138d880f2e85685d$export$1ed4910f4d37dc5e","$df9caca4ae4de90c$export$97270b87351d9c04","$76a00212fed855d8$export$852a08dda9a55ea7","origMSTEnabled","ev","enabled","RTCDtmfSender","RTCDTMFSender","RTCPeerConnectionShim","$parcel$interopDefault","$ec1e93c8a4e94ef3$exports","config","iceServers","hasTurn","server","urls","url","isString","validTurn","$76a00212fed855d8$export$72e310cc73676e34","replaceTrack","setTrack","generateIdentifier","random","substr","splitLines","trim","split","line","splitSections","part","getDescription","sections","getMediaSections","shift","matchPrefix","parseCandidate","parts","substring","component","address","relatedAddress","relatedPort","tcpType","ufrag","usernameFragment","writeCandidate","join","parseIceOptions","parseRtpMap","parsed","channels","writeRtpMap","codec","parseExtmap","direction","writeExtmap","headerExtension","preferredId","parseFmtp","kv","writeFmtp","params","param","parseRtcpFb","writeRtcpFb","lines","parseSsrcMedia","sp","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mediaSection","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","parseRtpParameters","rtcp","mline","rtpmapline","fmtps","maxptime","extension","parseRtpEncodingParameters","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","encParam","codecPayloadType","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","parseMsid","spec","planB","msidParts","parseSctpDescription","maxMessageSize","parseMLine","maxSizeLine","isNaN","sctpPort","fmt","writeSctpDescription","media","sctp","output","generateSessionId","writeSessionBoilerplate","sessId","sessVer","sessUser","writeMediaSection","getDirection","getKind","isRejected","parseOLine","username","sessionId","sessionVersion","netType","addressType","isValidSDP","edgeVersion","addTrackToStreamAndFireEvent","MediaStreamTrackEvent","fireAddTrack","trackEvent","setTimeout","_dispatchEvent","_eventTarget","document","createDocumentFragment","canTrickleIceCandidates","needNegotiation","localStreams","remoteStreams","_localDescription","_remoteDescription","iceConnectionState","connectionState","iceGatheringState","usingBundle","bundlePolicy","rtcpMuxPolicy","iceTransportPolicy","$ec1e93c8a4e94ef3$var$filterIceServers","_iceGatherers","iceCandidatePoolSize","gatherPolicy","_config","transceivers","_sdpSessionId","_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","_createIceGatherer","sdpMLineIndex","bufferedCandidateEvents","bufferCandidates","end","state","_gather","onlocalcandidate","evt","sdpMid","cand","serializedCandidate","toJSON","complete","every","RTCIceTransport","onicestatechange","_updateIceConnectionState","_updateConnectionState","RTCDtlsTransport","ondtlsstatechange","onerror","_disposeIceAndDtlsTransports","_transceive","send","recv","encodings","p","receive","isIceLite","rejected","remoteIceParameters","remoteDtlsParameters","start","_updateSignalingState","receiverList","iceOptions","remoteMsid","isComplete","cands","setTransport","setRemoteCandidates","getCapabilities","isNewTrack","nativeTrack","removeTrackFromStreamAndFireEvent","sid","item","close","newState","states","new","closed","checking","connected","completed","disconnected","failed","connecting","createOffer","numAudioTracks","numVideoTracks","offerOptions","offerToReceiveAudio","offerToReceiveVideo","remoteCodec","hdrExt","rHdrExt","getLocalCandidates","createAnswer","mediaSectionsInOffer","localTrack","addIceCandidate","candidateString","senderOrReceiver","promises","all","allStats","results","ortcObjectName","nativeGetstats","nativeStats","mapStats","inboundrtp","outboundrtp","candidatepair","methods","$b033bb08f456f92a$export$1ed4910f4d37dc5e","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","$59034b14d00c862d$export$97270b87351d9c04","preferredMediaSource","mediaSource","$12e2b71339a85846$export$f358708f68ab068","RTCTrackEvent","$12e2b71339a85846$export$852a08dda9a55ea7","mozRTCPeerConnection","modernStatsTypes","nativeGetStats","$12e2b71339a85846$export$f0525502095c04ef","$12e2b71339a85846$export$83d69126527b1171","$12e2b71339a85846$export$825e523ef749bd8c","$12e2b71339a85846$export$ff9cb3bc8990e8f7","DataChannel","RTCDataChannel","$12e2b71339a85846$export$70c77533b6e9908d","origAddTransceiver","addTransceiver","setParametersPromises","initParameters","shouldPerformCheck","sendEncodings","encodingParam","rid","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","getParameters","setParameters","$12e2b71339a85846$export$66238223c298fbaa","origGetParameters","$12e2b71339a85846$export$51beccf0e777b843","origCreateOffer","$12e2b71339a85846$export$df0b46e7cef08150","origCreateAnswer","$ac273377206128d6$export$8df41282f4fdcea2","_localStreams","_addTrack","_len","_key","tracks","$ac273377206128d6$export$762aa4cbb4f2f857","_remoteStreams","_onaddstream","_onaddstreampoly","$ac273377206128d6$export$da31df245debdd3","successCallback","failureCallback","options","promise","withCallback","$ac273377206128d6$export$1ed4910f4d37dc5e","_getUserMedia","$ac273377206128d6$export$494a01ac68ba81ac","errcb","$ac273377206128d6$export$671a8b47b41b6f41","OrigPeerConnection","pcConfig","pcConstraints","newIceServers","generateCertificate","$ac273377206128d6$export$85d53da088cb1b14","$ac273377206128d6$export$d444266503fdd2d4","audioTransceiver","getTransceivers","setDirection","videoTransceiver","$ac273377206128d6$export$857cd739a7b795d2","AudioContext","webkitAudioContext","$869e4bc85a814c01$export$cf133661e444ccfe","NativeRTCIceCandidate","nativeCandidate","parsedCandidate","augmentedCandidate","$869e4bc85a814c01$export$a99147c78a56edc4","_sctp","sctpInDescription","mLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","getMaxMessageSize","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","$869e4bc85a814c01$export$d461c8d5c5db5da7","wrapDcSend","dc","origDataChannelSend","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","$869e4bc85a814c01$export$63bb816cc75460","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","newEvent","$869e4bc85a814c01$export$a57d114344295149","nativeSRD","$869e4bc85a814c01$export$51d5e40b48c771c7","nativeAddIceCandidate","class_1","Util","$4adcc250aa684aea$export$2e2bcd8739ae039","shimChrome","shimFirefox","shimEdge","shimSafari","logging","adapter","commonShim","$869e4bc85a814c01$exports","extractVersion","disableLog","disableWarnings","$f1b9f505f654c99a$exports","shimPeerConnection","browserShim","shimAddIceCandidateNullOrEmpty","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRTCIceCandidate","shimConnectionState","shimMaxMessageSize","shimSendThrowTypeError","removeExtmapAllowMixed","$12e2b71339a85846$exports","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimGetParameters","shimCreateOffer","shimCreateAnswer","$76a00212fed855d8$exports","shimGetDisplayMedia","shimReplaceTrack","$ac273377206128d6$exports","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimAudioContext","$3f74585227f7b732$export$e77bf46c04ac7d12","$c7c703f65db13212$var$webRTCAdapter","$c7c703f65db13212$export$25be9502477c137d","isIOS","platform","supportedBrowsers","minFirefoxVersion","minChromeVersion","minSafariVersion","isWebRTCSupported","isBrowserSupported","getBrowser","getVersion","isUnifiedPlanSupported","tempPc","supported","$46e8a63be2e817d0$var$DEFAULT_CONFIG","credential","$46e8a63be2e817d0$export$7debb50ef11d5e0b","CLOUD_HOST","CLOUD_PORT","chunkedBrowsers","Chrome","chrome","chunkedMTU","defaultConfig","browserVersion","supports","webRTC","audioVideo","binaryBlob","reliable","ordered","binaryType","_dataCount","noop","validateId","chunk","chunks","total","ceil","__peerData","blobToArrayBuffer","fr","FileReader","onload","readAsArrayBuffer","binaryStringToArrayBuffer","binary","byteArray","randomToken","isSecure","location","$ca50aa4ed0ee4bf4$var$has","$ca50aa4ed0ee4bf4$var$prefix","$ca50aa4ed0ee4bf4$var$Events","$ca50aa4ed0ee4bf4$var$EE","fn","context","once","$ca50aa4ed0ee4bf4$var$addListener","emitter","listener","_events","_eventsCount","$ca50aa4ed0ee4bf4$var$clearEvent","$ca50aa4ed0ee4bf4$var$EventEmitter","create","__proto__","eventNames","events","getOwnPropertySymbols","listeners","handlers","l","ee","listenerCount","emit","a1","a2","a3","a4","a5","removeListener","on","removeAllListeners","off","addListener","prefixed","EventEmitter","$ca50aa4ed0ee4bf4$exports","$a1e3811c6d0a8896$export$243e62d78d3b544d","Logger","$53ff71d758642b7a$export$4aa6b1b0bfb253ab","$53ff71d758642b7a$export$3157d57b4135e3bc","$53ff71d758642b7a$export$9547aaa2e39030ff","$53ff71d758642b7a$export$89f507cf986a947","$53ff71d758642b7a$export$3b5c4a4b6354f023","$53ff71d758642b7a$export$adb4a1754da6f10d","$a1e3811c6d0a8896$export$2e2bcd8739ae039","_logLevel","Disabled","logLevel","_i","All","_print","$a1e3811c6d0a8896$var$__spreadArray","$a1e3811c6d0a8896$var$__read","Warnings","Errors","setLogFunction","rest","copy","$2fc88cc6d1ffa651$exports","$37ebdaf65740007d$export$4798917dbf149b79","_super","secure","host","path","pingInterval","_disconnected","_messagesQueue","wsProtocol","_baseUrl","$37ebdaf65740007d$var$__extends","token","_id","wsUrl","_socket","WebSocket","onmessage","$a1e3811c6d0a8896$exports","default","Message","onclose","_cleanup","Disconnected","onopen","_sendQueuedMessages","_scheduleHeartbeat","_wsPingTimer","_sendHeartbeat","_wsOpen","Heartbeat","copiedQueue","$37ebdaf65740007d$var$__spreadArray","$37ebdaf65740007d$var$__read","copiedQueue_1","$37ebdaf65740007d$var$__values","copiedQueue_1_1","next","done","clearTimeout","$d61843375e474256$export$89e6bb5ad64bf4a","connection","startConnection","peerConnection","_startPeerConnection","Media","_stream","_addTracksToConnection","originator","Data","dataConnection","initialize","_makeOffer","handleSDP","provider","_setupListeners","peerId","peer","connectionId","connectionType","socket","Candidate","payload","dst","IceStateChanged","getConnection","mediaConnection","_addStreamToMediaConnection","cleanup","peerConnectionNotClosed","dataChannelNotClosed","$d61843375e474256$var$__awaiter","_a","sent","sdpTransform","metadata","$d61843375e474256$var$__assign","serialization","Offer","emitError","WebRTC","err_2","err_1_1","_makeAnswer","Answer","err_3","err_1_2","self","err_4","handleCandidate","ice","err_5","$a7bf07b4f421b3db$export$23a2a68283c24d80","_open","$a7bf07b4f421b3db$var$__extends","$6c1bdce317f04805$export$4a84e95a2324ac29","_localStream","ID_PREFIX","_negotiator","$d61843375e474256$exports","Negotiator","$6c1bdce317f04805$var$__extends","_remoteStream","remoteStream","Stream","handleMessage","$6c1bdce317f04805$var$__assign","_payload","messages","_getMessages","messages_1","$6c1bdce317f04805$var$__values","messages_1_1","_removeConnection","open","Close","$a7bf07b4f421b3db$exports","BaseConnection","$3643f94da0f68d28$export$c6913ae0ed687038","fileReader","_queue","_processing","doNextTask","destroy","$3643f94da0f68d28$var$__extends","queue","enque","processing","abort","$93501d63f2f3efc8$export$d365f7ad9d7df9c9","_buffer","_bufferSize","_buffering","_chunkedData","_encodingQueue","$3643f94da0f68d28$exports","EncodingQueue","Binary","ab","_bufferedSend","$93501d63f2f3efc8$var$__extends","_dc","_configureDataChannel","Open","_handleDataMessage","datatype","deserializedData","BinaryUTF8","unpackedData","ab1","_handleChunk","chunkInfo","count","data_1","chunked","_sendChunks","msg","_trySend","bufferedAmount","MAX_BUFFERED_AMOUNT","_tryBuffer","blobs","blobs_1","$93501d63f2f3efc8$var$__values","blobs_1_1","blob_1","$62c85f439ecd1dde$export$2c4e825dc9120f87","_options","_buildRequest","URL","searchParams","now","fetch","href","referrerPolicy","retrieveId","$62c85f439ecd1dde$var$__awaiter","status","text","error_1","pathError","listAllPeers","helpfulError","json","error_2","$74c56b90a5356403$export$ecd1fc136c422448","id1","userId","_lastServerId","_destroyed","_connections","_lostMessages","$74c56b90a5356403$var$__assign","debug","DEFAULT_KEY","hostname","logFunction","_api","$62c85f439ecd1dde$exports","API","_createServerConnection","_delayedAbort","InvalidID","_initialize","_abort","ServerError","BrowserIncompatible","$74c56b90a5356403$var$__extends","plainConnections","_b","$74c56b90a5356403$var$__values","_c","_d","$74c56b90a5356403$var$__read","k","v","$37ebdaf65740007d$exports","Socket","_handleMessage","SocketError","Network","disconnect","SocketClosed","src","IdTaken","UnavailableID","InvalidKey","Leave","_cleanupPeer","Expire","PeerUnavailable","$6c1bdce317f04805$exports","MediaConnection","_addConnection","$93501d63f2f3efc8$exports","DataConnection","message_1","_storeMessage","connect","connections","connections_1","connections_1_1","destroyed","connections_2","connections_2_1","currentId","reconnect","_","peers","peerjs","Peer","$74c56b90a5356403$exports","util"],"version":3,"file":"peerjs.min.cjs.map"}