From 17eacfcfdc752e875023347872fecf8ec6c24dd2 Mon Sep 17 00:00:00 2001 From: Abdussamed Date: Sat, 22 Apr 2023 12:15:41 +0300 Subject: [PATCH] WebRTC Base --- frontend/Peer.ts | 30 +++++++----------------------- script/index.js | 2 +- script/index.js.map | 2 +- 3 files changed, 9 insertions(+), 25 deletions(-) diff --git a/frontend/Peer.ts b/frontend/Peer.ts index 7ae5605..92c3df7 100644 --- a/frontend/Peer.ts +++ b/frontend/Peer.ts @@ -31,20 +31,13 @@ export default class Peer extends EventTarget this.info = new PeerInfo(this); this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => { - if(data.type == 'rtc') + if(data.type == ':rtcbase_pack:') { - if(data.action == IMessageSymbase.PayloadRTCBasePack) + if(this.rtc) { - if(this.rtc) - { - return this.rtc.emit("input", data.payload) - } - console.warn("Not active rtc but recaived rtc packs") - }; - if(data.action == IMessageSymbase.PayloadMessagePack) - { - return this.emit("message", data.payload) + return this.rtc.emit("input", data.payload) } + return console.warn("Not active rtc but recaived rtc packs") }; this.emit("message", data); }); @@ -61,17 +54,12 @@ export default class Peer extends EventTarget }) this.rtc.on("output",(payload:object) => { this.send({ - type: 'rtc', - action: IMessageSymbase.PayloadRTCBasePack, + type: ':rtcbase_pack:', payload: payload }) }); this.rtc.on("message",(payload:object) => { - this.emit("pack",{ - type: 'rtc', - action: IMessageSymbase.PayloadRTCBasePack, - payload: payload - }) + this.emit("pack",payload); }); return this.rtc; } @@ -158,11 +146,7 @@ export default class Peer extends EventTarget to: this.socketId }); }else{ - this.rtc?.sendMessage({ - type: 'rtc', - action: IMessageSymbase.PayloadMessagePack, - payload: pack - }) + this.rtc?.sendMessage(pack) } } async forget(){ diff --git a/script/index.js b/script/index.js index 35cb932..2b81d23 100644 --- a/script/index.js +++ b/script/index.js @@ -1,2 +1,2 @@ -(()=>{function e(e,t,n,r){Object.defineProperty(e,t,{get:n,set:r,enumerable:!0,configurable:!0})}function t(e){return e&&e.__esModule?e.default:e}class n{autoPair=!1;connected=!1;constructor(e){this.endpoint=new URL(e.endpoint)}connect(){this.ws=new WebSocket(this.endpoint.href),this.addWSEvents()}disconnect(){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(){this.connected=!0;for(const e of this.activeConnectionEvent)e(void 0)}eventClose(){this.connected=!1}eventError(){this.connected=!1}recaivePackEvent=[];onRecaivePack(e){this.recaivePackEvent.push(e)}activeConnectionEvent=[];onActive(e){this.connected?e():this.activeConnectionEvent.push(e)}eventMessage(e){if("string"==typeof e){let t=JSON.parse(e);for(const e of this.recaivePackEvent)e(t)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class r{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((t,n)=>{let r=++this.count;this.wsts.WSTSProtocol.SendRequest(e,r),this.events.set(r,[e=>{t(e)},e=>{n(e)}])}))}stream(e,t){let n=++this.count;this.wsts.WSTSProtocol.StartStream(e,n),this.events.set(n,[e=>{t(e)},()=>{}])}signal(e,t){let n=this.signals.get(e);n?n.push(t):this.signals.set(e,[t])}}class i{events={};emit(e,...t){if(this.events[e])for(const n of this.events[e])n(...t)}on(e,t){this.events[e]?this.events[e].push(t):this.events[e]=[t]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}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 new 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 new 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 new 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 new 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 new 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 new Error("Error Reallocated Access Point Short Code")}async releaseAPIPAddress(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APIPAddress"});if("success"!=e)throw new Error("Error release Access Point IP Address");this.APIPAddress=void 0}async releaseAPNumber(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APNumber"});if("success"!=e)throw new Error("Error release Access Point Number");this.APNumber=void 0}async releaseAPShortCode(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APShortCode"});if("success"!=e)throw new Error("Error release Access Point Short Code");this.APShortCode=void 0}async queryAPIPAddress(e){let{status:t,socket:n}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==t?n:null}async queryAPNumber(e){let{status:t,socket:n}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==t?n:null}async queryAPShortCode(e){let{status:t,socket:n}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==t?n:null}}class o{info={};constructor(e){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}}let a=!0,c=!0;function p(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function d(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const s=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,s),i.apply(this,[e,s])};const s=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return s.apply(this,arguments);if(!this._eventMap[t].has(n))return s.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,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?new 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?new Error("Argument type: "+typeof e+". Please use a boolean."):(c=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function m(){if("object"==typeof window){if(a)return;"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 y(e){return f(e)?Object.keys(e).reduce((function(t,n){const r=f(e[n]),i=r?y(e[n]):e[n],s=r&&!Object.keys(i).length;return void 0===i||s?t:Object.assign(t,{[n]:i})}),{}):e}function v(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?v(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{v(e,e.get(t),n)}))})))}function g(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const s=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&s.push(e)})),s.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&v(e,n,i)}))})),i}var C={};e(C,"shimMediaStream",(()=>R)),e(C,"shimOnTrack",(()=>w)),e(C,"shimGetSendersWithDtmf",(()=>k)),e(C,"shimGetStats",(()=>E)),e(C,"shimSenderReceiverGetStats",(()=>b)),e(C,"shimAddTrackRemoveTrackWithNative",(()=>_)),e(C,"shimAddTrackRemoveTrack",(()=>I)),e(C,"shimPeerConnection",(()=>x)),e(C,"fixNegotiationNeeded",(()=>M)),e(C,"shimGetUserMedia",(()=>S)),e(C,"shimGetDisplayMedia",(()=>T));const P=m;function S(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=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[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=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});const o=t.version<66;if(s&&("user"===s.exact||"environment"===s.exact||"user"===s.ideal||"environment"===s.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.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 n.mediaDevices.enumerateDevices().then((n=>{let o=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!o&&n.length&&t.includes("back")&&(o=n[n.length-1]),o&&(e.video.deviceId=s.exact?{exact:o.deviceId}:{ideal:o.deviceId}),e.video=r(e.video),P("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return P("chrome: "+JSON.stringify(e)),i(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(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(s(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(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))))))}}}function T(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,s=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:s||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function R(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function w(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){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});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else d(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function k(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const 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()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const 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)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const 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 E(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,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,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},s=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(s(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(s(i(t)))},n])})).then(n,r)}}function b(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>g(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),d(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const 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;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function _(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=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")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const 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)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function I(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return _(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const 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]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function s(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const 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||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=s(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>s(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const o=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),o.apply(this,arguments)):o.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:s(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){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");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function x(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function M(e,t){d(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}var D={};function A(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){u("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function O(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function L(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 j(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){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,s]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,s)}}function N(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function q(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),d(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function F(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 U(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function G(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function z(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function J(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const 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 W(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const 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)}}e(D,"shimOnTrack",(()=>L)),e(D,"shimPeerConnection",(()=>j)),e(D,"shimSenderGetStats",(()=>N)),e(D,"shimReceiverGetStats",(()=>q)),e(D,"shimRemoveStream",(()=>F)),e(D,"shimRTCDataChannel",(()=>U)),e(D,"shimAddTransceiver",(()=>G)),e(D,"shimGetParameters",(()=>z)),e(D,"shimCreateOffer",(()=>J)),e(D,"shimCreateAnswer",(()=>W)),e(D,"shimGetUserMedia",(()=>A)),e(D,"shimGetDisplayMedia",(()=>O));var V={};function B(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)){const 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((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.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=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function K(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);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const 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);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function H(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,s=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function X(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(Y(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function Y(e){return e&&void 0!==e.video?Object.assign({},e,{video:y(e.video)}):e}function $(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;nt.generateCertificate})}function Q(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 Z(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const 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);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function ee(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}e(V,"shimLocalStreamsAPI",(()=>B)),e(V,"shimRemoteStreamsAPI",(()=>K)),e(V,"shimCallbacksAPI",(()=>H)),e(V,"shimGetUserMedia",(()=>X)),e(V,"shimConstraints",(()=>Y)),e(V,"shimRTCIceServerUrls",(()=>$)),e(V,"shimTrackEventTransceiver",(()=>Q)),e(V,"shimCreateOfferLegacy",(()=>Z)),e(V,"shimAudioContext",(()=>ee));var te={};e(te,"shimRTCIceCandidate",(()=>ie)),e(te,"shimRTCIceCandidateRelayProtocol",(()=>se)),e(te,"shimMaxMessageSize",(()=>oe)),e(te,"shimSendThrowTypeError",(()=>ae)),e(te,"shimConnectionState",(()=>ce)),e(te,"removeExtmapAllowMixed",(()=>pe)),e(te,"shimAddIceCandidateNullOrEmpty",(()=>de)),e(te,"shimParameterlessSetLocalDescription",(()=>he));var ne={};const re={};function ie(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const n=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){const r=new n(e),i=t(ne).parseCandidate(e.candidate);for(const e in i)e in r||Object.defineProperty(r,e,{value:i[e]});return r.toJSON=function(){return{candidate:r.candidate,sdpMid:r.sdpMid,sdpMLineIndex:r.sdpMLineIndex,usernameFragment:r.usernameFragment}},r}return new n(e)},e.RTCIceCandidate.prototype=n.prototype,d(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function se(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||d(e,"icecandidate",(e=>{if(e.candidate){const n=t(ne).parseCandidate(e.candidate.candidate);"relay"===n.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[n.priority>>24])}return e}))}function oe(e,n){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const r=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===n.browser&&n.version>=76){const{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(function(e){if(!e||!e.sdp)return!1;const n=t(ne).splitSections(e.sdp);return n.shift(),n.some((e=>{const n=t(ne).parseMLine(e);return n&&"application"===n.kind&&-1!==n.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),r=function(e){let t=65536;return"firefox"===n.browser&&(t=n.version<57?-1===e?16384:2147483637:n.version<60?57===n.version?65535:65536:2147483637),t}(e),i=function(e,r){let i=65536;"firefox"===n.browser&&57===n.version&&(i=65535);const s=t(ne).matchPrefix(e.sdp,"a=max-message-size:");return s.length>0?i=parseInt(s[0].substring(19),10):"firefox"===n.browser&&-1!==r&&(i=2147483637),i}(arguments[0],e);let s;s=0===r&&0===i?Number.POSITIVE_INFINITY:0===r||0===i?Math.max(r,i):Math.min(r,i);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>s}),this._sctp=o}return r.apply(this,arguments)}}function ae(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},d(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function ce(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const 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=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function pe(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=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:n}):t.sdp=n}return n.apply(this,arguments)}}function de(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function he(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}re.generateIdentifier=function(){return Math.random().toString(36).substring(2,12)},re.localCName=re.generateIdentifier(),re.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},re.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},re.getDescription=function(e){const t=re.splitSections(e);return t&&t[0]},re.getMediaSections=function(e){const t=re.splitSections(e);return t.shift(),t},re.matchPrefix=function(e,t){return re.splitLines(e).filter((e=>0===e.indexOf(t)))},re.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[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(" ")}},re.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"},re.parseFmtp=function(e){const t={};let n;const 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:"+n+" "+r.join(";")+"\r\n"}return t},re.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},re.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},re.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},re.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},re.getMid=function(e){const t=re.matchPrefix(e,"a=mid:")[0];if(t)return t.substring(6)},re.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},re.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:re.matchPrefix(e+t,"a=fingerprint:").map(re.parseFingerprint)}},re.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},re.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},re.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?re.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},re.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const 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}},re.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},re.getCryptoParameters=function(e,t){return re.matchPrefix(e+t,"a=crypto:").map(re.parseCryptoLine)},re.getIceParameters=function(e,t){const n=re.matchPrefix(e+t,"a=ice-ufrag:")[0],r=re.matchPrefix(e+t,"a=ice-pwd:")[0];return n&&r?{usernameFragment:n.substring(12),password:r.substring(10)}:null},re.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},re.parseRtpParameters=function(e){const t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},n=re.splitLines(e)[0].split(" ");t.profile=n[2];for(let r=3;r{t.headerExtensions.push(re.parseExtmap(e))}));const r=re.matchPrefix(e,"a=rtcp-fb:* ").map(re.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},re.writeRtpDescription=function(e,t){let n="";n+="m="+e+" ",n+=t.codecs.length>0?"9":"0",n+=" "+(t.profile||"UDP/TLS/RTP/SAVPF")+" ",n+=t.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",n+="c=IN IP4 0.0.0.0\r\n",n+="a=rtcp:9 IN IP4 0.0.0.0\r\n",t.codecs.forEach((e=>{n+=re.writeRtpMap(e),n+=re.writeFmtp(e),n+=re.writeRtcpFb(e)}));let r=0;return t.codecs.forEach((e=>{e.maxptime>r&&(r=e.maxptime)})),r>0&&(n+="a=maxptime:"+r+"\r\n"),t.headerExtensions&&t.headerExtensions.forEach((e=>{n+=re.writeExtmap(e)})),n},re.parseRtpEncodingParameters=function(e){const t=[],n=re.parseRtpParameters(e),r=-1!==n.fecMechanisms.indexOf("RED"),i=-1!==n.fecMechanisms.indexOf("ULPFEC"),s=re.matchPrefix(e,"a=ssrc:").map((e=>re.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),o=s.length>0&&s[0].ssrc;let a;const c=re.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]===o&&(a=c[0][1]),n.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let n={ssrc:o,codecPayloadType:parseInt(e.parameters.apt,10)};o&&a&&(n.rtx={ssrc:a}),t.push(n),r&&(n=JSON.parse(JSON.stringify(n)),n.fec={ssrc:o,mechanism:i?"red+ulpfec":"red"},t.push(n))}})),0===t.length&&o&&t.push({ssrc:o});let p=re.matchPrefix(e,"b=");return p.length&&(p=0===p[0].indexOf("b=TIAS:")?parseInt(p[0].substring(7),10):0===p[0].indexOf("b=AS:")?950*parseInt(p[0].substring(5),10)-16e3:void 0,t.forEach((e=>{e.maxBitrate=p}))),t},re.parseRtcpParameters=function(e){const t={},n=re.matchPrefix(e,"a=ssrc:").map((e=>re.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];n&&(t.cname=n.value,t.ssrc=n.ssrc);const r=re.matchPrefix(e,"a=rtcp-rsize");t.reducedSize=r.length>0,t.compound=0===r.length;const i=re.matchPrefix(e,"a=rtcp-mux");return t.mux=i.length>0,t},re.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},re.parseMsid=function(e){let t;const n=re.matchPrefix(e,"a=msid:");if(1===n.length)return t=n[0].substring(7).split(" "),{stream:t[0],track:t[1]};const r=re.matchPrefix(e,"a=ssrc:").map((e=>re.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return r.length>0?(t=r[0].value.split(" "),{stream:t[0],track:t[1]}):void 0},re.parseSctpDescription=function(e){const t=re.parseMLine(e),n=re.matchPrefix(e,"a=max-message-size:");let r;n.length>0&&(r=parseInt(n[0].substring(19),10)),isNaN(r)&&(r=65536);const i=re.matchPrefix(e,"a=sctp-port:");if(i.length>0)return{port:parseInt(i[0].substring(12),10),protocol:t.fmt,maxMessageSize:r};const s=re.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:r}}},re.writeSctpDescription=function(e,t){let n=[];return n="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&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},re.generateSessionId=function(){return Math.random().toString().substr(2,22)},re.writeSessionBoilerplate=function(e,t,n){let r;const i=void 0!==t?t:2;r=e||re.generateSessionId();return"v=0\r\no="+(n||"thisisadapterortc")+" "+r+" "+i+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},re.getDirection=function(e,t){const n=re.splitLines(e);for(let e=0;e{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":await this.rtc.addIceCandidate(new RTCIceCandidate(e.value));break;case"offer":{await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));let t=await this.rtc.createAnswer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(t),this.send({type:"answer",value:t});break}case"answer":await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));break;case"streamInfo":{let{id:t,value:n}=e,r=this.recaivingStream.get(t);r?this.recaivingStream.set(t,{...r,...n}):this.recaivingStream.set(t,n),this.send({type:"streamAccept",id:t});break}case"streamRemoved":{let{id:t}=e;this.emit("stream:stopped",this.recaivingStream.get(t)),this.sendingStream.delete(t);break}case"streamAccept":{let{id:t}=e,n=this.sendingStream.get(t),r=[];if(n&&n.stream){for(const e of n.stream.getTracks())r.push(this.rtc.addTrack(e,n.stream));n.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(const n of this.events[e])await n(...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,le.channels.set(this.id,this)})),e.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.addEventListener("close",(()=>{this.channel=void 0}))}destroy(){this.active=!1,this.channel&&(this.channel.close(),this.channel=void 0),this.rtc&&this.rtc.close(),this.emit("disconnected"),le.channels.delete(this.id)}eventDatachannel(e){":default:"==e.channel.label&&(le.channels.set(this.id,this),this.channel=e.channel),e.channel.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.channel.addEventListener("close",(()=>{this.channel=void 0,le.channels.delete(this.id),le.requireGC=!0}))}send(e){"open"==this.channel?.readyState?this.channel.send(JSON.stringify(e)):this.emit("output",e)}eventConnectionState(){this.connectionStatus=this.rtc.connectionState,"connected"==this.connectionStatus&&0==this.active&&(this.emit("connected"),this.active=!0),"failed"!=this.connectionStatus&&"disconnected"!=this.connectionStatus&&"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(){let e=await this.rtc.createOffer({iceRestart:!0,offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(e),this.send({type:"offer",value:e})}eventSignalingState(){this.signalingStatus=this.rtc.signalingState}eventTrack(e){let t=e.receiver;if(e.streams.length)for(const n of e.streams){let e=this.recaivingStream.get(n.id);(e.recaivers||(e.recaivers=[])).push(t),null==this.recaivingStream.get(n.id).stream?(e.stream=n,this.emit("stream:added",this.recaivingStream.get(n.id))):e.stream=n}}sendStream(e,t,n){this.send({type:"streamInfo",id:e.id,value:{...n,name:t}}),this.sendingStream.set(e.id,{...n,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(const e of t.getTracks())for(const 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(const[,{stream:e}]of this.sendingStream)if(null!=e){for(const t of e.getTracks())for(const e of this.rtc.getSenders())e.track?.id==t.id&&this.rtc.removeTrack(e);this.send({type:"streamRemoved",id:e.id})}this.sendingStream.clear()}}}let me;var ue;le.requireGC=!1,setInterval((()=>{if(0==le.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)},le.requireGC=!1}),3e3),(ue=me||(me={}))[ue.PayloadMessagePack=-12873.54]="PayloadMessagePack",ue[ue.PayloadRTCBasePack=-12884.54]="PayloadRTCBasePack";class fe extends i{options={};selfSocket=!1;active=!1;peerConnection=!1;primaryChannel="datachannel";constructor(e){super(),this.mwse=e,this.info=new o(this),this.on("pack",(e=>{if("rtc"==e.type){if(e.action==me.PayloadRTCBasePack){if(this.rtc)return this.rtc.emit("input",e.payload);console.warn("Not active rtc but recaived rtc packs")}if(e.action==me.PayloadMessagePack)return this.emit("message",e.payload)}this.emit("message",e)}))}createRTC(){return this.rtc=new le,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:"rtc",action:me.PayloadRTCBasePack,payload:e})})),this.rtc.on("message",(e=>{this.emit("pack",{type:"rtc",action:me.PayloadRTCBasePack,payload: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 send(e){let t,n=this.peerConnection,r=this.mwse.server.connected;t=n&&r?"websocket"==this.primaryChannel?"websocket":"datachannel":r?"websocket":"datachannel","websocket"==t?await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId}):this.rtc?.sendMessage({type:"rtc",action:me.PayloadMessagePack,payload:e})}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class ye extends i{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let t={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(t,e),this.options=t}}setRoomId(e){this.roomId=e}async createRoom(e){let t=this.options||e,n=await this.mwse.EventPooling.request({type:"create-room",...t});if("fail"==n.status){if("ALREADY-EXISTS"==n.message&&this.options.ifexistsJoin)return this.join();throw new Error(n.message||n.messages)}this.options={...this.options,...n.room},this.roomId=n.room.id,this.mwse.rooms.set(this.roomId,this)}async join(){let e=await this.mwse.EventPooling.request({type:"joinroom",name:this.options.name,credential:this.options.credential});if("fail"==e.status)throw new Error(e.message);this.options={...this.options,...e.room},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){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t})}async fetchPeers(){let{status:e,peers:t}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),n=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of t){let t=this.mwse.peer(e);n.push(t),this.peers.set(e,t)}return n}}class ve{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,n,r]=e;if("number"==typeof n){let e=this.mwse.EventPooling.events.get(n);if(e){if(e[0](t,r),"E"===r)this.mwse.EventPooling.events.delete(n)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(n);if(e)for(const n of e)n(t);else console.warn("Missing event sended from server")}}}window.MWSE=class extends i{rooms=new Map;pairs=new Map;peers=new Map;constructor(e){super(),this.server=new n(e),this.WSTSProtocol=new ve(this),this.EventPooling=new r(this),this.virtualPressure=new s(this),this.server.connect(),this.me=new fe(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.packMessagingSystem()}async request(e,t){let{pack:n}=await this.EventPooling.request({type:"request/to",to:e,pack:t});return n}async response(e,t,n){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:n,id:t})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:t,pack:n}=e;this.peer(t,!0).emit("pack",n)})),this.EventPooling.signal("request",(e=>{let{from:t,pack:n,id:r}=e,i={body:n,response:e=>{this.response(t,r,e)},peer:this.peer(t,!0)};this.peer(t,!0).emit("request",i),this.peer("me").emit("request",i)})),this.EventPooling.signal("pack/room",(e=>{let{from:t,pack:n}=e;this.room(t).emit("message",n)})),this.EventPooling.signal("room/joined",(e=>{let{id:t,roomid:n}=e,r=this.room(n),i=this.peer(t,!0);r.peers.set(i.socketId,i),r.emit("join",i)})),this.EventPooling.signal("room/ejected",(e=>{let{id:t,roomid:n}=e,r=this.room(n),i=this.peer(t);r.peers.delete(i.socketId),r.emit("eject",i)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:t}=e,n=this.room(t);n.peers.clear(),n.emit("close"),this.rooms.delete(t)})),this.EventPooling.signal("pair/info",(e=>{let{from:t,name:n,value:r}=e,i=this.peer(t);i.info.info[n]=r,i.emit("info",n,r)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let t=new ye(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 n=new fe(this);return n.setPeerOptions(e),n.active=t,this.peers.set(n.socketId,n),this.emit("peer",n),n}}})(); +(()=>{function e(e,t,n,r){Object.defineProperty(e,t,{get:n,set:r,enumerable:!0,configurable:!0})}function t(e){return e&&e.__esModule?e.default:e}class n{autoPair=!1;connected=!1;constructor(e){this.endpoint=new URL(e.endpoint)}connect(){this.ws=new WebSocket(this.endpoint.href),this.addWSEvents()}disconnect(){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(){this.connected=!0;for(const e of this.activeConnectionEvent)e(void 0)}eventClose(){this.connected=!1}eventError(){this.connected=!1}recaivePackEvent=[];onRecaivePack(e){this.recaivePackEvent.push(e)}activeConnectionEvent=[];onActive(e){this.connected?e():this.activeConnectionEvent.push(e)}eventMessage(e){if("string"==typeof e){let t=JSON.parse(e);for(const e of this.recaivePackEvent)e(t)}}tranferToServer(e){this.connected&&this.ws.send(JSON.stringify(e))}}class r{events=new Map;signals=new Map;requests=new Map;count=0;constructor(e){this.wsts=e}request(e){return new Promise(((t,n)=>{let r=++this.count;this.wsts.WSTSProtocol.SendRequest(e,r),this.events.set(r,[e=>{t(e)},e=>{n(e)}])}))}stream(e,t){let n=++this.count;this.wsts.WSTSProtocol.StartStream(e,n),this.events.set(n,[e=>{t(e)},()=>{}])}signal(e,t){let n=this.signals.get(e);n?n.push(t):this.signals.set(e,[t])}}class i{events={};emit(e,...t){if(this.events[e])for(const n of this.events[e])n(...t)}on(e,t){this.events[e]?this.events[e].push(t):this.events[e]=[t]}activeScope=!1;scope(e){this.activeScope?e():this.on("scope",e)}}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 new 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 new 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 new 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 new 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 new 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 new Error("Error Reallocated Access Point Short Code")}async releaseAPIPAddress(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APIPAddress"});if("success"!=e)throw new Error("Error release Access Point IP Address");this.APIPAddress=void 0}async releaseAPNumber(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APNumber"});if("success"!=e)throw new Error("Error release Access Point Number");this.APNumber=void 0}async releaseAPShortCode(){let{status:e}=await this.mwse.EventPooling.request({type:"release/APShortCode"});if("success"!=e)throw new Error("Error release Access Point Short Code");this.APShortCode=void 0}async queryAPIPAddress(e){let{status:t,socket:n}=await this.mwse.EventPooling.request({type:"whois/APIPAddress",whois:e});return"success"==t?n:null}async queryAPNumber(e){let{status:t,socket:n}=await this.mwse.EventPooling.request({type:"whois/APNumber",whois:e});return"success"==t?n:null}async queryAPShortCode(e){let{status:t,socket:n}=await this.mwse.EventPooling.request({type:"whois/APShortCode",whois:e});return"success"==t?n:null}}class o{info={};constructor(e){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}}let a=!0,c=!0;function p(e,t,n){const r=e.match(t);return r&&r.length>=n&&parseInt(r[n],10)}function d(e,t,n){if(!e.RTCPeerConnection)return;const r=e.RTCPeerConnection.prototype,i=r.addEventListener;r.addEventListener=function(e,r){if(e!==t)return i.apply(this,arguments);const s=e=>{const t=n(e);t&&(r.handleEvent?r.handleEvent(t):r(t))};return this._eventMap=this._eventMap||{},this._eventMap[t]||(this._eventMap[t]=new Map),this._eventMap[t].set(r,s),i.apply(this,[e,s])};const s=r.removeEventListener;r.removeEventListener=function(e,n){if(e!==t||!this._eventMap||!this._eventMap[t])return s.apply(this,arguments);if(!this._eventMap[t].has(n))return s.apply(this,arguments);const r=this._eventMap[t].get(n);return this._eventMap[t].delete(n),0===this._eventMap[t].size&&delete this._eventMap[t],0===Object.keys(this._eventMap).length&&delete this._eventMap,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?new 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?new Error("Argument type: "+typeof e+". Please use a boolean."):(c=!e,"adapter.js deprecation warnings "+(e?"disabled":"enabled"))}function m(){if("object"==typeof window){if(a)return;"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 v(e){return f(e)?Object.keys(e).reduce((function(t,n){const r=f(e[n]),i=r?v(e[n]):e[n],s=r&&!Object.keys(i).length;return void 0===i||s?t:Object.assign(t,{[n]:i})}),{}):e}function y(e,t,n){t&&!n.has(t.id)&&(n.set(t.id,t),Object.keys(t).forEach((r=>{r.endsWith("Id")?y(e,e.get(t[r]),n):r.endsWith("Ids")&&t[r].forEach((t=>{y(e,e.get(t),n)}))})))}function g(e,t,n){const r=n?"outbound-rtp":"inbound-rtp",i=new Map;if(null===t)return i;const s=[];return e.forEach((e=>{"track"===e.type&&e.trackIdentifier===t.id&&s.push(e)})),s.forEach((t=>{e.forEach((n=>{n.type===r&&n.trackId===t.id&&y(e,n,i)}))})),i}var C={};e(C,"shimMediaStream",(()=>R)),e(C,"shimOnTrack",(()=>w)),e(C,"shimGetSendersWithDtmf",(()=>k)),e(C,"shimGetStats",(()=>E)),e(C,"shimSenderReceiverGetStats",(()=>b)),e(C,"shimAddTrackRemoveTrackWithNative",(()=>_)),e(C,"shimAddTrackRemoveTrack",(()=>I)),e(C,"shimPeerConnection",(()=>x)),e(C,"fixNegotiationNeeded",(()=>D)),e(C,"shimGetUserMedia",(()=>P)),e(C,"shimGetDisplayMedia",(()=>T));const S=m;function P(e,t){const n=e&&e.navigator;if(!n.mediaDevices)return;const r=function(e){if("object"!=typeof e||e.mandatory||e.optional)return e;const t={};return Object.keys(e).forEach((n=>{if("require"===n||"advanced"===n||"mediaSource"===n)return;const r="object"==typeof e[n]?e[n]:{ideal:e[n]};void 0!==r.exact&&"number"==typeof r.exact&&(r.min=r.max=r.exact);const i=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[i("min",n)]=r.ideal,t.optional.push(e),e={},e[i("max",n)]=r.ideal,t.optional.push(e)):(e[i("",n)]=r.ideal,t.optional.push(e))}void 0!==r.exact&&"number"!=typeof r.exact?(t.mandatory=t.mandatory||{},t.mandatory[i("",n)]=r.exact):["min","max"].forEach((e=>{void 0!==r[e]&&(t.mandatory=t.mandatory||{},t.mandatory[i(e,n)]=r[e])}))})),e.advanced&&(t.optional=(t.optional||[]).concat(e.advanced)),t},i=function(e,i){if(t.version>=61)return i(e);if((e=JSON.parse(JSON.stringify(e)))&&"object"==typeof e.audio){const t=function(e,t,n){t in e&&!(n in e)&&(e[n]=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});const o=t.version<66;if(s&&("user"===s.exact||"environment"===s.exact||"user"===s.ideal||"environment"===s.ideal)&&(!n.mediaDevices.getSupportedConstraints||!n.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 n.mediaDevices.enumerateDevices().then((n=>{let o=(n=n.filter((e=>"videoinput"===e.kind))).find((e=>t.some((t=>e.label.toLowerCase().includes(t)))));return!o&&n.length&&t.includes("back")&&(o=n[n.length-1]),o&&(e.video.deviceId=s.exact?{exact:o.deviceId}:{ideal:o.deviceId}),e.video=r(e.video),S("chrome: "+JSON.stringify(e)),i(e)}))}e.video=r(e.video)}return S("chrome: "+JSON.stringify(e)),i(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(n.getUserMedia=function(e,t,r){i(e,(e=>{n.webkitGetUserMedia(e,t,(e=>{r&&r(s(e))}))}))}.bind(n),n.mediaDevices.getUserMedia){const e=n.mediaDevices.getUserMedia.bind(n.mediaDevices);n.mediaDevices.getUserMedia=function(t){return i(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))))))}}}function T(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&("function"==typeof t?e.navigator.mediaDevices.getDisplayMedia=function(n){return t(n).then((t=>{const r=n.video&&n.video.width,i=n.video&&n.video.height,s=n.video&&n.video.frameRate;return n.video={mandatory:{chromeMediaSource:"desktop",chromeMediaSourceId:t,maxFrameRate:s||3}},r&&(n.video.mandatory.maxWidth=r),i&&(n.video.mandatory.maxHeight=i),e.navigator.mediaDevices.getUserMedia(n)}))}:console.error("shimGetDisplayMedia: getSourceId argument is not a function"))}function R(e){e.MediaStream=e.MediaStream||e.webkitMediaStream}function w(e){if("object"==typeof e&&e.RTCPeerConnection&&!("ontrack"in e.RTCPeerConnection.prototype)){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});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){return this._ontrackpoly||(this._ontrackpoly=t=>{t.stream.addEventListener("addtrack",(n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.track.id)):{track:n.track};const i=new Event("track");i.track=n.track,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)})),t.stream.getTracks().forEach((n=>{let r;r=e.RTCPeerConnection.prototype.getReceivers?this.getReceivers().find((e=>e.track&&e.track.id===n.id)):{track:n};const i=new Event("track");i.track=n,i.receiver=r,i.transceiver={receiver:r},i.streams=[t.stream],this.dispatchEvent(i)}))},this.addEventListener("addstream",this._ontrackpoly)),t.apply(this,arguments)}}else d(e,"track",(e=>(e.transceiver||Object.defineProperty(e,"transceiver",{value:{receiver:e.receiver}}),e)))}function k(e){if("object"==typeof e&&e.RTCPeerConnection&&!("getSenders"in e.RTCPeerConnection.prototype)&&"createDTMFSender"in e.RTCPeerConnection.prototype){const 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()};const n=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,r){let i=n.apply(this,arguments);return i||(i=t(this,e),this._senders.push(i)),i};const r=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){r.apply(this,arguments);const t=this._senders.indexOf(e);-1!==t&&this._senders.splice(t,1)}}const n=e.RTCPeerConnection.prototype.addStream;e.RTCPeerConnection.prototype.addStream=function(e){this._senders=this._senders||[],n.apply(this,[e]),e.getTracks().forEach((e=>{this._senders.push(t(this,e))}))};const r=e.RTCPeerConnection.prototype.removeStream;e.RTCPeerConnection.prototype.removeStream=function(e){this._senders=this._senders||[],r.apply(this,[e]),e.getTracks().forEach((e=>{const 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)){const t=e.RTCPeerConnection.prototype.getSenders;e.RTCPeerConnection.prototype.getSenders=function(){const 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 E(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,n,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,[]);const i=function(e){const t={};return e.result().forEach((e=>{const n={id:e.id,timestamp:e.timestamp,type:{localcandidate:"local-candidate",remotecandidate:"remote-candidate"}[e.type]||e.type};e.names().forEach((t=>{n[t]=e.stat(t)})),t[n.id]=n})),t},s=function(e){return new Map(Object.keys(e).map((t=>[t,e[t]])))};if(arguments.length>=2){const r=function(e){n(s(i(e)))};return t.apply(this,[r,e])}return new Promise(((e,n)=>{t.apply(this,[function(t){e(s(i(t)))},n])})).then(n,r)}}function b(e){if(!("object"==typeof e&&e.RTCPeerConnection&&e.RTCRtpSender&&e.RTCRtpReceiver))return;if(!("getStats"in e.RTCRtpSender.prototype)){const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){const e=this;return this._pc.getStats().then((t=>g(t,e.track,!0)))}}if(!("getStats"in e.RTCRtpReceiver.prototype)){const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),d(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){const 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;const t=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){if(arguments.length>0&&arguments[0]instanceof e.MediaStreamTrack){const e=arguments[0];let t,n,r;return this.getSenders().forEach((n=>{n.track===e&&(t?r=!0:t=n)})),this.getReceivers().forEach((t=>(t.track===e&&(n?r=!0:n=t),t.track===e))),r||t&&n?Promise.reject(new DOMException("There are more than one sender or receiver for the track.","InvalidAccessError")):t?t.getStats():n?n.getStats():Promise.reject(new DOMException("There is no sender or receiver for the track.","InvalidAccessError"))}return t.apply(this,arguments)}}function _(e){e.RTCPeerConnection.prototype.getLocalStreams=function(){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},Object.keys(this._shimmedLocalStreams).map((e=>this._shimmedLocalStreams[e][0]))};const t=e.RTCPeerConnection.prototype.addTrack;e.RTCPeerConnection.prototype.addTrack=function(e,n){if(!n)return t.apply(this,arguments);this._shimmedLocalStreams=this._shimmedLocalStreams||{};const r=t.apply(this,arguments);return this._shimmedLocalStreams[n.id]?-1===this._shimmedLocalStreams[n.id].indexOf(r)&&this._shimmedLocalStreams[n.id].push(r):this._shimmedLocalStreams[n.id]=[n,r],r};const n=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")}));const t=this.getSenders();n.apply(this,arguments);const r=this.getSenders().filter((e=>-1===t.indexOf(e)));this._shimmedLocalStreams[e.id]=[e].concat(r)};const 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)};const i=e.RTCPeerConnection.prototype.removeTrack;e.RTCPeerConnection.prototype.removeTrack=function(e){return this._shimmedLocalStreams=this._shimmedLocalStreams||{},e&&Object.keys(this._shimmedLocalStreams).forEach((t=>{const n=this._shimmedLocalStreams[t].indexOf(e);-1!==n&&this._shimmedLocalStreams[t].splice(n,1),1===this._shimmedLocalStreams[t].length&&delete this._shimmedLocalStreams[t]})),i.apply(this,arguments)}}function I(e,t){if(!e.RTCPeerConnection)return;if(e.RTCPeerConnection.prototype.addTrack&&t.version>=65)return _(e);const n=e.RTCPeerConnection.prototype.getLocalStreams;e.RTCPeerConnection.prototype.getLocalStreams=function(){const e=n.apply(this);return this._reverseStreams=this._reverseStreams||{},e.map((e=>this._reverseStreams[e.id]))};const 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]){const n=new e.MediaStream(t.getTracks());this._streams[t.id]=n,this._reverseStreams[n.id]=t,t=n}r.apply(this,[t])};const i=e.RTCPeerConnection.prototype.removeStream;function s(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(i.id,"g"),r.id)})),new RTCSessionDescription({type:t.type,sdp:n})}e.RTCPeerConnection.prototype.removeStream=function(e){this._streams=this._streams||{},this._reverseStreams=this._reverseStreams||{},i.apply(this,[this._streams[e.id]||e]),delete this._reverseStreams[this._streams[e.id]?this._streams[e.id].id:e.id],delete this._streams[e.id]},e.RTCPeerConnection.prototype.addTrack=function(t,n){if("closed"===this.signalingState)throw new DOMException("The RTCPeerConnection's signalingState is 'closed'.","InvalidStateError");const 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||{};const i=this._streams[n.id];if(i)i.addTrack(t),Promise.resolve().then((()=>{this.dispatchEvent(new Event("negotiationneeded"))}));else{const r=new e.MediaStream([t]);this._streams[n.id]=r,this._reverseStreams[r.id]=n,this.addStream(r)}return this.getSenders().find((e=>e.track===t))},["createOffer","createAnswer"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){const e=arguments;return arguments.length&&"function"==typeof arguments[0]?n.apply(this,[t=>{const n=s(this,t);e[0].apply(null,[n])},t=>{e[1]&&e[1].apply(null,t)},arguments[2]]):n.apply(this,arguments).then((e=>s(this,e)))}};e.RTCPeerConnection.prototype[t]=r[t]}));const o=e.RTCPeerConnection.prototype.setLocalDescription;e.RTCPeerConnection.prototype.setLocalDescription=function(){return arguments.length&&arguments[0].type?(arguments[0]=function(e,t){let n=t.sdp;return Object.keys(e._reverseStreams||[]).forEach((t=>{const r=e._reverseStreams[t],i=e._streams[r.id];n=n.replace(new RegExp(r.id,"g"),i.id)})),new RTCSessionDescription({type:t.type,sdp:n})}(this,arguments[0]),o.apply(this,arguments)):o.apply(this,arguments)};const a=Object.getOwnPropertyDescriptor(e.RTCPeerConnection.prototype,"localDescription");Object.defineProperty(e.RTCPeerConnection.prototype,"localDescription",{get(){const e=a.get.apply(this);return""===e.type?e:s(this,e)}}),e.RTCPeerConnection.prototype.removeTrack=function(e){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");let t;this._streams=this._streams||{},Object.keys(this._streams).forEach((n=>{this._streams[n].getTracks().find((t=>e.track===t))&&(t=this._streams[n])})),t&&(1===t.getTracks().length?this.removeStream(this._reverseStreams[t.id]):t.removeTrack(e.track),this.dispatchEvent(new Event("negotiationneeded")))}}function x(e,t){!e.RTCPeerConnection&&e.webkitRTCPeerConnection&&(e.RTCPeerConnection=e.webkitRTCPeerConnection),e.RTCPeerConnection&&t.version<53&&["setLocalDescription","setRemoteDescription","addIceCandidate"].forEach((function(t){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}))}function D(e,t){d(e,"negotiationneeded",(e=>{const n=e.target;if(!(t.version<72||n.getConfiguration&&"plan-b"===n.getConfiguration().sdpSemantics)||"stable"===n.signalingState)return e}))}var M={};function A(e,t){const n=e&&e.navigator,r=e&&e.MediaStreamTrack;if(n.getUserMedia=function(e,t,r){u("navigator.getUserMedia","navigator.mediaDevices.getUserMedia"),n.mediaDevices.getUserMedia(e).then(t,r)},!(t.version>55&&"autoGainControl"in n.mediaDevices.getSupportedConstraints())){const e=function(e,t,n){t in e&&!(n in e)&&(e[n]=e[t],delete e[t])},t=n.mediaDevices.getUserMedia.bind(n.mediaDevices);if(n.mediaDevices.getUserMedia=function(n){return"object"==typeof n&&"object"==typeof n.audio&&(n=JSON.parse(JSON.stringify(n)),e(n.audio,"autoGainControl","mozAutoGainControl"),e(n.audio,"noiseSuppression","mozNoiseSuppression")),t(n)},r&&r.prototype.getSettings){const t=r.prototype.getSettings;r.prototype.getSettings=function(){const n=t.apply(this,arguments);return e(n,"mozAutoGainControl","autoGainControl"),e(n,"mozNoiseSuppression","noiseSuppression"),n}}if(r&&r.prototype.applyConstraints){const t=r.prototype.applyConstraints;r.prototype.applyConstraints=function(n){return"audio"===this.kind&&"object"==typeof n&&(n=JSON.parse(JSON.stringify(n)),e(n,"autoGainControl","mozAutoGainControl"),e(n,"noiseSuppression","mozNoiseSuppression")),t.apply(this,[n])}}}}function O(e,t){e.navigator.mediaDevices&&"getDisplayMedia"in e.navigator.mediaDevices||e.navigator.mediaDevices&&(e.navigator.mediaDevices.getDisplayMedia=function(n){if(!n||!n.video){const e=new DOMException("getDisplayMedia without video constraints is undefined");return e.name="NotFoundError",e.code=8,Promise.reject(e)}return!0===n.video?n.video={mediaSource:t}:n.video.mediaSource=t,e.navigator.mediaDevices.getUserMedia(n)})}function L(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 j(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){const n=e.RTCPeerConnection.prototype[t],r={[t](){return arguments[0]=new("addIceCandidate"===t?e.RTCIceCandidate:e.RTCSessionDescription)(arguments[0]),n.apply(this,arguments)}};e.RTCPeerConnection.prototype[t]=r[t]}));const n={inboundrtp:"inbound-rtp",outboundrtp:"outbound-rtp",candidatepair:"candidate-pair",localcandidate:"local-candidate",remotecandidate:"remote-candidate"},r=e.RTCPeerConnection.prototype.getStats;e.RTCPeerConnection.prototype.getStats=function(){const[e,i,s]=arguments;return r.apply(this,[e||null]).then((e=>{if(t.version<53&&!i)try{e.forEach((e=>{e.type=n[e.type]||e.type}))}catch(t){if("TypeError"!==t.name)throw t;e.forEach(((t,r)=>{e.set(r,Object.assign({},t,{type:n[t.type]||t.type}))}))}return e})).then(i,s)}}function N(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpSender.prototype)return;const t=e.RTCPeerConnection.prototype.getSenders;t&&(e.RTCPeerConnection.prototype.getSenders=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e});const n=e.RTCPeerConnection.prototype.addTrack;n&&(e.RTCPeerConnection.prototype.addTrack=function(){const e=n.apply(this,arguments);return e._pc=this,e}),e.RTCRtpSender.prototype.getStats=function(){return this.track?this._pc.getStats(this.track):Promise.resolve(new Map)}}function q(e){if("object"!=typeof e||!e.RTCPeerConnection||!e.RTCRtpSender)return;if(e.RTCRtpSender&&"getStats"in e.RTCRtpReceiver.prototype)return;const t=e.RTCPeerConnection.prototype.getReceivers;t&&(e.RTCPeerConnection.prototype.getReceivers=function(){const e=t.apply(this,[]);return e.forEach((e=>e._pc=this)),e}),d(e,"track",(e=>(e.receiver._pc=e.srcElement,e))),e.RTCRtpReceiver.prototype.getStats=function(){return this._pc.getStats(this.track)}}function F(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 U(e){e.DataChannel&&!e.RTCDataChannel&&(e.RTCDataChannel=e.DataChannel)}function G(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype.addTransceiver;t&&(e.RTCPeerConnection.prototype.addTransceiver=function(){this.setParametersPromises=[];let e=arguments[1]&&arguments[1].sendEncodings;void 0===e&&(e=[]),e=[...e];const n=e.length>0;n&&e.forEach((e=>{if("rid"in e){if(!/^[a-z0-9]{0,16}$/i.test(e.rid))throw new TypeError("Invalid RID value provided.")}if("scaleResolutionDownBy"in e&&!(parseFloat(e.scaleResolutionDownBy)>=1))throw new RangeError("scale_resolution_down_by must be >= 1.0");if("maxFramerate"in e&&!(parseFloat(e.maxFramerate)>=0))throw new RangeError("max_framerate must be >= 0.0")}));const r=t.apply(this,arguments);if(n){const{sender:t}=r,n=t.getParameters();(!("encodings"in n)||1===n.encodings.length&&0===Object.keys(n.encodings[0]).length)&&(n.encodings=e,t.sendEncodings=e,this.setParametersPromises.push(t.setParameters(n).then((()=>{delete t.sendEncodings})).catch((()=>{delete t.sendEncodings}))))}return r})}function z(e){if("object"!=typeof e||!e.RTCRtpSender)return;const t=e.RTCRtpSender.prototype.getParameters;t&&(e.RTCRtpSender.prototype.getParameters=function(){const e=t.apply(this,arguments);return"encodings"in e||(e.encodings=[].concat(this.sendEncodings||[{}])),e})}function J(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const 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 W(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const 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)}}e(M,"shimOnTrack",(()=>L)),e(M,"shimPeerConnection",(()=>j)),e(M,"shimSenderGetStats",(()=>N)),e(M,"shimReceiverGetStats",(()=>q)),e(M,"shimRemoveStream",(()=>F)),e(M,"shimRTCDataChannel",(()=>U)),e(M,"shimAddTransceiver",(()=>G)),e(M,"shimGetParameters",(()=>z)),e(M,"shimCreateOffer",(()=>J)),e(M,"shimCreateAnswer",(()=>W)),e(M,"shimGetUserMedia",(()=>A)),e(M,"shimGetDisplayMedia",(()=>O));var V={};function B(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)){const 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((n=>t.call(this,n,e))),e.getVideoTracks().forEach((n=>t.call(this,n,e)))},e.RTCPeerConnection.prototype.addTrack=function(e,...n){return n&&n.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=[]);const t=this._localStreams.indexOf(e);if(-1===t)return;this._localStreams.splice(t,1);const n=e.getTracks();this.getSenders().forEach((e=>{n.includes(e.track)&&this.removeTrack(e)}))})}}function K(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);const t=new Event("addstream");t.stream=e,this.dispatchEvent(t)}))})}});const t=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){const 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);const n=new Event("addstream");n.stream=t,e.dispatchEvent(n)}))}),t.apply(e,arguments)}}}function H(e){if("object"!=typeof e||!e.RTCPeerConnection)return;const t=e.RTCPeerConnection.prototype,n=t.createOffer,r=t.createAnswer,i=t.setLocalDescription,s=t.setRemoteDescription,o=t.addIceCandidate;t.createOffer=function(e,t){const r=arguments.length>=2?arguments[2]:arguments[0],i=n.apply(this,[r]);return t?(i.then(e,t),Promise.resolve()):i},t.createAnswer=function(e,t){const n=arguments.length>=2?arguments[2]:arguments[0],i=r.apply(this,[n]);return t?(i.then(e,t),Promise.resolve()):i};let a=function(e,t,n){const r=i.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r};t.setLocalDescription=a,a=function(e,t,n){const r=s.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.setRemoteDescription=a,a=function(e,t,n){const r=o.apply(this,[e]);return n?(r.then(t,n),Promise.resolve()):r},t.addIceCandidate=a}function X(e){const t=e&&e.navigator;if(t.mediaDevices&&t.mediaDevices.getUserMedia){const e=t.mediaDevices,n=e.getUserMedia.bind(e);t.mediaDevices.getUserMedia=e=>n(Y(e))}!t.getUserMedia&&t.mediaDevices&&t.mediaDevices.getUserMedia&&(t.getUserMedia=function(e,n,r){t.mediaDevices.getUserMedia(e).then(n,r)}.bind(t))}function Y(e){return e&&void 0!==e.video?Object.assign({},e,{video:v(e.video)}):e}function $(e){if(!e.RTCPeerConnection)return;const t=e.RTCPeerConnection;e.RTCPeerConnection=function(e,n){if(e&&e.iceServers){const t=[];for(let n=0;nt.generateCertificate})}function Q(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 Z(e){const t=e.RTCPeerConnection.prototype.createOffer;e.RTCPeerConnection.prototype.createOffer=function(e){if(e){void 0!==e.offerToReceiveAudio&&(e.offerToReceiveAudio=!!e.offerToReceiveAudio);const 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);const n=this.getTransceivers().find((e=>"video"===e.receiver.track.kind));!1===e.offerToReceiveVideo&&n?"sendrecv"===n.direction?n.setDirection?n.setDirection("sendonly"):n.direction="sendonly":"recvonly"===n.direction&&(n.setDirection?n.setDirection("inactive"):n.direction="inactive"):!0!==e.offerToReceiveVideo||n||this.addTransceiver("video",{direction:"recvonly"})}return t.apply(this,arguments)}}function ee(e){"object"!=typeof e||e.AudioContext||(e.AudioContext=e.webkitAudioContext)}e(V,"shimLocalStreamsAPI",(()=>B)),e(V,"shimRemoteStreamsAPI",(()=>K)),e(V,"shimCallbacksAPI",(()=>H)),e(V,"shimGetUserMedia",(()=>X)),e(V,"shimConstraints",(()=>Y)),e(V,"shimRTCIceServerUrls",(()=>$)),e(V,"shimTrackEventTransceiver",(()=>Q)),e(V,"shimCreateOfferLegacy",(()=>Z)),e(V,"shimAudioContext",(()=>ee));var te={};e(te,"shimRTCIceCandidate",(()=>ie)),e(te,"shimRTCIceCandidateRelayProtocol",(()=>se)),e(te,"shimMaxMessageSize",(()=>oe)),e(te,"shimSendThrowTypeError",(()=>ae)),e(te,"shimConnectionState",(()=>ce)),e(te,"removeExtmapAllowMixed",(()=>pe)),e(te,"shimAddIceCandidateNullOrEmpty",(()=>de)),e(te,"shimParameterlessSetLocalDescription",(()=>he));var ne={};const re={};function ie(e){if(!e.RTCIceCandidate||e.RTCIceCandidate&&"foundation"in e.RTCIceCandidate.prototype)return;const n=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){const r=new n(e),i=t(ne).parseCandidate(e.candidate);for(const e in i)e in r||Object.defineProperty(r,e,{value:i[e]});return r.toJSON=function(){return{candidate:r.candidate,sdpMid:r.sdpMid,sdpMLineIndex:r.sdpMLineIndex,usernameFragment:r.usernameFragment}},r}return new n(e)},e.RTCIceCandidate.prototype=n.prototype,d(e,"icecandidate",(t=>(t.candidate&&Object.defineProperty(t,"candidate",{value:new e.RTCIceCandidate(t.candidate),writable:"false"}),t)))}function se(e){!e.RTCIceCandidate||e.RTCIceCandidate&&"relayProtocol"in e.RTCIceCandidate.prototype||d(e,"icecandidate",(e=>{if(e.candidate){const n=t(ne).parseCandidate(e.candidate.candidate);"relay"===n.type&&(e.candidate.relayProtocol={0:"tls",1:"tcp",2:"udp"}[n.priority>>24])}return e}))}function oe(e,n){if(!e.RTCPeerConnection)return;"sctp"in e.RTCPeerConnection.prototype||Object.defineProperty(e.RTCPeerConnection.prototype,"sctp",{get(){return void 0===this._sctp?null:this._sctp}});const r=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(){if(this._sctp=null,"chrome"===n.browser&&n.version>=76){const{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(function(e){if(!e||!e.sdp)return!1;const n=t(ne).splitSections(e.sdp);return n.shift(),n.some((e=>{const n=t(ne).parseMLine(e);return n&&"application"===n.kind&&-1!==n.protocol.indexOf("SCTP")}))}(arguments[0])){const e=function(e){const t=e.sdp.match(/mozilla...THIS_IS_SDPARTA-(\d+)/);if(null===t||t.length<2)return-1;const n=parseInt(t[1],10);return n!=n?-1:n}(arguments[0]),r=function(e){let t=65536;return"firefox"===n.browser&&(t=n.version<57?-1===e?16384:2147483637:n.version<60?57===n.version?65535:65536:2147483637),t}(e),i=function(e,r){let i=65536;"firefox"===n.browser&&57===n.version&&(i=65535);const s=t(ne).matchPrefix(e.sdp,"a=max-message-size:");return s.length>0?i=parseInt(s[0].substring(19),10):"firefox"===n.browser&&-1!==r&&(i=2147483637),i}(arguments[0],e);let s;s=0===r&&0===i?Number.POSITIVE_INFINITY:0===r||0===i?Math.max(r,i):Math.min(r,i);const o={};Object.defineProperty(o,"maxMessageSize",{get:()=>s}),this._sctp=o}return r.apply(this,arguments)}}function ae(e){if(!e.RTCPeerConnection||!("createDataChannel"in e.RTCPeerConnection.prototype))return;function t(e,t){const n=e.send;e.send=function(){const r=arguments[0],i=r.length||r.size||r.byteLength;if("open"===e.readyState&&t.sctp&&i>t.sctp.maxMessageSize)throw new TypeError("Message too large (can send a maximum of "+t.sctp.maxMessageSize+" bytes)");return n.apply(e,arguments)}}const n=e.RTCPeerConnection.prototype.createDataChannel;e.RTCPeerConnection.prototype.createDataChannel=function(){const e=n.apply(this,arguments);return t(e,this),e},d(e,"datachannel",(e=>(t(e.channel,e.target),e)))}function ce(e){if(!e.RTCPeerConnection||"connectionState"in e.RTCPeerConnection.prototype)return;const 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=>{const n=t[e];t[e]=function(){return this._connectionstatechangepoly||(this._connectionstatechangepoly=e=>{const t=e.target;if(t._lastConnectionState!==t.connectionState){t._lastConnectionState=t.connectionState;const n=new Event("connectionstatechange",e);t.dispatchEvent(n)}return e},this.addEventListener("iceconnectionstatechange",this._connectionstatechangepoly)),n.apply(this,arguments)}}))}function pe(e,t){if(!e.RTCPeerConnection)return;if("chrome"===t.browser&&t.version>=71)return;if("safari"===t.browser&&t.version>=605)return;const n=e.RTCPeerConnection.prototype.setRemoteDescription;e.RTCPeerConnection.prototype.setRemoteDescription=function(t){if(t&&t.sdp&&-1!==t.sdp.indexOf("\na=extmap-allow-mixed")){const n=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:n}):t.sdp=n}return n.apply(this,arguments)}}function de(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.addIceCandidate;n&&0!==n.length&&(e.RTCPeerConnection.prototype.addIceCandidate=function(){return arguments[0]?("chrome"===t.browser&&t.version<78||"firefox"===t.browser&&t.version<68||"safari"===t.browser)&&arguments[0]&&""===arguments[0].candidate?Promise.resolve():n.apply(this,arguments):(arguments[1]&&arguments[1].apply(null),Promise.resolve())})}function he(e,t){if(!e.RTCPeerConnection||!e.RTCPeerConnection.prototype)return;const n=e.RTCPeerConnection.prototype.setLocalDescription;n&&0!==n.length&&(e.RTCPeerConnection.prototype.setLocalDescription=function(){let e=arguments[0]||{};if("object"!=typeof e||e.type&&e.sdp)return n.apply(this,arguments);if(e={type:e.type,sdp:e.sdp},!e.type)switch(this.signalingState){case"stable":case"have-local-offer":case"have-remote-pranswer":e.type="offer";break;default:e.type="answer"}if(e.sdp||"offer"!==e.type&&"answer"!==e.type)return n.apply(this,[e]);return("offer"===e.type?this.createOffer:this.createAnswer).apply(this).then((e=>n.apply(this,[e])))})}re.generateIdentifier=function(){return Math.random().toString(36).substring(2,12)},re.localCName=re.generateIdentifier(),re.splitLines=function(e){return e.trim().split("\n").map((e=>e.trim()))},re.splitSections=function(e){return e.split("\nm=").map(((e,t)=>(t>0?"m="+e:e).trim()+"\r\n"))},re.getDescription=function(e){const t=re.splitSections(e);return t&&t[0]},re.getMediaSections=function(e){const t=re.splitSections(e);return t.shift(),t},re.matchPrefix=function(e,t){return re.splitLines(e).filter((e=>0===e.indexOf(t)))},re.parseCandidate=function(e){let t;t=0===e.indexOf("a=candidate:")?e.substring(12).split(" "):e.substring(10).split(" ");const n={foundation:t[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(" ")}},re.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"},re.parseFmtp=function(e){const t={};let n;const 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:"+n+" "+r.join(";")+"\r\n"}return t},re.parseRtcpFb=function(e){const t=e.substring(e.indexOf(" ")+1).split(" ");return{type:t.shift(),parameter:t.join(" ")}},re.writeRtcpFb=function(e){let t="",n=e.payloadType;return void 0!==e.preferredPayloadType&&(n=e.preferredPayloadType),e.rtcpFeedback&&e.rtcpFeedback.length&&e.rtcpFeedback.forEach((e=>{t+="a=rtcp-fb:"+n+" "+e.type+(e.parameter&&e.parameter.length?" "+e.parameter:"")+"\r\n"})),t},re.parseSsrcMedia=function(e){const t=e.indexOf(" "),n={ssrc:parseInt(e.substring(7,t),10)},r=e.indexOf(":",t);return r>-1?(n.attribute=e.substring(t+1,r),n.value=e.substring(r+1)):n.attribute=e.substring(t+1),n},re.parseSsrcGroup=function(e){const t=e.substring(13).split(" ");return{semantics:t.shift(),ssrcs:t.map((e=>parseInt(e,10)))}},re.getMid=function(e){const t=re.matchPrefix(e,"a=mid:")[0];if(t)return t.substring(6)},re.parseFingerprint=function(e){const t=e.substring(14).split(" ");return{algorithm:t[0].toLowerCase(),value:t[1].toUpperCase()}},re.getDtlsParameters=function(e,t){return{role:"auto",fingerprints:re.matchPrefix(e+t,"a=fingerprint:").map(re.parseFingerprint)}},re.writeDtlsParameters=function(e,t){let n="a=setup:"+t+"\r\n";return e.fingerprints.forEach((e=>{n+="a=fingerprint:"+e.algorithm+" "+e.value+"\r\n"})),n},re.parseCryptoLine=function(e){const t=e.substring(9).split(" ");return{tag:parseInt(t[0],10),cryptoSuite:t[1],keyParams:t[2],sessionParams:t.slice(3)}},re.writeCryptoLine=function(e){return"a=crypto:"+e.tag+" "+e.cryptoSuite+" "+("object"==typeof e.keyParams?re.writeCryptoKeyParams(e.keyParams):e.keyParams)+(e.sessionParams?" "+e.sessionParams.join(" "):"")+"\r\n"},re.parseCryptoKeyParams=function(e){if(0!==e.indexOf("inline:"))return null;const 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}},re.writeCryptoKeyParams=function(e){return e.keyMethod+":"+e.keySalt+(e.lifeTime?"|"+e.lifeTime:"")+(e.mkiValue&&e.mkiLength?"|"+e.mkiValue+":"+e.mkiLength:"")},re.getCryptoParameters=function(e,t){return re.matchPrefix(e+t,"a=crypto:").map(re.parseCryptoLine)},re.getIceParameters=function(e,t){const n=re.matchPrefix(e+t,"a=ice-ufrag:")[0],r=re.matchPrefix(e+t,"a=ice-pwd:")[0];return n&&r?{usernameFragment:n.substring(12),password:r.substring(10)}:null},re.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},re.parseRtpParameters=function(e){const t={codecs:[],headerExtensions:[],fecMechanisms:[],rtcp:[]},n=re.splitLines(e)[0].split(" ");t.profile=n[2];for(let r=3;r{t.headerExtensions.push(re.parseExtmap(e))}));const r=re.matchPrefix(e,"a=rtcp-fb:* ").map(re.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},re.writeRtpDescription=function(e,t){let n="";n+="m="+e+" ",n+=t.codecs.length>0?"9":"0",n+=" "+(t.profile||"UDP/TLS/RTP/SAVPF")+" ",n+=t.codecs.map((e=>void 0!==e.preferredPayloadType?e.preferredPayloadType:e.payloadType)).join(" ")+"\r\n",n+="c=IN IP4 0.0.0.0\r\n",n+="a=rtcp:9 IN IP4 0.0.0.0\r\n",t.codecs.forEach((e=>{n+=re.writeRtpMap(e),n+=re.writeFmtp(e),n+=re.writeRtcpFb(e)}));let r=0;return t.codecs.forEach((e=>{e.maxptime>r&&(r=e.maxptime)})),r>0&&(n+="a=maxptime:"+r+"\r\n"),t.headerExtensions&&t.headerExtensions.forEach((e=>{n+=re.writeExtmap(e)})),n},re.parseRtpEncodingParameters=function(e){const t=[],n=re.parseRtpParameters(e),r=-1!==n.fecMechanisms.indexOf("RED"),i=-1!==n.fecMechanisms.indexOf("ULPFEC"),s=re.matchPrefix(e,"a=ssrc:").map((e=>re.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute)),o=s.length>0&&s[0].ssrc;let a;const c=re.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]===o&&(a=c[0][1]),n.codecs.forEach((e=>{if("RTX"===e.name.toUpperCase()&&e.parameters.apt){let n={ssrc:o,codecPayloadType:parseInt(e.parameters.apt,10)};o&&a&&(n.rtx={ssrc:a}),t.push(n),r&&(n=JSON.parse(JSON.stringify(n)),n.fec={ssrc:o,mechanism:i?"red+ulpfec":"red"},t.push(n))}})),0===t.length&&o&&t.push({ssrc:o});let p=re.matchPrefix(e,"b=");return p.length&&(p=0===p[0].indexOf("b=TIAS:")?parseInt(p[0].substring(7),10):0===p[0].indexOf("b=AS:")?950*parseInt(p[0].substring(5),10)-16e3:void 0,t.forEach((e=>{e.maxBitrate=p}))),t},re.parseRtcpParameters=function(e){const t={},n=re.matchPrefix(e,"a=ssrc:").map((e=>re.parseSsrcMedia(e))).filter((e=>"cname"===e.attribute))[0];n&&(t.cname=n.value,t.ssrc=n.ssrc);const r=re.matchPrefix(e,"a=rtcp-rsize");t.reducedSize=r.length>0,t.compound=0===r.length;const i=re.matchPrefix(e,"a=rtcp-mux");return t.mux=i.length>0,t},re.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},re.parseMsid=function(e){let t;const n=re.matchPrefix(e,"a=msid:");if(1===n.length)return t=n[0].substring(7).split(" "),{stream:t[0],track:t[1]};const r=re.matchPrefix(e,"a=ssrc:").map((e=>re.parseSsrcMedia(e))).filter((e=>"msid"===e.attribute));return r.length>0?(t=r[0].value.split(" "),{stream:t[0],track:t[1]}):void 0},re.parseSctpDescription=function(e){const t=re.parseMLine(e),n=re.matchPrefix(e,"a=max-message-size:");let r;n.length>0&&(r=parseInt(n[0].substring(19),10)),isNaN(r)&&(r=65536);const i=re.matchPrefix(e,"a=sctp-port:");if(i.length>0)return{port:parseInt(i[0].substring(12),10),protocol:t.fmt,maxMessageSize:r};const s=re.matchPrefix(e,"a=sctpmap:");if(s.length>0){const e=s[0].substring(10).split(" ");return{port:parseInt(e[0],10),protocol:e[1],maxMessageSize:r}}},re.writeSctpDescription=function(e,t){let n=[];return n="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&&n.push("a=max-message-size:"+t.maxMessageSize+"\r\n"),n.join("")},re.generateSessionId=function(){return Math.random().toString().substr(2,22)},re.writeSessionBoilerplate=function(e,t,n){let r;const i=void 0!==t?t:2;r=e||re.generateSessionId();return"v=0\r\no="+(n||"thisisadapterortc")+" "+r+" "+i+" IN IP4 127.0.0.1\r\ns=-\r\nt=0 0\r\n"},re.getDirection=function(e,t){const n=re.splitLines(e);for(let e=0;e{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":await this.rtc.addIceCandidate(new RTCIceCandidate(e.value));break;case"offer":{await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));let t=await this.rtc.createAnswer({offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(t),this.send({type:"answer",value:t});break}case"answer":await this.rtc.setRemoteDescription(new RTCSessionDescription(e.value));break;case"streamInfo":{let{id:t,value:n}=e,r=this.recaivingStream.get(t);r?this.recaivingStream.set(t,{...r,...n}):this.recaivingStream.set(t,n),this.send({type:"streamAccept",id:t});break}case"streamRemoved":{let{id:t}=e;this.emit("stream:stopped",this.recaivingStream.get(t)),this.sendingStream.delete(t);break}case"streamAccept":{let{id:t}=e,n=this.sendingStream.get(t),r=[];if(n&&n.stream){for(const e of n.stream.getTracks())r.push(this.rtc.addTrack(e,n.stream));n.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(const n of this.events[e])await n(...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,le.channels.set(this.id,this)})),e.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.addEventListener("close",(()=>{this.channel=void 0}))}destroy(){this.active=!1,this.channel&&(this.channel.close(),this.channel=void 0),this.rtc&&this.rtc.close(),this.emit("disconnected"),le.channels.delete(this.id)}eventDatachannel(e){":default:"==e.channel.label&&(le.channels.set(this.id,this),this.channel=e.channel),e.channel.addEventListener("message",(({data:e})=>{let t=JSON.parse(e);this.emit("input",t)})),e.channel.addEventListener("close",(()=>{this.channel=void 0,le.channels.delete(this.id),le.requireGC=!0}))}send(e){"open"==this.channel?.readyState?this.channel.send(JSON.stringify(e)):this.emit("output",e)}eventConnectionState(){this.connectionStatus=this.rtc.connectionState,"connected"==this.connectionStatus&&0==this.active&&(this.emit("connected"),this.active=!0),"failed"!=this.connectionStatus&&"disconnected"!=this.connectionStatus&&"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(){let e=await this.rtc.createOffer({iceRestart:!0,offerToReceiveAudio:!0,offerToReceiveVideo:!0});await this.rtc.setLocalDescription(e),this.send({type:"offer",value:e})}eventSignalingState(){this.signalingStatus=this.rtc.signalingState}eventTrack(e){let t=e.receiver;if(e.streams.length)for(const n of e.streams){let e=this.recaivingStream.get(n.id);(e.recaivers||(e.recaivers=[])).push(t),null==this.recaivingStream.get(n.id).stream?(e.stream=n,this.emit("stream:added",this.recaivingStream.get(n.id))):e.stream=n}}sendStream(e,t,n){this.send({type:"streamInfo",id:e.id,value:{...n,name:t}}),this.sendingStream.set(e.id,{...n,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(const e of t.getTracks())for(const 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(const[,{stream:e}]of this.sendingStream)if(null!=e){for(const t of e.getTracks())for(const e of this.rtc.getSenders())e.track?.id==t.id&&this.rtc.removeTrack(e);this.send({type:"streamRemoved",id:e.id})}this.sendingStream.clear()}}}let me;var ue;le.requireGC=!1,setInterval((()=>{if(0==le.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)},le.requireGC=!1}),3e3),(ue=me||(me={}))[ue.PayloadMessagePack=-12873.54]="PayloadMessagePack",ue[ue.PayloadRTCBasePack=-12884.54]="PayloadRTCBasePack";class fe extends i{options={};selfSocket=!1;active=!1;peerConnection=!1;primaryChannel="datachannel";constructor(e){super(),this.mwse=e,this.info=new o(this),this.on("pack",(e=>{if(":rtcbase_pack:"==e.type)return this.rtc?this.rtc.emit("input",e.payload):console.warn("Not active rtc but recaived rtc packs");this.emit("message",e)}))}createRTC(){return this.rtc=new le,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:":rtcbase_pack:",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 send(e){let t,n=this.peerConnection,r=this.mwse.server.connected;t=n&&r?"websocket"==this.primaryChannel?"websocket":"datachannel":r?"websocket":"datachannel","websocket"==t?await this.mwse.EventPooling.request({type:"pack/to",pack:e,to:this.socketId}):this.rtc?.sendMessage(e)}async forget(){this.mwse.peers.delete(this.socketId),this.mwse.pairs.delete(this.socketId)}}class ve extends i{peers=new Map;constructor(e){super(),this.mwse=e}setRoomOptions(e){if("string"==typeof e)this.roomId=e;else{let t={joinType:"free",ifexistsJoin:!0,accessType:"private",notifyActionInvite:!0,notifyActionJoined:!0,notifyActionEjected:!0};Object.assign(t,e),this.options=t}}setRoomId(e){this.roomId=e}async createRoom(e){let t=this.options||e,n=await this.mwse.EventPooling.request({type:"create-room",...t});if("fail"==n.status){if("ALREADY-EXISTS"==n.message&&this.options.ifexistsJoin)return this.join();throw new Error(n.message||n.messages)}this.options={...this.options,...n.room},this.roomId=n.room.id,this.mwse.rooms.set(this.roomId,this)}async join(){let e=await this.mwse.EventPooling.request({type:"joinroom",name:this.options.name,credential:this.options.credential});if("fail"==e.status)throw new Error(e.message);this.options={...this.options,...e.room},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){await this.mwse.EventPooling.request({type:"pack/room",pack:e,to:this.roomId,wom:t})}async fetchPeers(){let{status:e,peers:t}=await this.mwse.EventPooling.request({type:"room-peers",roomId:this.roomId}),n=[];if("fail"==e)throw new Error("Cant using peers on room");if("success"==e)for(const e of t){let t=this.mwse.peer(e);n.push(t),this.peers.set(e,t)}return n}}class ye{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,n,r]=e;if("number"==typeof n){let e=this.mwse.EventPooling.events.get(n);if(e){if(e[0](t,r),"E"===r)this.mwse.EventPooling.events.delete(n)}else console.warn("Missing event sended from server")}else{let e=this.mwse.EventPooling.signals.get(n);if(e)for(const n of e)n(t);else console.warn("Missing event sended from server")}}}window.MWSE=class extends i{rooms=new Map;pairs=new Map;peers=new Map;constructor(e){super(),this.server=new n(e),this.WSTSProtocol=new ye(this),this.EventPooling=new r(this),this.virtualPressure=new s(this),this.server.connect(),this.me=new fe(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.packMessagingSystem()}async request(e,t){let{pack:n}=await this.EventPooling.request({type:"request/to",to:e,pack:t});return n}async response(e,t,n){this.WSTSProtocol.SendOnly({type:"response/to",to:e,pack:n,id:t})}packMessagingSystem(){this.EventPooling.signal("pack",(e=>{let{from:t,pack:n}=e;this.peer(t,!0).emit("pack",n)})),this.EventPooling.signal("request",(e=>{let{from:t,pack:n,id:r}=e,i={body:n,response:e=>{this.response(t,r,e)},peer:this.peer(t,!0)};this.peer(t,!0).emit("request",i),this.peer("me").emit("request",i)})),this.EventPooling.signal("pack/room",(e=>{let{from:t,pack:n}=e;this.room(t).emit("message",n)})),this.EventPooling.signal("room/joined",(e=>{let{id:t,roomid:n}=e,r=this.room(n),i=this.peer(t,!0);r.peers.set(i.socketId,i),r.emit("join",i)})),this.EventPooling.signal("room/ejected",(e=>{let{id:t,roomid:n}=e,r=this.room(n),i=this.peer(t);r.peers.delete(i.socketId),r.emit("eject",i)})),this.EventPooling.signal("room/closed",(e=>{let{roomid:t}=e,n=this.room(t);n.peers.clear(),n.emit("close"),this.rooms.delete(t)})),this.EventPooling.signal("pair/info",(e=>{let{from:t,name:n,value:r}=e,i=this.peer(t);i.info.info[n]=r,i.emit("info",n,r)}))}room(e){if("string"==typeof e&&this.rooms.has(e))return this.rooms.get(e);let t=new ve(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 n=new fe(this);return n.setPeerOptions(e),n.active=t,this.peers.set(n.socketId,n),this.emit("peer",n),n}}})(); //# sourceMappingURL=index.js.map diff --git a/script/index.js.map b/script/index.js.map index 889f0a0..fe3227c 100644 --- a/script/index.js.map +++ b/script/index.js.map @@ -1 +1 @@ -{"mappings":"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","sources":["frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/PeerInfo.ts","node_modules/webrtc-adapter/src/js/utils.js","node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","node_modules/webrtc-adapter/src/js/safari/safari_shim.js","node_modules/sdp/sdp.js","node_modules/webrtc-adapter/src/js/common_shim.js","node_modules/webrtc-adapter/src/js/adapter_factory.js","node_modules/webrtc-adapter/src/js/adapter_core.js","frontend/WebRTC.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\n endpoint: string;\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n constructor(options: IConnection){\n this.endpoint = new URL(options.endpoint);\n }\n public connect()\n {\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\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 this.connected = false;\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 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.wsts.WSTSProtocol.SendRequest(msg, id);\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\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 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}","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // 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';\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';\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';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // 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'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","/* 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","/*\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","/*\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\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import 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 peer? : Peer;\n\n constructor()\n {\n this.rtc = new RTCPeerConnection({\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n iceServers:[{\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 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 await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n break;\n }\n case \"offer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\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 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.sendingStream.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 });\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 })\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 }\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 }\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 this.active = true;\n }\n };\n if(this.connectionStatus == 'failed' || this.connectionStatus == \"disconnected\" || 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 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 }\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}\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 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.info = new PeerInfo(this);\n\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == 'rtc')\n {\n if(data.action == IMessageSymbase.PayloadRTCBasePack)\n {\n if(this.rtc)\n {\n return this.rtc.emit(\"input\", data.payload)\n }\n console.warn(\"Not active rtc but recaived rtc packs\")\n };\n if(data.action == IMessageSymbase.PayloadMessagePack)\n {\n return this.emit(\"message\", data.payload)\n }\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC() : WebRTC\n {\n this.rtc = new WebRTC();\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: 'rtc',\n action: IMessageSymbase.PayloadRTCBasePack,\n payload: payload\n })\n });\n this.rtc.on(\"message\",(payload:object) => {\n this.emit(\"pack\",{\n type: 'rtc',\n action: IMessageSymbase.PayloadRTCBasePack,\n payload: payload\n })\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 send(pack: any){\n let isOpenedP2P = this.peerConnection;\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 await this.mwse.EventPooling.request({\n type:'pack/to',\n pack,\n to: this.socketId\n });\n }else{\n this.rtc?.sendMessage({\n type: 'rtc',\n action: IMessageSymbase.PayloadMessagePack,\n payload: pack\n })\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 EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\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}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : 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\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\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 };\n Object.assign(defaultOptions,options);\n this.options = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let options = this.options || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...options\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.options,\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.options.name,\n credential: this.options.credential\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.options,\n ...result.room\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){\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom\n });\n }\n async fetchPeers(){\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId\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);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\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}","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\";\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 constructor(options: IConnection){\n super();\n this.server = new Connection(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.packMessagingSystem();\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 let {from,pack} = payload;\n this.peer(from, true).emit('pack', pack);\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}) => {\n let {from,pack} = payload;\n this.room(from).emit('message', pack);\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/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);\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\n let peer = this.peer(from);\n\n peer.info.info[name] = value;\n\n peer.emit(\"info\", name, value);\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.rooms.set(room.roomId as string, room);\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;"],"names":["$201ddc79d766b86c$export$98b66c25bb38499d","autoPair","connected","constructor","options","this","endpoint","URL","connect","ws","WebSocket","href","addWSEvents","disconnect","close","addEventListener","eventOpen","eventClose","eventError","data","eventMessage","callback","activeConnectionEvent","recaivePackEvent","onRecaivePack","func","push","onActive","$data","JSON","parse","tranferToServer","send","stringify","$7bc29f3852fca8a1$export$2e2bcd8739ae039","events","Map","signals","requests","count","wsts","request","msg","Promise","ok","rej","id","WSTSProtocol","SendRequest","set","stream","StartStream","signal","event","T","get","$639a7a490074f3f2$export$2e2bcd8739ae039","emit","eventName","args","on","activeScope","scope","f","$707287ab76ae8d6a$export$cd59d3e68ede65a1","mwse","async","status","ip","EventPooling","type","APIPAddress","Error","number","APNumber","code","APShortCode","undefined","socket","whois","$d7d20b916ab000fe$export$f3bd5f68ae16de","info","peer","name","rinfo","socketId","console","warn","message","value","SendOnly","$35583cf39f4111ff$var$logDisabled_","$35583cf39f4111ff$var$deprecationWarnings_","$35583cf39f4111ff$export$e3c02be309be1f23","uastring","expr","pos","match","length","parseInt","$35583cf39f4111ff$export$1f48841962b828b1","window1","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","delete","size","Object","keys","defineProperty","enumerable","configurable","$35583cf39f4111ff$export$afbfee8cc06fd3e4","bool","$35583cf39f4111ff$export$51516be4b019e41e","$35583cf39f4111ff$export$bef1f36f5486a6a3","window","log","$35583cf39f4111ff$export$cdd73fc4100a6ef4","oldMethod","newMethod","$35583cf39f4111ff$var$isObject","val","toString","call","$35583cf39f4111ff$export$15384eac40dc88c8","reduce","accumulator","key","isObj","isEmptyObject","assign","$35583cf39f4111ff$export$571b373e75babb58","stats","base","resultSet","forEach","endsWith","$35583cf39f4111ff$export$93439ffc3f787d51","result","track","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","$3b9679f8ab9bc604$var$logging","$3b9679f8ab9bc604$export$1ed4910f4d37dc5e","browserDetails","navigator","mediaDevices","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","version","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","bind","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","reject","$26c6446bf842b72e$export$97270b87351d9c04","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","$e3f02d0a98ccb0db$export$33ee24e7a300bcd1","MediaStream","webkitMediaStream","$e3f02d0a98ccb0db$export$f358708f68ab068","_ontrack","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","Event","transceiver","streams","dispatchEvent","$e3f02d0a98ccb0db$export$a41a030a2842f5d6","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","$e3f02d0a98ccb0db$export$90608323826f0b17","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","successCallbackWrapper_","resolve","$e3f02d0a98ccb0db$export$f2f0f2338114eb4b","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","$e3f02d0a98ccb0db$export$30e3cdd46f8d5100","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","$e3f02d0a98ccb0db$export$9588259fcf4ebc91","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","signalingState","t","oldStream","method","nativeMethod","methodObj","desc","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","getOwnPropertyDescriptor","streamid","$e3f02d0a98ccb0db$export$852a08dda9a55ea7","webkitRTCPeerConnection","RTCIceCandidate","$e3f02d0a98ccb0db$export$341293bbeaae37cb","target","getConfiguration","sdpSemantics","$7252536737e6fa6d$export$1ed4910f4d37dc5e","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","$f85cf98e09e9e2f6$export$97270b87351d9c04","preferredMediaSource","mediaSource","$5c8245455fb0fb72$export$f358708f68ab068","RTCTrackEvent","$5c8245455fb0fb72$export$852a08dda9a55ea7","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","i","$5c8245455fb0fb72$export$f0525502095c04ef","$5c8245455fb0fb72$export$83d69126527b1171","$5c8245455fb0fb72$export$825e523ef749bd8c","$5c8245455fb0fb72$export$ff9cb3bc8990e8f7","DataChannel","RTCDataChannel","$5c8245455fb0fb72$export$70c77533b6e9908d","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","test","rid","TypeError","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","params","getParameters","encodings","setParameters","catch","$5c8245455fb0fb72$export$66238223c298fbaa","origGetParameters","$5c8245455fb0fb72$export$51beccf0e777b843","origCreateOffer","createOffer","all","finally","$5c8245455fb0fb72$export$df0b46e7cef08150","origCreateAnswer","createAnswer","$4bb6650df37cb8fe$export$8df41282f4fdcea2","_localStreams","_addTrack","index","tracks","$4bb6650df37cb8fe$export$762aa4cbb4f2f857","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","$4bb6650df37cb8fe$export$da31df245debdd3","addIceCandidate","successCallback","failureCallback","promise","withCallback","candidate","$4bb6650df37cb8fe$export$1ed4910f4d37dc5e","_getUserMedia","$4bb6650df37cb8fe$export$494a01ac68ba81ac","errcb","$4bb6650df37cb8fe$export$671a8b47b41b6f41","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","$4bb6650df37cb8fe$export$85d53da088cb1b14","$4bb6650df37cb8fe$export$d444266503fdd2d4","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","$4bb6650df37cb8fe$export$857cd739a7b795d2","AudioContext","webkitAudioContext","$257b6346d6d1b15f$var$SDPUtils","$8080a560a280724d$export$cf133661e444ccfe","NativeRTCIceCandidate","substring","nativeCandidate","parsedCandidate","$parcel$interopDefault","$257b6346d6d1b15f$exports","parseCandidate","toJSON","sdpMid","sdpMLineIndex","usernameFragment","writable","$8080a560a280724d$export$fdafb8d8280e29b5","relayProtocol","priority","$8080a560a280724d$export$a99147c78a56edc4","_sctp","browser","sections","splitSections","shift","mediaSection","mLine","parseMLine","protocol","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","maxMessageSize","matchPrefix","getMaxMessageSize","Number","POSITIVE_INFINITY","Math","sctp","$8080a560a280724d$export$d461c8d5c5db5da7","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","$8080a560a280724d$export$63bb816cc75460","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","$8080a560a280724d$export$a57d114344295149","nativeSRD","split","line","trim","join","$8080a560a280724d$export$51d5e40b48c771c7","nativeAddIceCandidate","$8080a560a280724d$export$7170d04e59f9d553","nativeSetLocalDescription","generateIdentifier","random","localCName","splitLines","blob","part","getDescription","getMediaSections","parts","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","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","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","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","shimChrome","shimFirefox","shimSafari","logging","mozGetUserMedia","userAgent","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","$35583cf39f4111ff$export$2d31490a0c05f094","adapter","$8080a560a280724d$exports","extractVersion","disableLog","disableWarnings","$e3f02d0a98ccb0db$exports","shimPeerConnection","browserShim","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","$5c8245455fb0fb72$exports","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimGetParameters","shimCreateOffer","shimCreateAnswer","$4bb6650df37cb8fe$exports","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimAudioContext","$895bfe3da380c655$export$2e2bcd8739ae039","static","active","connectionStatus","iceStatus","gatheringStatus","signalingStatus","recaivingStream","sendingStream","rtc","iceCandidatePoolSize","iceTransportPolicy","rtcpMuxPolicy","eventConnectionState","eventIcecandidate","eventICEConnectionState","eventICEGatherinState","eventNogationNeeded","eventSignalingState","eventTrack","eventDatachannel","answer","streamInfo","payload","dispatch","createDefaultDataChannel","sendMessage","dt","ordered","pack","destroy","requireGC","iceGatheringState","offer","iceRestart","rtpRecaiver","recaivers","sendStream","stopStream","_stream","RTCPSender","stopAllStreams","clear","$9f6c30de484136d4$var$IMessageSymbase","IMessageSymbase","setInterval","img","document","createElement","src","createObjectURL","Blob","ArrayBuffer","onerror","revokeObjectURL","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","peerConnection","primaryChannel","super","action","PayloadRTCBasePack","PayloadMessagePack","createRTC","setPeerOptions","setSocketId","uuid","equalTo","to","sendChannel","isOpenedP2P","isOpenedServer","peers","pairs","$4415e33c9749fde6$export$2e2bcd8739ae039","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","setRoomId","roomOptions","messages","room","rooms","credential","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","PackAnalyze","SendRaw","MWSE","virtualPressure","me","metadata","packMessagingSystem","peerId","requestId","from","body","roomid","isActive"],"version":3,"file":"index.js.map"} \ No newline at end of file +{"mappings":"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","sources":["frontend/Connection.ts","frontend/EventPool.ts","frontend/EventTarget.ts","frontend/IPPressure.ts","frontend/PeerInfo.ts","node_modules/webrtc-adapter/src/js/utils.js","node_modules/webrtc-adapter/src/js/chrome/getusermedia.js","node_modules/webrtc-adapter/src/js/chrome/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/chrome/chrome_shim.js","node_modules/webrtc-adapter/src/js/firefox/getusermedia.js","node_modules/webrtc-adapter/src/js/firefox/getdisplaymedia.js","node_modules/webrtc-adapter/src/js/firefox/firefox_shim.js","node_modules/webrtc-adapter/src/js/safari/safari_shim.js","node_modules/sdp/sdp.js","node_modules/webrtc-adapter/src/js/common_shim.js","node_modules/webrtc-adapter/src/js/adapter_factory.js","node_modules/webrtc-adapter/src/js/adapter_core.js","frontend/WebRTC.ts","frontend/Peer.ts","frontend/Room.ts","frontend/WSTSProtocol.ts","frontend/index.ts"],"sourcesContent":["export interface IConnection{\n endpoint: string;\n}\nexport class Connection\n{\n public ws! : WebSocket;\n public endpoint : URL;\n public autoPair : boolean = false;\n public connected : boolean = false;\n constructor(options: IConnection){\n this.endpoint = new URL(options.endpoint);\n }\n public connect()\n {\n this.ws = new WebSocket(this.endpoint.href);\n this.addWSEvents();\n }\n public disconnect()\n {\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 this.connected = false;\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 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.wsts.WSTSProtocol.SendRequest(msg, id);\n this.events.set(id,[\n (data:any) => {\n ok(data);\n },\n (data:any) => {\n rej(data);\n }\n ]);\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 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}","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nlet logDisabled_ = true;\nlet deprecationWarnings_ = true;\n\n/**\n * Extract browser version out of the provided user agent string.\n *\n * @param {!string} uastring userAgent string.\n * @param {!string} expr Regular expression used as match criteria.\n * @param {!number} pos position in the version string to be returned.\n * @return {!number} browser version.\n */\nexport function extractVersion(uastring, expr, pos) {\n const match = uastring.match(expr);\n return match && match.length >= pos && parseInt(match[pos], 10);\n}\n\n// Wraps the peerconnection event eventNameToWrap in a function\n// which returns the modified event object (or false to prevent\n// the event).\nexport function wrapPeerConnectionEvent(window, eventNameToWrap, wrapper) {\n if (!window.RTCPeerConnection) {\n return;\n }\n const proto = window.RTCPeerConnection.prototype;\n const nativeAddEventListener = proto.addEventListener;\n proto.addEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap) {\n return nativeAddEventListener.apply(this, arguments);\n }\n const wrappedCallback = (e) => {\n const modifiedEvent = wrapper(e);\n if (modifiedEvent) {\n if (cb.handleEvent) {\n cb.handleEvent(modifiedEvent);\n } else {\n cb(modifiedEvent);\n }\n }\n };\n this._eventMap = this._eventMap || {};\n if (!this._eventMap[eventNameToWrap]) {\n this._eventMap[eventNameToWrap] = new Map();\n }\n this._eventMap[eventNameToWrap].set(cb, wrappedCallback);\n return nativeAddEventListener.apply(this, [nativeEventName,\n wrappedCallback]);\n };\n\n const nativeRemoveEventListener = proto.removeEventListener;\n proto.removeEventListener = function(nativeEventName, cb) {\n if (nativeEventName !== eventNameToWrap || !this._eventMap\n || !this._eventMap[eventNameToWrap]) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n if (!this._eventMap[eventNameToWrap].has(cb)) {\n return nativeRemoveEventListener.apply(this, arguments);\n }\n const unwrappedCb = this._eventMap[eventNameToWrap].get(cb);\n this._eventMap[eventNameToWrap].delete(cb);\n if (this._eventMap[eventNameToWrap].size === 0) {\n delete this._eventMap[eventNameToWrap];\n }\n if (Object.keys(this._eventMap).length === 0) {\n delete this._eventMap;\n }\n return nativeRemoveEventListener.apply(this, [nativeEventName,\n unwrappedCb]);\n };\n\n Object.defineProperty(proto, 'on' + eventNameToWrap, {\n get() {\n return this['_on' + eventNameToWrap];\n },\n set(cb) {\n if (this['_on' + eventNameToWrap]) {\n this.removeEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap]);\n delete this['_on' + eventNameToWrap];\n }\n if (cb) {\n this.addEventListener(eventNameToWrap,\n this['_on' + eventNameToWrap] = cb);\n }\n },\n enumerable: true,\n configurable: true\n });\n}\n\nexport function disableLog(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n logDisabled_ = bool;\n return (bool) ? 'adapter.js logging disabled' :\n 'adapter.js logging enabled';\n}\n\n/**\n * Disable or enable deprecation warnings\n * @param {!boolean} bool set to true to disable warnings.\n */\nexport function disableWarnings(bool) {\n if (typeof bool !== 'boolean') {\n return new Error('Argument type: ' + typeof bool +\n '. Please use a boolean.');\n }\n deprecationWarnings_ = !bool;\n return 'adapter.js deprecation warnings ' + (bool ? 'disabled' : 'enabled');\n}\n\nexport function log() {\n if (typeof window === 'object') {\n if (logDisabled_) {\n return;\n }\n if (typeof console !== 'undefined' && typeof console.log === 'function') {\n console.log.apply(console, arguments);\n }\n }\n}\n\n/**\n * Shows a deprecation warning suggesting the modern and spec-compatible API.\n */\nexport function deprecated(oldMethod, newMethod) {\n if (!deprecationWarnings_) {\n return;\n }\n console.warn(oldMethod + ' is deprecated, please use ' + newMethod +\n ' instead.');\n}\n\n/**\n * Browser detector.\n *\n * @return {object} result containing browser and version\n * properties.\n */\nexport function detectBrowser(window) {\n // Returned result object.\n const result = {browser: null, version: null};\n\n // Fail early if it's not a browser\n if (typeof window === 'undefined' || !window.navigator) {\n result.browser = 'Not a browser.';\n return result;\n }\n\n const {navigator} = window;\n\n if (navigator.mozGetUserMedia) { // Firefox.\n result.browser = 'firefox';\n result.version = extractVersion(navigator.userAgent,\n /Firefox\\/(\\d+)\\./, 1);\n } else if (navigator.webkitGetUserMedia ||\n (window.isSecureContext === false && window.webkitRTCPeerConnection)) {\n // 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';\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';\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';\n\nimport * as utils from '../utils';\n\nexport function shimGetUserMedia(window, browserDetails) {\n const navigator = window && window.navigator;\n const MediaStreamTrack = window && window.MediaStreamTrack;\n\n navigator.getUserMedia = function(constraints, onSuccess, onError) {\n // Replace Firefox 44+'s deprecation warning with unprefixed version.\n utils.deprecated('navigator.getUserMedia',\n 'navigator.mediaDevices.getUserMedia');\n navigator.mediaDevices.getUserMedia(constraints).then(onSuccess, onError);\n };\n\n if (!(browserDetails.version > 55 &&\n 'autoGainControl' in navigator.mediaDevices.getSupportedConstraints())) {\n const remap = function(obj, a, b) {\n if (a in obj && !(b in obj)) {\n obj[b] = obj[a];\n delete obj[a];\n }\n };\n\n const nativeGetUserMedia = navigator.mediaDevices.getUserMedia.\n bind(navigator.mediaDevices);\n navigator.mediaDevices.getUserMedia = function(c) {\n if (typeof c === 'object' && typeof c.audio === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c.audio, 'autoGainControl', 'mozAutoGainControl');\n remap(c.audio, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeGetUserMedia(c);\n };\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.getSettings) {\n const nativeGetSettings = MediaStreamTrack.prototype.getSettings;\n MediaStreamTrack.prototype.getSettings = function() {\n const obj = nativeGetSettings.apply(this, arguments);\n remap(obj, 'mozAutoGainControl', 'autoGainControl');\n remap(obj, 'mozNoiseSuppression', 'noiseSuppression');\n return obj;\n };\n }\n\n if (MediaStreamTrack && MediaStreamTrack.prototype.applyConstraints) {\n const nativeApplyConstraints =\n MediaStreamTrack.prototype.applyConstraints;\n MediaStreamTrack.prototype.applyConstraints = function(c) {\n if (this.kind === 'audio' && typeof c === 'object') {\n c = JSON.parse(JSON.stringify(c));\n remap(c, 'autoGainControl', 'mozAutoGainControl');\n remap(c, 'noiseSuppression', 'mozNoiseSuppression');\n }\n return nativeApplyConstraints.apply(this, [c]);\n };\n }\n }\n}\n","/*\n * Copyright (c) 2018 The adapter.js project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nexport function shimGetDisplayMedia(window, preferredMediaSource) {\n if (window.navigator.mediaDevices &&\n 'getDisplayMedia' in window.navigator.mediaDevices) {\n return;\n }\n if (!(window.navigator.mediaDevices)) {\n return;\n }\n window.navigator.mediaDevices.getDisplayMedia =\n function getDisplayMedia(constraints) {\n if (!(constraints && constraints.video)) {\n const err = new DOMException('getDisplayMedia without video ' +\n 'constraints is undefined');\n err.name = 'NotFoundError';\n // from https://heycam.github.io/webidl/#idl-DOMException-error-names\n err.code = 8;\n return Promise.reject(err);\n }\n if (constraints.video === true) {\n constraints.video = {mediaSource: preferredMediaSource};\n } else {\n constraints.video.mediaSource = preferredMediaSource;\n }\n return window.navigator.mediaDevices.getUserMedia(constraints);\n };\n}\n","/*\n * Copyright (c) 2016 The WebRTC project authors. All Rights Reserved.\n *\n * Use of this source code is governed by a BSD-style license\n * that can be found in the LICENSE file in the root of the source\n * tree.\n */\n/* eslint-env node */\n'use strict';\n\nimport * as utils from '../utils';\nexport {shimGetUserMedia} from './getusermedia';\nexport {shimGetDisplayMedia} from './getdisplaymedia';\n\nexport function shimOnTrack(window) {\n if (typeof window === 'object' && window.RTCTrackEvent &&\n ('receiver' in window.RTCTrackEvent.prototype) &&\n !('transceiver' in window.RTCTrackEvent.prototype)) {\n Object.defineProperty(window.RTCTrackEvent.prototype, 'transceiver', {\n get() {\n return {receiver: this.receiver};\n }\n });\n }\n}\n\nexport function shimPeerConnection(window, browserDetails) {\n if (typeof window !== 'object' ||\n !(window.RTCPeerConnection || window.mozRTCPeerConnection)) {\n return; // probably media.peerconnection.enabled=false in about:config\n }\n if (!window.RTCPeerConnection && window.mozRTCPeerConnection) {\n // very basic support for old versions.\n window.RTCPeerConnection = window.mozRTCPeerConnection;\n }\n\n if (browserDetails.version < 53) {\n // shim away need for obsolete RTCIceCandidate/RTCSessionDescription.\n ['setLocalDescription', 'setRemoteDescription', 'addIceCandidate']\n .forEach(function(method) {\n const nativeMethod = window.RTCPeerConnection.prototype[method];\n const methodObj = {[method]() {\n arguments[0] = new ((method === 'addIceCandidate') ?\n window.RTCIceCandidate :\n window.RTCSessionDescription)(arguments[0]);\n return nativeMethod.apply(this, arguments);\n }};\n window.RTCPeerConnection.prototype[method] = methodObj[method];\n });\n }\n\n const modernStatsTypes = {\n inboundrtp: 'inbound-rtp',\n outboundrtp: 'outbound-rtp',\n candidatepair: 'candidate-pair',\n localcandidate: 'local-candidate',\n remotecandidate: 'remote-candidate'\n };\n\n const nativeGetStats = window.RTCPeerConnection.prototype.getStats;\n window.RTCPeerConnection.prototype.getStats = function getStats() {\n const [selector, onSucc, onErr] = arguments;\n return nativeGetStats.apply(this, [selector || null])\n .then(stats => {\n if (browserDetails.version < 53 && !onSucc) {\n // Shim only promise getStats with spec-hyphens in type names\n // Leave callback version alone; misc old uses of forEach before Map\n try {\n stats.forEach(stat => {\n stat.type = modernStatsTypes[stat.type] || stat.type;\n });\n } catch (e) {\n if (e.name !== 'TypeError') {\n throw e;\n }\n // Avoid TypeError: \"type\" is read-only, in old versions. 34-43ish\n stats.forEach((stat, i) => {\n stats.set(i, Object.assign({}, stat, {\n type: modernStatsTypes[stat.type] || stat.type\n }));\n });\n }\n }\n return stats;\n })\n .then(onSucc, onErr);\n };\n}\n\nexport function shimSenderGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpSender.prototype) {\n return;\n }\n const origGetSenders = window.RTCPeerConnection.prototype.getSenders;\n if (origGetSenders) {\n window.RTCPeerConnection.prototype.getSenders = function getSenders() {\n const senders = origGetSenders.apply(this, []);\n senders.forEach(sender => sender._pc = this);\n return senders;\n };\n }\n\n const origAddTrack = window.RTCPeerConnection.prototype.addTrack;\n if (origAddTrack) {\n window.RTCPeerConnection.prototype.addTrack = function addTrack() {\n const sender = origAddTrack.apply(this, arguments);\n sender._pc = this;\n return sender;\n };\n }\n window.RTCRtpSender.prototype.getStats = function getStats() {\n return this.track ? this._pc.getStats(this.track) :\n Promise.resolve(new Map());\n };\n}\n\nexport function shimReceiverGetStats(window) {\n if (!(typeof window === 'object' && window.RTCPeerConnection &&\n window.RTCRtpSender)) {\n return;\n }\n if (window.RTCRtpSender && 'getStats' in window.RTCRtpReceiver.prototype) {\n return;\n }\n const origGetReceivers = window.RTCPeerConnection.prototype.getReceivers;\n if (origGetReceivers) {\n window.RTCPeerConnection.prototype.getReceivers = function getReceivers() {\n const receivers = origGetReceivers.apply(this, []);\n receivers.forEach(receiver => receiver._pc = this);\n return receivers;\n };\n }\n utils.wrapPeerConnectionEvent(window, 'track', e => {\n e.receiver._pc = e.srcElement;\n return e;\n });\n window.RTCRtpReceiver.prototype.getStats = function getStats() {\n return this._pc.getStats(this.track);\n };\n}\n\nexport function shimRemoveStream(window) {\n if (!window.RTCPeerConnection ||\n 'removeStream' in window.RTCPeerConnection.prototype) {\n return;\n }\n window.RTCPeerConnection.prototype.removeStream =\n function removeStream(stream) {\n utils.deprecated('removeStream', 'removeTrack');\n this.getSenders().forEach(sender => {\n if (sender.track && stream.getTracks().includes(sender.track)) {\n this.removeTrack(sender);\n }\n });\n };\n}\n\nexport function shimRTCDataChannel(window) {\n // rename DataChannel to RTCDataChannel (native fix in FF60):\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1173851\n if (window.DataChannel && !window.RTCDataChannel) {\n window.RTCDataChannel = window.DataChannel;\n }\n}\n\nexport function shimAddTransceiver(window) {\n // https://github.com/webrtcHacks/adapter/issues/998#issuecomment-516921647\n // Firefox ignores the init sendEncodings options passed to addTransceiver\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1396918\n if (!(typeof window === 'object' && window.RTCPeerConnection)) {\n return;\n }\n const origAddTransceiver = window.RTCPeerConnection.prototype.addTransceiver;\n if (origAddTransceiver) {\n window.RTCPeerConnection.prototype.addTransceiver =\n function addTransceiver() {\n this.setParametersPromises = [];\n // 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'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","/* 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","/*\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","/*\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\n'use strict';\n\nimport {adapterFactory} from './adapter_factory.js';\n\nconst adapter =\n adapterFactory({window: typeof window === 'undefined' ? undefined : window});\nexport default adapter;\n","import 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 peer? : Peer;\n\n constructor()\n {\n this.rtc = new RTCPeerConnection({\n iceCandidatePoolSize: 0,\n iceTransportPolicy:\"all\",\n rtcpMuxPolicy:\"require\",\n iceServers:[{\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 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 await this.rtc.addIceCandidate(new RTCIceCandidate(data.value));\n break;\n }\n case \"offer\":{\n await this.rtc.setRemoteDescription(new RTCSessionDescription(data.value));\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 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.sendingStream.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 });\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 })\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 }\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 }\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 this.active = true;\n }\n };\n if(this.connectionStatus == 'failed' || this.connectionStatus == \"disconnected\" || 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 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 }\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}\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 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.info = new PeerInfo(this);\n\n this.on('pack',(data:{type?:string,action?:IMessageSymbase,payload?:any}) => {\n if(data.type == ':rtcbase_pack:')\n {\n if(this.rtc)\n {\n return this.rtc.emit(\"input\", data.payload)\n }\n return console.warn(\"Not active rtc but recaived rtc packs\")\n };\n this.emit(\"message\", data);\n });\n }\n public createRTC() : WebRTC\n {\n this.rtc = new WebRTC();\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: ':rtcbase_pack:',\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 send(pack: any){\n let isOpenedP2P = this.peerConnection;\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 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 EventTarget from \"./EventTarget\";\nimport MWSE from \"./index\";\nimport Peer from \"./Peer\";\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}\n\n\nexport default class Room extends EventTarget\n{\n public mwse : MWSE;\n public options! : 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\n constructor(wsts:MWSE){\n super();\n this.mwse = wsts;\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 };\n Object.assign(defaultOptions,options);\n this.options = defaultOptions as IRoomOptions;\n }\n }\n \n setRoomId(uuid: string){\n this.roomId = uuid;\n }\n async createRoom(roomOptions : IRoomOptions){\n let options = this.options || roomOptions;\n let result = await this.mwse.EventPooling.request({\n type:'create-room',\n ...options\n });\n if(result.status == 'fail')\n {\n if(result.message == \"ALREADY-EXISTS\" && this.options.ifexistsJoin)\n {\n return this.join();\n }\n throw new Error(result.message || result.messages);\n }else{\n this.options = {\n ...this.options,\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.options.name,\n credential: this.options.credential\n });\n if(result.status == 'fail')\n {\n throw new Error(result.message);\n }else{\n this.options = {\n ...this.options,\n ...result.room\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){\n await this.mwse.EventPooling.request({\n type:'pack/room',\n pack,\n to: this.roomId,\n wom\n });\n }\n async fetchPeers(){\n let {status, peers} = await this.mwse.EventPooling.request({\n type:'room-peers',\n roomId: this.roomId\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);\n cup.push(peer);\n this.peers.set(peerid, peer);\n }\n };\n return cup;\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}","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\";\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 constructor(options: IConnection){\n super();\n this.server = new Connection(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.packMessagingSystem();\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 let {from,pack} = payload;\n this.peer(from, true).emit('pack', pack);\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}) => {\n let {from,pack} = payload;\n this.room(from).emit('message', pack);\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/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);\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\n let peer = this.peer(from);\n\n peer.info.info[name] = value;\n\n peer.emit(\"info\", name, value);\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.rooms.set(room.roomId as string, room);\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;"],"names":["$201ddc79d766b86c$export$98b66c25bb38499d","autoPair","connected","constructor","options","this","endpoint","URL","connect","ws","WebSocket","href","addWSEvents","disconnect","close","addEventListener","eventOpen","eventClose","eventError","data","eventMessage","callback","activeConnectionEvent","recaivePackEvent","onRecaivePack","func","push","onActive","$data","JSON","parse","tranferToServer","send","stringify","$7bc29f3852fca8a1$export$2e2bcd8739ae039","events","Map","signals","requests","count","wsts","request","msg","Promise","ok","rej","id","WSTSProtocol","SendRequest","set","stream","StartStream","signal","event","T","get","$639a7a490074f3f2$export$2e2bcd8739ae039","emit","eventName","args","on","activeScope","scope","f","$707287ab76ae8d6a$export$cd59d3e68ede65a1","mwse","async","status","ip","EventPooling","type","APIPAddress","Error","number","APNumber","code","APShortCode","undefined","socket","whois","$d7d20b916ab000fe$export$f3bd5f68ae16de","info","peer","name","rinfo","socketId","console","warn","message","value","SendOnly","$35583cf39f4111ff$var$logDisabled_","$35583cf39f4111ff$var$deprecationWarnings_","$35583cf39f4111ff$export$e3c02be309be1f23","uastring","expr","pos","match","length","parseInt","$35583cf39f4111ff$export$1f48841962b828b1","window1","eventNameToWrap","wrapper","RTCPeerConnection","proto","prototype","nativeAddEventListener","nativeEventName","cb","apply","arguments","wrappedCallback","e","modifiedEvent","handleEvent","_eventMap","nativeRemoveEventListener","removeEventListener","has","unwrappedCb","delete","size","Object","keys","defineProperty","enumerable","configurable","$35583cf39f4111ff$export$afbfee8cc06fd3e4","bool","$35583cf39f4111ff$export$51516be4b019e41e","$35583cf39f4111ff$export$bef1f36f5486a6a3","window","log","$35583cf39f4111ff$export$cdd73fc4100a6ef4","oldMethod","newMethod","$35583cf39f4111ff$var$isObject","val","toString","call","$35583cf39f4111ff$export$15384eac40dc88c8","reduce","accumulator","key","isObj","isEmptyObject","assign","$35583cf39f4111ff$export$571b373e75babb58","stats","base","resultSet","forEach","endsWith","$35583cf39f4111ff$export$93439ffc3f787d51","result","track","outbound","streamStatsType","filteredResult","trackStats","trackIdentifier","trackStat","trackId","$3b9679f8ab9bc604$var$logging","$3b9679f8ab9bc604$export$1ed4910f4d37dc5e","browserDetails","navigator","mediaDevices","constraintsToChrome_","c","mandatory","optional","cc","r","ideal","exact","min","max","oldname_","prefix","charAt","toUpperCase","slice","oc","mix","advanced","concat","shimConstraints_","constraints","version","audio","remap","obj","a","b","video","face","facingMode","getSupportedFacingModeLies","getSupportedConstraints","matches","enumerateDevices","then","devices","dev","filter","d","kind","find","some","label","toLowerCase","includes","deviceId","shimError_","PermissionDeniedError","PermissionDismissedError","InvalidStateError","DevicesNotFoundError","ConstraintNotSatisfiedError","TrackStartError","MediaDeviceFailedDueToShutdown","MediaDeviceKillSwitchOn","TabCaptureError","ScreenCaptureError","DeviceCaptureError","constraint","constraintName","getUserMedia","onSuccess","onError","webkitGetUserMedia","bind","origGetUserMedia","cs","getAudioTracks","getVideoTracks","getTracks","stop","DOMException","reject","$26c6446bf842b72e$export$97270b87351d9c04","getSourceId","getDisplayMedia","sourceId","widthSpecified","width","heightSpecified","height","frameRateSpecified","frameRate","chromeMediaSource","chromeMediaSourceId","maxFrameRate","maxWidth","maxHeight","error","$e3f02d0a98ccb0db$export$33ee24e7a300bcd1","MediaStream","webkitMediaStream","$e3f02d0a98ccb0db$export$f358708f68ab068","_ontrack","origSetRemoteDescription","setRemoteDescription","_ontrackpoly","te","receiver","getReceivers","Event","transceiver","streams","dispatchEvent","$e3f02d0a98ccb0db$export$a41a030a2842f5d6","shimSenderWithDtmf","pc","dtmf","_dtmf","createDTMFSender","_pc","getSenders","_senders","origAddTrack","addTrack","sender","origRemoveTrack","removeTrack","idx","indexOf","splice","origAddStream","addStream","origRemoveStream","removeStream","s","RTCRtpSender","origGetSenders","senders","$e3f02d0a98ccb0db$export$90608323826f0b17","origGetStats","getStats","selector","onSucc","onErr","fixChromeStats_","response","standardReport","report","standardStats","timestamp","localcandidate","remotecandidate","names","stat","makeMapStats","map","successCallbackWrapper_","resolve","$e3f02d0a98ccb0db$export$f2f0f2338114eb4b","RTCRtpReceiver","origGetReceivers","receivers","srcElement","MediaStreamTrack","err","$e3f02d0a98ccb0db$export$30e3cdd46f8d5100","getLocalStreams","_shimmedLocalStreams","streamId","existingSenders","newSenders","newSender","$e3f02d0a98ccb0db$export$9588259fcf4ebc91","origGetLocalStreams","nativeStreams","_reverseStreams","_streams","newStream","replaceInternalStreamId","description","sdp","internalId","externalStream","internalStream","replace","RegExp","RTCSessionDescription","signalingState","t","oldStream","method","nativeMethod","methodObj","desc","origSetLocalDescription","setLocalDescription","replaceExternalStreamId","origLocalDescription","getOwnPropertyDescriptor","streamid","$e3f02d0a98ccb0db$export$852a08dda9a55ea7","webkitRTCPeerConnection","RTCIceCandidate","$e3f02d0a98ccb0db$export$341293bbeaae37cb","target","getConfiguration","sdpSemantics","$7252536737e6fa6d$export$1ed4910f4d37dc5e","nativeGetUserMedia","getSettings","nativeGetSettings","applyConstraints","nativeApplyConstraints","$f85cf98e09e9e2f6$export$97270b87351d9c04","preferredMediaSource","mediaSource","$5c8245455fb0fb72$export$f358708f68ab068","RTCTrackEvent","$5c8245455fb0fb72$export$852a08dda9a55ea7","mozRTCPeerConnection","modernStatsTypes","inboundrtp","outboundrtp","candidatepair","nativeGetStats","i","$5c8245455fb0fb72$export$f0525502095c04ef","$5c8245455fb0fb72$export$83d69126527b1171","$5c8245455fb0fb72$export$825e523ef749bd8c","$5c8245455fb0fb72$export$ff9cb3bc8990e8f7","DataChannel","RTCDataChannel","$5c8245455fb0fb72$export$70c77533b6e9908d","origAddTransceiver","addTransceiver","setParametersPromises","sendEncodings","shouldPerformCheck","encodingParam","test","rid","TypeError","parseFloat","scaleResolutionDownBy","RangeError","maxFramerate","params","getParameters","encodings","setParameters","catch","$5c8245455fb0fb72$export$66238223c298fbaa","origGetParameters","$5c8245455fb0fb72$export$51beccf0e777b843","origCreateOffer","createOffer","all","finally","$5c8245455fb0fb72$export$df0b46e7cef08150","origCreateAnswer","createAnswer","$4bb6650df37cb8fe$export$8df41282f4fdcea2","_localStreams","_addTrack","index","tracks","$4bb6650df37cb8fe$export$762aa4cbb4f2f857","getRemoteStreams","_remoteStreams","_onaddstream","_onaddstreampoly","$4bb6650df37cb8fe$export$da31df245debdd3","addIceCandidate","successCallback","failureCallback","promise","withCallback","candidate","$4bb6650df37cb8fe$export$1ed4910f4d37dc5e","_getUserMedia","$4bb6650df37cb8fe$export$494a01ac68ba81ac","errcb","$4bb6650df37cb8fe$export$671a8b47b41b6f41","OrigPeerConnection","pcConfig","pcConstraints","iceServers","newIceServers","server","urls","url","generateCertificate","$4bb6650df37cb8fe$export$85d53da088cb1b14","$4bb6650df37cb8fe$export$d444266503fdd2d4","offerOptions","offerToReceiveAudio","audioTransceiver","getTransceivers","direction","setDirection","offerToReceiveVideo","videoTransceiver","$4bb6650df37cb8fe$export$857cd739a7b795d2","AudioContext","webkitAudioContext","$257b6346d6d1b15f$var$SDPUtils","$8080a560a280724d$export$cf133661e444ccfe","NativeRTCIceCandidate","substring","nativeCandidate","parsedCandidate","$parcel$interopDefault","$257b6346d6d1b15f$exports","parseCandidate","toJSON","sdpMid","sdpMLineIndex","usernameFragment","writable","$8080a560a280724d$export$fdafb8d8280e29b5","relayProtocol","priority","$8080a560a280724d$export$a99147c78a56edc4","_sctp","browser","sections","splitSections","shift","mediaSection","mLine","parseMLine","protocol","sctpInDescription","isFirefox","getRemoteFirefoxVersion","canSendMMS","remoteIsFirefox","canSendMaxMessageSize","getCanSendMaxMessageSize","remoteMMS","maxMessageSize","matchPrefix","getMaxMessageSize","Number","POSITIVE_INFINITY","Math","sctp","$8080a560a280724d$export$d461c8d5c5db5da7","wrapDcSend","dc","origDataChannelSend","byteLength","readyState","origCreateDataChannel","createDataChannel","dataChannel","channel","$8080a560a280724d$export$63bb816cc75460","completed","checking","iceConnectionState","_onconnectionstatechange","origMethod","_connectionstatechangepoly","_lastConnectionState","connectionState","newEvent","$8080a560a280724d$export$a57d114344295149","nativeSRD","split","line","trim","join","$8080a560a280724d$export$51d5e40b48c771c7","nativeAddIceCandidate","$8080a560a280724d$export$7170d04e59f9d553","nativeSetLocalDescription","generateIdentifier","random","localCName","splitLines","blob","part","getDescription","getMediaSections","parts","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","encodingParameters","hasRed","hasUlpfec","primarySsrc","secondarySsrc","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","sessionId","getDirection","getKind","isRejected","parseOLine","username","sessionVersion","netType","addressType","isValidSDP","shimChrome","shimFirefox","shimSafari","logging","mozGetUserMedia","userAgent","isSecureContext","supportsUnifiedPlan","RTCRtpTransceiver","$35583cf39f4111ff$export$2d31490a0c05f094","adapter","$8080a560a280724d$exports","extractVersion","disableLog","disableWarnings","$e3f02d0a98ccb0db$exports","shimPeerConnection","browserShim","shimGetUserMedia","shimMediaStream","shimOnTrack","shimAddTrackRemoveTrack","shimGetSendersWithDtmf","shimGetStats","shimSenderReceiverGetStats","fixNegotiationNeeded","$5c8245455fb0fb72$exports","shimRemoveStream","shimSenderGetStats","shimReceiverGetStats","shimRTCDataChannel","shimAddTransceiver","shimGetParameters","shimCreateOffer","shimCreateAnswer","$4bb6650df37cb8fe$exports","shimRTCIceServerUrls","shimCreateOfferLegacy","shimCallbacksAPI","shimLocalStreamsAPI","shimRemoteStreamsAPI","shimTrackEventTransceiver","shimAudioContext","$895bfe3da380c655$export$2e2bcd8739ae039","static","active","connectionStatus","iceStatus","gatheringStatus","signalingStatus","recaivingStream","sendingStream","rtc","iceCandidatePoolSize","iceTransportPolicy","rtcpMuxPolicy","eventConnectionState","eventIcecandidate","eventICEConnectionState","eventICEGatherinState","eventNogationNeeded","eventSignalingState","eventTrack","eventDatachannel","answer","streamInfo","payload","dispatch","createDefaultDataChannel","sendMessage","dt","ordered","pack","destroy","requireGC","iceGatheringState","offer","iceRestart","rtpRecaiver","recaivers","sendStream","stopStream","_stream","RTCPSender","stopAllStreams","clear","$9f6c30de484136d4$var$IMessageSymbase","IMessageSymbase","setInterval","img","document","createElement","src","createObjectURL","Blob","ArrayBuffer","onerror","revokeObjectURL","$9f6c30de484136d4$export$2e2bcd8739ae039","selfSocket","peerConnection","primaryChannel","super","createRTC","setPeerOptions","setSocketId","uuid","equalTo","to","sendChannel","isOpenedP2P","isOpenedServer","peers","pairs","$4415e33c9749fde6$export$2e2bcd8739ae039","setRoomOptions","roomId","defaultOptions","joinType","ifexistsJoin","accessType","notifyActionInvite","notifyActionJoined","notifyActionEjected","setRoomId","roomOptions","messages","room","rooms","credential","wom","cup","peerid","$023568b0c88ffd16$export$2e2bcd8739ae039","addListener","PackAnalyze","SendRaw","action","MWSE","virtualPressure","me","metadata","packMessagingSystem","peerId","requestId","from","body","roomid","isActive"],"version":3,"file":"index.js.map"} \ No newline at end of file