From 326682aa25dd5b0d99a87aa75ac28e6cc95eff9f Mon Sep 17 00:00:00 2001 From: abdussamedulutas Date: Sun, 13 Jul 2025 17:31:42 +0300 Subject: [PATCH] Perfect nogation --- script/index.js | 4296 +------------------------------------------ script/index.js.map | 2 +- 2 files changed, 2 insertions(+), 4296 deletions(-) diff --git a/script/index.js b/script/index.js index 01ccb57..85d9573 100644 --- a/script/index.js +++ b/script/index.js @@ -1,4296 +1,2 @@ -// modules are defined as an array -// [ module function, map of requires ] -// -// map of requires is short require name -> numeric require -// -// anything defined in a previous bundle is accessed via the -// orig method which is the require for previous bundles - -(function ( - modules, - entry, - mainEntry, - parcelRequireName, - externals, - distDir, - publicUrl, - devServer -) { - /* eslint-disable no-undef */ - var globalObject = - typeof globalThis !== 'undefined' - ? globalThis - : typeof self !== 'undefined' - ? self - : typeof window !== 'undefined' - ? window - : typeof global !== 'undefined' - ? global - : {}; - /* eslint-enable no-undef */ - - // Save the require from previous bundle to this closure if any - var previousRequire = - typeof globalObject[parcelRequireName] === 'function' && - globalObject[parcelRequireName]; - - var importMap = previousRequire.i || {}; - var cache = previousRequire.cache || {}; - // Do not use `require` to prevent Webpack from trying to bundle this call - var nodeRequire = - typeof module !== 'undefined' && - typeof module.require === 'function' && - module.require.bind(module); - - function newRequire(name, jumped) { - if (!cache[name]) { - if (!modules[name]) { - if (externals[name]) { - return externals[name]; - } - // if we cannot find the module within our internal map or - // cache jump to the current global require ie. the last bundle - // that was added to the page. - var currentRequire = - typeof globalObject[parcelRequireName] === 'function' && - globalObject[parcelRequireName]; - if (!jumped && currentRequire) { - return currentRequire(name, true); - } - - // If there are other bundles on this page the require from the - // previous one is saved to 'previousRequire'. Repeat this as - // many times as there are bundles until the module is found or - // we exhaust the require chain. - if (previousRequire) { - return previousRequire(name, true); - } - - // Try the node require function if it exists. - if (nodeRequire && typeof name === 'string') { - return nodeRequire(name); - } - - var err = new Error("Cannot find module '" + name + "'"); - err.code = 'MODULE_NOT_FOUND'; - throw err; - } - - localRequire.resolve = resolve; - localRequire.cache = {}; - - var module = (cache[name] = new newRequire.Module(name)); - - modules[name][0].call( - module.exports, - localRequire, - module, - module.exports, - globalObject - ); - } - - return cache[name].exports; - - function localRequire(x) { - var res = localRequire.resolve(x); - return res === false ? {} : newRequire(res); - } - - function resolve(x) { - var id = modules[name][1][x]; - return id != null ? id : x; - } - } - - function Module(moduleName) { - this.id = moduleName; - this.bundle = newRequire; - this.require = nodeRequire; - this.exports = {}; - } - - newRequire.isParcelRequire = true; - newRequire.Module = Module; - newRequire.modules = modules; - newRequire.cache = cache; - newRequire.parent = previousRequire; - newRequire.distDir = distDir; - newRequire.publicUrl = publicUrl; - newRequire.devServer = devServer; - newRequire.i = importMap; - newRequire.register = function (id, exports) { - modules[id] = [ - function (require, module) { - module.exports = exports; - }, - {}, - ]; - }; - - // Only insert newRequire.load when it is actually used. - // The code in this file is linted against ES5, so dynamic import is not allowed. - // INSERT_LOAD_HERE - - Object.defineProperty(newRequire, 'root', { - get: function () { - return globalObject[parcelRequireName]; - }, - }); - - globalObject[parcelRequireName] = newRequire; - - for (var i = 0; i < entry.length; i++) { - newRequire(entry[i]); - } - - if (mainEntry) { - // Expose entry point to Node, AMD or browser globals - // Based on https://github.com/ForbesLindesay/umd/blob/master/template.js - var mainExports = newRequire(mainEntry); - - // CommonJS - if (typeof exports === 'object' && typeof module !== 'undefined') { - module.exports = mainExports; - - // RequireJS - } else if (typeof define === 'function' && define.amd) { - define(function () { - return mainExports; - }); - } - } -})({"3FuxY":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -var _connection = require("./Connection"); -var _eventPool = require("./EventPool"); -var _eventPoolDefault = parcelHelpers.interopDefault(_eventPool); -var _eventTarget = require("./EventTarget"); -var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); -var _ippressure = require("./IPPressure"); -var _peer = require("./Peer"); -var _peerDefault = parcelHelpers.interopDefault(_peer); -var _room = require("./Room"); -var _roomDefault = parcelHelpers.interopDefault(_room); -var _wstsprotocol = require("./WSTSProtocol"); -var _wstsprotocolDefault = parcelHelpers.interopDefault(_wstsprotocol); -class MWSE extends (0, _eventTargetDefault.default) { - /*public static compress(message:string, callback:(e:any) => any) - { - let u : any= []; - let C = new Gzip({ - level: 9, - mem: 12 - },(stream,isLast) => { - u.push(stream); - if(isLast) - { - callback(u); - } - }); - C.push(new TextEncoder().encode(message), true); - }*/ constructor(options){ - super(), this.rooms = new Map(), this.pairs = new Map(), this.peers = new Map(), this.writable = 1, this.readable = 1; - MWSE.rtc = MWSE; - this.server = new (0, _connection.Connection)(this, options); - this.WSTSProtocol = new (0, _wstsprotocolDefault.default)(this); - this.EventPooling = new (0, _eventPoolDefault.default)(this); - this.virtualPressure = new (0, _ippressure.IPPressure)(this); - this.server.connect(); - this.me = new (0, _peerDefault.default)(this); - this.me.scope(()=>{ - this.peers.set('me', this.me); - this.peers.set(this.me.socketId, this.me); - }); - this.server.onActive(async ()=>{ - this.me.setSocketId('me'); - await this.me.metadata(); - this.emit('scope'); - this.activeScope = true; - }); - this.server.onPassive(async ()=>{ - this.emit('close'); - }); - this.packMessagingSystem(); - } - destroy() { - this.server.disconnect(); - } - enableRecaiveData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packrecaive', - value: 1 - }); - this.readable = 1; - } - disableRecaiveData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packrecaive', - value: 0 - }); - this.readable = 0; - } - enableSendData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packsending', - value: 1 - }); - this.writable = 1; - } - disableSendData() { - this.WSTSProtocol.SendOnly({ - type: 'connection/packsending', - value: 0 - }); - this.writable = 0; - } - enableNotifyRoomInfo() { - this.WSTSProtocol.SendOnly({ - type: 'connection/roominfo', - value: 1 - }); - } - disableNotifyRoomInfo() { - this.WSTSProtocol.SendOnly({ - type: 'connection/roominfo', - value: 0 - }); - } - async request(peerId, pack) { - let { pack: answer } = await this.EventPooling.request({ - type: 'request/to', - to: peerId, - pack - }); - return answer; - } - async response(peerId, requestId, pack) { - this.WSTSProtocol.SendOnly({ - type: 'response/to', - to: peerId, - pack, - id: requestId - }); - } - packMessagingSystem() { - this.EventPooling.signal('pack', (payload)=>{ - if (this.readable) { - let { from, pack } = payload; - this.peer(from, true).emit('pack', pack); - } - }); - this.EventPooling.signal('request', (payload)=>{ - let { from, pack, id } = payload; - let scope = { - body: pack, - response: (pack)=>{ - this.response(from, id, pack); - }, - peer: this.peer(from, true) - }; - this.peer(from, true).emit('request', scope); - this.peer('me').emit('request', scope); - }); - this.EventPooling.signal('pack/room', (payload)=>{ - if (this.readable) { - let { from, pack, sender } = payload; - this.room(from).emit('message', pack, this.peer(sender)); - } - }); - this.EventPooling.signal('room/joined', (payload)=>{ - let { id, roomid } = payload; - let room = this.room(roomid); - let peer = this.peer(id, true); - room.peers.set(peer.socketId, peer); - room.emit('join', peer); - }); - this.EventPooling.signal('room/info', (payload)=>{ - let { roomId, name, value } = payload; - this.room(roomId).emit('updateinfo', name, value); - }); - this.EventPooling.signal('room/ejected', (payload)=>{ - let { id, roomid } = payload; - let room = this.room(roomid); - let peer = this.peer(id, true); - room.peers.delete(peer.socketId); - room.emit('eject', peer); - }); - this.EventPooling.signal('room/closed', (payload)=>{ - let { roomid } = payload; - let room = this.room(roomid); - room.peers.clear(); - room.emit('close'); - this.rooms.delete(roomid); - }); - this.EventPooling.signal("pair/info", (payload)=>{ - let { from, name, value } = payload; - let peer = this.peer(from, true); - peer.info.info[name] = value; - peer.emit("info", name, value); - }); - this.EventPooling.signal("request/pair", (payload)=>{ - let { from, info } = payload; - let peer = this.peer(from, true); - peer.info.info = info; - peer.emit("request/pair", peer); - this.peer('me').emit('request/pair', peer); - }); - this.EventPooling.signal("peer/disconnect", (payload)=>{ - let { id } = payload; - let peer = this.peer(id, true); - peer.emit("disconnect", peer); - }); - this.EventPooling.signal("accepted/pair", (payload)=>{ - let { from, info } = payload; - let peer = this.peer(from, true); - peer.info.info = info; - peer.emit("accepted/pair", peer); - this.peer('me').emit('accepted/pairr', peer); - }); - this.EventPooling.signal("end/pair", (payload)=>{ - let { from, info } = payload; - let peer = this.peer(from, true); - peer.emit("endPair", info); - this.peer('me').emit('endPair', from, info); - }); - } - room(options) { - if (typeof options == "string") { - if (this.rooms.has(options)) return this.rooms.get(options); - } - let room = new (0, _roomDefault.default)(this); - room.setRoomOptions(options); - this.emit('room'); - return room; - } - peer(options, isActive = false) { - if (typeof options == "string") { - if (this.peers.has(options)) return this.peers.get(options); - if (this.pairs.has(options)) return this.pairs.get(options); - } - let peer = new (0, _peerDefault.default)(this); - peer.setPeerOptions(options); - peer.active = isActive; - this.peers.set(peer.socketId, peer); - this.emit('peer', peer); - return peer; - } -} -exports.default = MWSE; -window.MWSE = MWSE; - -},{"./Connection":"1vUh4","./EventPool":"602qx","./EventTarget":"faGYI","./IPPressure":"l0Hru","./Peer":"imPsO","./Room":"7JoU4","./WSTSProtocol":"i9gBw","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"1vUh4":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "Connection", ()=>Connection); -class Connection { - constructor(mwse, options){ - this.autoPair = false; - this.connected = false; - this.autoReconnect = true; - this.autoReconnectTimeout = 3000; - this.recaivePackEvent = []; - this.activeConnectionEvent = []; - this.passiveConnectionEvent = []; - if (options.endpoint == "auto") { - const RootURL = document.currentScript.src; - let scriptPath = new URL(RootURL); - let isSecurity = scriptPath.protocol == "https:"; - let dumeUrl = scriptPath.pathname.split('/').slice(0, -1).join('/') + '/'; - let wsSocket = new URL(dumeUrl, scriptPath); - wsSocket.protocol = isSecurity ? 'wss:' : 'ws:'; - this.endpoint = new URL(wsSocket.href); - } else try { - // Testing - this.endpoint = new URL(options.endpoint); - } catch { - throw new Error("endpoint is required"); - } - if (typeof options.autoReconnect == "boolean") this.autoReconnect = true; - else if (options.autoReconnect) { - this.autoReconnect = true; - this.autoReconnectTimeout = options.autoReconnect.timeout; - } - } - connect() { - if (this.autoReconnectTimer) clearTimeout(this.autoReconnectTimer); - this.ws = new WebSocket(this.endpoint.href); - this.addWSEvents(); - } - disconnect() { - /** - * Eğer bilinerek elle kapatıldıysa otomatik tekrar bağlanmasının - * önüne geçmek için autoReconnect bayrağını her zaman kapalı tutmak gerekir - */ this.autoReconnect = false; - this.ws.close(); - } - addWSEvents() { - this.ws.addEventListener("open", ()=>this.eventOpen()); - this.ws.addEventListener("close", ()=>this.eventClose()); - this.ws.addEventListener("error", ()=>this.eventError()); - this.ws.addEventListener("message", ({ data })=>this.eventMessage(data)); - } - eventOpen() { - this.connected = true; - for (const callback of this.activeConnectionEvent)callback(void 0); - } - eventClose() { - for (const callback of this.passiveConnectionEvent)callback(void 0); - this.connected = false; - if (this.autoReconnect) this.autoReconnectTimer = setTimeout(()=>this.connect(), this.autoReconnectTimeout); - } - eventError() { - this.connected = false; - } - onRecaivePack(func) { - this.recaivePackEvent.push(func); - } - onActive(func) { - if (this.connected) func(); - else this.activeConnectionEvent.push(func); - } - onPassive(func) { - if (!this.connected) func(); - else this.passiveConnectionEvent.push(func); - } - eventMessage(data) { - if (typeof data == "string") { - let $data = JSON.parse(data); - for (const callback of this.recaivePackEvent)callback($data); - } - } - tranferToServer(data) { - if (this.connected) this.ws.send(JSON.stringify(data)); - } -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"4KC4J":[function(require,module,exports,__globalThis) { -exports.interopDefault = function(a) { - return a && a.__esModule ? a : { - default: a - }; -}; -exports.defineInteropFlag = function(a) { - Object.defineProperty(a, '__esModule', { - value: true - }); -}; -exports.exportAll = function(source, dest) { - Object.keys(source).forEach(function(key) { - if (key === 'default' || key === '__esModule' || Object.prototype.hasOwnProperty.call(dest, key)) return; - Object.defineProperty(dest, key, { - enumerable: true, - get: function() { - return source[key]; - } - }); - }); - return dest; -}; -exports.export = function(dest, destName, get) { - Object.defineProperty(dest, destName, { - enumerable: true, - get: get - }); -}; - -},{}],"602qx":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -class EventPool { - constructor(wsts){ - this.events = new Map(); - this.signals = new Map(); - this.requests = new Map(); - this.count = 0; - this.wsts = wsts; - } - request(msg) { - return new Promise((ok, rej)=>{ - let id = ++this.count; - this.events.set(id, [ - (data)=>{ - ok(data); - }, - (data)=>{ - rej(data); - } - ]); - this.wsts.WSTSProtocol.SendRequest(msg, id); - }); - } - stream(msg, callback) { - let id = ++this.count; - this.wsts.WSTSProtocol.StartStream(msg, id); - this.events.set(id, [ - (data)=>{ - callback(data); - }, - ()=>{} - ]); - } - signal(event, callback) { - let T = this.signals.get(event); - if (!T) this.signals.set(event, [ - callback - ]); - else T.push(callback); - } -} -exports.default = EventPool; - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"faGYI":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -class EventTarget { - emit(eventName, ...args) { - if (this.events[eventName]) for (const callback of this.events[eventName])callback(...args); - } - on(eventName, callback) { - if (this.events[eventName]) this.events[eventName].push(callback); - else this.events[eventName] = [ - callback - ]; - } - scope(f) { - if (this.activeScope) f(); - else this.on('scope', f); - } - constructor(){ - this.events = {}; - this.activeScope = false; - } -} -exports.default = EventTarget; - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"l0Hru":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "IPPressure", ()=>IPPressure); -class IPPressure { - constructor(mwse){ - this.mwse = mwse; - } - async allocAPIPAddress() { - let { status, ip } = await this.mwse.EventPooling.request({ - type: 'alloc/APIPAddress' - }); - if (status == 'success') { - this.APIPAddress = ip; - return ip; - } else throw new Error("Error Allocated Access Point IP Address"); - } - async allocAPNumber() { - let { status, number } = await this.mwse.EventPooling.request({ - type: 'alloc/APNumber' - }); - if (status == 'success') { - this.APNumber = number; - return number; - } else throw new Error("Error Allocated Access Point Number"); - } - async allocAPShortCode() { - let { status, code } = await this.mwse.EventPooling.request({ - type: 'alloc/APShortCode' - }); - if (status == 'success') { - this.APShortCode = code; - return code; - } else throw new Error("Error Allocated Access Point Short Code"); - } - async reallocAPIPAddress() { - let { status, ip } = await this.mwse.EventPooling.request({ - type: 'realloc/APIPAddress' - }); - if (status == 'success') { - this.APIPAddress = ip; - return ip; - } else throw new Error("Error Reallocated Access Point IP Address"); - } - async reallocAPNumber() { - let { status, number } = await this.mwse.EventPooling.request({ - type: 'realloc/APNumber' - }); - if (status == 'success') { - this.APNumber = number; - return number; - } else throw new Error("Error Reallocated Access Point Number"); - } - async reallocAPShortCode() { - let { status, code } = await this.mwse.EventPooling.request({ - type: 'realloc/APShortCode' - }); - if (status == 'success') { - this.APShortCode = code; - return code; - } else throw new Error("Error Reallocated Access Point Short Code"); - } - async releaseAPIPAddress() { - let { status } = await this.mwse.EventPooling.request({ - type: 'release/APIPAddress' - }); - if (status == 'success') this.APIPAddress = undefined; - else throw new Error("Error release Access Point IP Address"); - } - async releaseAPNumber() { - let { status } = await this.mwse.EventPooling.request({ - type: 'release/APNumber' - }); - if (status == 'success') this.APNumber = undefined; - else throw new Error("Error release Access Point Number"); - } - async releaseAPShortCode() { - let { status } = await this.mwse.EventPooling.request({ - type: 'release/APShortCode' - }); - if (status == 'success') this.APShortCode = undefined; - else throw new Error("Error release Access Point Short Code"); - } - async queryAPIPAddress(ip) { - let { status, socket } = await this.mwse.EventPooling.request({ - type: 'whois/APIPAddress', - whois: ip - }); - if (status == "success") return socket; - else return null; - } - async queryAPNumber(number) { - let { status, socket } = await this.mwse.EventPooling.request({ - type: 'whois/APNumber', - whois: number - }); - if (status == "success") return socket; - else return null; - } - async queryAPShortCode(code) { - let { status, socket } = await this.mwse.EventPooling.request({ - type: 'whois/APShortCode', - whois: code - }); - if (status == "success") return socket; - else return null; - } -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"imPsO":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -var _eventTarget = require("./EventTarget"); -var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); -var _peerInfo = require("./PeerInfo"); -var _webRTC = require("./WebRTC"); -var _webRTCDefault = parcelHelpers.interopDefault(_webRTC); -var IMessageSymbase = /*#__PURE__*/ function(IMessageSymbase) { - IMessageSymbase[IMessageSymbase["PayloadMessagePack"] = -12873.54] = "PayloadMessagePack"; - IMessageSymbase[IMessageSymbase["PayloadRTCBasePack"] = -12884.54] = "PayloadRTCBasePack"; - return IMessageSymbase; -}(IMessageSymbase || {}); -class Peer extends (0, _eventTargetDefault.default) { - constructor(wsts){ - super(), this.options = {}, this.selfSocket = false, this.active = false, this.peerConnection = false, this.primaryChannel = "datachannel"; - this.mwse = wsts; - this.rtc = this.createRTC(); - this.info = new (0, _peerInfo.PeerInfo)(this); - this.on('pack', (data)=>{ - if (data.type == ':rtcpack:') return this.rtc.emit("input", data.payload); - this.emit("message", data); - }); - } - createRTC(rtcConfig, rtcServers) { - this.rtc = new (0, _webRTCDefault.default)(rtcConfig, rtcServers); - this.rtc.peer = this; - this.rtc.on("connected", ()=>{ - this.peerConnection = true; - }); - this.rtc.on('disconnected', ()=>{ - this.peerConnection = false; - }); - this.rtc.on("output", (payload)=>{ - this.send({ - type: ':rtcpack:', - payload: payload - }); - }); - this.rtc.on("message", (payload)=>{ - this.emit("pack", payload); - }); - return this.rtc; - } - setPeerOptions(options) { - if (typeof options == "string") this.setSocketId(options); - else this.options = options; - } - setSocketId(uuid) { - this.socketId = uuid; - } - async metadata() { - if (this.socketId == 'me') { - let result = await this.mwse.EventPooling.request({ - type: 'my/socketid' - }); - this.selfSocket = true; - this.active ||= true; - this.socketId = result; - this.emit('scope'); - this.activeScope = true; - return result; - } - } - async request(pack) { - if (this.active) return await this.mwse.request(this.socketId, pack); - } - equalTo(peer) { - return this.socketId == peer.socketId; - } - async isReachable() { - return await this.mwse.EventPooling.request({ - type: 'is/reachable', - to: this.socketId - }); - } - async enablePairAuth() { - await this.mwse.EventPooling.request({ - type: 'auth/pair-system', - value: 'everybody' - }); - } - async disablePairAuth() { - await this.mwse.EventPooling.request({ - type: 'auth/pair-system', - value: 'disable' - }); - } - async enablePairInfo() { - await this.mwse.EventPooling.request({ - type: 'connection/pairinfo', - value: true - }); - } - async disablePairInfo() { - await this.mwse.EventPooling.request({ - type: 'connection/pairinfo', - value: false - }); - } - async requestPair() { - let { message, status } = await this.mwse.EventPooling.request({ - type: 'request/pair', - to: this.socketId - }); - if (message == "ALREADY-PAIRED" || message == "ALREADY-REQUESTED") console.warn("Already paired or pair requested"); - if (status == "fail") { - console.error("Request Pair Error", status, message); - return false; - } - return true; - } - async endPair() { - await this.mwse.EventPooling.request({ - type: 'end/pair', - to: this.socketId - }); - this.forget(); - } - async acceptPair() { - let { message, status } = await this.mwse.EventPooling.request({ - type: 'accept/pair', - to: this.socketId - }); - if (status == "fail") { - console.error("Pair Error", status, message); - return false; - } - return true; - } - async rejectPair() { - let { message, status } = await this.mwse.EventPooling.request({ - type: 'reject/pair', - to: this.socketId - }); - if (status == "fail") { - console.error("Pair Error", status, message); - return false; - } - return true; - } - async getPairedList() { - let { value } = await this.mwse.EventPooling.request({ - type: 'pair/list', - to: this.socketId - }); - return value; - } - async send(pack) { - let isOpenedP2P = this.peerConnection && this.rtc?.active; - let isOpenedServer = this.mwse.server.connected; - let sendChannel; - if (isOpenedP2P && isOpenedServer) { - if (this.primaryChannel == "websocket") sendChannel = "websocket"; - else sendChannel = "datachannel"; - } else if (isOpenedServer) sendChannel = "websocket"; - else sendChannel = "datachannel"; - if (sendChannel == "websocket") { - if (!this.mwse.writable) return console.warn("Socket is not writable"); - await this.mwse.EventPooling.request({ - type: 'pack/to', - pack, - to: this.socketId - }); - } else this.rtc?.sendMessage(pack); - } - async forget() { - this.mwse.peers.delete(this.socketId); - this.mwse.pairs.delete(this.socketId); - } -} -exports.default = Peer; - -},{"./EventTarget":"faGYI","./PeerInfo":"4gWZ7","./WebRTC":"buLge","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"4gWZ7":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "PeerInfo", ()=>PeerInfo); -class PeerInfo { - constructor(mwse){ - this.info = {}; - this.peer = mwse; - } - async fetch(name) { - if (name) { - let rinfo = await this.peer.mwse.EventPooling.request({ - type: "peer/info", - peer: this.peer.socketId, - name - }); - if (rinfo.status == "success") this.info = rinfo.info; - else console.warn(rinfo.message); - } else { - let rinfo = await this.peer.mwse.EventPooling.request({ - type: "peer/info", - peer: this.peer.socketId - }); - if (rinfo.status == "success") this.info = rinfo.info; - else console.warn(rinfo.message); - } - return this.info; - } - set(name, value) { - this.info[name] = value; - this.peer.mwse.WSTSProtocol.SendOnly({ - type: "auth/info", - name, - value - }); - } - get(name) { - return name ? this.info[name] : this.info; - } -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"buLge":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -var _p2PfileSender = require("./P2PFileSender"); -var _p2PfileSenderDefault = parcelHelpers.interopDefault(_p2PfileSender); -var _webrtcAdapter = require("webrtc-adapter"); -class WebRTC { - static{ - this.channels = new Map(); - } - static{ - this.requireGC = false; - } - static{ - this.defaultRTCConfig = { - iceCandidatePoolSize: 0, - iceTransportPolicy: "all", - rtcpMuxPolicy: "require" - }; - } - isPolite() { - let myId = this.peer?.mwse.peer('me').socketId; - let peerId = this.peer?.socketId; - return myId < peerId; - } - static{ - this.defaultICEServers = [ - { - urls: "stun:stun.l.google.com:19302" - }, - { - urls: "stun:stun1.l.google.com:19302" - }, - { - urls: "stun:stun2.l.google.com:19302" - }, - { - urls: "stun:stun3.l.google.com:19302" - }, - { - urls: "stun:stun4.l.google.com:19302" - } - ]; - } - constructor(rtcConfig, rtcServers){ - this.active = false; - this.connectionStatus = "new"; - this.iceStatus = "new"; - this.gatheringStatus = "new"; - this.signalingStatus = ""; - this.recaivingStream = new Map(); - this.sendingStream = new Map(); - this.events = {}; - this.makingOffer = false; - this.ignoreOffer = false; - this.isSettingRemoteAnswerPending = false; - this.candicatePack = []; - let config = {}; - if (rtcConfig) Object.assign(config, WebRTC.defaultRTCConfig, rtcConfig); - else Object.assign(config, WebRTC.defaultRTCConfig); - config.iceServers = rtcServers || WebRTC.defaultICEServers; - this.rtc = new RTCPeerConnection(config); - this.rtc.addEventListener("connectionstatechange", ()=>{ - this.eventConnectionState(); - }); - this.rtc.addEventListener("icecandidate", (...args)=>{ - this.eventIcecandidate(...args); - }); - this.rtc.addEventListener("iceconnectionstatechange", ()=>{ - this.eventICEConnectionState(); - }); - this.rtc.addEventListener("icegatheringstatechange", ()=>{ - this.eventICEGatherinState(); - }); - this.rtc.addEventListener("negotiationneeded", ()=>{ - this.eventNogationNeeded(); - }); - this.rtc.addEventListener("signalingstatechange", ()=>{ - this.eventSignalingState(); - }); - this.rtc.addEventListener("track", (...args)=>{ - this.eventTrack(...args); - }); - this.rtc.addEventListener("datachannel", (...args)=>{ - this.eventDatachannel(...args); - }); - this.on('input', async (data)=>{ - switch(data.type){ - case "icecandidate": - try { - if (this.rtc.remoteDescription) await this.rtc.addIceCandidate(new RTCIceCandidate(data.value)); - else this.candicatePack.push(new RTCIceCandidate(data.value)); - } catch (error) { - debugger; - } finally{ - console.log("ICE Canbet"); - } - break; - case "offer": - { - let readyForOffer = !this.makingOffer && (this.rtc.signalingState == "stable" || this.isSettingRemoteAnswerPending); - const offerCollision = !readyForOffer; - this.ignoreOffer = !this.isPolite() && offerCollision; - if (this.ignoreOffer) return; - this.isSettingRemoteAnswerPending = false; - await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value)); - this.isSettingRemoteAnswerPending = false; - for (const candidate of this.candicatePack)await this.rtc.addIceCandidate(candidate); - let answer = await this.rtc.createAnswer({ - offerToReceiveAudio: true, - offerToReceiveVideo: true - }); - await this.rtc.setLocalDescription(answer); - this.send({ - type: 'answer', - value: answer - }); - break; - } - case "answer": - await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value)); - for (const candidate of this.candicatePack)await this.rtc.addIceCandidate(candidate); - break; - case "streamInfo": - { - let { id, value } = data; - let streamInfo = this.recaivingStream.get(id); - if (!streamInfo) this.recaivingStream.set(id, value); - else this.recaivingStream.set(id, { - ...streamInfo, - ...value - }); - this.send({ - type: 'streamAccept', - id - }); - break; - } - case "streamRemoved": - { - let { id } = data; - this.emit('stream:stopped', this.recaivingStream.get(id)); - this.recaivingStream.delete(id); - break; - } - case "streamAccept": - { - let { id } = data; - let sendingStream = this.sendingStream.get(id); - let senders = []; - if (sendingStream && sendingStream.stream) { - for (const track of sendingStream.stream.getTracks())senders.push(this.rtc.addTrack(track, sendingStream.stream)); - sendingStream.senders = senders; - } - break; - } - case "message": - this.emit('message', data.payload); - break; - } - }); - } - addEventListener(event, callback) { - (this.events[event] || (this.events[event] = [])).push(callback); - } - on(event, callback) { - this.addEventListener(event, callback); - } - async dispatch(event, ...args) { - if (this.events[event]) for (const callback of this.events[event])await callback(...args); - } - async emit(event, ...args) { - await this.dispatch(event, ...args); - } - connect() { - if (!this.channel) this.createDefaultDataChannel(); - } - sendMessage(data) { - this.send({ - type: 'message', - payload: data - }); - } - createDefaultDataChannel() { - let dt = this.rtc.createDataChannel(':default:', { - ordered: true - }); - dt.addEventListener("open", ()=>{ - this.channel = dt; - WebRTC.channels.set(this.id, this); - this.active = true; - }); - dt.addEventListener("message", ({ data })=>{ - let pack = JSON.parse(data); - this.emit('input', pack); - }); - dt.addEventListener("close", ()=>{ - this.channel = undefined; - this.active = false; - }); - } - destroy() { - this.active = false; - if (this.channel) { - this.channel.close(); - this.channel = undefined; - } - if (this.rtc) this.rtc.close(); - this.emit('disconnected'); - WebRTC.channels.delete(this.id); - } - eventDatachannel(event) { - if (event.channel.label == ':default:') { - WebRTC.channels.set(this.id, this); - this.channel = event.channel; - this.active = true; - event.channel.addEventListener("message", ({ data })=>{ - let pack = JSON.parse(data); - this.emit('input', pack); - }); - event.channel.addEventListener("close", ()=>{ - this.channel = undefined; - WebRTC.channels.delete(this.id); - WebRTC.requireGC = true; - }); - } else this.emit('datachannel', event.channel); - } - send(data) { - if (this.channel?.readyState == "open") this.channel.send(JSON.stringify(data)); - else this.emit('output', data); - } - eventConnectionState() { - this.connectionStatus = this.rtc.connectionState; - if (this.connectionStatus == 'connected') { - if (this.active == false) this.emit('connected'); - } - if (this.connectionStatus == 'failed') this.rtc.restartIce(); - if (this.connectionStatus == "closed") { - if (this.active) this.destroy(); - } - } - eventIcecandidate(event) { - if (event.candidate) this.send({ - type: 'icecandidate', - value: event.candidate - }); - } - eventICEConnectionState() { - this.iceStatus = this.rtc.iceConnectionState; - } - eventICEGatherinState() { - this.gatheringStatus = this.rtc.iceGatheringState; - } - async eventNogationNeeded() { - try { - this.makingOffer = true; - let offer = await this.rtc.createOffer({ - iceRestart: true, - offerToReceiveAudio: true, - offerToReceiveVideo: true - }); - await this.rtc.setLocalDescription(offer); - this.send({ - type: 'offer', - value: offer - }); - } catch (error) { - console.error(`Nogation Error:`, error); - } finally{ - this.makingOffer = false; - } - } - eventSignalingState() { - this.signalingStatus = this.rtc.signalingState; - } - eventTrack(event) { - let rtpRecaiver = event.receiver; - if (event.streams.length) for (const stream of event.streams){ - let streamInfo = this.recaivingStream.get(stream.id); - (streamInfo.recaivers || (streamInfo.recaivers = [])).push(rtpRecaiver); - if (this.recaivingStream.get(stream.id).stream == null) { - streamInfo.stream = stream; - this.emit('stream:added', this.recaivingStream.get(stream.id)); - } else streamInfo.stream = stream; - } - } - sendStream(stream, name, info) { - this.send({ - type: 'streamInfo', - id: stream.id, - value: { - ...info, - name: name - } - }); - this.sendingStream.set(stream.id, { - ...info, - id: stream.id, - name: name, - stream - }); - } - stopStream(_stream) { - if (this.connectionStatus != 'connected') return; - if (this.sendingStream.has(_stream.id)) { - let { stream } = this.sendingStream.get(_stream.id); - for (const track of stream.getTracks()){ - for (const RTCPSender of this.rtc.getSenders())if (RTCPSender.track?.id == track.id) this.rtc.removeTrack(RTCPSender); - } - this.send({ - type: 'streamRemoved', - id: stream.id - }); - this.sendingStream.delete(_stream.id); - } - } - stopAllStreams() { - if (this.connectionStatus != 'connected') return; - for (const [, { stream }] of this.sendingStream){ - if (stream == undefined) continue; - for (const track of stream.getTracks()){ - for (const RTCPSender of this.rtc.getSenders())if (RTCPSender.track?.id == track.id) this.rtc.removeTrack(RTCPSender); - } - this.send({ - type: 'streamRemoved', - id: stream.id - }); - } - this.sendingStream.clear(); - } - async SendFile(file, meta) { - if (!this.peer) throw new Error("Peer is not ready"); - this.FileTransportChannel = new (0, _p2PfileSenderDefault.default)(this, this.peer); - await this.FileTransportChannel.SendFile(file, meta); - } - async RecaiveFile(chnlCount, filemeta, totalSize) { - if (!this.peer) throw new Error("Peer is not ready"); - this.FileTransportChannel = new (0, _p2PfileSenderDefault.default)(this, this.peer); - return await new Promise((recaivedFile)=>{ - if (this.FileTransportChannel) this.FileTransportChannel.RecaiveFile(this.rtc, filemeta, chnlCount, totalSize, (file)=>{ - recaivedFile(file); - }); - }); - } -} -exports.default = WebRTC; -WebRTC.requireGC = false; -setInterval(()=>{ - if (WebRTC.requireGC == false) return; - let img = document.createElement("img"); - img.src = window.URL.createObjectURL(new Blob([ - new ArrayBuffer(5e+7) - ])); - img.onerror = function() { - window.URL.revokeObjectURL(this.src); - }; - WebRTC.requireGC = false; -}, 3000); - -},{"./P2PFileSender":"ga16E","webrtc-adapter":"6QgAz","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"ga16E":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -var _webrtcAdapter = require("webrtc-adapter"); -class P2PFileSender { - constructor(webrtc, peer){ - this.totalSize = 0; - this.isReady = false; - this.isStarted = false; - this.isSending = false; - this.isRecaiving = false; - this.processedSize = 0; - this.bufferSizePerChannel = 10e6; - this.bufferSizePerPack = 10e3; - this.safeBufferSizePerPack = 9999; - this.webrtc = webrtc; - this.rtc = webrtc.rtc; - this.peer = peer; - } - async RecaiveFile(_rtc, fileMetadata, channelCount, _totalSize, onEnded) { - //let totals = {}; - // let index = 0; - /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => { - return { - name: `${index+1}. Kanal`, - current: 0, - currentTotal: 0, - total: 0 - } - }));*/ let parts = []; - this.webrtc.on('datachannel', (datachannel)=>{ - //let channelIndex = index++; - let current = 0; - let totalSize = 0; - let currentPart = 0; - let bufferAmount = []; - datachannel.onmessage = function({ data }) { - if (totalSize == 0) { - let { size, part } = JSON.parse(data); - totalSize = size; - currentPart = part; - /*updateChannelStatus(channelIndex, n => { - return { - ...n, - total: totalSize, - current: 0 - } - });*/ datachannel.send("READY"); - } else { - current += data.byteLength; - bufferAmount.push(data); - /*updateChannelStatus(channelIndex, n => { - return { - ...n, - current: data.byteLength + n.current, - currentTotal: data.byteLength + n.currentTotal, - } - }); - setProcessedSize(n => n + data.byteLength);*/ if (current == totalSize) { - parts[currentPart] = new Blob(bufferAmount); - bufferAmount = []; - //totals[datachannel.label] += totalSize; - totalSize = 0; - currentPart = 0; - current = 0; - datachannel.send("TOTAL_RECAIVED"); - } - } - }; - datachannel.onclose = ()=>{ - channelCount--; - if (channelCount == 0) { - let file = new File(parts, fileMetadata.name, { - type: fileMetadata.type, - lastModified: +new Date - }); - onEnded(file); - } - }; - }); - } - async SendFile(file, metadata) { - this.isSending = true; - this.isStarted = true; - let buffer = await file.arrayBuffer(); - let partCount = Math.ceil(buffer.byteLength / 10e6); - let channelCount = Math.min(5, partCount); - if (this.webrtc.iceStatus != "connected") throw new Error("WebRTC is a not ready"); - this.peer.send({ - type: 'file', - name: file.name, - size: file.size, - mimetype: file.type, - partCount, - channelCount, - metadata: metadata - }); - let channels = []; - for(let channelIndex = 0; channelIndex < channelCount; channelIndex++){ - let channel = this.rtc.createDataChannel("\\?\\file_" + channelIndex); - channel.binaryType = "arraybuffer"; - await new Promise((ok)=>{ - channel.onopen = ()=>{ - ok(void 0); - }; - }); - channels.push(channel); - } - let currentPart = 0; - let next = ()=>{ - if (currentPart < partCount) { - let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6); - currentPart++; - return [ - bufferPart, - currentPart - 1 - ]; - } - return [ - false, - 0 - ]; - }; - let spyChannelIndex = channels.length; - await new Promise((ok)=>{ - for(let channelIndex = 0; channelIndex < channels.length; channelIndex++)this.sendPartition(channels[channelIndex], next, channelIndex, ()=>{ - spyChannelIndex--; - if (spyChannelIndex == 0) { - this.isSending = false; - this.isStarted = false; - ok(undefined); - } - }); - }); - } - sendPartition(channel, nextblob10mb, _channelIndex, onEnded) { - let [currentBuffer, currentPartition] = nextblob10mb(); - let currentPart = 0; - let next = ()=>{ - if (!(currentBuffer instanceof ArrayBuffer)) return; - let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3); - currentPart++; - if (bufferPart.byteLength != 0) /* - updateChannelStatus(channelIndex, n => { - return { - ...n, - current: bufferPart.byteLength + n.current, - currentTotal: bufferPart.byteLength + n.currentTotal - } - }); - setProcessedSize(n => n + bufferPart.byteLength); - */ return bufferPart; - }; - channel.addEventListener("message", ({ data })=>{ - if (data == "READY") this.sendFileChannel(channel, next); - if (data == "TOTAL_RECAIVED") { - [currentBuffer, currentPartition] = nextblob10mb(); - currentPart = 0; - if (currentBuffer != false) /*updateChannelStatus(channelIndex, n => { - return { - ...n, - total: currentBuffer.byteLength, - current: 0, - } - });*/ channel.send(JSON.stringify({ - size: currentBuffer.byteLength, - part: currentPartition - })); - else { - channel.close(); - onEnded(); - } - } - }); - channel.send(JSON.stringify({ - size: currentBuffer.byteLength, - part: currentPartition - })); - } - sendFileChannel(channel, getNextBlob) { - channel.addEventListener("bufferedamountlow", function() { - let buffer = getNextBlob(); - if (buffer) channel.send(buffer); - }); - channel.bufferedAmountLowThreshold = 15999; - let c = getNextBlob(); - c && channel.send(c); - } -} -exports.default = P2PFileSender; - -},{"webrtc-adapter":"6QgAz","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"6QgAz":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -var _adapterFactoryJs = require("./adapter_factory.js"); -'use strict'; -const adapter = (0, _adapterFactoryJs.adapterFactory)({ - window: typeof window === 'undefined' ? undefined : window -}); -exports.default = adapter; - -},{"./adapter_factory.js":"iLRop","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"iLRop":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -// Shimming starts here. -parcelHelpers.export(exports, "adapterFactory", ()=>adapterFactory); -var _utils = require("./utils"); -// Browser shims. -var _chromeShim = require("./chrome/chrome_shim"); -var _firefoxShim = require("./firefox/firefox_shim"); -var _safariShim = require("./safari/safari_shim"); -var _commonShim = require("./common_shim"); -var _sdp = require("sdp"); -function adapterFactory({ window } = {}, options = { - shimChrome: true, - shimFirefox: true, - shimSafari: true -}) { - // Utils. - const logging = _utils.log; - const browserDetails = _utils.detectBrowser(window); - const adapter = { - browserDetails, - commonShim: _commonShim, - extractVersion: _utils.extractVersion, - disableLog: _utils.disableLog, - disableWarnings: _utils.disableWarnings, - sdp: // Expose sdp as a convenience. For production apps include directly. - _sdp - }; - // Shim browser if found. - switch(browserDetails.browser){ - case 'chrome': - if (!_chromeShim || !_chromeShim.shimPeerConnection || !options.shimChrome) { - logging('Chrome shim is not included in this adapter release.'); - return adapter; - } - if (browserDetails.version === null) { - logging('Chrome shim can not determine version, not shimming.'); - return adapter; - } - logging('adapter.js shimming chrome.'); - // Export to the adapter global object visible in the browser. - adapter.browserShim = _chromeShim; - // Must be called before shimPeerConnection. - _commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails); - _commonShim.shimParameterlessSetLocalDescription(window, browserDetails); - _chromeShim.shimGetUserMedia(window, browserDetails); - _chromeShim.shimMediaStream(window, browserDetails); - _chromeShim.shimPeerConnection(window, browserDetails); - _chromeShim.shimOnTrack(window, browserDetails); - _chromeShim.shimAddTrackRemoveTrack(window, browserDetails); - _chromeShim.shimGetSendersWithDtmf(window, browserDetails); - _chromeShim.shimGetStats(window, browserDetails); - _chromeShim.shimSenderReceiverGetStats(window, browserDetails); - _chromeShim.fixNegotiationNeeded(window, browserDetails); - _commonShim.shimRTCIceCandidate(window, browserDetails); - _commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails); - _commonShim.shimConnectionState(window, browserDetails); - _commonShim.shimMaxMessageSize(window, browserDetails); - _commonShim.shimSendThrowTypeError(window, browserDetails); - _commonShim.removeExtmapAllowMixed(window, browserDetails); - break; - case 'firefox': - if (!_firefoxShim || !_firefoxShim.shimPeerConnection || !options.shimFirefox) { - logging('Firefox shim is not included in this adapter release.'); - return adapter; - } - logging('adapter.js shimming firefox.'); - // Export to the adapter global object visible in the browser. - adapter.browserShim = _firefoxShim; - // Must be called before shimPeerConnection. - _commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails); - _commonShim.shimParameterlessSetLocalDescription(window, browserDetails); - _firefoxShim.shimGetUserMedia(window, browserDetails); - _firefoxShim.shimPeerConnection(window, browserDetails); - _firefoxShim.shimOnTrack(window, browserDetails); - _firefoxShim.shimRemoveStream(window, browserDetails); - _firefoxShim.shimSenderGetStats(window, browserDetails); - _firefoxShim.shimReceiverGetStats(window, browserDetails); - _firefoxShim.shimRTCDataChannel(window, browserDetails); - _firefoxShim.shimAddTransceiver(window, browserDetails); - _firefoxShim.shimGetParameters(window, browserDetails); - _firefoxShim.shimCreateOffer(window, browserDetails); - _firefoxShim.shimCreateAnswer(window, browserDetails); - _commonShim.shimRTCIceCandidate(window, browserDetails); - _commonShim.shimConnectionState(window, browserDetails); - _commonShim.shimMaxMessageSize(window, browserDetails); - _commonShim.shimSendThrowTypeError(window, browserDetails); - break; - case 'safari': - if (!_safariShim || !options.shimSafari) { - logging('Safari shim is not included in this adapter release.'); - return adapter; - } - logging('adapter.js shimming safari.'); - // Export to the adapter global object visible in the browser. - adapter.browserShim = _safariShim; - // Must be called before shimCallbackAPI. - _commonShim.shimAddIceCandidateNullOrEmpty(window, browserDetails); - _commonShim.shimParameterlessSetLocalDescription(window, browserDetails); - _safariShim.shimRTCIceServerUrls(window, browserDetails); - _safariShim.shimCreateOfferLegacy(window, browserDetails); - _safariShim.shimCallbacksAPI(window, browserDetails); - _safariShim.shimLocalStreamsAPI(window, browserDetails); - _safariShim.shimRemoteStreamsAPI(window, browserDetails); - _safariShim.shimTrackEventTransceiver(window, browserDetails); - _safariShim.shimGetUserMedia(window, browserDetails); - _safariShim.shimAudioContext(window, browserDetails); - _commonShim.shimRTCIceCandidate(window, browserDetails); - _commonShim.shimRTCIceCandidateRelayProtocol(window, browserDetails); - _commonShim.shimMaxMessageSize(window, browserDetails); - _commonShim.shimSendThrowTypeError(window, browserDetails); - _commonShim.removeExtmapAllowMixed(window, browserDetails); - break; - default: - logging('Unsupported browser!'); - break; - } - return adapter; -} - -},{"./utils":"atxap","./chrome/chrome_shim":"1R5WE","./firefox/firefox_shim":"1Ffvn","./safari/safari_shim":"48iHo","./common_shim":"9UG5h","sdp":"af6vf","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"atxap":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -/** - * Extract browser version out of the provided user agent string. - * - * @param {!string} uastring userAgent string. - * @param {!string} expr Regular expression used as match criteria. - * @param {!number} pos position in the version string to be returned. - * @return {!number} browser version. - */ parcelHelpers.export(exports, "extractVersion", ()=>extractVersion); -// Wraps the peerconnection event eventNameToWrap in a function -// which returns the modified event object (or false to prevent -// the event). -parcelHelpers.export(exports, "wrapPeerConnectionEvent", ()=>wrapPeerConnectionEvent); -parcelHelpers.export(exports, "disableLog", ()=>disableLog); -/** - * Disable or enable deprecation warnings - * @param {!boolean} bool set to true to disable warnings. - */ parcelHelpers.export(exports, "disableWarnings", ()=>disableWarnings); -parcelHelpers.export(exports, "log", ()=>log); -/** - * Shows a deprecation warning suggesting the modern and spec-compatible API. - */ parcelHelpers.export(exports, "deprecated", ()=>deprecated); -/** - * Browser detector. - * - * @return {object} result containing browser and version - * properties. - */ parcelHelpers.export(exports, "detectBrowser", ()=>detectBrowser); -/** - * Remove all empty objects and undefined values - * from a nested object -- an enhanced and vanilla version - * of Lodash's `compact`. - */ parcelHelpers.export(exports, "compactObject", ()=>compactObject); -/* iterates the stats graph recursively. */ parcelHelpers.export(exports, "walkStats", ()=>walkStats); -/* filter getStats for a sender/receiver track. */ parcelHelpers.export(exports, "filterStats", ()=>filterStats); -'use strict'; -let logDisabled_ = true; -let deprecationWarnings_ = true; -function extractVersion(uastring, expr, pos) { - const match = uastring.match(expr); - return match && match.length >= pos && parseInt(match[pos], 10); -} -function wrapPeerConnectionEvent(window1, eventNameToWrap, wrapper) { - if (!window1.RTCPeerConnection) return; - const proto = window1.RTCPeerConnection.prototype; - const nativeAddEventListener = proto.addEventListener; - proto.addEventListener = function(nativeEventName, cb) { - if (nativeEventName !== eventNameToWrap) return nativeAddEventListener.apply(this, arguments); - const wrappedCallback = (e)=>{ - const modifiedEvent = wrapper(e); - if (modifiedEvent) { - if (cb.handleEvent) cb.handleEvent(modifiedEvent); - else cb(modifiedEvent); - } - }; - this._eventMap = this._eventMap || {}; - if (!this._eventMap[eventNameToWrap]) this._eventMap[eventNameToWrap] = new Map(); - this._eventMap[eventNameToWrap].set(cb, wrappedCallback); - return nativeAddEventListener.apply(this, [ - nativeEventName, - wrappedCallback - ]); - }; - const nativeRemoveEventListener = proto.removeEventListener; - proto.removeEventListener = function(nativeEventName, cb) { - if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[eventNameToWrap]) return nativeRemoveEventListener.apply(this, arguments); - if (!this._eventMap[eventNameToWrap].has(cb)) return nativeRemoveEventListener.apply(this, arguments); - const unwrappedCb = this._eventMap[eventNameToWrap].get(cb); - this._eventMap[eventNameToWrap].delete(cb); - if (this._eventMap[eventNameToWrap].size === 0) delete this._eventMap[eventNameToWrap]; - if (Object.keys(this._eventMap).length === 0) delete this._eventMap; - return nativeRemoveEventListener.apply(this, [ - nativeEventName, - unwrappedCb - ]); - }; - Object.defineProperty(proto, 'on' + eventNameToWrap, { - get () { - return this['_on' + eventNameToWrap]; - }, - set (cb) { - if (this['_on' + eventNameToWrap]) { - this.removeEventListener(eventNameToWrap, this['_on' + eventNameToWrap]); - delete this['_on' + eventNameToWrap]; - } - if (cb) this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb); - }, - enumerable: true, - configurable: true - }); -} -function disableLog(bool) { - if (typeof bool !== 'boolean') return new Error('Argument type: ' + typeof bool + '. Please use a boolean.'); - logDisabled_ = bool; - return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled'; -} -function disableWarnings(bool) { - if (typeof bool !== 'boolean') return new Error('Argument type: ' + typeof bool + '. Please use a boolean.'); - deprecationWarnings_ = !bool; - return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled'); -} -function log() { - if (typeof window === 'object') { - if (logDisabled_) return; - if (typeof console !== 'undefined' && typeof console.log === 'function') console.log.apply(console, arguments); - } -} -function deprecated(oldMethod, newMethod) { - if (!deprecationWarnings_) return; - console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.'); -} -function detectBrowser(window1) { - // Returned result object. - const result = { - browser: null, - version: null - }; - // Fail early if it's not a browser - if (typeof window1 === 'undefined' || !window1.navigator || !window1.navigator.userAgent) { - result.browser = 'Not a browser.'; - return result; - } - const { navigator } = window1; - if (navigator.mozGetUserMedia) { - result.browser = 'firefox'; - result.version = extractVersion(navigator.userAgent, /Firefox\/(\d+)\./, 1); - } else if (navigator.webkitGetUserMedia || window1.isSecureContext === false && window1.webkitRTCPeerConnection) { - // Chrome, Chromium, Webview, Opera. - // Version matches Chrome/WebRTC version. - // Chrome 74 removed webkitGetUserMedia on http as well so we need the - // more complicated fallback to webkitRTCPeerConnection. - result.browser = 'chrome'; - result.version = extractVersion(navigator.userAgent, /Chrom(e|ium)\/(\d+)\./, 2); - } else if (window1.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\/(\d+)\./)) { - result.browser = 'safari'; - result.version = extractVersion(navigator.userAgent, /AppleWebKit\/(\d+)\./, 1); - result.supportsUnifiedPlan = window1.RTCRtpTransceiver && 'currentDirection' in window1.RTCRtpTransceiver.prototype; - } else { - result.browser = 'Not a supported browser.'; - return result; - } - return result; -} -/** - * Checks if something is an object. - * - * @param {*} val The something you want to check. - * @return true if val is an object, false otherwise. - */ function isObject(val) { - return Object.prototype.toString.call(val) === '[object Object]'; -} -function compactObject(data) { - if (!isObject(data)) return data; - return Object.keys(data).reduce(function(accumulator, key) { - const isObj = isObject(data[key]); - const value = isObj ? compactObject(data[key]) : data[key]; - const isEmptyObject = isObj && !Object.keys(value).length; - if (value === undefined || isEmptyObject) return accumulator; - return Object.assign(accumulator, { - [key]: value - }); - }, {}); -} -function walkStats(stats, base, resultSet) { - if (!base || resultSet.has(base.id)) return; - resultSet.set(base.id, base); - Object.keys(base).forEach((name)=>{ - if (name.endsWith('Id')) walkStats(stats, stats.get(base[name]), resultSet); - else if (name.endsWith('Ids')) base[name].forEach((id)=>{ - walkStats(stats, stats.get(id), resultSet); - }); - }); -} -function filterStats(result, track, outbound) { - const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp'; - const filteredResult = new Map(); - if (track === null) return filteredResult; - const trackStats = []; - result.forEach((value)=>{ - if (value.type === 'track' && value.trackIdentifier === track.id) trackStats.push(value); - }); - trackStats.forEach((trackStat)=>{ - result.forEach((stats)=>{ - if (stats.type === streamStatsType && stats.trackId === trackStat.id) walkStats(result, stats, filteredResult); - }); - }); - return filteredResult; -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"1R5WE":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimGetUserMedia", ()=>(0, _getusermedia.shimGetUserMedia)); -parcelHelpers.export(exports, "shimGetDisplayMedia", ()=>(0, _getdisplaymedia.shimGetDisplayMedia)); -parcelHelpers.export(exports, "shimMediaStream", ()=>shimMediaStream); -parcelHelpers.export(exports, "shimOnTrack", ()=>shimOnTrack); -parcelHelpers.export(exports, "shimGetSendersWithDtmf", ()=>shimGetSendersWithDtmf); -parcelHelpers.export(exports, "shimGetStats", ()=>shimGetStats); -parcelHelpers.export(exports, "shimSenderReceiverGetStats", ()=>shimSenderReceiverGetStats); -parcelHelpers.export(exports, "shimAddTrackRemoveTrackWithNative", ()=>shimAddTrackRemoveTrackWithNative); -parcelHelpers.export(exports, "shimAddTrackRemoveTrack", ()=>shimAddTrackRemoveTrack); -parcelHelpers.export(exports, "shimPeerConnection", ()=>shimPeerConnection); -// Attempt to fix ONN in plan-b mode. -parcelHelpers.export(exports, "fixNegotiationNeeded", ()=>fixNegotiationNeeded); -var _utilsJs = require("../utils.js"); -var _getusermedia = require("./getusermedia"); -var _getdisplaymedia = require("./getdisplaymedia"); -'use strict'; -function shimMediaStream(window) { - window.MediaStream = window.MediaStream || window.webkitMediaStream; -} -function shimOnTrack(window) { - if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) { - Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', { - get () { - return this._ontrack; - }, - set (f) { - if (this._ontrack) this.removeEventListener('track', this._ontrack); - this.addEventListener('track', this._ontrack = f); - }, - enumerable: true, - configurable: true - }); - const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() { - if (!this._ontrackpoly) { - this._ontrackpoly = (e)=>{ - // onaddstream does not fire when a track is added to an existing - // stream. But stream.onaddtrack is implemented so we use that. - e.stream.addEventListener('addtrack', (te)=>{ - let receiver; - if (window.RTCPeerConnection.prototype.getReceivers) receiver = this.getReceivers().find((r)=>r.track && r.track.id === te.track.id); - else receiver = { - track: te.track - }; - const event = new Event('track'); - event.track = te.track; - event.receiver = receiver; - event.transceiver = { - receiver - }; - event.streams = [ - e.stream - ]; - this.dispatchEvent(event); - }); - e.stream.getTracks().forEach((track)=>{ - let receiver; - if (window.RTCPeerConnection.prototype.getReceivers) receiver = this.getReceivers().find((r)=>r.track && r.track.id === track.id); - else receiver = { - track - }; - const event = new Event('track'); - event.track = track; - event.receiver = receiver; - event.transceiver = { - receiver - }; - event.streams = [ - e.stream - ]; - this.dispatchEvent(event); - }); - }; - this.addEventListener('addstream', this._ontrackpoly); - } - return origSetRemoteDescription.apply(this, arguments); - }; - } else // even if RTCRtpTransceiver is in window, it is only used and - // emitted in unified-plan. Unfortunately this means we need - // to unconditionally wrap the event. - _utilsJs.wrapPeerConnectionEvent(window, 'track', (e)=>{ - if (!e.transceiver) Object.defineProperty(e, 'transceiver', { - value: { - receiver: e.receiver - } - }); - return e; - }); -} -function shimGetSendersWithDtmf(window) { - // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack. - if (typeof window === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) { - const shimSenderWithDtmf = function(pc, track) { - return { - track, - get dtmf () { - if (this._dtmf === undefined) { - if (track.kind === 'audio') this._dtmf = pc.createDTMFSender(track); - else this._dtmf = null; - } - return this._dtmf; - }, - _pc: pc - }; - }; - // augment addTrack when getSenders is not available. - if (!window.RTCPeerConnection.prototype.getSenders) { - window.RTCPeerConnection.prototype.getSenders = function getSenders() { - this._senders = this._senders || []; - return this._senders.slice(); // return a copy of the internal state. - }; - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) { - let sender = origAddTrack.apply(this, arguments); - if (!sender) { - sender = shimSenderWithDtmf(this, track); - this._senders.push(sender); - } - return sender; - }; - const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack; - window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) { - origRemoveTrack.apply(this, arguments); - const idx = this._senders.indexOf(sender); - if (idx !== -1) this._senders.splice(idx, 1); - }; - } - const origAddStream = window.RTCPeerConnection.prototype.addStream; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - this._senders = this._senders || []; - origAddStream.apply(this, [ - stream - ]); - stream.getTracks().forEach((track)=>{ - this._senders.push(shimSenderWithDtmf(this, track)); - }); - }; - const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - this._senders = this._senders || []; - origRemoveStream.apply(this, [ - stream - ]); - stream.getTracks().forEach((track)=>{ - const sender = this._senders.find((s)=>s.track === track); - if (sender) this._senders.splice(this._senders.indexOf(sender), 1); - }); - }; - } else if (typeof window === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('dtmf' in window.RTCRtpSender.prototype)) { - const origGetSenders = window.RTCPeerConnection.prototype.getSenders; - window.RTCPeerConnection.prototype.getSenders = function getSenders() { - const senders = origGetSenders.apply(this, []); - senders.forEach((sender)=>sender._pc = this); - return senders; - }; - Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', { - get () { - if (this._dtmf === undefined) { - if (this.track.kind === 'audio') this._dtmf = this._pc.createDTMFSender(this.track); - else this._dtmf = null; - } - return this._dtmf; - } - }); - } -} -function shimGetStats(window) { - if (!window.RTCPeerConnection) return; - const origGetStats = window.RTCPeerConnection.prototype.getStats; - window.RTCPeerConnection.prototype.getStats = function getStats() { - const [selector, onSucc, onErr] = arguments; - // If selector is a function then we are in the old style stats so just - // pass back the original getStats format to avoid breaking old users. - if (arguments.length > 0 && typeof selector === 'function') return origGetStats.apply(this, arguments); - // When spec-style getStats is supported, return those when called with - // either no arguments or the selector argument is null. - if (origGetStats.length === 0 && (arguments.length === 0 || typeof selector !== 'function')) return origGetStats.apply(this, []); - const fixChromeStats_ = function(response) { - const standardReport = {}; - const reports = response.result(); - reports.forEach((report)=>{ - const standardStats = { - id: report.id, - timestamp: report.timestamp, - type: { - localcandidate: 'local-candidate', - remotecandidate: 'remote-candidate' - }[report.type] || report.type - }; - report.names().forEach((name)=>{ - standardStats[name] = report.stat(name); - }); - standardReport[standardStats.id] = standardStats; - }); - return standardReport; - }; - // shim getStats with maplike support - const makeMapStats = function(stats) { - return new Map(Object.keys(stats).map((key)=>[ - key, - stats[key] - ])); - }; - if (arguments.length >= 2) { - const successCallbackWrapper_ = function(response) { - onSucc(makeMapStats(fixChromeStats_(response))); - }; - return origGetStats.apply(this, [ - successCallbackWrapper_, - selector - ]); - } - // promise-support - return new Promise((resolve, reject)=>{ - origGetStats.apply(this, [ - function(response) { - resolve(makeMapStats(fixChromeStats_(response))); - }, - reject - ]); - }).then(onSucc, onErr); - }; -} -function shimSenderReceiverGetStats(window) { - if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) return; - // shim sender stats. - if (!('getStats' in window.RTCRtpSender.prototype)) { - const origGetSenders = window.RTCPeerConnection.prototype.getSenders; - if (origGetSenders) window.RTCPeerConnection.prototype.getSenders = function getSenders() { - const senders = origGetSenders.apply(this, []); - senders.forEach((sender)=>sender._pc = this); - return senders; - }; - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - if (origAddTrack) window.RTCPeerConnection.prototype.addTrack = function addTrack() { - const sender = origAddTrack.apply(this, arguments); - sender._pc = this; - return sender; - }; - window.RTCRtpSender.prototype.getStats = function getStats() { - const sender = this; - return this._pc.getStats().then((result)=>/* Note: this will include stats of all senders that - * send a track with the same id as sender.track as - * it is not possible to identify the RTCRtpSender. - */ _utilsJs.filterStats(result, sender.track, true)); - }; - } - // shim receiver stats. - if (!('getStats' in window.RTCRtpReceiver.prototype)) { - const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers; - if (origGetReceivers) window.RTCPeerConnection.prototype.getReceivers = function getReceivers() { - const receivers = origGetReceivers.apply(this, []); - receivers.forEach((receiver)=>receiver._pc = this); - return receivers; - }; - _utilsJs.wrapPeerConnectionEvent(window, 'track', (e)=>{ - e.receiver._pc = e.srcElement; - return e; - }); - window.RTCRtpReceiver.prototype.getStats = function getStats() { - const receiver = this; - return this._pc.getStats().then((result)=>_utilsJs.filterStats(result, receiver.track, false)); - }; - } - if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) return; - // shim RTCPeerConnection.getStats(track). - const origGetStats = window.RTCPeerConnection.prototype.getStats; - window.RTCPeerConnection.prototype.getStats = function getStats() { - if (arguments.length > 0 && arguments[0] instanceof window.MediaStreamTrack) { - const track = arguments[0]; - let sender; - let receiver; - let err; - this.getSenders().forEach((s)=>{ - if (s.track === track) { - if (sender) err = true; - else sender = s; - } - }); - this.getReceivers().forEach((r)=>{ - if (r.track === track) { - if (receiver) err = true; - else receiver = r; - } - return r.track === track; - }); - if (err || sender && receiver) return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError')); - else if (sender) return sender.getStats(); - else if (receiver) return receiver.getStats(); - return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError')); - } - return origGetStats.apply(this, arguments); - }; -} -function shimAddTrackRemoveTrackWithNative(window) { - // shim addTrack/removeTrack with native variants in order to make - // the interactions with legacy getLocalStreams behave as in other browsers. - // Keeps a mapping stream.id => [stream, rtpsenders...] - window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - return Object.keys(this._shimmedLocalStreams).map((streamId)=>this._shimmedLocalStreams[streamId][0]); - }; - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) { - if (!stream) return origAddTrack.apply(this, arguments); - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - const sender = origAddTrack.apply(this, arguments); - if (!this._shimmedLocalStreams[stream.id]) this._shimmedLocalStreams[stream.id] = [ - stream, - sender - ]; - else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) this._shimmedLocalStreams[stream.id].push(sender); - return sender; - }; - const origAddStream = window.RTCPeerConnection.prototype.addStream; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - stream.getTracks().forEach((track)=>{ - const alreadyExists = this.getSenders().find((s)=>s.track === track); - if (alreadyExists) throw new DOMException('Track already exists.', 'InvalidAccessError'); - }); - const existingSenders = this.getSenders(); - origAddStream.apply(this, arguments); - const newSenders = this.getSenders().filter((newSender)=>existingSenders.indexOf(newSender) === -1); - this._shimmedLocalStreams[stream.id] = [ - stream - ].concat(newSenders); - }; - const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - delete this._shimmedLocalStreams[stream.id]; - return origRemoveStream.apply(this, arguments); - }; - const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack; - window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) { - this._shimmedLocalStreams = this._shimmedLocalStreams || {}; - if (sender) Object.keys(this._shimmedLocalStreams).forEach((streamId)=>{ - const idx = this._shimmedLocalStreams[streamId].indexOf(sender); - if (idx !== -1) this._shimmedLocalStreams[streamId].splice(idx, 1); - if (this._shimmedLocalStreams[streamId].length === 1) delete this._shimmedLocalStreams[streamId]; - }); - return origRemoveTrack.apply(this, arguments); - }; -} -function shimAddTrackRemoveTrack(window, browserDetails) { - if (!window.RTCPeerConnection) return; - // shim addTrack and removeTrack. - if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) return shimAddTrackRemoveTrackWithNative(window); - // also shim pc.getLocalStreams when addTrack is shimmed - // to return the original streams. - const origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams; - window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() { - const nativeStreams = origGetLocalStreams.apply(this); - this._reverseStreams = this._reverseStreams || {}; - return nativeStreams.map((stream)=>this._reverseStreams[stream.id]); - }; - const origAddStream = window.RTCPeerConnection.prototype.addStream; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - this._streams = this._streams || {}; - this._reverseStreams = this._reverseStreams || {}; - stream.getTracks().forEach((track)=>{ - const alreadyExists = this.getSenders().find((s)=>s.track === track); - if (alreadyExists) throw new DOMException('Track already exists.', 'InvalidAccessError'); - }); - // Add identity mapping for consistency with addTrack. - // Unless this is being used with a stream from addTrack. - if (!this._reverseStreams[stream.id]) { - const newStream = new window.MediaStream(stream.getTracks()); - this._streams[stream.id] = newStream; - this._reverseStreams[newStream.id] = stream; - stream = newStream; - } - origAddStream.apply(this, [ - stream - ]); - }; - const origRemoveStream = window.RTCPeerConnection.prototype.removeStream; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - this._streams = this._streams || {}; - this._reverseStreams = this._reverseStreams || {}; - origRemoveStream.apply(this, [ - this._streams[stream.id] || stream - ]); - delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id]; - delete this._streams[stream.id]; - }; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) { - if (this.signalingState === 'closed') throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.', 'InvalidStateError'); - const streams = [].slice.call(arguments, 1); - if (streams.length !== 1 || !streams[0].getTracks().find((t)=>t === track)) // this is not fully correct but all we can manage without - // [[associated MediaStreams]] internal slot. - throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.", 'NotSupportedError'); - const alreadyExists = this.getSenders().find((s)=>s.track === track); - if (alreadyExists) throw new DOMException('Track already exists.', 'InvalidAccessError'); - this._streams = this._streams || {}; - this._reverseStreams = this._reverseStreams || {}; - const oldStream = this._streams[stream.id]; - if (oldStream) { - // this is using odd Chrome behaviour, use with caution: - // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815 - // Note: we rely on the high-level addTrack/dtmf shim to - // create the sender with a dtmf sender. - oldStream.addTrack(track); - // Trigger ONN async. - Promise.resolve().then(()=>{ - this.dispatchEvent(new Event('negotiationneeded')); - }); - } else { - const newStream = new window.MediaStream([ - track - ]); - this._streams[stream.id] = newStream; - this._reverseStreams[newStream.id] = stream; - this.addStream(newStream); - } - return this.getSenders().find((s)=>s.track === track); - }; - // replace the internal stream id with the external one and - // vice versa. - function replaceInternalStreamId(pc, description) { - let sdp = description.sdp; - Object.keys(pc._reverseStreams || []).forEach((internalId)=>{ - const externalStream = pc._reverseStreams[internalId]; - const internalStream = pc._streams[externalStream.id]; - sdp = sdp.replace(new RegExp(internalStream.id, 'g'), externalStream.id); - }); - return new RTCSessionDescription({ - type: description.type, - sdp - }); - } - function replaceExternalStreamId(pc, description) { - let sdp = description.sdp; - Object.keys(pc._reverseStreams || []).forEach((internalId)=>{ - const externalStream = pc._reverseStreams[internalId]; - const internalStream = pc._streams[externalStream.id]; - sdp = sdp.replace(new RegExp(externalStream.id, 'g'), internalStream.id); - }); - return new RTCSessionDescription({ - type: description.type, - sdp - }); - } - [ - 'createOffer', - 'createAnswer' - ].forEach(function(method) { - const nativeMethod = window.RTCPeerConnection.prototype[method]; - const methodObj = { - [method] () { - const args = arguments; - const isLegacyCall = arguments.length && typeof arguments[0] === 'function'; - if (isLegacyCall) return nativeMethod.apply(this, [ - (description)=>{ - const desc = replaceInternalStreamId(this, description); - args[0].apply(null, [ - desc - ]); - }, - (err)=>{ - if (args[1]) args[1].apply(null, err); - }, - arguments[2] - ]); - return nativeMethod.apply(this, arguments).then((description)=>replaceInternalStreamId(this, description)); - } - }; - window.RTCPeerConnection.prototype[method] = methodObj[method]; - }); - const origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription; - window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() { - if (!arguments.length || !arguments[0].type) return origSetLocalDescription.apply(this, arguments); - arguments[0] = replaceExternalStreamId(this, arguments[0]); - return origSetLocalDescription.apply(this, arguments); - }; - // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier - const origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription'); - Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', { - get () { - const description = origLocalDescription.get.apply(this); - if (description.type === '') return description; - return replaceInternalStreamId(this, description); - } - }); - window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) { - if (this.signalingState === 'closed') throw new DOMException('The RTCPeerConnection\'s signalingState is \'closed\'.', 'InvalidStateError'); - // We can not yet check for sender instanceof RTCRtpSender - // since we shim RTPSender. So we check if sender._pc is set. - if (!sender._pc) throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.", 'TypeError'); - const isLocal = sender._pc === this; - if (!isLocal) throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError'); - // Search for the native stream the senders track belongs to. - this._streams = this._streams || {}; - let stream; - Object.keys(this._streams).forEach((streamid)=>{ - const hasTrack = this._streams[streamid].getTracks().find((track)=>sender.track === track); - if (hasTrack) stream = this._streams[streamid]; - }); - if (stream) { - if (stream.getTracks().length === 1) // if this is the last track of the stream, remove the stream. This - // takes care of any shimmed _senders. - this.removeStream(this._reverseStreams[stream.id]); - else // relying on the same odd chrome behaviour as above. - stream.removeTrack(sender.track); - this.dispatchEvent(new Event('negotiationneeded')); - } - }; -} -function shimPeerConnection(window, browserDetails) { - if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) // very basic support for old versions. - window.RTCPeerConnection = window.webkitRTCPeerConnection; - if (!window.RTCPeerConnection) return; - // shim implicit creation of RTCSessionDescription/RTCIceCandidate - if (browserDetails.version < 53) [ - 'setLocalDescription', - 'setRemoteDescription', - 'addIceCandidate' - ].forEach(function(method) { - const nativeMethod = window.RTCPeerConnection.prototype[method]; - const methodObj = { - [method] () { - arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]); - return nativeMethod.apply(this, arguments); - } - }; - window.RTCPeerConnection.prototype[method] = methodObj[method]; - }); -} -function fixNegotiationNeeded(window, browserDetails) { - _utilsJs.wrapPeerConnectionEvent(window, 'negotiationneeded', (e)=>{ - const pc = e.target; - if (browserDetails.version < 72 || pc.getConfiguration && pc.getConfiguration().sdpSemantics === 'plan-b') { - if (pc.signalingState !== 'stable') return; - } - return e; - }); -} - -},{"../utils.js":"atxap","./getusermedia":"bOKqy","./getdisplaymedia":"lAkGt","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"bOKqy":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimGetUserMedia", ()=>shimGetUserMedia); -var _utilsJs = require("../utils.js"); -'use strict'; -const logging = _utilsJs.log; -function shimGetUserMedia(window, browserDetails) { - const navigator = window && window.navigator; - if (!navigator.mediaDevices) return; - const constraintsToChrome_ = function(c) { - if (typeof c !== 'object' || c.mandatory || c.optional) return c; - const cc = {}; - Object.keys(c).forEach((key)=>{ - if (key === 'require' || key === 'advanced' || key === 'mediaSource') return; - const r = typeof c[key] === 'object' ? c[key] : { - ideal: c[key] - }; - if (r.exact !== undefined && typeof r.exact === 'number') r.min = r.max = r.exact; - const oldname_ = function(prefix, name) { - if (prefix) return prefix + name.charAt(0).toUpperCase() + name.slice(1); - return name === 'deviceId' ? 'sourceId' : name; - }; - if (r.ideal !== undefined) { - cc.optional = cc.optional || []; - let oc = {}; - if (typeof r.ideal === 'number') { - oc[oldname_('min', key)] = r.ideal; - cc.optional.push(oc); - oc = {}; - oc[oldname_('max', key)] = r.ideal; - cc.optional.push(oc); - } else { - oc[oldname_('', key)] = r.ideal; - cc.optional.push(oc); - } - } - if (r.exact !== undefined && typeof r.exact !== 'number') { - cc.mandatory = cc.mandatory || {}; - cc.mandatory[oldname_('', key)] = r.exact; - } else [ - 'min', - 'max' - ].forEach((mix)=>{ - if (r[mix] !== undefined) { - cc.mandatory = cc.mandatory || {}; - cc.mandatory[oldname_(mix, key)] = r[mix]; - } - }); - }); - if (c.advanced) cc.optional = (cc.optional || []).concat(c.advanced); - return cc; - }; - const shimConstraints_ = function(constraints, func) { - if (browserDetails.version >= 61) return func(constraints); - constraints = JSON.parse(JSON.stringify(constraints)); - if (constraints && typeof constraints.audio === 'object') { - const remap = function(obj, a, b) { - if (a in obj && !(b in obj)) { - obj[b] = obj[a]; - delete obj[a]; - } - }; - constraints = JSON.parse(JSON.stringify(constraints)); - remap(constraints.audio, 'autoGainControl', 'googAutoGainControl'); - remap(constraints.audio, 'noiseSuppression', 'googNoiseSuppression'); - constraints.audio = constraintsToChrome_(constraints.audio); - } - if (constraints && typeof constraints.video === 'object') { - // Shim facingMode for mobile & surface pro. - let face = constraints.video.facingMode; - face = face && (typeof face === 'object' ? face : { - ideal: face - }); - const getSupportedFacingModeLies = browserDetails.version < 66; - if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) { - delete constraints.video.facingMode; - let matches; - if (face.exact === 'environment' || face.ideal === 'environment') matches = [ - 'back', - 'rear' - ]; - else if (face.exact === 'user' || face.ideal === 'user') matches = [ - 'front' - ]; - if (matches) // Look for matches in label, or use last cam for back (typical). - return navigator.mediaDevices.enumerateDevices().then((devices)=>{ - devices = devices.filter((d)=>d.kind === 'videoinput'); - let dev = devices.find((d)=>matches.some((match)=>d.label.toLowerCase().includes(match))); - if (!dev && devices.length && matches.includes('back')) dev = devices[devices.length - 1]; // more likely the back cam - if (dev) constraints.video.deviceId = face.exact ? { - exact: dev.deviceId - } : { - ideal: dev.deviceId - }; - constraints.video = constraintsToChrome_(constraints.video); - logging('chrome: ' + JSON.stringify(constraints)); - return func(constraints); - }); - } - constraints.video = constraintsToChrome_(constraints.video); - } - logging('chrome: ' + JSON.stringify(constraints)); - return func(constraints); - }; - const shimError_ = function(e) { - if (browserDetails.version >= 64) return e; - return { - name: ({ - PermissionDeniedError: 'NotAllowedError', - PermissionDismissedError: 'NotAllowedError', - InvalidStateError: 'NotAllowedError', - DevicesNotFoundError: 'NotFoundError', - ConstraintNotSatisfiedError: 'OverconstrainedError', - TrackStartError: 'NotReadableError', - MediaDeviceFailedDueToShutdown: 'NotAllowedError', - MediaDeviceKillSwitchOn: 'NotAllowedError', - TabCaptureError: 'AbortError', - ScreenCaptureError: 'AbortError', - DeviceCaptureError: 'AbortError' - })[e.name] || e.name, - message: e.message, - constraint: e.constraint || e.constraintName, - toString () { - return this.name + (this.message && ': ') + this.message; - } - }; - }; - const getUserMedia_ = function(constraints, onSuccess, onError) { - shimConstraints_(constraints, (c)=>{ - navigator.webkitGetUserMedia(c, onSuccess, (e)=>{ - if (onError) onError(shimError_(e)); - }); - }); - }; - navigator.getUserMedia = getUserMedia_.bind(navigator); - // Even though Chrome 45 has navigator.mediaDevices and a getUserMedia - // function which returns a Promise, it does not accept spec-style - // constraints. - if (navigator.mediaDevices.getUserMedia) { - const origGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices); - navigator.mediaDevices.getUserMedia = function(cs) { - return shimConstraints_(cs, (c)=>origGetUserMedia(c).then((stream)=>{ - if (c.audio && !stream.getAudioTracks().length || c.video && !stream.getVideoTracks().length) { - stream.getTracks().forEach((track)=>{ - track.stop(); - }); - throw new DOMException('', 'NotFoundError'); - } - return stream; - }, (e)=>Promise.reject(shimError_(e)))); - }; - } -} - -},{"../utils.js":"atxap","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"lAkGt":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimGetDisplayMedia", ()=>shimGetDisplayMedia); -'use strict'; -function shimGetDisplayMedia(window, getSourceId) { - if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) return; - if (!window.navigator.mediaDevices) return; - // getSourceId is a function that returns a promise resolving with - // the sourceId of the screen/window/tab to be shared. - if (typeof getSourceId !== 'function') { - console.error("shimGetDisplayMedia: getSourceId argument is not a function"); - return; - } - window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) { - return getSourceId(constraints).then((sourceId)=>{ - const widthSpecified = constraints.video && constraints.video.width; - const heightSpecified = constraints.video && constraints.video.height; - const frameRateSpecified = constraints.video && constraints.video.frameRate; - constraints.video = { - mandatory: { - chromeMediaSource: 'desktop', - chromeMediaSourceId: sourceId, - maxFrameRate: frameRateSpecified || 3 - } - }; - if (widthSpecified) constraints.video.mandatory.maxWidth = widthSpecified; - if (heightSpecified) constraints.video.mandatory.maxHeight = heightSpecified; - return window.navigator.mediaDevices.getUserMedia(constraints); - }); - }; -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"1Ffvn":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimGetUserMedia", ()=>(0, _getusermedia.shimGetUserMedia)); -parcelHelpers.export(exports, "shimGetDisplayMedia", ()=>(0, _getdisplaymedia.shimGetDisplayMedia)); -parcelHelpers.export(exports, "shimOnTrack", ()=>shimOnTrack); -parcelHelpers.export(exports, "shimPeerConnection", ()=>shimPeerConnection); -parcelHelpers.export(exports, "shimSenderGetStats", ()=>shimSenderGetStats); -parcelHelpers.export(exports, "shimReceiverGetStats", ()=>shimReceiverGetStats); -parcelHelpers.export(exports, "shimRemoveStream", ()=>shimRemoveStream); -parcelHelpers.export(exports, "shimRTCDataChannel", ()=>shimRTCDataChannel); -parcelHelpers.export(exports, "shimAddTransceiver", ()=>shimAddTransceiver); -parcelHelpers.export(exports, "shimGetParameters", ()=>shimGetParameters); -parcelHelpers.export(exports, "shimCreateOffer", ()=>shimCreateOffer); -parcelHelpers.export(exports, "shimCreateAnswer", ()=>shimCreateAnswer); -var _utils = require("../utils"); -var _getusermedia = require("./getusermedia"); -var _getdisplaymedia = require("./getdisplaymedia"); -'use strict'; -function shimOnTrack(window) { - if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', { - get () { - return { - receiver: this.receiver - }; - } - }); -} -function shimPeerConnection(window, browserDetails) { - if (typeof window !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) return; // probably media.peerconnection.enabled=false in about:config - if (!window.RTCPeerConnection && window.mozRTCPeerConnection) // very basic support for old versions. - window.RTCPeerConnection = window.mozRTCPeerConnection; - if (browserDetails.version < 53) // shim away need for obsolete RTCIceCandidate/RTCSessionDescription. - [ - 'setLocalDescription', - 'setRemoteDescription', - 'addIceCandidate' - ].forEach(function(method) { - const nativeMethod = window.RTCPeerConnection.prototype[method]; - const methodObj = { - [method] () { - arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]); - return nativeMethod.apply(this, arguments); - } - }; - window.RTCPeerConnection.prototype[method] = methodObj[method]; - }); - const modernStatsTypes = { - inboundrtp: 'inbound-rtp', - outboundrtp: 'outbound-rtp', - candidatepair: 'candidate-pair', - localcandidate: 'local-candidate', - remotecandidate: 'remote-candidate' - }; - const nativeGetStats = window.RTCPeerConnection.prototype.getStats; - window.RTCPeerConnection.prototype.getStats = function getStats() { - const [selector, onSucc, onErr] = arguments; - return nativeGetStats.apply(this, [ - selector || null - ]).then((stats)=>{ - if (browserDetails.version < 53 && !onSucc) // Shim only promise getStats with spec-hyphens in type names - // Leave callback version alone; misc old uses of forEach before Map - try { - stats.forEach((stat)=>{ - stat.type = modernStatsTypes[stat.type] || stat.type; - }); - } catch (e) { - if (e.name !== 'TypeError') throw e; - // Avoid TypeError: "type" is read-only, in old versions. 34-43ish - stats.forEach((stat, i)=>{ - stats.set(i, Object.assign({}, stat, { - type: modernStatsTypes[stat.type] || stat.type - })); - }); - } - return stats; - }).then(onSucc, onErr); - }; -} -function shimSenderGetStats(window) { - if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) return; - if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) return; - const origGetSenders = window.RTCPeerConnection.prototype.getSenders; - if (origGetSenders) window.RTCPeerConnection.prototype.getSenders = function getSenders() { - const senders = origGetSenders.apply(this, []); - senders.forEach((sender)=>sender._pc = this); - return senders; - }; - const origAddTrack = window.RTCPeerConnection.prototype.addTrack; - if (origAddTrack) window.RTCPeerConnection.prototype.addTrack = function addTrack() { - const sender = origAddTrack.apply(this, arguments); - sender._pc = this; - return sender; - }; - window.RTCRtpSender.prototype.getStats = function getStats() { - return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map()); - }; -} -function shimReceiverGetStats(window) { - if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) return; - if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) return; - const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers; - if (origGetReceivers) window.RTCPeerConnection.prototype.getReceivers = function getReceivers() { - const receivers = origGetReceivers.apply(this, []); - receivers.forEach((receiver)=>receiver._pc = this); - return receivers; - }; - _utils.wrapPeerConnectionEvent(window, 'track', (e)=>{ - e.receiver._pc = e.srcElement; - return e; - }); - window.RTCRtpReceiver.prototype.getStats = function getStats() { - return this._pc.getStats(this.track); - }; -} -function shimRemoveStream(window) { - if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) return; - window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - _utils.deprecated('removeStream', 'removeTrack'); - this.getSenders().forEach((sender)=>{ - if (sender.track && stream.getTracks().includes(sender.track)) this.removeTrack(sender); - }); - }; -} -function shimRTCDataChannel(window) { - // rename DataChannel to RTCDataChannel (native fix in FF60): - // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851 - if (window.DataChannel && !window.RTCDataChannel) window.RTCDataChannel = window.DataChannel; -} -function shimAddTransceiver(window) { - // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 - // Firefox ignores the init sendEncodings options passed to addTransceiver - // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 - if (!(typeof window === 'object' && window.RTCPeerConnection)) return; - const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver; - if (origAddTransceiver) window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() { - this.setParametersPromises = []; - // WebIDL input coercion and validation - let sendEncodings = arguments[1] && arguments[1].sendEncodings; - if (sendEncodings === undefined) sendEncodings = []; - sendEncodings = [ - ...sendEncodings - ]; - const shouldPerformCheck = sendEncodings.length > 0; - if (shouldPerformCheck) // If sendEncodings params are provided, validate grammar - sendEncodings.forEach((encodingParam)=>{ - if ('rid' in encodingParam) { - const ridRegex = /^[a-z0-9]{0,16}$/i; - if (!ridRegex.test(encodingParam.rid)) throw new TypeError('Invalid RID value provided.'); - } - if ('scaleResolutionDownBy' in encodingParam) { - if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) throw new RangeError('scale_resolution_down_by must be >= 1.0'); - } - if ('maxFramerate' in encodingParam) { - if (!(parseFloat(encodingParam.maxFramerate) >= 0)) throw new RangeError('max_framerate must be >= 0.0'); - } - }); - const transceiver = origAddTransceiver.apply(this, arguments); - if (shouldPerformCheck) { - // Check if the init options were applied. If not we do this in an - // asynchronous way and save the promise reference in a global object. - // This is an ugly hack, but at the same time is way more robust than - // checking the sender parameters before and after the createOffer - // Also note that after the createoffer we are not 100% sure that - // the params were asynchronously applied so we might miss the - // opportunity to recreate offer. - const { sender } = transceiver; - const params = sender.getParameters(); - if (!('encodings' in params) || // Avoid being fooled by patched getParameters() below. - params.encodings.length === 1 && Object.keys(params.encodings[0]).length === 0) { - params.encodings = sendEncodings; - sender.sendEncodings = sendEncodings; - this.setParametersPromises.push(sender.setParameters(params).then(()=>{ - delete sender.sendEncodings; - }).catch(()=>{ - delete sender.sendEncodings; - })); - } - } - return transceiver; - }; -} -function shimGetParameters(window) { - if (!(typeof window === 'object' && window.RTCRtpSender)) return; - const origGetParameters = window.RTCRtpSender.prototype.getParameters; - if (origGetParameters) window.RTCRtpSender.prototype.getParameters = function getParameters() { - const params = origGetParameters.apply(this, arguments); - if (!('encodings' in params)) params.encodings = [].concat(this.sendEncodings || [ - {} - ]); - return params; - }; -} -function shimCreateOffer(window) { - // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 - // Firefox ignores the init sendEncodings options passed to addTransceiver - // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 - if (!(typeof window === 'object' && window.RTCPeerConnection)) return; - const origCreateOffer = window.RTCPeerConnection.prototype.createOffer; - window.RTCPeerConnection.prototype.createOffer = function createOffer() { - if (this.setParametersPromises && this.setParametersPromises.length) return Promise.all(this.setParametersPromises).then(()=>{ - return origCreateOffer.apply(this, arguments); - }).finally(()=>{ - this.setParametersPromises = []; - }); - return origCreateOffer.apply(this, arguments); - }; -} -function shimCreateAnswer(window) { - // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647 - // Firefox ignores the init sendEncodings options passed to addTransceiver - // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918 - if (!(typeof window === 'object' && window.RTCPeerConnection)) return; - const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer; - window.RTCPeerConnection.prototype.createAnswer = function createAnswer() { - if (this.setParametersPromises && this.setParametersPromises.length) return Promise.all(this.setParametersPromises).then(()=>{ - return origCreateAnswer.apply(this, arguments); - }).finally(()=>{ - this.setParametersPromises = []; - }); - return origCreateAnswer.apply(this, arguments); - }; -} - -},{"../utils":"atxap","./getusermedia":"1PYpQ","./getdisplaymedia":"efoW6","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"1PYpQ":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimGetUserMedia", ()=>shimGetUserMedia); -var _utils = require("../utils"); -'use strict'; -function shimGetUserMedia(window, browserDetails) { - const navigator = window && window.navigator; - const MediaStreamTrack = window && window.MediaStreamTrack; - navigator.getUserMedia = function(constraints, onSuccess, onError) { - // Replace Firefox 44+'s deprecation warning with unprefixed version. - _utils.deprecated('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia'); - navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError); - }; - if (!(browserDetails.version > 55 && 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) { - const remap = function(obj, a, b) { - if (a in obj && !(b in obj)) { - obj[b] = obj[a]; - delete obj[a]; - } - }; - const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.bind(navigator.mediaDevices); - navigator.mediaDevices.getUserMedia = function(c) { - if (typeof c === 'object' && typeof c.audio === 'object') { - c = JSON.parse(JSON.stringify(c)); - remap(c.audio, 'autoGainControl', 'mozAutoGainControl'); - remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression'); - } - return nativeGetUserMedia(c); - }; - if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) { - const nativeGetSettings = MediaStreamTrack.prototype.getSettings; - MediaStreamTrack.prototype.getSettings = function() { - const obj = nativeGetSettings.apply(this, arguments); - remap(obj, 'mozAutoGainControl', 'autoGainControl'); - remap(obj, 'mozNoiseSuppression', 'noiseSuppression'); - return obj; - }; - } - if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) { - const nativeApplyConstraints = MediaStreamTrack.prototype.applyConstraints; - MediaStreamTrack.prototype.applyConstraints = function(c) { - if (this.kind === 'audio' && typeof c === 'object') { - c = JSON.parse(JSON.stringify(c)); - remap(c, 'autoGainControl', 'mozAutoGainControl'); - remap(c, 'noiseSuppression', 'mozNoiseSuppression'); - } - return nativeApplyConstraints.apply(this, [ - c - ]); - }; - } - } -} - -},{"../utils":"atxap","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"efoW6":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimGetDisplayMedia", ()=>shimGetDisplayMedia); -'use strict'; -function shimGetDisplayMedia(window, preferredMediaSource) { - if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) return; - if (!window.navigator.mediaDevices) return; - window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) { - if (!(constraints && constraints.video)) { - const err = new DOMException("getDisplayMedia without video constraints is undefined"); - err.name = 'NotFoundError'; - // from https://heycam.github.io/webidl/#idl-DOMException-error-names - err.code = 8; - return Promise.reject(err); - } - if (constraints.video === true) constraints.video = { - mediaSource: preferredMediaSource - }; - else constraints.video.mediaSource = preferredMediaSource; - return window.navigator.mediaDevices.getUserMedia(constraints); - }; -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"48iHo":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimLocalStreamsAPI", ()=>shimLocalStreamsAPI); -parcelHelpers.export(exports, "shimRemoteStreamsAPI", ()=>shimRemoteStreamsAPI); -parcelHelpers.export(exports, "shimCallbacksAPI", ()=>shimCallbacksAPI); -parcelHelpers.export(exports, "shimGetUserMedia", ()=>shimGetUserMedia); -parcelHelpers.export(exports, "shimConstraints", ()=>shimConstraints); -parcelHelpers.export(exports, "shimRTCIceServerUrls", ()=>shimRTCIceServerUrls); -parcelHelpers.export(exports, "shimTrackEventTransceiver", ()=>shimTrackEventTransceiver); -parcelHelpers.export(exports, "shimCreateOfferLegacy", ()=>shimCreateOfferLegacy); -parcelHelpers.export(exports, "shimAudioContext", ()=>shimAudioContext); -var _utils = require("../utils"); -'use strict'; -function shimLocalStreamsAPI(window) { - if (typeof window !== 'object' || !window.RTCPeerConnection) return; - if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() { - if (!this._localStreams) this._localStreams = []; - return this._localStreams; - }; - if (!('addStream' in window.RTCPeerConnection.prototype)) { - const _addTrack = window.RTCPeerConnection.prototype.addTrack; - window.RTCPeerConnection.prototype.addStream = function addStream(stream) { - if (!this._localStreams) this._localStreams = []; - if (!this._localStreams.includes(stream)) this._localStreams.push(stream); - // Try to emulate Chrome's behaviour of adding in audio-video order. - // Safari orders by track id. - stream.getAudioTracks().forEach((track)=>_addTrack.call(this, track, stream)); - stream.getVideoTracks().forEach((track)=>_addTrack.call(this, track, stream)); - }; - window.RTCPeerConnection.prototype.addTrack = function addTrack(track, ...streams) { - if (streams) streams.forEach((stream)=>{ - if (!this._localStreams) this._localStreams = [ - stream - ]; - else if (!this._localStreams.includes(stream)) this._localStreams.push(stream); - }); - return _addTrack.apply(this, arguments); - }; - } - if (!('removeStream' in window.RTCPeerConnection.prototype)) window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) { - if (!this._localStreams) this._localStreams = []; - const index = this._localStreams.indexOf(stream); - if (index === -1) return; - this._localStreams.splice(index, 1); - const tracks = stream.getTracks(); - this.getSenders().forEach((sender)=>{ - if (tracks.includes(sender.track)) this.removeTrack(sender); - }); - }; -} -function shimRemoteStreamsAPI(window) { - if (typeof window !== 'object' || !window.RTCPeerConnection) return; - if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() { - return this._remoteStreams ? this._remoteStreams : []; - }; - if (!('onaddstream' in window.RTCPeerConnection.prototype)) { - Object.defineProperty(window.RTCPeerConnection.prototype, 'onaddstream', { - get () { - return this._onaddstream; - }, - set (f) { - if (this._onaddstream) { - this.removeEventListener('addstream', this._onaddstream); - this.removeEventListener('track', this._onaddstreampoly); - } - this.addEventListener('addstream', this._onaddstream = f); - this.addEventListener('track', this._onaddstreampoly = (e)=>{ - e.streams.forEach((stream)=>{ - if (!this._remoteStreams) this._remoteStreams = []; - if (this._remoteStreams.includes(stream)) return; - this._remoteStreams.push(stream); - const event = new Event('addstream'); - event.stream = stream; - this.dispatchEvent(event); - }); - }); - } - }); - const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() { - const pc = this; - if (!this._onaddstreampoly) this.addEventListener('track', this._onaddstreampoly = function(e) { - e.streams.forEach((stream)=>{ - if (!pc._remoteStreams) pc._remoteStreams = []; - if (pc._remoteStreams.indexOf(stream) >= 0) return; - pc._remoteStreams.push(stream); - const event = new Event('addstream'); - event.stream = stream; - pc.dispatchEvent(event); - }); - }); - return origSetRemoteDescription.apply(pc, arguments); - }; - } -} -function shimCallbacksAPI(window) { - if (typeof window !== 'object' || !window.RTCPeerConnection) return; - const prototype = window.RTCPeerConnection.prototype; - const origCreateOffer = prototype.createOffer; - const origCreateAnswer = prototype.createAnswer; - const setLocalDescription = prototype.setLocalDescription; - const setRemoteDescription = prototype.setRemoteDescription; - const addIceCandidate = prototype.addIceCandidate; - prototype.createOffer = function createOffer(successCallback, failureCallback) { - const options = arguments.length >= 2 ? arguments[2] : arguments[0]; - const promise = origCreateOffer.apply(this, [ - options - ]); - if (!failureCallback) return promise; - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.createAnswer = function createAnswer(successCallback, failureCallback) { - const options = arguments.length >= 2 ? arguments[2] : arguments[0]; - const promise = origCreateAnswer.apply(this, [ - options - ]); - if (!failureCallback) return promise; - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - let withCallback = function(description, successCallback, failureCallback) { - const promise = setLocalDescription.apply(this, [ - description - ]); - if (!failureCallback) return promise; - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.setLocalDescription = withCallback; - withCallback = function(description, successCallback, failureCallback) { - const promise = setRemoteDescription.apply(this, [ - description - ]); - if (!failureCallback) return promise; - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.setRemoteDescription = withCallback; - withCallback = function(candidate, successCallback, failureCallback) { - const promise = addIceCandidate.apply(this, [ - candidate - ]); - if (!failureCallback) return promise; - promise.then(successCallback, failureCallback); - return Promise.resolve(); - }; - prototype.addIceCandidate = withCallback; -} -function shimGetUserMedia(window) { - const navigator = window && window.navigator; - if (navigator.mediaDevices && navigator.mediaDevices.getUserMedia) { - // shim not needed in Safari 12.1 - const mediaDevices = navigator.mediaDevices; - const _getUserMedia = mediaDevices.getUserMedia.bind(mediaDevices); - navigator.mediaDevices.getUserMedia = (constraints)=>{ - return _getUserMedia(shimConstraints(constraints)); - }; - } - if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) navigator.getUserMedia = (function getUserMedia(constraints, cb, errcb) { - navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb); - }).bind(navigator); -} -function shimConstraints(constraints) { - if (constraints && constraints.video !== undefined) return Object.assign({}, constraints, { - video: _utils.compactObject(constraints.video) - }); - return constraints; -} -function shimRTCIceServerUrls(window) { - if (!window.RTCPeerConnection) return; - // migrate from non-spec RTCIceServer.url to RTCIceServer.urls - const OrigPeerConnection = window.RTCPeerConnection; - window.RTCPeerConnection = function RTCPeerConnection(pcConfig, pcConstraints) { - if (pcConfig && pcConfig.iceServers) { - const newIceServers = []; - for(let i = 0; i < pcConfig.iceServers.length; i++){ - let server = pcConfig.iceServers[i]; - if (server.urls === undefined && server.url) { - _utils.deprecated('RTCIceServer.url', 'RTCIceServer.urls'); - server = JSON.parse(JSON.stringify(server)); - server.urls = server.url; - delete server.url; - newIceServers.push(server); - } else newIceServers.push(pcConfig.iceServers[i]); - } - pcConfig.iceServers = newIceServers; - } - return new OrigPeerConnection(pcConfig, pcConstraints); - }; - window.RTCPeerConnection.prototype = OrigPeerConnection.prototype; - // wrap static methods. Currently just generateCertificate. - if ('generateCertificate' in OrigPeerConnection) Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', { - get () { - return OrigPeerConnection.generateCertificate; - } - }); -} -function shimTrackEventTransceiver(window) { - // Add event.transceiver member over deprecated event.receiver - if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', { - get () { - return { - receiver: this.receiver - }; - } - }); -} -function shimCreateOfferLegacy(window) { - const origCreateOffer = window.RTCPeerConnection.prototype.createOffer; - window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) { - if (offerOptions) { - if (typeof offerOptions.offerToReceiveAudio !== 'undefined') // support bit values - offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio; - const audioTransceiver = this.getTransceivers().find((transceiver)=>transceiver.receiver.track.kind === 'audio'); - if (offerOptions.offerToReceiveAudio === false && audioTransceiver) { - if (audioTransceiver.direction === 'sendrecv') { - if (audioTransceiver.setDirection) audioTransceiver.setDirection('sendonly'); - else audioTransceiver.direction = 'sendonly'; - } else if (audioTransceiver.direction === 'recvonly') { - if (audioTransceiver.setDirection) audioTransceiver.setDirection('inactive'); - else audioTransceiver.direction = 'inactive'; - } - } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) this.addTransceiver('audio', { - direction: 'recvonly' - }); - if (typeof offerOptions.offerToReceiveVideo !== 'undefined') // support bit values - offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo; - const videoTransceiver = this.getTransceivers().find((transceiver)=>transceiver.receiver.track.kind === 'video'); - if (offerOptions.offerToReceiveVideo === false && videoTransceiver) { - if (videoTransceiver.direction === 'sendrecv') { - if (videoTransceiver.setDirection) videoTransceiver.setDirection('sendonly'); - else videoTransceiver.direction = 'sendonly'; - } else if (videoTransceiver.direction === 'recvonly') { - if (videoTransceiver.setDirection) videoTransceiver.setDirection('inactive'); - else videoTransceiver.direction = 'inactive'; - } - } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) this.addTransceiver('video', { - direction: 'recvonly' - }); - } - return origCreateOffer.apply(this, arguments); - }; -} -function shimAudioContext(window) { - if (typeof window !== 'object' || window.AudioContext) return; - window.AudioContext = window.webkitAudioContext; -} - -},{"../utils":"atxap","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"9UG5h":[function(require,module,exports,__globalThis) { -/* - * Copyright (c) 2017 The WebRTC project authors. All Rights Reserved. - * - * Use of this source code is governed by a BSD-style license - * that can be found in the LICENSE file in the root of the source - * tree. - */ /* eslint-env node */ var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "shimRTCIceCandidate", ()=>shimRTCIceCandidate); -parcelHelpers.export(exports, "shimRTCIceCandidateRelayProtocol", ()=>shimRTCIceCandidateRelayProtocol); -parcelHelpers.export(exports, "shimMaxMessageSize", ()=>shimMaxMessageSize); -parcelHelpers.export(exports, "shimSendThrowTypeError", ()=>shimSendThrowTypeError); -/* shims RTCConnectionState by pretending it is the same as iceConnectionState. - * See https://bugs.chromium.org/p/webrtc/issues/detail?id=6145#c12 - * for why this is a valid hack in Chrome. In Firefox it is slightly incorrect - * since DTLS failures would be hidden. See - * https://bugzilla.mozilla.org/show_bug.cgi?id=1265827 - * for the Firefox tracking bug. - */ parcelHelpers.export(exports, "shimConnectionState", ()=>shimConnectionState); -parcelHelpers.export(exports, "removeExtmapAllowMixed", ()=>removeExtmapAllowMixed); -parcelHelpers.export(exports, "shimAddIceCandidateNullOrEmpty", ()=>shimAddIceCandidateNullOrEmpty); -// Note: Make sure to call this ahead of APIs that modify -// setLocalDescription.length -parcelHelpers.export(exports, "shimParameterlessSetLocalDescription", ()=>shimParameterlessSetLocalDescription); -var _sdp = require("sdp"); -var _sdpDefault = parcelHelpers.interopDefault(_sdp); -var _utils = require("./utils"); -'use strict'; -function shimRTCIceCandidate(window) { - // foundation is arbitrarily chosen as an indicator for full support for - // https://w3c.github.io/webrtc-pc/#rtcicecandidate-interface - if (!window.RTCIceCandidate || window.RTCIceCandidate && 'foundation' in window.RTCIceCandidate.prototype) return; - const NativeRTCIceCandidate = window.RTCIceCandidate; - window.RTCIceCandidate = function RTCIceCandidate(args) { - // Remove the a= which shouldn't be part of the candidate string. - if (typeof args === 'object' && args.candidate && args.candidate.indexOf('a=') === 0) { - args = JSON.parse(JSON.stringify(args)); - args.candidate = args.candidate.substring(2); - } - if (args.candidate && args.candidate.length) { - // Augment the native candidate with the parsed fields. - const nativeCandidate = new NativeRTCIceCandidate(args); - const parsedCandidate = (0, _sdpDefault.default).parseCandidate(args.candidate); - for(const key in parsedCandidate)if (!(key in nativeCandidate)) Object.defineProperty(nativeCandidate, key, { - value: parsedCandidate[key] - }); - // Override serializer to not serialize the extra attributes. - nativeCandidate.toJSON = function toJSON() { - return { - candidate: nativeCandidate.candidate, - sdpMid: nativeCandidate.sdpMid, - sdpMLineIndex: nativeCandidate.sdpMLineIndex, - usernameFragment: nativeCandidate.usernameFragment - }; - }; - return nativeCandidate; - } - return new NativeRTCIceCandidate(args); - }; - window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype; - // Hook up the augmented candidate in onicecandidate and - // addEventListener('icecandidate', ...) - _utils.wrapPeerConnectionEvent(window, 'icecandidate', (e)=>{ - if (e.candidate) Object.defineProperty(e, 'candidate', { - value: new window.RTCIceCandidate(e.candidate), - writable: 'false' - }); - return e; - }); -} -function shimRTCIceCandidateRelayProtocol(window) { - if (!window.RTCIceCandidate || window.RTCIceCandidate && 'relayProtocol' in window.RTCIceCandidate.prototype) return; - // Hook up the augmented candidate in onicecandidate and - // addEventListener('icecandidate', ...) - _utils.wrapPeerConnectionEvent(window, 'icecandidate', (e)=>{ - if (e.candidate) { - const parsedCandidate = (0, _sdpDefault.default).parseCandidate(e.candidate.candidate); - if (parsedCandidate.type === 'relay') // This is a libwebrtc-specific mapping of local type preference - // to relayProtocol. - e.candidate.relayProtocol = ({ - 0: 'tls', - 1: 'tcp', - 2: 'udp' - })[parsedCandidate.priority >> 24]; - } - return e; - }); -} -function shimMaxMessageSize(window, browserDetails) { - if (!window.RTCPeerConnection) return; - if (!('sctp' in window.RTCPeerConnection.prototype)) Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', { - get () { - return typeof this._sctp === 'undefined' ? null : this._sctp; - } - }); - const sctpInDescription = function(description) { - if (!description || !description.sdp) return false; - const sections = (0, _sdpDefault.default).splitSections(description.sdp); - sections.shift(); - return sections.some((mediaSection)=>{ - const mLine = (0, _sdpDefault.default).parseMLine(mediaSection); - return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1; - }); - }; - const getRemoteFirefoxVersion = function(description) { - // TODO: Is there a better solution for detecting Firefox? - const match = description.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/); - if (match === null || match.length < 2) return -1; - const version = parseInt(match[1], 10); - // Test for NaN (yes, this is ugly) - return version !== version ? -1 : version; - }; - const getCanSendMaxMessageSize = function(remoteIsFirefox) { - // Every implementation we know can send at least 64 KiB. - // Note: Although Chrome is technically able to send up to 256 KiB, the - // data does not reach the other peer reliably. - // See: https://bugs.chromium.org/p/webrtc/issues/detail?id=8419 - let canSendMaxMessageSize = 65536; - if (browserDetails.browser === 'firefox') { - if (browserDetails.version < 57) { - if (remoteIsFirefox === -1) // FF < 57 will send in 16 KiB chunks using the deprecated PPID - // fragmentation. - canSendMaxMessageSize = 16384; - else // However, other FF (and RAWRTC) can reassemble PPID-fragmented - // messages. Thus, supporting ~2 GiB when sending. - canSendMaxMessageSize = 2147483637; - } else if (browserDetails.version < 60) // Currently, all FF >= 57 will reset the remote maximum message size - // to the default value when a data channel is created at a later - // stage. :( - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831 - canSendMaxMessageSize = browserDetails.version === 57 ? 65535 : 65536; - else // FF >= 60 supports sending ~2 GiB - canSendMaxMessageSize = 2147483637; - } - return canSendMaxMessageSize; - }; - const getMaxMessageSize = function(description, remoteIsFirefox) { - // Note: 65536 bytes is the default value from the SDP spec. Also, - // every implementation we know supports receiving 65536 bytes. - let maxMessageSize = 65536; - // FF 57 has a slightly incorrect default remote max message size, so - // we need to adjust it here to avoid a failure when sending. - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1425697 - if (browserDetails.browser === 'firefox' && browserDetails.version === 57) maxMessageSize = 65535; - const match = (0, _sdpDefault.default).matchPrefix(description.sdp, 'a=max-message-size:'); - if (match.length > 0) maxMessageSize = parseInt(match[0].substring(19), 10); - else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) // If the maximum message size is not present in the remote SDP and - // both local and remote are Firefox, the remote peer can receive - // ~2 GiB. - maxMessageSize = 2147483637; - return maxMessageSize; - }; - const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() { - this._sctp = null; - // Chrome decided to not expose .sctp in plan-b mode. - // As usual, adapter.js has to do an 'ugly worakaround' - // to cover up the mess. - if (browserDetails.browser === 'chrome' && browserDetails.version >= 76) { - const { sdpSemantics } = this.getConfiguration(); - if (sdpSemantics === 'plan-b') Object.defineProperty(this, 'sctp', { - get () { - return typeof this._sctp === 'undefined' ? null : this._sctp; - }, - enumerable: true, - configurable: true - }); - } - if (sctpInDescription(arguments[0])) { - // Check if the remote is FF. - const isFirefox = getRemoteFirefoxVersion(arguments[0]); - // Get the maximum message size the local peer is capable of sending - const canSendMMS = getCanSendMaxMessageSize(isFirefox); - // Get the maximum message size of the remote peer. - const remoteMMS = getMaxMessageSize(arguments[0], isFirefox); - // Determine final maximum message size - let maxMessageSize; - if (canSendMMS === 0 && remoteMMS === 0) maxMessageSize = Number.POSITIVE_INFINITY; - else if (canSendMMS === 0 || remoteMMS === 0) maxMessageSize = Math.max(canSendMMS, remoteMMS); - else maxMessageSize = Math.min(canSendMMS, remoteMMS); - // Create a dummy RTCSctpTransport object and the 'maxMessageSize' - // attribute. - const sctp = {}; - Object.defineProperty(sctp, 'maxMessageSize', { - get () { - return maxMessageSize; - } - }); - this._sctp = sctp; - } - return origSetRemoteDescription.apply(this, arguments); - }; -} -function shimSendThrowTypeError(window) { - if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) return; - // Note: Although Firefox >= 57 has a native implementation, the maximum - // message size can be reset for all data channels at a later stage. - // See: https://bugzilla.mozilla.org/show_bug.cgi?id=1426831 - function wrapDcSend(dc, pc) { - const origDataChannelSend = dc.send; - dc.send = function send() { - const data = arguments[0]; - const length = data.length || data.size || data.byteLength; - if (dc.readyState === 'open' && pc.sctp && length > pc.sctp.maxMessageSize) throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)'); - return origDataChannelSend.apply(dc, arguments); - }; - } - const origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel; - window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() { - const dataChannel = origCreateDataChannel.apply(this, arguments); - wrapDcSend(dataChannel, this); - return dataChannel; - }; - _utils.wrapPeerConnectionEvent(window, 'datachannel', (e)=>{ - wrapDcSend(e.channel, e.target); - return e; - }); -} -function shimConnectionState(window) { - if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) return; - const proto = window.RTCPeerConnection.prototype; - Object.defineProperty(proto, 'connectionState', { - get () { - return ({ - completed: 'connected', - checking: 'connecting' - })[this.iceConnectionState] || this.iceConnectionState; - }, - enumerable: true, - configurable: true - }); - Object.defineProperty(proto, 'onconnectionstatechange', { - get () { - return this._onconnectionstatechange || null; - }, - set (cb) { - if (this._onconnectionstatechange) { - this.removeEventListener('connectionstatechange', this._onconnectionstatechange); - delete this._onconnectionstatechange; - } - if (cb) this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb); - }, - enumerable: true, - configurable: true - }); - [ - 'setLocalDescription', - 'setRemoteDescription' - ].forEach((method)=>{ - const origMethod = proto[method]; - proto[method] = function() { - if (!this._connectionstatechangepoly) { - this._connectionstatechangepoly = (e)=>{ - const pc = e.target; - if (pc._lastConnectionState !== pc.connectionState) { - pc._lastConnectionState = pc.connectionState; - const newEvent = new Event('connectionstatechange', e); - pc.dispatchEvent(newEvent); - } - return e; - }; - this.addEventListener('iceconnectionstatechange', this._connectionstatechangepoly); - } - return origMethod.apply(this, arguments); - }; - }); -} -function removeExtmapAllowMixed(window, browserDetails) { - /* remove a=extmap-allow-mixed for webrtc.org < M71 */ if (!window.RTCPeerConnection) return; - if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) return; - if (browserDetails.browser === 'safari' && browserDetails.version >= 605) return; - const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription; - window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription(desc) { - if (desc && desc.sdp && desc.sdp.indexOf('\na=extmap-allow-mixed') !== -1) { - const sdp = desc.sdp.split('\n').filter((line)=>{ - return line.trim() !== 'a=extmap-allow-mixed'; - }).join('\n'); - // Safari enforces read-only-ness of RTCSessionDescription fields. - if (window.RTCSessionDescription && desc instanceof window.RTCSessionDescription) arguments[0] = new window.RTCSessionDescription({ - type: desc.type, - sdp - }); - else desc.sdp = sdp; - } - return nativeSRD.apply(this, arguments); - }; -} -function shimAddIceCandidateNullOrEmpty(window, browserDetails) { - // Support for addIceCandidate(null or undefined) - // as well as addIceCandidate({candidate: "", ...}) - // https://bugs.chromium.org/p/chromium/issues/detail?id=978582 - // Note: must be called before other polyfills which change the signature. - if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) return; - const nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate; - if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) return; - window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() { - if (!arguments[0]) { - if (arguments[1]) arguments[1].apply(null); - return Promise.resolve(); - } - // Firefox 68+ emits and processes {candidate: "", ...}, ignore - // in older versions. - // Native support for ignoring exists for Chrome M77+. - // Safari ignores as well, exact version unknown but works in the same - // version that also ignores addIceCandidate(null). - if ((browserDetails.browser === 'chrome' && browserDetails.version < 78 || browserDetails.browser === 'firefox' && browserDetails.version < 68 || browserDetails.browser === 'safari') && arguments[0] && arguments[0].candidate === '') return Promise.resolve(); - return nativeAddIceCandidate.apply(this, arguments); - }; -} -function shimParameterlessSetLocalDescription(window, browserDetails) { - if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) return; - const nativeSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription; - if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) return; - window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() { - let desc = arguments[0] || {}; - if (typeof desc !== 'object' || desc.type && desc.sdp) return nativeSetLocalDescription.apply(this, arguments); - // The remaining steps should technically happen when SLD comes off the - // RTCPeerConnection's operations chain (not ahead of going on it), but - // this is too difficult to shim. Instead, this shim only covers the - // common case where the operations chain is empty. This is imperfect, but - // should cover many cases. Rationale: Even if we can't reduce the glare - // window to zero on imperfect implementations, there's value in tapping - // into the perfect negotiation pattern that several browsers support. - desc = { - type: desc.type, - sdp: desc.sdp - }; - if (!desc.type) switch(this.signalingState){ - case 'stable': - case 'have-local-offer': - case 'have-remote-pranswer': - desc.type = 'offer'; - break; - default: - desc.type = 'answer'; - break; - } - if (desc.sdp || desc.type !== 'offer' && desc.type !== 'answer') return nativeSetLocalDescription.apply(this, [ - desc - ]); - const func = desc.type === 'offer' ? this.createOffer : this.createAnswer; - return func.apply(this).then((d)=>nativeSetLocalDescription.apply(this, [ - d - ])); - }; -} - -},{"sdp":"af6vf","./utils":"atxap","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"af6vf":[function(require,module,exports,__globalThis) { -/* eslint-env node */ 'use strict'; -// SDP helpers. -const SDPUtils = {}; -// Generate an alphanumeric identifier for cname or mids. -// TODO: use UUIDs instead? https://gist.github.com/jed/982883 -SDPUtils.generateIdentifier = function() { - return Math.random().toString(36).substring(2, 12); -}; -// The RTCP CNAME used by all peerconnections from the same JS. -SDPUtils.localCName = SDPUtils.generateIdentifier(); -// Splits SDP into lines, dealing with both CRLF and LF. -SDPUtils.splitLines = function(blob) { - return blob.trim().split('\n').map((line)=>line.trim()); -}; -// Splits SDP into sessionpart and mediasections. Ensures CRLF. -SDPUtils.splitSections = function(blob) { - const parts = blob.split('\nm='); - return parts.map((part, index)=>(index > 0 ? 'm=' + part : part).trim() + '\r\n'); -}; -// Returns the session description. -SDPUtils.getDescription = function(blob) { - const sections = SDPUtils.splitSections(blob); - return sections && sections[0]; -}; -// Returns the individual media sections. -SDPUtils.getMediaSections = function(blob) { - const sections = SDPUtils.splitSections(blob); - sections.shift(); - return sections; -}; -// Returns lines that start with a certain prefix. -SDPUtils.matchPrefix = function(blob, prefix) { - return SDPUtils.splitLines(blob).filter((line)=>line.indexOf(prefix) === 0); -}; -// Parses an ICE candidate line. Sample input: -// candidate:702786350 2 udp 41819902 8.8.8.8 60769 typ relay raddr 8.8.8.8 -// rport 55996" -// Input can be prefixed with a=. -SDPUtils.parseCandidate = function(line) { - let parts; - // Parse both variants. - if (line.indexOf('a=candidate:') === 0) parts = line.substring(12).split(' '); - else parts = line.substring(10).split(' '); - const candidate = { - foundation: parts[0], - component: { - 1: 'rtp', - 2: 'rtcp' - }[parts[1]] || parts[1], - protocol: parts[2].toLowerCase(), - priority: parseInt(parts[3], 10), - ip: parts[4], - address: parts[4], - port: parseInt(parts[5], 10), - // skip parts[6] == 'typ' - type: parts[7] - }; - for(let i = 8; i < parts.length; i += 2)switch(parts[i]){ - case 'raddr': - candidate.relatedAddress = parts[i + 1]; - break; - case 'rport': - candidate.relatedPort = parseInt(parts[i + 1], 10); - break; - case 'tcptype': - candidate.tcpType = parts[i + 1]; - break; - case 'ufrag': - candidate.ufrag = parts[i + 1]; // for backward compatibility. - candidate.usernameFragment = parts[i + 1]; - break; - default: - if (candidate[parts[i]] === undefined) candidate[parts[i]] = parts[i + 1]; - break; - } - return candidate; -}; -// Translates a candidate object into SDP candidate attribute. -// This does not include the a= prefix! -SDPUtils.writeCandidate = function(candidate) { - const sdp = []; - sdp.push(candidate.foundation); - const component = candidate.component; - if (component === 'rtp') sdp.push(1); - else if (component === 'rtcp') sdp.push(2); - else sdp.push(component); - sdp.push(candidate.protocol.toUpperCase()); - sdp.push(candidate.priority); - sdp.push(candidate.address || candidate.ip); - sdp.push(candidate.port); - const type = candidate.type; - sdp.push('typ'); - sdp.push(type); - if (type !== 'host' && candidate.relatedAddress && candidate.relatedPort) { - sdp.push('raddr'); - sdp.push(candidate.relatedAddress); - sdp.push('rport'); - sdp.push(candidate.relatedPort); - } - if (candidate.tcpType && candidate.protocol.toLowerCase() === 'tcp') { - sdp.push('tcptype'); - sdp.push(candidate.tcpType); - } - if (candidate.usernameFragment || candidate.ufrag) { - sdp.push('ufrag'); - sdp.push(candidate.usernameFragment || candidate.ufrag); - } - return 'candidate:' + sdp.join(' '); -}; -// Parses an ice-options line, returns an array of option tags. -// Sample input: -// a=ice-options:foo bar -SDPUtils.parseIceOptions = function(line) { - return line.substring(14).split(' '); -}; -// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input: -// a=rtpmap:111 opus/48000/2 -SDPUtils.parseRtpMap = function(line) { - let parts = line.substring(9).split(' '); - const parsed = { - payloadType: parseInt(parts.shift(), 10) - }; - parts = parts[0].split('/'); - parsed.name = parts[0]; - parsed.clockRate = parseInt(parts[1], 10); // was: clockrate - parsed.channels = parts.length === 3 ? parseInt(parts[2], 10) : 1; - // legacy alias, got renamed back to channels in ORTC. - parsed.numChannels = parsed.channels; - return parsed; -}; -// Generates a rtpmap line from RTCRtpCodecCapability or -// RTCRtpCodecParameters. -SDPUtils.writeRtpMap = function(codec) { - let pt = codec.payloadType; - if (codec.preferredPayloadType !== undefined) pt = codec.preferredPayloadType; - const channels = codec.channels || codec.numChannels || 1; - return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + (channels !== 1 ? '/' + channels : '') + '\r\n'; -}; -// Parses a extmap line (headerextension from RFC 5285). Sample input: -// a=extmap:2 urn:ietf:params:rtp-hdrext:toffset -// a=extmap:2/sendonly urn:ietf:params:rtp-hdrext:toffset -SDPUtils.parseExtmap = function(line) { - const parts = line.substring(9).split(' '); - return { - id: parseInt(parts[0], 10), - direction: parts[0].indexOf('/') > 0 ? parts[0].split('/')[1] : 'sendrecv', - uri: parts[1], - attributes: parts.slice(2).join(' ') - }; -}; -// Generates an extmap line from RTCRtpHeaderExtensionParameters or -// RTCRtpHeaderExtension. -SDPUtils.writeExtmap = function(headerExtension) { - return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + (headerExtension.direction && headerExtension.direction !== 'sendrecv' ? '/' + headerExtension.direction : '') + ' ' + headerExtension.uri + (headerExtension.attributes ? ' ' + headerExtension.attributes : '') + '\r\n'; -}; -// Parses a fmtp line, returns dictionary. Sample input: -// a=fmtp:96 vbr=on;cng=on -// Also deals with vbr=on; cng=on -SDPUtils.parseFmtp = function(line) { - const parsed = {}; - let kv; - const parts = line.substring(line.indexOf(' ') + 1).split(';'); - for(let j = 0; j < parts.length; j++){ - kv = parts[j].trim().split('='); - parsed[kv[0].trim()] = kv[1]; - } - return parsed; -}; -// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters. -SDPUtils.writeFmtp = function(codec) { - let line = ''; - let pt = codec.payloadType; - if (codec.preferredPayloadType !== undefined) pt = codec.preferredPayloadType; - if (codec.parameters && Object.keys(codec.parameters).length) { - const params = []; - Object.keys(codec.parameters).forEach((param)=>{ - if (codec.parameters[param] !== undefined) params.push(param + '=' + codec.parameters[param]); - else params.push(param); - }); - line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\r\n'; - } - return line; -}; -// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input: -// a=rtcp-fb:98 nack rpsi -SDPUtils.parseRtcpFb = function(line) { - const parts = line.substring(line.indexOf(' ') + 1).split(' '); - return { - type: parts.shift(), - parameter: parts.join(' ') - }; -}; -// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters. -SDPUtils.writeRtcpFb = function(codec) { - let lines = ''; - let pt = codec.payloadType; - if (codec.preferredPayloadType !== undefined) pt = codec.preferredPayloadType; - if (codec.rtcpFeedback && codec.rtcpFeedback.length) // FIXME: special handling for trr-int? - codec.rtcpFeedback.forEach((fb)=>{ - lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + '\r\n'; - }); - return lines; -}; -// Parses a RFC 5576 ssrc media attribute. Sample input: -// a=ssrc:3735928559 cname:something -SDPUtils.parseSsrcMedia = function(line) { - const sp = line.indexOf(' '); - const parts = { - ssrc: parseInt(line.substring(7, sp), 10) - }; - const colon = line.indexOf(':', sp); - if (colon > -1) { - parts.attribute = line.substring(sp + 1, colon); - parts.value = line.substring(colon + 1); - } else parts.attribute = line.substring(sp + 1); - return parts; -}; -// Parse a ssrc-group line (see RFC 5576). Sample input: -// a=ssrc-group:semantics 12 34 -SDPUtils.parseSsrcGroup = function(line) { - const parts = line.substring(13).split(' '); - return { - semantics: parts.shift(), - ssrcs: parts.map((ssrc)=>parseInt(ssrc, 10)) - }; -}; -// Extracts the MID (RFC 5888) from a media section. -// Returns the MID or undefined if no mid line was found. -SDPUtils.getMid = function(mediaSection) { - const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0]; - if (mid) return mid.substring(6); -}; -// Parses a fingerprint line for DTLS-SRTP. -SDPUtils.parseFingerprint = function(line) { - const parts = line.substring(14).split(' '); - return { - algorithm: parts[0].toLowerCase(), - value: parts[1].toUpperCase() - }; -}; -// Extracts DTLS parameters from SDP media section or sessionpart. -// FIXME: for consistency with other functions this should only -// get the fingerprint line as input. See also getIceParameters. -SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) { - const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=fingerprint:'); - // Note: a=setup line is ignored since we use the 'auto' role in Edge. - return { - role: 'auto', - fingerprints: lines.map(SDPUtils.parseFingerprint) - }; -}; -// Serializes DTLS parameters to SDP. -SDPUtils.writeDtlsParameters = function(params, setupType) { - let sdp = 'a=setup:' + setupType + '\r\n'; - params.fingerprints.forEach((fp)=>{ - sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\r\n'; - }); - return sdp; -}; -// Parses a=crypto lines into -// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members -SDPUtils.parseCryptoLine = function(line) { - const parts = line.substring(9).split(' '); - return { - tag: parseInt(parts[0], 10), - cryptoSuite: parts[1], - keyParams: parts[2], - sessionParams: parts.slice(3) - }; -}; -SDPUtils.writeCryptoLine = function(parameters) { - return 'a=crypto:' + parameters.tag + ' ' + parameters.cryptoSuite + ' ' + (typeof parameters.keyParams === 'object' ? SDPUtils.writeCryptoKeyParams(parameters.keyParams) : parameters.keyParams) + (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') + '\r\n'; -}; -// Parses the crypto key parameters into -// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam* -SDPUtils.parseCryptoKeyParams = function(keyParams) { - if (keyParams.indexOf('inline:') !== 0) return null; - const parts = keyParams.substring(7).split('|'); - return { - keyMethod: 'inline', - keySalt: parts[0], - lifeTime: parts[1], - mkiValue: parts[2] ? parts[2].split(':')[0] : undefined, - mkiLength: parts[2] ? parts[2].split(':')[1] : undefined - }; -}; -SDPUtils.writeCryptoKeyParams = function(keyParams) { - return keyParams.keyMethod + ':' + keyParams.keySalt + (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') + (keyParams.mkiValue && keyParams.mkiLength ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength : ''); -}; -// Extracts all SDES parameters. -SDPUtils.getCryptoParameters = function(mediaSection, sessionpart) { - const lines = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=crypto:'); - return lines.map(SDPUtils.parseCryptoLine); -}; -// Parses ICE information from SDP media section or sessionpart. -// FIXME: for consistency with other functions this should only -// get the ice-ufrag and ice-pwd lines as input. -SDPUtils.getIceParameters = function(mediaSection, sessionpart) { - const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-ufrag:')[0]; - const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-pwd:')[0]; - if (!(ufrag && pwd)) return null; - return { - usernameFragment: ufrag.substring(12), - password: pwd.substring(10) - }; -}; -// Serializes ICE parameters to SDP. -SDPUtils.writeIceParameters = function(params) { - let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\r\n' + 'a=ice-pwd:' + params.password + '\r\n'; - if (params.iceLite) sdp += 'a=ice-lite\r\n'; - return sdp; -}; -// Parses the SDP media section and returns RTCRtpParameters. -SDPUtils.parseRtpParameters = function(mediaSection) { - const description = { - codecs: [], - headerExtensions: [], - fecMechanisms: [], - rtcp: [] - }; - const lines = SDPUtils.splitLines(mediaSection); - const mline = lines[0].split(' '); - description.profile = mline[2]; - for(let i = 3; i < mline.length; i++){ - const pt = mline[i]; - const rtpmapline = SDPUtils.matchPrefix(mediaSection, 'a=rtpmap:' + pt + ' ')[0]; - if (rtpmapline) { - const codec = SDPUtils.parseRtpMap(rtpmapline); - const fmtps = SDPUtils.matchPrefix(mediaSection, 'a=fmtp:' + pt + ' '); - // Only the first a=fmtp: is considered. - codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {}; - codec.rtcpFeedback = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:' + pt + ' ').map(SDPUtils.parseRtcpFb); - description.codecs.push(codec); - // parse FEC mechanisms from rtpmap lines. - switch(codec.name.toUpperCase()){ - case 'RED': - case 'ULPFEC': - description.fecMechanisms.push(codec.name.toUpperCase()); - break; - default: - break; - } - } - } - SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach((line)=>{ - description.headerExtensions.push(SDPUtils.parseExtmap(line)); - }); - const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ').map(SDPUtils.parseRtcpFb); - description.codecs.forEach((codec)=>{ - wildcardRtcpFb.forEach((fb)=>{ - const duplicate = codec.rtcpFeedback.find((existingFeedback)=>{ - return existingFeedback.type === fb.type && existingFeedback.parameter === fb.parameter; - }); - if (!duplicate) codec.rtcpFeedback.push(fb); - }); - }); - // FIXME: parse rtcp. - return description; -}; -// Generates parts of the SDP media section describing the capabilities / -// parameters. -SDPUtils.writeRtpDescription = function(kind, caps) { - let sdp = ''; - // Build the mline. - sdp += 'm=' + kind + ' '; - sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs. - sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' '; - sdp += caps.codecs.map((codec)=>{ - if (codec.preferredPayloadType !== undefined) return codec.preferredPayloadType; - return codec.payloadType; - }).join(' ') + '\r\n'; - sdp += 'c=IN IP4 0.0.0.0\r\n'; - sdp += 'a=rtcp:9 IN IP4 0.0.0.0\r\n'; - // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb. - caps.codecs.forEach((codec)=>{ - sdp += SDPUtils.writeRtpMap(codec); - sdp += SDPUtils.writeFmtp(codec); - sdp += SDPUtils.writeRtcpFb(codec); - }); - let maxptime = 0; - caps.codecs.forEach((codec)=>{ - if (codec.maxptime > maxptime) maxptime = codec.maxptime; - }); - if (maxptime > 0) sdp += 'a=maxptime:' + maxptime + '\r\n'; - if (caps.headerExtensions) caps.headerExtensions.forEach((extension)=>{ - sdp += SDPUtils.writeExtmap(extension); - }); - // FIXME: write fecMechanisms. - return sdp; -}; -// Parses the SDP media section and returns an array of -// RTCRtpEncodingParameters. -SDPUtils.parseRtpEncodingParameters = function(mediaSection) { - const encodingParameters = []; - const description = SDPUtils.parseRtpParameters(mediaSection); - const hasRed = description.fecMechanisms.indexOf('RED') !== -1; - const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1; - // filter a=ssrc:... cname:, ignore PlanB-msid - const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map((line)=>SDPUtils.parseSsrcMedia(line)).filter((parts)=>parts.attribute === 'cname'); - const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc; - let secondarySsrc; - const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID').map((line)=>{ - const parts = line.substring(17).split(' '); - return parts.map((part)=>parseInt(part, 10)); - }); - if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) secondarySsrc = flows[0][1]; - description.codecs.forEach((codec)=>{ - if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) { - let encParam = { - ssrc: primarySsrc, - codecPayloadType: parseInt(codec.parameters.apt, 10) - }; - if (primarySsrc && secondarySsrc) encParam.rtx = { - ssrc: secondarySsrc - }; - encodingParameters.push(encParam); - if (hasRed) { - encParam = JSON.parse(JSON.stringify(encParam)); - encParam.fec = { - ssrc: primarySsrc, - mechanism: hasUlpfec ? 'red+ulpfec' : 'red' - }; - encodingParameters.push(encParam); - } - } - }); - if (encodingParameters.length === 0 && primarySsrc) encodingParameters.push({ - ssrc: primarySsrc - }); - // we support both b=AS and b=TIAS but interpret AS as TIAS. - let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b='); - if (bandwidth.length) { - if (bandwidth[0].indexOf('b=TIAS:') === 0) bandwidth = parseInt(bandwidth[0].substring(7), 10); - else if (bandwidth[0].indexOf('b=AS:') === 0) // use formula from JSEP to convert b=AS to TIAS value. - bandwidth = parseInt(bandwidth[0].substring(5), 10) * 950 - 16000; - else bandwidth = undefined; - encodingParameters.forEach((params)=>{ - params.maxBitrate = bandwidth; - }); - } - return encodingParameters; -}; -// parses http://draft.ortc.org/#rtcrtcpparameters* -SDPUtils.parseRtcpParameters = function(mediaSection) { - const rtcpParameters = {}; - // Gets the first SSRC. Note that with RTX there might be multiple - // SSRCs. - const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map((line)=>SDPUtils.parseSsrcMedia(line)).filter((obj)=>obj.attribute === 'cname')[0]; - if (remoteSsrc) { - rtcpParameters.cname = remoteSsrc.value; - rtcpParameters.ssrc = remoteSsrc.ssrc; - } - // Edge uses the compound attribute instead of reducedSize - // compound is !reducedSize - const rsize = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize'); - rtcpParameters.reducedSize = rsize.length > 0; - rtcpParameters.compound = rsize.length === 0; - // parses the rtcp-mux attrіbute. - // Note that Edge does not support unmuxed RTCP. - const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux'); - rtcpParameters.mux = mux.length > 0; - return rtcpParameters; -}; -SDPUtils.writeRtcpParameters = function(rtcpParameters) { - let sdp = ''; - if (rtcpParameters.reducedSize) sdp += 'a=rtcp-rsize\r\n'; - if (rtcpParameters.mux) sdp += 'a=rtcp-mux\r\n'; - if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) sdp += 'a=ssrc:' + rtcpParameters.ssrc + ' cname:' + rtcpParameters.cname + '\r\n'; - return sdp; -}; -// parses either a=msid: or a=ssrc:... msid lines and returns -// the id of the MediaStream and MediaStreamTrack. -SDPUtils.parseMsid = function(mediaSection) { - let parts; - const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:'); - if (spec.length === 1) { - parts = spec[0].substring(7).split(' '); - return { - stream: parts[0], - track: parts[1] - }; - } - const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map((line)=>SDPUtils.parseSsrcMedia(line)).filter((msidParts)=>msidParts.attribute === 'msid'); - if (planB.length > 0) { - parts = planB[0].value.split(' '); - return { - stream: parts[0], - track: parts[1] - }; - } -}; -// SCTP -// parses draft-ietf-mmusic-sctp-sdp-26 first and falls back -// to draft-ietf-mmusic-sctp-sdp-05 -SDPUtils.parseSctpDescription = function(mediaSection) { - const mline = SDPUtils.parseMLine(mediaSection); - const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:'); - let maxMessageSize; - if (maxSizeLine.length > 0) maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10); - if (isNaN(maxMessageSize)) maxMessageSize = 65536; - const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:'); - if (sctpPort.length > 0) return { - port: parseInt(sctpPort[0].substring(12), 10), - protocol: mline.fmt, - maxMessageSize - }; - const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:'); - if (sctpMapLines.length > 0) { - const parts = sctpMapLines[0].substring(10).split(' '); - return { - port: parseInt(parts[0], 10), - protocol: parts[1], - maxMessageSize - }; - } -}; -// SCTP -// outputs the draft-ietf-mmusic-sctp-sdp-26 version that all browsers -// support by now receiving in this format, unless we originally parsed -// as the draft-ietf-mmusic-sctp-sdp-05 format (indicated by the m-line -// protocol of DTLS/SCTP -- without UDP/ or TCP/) -SDPUtils.writeSctpDescription = function(media, sctp) { - let output = []; - if (media.protocol !== 'DTLS/SCTP') output = [ - 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.protocol + '\r\n', - 'c=IN IP4 0.0.0.0\r\n', - 'a=sctp-port:' + sctp.port + '\r\n' - ]; - else output = [ - 'm=' + media.kind + ' 9 ' + media.protocol + ' ' + sctp.port + '\r\n', - 'c=IN IP4 0.0.0.0\r\n', - 'a=sctpmap:' + sctp.port + ' ' + sctp.protocol + ' 65535\r\n' - ]; - if (sctp.maxMessageSize !== undefined) output.push('a=max-message-size:' + sctp.maxMessageSize + '\r\n'); - return output.join(''); -}; -// Generate a session ID for SDP. -// https://tools.ietf.org/html/draft-ietf-rtcweb-jsep-20#section-5.2.1 -// recommends using a cryptographically random +ve 64-bit value -// but right now this should be acceptable and within the right range -SDPUtils.generateSessionId = function() { - return Math.random().toString().substr(2, 22); -}; -// Write boiler plate for start of SDP -// sessId argument is optional - if not supplied it will -// be generated randomly -// sessVersion is optional and defaults to 2 -// sessUser is optional and defaults to 'thisisadapterortc' -SDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) { - let sessionId; - const version = sessVer !== undefined ? sessVer : 2; - if (sessId) sessionId = sessId; - else sessionId = SDPUtils.generateSessionId(); - const user = sessUser || 'thisisadapterortc'; - // FIXME: sess-id should be an NTP timestamp. - return "v=0\r\no=" + user + ' ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\r\n' + 's=-\r\n' + 't=0 0\r\n'; -}; -// Gets the direction from the mediaSection or the sessionpart. -SDPUtils.getDirection = function(mediaSection, sessionpart) { - // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv. - const lines = SDPUtils.splitLines(mediaSection); - for(let i = 0; i < lines.length; i++)switch(lines[i]){ - case 'a=sendrecv': - case 'a=sendonly': - case 'a=recvonly': - case 'a=inactive': - return lines[i].substring(2); - default: - } - if (sessionpart) return SDPUtils.getDirection(sessionpart); - return 'sendrecv'; -}; -SDPUtils.getKind = function(mediaSection) { - const lines = SDPUtils.splitLines(mediaSection); - const mline = lines[0].split(' '); - return mline[0].substring(2); -}; -SDPUtils.isRejected = function(mediaSection) { - return mediaSection.split(' ', 2)[1] === '0'; -}; -SDPUtils.parseMLine = function(mediaSection) { - const lines = SDPUtils.splitLines(mediaSection); - const parts = lines[0].substring(2).split(' '); - return { - kind: parts[0], - port: parseInt(parts[1], 10), - protocol: parts[2], - fmt: parts.slice(3).join(' ') - }; -}; -SDPUtils.parseOLine = function(mediaSection) { - const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0]; - const parts = line.substring(2).split(' '); - return { - username: parts[0], - sessionId: parts[1], - sessionVersion: parseInt(parts[2], 10), - netType: parts[3], - addressType: parts[4], - address: parts[5] - }; -}; -// a very naive interpretation of a valid SDP. -SDPUtils.isValidSDP = function(blob) { - if (typeof blob !== 'string' || blob.length === 0) return false; - const lines = SDPUtils.splitLines(blob); - for(let i = 0; i < lines.length; i++){ - if (lines[i].length < 2 || lines[i].charAt(1) !== '=') return false; - // TODO: check the modifier a bit more. - } - return true; -}; -module.exports = SDPUtils; - -},{}],"7JoU4":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -var _eventTarget = require("./EventTarget"); -var _eventTargetDefault = parcelHelpers.interopDefault(_eventTarget); -var _roomInfo = require("./RoomInfo"); -class Room extends (0, _eventTargetDefault.default) { - constructor(wsts){ - super(), this.peers = new Map(); - this.mwse = wsts; - this.info = new (0, _roomInfo.RoomInfo)(this); - } - setRoomOptions(options) { - if (typeof options == "string") this.roomId = options; - else { - let defaultOptions = { - joinType: "free", - ifexistsJoin: true, - accessType: "private", - notifyActionInvite: true, - notifyActionJoined: true, - notifyActionEjected: true, - autoFetchInfo: true - }; - Object.assign(defaultOptions, options); - this.config = defaultOptions; - } - } - setRoomId(uuid) { - this.roomId = uuid; - } - async createRoom(roomOptions) { - let config = this.config || roomOptions; - let result = await this.mwse.EventPooling.request({ - type: 'create-room', - ...config - }); - if (result.status == 'fail') { - if (result.message == "ALREADY-EXISTS" && this.config.ifexistsJoin) return this.join(); - throw new Error(result.message || result.messages); - } else { - this.options = { - ...this.config, - ...result.room - }; - this.roomId = result.room.id; - this.mwse.rooms.set(this.roomId, this); - } - } - async join() { - let result = await this.mwse.EventPooling.request({ - type: 'joinroom', - name: this.config.name, - credential: this.config.credential, - autoFetchInfo: this.config.autoFetchInfo || false - }); - if (result.status == 'fail') throw new Error(result.message); - else { - this.options = { - ...this.config, - ...result.room - }; - if (result.info) this.info.info = result.info; - this.roomId = result.room.id; - this.mwse.rooms.set(this.roomId, this); - } - } - async eject() { - let { type } = await this.mwse.EventPooling.request({ - type: 'ejectroom', - roomId: this.roomId - }); - this.peers.clear(); - if (type == 'success') this.mwse.rooms.delete(this.roomId); - } - async send(pack, wom = false, handshake = false) { - if (!this.mwse.writable) return console.warn("Socket is not writable"); - if (handshake) { - let { type } = await this.mwse.EventPooling.request({ - type: 'pack/room', - pack, - to: this.roomId, - wom, - handshake - }); - if (type == "fail") throw new Error("Cant send message to room"); - } else await this.mwse.EventPooling.request({ - type: 'pack/room', - pack, - to: this.roomId, - wom, - handshake - }); - } - async fetchPeers(filter, onlyNumber = false) { - if (onlyNumber) { - let { count } = await this.mwse.EventPooling.request({ - type: 'room/peer-count', - roomId: this.roomId, - filter: filter || {} - }); - return count; - } else { - let { status, peers } = await this.mwse.EventPooling.request({ - type: 'room-peers', - roomId: this.roomId, - filter: filter || {} - }); - let cup = []; - if (status == 'fail') throw new Error("Cant using peers on room"); - else if (status == 'success') for (const peerid of peers){ - let peer = this.mwse.peer(peerid, true); - cup.push(peer); - this.peers.set(peerid, peer); - } - return cup; - } - } -} -exports.default = Room; - -},{"./EventTarget":"faGYI","./RoomInfo":"5x1BB","@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"5x1BB":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -parcelHelpers.export(exports, "RoomInfo", ()=>RoomInfo); -class RoomInfo { - constructor(room){ - this.info = {}; - this.room = room; - this.room.on('updateinfo', (name, value)=>{ - this.info[name] = value; - }); - } - async fetch(name) { - if (name) { - let rinfo = await this.room.mwse.EventPooling.request({ - type: "room/getinfo", - roomId: this.room.roomId, - name - }); - if (rinfo.status == "success") this.info = rinfo.value; - else console.warn(rinfo.message); - } else { - let rinfo = await this.room.mwse.EventPooling.request({ - type: "room/info", - roomId: this.room.roomId - }); - if (rinfo.status == "success") this.info = rinfo.value; - else console.warn(rinfo.message); - } - return this.info; - } - set(name, value) { - this.info[name] = value; - this.room.mwse.WSTSProtocol.SendOnly({ - type: "room/setinfo", - roomId: this.room.roomId, - name, - value - }); - } - get(name) { - return name ? this.info[name] : this.info; - } -} - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}],"i9gBw":[function(require,module,exports,__globalThis) { -var parcelHelpers = require("@parcel/transformer-js/src/esmodule-helpers.js"); -parcelHelpers.defineInteropFlag(exports); -class WSTSProtocol { - constructor(wsts){ - this.mwse = wsts; - this.addListener(); - } - addListener() { - this.mwse.server?.onRecaivePack((pack)=>{ - this.PackAnalyze(pack); - }); - } - SendRaw(pack) { - this.mwse.server.tranferToServer(pack); - } - SendOnly(pack) { - this.mwse.server.tranferToServer([ - pack, - 'R' - ]); - } - SendRequest(pack, id) { - this.mwse.server.tranferToServer([ - pack, - id, - 'R' - ]); - } - StartStream(pack, id) { - this.mwse.server.tranferToServer([ - pack, - id, - 'S' - ]); - } - PackAnalyze(data) { - let [payload, id, action] = data; - if (typeof id === 'number') { - let callback = this.mwse.EventPooling.events.get(id); - if (callback) { - callback[0](payload, action); - switch(action){ - case 'E': - this.mwse.EventPooling.events.delete(id); - break; - case 'S': - default: - break; - } - } else console.warn("Missing event sended from server"); - } else { - let signals = this.mwse.EventPooling.signals.get(id); - if (signals) for (const callback of signals)callback(payload); - else console.warn("Missing event sended from server"); - } - } -} -exports.default = WSTSProtocol; - -},{"@parcel/transformer-js/src/esmodule-helpers.js":"4KC4J"}]},["3FuxY"], "3FuxY", "parcelRequiref9d4", {}) - +(()=>{function e(e,t,i,r){Object.defineProperty(e,t,{get:i,set:r,enumerable:!0,configurable:!0})}function t(e){return e&&e.__esModule?e.default:e}class i{constructor(e,t){if(this.autoPair=!1,this.connected=!1,this.autoReconnect=!0,this.autoReconnectTimeout=3e3,this.recaivePackEvent=[],this.activeConnectionEvent=[],this.passiveConnectionEvent=[],"auto"==t.endpoint){let e=new URL(document.currentScript.src),t="https:"==e.protocol,i=new URL(e.pathname.split("/").slice(0,-1).join("/")+"/",e);i.protocol=t?"wss:":"ws:",this.endpoint=new URL(i.href)}else try{this.endpoint=new URL(t.endpoint)}catch{throw Error("endpoint is required")}"boolean"==typeof t.autoReconnect?this.autoReconnect=!0:t.autoReconnect&&(this.autoReconnect=!0,this.autoReconnectTimeout=t.autoReconnect.timeout)}connect(){this.autoReconnectTimer&&clearTimeout(this.autoReconnectTimer),this.ws=new WebSocket(this.endpoint.href),this.addWSEvents()}disconnect(){this.autoReconnect=!1,this.ws.close()}addWSEvents(){this.ws.addEventListener("open",()=>this.eventOpen()),this.ws.addEventListener("close",()=>this.eventClose()),this.ws.addEventListener("error",()=>this.eventError()),this.ws.addEventListener("message",({data:e})=>this.eventMessage(e))}eventOpen(){for(let e of(this.connected=!0,this.activeConnectionEvent))e(void 0)}eventClose(){for(let e of this.passiveConnectionEvent)e(void 0);this.connected=!1,this.autoReconnect&&(this.autoReconnectTimer=setTimeout(()=>this.connect(),this.autoReconnectTimeout))}eventError(){this.connected=!1}onRecaivePack(e){this.recaivePackEvent.push(e)}onActive(e){this.connected?e():this.activeConnectionEvent.push(e)}onPassive(e){this.connected?this.passiveConnectionEvent.push(e):e()}eventMessage(e){if("string"==typeof e){let t=JSON.parse(e);for(let e of this.recaivePackEvent)e(t)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class r{constructor(e){this.events=new Map,this.signals=new Map,this.requests=new Map,this.count=0,this.wsts=e}request(e){return new Promise((t,i)=>{let r=++this.count;this.events.set(r,[e=>{t(e)},e=>{i(e)}]),this.wsts.WSTSProtocol.SendRequest(e,r)})}stream(e,t){let i=++this.count;this.wsts.WSTSProtocol.StartStream(e,i),this.events.set(i,[e=>{t(e)},()=>{}])}signal(e,t){let i=this.signals.get(e);i?i.push(t):this.signals.set(e,[t])}}class n{emit(e,...t){if(this.events[e])for(let i of this.events[e])i(...t)}on(e,t){this.events[e]?this.events[e].push(t):this.events[e]=[t]}scope(e){this.activeScope?e():this.on("scope",e)}constructor(){this.events={},this.activeScope=!1}}class s{constructor(e){this.mwse=e}async allocAPIPAddress(){let{status:e,ip:t}=await this.mwse.EventPooling.request({type:"alloc/APIPAddress"});if("success"==e)return this.APIPAddress=t,t;throw Error("Error Allocated Access Point IP Address")}async allocAPNumber(){let{status:e,number:t}=await this.mwse.EventPooling.request({type:"alloc/APNumber"});if("success"==e)return this.APNumber=t,t;throw Error("Error Allocated Access Point Number")}async allocAPShortCode(){let{status:e,code:t}=await this.mwse.EventPooling.request({type:"alloc/APShortCode"});if("success"==e)return this.APShortCode=t,t;throw Error("Error Allocated Access Point Short Code")}async reallocAPIPAddress(){let{status:e,ip:t}=await this.mwse.EventPooling.request({type:"realloc/APIPAddress"});if("success"==e)return this.APIPAddress=t,t;throw Error("Error Reallocated Access Point IP Address")}async reallocAPNumber(){let{status:e,number:t}=await this.mwse.EventPooling.request({type:"realloc/APNumber"});if("success"==e)return this.APNumber=t,t;throw Error("Error Reallocated Access Point Number")}async reallocAPShortCode(){let{status:e,code:t}=await this.mwse.EventPooling.request({type:"realloc/APShortCode"});if("success"==e)return this.APShortCode=t,t;throw Error("Error Reallocated Access Point Short Code")}async releaseAPIPAddress(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APIPAddress"});if("success"==e)this.APIPAddress=void 0;else throw Error("Error release Access Point IP Address")}async releaseAPNumber(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APNumber"});if("success"==e)this.APNumber=void 0;else throw Error("Error release Access Point Number")}async releaseAPShortCode(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APShortCode"});if("success"==e)this.APShortCode=void 0;else throw Error("Error release Access Point Short Code")}async queryAPIPAddress(e){let{status:t,socket:i}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==t?i:null}async queryAPNumber(e){let{status:t,socket:i}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==t?i:null}async queryAPShortCode(e){let{status:t,socket:i}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==t?i:null}}class o{constructor(e){this.info={},this.peer=e}async fetch(e){if(e){let t=await this.peer.mwse.EventPooling.request({type:"peer/info",peer:this.peer.socketId,name:e});"success"==t.status?this.info=t.info:console.warn(t.message)}else{let e=await this.peer.mwse.EventPooling.request({type:"peer/info",peer:this.peer.socketId});"success"==e.status?this.info=e.info:console.warn(e.message)}return this.info}set(e,t){this.info[e]=t,this.peer.mwse.WSTSProtocol.SendOnly({type:"auth/info",name:e,value:t})}get(e){return e?this.info[e]:this.info}}"use strict";let a=!0,c=!0;function d(e,t,i){let r=e.match(t);return r&&r.length>=i&&parseInt(r[i],10)}function p(e,t,i){if(!e.RTCPeerConnection)return;let r=e.RTCPeerConnection.prototype,n=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return n.apply(this,arguments);let s=e=>{let t=i(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,s),n.apply(this,[e,s])};let s=r.removeEventListener;r.removeEventListener=function(e,i){if(e!==t||!this._eventMap||!this._eventMap[t]||!this._eventMap[t].has(i))return s.apply(this,arguments);let r=this._eventMap[t].get(i);return this._eventMap[t].delete(i),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,s.apply(this,[e,r])},Object.defineProperty(r,"on"+t,{get(){return this["_on"+t]},set(e){this["_on"+t]&&(this.removeEventListener(t,this["_on"+t]),delete this["_on"+t]),e&&this.addEventListener(t,this["_on"+t]=e)},enumerable:!0,configurable:!0})}function h(e){return"boolean"!=typeof e?Error("Argument type: "+typeof e+". Please use a boolean."):(a=e,e?"adapter.js logging disabled":"adapter.js logging enabled")}function l(e){return"boolean"!=typeof e?Error("Argument type: "+typeof e+". Please use a boolean."):(c=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function m(){"object"==typeof window&&(a||"undefined"!=typeof console&&"function"==typeof console.log&&console.log.apply(console,arguments))}function u(e,t){c&&console.warn(e+" is deprecated, please use "+t+" instead.")}function f(e){return"[object Object]"===Object.prototype.toString.call(e)}function g(e,t,i){let r=i?"outbound-rtp":"inbound-rtp",n=new Map;if(null===t)return n;let s=[];return e.forEach(e=>{"track"===e.type&&e.trackIdentifier===t.id&&s.push(e)}),s.forEach(t=>{e.forEach(i=>{i.type===r&&i.trackId===t.id&&function e(t,i,r){!i||r.has(i.id)||(r.set(i.id,i),Object.keys(i).forEach(n=>{n.endsWith("Id")?e(t,t.get(i[n]),r):n.endsWith("Ids")&&i[n].forEach(i=>{e(t,t.get(i),r)})}))}(e,i,n)})}),n}"use strict";var y={};function v(e,t){let i=e&&e.navigator;if(!i.mediaDevices)return;let r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;let t={};return Object.keys(e).forEach(i=>{if("require"===i||"advanced"===i||"mediaSource"===i)return;let r="object"==typeof e[i]?e[i]:{ideal:e[i]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);let n=function(e,t){return e?e+t.charAt(0).toUpperCase()+t.slice(1):"deviceId"===t?"sourceId":t};if(void 0!==r.ideal){t.optional=t.optional||[];let e={};"number"==typeof r.ideal?(e[n("min",i)]=r.ideal,t.optional.push(e),(e={})[n("max",i)]=r.ideal):e[n("",i)]=r.ideal,t.optional.push(e)}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[n("",i)]=r.exact):["min","max"].forEach(e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[n(e,i)]=r[e])})}),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},n=function(e,n){if(t.version>=61)return n(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){let t=function(e,t,i){t in e&&!(i in e)&&(e[i]=e[t],delete e[t])};t((e=JSON.parse(JSON.stringify(e))).audio,"autoGainControl","googAutoGainControl"),t(e.audio,"noiseSuppression","googNoiseSuppression"),e.audio=r(e.audio)}if(e&&"object"==typeof e.video){let s=e.video.facingMode;s=s&&("object"==typeof s?s:{ideal:s});let o=t.version<66;if(s&&("user"===s.exact||"environment"===s.exact||"user"===s.ideal||"environment"===s.ideal)&&!(i.mediaDevices.getSupportedConstraints&&i.mediaDevices.getSupportedConstraints().facingMode&&!o)){let t;if(delete e.video.facingMode,"environment"===s.exact||"environment"===s.ideal?t=["back","rear"]:("user"===s.exact||"user"===s.ideal)&&(t=["front"]),t)return i.mediaDevices.enumerateDevices().then(i=>{let o=(i=i.filter(e=>"videoinput"===e.kind)).find(e=>t.some(t=>e.label.toLowerCase().includes(t)));return!o&&i.length&&t.includes("back")&&(o=i[i.length-1]),o&&(e.video.deviceId=s.exact?{exact:o.deviceId}:{ideal:o.deviceId}),e.video=r(e.video),m("chrome: "+JSON.stringify(e)),n(e)})}e.video=r(e.video)}return m("chrome: "+JSON.stringify(e)),n(e)},s=function(e){return t.version>=64?e:{name:({PermissionDeniedError:"NotAllowedError",PermissionDismissedError:"NotAllowedError",InvalidStateError:"NotAllowedError",DevicesNotFoundError:"NotFoundError",ConstraintNotSatisfiedError:"OverconstrainedError",TrackStartError:"NotReadableError",MediaDeviceFailedDueToShutdown:"NotAllowedError",MediaDeviceKillSwitchOn:"NotAllowedError",TabCaptureError:"AbortError",ScreenCaptureError:"AbortError",DeviceCaptureError:"AbortError"})[e.name]||e.name,message:e.message,constraint:e.constraint||e.constraintName,toString(){return this.name+(this.message&&": ")+this.message}}};if(i.getUserMedia=(function(e,t,r){n(e,e=>{i.webkitGetUserMedia(e,t,e=>{r&&r(s(e))})})}).bind(i),i.mediaDevices.getUserMedia){let e=i.mediaDevices.getUserMedia.bind(i.mediaDevices);i.mediaDevices.getUserMedia=function(t){return n(t,t=>e(t).then(e=>{if(t.audio&&!e.getAudioTracks().length||t.video&&!e.getVideoTracks().length)throw e.getTracks().forEach(e=>{e.stop()}),new DOMException("","NotFoundError");return e},e=>Promise.reject(s(e))))}}}"use strict";function C(e,t){if((!e.navigator.mediaDevices||!("getDisplayMedia"in e.navigator.mediaDevices))&&e.navigator.mediaDevices){if("function"!=typeof t)return void console.error("shimGetDisplayMedia: getSourceId argument is not a function");e.navigator.mediaDevices.getDisplayMedia=function(i){return t(i).then(t=>{let r=i.video&&i.video.width,n=i.video&&i.video.height,s=i.video&&i.video.frameRate;return i.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:s||3}},r&&(i.video.mandatory.maxWidth=r),n&&(i.video.mandatory.maxHeight=n),e.navigator.mediaDevices.getUserMedia(i)})}}}"use strict";function P(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function S(e){if("object"!=typeof e||!e.RTCPeerConnection||"ontrack"in e.RTCPeerConnection.prototype)p(e,"track",e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e));else{Object.defineProperty(e.RTCPeerConnection.prototype,"ontrack",{get(){return this._ontrack},set(e){this._ontrack&&this.removeEventListener("track",this._ontrack),this.addEventListener("track",this._ontrack=e)},enumerable:!0,configurable:!0});let t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",i=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(e=>e.track&&e.track.id===i.track.id):{track:i.track};let n=new Event("track");n.track=i.track,n.receiver=r,n.transceiver={receiver:r},n.streams=[t.stream],this.dispatchEvent(n)}),t.stream.getTracks().forEach(i=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find(e=>e.track&&e.track.id===i.id):{track:i};let n=new Event("track");n.track=i,n.receiver=r,n.transceiver={receiver:r},n.streams=[t.stream],this.dispatchEvent(n)})},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}}function T(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){let t=function(e,t){return{track:t,get dtmf(){return void 0===this._dtmf&&("audio"===t.kind?this._dtmf=e.createDTMFSender(t):this._dtmf=null),this._dtmf},_pc:e}};if(!e.RTCPeerConnection.prototype.getSenders){e.RTCPeerConnection.prototype.getSenders=function(){return this._senders=this._senders||[],this._senders.slice()};let i=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let n=i.apply(this,arguments);return n||(n=t(this,e),this._senders.push(n)),n};let r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);let t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}let i=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],i.apply(this,[e]),e.getTracks().forEach(e=>{this._senders.push(t(this,e))})};let r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach(e=>{let t=this._senders.find(t=>t.track===e);t&&this._senders.splice(this._senders.indexOf(t),1)})}}else if("object"==typeof e&&e.RTCPeerConnection&&"getSenders"in e.RTCPeerConnection.prototype&&"createDTMFSender"in e.RTCPeerConnection.prototype&&e.RTCRtpSender&&!("dtmf"in e.RTCRtpSender.prototype)){let t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){let e=t.apply(this,[]);return e.forEach(e=>e._pc=this),e},Object.defineProperty(e.RTCRtpSender.prototype,"dtmf",{get(){return void 0===this._dtmf&&("audio"===this.track.kind?this._dtmf=this._pc.createDTMFSender(this.track):this._dtmf=null),this._dtmf}})}}function R(e){if(!e.RTCPeerConnection)return;let t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){let[e,i,r]=arguments;if(arguments.length>0&&"function"==typeof e)return t.apply(this,arguments);if(0===t.length&&(0==arguments.length||"function"!=typeof e))return t.apply(this,[]);let n=function(e){let t={};return e.result().forEach(e=>{let i={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach(t=>{i[t]=e.stat(t)}),t[i.id]=i}),t},s=function(e){return new Map(Object.keys(e).map(t=>[t,e[t]]))};return arguments.length>=2?t.apply(this,[function(e){i(s(n(e)))},e]):new Promise((e,i)=>{t.apply(this,[function(t){e(s(n(t)))},i])}).then(i,r)}}function w(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){let t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){let e=t.apply(this,[]);return e.forEach(e=>e._pc=this),e});let i=e.RTCPeerConnection.prototype.addTrack;i&&(e.RTCPeerConnection.prototype.addTrack=function(){let e=i.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){let e=this;return this._pc.getStats().then(t=>g(t,e.track,!0))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){let t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){let e=t.apply(this,[]);return e.forEach(e=>e._pc=this),e}),p(e,"track",e=>(e.receiver._pc=e.srcElement,e)),e.RTCRtpReceiver.prototype.getStats=function(){let e=this;return this._pc.getStats().then(t=>g(t,e.track,!1))}}if(!("getStats"in e.RTCRtpSender.prototype&&"getStats"in e.RTCRtpReceiver.prototype))return;let t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){let e,t,i,r=arguments[0];return(this.getSenders().forEach(t=>{t.track===r&&(e?i=!0:e=t)}),this.getReceivers().forEach(e=>(e.track===r&&(t?i=!0:t=e),e.track===r)),i||e&&t)?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):e?e.getStats():t?t.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function E(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map(e=>this._shimmedLocalStreams[e][0])};let t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,i){if(!i)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};let r=t.apply(this,arguments);return this._shimmedLocalStreams[i.id]?-1===this._shimmedLocalStreams[i.id].indexOf(r)&&this._shimmedLocalStreams[i.id].push(r):this._shimmedLocalStreams[i.id]=[i,r],r};let i=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._shimmedLocalStreams=this._shimmedLocalStreams||{},e.getTracks().forEach(e=>{if(this.getSenders().find(t=>t.track===e))throw new DOMException("Track already exists.","InvalidAccessError")});let t=this.getSenders();i.apply(this,arguments);let r=this.getSenders().filter(e=>-1===t.indexOf(e));this._shimmedLocalStreams[e.id]=[e].concat(r)};let r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},delete this._shimmedLocalStreams[e.id],r.apply(this,arguments)};let n=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach(t=>{let i=this._shimmedLocalStreams[t].indexOf(e);-1!==i&&this._shimmedLocalStreams[t].splice(i,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]}),n.apply(this,arguments)}}function b(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return E(e);let i=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){let e=i.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map(e=>this._reverseStreams[e.id])};let r=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(t){if(this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},t.getTracks().forEach(e=>{if(this.getSenders().find(t=>t.track===e))throw new DOMException("Track already exists.","InvalidAccessError")}),!this._reverseStreams[t.id]){let i=new e.MediaStream(t.getTracks());this._streams[t.id]=i,this._reverseStreams[i.id]=t,t=i}r.apply(this,[t])};let n=e.RTCPeerConnection.prototype.removeStream;function s(e,t){let i=t.sdp;return Object.keys(e._reverseStreams||[]).forEach(t=>{let r=e._reverseStreams[t],n=e._streams[r.id];i=i.replace(RegExp(n.id,"g"),r.id)}),new RTCSessionDescription({type:t.type,sdp:i})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},n.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,i){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");let r=[].slice.call(arguments,1);if(1!==r.length||!r[0].getTracks().find(e=>e===t))throw new DOMException("The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.","NotSupportedError");if(this.getSenders().find(e=>e.track===t))throw new DOMException("Track already exists.","InvalidAccessError");this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{};let n=this._streams[i.id];if(n)n.addTrack(t),Promise.resolve().then(()=>{this.dispatchEvent(new Event("negotiationneeded"))});else{let r=new e.MediaStream([t]);this._streams[i.id]=r,this._reverseStreams[r.id]=i,this.addStream(r)}return this.getSenders().find(e=>e.track===t)},["createOffer","createAnswer"].forEach(function(t){let i=e.RTCPeerConnection.prototype[t];e.RTCPeerConnection.prototype[t]=({[t](){let e=arguments,t=arguments.length&&"function"==typeof arguments[0];return t?i.apply(this,[t=>{let i=s(this,t);e[0].apply(null,[i])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):i.apply(this,arguments).then(e=>s(this,e))}})[t]});let o=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){var e,t;let i;return arguments.length&&arguments[0].type?(arguments[0]=(e=this,t=arguments[0],i=t.sdp,Object.keys(e._reverseStreams||[]).forEach(t=>{let r=e._reverseStreams[t],n=e._streams[r.id];i=i.replace(RegExp(r.id,"g"),n.id)}),new RTCSessionDescription({type:t.type,sdp:i})),o.apply(this,arguments)):o.apply(this,arguments)};let a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){let e=a.get.apply(this);return""===e.type?e:s(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){let t;if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");if(!e._pc)throw new DOMException("Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.","TypeError");if(e._pc!==this)throw new DOMException("Sender was not created by this connection.","InvalidAccessError");this._streams=this._streams||{},Object.keys(this._streams).forEach(i=>{this._streams[i].getTracks().find(t=>e.track===t)&&(t=this._streams[i])}),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function k(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){let i=e.RTCPeerConnection.prototype[t];e.RTCPeerConnection.prototype[t]=({[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}})[t]})}function I(e,t){p(e,"negotiationneeded",e=>{let i=e.target;if(!(t.version<72)&&(!i.getConfiguration||"plan-b"!==i.getConfiguration().sdpSemantics)||"stable"===i.signalingState)return e})}"use strict";e(y,"shimMediaStream",()=>P),e(y,"shimOnTrack",()=>S),e(y,"shimGetSendersWithDtmf",()=>T),e(y,"shimGetStats",()=>R),e(y,"shimSenderReceiverGetStats",()=>w),e(y,"shimAddTrackRemoveTrackWithNative",()=>E),e(y,"shimAddTrackRemoveTrack",()=>b),e(y,"shimPeerConnection",()=>k),e(y,"fixNegotiationNeeded",()=>I),e(y,"shimGetUserMedia",()=>v),e(y,"shimGetDisplayMedia",()=>C);var _={};function A(e,t){let i=e&&e.navigator,r=e&&e.MediaStreamTrack;if(i.getUserMedia=function(e,t,r){u("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),i.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in i.mediaDevices.getSupportedConstraints())){let e=function(e,t,i){t in e&&!(i in e)&&(e[i]=e[t],delete e[t])},t=i.mediaDevices.getUserMedia.bind(i.mediaDevices);if(i.mediaDevices.getUserMedia=function(i){return"object"==typeof i&&"object"==typeof i.audio&&(e((i=JSON.parse(JSON.stringify(i))).audio,"autoGainControl","mozAutoGainControl"),e(i.audio,"noiseSuppression","mozNoiseSuppression")),t(i)},r&&r.prototype.getSettings){let t=r.prototype.getSettings;r.prototype.getSettings=function(){let i=t.apply(this,arguments);return e(i,"mozAutoGainControl","autoGainControl"),e(i,"mozNoiseSuppression","noiseSuppression"),i}}if(r&&r.prototype.applyConstraints){let t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(i){return"audio"===this.kind&&"object"==typeof i&&(e(i=JSON.parse(JSON.stringify(i)),"autoGainControl","mozAutoGainControl"),e(i,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[i])}}}}"use strict";function D(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(i){if(!(i&&i.video)){let e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===i.video?i.video={mediaSource:t}:i.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(i)})}"use strict";function x(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function M(e,t){if("object"!=typeof e||!(e.RTCPeerConnection||e.mozRTCPeerConnection))return;!e.RTCPeerConnection&&e.mozRTCPeerConnection&&(e.RTCPeerConnection=e.mozRTCPeerConnection),t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach(function(t){let i=e.RTCPeerConnection.prototype[t];e.RTCPeerConnection.prototype[t]=({[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),i.apply(this,arguments)}})[t]});let i={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){let[e,n,s]=arguments;return r.apply(this,[e||null]).then(e=>{if(t.version<53&&!n)try{e.forEach(e=>{e.type=i[e.type]||e.type})}catch(t){if("TypeError"!==t.name)throw t;e.forEach((t,r)=>{e.set(r,Object.assign({},t,{type:i[t.type]||t.type}))})}return e}).then(n,s)}}function O(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender)||e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;let t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){let e=t.apply(this,[]);return e.forEach(e=>e._pc=this),e});let i=e.RTCPeerConnection.prototype.addTrack;i&&(e.RTCPeerConnection.prototype.addTrack=function(){let e=i.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function L(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender)||e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;let t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){let e=t.apply(this,[]);return e.forEach(e=>e._pc=this),e}),p(e,"track",e=>(e.receiver._pc=e.srcElement,e)),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function j(e){!e.RTCPeerConnection||"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){u("removeStream","removeTrack"),this.getSenders().forEach(t=>{t.track&&e.getTracks().includes(t.track)&&this.removeTrack(t)})})}function N(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function q(e){if(!("object"==typeof e&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]);let i=(e=[...e]).length>0;i&&e.forEach(e=>{if("rid"in e&&!/^[a-z0-9]{0,16}$/i.test(e.rid))throw TypeError("Invalid RID value provided.");if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw RangeError("max_framerate must be >= 0.0")});let r=t.apply(this,arguments);if(i){let{sender:t}=r,i=t.getParameters();"encodings"in i&&(1!==i.encodings.length||0!==Object.keys(i.encodings[0]).length)||(i.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(i).then(()=>{delete t.sendEncodings}).catch(()=>{delete t.sendEncodings})))}return r})}function F(e){if(!("object"==typeof e&&e.RTCRtpSender))return;let t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){let e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function U(e){if(!("object"==typeof e&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>t.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):t.apply(this,arguments)}}function z(e){if(!("object"==typeof e&&e.RTCPeerConnection))return;let t=e.RTCPeerConnection.prototype.createAnswer;e.RTCPeerConnection.prototype.createAnswer=function(){return this.setParametersPromises&&this.setParametersPromises.length?Promise.all(this.setParametersPromises).then(()=>t.apply(this,arguments)).finally(()=>{this.setParametersPromises=[]}):t.apply(this,arguments)}}"use strict";e(_,"shimOnTrack",()=>x),e(_,"shimPeerConnection",()=>M),e(_,"shimSenderGetStats",()=>O),e(_,"shimReceiverGetStats",()=>L),e(_,"shimRemoveStream",()=>j),e(_,"shimRTCDataChannel",()=>N),e(_,"shimAddTransceiver",()=>q),e(_,"shimGetParameters",()=>F),e(_,"shimCreateOffer",()=>U),e(_,"shimCreateAnswer",()=>z),e(_,"shimGetUserMedia",()=>A),e(_,"shimGetDisplayMedia",()=>D);var G={};function J(e){if("object"==typeof e&&e.RTCPeerConnection){if("getLocalStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._localStreams||(this._localStreams=[]),this._localStreams}),!("addStream"in e.RTCPeerConnection.prototype)){let t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addStream=function(e){this._localStreams||(this._localStreams=[]),this._localStreams.includes(e)||this._localStreams.push(e),e.getAudioTracks().forEach(i=>t.call(this,i,e)),e.getVideoTracks().forEach(i=>t.call(this,i,e))},e.RTCPeerConnection.prototype.addTrack=function(e,...i){return i&&i.forEach(e=>{this._localStreams?this._localStreams.includes(e)||this._localStreams.push(e):this._localStreams=[e]}),t.apply(this,arguments)}}"removeStream"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.removeStream=function(e){this._localStreams||(this._localStreams=[]);let t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);let i=e.getTracks();this.getSenders().forEach(e=>{i.includes(e.track)&&this.removeTrack(e)})})}}function W(e){if("object"==typeof e&&e.RTCPeerConnection&&("getRemoteStreams"in e.RTCPeerConnection.prototype||(e.RTCPeerConnection.prototype.getRemoteStreams=function(){return this._remoteStreams?this._remoteStreams:[]}),!("onaddstream"in e.RTCPeerConnection.prototype))){Object.defineProperty(e.RTCPeerConnection.prototype,"onaddstream",{get(){return this._onaddstream},set(e){this._onaddstream&&(this.removeEventListener("addstream",this._onaddstream),this.removeEventListener("track",this._onaddstreampoly)),this.addEventListener("addstream",this._onaddstream=e),this.addEventListener("track",this._onaddstreampoly=e=>{e.streams.forEach(e=>{if(this._remoteStreams||(this._remoteStreams=[]),this._remoteStreams.includes(e))return;this._remoteStreams.push(e);let t=new Event("addstream");t.stream=e,this.dispatchEvent(t)})})}});let t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){let e=this;return this._onaddstreampoly||this.addEventListener("track",this._onaddstreampoly=function(t){t.streams.forEach(t=>{if(e._remoteStreams||(e._remoteStreams=[]),e._remoteStreams.indexOf(t)>=0)return;e._remoteStreams.push(t);let i=new Event("addstream");i.stream=t,e.dispatchEvent(i)})}),t.apply(e,arguments)}}}function V(e){if("object"!=typeof e||!e.RTCPeerConnection)return;let t=e.RTCPeerConnection.prototype,i=t.createOffer,r=t.createAnswer,n=t.setLocalDescription,s=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){let r=arguments.length>=2?arguments[2]:arguments[0],n=i.apply(this,[r]);return t?(n.then(e,t),Promise.resolve()):n},t.createAnswer=function(e,t){let i=arguments.length>=2?arguments[2]:arguments[0],n=r.apply(this,[i]);return t?(n.then(e,t),Promise.resolve()):n};let a=function(e,t,i){let r=n.apply(this,[e]);return i?(r.then(t,i),Promise.resolve()):r};t.setLocalDescription=a,t.setRemoteDescription=a=function(e,t,i){let r=s.apply(this,[e]);return i?(r.then(t,i),Promise.resolve()):r},t.addIceCandidate=function(e,t,i){let r=o.apply(this,[e]);return i?(r.then(t,i),Promise.resolve()):r}}function B(e){let t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){let e=t.mediaDevices,i=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>i(K(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=(function(e,i,r){t.mediaDevices.getUserMedia(e).then(i,r)}).bind(t))}function K(e){return e&&void 0!==e.video?Object.assign({},e,{video:function e(t){return f(t)?Object.keys(t).reduce(function(i,r){let n=f(t[r]),s=n?e(t[r]):t[r],o=n&&!Object.keys(s).length;return void 0===s||o?i:Object.assign(i,{[r]:s})},{}):t}(e.video)}):e}function Y(e){if(!e.RTCPeerConnection)return;let t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,i){if(e&&e.iceServers){let t=[];for(let i=0;it.generateCertificate})}function H(e){"object"==typeof e&&e.RTCTrackEvent&&"receiver"in e.RTCTrackEvent.prototype&&!("transceiver"in e.RTCTrackEvent.prototype)&&Object.defineProperty(e.RTCTrackEvent.prototype,"transceiver",{get(){return{receiver:this.receiver}}})}function X(e){let t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);let t=this.getTransceivers().find(e=>"audio"===e.receiver.track.kind);!1===e.offerToReceiveAudio&&t?"sendrecv"===t.direction?t.setDirection?t.setDirection("sendonly"):t.direction="sendonly":"recvonly"===t.direction&&(t.setDirection?t.setDirection("inactive"):t.direction="inactive"):!0!==e.offerToReceiveAudio||t||this.addTransceiver("audio",{direction:"recvonly"}),void 0!==e.offerToReceiveVideo&&(e.offerToReceiveVideo=!!e.offerToReceiveVideo);let i=this.getTransceivers().find(e=>"video"===e.receiver.track.kind);!1===e.offerToReceiveVideo&&i?"sendrecv"===i.direction?i.setDirection?i.setDirection("sendonly"):i.direction="sendonly":"recvonly"===i.direction&&(i.setDirection?i.setDirection("inactive"):i.direction="inactive"):!0!==e.offerToReceiveVideo||i||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function Q(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}e(G,"shimLocalStreamsAPI",()=>J),e(G,"shimRemoteStreamsAPI",()=>W),e(G,"shimCallbacksAPI",()=>V),e(G,"shimGetUserMedia",()=>B),e(G,"shimConstraints",()=>K),e(G,"shimRTCIceServerUrls",()=>Y),e(G,"shimTrackEventTransceiver",()=>H),e(G,"shimCreateOfferLegacy",()=>X),e(G,"shimAudioContext",()=>Q);var $={};"use strict";e($,"shimRTCIceCandidate",()=>et),e($,"shimRTCIceCandidateRelayProtocol",()=>ei),e($,"shimMaxMessageSize",()=>er),e($,"shimSendThrowTypeError",()=>en),e($,"shimConnectionState",()=>es),e($,"removeExtmapAllowMixed",()=>eo),e($,"shimAddIceCandidateNullOrEmpty",()=>ea),e($,"shimParameterlessSetLocalDescription",()=>ec);var Z={};"use strict";let ee={};function et(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;let i=e.RTCIceCandidate;e.RTCIceCandidate=function(e){if("object"==typeof e&&e.candidate&&0===e.candidate.indexOf("a=")&&((e=JSON.parse(JSON.stringify(e))).candidate=e.candidate.substring(2)),e.candidate&&e.candidate.length){let r=new i(e),n=t(Z).parseCandidate(e.candidate);for(let e in n)e in r||Object.defineProperty(r,e,{value:n[e]});return r.toJSON=function(){return{candidate:r.candidate,sdpMid:r.sdpMid,sdpMLineIndex:r.sdpMLineIndex,usernameFragment:r.usernameFragment}},r}return new i(e)},e.RTCIceCandidate.prototype=i.prototype,p(e,"icecandidate",t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t))}function ei(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||p(e,"icecandidate",e=>{if(e.candidate){let i=t(Z).parseCandidate(e.candidate.candidate);"relay"===i.type&&(e.candidate.relayProtocol=({0:"tls",1:"tcp",2:"udp"})[i.priority>>24])}return e})}function er(e,i){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});let r=function(e){if(!e||!e.sdp)return!1;let i=t(Z).splitSections(e.sdp);return i.shift(),i.some(e=>{let i=t(Z).parseMLine(e);return i&&"application"===i.kind&&-1!==i.protocol.indexOf("SCTP")})},n=function(e){let t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return -1;let i=parseInt(t[1],10);return i!=i?-1:i},s=function(e){let t=65536;return"firefox"===i.browser&&(t=i.version<57?-1===e?16384:0x7ffffff5:i.version<60?57===i.version?65535:65536:0x7ffffff5),t},o=function(e,r){let n=65536;"firefox"===i.browser&&57===i.version&&(n=65535);let s=t(Z).matchPrefix(e.sdp,"a=max-message-size:");return s.length>0?n=parseInt(s[0].substring(19),10):"firefox"===i.browser&&-1!==r&&(n=0x7ffffff5),n},a=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===i.browser&&i.version>=76){let{sdpSemantics:e}=this.getConfiguration();"plan-b"===e&&Object.defineProperty(this,"sctp",{get(){return void 0===this._sctp?null:this._sctp},enumerable:!0,configurable:!0})}if(r(arguments[0])){let e,t=n(arguments[0]),i=s(t),r=o(arguments[0],t);e=0===i&&0===r?Number.POSITIVE_INFINITY:0===i||0===r?Math.max(i,r):Math.min(i,r);let a={};Object.defineProperty(a,"maxMessageSize",{get:()=>e}),this._sctp=a}return a.apply(this,arguments)}}function en(e){if(!(e.RTCPeerConnection&&"createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){let i=e.send;e.send=function(){let r=arguments[0],n=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&n>t.sctp.maxMessageSize)throw TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return i.apply(e,arguments)}}let i=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){let e=i.apply(this,arguments);return t(e,this),e},p(e,"datachannel",e=>(t(e.channel,e.target),e))}function es(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;let t=e.RTCPeerConnection.prototype;Object.defineProperty(t,"connectionState",{get(){return({completed:"connected",checking:"connecting"})[this.iceConnectionState]||this.iceConnectionState},enumerable:!0,configurable:!0}),Object.defineProperty(t,"onconnectionstatechange",{get(){return this._onconnectionstatechange||null},set(e){this._onconnectionstatechange&&(this.removeEventListener("connectionstatechange",this._onconnectionstatechange),delete this._onconnectionstatechange),e&&this.addEventListener("connectionstatechange",this._onconnectionstatechange=e)},enumerable:!0,configurable:!0}),["setLocalDescription","setRemoteDescription"].forEach(e=>{let i=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{let t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;let i=new Event("connectionstatechange",e);t.dispatchEvent(i)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),i.apply(this,arguments)}})}function eo(e,t){if(!e.RTCPeerConnection||"chrome"===t.browser&&t.version>=71||"safari"===t.browser&&t.version>=605)return;let i=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){let i=t.sdp.split("\n").filter(e=>"a=extmap-allow-mixed"!==e.trim()).join("\n");e.RTCSessionDescription&&t instanceof e.RTCSessionDescription?arguments[0]=new e.RTCSessionDescription({type:t.type,sdp:i}):t.sdp=i}return i.apply(this,arguments)}}function ea(e,t){if(!(e.RTCPeerConnection&&e.RTCPeerConnection.prototype))return;let i=e.RTCPeerConnection.prototype.addIceCandidate;i&&0!==i.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():i.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function ec(e,t){if(!(e.RTCPeerConnection&&e.RTCPeerConnection.prototype))return;let i=e.RTCPeerConnection.prototype.setLocalDescription;i&&0!==i.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return i.apply(this,arguments);if(!(e={type:e.type,sdp:e.sdp}).type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}return e.sdp||"offer"!==e.type&&"answer"!==e.type?i.apply(this,[e]):("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then(e=>i.apply(this,[e]))})}"use strict";ee.generateIdentifier=function(){return Math.random().toString(36).substring(2,12)},ee.localCName=ee.generateIdentifier(),ee.splitLines=function(e){return e.trim().split("\n").map(e=>e.trim())},ee.splitSections=function(e){return e.split("\nm=").map((e,t)=>(t>0?"m="+e:e).trim()+"\r\n")},ee.getDescription=function(e){let t=ee.splitSections(e);return t&&t[0]},ee.getMediaSections=function(e){let t=ee.splitSections(e);return t.shift(),t},ee.matchPrefix=function(e,t){return ee.splitLines(e).filter(e=>0===e.indexOf(t))},ee.parseCandidate=function(e){let t,i={foundation:(t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" "))[0],component:{1:"rtp",2:"rtcp"}[t[1]]||t[1],protocol:t[2].toLowerCase(),priority:parseInt(t[3],10),ip:t[4],address:t[4],port:parseInt(t[5],10),type:t[7]};for(let e=8;e0?t[0].split("/")[1]:"sendrecv",uri:t[1],attributes:t.slice(2).join(" ")}},ee.writeExtmap=function(e){return"a=extmap:"+(e.id||e.preferredId)+(e.direction&&"sendrecv"!==e.direction?"/"+e.direction:"")+" "+e.uri+(e.attributes?" "+e.attributes:"")+"\r\n"},ee.parseFmtp=function(e){let t,i={},r=e.substring(e.indexOf(" ")+1).split(";");for(let e=0;e{void 0!==e.parameters[t]?r.push(t+"="+e.parameters[t]):r.push(t)}),t+="a=fmtp:"+i+" "+r.join(";")+"\r\n"}return t},ee.parseRtcpFb=function(e){let t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},ee.writeRtcpFb=function(e){let t="",i=e.payloadType;return void 0!==e.preferredPayloadType&&(i=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach(e=>{t+="a=rtcp-fb:"+i+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"}),t},ee.parseSsrcMedia=function(e){let t=e.indexOf(" "),i={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(i.attribute=e.substring(t+1,r),i.value=e.substring(r+1)):i.attribute=e.substring(t+1),i},ee.parseSsrcGroup=function(e){let t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map(e=>parseInt(e,10))}},ee.getMid=function(e){let t=ee.matchPrefix(e,"a=mid:")[0];if(t)return t.substring(6)},ee.parseFingerprint=function(e){let t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},ee.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:ee.matchPrefix(e+t,"a=fingerprint:").map(ee.parseFingerprint)}},ee.writeDtlsParameters=function(e,t){let i="a=setup:"+t+"\r\n";return e.fingerprints.forEach(e=>{i+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"}),i},ee.parseCryptoLine=function(e){let t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},ee.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?ee.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},ee.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;let t=e.substring(7).split("|");return{keyMethod:"inline",keySalt:t[0],lifeTime:t[1],mkiValue:t[2]?t[2].split(":")[0]:void 0,mkiLength:t[2]?t[2].split(":")[1]:void 0}},ee.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},ee.getCryptoParameters=function(e,t){return ee.matchPrefix(e+t,"a=crypto:").map(ee.parseCryptoLine)},ee.getIceParameters=function(e,t){let i=ee.matchPrefix(e+t,"a=ice-ufrag:")[0],r=ee.matchPrefix(e+t,"a=ice-pwd:")[0];return i&&r?{usernameFragment:i.substring(12),password:r.substring(10)}:null},ee.writeIceParameters=function(e){let t="a=ice-ufrag:"+e.usernameFragment+"\r\na=ice-pwd:"+e.password+"\r\n";return e.iceLite&&(t+="a=ice-lite\r\n"),t},ee.parseRtpParameters=function(e){let t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},i=ee.splitLines(e)[0].split(" ");t.profile=i[2];for(let r=3;r{t.headerExtensions.push(ee.parseExtmap(e))});let r=ee.matchPrefix(e,"a=rtcp-fb:* ").map(ee.parseRtcpFb);return t.codecs.forEach(e=>{r.forEach(t=>{e.rtcpFeedback.find(e=>e.type===t.type&&e.parameter===t.parameter)||e.rtcpFeedback.push(t)})}),t},ee.writeRtpDescription=function(e,t){let i="";i+="m="+e+" ",i+=t.codecs.length>0?"9":"0",i+=" "+(t.profile||"UDP/TLS/RTP/SAVPF")+" ",i+=t.codecs.map(e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType).join(" ")+"\r\n",i+="c=IN IP4 0.0.0.0\r\n",i+="a=rtcp:9 IN IP4 0.0.0.0\r\n",t.codecs.forEach(e=>{i+=ee.writeRtpMap(e),i+=ee.writeFmtp(e),i+=ee.writeRtcpFb(e)});let r=0;return t.codecs.forEach(e=>{e.maxptime>r&&(r=e.maxptime)}),r>0&&(i+="a=maxptime:"+r+"\r\n"),t.headerExtensions&&t.headerExtensions.forEach(e=>{i+=ee.writeExtmap(e)}),i},ee.parseRtpEncodingParameters=function(e){let t,i=[],r=ee.parseRtpParameters(e),n=-1!==r.fecMechanisms.indexOf("RED"),s=-1!==r.fecMechanisms.indexOf("ULPFEC"),o=ee.matchPrefix(e,"a=ssrc:").map(e=>ee.parseSsrcMedia(e)).filter(e=>"cname"===e.attribute),a=o.length>0&&o[0].ssrc,c=ee.matchPrefix(e,"a=ssrc-group:FID").map(e=>e.substring(17).split(" ").map(e=>parseInt(e,10)));c.length>0&&c[0].length>1&&c[0][0]===a&&(t=c[0][1]),r.codecs.forEach(e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let r={ssrc:a,codecPayloadType:parseInt(e.parameters.apt,10)};a&&t&&(r.rtx={ssrc:t}),i.push(r),n&&((r=JSON.parse(JSON.stringify(r))).fec={ssrc:a,mechanism:s?"red+ulpfec":"red"},i.push(r))}}),0===i.length&&a&&i.push({ssrc:a});let d=ee.matchPrefix(e,"b=");return d.length&&(d=0===d[0].indexOf("b=TIAS:")?parseInt(d[0].substring(7),10):0===d[0].indexOf("b=AS:")?950*parseInt(d[0].substring(5),10)-16e3:void 0,i.forEach(e=>{e.maxBitrate=d})),i},ee.parseRtcpParameters=function(e){let t={},i=ee.matchPrefix(e,"a=ssrc:").map(e=>ee.parseSsrcMedia(e)).filter(e=>"cname"===e.attribute)[0];i&&(t.cname=i.value,t.ssrc=i.ssrc);let r=ee.matchPrefix(e,"a=rtcp-rsize");return t.reducedSize=r.length>0,t.compound=0===r.length,t.mux=ee.matchPrefix(e,"a=rtcp-mux").length>0,t},ee.writeRtcpParameters=function(e){let t="";return e.reducedSize&&(t+="a=rtcp-rsize\r\n"),e.mux&&(t+="a=rtcp-mux\r\n"),void 0!==e.ssrc&&e.cname&&(t+="a=ssrc:"+e.ssrc+" cname:"+e.cname+"\r\n"),t},ee.parseMsid=function(e){let t,i=ee.matchPrefix(e,"a=msid:");if(1===i.length)return{stream:(t=i[0].substring(7).split(" "))[0],track:t[1]};let r=ee.matchPrefix(e,"a=ssrc:").map(e=>ee.parseSsrcMedia(e)).filter(e=>"msid"===e.attribute);if(r.length>0)return{stream:(t=r[0].value.split(" "))[0],track:t[1]}},ee.parseSctpDescription=function(e){let t,i=ee.parseMLine(e),r=ee.matchPrefix(e,"a=max-message-size:");r.length>0&&(t=parseInt(r[0].substring(19),10)),isNaN(t)&&(t=65536);let n=ee.matchPrefix(e,"a=sctp-port:");if(n.length>0)return{port:parseInt(n[0].substring(12),10),protocol:i.fmt,maxMessageSize:t};let s=ee.matchPrefix(e,"a=sctpmap:");if(s.length>0){let e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:t}}},ee.writeSctpDescription=function(e,t){let i=[];return i="DTLS/SCTP"!==e.protocol?["m="+e.kind+" 9 "+e.protocol+" "+t.protocol+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctp-port:"+t.port+"\r\n"]:["m="+e.kind+" 9 "+e.protocol+" "+t.port+"\r\n","c=IN IP4 0.0.0.0\r\n","a=sctpmap:"+t.port+" "+t.protocol+" 65535\r\n"],void 0!==t.maxMessageSize&&i.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),i.join("")},ee.generateSessionId=function(){return Math.random().toString().substr(2,22)},ee.writeSessionBoilerplate=function(e,t,i){return"v=0\r\no="+(i||"thisisadapterortc")+" "+(e||ee.generateSessionId())+" "+(void 0!==t?t:2)+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},ee.getDirection=function(e,t){let i=ee.splitLines(e);for(let e=0;e{let r=0,o=0,a=0,c=[];e.onmessage=function({data:t}){if(0==o){let{size:i,part:r}=JSON.parse(t);o=i,a=r,e.send("READY")}else r+=t.byteLength,c.push(t),r==o&&(s[a]=new Blob(c),c=[],o=0,a=0,r=0,e.send("TOTAL_RECAIVED"))},e.onclose=()=>{0==--i&&n(new File(s,t.name,{type:t.type,lastModified:+new Date}))}})}async SendFile(e,t){this.isSending=!0,this.isStarted=!0;let i=await e.arrayBuffer(),r=Math.ceil(i.byteLength/1e7),n=Math.min(5,r);if("connected"!=this.webrtc.iceStatus)throw Error("WebRTC is a not ready");this.peer.send({type:"file",name:e.name,size:e.size,mimetype:e.type,partCount:r,channelCount:n,metadata:t});let s=[];for(let e=0;e{t.onopen=()=>{e(void 0)}}),s.push(t)}let o=0,a=()=>o{for(let t=0;t{0==--c&&(this.isSending=!1,this.isStarted=!1,e(void 0))})})}sendPartition(e,t,i,r){let[n,s]=t(),o=0,a=()=>{if(!(n instanceof ArrayBuffer))return;let e=n.slice(16e3*o,16e3*o+16e3);if(o++,0!=e.byteLength)return e};e.addEventListener("message",({data:i})=>{"READY"==i&&this.sendFileChannel(e,a),"TOTAL_RECAIVED"==i&&([n,s]=t(),o=0,!1!=n?e.send(JSON.stringify({size:n.byteLength,part:s})):(e.close(),r()))}),e.send(JSON.stringify({size:n.byteLength,part:s}))}sendFileChannel(e,t){e.addEventListener("bufferedamountlow",function(){let i=t();i&&e.send(i)}),e.bufferedAmountLowThreshold=15999;let i=t();i&&e.send(i)}}class ep{static{this.channels=new Map}static{this.requireGC=!1}static{this.defaultRTCConfig={iceCandidatePoolSize:0,iceTransportPolicy:"all",rtcpMuxPolicy:"require"}}isPolite(){return this.peer?.mwse.peer("me").socketId{this.eventConnectionState()}),this.rtc.addEventListener("icecandidate",(...e)=>{this.eventIcecandidate(...e)}),this.rtc.addEventListener("iceconnectionstatechange",()=>{this.eventICEConnectionState()}),this.rtc.addEventListener("icegatheringstatechange",()=>{this.eventICEGatherinState()}),this.rtc.addEventListener("negotiationneeded",()=>{this.eventNogationNeeded()}),this.rtc.addEventListener("signalingstatechange",()=>{this.eventSignalingState()}),this.rtc.addEventListener("track",(...e)=>{this.eventTrack(...e)}),this.rtc.addEventListener("datachannel",(...e)=>{this.eventDatachannel(...e)}),this.on("input",async e=>{switch(e.type){case"icecandidate":try{this.rtc.remoteDescription?await this.rtc.addIceCandidate(new RTCIceCandidate(e.value)):this.candicatePack.push(new RTCIceCandidate(e.value))}catch(e){}finally{console.log("ICE Canbet")}break;case"offer":{let t=!this.makingOffer&&("stable"==this.rtc.signalingState||this.isSettingRemoteAnswerPending);if(this.ignoreOffer=!this.isPolite()&&!t,this.ignoreOffer)return;for(let t of(this.isSettingRemoteAnswerPending=!1,await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value)),this.isSettingRemoteAnswerPending=!1,this.candicatePack))await this.rtc.addIceCandidate(t);let i=await this.rtc.createAnswer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(i),this.send({type:"answer",value:i});break}case"answer":for(let t of(await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value)),this.candicatePack))await this.rtc.addIceCandidate(t);break;case"streamInfo":{let{id:t,value:i}=e,r=this.recaivingStream.get(t);r?this.recaivingStream.set(t,{...r,...i}):this.recaivingStream.set(t,i),this.send({type:"streamAccept",id:t});break}case"streamRemoved":{let{id:t}=e;this.emit("stream:stopped",this.recaivingStream.get(t)),this.recaivingStream.delete(t);break}case"streamAccept":{let{id:t}=e,i=this.sendingStream.get(t),r=[];if(i&&i.stream){for(let e of i.stream.getTracks())r.push(this.rtc.addTrack(e,i.stream));i.senders=r}break}case"message":this.emit("message",e.payload)}})}addEventListener(e,t){(this.events[e]||(this.events[e]=[])).push(t)}on(e,t){this.addEventListener(e,t)}async dispatch(e,...t){if(this.events[e])for(let i of this.events[e])await i(...t)}async emit(e,...t){await this.dispatch(e,...t)}connect(){this.channel||this.createDefaultDataChannel()}sendMessage(e){this.send({type:"message",payload:e})}createDefaultDataChannel(){let e=this.rtc.createDataChannel(":default:",{ordered:!0});e.addEventListener("open",()=>{this.channel=e,ep.channels.set(this.id,this),this.active=!0}),e.addEventListener("message",({data:e})=>{let t=JSON.parse(e);this.emit("input",t)}),e.addEventListener("close",()=>{this.channel=void 0,this.active=!1})}destroy(){this.active=!1,this.channel&&(this.channel.close(),this.channel=void 0),this.rtc&&this.rtc.close(),this.emit("disconnected"),ep.channels.delete(this.id)}eventDatachannel(e){":default:"==e.channel.label?(ep.channels.set(this.id,this),this.channel=e.channel,this.active=!0,e.channel.addEventListener("message",({data:e})=>{let t=JSON.parse(e);this.emit("input",t)}),e.channel.addEventListener("close",()=>{this.channel=void 0,ep.channels.delete(this.id),ep.requireGC=!0})):this.emit("datachannel",e.channel)}send(e){this.channel?.readyState=="open"?this.channel.send(JSON.stringify(e)):this.emit("output",e)}eventConnectionState(){this.connectionStatus=this.rtc.connectionState,"connected"==this.connectionStatus&&!1==this.active&&this.emit("connected"),"failed"==this.connectionStatus&&this.rtc.restartIce(),"closed"==this.connectionStatus&&this.active&&this.destroy()}eventIcecandidate(e){e.candidate&&this.send({type:"icecandidate",value:e.candidate})}eventICEConnectionState(){this.iceStatus=this.rtc.iceConnectionState}eventICEGatherinState(){this.gatheringStatus=this.rtc.iceGatheringState}async eventNogationNeeded(){try{this.makingOffer=!0;let e=await this.rtc.createOffer({iceRestart:!0,offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(e),this.send({type:"offer",value:e})}catch(e){console.error("Nogation Error:",e)}finally{this.makingOffer=!1}}eventSignalingState(){this.signalingStatus=this.rtc.signalingState}eventTrack(e){let t=e.receiver;if(e.streams.length)for(let i of e.streams){let e=this.recaivingStream.get(i.id);(e.recaivers||(e.recaivers=[])).push(t),null==this.recaivingStream.get(i.id).stream?(e.stream=i,this.emit("stream:added",this.recaivingStream.get(i.id))):e.stream=i}}sendStream(e,t,i){this.send({type:"streamInfo",id:e.id,value:{...i,name:t}}),this.sendingStream.set(e.id,{...i,id:e.id,name:t,stream:e})}stopStream(e){if("connected"==this.connectionStatus&&this.sendingStream.has(e.id)){let{stream:t}=this.sendingStream.get(e.id);for(let e of t.getTracks())for(let t of this.rtc.getSenders())t.track?.id==e.id&&this.rtc.removeTrack(t);this.send({type:"streamRemoved",id:t.id}),this.sendingStream.delete(e.id)}}stopAllStreams(){if("connected"==this.connectionStatus){for(let[,{stream:e}]of this.sendingStream)if(void 0!=e){for(let t of e.getTracks())for(let e of this.rtc.getSenders())e.track?.id==t.id&&this.rtc.removeTrack(e);this.send({type:"streamRemoved",id:e.id})}this.sendingStream.clear()}}async SendFile(e,t){if(!this.peer)throw Error("Peer is not ready");this.FileTransportChannel=new ed(this,this.peer),await this.FileTransportChannel.SendFile(e,t)}async RecaiveFile(e,t,i){if(!this.peer)throw Error("Peer is not ready");return this.FileTransportChannel=new ed(this,this.peer),await new Promise(r=>{this.FileTransportChannel&&this.FileTransportChannel.RecaiveFile(this.rtc,t,e,i,e=>{r(e)})})}}ep.requireGC=!1,setInterval(()=>{if(!1==ep.requireGC)return;let e=document.createElement("img");e.src=window.URL.createObjectURL(new Blob([new ArrayBuffer(5e7)])),e.onerror=function(){window.URL.revokeObjectURL(this.src)},ep.requireGC=!1},3e3);var eh=function(e){return e[e.PayloadMessagePack=-12873.54]="PayloadMessagePack",e[e.PayloadRTCBasePack=-12884.54]="PayloadRTCBasePack",e}(eh||{});class el extends n{constructor(e){super(),this.options={},this.selfSocket=!1,this.active=!1,this.peerConnection=!1,this.primaryChannel="datachannel",this.mwse=e,this.rtc=this.createRTC(),this.info=new o(this),this.on("pack",e=>{if(":rtcpack:"==e.type)return this.rtc.emit("input",e.payload);this.emit("message",e)})}createRTC(e,t){return this.rtc=new ep(e,t),this.rtc.peer=this,this.rtc.on("connected",()=>{this.peerConnection=!0}),this.rtc.on("disconnected",()=>{this.peerConnection=!1}),this.rtc.on("output",e=>{this.send({type:":rtcpack:",payload:e})}),this.rtc.on("message",e=>{this.emit("pack",e)}),this.rtc}setPeerOptions(e){"string"==typeof e?this.setSocketId(e):this.options=e}setSocketId(e){this.socketId=e}async metadata(){if("me"==this.socketId){let e=await this.mwse.EventPooling.request({type:"my/socketid"});return this.selfSocket=!0,this.active||=!0,this.socketId=e,this.emit("scope"),this.activeScope=!0,e}}async request(e){if(this.active)return await this.mwse.request(this.socketId,e)}equalTo(e){return this.socketId==e.socketId}async isReachable(){return await this.mwse.EventPooling.request({type:"is/reachable",to:this.socketId})}async enablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"everybody"})}async disablePairAuth(){await this.mwse.EventPooling.request({type:"auth/pair-system",value:"disable"})}async enablePairInfo(){await this.mwse.EventPooling.request({type:"connection/pairinfo",value:!0})}async disablePairInfo(){await this.mwse.EventPooling.request({type:"connection/pairinfo",value:!1})}async requestPair(){let{message:e,status:t}=await this.mwse.EventPooling.request({type:"request/pair",to:this.socketId});return("ALREADY-PAIRED"==e||"ALREADY-REQUESTED"==e)&&console.warn("Already paired or pair requested"),"fail"!=t||(console.error("Request Pair Error",t,e),!1)}async endPair(){await this.mwse.EventPooling.request({type:"end/pair",to:this.socketId}),this.forget()}async acceptPair(){let{message:e,status:t}=await this.mwse.EventPooling.request({type:"accept/pair",to:this.socketId});return"fail"!=t||(console.error("Pair Error",t,e),!1)}async rejectPair(){let{message:e,status:t}=await this.mwse.EventPooling.request({type:"reject/pair",to:this.socketId});return"fail"!=t||(console.error("Pair Error",t,e),!1)}async getPairedList(){let{value:e}=await this.mwse.EventPooling.request({type:"pair/list",to:this.socketId});return e}async send(e){let t,i=this.peerConnection&&this.rtc?.active,r=this.mwse.server.connected;if("websocket"==(i&&r?"websocket"==this.primaryChannel?"websocket":"datachannel":r?"websocket":"datachannel")){if(!this.mwse.writable)return console.warn("Socket is not writable");await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId})}else this.rtc?.sendMessage(e)}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class em{constructor(e){this.info={},this.room=e,this.room.on("updateinfo",(e,t)=>{this.info[e]=t})}async fetch(e){if(e){let t=await this.room.mwse.EventPooling.request({type:"room/getinfo",roomId:this.room.roomId,name:e});"success"==t.status?this.info=t.value:console.warn(t.message)}else{let e=await this.room.mwse.EventPooling.request({type:"room/info",roomId:this.room.roomId});"success"==e.status?this.info=e.value:console.warn(e.message)}return this.info}set(e,t){this.info[e]=t,this.room.mwse.WSTSProtocol.SendOnly({type:"room/setinfo",roomId:this.room.roomId,name:e,value:t})}get(e){return e?this.info[e]:this.info}}class eu extends n{constructor(e){super(),this.peers=new Map,this.mwse=e,this.info=new em(this)}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let t={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0,autoFetchInfo:!0};Object.assign(t,e),this.config=t}}setRoomId(e){this.roomId=e}async createRoom(e){let t=this.config||e,i=await this.mwse.EventPooling.request({type:"create-room",...t});if("fail"==i.status){if("ALREADY-EXISTS"==i.message&&this.config.ifexistsJoin)return this.join();throw Error(i.message||i.messages)}this.options={...this.config,...i.room},this.roomId=i.room.id,this.mwse.rooms.set(this.roomId,this)}async join(){let e=await this.mwse.EventPooling.request({type:"joinroom",name:this.config.name,credential:this.config.credential,autoFetchInfo:this.config.autoFetchInfo||!1});if("fail"==e.status)throw Error(e.message);this.options={...this.config,...e.room},e.info&&(this.info.info=e.info),this.roomId=e.room.id,this.mwse.rooms.set(this.roomId,this)}async eject(){let{type:e}=await this.mwse.EventPooling.request({type:"ejectroom",roomId:this.roomId});this.peers.clear(),"success"==e&&this.mwse.rooms.delete(this.roomId)}async send(e,t=!1,i=!1){if(!this.mwse.writable)return console.warn("Socket is not writable");if(i){let{type:r}=await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t,handshake:i});if("fail"==r)throw Error("Cant send message to room")}else await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t,handshake:i})}async fetchPeers(e,t=!1){if(t){let{count:t}=await this.mwse.EventPooling.request({type:"room/peer-count",roomId:this.roomId,filter:e||{}});return t}{let{status:t,peers:i}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId,filter:e||{}}),r=[];if("fail"==t)throw Error("Cant using peers on room");if("success"==t)for(let e of i){let t=this.mwse.peer(e,!0);r.push(t),this.peers.set(e,t)}return r}}}class ef{constructor(e){this.mwse=e,this.addListener()}addListener(){this.mwse.server?.onRecaivePack(e=>{this.PackAnalyze(e)})}SendRaw(e){this.mwse.server.tranferToServer(e)}SendOnly(e){this.mwse.server.tranferToServer([e,"R"])}SendRequest(e,t){this.mwse.server.tranferToServer([e,t,"R"])}StartStream(e,t){this.mwse.server.tranferToServer([e,t,"S"])}PackAnalyze(e){let[t,i,r]=e;if("number"==typeof i){let e=this.mwse.EventPooling.events.get(i);e?(e[0](t,r),"E"===r&&this.mwse.EventPooling.events.delete(i)):console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(i);if(e)for(let i of e)i(t);else console.warn("Missing event sended from server")}}}class eg extends n{constructor(e){super(),this.rooms=new Map,this.pairs=new Map,this.peers=new Map,this.writable=1,this.readable=1,eg.rtc=eg,this.server=new i(this,e),this.WSTSProtocol=new ef(this),this.EventPooling=new r(this),this.virtualPressure=new s(this),this.server.connect(),this.me=new el(this),this.me.scope(()=>{this.peers.set("me",this.me),this.peers.set(this.me.socketId,this.me)}),this.server.onActive(async()=>{this.me.setSocketId("me"),await this.me.metadata(),this.emit("scope"),this.activeScope=!0}),this.server.onPassive(async()=>{this.emit("close")}),this.packMessagingSystem()}destroy(){this.server.disconnect()}enableRecaiveData(){this.WSTSProtocol.SendOnly({type:"connection/packrecaive",value:1}),this.readable=1}disableRecaiveData(){this.WSTSProtocol.SendOnly({type:"connection/packrecaive",value:0}),this.readable=0}enableSendData(){this.WSTSProtocol.SendOnly({type:"connection/packsending",value:1}),this.writable=1}disableSendData(){this.WSTSProtocol.SendOnly({type:"connection/packsending",value:0}),this.writable=0}enableNotifyRoomInfo(){this.WSTSProtocol.SendOnly({type:"connection/roominfo",value:1})}disableNotifyRoomInfo(){this.WSTSProtocol.SendOnly({type:"connection/roominfo",value:0})}async request(e,t){let{pack:i}=await this.EventPooling.request({type:"request/to",to:e,pack:t});return i}async response(e,t,i){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:i,id:t})}packMessagingSystem(){this.EventPooling.signal("pack",e=>{if(this.readable){let{from:t,pack:i}=e;this.peer(t,!0).emit("pack",i)}}),this.EventPooling.signal("request",e=>{let{from:t,pack:i,id:r}=e,n={body:i,response:e=>{this.response(t,r,e)},peer:this.peer(t,!0)};this.peer(t,!0).emit("request",n),this.peer("me").emit("request",n)}),this.EventPooling.signal("pack/room",e=>{if(this.readable){let{from:t,pack:i,sender:r}=e;this.room(t).emit("message",i,this.peer(r))}}),this.EventPooling.signal("room/joined",e=>{let{id:t,roomid:i}=e,r=this.room(i),n=this.peer(t,!0);r.peers.set(n.socketId,n),r.emit("join",n)}),this.EventPooling.signal("room/info",e=>{let{roomId:t,name:i,value:r}=e;this.room(t).emit("updateinfo",i,r)}),this.EventPooling.signal("room/ejected",e=>{let{id:t,roomid:i}=e,r=this.room(i),n=this.peer(t,!0);r.peers.delete(n.socketId),r.emit("eject",n)}),this.EventPooling.signal("room/closed",e=>{let{roomid:t}=e,i=this.room(t);i.peers.clear(),i.emit("close"),this.rooms.delete(t)}),this.EventPooling.signal("pair/info",e=>{let{from:t,name:i,value:r}=e,n=this.peer(t,!0);n.info.info[i]=r,n.emit("info",i,r)}),this.EventPooling.signal("request/pair",e=>{let{from:t,info:i}=e,r=this.peer(t,!0);r.info.info=i,r.emit("request/pair",r),this.peer("me").emit("request/pair",r)}),this.EventPooling.signal("peer/disconnect",e=>{let{id:t}=e,i=this.peer(t,!0);i.emit("disconnect",i)}),this.EventPooling.signal("accepted/pair",e=>{let{from:t,info:i}=e,r=this.peer(t,!0);r.info.info=i,r.emit("accepted/pair",r),this.peer("me").emit("accepted/pairr",r)}),this.EventPooling.signal("end/pair",e=>{let{from:t,info:i}=e;this.peer(t,!0).emit("endPair",i),this.peer("me").emit("endPair",t,i)})}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let t=new eu(this);return t.setRoomOptions(e),this.emit("room"),t}peer(e,t=!1){if("string"==typeof e){if(this.peers.has(e))return this.peers.get(e);if(this.pairs.has(e))return this.pairs.get(e)}let i=new el(this);return i.setPeerOptions(e),i.active=t,this.peers.set(i.socketId,i),this.emit("peer",i),i}}window.MWSE=eg})(); //# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map index c9be1cc..0df2427 100644 --- a/script/index.js.map +++ b/script/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["frontend/index.ts","frontend/Connection.ts","../../../../../usr/lib/node_modules/parcel/node_modules/@parcel/transformer-js/src/esmodule-helpers.js","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/Peer.ts","frontend/PeerInfo.ts","frontend/WebRTC.ts","frontend/P2PFileSender.ts","node_modules/webrtc-adapter/src/js/adapter_core.js","node_modules/webrtc-adapter/src/js/adapter_factory.js","node_modules/webrtc-adapter/src/js/utils.js","node_modules/webrtc-adapter/src/js/chrome/chrome_shim.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/firefox/firefox_shim.js","node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/safari/safari_shim.js","node_modules/webrtc-adapter/src/js/common_shim.js","node_modules/sdp/sdp.js","frontend/Room.ts","frontend/RoomInfo.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["import {Connection,IConnection} from \"./Connection\";\nimport EventPool from \"./EventPool\";\nimport EventTarget from \"./EventTarget\";\nimport { IPPressure } from \"./IPPressure\";\nimport Peer from \"./Peer\";\nimport Room, { IRoomOptions } from \"./Room\";\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\nimport WebRTC from \"./WebRTC\";\n//import {Gzip} from \"fflate\";\nexport default class MWSE extends EventTarget {\n public static rtc : WebRTC;\n public server! : Connection;\n public WSTSProtocol! : WSTSProtocol;\n public EventPooling! : EventPool;\n public rooms : Map = new Map();\n public pairs : Map = new Map();\n public peers : Map = new Map();\n public virtualPressure : IPPressure;\n public me! : Peer;\n /*public static compress(message:string, callback:(e:any) => any)\n {\n let u : any= [];\n let C = new Gzip({\n level: 9,\n mem: 12\n },(stream,isLast) => {\n u.push(stream);\n if(isLast)\n {\n callback(u);\n }\n });\n C.push(new TextEncoder().encode(message), true);\n }*/\n constructor(options: IConnection){\n super();\n MWSE.rtc = MWSE as unknown as WebRTC;\n this.server = new Connection(this,options);\n this.WSTSProtocol = new WSTSProtocol(this);\n this.EventPooling = new EventPool(this);\n this.virtualPressure = new IPPressure(this);\n this.server.connect();\n this.me = new Peer(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId as string, this.me);\n })\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.server.onPassive(async ()=>{\n this.emit('close');\n });\n this.packMessagingSystem();\n }\n\n public writable = 1;\n public readable = 1;\n\n public destroy()\n {\n this.server.disconnect();\n }\n\n public enableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 1 })\n this.readable = 1\n }\n public disableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 0 })\n this.readable = 0\n }\n\n public enableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 1 })\n this.writable = 1\n }\n public disableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 0 })\n this.writable = 0\n }\n\n public enableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 1 })\n }\n public disableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 0 })\n }\n\n public async request(peerId: string, pack:Message)\n {\n let {pack:answer} = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack\n });\n return answer;\n }\n public async response(peerId: string, requestId:number, pack:Message)\n {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack,\n id: requestId\n })\n }\n private packMessagingSystem()\n {\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\n if(this.readable)\n {\n let {from,pack} = payload;\n this.peer(from, true).emit('pack', pack);\n }\n })\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\n let {from,pack, id} = payload;\n let scope = {\n body: pack,\n response: (pack: Message) => {\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n })\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any,sender:string}) => {\n if(this.readable)\n {\n let {from,pack,sender} = payload;\n this.room(from).emit('message', pack, this.peer(sender));\n }\n })\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId as string, peer);\n room.emit('join', peer);\n })\n this.EventPooling.signal('room/info',(payload : {roomId:string,value:any,name:string}) => {\n let {roomId,name,value} = payload;\n this.room(roomId).emit('updateinfo', name,value);\n })\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.delete(peer.socketId as string);\n room.emit('eject', peer);\n })\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\n let {roomid} = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n })\n this.EventPooling.signal(\"pair/info\", (payload : {from : string,name: string, value: string | number | boolean}) => {\n let {from, name, value} = payload;\n let peer = this.peer(from, true);\n peer.info.info[name] = value;\n peer.emit(\"info\", name, value);\n })\n this.EventPooling.signal(\"request/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"request/pair\", peer);\n this.peer('me').emit('request/pair', peer);\n })\n this.EventPooling.signal(\"peer/disconnect\", (payload : {id : string}) => {\n let {id} = payload;\n let peer = this.peer(id, true);\n peer.emit(\"disconnect\", peer);\n })\n this.EventPooling.signal(\"accepted/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"accepted/pair\", peer);\n this.peer('me').emit('accepted/pairr', peer);\n })\n this.EventPooling.signal(\"end/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.emit(\"endPair\", info);\n this.peer('me').emit('endPair', from, info);\n })\n }\n public room(options: IRoomOptions | string) : Room\n {\n if(typeof options == \"string\")\n {\n if(this.rooms.has(options))\n {\n return this.rooms.get(options) as Room\n }\n }\n let room = new Room(this);\n room.setRoomOptions(options);\n this.emit('room');\n return room;\n }\n public peer(options: string | IRoomOptions, isActive = false) : Peer\n {\n if(typeof options == \"string\")\n {\n if(this.peers.has(options))\n {\n return this.peers.get(options) as Peer\n }\n if(this.pairs.has(options))\n {\n return this.pairs.get(options) as Peer\n }\n }\n let peer = new Peer(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId as string, peer);\n this.emit('peer', peer);\n return peer;\n }\n};\n\ndeclare global {\n interface Window {\n MWSE: any;\n }\n}\n\nwindow.MWSE = MWSE;","import MWSE from \"frontend\";\n\nexport interface IConnection{\n endpoint: string;\n autoReconnect?: boolean | {\n timeout: number;\n }\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n\n public autoReconnect : boolean = true;\n public autoReconnectTimeout : number = 3000;\n public autoReconnectTimer? : number;\n constructor(mwse:MWSE, options: IConnection){\n\n if(options.endpoint == \"auto\")\n {\n const RootURL : string = ( document.currentScript).src\n let scriptPath = new URL(RootURL);\n let isSecurity = scriptPath.protocol == \"https:\";\n let dumeUrl = scriptPath.pathname.split('/').slice(0,-1).join('/') + '/';\n let wsSocket = new URL(dumeUrl, scriptPath);\n wsSocket.protocol = isSecurity ? 'wss:' : 'ws:';\n this.endpoint = new URL(wsSocket.href);\n }else{\n try{\n // Testing\n this.endpoint = new URL(options.endpoint);\n }catch{\n throw new Error(\"endpoint is required\")\n }\n }\n if(typeof options.autoReconnect == \"boolean\")\n {\n this.autoReconnect = true;\n }else if(options.autoReconnect)\n {\n this.autoReconnect = true;\n this.autoReconnectTimeout = options.autoReconnect.timeout;\n }\n }\n public connect()\n {\n if(this.autoReconnectTimer)\n {\n clearTimeout(this.autoReconnectTimer)\n };\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\n /**\n * Eğer bilinerek elle kapatıldıysa otomatik tekrar bağlanmasının\n * önüne geçmek için autoReconnect bayrağını her zaman kapalı tutmak gerekir\n */\n this.autoReconnect = false;\n this.ws.close();\n }\n public addWSEvents()\n {\n this.ws.addEventListener(\"open\", () => this.eventOpen());\n this.ws.addEventListener(\"close\", () => this.eventClose());\n this.ws.addEventListener(\"error\", () => this.eventError());\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\n }\n private eventOpen()\n {\n this.connected = true;\n for (const callback of this.activeConnectionEvent) {\n callback(void 0);\n }\n }\n private eventClose()\n {\n for (const callback of this.passiveConnectionEvent) {\n callback(void 0);\n }\n this.connected = false;\n if(this.autoReconnect)\n {\n this.autoReconnectTimer = setTimeout(() => this.connect(), this.autoReconnectTimeout) as unknown as number;\n }\n }\n private eventError()\n {\n this.connected = false;\n }\n private recaivePackEvent : ((data:any) => any)[] = [];\n public onRecaivePack(func:(data:any) => any)\n {\n this.recaivePackEvent.push(func);\n }\n private activeConnectionEvent : Function[] = [];\n public onActive(func:Function)\n {\n if(this.connected)\n {\n func()\n }else{\n this.activeConnectionEvent.push(func);\n }\n }\n private passiveConnectionEvent : Function[] = [];\n public onPassive(func:Function)\n {\n if(!this.connected)\n {\n func()\n }else{\n this.passiveConnectionEvent.push(func);\n }\n }\n private eventMessage(data: string | ArrayBuffer)\n {\n if(typeof data == \"string\")\n {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent) {\n callback($data);\n }\n }\n }\n public tranferToServer(data:any)\n {\n if(this.connected)\n {\n this.ws.send(JSON.stringify(data));\n }\n }\n}","exports.interopDefault = function (a) {\n return a && a.__esModule ? a : {default: a};\n};\n\nexports.defineInteropFlag = function (a) {\n Object.defineProperty(a, '__esModule', {value: true});\n};\n\nexports.exportAll = function (source, dest) {\n Object.keys(source).forEach(function (key) {\n if (\n key === 'default' ||\n key === '__esModule' ||\n Object.prototype.hasOwnProperty.call(dest, key)\n ) {\n return;\n }\n\n Object.defineProperty(dest, key, {\n enumerable: true,\n get: function () {\n return source[key];\n },\n });\n });\n\n return dest;\n};\n\nexports.export = function (dest, destName, get) {\n Object.defineProperty(dest, destName, {\n enumerable: true,\n get: get,\n });\n};\n","import MWSE from \"./index\";\nimport { Message } from \"./WSTSProtocol\";\n\nexport default class EventPool\n{\n public wsts : MWSE;\n public events : Map = new Map();\n public signals : Map = new Map();\n\n public requests : Map = new Map();\n\n public count = 0;\n constructor(wsts:MWSE){\n this.wsts = wsts;\n }\n public request(msg: Message) : Promise\n {\n return new Promise((ok,rej) => {\n let id = ++this.count;\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n })\n }\n public stream(msg: Message, callback: Function)\n {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id,[\n (data:any) => {\n callback(data);\n },\n () => { }\n ]);\n }\n public signal(event: string, callback: Function)\n {\n let T = this.signals.get(event);\n if(!T)\n {\n this.signals.set(event, [callback]);\n }else{\n T.push(callback);\n }\n }\n}","export default class EventTarget\n{\n private events : {[key:string]:Function[]} = {};\n public emit(eventName :string, ...args:any[])\n {\n if(this.events[eventName])\n {\n for (const callback of this.events[eventName]) {\n callback(...args);\n }\n }\n }\n public on(eventName :string, callback:Function)\n {\n if(this.events[eventName])\n {\n this.events[eventName].push(callback)\n }else{\n this.events[eventName] = [callback];\n }\n }\n public activeScope : boolean = false;\n scope(f:Function)\n {\n if(this.activeScope)\n {\n f()\n }else{\n this.on('scope', f)\n }\n }\n}","import MWSE from \"frontend\";\n\nexport class IPPressure\n{\n public mwse : MWSE;\n public APNumber? : number;\n public APShortCode? : string;\n public APIPAddress? : string;\n constructor(mwse : MWSE){\n this.mwse = mwse;\n };\n public async allocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Allocated Access Point IP Address\");\n }\n }\n public async allocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Allocated Access Point Number\");\n }\n }\n public async allocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Allocated Access Point Short Code\");\n }\n }\n public async reallocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n }\n public async reallocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Reallocated Access Point Number\");\n }\n }\n public async reallocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n }\n public async releaseAPIPAddress()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APIPAddress = undefined;\n }else{\n throw new Error(\"Error release Access Point IP Address\");\n }\n }\n public async releaseAPNumber()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APNumber = undefined;\n }else{\n throw new Error(\"Error release Access Point Number\");\n }\n }\n public async releaseAPShortCode()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n }) as {\n status:string\n };\n if(status == 'success')\n {\n this.APShortCode = undefined;\n }else{\n throw new Error(\"Error release Access Point Short Code\");\n }\n }\n public async queryAPIPAddress(ip:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPNumber(number:number)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPShortCode(code:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n}","import EventTarget from \"./EventTarget\";\nimport { PeerInfo } from \"./PeerInfo\";\nimport WebRTC from \"./WebRTC\";\nimport MWSE from \"./index\";\n\ninterface IPeerOptions{\n\n};\n\nenum IMessageSymbase\n{\n PayloadMessagePack = -12873.54,\n PayloadRTCBasePack = -12884.54\n}\n\n\nexport default class Peer extends EventTarget\n{\n public mwse : MWSE;\n public options : IPeerOptions = {};\n public socketId? : string;\n public selfSocket : boolean = false;\n public active : boolean = false;\n public info : PeerInfo;\n public rtc : WebRTC;\n public peerConnection : boolean = false;\n public primaryChannel : \"websocket\" | \"datachannel\" = \"datachannel\";\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.rtc = this.createRTC();\n this.info = new PeerInfo(this);\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == ':rtcpack:')\n {\n return this.rtc.emit(\"input\", data.payload)\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC(rtcConfig?: RTCConfiguration | undefined, rtcServers?: RTCIceServer[] | undefined) : WebRTC\n {\n this.rtc = new WebRTC(rtcConfig,rtcServers);\n this.rtc.peer = this;\n this.rtc.on(\"connected\", () => {\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', () => {\n this.peerConnection = false;\n })\n this.rtc.on(\"output\",(payload:object) => {\n this.send({\n type: ':rtcpack:',\n payload: payload\n })\n });\n this.rtc.on(\"message\",(payload:object) => {\n this.emit(\"pack\",payload);\n });\n return this.rtc;\n }\n public setPeerOptions(options: string | IPeerOptions){\n if(typeof options == \"string\")\n {\n this.setSocketId(options)\n }else{\n this.options = options;\n }\n }\n public setSocketId(uuid: string){\n this.socketId = uuid;\n }\n async metadata() : Promise\n {\n if(this.socketId == 'me')\n {\n let result = await this.mwse.EventPooling.request({\n type:'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n };\n \n async request(pack:any){\n if(this.active)\n {\n return await this.mwse.request(this.socketId as string, pack);\n }\n };\n equalTo(peer : Peer | {socketId: string})\n {\n return this.socketId == peer.socketId;\n }\n async isReachable()\n {\n return await this.mwse.EventPooling.request({\n type:'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'disable'\n });\n }\n async enablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: true\n });\n }\n async disablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: false\n });\n }\n async requestPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'request/pair',\n to: this.socketId\n });\n if(\n message == \"ALREADY-PAIRED\" ||\n message == \"ALREADY-REQUESTED\"\n )\n {\n console.warn(\"Already paired or pair requested\")\n };\n if(status == \"fail\")\n {\n console.error(\"Request Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async endPair()\n {\n await this.mwse.EventPooling.request({\n type:'end/pair',\n to: this.socketId\n });\n this.forget();\n }\n async acceptPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'accept/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async rejectPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'reject/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async getPairedList() : Promise\n {\n let {value} = await this.mwse.EventPooling.request({\n type:'pair/list',\n to: this.socketId\n });\n return value;\n }\n async send(pack: any){\n let isOpenedP2P = this.peerConnection && this.rtc?.active;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel : \"websocket\" | \"datachannel\";\n if(isOpenedP2P && isOpenedServer)\n {\n if(this.primaryChannel == \"websocket\")\n {\n sendChannel = \"websocket\"\n }else\n {\n sendChannel = \"datachannel\"\n }\n }else if(isOpenedServer){\n sendChannel = \"websocket\"\n }else{\n sendChannel = \"datachannel\"\n }\n\n if(sendChannel == \"websocket\")\n {\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.sendMessage(pack)\n }\n }\n async forget(){\n this.mwse.peers.delete(this.socketId as string);\n this.mwse.pairs.delete(this.socketId as string);\n }\n} ","import Peer from \"./Peer\";\n\nexport class PeerInfo\n{\n public peer : Peer;\n public info : {[key:string]: any} = {};\n constructor(mwse : Peer){\n this.peer = mwse;\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import P2PFileSender from \"./P2PFileSender\";\nimport Peer from \"./Peer\";\nimport \"webrtc-adapter\";\ninterface TransferStreamInfo\n{\n senders : RTCRtpSender[];\n recaivers : RTCRtpReceiver[];\n stream:MediaStream | undefined;\n id:string;\n name:string;\n}\n\nexport default class WebRTC\n{\n public static channels : Map = new Map();\n public static requireGC : boolean = false;\n public id : any;\n public active : boolean = false;\n public connectionStatus : \"closed\" | \"connected\" | \"connecting\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public iceStatus : \"checking\" | \"closed\" | \"completed\" | \"connected\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public gatheringStatus : \"complete\" | \"gathering\" | \"new\" = \"new\";\n public signalingStatus : \"\" | \"closed\" | \"have-local-offer\" | \"have-local-pranswer\" | \"have-remote-offer\" | \"have-remote-pranswer\" | \"stable\" = \"\"\n public rtc! : RTCPeerConnection;\n public recaivingStream : Map = new Map();\n public sendingStream : Map = new Map();\n public events : { [eventname:string]: Function[] } = {};\n public channel : RTCDataChannel | undefined;\n\n public static defaultRTCConfig : RTCConfiguration = {\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n };\n\n public isPolite() : boolean\n {\n let myId = this.peer?.mwse.peer('me').socketId as string;\n let peerId = this.peer?.socketId as string;\n return myId < peerId;\n }\n\n public static defaultICEServers : RTCIceServer[] = [{\n urls: \"stun:stun.l.google.com:19302\"\n },{\n urls: \"stun:stun1.l.google.com:19302\"\n },{\n urls: \"stun:stun2.l.google.com:19302\"\n },{\n urls: \"stun:stun3.l.google.com:19302\"\n },{\n urls: \"stun:stun4.l.google.com:19302\"\n }];\n\n public peer? : Peer;\n\n public FileTransportChannel? : P2PFileSender;\n\n public makingOffer = false;\n public ignoreOffer = false;\n public isSettingRemoteAnswerPending = false;\n\n candicatePack : RTCIceCandidate[] = [];\n\n\n constructor(\n rtcConfig?: RTCConfiguration,\n rtcServers?: RTCIceServer[]\n )\n {\n let config : any = {};\n\n if(rtcConfig)\n {\n Object.assign(\n config,\n WebRTC.defaultRTCConfig,\n rtcConfig\n )\n }else{\n Object.assign(\n config,\n WebRTC.defaultRTCConfig\n )\n }\n\n config.iceServers = rtcServers || WebRTC.defaultICEServers;\n\n this.rtc = new RTCPeerConnection(config as RTCConfiguration);\n this.rtc.addEventListener(\"connectionstatechange\",()=>{\n this.eventConnectionState();\n })\n this.rtc.addEventListener(\"icecandidate\",(...args)=>{\n this.eventIcecandidate(...args);\n })\n this.rtc.addEventListener(\"iceconnectionstatechange\",()=>{\n this.eventICEConnectionState();\n })\n this.rtc.addEventListener(\"icegatheringstatechange\",()=>{\n this.eventICEGatherinState();\n })\n this.rtc.addEventListener(\"negotiationneeded\",()=>{\n this.eventNogationNeeded();\n })\n this.rtc.addEventListener(\"signalingstatechange\",()=>{\n this.eventSignalingState();\n })\n this.rtc.addEventListener(\"track\",(...args)=>{\n this.eventTrack(...args);\n })\n this.rtc.addEventListener(\"datachannel\",(...args)=>{\n this.eventDatachannel(...args);\n })\n this.on('input',async (data:{[key:string]:any})=>{\n switch(data.type)\n {\n case \"icecandidate\":{\n try{\n if(this.rtc.remoteDescription){\n await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n }else{\n this.candicatePack.push(new RTCIceCandidate(data.value))\n }\n }catch(error){\n debugger;\n }finally{\n console.log(\"ICE Canbet\")\n }\n break;\n }\n case \"offer\":{\n let readyForOffer = !this.makingOffer && (this.rtc.signalingState == \"stable\" || this.isSettingRemoteAnswerPending);\n\n const offerCollision = !readyForOffer;\n\n this.ignoreOffer = !this.isPolite() && offerCollision;\n\n if(this.ignoreOffer){\n return;\n }\n\n this.isSettingRemoteAnswerPending = false;\n\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n\n this.isSettingRemoteAnswerPending = false;\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n })\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n break;\n }\n case \"streamInfo\":{\n let {id,value} = data;\n let streamInfo = this.recaivingStream.get(id);\n if(!streamInfo)\n {\n this.recaivingStream.set(id,value as TransferStreamInfo);\n }else{\n this.recaivingStream.set(id,{\n ...streamInfo,\n ...value\n } as TransferStreamInfo);\n }\n this.send({\n type:'streamAccept',\n id\n })\n break;\n }\n case \"streamRemoved\":{\n let {id} = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.recaivingStream.delete(id);\n break;\n }\n case \"streamAccept\":{\n let {id} = data;\n let sendingStream = this.sendingStream.get(id) as TransferStreamInfo;\n let senders = [];\n if(sendingStream && sendingStream.stream)\n {\n for (const track of sendingStream.stream.getTracks()) {\n senders.push(this.rtc.addTrack(track, sendingStream.stream));\n };\n sendingStream.senders = senders;\n }\n break;\n }\n case \"message\":{\n this.emit('message', data.payload);\n break;\n }\n }\n })\n }\n public addEventListener(event:string,callback: Function){\n (this.events[event] || (this.events[event]=[])).push(callback);\n };\n public on(event:string,callback: Function){\n this.addEventListener(event, callback)\n };\n public async dispatch(event:string,...args:any[]) : Promise {\n if(this.events[event])\n {\n for (const callback of this.events[event])\n {\n await callback(...args)\n }\n }\n }\n public async emit(event:string,...args:any[]) : Promise {\n await this.dispatch(event, ...args)\n }\n public connect()\n {\n if(!this.channel)\n {\n this.createDefaultDataChannel();\n }\n }\n public sendMessage(data: any)\n {\n this.send({\n type: 'message',\n payload: data\n });\n }\n public createDefaultDataChannel()\n {\n let dt = this.rtc.createDataChannel(':default:',{\n ordered: true\n });\n dt.addEventListener(\"open\",()=>{\n this.channel = dt;\n WebRTC.channels.set(this.id, this);\n this.active = true;\n });\n dt.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n dt.addEventListener(\"close\",()=>{\n this.channel = undefined;\n this.active = false;\n })\n }\n public destroy()\n {\n this.active = false;\n if(this.channel)\n {\n this.channel.close();\n this.channel = undefined;\n }\n if(this.rtc)\n {\n this.rtc.close();\n //this.rtc = undefined;\n };\n this.emit('disconnected');\n WebRTC.channels.delete(this.id);\n }\n public eventDatachannel(event: RTCDataChannelEvent)\n {\n if(event.channel.label == ':default:'){\n WebRTC.channels.set(this.id, this);\n this.channel = event.channel;\n this.active = true;\n event.channel.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n event.channel.addEventListener(\"close\",()=>{\n this.channel = undefined;\n WebRTC.channels.delete(this.id);\n WebRTC.requireGC = true;\n })\n }else{\n this.emit('datachannel', event.channel);\n }\n }\n public send(data:object)\n {\n if(this.channel?.readyState == \"open\")\n {\n this.channel.send(JSON.stringify(data));\n }else{\n this.emit('output', data);\n }\n }\n public eventConnectionState()\n {\n this.connectionStatus = this.rtc.connectionState;\n if(this.connectionStatus == 'connected')\n {\n if(this.active == false)\n {\n this.emit('connected');\n }\n };\n\n if(this.connectionStatus == 'failed')\n {\n this.rtc.restartIce();\n };\n \n if(this.connectionStatus == \"closed\")\n {\n if(this.active)\n {\n this.destroy();\n }\n }\n }\n public eventIcecandidate(event: RTCPeerConnectionIceEvent)\n {\n if(event.candidate)\n {\n this.send({\n type:'icecandidate',\n value: event.candidate\n })\n }\n }\n public eventICEConnectionState()\n {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n public eventICEGatherinState()\n {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n public async eventNogationNeeded()\n {\n try{\n this.makingOffer = true;\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n }catch(error){\n console.error(`Nogation Error:`, error)\n }\n finally{\n this.makingOffer = false;\n }\n }\n public eventSignalingState()\n {\n this.signalingStatus = this.rtc.signalingState;\n }\n public eventTrack(event: RTCTrackEvent)\n {\n let rtpRecaiver = event.receiver;\n if(event.streams.length)\n {\n for (const stream of event.streams) {\n let streamInfo = this.recaivingStream.get(stream.id) as TransferStreamInfo;\n (streamInfo.recaivers || (streamInfo.recaivers = [])).push(rtpRecaiver);\n if((this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}).stream == null)\n {\n streamInfo.stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n }else{\n streamInfo.stream = stream;\n }\n }\n }\n }\n public sendStream(stream:MediaStream,name:string,info:{[key:string]:any}){\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id,{\n ...info,\n id:stream.id,\n name: name,\n stream\n } as TransferStreamInfo);\n };\n public stopStream(_stream:MediaStream){\n if(this.connectionStatus != 'connected'){\n return\n }\n if(this.sendingStream.has(_stream.id))\n {\n let {stream} = this.sendingStream.get(_stream.id) as {stream:MediaStream};\n \n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n \n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id)\n }\n }\n public stopAllStreams()\n {\n if(this.connectionStatus != 'connected'){\n return\n }\n for (const [, {stream}] of this.sendingStream) {\n if(stream == undefined)\n {\n continue;\n }\n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n };\n \n this.sendingStream.clear();\n }\n public async SendFile(file:File, meta: object)\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n await this.FileTransportChannel.SendFile(file, meta);\n }\n public async RecaiveFile(\n chnlCount:number,\n filemeta: {\n name: string;\n type: string;\n },\n totalSize: number\n ) : Promise\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n return await new Promise(recaivedFile => {\n if(this.FileTransportChannel)\n {\n this.FileTransportChannel.RecaiveFile(\n this.rtc,\n filemeta,\n chnlCount,\n totalSize,\n (file: File) => {\n recaivedFile(file)\n }\n );\n }\n })\n }\n}\n\nWebRTC.requireGC = false;\nsetInterval(()=>{\n if(WebRTC.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n WebRTC.requireGC = false;\n}, 3000);\n\ndeclare global {\n interface MediaStream {\n senders : RTCRtpSender[];\n }\n}","import \"webrtc-adapter\";\nimport WebRTC from \"./WebRTC\";\nimport Peer from \"./Peer\";\n\n\n\nexport default class P2PFileSender\n{\n public rtc : RTCPeerConnection;\n public peer : Peer;\n public webrtc : WebRTC;\n\n public totalSize : number = 0;\n public isReady : boolean = false;\n public isStarted : boolean = false;\n public isSending : boolean = false;\n public isRecaiving : boolean = false;\n public processedSize : number = 0;\n public recaivedFile? : File;\n\n public bufferSizePerChannel : number = 10e6;\n public bufferSizePerPack : number = 10e3;\n public safeBufferSizePerPack : number = 10e3 - 1;\n\n public constructor(webrtc : WebRTC, peer : Peer)\n {\n this.webrtc = webrtc;\n this.rtc = webrtc.rtc;\n this.peer = peer;\n }\n public async RecaiveFile(\n _rtc: RTCPeerConnection,\n fileMetadata: {name:string, type:string},\n channelCount: number,\n _totalSize: number,\n onEnded: Function\n )\n {\n //let totals = {};\n // let index = 0;\n /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => {\n return {\n name: `${index+1}. Kanal`,\n current: 0,\n currentTotal: 0,\n total: 0\n }\n }));*/\n let parts : Blob[] = [];\n this.webrtc.on('datachannel',(datachannel:RTCDataChannel) => {\n //let channelIndex = index++;\n let current = 0;\n let totalSize = 0;\n let currentPart = 0;\n let bufferAmount : ArrayBuffer[] = [];\n datachannel.onmessage = function({data}){\n if(totalSize == 0)\n {\n let {\n size,\n part,\n } = JSON.parse(data);\n totalSize = size;\n currentPart = part;\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: totalSize,\n current: 0\n }\n });*/\n datachannel.send(\"READY\");\n }else{\n current += data.byteLength;\n bufferAmount.push(data);\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: data.byteLength + n.current,\n currentTotal: data.byteLength + n.currentTotal,\n }\n });\n setProcessedSize(n => n + data.byteLength);*/\n if(current == totalSize)\n {\n parts[currentPart] = new Blob(bufferAmount);\n bufferAmount = []; \n //totals[datachannel.label] += totalSize;\n totalSize = 0;\n currentPart = 0;\n current = 0;\n datachannel.send(\"TOTAL_RECAIVED\");\n }\n }\n };\n datachannel.onclose = () => {\n channelCount--;\n if(channelCount == 0)\n {\n let file = new File(parts, fileMetadata.name, {\n type: fileMetadata.type,\n lastModified: +new Date\n });\n onEnded(file);\n }\n };\n })\n }\n public async SendFile(\n file: File,\n metadata: object\n )\n {\n this.isSending = true;\n this.isStarted = true;\n\n\n let buffer = await file.arrayBuffer();\n let partCount = Math.ceil(buffer.byteLength / 10e6);\n let channelCount = Math.min(5, partCount);\n\n if(this.webrtc.iceStatus != \"connected\")\n {\n throw new Error(\"WebRTC is a not ready\")\n }\n\n this.peer.send({\n type: 'file',\n name: file.name,\n size: file.size,\n mimetype: file.type,\n partCount,\n channelCount,\n metadata: metadata\n });\n\n let channels : RTCDataChannel[] = [];\n\n for(let channelIndex = 0; channelIndex < channelCount; channelIndex++)\n {\n let channel = this.rtc.createDataChannel(\"\\\\?\\\\file_\" + channelIndex);\n channel.binaryType = \"arraybuffer\";\n await new Promise(ok => {\n channel.onopen = () => {\n ok(void 0);\n }\n });\n channels.push(channel);\n };\n\n let currentPart = 0;\n let next = () => {\n if(currentPart < partCount)\n {\n let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6)\n currentPart++;\n return [bufferPart, currentPart - 1];\n };\n return [false,0];\n };\n let spyChannelIndex = channels.length;\n await new Promise(ok => {\n for (let channelIndex = 0; channelIndex < channels.length; channelIndex++)\n {\n this.sendPartition(\n channels[channelIndex],\n next,\n channelIndex,\n () => {\n spyChannelIndex--;\n if(spyChannelIndex == 0)\n {\n this.isSending = false;\n this.isStarted = false;\n ok(undefined)\n }\n }\n );\n }\n })\n }\n protected sendPartition(\n channel: RTCDataChannel,\n nextblob10mb: () => (number | ArrayBuffer)[] | (number | boolean)[],\n _channelIndex: number,\n onEnded: Function\n )\n {\n let [currentBuffer,currentPartition] = nextblob10mb();\n let currentPart = 0;\n let next = () => {\n if(!(currentBuffer instanceof ArrayBuffer))\n {\n return;\n }\n let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3)\n currentPart++;\n if(bufferPart.byteLength != 0)\n {\n /*\n updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: bufferPart.byteLength + n.current,\n currentTotal: bufferPart.byteLength + n.currentTotal\n }\n });\n setProcessedSize(n => n + bufferPart.byteLength);\n */\n return bufferPart\n }\n };\n channel.addEventListener(\"message\",({data}) => {\n if(data == \"READY\")\n {\n this.sendFileChannel(channel, next)\n }\n if(data == \"TOTAL_RECAIVED\")\n {\n [currentBuffer,currentPartition] = nextblob10mb();\n currentPart = 0;\n if(currentBuffer != false)\n {\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: currentBuffer.byteLength,\n current: 0,\n }\n });*/\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }else{\n channel.close();\n onEnded();\n }\n }\n });\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }\n protected sendFileChannel(\n channel: RTCDataChannel,\n getNextBlob: () => ArrayBuffer | undefined\n )\n {\n channel.addEventListener(\"bufferedamountlow\",function(){\n let buffer = getNextBlob();\n if(buffer)\n {\n channel.send(buffer);\n }\n });\n channel.bufferedAmountLowThreshold = 16e3 - 1;\n let c = getNextBlob();\n c && channel.send(c);\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","/*\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 firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: 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 // Expose sdp as a convenience. For production apps include directly.\n sdp,\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 commonShim.shimParameterlessSetLocalDescription(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.shimRTCIceCandidateRelayProtocol(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 commonShim.shimParameterlessSetLocalDescription(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 '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 commonShim.shimParameterlessSetLocalDescription(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.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'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 !window.navigator.userAgent) {\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 // 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 (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';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 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\n ? {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';\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 // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n 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 = sendEncodings;\n sender.sendEncodings = 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/* 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'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.urls === undefined && server.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', {direction: 'recvonly'});\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', {direction: 'recvonly'});\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","/*\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.substring(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 for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\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 shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\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].substring(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// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst 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).substring(2, 12);\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(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const 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(line => line.indexOf(prefix) === 0);\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\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let 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 const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\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 (let 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 compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\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 const 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// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const 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// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const 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 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 const parts = line.substring(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 attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an 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 +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp 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 const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let 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 a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\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 a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let 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(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 a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\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 const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\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 const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role 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 let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(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 const parts = line.substring(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 const parts = keyParams.substring(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 parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const 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 const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\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 let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(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(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(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\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(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 const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\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(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let 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 let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(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].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[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 const 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 const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\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 let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\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 const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n 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 let 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, 22);\n};\n\n// Write boiler 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 let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const 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\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 const lines = SDPUtils.splitLines(mediaSection);\n for (let 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].substring(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 const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(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 const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(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 const lines = SDPUtils.splitLines(blob);\n for (let 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","import EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\nimport { RoomInfo } from \"./RoomInfo\";\n\nexport interface IRoomOptions\n{\n name: string;\n description?:string;\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\n credential?: string;\n ifexistsJoin?: boolean;\n accessType?: \"public\"|\"private\";\n notifyActionInvite?: boolean;\n notifyActionJoined?: boolean;\n notifyActionEjected?: boolean;\n autoFetchInfo?:boolean\n}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : IRoomOptions;\n public config! : IRoomOptions;\n public roomId? : string;\n public accessType? : \"public\"|\"private\";\n public description? : string;\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\n public name? : string;\n public owner? : string;\n public peers : Map = new Map();\n public info : RoomInfo;\n\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.info = new RoomInfo(this);\n }\n public setRoomOptions(options : IRoomOptions | string)\n {\n if(typeof options == \"string\")\n {\n this.roomId = options;\n }else{\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true,\n autoFetchInfo: true\n };\n Object.assign(defaultOptions,options);\n this.config = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let config = this.config || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...config\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.config.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async join(){\n let result = await this.mwse.EventPooling.request({\n type:'joinroom',\n name: this.config.name,\n credential: this.config.credential,\n autoFetchInfo: this.config.autoFetchInfo || false\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n if(result.info)\n {\n this.info.info = result.info;\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async eject(){\n let {type} = await this.mwse.EventPooling.request({\n type:'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if(type == 'success')\n {\n this.mwse.rooms.delete(this.roomId as string);\n }\n }\n async send(pack: any, wom:boolean = false, handshake = false){\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n if(handshake)\n {\n let {type} = await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n }) as {\n type:\"success\"|\"fail\"\n };\n if(type == \"fail\"){\n throw new Error(\"Cant send message to room\")\n }\n }else{\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n })\n }\n }\n async fetchPeers(filter?:{[key:string]:any}, onlyNumber:boolean = false) : Promise\n {\n if(onlyNumber)\n {\n let {count} = await this.mwse.EventPooling.request({\n type:'room/peer-count',\n roomId: this.roomId,\n filter: filter || {}\n }) as {count:Number};\n return count;\n }else{\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId,\n filter: filter || {}\n }) as {status:\"success\"|\"fail\", peers: string[]};\n \n let cup : Peer[] = [];\n \n if(status == 'fail')\n {\n throw new Error(\"Cant using peers on room\")\n }else if(status == 'success'){\n for (const peerid of peers) {\n let peer = this.mwse.peer(peerid,true);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\n }\n }\n}","import Room from \"./Room\";\n\nexport class RoomInfo\n{\n public room : Room;\n public info : {[key:string]: any} = {};\n constructor(room : Room){\n this.room = room;\n this.room.on('updateinfo',(name:string,value:any) => {\n this.info[name] = value;\n })\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/getinfo\",\n roomId: this.room.roomId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/info\",\n roomId: this.room.roomId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.room.mwse.WSTSProtocol.SendOnly({\n type: \"room/setinfo\",\n roomId: this.room.roomId,\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import MWSE from \"./index\";\n\nexport interface Message {\n [key:string|number]:any;\n}\nexport default class WSTSProtocol\n{\n public mwse : MWSE;\n constructor(wsts:MWSE){\n this.mwse = wsts;\n this.addListener();\n }\n public addListener()\n {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack)\n })\n }\n public SendRaw(pack: Message)\n {\n this.mwse.server.tranferToServer(pack);\n }\n public SendOnly(pack: Message)\n {\n this.mwse.server.tranferToServer([pack,'R']);\n }\n public SendRequest(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'R']);\n }\n public StartStream(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'S']);\n }\n public PackAnalyze(data:any)\n {\n let [payload, id, action] = data;\n if(typeof id === 'number')\n {\n let callback = this.mwse.EventPooling.events.get(id);\n if(callback)\n {\n callback[0](payload, action);\n switch(action)\n {\n case 'E':{ // [E]ND flag\n this.mwse.EventPooling.events.delete(id);\n break;\n }\n case 'S': // [S]TREAM flag\n default:{\n break;\n }\n }\n }else console.warn(\"Missing event sended from server\");\n }else{\n let signals = this.mwse.EventPooling.signals.get(id);\n if(signals)\n {\n for (const callback of signals) {\n callback(payload);\n }\n }else console.warn(\"Missing event sended from server\");\n }\n }\n}"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../"} \ No newline at end of file +{"mappings":"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","sources":["","frontend/index.ts","frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/Peer.ts","frontend/PeerInfo.ts","frontend/WebRTC.ts","frontend/P2PFileSender.ts","node_modules/webrtc-adapter/src/js/adapter_core.js","node_modules/webrtc-adapter/src/js/adapter_factory.js","node_modules/webrtc-adapter/src/js/utils.js","node_modules/webrtc-adapter/src/js/chrome/chrome_shim.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/firefox/firefox_shim.js","node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/safari/safari_shim.js","node_modules/webrtc-adapter/src/js/common_shim.js","node_modules/sdp/sdp.js","frontend/Room.ts","frontend/RoomInfo.ts","frontend/WSTSProtocol.ts"],"sourcesContent":["(() => {\n\nfunction $parcel$export(e, n, v, s) {\n Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});\n}\n\nfunction $parcel$interopDefault(a) {\n return a && a.__esModule ? a.default : a;\n}\nclass $89634b12940c2479$export$98b66c25bb38499d {\n constructor(mwse, options){\n this.autoPair = false;\n this.connected = false;\n this.autoReconnect = true;\n this.autoReconnectTimeout = 3000;\n this.recaivePackEvent = [];\n this.activeConnectionEvent = [];\n this.passiveConnectionEvent = [];\n if (options.endpoint == \"auto\") {\n const RootURL = document.currentScript.src;\n let scriptPath = new URL(RootURL);\n let isSecurity = scriptPath.protocol == \"https:\";\n let dumeUrl = scriptPath.pathname.split('/').slice(0, -1).join('/') + '/';\n let wsSocket = new URL(dumeUrl, scriptPath);\n wsSocket.protocol = isSecurity ? 'wss:' : 'ws:';\n this.endpoint = new URL(wsSocket.href);\n } else try {\n // Testing\n this.endpoint = new URL(options.endpoint);\n } catch {\n throw new Error(\"endpoint is required\");\n }\n if (typeof options.autoReconnect == \"boolean\") this.autoReconnect = true;\n else if (options.autoReconnect) {\n this.autoReconnect = true;\n this.autoReconnectTimeout = options.autoReconnect.timeout;\n }\n }\n connect() {\n if (this.autoReconnectTimer) clearTimeout(this.autoReconnectTimer);\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n disconnect() {\n /**\n * Eğer bilinerek elle kapatıldıysa otomatik tekrar bağlanmasının\n * önüne geçmek için autoReconnect bayrağını her zaman kapalı tutmak gerekir\n */ this.autoReconnect = false;\n this.ws.close();\n }\n addWSEvents() {\n this.ws.addEventListener(\"open\", ()=>this.eventOpen());\n this.ws.addEventListener(\"close\", ()=>this.eventClose());\n this.ws.addEventListener(\"error\", ()=>this.eventError());\n this.ws.addEventListener(\"message\", ({ data: data })=>this.eventMessage(data));\n }\n eventOpen() {\n this.connected = true;\n for (const callback of this.activeConnectionEvent)callback(void 0);\n }\n eventClose() {\n for (const callback of this.passiveConnectionEvent)callback(void 0);\n this.connected = false;\n if (this.autoReconnect) this.autoReconnectTimer = setTimeout(()=>this.connect(), this.autoReconnectTimeout);\n }\n eventError() {\n this.connected = false;\n }\n onRecaivePack(func) {\n this.recaivePackEvent.push(func);\n }\n onActive(func) {\n if (this.connected) func();\n else this.activeConnectionEvent.push(func);\n }\n onPassive(func) {\n if (!this.connected) func();\n else this.passiveConnectionEvent.push(func);\n }\n eventMessage(data) {\n if (typeof data == \"string\") {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent)callback($data);\n }\n }\n tranferToServer(data) {\n if (this.connected) this.ws.send(JSON.stringify(data));\n }\n}\n\n\nclass $137f01617e9d3585$export$2e2bcd8739ae039 {\n constructor(wsts){\n this.events = new Map();\n this.signals = new Map();\n this.requests = new Map();\n this.count = 0;\n this.wsts = wsts;\n }\n request(msg) {\n return new Promise((ok, rej)=>{\n let id = ++this.count;\n this.events.set(id, [\n (data)=>{\n ok(data);\n },\n (data)=>{\n rej(data);\n }\n ]);\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n });\n }\n stream(msg, callback) {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id, [\n (data)=>{\n callback(data);\n },\n ()=>{}\n ]);\n }\n signal(event, callback) {\n let T = this.signals.get(event);\n if (!T) this.signals.set(event, [\n callback\n ]);\n else T.push(callback);\n }\n}\n\n\nclass $70ccf545b879f91e$export$2e2bcd8739ae039 {\n emit(eventName, ...args) {\n if (this.events[eventName]) for (const callback of this.events[eventName])callback(...args);\n }\n on(eventName, callback) {\n if (this.events[eventName]) this.events[eventName].push(callback);\n else this.events[eventName] = [\n callback\n ];\n }\n scope(f) {\n if (this.activeScope) f();\n else this.on('scope', f);\n }\n constructor(){\n this.events = {};\n this.activeScope = false;\n }\n}\n\n\nclass $3dbdf682ee45045f$export$cd59d3e68ede65a1 {\n constructor(mwse){\n this.mwse = mwse;\n }\n async allocAPIPAddress() {\n let { status: status, ip: ip } = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n });\n if (status == 'success') {\n this.APIPAddress = ip;\n return ip;\n } else throw new Error(\"Error Allocated Access Point IP Address\");\n }\n async allocAPNumber() {\n let { status: status, number: number } = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n });\n if (status == 'success') {\n this.APNumber = number;\n return number;\n } else throw new Error(\"Error Allocated Access Point Number\");\n }\n async allocAPShortCode() {\n let { status: status, code: code } = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n });\n if (status == 'success') {\n this.APShortCode = code;\n return code;\n } else throw new Error(\"Error Allocated Access Point Short Code\");\n }\n async reallocAPIPAddress() {\n let { status: status, ip: ip } = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n });\n if (status == 'success') {\n this.APIPAddress = ip;\n return ip;\n } else throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n async reallocAPNumber() {\n let { status: status, number: number } = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n });\n if (status == 'success') {\n this.APNumber = number;\n return number;\n } else throw new Error(\"Error Reallocated Access Point Number\");\n }\n async reallocAPShortCode() {\n let { status: status, code: code } = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n });\n if (status == 'success') {\n this.APShortCode = code;\n return code;\n } else throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n async releaseAPIPAddress() {\n let { status: status } = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n });\n if (status == 'success') this.APIPAddress = undefined;\n else throw new Error(\"Error release Access Point IP Address\");\n }\n async releaseAPNumber() {\n let { status: status } = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n });\n if (status == 'success') this.APNumber = undefined;\n else throw new Error(\"Error release Access Point Number\");\n }\n async releaseAPShortCode() {\n let { status: status } = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n });\n if (status == 'success') this.APShortCode = undefined;\n else throw new Error(\"Error release Access Point Short Code\");\n }\n async queryAPIPAddress(ip) {\n let { status: status, socket: socket } = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n });\n if (status == \"success\") return socket;\n else return null;\n }\n async queryAPNumber(number) {\n let { status: status, socket: socket } = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n });\n if (status == \"success\") return socket;\n else return null;\n }\n async queryAPShortCode(code) {\n let { status: status, socket: socket } = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n });\n if (status == \"success\") return socket;\n else return null;\n }\n}\n\n\n\nclass $36e9718861861e3d$export$f3bd5f68ae16de {\n constructor(mwse){\n this.info = {};\n this.peer = mwse;\n }\n async fetch(name) {\n if (name) {\n let rinfo = await this.peer.mwse.EventPooling.request({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name: name\n });\n if (rinfo.status == \"success\") this.info = rinfo.info;\n else console.warn(rinfo.message);\n } else {\n let rinfo = await this.peer.mwse.EventPooling.request({\n type: \"peer/info\",\n peer: this.peer.socketId\n });\n if (rinfo.status == \"success\") this.info = rinfo.info;\n else console.warn(rinfo.message);\n }\n return this.info;\n }\n set(name, value) {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name: name,\n value: value\n });\n }\n get(name) {\n return name ? this.info[name] : this.info;\n }\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 */ /* eslint-env node */ /*\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 * 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 */ /* eslint-env node */ 'use strict';\nlet $f1fc0f969f08e0a5$var$logDisabled_ = true;\nlet $f1fc0f969f08e0a5$var$deprecationWarnings_ = true;\nfunction $f1fc0f969f08e0a5$export$e3c02be309be1f23(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\nfunction $f1fc0f969f08e0a5$export$1f48841962b828b1(window1, eventNameToWrap, wrapper) {\n if (!window1.RTCPeerConnection) return;\n const proto = window1.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) return nativeAddEventListener.apply(this, arguments);\n const wrappedCallback = (e)=>{\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) cb.handleEvent(modifiedEvent);\n else cb(modifiedEvent);\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) this._eventMap[eventNameToWrap] = new Map();\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [\n nativeEventName,\n wrappedCallback\n ]);\n };\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap || !this._eventMap[eventNameToWrap]) return nativeRemoveEventListener.apply(this, arguments);\n if (!this._eventMap[eventNameToWrap].has(cb)) return nativeRemoveEventListener.apply(this, arguments);\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) delete this._eventMap[eventNameToWrap];\n if (Object.keys(this._eventMap).length === 0) delete this._eventMap;\n return nativeRemoveEventListener.apply(this, [\n 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, this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) this.addEventListener(eventNameToWrap, this['_on' + eventNameToWrap] = cb);\n },\n enumerable: true,\n configurable: true\n });\n}\nfunction $f1fc0f969f08e0a5$export$afbfee8cc06fd3e4(bool) {\n if (typeof bool !== 'boolean') return new Error('Argument type: ' + typeof bool + '. Please use a boolean.');\n $f1fc0f969f08e0a5$var$logDisabled_ = bool;\n return bool ? 'adapter.js logging disabled' : 'adapter.js logging enabled';\n}\nfunction $f1fc0f969f08e0a5$export$51516be4b019e41e(bool) {\n if (typeof bool !== 'boolean') return new Error('Argument type: ' + typeof bool + '. Please use a boolean.');\n $f1fc0f969f08e0a5$var$deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\nfunction $f1fc0f969f08e0a5$export$bef1f36f5486a6a3() {\n if (typeof window === 'object') {\n if ($f1fc0f969f08e0a5$var$logDisabled_) return;\n if (typeof console !== 'undefined' && typeof console.log === 'function') console.log.apply(console, arguments);\n }\n}\nfunction $f1fc0f969f08e0a5$export$cdd73fc4100a6ef4(oldMethod, newMethod) {\n if (!$f1fc0f969f08e0a5$var$deprecationWarnings_) return;\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod + ' instead.');\n}\nfunction $f1fc0f969f08e0a5$export$2d31490a0c05f094(window1) {\n // Returned result object.\n const result = {\n browser: null,\n version: null\n };\n // Fail early if it's not a browser\n if (typeof window1 === 'undefined' || !window1.navigator || !window1.navigator.userAgent) {\n result.browser = 'Not a browser.';\n return result;\n }\n const { navigator: navigator } = window1;\n if (navigator.mozGetUserMedia) {\n result.browser = 'firefox';\n result.version = $f1fc0f969f08e0a5$export$e3c02be309be1f23(navigator.userAgent, /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia || window1.isSecureContext === false && window1.webkitRTCPeerConnection) {\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 = $f1fc0f969f08e0a5$export$e3c02be309be1f23(navigator.userAgent, /Chrom(e|ium)\\/(\\d+)\\./, 2);\n } else if (window1.RTCPeerConnection && navigator.userAgent.match(/AppleWebKit\\/(\\d+)\\./)) {\n result.browser = 'safari';\n result.version = $f1fc0f969f08e0a5$export$e3c02be309be1f23(navigator.userAgent, /AppleWebKit\\/(\\d+)\\./, 1);\n result.supportsUnifiedPlan = window1.RTCRtpTransceiver && 'currentDirection' in window1.RTCRtpTransceiver.prototype;\n } else {\n result.browser = 'Not a supported browser.';\n return result;\n }\n return result;\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 */ function $f1fc0f969f08e0a5$var$isObject(val) {\n return Object.prototype.toString.call(val) === '[object Object]';\n}\nfunction $f1fc0f969f08e0a5$export$15384eac40dc88c8(data) {\n if (!$f1fc0f969f08e0a5$var$isObject(data)) return data;\n return Object.keys(data).reduce(function(accumulator, key) {\n const isObj = $f1fc0f969f08e0a5$var$isObject(data[key]);\n const value = isObj ? $f1fc0f969f08e0a5$export$15384eac40dc88c8(data[key]) : data[key];\n const isEmptyObject = isObj && !Object.keys(value).length;\n if (value === undefined || isEmptyObject) return accumulator;\n return Object.assign(accumulator, {\n [key]: value\n });\n }, {});\n}\nfunction $f1fc0f969f08e0a5$export$571b373e75babb58(stats, base, resultSet) {\n if (!base || resultSet.has(base.id)) return;\n resultSet.set(base.id, base);\n Object.keys(base).forEach((name)=>{\n if (name.endsWith('Id')) $f1fc0f969f08e0a5$export$571b373e75babb58(stats, stats.get(base[name]), resultSet);\n else if (name.endsWith('Ids')) base[name].forEach((id)=>{\n $f1fc0f969f08e0a5$export$571b373e75babb58(stats, stats.get(id), resultSet);\n });\n });\n}\nfunction $f1fc0f969f08e0a5$export$93439ffc3f787d51(result, track, outbound) {\n const streamStatsType = outbound ? 'outbound-rtp' : 'inbound-rtp';\n const filteredResult = new Map();\n if (track === null) return filteredResult;\n const trackStats = [];\n result.forEach((value)=>{\n if (value.type === 'track' && value.trackIdentifier === track.id) trackStats.push(value);\n });\n trackStats.forEach((trackStat)=>{\n result.forEach((stats)=>{\n if (stats.type === streamStatsType && stats.trackId === trackStat.id) $f1fc0f969f08e0a5$export$571b373e75babb58(result, stats, filteredResult);\n });\n });\n return filteredResult;\n}\n\n\nvar $b81887c760799f2b$exports = {};\n\n$parcel$export($b81887c760799f2b$exports, \"shimMediaStream\", () => $b81887c760799f2b$export$33ee24e7a300bcd1);\n$parcel$export($b81887c760799f2b$exports, \"shimOnTrack\", () => $b81887c760799f2b$export$f358708f68ab068);\n$parcel$export($b81887c760799f2b$exports, \"shimGetSendersWithDtmf\", () => $b81887c760799f2b$export$a41a030a2842f5d6);\n$parcel$export($b81887c760799f2b$exports, \"shimGetStats\", () => $b81887c760799f2b$export$90608323826f0b17);\n$parcel$export($b81887c760799f2b$exports, \"shimSenderReceiverGetStats\", () => $b81887c760799f2b$export$f2f0f2338114eb4b);\n$parcel$export($b81887c760799f2b$exports, \"shimAddTrackRemoveTrackWithNative\", () => $b81887c760799f2b$export$30e3cdd46f8d5100);\n$parcel$export($b81887c760799f2b$exports, \"shimAddTrackRemoveTrack\", () => $b81887c760799f2b$export$9588259fcf4ebc91);\n$parcel$export($b81887c760799f2b$exports, \"shimPeerConnection\", () => $b81887c760799f2b$export$852a08dda9a55ea7);\n$parcel$export($b81887c760799f2b$exports, \"fixNegotiationNeeded\", () => $b81887c760799f2b$export$341293bbeaae37cb);\n$parcel$export($b81887c760799f2b$exports, \"shimGetUserMedia\", () => $7ae9c98c8b3d2b05$export$1ed4910f4d37dc5e);\n$parcel$export($b81887c760799f2b$exports, \"shimGetDisplayMedia\", () => $53bd260b9a4e0e97$export$97270b87351d9c04);\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 */ /* eslint-env node */ \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 */ /* eslint-env node */ \n'use strict';\nconst $7ae9c98c8b3d2b05$var$logging = $f1fc0f969f08e0a5$export$bef1f36f5486a6a3;\nfunction $7ae9c98c8b3d2b05$export$1ed4910f4d37dc5e(window, browserDetails) {\n const navigator = window && window.navigator;\n if (!navigator.mediaDevices) return;\n const constraintsToChrome_ = function(c) {\n if (typeof c !== 'object' || c.mandatory || c.optional) return c;\n const cc = {};\n Object.keys(c).forEach((key)=>{\n if (key === 'require' || key === 'advanced' || key === 'mediaSource') return;\n const r = typeof c[key] === 'object' ? c[key] : {\n ideal: c[key]\n };\n if (r.exact !== undefined && typeof r.exact === 'number') r.min = r.max = r.exact;\n const oldname_ = function(prefix, name) {\n if (prefix) return prefix + name.charAt(0).toUpperCase() + name.slice(1);\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',\n 'max'\n ].forEach((mix)=>{\n if (r[mix] !== undefined) {\n cc.mandatory = cc.mandatory || {};\n cc.mandatory[oldname_(mix, key)] = r[mix];\n }\n });\n });\n if (c.advanced) cc.optional = (cc.optional || []).concat(c.advanced);\n return cc;\n };\n const shimConstraints_ = function(constraints, func) {\n if (browserDetails.version >= 61) return func(constraints);\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 : {\n ideal: face\n });\n const getSupportedFacingModeLies = browserDetails.version < 66;\n if (face && (face.exact === 'user' || face.exact === 'environment' || face.ideal === 'user' || face.ideal === 'environment') && !(navigator.mediaDevices.getSupportedConstraints && navigator.mediaDevices.getSupportedConstraints().facingMode && !getSupportedFacingModeLies)) {\n delete constraints.video.facingMode;\n let matches;\n if (face.exact === 'environment' || face.ideal === 'environment') matches = [\n 'back',\n 'rear'\n ];\n else if (face.exact === 'user' || face.ideal === 'user') matches = [\n 'front'\n ];\n if (matches) // Look for matches in label, or use last cam for back (typical).\n return navigator.mediaDevices.enumerateDevices().then((devices)=>{\n devices = devices.filter((d)=>d.kind === 'videoinput');\n let dev = devices.find((d)=>matches.some((match)=>d.label.toLowerCase().includes(match)));\n if (!dev && devices.length && matches.includes('back')) dev = devices[devices.length - 1]; // more likely the back cam\n if (dev) constraints.video.deviceId = face.exact ? {\n exact: dev.deviceId\n } : {\n ideal: dev.deviceId\n };\n constraints.video = constraintsToChrome_(constraints.video);\n $7ae9c98c8b3d2b05$var$logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n });\n }\n constraints.video = constraintsToChrome_(constraints.video);\n }\n $7ae9c98c8b3d2b05$var$logging('chrome: ' + JSON.stringify(constraints));\n return func(constraints);\n };\n const shimError_ = function(e) {\n if (browserDetails.version >= 64) return e;\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 const getUserMedia_ = function(constraints, onSuccess, onError) {\n shimConstraints_(constraints, (c)=>{\n navigator.webkitGetUserMedia(c, onSuccess, (e)=>{\n if (onError) onError(shimError_(e));\n });\n });\n };\n navigator.getUserMedia = getUserMedia_.bind(navigator);\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.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 || 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\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 */ /* eslint-env node */ 'use strict';\nfunction $53bd260b9a4e0e97$export$97270b87351d9c04(window, getSourceId) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) return;\n if (!window.navigator.mediaDevices) return;\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 a function\");\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n return getSourceId(constraints).then((sourceId)=>{\n const widthSpecified = constraints.video && constraints.video.width;\n const heightSpecified = constraints.video && constraints.video.height;\n const frameRateSpecified = constraints.video && constraints.video.frameRate;\n constraints.video = {\n mandatory: {\n chromeMediaSource: 'desktop',\n chromeMediaSourceId: sourceId,\n maxFrameRate: frameRateSpecified || 3\n }\n };\n if (widthSpecified) constraints.video.mandatory.maxWidth = widthSpecified;\n if (heightSpecified) constraints.video.mandatory.maxHeight = heightSpecified;\n return window.navigator.mediaDevices.getUserMedia(constraints);\n });\n };\n}\n\n\n'use strict';\nfunction $b81887c760799f2b$export$33ee24e7a300bcd1(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\nfunction $b81887c760799f2b$export$f358708f68ab068(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get () {\n return this._ontrack;\n },\n set (f) {\n if (this._ontrack) this.removeEventListener('track', this._ontrack);\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = 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) receiver = this.getReceivers().find((r)=>r.track && r.track.id === te.track.id);\n else receiver = {\n track: te.track\n };\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {\n receiver: receiver\n };\n event.streams = [\n e.stream\n ];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach((track)=>{\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) receiver = this.getReceivers().find((r)=>r.track && r.track.id === track.id);\n else receiver = {\n track: track\n };\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {\n receiver: receiver\n };\n event.streams = [\n e.stream\n ];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else // 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 $f1fc0f969f08e0a5$export$1f48841962b828b1(window, 'track', (e)=>{\n if (!e.transceiver) Object.defineProperty(e, 'transceiver', {\n value: {\n receiver: e.receiver\n }\n });\n return e;\n });\n}\nfunction $b81887c760799f2b$export$a41a030a2842f5d6(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection && !('getSenders' in window.RTCPeerConnection.prototype) && 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track: track,\n get dtmf () {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') this._dtmf = pc.createDTMFSender(track);\n else this._dtmf = null;\n }\n return this._dtmf;\n },\n _pc: pc\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 = 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 const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) this._senders.splice(idx, 1);\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, [\n stream\n ]);\n stream.getTracks().forEach((track)=>{\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [\n stream\n ]);\n stream.getTracks().forEach((track)=>{\n const sender = this._senders.find((s)=>s.track === track);\n if (sender) this._senders.splice(this._senders.indexOf(sender), 1);\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection && 'getSenders' in window.RTCPeerConnection.prototype && 'createDTMFSender' in window.RTCPeerConnection.prototype && window.RTCRtpSender && !('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 Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get () {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') this._dtmf = this._pc.createDTMFSender(this.track);\n else this._dtmf = null;\n }\n return this._dtmf;\n }\n });\n }\n}\nfunction $b81887c760799f2b$export$90608323826f0b17(window) {\n if (!window.RTCPeerConnection) return;\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\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') return origGetStats.apply(this, arguments);\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 || typeof selector !== 'function')) return origGetStats.apply(this, []);\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 return standardReport;\n };\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map((key)=>[\n key,\n stats[key]\n ]));\n };\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n return origGetStats.apply(this, [\n 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 },\n reject\n ]);\n }).then(onSucc, onErr);\n };\n}\nfunction $b81887c760799f2b$export$f2f0f2338114eb4b(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender && window.RTCRtpReceiver)) return;\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach((sender)=>sender._pc = this);\n return senders;\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then((result)=>/* 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 */ $f1fc0f969f08e0a5$export$93439ffc3f787d51(result, sender.track, true));\n };\n }\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach((receiver)=>receiver._pc = this);\n return receivers;\n };\n $f1fc0f969f08e0a5$export$1f48841962b828b1(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)=>$f1fc0f969f08e0a5$export$93439ffc3f787d51(result, receiver.track, false));\n };\n }\n if (!('getStats' in window.RTCRtpSender.prototype && 'getStats' in window.RTCRtpReceiver.prototype)) return;\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 && 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) err = true;\n else sender = s;\n }\n });\n this.getReceivers().forEach((r)=>{\n if (r.track === track) {\n if (receiver) err = true;\n else receiver = r;\n }\n return r.track === track;\n });\n if (err || sender && receiver) return Promise.reject(new DOMException('There are more than one sender or receiver for the track.', 'InvalidAccessError'));\n else if (sender) return sender.getStats();\n else if (receiver) return receiver.getStats();\n return Promise.reject(new DOMException('There is no sender or receiver for the track.', 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\nfunction $b81887c760799f2b$export$30e3cdd46f8d5100(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 = function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams).map((streamId)=>this._shimmedLocalStreams[streamId][0]);\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n if (!stream) return origAddTrack.apply(this, arguments);\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) this._shimmedLocalStreams[stream.id] = [\n stream,\n sender\n ];\n else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) this._shimmedLocalStreams[stream.id].push(sender);\n return sender;\n };\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n stream.getTracks().forEach((track)=>{\n const alreadyExists = this.getSenders().find((s)=>s.track === track);\n if (alreadyExists) throw new DOMException('Track already exists.', 'InvalidAccessError');\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders().filter((newSender)=>existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [\n stream\n ].concat(newSenders);\n };\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) Object.keys(this._shimmedLocalStreams).forEach((streamId)=>{\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) this._shimmedLocalStreams[streamId].splice(idx, 1);\n if (this._shimmedLocalStreams[streamId].length === 1) delete this._shimmedLocalStreams[streamId];\n });\n return origRemoveTrack.apply(this, arguments);\n };\n}\nfunction $b81887c760799f2b$export$9588259fcf4ebc91(window, browserDetails) {\n if (!window.RTCPeerConnection) return;\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack && browserDetails.version >= 65) return $b81887c760799f2b$export$30e3cdd46f8d5100(window);\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype.getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map((stream)=>this._reverseStreams[stream.id]);\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 stream.getTracks().forEach((track)=>{\n const alreadyExists = this.getSenders().find((s)=>s.track === track);\n if (alreadyExists) throw new DOMException('Track already exists.', 'InvalidAccessError');\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, [\n stream\n ]);\n };\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n origRemoveStream.apply(this, [\n this._streams[stream.id] || stream\n ]);\n delete this._reverseStreams[this._streams[stream.id] ? this._streams[stream.id].id : stream.id];\n delete this._streams[stream.id];\n };\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, stream) {\n if (this.signalingState === 'closed') throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 || !streams[0].getTracks().find((t)=>t === track)) // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\"The adapter.js addTrack polyfill only supports a single stream which is associated with the specified track.\", 'NotSupportedError');\n const alreadyExists = this.getSenders().find((s)=>s.track === track);\n if (alreadyExists) throw new DOMException('Track already exists.', 'InvalidAccessError');\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 // Trigger ONN async.\n Promise.resolve().then(()=>{\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([\n track\n ]);\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 // 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'), externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: 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'), internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp: sdp\n });\n }\n [\n 'createOffer',\n 'createAnswer'\n ].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {\n [method] () {\n const args = arguments;\n const isLegacyCall = arguments.length && typeof arguments[0] === 'function';\n if (isLegacyCall) return nativeMethod.apply(this, [\n (description)=>{\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [\n desc\n ]);\n },\n (err)=>{\n if (args[1]) args[1].apply(null, err);\n },\n arguments[2]\n ]);\n return nativeMethod.apply(this, arguments).then((description)=>replaceInternalStreamId(this, description));\n }\n };\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n const origSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) return origSetLocalDescription.apply(this, arguments);\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n const origLocalDescription = Object.getOwnPropertyDescriptor(window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype, 'localDescription', {\n get () {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') return description;\n return replaceInternalStreamId(this, description);\n }\n });\n window.RTCPeerConnection.prototype.removeTrack = function removeTrack(sender) {\n if (this.signalingState === 'closed') throw new DOMException('The RTCPeerConnection\\'s signalingState is \\'closed\\'.', 'InvalidStateError');\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) throw new DOMException(\"Argument 1 of RTCPeerConnection.removeTrack does not implement interface RTCRtpSender.\", 'TypeError');\n const isLocal = sender._pc === this;\n if (!isLocal) throw new DOMException('Sender was not created by this connection.', 'InvalidAccessError');\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().find((track)=>sender.track === track);\n if (hasTrack) stream = this._streams[streamid];\n });\n if (stream) {\n if (stream.getTracks().length === 1) // 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 // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\nfunction $b81887c760799f2b$export$852a08dda9a55ea7(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n if (!window.RTCPeerConnection) return;\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) [\n 'setLocalDescription',\n 'setRemoteDescription',\n 'addIceCandidate'\n ].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {\n [method] () {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }\n };\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n}\nfunction $b81887c760799f2b$export$341293bbeaae37cb(window, browserDetails) {\n $f1fc0f969f08e0a5$export$1f48841962b828b1(window, 'negotiationneeded', (e)=>{\n const pc = e.target;\n if (browserDetails.version < 72 || pc.getConfiguration && pc.getConfiguration().sdpSemantics === 'plan-b') {\n if (pc.signalingState !== 'stable') return;\n }\n return e;\n });\n}\n\n\nvar $f6b001001df34b3c$exports = {};\n\n$parcel$export($f6b001001df34b3c$exports, \"shimOnTrack\", () => $f6b001001df34b3c$export$f358708f68ab068);\n$parcel$export($f6b001001df34b3c$exports, \"shimPeerConnection\", () => $f6b001001df34b3c$export$852a08dda9a55ea7);\n$parcel$export($f6b001001df34b3c$exports, \"shimSenderGetStats\", () => $f6b001001df34b3c$export$f0525502095c04ef);\n$parcel$export($f6b001001df34b3c$exports, \"shimReceiverGetStats\", () => $f6b001001df34b3c$export$83d69126527b1171);\n$parcel$export($f6b001001df34b3c$exports, \"shimRemoveStream\", () => $f6b001001df34b3c$export$825e523ef749bd8c);\n$parcel$export($f6b001001df34b3c$exports, \"shimRTCDataChannel\", () => $f6b001001df34b3c$export$ff9cb3bc8990e8f7);\n$parcel$export($f6b001001df34b3c$exports, \"shimAddTransceiver\", () => $f6b001001df34b3c$export$70c77533b6e9908d);\n$parcel$export($f6b001001df34b3c$exports, \"shimGetParameters\", () => $f6b001001df34b3c$export$66238223c298fbaa);\n$parcel$export($f6b001001df34b3c$exports, \"shimCreateOffer\", () => $f6b001001df34b3c$export$51beccf0e777b843);\n$parcel$export($f6b001001df34b3c$exports, \"shimCreateAnswer\", () => $f6b001001df34b3c$export$df0b46e7cef08150);\n$parcel$export($f6b001001df34b3c$exports, \"shimGetUserMedia\", () => $7485531577b71cb2$export$1ed4910f4d37dc5e);\n$parcel$export($f6b001001df34b3c$exports, \"shimGetDisplayMedia\", () => $1fbd4e8cb7c073b7$export$97270b87351d9c04);\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 */ /* eslint-env node */ \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 */ /* eslint-env node */ \n'use strict';\nfunction $7485531577b71cb2$export$1ed4910f4d37dc5e(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n $f1fc0f969f08e0a5$export$cdd73fc4100a6ef4('navigator.getUserMedia', 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n if (!(browserDetails.version > 55 && '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 const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.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 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 if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints = 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, [\n c\n ]);\n };\n }\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 */ /* eslint-env node */ 'use strict';\nfunction $1fbd4e8cb7c073b7$export$97270b87351d9c04(window, preferredMediaSource) {\n if (window.navigator.mediaDevices && 'getDisplayMedia' in window.navigator.mediaDevices) return;\n if (!window.navigator.mediaDevices) return;\n window.navigator.mediaDevices.getDisplayMedia = function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException(\"getDisplayMedia without video 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) constraints.video = {\n mediaSource: preferredMediaSource\n };\n else constraints.video.mediaSource = preferredMediaSource;\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n\n\n'use strict';\nfunction $f6b001001df34b3c$export$f358708f68ab068(window) {\n if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get () {\n return {\n receiver: this.receiver\n };\n }\n });\n}\nfunction $f6b001001df34b3c$export$852a08dda9a55ea7(window, browserDetails) {\n if (typeof window !== 'object' || !(window.RTCPeerConnection || window.mozRTCPeerConnection)) return; // probably media.peerconnection.enabled=false in about:config\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n if (browserDetails.version < 53) // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n [\n 'setLocalDescription',\n 'setRemoteDescription',\n 'addIceCandidate'\n ].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {\n [method] () {\n arguments[0] = new (method === 'addIceCandidate' ? window.RTCIceCandidate : window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }\n };\n window.RTCPeerConnection.prototype[method] = methodObj[method];\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 const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [\n selector || null\n ]).then((stats)=>{\n if (browserDetails.version < 53 && !onSucc) // 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') throw e;\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 return stats;\n }).then(onSucc, onErr);\n };\n}\nfunction $f6b001001df34b3c$export$f0525502095c04ef(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) return;\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) return;\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach((sender)=>sender._pc = this);\n return senders;\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) : Promise.resolve(new Map());\n };\n}\nfunction $f6b001001df34b3c$export$83d69126527b1171(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection && window.RTCRtpSender)) return;\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) return;\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach((receiver)=>receiver._pc = this);\n return receivers;\n };\n $f1fc0f969f08e0a5$export$1f48841962b828b1(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}\nfunction $f6b001001df34b3c$export$825e523ef749bd8c(window) {\n if (!window.RTCPeerConnection || 'removeStream' in window.RTCPeerConnection.prototype) return;\n window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n $f1fc0f969f08e0a5$export$cdd73fc4100a6ef4('removeStream', 'removeTrack');\n this.getSenders().forEach((sender)=>{\n if (sender.track && stream.getTracks().includes(sender.track)) this.removeTrack(sender);\n });\n };\n}\nfunction $f6b001001df34b3c$export$ff9cb3bc8990e8f7(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) window.RTCDataChannel = window.DataChannel;\n}\nfunction $f6b001001df34b3c$export$70c77533b6e9908d(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)) return;\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) window.RTCPeerConnection.prototype.addTransceiver = function addTransceiver() {\n this.setParametersPromises = [];\n // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) sendEncodings = [];\n sendEncodings = [\n ...sendEncodings\n ];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) // If sendEncodings params are provided, validate grammar\n sendEncodings.forEach((encodingParam)=>{\n if ('rid' in encodingParam) {\n const ridRegex = /^[a-z0-9]{0,16}$/i;\n if (!ridRegex.test(encodingParam.rid)) throw new TypeError('Invalid RID value provided.');\n }\n if ('scaleResolutionDownBy' in encodingParam) {\n if (!(parseFloat(encodingParam.scaleResolutionDownBy) >= 1.0)) throw new RangeError('scale_resolution_down_by must be >= 1.0');\n }\n if ('maxFramerate' in encodingParam) {\n if (!(parseFloat(encodingParam.maxFramerate) >= 0)) throw new RangeError('max_framerate must be >= 0.0');\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: sender } = transceiver;\n const params = sender.getParameters();\n if (!('encodings' in params) || // Avoid being fooled by patched getParameters() below.\n params.encodings.length === 1 && Object.keys(params.encodings[0]).length === 0) {\n params.encodings = sendEncodings;\n sender.sendEncodings = sendEncodings;\n this.setParametersPromises.push(sender.setParameters(params).then(()=>{\n delete sender.sendEncodings;\n }).catch(()=>{\n delete sender.sendEncodings;\n }));\n }\n }\n return transceiver;\n };\n}\nfunction $f6b001001df34b3c$export$66238223c298fbaa(window) {\n if (!(typeof window === 'object' && window.RTCRtpSender)) return;\n const origGetParameters = window.RTCRtpSender.prototype.getParameters;\n if (origGetParameters) window.RTCRtpSender.prototype.getParameters = function getParameters() {\n const params = origGetParameters.apply(this, arguments);\n if (!('encodings' in params)) params.encodings = [].concat(this.sendEncodings || [\n {}\n ]);\n return params;\n };\n}\nfunction $f6b001001df34b3c$export$51beccf0e777b843(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)) return;\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer() {\n if (this.setParametersPromises && this.setParametersPromises.length) return Promise.all(this.setParametersPromises).then(()=>{\n return origCreateOffer.apply(this, arguments);\n }).finally(()=>{\n this.setParametersPromises = [];\n });\n return origCreateOffer.apply(this, arguments);\n };\n}\nfunction $f6b001001df34b3c$export$df0b46e7cef08150(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)) return;\n const origCreateAnswer = window.RTCPeerConnection.prototype.createAnswer;\n window.RTCPeerConnection.prototype.createAnswer = function createAnswer() {\n if (this.setParametersPromises && this.setParametersPromises.length) return Promise.all(this.setParametersPromises).then(()=>{\n return origCreateAnswer.apply(this, arguments);\n }).finally(()=>{\n this.setParametersPromises = [];\n });\n return origCreateAnswer.apply(this, arguments);\n };\n}\n\n\nvar $0b1ec2baf876c0f5$exports = {};\n\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimLocalStreamsAPI\", () => $0b1ec2baf876c0f5$export$8df41282f4fdcea2);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimRemoteStreamsAPI\", () => $0b1ec2baf876c0f5$export$762aa4cbb4f2f857);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimCallbacksAPI\", () => $0b1ec2baf876c0f5$export$da31df245debdd3);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimGetUserMedia\", () => $0b1ec2baf876c0f5$export$1ed4910f4d37dc5e);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimConstraints\", () => $0b1ec2baf876c0f5$export$494a01ac68ba81ac);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimRTCIceServerUrls\", () => $0b1ec2baf876c0f5$export$671a8b47b41b6f41);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimTrackEventTransceiver\", () => $0b1ec2baf876c0f5$export$85d53da088cb1b14);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimCreateOfferLegacy\", () => $0b1ec2baf876c0f5$export$d444266503fdd2d4);\n$parcel$export($0b1ec2baf876c0f5$exports, \"shimAudioContext\", () => $0b1ec2baf876c0f5$export$857cd739a7b795d2);\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';\nfunction $0b1ec2baf876c0f5$export$8df41282f4fdcea2(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) return;\n if (!('getLocalStreams' in window.RTCPeerConnection.prototype)) window.RTCPeerConnection.prototype.getLocalStreams = function getLocalStreams() {\n if (!this._localStreams) this._localStreams = [];\n return this._localStreams;\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) this._localStreams = [];\n if (!this._localStreams.includes(stream)) this._localStreams.push(stream);\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, stream));\n stream.getVideoTracks().forEach((track)=>_addTrack.call(this, track, stream));\n };\n window.RTCPeerConnection.prototype.addTrack = function addTrack(track, ...streams) {\n if (streams) streams.forEach((stream)=>{\n if (!this._localStreams) this._localStreams = [\n stream\n ];\n else if (!this._localStreams.includes(stream)) this._localStreams.push(stream);\n });\n return _addTrack.apply(this, arguments);\n };\n }\n if (!('removeStream' in window.RTCPeerConnection.prototype)) window.RTCPeerConnection.prototype.removeStream = function removeStream(stream) {\n if (!this._localStreams) this._localStreams = [];\n const index = this._localStreams.indexOf(stream);\n if (index === -1) return;\n this._localStreams.splice(index, 1);\n const tracks = stream.getTracks();\n this.getSenders().forEach((sender)=>{\n if (tracks.includes(sender.track)) this.removeTrack(sender);\n });\n };\n}\nfunction $0b1ec2baf876c0f5$export$762aa4cbb4f2f857(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) return;\n if (!('getRemoteStreams' in window.RTCPeerConnection.prototype)) window.RTCPeerConnection.prototype.getRemoteStreams = function getRemoteStreams() {\n return this._remoteStreams ? this._remoteStreams : [];\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) this._remoteStreams = [];\n if (this._remoteStreams.includes(stream)) return;\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 = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = function setRemoteDescription() {\n const pc = this;\n if (!this._onaddstreampoly) this.addEventListener('track', this._onaddstreampoly = function(e) {\n e.streams.forEach((stream)=>{\n if (!pc._remoteStreams) pc._remoteStreams = [];\n if (pc._remoteStreams.indexOf(stream) >= 0) return;\n pc._remoteStreams.push(stream);\n const event = new Event('addstream');\n event.stream = stream;\n pc.dispatchEvent(event);\n });\n });\n return origSetRemoteDescription.apply(pc, arguments);\n };\n }\n}\nfunction $0b1ec2baf876c0f5$export$da31df245debdd3(window) {\n if (typeof window !== 'object' || !window.RTCPeerConnection) return;\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 prototype.createOffer = function createOffer(successCallback, failureCallback) {\n const options = arguments.length >= 2 ? arguments[2] : arguments[0];\n const promise = origCreateOffer.apply(this, [\n options\n ]);\n if (!failureCallback) return promise;\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.createAnswer = function createAnswer(successCallback, failureCallback) {\n const options = arguments.length >= 2 ? arguments[2] : arguments[0];\n const promise = origCreateAnswer.apply(this, [\n options\n ]);\n if (!failureCallback) return promise;\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n let withCallback = function(description, successCallback, failureCallback) {\n const promise = setLocalDescription.apply(this, [\n description\n ]);\n if (!failureCallback) return promise;\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setLocalDescription = withCallback;\n withCallback = function(description, successCallback, failureCallback) {\n const promise = setRemoteDescription.apply(this, [\n description\n ]);\n if (!failureCallback) return promise;\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.setRemoteDescription = withCallback;\n withCallback = function(candidate, successCallback, failureCallback) {\n const promise = addIceCandidate.apply(this, [\n candidate\n ]);\n if (!failureCallback) return promise;\n promise.then(successCallback, failureCallback);\n return Promise.resolve();\n };\n prototype.addIceCandidate = withCallback;\n}\nfunction $0b1ec2baf876c0f5$export$1ed4910f4d37dc5e(window) {\n const navigator = window && window.navigator;\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($0b1ec2baf876c0f5$export$494a01ac68ba81ac(constraints));\n };\n }\n if (!navigator.getUserMedia && navigator.mediaDevices && navigator.mediaDevices.getUserMedia) navigator.getUserMedia = (function getUserMedia(constraints, cb, errcb) {\n navigator.mediaDevices.getUserMedia(constraints).then(cb, errcb);\n }).bind(navigator);\n}\nfunction $0b1ec2baf876c0f5$export$494a01ac68ba81ac(constraints) {\n if (constraints && constraints.video !== undefined) return Object.assign({}, constraints, {\n video: $f1fc0f969f08e0a5$export$15384eac40dc88c8(constraints.video)\n });\n return constraints;\n}\nfunction $0b1ec2baf876c0f5$export$671a8b47b41b6f41(window) {\n if (!window.RTCPeerConnection) return;\n // migrate from non-spec RTCIceServer.url to RTCIceServer.urls\n const OrigPeerConnection = window.RTCPeerConnection;\n window.RTCPeerConnection = 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.urls === undefined && server.url) {\n $f1fc0f969f08e0a5$export$cdd73fc4100a6ef4('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 newIceServers.push(pcConfig.iceServers[i]);\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) Object.defineProperty(window.RTCPeerConnection, 'generateCertificate', {\n get () {\n return OrigPeerConnection.generateCertificate;\n }\n });\n}\nfunction $0b1ec2baf876c0f5$export$85d53da088cb1b14(window) {\n // Add event.transceiver member over deprecated event.receiver\n if (typeof window === 'object' && window.RTCTrackEvent && 'receiver' in window.RTCTrackEvent.prototype && !('transceiver' in window.RTCTrackEvent.prototype)) Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get () {\n return {\n receiver: this.receiver\n };\n }\n });\n}\nfunction $0b1ec2baf876c0f5$export$d444266503fdd2d4(window) {\n const origCreateOffer = window.RTCPeerConnection.prototype.createOffer;\n window.RTCPeerConnection.prototype.createOffer = function createOffer(offerOptions) {\n if (offerOptions) {\n if (typeof offerOptions.offerToReceiveAudio !== 'undefined') // support bit values\n offerOptions.offerToReceiveAudio = !!offerOptions.offerToReceiveAudio;\n const audioTransceiver = this.getTransceivers().find((transceiver)=>transceiver.receiver.track.kind === 'audio');\n if (offerOptions.offerToReceiveAudio === false && audioTransceiver) {\n if (audioTransceiver.direction === 'sendrecv') {\n if (audioTransceiver.setDirection) audioTransceiver.setDirection('sendonly');\n else audioTransceiver.direction = 'sendonly';\n } else if (audioTransceiver.direction === 'recvonly') {\n if (audioTransceiver.setDirection) audioTransceiver.setDirection('inactive');\n else audioTransceiver.direction = 'inactive';\n }\n } else if (offerOptions.offerToReceiveAudio === true && !audioTransceiver) this.addTransceiver('audio', {\n direction: 'recvonly'\n });\n if (typeof offerOptions.offerToReceiveVideo !== 'undefined') // support bit values\n offerOptions.offerToReceiveVideo = !!offerOptions.offerToReceiveVideo;\n const videoTransceiver = this.getTransceivers().find((transceiver)=>transceiver.receiver.track.kind === 'video');\n if (offerOptions.offerToReceiveVideo === false && videoTransceiver) {\n if (videoTransceiver.direction === 'sendrecv') {\n if (videoTransceiver.setDirection) videoTransceiver.setDirection('sendonly');\n else videoTransceiver.direction = 'sendonly';\n } else if (videoTransceiver.direction === 'recvonly') {\n if (videoTransceiver.setDirection) videoTransceiver.setDirection('inactive');\n else videoTransceiver.direction = 'inactive';\n }\n } else if (offerOptions.offerToReceiveVideo === true && !videoTransceiver) this.addTransceiver('video', {\n direction: 'recvonly'\n });\n }\n return origCreateOffer.apply(this, arguments);\n };\n}\nfunction $0b1ec2baf876c0f5$export$857cd739a7b795d2(window) {\n if (typeof window !== 'object' || window.AudioContext) return;\n window.AudioContext = window.webkitAudioContext;\n}\n\n\nvar $af8eb266204bc7d1$exports = {};\n\n$parcel$export($af8eb266204bc7d1$exports, \"shimRTCIceCandidate\", () => $af8eb266204bc7d1$export$cf133661e444ccfe);\n$parcel$export($af8eb266204bc7d1$exports, \"shimRTCIceCandidateRelayProtocol\", () => $af8eb266204bc7d1$export$fdafb8d8280e29b5);\n$parcel$export($af8eb266204bc7d1$exports, \"shimMaxMessageSize\", () => $af8eb266204bc7d1$export$a99147c78a56edc4);\n$parcel$export($af8eb266204bc7d1$exports, \"shimSendThrowTypeError\", () => $af8eb266204bc7d1$export$d461c8d5c5db5da7);\n$parcel$export($af8eb266204bc7d1$exports, \"shimConnectionState\", () => $af8eb266204bc7d1$export$63bb816cc75460);\n$parcel$export($af8eb266204bc7d1$exports, \"removeExtmapAllowMixed\", () => $af8eb266204bc7d1$export$a57d114344295149);\n$parcel$export($af8eb266204bc7d1$exports, \"shimAddIceCandidateNullOrEmpty\", () => $af8eb266204bc7d1$export$51d5e40b48c771c7);\n$parcel$export($af8eb266204bc7d1$exports, \"shimParameterlessSetLocalDescription\", () => $af8eb266204bc7d1$export$7170d04e59f9d553);\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 */ /* eslint-env node */ var $4b27a37b96dfd7f6$exports = {};\n/* eslint-env node */ 'use strict';\n// SDP helpers.\nconst $4b27a37b96dfd7f6$var$SDPUtils = {};\n// Generate an alphanumeric identifier for cname or mids.\n// TODO: use UUIDs instead? https://gist.github.com/jed/982883\n$4b27a37b96dfd7f6$var$SDPUtils.generateIdentifier = function() {\n return Math.random().toString(36).substring(2, 12);\n};\n// The RTCP CNAME used by all peerconnections from the same JS.\n$4b27a37b96dfd7f6$var$SDPUtils.localCName = $4b27a37b96dfd7f6$var$SDPUtils.generateIdentifier();\n// Splits SDP into lines, dealing with both CRLF and LF.\n$4b27a37b96dfd7f6$var$SDPUtils.splitLines = function(blob) {\n return blob.trim().split('\\n').map((line)=>line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\n$4b27a37b96dfd7f6$var$SDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index)=>(index > 0 ? 'm=' + part : part).trim() + '\\r\\n');\n};\n// Returns the session description.\n$4b27a37b96dfd7f6$var$SDPUtils.getDescription = function(blob) {\n const sections = $4b27a37b96dfd7f6$var$SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n// Returns the individual media sections.\n$4b27a37b96dfd7f6$var$SDPUtils.getMediaSections = function(blob) {\n const sections = $4b27a37b96dfd7f6$var$SDPUtils.splitSections(blob);\n sections.shift();\n return sections;\n};\n// Returns lines that start with a certain prefix.\n$4b27a37b96dfd7f6$var$SDPUtils.matchPrefix = function(blob, prefix) {\n return $4b27a37b96dfd7f6$var$SDPUtils.splitLines(blob).filter((line)=>line.indexOf(prefix) === 0);\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\"\n// Input can be prefixed with a=.\n$4b27a37b96dfd7f6$var$SDPUtils.parseCandidate = function(line) {\n let parts;\n // Parse both variants.\n if (line.indexOf('a=candidate:') === 0) parts = line.substring(12).split(' ');\n else parts = line.substring(10).split(' ');\n const candidate = {\n foundation: parts[0],\n component: {\n 1: 'rtp',\n 2: 'rtcp'\n }[parts[1]] || parts[1],\n protocol: parts[2].toLowerCase(),\n priority: parseInt(parts[3], 10),\n ip: parts[4],\n address: parts[4],\n port: parseInt(parts[5], 10),\n // skip parts[6] == 'typ'\n type: parts[7]\n };\n for(let i = 8; i < parts.length; i += 2)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 compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default:\n if (candidate[parts[i]] === undefined) candidate[parts[i]] = parts[i + 1];\n break;\n }\n return candidate;\n};\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\n$4b27a37b96dfd7f6$var$SDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n const component = candidate.component;\n if (component === 'rtp') sdp.push(1);\n else if (component === 'rtcp') sdp.push(2);\n else sdp.push(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 const type = candidate.type;\n sdp.push('typ');\n sdp.push(type);\n if (type !== 'host' && candidate.relatedAddress && 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// Parses an ice-options line, returns an array of option tags.\n// Sample input:\n// a=ice-options:foo bar\n$4b27a37b96dfd7f6$var$SDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\n$4b27a37b96dfd7f6$var$SDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const parsed = {\n payloadType: parseInt(parts.shift(), 10)\n };\n parts = parts[0].split('/');\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// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\n$4b27a37b96dfd7f6$var$SDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) pt = codec.preferredPayloadType;\n const channels = codec.channels || codec.numChannels || 1;\n return 'a=rtpmap:' + pt + ' ' + codec.name + '/' + codec.clockRate + (channels !== 1 ? '/' + channels : '') + '\\r\\n';\n};\n// Parses 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\n$4b27a37b96dfd7f6$var$SDPUtils.parseExtmap = function(line) {\n const parts = line.substring(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 attributes: parts.slice(2).join(' ')\n };\n};\n// Generates an extmap line from RTCRtpHeaderExtensionParameters or\n// RTCRtpHeaderExtension.\n$4b27a37b96dfd7f6$var$SDPUtils.writeExtmap = function(headerExtension) {\n return 'a=extmap:' + (headerExtension.id || headerExtension.preferredId) + (headerExtension.direction && headerExtension.direction !== 'sendrecv' ? '/' + headerExtension.direction : '') + ' ' + headerExtension.uri + (headerExtension.attributes ? ' ' + headerExtension.attributes : '') + '\\r\\n';\n};\n// Parses a fmtp line, returns dictionary. Sample input:\n// a=fmtp:96 vbr=on;cng=on\n// Also deals with vbr=on; cng=on\n$4b27a37b96dfd7f6$var$SDPUtils.parseFmtp = function(line) {\n const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for(let 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// Generates a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\n$4b27a37b96dfd7f6$var$SDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) pt = codec.preferredPayloadType;\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach((param)=>{\n if (codec.parameters[param] !== undefined) params.push(param + '=' + codec.parameters[param]);\n else params.push(param);\n });\n line += 'a=fmtp:' + pt + ' ' + params.join(';') + '\\r\\n';\n }\n return line;\n};\n// Parses a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\n$4b27a37b96dfd7f6$var$SDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(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.\n$4b27a37b96dfd7f6$var$SDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) pt = codec.preferredPayloadType;\n if (codec.rtcpFeedback && codec.rtcpFeedback.length) // FIXME: special handling for trr-int?\n codec.rtcpFeedback.forEach((fb)=>{\n lines += 'a=rtcp-fb:' + pt + ' ' + fb.type + (fb.parameter && fb.parameter.length ? ' ' + fb.parameter : '') + '\\r\\n';\n });\n return lines;\n};\n// Parses a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\n$4b27a37b96dfd7f6$var$SDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10)\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else parts.attribute = line.substring(sp + 1);\n return parts;\n};\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\n$4b27a37b96dfd7f6$var$SDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map((ssrc)=>parseInt(ssrc, 10))\n };\n};\n// Extracts the MID (RFC 5888) from a media section.\n// Returns the MID or undefined if no mid line was found.\n$4b27a37b96dfd7f6$var$SDPUtils.getMid = function(mediaSection) {\n const mid = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) return mid.substring(6);\n};\n// Parses a fingerprint line for DTLS-SRTP.\n$4b27a37b96dfd7f6$var$SDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(),\n value: parts[1].toUpperCase()\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.\n$4b27a37b96dfd7f6$var$SDPUtils.getDtlsParameters = function(mediaSection, sessionpart) {\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role in Edge.\n return {\n role: 'auto',\n fingerprints: lines.map($4b27a37b96dfd7f6$var$SDPUtils.parseFingerprint)\n };\n};\n// Serializes DTLS parameters to SDP.\n$4b27a37b96dfd7f6$var$SDPUtils.writeDtlsParameters = function(params, setupType) {\n let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach((fp)=>{\n sdp += 'a=fingerprint:' + fp.algorithm + ' ' + fp.value + '\\r\\n';\n });\n return sdp;\n};\n// Parses a=crypto lines into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#dictionary-rtcsrtpsdesparameters-members\n$4b27a37b96dfd7f6$var$SDPUtils.parseCryptoLine = function(line) {\n const parts = line.substring(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$4b27a37b96dfd7f6$var$SDPUtils.writeCryptoLine = function(parameters) {\n return 'a=crypto:' + parameters.tag + ' ' + parameters.cryptoSuite + ' ' + (typeof parameters.keyParams === 'object' ? $4b27a37b96dfd7f6$var$SDPUtils.writeCryptoKeyParams(parameters.keyParams) : parameters.keyParams) + (parameters.sessionParams ? ' ' + parameters.sessionParams.join(' ') : '') + '\\r\\n';\n};\n// Parses the crypto key parameters into\n// https://rawgit.com/aboba/edgertc/master/msortc-rs4.html#rtcsrtpkeyparam*\n$4b27a37b96dfd7f6$var$SDPUtils.parseCryptoKeyParams = function(keyParams) {\n if (keyParams.indexOf('inline:') !== 0) return null;\n const parts = keyParams.substring(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$4b27a37b96dfd7f6$var$SDPUtils.writeCryptoKeyParams = function(keyParams) {\n return keyParams.keyMethod + ':' + keyParams.keySalt + (keyParams.lifeTime ? '|' + keyParams.lifeTime : '') + (keyParams.mkiValue && keyParams.mkiLength ? '|' + keyParams.mkiValue + ':' + keyParams.mkiLength : '');\n};\n// Extracts all SDES parameters.\n$4b27a37b96dfd7f6$var$SDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=crypto:');\n return lines.map($4b27a37b96dfd7f6$var$SDPUtils.parseCryptoLine);\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.\n$4b27a37b96dfd7f6$var$SDPUtils.getIceParameters = function(mediaSection, sessionpart) {\n const ufrag = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-ufrag:')[0];\n const pwd = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection + sessionpart, 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) return null;\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10)\n };\n};\n// Serializes ICE parameters to SDP.\n$4b27a37b96dfd7f6$var$SDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' + 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) sdp += 'a=ice-lite\\r\\n';\n return sdp;\n};\n// Parses the SDP media section and returns RTCRtpParameters.\n$4b27a37b96dfd7f6$var$SDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: []\n };\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for(let i = 3; i < mline.length; i++){\n const pt = mline[i];\n const rtpmapline = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = $4b27a37b96dfd7f6$var$SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? $4b27a37b96dfd7f6$var$SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:' + pt + ' ').map($4b27a37b96dfd7f6$var$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:\n break;\n }\n }\n }\n $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach((line)=>{\n description.headerExtensions.push($4b27a37b96dfd7f6$var$SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ').map($4b27a37b96dfd7f6$var$SDPUtils.parseRtcpFb);\n description.codecs.forEach((codec)=>{\n wildcardRtcpFb.forEach((fb)=>{\n const duplicate = codec.rtcpFeedback.find((existingFeedback)=>{\n return existingFeedback.type === fb.type && existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) codec.rtcpFeedback.push(fb);\n });\n });\n // FIXME: parse rtcp.\n return description;\n};\n// Generates parts of the SDP media section describing the capabilities /\n// parameters.\n$4b27a37b96dfd7f6$var$SDPUtils.writeRtpDescription = function(kind, caps) {\n let sdp = '';\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map((codec)=>{\n if (codec.preferredPayloadType !== undefined) return codec.preferredPayloadType;\n return codec.payloadType;\n }).join(' ') + '\\r\\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 // Add a=rtpmap lines for each codec. Also fmtp and rtcp-fb.\n caps.codecs.forEach((codec)=>{\n sdp += $4b27a37b96dfd7f6$var$SDPUtils.writeRtpMap(codec);\n sdp += $4b27a37b96dfd7f6$var$SDPUtils.writeFmtp(codec);\n sdp += $4b27a37b96dfd7f6$var$SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach((codec)=>{\n if (codec.maxptime > maxptime) maxptime = codec.maxptime;\n });\n if (maxptime > 0) sdp += 'a=maxptime:' + maxptime + '\\r\\n';\n if (caps.headerExtensions) caps.headerExtensions.forEach((extension)=>{\n sdp += $4b27a37b96dfd7f6$var$SDPUtils.writeExtmap(extension);\n });\n // FIXME: write fecMechanisms.\n return sdp;\n};\n// Parses the SDP media section and returns an array of\n// RTCRtpEncodingParameters.\n$4b27a37b96dfd7f6$var$SDPUtils.parseRtpEncodingParameters = function(mediaSection) {\n const encodingParameters = [];\n const description = $4b27a37b96dfd7f6$var$SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map((line)=>$4b27a37b96dfd7f6$var$SDPUtils.parseSsrcMedia(line)).filter((parts)=>parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n const flows = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID').map((line)=>{\n const parts = line.substring(17).split(' ');\n return parts.map((part)=>parseInt(part, 10));\n });\n if (flows.length > 0 && flows[0].length > 1 && flows[0][0] === primarySsrc) secondarySsrc = flows[0][1];\n description.codecs.forEach((codec)=>{\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let encParam = {\n ssrc: primarySsrc,\n codecPayloadType: parseInt(codec.parameters.apt, 10)\n };\n if (primarySsrc && secondarySsrc) encParam.rtx = {\n 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) encodingParameters.push({\n ssrc: primarySsrc\n });\n // we support both b=AS and b=TIAS but interpret AS as TIAS.\n let bandwidth = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) bandwidth = parseInt(bandwidth[0].substring(7), 10);\n else if (bandwidth[0].indexOf('b=AS:') === 0) // use formula from JSEP to convert b=AS to TIAS value.\n bandwidth = parseInt(bandwidth[0].substring(5), 10) * 950 - 16000;\n else bandwidth = undefined;\n encodingParameters.forEach((params)=>{\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n// parses http://draft.ortc.org/#rtcrtcpparameters*\n$4b27a37b96dfd7f6$var$SDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map((line)=>$4b27a37b96dfd7f6$var$SDPUtils.parseSsrcMedia(line)).filter((obj)=>obj.attribute === 'cname')[0];\n if (remoteSsrc) {\n rtcpParameters.cname = remoteSsrc.value;\n rtcpParameters.ssrc = remoteSsrc.ssrc;\n }\n // Edge uses the compound attribute instead of reducedSize\n // compound is !reducedSize\n const rsize = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=rtcp-rsize');\n rtcpParameters.reducedSize = rsize.length > 0;\n rtcpParameters.compound = rsize.length === 0;\n // parses the rtcp-mux attrіbute.\n // Note that Edge does not support unmuxed RTCP.\n const mux = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n return rtcpParameters;\n};\n$4b27a37b96dfd7f6$var$SDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) sdp += 'a=rtcp-rsize\\r\\n';\n if (rtcpParameters.mux) sdp += 'a=rtcp-mux\\r\\n';\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) sdp += 'a=ssrc:' + rtcpParameters.ssrc + ' cname:' + rtcpParameters.cname + '\\r\\n';\n return sdp;\n};\n// parses either a=msid: or a=ssrc:... msid lines and returns\n// the id of the MediaStream and MediaStreamTrack.\n$4b27a37b96dfd7f6$var$SDPUtils.parseMsid = function(mediaSection) {\n let parts;\n const spec = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {\n stream: parts[0],\n track: parts[1]\n };\n }\n const planB = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=ssrc:').map((line)=>$4b27a37b96dfd7f6$var$SDPUtils.parseSsrcMedia(line)).filter((msidParts)=>msidParts.attribute === 'msid');\n if (planB.length > 0) {\n parts = planB[0].value.split(' ');\n return {\n stream: parts[0],\n 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\n$4b27a37b96dfd7f6$var$SDPUtils.parseSctpDescription = function(mediaSection) {\n const mline = $4b27a37b96dfd7f6$var$SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n if (isNaN(maxMessageSize)) maxMessageSize = 65536;\n const sctpPort = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize: maxMessageSize\n };\n const sctpMapLines = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0].substring(10).split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n maxMessageSize: maxMessageSize\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/)\n$4b27a37b96dfd7f6$var$SDPUtils.writeSctpDescription = function(media, sctp) {\n let output = [];\n if (media.protocol !== 'DTLS/SCTP') 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 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 if (sctp.maxMessageSize !== undefined) output.push('a=max-message-size:' + sctp.maxMessageSize + '\\r\\n');\n return output.join('');\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\n$4b27a37b96dfd7f6$var$SDPUtils.generateSessionId = function() {\n return Math.random().toString().substr(2, 22);\n};\n// Write boiler 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'\n$4b27a37b96dfd7f6$var$SDPUtils.writeSessionBoilerplate = function(sessId, sessVer, sessUser) {\n let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) sessionId = sessId;\n else sessionId = $4b27a37b96dfd7f6$var$SDPUtils.generateSessionId();\n const user = sessUser || 'thisisadapterortc';\n // FIXME: sess-id should be an NTP timestamp.\n return \"v=0\\r\\no=\" + user + ' ' + sessionId + ' ' + version + ' IN IP4 127.0.0.1\\r\\n' + 's=-\\r\\n' + 't=0 0\\r\\n';\n};\n// Gets the direction from the mediaSection or the sessionpart.\n$4b27a37b96dfd7f6$var$SDPUtils.getDirection = function(mediaSection, sessionpart) {\n // Look for sendrecv, sendonly, recvonly, inactive, default to sendrecv.\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.splitLines(mediaSection);\n for(let i = 0; i < lines.length; i++)switch(lines[i]){\n case 'a=sendrecv':\n case 'a=sendonly':\n case 'a=recvonly':\n case 'a=inactive':\n return lines[i].substring(2);\n default:\n }\n if (sessionpart) return $4b27a37b96dfd7f6$var$SDPUtils.getDirection(sessionpart);\n return 'sendrecv';\n};\n$4b27a37b96dfd7f6$var$SDPUtils.getKind = function(mediaSection) {\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n$4b27a37b96dfd7f6$var$SDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n$4b27a37b96dfd7f6$var$SDPUtils.parseMLine = function(mediaSection) {\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(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$4b27a37b96dfd7f6$var$SDPUtils.parseOLine = function(mediaSection) {\n const line = $4b27a37b96dfd7f6$var$SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(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// a very naive interpretation of a valid SDP.\n$4b27a37b96dfd7f6$var$SDPUtils.isValidSDP = function(blob) {\n if (typeof blob !== 'string' || blob.length === 0) return false;\n const lines = $4b27a37b96dfd7f6$var$SDPUtils.splitLines(blob);\n for(let i = 0; i < lines.length; i++){\n if (lines[i].length < 2 || lines[i].charAt(1) !== '=') return false;\n // TODO: check the modifier a bit more.\n }\n return true;\n};\n$4b27a37b96dfd7f6$exports = $4b27a37b96dfd7f6$var$SDPUtils;\n\n\n\n'use strict';\nfunction $af8eb266204bc7d1$export$cf133661e444ccfe(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 window.RTCIceCandidate.prototype) return;\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 && args.candidate.indexOf('a=') === 0) {\n args = JSON.parse(JSON.stringify(args));\n args.candidate = args.candidate.substring(2);\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 = (0, (/*@__PURE__*/$parcel$interopDefault($4b27a37b96dfd7f6$exports))).parseCandidate(args.candidate);\n for(const key in parsedCandidate)if (!(key in nativeCandidate)) Object.defineProperty(nativeCandidate, key, {\n value: parsedCandidate[key]\n });\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment\n };\n };\n return nativeCandidate;\n }\n return new NativeRTCIceCandidate(args);\n };\n window.RTCIceCandidate.prototype = NativeRTCIceCandidate.prototype;\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n $f1fc0f969f08e0a5$export$1f48841962b828b1(window, 'icecandidate', (e)=>{\n if (e.candidate) Object.defineProperty(e, 'candidate', {\n value: new window.RTCIceCandidate(e.candidate),\n writable: 'false'\n });\n return e;\n });\n}\nfunction $af8eb266204bc7d1$export$fdafb8d8280e29b5(window) {\n if (!window.RTCIceCandidate || window.RTCIceCandidate && 'relayProtocol' in window.RTCIceCandidate.prototype) return;\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n $f1fc0f969f08e0a5$export$1f48841962b828b1(window, 'icecandidate', (e)=>{\n if (e.candidate) {\n const parsedCandidate = (0, (/*@__PURE__*/$parcel$interopDefault($4b27a37b96dfd7f6$exports))).parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = ({\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp'\n })[parsedCandidate.priority >> 24];\n }\n return e;\n });\n}\nfunction $af8eb266204bc7d1$export$a99147c78a56edc4(window, browserDetails) {\n if (!window.RTCPeerConnection) return;\n if (!('sctp' in window.RTCPeerConnection.prototype)) Object.defineProperty(window.RTCPeerConnection.prototype, 'sctp', {\n get () {\n return typeof this._sctp === 'undefined' ? null : this._sctp;\n }\n });\n const sctpInDescription = function(description) {\n if (!description || !description.sdp) return false;\n const sections = (0, (/*@__PURE__*/$parcel$interopDefault($4b27a37b96dfd7f6$exports))).splitSections(description.sdp);\n sections.shift();\n return sections.some((mediaSection)=>{\n const mLine = (0, (/*@__PURE__*/$parcel$interopDefault($4b27a37b96dfd7f6$exports))).parseMLine(mediaSection);\n return mLine && mLine.kind === 'application' && mLine.protocol.indexOf('SCTP') !== -1;\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) return -1;\n const version = parseInt(match[1], 10);\n // Test for NaN (yes, this is ugly)\n return version !== version ? -1 : version;\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) // FF < 57 will send in 16 KiB chunks using the deprecated PPID\n // fragmentation.\n canSendMaxMessageSize = 16384;\n else // However, other FF (and RAWRTC) can reassemble PPID-fragmented\n // messages. Thus, supporting ~2 GiB when sending.\n canSendMaxMessageSize = 2147483637;\n } else if (browserDetails.version < 60) // 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 = browserDetails.version === 57 ? 65535 : 65536;\n else // FF >= 60 supports sending ~2 GiB\n canSendMaxMessageSize = 2147483637;\n }\n return canSendMaxMessageSize;\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 // 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' && browserDetails.version === 57) maxMessageSize = 65535;\n const match = (0, (/*@__PURE__*/$parcel$interopDefault($4b27a37b96dfd7f6$exports))).matchPrefix(description.sdp, 'a=max-message-size:');\n if (match.length > 0) maxMessageSize = parseInt(match[0].substring(19), 10);\n else if (browserDetails.browser === 'firefox' && remoteIsFirefox !== -1) // 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 return maxMessageSize;\n };\n const origSetRemoteDescription = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = 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: sdpSemantics } = this.getConfiguration();\n if (sdpSemantics === 'plan-b') 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 if (sctpInDescription(arguments[0])) {\n // Check if the remote is FF.\n const isFirefox = getRemoteFirefoxVersion(arguments[0]);\n // Get the maximum message size the local peer is capable of sending\n const canSendMMS = getCanSendMaxMessageSize(isFirefox);\n // Get the maximum message size of the remote peer.\n const remoteMMS = getMaxMessageSize(arguments[0], isFirefox);\n // Determine final maximum message size\n let maxMessageSize;\n if (canSendMMS === 0 && remoteMMS === 0) maxMessageSize = Number.POSITIVE_INFINITY;\n else if (canSendMMS === 0 || remoteMMS === 0) maxMessageSize = Math.max(canSendMMS, remoteMMS);\n else maxMessageSize = Math.min(canSendMMS, remoteMMS);\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 return origSetRemoteDescription.apply(this, arguments);\n };\n}\nfunction $af8eb266204bc7d1$export$d461c8d5c5db5da7(window) {\n if (!(window.RTCPeerConnection && 'createDataChannel' in window.RTCPeerConnection.prototype)) return;\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 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' && pc.sctp && length > pc.sctp.maxMessageSize) throw new TypeError('Message too large (can send a maximum of ' + pc.sctp.maxMessageSize + ' bytes)');\n return origDataChannelSend.apply(dc, arguments);\n };\n }\n const origCreateDataChannel = window.RTCPeerConnection.prototype.createDataChannel;\n window.RTCPeerConnection.prototype.createDataChannel = function createDataChannel() {\n const dataChannel = origCreateDataChannel.apply(this, arguments);\n wrapDcSend(dataChannel, this);\n return dataChannel;\n };\n $f1fc0f969f08e0a5$export$1f48841962b828b1(window, 'datachannel', (e)=>{\n wrapDcSend(e.channel, e.target);\n return e;\n });\n}\nfunction $af8eb266204bc7d1$export$63bb816cc75460(window) {\n if (!window.RTCPeerConnection || 'connectionState' in window.RTCPeerConnection.prototype) return;\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', this._onconnectionstatechange);\n delete this._onconnectionstatechange;\n }\n if (cb) this.addEventListener('connectionstatechange', this._onconnectionstatechange = cb);\n },\n enumerable: true,\n configurable: true\n });\n [\n 'setLocalDescription',\n 'setRemoteDescription'\n ].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', this._connectionstatechangepoly);\n }\n return origMethod.apply(this, arguments);\n };\n });\n}\nfunction $af8eb266204bc7d1$export$a57d114344295149(window, browserDetails) {\n /* remove a=extmap-allow-mixed for webrtc.org < M71 */ if (!window.RTCPeerConnection) return;\n if (browserDetails.browser === 'chrome' && browserDetails.version >= 71) return;\n if (browserDetails.browser === 'safari' && browserDetails.version >= 605) return;\n const nativeSRD = window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription = 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 && desc instanceof window.RTCSessionDescription) arguments[0] = new window.RTCSessionDescription({\n type: desc.type,\n sdp: sdp\n });\n else desc.sdp = sdp;\n }\n return nativeSRD.apply(this, arguments);\n };\n}\nfunction $af8eb266204bc7d1$export$51d5e40b48c771c7(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)) return;\n const nativeAddIceCandidate = window.RTCPeerConnection.prototype.addIceCandidate;\n if (!nativeAddIceCandidate || nativeAddIceCandidate.length === 0) return;\n window.RTCPeerConnection.prototype.addIceCandidate = function addIceCandidate() {\n if (!arguments[0]) {\n if (arguments[1]) arguments[1].apply(null);\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 || browserDetails.browser === 'firefox' && browserDetails.version < 68 || browserDetails.browser === 'safari') && arguments[0] && arguments[0].candidate === '') return Promise.resolve();\n return nativeAddIceCandidate.apply(this, arguments);\n };\n}\nfunction $af8eb266204bc7d1$export$7170d04e59f9d553(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) return;\n const nativeSetLocalDescription = window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) return;\n window.RTCPeerConnection.prototype.setLocalDescription = function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || desc.type && desc.sdp) return nativeSetLocalDescription.apply(this, arguments);\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {\n type: desc.type,\n sdp: desc.sdp\n };\n if (!desc.type) switch(this.signalingState){\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n if (desc.sdp || desc.type !== 'offer' && desc.type !== 'answer') return nativeSetLocalDescription.apply(this, [\n desc\n ]);\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this).then((d)=>nativeSetLocalDescription.apply(this, [\n d\n ]));\n };\n}\n\n\n\nfunction $87b5787f7cefc5b5$export$e77bf46c04ac7d12({ window: window } = {}, options = {\n shimChrome: true,\n shimFirefox: true,\n shimSafari: true\n}) {\n // Utils.\n const logging = $f1fc0f969f08e0a5$export$bef1f36f5486a6a3;\n const browserDetails = $f1fc0f969f08e0a5$export$2d31490a0c05f094(window);\n const adapter = {\n browserDetails: browserDetails,\n commonShim: $af8eb266204bc7d1$exports,\n extractVersion: $f1fc0f969f08e0a5$export$e3c02be309be1f23,\n disableLog: $f1fc0f969f08e0a5$export$afbfee8cc06fd3e4,\n disableWarnings: $f1fc0f969f08e0a5$export$51516be4b019e41e,\n sdp: // Expose sdp as a convenience. For production apps include directly.\n $4b27a37b96dfd7f6$exports\n };\n // Shim browser if found.\n switch(browserDetails.browser){\n case 'chrome':\n if (!$b81887c760799f2b$exports || !$b81887c760799f2b$exports.shimPeerConnection || !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 = $b81887c760799f2b$exports;\n // Must be called before shimPeerConnection.\n $af8eb266204bc7d1$export$51d5e40b48c771c7(window, browserDetails);\n $af8eb266204bc7d1$export$7170d04e59f9d553(window, browserDetails);\n $b81887c760799f2b$exports.shimGetUserMedia(window, browserDetails);\n $b81887c760799f2b$exports.shimMediaStream(window, browserDetails);\n $b81887c760799f2b$exports.shimPeerConnection(window, browserDetails);\n $b81887c760799f2b$exports.shimOnTrack(window, browserDetails);\n $b81887c760799f2b$exports.shimAddTrackRemoveTrack(window, browserDetails);\n $b81887c760799f2b$exports.shimGetSendersWithDtmf(window, browserDetails);\n $b81887c760799f2b$exports.shimGetStats(window, browserDetails);\n $b81887c760799f2b$exports.shimSenderReceiverGetStats(window, browserDetails);\n $b81887c760799f2b$exports.fixNegotiationNeeded(window, browserDetails);\n $af8eb266204bc7d1$export$cf133661e444ccfe(window, browserDetails);\n $af8eb266204bc7d1$export$fdafb8d8280e29b5(window, browserDetails);\n $af8eb266204bc7d1$export$63bb816cc75460(window, browserDetails);\n $af8eb266204bc7d1$export$a99147c78a56edc4(window, browserDetails);\n $af8eb266204bc7d1$export$d461c8d5c5db5da7(window, browserDetails);\n $af8eb266204bc7d1$export$a57d114344295149(window, browserDetails);\n break;\n case 'firefox':\n if (!$f6b001001df34b3c$exports || !$f6b001001df34b3c$exports.shimPeerConnection || !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 = $f6b001001df34b3c$exports;\n // Must be called before shimPeerConnection.\n $af8eb266204bc7d1$export$51d5e40b48c771c7(window, browserDetails);\n $af8eb266204bc7d1$export$7170d04e59f9d553(window, browserDetails);\n $f6b001001df34b3c$exports.shimGetUserMedia(window, browserDetails);\n $f6b001001df34b3c$exports.shimPeerConnection(window, browserDetails);\n $f6b001001df34b3c$exports.shimOnTrack(window, browserDetails);\n $f6b001001df34b3c$exports.shimRemoveStream(window, browserDetails);\n $f6b001001df34b3c$exports.shimSenderGetStats(window, browserDetails);\n $f6b001001df34b3c$exports.shimReceiverGetStats(window, browserDetails);\n $f6b001001df34b3c$exports.shimRTCDataChannel(window, browserDetails);\n $f6b001001df34b3c$exports.shimAddTransceiver(window, browserDetails);\n $f6b001001df34b3c$exports.shimGetParameters(window, browserDetails);\n $f6b001001df34b3c$exports.shimCreateOffer(window, browserDetails);\n $f6b001001df34b3c$exports.shimCreateAnswer(window, browserDetails);\n $af8eb266204bc7d1$export$cf133661e444ccfe(window, browserDetails);\n $af8eb266204bc7d1$export$63bb816cc75460(window, browserDetails);\n $af8eb266204bc7d1$export$a99147c78a56edc4(window, browserDetails);\n $af8eb266204bc7d1$export$d461c8d5c5db5da7(window, browserDetails);\n break;\n case 'safari':\n if (!$0b1ec2baf876c0f5$exports || !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 = $0b1ec2baf876c0f5$exports;\n // Must be called before shimCallbackAPI.\n $af8eb266204bc7d1$export$51d5e40b48c771c7(window, browserDetails);\n $af8eb266204bc7d1$export$7170d04e59f9d553(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimRTCIceServerUrls(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimCreateOfferLegacy(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimCallbacksAPI(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimLocalStreamsAPI(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimRemoteStreamsAPI(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimTrackEventTransceiver(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimGetUserMedia(window, browserDetails);\n $0b1ec2baf876c0f5$exports.shimAudioContext(window, browserDetails);\n $af8eb266204bc7d1$export$cf133661e444ccfe(window, browserDetails);\n $af8eb266204bc7d1$export$fdafb8d8280e29b5(window, browserDetails);\n $af8eb266204bc7d1$export$a99147c78a56edc4(window, browserDetails);\n $af8eb266204bc7d1$export$d461c8d5c5db5da7(window, browserDetails);\n $af8eb266204bc7d1$export$a57d114344295149(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n return adapter;\n}\n\n\n'use strict';\nconst $02d6fcc465b3a16d$var$adapter = (0, $87b5787f7cefc5b5$export$e77bf46c04ac7d12)({\n window: typeof window === 'undefined' ? undefined : window\n});\nvar $02d6fcc465b3a16d$export$2e2bcd8739ae039 = $02d6fcc465b3a16d$var$adapter;\n\n\nclass $f37b542c4b6e694c$export$2e2bcd8739ae039 {\n constructor(webrtc, peer){\n this.totalSize = 0;\n this.isReady = false;\n this.isStarted = false;\n this.isSending = false;\n this.isRecaiving = false;\n this.processedSize = 0;\n this.bufferSizePerChannel = 10e6;\n this.bufferSizePerPack = 10e3;\n this.safeBufferSizePerPack = 9999;\n this.webrtc = webrtc;\n this.rtc = webrtc.rtc;\n this.peer = peer;\n }\n async RecaiveFile(_rtc, fileMetadata, channelCount, _totalSize, onEnded) {\n //let totals = {};\n // let index = 0;\n /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => {\n return {\n name: `${index+1}. Kanal`,\n current: 0,\n currentTotal: 0,\n total: 0\n }\n }));*/ let parts = [];\n this.webrtc.on('datachannel', (datachannel)=>{\n //let channelIndex = index++;\n let current = 0;\n let totalSize = 0;\n let currentPart = 0;\n let bufferAmount = [];\n datachannel.onmessage = function({ data: data }) {\n if (totalSize == 0) {\n let { size: size, part: part } = JSON.parse(data);\n totalSize = size;\n currentPart = part;\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: totalSize,\n current: 0\n }\n });*/ datachannel.send(\"READY\");\n } else {\n current += data.byteLength;\n bufferAmount.push(data);\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: data.byteLength + n.current,\n currentTotal: data.byteLength + n.currentTotal,\n }\n });\n setProcessedSize(n => n + data.byteLength);*/ if (current == totalSize) {\n parts[currentPart] = new Blob(bufferAmount);\n bufferAmount = [];\n //totals[datachannel.label] += totalSize;\n totalSize = 0;\n currentPart = 0;\n current = 0;\n datachannel.send(\"TOTAL_RECAIVED\");\n }\n }\n };\n datachannel.onclose = ()=>{\n channelCount--;\n if (channelCount == 0) {\n let file = new File(parts, fileMetadata.name, {\n type: fileMetadata.type,\n lastModified: +new Date\n });\n onEnded(file);\n }\n };\n });\n }\n async SendFile(file, metadata) {\n this.isSending = true;\n this.isStarted = true;\n let buffer = await file.arrayBuffer();\n let partCount = Math.ceil(buffer.byteLength / 10e6);\n let channelCount = Math.min(5, partCount);\n if (this.webrtc.iceStatus != \"connected\") throw new Error(\"WebRTC is a not ready\");\n this.peer.send({\n type: 'file',\n name: file.name,\n size: file.size,\n mimetype: file.type,\n partCount: partCount,\n channelCount: channelCount,\n metadata: metadata\n });\n let channels = [];\n for(let channelIndex = 0; channelIndex < channelCount; channelIndex++){\n let channel = this.rtc.createDataChannel(\"\\\\?\\\\file_\" + channelIndex);\n channel.binaryType = \"arraybuffer\";\n await new Promise((ok)=>{\n channel.onopen = ()=>{\n ok(void 0);\n };\n });\n channels.push(channel);\n }\n let currentPart = 0;\n let next = ()=>{\n if (currentPart < partCount) {\n let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6);\n currentPart++;\n return [\n bufferPart,\n currentPart - 1\n ];\n }\n return [\n false,\n 0\n ];\n };\n let spyChannelIndex = channels.length;\n await new Promise((ok)=>{\n for(let channelIndex = 0; channelIndex < channels.length; channelIndex++)this.sendPartition(channels[channelIndex], next, channelIndex, ()=>{\n spyChannelIndex--;\n if (spyChannelIndex == 0) {\n this.isSending = false;\n this.isStarted = false;\n ok(undefined);\n }\n });\n });\n }\n sendPartition(channel, nextblob10mb, _channelIndex, onEnded) {\n let [currentBuffer, currentPartition] = nextblob10mb();\n let currentPart = 0;\n let next = ()=>{\n if (!(currentBuffer instanceof ArrayBuffer)) return;\n let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3);\n currentPart++;\n if (bufferPart.byteLength != 0) /*\n updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: bufferPart.byteLength + n.current,\n currentTotal: bufferPart.byteLength + n.currentTotal\n }\n });\n setProcessedSize(n => n + bufferPart.byteLength);\n */ return bufferPart;\n };\n channel.addEventListener(\"message\", ({ data: data })=>{\n if (data == \"READY\") this.sendFileChannel(channel, next);\n if (data == \"TOTAL_RECAIVED\") {\n [currentBuffer, currentPartition] = nextblob10mb();\n currentPart = 0;\n if (currentBuffer != false) /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: currentBuffer.byteLength,\n current: 0,\n }\n });*/ channel.send(JSON.stringify({\n size: currentBuffer.byteLength,\n part: currentPartition\n }));\n else {\n channel.close();\n onEnded();\n }\n }\n });\n channel.send(JSON.stringify({\n size: currentBuffer.byteLength,\n part: currentPartition\n }));\n }\n sendFileChannel(channel, getNextBlob) {\n channel.addEventListener(\"bufferedamountlow\", function() {\n let buffer = getNextBlob();\n if (buffer) channel.send(buffer);\n });\n channel.bufferedAmountLowThreshold = 15999;\n let c = getNextBlob();\n c && channel.send(c);\n }\n}\n\n\n\nclass $9f70bba88b51f85f$export$2e2bcd8739ae039 {\n static{\n this.channels = new Map();\n }\n static{\n this.requireGC = false;\n }\n static{\n this.defaultRTCConfig = {\n iceCandidatePoolSize: 0,\n iceTransportPolicy: \"all\",\n rtcpMuxPolicy: \"require\"\n };\n }\n isPolite() {\n let myId = this.peer?.mwse.peer('me').socketId;\n let peerId = this.peer?.socketId;\n return myId < peerId;\n }\n static{\n this.defaultICEServers = [\n {\n urls: \"stun:stun.l.google.com:19302\"\n },\n {\n urls: \"stun:stun1.l.google.com:19302\"\n },\n {\n urls: \"stun:stun2.l.google.com:19302\"\n },\n {\n urls: \"stun:stun3.l.google.com:19302\"\n },\n {\n urls: \"stun:stun4.l.google.com:19302\"\n }\n ];\n }\n constructor(rtcConfig, rtcServers){\n this.active = false;\n this.connectionStatus = \"new\";\n this.iceStatus = \"new\";\n this.gatheringStatus = \"new\";\n this.signalingStatus = \"\";\n this.recaivingStream = new Map();\n this.sendingStream = new Map();\n this.events = {};\n this.makingOffer = false;\n this.ignoreOffer = false;\n this.isSettingRemoteAnswerPending = false;\n this.candicatePack = [];\n let config = {};\n if (rtcConfig) Object.assign(config, $9f70bba88b51f85f$export$2e2bcd8739ae039.defaultRTCConfig, rtcConfig);\n else Object.assign(config, $9f70bba88b51f85f$export$2e2bcd8739ae039.defaultRTCConfig);\n config.iceServers = rtcServers || $9f70bba88b51f85f$export$2e2bcd8739ae039.defaultICEServers;\n this.rtc = new RTCPeerConnection(config);\n this.rtc.addEventListener(\"connectionstatechange\", ()=>{\n this.eventConnectionState();\n });\n this.rtc.addEventListener(\"icecandidate\", (...args)=>{\n this.eventIcecandidate(...args);\n });\n this.rtc.addEventListener(\"iceconnectionstatechange\", ()=>{\n this.eventICEConnectionState();\n });\n this.rtc.addEventListener(\"icegatheringstatechange\", ()=>{\n this.eventICEGatherinState();\n });\n this.rtc.addEventListener(\"negotiationneeded\", ()=>{\n this.eventNogationNeeded();\n });\n this.rtc.addEventListener(\"signalingstatechange\", ()=>{\n this.eventSignalingState();\n });\n this.rtc.addEventListener(\"track\", (...args)=>{\n this.eventTrack(...args);\n });\n this.rtc.addEventListener(\"datachannel\", (...args)=>{\n this.eventDatachannel(...args);\n });\n this.on('input', async (data)=>{\n switch(data.type){\n case \"icecandidate\":\n try {\n if (this.rtc.remoteDescription) await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n else this.candicatePack.push(new RTCIceCandidate(data.value));\n } catch (error) {\n debugger;\n } finally{\n console.log(\"ICE Canbet\");\n }\n break;\n case \"offer\":\n {\n let readyForOffer = !this.makingOffer && (this.rtc.signalingState == \"stable\" || this.isSettingRemoteAnswerPending);\n const offerCollision = !readyForOffer;\n this.ignoreOffer = !this.isPolite() && offerCollision;\n if (this.ignoreOffer) return;\n this.isSettingRemoteAnswerPending = false;\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n this.isSettingRemoteAnswerPending = false;\n for (const candidate of this.candicatePack)await this.rtc.addIceCandidate(candidate);\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n for (const candidate of this.candicatePack)await this.rtc.addIceCandidate(candidate);\n break;\n case \"streamInfo\":\n {\n let { id: id, value: value } = data;\n let streamInfo = this.recaivingStream.get(id);\n if (!streamInfo) this.recaivingStream.set(id, value);\n else this.recaivingStream.set(id, {\n ...streamInfo,\n ...value\n });\n this.send({\n type: 'streamAccept',\n id: id\n });\n break;\n }\n case \"streamRemoved\":\n {\n let { id: id } = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.recaivingStream.delete(id);\n break;\n }\n case \"streamAccept\":\n {\n let { id: id } = data;\n let sendingStream = this.sendingStream.get(id);\n let senders = [];\n if (sendingStream && sendingStream.stream) {\n for (const track of sendingStream.stream.getTracks())senders.push(this.rtc.addTrack(track, sendingStream.stream));\n sendingStream.senders = senders;\n }\n break;\n }\n case \"message\":\n this.emit('message', data.payload);\n break;\n }\n });\n }\n addEventListener(event, callback) {\n (this.events[event] || (this.events[event] = [])).push(callback);\n }\n on(event, callback) {\n this.addEventListener(event, callback);\n }\n async dispatch(event, ...args) {\n if (this.events[event]) for (const callback of this.events[event])await callback(...args);\n }\n async emit(event, ...args) {\n await this.dispatch(event, ...args);\n }\n connect() {\n if (!this.channel) this.createDefaultDataChannel();\n }\n sendMessage(data) {\n this.send({\n type: 'message',\n payload: data\n });\n }\n createDefaultDataChannel() {\n let dt = this.rtc.createDataChannel(':default:', {\n ordered: true\n });\n dt.addEventListener(\"open\", ()=>{\n this.channel = dt;\n $9f70bba88b51f85f$export$2e2bcd8739ae039.channels.set(this.id, this);\n this.active = true;\n });\n dt.addEventListener(\"message\", ({ data: data })=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n });\n dt.addEventListener(\"close\", ()=>{\n this.channel = undefined;\n this.active = false;\n });\n }\n destroy() {\n this.active = false;\n if (this.channel) {\n this.channel.close();\n this.channel = undefined;\n }\n if (this.rtc) this.rtc.close();\n this.emit('disconnected');\n $9f70bba88b51f85f$export$2e2bcd8739ae039.channels.delete(this.id);\n }\n eventDatachannel(event) {\n if (event.channel.label == ':default:') {\n $9f70bba88b51f85f$export$2e2bcd8739ae039.channels.set(this.id, this);\n this.channel = event.channel;\n this.active = true;\n event.channel.addEventListener(\"message\", ({ data: data })=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n });\n event.channel.addEventListener(\"close\", ()=>{\n this.channel = undefined;\n $9f70bba88b51f85f$export$2e2bcd8739ae039.channels.delete(this.id);\n $9f70bba88b51f85f$export$2e2bcd8739ae039.requireGC = true;\n });\n } else this.emit('datachannel', event.channel);\n }\n send(data) {\n if (this.channel?.readyState == \"open\") this.channel.send(JSON.stringify(data));\n else this.emit('output', data);\n }\n eventConnectionState() {\n this.connectionStatus = this.rtc.connectionState;\n if (this.connectionStatus == 'connected') {\n if (this.active == false) this.emit('connected');\n }\n if (this.connectionStatus == 'failed') this.rtc.restartIce();\n if (this.connectionStatus == \"closed\") {\n if (this.active) this.destroy();\n }\n }\n eventIcecandidate(event) {\n if (event.candidate) this.send({\n type: 'icecandidate',\n value: event.candidate\n });\n }\n eventICEConnectionState() {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n eventICEGatherinState() {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n async eventNogationNeeded() {\n try {\n this.makingOffer = true;\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n } catch (error) {\n console.error(`Nogation Error:`, error);\n } finally{\n this.makingOffer = false;\n }\n }\n eventSignalingState() {\n this.signalingStatus = this.rtc.signalingState;\n }\n eventTrack(event) {\n let rtpRecaiver = event.receiver;\n if (event.streams.length) for (const stream of event.streams){\n let streamInfo = this.recaivingStream.get(stream.id);\n (streamInfo.recaivers || (streamInfo.recaivers = [])).push(rtpRecaiver);\n if (this.recaivingStream.get(stream.id).stream == null) {\n streamInfo.stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n } else streamInfo.stream = stream;\n }\n }\n sendStream(stream, name, info) {\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id, {\n ...info,\n id: stream.id,\n name: name,\n stream: stream\n });\n }\n stopStream(_stream) {\n if (this.connectionStatus != 'connected') return;\n if (this.sendingStream.has(_stream.id)) {\n let { stream: stream } = this.sendingStream.get(_stream.id);\n for (const track of stream.getTracks()){\n for (const RTCPSender of this.rtc.getSenders())if (RTCPSender.track?.id == track.id) this.rtc.removeTrack(RTCPSender);\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id);\n }\n }\n stopAllStreams() {\n if (this.connectionStatus != 'connected') return;\n for (const [, { stream: stream }] of this.sendingStream){\n if (stream == undefined) continue;\n for (const track of stream.getTracks()){\n for (const RTCPSender of this.rtc.getSenders())if (RTCPSender.track?.id == track.id) this.rtc.removeTrack(RTCPSender);\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n }\n this.sendingStream.clear();\n }\n async SendFile(file, meta) {\n if (!this.peer) throw new Error(\"Peer is not ready\");\n this.FileTransportChannel = new (0, $f37b542c4b6e694c$export$2e2bcd8739ae039)(this, this.peer);\n await this.FileTransportChannel.SendFile(file, meta);\n }\n async RecaiveFile(chnlCount, filemeta, totalSize) {\n if (!this.peer) throw new Error(\"Peer is not ready\");\n this.FileTransportChannel = new (0, $f37b542c4b6e694c$export$2e2bcd8739ae039)(this, this.peer);\n return await new Promise((recaivedFile)=>{\n if (this.FileTransportChannel) this.FileTransportChannel.RecaiveFile(this.rtc, filemeta, chnlCount, totalSize, (file)=>{\n recaivedFile(file);\n });\n });\n }\n}\n$9f70bba88b51f85f$export$2e2bcd8739ae039.requireGC = false;\nsetInterval(()=>{\n if ($9f70bba88b51f85f$export$2e2bcd8739ae039.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([\n new ArrayBuffer(5e+7)\n ]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n $9f70bba88b51f85f$export$2e2bcd8739ae039.requireGC = false;\n}, 3000);\n\n\nvar $069df92a5be06b83$var$IMessageSymbase = /*#__PURE__*/ function(IMessageSymbase) {\n IMessageSymbase[IMessageSymbase[\"PayloadMessagePack\"] = -12873.54] = \"PayloadMessagePack\";\n IMessageSymbase[IMessageSymbase[\"PayloadRTCBasePack\"] = -12884.54] = \"PayloadRTCBasePack\";\n return IMessageSymbase;\n}($069df92a5be06b83$var$IMessageSymbase || {});\nclass $069df92a5be06b83$export$2e2bcd8739ae039 extends (0, $70ccf545b879f91e$export$2e2bcd8739ae039) {\n constructor(wsts){\n super(), this.options = {}, this.selfSocket = false, this.active = false, this.peerConnection = false, this.primaryChannel = \"datachannel\";\n this.mwse = wsts;\n this.rtc = this.createRTC();\n this.info = new (0, $36e9718861861e3d$export$f3bd5f68ae16de)(this);\n this.on('pack', (data)=>{\n if (data.type == ':rtcpack:') return this.rtc.emit(\"input\", data.payload);\n this.emit(\"message\", data);\n });\n }\n createRTC(rtcConfig, rtcServers) {\n this.rtc = new (0, $9f70bba88b51f85f$export$2e2bcd8739ae039)(rtcConfig, rtcServers);\n this.rtc.peer = this;\n this.rtc.on(\"connected\", ()=>{\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', ()=>{\n this.peerConnection = false;\n });\n this.rtc.on(\"output\", (payload)=>{\n this.send({\n type: ':rtcpack:',\n payload: payload\n });\n });\n this.rtc.on(\"message\", (payload)=>{\n this.emit(\"pack\", payload);\n });\n return this.rtc;\n }\n setPeerOptions(options) {\n if (typeof options == \"string\") this.setSocketId(options);\n else this.options = options;\n }\n setSocketId(uuid) {\n this.socketId = uuid;\n }\n async metadata() {\n if (this.socketId == 'me') {\n let result = await this.mwse.EventPooling.request({\n type: 'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n }\n async request(pack) {\n if (this.active) return await this.mwse.request(this.socketId, pack);\n }\n equalTo(peer) {\n return this.socketId == peer.socketId;\n }\n async isReachable() {\n return await this.mwse.EventPooling.request({\n type: 'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth() {\n await this.mwse.EventPooling.request({\n type: 'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth() {\n await this.mwse.EventPooling.request({\n type: 'auth/pair-system',\n value: 'disable'\n });\n }\n async enablePairInfo() {\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: true\n });\n }\n async disablePairInfo() {\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: false\n });\n }\n async requestPair() {\n let { message: message, status: status } = await this.mwse.EventPooling.request({\n type: 'request/pair',\n to: this.socketId\n });\n if (message == \"ALREADY-PAIRED\" || message == \"ALREADY-REQUESTED\") console.warn(\"Already paired or pair requested\");\n if (status == \"fail\") {\n console.error(\"Request Pair Error\", status, message);\n return false;\n }\n return true;\n }\n async endPair() {\n await this.mwse.EventPooling.request({\n type: 'end/pair',\n to: this.socketId\n });\n this.forget();\n }\n async acceptPair() {\n let { message: message, status: status } = await this.mwse.EventPooling.request({\n type: 'accept/pair',\n to: this.socketId\n });\n if (status == \"fail\") {\n console.error(\"Pair Error\", status, message);\n return false;\n }\n return true;\n }\n async rejectPair() {\n let { message: message, status: status } = await this.mwse.EventPooling.request({\n type: 'reject/pair',\n to: this.socketId\n });\n if (status == \"fail\") {\n console.error(\"Pair Error\", status, message);\n return false;\n }\n return true;\n }\n async getPairedList() {\n let { value: value } = await this.mwse.EventPooling.request({\n type: 'pair/list',\n to: this.socketId\n });\n return value;\n }\n async send(pack) {\n let isOpenedP2P = this.peerConnection && this.rtc?.active;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel;\n if (isOpenedP2P && isOpenedServer) {\n if (this.primaryChannel == \"websocket\") sendChannel = \"websocket\";\n else sendChannel = \"datachannel\";\n } else if (isOpenedServer) sendChannel = \"websocket\";\n else sendChannel = \"datachannel\";\n if (sendChannel == \"websocket\") {\n if (!this.mwse.writable) return console.warn(\"Socket is not writable\");\n await this.mwse.EventPooling.request({\n type: 'pack/to',\n pack: pack,\n to: this.socketId\n });\n } else this.rtc?.sendMessage(pack);\n }\n async forget() {\n this.mwse.peers.delete(this.socketId);\n this.mwse.pairs.delete(this.socketId);\n }\n}\n\n\n\nclass $eb4fbdf2f3a63265$export$f106f681f3286480 {\n constructor(room){\n this.info = {};\n this.room = room;\n this.room.on('updateinfo', (name, value)=>{\n this.info[name] = value;\n });\n }\n async fetch(name) {\n if (name) {\n let rinfo = await this.room.mwse.EventPooling.request({\n type: \"room/getinfo\",\n roomId: this.room.roomId,\n name: name\n });\n if (rinfo.status == \"success\") this.info = rinfo.value;\n else console.warn(rinfo.message);\n } else {\n let rinfo = await this.room.mwse.EventPooling.request({\n type: \"room/info\",\n roomId: this.room.roomId\n });\n if (rinfo.status == \"success\") this.info = rinfo.value;\n else console.warn(rinfo.message);\n }\n return this.info;\n }\n set(name, value) {\n this.info[name] = value;\n this.room.mwse.WSTSProtocol.SendOnly({\n type: \"room/setinfo\",\n roomId: this.room.roomId,\n name: name,\n value: value\n });\n }\n get(name) {\n return name ? this.info[name] : this.info;\n }\n}\n\n\nclass $81753485e968c23c$export$2e2bcd8739ae039 extends (0, $70ccf545b879f91e$export$2e2bcd8739ae039) {\n constructor(wsts){\n super(), this.peers = new Map();\n this.mwse = wsts;\n this.info = new (0, $eb4fbdf2f3a63265$export$f106f681f3286480)(this);\n }\n setRoomOptions(options) {\n if (typeof options == \"string\") this.roomId = options;\n else {\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true,\n autoFetchInfo: true\n };\n Object.assign(defaultOptions, options);\n this.config = defaultOptions;\n }\n }\n setRoomId(uuid) {\n this.roomId = uuid;\n }\n async createRoom(roomOptions) {\n let config = this.config || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type: 'create-room',\n ...config\n });\n if (result.status == 'fail') {\n if (result.message == \"ALREADY-EXISTS\" && this.config.ifexistsJoin) return this.join();\n throw new Error(result.message || result.messages);\n } else {\n this.options = {\n ...this.config,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId, this);\n }\n }\n async join() {\n let result = await this.mwse.EventPooling.request({\n type: 'joinroom',\n name: this.config.name,\n credential: this.config.credential,\n autoFetchInfo: this.config.autoFetchInfo || false\n });\n if (result.status == 'fail') throw new Error(result.message);\n else {\n this.options = {\n ...this.config,\n ...result.room\n };\n if (result.info) this.info.info = result.info;\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId, this);\n }\n }\n async eject() {\n let { type: type } = await this.mwse.EventPooling.request({\n type: 'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if (type == 'success') this.mwse.rooms.delete(this.roomId);\n }\n async send(pack, wom = false, handshake = false) {\n if (!this.mwse.writable) return console.warn(\"Socket is not writable\");\n if (handshake) {\n let { type: type } = await this.mwse.EventPooling.request({\n type: 'pack/room',\n pack: pack,\n to: this.roomId,\n wom: wom,\n handshake: handshake\n });\n if (type == \"fail\") throw new Error(\"Cant send message to room\");\n } else await this.mwse.EventPooling.request({\n type: 'pack/room',\n pack: pack,\n to: this.roomId,\n wom: wom,\n handshake: handshake\n });\n }\n async fetchPeers(filter, onlyNumber = false) {\n if (onlyNumber) {\n let { count: count } = await this.mwse.EventPooling.request({\n type: 'room/peer-count',\n roomId: this.roomId,\n filter: filter || {}\n });\n return count;\n } else {\n let { status: status, peers: peers } = await this.mwse.EventPooling.request({\n type: 'room-peers',\n roomId: this.roomId,\n filter: filter || {}\n });\n let cup = [];\n if (status == 'fail') throw new Error(\"Cant using peers on room\");\n else if (status == 'success') for (const peerid of peers){\n let peer = this.mwse.peer(peerid, true);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n return cup;\n }\n }\n}\n\n\nclass $88b44b5f29c6d98e$export$2e2bcd8739ae039 {\n constructor(wsts){\n this.mwse = wsts;\n this.addListener();\n }\n addListener() {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack);\n });\n }\n SendRaw(pack) {\n this.mwse.server.tranferToServer(pack);\n }\n SendOnly(pack) {\n this.mwse.server.tranferToServer([\n pack,\n 'R'\n ]);\n }\n SendRequest(pack, id) {\n this.mwse.server.tranferToServer([\n pack,\n id,\n 'R'\n ]);\n }\n StartStream(pack, id) {\n this.mwse.server.tranferToServer([\n pack,\n id,\n 'S'\n ]);\n }\n PackAnalyze(data) {\n let [payload, id, action] = data;\n if (typeof id === 'number') {\n let callback = this.mwse.EventPooling.events.get(id);\n if (callback) {\n callback[0](payload, action);\n switch(action){\n case 'E':\n this.mwse.EventPooling.events.delete(id);\n break;\n case 'S':\n default:\n break;\n }\n } else console.warn(\"Missing event sended from server\");\n } else {\n let signals = this.mwse.EventPooling.signals.get(id);\n if (signals) for (const callback of signals)callback(payload);\n else console.warn(\"Missing event sended from server\");\n }\n }\n}\n\n\nclass $09d6084661424ec1$export$2e2bcd8739ae039 extends (0, $70ccf545b879f91e$export$2e2bcd8739ae039) {\n /*public static compress(message:string, callback:(e:any) => any)\n {\n let u : any= [];\n let C = new Gzip({\n level: 9,\n mem: 12\n },(stream,isLast) => {\n u.push(stream);\n if(isLast)\n {\n callback(u);\n }\n });\n C.push(new TextEncoder().encode(message), true);\n }*/ constructor(options){\n super(), this.rooms = new Map(), this.pairs = new Map(), this.peers = new Map(), this.writable = 1, this.readable = 1;\n $09d6084661424ec1$export$2e2bcd8739ae039.rtc = $09d6084661424ec1$export$2e2bcd8739ae039;\n this.server = new (0, $89634b12940c2479$export$98b66c25bb38499d)(this, options);\n this.WSTSProtocol = new (0, $88b44b5f29c6d98e$export$2e2bcd8739ae039)(this);\n this.EventPooling = new (0, $137f01617e9d3585$export$2e2bcd8739ae039)(this);\n this.virtualPressure = new (0, $3dbdf682ee45045f$export$cd59d3e68ede65a1)(this);\n this.server.connect();\n this.me = new (0, $069df92a5be06b83$export$2e2bcd8739ae039)(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId, this.me);\n });\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.server.onPassive(async ()=>{\n this.emit('close');\n });\n this.packMessagingSystem();\n }\n destroy() {\n this.server.disconnect();\n }\n enableRecaiveData() {\n this.WSTSProtocol.SendOnly({\n type: 'connection/packrecaive',\n value: 1\n });\n this.readable = 1;\n }\n disableRecaiveData() {\n this.WSTSProtocol.SendOnly({\n type: 'connection/packrecaive',\n value: 0\n });\n this.readable = 0;\n }\n enableSendData() {\n this.WSTSProtocol.SendOnly({\n type: 'connection/packsending',\n value: 1\n });\n this.writable = 1;\n }\n disableSendData() {\n this.WSTSProtocol.SendOnly({\n type: 'connection/packsending',\n value: 0\n });\n this.writable = 0;\n }\n enableNotifyRoomInfo() {\n this.WSTSProtocol.SendOnly({\n type: 'connection/roominfo',\n value: 1\n });\n }\n disableNotifyRoomInfo() {\n this.WSTSProtocol.SendOnly({\n type: 'connection/roominfo',\n value: 0\n });\n }\n async request(peerId, pack) {\n let { pack: answer } = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack: pack\n });\n return answer;\n }\n async response(peerId, requestId, pack) {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack: pack,\n id: requestId\n });\n }\n packMessagingSystem() {\n this.EventPooling.signal('pack', (payload)=>{\n if (this.readable) {\n let { from: from, pack: pack } = payload;\n this.peer(from, true).emit('pack', pack);\n }\n });\n this.EventPooling.signal('request', (payload)=>{\n let { from: from, pack: pack, id: id } = payload;\n let scope = {\n body: pack,\n response: (pack)=>{\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n });\n this.EventPooling.signal('pack/room', (payload)=>{\n if (this.readable) {\n let { from: from, pack: pack, sender: sender } = payload;\n this.room(from).emit('message', pack, this.peer(sender));\n }\n });\n this.EventPooling.signal('room/joined', (payload)=>{\n let { id: id, roomid: roomid } = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId, peer);\n room.emit('join', peer);\n });\n this.EventPooling.signal('room/info', (payload)=>{\n let { roomId: roomId, name: name, value: value } = payload;\n this.room(roomId).emit('updateinfo', name, value);\n });\n this.EventPooling.signal('room/ejected', (payload)=>{\n let { id: id, roomid: roomid } = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.delete(peer.socketId);\n room.emit('eject', peer);\n });\n this.EventPooling.signal('room/closed', (payload)=>{\n let { roomid: roomid } = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n });\n this.EventPooling.signal(\"pair/info\", (payload)=>{\n let { from: from, name: name, value: value } = payload;\n let peer = this.peer(from, true);\n peer.info.info[name] = value;\n peer.emit(\"info\", name, value);\n });\n this.EventPooling.signal(\"request/pair\", (payload)=>{\n let { from: from, info: info } = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"request/pair\", peer);\n this.peer('me').emit('request/pair', peer);\n });\n this.EventPooling.signal(\"peer/disconnect\", (payload)=>{\n let { id: id } = payload;\n let peer = this.peer(id, true);\n peer.emit(\"disconnect\", peer);\n });\n this.EventPooling.signal(\"accepted/pair\", (payload)=>{\n let { from: from, info: info } = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"accepted/pair\", peer);\n this.peer('me').emit('accepted/pairr', peer);\n });\n this.EventPooling.signal(\"end/pair\", (payload)=>{\n let { from: from, info: info } = payload;\n let peer = this.peer(from, true);\n peer.emit(\"endPair\", info);\n this.peer('me').emit('endPair', from, info);\n });\n }\n room(options) {\n if (typeof options == \"string\") {\n if (this.rooms.has(options)) return this.rooms.get(options);\n }\n let room = new (0, $81753485e968c23c$export$2e2bcd8739ae039)(this);\n room.setRoomOptions(options);\n this.emit('room');\n return room;\n }\n peer(options, isActive = false) {\n if (typeof options == \"string\") {\n if (this.peers.has(options)) return this.peers.get(options);\n if (this.pairs.has(options)) return this.pairs.get(options);\n }\n let peer = new (0, $069df92a5be06b83$export$2e2bcd8739ae039)(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId, peer);\n this.emit('peer', peer);\n return peer;\n }\n}\nwindow.MWSE = $09d6084661424ec1$export$2e2bcd8739ae039;\n\n})();\n//# sourceMappingURL=index.js.map\n","import {Connection,IConnection} from \"./Connection\";\nimport EventPool from \"./EventPool\";\nimport EventTarget from \"./EventTarget\";\nimport { IPPressure } from \"./IPPressure\";\nimport Peer from \"./Peer\";\nimport Room, { IRoomOptions } from \"./Room\";\nimport WSTSProtocol, { Message } from \"./WSTSProtocol\";\nimport WebRTC from \"./WebRTC\";\n//import {Gzip} from \"fflate\";\nexport default class MWSE extends EventTarget {\n public static rtc : WebRTC;\n public server! : Connection;\n public WSTSProtocol! : WSTSProtocol;\n public EventPooling! : EventPool;\n public rooms : Map = new Map();\n public pairs : Map = new Map();\n public peers : Map = new Map();\n public virtualPressure : IPPressure;\n public me! : Peer;\n /*public static compress(message:string, callback:(e:any) => any)\n {\n let u : any= [];\n let C = new Gzip({\n level: 9,\n mem: 12\n },(stream,isLast) => {\n u.push(stream);\n if(isLast)\n {\n callback(u);\n }\n });\n C.push(new TextEncoder().encode(message), true);\n }*/\n constructor(options: IConnection){\n super();\n MWSE.rtc = MWSE as unknown as WebRTC;\n this.server = new Connection(this,options);\n this.WSTSProtocol = new WSTSProtocol(this);\n this.EventPooling = new EventPool(this);\n this.virtualPressure = new IPPressure(this);\n this.server.connect();\n this.me = new Peer(this);\n this.me.scope(()=>{\n this.peers.set('me', this.me);\n this.peers.set(this.me.socketId as string, this.me);\n })\n this.server.onActive(async ()=>{\n this.me.setSocketId('me');\n await this.me.metadata();\n this.emit('scope');\n this.activeScope = true;\n });\n this.server.onPassive(async ()=>{\n this.emit('close');\n });\n this.packMessagingSystem();\n }\n\n public writable = 1;\n public readable = 1;\n\n public destroy()\n {\n this.server.disconnect();\n }\n\n public enableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 1 })\n this.readable = 1\n }\n public disableRecaiveData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packrecaive', value: 0 })\n this.readable = 0\n }\n\n public enableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 1 })\n this.writable = 1\n }\n public disableSendData(){\n this.WSTSProtocol.SendOnly({ type: 'connection/packsending', value: 0 })\n this.writable = 0\n }\n\n public enableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 1 })\n }\n public disableNotifyRoomInfo(){\n this.WSTSProtocol.SendOnly({ type: 'connection/roominfo', value: 0 })\n }\n\n public async request(peerId: string, pack:Message)\n {\n let {pack:answer} = await this.EventPooling.request({\n type: 'request/to',\n to: peerId,\n pack\n });\n return answer;\n }\n public async response(peerId: string, requestId:number, pack:Message)\n {\n this.WSTSProtocol.SendOnly({\n type: 'response/to',\n to: peerId,\n pack,\n id: requestId\n })\n }\n private packMessagingSystem()\n {\n this.EventPooling.signal('pack',(payload : {from:string,pack:any}) => {\n if(this.readable)\n {\n let {from,pack} = payload;\n this.peer(from, true).emit('pack', pack);\n }\n })\n this.EventPooling.signal('request',(payload : {from:string,pack:any,id:number}) => {\n let {from,pack, id} = payload;\n let scope = {\n body: pack,\n response: (pack: Message) => {\n this.response(from, id, pack);\n },\n peer: this.peer(from, true)\n };\n this.peer(from, true).emit('request', scope);\n this.peer('me').emit('request', scope);\n })\n this.EventPooling.signal('pack/room',(payload : {from:string,pack:any,sender:string}) => {\n if(this.readable)\n {\n let {from,pack,sender} = payload;\n this.room(from).emit('message', pack, this.peer(sender));\n }\n })\n this.EventPooling.signal('room/joined',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.set(peer.socketId as string, peer);\n room.emit('join', peer);\n })\n this.EventPooling.signal('room/info',(payload : {roomId:string,value:any,name:string}) => {\n let {roomId,name,value} = payload;\n this.room(roomId).emit('updateinfo', name,value);\n })\n this.EventPooling.signal('room/ejected',(payload : {id:string,roomid:any,ownerid:string}) => {\n let {id,roomid} = payload;\n let room = this.room(roomid);\n let peer = this.peer(id, true);\n room.peers.delete(peer.socketId as string);\n room.emit('eject', peer);\n })\n this.EventPooling.signal('room/closed',(payload : {roomid:any}) => {\n let {roomid} = payload;\n let room = this.room(roomid);\n room.peers.clear();\n room.emit('close');\n this.rooms.delete(roomid);\n })\n this.EventPooling.signal(\"pair/info\", (payload : {from : string,name: string, value: string | number | boolean}) => {\n let {from, name, value} = payload;\n let peer = this.peer(from, true);\n peer.info.info[name] = value;\n peer.emit(\"info\", name, value);\n })\n this.EventPooling.signal(\"request/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"request/pair\", peer);\n this.peer('me').emit('request/pair', peer);\n })\n this.EventPooling.signal(\"peer/disconnect\", (payload : {id : string}) => {\n let {id} = payload;\n let peer = this.peer(id, true);\n peer.emit(\"disconnect\", peer);\n })\n this.EventPooling.signal(\"accepted/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.info.info = info;\n peer.emit(\"accepted/pair\", peer);\n this.peer('me').emit('accepted/pairr', peer);\n })\n this.EventPooling.signal(\"end/pair\", (payload : {from : string,info: any}) => {\n let {from, info} = payload;\n let peer = this.peer(from, true);\n peer.emit(\"endPair\", info);\n this.peer('me').emit('endPair', from, info);\n })\n }\n public room(options: IRoomOptions | string) : Room\n {\n if(typeof options == \"string\")\n {\n if(this.rooms.has(options))\n {\n return this.rooms.get(options) as Room\n }\n }\n let room = new Room(this);\n room.setRoomOptions(options);\n this.emit('room');\n return room;\n }\n public peer(options: string | IRoomOptions, isActive = false) : Peer\n {\n if(typeof options == \"string\")\n {\n if(this.peers.has(options))\n {\n return this.peers.get(options) as Peer\n }\n if(this.pairs.has(options))\n {\n return this.pairs.get(options) as Peer\n }\n }\n let peer = new Peer(this);\n peer.setPeerOptions(options);\n peer.active = isActive;\n this.peers.set(peer.socketId as string, peer);\n this.emit('peer', peer);\n return peer;\n }\n};\n\ndeclare global {\n interface Window {\n MWSE: any;\n }\n}\n\nwindow.MWSE = MWSE;","import MWSE from \"frontend\";\n\nexport interface IConnection{\n endpoint: string;\n autoReconnect?: boolean | {\n timeout: number;\n }\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n\n public autoReconnect : boolean = true;\n public autoReconnectTimeout : number = 3000;\n public autoReconnectTimer? : number;\n constructor(mwse:MWSE, options: IConnection){\n\n if(options.endpoint == \"auto\")\n {\n const RootURL : string = ( document.currentScript).src\n let scriptPath = new URL(RootURL);\n let isSecurity = scriptPath.protocol == \"https:\";\n let dumeUrl = scriptPath.pathname.split('/').slice(0,-1).join('/') + '/';\n let wsSocket = new URL(dumeUrl, scriptPath);\n wsSocket.protocol = isSecurity ? 'wss:' : 'ws:';\n this.endpoint = new URL(wsSocket.href);\n }else{\n try{\n // Testing\n this.endpoint = new URL(options.endpoint);\n }catch{\n throw new Error(\"endpoint is required\")\n }\n }\n if(typeof options.autoReconnect == \"boolean\")\n {\n this.autoReconnect = true;\n }else if(options.autoReconnect)\n {\n this.autoReconnect = true;\n this.autoReconnectTimeout = options.autoReconnect.timeout;\n }\n }\n public connect()\n {\n if(this.autoReconnectTimer)\n {\n clearTimeout(this.autoReconnectTimer)\n };\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\n /**\n * Eğer bilinerek elle kapatıldıysa otomatik tekrar bağlanmasının\n * önüne geçmek için autoReconnect bayrağını her zaman kapalı tutmak gerekir\n */\n this.autoReconnect = false;\n this.ws.close();\n }\n public addWSEvents()\n {\n this.ws.addEventListener(\"open\", () => this.eventOpen());\n this.ws.addEventListener(\"close\", () => this.eventClose());\n this.ws.addEventListener(\"error\", () => this.eventError());\n this.ws.addEventListener(\"message\", ({data}) => this.eventMessage(data as string | ArrayBuffer));\n }\n private eventOpen()\n {\n this.connected = true;\n for (const callback of this.activeConnectionEvent) {\n callback(void 0);\n }\n }\n private eventClose()\n {\n for (const callback of this.passiveConnectionEvent) {\n callback(void 0);\n }\n this.connected = false;\n if(this.autoReconnect)\n {\n this.autoReconnectTimer = setTimeout(() => this.connect(), this.autoReconnectTimeout) as unknown as number;\n }\n }\n private eventError()\n {\n this.connected = false;\n }\n private recaivePackEvent : ((data:any) => any)[] = [];\n public onRecaivePack(func:(data:any) => any)\n {\n this.recaivePackEvent.push(func);\n }\n private activeConnectionEvent : Function[] = [];\n public onActive(func:Function)\n {\n if(this.connected)\n {\n func()\n }else{\n this.activeConnectionEvent.push(func);\n }\n }\n private passiveConnectionEvent : Function[] = [];\n public onPassive(func:Function)\n {\n if(!this.connected)\n {\n func()\n }else{\n this.passiveConnectionEvent.push(func);\n }\n }\n private eventMessage(data: string | ArrayBuffer)\n {\n if(typeof data == \"string\")\n {\n let $data = JSON.parse(data);\n for (const callback of this.recaivePackEvent) {\n callback($data);\n }\n }\n }\n public tranferToServer(data:any)\n {\n if(this.connected)\n {\n this.ws.send(JSON.stringify(data));\n }\n }\n}","import MWSE from \"./index\";\nimport { Message } from \"./WSTSProtocol\";\n\nexport default class EventPool\n{\n public wsts : MWSE;\n public events : Map = new Map();\n public signals : Map = new Map();\n\n public requests : Map = new Map();\n\n public count = 0;\n constructor(wsts:MWSE){\n this.wsts = wsts;\n }\n public request(msg: Message) : Promise\n {\n return new Promise((ok,rej) => {\n let id = ++this.count;\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\n this.wsts.WSTSProtocol.SendRequest(msg, id);\n })\n }\n public stream(msg: Message, callback: Function)\n {\n let id = ++this.count;\n this.wsts.WSTSProtocol.StartStream(msg, id);\n this.events.set(id,[\n (data:any) => {\n callback(data);\n },\n () => { }\n ]);\n }\n public signal(event: string, callback: Function)\n {\n let T = this.signals.get(event);\n if(!T)\n {\n this.signals.set(event, [callback]);\n }else{\n T.push(callback);\n }\n }\n}","export default class EventTarget\n{\n private events : {[key:string]:Function[]} = {};\n public emit(eventName :string, ...args:any[])\n {\n if(this.events[eventName])\n {\n for (const callback of this.events[eventName]) {\n callback(...args);\n }\n }\n }\n public on(eventName :string, callback:Function)\n {\n if(this.events[eventName])\n {\n this.events[eventName].push(callback)\n }else{\n this.events[eventName] = [callback];\n }\n }\n public activeScope : boolean = false;\n scope(f:Function)\n {\n if(this.activeScope)\n {\n f()\n }else{\n this.on('scope', f)\n }\n }\n}","import MWSE from \"frontend\";\n\nexport class IPPressure\n{\n public mwse : MWSE;\n public APNumber? : number;\n public APShortCode? : string;\n public APIPAddress? : string;\n constructor(mwse : MWSE){\n this.mwse = mwse;\n };\n public async allocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'alloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Allocated Access Point IP Address\");\n }\n }\n public async allocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'alloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Allocated Access Point Number\");\n }\n }\n public async allocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'alloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Allocated Access Point Short Code\");\n }\n }\n public async reallocAPIPAddress()\n {\n let {status,ip} = await this.mwse.EventPooling.request({\n type: 'realloc/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n ip?:string\n };\n if(status == 'success')\n {\n this.APIPAddress = ip;\n return ip;\n }else{\n throw new Error(\"Error Reallocated Access Point IP Address\");\n }\n }\n public async reallocAPNumber()\n {\n let {status,number} = await this.mwse.EventPooling.request({\n type: 'realloc/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n number?:number\n };\n if(status == 'success')\n {\n this.APNumber = number;\n return number;\n }else{\n throw new Error(\"Error Reallocated Access Point Number\");\n }\n }\n public async reallocAPShortCode()\n {\n let {status,code} = await this.mwse.EventPooling.request({\n type: 'realloc/APShortCode'\n }) as {\n status:\"fail\"|\"success\",\n code?:string\n };\n if(status == 'success')\n {\n this.APShortCode = code;\n return code;\n }else{\n throw new Error(\"Error Reallocated Access Point Short Code\");\n }\n }\n public async releaseAPIPAddress()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APIPAddress'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APIPAddress = undefined;\n }else{\n throw new Error(\"Error release Access Point IP Address\");\n }\n }\n public async releaseAPNumber()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APNumber'\n }) as {\n status:\"fail\"|\"success\",\n };\n if(status == 'success')\n {\n this.APNumber = undefined;\n }else{\n throw new Error(\"Error release Access Point Number\");\n }\n }\n public async releaseAPShortCode()\n {\n let {status} = await this.mwse.EventPooling.request({\n type: 'release/APShortCode'\n }) as {\n status:string\n };\n if(status == 'success')\n {\n this.APShortCode = undefined;\n }else{\n throw new Error(\"Error release Access Point Short Code\");\n }\n }\n public async queryAPIPAddress(ip:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APIPAddress',\n whois: ip\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPNumber(number:number)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APNumber',\n whois: number\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n public async queryAPShortCode(code:string)\n {\n let {status,socket} = await this.mwse.EventPooling.request({\n type: 'whois/APShortCode',\n whois: code\n }) as {\n status:\"fail\"|\"success\",\n socket?:string\n };\n if(status == \"success\")\n {\n return socket;\n }else{\n return null;\n }\n }\n}","import EventTarget from \"./EventTarget\";\nimport { PeerInfo } from \"./PeerInfo\";\nimport WebRTC from \"./WebRTC\";\nimport MWSE from \"./index\";\n\ninterface IPeerOptions{\n\n};\n\nenum IMessageSymbase\n{\n PayloadMessagePack = -12873.54,\n PayloadRTCBasePack = -12884.54\n}\n\n\nexport default class Peer extends EventTarget\n{\n public mwse : MWSE;\n public options : IPeerOptions = {};\n public socketId? : string;\n public selfSocket : boolean = false;\n public active : boolean = false;\n public info : PeerInfo;\n public rtc : WebRTC;\n public peerConnection : boolean = false;\n public primaryChannel : \"websocket\" | \"datachannel\" = \"datachannel\";\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.rtc = this.createRTC();\n this.info = new PeerInfo(this);\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == ':rtcpack:')\n {\n return this.rtc.emit(\"input\", data.payload)\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC(rtcConfig?: RTCConfiguration | undefined, rtcServers?: RTCIceServer[] | undefined) : WebRTC\n {\n this.rtc = new WebRTC(rtcConfig,rtcServers);\n this.rtc.peer = this;\n this.rtc.on(\"connected\", () => {\n this.peerConnection = true;\n });\n this.rtc.on('disconnected', () => {\n this.peerConnection = false;\n })\n this.rtc.on(\"output\",(payload:object) => {\n this.send({\n type: ':rtcpack:',\n payload: payload\n })\n });\n this.rtc.on(\"message\",(payload:object) => {\n this.emit(\"pack\",payload);\n });\n return this.rtc;\n }\n public setPeerOptions(options: string | IPeerOptions){\n if(typeof options == \"string\")\n {\n this.setSocketId(options)\n }else{\n this.options = options;\n }\n }\n public setSocketId(uuid: string){\n this.socketId = uuid;\n }\n async metadata() : Promise\n {\n if(this.socketId == 'me')\n {\n let result = await this.mwse.EventPooling.request({\n type:'my/socketid'\n });\n this.selfSocket = true;\n this.active ||= true;\n this.socketId = result;\n this.emit('scope');\n this.activeScope = true;\n return result;\n }\n };\n \n async request(pack:any){\n if(this.active)\n {\n return await this.mwse.request(this.socketId as string, pack);\n }\n };\n equalTo(peer : Peer | {socketId: string})\n {\n return this.socketId == peer.socketId;\n }\n async isReachable()\n {\n return await this.mwse.EventPooling.request({\n type:'is/reachable',\n to: this.socketId\n });\n }\n async enablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'everybody'\n });\n }\n async disablePairAuth(){\n await this.mwse.EventPooling.request({\n type:'auth/pair-system',\n value: 'disable'\n });\n }\n async enablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: true\n });\n }\n async disablePairInfo(){\n await this.mwse.EventPooling.request({\n type: 'connection/pairinfo',\n value: false\n });\n }\n async requestPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'request/pair',\n to: this.socketId\n });\n if(\n message == \"ALREADY-PAIRED\" ||\n message == \"ALREADY-REQUESTED\"\n )\n {\n console.warn(\"Already paired or pair requested\")\n };\n if(status == \"fail\")\n {\n console.error(\"Request Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async endPair()\n {\n await this.mwse.EventPooling.request({\n type:'end/pair',\n to: this.socketId\n });\n this.forget();\n }\n async acceptPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'accept/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async rejectPair()\n {\n let {message,status} = await this.mwse.EventPooling.request({\n type:'reject/pair',\n to: this.socketId\n });\n if(status == \"fail\")\n {\n console.error(\"Pair Error\",status, message);\n return false;\n }\n return true;\n }\n async getPairedList() : Promise\n {\n let {value} = await this.mwse.EventPooling.request({\n type:'pair/list',\n to: this.socketId\n });\n return value;\n }\n async send(pack: any){\n let isOpenedP2P = this.peerConnection && this.rtc?.active;\n let isOpenedServer = this.mwse.server.connected;\n let sendChannel : \"websocket\" | \"datachannel\";\n if(isOpenedP2P && isOpenedServer)\n {\n if(this.primaryChannel == \"websocket\")\n {\n sendChannel = \"websocket\"\n }else\n {\n sendChannel = \"datachannel\"\n }\n }else if(isOpenedServer){\n sendChannel = \"websocket\"\n }else{\n sendChannel = \"datachannel\"\n }\n\n if(sendChannel == \"websocket\")\n {\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.sendMessage(pack)\n }\n }\n async forget(){\n this.mwse.peers.delete(this.socketId as string);\n this.mwse.pairs.delete(this.socketId as string);\n }\n} ","import Peer from \"./Peer\";\n\nexport class PeerInfo\n{\n public peer : Peer;\n public info : {[key:string]: any} = {};\n constructor(mwse : Peer){\n this.peer = mwse;\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.peer.mwse.EventPooling.request(({\n type: \"peer/info\",\n peer: this.peer.socketId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.info;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.peer.mwse.WSTSProtocol.SendOnly({\n type: \"auth/info\",\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import P2PFileSender from \"./P2PFileSender\";\nimport Peer from \"./Peer\";\nimport \"webrtc-adapter\";\ninterface TransferStreamInfo\n{\n senders : RTCRtpSender[];\n recaivers : RTCRtpReceiver[];\n stream:MediaStream | undefined;\n id:string;\n name:string;\n}\n\nexport default class WebRTC\n{\n public static channels : Map = new Map();\n public static requireGC : boolean = false;\n public id : any;\n public active : boolean = false;\n public connectionStatus : \"closed\" | \"connected\" | \"connecting\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public iceStatus : \"checking\" | \"closed\" | \"completed\" | \"connected\" | \"disconnected\" | \"failed\" | \"new\" = \"new\";\n public gatheringStatus : \"complete\" | \"gathering\" | \"new\" = \"new\";\n public signalingStatus : \"\" | \"closed\" | \"have-local-offer\" | \"have-local-pranswer\" | \"have-remote-offer\" | \"have-remote-pranswer\" | \"stable\" = \"\"\n public rtc! : RTCPeerConnection;\n public recaivingStream : Map = new Map();\n public sendingStream : Map = new Map();\n public events : { [eventname:string]: Function[] } = {};\n public channel : RTCDataChannel | undefined;\n\n public static defaultRTCConfig : RTCConfiguration = {\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n };\n\n public isPolite() : boolean\n {\n let myId = this.peer?.mwse.peer('me').socketId as string;\n let peerId = this.peer?.socketId as string;\n return myId < peerId;\n }\n\n public static defaultICEServers : RTCIceServer[] = [{\n urls: \"stun:stun.l.google.com:19302\"\n },{\n urls: \"stun:stun1.l.google.com:19302\"\n },{\n urls: \"stun:stun2.l.google.com:19302\"\n },{\n urls: \"stun:stun3.l.google.com:19302\"\n },{\n urls: \"stun:stun4.l.google.com:19302\"\n }];\n\n public peer? : Peer;\n\n public FileTransportChannel? : P2PFileSender;\n\n public makingOffer = false;\n public ignoreOffer = false;\n public isSettingRemoteAnswerPending = false;\n\n candicatePack : RTCIceCandidate[] = [];\n\n\n constructor(\n rtcConfig?: RTCConfiguration,\n rtcServers?: RTCIceServer[]\n )\n {\n let config : any = {};\n\n if(rtcConfig)\n {\n Object.assign(\n config,\n WebRTC.defaultRTCConfig,\n rtcConfig\n )\n }else{\n Object.assign(\n config,\n WebRTC.defaultRTCConfig\n )\n }\n\n config.iceServers = rtcServers || WebRTC.defaultICEServers;\n\n this.rtc = new RTCPeerConnection(config as RTCConfiguration);\n this.rtc.addEventListener(\"connectionstatechange\",()=>{\n this.eventConnectionState();\n })\n this.rtc.addEventListener(\"icecandidate\",(...args)=>{\n this.eventIcecandidate(...args);\n })\n this.rtc.addEventListener(\"iceconnectionstatechange\",()=>{\n this.eventICEConnectionState();\n })\n this.rtc.addEventListener(\"icegatheringstatechange\",()=>{\n this.eventICEGatherinState();\n })\n this.rtc.addEventListener(\"negotiationneeded\",()=>{\n this.eventNogationNeeded();\n })\n this.rtc.addEventListener(\"signalingstatechange\",()=>{\n this.eventSignalingState();\n })\n this.rtc.addEventListener(\"track\",(...args)=>{\n this.eventTrack(...args);\n })\n this.rtc.addEventListener(\"datachannel\",(...args)=>{\n this.eventDatachannel(...args);\n })\n this.on('input',async (data:{[key:string]:any})=>{\n switch(data.type)\n {\n case \"icecandidate\":{\n try{\n if(this.rtc.remoteDescription){\n await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n }else{\n this.candicatePack.push(new RTCIceCandidate(data.value))\n }\n }catch(error){\n debugger;\n }finally{\n console.log(\"ICE Canbet\")\n }\n break;\n }\n case \"offer\":{\n let readyForOffer = !this.makingOffer && (this.rtc.signalingState == \"stable\" || this.isSettingRemoteAnswerPending);\n\n const offerCollision = !readyForOffer;\n\n this.ignoreOffer = !this.isPolite() && offerCollision;\n\n if(this.ignoreOffer){\n return;\n }\n\n this.isSettingRemoteAnswerPending = false;\n\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\n\n this.isSettingRemoteAnswerPending = false;\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n\n let answer = await this.rtc.createAnswer({\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n })\n await this.rtc.setLocalDescription(answer);\n this.send({\n type: 'answer',\n value: answer\n });\n break;\n }\n case \"answer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value))\n\n for (const candidate of this.candicatePack) {\n await this.rtc.addIceCandidate(candidate);\n }\n break;\n }\n case \"streamInfo\":{\n let {id,value} = data;\n let streamInfo = this.recaivingStream.get(id);\n if(!streamInfo)\n {\n this.recaivingStream.set(id,value as TransferStreamInfo);\n }else{\n this.recaivingStream.set(id,{\n ...streamInfo,\n ...value\n } as TransferStreamInfo);\n }\n this.send({\n type:'streamAccept',\n id\n })\n break;\n }\n case \"streamRemoved\":{\n let {id} = data;\n this.emit('stream:stopped', this.recaivingStream.get(id));\n this.recaivingStream.delete(id);\n break;\n }\n case \"streamAccept\":{\n let {id} = data;\n let sendingStream = this.sendingStream.get(id) as TransferStreamInfo;\n let senders = [];\n if(sendingStream && sendingStream.stream)\n {\n for (const track of sendingStream.stream.getTracks()) {\n senders.push(this.rtc.addTrack(track, sendingStream.stream));\n };\n sendingStream.senders = senders;\n }\n break;\n }\n case \"message\":{\n this.emit('message', data.payload);\n break;\n }\n }\n })\n }\n public addEventListener(event:string,callback: Function){\n (this.events[event] || (this.events[event]=[])).push(callback);\n };\n public on(event:string,callback: Function){\n this.addEventListener(event, callback)\n };\n public async dispatch(event:string,...args:any[]) : Promise {\n if(this.events[event])\n {\n for (const callback of this.events[event])\n {\n await callback(...args)\n }\n }\n }\n public async emit(event:string,...args:any[]) : Promise {\n await this.dispatch(event, ...args)\n }\n public connect()\n {\n if(!this.channel)\n {\n this.createDefaultDataChannel();\n }\n }\n public sendMessage(data: any)\n {\n this.send({\n type: 'message',\n payload: data\n });\n }\n public createDefaultDataChannel()\n {\n let dt = this.rtc.createDataChannel(':default:',{\n ordered: true\n });\n dt.addEventListener(\"open\",()=>{\n this.channel = dt;\n WebRTC.channels.set(this.id, this);\n this.active = true;\n });\n dt.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n dt.addEventListener(\"close\",()=>{\n this.channel = undefined;\n this.active = false;\n })\n }\n public destroy()\n {\n this.active = false;\n if(this.channel)\n {\n this.channel.close();\n this.channel = undefined;\n }\n if(this.rtc)\n {\n this.rtc.close();\n //this.rtc = undefined;\n };\n this.emit('disconnected');\n WebRTC.channels.delete(this.id);\n }\n public eventDatachannel(event: RTCDataChannelEvent)\n {\n if(event.channel.label == ':default:'){\n WebRTC.channels.set(this.id, this);\n this.channel = event.channel;\n this.active = true;\n event.channel.addEventListener(\"message\",({data})=>{\n let pack = JSON.parse(data);\n this.emit('input', pack);\n })\n event.channel.addEventListener(\"close\",()=>{\n this.channel = undefined;\n WebRTC.channels.delete(this.id);\n WebRTC.requireGC = true;\n })\n }else{\n this.emit('datachannel', event.channel);\n }\n }\n public send(data:object)\n {\n if(this.channel?.readyState == \"open\")\n {\n this.channel.send(JSON.stringify(data));\n }else{\n this.emit('output', data);\n }\n }\n public eventConnectionState()\n {\n this.connectionStatus = this.rtc.connectionState;\n if(this.connectionStatus == 'connected')\n {\n if(this.active == false)\n {\n this.emit('connected');\n }\n };\n\n if(this.connectionStatus == 'failed')\n {\n this.rtc.restartIce();\n };\n \n if(this.connectionStatus == \"closed\")\n {\n if(this.active)\n {\n this.destroy();\n }\n }\n }\n public eventIcecandidate(event: RTCPeerConnectionIceEvent)\n {\n if(event.candidate)\n {\n this.send({\n type:'icecandidate',\n value: event.candidate\n })\n }\n }\n public eventICEConnectionState()\n {\n this.iceStatus = this.rtc.iceConnectionState;\n }\n public eventICEGatherinState()\n {\n this.gatheringStatus = this.rtc.iceGatheringState;\n }\n public async eventNogationNeeded()\n {\n try{\n this.makingOffer = true;\n let offer = await this.rtc.createOffer({\n iceRestart: true,\n offerToReceiveAudio: true,\n offerToReceiveVideo: true\n });\n await this.rtc.setLocalDescription(offer);\n this.send({\n type: 'offer',\n value: offer\n });\n }catch(error){\n console.error(`Nogation Error:`, error)\n }\n finally{\n this.makingOffer = false;\n }\n }\n public eventSignalingState()\n {\n this.signalingStatus = this.rtc.signalingState;\n }\n public eventTrack(event: RTCTrackEvent)\n {\n let rtpRecaiver = event.receiver;\n if(event.streams.length)\n {\n for (const stream of event.streams) {\n let streamInfo = this.recaivingStream.get(stream.id) as TransferStreamInfo;\n (streamInfo.recaivers || (streamInfo.recaivers = [])).push(rtpRecaiver);\n if((this.recaivingStream.get(stream.id) as {stream : MediaStream | undefined}).stream == null)\n {\n streamInfo.stream = stream;\n this.emit('stream:added', this.recaivingStream.get(stream.id));\n }else{\n streamInfo.stream = stream;\n }\n }\n }\n }\n public sendStream(stream:MediaStream,name:string,info:{[key:string]:any}){\n this.send({\n type: 'streamInfo',\n id: stream.id,\n value: {\n ...info,\n name: name\n }\n });\n this.sendingStream.set(stream.id,{\n ...info,\n id:stream.id,\n name: name,\n stream\n } as TransferStreamInfo);\n };\n public stopStream(_stream:MediaStream){\n if(this.connectionStatus != 'connected'){\n return\n }\n if(this.sendingStream.has(_stream.id))\n {\n let {stream} = this.sendingStream.get(_stream.id) as {stream:MediaStream};\n \n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n \n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n this.sendingStream.delete(_stream.id)\n }\n }\n public stopAllStreams()\n {\n if(this.connectionStatus != 'connected'){\n return\n }\n for (const [, {stream}] of this.sendingStream) {\n if(stream == undefined)\n {\n continue;\n }\n for (const track of stream.getTracks()) {\n for (const RTCPSender of this.rtc.getSenders()) {\n if(RTCPSender.track?.id == track.id)\n {\n this.rtc.removeTrack(RTCPSender);\n }\n }\n }\n this.send({\n type: 'streamRemoved',\n id: stream.id\n });\n };\n \n this.sendingStream.clear();\n }\n public async SendFile(file:File, meta: object)\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n await this.FileTransportChannel.SendFile(file, meta);\n }\n public async RecaiveFile(\n chnlCount:number,\n filemeta: {\n name: string;\n type: string;\n },\n totalSize: number\n ) : Promise\n {\n if(!this.peer)\n {\n throw new Error(\"Peer is not ready\");\n }\n this.FileTransportChannel = new P2PFileSender(this, this.peer);\n\n return await new Promise(recaivedFile => {\n if(this.FileTransportChannel)\n {\n this.FileTransportChannel.RecaiveFile(\n this.rtc,\n filemeta,\n chnlCount,\n totalSize,\n (file: File) => {\n recaivedFile(file)\n }\n );\n }\n })\n }\n}\n\nWebRTC.requireGC = false;\nsetInterval(()=>{\n if(WebRTC.requireGC == false) return;\n let img = document.createElement(\"img\");\n img.src = window.URL.createObjectURL(new Blob([new ArrayBuffer(5e+7)]));\n img.onerror = function() {\n window.URL.revokeObjectURL(this.src);\n };\n WebRTC.requireGC = false;\n}, 3000);\n\ndeclare global {\n interface MediaStream {\n senders : RTCRtpSender[];\n }\n}","import \"webrtc-adapter\";\nimport WebRTC from \"./WebRTC\";\nimport Peer from \"./Peer\";\n\n\n\nexport default class P2PFileSender\n{\n public rtc : RTCPeerConnection;\n public peer : Peer;\n public webrtc : WebRTC;\n\n public totalSize : number = 0;\n public isReady : boolean = false;\n public isStarted : boolean = false;\n public isSending : boolean = false;\n public isRecaiving : boolean = false;\n public processedSize : number = 0;\n public recaivedFile? : File;\n\n public bufferSizePerChannel : number = 10e6;\n public bufferSizePerPack : number = 10e3;\n public safeBufferSizePerPack : number = 10e3 - 1;\n\n public constructor(webrtc : WebRTC, peer : Peer)\n {\n this.webrtc = webrtc;\n this.rtc = webrtc.rtc;\n this.peer = peer;\n }\n public async RecaiveFile(\n _rtc: RTCPeerConnection,\n fileMetadata: {name:string, type:string},\n channelCount: number,\n _totalSize: number,\n onEnded: Function\n )\n {\n //let totals = {};\n // let index = 0;\n /*setChannelStatus(Array.from({length:channelCount}).map((e, index) => {\n return {\n name: `${index+1}. Kanal`,\n current: 0,\n currentTotal: 0,\n total: 0\n }\n }));*/\n let parts : Blob[] = [];\n this.webrtc.on('datachannel',(datachannel:RTCDataChannel) => {\n //let channelIndex = index++;\n let current = 0;\n let totalSize = 0;\n let currentPart = 0;\n let bufferAmount : ArrayBuffer[] = [];\n datachannel.onmessage = function({data}){\n if(totalSize == 0)\n {\n let {\n size,\n part,\n } = JSON.parse(data);\n totalSize = size;\n currentPart = part;\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: totalSize,\n current: 0\n }\n });*/\n datachannel.send(\"READY\");\n }else{\n current += data.byteLength;\n bufferAmount.push(data);\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: data.byteLength + n.current,\n currentTotal: data.byteLength + n.currentTotal,\n }\n });\n setProcessedSize(n => n + data.byteLength);*/\n if(current == totalSize)\n {\n parts[currentPart] = new Blob(bufferAmount);\n bufferAmount = []; \n //totals[datachannel.label] += totalSize;\n totalSize = 0;\n currentPart = 0;\n current = 0;\n datachannel.send(\"TOTAL_RECAIVED\");\n }\n }\n };\n datachannel.onclose = () => {\n channelCount--;\n if(channelCount == 0)\n {\n let file = new File(parts, fileMetadata.name, {\n type: fileMetadata.type,\n lastModified: +new Date\n });\n onEnded(file);\n }\n };\n })\n }\n public async SendFile(\n file: File,\n metadata: object\n )\n {\n this.isSending = true;\n this.isStarted = true;\n\n\n let buffer = await file.arrayBuffer();\n let partCount = Math.ceil(buffer.byteLength / 10e6);\n let channelCount = Math.min(5, partCount);\n\n if(this.webrtc.iceStatus != \"connected\")\n {\n throw new Error(\"WebRTC is a not ready\")\n }\n\n this.peer.send({\n type: 'file',\n name: file.name,\n size: file.size,\n mimetype: file.type,\n partCount,\n channelCount,\n metadata: metadata\n });\n\n let channels : RTCDataChannel[] = [];\n\n for(let channelIndex = 0; channelIndex < channelCount; channelIndex++)\n {\n let channel = this.rtc.createDataChannel(\"\\\\?\\\\file_\" + channelIndex);\n channel.binaryType = \"arraybuffer\";\n await new Promise(ok => {\n channel.onopen = () => {\n ok(void 0);\n }\n });\n channels.push(channel);\n };\n\n let currentPart = 0;\n let next = () => {\n if(currentPart < partCount)\n {\n let bufferPart = buffer.slice(currentPart * 10e6, currentPart * 10e6 + 10e6)\n currentPart++;\n return [bufferPart, currentPart - 1];\n };\n return [false,0];\n };\n let spyChannelIndex = channels.length;\n await new Promise(ok => {\n for (let channelIndex = 0; channelIndex < channels.length; channelIndex++)\n {\n this.sendPartition(\n channels[channelIndex],\n next,\n channelIndex,\n () => {\n spyChannelIndex--;\n if(spyChannelIndex == 0)\n {\n this.isSending = false;\n this.isStarted = false;\n ok(undefined)\n }\n }\n );\n }\n })\n }\n protected sendPartition(\n channel: RTCDataChannel,\n nextblob10mb: () => (number | ArrayBuffer)[] | (number | boolean)[],\n _channelIndex: number,\n onEnded: Function\n )\n {\n let [currentBuffer,currentPartition] = nextblob10mb();\n let currentPart = 0;\n let next = () => {\n if(!(currentBuffer instanceof ArrayBuffer))\n {\n return;\n }\n let bufferPart = currentBuffer.slice(currentPart * 16e3, currentPart * 16e3 + 16e3)\n currentPart++;\n if(bufferPart.byteLength != 0)\n {\n /*\n updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n current: bufferPart.byteLength + n.current,\n currentTotal: bufferPart.byteLength + n.currentTotal\n }\n });\n setProcessedSize(n => n + bufferPart.byteLength);\n */\n return bufferPart\n }\n };\n channel.addEventListener(\"message\",({data}) => {\n if(data == \"READY\")\n {\n this.sendFileChannel(channel, next)\n }\n if(data == \"TOTAL_RECAIVED\")\n {\n [currentBuffer,currentPartition] = nextblob10mb();\n currentPart = 0;\n if(currentBuffer != false)\n {\n /*updateChannelStatus(channelIndex, n => {\n return {\n ...n,\n total: currentBuffer.byteLength,\n current: 0,\n }\n });*/\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }else{\n channel.close();\n onEnded();\n }\n }\n });\n channel.send(JSON.stringify({\n size: (currentBuffer as ArrayBuffer).byteLength,\n part: currentPartition\n }))\n }\n protected sendFileChannel(\n channel: RTCDataChannel,\n getNextBlob: () => ArrayBuffer | undefined\n )\n {\n channel.addEventListener(\"bufferedamountlow\",function(){\n let buffer = getNextBlob();\n if(buffer)\n {\n channel.send(buffer);\n }\n });\n channel.bufferedAmountLowThreshold = 16e3 - 1;\n let c = getNextBlob();\n c && channel.send(c);\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","/*\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 firefoxShim from './firefox/firefox_shim';\nimport * as safariShim from './safari/safari_shim';\nimport * as commonShim from './common_shim';\nimport * as sdp from 'sdp';\n\n// Shimming starts here.\nexport function adapterFactory({window} = {}, options = {\n shimChrome: true,\n shimFirefox: 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 // Expose sdp as a convenience. For production apps include directly.\n sdp,\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 commonShim.shimParameterlessSetLocalDescription(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.shimRTCIceCandidateRelayProtocol(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 commonShim.shimParameterlessSetLocalDescription(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 '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 commonShim.shimParameterlessSetLocalDescription(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.shimRTCIceCandidateRelayProtocol(window, browserDetails);\n commonShim.shimMaxMessageSize(window, browserDetails);\n commonShim.shimSendThrowTypeError(window, browserDetails);\n commonShim.removeExtmapAllowMixed(window, browserDetails);\n break;\n default:\n logging('Unsupported browser!');\n break;\n }\n\n return adapter;\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'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 !window.navigator.userAgent) {\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 // 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 (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';\n\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimMediaStream(window) {\n window.MediaStream = window.MediaStream || window.webkitMediaStream;\n}\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCPeerConnection && !('ontrack' in\n window.RTCPeerConnection.prototype)) {\n Object.defineProperty(window.RTCPeerConnection.prototype, 'ontrack', {\n get() {\n return this._ontrack;\n },\n set(f) {\n if (this._ontrack) {\n this.removeEventListener('track', this._ontrack);\n }\n this.addEventListener('track', this._ontrack = f);\n },\n enumerable: true,\n configurable: true\n });\n const origSetRemoteDescription =\n window.RTCPeerConnection.prototype.setRemoteDescription;\n window.RTCPeerConnection.prototype.setRemoteDescription =\n function setRemoteDescription() {\n if (!this._ontrackpoly) {\n this._ontrackpoly = (e) => {\n // onaddstream does not fire when a track is added to an existing\n // stream. But stream.onaddtrack is implemented so we use that.\n e.stream.addEventListener('addtrack', te => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === te.track.id);\n } else {\n receiver = {track: te.track};\n }\n\n const event = new Event('track');\n event.track = te.track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n e.stream.getTracks().forEach(track => {\n let receiver;\n if (window.RTCPeerConnection.prototype.getReceivers) {\n receiver = this.getReceivers()\n .find(r => r.track && r.track.id === track.id);\n } else {\n receiver = {track};\n }\n const event = new Event('track');\n event.track = track;\n event.receiver = receiver;\n event.transceiver = {receiver};\n event.streams = [e.stream];\n this.dispatchEvent(event);\n });\n };\n this.addEventListener('addstream', this._ontrackpoly);\n }\n return origSetRemoteDescription.apply(this, arguments);\n };\n } else {\n // even if RTCRtpTransceiver is in window, it is only used and\n // emitted in unified-plan. Unfortunately this means we need\n // to unconditionally wrap the event.\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n if (!e.transceiver) {\n Object.defineProperty(e, 'transceiver',\n {value: {receiver: e.receiver}});\n }\n return e;\n });\n }\n}\n\nexport function shimGetSendersWithDtmf(window) {\n // Overrides addTrack/removeTrack, depends on shimAddTrackRemoveTrack.\n if (typeof window === 'object' && window.RTCPeerConnection &&\n !('getSenders' in window.RTCPeerConnection.prototype) &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype) {\n const shimSenderWithDtmf = function(pc, track) {\n return {\n track,\n get dtmf() {\n if (this._dtmf === undefined) {\n if (track.kind === 'audio') {\n this._dtmf = pc.createDTMFSender(track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n },\n _pc: pc\n };\n };\n\n // augment addTrack when getSenders is not available.\n if (!window.RTCPeerConnection.prototype.getSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n this._senders = this._senders || [];\n return this._senders.slice(); // return a copy of the internal state.\n };\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n let sender = origAddTrack.apply(this, arguments);\n if (!sender) {\n sender = shimSenderWithDtmf(this, track);\n this._senders.push(sender);\n }\n return sender;\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n origRemoveTrack.apply(this, arguments);\n const idx = this._senders.indexOf(sender);\n if (idx !== -1) {\n this._senders.splice(idx, 1);\n }\n };\n }\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._senders = this._senders || [];\n origAddStream.apply(this, [stream]);\n stream.getTracks().forEach(track => {\n this._senders.push(shimSenderWithDtmf(this, track));\n });\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._senders = this._senders || [];\n origRemoveStream.apply(this, [stream]);\n\n stream.getTracks().forEach(track => {\n const sender = this._senders.find(s => s.track === track);\n if (sender) { // remove sender\n this._senders.splice(this._senders.indexOf(sender), 1);\n }\n });\n };\n } else if (typeof window === 'object' && window.RTCPeerConnection &&\n 'getSenders' in window.RTCPeerConnection.prototype &&\n 'createDTMFSender' in window.RTCPeerConnection.prototype &&\n window.RTCRtpSender &&\n !('dtmf' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n\n Object.defineProperty(window.RTCRtpSender.prototype, 'dtmf', {\n get() {\n if (this._dtmf === undefined) {\n if (this.track.kind === 'audio') {\n this._dtmf = this._pc.createDTMFSender(this.track);\n } else {\n this._dtmf = null;\n }\n }\n return this._dtmf;\n }\n });\n }\n}\n\nexport function shimGetStats(window) {\n if (!window.RTCPeerConnection) {\n return;\n }\n\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n\n // If selector is a function then we are in the old style stats so just\n // pass back the original getStats format to avoid breaking old users.\n if (arguments.length > 0 && typeof selector === 'function') {\n return origGetStats.apply(this, arguments);\n }\n\n // When spec-style getStats is supported, return those when called with\n // either no arguments or the selector argument is null.\n if (origGetStats.length === 0 && (arguments.length === 0 ||\n typeof selector !== 'function')) {\n return origGetStats.apply(this, []);\n }\n\n const fixChromeStats_ = function(response) {\n const standardReport = {};\n const reports = response.result();\n reports.forEach(report => {\n const standardStats = {\n id: report.id,\n timestamp: report.timestamp,\n type: {\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n }[report.type] || report.type\n };\n report.names().forEach(name => {\n standardStats[name] = report.stat(name);\n });\n standardReport[standardStats.id] = standardStats;\n });\n\n return standardReport;\n };\n\n // shim getStats with maplike support\n const makeMapStats = function(stats) {\n return new Map(Object.keys(stats).map(key => [key, stats[key]]));\n };\n\n if (arguments.length >= 2) {\n const successCallbackWrapper_ = function(response) {\n onSucc(makeMapStats(fixChromeStats_(response)));\n };\n\n return origGetStats.apply(this, [successCallbackWrapper_,\n selector]);\n }\n\n // promise-support\n return new Promise((resolve, reject) => {\n origGetStats.apply(this, [\n function(response) {\n resolve(makeMapStats(fixChromeStats_(response)));\n }, reject]);\n }).then(onSucc, onErr);\n };\n}\n\nexport function shimSenderReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender && window.RTCRtpReceiver)) {\n return;\n }\n\n // shim sender stats.\n if (!('getStats' in window.RTCRtpSender.prototype)) {\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n const sender = this;\n return this._pc.getStats().then(result =>\n /* Note: this will include stats of all senders that\n * send a track with the same id as sender.track as\n * it is not possible to identify the RTCRtpSender.\n */\n utils.filterStats(result, sender.track, true));\n };\n }\n\n // shim receiver stats.\n if (!('getStats' in window.RTCRtpReceiver.prototype)) {\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers =\n function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n const receiver = this;\n return this._pc.getStats().then(result =>\n utils.filterStats(result, receiver.track, false));\n };\n }\n\n if (!('getStats' in window.RTCRtpSender.prototype &&\n 'getStats' in window.RTCRtpReceiver.prototype)) {\n return;\n }\n\n // shim RTCPeerConnection.getStats(track).\n const origGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n if (arguments.length > 0 &&\n arguments[0] instanceof window.MediaStreamTrack) {\n const track = arguments[0];\n let sender;\n let receiver;\n let err;\n this.getSenders().forEach(s => {\n if (s.track === track) {\n if (sender) {\n err = true;\n } else {\n sender = s;\n }\n }\n });\n this.getReceivers().forEach(r => {\n if (r.track === track) {\n if (receiver) {\n err = true;\n } else {\n receiver = r;\n }\n }\n return r.track === track;\n });\n if (err || (sender && receiver)) {\n return Promise.reject(new DOMException(\n 'There are more than one sender or receiver for the track.',\n 'InvalidAccessError'));\n } else if (sender) {\n return sender.getStats();\n } else if (receiver) {\n return receiver.getStats();\n }\n return Promise.reject(new DOMException(\n 'There is no sender or receiver for the track.',\n 'InvalidAccessError'));\n }\n return origGetStats.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrackWithNative(window) {\n // shim addTrack/removeTrack with native variants in order to make\n // the interactions with legacy getLocalStreams behave as in other browsers.\n // Keeps a mapping stream.id => [stream, rtpsenders...]\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n return Object.keys(this._shimmedLocalStreams)\n .map(streamId => this._shimmedLocalStreams[streamId][0]);\n };\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (!stream) {\n return origAddTrack.apply(this, arguments);\n }\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n const sender = origAddTrack.apply(this, arguments);\n if (!this._shimmedLocalStreams[stream.id]) {\n this._shimmedLocalStreams[stream.id] = [stream, sender];\n } else if (this._shimmedLocalStreams[stream.id].indexOf(sender) === -1) {\n this._shimmedLocalStreams[stream.id].push(sender);\n }\n return sender;\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n const existingSenders = this.getSenders();\n origAddStream.apply(this, arguments);\n const newSenders = this.getSenders()\n .filter(newSender => existingSenders.indexOf(newSender) === -1);\n this._shimmedLocalStreams[stream.id] = [stream].concat(newSenders);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n delete this._shimmedLocalStreams[stream.id];\n return origRemoveStream.apply(this, arguments);\n };\n\n const origRemoveTrack = window.RTCPeerConnection.prototype.removeTrack;\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n this._shimmedLocalStreams = this._shimmedLocalStreams || {};\n if (sender) {\n Object.keys(this._shimmedLocalStreams).forEach(streamId => {\n const idx = this._shimmedLocalStreams[streamId].indexOf(sender);\n if (idx !== -1) {\n this._shimmedLocalStreams[streamId].splice(idx, 1);\n }\n if (this._shimmedLocalStreams[streamId].length === 1) {\n delete this._shimmedLocalStreams[streamId];\n }\n });\n }\n return origRemoveTrack.apply(this, arguments);\n };\n}\n\nexport function shimAddTrackRemoveTrack(window, browserDetails) {\n if (!window.RTCPeerConnection) {\n return;\n }\n // shim addTrack and removeTrack.\n if (window.RTCPeerConnection.prototype.addTrack &&\n browserDetails.version >= 65) {\n return shimAddTrackRemoveTrackWithNative(window);\n }\n\n // also shim pc.getLocalStreams when addTrack is shimmed\n // to return the original streams.\n const origGetLocalStreams = window.RTCPeerConnection.prototype\n .getLocalStreams;\n window.RTCPeerConnection.prototype.getLocalStreams =\n function getLocalStreams() {\n const nativeStreams = origGetLocalStreams.apply(this);\n this._reverseStreams = this._reverseStreams || {};\n return nativeStreams.map(stream => this._reverseStreams[stream.id]);\n };\n\n const origAddStream = window.RTCPeerConnection.prototype.addStream;\n window.RTCPeerConnection.prototype.addStream = function addStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n stream.getTracks().forEach(track => {\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n });\n // Add identity mapping for consistency with addTrack.\n // Unless this is being used with a stream from addTrack.\n if (!this._reverseStreams[stream.id]) {\n const newStream = new window.MediaStream(stream.getTracks());\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n stream = newStream;\n }\n origAddStream.apply(this, [stream]);\n };\n\n const origRemoveStream = window.RTCPeerConnection.prototype.removeStream;\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n\n origRemoveStream.apply(this, [(this._streams[stream.id] || stream)]);\n delete this._reverseStreams[(this._streams[stream.id] ?\n this._streams[stream.id].id : stream.id)];\n delete this._streams[stream.id];\n };\n\n window.RTCPeerConnection.prototype.addTrack =\n function addTrack(track, stream) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n const streams = [].slice.call(arguments, 1);\n if (streams.length !== 1 ||\n !streams[0].getTracks().find(t => t === track)) {\n // this is not fully correct but all we can manage without\n // [[associated MediaStreams]] internal slot.\n throw new DOMException(\n 'The adapter.js addTrack polyfill only supports a single ' +\n ' stream which is associated with the specified track.',\n 'NotSupportedError');\n }\n\n const alreadyExists = this.getSenders().find(s => s.track === track);\n if (alreadyExists) {\n throw new DOMException('Track already exists.',\n 'InvalidAccessError');\n }\n\n this._streams = this._streams || {};\n this._reverseStreams = this._reverseStreams || {};\n const oldStream = this._streams[stream.id];\n if (oldStream) {\n // this is using odd Chrome behaviour, use with caution:\n // https://bugs.chromium.org/p/webrtc/issues/detail?id=7815\n // Note: we rely on the high-level addTrack/dtmf shim to\n // create the sender with a dtmf sender.\n oldStream.addTrack(track);\n\n // Trigger ONN async.\n Promise.resolve().then(() => {\n this.dispatchEvent(new Event('negotiationneeded'));\n });\n } else {\n const newStream = new window.MediaStream([track]);\n this._streams[stream.id] = newStream;\n this._reverseStreams[newStream.id] = stream;\n this.addStream(newStream);\n }\n return this.getSenders().find(s => s.track === track);\n };\n\n // replace the internal stream id with the external one and\n // vice versa.\n function replaceInternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(internalStream.id, 'g'),\n externalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n function replaceExternalStreamId(pc, description) {\n let sdp = description.sdp;\n Object.keys(pc._reverseStreams || []).forEach(internalId => {\n const externalStream = pc._reverseStreams[internalId];\n const internalStream = pc._streams[externalStream.id];\n sdp = sdp.replace(new RegExp(externalStream.id, 'g'),\n internalStream.id);\n });\n return new RTCSessionDescription({\n type: description.type,\n sdp\n });\n }\n ['createOffer', 'createAnswer'].forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n const args = arguments;\n const isLegacyCall = arguments.length &&\n typeof arguments[0] === 'function';\n if (isLegacyCall) {\n return nativeMethod.apply(this, [\n (description) => {\n const desc = replaceInternalStreamId(this, description);\n args[0].apply(null, [desc]);\n },\n (err) => {\n if (args[1]) {\n args[1].apply(null, err);\n }\n }, arguments[2]\n ]);\n }\n return nativeMethod.apply(this, arguments)\n .then(description => replaceInternalStreamId(this, description));\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n\n const origSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n if (!arguments.length || !arguments[0].type) {\n return origSetLocalDescription.apply(this, arguments);\n }\n arguments[0] = replaceExternalStreamId(this, arguments[0]);\n return origSetLocalDescription.apply(this, arguments);\n };\n\n // TODO: mangle getStats: https://w3c.github.io/webrtc-stats/#dom-rtcmediastreamstats-streamidentifier\n\n const origLocalDescription = Object.getOwnPropertyDescriptor(\n window.RTCPeerConnection.prototype, 'localDescription');\n Object.defineProperty(window.RTCPeerConnection.prototype,\n 'localDescription', {\n get() {\n const description = origLocalDescription.get.apply(this);\n if (description.type === '') {\n return description;\n }\n return replaceInternalStreamId(this, description);\n }\n });\n\n window.RTCPeerConnection.prototype.removeTrack =\n function removeTrack(sender) {\n if (this.signalingState === 'closed') {\n throw new DOMException(\n 'The RTCPeerConnection\\'s signalingState is \\'closed\\'.',\n 'InvalidStateError');\n }\n // We can not yet check for sender instanceof RTCRtpSender\n // since we shim RTPSender. So we check if sender._pc is set.\n if (!sender._pc) {\n throw new DOMException('Argument 1 of RTCPeerConnection.removeTrack ' +\n 'does not implement interface RTCRtpSender.', 'TypeError');\n }\n const isLocal = sender._pc === this;\n if (!isLocal) {\n throw new DOMException('Sender was not created by this connection.',\n 'InvalidAccessError');\n }\n\n // Search for the native stream the senders track belongs to.\n this._streams = this._streams || {};\n let stream;\n Object.keys(this._streams).forEach(streamid => {\n const hasTrack = this._streams[streamid].getTracks()\n .find(track => sender.track === track);\n if (hasTrack) {\n stream = this._streams[streamid];\n }\n });\n\n if (stream) {\n if (stream.getTracks().length === 1) {\n // if this is the last track of the stream, remove the stream. This\n // takes care of any shimmed _senders.\n this.removeStream(this._reverseStreams[stream.id]);\n } else {\n // relying on the same odd chrome behaviour as above.\n stream.removeTrack(sender.track);\n }\n this.dispatchEvent(new Event('negotiationneeded'));\n }\n };\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (!window.RTCPeerConnection && window.webkitRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.webkitRTCPeerConnection;\n }\n if (!window.RTCPeerConnection) {\n return;\n }\n\n // shim implicit creation of RTCSessionDescription/RTCIceCandidate\n if (browserDetails.version < 53) {\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n}\n\n// Attempt to fix ONN in plan-b mode.\nexport function fixNegotiationNeeded(window, browserDetails) {\n utils.wrapPeerConnectionEvent(window, 'negotiationneeded', e => {\n const pc = e.target;\n if (browserDetails.version < 72 || (pc.getConfiguration &&\n pc.getConfiguration().sdpSemantics === 'plan-b')) {\n if (pc.signalingState !== 'stable') {\n return;\n }\n }\n return e;\n });\n}\n","/*\n * Copyright (c) 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\n ? {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';\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 // WebIDL input coercion and validation\n let sendEncodings = arguments[1] && arguments[1].sendEncodings;\n if (sendEncodings === undefined) {\n sendEncodings = [];\n }\n sendEncodings = [...sendEncodings];\n const shouldPerformCheck = sendEncodings.length > 0;\n if (shouldPerformCheck) {\n // If sendEncodings params are provided, validate grammar\n 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 = sendEncodings;\n sender.sendEncodings = 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/* 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'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.urls === undefined && server.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', {direction: 'recvonly'});\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', {direction: 'recvonly'});\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","/*\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.substring(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 for (const key in parsedCandidate) {\n if (!(key in nativeCandidate)) {\n Object.defineProperty(nativeCandidate, key,\n {value: parsedCandidate[key]});\n }\n }\n\n // Override serializer to not serialize the extra attributes.\n nativeCandidate.toJSON = function toJSON() {\n return {\n candidate: nativeCandidate.candidate,\n sdpMid: nativeCandidate.sdpMid,\n sdpMLineIndex: nativeCandidate.sdpMLineIndex,\n usernameFragment: nativeCandidate.usernameFragment,\n };\n };\n return nativeCandidate;\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 shimRTCIceCandidateRelayProtocol(window) {\n if (!window.RTCIceCandidate || (window.RTCIceCandidate && 'relayProtocol' in\n window.RTCIceCandidate.prototype)) {\n return;\n }\n\n // Hook up the augmented candidate in onicecandidate and\n // addEventListener('icecandidate', ...)\n utils.wrapPeerConnectionEvent(window, 'icecandidate', e => {\n if (e.candidate) {\n const parsedCandidate = SDPUtils.parseCandidate(e.candidate.candidate);\n if (parsedCandidate.type === 'relay') {\n // This is a libwebrtc-specific mapping of local type preference\n // to relayProtocol.\n e.candidate.relayProtocol = {\n 0: 'tls',\n 1: 'tcp',\n 2: 'udp',\n }[parsedCandidate.priority >> 24];\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].substring(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// Note: Make sure to call this ahead of APIs that modify\n// setLocalDescription.length\nexport function shimParameterlessSetLocalDescription(window, browserDetails) {\n if (!(window.RTCPeerConnection && window.RTCPeerConnection.prototype)) {\n return;\n }\n const nativeSetLocalDescription =\n window.RTCPeerConnection.prototype.setLocalDescription;\n if (!nativeSetLocalDescription || nativeSetLocalDescription.length === 0) {\n return;\n }\n window.RTCPeerConnection.prototype.setLocalDescription =\n function setLocalDescription() {\n let desc = arguments[0] || {};\n if (typeof desc !== 'object' || (desc.type && desc.sdp)) {\n return nativeSetLocalDescription.apply(this, arguments);\n }\n // The remaining steps should technically happen when SLD comes off the\n // RTCPeerConnection's operations chain (not ahead of going on it), but\n // this is too difficult to shim. Instead, this shim only covers the\n // common case where the operations chain is empty. This is imperfect, but\n // should cover many cases. Rationale: Even if we can't reduce the glare\n // window to zero on imperfect implementations, there's value in tapping\n // into the perfect negotiation pattern that several browsers support.\n desc = {type: desc.type, sdp: desc.sdp};\n if (!desc.type) {\n switch (this.signalingState) {\n case 'stable':\n case 'have-local-offer':\n case 'have-remote-pranswer':\n desc.type = 'offer';\n break;\n default:\n desc.type = 'answer';\n break;\n }\n }\n if (desc.sdp || (desc.type !== 'offer' && desc.type !== 'answer')) {\n return nativeSetLocalDescription.apply(this, [desc]);\n }\n const func = desc.type === 'offer' ? this.createOffer : this.createAnswer;\n return func.apply(this)\n .then(d => nativeSetLocalDescription.apply(this, [d]));\n };\n}\n","/* eslint-env node */\n'use strict';\n\n// SDP helpers.\nconst 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).substring(2, 12);\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(line => line.trim());\n};\n// Splits SDP into sessionpart and mediasections. Ensures CRLF.\nSDPUtils.splitSections = function(blob) {\n const parts = blob.split('\\nm=');\n return parts.map((part, index) => (index > 0 ?\n 'm=' + part : part).trim() + '\\r\\n');\n};\n\n// Returns the session description.\nSDPUtils.getDescription = function(blob) {\n const sections = SDPUtils.splitSections(blob);\n return sections && sections[0];\n};\n\n// Returns the individual media sections.\nSDPUtils.getMediaSections = function(blob) {\n const 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(line => line.indexOf(prefix) === 0);\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\"\n// Input can be prefixed with a=.\nSDPUtils.parseCandidate = function(line) {\n let 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 const candidate = {\n foundation: parts[0],\n component: {1: 'rtp', 2: 'rtcp'}[parts[1]] || parts[1],\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 (let 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 compatibility.\n candidate.usernameFragment = parts[i + 1];\n break;\n default: // extension handling, in particular ufrag. Don't overwrite.\n if (candidate[parts[i]] === undefined) {\n candidate[parts[i]] = parts[i + 1];\n }\n break;\n }\n }\n return candidate;\n};\n\n// Translates a candidate object into SDP candidate attribute.\n// This does not include the a= prefix!\nSDPUtils.writeCandidate = function(candidate) {\n const sdp = [];\n sdp.push(candidate.foundation);\n\n const component = candidate.component;\n if (component === 'rtp') {\n sdp.push(1);\n } else if (component === 'rtcp') {\n sdp.push(2);\n } else {\n sdp.push(component);\n }\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 const 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// Sample input:\n// a=ice-options:foo bar\nSDPUtils.parseIceOptions = function(line) {\n return line.substring(14).split(' ');\n};\n\n// Parses a rtpmap line, returns RTCRtpCoddecParameters. Sample input:\n// a=rtpmap:111 opus/48000/2\nSDPUtils.parseRtpMap = function(line) {\n let parts = line.substring(9).split(' ');\n const 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// Generates a rtpmap line from RTCRtpCodecCapability or\n// RTCRtpCodecParameters.\nSDPUtils.writeRtpMap = function(codec) {\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n const 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 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 const parts = line.substring(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 attributes: parts.slice(2).join(' '),\n };\n};\n\n// Generates an 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 +\n (headerExtension.attributes ? ' ' + headerExtension.attributes : '') +\n '\\r\\n';\n};\n\n// Parses a fmtp 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 const parsed = {};\n let kv;\n const parts = line.substring(line.indexOf(' ') + 1).split(';');\n for (let 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 a fmtp line from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeFmtp = function(codec) {\n let line = '';\n let pt = codec.payloadType;\n if (codec.preferredPayloadType !== undefined) {\n pt = codec.preferredPayloadType;\n }\n if (codec.parameters && Object.keys(codec.parameters).length) {\n const params = [];\n Object.keys(codec.parameters).forEach(param => {\n if (codec.parameters[param] !== undefined) {\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 a rtcp-fb line, returns RTCPRtcpFeedback object. Sample input:\n// a=rtcp-fb:98 nack rpsi\nSDPUtils.parseRtcpFb = function(line) {\n const parts = line.substring(line.indexOf(' ') + 1).split(' ');\n return {\n type: parts.shift(),\n parameter: parts.join(' '),\n };\n};\n\n// Generate a=rtcp-fb lines from RTCRtpCodecCapability or RTCRtpCodecParameters.\nSDPUtils.writeRtcpFb = function(codec) {\n let lines = '';\n let 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(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 a RFC 5576 ssrc media attribute. Sample input:\n// a=ssrc:3735928559 cname:something\nSDPUtils.parseSsrcMedia = function(line) {\n const sp = line.indexOf(' ');\n const parts = {\n ssrc: parseInt(line.substring(7, sp), 10),\n };\n const colon = line.indexOf(':', sp);\n if (colon > -1) {\n parts.attribute = line.substring(sp + 1, colon);\n parts.value = line.substring(colon + 1);\n } else {\n parts.attribute = line.substring(sp + 1);\n }\n return parts;\n};\n\n// Parse a ssrc-group line (see RFC 5576). Sample input:\n// a=ssrc-group:semantics 12 34\nSDPUtils.parseSsrcGroup = function(line) {\n const parts = line.substring(13).split(' ');\n return {\n semantics: parts.shift(),\n ssrcs: parts.map(ssrc => parseInt(ssrc, 10)),\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 const mid = SDPUtils.matchPrefix(mediaSection, 'a=mid:')[0];\n if (mid) {\n return mid.substring(6);\n }\n};\n\n// Parses a fingerprint line for DTLS-SRTP.\nSDPUtils.parseFingerprint = function(line) {\n const parts = line.substring(14).split(' ');\n return {\n algorithm: parts[0].toLowerCase(), // algorithm is case-sensitive in Edge.\n value: parts[1].toUpperCase(), // the definition is upper-case in RFC 4572.\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 const lines = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=fingerprint:');\n // Note: a=setup line is ignored since we use the 'auto' role 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 let sdp = 'a=setup:' + setupType + '\\r\\n';\n params.fingerprints.forEach(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 const parts = line.substring(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 const parts = keyParams.substring(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 parameters.\nSDPUtils.getCryptoParameters = function(mediaSection, sessionpart) {\n const 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 const ufrag = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-ufrag:')[0];\n const pwd = SDPUtils.matchPrefix(mediaSection + sessionpart,\n 'a=ice-pwd:')[0];\n if (!(ufrag && pwd)) {\n return null;\n }\n return {\n usernameFragment: ufrag.substring(12),\n password: pwd.substring(10),\n };\n};\n\n// Serializes ICE parameters to SDP.\nSDPUtils.writeIceParameters = function(params) {\n let sdp = 'a=ice-ufrag:' + params.usernameFragment + '\\r\\n' +\n 'a=ice-pwd:' + params.password + '\\r\\n';\n if (params.iceLite) {\n sdp += 'a=ice-lite\\r\\n';\n }\n return sdp;\n};\n\n// Parses the SDP media section and returns RTCRtpParameters.\nSDPUtils.parseRtpParameters = function(mediaSection) {\n const description = {\n codecs: [],\n headerExtensions: [],\n fecMechanisms: [],\n rtcp: [],\n };\n const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n description.profile = mline[2];\n for (let i = 3; i < mline.length; i++) { // find all codecs from mline[3..]\n const pt = mline[i];\n const rtpmapline = SDPUtils.matchPrefix(\n mediaSection, 'a=rtpmap:' + pt + ' ')[0];\n if (rtpmapline) {\n const codec = SDPUtils.parseRtpMap(rtpmapline);\n const fmtps = SDPUtils.matchPrefix(\n mediaSection, 'a=fmtp:' + pt + ' ');\n // Only the first a=fmtp: is considered.\n codec.parameters = fmtps.length ? SDPUtils.parseFmtp(fmtps[0]) : {};\n codec.rtcpFeedback = SDPUtils.matchPrefix(\n mediaSection, 'a=rtcp-fb:' + pt + ' ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.push(codec);\n // parse FEC mechanisms from rtpmap lines.\n switch (codec.name.toUpperCase()) {\n case 'RED':\n case 'ULPFEC':\n description.fecMechanisms.push(codec.name.toUpperCase());\n break;\n default: // only RED and ULPFEC are recognized as FEC mechanisms.\n break;\n }\n }\n }\n SDPUtils.matchPrefix(mediaSection, 'a=extmap:').forEach(line => {\n description.headerExtensions.push(SDPUtils.parseExtmap(line));\n });\n const wildcardRtcpFb = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-fb:* ')\n .map(SDPUtils.parseRtcpFb);\n description.codecs.forEach(codec => {\n wildcardRtcpFb.forEach(fb=> {\n const duplicate = codec.rtcpFeedback.find(existingFeedback => {\n return existingFeedback.type === fb.type &&\n existingFeedback.parameter === fb.parameter;\n });\n if (!duplicate) {\n codec.rtcpFeedback.push(fb);\n }\n });\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 let sdp = '';\n\n // Build the mline.\n sdp += 'm=' + kind + ' ';\n sdp += caps.codecs.length > 0 ? '9' : '0'; // reject if no codecs.\n sdp += ' ' + (caps.profile || 'UDP/TLS/RTP/SAVPF') + ' ';\n sdp += caps.codecs.map(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(codec => {\n sdp += SDPUtils.writeRtpMap(codec);\n sdp += SDPUtils.writeFmtp(codec);\n sdp += SDPUtils.writeRtcpFb(codec);\n });\n let maxptime = 0;\n caps.codecs.forEach(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\n if (caps.headerExtensions) {\n caps.headerExtensions.forEach(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 const encodingParameters = [];\n const description = SDPUtils.parseRtpParameters(mediaSection);\n const hasRed = description.fecMechanisms.indexOf('RED') !== -1;\n const hasUlpfec = description.fecMechanisms.indexOf('ULPFEC') !== -1;\n\n // filter a=ssrc:... cname:, ignore PlanB-msid\n const ssrcs = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(parts => parts.attribute === 'cname');\n const primarySsrc = ssrcs.length > 0 && ssrcs[0].ssrc;\n let secondarySsrc;\n\n const flows = SDPUtils.matchPrefix(mediaSection, 'a=ssrc-group:FID')\n .map(line => {\n const parts = line.substring(17).split(' ');\n return parts.map(part => parseInt(part, 10));\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(codec => {\n if (codec.name.toUpperCase() === 'RTX' && codec.parameters.apt) {\n let 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 let bandwidth = SDPUtils.matchPrefix(mediaSection, 'b=');\n if (bandwidth.length) {\n if (bandwidth[0].indexOf('b=TIAS:') === 0) {\n bandwidth = parseInt(bandwidth[0].substring(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].substring(5), 10) * 1000 * 0.95\n - (50 * 40 * 8);\n } else {\n bandwidth = undefined;\n }\n encodingParameters.forEach(params => {\n params.maxBitrate = bandwidth;\n });\n }\n return encodingParameters;\n};\n\n// parses http://draft.ortc.org/#rtcrtcpparameters*\nSDPUtils.parseRtcpParameters = function(mediaSection) {\n const rtcpParameters = {};\n\n // Gets the first SSRC. Note that with RTX there might be multiple\n // SSRCs.\n const remoteSsrc = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(obj => obj.attribute === 'cname')[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 const 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 const mux = SDPUtils.matchPrefix(mediaSection, 'a=rtcp-mux');\n rtcpParameters.mux = mux.length > 0;\n\n return rtcpParameters;\n};\n\nSDPUtils.writeRtcpParameters = function(rtcpParameters) {\n let sdp = '';\n if (rtcpParameters.reducedSize) {\n sdp += 'a=rtcp-rsize\\r\\n';\n }\n if (rtcpParameters.mux) {\n sdp += 'a=rtcp-mux\\r\\n';\n }\n if (rtcpParameters.ssrc !== undefined && rtcpParameters.cname) {\n sdp += 'a=ssrc:' + rtcpParameters.ssrc +\n ' cname:' + rtcpParameters.cname + '\\r\\n';\n }\n return sdp;\n};\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 let parts;\n const spec = SDPUtils.matchPrefix(mediaSection, 'a=msid:');\n if (spec.length === 1) {\n parts = spec[0].substring(7).split(' ');\n return {stream: parts[0], track: parts[1]};\n }\n const planB = SDPUtils.matchPrefix(mediaSection, 'a=ssrc:')\n .map(line => SDPUtils.parseSsrcMedia(line))\n .filter(msidParts => msidParts.attribute === 'msid');\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 const mline = SDPUtils.parseMLine(mediaSection);\n const maxSizeLine = SDPUtils.matchPrefix(mediaSection, 'a=max-message-size:');\n let maxMessageSize;\n if (maxSizeLine.length > 0) {\n maxMessageSize = parseInt(maxSizeLine[0].substring(19), 10);\n }\n if (isNaN(maxMessageSize)) {\n maxMessageSize = 65536;\n }\n const sctpPort = SDPUtils.matchPrefix(mediaSection, 'a=sctp-port:');\n if (sctpPort.length > 0) {\n return {\n port: parseInt(sctpPort[0].substring(12), 10),\n protocol: mline.fmt,\n maxMessageSize,\n };\n }\n const sctpMapLines = SDPUtils.matchPrefix(mediaSection, 'a=sctpmap:');\n if (sctpMapLines.length > 0) {\n const parts = sctpMapLines[0]\n .substring(10)\n .split(' ');\n return {\n port: parseInt(parts[0], 10),\n protocol: parts[1],\n 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 let 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, 22);\n};\n\n// Write boiler 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 let sessionId;\n const version = sessVer !== undefined ? sessVer : 2;\n if (sessId) {\n sessionId = sessId;\n } else {\n sessionId = SDPUtils.generateSessionId();\n }\n const 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\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 const lines = SDPUtils.splitLines(mediaSection);\n for (let 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].substring(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 const lines = SDPUtils.splitLines(mediaSection);\n const mline = lines[0].split(' ');\n return mline[0].substring(2);\n};\n\nSDPUtils.isRejected = function(mediaSection) {\n return mediaSection.split(' ', 2)[1] === '0';\n};\n\nSDPUtils.parseMLine = function(mediaSection) {\n const lines = SDPUtils.splitLines(mediaSection);\n const parts = lines[0].substring(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 const line = SDPUtils.matchPrefix(mediaSection, 'o=')[0];\n const parts = line.substring(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 const lines = SDPUtils.splitLines(blob);\n for (let 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","import EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\nimport { RoomInfo } from \"./RoomInfo\";\n\nexport interface IRoomOptions\n{\n name: string;\n description?:string;\n joinType: \"free\"|\"invite\"|\"password\"|\"lock\";\n credential?: string;\n ifexistsJoin?: boolean;\n accessType?: \"public\"|\"private\";\n notifyActionInvite?: boolean;\n notifyActionJoined?: boolean;\n notifyActionEjected?: boolean;\n autoFetchInfo?:boolean\n}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : IRoomOptions;\n public config! : IRoomOptions;\n public roomId? : string;\n public accessType? : \"public\"|\"private\";\n public description? : string;\n public joinType? : \"free\"|\"invite\"|\"password\"|\"lock\";\n public name? : string;\n public owner? : string;\n public peers : Map = new Map();\n public info : RoomInfo;\n\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\n this.info = new RoomInfo(this);\n }\n public setRoomOptions(options : IRoomOptions | string)\n {\n if(typeof options == \"string\")\n {\n this.roomId = options;\n }else{\n let defaultOptions = {\n joinType: \"free\",\n ifexistsJoin: true,\n accessType: \"private\",\n notifyActionInvite: true,\n notifyActionJoined: true,\n notifyActionEjected: true,\n autoFetchInfo: true\n };\n Object.assign(defaultOptions,options);\n this.config = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let config = this.config || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...config\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.config.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async join(){\n let result = await this.mwse.EventPooling.request({\n type:'joinroom',\n name: this.config.name,\n credential: this.config.credential,\n autoFetchInfo: this.config.autoFetchInfo || false\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.config,\n ...result.room\n };\n if(result.info)\n {\n this.info.info = result.info;\n };\n this.roomId = result.room.id;\n this.mwse.rooms.set(this.roomId as string, this);\n }\n }\n async eject(){\n let {type} = await this.mwse.EventPooling.request({\n type:'ejectroom',\n roomId: this.roomId\n });\n this.peers.clear();\n if(type == 'success')\n {\n this.mwse.rooms.delete(this.roomId as string);\n }\n }\n async send(pack: any, wom:boolean = false, handshake = false){\n if(!this.mwse.writable){\n return console.warn(\"Socket is not writable\");\n }\n if(handshake)\n {\n let {type} = await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n }) as {\n type:\"success\"|\"fail\"\n };\n if(type == \"fail\"){\n throw new Error(\"Cant send message to room\")\n }\n }else{\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom,\n handshake\n })\n }\n }\n async fetchPeers(filter?:{[key:string]:any}, onlyNumber:boolean = false) : Promise\n {\n if(onlyNumber)\n {\n let {count} = await this.mwse.EventPooling.request({\n type:'room/peer-count',\n roomId: this.roomId,\n filter: filter || {}\n }) as {count:Number};\n return count;\n }else{\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId,\n filter: filter || {}\n }) as {status:\"success\"|\"fail\", peers: string[]};\n \n let cup : Peer[] = [];\n \n if(status == 'fail')\n {\n throw new Error(\"Cant using peers on room\")\n }else if(status == 'success'){\n for (const peerid of peers) {\n let peer = this.mwse.peer(peerid,true);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\n }\n }\n}","import Room from \"./Room\";\n\nexport class RoomInfo\n{\n public room : Room;\n public info : {[key:string]: any} = {};\n constructor(room : Room){\n this.room = room;\n this.room.on('updateinfo',(name:string,value:any) => {\n this.info[name] = value;\n })\n };\n public async fetch(name?:string)\n {\n if(name)\n {\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/getinfo\",\n roomId: this.room.roomId,\n name\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n }else{\n let rinfo = await this.room.mwse.EventPooling.request(({\n type: \"room/info\",\n roomId: this.room.roomId\n }));\n if(rinfo.status == \"success\")\n {\n this.info = rinfo.value;\n }else console.warn(rinfo.message);\n };\n return this.info;\n }\n public set(name: string, value: string | number)\n {\n this.info[name] = value;\n this.room.mwse.WSTSProtocol.SendOnly({\n type: \"room/setinfo\",\n roomId: this.room.roomId,\n name,\n value\n });\n }\n public get(name?:string)\n {\n return name ? this.info[name] : this.info;\n }\n}","import MWSE from \"./index\";\n\nexport interface Message {\n [key:string|number]:any;\n}\nexport default class WSTSProtocol\n{\n public mwse : MWSE;\n constructor(wsts:MWSE){\n this.mwse = wsts;\n this.addListener();\n }\n public addListener()\n {\n this.mwse.server?.onRecaivePack((pack)=>{\n this.PackAnalyze(pack)\n })\n }\n public SendRaw(pack: Message)\n {\n this.mwse.server.tranferToServer(pack);\n }\n public SendOnly(pack: Message)\n {\n this.mwse.server.tranferToServer([pack,'R']);\n }\n public SendRequest(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'R']);\n }\n public StartStream(pack: Message, id: number)\n {\n this.mwse.server.tranferToServer([pack, id, 'S']);\n }\n public PackAnalyze(data:any)\n {\n let [payload, id, action] = data;\n if(typeof id === 'number')\n {\n let callback = this.mwse.EventPooling.events.get(id);\n if(callback)\n {\n callback[0](payload, action);\n switch(action)\n {\n case 'E':{ // [E]ND flag\n this.mwse.EventPooling.events.delete(id);\n break;\n }\n case 'S': // [S]TREAM flag\n default:{\n break;\n }\n }\n }else console.warn(\"Missing event sended from server\");\n }else{\n let signals = this.mwse.EventPooling.signals.get(id);\n if(signals)\n {\n for (const callback of signals) {\n callback(payload);\n }\n }else console.warn(\"Missing event sended from server\");\n }\n }\n}"],"names":["$parcel$export","e","n","v","s","Object","defineProperty","get","set","enumerable","configurable","$parcel$interopDefault","a","__esModule","default","$89634b12940c2479$export$98b66c25bb38499d","constructor","mwse","options","autoPair","connected","autoReconnect","autoReconnectTimeout","recaivePackEvent","activeConnectionEvent","passiveConnectionEvent","endpoint","scriptPath","URL","document","currentScript","src","isSecurity","protocol","wsSocket","pathname","split","slice","join","href","Error","timeout","connect","autoReconnectTimer","clearTimeout","ws","WebSocket","addWSEvents","disconnect","close","addEventListener","eventOpen","eventClose","eventError","data","eventMessage","callback","setTimeout","onRecaivePack","func","push","onActive","onPassive","$data","JSON","parse","tranferToServer","send","stringify","$137f01617e9d3585$export$2e2bcd8739ae039","wsts","events","Map","signals","requests","count","request","msg","Promise","ok","rej","id","WSTSProtocol","SendRequest","stream","StartStream","signal","event","T","$70ccf545b879f91e$export$2e2bcd8739ae039","emit","eventName","args","on","scope","f","activeScope","$3dbdf682ee45045f$export$cd59d3e68ede65a1","allocAPIPAddress","status","ip","EventPooling","type","APIPAddress","allocAPNumber","number","APNumber","allocAPShortCode","code","APShortCode","reallocAPIPAddress","reallocAPNumber","reallocAPShortCode","releaseAPIPAddress","undefined","releaseAPNumber","releaseAPShortCode","queryAPIPAddress","socket","whois","queryAPNumber","queryAPShortCode","$36e9718861861e3d$export$f3bd5f68ae16de","info","peer","fetch","name","rinfo","socketId","console","warn","message","value","SendOnly","$f1fc0f969f08e0a5$var$logDisabled_","$f1fc0f969f08e0a5$var$deprecationWarnings_","$f1fc0f969f08e0a5$export$e3c02be309be1f23","uastring","expr","pos","match","length","parseInt","$f1fc0f969f08e0a5$export$1f48841962b828b1","window1","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","modifiedEvent","handleEvent","_eventMap","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","delete","size","keys","$f1fc0f969f08e0a5$export$afbfee8cc06fd3e4","bool","$f1fc0f969f08e0a5$export$51516be4b019e41e","$f1fc0f969f08e0a5$export$bef1f36f5486a6a3","window","log","$f1fc0f969f08e0a5$export$cdd73fc4100a6ef4","oldMethod","newMethod","$f1fc0f969f08e0a5$var$isObject","val","toString","call","$f1fc0f969f08e0a5$export$93439ffc3f787d51","result","track","outbound","streamStatsType","filteredResult","trackStats","forEach","trackIdentifier","trackStat","stats","trackId","$f1fc0f969f08e0a5$export$571b373e75babb58","base","resultSet","endsWith","$b81887c760799f2b$exports","$7ae9c98c8b3d2b05$export$1ed4910f4d37dc5e","browserDetails","navigator","mediaDevices","constraintsToChrome_","c","mandatory","optional","cc","key","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","oc","mix","advanced","concat","shimConstraints_","constraints","version","audio","remap","obj","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","$7ae9c98c8b3d2b05$var$logging","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","constraint","constraintName","getUserMedia","getUserMedia_","onSuccess","onError","webkitGetUserMedia","bind","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","reject","$53bd260b9a4e0e97$export$97270b87351d9c04","getSourceId","error","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","$b81887c760799f2b$export$33ee24e7a300bcd1","MediaStream","webkitMediaStream","$b81887c760799f2b$export$f358708f68ab068","transceiver","receiver","_ontrack","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","getReceivers","Event","streams","dispatchEvent","$b81887c760799f2b$export$a41a030a2842f5d6","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","RTCRtpSender","origGetSenders","senders","$b81887c760799f2b$export$90608323826f0b17","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","reports","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","resolve","$b81887c760799f2b$export$f2f0f2338114eb4b","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","$b81887c760799f2b$export$30e3cdd46f8d5100","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","$b81887c760799f2b$export$9588259fcf4ebc91","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","signalingState","t","oldStream","method","nativeMethod","methodObj","isLegacyCall","desc","origSetLocalDescription","setLocalDescription","origLocalDescription","getOwnPropertyDescriptor","streamid","hasTrack","$b81887c760799f2b$export$852a08dda9a55ea7","webkitRTCPeerConnection","RTCIceCandidate","$b81887c760799f2b$export$341293bbeaae37cb","target","getConfiguration","sdpSemantics","$f6b001001df34b3c$exports","$7485531577b71cb2$export$1ed4910f4d37dc5e","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","$1fbd4e8cb7c073b7$export$97270b87351d9c04","preferredMediaSource","mediaSource","$f6b001001df34b3c$export$f358708f68ab068","RTCTrackEvent","$f6b001001df34b3c$export$852a08dda9a55ea7","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","i","assign","$f6b001001df34b3c$export$f0525502095c04ef","$f6b001001df34b3c$export$83d69126527b1171","$f6b001001df34b3c$export$825e523ef749bd8c","$f6b001001df34b3c$export$ff9cb3bc8990e8f7","DataChannel","RTCDataChannel","$f6b001001df34b3c$export$70c77533b6e9908d","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","ridRegex","test","rid","TypeError","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","params","getParameters","encodings","setParameters","catch","$f6b001001df34b3c$export$66238223c298fbaa","origGetParameters","$f6b001001df34b3c$export$51beccf0e777b843","origCreateOffer","createOffer","all","finally","$f6b001001df34b3c$export$df0b46e7cef08150","origCreateAnswer","createAnswer","$0b1ec2baf876c0f5$exports","$0b1ec2baf876c0f5$export$8df41282f4fdcea2","_localStreams","_addTrack","index","tracks","$0b1ec2baf876c0f5$export$762aa4cbb4f2f857","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","$0b1ec2baf876c0f5$export$da31df245debdd3","addIceCandidate","successCallback","failureCallback","promise","withCallback","candidate","$0b1ec2baf876c0f5$export$1ed4910f4d37dc5e","_getUserMedia","$0b1ec2baf876c0f5$export$494a01ac68ba81ac","errcb","$f1fc0f969f08e0a5$export$15384eac40dc88c8","reduce","accumulator","isObj","isEmptyObject","$0b1ec2baf876c0f5$export$671a8b47b41b6f41","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","$0b1ec2baf876c0f5$export$85d53da088cb1b14","$0b1ec2baf876c0f5$export$d444266503fdd2d4","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","$0b1ec2baf876c0f5$export$857cd739a7b795d2","AudioContext","webkitAudioContext","$af8eb266204bc7d1$exports","$af8eb266204bc7d1$export$cf133661e444ccfe","$af8eb266204bc7d1$export$fdafb8d8280e29b5","$af8eb266204bc7d1$export$a99147c78a56edc4","$af8eb266204bc7d1$export$d461c8d5c5db5da7","$af8eb266204bc7d1$export$63bb816cc75460","$af8eb266204bc7d1$export$a57d114344295149","$af8eb266204bc7d1$export$51d5e40b48c771c7","$af8eb266204bc7d1$export$7170d04e59f9d553","$4b27a37b96dfd7f6$exports","$4b27a37b96dfd7f6$var$SDPUtils","NativeRTCIceCandidate","substring","nativeCandidate","parsedCandidate","parseCandidate","toJSON","sdpMid","sdpMLineIndex","usernameFragment","writable","relayProtocol","priority","_sctp","sctpInDescription","sections","splitSections","shift","mediaSection","mLine","parseMLine","getRemoteFirefoxVersion","getCanSendMaxMessageSize","remoteIsFirefox","canSendMaxMessageSize","browser","getMaxMessageSize","maxMessageSize","matchPrefix","isFirefox","canSendMMS","remoteMMS","Number","POSITIVE_INFINITY","Math","sctp","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","nativeSRD","line","trim","nativeAddIceCandidate","nativeSetLocalDescription","generateIdentifier","random","localCName","splitLines","blob","parts","part","getDescription","getMediaSections","foundation","component","address","port","relatedAddress","relatedPort","tcpType","ufrag","writeCandidate","parseIceOptions","parseRtpMap","parsed","payloadType","clockRate","channels","numChannels","writeRtpMap","codec","pt","preferredPayloadType","parseExtmap","uri","attributes","writeExtmap","headerExtension","preferredId","parseFmtp","kv","j","writeFmtp","parameters","param","parseRtcpFb","parameter","writeRtcpFb","lines","rtcpFeedback","fb","parseSsrcMedia","sp","ssrc","colon","attribute","parseSsrcGroup","semantics","ssrcs","getMid","mid","parseFingerprint","algorithm","getDtlsParameters","sessionpart","role","fingerprints","writeDtlsParameters","setupType","fp","parseCryptoLine","tag","cryptoSuite","keyParams","sessionParams","writeCryptoLine","writeCryptoKeyParams","parseCryptoKeyParams","keyMethod","keySalt","lifeTime","mkiValue","mkiLength","getCryptoParameters","getIceParameters","pwd","password","writeIceParameters","iceLite","parseRtpParameters","codecs","headerExtensions","fecMechanisms","rtcp","mline","profile","rtpmapline","fmtps","wildcardRtcpFb","existingFeedback","writeRtpDescription","caps","maxptime","extension","parseRtpEncodingParameters","secondarySsrc","encodingParameters","hasRed","hasUlpfec","primarySsrc","flows","apt","encParam","codecPayloadType","rtx","fec","mechanism","bandwidth","maxBitrate","parseRtcpParameters","rtcpParameters","remoteSsrc","cname","rsize","reducedSize","compound","mux","writeRtcpParameters","parseMsid","spec","planB","msidParts","parseSctpDescription","maxSizeLine","isNaN","sctpPort","fmt","sctpMapLines","writeSctpDescription","media","output","generateSessionId","substr","writeSessionBoilerplate","sessId","sessVer","sessUser","getDirection","getKind","isRejected","parseOLine","username","sessionId","sessionVersion","netType","addressType","isValidSDP","shimChrome","shimFirefox","shimSafari","$f1fc0f969f08e0a5$export$2d31490a0c05f094","userAgent","mozGetUserMedia","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","adapter","commonShim","extractVersion","disableLog","disableWarnings","shimPeerConnection","logging","browserShim","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimGetParameters","shimCreateOffer","shimCreateAnswer","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimAudioContext","$f37b542c4b6e694c$export$2e2bcd8739ae039","webrtc","totalSize","isReady","isStarted","isSending","isRecaiving","processedSize","bufferSizePerChannel","bufferSizePerPack","safeBufferSizePerPack","rtc","RecaiveFile","_rtc","fileMetadata","channelCount","_totalSize","onEnded","datachannel","current","currentPart","bufferAmount","onmessage","Blob","onclose","File","lastModified","Date","SendFile","file","metadata","buffer","arrayBuffer","partCount","ceil","iceStatus","mimetype","channelIndex","binaryType","onopen","next","spyChannelIndex","sendPartition","nextblob10mb","_channelIndex","currentBuffer","currentPartition","ArrayBuffer","bufferPart","sendFileChannel","getNextBlob","bufferedAmountLowThreshold","$9f70bba88b51f85f$export$2e2bcd8739ae039","requireGC","defaultRTCConfig","iceCandidatePoolSize","iceTransportPolicy","rtcpMuxPolicy","isPolite","myId","defaultICEServers","rtcConfig","rtcServers","active","connectionStatus","gatheringStatus","signalingStatus","recaivingStream","sendingStream","makingOffer","ignoreOffer","isSettingRemoteAnswerPending","candicatePack","config","eventConnectionState","eventIcecandidate","eventICEConnectionState","eventICEGatherinState","eventNogationNeeded","eventSignalingState","eventTrack","eventDatachannel","remoteDescription","readyForOffer","answer","streamInfo","payload","dispatch","createDefaultDataChannel","sendMessage","dt","ordered","pack","destroy","restartIce","iceGatheringState","offer","iceRestart","rtpRecaiver","recaivers","sendStream","stopStream","_stream","RTCPSender","stopAllStreams","clear","meta","FileTransportChannel","chnlCount","filemeta","recaivedFile","setInterval","img","createElement","createObjectURL","onerror","revokeObjectURL","$069df92a5be06b83$var$IMessageSymbase","IMessageSymbase","$069df92a5be06b83$export$2e2bcd8739ae039","selfSocket","peerConnection","primaryChannel","createRTC","setPeerOptions","setSocketId","uuid","equalTo","isReachable","to","enablePairAuth","disablePairAuth","enablePairInfo","disablePairInfo","requestPair","endPair","forget","acceptPair","rejectPair","getPairedList","sendChannel","isOpenedP2P","isOpenedServer","peers","pairs","$eb4fbdf2f3a63265$export$f106f681f3286480","room","roomId","$81753485e968c23c$export$2e2bcd8739ae039","setRoomOptions","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","autoFetchInfo","setRoomId","createRoom","roomOptions","messages","rooms","credential","eject","wom","handshake","fetchPeers","onlyNumber","cup","peerid","$88b44b5f29c6d98e$export$2e2bcd8739ae039","addListener","PackAnalyze","SendRaw","action","$09d6084661424ec1$export$2e2bcd8739ae039","readable","virtualPressure","me","packMessagingSystem","enableRecaiveData","disableRecaiveData","enableSendData","disableSendData","enableNotifyRoomInfo","disableNotifyRoomInfo","peerId","requestId","from","body","roomid","isActive","MWSE"],"version":3,"file":"index.js.map"} \ No newline at end of file