@epicgames-ps/lib-pixelstreamingfrontend-ue5.5 0.0.10 → 0.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/lib-pixelstreamingfrontend.esm.js +1 -1
- package/dist/lib-pixelstreamingfrontend.js +1 -1
- package/package.json +4 -3
- package/src/Config/Config.ts +15 -1
- package/src/Config/SettingOption.ts +1 -1
- package/src/Inputs/TouchController.ts +2 -2
- package/src/PeerConnectionController/AggregatedStats.ts +34 -13
- package/src/PeerConnectionController/CandidatePairStats.ts +10 -3
- package/src/PeerConnectionController/CandidateStat.ts +4 -2
- package/src/PeerConnectionController/PeerConnectionController.ts +18 -2
- package/src/PixelStreaming/PixelStreaming.test.ts +33 -50
- package/src/PixelStreaming/PixelStreaming.ts +34 -1
- package/src/Util/EventEmitter.ts +12 -1
- package/src/VideoPlayer/StreamController.ts +6 -0
- package/src/WebRtcPlayer/WebRtcPlayerController.ts +3 -2
- package/src/__test__/mockWebSocket.ts +5 -5
- package/types/Config/Config.d.ts +1 -0
- package/types/PeerConnectionController/AggregatedStats.d.ts +8 -1
- package/types/PeerConnectionController/CandidatePairStats.d.ts +10 -3
- package/types/PeerConnectionController/CandidateStat.d.ts +4 -2
- package/types/PeerConnectionController/PeerConnectionController.d.ts +2 -0
- package/types/PixelStreaming/PixelStreaming.d.ts +2 -1
- package/types/Util/EventEmitter.d.ts +8 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import*as e from"sdp";var t={499:e=>{e.exports=function(){throw new Error("ws does not work in the browser. Browser clients must use the native WebSocket object")}},187:e=>{var t,n="object"==typeof Reflect?Reflect:null,r=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(n,r){function s(n){e.removeListener(t,i),r(n)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",s),n([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&p(e,"error",t,{once:!0})}(e,s)}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var a=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function c(e,t,n,r){var s,i,a,c;if(o(n),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),i=e._events),a=i[t]),void 0===a)a=i[t]=n,++e._eventsCount;else if("function"==typeof a?a=i[t]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(s=l(e))>0&&a.length>s&&!a.warned){a.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=a.length,c=d,console&&console.warn&&console.warn(c)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},s=d.bind(r);return s.listener=n,r.wrapFn=s,s}function u(e,t,n){var r=e._events;if(void 0===r)return[];var s=r[t];return void 0===s?[]:"function"==typeof s?n?[s.listener||s]:[s]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(s):m(s,s.length)}function g(e){var t=this._events;if(void 0!==t){var n=t[e];if("function"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function m(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}function p(e,t,n,r){if("function"==typeof e.on)r.once?e.once(t,n):e.on(t,n);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function s(i){r.once&&e.removeEventListener(t,s),n(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return a},set:function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");a=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return l(this)},i.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var s="error"===e,i=this._events;if(void 0!==i)s=s&&void 0===i.error;else if(!s)return!1;if(s){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var l=i[e];if(void 0===l)return!1;if("function"==typeof l)r(l,this,t);else{var c=l.length,d=m(l,c);for(n=0;n<c;++n)r(d[n],this,t)}return!0},i.prototype.addListener=function(e,t){return c(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return c(this,e,t,!0)},i.prototype.once=function(e,t){return o(t),this.on(e,h(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return o(t),this.prependListener(e,h(this,e,t)),this},i.prototype.removeListener=function(e,t){var n,r,s,i,a;if(o(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(s=-1,i=n.length-1;i>=0;i--)if(n[i]===t||n[i].listener===t){a=n[i].listener,s=i;break}if(s<0)return this;0===s?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,s),1===n.length&&(r[e]=n[0]),void 0!==r.removeListener&&this.emit("removeListener",e,a||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var s,i=Object.keys(n);for(r=0;r<i.length;++r)"removeListener"!==(s=i[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}}},n={};function r(e){var s=n[e];if(void 0!==s)return s.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var s={};(()=>{r.d(s,{Dz:()=>Vt,g$:()=>qe,Lt:()=>je,Q9:()=>Qe,qf:()=>Ke,hV:()=>qt,z$:()=>Ht,J0:()=>$t,De:()=>Nt,$C:()=>Bt,al:()=>st,_W:()=>it,Gv:()=>wt,m:()=>bt,tz:()=>rt,Nu:()=>_t,zg:()=>on,vp:()=>Pt,vU:()=>Lt,wF:()=>pt,rv:()=>Wt,Nh:()=>zt,ss:()=>sn,qW:()=>Tt,QL:()=>St,cf:()=>cn,eM:()=>mt,Yd:()=>i,Tk:()=>tn,iw:()=>n,pr:()=>De,Vm:()=>t,sK:()=>It,Ok:()=>At,q5:()=>jt,g:()=>$n,xl:()=>ht,I:()=>ut,bx:()=>gt,dD:()=>Rt,Ib:()=>We,Az:()=>ze,Iw:()=>_e,qY:()=>He,db:()=>$e,mR:()=>Ct,Tn:()=>Ne,rV:()=>ft,gh:()=>ot,Mi:()=>lt,j:()=>ct,YB:()=>dt,Yt:()=>yt,i5:()=>vt,x_:()=>xt,Am:()=>Dn,eR:()=>Xe,r8:()=>at,u3:()=>ln,vd:()=>Ye,iV:()=>et,jZ:()=>Ze,SW:()=>nt,ZH:()=>tt,Ni:()=>Un,lh:()=>Je,qo:()=>c,Q8:()=>Kn,$f:()=>Gn,eu:()=>Mt,Ax:()=>kt,Mc:()=>Et});var t={};r.r(t),r.d(t,{answer:()=>ye,base_message:()=>se,config:()=>ae,dataChannelRequest:()=>Me,disconnectPlayer:()=>be,endpointId:()=>le,endpointIdConfirm:()=>ce,iceCandidate:()=>we,iceCandidateData:()=>Se,identify:()=>oe,layerPreference:()=>ke,listStreamers:()=>he,offer:()=>ve,peerConnectionOptions:()=>ie,peerDataChannels:()=>Re,peerDataChannelsReady:()=>Pe,ping:()=>Te,playerConnected:()=>pe,playerCount:()=>Oe,playerDisconnected:()=>fe,pong:()=>Ce,startStreaming:()=>Fe,stats:()=>xe,stopStreaming:()=>Ie,streamerDataChannels:()=>Le,streamerDisconnected:()=>Ee,streamerIdChanged:()=>de,streamerList:()=>ue,subscribe:()=>ge,unsubscribe:()=>me});var n={};r.r(n),r.d(n,{createMessage:()=>Ae,validateMessage:()=>Ue});class i{static GetStackTrace(){const e=new Error;let t="No Stack Available for this browser";return e.stack&&(t=e.stack.toString().replace(/Error/g,"")),t}static SetLoggerVerbosity(e){null!=this.verboseLogLevel&&(this.verboseLogLevel=e)}static Log(e,t,n){void 0!==n&&n>this.verboseLogLevel||this.CommonLog("Log",null,t)}static Info(e,t,n){void 0!==n&&n>this.verboseLogLevel||this.CommonLog("Info",null,t)}static Error(e,t){this.CommonLog("Error",e,t)}static Warning(e,t){this.CommonLog("Warning",null,t)}static CommonLog(e,t,n){t?console.log(`[${e}] - ${n}\nCaller: ${t}`):console.log(`[${e}] - ${n}`)}}i.verboseLogLevel=5;var a,o,l=r(187);class c extends l.EventEmitter{constructor(){super(),this.WS_OPEN_STATE=1}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){i.Log(i.GetStackTrace(),e,6);try{return this.webSocket=new WebSocket(e),this.webSocket.onopen=e=>this.handleOnOpen(),this.webSocket.onerror=e=>this.handleOnError(),this.webSocket.onclose=e=>this.handleOnClose(e),this.webSocket.onmessage=e=>this.handleOnMessage(e),this.webSocket.onmessagebinary=e=>this.handleOnMessageBinary(e),!0}catch(e){return i.Error(i.GetStackTrace(),e),!1}}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=WebSocket.CLOSED}handleOnMessageBinary(e){e&&e.data&&e.data.text().then((e=>{const t=new MessageEvent("messageFromBinary",{data:e});this.handleOnMessage(t)})).catch((e=>{i.Error(i.GetStackTrace(),`Failed to parse binary blob from websocket, reason: ${e.message}`)}))}handleOnMessage(e){if(e.data&&e.data instanceof Blob)return void this.handleOnMessageBinary(e);let t;i.Log(i.GetStackTrace(),"received => \n"+JSON.stringify(JSON.parse(e.data),void 0,4),6);try{t=JSON.parse(e.data)}catch(t){return void(t instanceof Error?i.Error(i.GetStackTrace(),`Error parsing message string ${e.data}.\n${t.message}`):i.Error(i.GetStackTrace(),"Unknown error while parsing message data in handleOnMessage"))}this.onMessage&&this.onMessage(t)}handleOnOpen(){i.Log(i.GetStackTrace(),"Connected to the signalling server via WebSocket",6),this.emit("open")}handleOnError(){this.emit("error")}handleOnClose(e){i.Log(i.GetStackTrace(),"Disconnected to the signalling server via WebSocket: "+JSON.stringify(e.code)+" - "+e.reason),this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}}function d(e,t,n){let r,s,i=n;for(let n of e.fields){let e=n.localName;if(n.oneof){const a=i[n.oneof];if(null==(null==a?void 0:a.oneofKind))continue;if(r=a[e],s=t[n.oneof],s.oneofKind=a.oneofKind,null==r){delete s[e];continue}}else if(r=i[e],s=t,null==r)continue;switch(n.repeat&&(s[e].length=r.length),n.kind){case"scalar":case"enum":if(n.repeat)for(let t=0;t<r.length;t++)s[e][t]=r[t];else s[e]=r;break;case"message":let t=n.T();if(n.repeat)for(let n=0;n<r.length;n++)s[e][n]=t.create(r[n]);else void 0===s[e]?s[e]=t.create(r):t.mergePartial(s[e],r);break;case"map":switch(n.V.kind){case"scalar":case"enum":Object.assign(s[e],r);break;case"message":let t=n.V.T();for(let n of Object.keys(r))s[e][n]=t.create(r[n])}}}}!function(e){e.symbol=Symbol.for("protobuf-ts/unknown"),e.onRead=(n,r,s,i,a)=>{(t(r)?r[e.symbol]:r[e.symbol]=[]).push({no:s,wireType:i,data:a})},e.onWrite=(t,n,r)=>{for(let{no:t,wireType:s,data:i}of e.list(n))r.tag(t,s).raw(i)},e.list=(n,r)=>{if(t(n)){let t=n[e.symbol];return r?t.filter((e=>e.no==r)):t}return[]},e.last=(t,n)=>e.list(t,n).slice(-1)[0];const t=t=>t&&Array.isArray(t[e.symbol])}(a||(a={})),function(e){e[e.Varint=0]="Varint",e[e.Bit64=1]="Bit64",e[e.LengthDelimited=2]="LengthDelimited",e[e.StartGroup=3]="StartGroup",e[e.EndGroup=4]="EndGroup",e[e.Bit32=5]="Bit32"}(o||(o={}));const h=Symbol.for("protobuf-ts/message-type");function u(e){let t=!1;const n=[];for(let r=0;r<e.length;r++){let s=e.charAt(r);"_"==s?t=!0:/\d/.test(s)?(n.push(s),t=!0):t?(n.push(s.toUpperCase()),t=!1):0==r?n.push(s.toLowerCase()):n.push(s)}return n.join("")}var g,m,p;function f(e){var t,n,r,s;return e.localName=null!==(t=e.localName)&&void 0!==t?t:u(e.name),e.jsonName=null!==(n=e.jsonName)&&void 0!==n?n:u(e.name),e.repeat=null!==(r=e.repeat)&&void 0!==r?r:p.NO,e.opt=null!==(s=e.opt)&&void 0!==s?s:!e.repeat&&!e.oneof&&"message"==e.kind,e}function v(e){if("object"!=typeof e||null===e||!e.hasOwnProperty("oneofKind"))return!1;switch(typeof e.oneofKind){case"string":return void 0!==e[e.oneofKind]&&2==Object.keys(e).length;case"undefined":return 1==Object.keys(e).length;default:return!1}}!function(e){e[e.DOUBLE=1]="DOUBLE",e[e.FLOAT=2]="FLOAT",e[e.INT64=3]="INT64",e[e.UINT64=4]="UINT64",e[e.INT32=5]="INT32",e[e.FIXED64=6]="FIXED64",e[e.FIXED32=7]="FIXED32",e[e.BOOL=8]="BOOL",e[e.STRING=9]="STRING",e[e.BYTES=12]="BYTES",e[e.UINT32=13]="UINT32",e[e.SFIXED32=15]="SFIXED32",e[e.SFIXED64=16]="SFIXED64",e[e.SINT32=17]="SINT32",e[e.SINT64=18]="SINT64"}(g||(g={})),function(e){e[e.BIGINT=0]="BIGINT",e[e.STRING=1]="STRING",e[e.NUMBER=2]="NUMBER"}(m||(m={})),function(e){e[e.NO=0]="NO",e[e.PACKED=1]="PACKED",e[e.UNPACKED=2]="UNPACKED"}(p||(p={}));class y{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}prepare(){if(this.data)return;const e=[],t=[],n=[];for(let r of this.fields)if(r.oneof)n.includes(r.oneof)||(n.push(r.oneof),e.push(r.oneof),t.push(r.oneof));else switch(t.push(r.localName),r.kind){case"scalar":case"enum":r.opt&&!r.repeat||e.push(r.localName);break;case"message":r.repeat&&e.push(r.localName);break;case"map":e.push(r.localName)}this.data={req:e,known:t,oneofs:Object.values(n)}}is(e,t,n=!1){if(t<0)return!0;if(null==e||"object"!=typeof e)return!1;this.prepare();let r=Object.keys(e),s=this.data;if(r.length<s.req.length||s.req.some((e=>!r.includes(e))))return!1;if(!n&&r.some((e=>!s.known.includes(e))))return!1;if(t<1)return!0;for(const r of s.oneofs){const s=e[r];if(!v(s))return!1;if(void 0===s.oneofKind)continue;const i=this.fields.find((e=>e.localName===s.oneofKind));if(!i)return!1;if(!this.field(s[s.oneofKind],i,n,t))return!1}for(const r of this.fields)if(void 0===r.oneof&&!this.field(e[r.localName],r,n,t))return!1;return!0}field(e,t,n,r){let s=t.repeat;switch(t.kind){case"scalar":return void 0===e?t.opt:s?this.scalars(e,t.T,r,t.L):this.scalar(e,t.T,t.L);case"enum":return void 0===e?t.opt:s?this.scalars(e,g.INT32,r):this.scalar(e,g.INT32);case"message":return void 0===e||(s?this.messages(e,t.T(),n,r):this.message(e,t.T(),n,r));case"map":if("object"!=typeof e||null===e)return!1;if(r<2)return!0;if(!this.mapKeys(e,t.K,r))return!1;switch(t.V.kind){case"scalar":return this.scalars(Object.values(e),t.V.T,r,t.V.L);case"enum":return this.scalars(Object.values(e),g.INT32,r);case"message":return this.messages(Object.values(e),t.V.T(),n,r)}}return!0}message(e,t,n,r){return n?t.isAssignable(e,r):t.is(e,r)}messages(e,t,n,r){if(!Array.isArray(e))return!1;if(r<2)return!0;if(n){for(let n=0;n<e.length&&n<r;n++)if(!t.isAssignable(e[n],r-1))return!1}else for(let n=0;n<e.length&&n<r;n++)if(!t.is(e[n],r-1))return!1;return!0}scalar(e,t,n){let r=typeof e;switch(t){case g.UINT64:case g.FIXED64:case g.INT64:case g.SFIXED64:case g.SINT64:switch(n){case m.BIGINT:return"bigint"==r;case m.NUMBER:return"number"==r&&!isNaN(e);default:return"string"==r}case g.BOOL:return"boolean"==r;case g.STRING:return"string"==r;case g.BYTES:return e instanceof Uint8Array;case g.DOUBLE:case g.FLOAT:return"number"==r&&!isNaN(e);default:return"number"==r&&Number.isInteger(e)}}scalars(e,t,n,r){if(!Array.isArray(e))return!1;if(n<2)return!0;if(Array.isArray(e))for(let s=0;s<e.length&&s<n;s++)if(!this.scalar(e[s],t,r))return!1;return!0}mapKeys(e,t,n){let r=Object.keys(e);switch(t){case g.INT32:case g.FIXED32:case g.SFIXED32:case g.SINT32:case g.UINT32:return this.scalars(r.slice(0,n).map((e=>parseInt(e))),t,n);case g.BOOL:return this.scalars(r.slice(0,n).map((e=>"true"==e||"false"!=e&&e)),t,n);default:return this.scalars(r,t,n,m.STRING)}}}function S(e){let t=typeof e;if("object"==t){if(Array.isArray(e))return"array";if(null===e)return"null"}return t}let w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),b=[];for(let e=0;e<w.length;e++)b[w[e].charCodeAt(0)]=e;function T(){let e=0,t=0;for(let n=0;n<28;n+=7){let r=this.buf[this.pos++];if(e|=(127&r)<<n,0==(128&r))return this.assertBounds(),[e,t]}let n=this.buf[this.pos++];if(e|=(15&n)<<28,t=(112&n)>>4,0==(128&n))return this.assertBounds(),[e,t];for(let n=3;n<=31;n+=7){let r=this.buf[this.pos++];if(t|=(127&r)<<n,0==(128&r))return this.assertBounds(),[e,t]}throw new Error("invalid varint")}function C(e,t,n){for(let r=0;r<28;r+=7){const s=e>>>r,i=!(s>>>7==0&&0==t),a=255&(i?128|s:s);if(n.push(a),!i)return}const r=e>>>28&15|(7&t)<<4,s=!(t>>3==0);if(n.push(255&(s?128|r:r)),s){for(let e=3;e<31;e+=7){const r=t>>>e,s=!(r>>>7==0),i=255&(s?128|r:r);if(n.push(i),!s)return}n.push(t>>>31&1)}}b["-".charCodeAt(0)]=w.indexOf("+"),b["_".charCodeAt(0)]=w.indexOf("/");const E=4294967296;function k(e){let t="-"==e[0];t&&(e=e.slice(1));const n=1e6;let r=0,s=0;function i(t,i){const a=Number(e.slice(t,i));s*=n,r=r*n+a,r>=E&&(s+=r/E|0,r%=E)}return i(-24,-18),i(-18,-12),i(-12,-6),i(-6),[t,r,s]}function M(e,t){if(t>>>0<=2097151)return""+(E*t+(e>>>0));let n=(e>>>24|t<<8)>>>0&16777215,r=t>>16&65535,s=(16777215&e)+6777216*n+6710656*r,i=n+8147497*r,a=2*r,o=1e7;function l(e,t){let n=e?String(e):"";return t?"0000000".slice(n.length)+n:n}return s>=o&&(i+=Math.floor(s/o),s%=o),i>=o&&(a+=Math.floor(i/o),i%=o),l(a,0)+l(i,a)+l(s,1)}function R(e,t){if(e>=0){for(;e>127;)t.push(127&e|128),e>>>=7;t.push(e)}else{for(let n=0;n<9;n++)t.push(127&e|128),e>>=7;t.push(1)}}function P(){let e=this.buf[this.pos++],t=127&e;if(0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<7,0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<14,0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<21,0==(128&e))return this.assertBounds(),t;e=this.buf[this.pos++],t|=(15&e)<<28;for(let t=5;0!=(128&e)&&t<10;t++)e=this.buf[this.pos++];if(0!=(128&e))throw new Error("invalid varint");return this.assertBounds(),t>>>0}let L;function F(e){if(!e)throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support")}!function(){const e=new DataView(new ArrayBuffer(8)),t=void 0!==globalThis.BigInt&&"function"==typeof e.getBigInt64&&"function"==typeof e.getBigUint64&&"function"==typeof e.setBigInt64&&"function"==typeof e.setBigUint64;L=t?{MIN:BigInt("-9223372036854775808"),MAX:BigInt("9223372036854775807"),UMIN:BigInt("0"),UMAX:BigInt("18446744073709551615"),C:BigInt,V:e}:void 0}();const I=/^-?[0-9]+$/,O=4294967296,x=2147483648;class D{constructor(e,t){this.lo=0|e,this.hi=0|t}isZero(){return 0==this.lo&&0==this.hi}toNumber(){let e=this.hi*O+(this.lo>>>0);if(!Number.isSafeInteger(e))throw new Error("cannot convert to safe number");return e}}class A extends D{static from(e){if(L)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=L.C(e);case"number":if(0===e)return this.ZERO;e=L.C(e);case"bigint":if(!e)return this.ZERO;if(e<L.UMIN)throw new Error("signed value for ulong");if(e>L.UMAX)throw new Error("ulong too large");return L.V.setBigUint64(0,e,!0),new A(L.V.getInt32(0,!0),L.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!I.test(e))throw new Error("string is no integer");let[t,n,r]=k(e);if(t)throw new Error("signed value for ulong");return new A(n,r);case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");if(e<0)throw new Error("signed value for ulong");return new A(e,e/O)}throw new Error("unknown value "+typeof e)}toString(){return L?this.toBigInt().toString():M(this.lo,this.hi)}toBigInt(){return F(L),L.V.setInt32(0,this.lo,!0),L.V.setInt32(4,this.hi,!0),L.V.getBigUint64(0,!0)}}A.ZERO=new A(0,0);class U extends D{static from(e){if(L)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=L.C(e);case"number":if(0===e)return this.ZERO;e=L.C(e);case"bigint":if(!e)return this.ZERO;if(e<L.MIN)throw new Error("signed long too small");if(e>L.MAX)throw new Error("signed long too large");return L.V.setBigInt64(0,e,!0),new U(L.V.getInt32(0,!0),L.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!I.test(e))throw new Error("string is no integer");let[t,n,r]=k(e);if(t){if(r>x||r==x&&0!=n)throw new Error("signed long too small")}else if(r>=x)throw new Error("signed long too large");let s=new U(n,r);return t?s.negate():s;case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");return e>0?new U(e,e/O):new U(-e,-e/O).negate()}throw new Error("unknown value "+typeof e)}isNegative(){return 0!=(this.hi&x)}negate(){let e=~this.hi,t=this.lo;return t?t=1+~t:e+=1,new U(t,e)}toString(){if(L)return this.toBigInt().toString();if(this.isNegative()){let e=this.negate();return"-"+M(e.lo,e.hi)}return M(this.lo,this.hi)}toBigInt(){return F(L),L.V.setInt32(0,this.lo,!0),L.V.setInt32(4,this.hi,!0),L.V.getBigInt64(0,!0)}}function N(e,t){if(!e)throw new Error(t)}function B(e){if("number"!=typeof e)throw new Error("invalid int 32: "+typeof e);if(!Number.isInteger(e)||e>2147483647||e<-2147483648)throw new Error("invalid int 32: "+e)}function V(e){if("number"!=typeof e)throw new Error("invalid uint 32: "+typeof e);if(!Number.isInteger(e)||e>4294967295||e<0)throw new Error("invalid uint 32: "+e)}function G(e){if("number"!=typeof e)throw new Error("invalid float 32: "+typeof e);if(Number.isFinite(e)&&(e>34028234663852886e22||e<-34028234663852886e22))throw new Error("invalid float 32: "+e)}function W(e,t){switch(t){case m.BIGINT:return e.toBigInt();case m.NUMBER:return e.toNumber();default:return e.toString()}}U.ZERO=new U(0,0);class z{constructor(e){this.info=e}prepare(){var e;if(void 0===this.fMap){this.fMap={};const t=null!==(e=this.info.fields)&&void 0!==e?e:[];for(const e of t)this.fMap[e.name]=e,this.fMap[e.jsonName]=e,this.fMap[e.localName]=e}}assert(e,t,n){if(!e){let e=S(n);throw"number"!=e&&"boolean"!=e||(e=n.toString()),new Error(`Cannot parse JSON ${e} for ${this.info.typeName}#${t}`)}}read(e,t,n){this.prepare();const r=[];for(const[i,a]of Object.entries(e)){const e=this.fMap[i];if(!e){if(!n.ignoreUnknownFields)throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${i}`);continue}const o=e.localName;let l;if(e.oneof){if(null===a&&("enum"!==e.kind||"google.protobuf.NullValue"!==e.T()[0]))continue;if(r.includes(e.oneof))throw new Error(`Multiple members of the oneof group "${e.oneof}" of ${this.info.typeName} are present in JSON.`);r.push(e.oneof),l=t[e.oneof]={oneofKind:o}}else l=t;if("map"==e.kind){if(null===a)continue;this.assert(null!==(s=a)&&"object"==typeof s&&!Array.isArray(s),e.name,a);const t=l[o];for(const[r,s]of Object.entries(a)){let i;switch(this.assert(null!==s,e.name+" map value",null),e.V.kind){case"message":i=e.V.T().internalJsonRead(s,n);break;case"enum":if(i=this.enum(e.V.T(),s,e.name,n.ignoreUnknownFields),!1===i)continue;break;case"scalar":i=this.scalar(s,e.V.T,e.V.L,e.name)}this.assert(void 0!==i,e.name+" map value",s);let a=r;e.K==g.BOOL&&(a="true"==a||"false"!=a&&a),a=this.scalar(a,e.K,m.STRING,e.name).toString(),t[a]=i}}else if(e.repeat){if(null===a)continue;this.assert(Array.isArray(a),e.name,a);const t=l[o];for(const r of a){let s;switch(this.assert(null!==r,e.name,null),e.kind){case"message":s=e.T().internalJsonRead(r,n);break;case"enum":if(s=this.enum(e.T(),r,e.name,n.ignoreUnknownFields),!1===s)continue;break;case"scalar":s=this.scalar(r,e.T,e.L,e.name)}this.assert(void 0!==s,e.name,a),t.push(s)}}else switch(e.kind){case"message":if(null===a&&"google.protobuf.Value"!=e.T().typeName){this.assert(void 0===e.oneof,e.name+" (oneof member)",null);continue}l[o]=e.T().internalJsonRead(a,n,l[o]);break;case"enum":let t=this.enum(e.T(),a,e.name,n.ignoreUnknownFields);if(!1===t)continue;l[o]=t;break;case"scalar":l[o]=this.scalar(a,e.T,e.L,e.name)}}var s}enum(e,t,n,r){if("google.protobuf.NullValue"==e[0]&&N(null===t||"NULL_VALUE"===t,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} only accepts null.`),null===t)return 0;switch(typeof t){case"number":return N(Number.isInteger(t),`Unable to parse field ${this.info.typeName}#${n}, enum can only be integral number, got ${t}.`),t;case"string":let s=t;e[2]&&t.substring(0,e[2].length)===e[2]&&(s=t.substring(e[2].length));let i=e[1][s];return(void 0!==i||!r)&&(N("number"==typeof i,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} has no value for "${t}".`),i)}N(!1,`Unable to parse field ${this.info.typeName}#${n}, cannot parse enum value from ${typeof t}".`)}scalar(e,t,n,r){let s;try{switch(t){case g.DOUBLE:case g.FLOAT:if(null===e)return 0;if("NaN"===e)return Number.NaN;if("Infinity"===e)return Number.POSITIVE_INFINITY;if("-Infinity"===e)return Number.NEGATIVE_INFINITY;if(""===e){s="empty string";break}if("string"==typeof e&&e.trim().length!==e.length){s="extra whitespace";break}if("string"!=typeof e&&"number"!=typeof e)break;let r=Number(e);if(Number.isNaN(r)){s="not a number";break}if(!Number.isFinite(r)){s="too large or small";break}return t==g.FLOAT&&G(r),r;case g.INT32:case g.FIXED32:case g.SFIXED32:case g.SINT32:case g.UINT32:if(null===e)return 0;let i;if("number"==typeof e?i=e:""===e?s="empty string":"string"==typeof e&&(e.trim().length!==e.length?s="extra whitespace":i=Number(e)),void 0===i)break;return t==g.UINT32?V(i):B(i),i;case g.INT64:case g.SFIXED64:case g.SINT64:if(null===e)return W(U.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return W(U.from(e),n);case g.FIXED64:case g.UINT64:if(null===e)return W(A.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return W(A.from(e),n);case g.BOOL:if(null===e)return!1;if("boolean"!=typeof e)break;return e;case g.STRING:if(null===e)return"";if("string"!=typeof e){s="extra whitespace";break}try{encodeURIComponent(e)}catch(s){s="invalid UTF8";break}return e;case g.BYTES:if(null===e||""===e)return new Uint8Array(0);if("string"!=typeof e)break;return function(e){let t=3*e.length/4;"="==e[e.length-2]?t-=2:"="==e[e.length-1]&&(t-=1);let n,r=new Uint8Array(t),s=0,i=0,a=0;for(let t=0;t<e.length;t++){if(n=b[e.charCodeAt(t)],void 0===n)switch(e[t]){case"=":i=0;case"\n":case"\r":case"\t":case" ":continue;default:throw Error("invalid base64 string.")}switch(i){case 0:a=n,i=1;break;case 1:r[s++]=a<<2|(48&n)>>4,a=n,i=2;break;case 2:r[s++]=(15&a)<<4|(60&n)>>2,a=n,i=3;break;case 3:r[s++]=(3&a)<<6|n,i=0}}if(1==i)throw Error("invalid base64 string.");return r.subarray(0,s)}(e)}}catch(e){s=e.message}this.assert(!1,r+(s?" - "+s:""),e)}}class _{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}write(e,t){const n={},r=e;for(const e of this.fields){if(!e.oneof){let s=this.field(e,r[e.localName],t);void 0!==s&&(n[t.useProtoFieldName?e.name:e.jsonName]=s);continue}const s=r[e.oneof];if(s.oneofKind!==e.localName)continue;const i="scalar"==e.kind||"enum"==e.kind?Object.assign(Object.assign({},t),{emitDefaultValues:!0}):t;let a=this.field(e,s[e.localName],i);N(void 0!==a),n[t.useProtoFieldName?e.name:e.jsonName]=a}return n}field(e,t,n){let r;if("map"==e.kind){N("object"==typeof t&&null!==t);const s={};switch(e.V.kind){case"scalar":for(const[n,r]of Object.entries(t)){const t=this.scalar(e.V.T,r,e.name,!1,!0);N(void 0!==t),s[n.toString()]=t}break;case"message":const r=e.V.T();for(const[i,a]of Object.entries(t)){const t=this.message(r,a,e.name,n);N(void 0!==t),s[i.toString()]=t}break;case"enum":const i=e.V.T();for(const[r,a]of Object.entries(t)){N(void 0===a||"number"==typeof a);const t=this.enum(i,a,e.name,!1,!0,n.enumAsInteger);N(void 0!==t),s[r.toString()]=t}}(n.emitDefaultValues||Object.keys(s).length>0)&&(r=s)}else if(e.repeat){N(Array.isArray(t));const s=[];switch(e.kind){case"scalar":for(let n=0;n<t.length;n++){const r=this.scalar(e.T,t[n],e.name,e.opt,!0);N(void 0!==r),s.push(r)}break;case"enum":const r=e.T();for(let i=0;i<t.length;i++){N(void 0===t[i]||"number"==typeof t[i]);const a=this.enum(r,t[i],e.name,e.opt,!0,n.enumAsInteger);N(void 0!==a),s.push(a)}break;case"message":const i=e.T();for(let r=0;r<t.length;r++){const a=this.message(i,t[r],e.name,n);N(void 0!==a),s.push(a)}}(n.emitDefaultValues||s.length>0||n.emitDefaultValues)&&(r=s)}else switch(e.kind){case"scalar":r=this.scalar(e.T,t,e.name,e.opt,n.emitDefaultValues);break;case"enum":r=this.enum(e.T(),t,e.name,e.opt,n.emitDefaultValues,n.enumAsInteger);break;case"message":r=this.message(e.T(),t,e.name,n)}return r}enum(e,t,n,r,s,i){if("google.protobuf.NullValue"==e[0])return s||r?null:void 0;if(void 0!==t){if(0!==t||s||r)return N("number"==typeof t),N(Number.isInteger(t)),i||!e[1].hasOwnProperty(t)?t:e[2]?e[2]+e[1][t]:e[1][t]}else N(r)}message(e,t,n,r){return void 0===t?r.emitDefaultValues?null:void 0:e.internalJsonWrite(t,r)}scalar(e,t,n,r,s){if(void 0===t)return void N(r);const i=s||r;switch(e){case g.INT32:case g.SFIXED32:case g.SINT32:return 0===t?i?0:void 0:(B(t),t);case g.FIXED32:case g.UINT32:return 0===t?i?0:void 0:(V(t),t);case g.FLOAT:G(t);case g.DOUBLE:return 0===t?i?0:void 0:(N("number"==typeof t),Number.isNaN(t)?"NaN":t===Number.POSITIVE_INFINITY?"Infinity":t===Number.NEGATIVE_INFINITY?"-Infinity":t);case g.STRING:return""===t?i?"":void 0:(N("string"==typeof t),t);case g.BOOL:return!1===t?!i&&void 0:(N("boolean"==typeof t),t);case g.UINT64:case g.FIXED64:N("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let e=A.from(t);if(e.isZero()&&!i)return;return e.toString();case g.INT64:case g.SFIXED64:case g.SINT64:N("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let n=U.from(t);if(n.isZero()&&!i)return;return n.toString();case g.BYTES:return N(t instanceof Uint8Array),t.byteLength?function(e){let t,n="",r=0,s=0;for(let i=0;i<e.length;i++)switch(t=e[i],r){case 0:n+=w[t>>2],s=(3&t)<<4,r=1;break;case 1:n+=w[s|t>>4],s=(15&t)<<2,r=2;break;case 2:n+=w[s|t>>6],n+=w[63&t],r=0}return r&&(n+=w[s],n+="=",1==r&&(n+="=")),n}(t):i?"":void 0}}}function $(e,t=m.STRING){switch(e){case g.BOOL:return!1;case g.UINT64:case g.FIXED64:return W(A.ZERO,t);case g.INT64:case g.SFIXED64:case g.SINT64:return W(U.ZERO,t);case g.DOUBLE:case g.FLOAT:return 0;case g.BYTES:return new Uint8Array(0);case g.STRING:return"";default:return 0}}class H{constructor(e){this.info=e}prepare(){var e;if(!this.fieldNoToField){const t=null!==(e=this.info.fields)&&void 0!==e?e:[];this.fieldNoToField=new Map(t.map((e=>[e.no,e])))}}read(e,t,n,r){this.prepare();const s=void 0===r?e.len:e.pos+r;for(;e.pos<s;){const[r,s]=e.tag(),i=this.fieldNoToField.get(r);if(!i){let i=n.readUnknownField;if("throw"==i)throw new Error(`Unknown field ${r} (wire type ${s}) for ${this.info.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?a.onRead:i)(this.info.typeName,t,r,s,o);continue}let l=t,c=i.repeat,d=i.localName;switch(i.oneof&&(l=l[i.oneof],l.oneofKind!==d&&(l=t[i.oneof]={oneofKind:d})),i.kind){case"scalar":case"enum":let t="enum"==i.kind?g.INT32:i.T,r="scalar"==i.kind?i.L:void 0;if(c){let n=l[d];if(s==o.LengthDelimited&&t!=g.STRING&&t!=g.BYTES){let s=e.uint32()+e.pos;for(;e.pos<s;)n.push(this.scalar(e,t,r))}else n.push(this.scalar(e,t,r))}else l[d]=this.scalar(e,t,r);break;case"message":if(c){let t=l[d],r=i.T().internalBinaryRead(e,e.uint32(),n);t.push(r)}else l[d]=i.T().internalBinaryRead(e,e.uint32(),n,l[d]);break;case"map":let[a,h]=this.mapEntry(i,e,n);l[d][a]=h}}}mapEntry(e,t,n){let r,s,i=t.uint32(),a=t.pos+i;for(;t.pos<a;){let[i,a]=t.tag();switch(i){case 1:r=e.K==g.BOOL?t.bool().toString():this.scalar(t,e.K,m.STRING);break;case 2:switch(e.V.kind){case"scalar":s=this.scalar(t,e.V.T,e.V.L);break;case"enum":s=t.int32();break;case"message":s=e.V.T().internalBinaryRead(t,t.uint32(),n)}break;default:throw new Error(`Unknown field ${i} (wire type ${a}) in map entry for ${this.info.typeName}#${e.name}`)}}if(void 0===r){let t=$(e.K);r=e.K==g.BOOL?t.toString():t}if(void 0===s)switch(e.V.kind){case"scalar":s=$(e.V.T,e.V.L);break;case"enum":s=0;break;case"message":s=e.V.T().create()}return[r,s]}scalar(e,t,n){switch(t){case g.INT32:return e.int32();case g.STRING:return e.string();case g.BOOL:return e.bool();case g.DOUBLE:return e.double();case g.FLOAT:return e.float();case g.INT64:return W(e.int64(),n);case g.UINT64:return W(e.uint64(),n);case g.FIXED64:return W(e.fixed64(),n);case g.FIXED32:return e.fixed32();case g.BYTES:return e.bytes();case g.UINT32:return e.uint32();case g.SFIXED32:return e.sfixed32();case g.SFIXED64:return W(e.sfixed64(),n);case g.SINT32:return e.sint32();case g.SINT64:return W(e.sint64(),n)}}}class j{constructor(e){this.info=e}prepare(){if(!this.fields){const e=this.info.fields?this.info.fields.concat():[];this.fields=e.sort(((e,t)=>e.no-t.no))}}write(e,t,n){this.prepare();for(const r of this.fields){let s,i,a=r.repeat,o=r.localName;if(r.oneof){const t=e[r.oneof];if(t.oneofKind!==o)continue;s=t[o],i=!0}else s=e[o],i=!1;switch(r.kind){case"scalar":case"enum":let e="enum"==r.kind?g.INT32:r.T;if(a)if(N(Array.isArray(s)),a==p.PACKED)this.packed(t,e,r.no,s);else for(const n of s)this.scalar(t,e,r.no,n,!0);else void 0===s?N(r.opt):this.scalar(t,e,r.no,s,i||r.opt);break;case"message":if(a){N(Array.isArray(s));for(const e of s)this.message(t,n,r.T(),r.no,e)}else this.message(t,n,r.T(),r.no,s);break;case"map":N("object"==typeof s&&null!==s);for(const[e,i]of Object.entries(s))this.mapEntry(t,n,r,e,i)}}let r=n.writeUnknownFields;!1!==r&&(!0===r?a.onWrite:r)(this.info.typeName,e,t)}mapEntry(e,t,n,r,s){e.tag(n.no,o.LengthDelimited),e.fork();let i=r;switch(n.K){case g.INT32:case g.FIXED32:case g.UINT32:case g.SFIXED32:case g.SINT32:i=Number.parseInt(r);break;case g.BOOL:N("true"==r||"false"==r),i="true"==r}switch(this.scalar(e,n.K,1,i,!0),n.V.kind){case"scalar":this.scalar(e,n.V.T,2,s,!0);break;case"enum":this.scalar(e,g.INT32,2,s,!0);break;case"message":this.message(e,t,n.V.T(),2,s)}e.join()}message(e,t,n,r,s){void 0!==s&&(n.internalBinaryWrite(s,e.tag(r,o.LengthDelimited).fork(),t),e.join())}scalar(e,t,n,r,s){let[i,a,o]=this.scalarInfo(t,r);o&&!s||(e.tag(n,i),e[a](r))}packed(e,t,n,r){if(!r.length)return;N(t!==g.BYTES&&t!==g.STRING),e.tag(n,o.LengthDelimited),e.fork();let[,s]=this.scalarInfo(t);for(let t=0;t<r.length;t++)e[s](r[t]);e.join()}scalarInfo(e,t){let n,r=o.Varint,s=void 0===t,i=0===t;switch(e){case g.INT32:n="int32";break;case g.STRING:i=s||!t.length,r=o.LengthDelimited,n="string";break;case g.BOOL:i=!1===t,n="bool";break;case g.UINT32:n="uint32";break;case g.DOUBLE:r=o.Bit64,n="double";break;case g.FLOAT:r=o.Bit32,n="float";break;case g.INT64:i=s||U.from(t).isZero(),n="int64";break;case g.UINT64:i=s||A.from(t).isZero(),n="uint64";break;case g.FIXED64:i=s||A.from(t).isZero(),r=o.Bit64,n="fixed64";break;case g.BYTES:i=s||!t.byteLength,r=o.LengthDelimited,n="bytes";break;case g.FIXED32:r=o.Bit32,n="fixed32";break;case g.SFIXED32:r=o.Bit32,n="sfixed32";break;case g.SFIXED64:i=s||U.from(t).isZero(),r=o.Bit64,n="sfixed64";break;case g.SINT32:n="sint32";break;case g.SINT64:i=s||U.from(t).isZero(),n="sint64"}return[r,n,s||i]}}const K={emitDefaultValues:!1,enumAsInteger:!1,useProtoFieldName:!1,prettySpaces:0},Q={ignoreUnknownFields:!1},q=Object.values;function X(e,t,n){if(t===n)return!0;if(e!==g.BYTES)return!1;let r=t,s=n;if(r.length!==s.length)return!1;for(let e=0;e<r.length;e++)if(r[e]!=s[e])return!1;return!0}function J(e,t,n){if(t.length!==n.length)return!1;for(let r=0;r<t.length;r++)if(!X(e,t[r],n[r]))return!1;return!0}function Y(e,t,n){if(t.length!==n.length)return!1;for(let r=0;r<t.length;r++)if(!e.equals(t[r],n[r]))return!1;return!0}const Z={writeUnknownFields:!0,writerFactory:()=>new ee};class ee{constructor(e){this.stack=[],this.textEncoder=null!=e?e:new TextEncoder,this.chunks=[],this.buf=[]}finish(){this.chunks.push(new Uint8Array(this.buf));let e=0;for(let t=0;t<this.chunks.length;t++)e+=this.chunks[t].length;let t=new Uint8Array(e),n=0;for(let e=0;e<this.chunks.length;e++)t.set(this.chunks[e],n),n+=this.chunks[e].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let e=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(e.byteLength),this.raw(e)}tag(e,t){return this.uint32((e<<3|t)>>>0)}raw(e){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(e),this}uint32(e){for(V(e);e>127;)this.buf.push(127&e|128),e>>>=7;return this.buf.push(e),this}int32(e){return B(e),R(e,this.buf),this}bool(e){return this.buf.push(e?1:0),this}bytes(e){return this.uint32(e.byteLength),this.raw(e)}string(e){let t=this.textEncoder.encode(e);return this.uint32(t.byteLength),this.raw(t)}float(e){G(e);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,e,!0),this.raw(t)}double(e){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,e,!0),this.raw(t)}fixed32(e){V(e);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!0),this.raw(t)}sfixed32(e){B(e);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,e,!0),this.raw(t)}sint32(e){return B(e),R(e=(e<<1^e>>31)>>>0,this.buf),this}sfixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=U.from(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}fixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=A.from(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}int64(e){let t=U.from(e);return C(t.lo,t.hi,this.buf),this}sint64(e){let t=U.from(e),n=t.hi>>31;return C(t.lo<<1^n,(t.hi<<1|t.lo>>>31)^n,this.buf),this}uint64(e){let t=A.from(e);return C(t.lo,t.hi,this.buf),this}}const te={readUnknownField:!0,readerFactory:e=>new ne(e)};class ne{constructor(e,t){this.varint64=T,this.uint32=P,this.buf=e,this.len=e.length,this.pos=0,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.textDecoder=null!=t?t:new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0})}tag(){let e=this.uint32(),t=e>>>3,n=7&e;if(t<=0||n<0||n>5)throw new Error("illegal tag: field no "+t+" wire type "+n);return[t,n]}skip(e){let t=this.pos;switch(e){case o.Varint:for(;128&this.buf[this.pos++];);break;case o.Bit64:this.pos+=4;case o.Bit32:this.pos+=4;break;case o.LengthDelimited:let t=this.uint32();this.pos+=t;break;case o.StartGroup:let n;for(;(n=this.tag()[1])!==o.EndGroup;)this.skip(n);break;default:throw new Error("cant skip wire type "+e)}return this.assertBounds(),this.buf.subarray(t,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return 0|this.uint32()}sint32(){let e=this.uint32();return e>>>1^-(1&e)}int64(){return new U(...this.varint64())}uint64(){return new A(...this.varint64())}sint64(){let[e,t]=this.varint64(),n=-(1&e);return e=(e>>>1|(1&t)<<31)^n,t=t>>>1^n,new U(e,t)}bool(){let[e,t]=this.varint64();return 0!==e||0!==t}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return new A(this.sfixed32(),this.sfixed32())}sfixed64(){return new U(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let e=this.uint32(),t=this.pos;return this.pos+=e,this.assertBounds(),this.buf.subarray(t,t+e)}string(){return this.textDecoder.decode(this.bytes())}}class re{constructor(e,t,n){this.defaultCheckDepth=16,this.typeName=e,this.fields=t.map(f),this.options=null!=n?n:{},this.messagePrototype=Object.defineProperty({},h,{value:this}),this.refTypeCheck=new y(this),this.refJsonReader=new z(this),this.refJsonWriter=new _(this),this.refBinReader=new H(this),this.refBinWriter=new j(this)}create(e){let t=function(e){const t=e.messagePrototype?Object.create(e.messagePrototype):Object.defineProperty({},h,{value:e});for(let n of e.fields){let e=n.localName;if(!n.opt)if(n.oneof)t[n.oneof]={oneofKind:void 0};else if(n.repeat)t[e]=[];else switch(n.kind){case"scalar":t[e]=$(n.T,n.L);break;case"enum":t[e]=0;break;case"map":t[e]={}}}return t}(this);return void 0!==e&&d(this,t,e),t}clone(e){let t=this.create();return d(this,t,e),t}equals(e,t){return function(e,t,n){if(t===n)return!0;if(!t||!n)return!1;for(let r of e.fields){let e=r.localName,s=r.oneof?t[r.oneof][e]:t[e],i=r.oneof?n[r.oneof][e]:n[e];switch(r.kind){case"enum":case"scalar":let e="enum"==r.kind?g.INT32:r.T;if(!(r.repeat?J(e,s,i):X(e,s,i)))return!1;break;case"map":if(!("message"==r.V.kind?Y(r.V.T(),q(s),q(i)):J("enum"==r.V.kind?g.INT32:r.V.T,q(s),q(i))))return!1;break;case"message":let t=r.T();if(!(r.repeat?Y(t,s,i):t.equals(s,i)))return!1}}return!0}(this,e,t)}is(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!1)}isAssignable(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!0)}mergePartial(e,t){d(this,e,t)}fromBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},te),e):te}(t);return this.internalBinaryRead(n.readerFactory(e),e.byteLength,n)}fromJson(e,t){return this.internalJsonRead(e,function(e){return e?Object.assign(Object.assign({},Q),e):Q}(t))}fromJsonString(e,t){let n=JSON.parse(e);return this.fromJson(n,t)}toJson(e,t){return this.internalJsonWrite(e,function(e){return e?Object.assign(Object.assign({},K),e):K}(t))}toJsonString(e,t){var n;let r=this.toJson(e,t);return JSON.stringify(r,null,null!==(n=null==t?void 0:t.prettySpaces)&&void 0!==n?n:0)}toBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},Z),e):Z}(t);return this.internalBinaryWrite(e,n.writerFactory(),n).finish()}internalJsonRead(e,t,n){if(null!==e&&"object"==typeof e&&!Array.isArray(e)){let r=null!=n?n:this.create();return this.refJsonReader.read(e,r,t),r}throw new Error(`Unable to parse message ${this.typeName} from JSON ${S(e)}.`)}internalJsonWrite(e,t){return this.refJsonWriter.write(e,t)}internalBinaryWrite(e,t,n){return this.refBinWriter.write(e,t,n),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create();return this.refBinReader.read(e,s,n,t),s}}const se=new class extends re{constructor(){super("base_message",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ie=new class extends re{constructor(){super("peerConnectionOptions",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){return null!=r?r:this.create()}internalBinaryWrite(e,t,n){let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ae=new class extends re{constructor(){super("config",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"peerConnectionOptions",kind:"message",T:()=>ie},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.peerConnectionOptions=ie.internalBinaryRead(e,e.uint32(),n,s.peerConnectionOptions);break;case 3:s.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),e.peerConnectionOptions&&ie.internalBinaryWrite(e.peerConnectionOptions,t.tag(2,o.LengthDelimited).fork(),n).join(),void 0!==e.protocolVersion&&t.tag(3,o.LengthDelimited).string(e.protocolVersion);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},oe=new class extends re{constructor(){super("identify",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},le=new class extends re{constructor(){super("endpointId",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"id",kind:"scalar",T:9},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.id="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.id=e.string();break;case 3:s.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.id&&t.tag(2,o.LengthDelimited).string(e.id),void 0!==e.protocolVersion&&t.tag(3,o.LengthDelimited).string(e.protocolVersion);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ce=new class extends re{constructor(){super("endpointIdConfirm",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"committedId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.committedId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.committedId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.committedId&&t.tag(2,o.LengthDelimited).string(e.committedId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},de=new class extends re{constructor(){super("streamerIdChanged",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"newID",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.newID="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.newID=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.newID&&t.tag(2,o.LengthDelimited).string(e.newID);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},he=new class extends re{constructor(){super("listStreamers",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ue=new class extends re{constructor(){super("streamerList",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"ids",kind:"scalar",repeat:2,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.ids=[],void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.ids.push(e.string());break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);for(let n=0;n<e.ids.length;n++)t.tag(2,o.LengthDelimited).string(e.ids[n]);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ge=new class extends re{constructor(){super("subscribe",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"streamerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.streamerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.streamerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.streamerId&&t.tag(2,o.LengthDelimited).string(e.streamerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},me=new class extends re{constructor(){super("unsubscribe",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},pe=new class extends re{constructor(){super("playerConnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"dataChannel",kind:"scalar",T:8},{no:3,name:"sfu",kind:"scalar",T:8},{no:4,name:"sendOffer",kind:"scalar",T:8},{no:5,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.dataChannel=!1,t.sfu=!1,t.sendOffer=!1,t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.dataChannel=e.bool();break;case 3:s.sfu=e.bool();break;case 4:s.sendOffer=e.bool();break;case 5:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),!1!==e.dataChannel&&t.tag(2,o.Varint).bool(e.dataChannel),!1!==e.sfu&&t.tag(3,o.Varint).bool(e.sfu),!1!==e.sendOffer&&t.tag(4,o.Varint).bool(e.sendOffer),""!==e.playerId&&t.tag(5,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},fe=new class extends re{constructor(){super("playerDisconnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ve=new class extends re{constructor(){super("offer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9},{no:4,name:"sfu",kind:"scalar",opt:!0,T:8}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sdp=e.string();break;case 3:s.playerId=e.string();break;case 4:s.sfu=e.bool();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,o.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId),void 0!==e.sfu&&t.tag(4,o.Varint).bool(e.sfu);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ye=new class extends re{constructor(){super("answer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sdp=e.string();break;case 3:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,o.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Se=new class extends re{constructor(){super("iceCandidateData",[{no:1,name:"candidate",kind:"scalar",T:9},{no:2,name:"sdpMid",kind:"scalar",T:9},{no:3,name:"sdpMLineIndex",kind:"scalar",T:5},{no:4,name:"usernameFragment",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.candidate="",t.sdpMid="",t.sdpMLineIndex=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.candidate=e.string();break;case 2:s.sdpMid=e.string();break;case 3:s.sdpMLineIndex=e.int32();break;case 4:s.usernameFragment=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.candidate&&t.tag(1,o.LengthDelimited).string(e.candidate),""!==e.sdpMid&&t.tag(2,o.LengthDelimited).string(e.sdpMid),0!==e.sdpMLineIndex&&t.tag(3,o.Varint).int32(e.sdpMLineIndex),void 0!==e.usernameFragment&&t.tag(4,o.LengthDelimited).string(e.usernameFragment);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},we=new class extends re{constructor(){super("iceCandidate",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"candidate",kind:"message",T:()=>Se},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.candidate=Se.internalBinaryRead(e,e.uint32(),n,s.candidate);break;case 3:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),e.candidate&&Se.internalBinaryWrite(e.candidate,t.tag(2,o.LengthDelimited).fork(),n).join(),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},be=new class extends re{constructor(){super("disconnectPlayer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"reason",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;case 3:s.reason=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId),void 0!==e.reason&&t.tag(3,o.LengthDelimited).string(e.reason);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Te=new class extends re{constructor(){super("ping",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,o.Varint).int32(e.time);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ce=new class extends re{constructor(){super("pong",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,o.Varint).int32(e.time);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ee=new class extends re{constructor(){super("streamerDisconnected",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ke=new class extends re{constructor(){super("layerPreference",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"spatialLayer",kind:"scalar",T:5},{no:3,name:"temporalLayer",kind:"scalar",T:5},{no:4,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.spatialLayer=0,t.temporalLayer=0,t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.spatialLayer=e.int32();break;case 3:s.temporalLayer=e.int32();break;case 4:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.spatialLayer&&t.tag(2,o.Varint).int32(e.spatialLayer),0!==e.temporalLayer&&t.tag(3,o.Varint).int32(e.temporalLayer),""!==e.playerId&&t.tag(4,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Me=new class extends re{constructor(){super("dataChannelRequest",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Re=new class extends re{constructor(){super("peerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;case 3:s.sendStreamId=e.int32();break;case 4:s.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId),0!==e.sendStreamId&&t.tag(3,o.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,o.Varint).int32(e.recvStreamId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Pe=new class extends re{constructor(){super("peerDataChannelsReady",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Le=new class extends re{constructor(){super("streamerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sfuId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sfuId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sfuId=e.string();break;case 3:s.sendStreamId=e.int32();break;case 4:s.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sfuId&&t.tag(2,o.LengthDelimited).string(e.sfuId),0!==e.sendStreamId&&t.tag(3,o.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,o.Varint).int32(e.recvStreamId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Fe=new class extends re{constructor(){super("startStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ie=new class extends re{constructor(){super("stopStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Oe=new class extends re{constructor(){super("playerCount",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"count",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.count=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.count=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.count&&t.tag(2,o.Varint).int32(e.count);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},xe=new class extends re{constructor(){super("stats",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"data",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.data="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.data=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.data&&t.tag(2,o.LengthDelimited).string(e.data);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},De={answer:ye,config:ae,disconnectPlayer:be,endpointId:le,endpointIdConfirm:ce,iceCandidate:we,identify:oe,listStreamers:he,offer:ve,ping:Te,playerConnected:pe,playerCount:Oe,playerDisconnected:fe,pong:Ce,stats:xe,streamerDisconnected:Ee,streamerList:ue,subscribe:ge,unsubscribe:me,layerPreference:ke,dataChannelRequest:Me,peerDataChannels:Re,peerDataChannelsReady:Pe,streamerDataChannels:Le,startStreaming:Fe,stopStreaming:Ie};function Ae(e,t){const n=e.create();return n.type=e.typeName,t&&e.mergePartial(n,t),n}function Ue(e){let t=!0;if(!e.type)return i.Error(i.GetStackTrace(),`Parsed message has no type. Rejected. ${JSON.stringify(e)}`),null;const n=De[e.type];if(!n)return i.Error(i.GetStackTrace(),`Message is of an unknown type: "${e.type}". Rejected.`),null;if(n.fields)for(const r of n.fields)r.opt||Object.prototype.hasOwnProperty.call(e,r.name)||(i.Error(i.GetStackTrace(),`Message "${e.type}"" is missing required field "${r.name}". Rejected.`),t=!1);for(const r in e)n.fields.find((e=>e.name===r))||(i.Error(i.GetStackTrace(),`Message "${e.type}" contains unknown field "${r}". Rejected.`),t=!1);return t?n:null}class Ne extends l.EventEmitter{static get SIGNALLING_VERSION(){return"1.1.1"}constructor(e){super(),this.transport=e,e.onMessage=t=>{if(t.type==Te.typeName){const t=Ae(Ce,{time:(new Date).getTime()});e.sendMessage(t)}e.emit("message",t),this.emit(t.type,t)}}connect(e){return this.transport.connect(e)}disconnect(e,t){this.transport.disconnect(e,t)}isConnected(){return this.transport.isConnected()}sendMessage(e){this.transport.sendMessage(e),this.transport.emit("out",e)}}class Be{constructor(e){this.videoElementProvider=e,this.audioElement=document.createElement("Audio"),this.videoElementProvider.setAudioElement(this.audioElement)}handleOnTrack(e){i.Log(i.GetStackTrace(),"handleOnTrack "+JSON.stringify(e.streams),6);const t=this.videoElementProvider.getVideoElement();if(e.track&&i.Log(i.GetStackTrace(),"Got track - "+e.track.kind+" id="+e.track.id+" readyState="+e.track.readyState,6),"audio"!=e.track.kind)return"video"==e.track.kind&&t.srcObject!==e.streams[0]?(t.srcObject=e.streams[0],void i.Log(i.GetStackTrace(),"Set video source from video track ontrack.")):void 0;this.CreateAudioTrack(e.streams[0])}CreateAudioTrack(e){const t=this.videoElementProvider.getVideoElement();t.srcObject!=e&&t.srcObject&&t.srcObject!==e&&(this.audioElement.srcObject=e,i.Log(i.GetStackTrace(),"Created new audio element to play separate audio stream."))}}class Ve{constructor(e){this.freezeFrameHeight=0,this.freezeFrameWidth=0,this.rootDiv=e,this.rootElement=document.createElement("div"),this.rootElement.id="freezeFrame",this.rootElement.style.display="none",this.rootElement.style.pointerEvents="none",this.rootElement.style.position="absolute",this.rootElement.style.zIndex="20",this.imageElement=document.createElement("img"),this.imageElement.style.position="absolute",this.rootElement.appendChild(this.imageElement),this.rootDiv.appendChild(this.rootElement)}setElementForShow(){this.rootElement.style.display="block"}setElementForHide(){this.rootElement.style.display="none"}updateImageElementSource(e){const t=btoa(e.reduce(((e,t)=>e+String.fromCharCode(t)),""));this.imageElement.src="data:image/jpeg;base64,"+t}setDimensionsFromElementAndResize(){this.freezeFrameHeight=this.imageElement.naturalHeight,this.freezeFrameWidth=this.imageElement.naturalWidth,this.resize()}resize(){if(0!==this.freezeFrameWidth&&0!==this.freezeFrameHeight){let e=0,t=0,n=0,r=0;const s=this.rootDiv.clientWidth/this.rootDiv.clientHeight,i=this.freezeFrameWidth/this.freezeFrameHeight;s<i?(e=this.rootDiv.clientWidth,t=Math.floor(this.rootDiv.clientWidth/i),n=Math.floor(.5*(this.rootDiv.clientHeight-t)),r=0):(e=Math.floor(this.rootDiv.clientHeight*i),t=this.rootDiv.clientHeight,n=0,r=Math.floor(.5*(this.rootDiv.clientWidth-e))),this.rootElement.style.width=this.rootDiv.offsetWidth+"px",this.rootElement.style.height=this.rootDiv.offsetHeight+"px",this.rootElement.style.left="0px",this.rootElement.style.top="0px",this.imageElement.style.width=e+"px",this.imageElement.style.height=t+"px",this.imageElement.style.left=r+"px",this.imageElement.style.top=n+"px"}}}class Ge{constructor(e){this.receiving=!1,this.size=0,this.jpeg=void 0,this.valid=!1,this.freezeFrameDelay=50,this.freezeFrame=new Ve(e)}showFreezeFrame(){this.valid&&this.freezeFrame.setElementForShow()}hideFreezeFrame(){this.valid=!1,this.freezeFrame.setElementForHide()}updateFreezeFrameAndShow(e,t){this.freezeFrame.updateImageElementSource(e),this.freezeFrame.imageElement.onload=()=>{this.freezeFrame.setDimensionsFromElementAndResize(),t()}}processFreezeFrameMessage(e,t){this.receiving||(this.receiving=!0,this.valid=!1,this.size=0,this.jpeg=void 0),this.size=new DataView(e.slice(1,5).buffer).getInt32(0,!0);const n=e.slice(5);if(this.jpeg){const e=new Uint8Array(this.jpeg.length+n.length);e.set(this.jpeg,0),e.set(n,this.jpeg.length),this.jpeg=e}else this.jpeg=n,this.receiving=!0,i.Log(i.GetStackTrace(),`received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,6);this.jpeg.length===this.size?(this.receiving=!1,this.valid=!0,i.Log(i.GetStackTrace(),`received complete freeze frame ${this.size}`,6),this.updateFreezeFrameAndShow(this.jpeg,t)):this.jpeg.length>this.size&&(i.Error(i.GetStackTrace(),`received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`),this.jpeg=void 0,this.receiving=!1)}}class We{constructor(e,t,n,r,s=(()=>{})){this.onChange=s,this.onChangeEmit=()=>{},this.id=e,this.description=n,this.label=t,this.value=r}set label(e){this._label=e,this.onChangeEmit(this._value)}get label(){return this._label}get value(){return this._value}set value(e){this._value=e,this.onChange(this._value,this),this.onChangeEmit(this._value)}}class ze extends We{constructor(e,t,n,r,s,i=(()=>{})){super(e,t,n,r,i);const a=new URLSearchParams(window.location.search);if(s&&a.has(this.id)){const e=this.getUrlParamFlag();this.flag=e}else this.flag=r;this.useUrlParams=s}getUrlParamFlag(){const e=new URLSearchParams(window.location.search);return!!e.has(this.id)&&"false"!==e.get(this.id)&&"False"!==e.get(this.id)}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);!0===this.flag?e.set(this.id,"true"):e.set(this.id,"false"),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}enable(){this.flag=!0}get flag(){return!!this.value}set flag(e){this.value=e}}class _e extends We{constructor(e,t,n,r,s,i,a,o=(()=>{})){super(e,t,n,i,o),this._min=r,this._max=s;const l=new URLSearchParams(window.location.search);if(a&&l.has(this.id)){const e=Number.parseFloat(l.get(this.id));this.number=Number.isNaN(e)?i:e}else this.number=i;this.useUrlParams=a}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.number.toString()),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}set number(e){this.value=this.clamp(e)}get number(){return this.value}clamp(e){return Math.max(Math.min(this._max,e),this._min)}get min(){return this._min}get max(){return this._max}addOnChangedListener(e){this.onChange=e}}class $e extends We{constructor(e,t,n,r,s,i=(()=>{})){super(e,t,n,r,i);const a=new URLSearchParams(window.location.search);if(s&&a.has(this.id)){const e=this.getUrlParamText();this.text=e}else this.text=r;this.useUrlParams=s}getUrlParamText(){var e;const t=new URLSearchParams(window.location.search);return t.has(this.id)&&null!==(e=t.get(this.id))&&void 0!==e?e:""}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.text),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}get text(){return this.value}set text(e){this.value=e}}class He extends We{constructor(e,t,n,r,s,i,a=(()=>{})){super(e,t,n,[r],a),this.options=s;const o=new URLSearchParams(window.location.search),l=i&&o.has(this.id)?this.getUrlParamText():r;this.selected=l,this.useUrlParams=i}getUrlParamText(){var e;const t=new URLSearchParams(window.location.search);return t.has(this.id)&&null!==(e=t.get(this.id))&&void 0!==e?e:""}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.selected),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}addOnChangedListener(e){this.onChange=e}get options(){return this._options}set options(e){this._options=e,this.onChangeEmit(this.selected)}get selected(){return this.value}set selected(e){let t=this.options.filter((t=>-1!==t.indexOf(e)));t.length?this.value=t[0]:(t=this.options.filter((t=>-1!==t.indexOf(e.split(" ")[0]))),t.length&&(this.value=t[0]))}}class je extends Event{constructor(e){super("afkWarningActivate"),this.data=e}}class Ke extends Event{constructor(e){super("afkWarningUpdate"),this.data=e}}class Qe extends Event{constructor(){super("afkWarningDeactivate")}}class qe extends Event{constructor(){super("afkTimedOut")}}class Xe extends Event{constructor(e){super("videoEncoderAvgQP"),this.data=e}}class Je extends Event{constructor(){super("webRtcSdp")}}class Ye extends Event{constructor(){super("webRtcAutoConnect")}}class Ze extends Event{constructor(){super("webRtcConnecting")}}class et extends Event{constructor(){super("webRtcConnected")}}class tt extends Event{constructor(){super("webRtcFailed")}}class nt extends Event{constructor(e){super("webRtcDisconnected"),this.data=e}}class rt extends Event{constructor(e){super("dataChannelOpen"),this.data=e}}class st extends Event{constructor(e){super("dataChannelClose"),this.data=e}}class it extends Event{constructor(e){super("dataChannelError"),this.data=e}}class at extends Event{constructor(){super("videoInitialized")}}class ot extends Event{constructor(){super("streamLoading")}}class lt extends Event{constructor(){super("streamConnect")}}class ct extends Event{constructor(){super("streamDisconnect")}}class dt extends Event{constructor(){super("streamReconnect")}}class ht extends Event{constructor(e){super("playStreamError"),this.data=e}}class ut extends Event{constructor(){super("playStream")}}class gt extends Event{constructor(e){super("playStreamRejected"),this.data=e}}class mt extends Event{constructor(e){super("loadFreezeFrame"),this.data=e}}class pt extends Event{constructor(){super("hideFreezeFrame")}}class ft extends Event{constructor(e){super("statsReceived"),this.data=e}}class vt extends Event{constructor(e){super("streamerListMessage"),this.data=e}}class yt extends Event{constructor(e){super("StreamerIDChangedMessage"),this.data=e}}class St extends Event{constructor(e){super("latencyTestResult"),this.data=e}}class wt extends Event{constructor(e){super("dataChannelLatencyTestResponse"),this.data=e}}class bt extends Event{constructor(e){super("dataChannelLatencyTestResult"),this.data=e}}class Tt extends Event{constructor(e){super("initialSettings"),this.data=e}}class Ct extends Event{constructor(e){super("settingsChanged"),this.data=e}}class Et extends Event{constructor(){super("xrSessionStarted")}}class kt extends Event{constructor(){super("xrSessionEnded")}}class Mt extends Event{constructor(e){super("xrFrame"),this.data=e}}class Rt extends Event{constructor(e){super("playerCount"),this.data=e}}class Pt extends EventTarget{dispatchEvent(e){return super.dispatchEvent(e)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}}class Lt{}Lt.AutoConnect="AutoConnect",Lt.AutoPlayVideo="AutoPlayVideo",Lt.AFKDetection="TimeoutIfIdle",Lt.BrowserSendOffer="OfferToReceive",Lt.HoveringMouseMode="HoveringMouse",Lt.ForceMonoAudio="ForceMonoAudio",Lt.ForceTURN="ForceTURN",Lt.FakeMouseWithTouches="FakeMouseWithTouches",Lt.IsQualityController="ControlsQuality",Lt.MatchViewportResolution="MatchViewportRes",Lt.StartVideoMuted="StartVideoMuted",Lt.SuppressBrowserKeys="SuppressBrowserKeys",Lt.UseMic="UseMic",Lt.KeyboardInput="KeyboardInput",Lt.MouseInput="MouseInput",Lt.TouchInput="TouchInput",Lt.GamepadInput="GamepadInput",Lt.XRControllerInput="XRControllerInput",Lt.WaitForStreamer="WaitForStreamer";const Ft=e=>Object.getOwnPropertyNames(Lt).some((t=>Lt[t]===e));class It{}It.AFKTimeoutSecs="AFKTimeout",It.MinQP="MinQP",It.MaxQP="MaxQP",It.WebRTCFPS="WebRTCFPS",It.WebRTCMinBitrate="WebRTCMinBitrate",It.WebRTCMaxBitrate="WebRTCMaxBitrate",It.MaxReconnectAttempts="MaxReconnectAttempts",It.StreamerAutoJoinInterval="StreamerAutoJoinInterval";const Ot=e=>Object.getOwnPropertyNames(It).some((t=>It[t]===e));class xt{}xt.SignallingServerUrl="ss";const Dt=e=>Object.getOwnPropertyNames(xt).some((t=>xt[t]===e));class At{}At.PreferredCodec="PreferredCodec",At.StreamerId="StreamerId";const Ut=e=>Object.getOwnPropertyNames(At).some((t=>At[t]===e));class Nt{constructor(e={}){this.flags=new Map,this.numericParameters=new Map,this.textParameters=new Map,this.optionParameters=new Map;const{initialSettings:t,useUrlParams:n}=e;this._useUrlParams=!!n,this.populateDefaultSettings(this._useUrlParams,t)}get useUrlParams(){return this._useUrlParams}populateDefaultSettings(e,t){this.textParameters.set(xt.SignallingServerUrl,new $e(xt.SignallingServerUrl,"Signalling url","Url of the signalling server",t&&Object.prototype.hasOwnProperty.call(t,xt.SignallingServerUrl)?t[xt.SignallingServerUrl]:("https:"===location.protocol?"wss://":"ws://")+window.location.hostname+("80"===window.location.port||""===window.location.port?"":`:${window.location.port}`),e)),this.optionParameters.set(At.StreamerId,new He(At.StreamerId,"Streamer ID","The ID of the streamer to stream.",t&&Object.prototype.hasOwnProperty.call(t,At.StreamerId)?t[At.StreamerId]:"",[],e)),this.optionParameters.set(At.PreferredCodec,new He(At.PreferredCodec,"Preferred Codec","The preferred codec to be used during codec negotiation","H264 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f",t&&Object.prototype.hasOwnProperty.call(t,At.PreferredCodec)?[t[At.PreferredCodec]]:function(){const e=[];if(!RTCRtpReceiver.getCapabilities)return e.push("Only available on Chrome"),e;const t=/(VP\d|H26\d|AV1).*/;return RTCRtpReceiver.getCapabilities("video").codecs.forEach((n=>{const r=n.mimeType.split("/")[1]+" "+(n.sdpFmtpLine||"");null!==t.exec(r)&&e.push(r)})),e}(),e)),this.flags.set(Lt.AutoConnect,new ze(Lt.AutoConnect,"Auto connect to stream","Whether we should attempt to auto connect to the signalling server or show a click to start prompt.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.AutoConnect))&&t[Lt.AutoConnect],e)),this.flags.set(Lt.AutoPlayVideo,new ze(Lt.AutoPlayVideo,"Auto play video","When video is ready automatically start playing it as opposed to showing a play button.",!t||!Object.prototype.hasOwnProperty.call(t,Lt.AutoPlayVideo)||t[Lt.AutoPlayVideo],e)),this.flags.set(Lt.BrowserSendOffer,new ze(Lt.BrowserSendOffer,"Browser send offer","Browser will initiate the WebRTC handshake by sending the offer to the streamer",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.BrowserSendOffer))&&t[Lt.BrowserSendOffer],e)),this.flags.set(Lt.UseMic,new ze(Lt.UseMic,"Use microphone","Make browser request microphone access and open an input audio track.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.UseMic))&&t[Lt.UseMic],e)),this.flags.set(Lt.StartVideoMuted,new ze(Lt.StartVideoMuted,"Start video muted","Video will start muted if true.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.StartVideoMuted))&&t[Lt.StartVideoMuted],e)),this.flags.set(Lt.SuppressBrowserKeys,new ze(Lt.SuppressBrowserKeys,"Suppress browser keys","Suppress certain browser keys that we use in UE, for example F5 to show shader complexity instead of refresh the page.",!t||!Object.prototype.hasOwnProperty.call(t,Lt.SuppressBrowserKeys)||t[Lt.SuppressBrowserKeys],e)),this.flags.set(Lt.IsQualityController,new ze(Lt.IsQualityController,"Is quality controller?","True if this peer controls stream quality",!t||!Object.prototype.hasOwnProperty.call(t,Lt.IsQualityController)||t[Lt.IsQualityController],e)),this.flags.set(Lt.ForceMonoAudio,new ze(Lt.ForceMonoAudio,"Force mono audio","Force browser to request mono audio in the SDP",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.ForceMonoAudio))&&t[Lt.ForceMonoAudio],e)),this.flags.set(Lt.ForceTURN,new ze(Lt.ForceTURN,"Force TURN","Only generate TURN/Relayed ICE candidates.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.ForceTURN))&&t[Lt.ForceTURN],e)),this.flags.set(Lt.AFKDetection,new ze(Lt.AFKDetection,"AFK if idle","Timeout the experience if user is AFK for a period.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.AFKDetection))&&t[Lt.AFKDetection],e)),this.flags.set(Lt.MatchViewportResolution,new ze(Lt.MatchViewportResolution,"Match viewport resolution","Pixel Streaming will be instructed to dynamically resize the video stream to match the size of the video element.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.MatchViewportResolution))&&t[Lt.MatchViewportResolution],e)),this.flags.set(Lt.HoveringMouseMode,new ze(Lt.HoveringMouseMode,"Control Scheme: Locked Mouse","Either locked mouse, where the pointer is consumed by the video and locked to it, or hovering mouse, where the mouse is not consumed.",!(!t||!Object.prototype.hasOwnProperty.call(t,Lt.HoveringMouseMode))&&t[Lt.HoveringMouseMode],e,((e,t)=>{t.label=`Control Scheme: ${e?"Hovering":"Locked"} Mouse`}))),this.flags.set(Lt.FakeMouseWithTouches,new ze(Lt.FakeMouseWithTouches,"Fake mouse with touches","A single finger touch is converted into a mouse event. This allows a non-touch application to be controlled partially via a touch device.",!t||!Object.prototype.hasOwnProperty.call(t,Lt.FakeMouseWithTouches)||t[Lt.FakeMouseWithTouches],e)),this.flags.set(Lt.KeyboardInput,new ze(Lt.KeyboardInput,"Keyboard input","If enabled, send keyboard events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Lt.KeyboardInput)||t[Lt.KeyboardInput],e)),this.flags.set(Lt.MouseInput,new ze(Lt.MouseInput,"Mouse input","If enabled, send mouse events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Lt.MouseInput)||t[Lt.MouseInput],e)),this.flags.set(Lt.TouchInput,new ze(Lt.TouchInput,"Touch input","If enabled, send touch events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Lt.TouchInput)||t[Lt.TouchInput],e)),this.flags.set(Lt.GamepadInput,new ze(Lt.GamepadInput,"Gamepad input","If enabled, send gamepad events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Lt.GamepadInput)||t[Lt.GamepadInput],e)),this.flags.set(Lt.XRControllerInput,new ze(Lt.XRControllerInput,"XR controller input","If enabled, send XR controller events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,Lt.XRControllerInput)||t[Lt.XRControllerInput],e)),this.flags.set(Lt.WaitForStreamer,new ze(Lt.WaitForStreamer,"Wait for streamer","Will continue trying to connect to the first streamer available.",!t||!Object.prototype.hasOwnProperty.call(t,Lt.WaitForStreamer)||t[Lt.WaitForStreamer],e)),this.numericParameters.set(It.AFKTimeoutSecs,new _e(It.AFKTimeoutSecs,"AFK timeout","The time (in seconds) it takes for the application to time out if AFK timeout is enabled.",0,600,t&&Object.prototype.hasOwnProperty.call(t,It.AFKTimeoutSecs)?t[It.AFKTimeoutSecs]:120,e)),this.numericParameters.set(It.MaxReconnectAttempts,new _e(It.MaxReconnectAttempts,"Max Reconnects","Maximum number of reconnects the application will attempt when a streamer disconnects.",0,999,t&&Object.prototype.hasOwnProperty.call(t,It.MaxReconnectAttempts)?t[It.MaxReconnectAttempts]:3,e)),this.numericParameters.set(It.MinQP,new _e(It.MinQP,"Min QP","The lower bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,It.MinQP)?t[It.MinQP]:0,e)),this.numericParameters.set(It.MaxQP,new _e(It.MaxQP,"Max QP","The upper bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,It.MaxQP)?t[It.MaxQP]:51,e)),this.numericParameters.set(It.WebRTCFPS,new _e(It.WebRTCFPS,"Max FPS","The maximum FPS that WebRTC will try to transmit frames at.",1,999,t&&Object.prototype.hasOwnProperty.call(t,It.WebRTCFPS)?t[It.WebRTCFPS]:60,e)),this.numericParameters.set(It.WebRTCMinBitrate,new _e(It.WebRTCMinBitrate,"Min Bitrate (kbps)","The minimum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,It.WebRTCMinBitrate)?t[It.WebRTCMinBitrate]:0,e)),this.numericParameters.set(It.WebRTCMaxBitrate,new _e(It.WebRTCMaxBitrate,"Max Bitrate (kbps)","The maximum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,It.WebRTCMaxBitrate)?t[It.WebRTCMaxBitrate]:0,e)),this.numericParameters.set(It.StreamerAutoJoinInterval,new _e(It.StreamerAutoJoinInterval,"Streamer Auto Join Interval (ms)","Delay between retries when waiting for an available streamer.",500,9e5,t&&Object.prototype.hasOwnProperty.call(t,It.StreamerAutoJoinInterval)?t[It.StreamerAutoJoinInterval]:3e3,e))}_addOnNumericSettingChangedListener(e,t){this.numericParameters.has(e)&&this.numericParameters.get(e).addOnChangedListener(t)}_addOnOptionSettingChangedListener(e,t){this.optionParameters.has(e)&&this.optionParameters.get(e).addOnChangedListener(t)}getNumericSettingValue(e){if(this.numericParameters.has(e))return this.numericParameters.get(e).number;throw new Error(`There is no numeric setting with the id of ${e}`)}getTextSettingValue(e){if(this.textParameters.has(e))return this.textParameters.get(e).value;throw new Error(`There is no numeric setting with the id of ${e}`)}setNumericSetting(e,t){if(!this.numericParameters.has(e))throw new Error(`There is no numeric setting with the id of ${e}`);this.numericParameters.get(e).number=t}_addOnSettingChangedListener(e,t){this.flags.has(e)&&(this.flags.get(e).onChange=t)}_addOnTextSettingChangedListener(e,t){this.textParameters.has(e)&&(this.textParameters.get(e).onChange=t)}getSettingOption(e){return this.optionParameters.get(e)}isFlagEnabled(e){return this.flags.get(e).flag}setFlagEnabled(e,t){this.flags.has(e)?this.flags.get(e).flag=t:i.Warning(i.GetStackTrace(),`Cannot toggle flag called ${e} - it does not exist in the Config.flags map.`)}setTextSetting(e,t){this.textParameters.has(e)?this.textParameters.get(e).text=t:i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.textParameters map.`)}setOptionSettingOptions(e,t){this.optionParameters.has(e)?this.optionParameters.get(e).options=t:i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.optionParameters map.`)}setOptionSettingValue(e,t){if(this.optionParameters.has(e)){const n=this.optionParameters.get(e),r=n.options;r.includes(t)||(r.push(t),n.options=r),n.selected=t}else i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.enumParameters map.`)}setFlagLabel(e,t){this.flags.has(e)?this.flags.get(e).label=t:i.Warning(i.GetStackTrace(),`Cannot set label for flag called ${e} - it does not exist in the Config.flags map.`)}setSettings(e){for(const t of Object.keys(e))Ft(t)?this.setFlagEnabled(t,e[t]):Ot(t)?this.setNumericSetting(t,e[t]):Dt(t)?this.setTextSetting(t,e[t]):Ut(t)&&this.setOptionSettingValue(t,e[t])}getSettings(){const e={};for(const[t,n]of this.flags.entries())e[t]=n.flag;for(const[t,n]of this.numericParameters.entries())e[t]=n.number;for(const[t,n]of this.textParameters.entries())e[t]=n.text;for(const[t,n]of this.optionParameters.entries())e[t]=n.selected;return e}getFlags(){return Array.from(this.flags.values())}getTextSettings(){return Array.from(this.textParameters.values())}getNumericSettings(){return Array.from(this.numericParameters.values())}getOptionSettings(){return Array.from(this.optionParameters.values())}_registerOnChangeEvents(e){for(const t of this.flags.keys()){const n=this.flags.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"flag",value:t,target:n})))}for(const t of this.numericParameters.keys()){const n=this.numericParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"number",value:t,target:n})))}for(const t of this.textParameters.keys()){const n=this.textParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"text",value:t,target:n})))}for(const t of this.optionParameters.keys()){const n=this.optionParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"option",value:t,target:n})))}}}var Bt;!function(e){e[e.LockedMouse=0]="LockedMouse",e[e.HoveringMouse=1]="HoveringMouse"}(Bt||(Bt={}));class Vt{constructor(e,t,n){this.closeTimeout=10,this.active=!1,this.countdownActive=!1,this.warnTimer=void 0,this.countDown=0,this.countDownTimer=void 0,this.config=e,this.pixelStreaming=t,this.onDismissAfk=n,this.onAFKTimedOutCallback=()=>{console.log("AFK timed out, did you want to override this callback?")}}onAfkClick(){clearInterval(this.countDownTimer),(this.active||this.countdownActive)&&(this.startAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new Qe))}startAfkWarningTimer(){this.config.getNumericSettingValue(It.AFKTimeoutSecs)>0&&this.config.isFlagEnabled(Lt.AFKDetection)?this.active=!0:this.active=!1,this.resetAfkWarningTimer()}stopAfkWarningTimer(){this.active=!1,this.countdownActive=!1,clearTimeout(this.warnTimer),clearInterval(this.countDownTimer)}pauseAfkWarningTimer(){this.active=!1}resetAfkWarningTimer(){this.active&&this.config.isFlagEnabled(Lt.AFKDetection)&&(clearTimeout(this.warnTimer),this.warnTimer=setTimeout((()=>this.activateAfkEvent()),1e3*this.config.getNumericSettingValue(It.AFKTimeoutSecs)))}activateAfkEvent(){this.pauseAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new je({countDown:this.countDown,dismissAfk:this.onDismissAfk})),this.countDown=this.closeTimeout,this.countdownActive=!0,this.pixelStreaming.dispatchEvent(new Ke({countDown:this.countDown})),this.config.isFlagEnabled(Lt.HoveringMouseMode)||document.exitPointerLock&&document.exitPointerLock(),this.countDownTimer=setInterval((()=>{this.countDown--,0==this.countDown?(this.pixelStreaming.dispatchEvent(new qe),this.onAFKTimedOutCallback(),i.Log(i.GetStackTrace(),"You have been disconnected due to inactivity"),this.stopAfkWarningTimer()):this.pixelStreaming.dispatchEvent(new Ke({countDown:this.countDown}))}),1e3)}}class Gt{constructor(){this.isReceivingFreezeFrame=!1}getDataChannelInstance(){return this}createDataChannel(e,t,n){this.peerConnection=e,this.label=t,this.datachannelOptions=n,null==n&&(this.datachannelOptions={},this.datachannelOptions.ordered=!0),this.dataChannel=this.peerConnection.createDataChannel(this.label,this.datachannelOptions),this.setupDataChannel()}setupDataChannel(){this.dataChannel.binaryType="arraybuffer",this.dataChannel.onopen=e=>this.handleOnOpen(e),this.dataChannel.onclose=e=>this.handleOnClose(e),this.dataChannel.onmessage=e=>this.handleOnMessage(e),this.dataChannel.onerror=e=>this.handleOnError(e)}handleOnOpen(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) opened.`,7),this.onOpen(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnClose(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) closed.`,7),this.onClose(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnMessage(e){i.Log(i.GetStackTrace(),`Data Channel (${this.label}) message: ${e}`,8)}handleOnError(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) error: ${e}`,7),this.onError(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}onOpen(e,t){}onClose(e,t){}onError(e,t){}}class Wt{}class zt{}class _t{}class $t{}class Ht{}class jt{}class Kt{}class Qt{}class qt{constructor(){this.inboundVideoStats=new zt,this.inboundAudioStats=new Wt,this.candidatePair=new Ht,this.DataChannelStats=new _t,this.outBoundVideoStats=new jt,this.sessionStats=new Kt,this.streamStats=new Qt,this.codecs=new Map}processStats(e){this.localCandidates=new Array,this.remoteCandidates=new Array,e.forEach((e=>{switch(e.type){case"candidate-pair":this.handleCandidatePair(e);break;case"certificate":case"media-source":case"media-playout":case"outbound-rtp":case"peer-connection":case"remote-inbound-rtp":case"transport":break;case"codec":this.handleCodec(e);break;case"data-channel":this.handleDataChannel(e);break;case"inbound-rtp":this.handleInBoundRTP(e);break;case"local-candidate":this.handleLocalCandidate(e);break;case"remote-candidate":this.handleRemoteCandidate(e);break;case"remote-outbound-rtp":this.handleRemoteOutBound(e);break;case"track":this.handleTrack(e);break;case"stream":this.handleStream(e);break;default:i.Error(i.GetStackTrace(),"unhandled Stat Type"),i.Log(i.GetStackTrace(),e)}}))}handleStream(e){this.streamStats=e}handleCandidatePair(e){this.candidatePair.bytesReceived=e.bytesReceived,this.candidatePair.bytesSent=e.bytesSent,this.candidatePair.localCandidateId=e.localCandidateId,this.candidatePair.remoteCandidateId=e.remoteCandidateId,this.candidatePair.nominated=e.nominated,this.candidatePair.readable=e.readable,this.candidatePair.selected=e.selected,this.candidatePair.writable=e.writable,this.candidatePair.state=e.state,this.candidatePair.currentRoundTripTime=e.currentRoundTripTime}handleDataChannel(e){this.DataChannelStats.bytesReceived=e.bytesReceived,this.DataChannelStats.bytesSent=e.bytesSent,this.DataChannelStats.dataChannelIdentifier=e.dataChannelIdentifier,this.DataChannelStats.id=e.id,this.DataChannelStats.label=e.label,this.DataChannelStats.messagesReceived=e.messagesReceived,this.DataChannelStats.messagesSent=e.messagesSent,this.DataChannelStats.protocol=e.protocol,this.DataChannelStats.state=e.state,this.DataChannelStats.timestamp=e.timestamp}handleLocalCandidate(e){const t=new $t;t.label="local-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.candidateType=e.candidateType,t.id=e.id,this.localCandidates.push(t)}handleRemoteCandidate(e){const t=new $t;t.label="local-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.id=e.id,t.candidateType=e.candidateType,this.remoteCandidates.push(t)}handleInBoundRTP(e){switch(e.kind){case"video":this.inboundVideoStats=e,null!=this.lastVideoStats&&(this.inboundVideoStats.bitrate=8*(this.inboundVideoStats.bytesReceived-this.lastVideoStats.bytesReceived)/(this.inboundVideoStats.timestamp-this.lastVideoStats.timestamp),this.inboundVideoStats.bitrate=Math.floor(this.inboundVideoStats.bitrate)),this.lastVideoStats=Object.assign({},this.inboundVideoStats);break;case"audio":this.inboundAudioStats=e,null!=this.lastAudioStats&&(this.inboundAudioStats.bitrate=8*(this.inboundAudioStats.bytesReceived-this.lastAudioStats.bytesReceived)/(this.inboundAudioStats.timestamp-this.lastAudioStats.timestamp),this.inboundAudioStats.bitrate=Math.floor(this.inboundAudioStats.bitrate)),this.lastAudioStats=Object.assign({},this.inboundAudioStats);break;default:i.Log(i.GetStackTrace(),"Kind is not handled")}}handleRemoteOutBound(e){"video"===e.kind&&(this.outBoundVideoStats.bytesSent=e.bytesSent,this.outBoundVideoStats.id=e.id,this.outBoundVideoStats.localId=e.localId,this.outBoundVideoStats.packetsSent=e.packetsSent,this.outBoundVideoStats.remoteTimestamp=e.remoteTimestamp,this.outBoundVideoStats.timestamp=e.timestamp)}handleTrack(e){"track"!==e.type||"video_label"!==e.trackIdentifier&&"video"!==e.kind||(this.inboundVideoStats.framesDropped=e.framesDropped,this.inboundVideoStats.framesReceived=e.framesReceived,this.inboundVideoStats.frameHeight=e.frameHeight,this.inboundVideoStats.frameWidth=e.frameWidth)}handleCodec(e){const t=e.id,n=`${e.mimeType.replace("video/","").replace("audio/","")}${e.sdpFmtpLine?` ${e.sdpFmtpLine}`:""}`;this.codecs.set(t,n)}handleSessionStatistics(e,t,n){const r=Date.now()-e;this.sessionStats.runTime=new Date(r).toISOString().substr(11,8).toString();const s=null===t?"Not sent yet":t?"true":"false";this.sessionStats.controlsStreamInput=s,this.sessionStats.videoEncoderAvgQP=n}isNumber(e){return"number"==typeof e&&isFinite(e)}}const Xt=(Jt={parseRtpParameters:()=>e.parseRtpParameters,splitSections:()=>e.splitSections},Yt={},r.d(Yt,Jt),Yt);var Jt,Yt;class Zt{static isVideoTransciever(e){return this.canTransceiverReceiveVideo(e)||this.canTransceiverSendVideo(e)}static canTransceiverReceiveVideo(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind}static canTransceiverSendVideo(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"video"===e.sender.track.kind}static isAudioTransciever(e){return this.canTransceiverReceiveAudio(e)||this.canTransceiverSendAudio(e)}static canTransceiverReceiveAudio(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"audio"===e.receiver.track.kind}static canTransceiverSendAudio(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"audio"===e.sender.track.kind}}var en,tn,nn=function(e,t,n,r){return new(n||(n=Promise))((function(s,i){function a(e){try{l(r.next(e))}catch(e){i(e)}}function o(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,o)}l((r=r.apply(e,t||[])).next())}))};class rn{constructor(e,t,n){this.config=t,this.createPeerConnection(e,n)}createPeerConnection(e,t){this.config.isFlagEnabled(Lt.ForceTURN)&&(e.iceTransportPolicy="relay",i.Log(i.GetStackTrace(),"Forcing TURN usage by setting ICE Transport Policy in peer connection config.")),this.peerConnection=new RTCPeerConnection(e),this.peerConnection.onsignalingstatechange=e=>this.handleSignalStateChange(e),this.peerConnection.oniceconnectionstatechange=e=>this.handleIceConnectionStateChange(e),this.peerConnection.onicegatheringstatechange=e=>this.handleIceGatheringStateChange(e),this.peerConnection.ontrack=e=>this.handleOnTrack(e),this.peerConnection.onicecandidate=e=>this.handleIceCandidate(e),this.peerConnection.ondatachannel=e=>this.handleDataChannel(e),this.aggregatedStats=new qt,this.preferredCodec=t,this.updateCodecSelection=!0}createOffer(e,t){return nn(this,void 0,void 0,(function*(){i.Log(i.GetStackTrace(),"Create Offer",6);const n="localhost"===location.hostname||"127.0.0.1"===location.hostname,r="https:"===location.protocol;let s=t.isFlagEnabled(Lt.UseMic);!s||n||r||(s=!1,i.Error(i.GetStackTrace(),"Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access."),i.Error(i.GetStackTrace(),"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(s).finally((()=>{var t;null===(t=this.peerConnection)||void 0===t||t.createOffer(e).then((e=>{var t;this.showTextOverlayConnecting(),e.sdp=this.mungeSDP(e.sdp,s),null===(t=this.peerConnection)||void 0===t||t.setLocalDescription(e),this.onSendWebRTCOffer(e)})).catch((()=>{this.showTextOverlaySetupFailure()}))}))}))}receiveOffer(e,t){var n;return nn(this,void 0,void 0,(function*(){i.Log(i.GetStackTrace(),"Receive Offer",6),null===(n=this.peerConnection)||void 0===n||n.setRemoteDescription(e).then((()=>{const e="localhost"===location.hostname||"127.0.0.1"===location.hostname,n="https:"===location.protocol;let r=t.isFlagEnabled(Lt.UseMic);!r||e||n||(r=!1,i.Error(i.GetStackTrace(),"Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access."),i.Error(i.GetStackTrace(),"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(r).finally((()=>{var e;null===(e=this.peerConnection)||void 0===e||e.createAnswer().then((e=>{var t;return e.sdp=this.mungeSDP(e.sdp,r),null===(t=this.peerConnection)||void 0===t?void 0:t.setLocalDescription(e)})).then((()=>{var e;this.onSendWebRTCAnswer(null===(e=this.peerConnection)||void 0===e?void 0:e.currentLocalDescription)})).catch((()=>{i.Error(i.GetStackTrace(),"createAnswer() failed")}))}))})),this.config.setOptionSettingOptions(At.PreferredCodec,this.parseAvailableCodecs(e).filter((e=>this.config.getSettingOption(At.PreferredCodec).options.includes(e))))}))}receiveAnswer(e){var t;null===(t=this.peerConnection)||void 0===t||t.setRemoteDescription(e),this.config.setOptionSettingOptions(At.PreferredCodec,this.parseAvailableCodecs(e).filter((e=>this.config.getSettingOption(At.PreferredCodec).options.includes(e))))}generateStats(){var e;null===(e=this.peerConnection)||void 0===e||e.getStats(null).then((e=>{this.aggregatedStats.processStats(e),this.onVideoStats(this.aggregatedStats),this.updateCodecSelection&&this.aggregatedStats.inboundVideoStats.codecId&&this.config.setOptionSettingValue(At.PreferredCodec,this.aggregatedStats.codecs.get(this.aggregatedStats.inboundVideoStats.codecId))}))}close(){this.peerConnection&&(this.peerConnection.close(),this.peerConnection=null)}mungeSDP(e,t){let n=e.replace(/(a=fmtp:\d+ .*level-asymmetry-allowed=.*)\r\n/gm,"$1;x-google-start-bitrate=10000;x-google-max-bitrate=100000\r\n"),r="maxaveragebitrate=510000;";return t&&(r+="sprop-maxcapturerate=48000;"),r+=this.config.isFlagEnabled(Lt.ForceMonoAudio)?"stereo=0;":"stereo=1;",r+="useinbandfec=1",n=n.replace("useinbandfec=1",r),n}handleOnIce(e){var t;i.Log(i.GetStackTrace(),"peerconnection handleOnIce",6),this.config.isFlagEnabled(Lt.ForceTURN)&&e.candidate.indexOf("relay")<0?i.Info(i.GetStackTrace(),`Dropping candidate because it was not TURN relay. | Type= ${e.type} | Protocol= ${e.protocol} | Address=${e.address} | Port=${e.port} |`,6):null===(t=this.peerConnection)||void 0===t||t.addIceCandidate(e)}handleSignalStateChange(e){i.Log(i.GetStackTrace(),"signaling state change: "+e,6)}handleIceConnectionStateChange(e){i.Log(i.GetStackTrace(),"ice connection state change: "+e,6),this.onIceConnectionStateChange(e)}handleIceGatheringStateChange(e){i.Log(i.GetStackTrace(),"ice gathering state change: "+JSON.stringify(e),6)}handleOnTrack(e){this.onTrack(e)}handleIceCandidate(e){this.onPeerIceCandidate(e)}handleDataChannel(e){this.onDataChannel(e)}onTrack(e){}onIceConnectionStateChange(e){}onPeerIceCandidate(e){}onDataChannel(e){}setupTransceiversAsync(e){var t,n,r,s,i,a,o,l,c;return nn(this,void 0,void 0,(function*(){const d=(null===(t=this.peerConnection)||void 0===t?void 0:t.getTransceivers().length)>0;if(null===(n=this.peerConnection)||void 0===n||n.addTransceiver("video",{direction:"recvonly"}),RTCRtpReceiver.getCapabilities&&""!=this.preferredCodec)for(const e of null!==(s=null===(r=this.peerConnection)||void 0===r?void 0:r.getTransceivers())&&void 0!==s?s:[])if(e&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind&&e.setCodecPreferences){const t=this.preferredCodec.split(" "),n=[{mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""}];this.config.getSettingOption(At.PreferredCodec).options.filter((e=>e!=this.preferredCodec)).forEach((e=>{const t=e.split(" ");n.push({mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""})}));for(const e of n)""===e.sdpFmtpLine&&delete e.sdpFmtpLine;e.setCodecPreferences(n)}if(e){const e={video:!1,audio:{autoGainControl:!1,channelCount:1,echoCancellation:!1,latency:0,noiseSuppression:!1,sampleRate:48e3,sampleSize:16,volume:1}},t=yield navigator.mediaDevices.getUserMedia(e);if(t)if(d){for(const e of null!==(o=null===(a=this.peerConnection)||void 0===a?void 0:a.getTransceivers())&&void 0!==o?o:[])if(Zt.canTransceiverReceiveAudio(e))for(const n of t.getTracks())n.kind&&"audio"==n.kind&&(e.sender.replaceTrack(n),e.direction="sendrecv")}else for(const e of t.getTracks())e.kind&&"audio"==e.kind&&(null===(l=this.peerConnection)||void 0===l||l.addTransceiver(e,{direction:"sendrecv"}));else null===(c=this.peerConnection)||void 0===c||c.addTransceiver("audio",{direction:"recvonly"})}else null===(i=this.peerConnection)||void 0===i||i.addTransceiver("audio",{direction:"recvonly"})}))}onVideoStats(e){}onSendWebRTCOffer(e){}onSendWebRTCAnswer(e){}showTextOverlayConnecting(){}showTextOverlaySetupFailure(){}parseAvailableCodecs(e){if(!RTCRtpReceiver.getCapabilities)return["Only available on Chrome"];const t=[],n=(0,Xt.splitSections)(e.sdp);return n.shift(),n.forEach((e=>{const{codecs:n}=(0,Xt.parseRtpParameters)(e),r=/(VP\d|H26\d|AV1).*/;n.forEach((e=>{const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");if(null!==r.exec(n)){"VP9"==e.name&&(e.parameters={"profile-id":"0"});const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");t.push(n)}}))})),t}}class sn{constructor(){this.PixelStreamingSettings=new an,this.EncoderSettings=new on,this.WebRTCSettings=new ln}ueCompatible(){null!=this.WebRTCSettings.MaxFPS&&(this.WebRTCSettings.FPS=this.WebRTCSettings.MaxFPS)}}class an{}class on{}class ln{}class cn{constructor(){this.ReceiptTimeMs=null,this.TransmissionTimeMs=null,this.PreCaptureTimeMs=null,this.PostCaptureTimeMs=null,this.PreEncodeTimeMs=null,this.PostEncodeTimeMs=null,this.EncodeMs=null,this.CaptureToSendMs=null,this.testStartTimeMs=0,this.browserReceiptTimeMs=0,this.latencyExcludingDecode=0,this.testDuration=0,this.networkLatency=0,this.browserSendLatency=0,this.frameDisplayDeltaTimeMs=0,this.endToEndLatency=0,this.encodeLatency=0}setFrameDisplayDeltaTime(e){0==this.frameDisplayDeltaTimeMs&&(this.frameDisplayDeltaTimeMs=Math.round(e))}processFields(){null!=this.EncodeMs||null==this.PreEncodeTimeMs&&null==this.PostEncodeTimeMs||(i.Log(i.GetStackTrace(),`Setting Encode Ms \n ${this.PostEncodeTimeMs} \n ${this.PreEncodeTimeMs}`,6),this.EncodeMs=this.PostEncodeTimeMs-this.PreEncodeTimeMs),null!=this.CaptureToSendMs||null==this.PreCaptureTimeMs&&null==this.PostCaptureTimeMs||(i.Log(i.GetStackTrace(),`Setting CaptureToSendMs Ms \n ${this.PostCaptureTimeMs} \n ${this.PreCaptureTimeMs}`,6),this.CaptureToSendMs=this.PostCaptureTimeMs-this.PreCaptureTimeMs)}}class dn{static setExtensionFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),i.Log(i.GetStackTrace(),"Received first chunk of file",6));const n=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),n,6),t.extension=n}static setMimeTypeFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),i.Log(i.GetStackTrace(),"Received first chunk of file",6));const n=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),n,6),t.mimetype=n}static setContentsFromBytes(e,t){if(!t.receiving)return;t.size=Math.ceil(new DataView(e.slice(1,5).buffer).getInt32(0,!0)/16379);const n=e.slice(5);if(t.data.push(n),i.Log(i.GetStackTrace(),`Received file chunk: ${t.data.length}/${t.size}`,6),t.data.length===t.size){t.receiving=!1,t.valid=!0,i.Log(i.GetStackTrace(),"Received complete file",6);const e=(new Date).getTime()-t.timestampStart,n=Math.round(16*t.size*1024/e);i.Log(i.GetStackTrace(),`Average transfer bitrate: ${n}kb/s over ${e/1e3} seconds`,6);const r=new Blob(t.data,{type:t.mimetype}),s=document.createElement("a");s.setAttribute("href",URL.createObjectURL(r)),s.setAttribute("download",`transfer.${t.extension}`),document.body.append(s),s.remove()}else t.data.length>t.size&&(t.receiving=!1,i.Error(i.GetStackTrace(),`Received bigger file than advertised: ${t.data.length}/${t.size}`))}}class hn{constructor(){this.mimetype="",this.extension="",this.receiving=!1,this.size=0,this.data=[],this.valid=!1}}class un{}un.mainButton=0,un.auxiliaryButton=1,un.secondaryButton=2,un.fourthButton=3,un.fifthButton=4;class gn{}gn.primaryButton=1,gn.secondaryButton=2,gn.auxiliaryButton=4,gn.fourthButton=8,gn.fifthButton=16;class mn{constructor(){this.unregisterCallbacks=[]}addUnregisterCallback(e){this.unregisterCallbacks.push(e)}unregisterAll(){for(const e of this.unregisterCallbacks)e();this.unregisterCallbacks=[]}}class pn{constructor(e,t,n){this.touchEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n;const r=e=>this.onTouchStart(e),s=e=>this.onTouchEnd(e),i=e=>this.onTouchMove(e);document.addEventListener("touchstart",r,{passive:!1}),document.addEventListener("touchend",s,{passive:!1}),document.addEventListener("touchmove",i,{passive:!1}),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchstart",r))),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchend",s))),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchmove",i)))}unregisterTouchEvents(){this.touchEventListenerTracker.unregisterAll()}setVideoElementParentClientRect(e){this.videoElementParentClientRect=e}onTouchStart(e){if(this.videoElementProvider.isVideoReady()&&e.target===this.videoElementProvider.getVideoElement()){if(null==this.fakeTouchFinger){const t=e.changedTouches[0];this.fakeTouchFinger=new fn(t.identifier,t.clientX-this.videoElementParentClientRect.left,t.clientY-this.videoElementParentClientRect.top);const n=this.videoElementProvider.getVideoParentElement(),r=new MouseEvent("mouseenter",t);n.dispatchEvent(r);const s=this.coordinateConverter.normalizeAndQuantizeUnsigned(this.fakeTouchFinger.x,this.fakeTouchFinger.y);this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([un.mainButton,s.x,s.y])}e.preventDefault()}}onTouchEnd(e){if(!this.videoElementProvider.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.videoElementProvider.getVideoParentElement(),n=this.toStreamerMessagesProvider.toStreamerHandlers;for(let r=0;r<e.changedTouches.length;r++){const s=e.changedTouches[r];if(s.identifier===this.fakeTouchFinger.id){const e=s.clientX-this.videoElementParentClientRect.left,r=s.clientY-this.videoElementParentClientRect.top,i=this.coordinateConverter.normalizeAndQuantizeUnsigned(e,r);n.get("MouseUp")([un.mainButton,i.x,i.y]);const a=new MouseEvent("mouseleave",s);t.dispatchEvent(a),this.fakeTouchFinger=null;break}}e.preventDefault()}onTouchMove(e){if(!this.videoElementProvider.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.toStreamerMessagesProvider.toStreamerHandlers;for(let n=0;n<e.touches.length;n++){const r=e.touches[n];if(r.identifier===this.fakeTouchFinger.id){const e=r.clientX-this.videoElementParentClientRect.left,n=r.clientY-this.videoElementParentClientRect.top,s=this.coordinateConverter.normalizeAndQuantizeUnsigned(e,n),i=this.coordinateConverter.normalizeAndQuantizeSigned(e-this.fakeTouchFinger.x,n-this.fakeTouchFinger.y);t.get("MouseMove")([s.x,s.y,i.x,i.y]),this.fakeTouchFinger.x=e,this.fakeTouchFinger.y=n;break}}e.preventDefault()}}class fn{constructor(e,t,n){this.id=e,this.x=t,this.y=n}}class vn{}vn.backSpace=8,vn.shift=16,vn.control=17,vn.alt=18,vn.rightShift=253,vn.rightControl=254,vn.rightAlt=255;class yn{constructor(e,t,n){this.keyboardEventListenerTracker=new mn,this.CodeToKeyCode={Escape:27,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,Minus:173,Equal:187,Backspace:8,Tab:9,KeyQ:81,KeyW:87,KeyE:69,KeyR:82,KeyT:84,KeyY:89,KeyU:85,KeyI:73,KeyO:79,KeyP:80,BracketLeft:219,BracketRight:221,Enter:13,ControlLeft:17,KeyA:65,KeyS:83,KeyD:68,KeyF:70,KeyG:71,KeyH:72,KeyJ:74,KeyK:75,KeyL:76,Semicolon:186,Quote:222,Backquote:192,ShiftLeft:16,Backslash:220,KeyZ:90,KeyX:88,KeyC:67,KeyV:86,KeyB:66,KeyN:78,KeyM:77,Comma:188,Period:190,Slash:191,ShiftRight:253,AltLeft:18,Space:32,CapsLock:20,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,Pause:19,ScrollLock:145,NumpadDivide:111,NumpadMultiply:106,NumpadSubtract:109,NumpadAdd:107,NumpadDecimal:110,Numpad9:105,Numpad8:104,Numpad7:103,Numpad6:102,Numpad5:101,Numpad4:100,Numpad3:99,Numpad2:98,Numpad1:97,Numpad0:96,NumLock:144,ControlRight:254,AltRight:255,Home:36,End:35,ArrowUp:38,ArrowLeft:37,ArrowRight:39,ArrowDown:40,PageUp:33,PageDown:34,Insert:45,Delete:46,ContextMenu:93},this.toStreamerMessagesProvider=e,this.config=t,this.activeKeysProvider=n}registerKeyBoardEvents(){const e=e=>this.handleOnCompositionEnd(e),t=e=>this.handleOnKeyDown(e),n=e=>this.handleOnKeyUp(e),r=e=>this.handleOnKeyPress(e);document.addEventListener("compositionend",e),document.addEventListener("keydown",t),document.addEventListener("keyup",n),document.addEventListener("keypress",r),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("compositionend",e))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keydown",t))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keyup",n))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keypress",r)))}unregisterKeyBoardEvents(){this.keyboardEventListenerTracker.unregisterAll()}handleOnKeyDown(e){const t=this.getKeycode(e);t&&229!==t&&(i.Log(i.GetStackTrace(),`key down ${t}, repeat = ${e.repeat}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyDown")([this.getKeycode(e),e.repeat?1:0]),this.activeKeysProvider.getActiveKeys().push(t),t===vn.backSpace&&document.dispatchEvent(new KeyboardEvent("keypress",{charCode:vn.backSpace})),this.config.isFlagEnabled(Lt.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyUp(e){const t=this.getKeycode(e);t&&(i.Log(i.GetStackTrace(),`key up ${t}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyUp")([t]),this.config.isFlagEnabled(Lt.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyPress(e){if(!("charCode"in e))return void i.Warning(i.GetStackTrace(),"KeyboardEvent.charCode is deprecated in this browser, cannot send key press.");const t=e.charCode;i.Log(i.GetStackTrace(),`key press ${t}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyPress")([t])}handleOnCompositionEnd(e){e.data&&e.data.length&&e.data.split("").forEach((e=>{this.handleOnKeyDown(new KeyboardEvent("keydown",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyPress(new KeyboardEvent("keypress",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyUp(new KeyboardEvent("keyup",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)}))}))}getKeycode(e){if(!("keyCode"in e)){const t=e;return t.code in this.CodeToKeyCode?this.CodeToKeyCode[t.code]:(i.Warning(i.GetStackTrace(),`Keyboard code of ${t.code} is not supported in our mapping, ignoring this key.`),null)}return e.keyCode===vn.shift&&"ShiftRight"===e.code?vn.rightShift:e.keyCode===vn.control&&"ControlRight"===e.code?vn.rightControl:e.keyCode===vn.alt&&"AltRight"===e.code?vn.rightAlt:e.keyCode}isKeyCodeBrowserKey(e){return e>=112&&e<=123||9===e}}class Sn{constructor(e,t,n){this.x=0,this.y=0,this.updateMouseMovePositionEvent=e=>{this.updateMouseMovePosition(e)},this.mouseEventListenerTracker=new mn,this.videoElementProvider=e,this.mouseController=t,this.activeKeysProvider=n;const r=this.videoElementProvider.getVideoParentElement();this.x=r.getBoundingClientRect().width/2,this.y=r.getBoundingClientRect().height/2,this.coord=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(this.x,this.y)}unregisterMouseEvents(){this.mouseEventListenerTracker.unregisterAll()}lockStateChange(){const e=this.videoElementProvider.getVideoParentElement(),t=this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;if(document.pointerLockElement===e||document.mozPointerLockElement===e)i.Log(i.GetStackTrace(),"Pointer locked",6),document.addEventListener("mousemove",this.updateMouseMovePositionEvent,!1),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("mousemove",this.updateMouseMovePositionEvent,!1)));else{i.Log(i.GetStackTrace(),"The pointer lock status is now unlocked",6),document.removeEventListener("mousemove",this.updateMouseMovePositionEvent,!1);let e=this.activeKeysProvider.getActiveKeys();const n=new Set(e),r=[];n.forEach((e=>{r[e]})),r.forEach((e=>{t.get("KeyUp")([e])})),e=[]}}updateMouseMovePosition(e){if(!this.videoElementProvider.isVideoReady())return;const t=this.mouseController.toStreamerMessagesProvider.toStreamerHandlers,n=this.videoElementProvider.getVideoParentElement().clientWidth,r=this.videoElementProvider.getVideoParentElement().clientHeight;this.x+=e.movementX,this.y+=e.movementY,this.x>n&&(this.x-=n),this.y>r&&(this.y-=r),this.x<0&&(this.x=n+this.x),this.y<0&&(this.y=r-this.y),this.coord=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(this.x,this.y);const s=this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(e.movementX,e.movementY);t.get("MouseMove")([this.coord.x,this.coord.y,s.x,s.y])}handleMouseDown(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e.button,this.coord.x,this.coord.y])}handleMouseUp(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e.button,this.coord.x,this.coord.y])}handleMouseWheel(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,this.coord.x,this.coord.y])}handleMouseDouble(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDouble")([e.button,this.coord.x,this.coord.y])}handlePressMouseButtons(e){this.videoElementProvider.isVideoReady()&&this.mouseController.pressMouseButtons(e.buttons,this.x,this.y)}handleReleaseMouseButtons(e){this.videoElementProvider.isVideoReady()&&this.mouseController.releaseMouseButtons(e.buttons,this.x,this.y)}}class wn{constructor(e){this.mouseController=e}unregisterMouseEvents(){}updateMouseMovePosition(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"MouseMove",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY),n=this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(e.movementX,e.movementY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseMove")([t.x,t.y,n.x,n.y]),e.preventDefault()}handleMouseDown(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"onMouse Down",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e.button,t.x,t.y]),e.preventDefault()}handleMouseUp(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"onMouse Up",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e.button,t.x,t.y]),e.preventDefault()}handleContextMenu(e){this.mouseController.videoElementProvider.isVideoReady()&&e.preventDefault()}handleMouseWheel(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,t.x,t.y]),e.preventDefault()}handleMouseDouble(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDouble")([e.button,t.x,t.y])}handlePressMouseButtons(e){this.mouseController.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"onMouse press",6),this.mouseController.pressMouseButtons(e.buttons,e.offsetX,e.offsetY))}handleReleaseMouseButtons(e){this.mouseController.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"onMouse release",6),this.mouseController.releaseMouseButtons(e.buttons,e.offsetX,e.offsetY))}}class bn{constructor(e,t,n,r){this.mouseEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.coordinateConverter=n,this.videoElementProvider=t,this.activeKeysProvider=r,this.registerMouseEnterAndLeaveEvents()}unregisterMouseEvents(){this.mouseEventListenerTracker.unregisterAll()}registerLockedMouseEvents(e){const t=this.videoElementProvider.getVideoParentElement(),n=new Sn(this.videoElementProvider,e,this.activeKeysProvider);if(t.requestPointerLock=t.requestPointerLock||t.mozRequestPointerLock,document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock,t.requestPointerLock){const e=()=>{t.requestPointerLock()};t.addEventListener("click",e),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("click",e)))}const r=()=>n.lockStateChange();document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("pointerlockchange",r,!1))),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("mozpointerlockchange",r,!1)));const s=e=>n.handleMouseDown(e),i=e=>n.handleMouseUp(e),a=e=>n.handleMouseWheel(e),o=e=>n.handleMouseDouble(e);t.addEventListener("mousedown",s),t.addEventListener("mouseup",i),t.addEventListener("wheel",a),t.addEventListener("dblclick",o),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousedown",s))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mouseup",i))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("wheel",a))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("dblclick",o))),this.mouseEventListenerTracker.addUnregisterCallback((()=>n.unregisterMouseEvents())),this.mouseEventListenerTracker.addUnregisterCallback((()=>{!document.exitPointerLock||document.pointerLockElement!==t&&document.mozPointerLockElement!==t||document.exitPointerLock()}))}registerHoveringMouseEvents(e){const t=this.videoElementProvider.getVideoParentElement(),n=new wn(e),r=e=>n.updateMouseMovePosition(e),s=e=>n.handleMouseDown(e),i=e=>n.handleMouseUp(e),a=e=>n.handleContextMenu(e),o=e=>n.handleMouseWheel(e),l=e=>n.handleMouseDouble(e);t.addEventListener("mousemove",r),t.addEventListener("mousedown",s),t.addEventListener("mouseup",i),t.addEventListener("contextmenu",a),t.addEventListener("wheel",o),t.addEventListener("dblclick",l),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousemove",r))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousedown",s))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mouseup",i))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("contextmenu",a))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("wheel",o))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("dblclick",l))),this.mouseEventListenerTracker.addUnregisterCallback((()=>n.unregisterMouseEvents()))}registerMouseEnterAndLeaveEvents(){const e=this.videoElementProvider.getVideoParentElement(),t=e=>{this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"Mouse Entered",6),this.sendMouseEnter(),this.pressMouseButtons(e.buttons,e.x,e.y))},n=e=>{this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"Mouse Left",6),this.sendMouseLeave(),this.releaseMouseButtons(e.buttons,e.x,e.y))};e.addEventListener("mouseenter",t),e.addEventListener("mouseleave",n),this.mouseEventListenerTracker.addUnregisterCallback((()=>e.removeEventListener("mouseenter",t))),this.mouseEventListenerTracker.addUnregisterCallback((()=>e.removeEventListener("mouseleave",n)))}releaseMouseButtons(e,t,n){const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);e&gn.primaryButton&&this.sendMouseUp(un.mainButton,r.x,r.y),e&gn.secondaryButton&&this.sendMouseUp(un.secondaryButton,r.x,r.y),e&gn.auxiliaryButton&&this.sendMouseUp(un.auxiliaryButton,r.x,r.y),e&gn.fourthButton&&this.sendMouseUp(un.fourthButton,r.x,r.y),e&gn.fifthButton&&this.sendMouseUp(un.fifthButton,r.x,r.y)}pressMouseButtons(e,t,n){if(!this.videoElementProvider.isVideoReady())return;const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);e&gn.primaryButton&&this.sendMouseDown(un.mainButton,r.x,r.y),e&gn.secondaryButton&&this.sendMouseDown(un.secondaryButton,r.x,r.y),e&gn.auxiliaryButton&&this.sendMouseDown(un.auxiliaryButton,r.x,r.y),e&gn.fourthButton&&this.sendMouseDown(un.fourthButton,r.x,r.y),e&gn.fifthButton&&this.sendMouseDown(un.fifthButton,r.x,r.y)}sendMouseEnter(){this.videoElementProvider.isVideoReady()&&this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseEnter")()}sendMouseLeave(){this.videoElementProvider.isVideoReady()&&this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseLeave")()}sendMouseDown(e,t,n){this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),`mouse button ${e} down at (${t}, ${n})`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e,t,n]))}sendMouseUp(e,t,n){if(!this.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),`mouse button ${e} up at (${t}, ${n})`,6);const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e,r.x,r.y])}}class Tn{constructor(e,t,n){this.fingers=[9,8,7,6,5,4,3,2,1,0],this.fingerIds=new Map,this.maxByteValue=255,this.touchEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n,this.videoElementParent=t.getVideoElement();const r=e=>this.onTouchStart(e),s=e=>this.onTouchEnd(e),a=e=>this.onTouchMove(e);this.videoElementParent.addEventListener("touchstart",r),this.videoElementParent.addEventListener("touchend",s),this.videoElementParent.addEventListener("touchmove",a),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchstart",r))),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchend",s))),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchmove",a))),i.Log(i.GetStackTrace(),"Touch Events Registered",6);const o=e=>{e.preventDefault()};document.addEventListener("touchmove",o),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchmove",o)))}unregisterTouchEvents(){this.touchEventListenerTracker.unregisterAll()}rememberTouch(e){const t=this.fingers.pop();void 0===t&&i.Log(i.GetStackTrace(),"exhausted touch identifiers",6),this.fingerIds.set(e.identifier,t)}forgetTouch(e){this.fingers.push(this.fingerIds.get(e.identifier)),this.fingers.sort((function(e,t){return t-e})),this.fingerIds.delete(e.identifier)}onTouchStart(e){if(this.videoElementProvider.isVideoReady()){for(let t=0;t<e.changedTouches.length;t++)this.rememberTouch(e.changedTouches[t]);i.Log(i.GetStackTrace(),"touch start",6),this.emitTouchData("TouchStart",e.changedTouches),e.preventDefault()}}onTouchEnd(e){if(this.videoElementProvider.isVideoReady()){i.Log(i.GetStackTrace(),"touch end",6),this.emitTouchData("TouchEnd",e.changedTouches);for(let t=0;t<e.changedTouches.length;t++)this.forgetTouch(e.changedTouches[t]);e.preventDefault()}}onTouchMove(e){this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"touch move",6),this.emitTouchData("TouchMove",e.touches),e.preventDefault())}emitTouchData(e,t){if(!this.videoElementProvider.isVideoReady())return;const n=this.videoElementProvider.getVideoParentElement().getBoundingClientRect(),r=this.toStreamerMessagesProvider.toStreamerHandlers;for(let s=0;s<t.length;s++){const a=1,o=t[s],l=o.clientX-n.left,c=o.clientY-n.top;i.Log(i.GetStackTrace(),`F${this.fingerIds.get(o.identifier)}=(${l}, ${c})`,6);const d=this.coordinateConverter.normalizeAndQuantizeUnsigned(l,c);switch(e){case"TouchStart":r.get("TouchStart")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*o.force,d.inRange?1:0]);break;case"TouchEnd":r.get("TouchEnd")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*o.force,d.inRange?1:0]);break;case"TouchMove":r.get("TouchMove")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*o.force,d.inRange?1:0])}}}}class Cn{constructor(e){this.gamePadEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.requestAnimationFrame=(window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.requestAnimationFrame).bind(window);const t=window;if(window.addEventListener("beforeunload",(e=>this.onBeforeUnload(e))),"GamepadEvent"in t){const e=e=>this.gamePadConnectHandler(e),t=e=>this.gamePadDisconnectHandler(e);window.addEventListener("gamepadconnected",e),window.addEventListener("gamepaddisconnected",t),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("gamepadconnected",e))),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("gamepaddisconnected",t)))}else if("WebKitGamepadEvent"in t){const e=e=>this.gamePadConnectHandler(e),t=e=>this.gamePadDisconnectHandler(e);window.addEventListener("webkitgamepadconnected",e),window.addEventListener("webkitgamepaddisconnected",t),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("webkitgamepadconnected",e))),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("webkitgamepaddisconnected",t)))}if(this.controllers=[],navigator.getGamepads)for(const e of navigator.getGamepads())e&&this.gamePadConnectHandler(new GamepadEvent("gamepadconnected",{gamepad:e}))}unregisterGamePadEvents(){this.gamePadEventListenerTracker.unregisterAll();for(const e of this.controllers)void 0!==e.id&&this.onGamepadDisconnected(e.id);this.controllers=[],this.onGamepadConnected=()=>{},this.onGamepadDisconnected=()=>{}}gamePadConnectHandler(e){i.Log(i.GetStackTrace(),"Gamepad connect handler",6);const t=e.gamepad,n={currentState:t,prevState:t,id:void 0};this.controllers.push(n),this.controllers[t.index].currentState=t,this.controllers[t.index].prevState=t,i.Log(i.GetStackTrace(),"gamepad: "+t.id+" connected",6),window.requestAnimationFrame((()=>this.updateStatus())),this.onGamepadConnected()}gamePadDisconnectHandler(e){i.Log(i.GetStackTrace(),"Gamepad disconnect handler",6),i.Log(i.GetStackTrace(),"gamepad: "+e.gamepad.id+" disconnected",6);const t=this.controllers[e.gamepad.index];delete this.controllers[e.gamepad.index],this.controllers=this.controllers.filter((e=>void 0!==e)),this.onGamepadDisconnected(t.id)}scanGamePads(){const e=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():[];for(let t=0;t<e.length;t++)e[t]&&e[t].index in this.controllers&&(this.controllers[e[t].index].currentState=e[t])}updateStatus(){this.scanGamePads();const e=this.toStreamerMessagesProvider.toStreamerHandlers;for(const t of this.controllers){const n=void 0===t.id?this.controllers.indexOf(t):t.id,r=t.currentState;for(let r=0;r<t.currentState.buttons.length;r++){const s=t.currentState.buttons[r],i=t.prevState.buttons[r];s.pressed?r==en.LeftTrigger?e.get("GamepadAnalog")([n,5,s.value]):r==en.RightTrigger?e.get("GamepadAnalog")([n,6,s.value]):e.get("GamepadButtonPressed")([n,r,i.pressed?1:0]):!s.pressed&&i.pressed&&(r==en.LeftTrigger?e.get("GamepadAnalog")([n,5,0]):r==en.RightTrigger?e.get("GamepadAnalog")([n,6,0]):e.get("GamepadButtonReleased")([n,r,0]))}for(let t=0;t<r.axes.length;t+=2){const s=parseFloat(r.axes[t].toFixed(4)),i=-parseFloat(r.axes[t+1].toFixed(4));e.get("GamepadAnalog")([n,t+1,s]),e.get("GamepadAnalog")([n,t+2,i])}this.controllers[n].prevState=r}this.controllers.length>0&&this.requestAnimationFrame((()=>this.updateStatus()))}onGamepadResponseReceived(e){for(const t of this.controllers)if(void 0===t.id){t.id=e;break}}onGamepadConnected(){}onGamepadDisconnected(e){}onBeforeUnload(e){for(const e of this.controllers)this.onGamepadDisconnected(e.id)}}!function(e){e[e.RightClusterBottomButton=0]="RightClusterBottomButton",e[e.RightClusterRightButton=1]="RightClusterRightButton",e[e.RightClusterLeftButton=2]="RightClusterLeftButton",e[e.RightClusterTopButton=3]="RightClusterTopButton",e[e.LeftShoulder=4]="LeftShoulder",e[e.RightShoulder=5]="RightShoulder",e[e.LeftTrigger=6]="LeftTrigger",e[e.RightTrigger=7]="RightTrigger",e[e.SelectOrBack=8]="SelectOrBack",e[e.StartOrForward=9]="StartOrForward",e[e.LeftAnalogPress=10]="LeftAnalogPress",e[e.RightAnalogPress=11]="RightAnalogPress",e[e.LeftClusterTopButton=12]="LeftClusterTopButton",e[e.LeftClusterBottomButton=13]="LeftClusterBottomButton",e[e.LeftClusterLeftButton=14]="LeftClusterLeftButton",e[e.LeftClusterRightButton=15]="LeftClusterRightButton",e[e.CentreButton=16]="CentreButton",e[e.LeftStickHorizontal=0]="LeftStickHorizontal",e[e.LeftStickVertical=1]="LeftStickVertical",e[e.RightStickHorizontal=2]="RightStickHorizontal",e[e.RightStickVertical=3]="RightStickVertical"}(en||(en={}));class En{constructor(e,t,n){this.activeKeys=new kn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n}registerKeyBoard(e){i.Log(i.GetStackTrace(),"Register Keyboard Events",7);const t=new yn(this.toStreamerMessagesProvider,e,this.activeKeys);return t.registerKeyBoardEvents(),t}registerMouse(e){i.Log(i.GetStackTrace(),"Register Mouse Events",7);const t=new bn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter,this.activeKeys);switch(e){case Bt.LockedMouse:t.registerLockedMouseEvents(t);break;case Bt.HoveringMouse:t.registerHoveringMouseEvents(t);break;default:i.Info(i.GetStackTrace(),"unknown Control Scheme Type Defaulting to Locked Mouse Events"),t.registerLockedMouseEvents(t)}return t}registerTouch(e,t){if(i.Log(i.GetStackTrace(),"Registering Touch",6),e){const e=new pn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter);return e.setVideoElementParentClientRect(t),e}return new Tn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter)}registerGamePad(){return i.Log(i.GetStackTrace(),"Register Game Pad",7),new Cn(this.toStreamerMessagesProvider)}}class kn{constructor(){this.activeKeys=[],this.activeKeys=[]}getActiveKeys(){return this.activeKeys}}class Mn{constructor(e,t){this.lastTimeResized=(new Date).getTime(),this.videoElement=document.createElement("video"),this.config=t,this.videoElement.id="streamingVideo",this.videoElement.disablePictureInPicture=!0,this.videoElement.playsInline=!0,this.videoElement.style.width="100%",this.videoElement.style.height="100%",this.videoElement.style.position="absolute",this.videoElement.style.pointerEvents="all",e.appendChild(this.videoElement),this.onResizePlayerCallback=()=>{console.log("Resolution changed, restyling player, did you forget to override this function?")},this.onMatchViewportResolutionCallback=()=>{console.log("Resolution changed and match viewport resolution is turned on, did you forget to override this function?")},this.videoElement.onclick=()=>{null!=this.audioElement&&this.audioElement.paused&&this.audioElement.play(),this.videoElement.paused&&this.videoElement.play()},this.videoElement.onloadedmetadata=()=>{this.onVideoInitialized()},window.addEventListener("resize",(()=>this.resizePlayerStyle()),!0),window.addEventListener("orientationchange",(()=>this.onOrientationChange()))}setAudioElement(e){this.audioElement=e}play(){return this.videoElement.muted=this.config.isFlagEnabled(Lt.StartVideoMuted),this.videoElement.autoplay=this.config.isFlagEnabled(Lt.AutoPlayVideo),this.videoElement.play()}isPaused(){return this.videoElement.paused}isVideoReady(){return void 0!==this.videoElement.readyState&&this.videoElement.readyState>0}hasVideoSource(){return void 0!==this.videoElement.srcObject&&null!==this.videoElement.srcObject}getVideoElement(){return this.videoElement}getVideoParentElement(){return this.videoElement.parentElement}setVideoEnabled(e){this.videoElement.srcObject.getTracks().forEach((t=>t.enabled=e))}onVideoInitialized(){}onOrientationChange(){clearTimeout(this.orientationChangeTimeout),this.orientationChangeTimeout=window.setTimeout((()=>{this.resizePlayerStyle()}),500)}resizePlayerStyle(){const e=this.getVideoParentElement();e&&(this.updateVideoStreamSize(),e.classList.contains("fixed-size")||this.resizePlayerStyleToFillParentElement(),this.onResizePlayerCallback())}resizePlayerStyleToFillParentElement(){this.getVideoParentElement().setAttribute("style","top: 0px; left: 0px; width: 100%; height: 100%; cursor: default;")}updateVideoStreamSize(){if(this.config.isFlagEnabled(Lt.MatchViewportResolution))if((new Date).getTime()-this.lastTimeResized>300){const e=this.getVideoParentElement();if(!e)return;this.onMatchViewportResolutionCallback(e.clientWidth,e.clientHeight),this.lastTimeResized=(new Date).getTime()}else i.Log(i.GetStackTrace(),"Resizing too often - skipping",6),clearTimeout(this.resizeTimeoutHandle),this.resizeTimeoutHandle=window.setTimeout((()=>this.updateVideoStreamSize()),100)}}class Rn{constructor(){this.toStreamerHandlers=new Map,this.fromStreamerHandlers=new Map,this.toStreamerMessages=new Map,this.fromStreamerMessages=new Map}populateDefaultProtocol(){this.toStreamerMessages.set("IFrameRequest",{id:0,structure:[]}),this.toStreamerMessages.set("RequestQualityControl",{id:1,structure:[]}),this.toStreamerMessages.set("FpsRequest",{id:2,structure:[]}),this.toStreamerMessages.set("AverageBitrateRequest",{id:3,structure:[]}),this.toStreamerMessages.set("StartStreaming",{id:4,structure:[]}),this.toStreamerMessages.set("StopStreaming",{id:5,structure:[]}),this.toStreamerMessages.set("LatencyTest",{id:6,structure:["string"]}),this.toStreamerMessages.set("RequestInitialSettings",{id:7,structure:[]}),this.toStreamerMessages.set("TestEcho",{id:8,structure:[]}),this.toStreamerMessages.set("DataChannelLatencyTest",{id:9,structure:[]}),this.toStreamerMessages.set("UIInteraction",{id:50,structure:["string"]}),this.toStreamerMessages.set("Command",{id:51,structure:["string"]}),this.toStreamerMessages.set("KeyDown",{id:60,structure:["uint8","uint8"]}),this.toStreamerMessages.set("KeyUp",{id:61,structure:["uint8"]}),this.toStreamerMessages.set("KeyPress",{id:62,structure:["uint16"]}),this.toStreamerMessages.set("MouseEnter",{id:70,structure:[]}),this.toStreamerMessages.set("MouseLeave",{id:71,structure:[]}),this.toStreamerMessages.set("MouseDown",{id:72,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseUp",{id:73,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseMove",{id:74,structure:["uint16","uint16","int16","int16"]}),this.toStreamerMessages.set("MouseWheel",{id:75,structure:["int16","uint16","uint16"]}),this.toStreamerMessages.set("MouseDouble",{id:76,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("TouchStart",{id:80,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchEnd",{id:81,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchMove",{id:82,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadConnected",{id:93,structure:[]}),this.toStreamerMessages.set("GamepadButtonPressed",{id:90,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadButtonReleased",{id:91,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadAnalog",{id:92,structure:["uint8","uint8","double"]}),this.toStreamerMessages.set("GamepadDisconnected",{id:94,structure:["uint8"]}),this.fromStreamerMessages.set(0,"QualityControlOwnership"),this.fromStreamerMessages.set(1,"Response"),this.fromStreamerMessages.set(2,"Command"),this.fromStreamerMessages.set(3,"FreezeFrame"),this.fromStreamerMessages.set(4,"UnfreezeFrame"),this.fromStreamerMessages.set(5,"VideoEncoderAvgQP"),this.fromStreamerMessages.set(6,"LatencyTest"),this.fromStreamerMessages.set(7,"InitialSettings"),this.fromStreamerMessages.set(8,"FileExtension"),this.fromStreamerMessages.set(9,"FileMimeType"),this.fromStreamerMessages.set(10,"FileContents"),this.fromStreamerMessages.set(11,"TestEcho"),this.fromStreamerMessages.set(12,"InputControlOwnership"),this.fromStreamerMessages.set(13,"GamepadResponse"),this.fromStreamerMessages.set(14,"DataChannelLatencyTest"),this.fromStreamerMessages.set(255,"Protocol")}registerMessageHandler(e,t,n){switch(e){case tn.ToStreamer:this.toStreamerHandlers.set(t,n);break;case tn.FromStreamer:this.fromStreamerHandlers.set(t,n);break;default:i.Log(i.GetStackTrace(),`Unknown message direction ${e}`)}}}!function(e){e[e.ToStreamer=0]="ToStreamer",e[e.FromStreamer=1]="FromStreamer"}(tn||(tn={}));class Pn{constructor(){this.responseEventListeners=new Map}addResponseEventListener(e,t){this.responseEventListeners.set(e,t)}removeResponseEventListener(e){this.responseEventListeners.delete(e)}onResponse(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.Response",6);const t=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),t,6),this.responseEventListeners.forEach((e=>{e(t)}))}}class Ln{constructor(e,t){this.dataChannelSender=e,this.toStreamerMessagesMapProvider=t}sendMessageToStreamer(e,t){void 0===t&&(t=[]);const n=this.toStreamerMessagesMapProvider.toStreamerMessages.get(e);if(void 0===n)return void i.Error(i.GetStackTrace(),`Attempted to send a message to the streamer with message type: ${e}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);if(n.structure&&t&&n.structure.length!==t.length)return void i.Error(i.GetStackTrace(),`Provided message data doesn't match expected layout. Expected [ ${n.structure.map((e=>{switch(e){case"uint8":case"uint16":case"int16":case"float":case"double":return"number";case"string":return"string"}})).toString()} ] but received [ ${t.map((e=>typeof e)).toString()} ]`);let r=0;const s=new TextEncoder;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":r+=1;break;case"uint16":case"int16":r+=2;break;case"float":r+=4;break;case"double":r+=8;break;case"string":r+=2,r+=2*s.encode(e).length}}));const a=new DataView(new ArrayBuffer(r+1));a.setUint8(0,n.id);let o=1;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":a.setUint8(o,e),o+=1;break;case"uint16":a.setUint16(o,e,!0),o+=2;break;case"int16":a.setInt16(o,e,!0),o+=2;break;case"float":a.setFloat32(o,e,!0),o+=4;break;case"double":a.setFloat64(o,e,!0),o+=8;break;case"string":a.setUint16(o,e.length,!0),o+=2;for(let t=0;t<e.length;t++)a.setUint16(o,e.charCodeAt(t),!0),o+=2}})),this.dataChannelSender.canSend()?this.dataChannelSender.sendData(a.buffer):i.Info(i.GetStackTrace(),`Data channel cannot send yet, skipping sending message: ${e} - ${new Uint8Array(a.buffer)}`)}}class Fn{constructor(e){this.sendMessageController=e}SendRequestQualityControl(){this.sendMessageController.sendMessageToStreamer("RequestQualityControl")}SendMaxFpsRequest(){this.sendMessageController.sendMessageToStreamer("FpsRequest")}SendAverageBitrateRequest(){this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest")}SendStartStreaming(){this.sendMessageController.sendMessageToStreamer("StartStreaming")}SendStopStreaming(){this.sendMessageController.sendMessageToStreamer("StopStreaming")}SendRequestInitialSettings(){this.sendMessageController.sendMessageToStreamer("RequestInitialSettings")}}class In{constructor(e){this.dataChannelProvider=e}canSend(){return void 0!==this.dataChannelProvider.getDataChannelInstance().dataChannel&&"open"==this.dataChannelProvider.getDataChannelInstance().dataChannel.readyState}sendData(e){const t=this.dataChannelProvider.getDataChannelInstance();"open"==t.dataChannel.readyState?(t.dataChannel.send(e),i.Log(i.GetStackTrace(),`Message Sent: ${new Uint8Array(e)}`,6),this.resetAfkWarningTimerOnDataSend()):i.Error(i.GetStackTrace(),`Message Failed: ${new Uint8Array(e)}`)}resetAfkWarningTimerOnDataSend(){}}class On{constructor(e){this.videoElementProvider=e,this.normalizeAndQuantizeUnsignedFunc=()=>{throw new Error("Normalize and quantize unsigned, method not implemented.")},this.normalizeAndQuantizeSignedFunc=()=>{throw new Error("Normalize and unquantize signed, method not implemented.")},this.denormalizeAndUnquantizeUnsignedFunc=()=>{throw new Error("Denormalize and unquantize unsigned, method not implemented.")}}normalizeAndQuantizeUnsigned(e,t){return this.normalizeAndQuantizeUnsignedFunc(e,t)}unquantizeAndDenormalizeUnsigned(e,t){return this.denormalizeAndUnquantizeUnsignedFunc(e,t)}normalizeAndQuantizeSigned(e,t){return this.normalizeAndQuantizeSignedFunc(e,t)}setupNormalizeAndQuantize(){if(this.videoElementParent=this.videoElementProvider.getVideoParentElement(),this.videoElement=this.videoElementProvider.getVideoElement(),this.videoElementParent&&this.videoElement){const e=this.videoElementParent.clientHeight/this.videoElementParent.clientWidth,t=this.videoElement.videoHeight/this.videoElement.videoWidth;e>t?(i.Log(i.GetStackTrace(),"Setup Normalize and Quantize for playerAspectRatio > videoAspectRatio",6),this.ratio=e/t,this.normalizeAndQuantizeUnsignedFunc=(e,t)=>this.normalizeAndQuantizeUnsignedPlayerBigger(e,t),this.normalizeAndQuantizeSignedFunc=(e,t)=>this.normalizeAndQuantizeSignedPlayerBigger(e,t),this.denormalizeAndUnquantizeUnsignedFunc=(e,t)=>this.denormalizeAndUnquantizeUnsignedPlayerBigger(e,t)):(i.Log(i.GetStackTrace(),"Setup Normalize and Quantize for playerAspectRatio <= videoAspectRatio",6),this.ratio=t/e,this.normalizeAndQuantizeUnsignedFunc=(e,t)=>this.normalizeAndQuantizeUnsignedPlayerSmaller(e,t),this.normalizeAndQuantizeSignedFunc=(e,t)=>this.normalizeAndQuantizeSignedPlayerSmaller(e,t),this.denormalizeAndUnquantizeUnsignedFunc=(e,t)=>this.denormalizeAndUnquantizeUnsignedPlayerSmaller(e,t))}}normalizeAndQuantizeUnsignedPlayerBigger(e,t){const n=e/this.videoElementParent.clientWidth,r=this.ratio*(t/this.videoElementParent.clientHeight-.5)+.5;return n<0||n>1||r<0||r>1?new xn(!1,65535,65535):new xn(!0,65536*n,65536*r)}denormalizeAndUnquantizeUnsignedPlayerBigger(e,t){const n=e/65536,r=(t/65536-.5)/this.ratio+.5;return new Dn(n*this.videoElementParent.clientWidth,r*this.videoElementParent.clientHeight)}normalizeAndQuantizeSignedPlayerBigger(e,t){const n=e/(.5*this.videoElementParent.clientWidth),r=this.ratio*t/(.5*this.videoElementParent.clientHeight);return new An(32767*n,32767*r)}normalizeAndQuantizeUnsignedPlayerSmaller(e,t){const n=this.ratio*(e/this.videoElementParent.clientWidth-.5)+.5,r=t/this.videoElementParent.clientHeight;return n<0||n>1||r<0||r>1?new xn(!1,65535,65535):new xn(!0,65536*n,65536*r)}denormalizeAndUnquantizeUnsignedPlayerSmaller(e,t){const n=(e/65536-.5)/this.ratio+.5,r=t/65536;return new Dn(n*this.videoElementParent.clientWidth,r*this.videoElementParent.clientHeight)}normalizeAndQuantizeSignedPlayerSmaller(e,t){const n=this.ratio*e/(.5*this.videoElementParent.clientWidth),r=t/(.5*this.videoElementParent.clientHeight);return new An(32767*n,32767*r)}}class xn{constructor(e,t,n){this.inRange=e,this.x=t,this.y=n}}class Dn{constructor(e,t){this.x=e,this.y=t}}class An{constructor(e,t){this.x=e,this.y=t}}class Un{constructor(e,t){this.shouldShowPlayOverlay=!0,this.autoJoinTimer=void 0,this.config=e,this.pixelStreaming=t,this.responseController=new Pn,this.file=new hn,this.sdpConstraints={offerToReceiveAudio:!0,offerToReceiveVideo:!0},this.afkController=new Vt(this.config,this.pixelStreaming,this.onAfkTriggered.bind(this)),this.afkController.onAFKTimedOutCallback=()=>{this.closeSignalingServer("You have been disconnected due to inactivity")},this.freezeFrameController=new Ge(this.pixelStreaming.videoElementParent),this.videoPlayer=new Mn(this.pixelStreaming.videoElementParent,this.config),this.videoPlayer.onVideoInitialized=()=>this.handleVideoInitialized(),this.videoPlayer.onMatchViewportResolutionCallback=(e,t)=>{const n={"Resolution.Width":e,"Resolution.Height":t};this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(n)])},this.videoPlayer.onResizePlayerCallback=()=>{this.setUpMouseAndFreezeFrame()},this.streamController=new Be(this.videoPlayer),this.coordinateConverter=new On(this.videoPlayer),this.sendrecvDataChannelController=new Gt,this.recvDataChannelController=new Gt,this.registerDataChannelEventEmitters(this.sendrecvDataChannelController),this.registerDataChannelEventEmitters(this.recvDataChannelController),this.dataChannelSender=new In(this.sendrecvDataChannelController),this.dataChannelSender.resetAfkWarningTimerOnDataSend=()=>this.afkController.resetAfkWarningTimer(),this.streamMessageController=new Rn,this.transport=new c,this.protocol=new Ne(this.transport),this.protocol.addListener(ae.typeName,(e=>this.handleOnConfigMessage(e))),this.protocol.addListener(ue.typeName,(e=>this.handleStreamerListMessage(e))),this.protocol.addListener(de.typeName,(e=>this.handleStreamerIDChangedMessage(e))),this.protocol.addListener(Oe.typeName,(e=>{const t=e;this.pixelStreaming._onPlayerCount(t.count)})),this.protocol.addListener(ye.typeName,(e=>this.handleWebRtcAnswer(e))),this.protocol.addListener(ve.typeName,(e=>this.handleWebRtcOffer(e))),this.protocol.addListener(Re.typeName,(e=>this.handleWebRtcSFUPeerDatachannels(e))),this.protocol.addListener(we.typeName,(e=>{const t=e;this.handleIceCandidate(t.candidate)})),this.protocol.transport.addListener("open",(()=>{if(!this.config.isFlagEnabled(Lt.BrowserSendOffer)){const e=Ae(he);this.protocol.sendMessage(e)}})),this.protocol.transport.addListener("error",(()=>{i.Error(i.GetStackTrace(),"Got a transport error.")})),this.protocol.transport.addListener("close",(e=>{const t=this.shouldReconnect&&1001!=e.code&&this.config.getNumericSettingValue(It.MaxReconnectAttempts)>0,n=this.disconnectMessage?this.disconnectMessage:e.reason;this.pixelStreaming._onDisconnect(n,!t&&!this.isReconnecting),this.afkController.stopAfkWarningTimer(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.setVideoEncoderAvgQP(0),this.setTouchInputEnabled(!1),this.setMouseInputEnabled(!1),this.setKeyboardInputEnabled(!1),this.setGamePadInputEnabled(!1),t&&setTimeout((()=>{this.isReconnecting=!0,this.reconnectAttempt++,this.tryReconnect(e.reason)}),2e3)})),this.sendMessageController=new Ln(this.dataChannelSender,this.streamMessageController),this.toStreamerMessagesController=new Fn(this.sendMessageController),this.registerMessageHandlers(),this.streamMessageController.populateDefaultProtocol(),this.inputClassesFactory=new En(this.streamMessageController,this.videoPlayer,this.coordinateConverter),this.isUsingSFU=!1,this.isQualityController=!1,this.preferredCodec="",this.shouldReconnect=!0,this.isReconnecting=!1,this.reconnectAttempt=0,this.config._addOnOptionSettingChangedListener(At.StreamerId,(e=>{if(""===e)return;this.peerConnectionController.peerConnection.close(),this.peerConnectionController.createPeerConnection(this.peerConfig,this.preferredCodec),this.subscribedStream=e;const t=Ae(ge,{streamerId:e});this.protocol.sendMessage(t)})),this.setVideoEncoderAvgQP(-1),this.signallingUrlBuilder=()=>{let e=this.config.getTextSettingValue(xt.SignallingServerUrl);return this.config.isFlagEnabled(Lt.BrowserSendOffer)&&(e+="?"+Lt.BrowserSendOffer+"=true"),e}}requestUnquantizedAndDenormalizeUnsigned(e,t){return this.coordinateConverter.unquantizeAndDenormalizeUnsigned(e,t)}handleOnMessage(e){const t=new Uint8Array(e.data);i.Log(i.GetStackTrace(),"Message incoming:"+t,6);const n=this.streamMessageController.fromStreamerMessages.get(t[0]);this.streamMessageController.fromStreamerHandlers.get(n)(e.data)}registerMessageHandlers(){this.streamMessageController.registerMessageHandler(tn.FromStreamer,"QualityControlOwnership",(e=>this.onQualityControlOwnership(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"Response",(e=>this.responseController.onResponse(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"Command",(e=>{this.onCommand(e)})),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FreezeFrame",(e=>this.onFreezeFrameMessage(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"UnfreezeFrame",(()=>this.invalidateFreezeFrameAndEnableVideo())),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"VideoEncoderAvgQP",(e=>this.handleVideoEncoderAvgQP(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"LatencyTest",(e=>this.handleLatencyTestResult(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"DataChannelLatencyTest",(e=>this.handleDataChannelLatencyTestResponse(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"InitialSettings",(e=>this.handleInitialSettings(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FileExtension",(e=>this.onFileExtension(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FileMimeType",(e=>this.onFileMimeType(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FileContents",(e=>this.onFileContents(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"InputControlOwnership",(e=>this.onInputControlOwnership(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"GamepadResponse",(e=>this.onGamepadResponse(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"Protocol",(e=>this.onProtocolMessage(e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"IFrameRequest",(()=>this.sendMessageController.sendMessageToStreamer("IFrameRequest"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"RequestQualityControl",(()=>this.sendMessageController.sendMessageToStreamer("RequestQualityControl"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"FpsRequest",(()=>this.sendMessageController.sendMessageToStreamer("FpsRequest"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"AverageBitrateRequest",(()=>this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"StartStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StartStreaming"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"StopStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StopStreaming"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"LatencyTest",(e=>this.sendMessageController.sendMessageToStreamer("LatencyTest",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"RequestInitialSettings",(()=>this.sendMessageController.sendMessageToStreamer("RequestInitialSettings"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"UIInteraction",(e=>this.sendMessageController.sendMessageToStreamer("UIInteraction",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"Command",(e=>this.sendMessageController.sendMessageToStreamer("Command",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TextboxEntry",(e=>this.sendMessageController.sendMessageToStreamer("TextboxEntry",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"KeyDown",(e=>this.sendMessageController.sendMessageToStreamer("KeyDown",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"KeyUp",(e=>this.sendMessageController.sendMessageToStreamer("KeyUp",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"KeyPress",(e=>this.sendMessageController.sendMessageToStreamer("KeyPress",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseEnter",(e=>this.sendMessageController.sendMessageToStreamer("MouseEnter",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseLeave",(e=>this.sendMessageController.sendMessageToStreamer("MouseLeave",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseDown",(e=>this.sendMessageController.sendMessageToStreamer("MouseDown",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseUp",(e=>this.sendMessageController.sendMessageToStreamer("MouseUp",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseMove",(e=>this.sendMessageController.sendMessageToStreamer("MouseMove",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseWheel",(e=>this.sendMessageController.sendMessageToStreamer("MouseWheel",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseDouble",(e=>this.sendMessageController.sendMessageToStreamer("MouseDouble",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TouchStart",(e=>this.sendMessageController.sendMessageToStreamer("TouchStart",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TouchEnd",(e=>this.sendMessageController.sendMessageToStreamer("TouchEnd",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TouchMove",(e=>this.sendMessageController.sendMessageToStreamer("TouchMove",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadConnected",(()=>this.sendMessageController.sendMessageToStreamer("GamepadConnected"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonPressed",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonReleased",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadAnalog",(e=>this.sendMessageController.sendMessageToStreamer("GamepadAnalog",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadDisconnected",(e=>this.sendMessageController.sendMessageToStreamer("GamepadDisconnected",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRHMDTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRHMDTransform",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRControllerTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRControllerTransform",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRSystem",(e=>this.sendMessageController.sendMessageToStreamer("XRSystem",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRButtonTouched",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonTouched",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonPressed",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonReleased",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRAnalog",(e=>this.sendMessageController.sendMessageToStreamer("XRAnalog",e)))}onCommand(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.Command",6);const t=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),"Data Channel Command: "+t,6);const n=JSON.parse(t);"onScreenKeyboard"===n.command&&this.pixelStreaming._activateOnScreenKeyboard(n)}onProtocolMessage(e){try{const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);Object.prototype.hasOwnProperty.call(n,"Direction")||i.Error(i.GetStackTrace(),"Malformed protocol received. Ensure the protocol message contains a direction");const r=n.Direction;delete n.Direction,i.Log(i.GetStackTrace(),`Received new ${r==tn.FromStreamer?"FromStreamer":"ToStreamer"} protocol. Updating existing protocol...`),Object.keys(n).forEach((e=>{const t=n[e];switch(r){case tn.ToStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void i.Error(i.GetStackTrace(),`ToStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);if("UIInteraction"===e||"Command"===e||"LatencyTest"===e)return;this.streamMessageController.toStreamerHandlers.get(e)?this.streamMessageController.toStreamerMessages.set(e,t):i.Error(i.GetStackTrace(),`There was no registered handler for "${e}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${e}", myHandler)`);break;case tn.FromStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void i.Error(i.GetStackTrace(),`FromStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);this.streamMessageController.fromStreamerHandlers.get(e)?this.streamMessageController.fromStreamerMessages.set(t.id,e):i.Error(i.GetStackTrace(),`There was no registered handler for "${t}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${e}", myHandler)`);break;default:i.Error(i.GetStackTrace(),`Unknown direction: ${r}`)}})),this.toStreamerMessagesController.SendRequestInitialSettings(),this.toStreamerMessagesController.SendRequestQualityControl()}catch(e){i.Log(i.GetStackTrace(),e)}}onInputControlOwnership(e){const t=new Uint8Array(e);i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.InputControlOwnership",6);const n=new Boolean(t[1]).valueOf();i.Log(i.GetStackTrace(),`Received input controller message - will your input control the stream: ${n}`),this.pixelStreaming._onInputControlOwnership(n)}onGamepadResponse(e){const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.gamePadController.onGamepadResponseReceived(n.controllerId)}onAfkTriggered(){this.afkController.onAfkClick(),this.videoPlayer.isPaused()&&this.videoPlayer.hasVideoSource()&&this.playStream()}setAfkEnabled(e){e?this.onAfkTriggered():this.afkController.stopAfkWarningTimer()}tryReconnect(e){this.protocol?(this.isReconnecting=!0,this.protocol.isConnected()?(this.closeSignalingServer(`${e} Restarting stream...`),setTimeout((()=>{this.tryReconnect(e)}),3e3)):(this.pixelStreaming._onWebRtcAutoConnect(),this.connectToSignallingServer())):i.Log(i.GetStackTrace(),"This player has no protocol connection.")}loadFreezeFrameOrShowPlayOverlay(){this.pixelStreaming.dispatchEvent(new mt({shouldShowPlayOverlay:this.shouldShowPlayOverlay,isValid:this.freezeFrameController.valid,jpegData:this.freezeFrameController.jpeg})),!0===this.shouldShowPlayOverlay?(i.Log(i.GetStackTrace(),"showing play overlay"),this.resizePlayerStyle()):(i.Log(i.GetStackTrace(),"showing freeze frame"),this.freezeFrameController.showFreezeFrame()),setTimeout((()=>{this.videoPlayer.setVideoEnabled(!1)}),this.freezeFrameController.freezeFrameDelay)}onFreezeFrameMessage(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.FreezeFrame",6);const t=new Uint8Array(e);this.freezeFrameController.processFreezeFrameMessage(t,(()=>this.loadFreezeFrameOrShowPlayOverlay()))}invalidateFreezeFrameAndEnableVideo(){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.FreezeFrame",6),setTimeout((()=>{this.pixelStreaming.dispatchEvent(new pt),this.freezeFrameController.hideFreezeFrame()}),this.freezeFrameController.freezeFrameDelay),this.videoPlayer.getVideoElement()&&this.videoPlayer.setVideoEnabled(!0)}onFileExtension(e){const t=new Uint8Array(e);dn.setExtensionFromBytes(t,this.file)}onFileMimeType(e){const t=new Uint8Array(e);dn.setMimeTypeFromBytes(t,this.file)}onFileContents(e){const t=new Uint8Array(e);dn.setContentsFromBytes(t,this.file)}playStream(){if(!this.videoPlayer.getVideoElement()){const e="Could not play video stream because the video player was not initialized correctly.";return this.pixelStreaming.dispatchEvent(new ht({message:e})),i.Error(i.GetStackTrace(),e),void this.closeSignalingServer("Stream not initialized correctly")}if(this.videoPlayer.hasVideoSource()){if(this.setTouchInputEnabled(this.config.isFlagEnabled(Lt.TouchInput)),this.pixelStreaming.dispatchEvent(new ut),this.streamController.audioElement.srcObject){const e=this.config.isFlagEnabled(Lt.StartVideoMuted);this.streamController.audioElement.muted=e,e?this.playVideo():this.streamController.audioElement.play().then((()=>{this.playVideo()})).catch((e=>{i.Log(i.GetStackTrace(),e),i.Log(i.GetStackTrace(),"Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new gt({reason:e}))}))}else this.playVideo();this.shouldShowPlayOverlay=!1,this.freezeFrameController.showFreezeFrame()}else i.Warning(i.GetStackTrace(),"Cannot play stream, the video element has no srcObject to play.")}playVideo(){this.videoPlayer.play().catch((e=>{this.streamController.audioElement.srcObject&&this.streamController.audioElement.pause(),i.Log(i.GetStackTrace(),e),i.Log(i.GetStackTrace(),"Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new gt({reason:e}))}))}autoPlayVideoOrSetUpPlayOverlay(){this.config.isFlagEnabled(Lt.AutoPlayVideo)&&this.playStream(),this.resizePlayerStyle()}connectToSignallingServer(){this.locallyClosed=!1,this.shouldReconnect=!0,this.disconnectMessage=null;const e=this.signallingUrlBuilder();this.protocol.connect(e)}startSession(e){if(this.peerConfig=e,this.config.isFlagEnabled(Lt.ForceTURN)&&!this.checkTurnServerAvailability(e))return i.Info(i.GetStackTrace(),"No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead"),void this.closeSignalingServer("TURN cannot be forced, closing connection. Please use STUN instead.");this.peerConnectionController=new rn(this.peerConfig,this.config,this.preferredCodec),this.peerConnectionController.onVideoStats=e=>this.handleVideoStats(e),this.peerConnectionController.onSendWebRTCOffer=e=>this.handleSendWebRTCOffer(e),this.peerConnectionController.onSendWebRTCAnswer=e=>this.handleSendWebRTCAnswer(e),this.peerConnectionController.onPeerIceCandidate=e=>this.handleSendIceCandidate(e),this.peerConnectionController.onDataChannel=e=>this.handleDataChannel(e),this.peerConnectionController.showTextOverlayConnecting=()=>this.pixelStreaming._onWebRtcConnecting(),this.peerConnectionController.showTextOverlaySetupFailure=()=>this.pixelStreaming._onWebRtcFailed();let t=!1;this.peerConnectionController.onIceConnectionStateChange=()=>{!t&&["connected","completed"].includes(this.peerConnectionController.peerConnection.iceConnectionState)&&(this.pixelStreaming._onWebRtcConnected(),t=!0)},this.peerConnectionController.onTrack=e=>this.streamController.handleOnTrack(e),this.config.isFlagEnabled(Lt.BrowserSendOffer)&&(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"cirrus",this.datachannelOptions),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e),this.peerConnectionController.createOffer(this.sdpConstraints,this.config))}checkTurnServerAvailability(e){if(!e.iceServers)return i.Info(i.GetStackTrace(),"A turn sever was not found"),!1;for(const t of e.iceServers)for(const e of t.urls)if(e.includes("turn"))return i.Log(i.GetStackTrace(),`A turn sever was found at ${e}`),!0;return i.Info(i.GetStackTrace(),"A turn sever was not found"),!1}handleOnConfigMessage(e){this.resizePlayerStyle(),this.startSession(e.peerConnectionOptions)}handleStreamerListMessage(e){i.Log(i.GetStackTrace(),`Got streamer list ${e.ids}`,6);let t=null;const n=this.config.getSettingOption(At.StreamerId);n.selected.toString().trim()&&(t=n.selected);const r=[...e.ids];r.unshift(""),this.config.setOptionSettingOptions(At.StreamerId,r);let s=null;const a=this.config.isFlagEnabled(Lt.WaitForStreamer),o=this.config.getNumericSettingValue(It.MaxReconnectAttempts),l=this.config.getNumericSettingValue(It.StreamerAutoJoinInterval),c=this.config.useUrlParams,d=new URLSearchParams(window.location.search);c&&d.has(At.StreamerId)?t=d.get(At.StreamerId):this.subscribedStream&&(t=this.subscribedStream),t&&e.ids.includes(t)?s=t:t&&a||1!=e.ids.length||(s=e.ids[0]),s?(this.isReconnecting=!1,this.reconnectAttempt=0,this.config.setOptionSettingValue(At.StreamerId,s)):a&&(this.reconnectAttempt<o?(this.isReconnecting=!0,this.reconnectAttempt++,setTimeout((()=>{this.protocol.sendMessage(Ae(he))}),l)):(this.reconnectAttempt=0,this.isReconnecting=!1,this.shouldReconnect=!1)),this.pixelStreaming.dispatchEvent(new vt({messageStreamerList:e,autoSelectedStreamerId:s,wantedStreamerId:t}))}handleStreamerIDChangedMessage(e){const t=e.newID,n=this.config.getSettingOption(At.StreamerId),r=n.onChange;n.onChange=()=>{};const s=n.options;for(let e=0;e<s.length;++e)if(s[e]==this.subscribedStream){s[e]=t;break}n.options=s,n.selected=t,n.onChange=r,this.subscribedStream=e.newID,this.pixelStreaming.dispatchEvent(new yt({newID:t}))}handleWebRtcAnswer(e){i.Log(i.GetStackTrace(),`Got answer sdp ${e.sdp}`,6);const t={sdp:e.sdp,type:"answer"};this.peerConnectionController.receiveAnswer(t),this.handlePostWebrtcNegotiation()}handleWebRtcOffer(e){i.Log(i.GetStackTrace(),`Got offer sdp ${e.sdp}`,6),this.isUsingSFU=!!e.sfu&&e.sfu,this.isUsingSFU&&(this.peerConnectionController.preferredCodec="");const t={sdp:e.sdp,type:"offer"};this.peerConnectionController.receiveOffer(t,this.config),this.handlePostWebrtcNegotiation()}handleWebRtcSFUPeerDatachannels(e){const t={ordered:!0,negotiated:!0,id:e.sendStreamId},n=e.sendStreamId!=e.recvStreamId;if(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,n?"send-datachannel":"datachannel",t),n){const t={ordered:!0,negotiated:!0,id:e.recvStreamId};this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"recv-datachannel",t),this.recvDataChannelController.handleOnOpen=()=>this.protocol.sendMessage(Ae(Pe)),this.recvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}else this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handlePostWebrtcNegotiation(){this.afkController.startAfkWarningTimer(),this.pixelStreaming._onWebRtcSdp(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.statsTimerHandle=window.setInterval((()=>this.getStats()),1e3),this.setMouseInputEnabled(this.config.isFlagEnabled(Lt.MouseInput)),this.setKeyboardInputEnabled(this.config.isFlagEnabled(Lt.KeyboardInput)),this.setGamePadInputEnabled(this.config.isFlagEnabled(Lt.GamepadInput))}handleIceCandidate(e){i.Log(i.GetStackTrace(),"Web RTC Controller: onWebRtcIce",6);const t=new RTCIceCandidate(e);this.peerConnectionController.handleOnIce(t)}handleSendIceCandidate(e){i.Log(i.GetStackTrace(),"OnIceCandidate",6),e.candidate&&e.candidate.candidate&&this.protocol.sendMessage(Ae(we,{candidate:e.candidate}))}handleDataChannel(e){i.Log(i.GetStackTrace(),"Data channel created for us by browser as we are a receiving peer.",6),this.sendrecvDataChannelController.dataChannel=e.channel,this.sendrecvDataChannelController.setupDataChannel(),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handleSendWebRTCOffer(e){i.Log(i.GetStackTrace(),"Sending the offer to the Server",6);const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(It.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(It.WebRTCMaxBitrate)};this.protocol.sendMessage(Ae(ve,t))}handleSendWebRTCAnswer(e){i.Log(i.GetStackTrace(),"Sending the answer to the Server",6);const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(It.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(It.WebRTCMaxBitrate)};this.protocol.sendMessage(Ae(ye,t)),this.isUsingSFU&&this.protocol.sendMessage(Ae(Me))}setUpMouseAndFreezeFrame(){this.videoElementParentClientRect=this.videoPlayer.getVideoParentElement().getBoundingClientRect(),this.coordinateConverter.setupNormalizeAndQuantize(),this.freezeFrameController.freezeFrame.resize()}closeSignalingServer(e){var t;this.locallyClosed=!0,this.shouldReconnect=!1,this.disconnectMessage=e,null===(t=this.protocol)||void 0===t||t.disconnect()}closePeerConnection(){var e;null===(e=this.peerConnectionController)||void 0===e||e.close()}close(){this.closeSignalingServer(""),this.closePeerConnection()}getStats(){this.peerConnectionController.generateStats()}sendLatencyTest(){this.latencyStartTime=Date.now(),this.streamMessageController.toStreamerHandlers.get("LatencyTest")([JSON.stringify({StartTime:this.latencyStartTime})])}sendDataChannelLatencyTest(e){this.streamMessageController.toStreamerHandlers.get("DataChannelLatencyTest")([JSON.stringify(e)])}sendEncoderMinQP(e){i.Log(i.GetStackTrace(),`MinQP=${e}\n`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MinQP":e})])}sendEncoderMaxQP(e){i.Log(i.GetStackTrace(),`MaxQP=${e}\n`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MaxQP":e})])}sendWebRTCMinBitrate(e){i.Log(i.GetStackTrace(),`WebRTC Min Bitrate=${e}`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MinBitrate":e})])}sendWebRTCMaxBitrate(e){i.Log(i.GetStackTrace(),`WebRTC Max Bitrate=${e}`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxBitrate":e})])}sendWebRTCFps(e){i.Log(i.GetStackTrace(),`WebRTC FPS=${e}`,6),null!=e&&(this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.Fps":e})]),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxFps":e})]))}sendShowFps(){i.Log(i.GetStackTrace(),"---- Sending show stat to UE ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"stat.fps":""})])}sendIframeRequest(){i.Log(i.GetStackTrace(),"---- Sending Request for an IFrame ----",6),this.streamMessageController.toStreamerHandlers.get("IFrameRequest")()}emitUIInteraction(e){i.Log(i.GetStackTrace(),"---- Sending custom UIInteraction message ----",6),this.streamMessageController.toStreamerHandlers.get("UIInteraction")([JSON.stringify(e)])}emitCommand(e){i.Log(i.GetStackTrace(),"---- Sending custom Command message ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(e)])}emitConsoleCommand(e){i.Log(i.GetStackTrace(),"---- Sending custom Command:ConsoleCommand message ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({ConsoleCommand:e})])}sendRequestQualityControlOwnership(){i.Log(i.GetStackTrace(),"---- Sending Request to Control Quality ----",6),this.toStreamerMessagesController.SendRequestQualityControl()}handleLatencyTestResult(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.latencyTest",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=new cn;Object.assign(n,JSON.parse(t)),n.processFields(),n.testStartTimeMs=this.latencyStartTime,n.browserReceiptTimeMs=Date.now(),n.latencyExcludingDecode=~~(n.browserReceiptTimeMs-n.testStartTimeMs),n.testDuration=~~(n.TransmissionTimeMs-n.ReceiptTimeMs),n.networkLatency=~~(n.latencyExcludingDecode-n.testDuration),n.frameDisplayDeltaTimeMs&&n.browserReceiptTimeMs&&(n.endToEndLatency=(n.frameDisplayDeltaTimeMs,n.networkLatency,~~+n.CaptureToSendMs)),this.pixelStreaming._onLatencyTestResult(n)}handleDataChannelLatencyTestResponse(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.dataChannelLatencyResponse",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.pixelStreaming._onDataChannelLatencyTestResponse(n)}handleInitialSettings(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.InitialSettings",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t),r=new sn;n.Encoder&&(r.EncoderSettings=n.Encoder),n.WebRTC&&(r.WebRTCSettings=n.WebRTC),n.PixelStreaming&&(r.PixelStreamingSettings=n.PixelStreaming),n.ConfigOptions&&void 0!==n.ConfigOptions.DefaultToHover&&this.config.setFlagEnabled(Lt.HoveringMouseMode,!!n.ConfigOptions.DefaultToHover),r.ueCompatible(),i.Log(i.GetStackTrace(),t,6),this.pixelStreaming._onInitialSettings(r)}handleVideoEncoderAvgQP(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.VideoEncoderAvgQP",6);const t=Number(new TextDecoder("utf-16").decode(e.slice(1)));this.setVideoEncoderAvgQP(t)}handleVideoInitialized(){this.pixelStreaming._onVideoInitialized(),this.autoPlayVideoOrSetUpPlayOverlay(),this.resizePlayerStyle(),this.videoPlayer.updateVideoStreamSize()}onQualityControlOwnership(e){const t=new Uint8Array(e);i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.QualityControlOwnership",6),this.isQualityController=new Boolean(t[1]).valueOf(),i.Log(i.GetStackTrace(),`Received quality controller message, will control quality: ${this.isQualityController}`),this.pixelStreaming._onQualityControlOwnership(this.isQualityController)}handleVideoStats(e){this.pixelStreaming._onVideoStats(e)}resizePlayerStyle(){this.videoPlayer.resizePlayerStyle()}setPreferredCodec(e){this.preferredCodec=e,this.peerConnectionController&&(this.peerConnectionController.preferredCodec=e,this.peerConnectionController.updateCodecSelection=!1)}setVideoEncoderAvgQP(e){this.videoAvgQp=e,this.pixelStreaming._onVideoEncoderAvgQP(this.videoAvgQp)}setKeyboardInputEnabled(e){var t;null===(t=this.keyboardController)||void 0===t||t.unregisterKeyBoardEvents(),e&&(this.keyboardController=this.inputClassesFactory.registerKeyBoard(this.config))}setMouseInputEnabled(e){var t;if(null===(t=this.mouseController)||void 0===t||t.unregisterMouseEvents(),e){const e=this.config.isFlagEnabled(Lt.HoveringMouseMode)?Bt.HoveringMouse:Bt.LockedMouse;this.mouseController=this.inputClassesFactory.registerMouse(e)}}setTouchInputEnabled(e){var t;null===(t=this.touchController)||void 0===t||t.unregisterTouchEvents(),e&&(this.touchController=this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(Lt.FakeMouseWithTouches),this.videoElementParentClientRect))}setGamePadInputEnabled(e){var t;null===(t=this.gamePadController)||void 0===t||t.unregisterGamePadEvents(),e&&(this.gamePadController=this.inputClassesFactory.registerGamePad(),this.gamePadController.onGamepadConnected=()=>{this.streamMessageController.toStreamerHandlers.get("GamepadConnected")()},this.gamePadController.onGamepadDisconnected=e=>{this.streamMessageController.toStreamerHandlers.get("GamepadDisconnected")([e])})}registerDataChannelEventEmitters(e){e.onOpen=(e,t)=>this.pixelStreaming.dispatchEvent(new rt({label:e,event:t})),e.onClose=(e,t)=>this.pixelStreaming.dispatchEvent(new st({label:e,event:t})),e.onError=(e,t)=>this.pixelStreaming.dispatchEvent(new it({label:e,event:t}))}registerMessageHandler(e,t,n){t===tn.FromStreamer&&void 0===n&&i.Warning(i.GetStackTrace(),`Unable to register handler for ${e} as no handler was passed`),this.streamMessageController.registerMessageHandler(t,e,(r=>void 0===n&&t===tn.ToStreamer?this.sendMessageController.sendMessageToStreamer(e,r):n(r)))}}class Nn{static vertexShader(){return"\n\t\tattribute vec2 a_position;\n\t\tattribute vec2 a_texCoord;\n\n\t\t// input\n\t\tuniform vec2 u_resolution;\n\t\tuniform vec4 u_offset;\n\n\t\t//\n\t\tvarying vec2 v_texCoord;\n\n\t\tvoid main() {\n\t\t // convert the rectangle from pixels to 0.0 to 1.0\n\t\t vec2 zeroToOne = a_position / u_resolution;\n\n\t\t // convert from 0->1 to 0->2\n\t\t vec2 zeroToTwo = zeroToOne * 2.0;\n\n\t\t // convert from 0->2 to -1->+1 (clipspace)\n\t\t vec2 clipSpace = zeroToTwo - 1.0;\n\n\t\t gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);\n\t\t // pass the texCoord to the fragment shader\n\t\t // The GPU will interpolate this value between points.\n\t\t v_texCoord = (a_texCoord * u_offset.xy) + u_offset.zw;\n\t\t}\n\t\t"}static fragmentShader(){return"\n\t\tprecision mediump float;\n\n\t\t// our texture\n\t\tuniform sampler2D u_image;\n\n\t\t// the texCoords passed in from the vertex shader.\n\t\tvarying vec2 v_texCoord;\n\n\t\tvoid main() {\n\t\t gl_FragColor = texture2D(u_image, v_texCoord);\n\t\t}\n\t\t"}}class Bn{static deepCopyGamepad(e){return JSON.parse(JSON.stringify({buttons:e.buttons.map((e=>JSON.parse(JSON.stringify({pressed:e.pressed,touched:e.touched})))),axes:e.axes}))}}class Vn{constructor(e){this.toStreamerMessagesProvider=e,this.controllers=[]}updateStatus(e,t,n){if(e.gamepad){const r=t.getPose(e.gripSpace,n);if(!r)return;let s=0;e.profiles.includes("htc-vive")?s=1:e.profiles.includes("oculus-touch")&&(s=2),this.toStreamerMessagesProvider.toStreamerHandlers.get("XRSystem")([s]);let i=2;switch(e.handedness){case"left":i=0;break;case"right":i=1}const a=r.transform.matrix,o=[];for(let e=0;e<16;e++)o[e]=new Float32Array([a[e]])[0];this.toStreamerMessagesProvider.toStreamerHandlers.get("XRControllerTransform")([o[0],o[4],o[8],o[12],o[1],o[5],o[9],o[13],o[2],o[6],o[10],o[14],o[3],o[7],o[11],o[15],i]),void 0===this.controllers[i]&&(this.controllers[i]={prevState:void 0,currentState:void 0,id:void 0},this.controllers[i].prevState=Bn.deepCopyGamepad(e.gamepad)),this.controllers[i].currentState=Bn.deepCopyGamepad(e.gamepad);const l=this.controllers[i],c=l.currentState,d=l.prevState;for(let e=0;e<c.buttons.length;e++){const t=c.buttons[e],n=d.buttons[e];t.pressed?this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonPressed")([i,e,n.pressed?1:0]):!t.pressed&&n.pressed&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonReleased")([i,e,0]),t.touched&&!t.pressed?this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonPressed")([i,3,n.touched?1:0]):!t.touched&&n.touched&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonReleased")([i,3,0])}for(let e=0;e<c.axes.length;e++)this.toStreamerMessagesProvider.toStreamerHandlers.get("XRAnalog")([i,e,c.axes[e]]);this.controllers[i].prevState=c}}}class Gn{constructor(e){this.xrSession=null,this.webRtcController=e,this.xrControllers=[],this.xrGamepadController=new Vn(this.webRtcController.streamMessageController),this.onSessionEnded=new EventTarget,this.onSessionStarted=new EventTarget,this.onFrame=new EventTarget}xrClicked(){this.xrSession?this.xrSession.end():navigator.xr.requestSession("immersive-vr").then((e=>{this.onXrSessionStarted(e)}))}onXrSessionEnded(){i.Log(i.GetStackTrace(),"XR Session ended"),this.xrSession=null,this.onSessionEnded.dispatchEvent(new Event("xrSessionEnded"))}onXrSessionStarted(e){i.Log(i.GetStackTrace(),"XR Session started"),this.xrSession=e,this.xrSession.addEventListener("end",(()=>{this.onXrSessionEnded()}));const t=document.createElement("canvas");this.gl=t.getContext("webgl2",{xrCompatible:!0}),this.xrSession.updateRenderState({baseLayer:new XRWebGLLayer(this.xrSession,this.gl)});const n=this.gl.createShader(this.gl.VERTEX_SHADER);this.gl.shaderSource(n,Nn.vertexShader()),this.gl.compileShader(n);const r=this.gl.createShader(this.gl.FRAGMENT_SHADER);this.gl.shaderSource(r,Nn.fragmentShader()),this.gl.compileShader(r);const s=this.gl.createProgram();this.gl.attachShader(s,n),this.gl.attachShader(s,r),this.gl.linkProgram(s),this.gl.useProgram(s),this.positionLocation=this.gl.getAttribLocation(s,"a_position"),this.texcoordLocation=this.gl.getAttribLocation(s,"a_texCoord"),this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.positionLocation);const a=this.gl.createTexture();this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.NEAREST),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.NEAREST),this.texcoordBuffer=this.gl.createBuffer(),this.resolutionLocation=this.gl.getUniformLocation(s,"u_resolution"),this.offsetLocation=this.gl.getUniformLocation(s,"u_offset"),e.requestReferenceSpace("local").then((e=>{this.xrRefSpace=e,this.xrSession.requestAnimationFrame(((e,t)=>this.onXrFrame(e,t)))})),this.onSessionStarted.dispatchEvent(new Event("xrSessionStarted"))}onXrFrame(e,t){const n=t.getViewerPose(this.xrRefSpace);if(n){const e=n.transform.matrix,t=[];for(let n=0;n<16;n++)t[n]=new Float32Array([e[n]])[0];this.webRtcController.streamMessageController.toStreamerHandlers.get("XRHMDTransform")([t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15]]);const r=this.xrSession.renderState.baseLayer;this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,r.framebuffer),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.webRtcController.videoPlayer.getVideoElement()),this.render(this.webRtcController.videoPlayer.getVideoElement())}this.webRtcController.config.isFlagEnabled(Lt.XRControllerInput)&&this.xrSession.inputSources.forEach(((e,n,r)=>{this.xrGamepadController.updateStatus(e,t,this.xrRefSpace)}),this),this.xrSession.requestAnimationFrame(((e,t)=>this.onXrFrame(e,t))),this.onFrame.dispatchEvent(new Mt({time:e,frame:t}))}render(e){if(!this.gl)return;const t=this.xrSession.renderState.baseLayer;let n,r,s,i,a;this.gl.viewport(0,0,t.framebufferWidth,t.framebufferHeight),this.gl.uniform4f(this.offsetLocation,1,1,0,0),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e.videoWidth,0,0,e.videoHeight,0,e.videoHeight,e.videoWidth,0,e.videoWidth,e.videoHeight]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texcoordBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),n=2,r=this.gl.FLOAT,s=!1,i=0,a=0,this.gl.vertexAttribPointer(this.positionLocation,n,r,s,i,a),this.gl.enableVertexAttribArray(this.texcoordLocation),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texcoordBuffer),n=2,r=this.gl.FLOAT,s=!1,i=0,a=0,this.gl.vertexAttribPointer(this.texcoordLocation,n,r,s,i,a),this.gl.uniform2f(this.resolutionLocation,e.videoWidth,e.videoHeight);const o=this.gl.TRIANGLES;a=0,this.gl.drawArrays(o,a,6)}static isSessionSupported(e){return navigator.xr?navigator.xr.isSessionSupported(e):new Promise((()=>!1))}}class Wn{constructor(e){this.editTextButton=null,this.hiddenInput=null,"ontouchstart"in document.documentElement&&this.createOnScreenKeyboardHelpers(e)}unquantizeAndDenormalizeUnsigned(e,t){return null}createOnScreenKeyboardHelpers(e){this.hiddenInput||(this.hiddenInput=document.createElement("input"),this.hiddenInput.id="hiddenInput",this.hiddenInput.maxLength=0,e.appendChild(this.hiddenInput)),this.editTextButton||(this.editTextButton=document.createElement("button"),this.editTextButton.id="editTextButton",this.editTextButton.innerHTML="edit text",e.appendChild(this.editTextButton),this.editTextButton.classList.add("hiddenState"),this.editTextButton.addEventListener("touchend",(e=>{this.hiddenInput.focus(),e.preventDefault()})))}showOnScreenKeyboard(e){if(e.showOnScreenKeyboard){this.editTextButton.classList.remove("hiddenState");const t=this.unquantizeAndDenormalizeUnsigned(e.x,e.y);this.editTextButton.style.top=t.y.toString()+"px",this.editTextButton.style.left=(t.x-40).toString()+"px"}else this.editTextButton.classList.add("hiddenState"),this.hiddenInput.blur()}}class zn{constructor(e){this.seq=e.Seq,this.playerSentTimestamp=Date.now(),this.requestFillerSize=e.Filler?e.Filler.length:0}update(e){this.playerReceivedTimestamp=Date.now(),this.streamerReceivedTimestamp=e.ReceivedTimestamp,this.streamerSentTimestamp=e.SentTimestamp,this.responseFillerSize=e.Filler?e.Filler.length:0}}class _n{constructor(e,t){this.sink=e,this.callback=t,this.records=new Map,this.seq=0}start(e){return!this.isRunning()&&(this.startTime=Date.now(),this.records.clear(),this.interval=setInterval((()=>{Date.now()-this.startTime>=e.duration?this.stop():this.sendRequest(e.requestSize,e.responseSize)}).bind(this),Math.floor(1e3/e.rps)),!0)}stop(){this.interval&&(clearInterval(this.interval),this.interval=void 0,this.callback(this.produceResult()))}produceResult(){const e=new Map(this.records);return{records:e,dataChannelRtt:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),playerToStreamerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.streamerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),streamerToPlayerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.streamerSentTimestamp)),0)/this.records.size),exportLatencyAsCSV:()=>{let t="Timestamp;RTT;PlayerToStreamer;StreamerToPlayer;\n";return e.forEach((e=>{t+=e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.streamerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.streamerSentTimestamp+";",t+="\n"})),t}}}isRunning(){return!!this.interval}receive(e){if(!this.isRunning())return;if(!e)return void i.Error(i.GetStackTrace(),"Undefined response from server");const t=this.records.get(e.Seq);t&&t.update(e)}sendRequest(e,t){const n=this.createRequest(e,t),r=new zn(n);this.records.set(r.seq,r),this.sink(n)}createRequest(e,t){return{Seq:this.seq++,FillResponseSize:t,Filler:e?"A".repeat(e):""}}}class $n{constructor(e,t){this.allowConsoleCommands=!1,this.config=e,(null==t?void 0:t.videoElementParent)&&(this._videoElementParent=t.videoElementParent),this._eventEmitter=new Pt,this.configureSettings(),this.setWebRtcPlayerController(new Un(this.config,this)),this.onScreenKeyboardHelper=new Wn(this.videoElementParent),this.onScreenKeyboardHelper.unquantizeAndDenormalizeUnsigned=(e,t)=>this._webRtcController.requestUnquantizedAndDenormalizeUnsigned(e,t),this._activateOnScreenKeyboard=e=>this.onScreenKeyboardHelper.showOnScreenKeyboard(e),this._webXrController=new Gn(this._webRtcController)}get videoElementParent(){return this._videoElementParent||(this._videoElementParent=document.createElement("div"),this._videoElementParent.id="videoElementParent"),this._videoElementParent}configureSettings(){this.config._addOnSettingChangedListener(Lt.IsQualityController,(e=>{!0!==e||this._webRtcController.isQualityController||this._webRtcController.sendRequestQualityControlOwnership()})),this.config._addOnSettingChangedListener(Lt.AFKDetection,(e=>{this._webRtcController.setAfkEnabled(e)})),this.config._addOnSettingChangedListener(Lt.MatchViewportResolution,(()=>{this._webRtcController.videoPlayer.updateVideoStreamSize()})),this.config._addOnSettingChangedListener(Lt.HoveringMouseMode,(e=>{this.config.setFlagLabel(Lt.HoveringMouseMode,`Control Scheme: ${e?"Hovering":"Locked"} Mouse`),this._webRtcController.setMouseInputEnabled(this.config.isFlagEnabled(Lt.MouseInput))})),this.config._addOnSettingChangedListener(Lt.KeyboardInput,(e=>{this._webRtcController.setKeyboardInputEnabled(e)})),this.config._addOnSettingChangedListener(Lt.MouseInput,(e=>{this._webRtcController.setMouseInputEnabled(e)})),this.config._addOnSettingChangedListener(Lt.TouchInput,(e=>{this._webRtcController.setTouchInputEnabled(e)})),this.config._addOnSettingChangedListener(Lt.GamepadInput,(e=>{this._webRtcController.setGamePadInputEnabled(e)})),this.config._addOnNumericSettingChangedListener(It.MinQP,(e=>{i.Log(i.GetStackTrace(),"-------- Sending MinQP --------",7),this._webRtcController.sendEncoderMinQP(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(It.MaxQP,(e=>{i.Log(i.GetStackTrace(),"-------- Sending encoder settings --------",7),this._webRtcController.sendEncoderMaxQP(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(It.WebRTCMinBitrate,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCMinBitrate(1e3*e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(It.WebRTCMaxBitrate,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCMaxBitrate(1e3*e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(It.WebRTCFPS,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCFps(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnOptionSettingChangedListener(At.PreferredCodec,(e=>{this._webRtcController&&this._webRtcController.setPreferredCodec(e)})),this.config._registerOnChangeEvents(this._eventEmitter)}_activateOnScreenKeyboard(e){throw new Error("Method not implemented.")}_onInputControlOwnership(e){this._inputController=e}setWebRtcPlayerController(e){this._webRtcController=e,this._webRtcController.setPreferredCodec(this.config.getSettingOption(At.PreferredCodec).selected),this._webRtcController.resizePlayerStyle(),this.checkForAutoConnect()}connect(){this._eventEmitter.dispatchEvent(new lt),this._webRtcController.connectToSignallingServer()}reconnect(){this._eventEmitter.dispatchEvent(new dt),this._webRtcController.tryReconnect("Reconnecting...")}disconnect(){this._eventEmitter.dispatchEvent(new ct),this._webRtcController.close()}play(){this._onStreamLoading(),this._webRtcController.playStream()}checkForAutoConnect(){this.config.isFlagEnabled(Lt.AutoConnect)&&(this._onWebRtcAutoConnect(),this._webRtcController.connectToSignallingServer())}unmuteMicrophone(e=!1){if(!this.config.isFlagEnabled("UseMic"))return e?(this.config.setFlagEnabled("UseMic",!0),void this.reconnect()):void i.Warning(i.GetStackTrace(),"Trying to unmute mic, but PixelStreaming was initialized with no microphone track. Call with forceEnable == true to re-connect with a mic track.");this.setMicrophoneMuted(!1)}muteMicrophone(){this.config.isFlagEnabled("UseMic")?this.setMicrophoneMuted(!0):i.Info(i.GetStackTrace(),"Trying to mute mic, but PixelStreaming has no microphone track, so sending sound is already disabled.")}setMicrophoneMuted(e){var t,n,r,s;for(const i of null!==(s=null===(r=null===(n=null===(t=this._webRtcController)||void 0===t?void 0:t.peerConnectionController)||void 0===n?void 0:n.peerConnection)||void 0===r?void 0:r.getTransceivers())&&void 0!==s?s:[])Zt.canTransceiverSendAudio(i)&&(i.sender.track.enabled=!e)}_onWebRtcAutoConnect(){this._eventEmitter.dispatchEvent(new Ye)}_onWebRtcSdp(){this._eventEmitter.dispatchEvent(new Je)}_onStreamLoading(){this._eventEmitter.dispatchEvent(new ot)}_onDisconnect(e,t){this._eventEmitter.dispatchEvent(new nt({eventString:e,allowClickToReconnect:t}))}_onWebRtcConnecting(){this._eventEmitter.dispatchEvent(new Ze)}_onWebRtcConnected(){this._eventEmitter.dispatchEvent(new et)}_onWebRtcFailed(){this._eventEmitter.dispatchEvent(new tt)}_onVideoInitialized(){this._eventEmitter.dispatchEvent(new at),this._videoStartTime=Date.now()}_onLatencyTestResult(e){this._eventEmitter.dispatchEvent(new St({latencyTimings:e}))}_onDataChannelLatencyTestResponse(e){this._eventEmitter.dispatchEvent(new wt({response:e}))}_onVideoStats(e){this._videoStartTime&&void 0!==this._videoStartTime||(this._videoStartTime=Date.now()),e.handleSessionStatistics(this._videoStartTime,this._inputController,this._webRtcController.videoAvgQp),this._eventEmitter.dispatchEvent(new ft({aggregatedStats:e}))}_onVideoEncoderAvgQP(e){this._eventEmitter.dispatchEvent(new Xe({avgQP:e}))}_onInitialSettings(e){var t;this._eventEmitter.dispatchEvent(new Tt({settings:e})),e.PixelStreamingSettings&&(this.allowConsoleCommands=null!==(t=e.PixelStreamingSettings.AllowPixelStreamingCommands)&&void 0!==t&&t,!1===this.allowConsoleCommands&&i.Info(i.GetStackTrace(),"-AllowPixelStreamingCommands=false, sending arbitrary console commands from browser to UE is disabled."));const n=this.config.useUrlParams,r=new URLSearchParams(window.location.search);i.Info(i.GetStackTrace(),`using URL parameters ${n}`),e.EncoderSettings&&(this.config.setNumericSetting(It.MinQP,n&&r.has(It.MinQP)?Number.parseFloat(r.get(It.MinQP)):e.EncoderSettings.MinQP),this.config.setNumericSetting(It.MaxQP,n&&r.has(It.MaxQP)?Number.parseFloat(r.get(It.MaxQP)):e.EncoderSettings.MaxQP)),e.WebRTCSettings&&(this.config.setNumericSetting(It.WebRTCMinBitrate,n&&r.has(It.WebRTCMinBitrate)?Number.parseFloat(r.get(It.WebRTCMinBitrate)):e.WebRTCSettings.MinBitrate/1e3),this.config.setNumericSetting(It.WebRTCMaxBitrate,n&&r.has(It.WebRTCMaxBitrate)?Number.parseFloat(r.get(It.WebRTCMaxBitrate)):e.WebRTCSettings.MaxBitrate/1e3),this.config.setNumericSetting(It.WebRTCFPS,n&&r.has(It.WebRTCFPS)?Number.parseFloat(r.get(It.WebRTCFPS)):e.WebRTCSettings.FPS))}_onQualityControlOwnership(e){this.config.setFlagEnabled(Lt.IsQualityController,e)}_onPlayerCount(e){this._eventEmitter.dispatchEvent(new Rt({count:e}))}requestLatencyTest(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendLatencyTest(),!0)}requestDataChannelLatencyTest(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._dataChannelLatencyTestController||(this._dataChannelLatencyTestController=new _n(this._webRtcController.sendDataChannelLatencyTest.bind(this._webRtcController),(e=>{this._eventEmitter.dispatchEvent(new bt({result:e}))})),this.addEventListener("dataChannelLatencyTestResponse",(({data:{response:e}})=>{this._dataChannelLatencyTestController.receive(e)}))),this._dataChannelLatencyTestController.start(e))}requestShowFps(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendShowFps(),!0)}requestIframe(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendIframeRequest(),!0)}emitUIInteraction(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.emitUIInteraction(e),!0)}emitCommand(e){return!(!this._webRtcController.videoPlayer.isVideoReady()||!this.allowConsoleCommands&&"ConsoleCommand"in e||(this._webRtcController.emitCommand(e),0))}emitConsoleCommand(e){return!(!this.allowConsoleCommands||!this._webRtcController.videoPlayer.isVideoReady()||(this._webRtcController.emitConsoleCommand(e),0))}addResponseEventListener(e,t){this._webRtcController.responseController.addResponseEventListener(e,t)}removeResponseEventListener(e){this._webRtcController.responseController.removeResponseEventListener(e)}dispatchEvent(e){return this._eventEmitter.dispatchEvent(e)}addEventListener(e,t){this._eventEmitter.addEventListener(e,t)}removeEventListener(e,t){this._eventEmitter.removeEventListener(e,t)}toggleXR(){this.webXrController.xrClicked()}setSignallingUrlBuilder(e){this._webRtcController.signallingUrlBuilder=e}get signallingProtocol(){return this._webRtcController.protocol}get webXrController(){return this._webXrController}registerMessageHandler(e,t,n){t!==tn.FromStreamer||void 0!==n?t===tn.ToStreamer&&void 0===n?this._webRtcController.streamMessageController.registerMessageHandler(t,e,(t=>this._webRtcController.sendMessageController.sendMessageToStreamer(e,t))):this._webRtcController.streamMessageController.registerMessageHandler(t,e,(e=>n(e))):i.Warning(i.GetStackTrace(),`Unable to register an undefined handler for ${e}`)}get toStreamerHandlers(){return this._webRtcController.streamMessageController.toStreamerHandlers}isReconnecting(){return this._webRtcController.isReconnecting}}var Hn=r(499),jn=r.n(Hn);class Kn extends l.EventEmitter{constructor(e){super(),this.WS_OPEN_STATE=1,e&&(this.webSocket=e,this.setupSocketHandlers(),this.emit("open"))}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){return this.webSocket=new(jn())(e),this.setupSocketHandlers(),!0}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=jn().CLOSED}handleOnMessage(e){let t;try{t=JSON.parse(e.data)}catch(e){return}this.onMessage&&this.onMessage(t)}handleOnOpen(e){this.emit("open",e)}handleOnError(e){this.emit("error",e)}handleOnClose(e){this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}setupSocketHandlers(){this.webSocket&&(this.webSocket.addEventListener("open",this.handleOnOpen.bind(this)),this.webSocket.addEventListener("error",this.handleOnError.bind(this)),this.webSocket.addEventListener("close",this.handleOnClose.bind(this)),this.webSocket.addEventListener("message",this.handleOnMessage.bind(this)))}}})();var i=s.Dz,a=s.g$,o=s.Lt,l=s.Q9,c=s.qf,d=s.hV,h=s.z$,u=s.J0,g=s.De,m=s.$C,p=s.al,f=s._W,v=s.Gv,y=s.m,S=s.tz,w=s.Nu,b=s.zg,T=s.vp,C=s.vU,E=s.wF,k=s.rv,M=s.Nh,R=s.ss,P=s.qW,L=s.QL,F=s.cf,I=s.eM,O=s.Yd,x=s.Tk,D=s.iw,A=s.pr,U=s.Vm,N=s.sK,B=s.Ok,V=s.q5,G=s.g,W=s.xl,z=s.I,_=s.bx,$=s.dD,H=s.Ib,j=s.Az,K=s.Iw,Q=s.qY,q=s.db,X=s.mR,J=s.Tn,Y=s.rV,Z=s.gh,ee=s.Mi,te=s.j,ne=s.YB,re=s.Yt,se=s.i5,ie=s.x_,ae=s.Am,oe=s.eR,le=s.r8,ce=s.u3,de=s.vd,he=s.iV,ue=s.jZ,ge=s.SW,me=s.ZH,pe=s.Ni,fe=s.lh,ve=s.qo,ye=s.Q8,Se=s.$f,we=s.eu,be=s.Ax,Te=s.Mc;export{i as AfkLogic,a as AfkTimedOutEvent,o as AfkWarningActivateEvent,l as AfkWarningDeactivateEvent,c as AfkWarningUpdateEvent,d as AggregatedStats,h as CandidatePairStats,u as CandidateStat,g as Config,m as ControlSchemeType,p as DataChannelCloseEvent,f as DataChannelErrorEvent,v as DataChannelLatencyTestResponseEvent,y as DataChannelLatencyTestResultEvent,S as DataChannelOpenEvent,w as DataChannelStats,b as EncoderSettings,T as EventEmitter,C as Flags,E as HideFreezeFrameEvent,k as InboundAudioStats,M as InboundVideoStats,R as InitialSettings,P as InitialSettingsEvent,L as LatencyTestResultEvent,F as LatencyTestResults,I as LoadFreezeFrameEvent,O as Logger,x as MessageDirection,D as MessageHelpers,A as MessageRegistry,U as Messages,N as NumericParameters,B as OptionParameters,V as OutBoundVideoStats,G as PixelStreaming,W as PlayStreamErrorEvent,z as PlayStreamEvent,_ as PlayStreamRejectedEvent,$ as PlayerCountEvent,H as SettingBase,j as SettingFlag,K as SettingNumber,Q as SettingOption,q as SettingText,X as SettingsChangedEvent,J as SignallingProtocol,Y as StatsReceivedEvent,Z as StreamLoadingEvent,ee as StreamPreConnectEvent,te as StreamPreDisconnectEvent,ne as StreamReconnectEvent,re as StreamerIDChangedMessageEvent,se as StreamerListMessageEvent,ie as TextParameters,ae as UnquantizedAndDenormalizeUnsigned,oe as VideoEncoderAvgQPEvent,le as VideoInitializedEvent,ce as WebRTCSettings,de as WebRtcAutoConnectEvent,he as WebRtcConnectedEvent,ue as WebRtcConnectingEvent,ge as WebRtcDisconnectedEvent,me as WebRtcFailedEvent,pe as WebRtcPlayerController,fe as WebRtcSdpEvent,ve as WebSocketTransport,ye as WebSocketTransportNJS,Se as WebXRController,we as XrFrameEvent,be as XrSessionEndedEvent,Te as XrSessionStartedEvent};
|
|
1
|
+
import*as e from"sdp";var t={499:e=>{e.exports=function(){throw new Error("ws does not work in the browser. Browser clients must use the native WebSocket object")}},187:e=>{var t,n="object"==typeof Reflect?Reflect:null,r=n&&"function"==typeof n.apply?n.apply:function(e,t,n){return Function.prototype.apply.call(e,t,n)};t=n&&"function"==typeof n.ownKeys?n.ownKeys:Object.getOwnPropertySymbols?function(e){return Object.getOwnPropertyNames(e).concat(Object.getOwnPropertySymbols(e))}:function(e){return Object.getOwnPropertyNames(e)};var s=Number.isNaN||function(e){return e!=e};function i(){i.init.call(this)}e.exports=i,e.exports.once=function(e,t){return new Promise((function(n,r){function s(n){e.removeListener(t,i),r(n)}function i(){"function"==typeof e.removeListener&&e.removeListener("error",s),n([].slice.call(arguments))}p(e,t,i,{once:!0}),"error"!==t&&function(e,t,n){"function"==typeof e.on&&p(e,"error",t,{once:!0})}(e,s)}))},i.EventEmitter=i,i.prototype._events=void 0,i.prototype._eventsCount=0,i.prototype._maxListeners=void 0;var a=10;function o(e){if("function"!=typeof e)throw new TypeError('The "listener" argument must be of type Function. Received type '+typeof e)}function l(e){return void 0===e._maxListeners?i.defaultMaxListeners:e._maxListeners}function c(e,t,n,r){var s,i,a,c;if(o(n),void 0===(i=e._events)?(i=e._events=Object.create(null),e._eventsCount=0):(void 0!==i.newListener&&(e.emit("newListener",t,n.listener?n.listener:n),i=e._events),a=i[t]),void 0===a)a=i[t]=n,++e._eventsCount;else if("function"==typeof a?a=i[t]=r?[n,a]:[a,n]:r?a.unshift(n):a.push(n),(s=l(e))>0&&a.length>s&&!a.warned){a.warned=!0;var d=new Error("Possible EventEmitter memory leak detected. "+a.length+" "+String(t)+" listeners added. Use emitter.setMaxListeners() to increase limit");d.name="MaxListenersExceededWarning",d.emitter=e,d.type=t,d.count=a.length,c=d,console&&console.warn&&console.warn(c)}return e}function d(){if(!this.fired)return this.target.removeListener(this.type,this.wrapFn),this.fired=!0,0===arguments.length?this.listener.call(this.target):this.listener.apply(this.target,arguments)}function h(e,t,n){var r={fired:!1,wrapFn:void 0,target:e,type:t,listener:n},s=d.bind(r);return s.listener=n,r.wrapFn=s,s}function u(e,t,n){var r=e._events;if(void 0===r)return[];var s=r[t];return void 0===s?[]:"function"==typeof s?n?[s.listener||s]:[s]:n?function(e){for(var t=new Array(e.length),n=0;n<t.length;++n)t[n]=e[n].listener||e[n];return t}(s):m(s,s.length)}function g(e){var t=this._events;if(void 0!==t){var n=t[e];if("function"==typeof n)return 1;if(void 0!==n)return n.length}return 0}function m(e,t){for(var n=new Array(t),r=0;r<t;++r)n[r]=e[r];return n}function p(e,t,n,r){if("function"==typeof e.on)r.once?e.once(t,n):e.on(t,n);else{if("function"!=typeof e.addEventListener)throw new TypeError('The "emitter" argument must be of type EventEmitter. Received type '+typeof e);e.addEventListener(t,(function s(i){r.once&&e.removeEventListener(t,s),n(i)}))}}Object.defineProperty(i,"defaultMaxListeners",{enumerable:!0,get:function(){return a},set:function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "defaultMaxListeners" is out of range. It must be a non-negative number. Received '+e+".");a=e}}),i.init=function(){void 0!==this._events&&this._events!==Object.getPrototypeOf(this)._events||(this._events=Object.create(null),this._eventsCount=0),this._maxListeners=this._maxListeners||void 0},i.prototype.setMaxListeners=function(e){if("number"!=typeof e||e<0||s(e))throw new RangeError('The value of "n" is out of range. It must be a non-negative number. Received '+e+".");return this._maxListeners=e,this},i.prototype.getMaxListeners=function(){return l(this)},i.prototype.emit=function(e){for(var t=[],n=1;n<arguments.length;n++)t.push(arguments[n]);var s="error"===e,i=this._events;if(void 0!==i)s=s&&void 0===i.error;else if(!s)return!1;if(s){var a;if(t.length>0&&(a=t[0]),a instanceof Error)throw a;var o=new Error("Unhandled error."+(a?" ("+a.message+")":""));throw o.context=a,o}var l=i[e];if(void 0===l)return!1;if("function"==typeof l)r(l,this,t);else{var c=l.length,d=m(l,c);for(n=0;n<c;++n)r(d[n],this,t)}return!0},i.prototype.addListener=function(e,t){return c(this,e,t,!1)},i.prototype.on=i.prototype.addListener,i.prototype.prependListener=function(e,t){return c(this,e,t,!0)},i.prototype.once=function(e,t){return o(t),this.on(e,h(this,e,t)),this},i.prototype.prependOnceListener=function(e,t){return o(t),this.prependListener(e,h(this,e,t)),this},i.prototype.removeListener=function(e,t){var n,r,s,i,a;if(o(t),void 0===(r=this._events))return this;if(void 0===(n=r[e]))return this;if(n===t||n.listener===t)0==--this._eventsCount?this._events=Object.create(null):(delete r[e],r.removeListener&&this.emit("removeListener",e,n.listener||t));else if("function"!=typeof n){for(s=-1,i=n.length-1;i>=0;i--)if(n[i]===t||n[i].listener===t){a=n[i].listener,s=i;break}if(s<0)return this;0===s?n.shift():function(e,t){for(;t+1<e.length;t++)e[t]=e[t+1];e.pop()}(n,s),1===n.length&&(r[e]=n[0]),void 0!==r.removeListener&&this.emit("removeListener",e,a||t)}return this},i.prototype.off=i.prototype.removeListener,i.prototype.removeAllListeners=function(e){var t,n,r;if(void 0===(n=this._events))return this;if(void 0===n.removeListener)return 0===arguments.length?(this._events=Object.create(null),this._eventsCount=0):void 0!==n[e]&&(0==--this._eventsCount?this._events=Object.create(null):delete n[e]),this;if(0===arguments.length){var s,i=Object.keys(n);for(r=0;r<i.length;++r)"removeListener"!==(s=i[r])&&this.removeAllListeners(s);return this.removeAllListeners("removeListener"),this._events=Object.create(null),this._eventsCount=0,this}if("function"==typeof(t=n[e]))this.removeListener(e,t);else if(void 0!==t)for(r=t.length-1;r>=0;r--)this.removeListener(e,t[r]);return this},i.prototype.listeners=function(e){return u(this,e,!0)},i.prototype.rawListeners=function(e){return u(this,e,!1)},i.listenerCount=function(e,t){return"function"==typeof e.listenerCount?e.listenerCount(t):g.call(e,t)},i.prototype.listenerCount=g,i.prototype.eventNames=function(){return this._eventsCount>0?t(this._events):[]}}},n={};function r(e){var s=n[e];if(void 0!==s)return s.exports;var i=n[e]={exports:{}};return t[e](i,i.exports,r),i.exports}r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var s={};(()=>{r.d(s,{Dz:()=>Gt,g$:()=>qe,Lt:()=>je,Q9:()=>Qe,qf:()=>Ke,hV:()=>qt,z$:()=>Hn,J0:()=>Ht,De:()=>Bt,$C:()=>Vt,al:()=>st,_W:()=>it,Gv:()=>wt,m:()=>bt,tz:()=>rt,Nu:()=>$t,zg:()=>on,vp:()=>Lt,vU:()=>It,wF:()=>pt,rv:()=>_t,Nh:()=>zt,ss:()=>sn,qW:()=>Tt,QL:()=>St,cf:()=>cn,eM:()=>mt,Yd:()=>i,Tk:()=>tn,iw:()=>n,pr:()=>De,Vm:()=>t,sK:()=>Ot,Ok:()=>Ut,q5:()=>jt,g:()=>$n,xl:()=>ht,I:()=>ut,bx:()=>gt,dD:()=>Rt,Ib:()=>We,Az:()=>_e,Iw:()=>ze,qY:()=>He,db:()=>$e,mR:()=>Ct,Tn:()=>Ne,rV:()=>ft,gh:()=>ot,Mi:()=>lt,j:()=>ct,YB:()=>dt,Yt:()=>yt,i5:()=>vt,x_:()=>Dt,Am:()=>Dn,eR:()=>Xe,r8:()=>at,u3:()=>ln,vd:()=>Ye,iV:()=>et,jZ:()=>Ze,SW:()=>nt,ZH:()=>tt,Ni:()=>Un,lh:()=>Je,ZP:()=>Pt,qo:()=>c,Q8:()=>Qn,$f:()=>Gn,eu:()=>Mt,Ax:()=>kt,Mc:()=>Et});var t={};r.r(t),r.d(t,{answer:()=>ye,base_message:()=>se,config:()=>ae,dataChannelRequest:()=>Me,disconnectPlayer:()=>be,endpointId:()=>le,endpointIdConfirm:()=>ce,iceCandidate:()=>we,iceCandidateData:()=>Se,identify:()=>oe,layerPreference:()=>ke,listStreamers:()=>he,offer:()=>ve,peerConnectionOptions:()=>ie,peerDataChannels:()=>Re,peerDataChannelsReady:()=>Pe,ping:()=>Te,playerConnected:()=>pe,playerCount:()=>Oe,playerDisconnected:()=>fe,pong:()=>Ce,startStreaming:()=>Ie,stats:()=>xe,stopStreaming:()=>Fe,streamerDataChannels:()=>Le,streamerDisconnected:()=>Ee,streamerIdChanged:()=>de,streamerList:()=>ue,subscribe:()=>ge,unsubscribe:()=>me});var n={};r.r(n),r.d(n,{createMessage:()=>Ae,validateMessage:()=>Ue});class i{static GetStackTrace(){const e=new Error;let t="No Stack Available for this browser";return e.stack&&(t=e.stack.toString().replace(/Error/g,"")),t}static SetLoggerVerbosity(e){null!=this.verboseLogLevel&&(this.verboseLogLevel=e)}static Log(e,t,n){void 0!==n&&n>this.verboseLogLevel||this.CommonLog("Log",null,t)}static Info(e,t,n){void 0!==n&&n>this.verboseLogLevel||this.CommonLog("Info",null,t)}static Error(e,t){this.CommonLog("Error",e,t)}static Warning(e,t){this.CommonLog("Warning",null,t)}static CommonLog(e,t,n){t?console.log(`[${e}] - ${n}\nCaller: ${t}`):console.log(`[${e}] - ${n}`)}}i.verboseLogLevel=5;var a,o,l=r(187);class c extends l.EventEmitter{constructor(){super(),this.WS_OPEN_STATE=1}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){i.Log(i.GetStackTrace(),e,6);try{return this.webSocket=new WebSocket(e),this.webSocket.onopen=e=>this.handleOnOpen(),this.webSocket.onerror=e=>this.handleOnError(),this.webSocket.onclose=e=>this.handleOnClose(e),this.webSocket.onmessage=e=>this.handleOnMessage(e),this.webSocket.onmessagebinary=e=>this.handleOnMessageBinary(e),!0}catch(e){return i.Error(i.GetStackTrace(),e),!1}}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=WebSocket.CLOSED}handleOnMessageBinary(e){e&&e.data&&e.data.text().then((e=>{const t=new MessageEvent("messageFromBinary",{data:e});this.handleOnMessage(t)})).catch((e=>{i.Error(i.GetStackTrace(),`Failed to parse binary blob from websocket, reason: ${e.message}`)}))}handleOnMessage(e){if(e.data&&e.data instanceof Blob)return void this.handleOnMessageBinary(e);let t;i.Log(i.GetStackTrace(),"received => \n"+JSON.stringify(JSON.parse(e.data),void 0,4),6);try{t=JSON.parse(e.data)}catch(t){return void(t instanceof Error?i.Error(i.GetStackTrace(),`Error parsing message string ${e.data}.\n${t.message}`):i.Error(i.GetStackTrace(),"Unknown error while parsing message data in handleOnMessage"))}this.onMessage&&this.onMessage(t)}handleOnOpen(){i.Log(i.GetStackTrace(),"Connected to the signalling server via WebSocket",6),this.emit("open")}handleOnError(){this.emit("error")}handleOnClose(e){i.Log(i.GetStackTrace(),"Disconnected to the signalling server via WebSocket: "+JSON.stringify(e.code)+" - "+e.reason),this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}}function d(e,t,n){let r,s,i=n;for(let n of e.fields){let e=n.localName;if(n.oneof){const a=i[n.oneof];if(null==(null==a?void 0:a.oneofKind))continue;if(r=a[e],s=t[n.oneof],s.oneofKind=a.oneofKind,null==r){delete s[e];continue}}else if(r=i[e],s=t,null==r)continue;switch(n.repeat&&(s[e].length=r.length),n.kind){case"scalar":case"enum":if(n.repeat)for(let t=0;t<r.length;t++)s[e][t]=r[t];else s[e]=r;break;case"message":let t=n.T();if(n.repeat)for(let n=0;n<r.length;n++)s[e][n]=t.create(r[n]);else void 0===s[e]?s[e]=t.create(r):t.mergePartial(s[e],r);break;case"map":switch(n.V.kind){case"scalar":case"enum":Object.assign(s[e],r);break;case"message":let t=n.V.T();for(let n of Object.keys(r))s[e][n]=t.create(r[n])}}}}!function(e){e.symbol=Symbol.for("protobuf-ts/unknown"),e.onRead=(n,r,s,i,a)=>{(t(r)?r[e.symbol]:r[e.symbol]=[]).push({no:s,wireType:i,data:a})},e.onWrite=(t,n,r)=>{for(let{no:t,wireType:s,data:i}of e.list(n))r.tag(t,s).raw(i)},e.list=(n,r)=>{if(t(n)){let t=n[e.symbol];return r?t.filter((e=>e.no==r)):t}return[]},e.last=(t,n)=>e.list(t,n).slice(-1)[0];const t=t=>t&&Array.isArray(t[e.symbol])}(a||(a={})),function(e){e[e.Varint=0]="Varint",e[e.Bit64=1]="Bit64",e[e.LengthDelimited=2]="LengthDelimited",e[e.StartGroup=3]="StartGroup",e[e.EndGroup=4]="EndGroup",e[e.Bit32=5]="Bit32"}(o||(o={}));const h=Symbol.for("protobuf-ts/message-type");function u(e){let t=!1;const n=[];for(let r=0;r<e.length;r++){let s=e.charAt(r);"_"==s?t=!0:/\d/.test(s)?(n.push(s),t=!0):t?(n.push(s.toUpperCase()),t=!1):0==r?n.push(s.toLowerCase()):n.push(s)}return n.join("")}var g,m,p;function f(e){var t,n,r,s;return e.localName=null!==(t=e.localName)&&void 0!==t?t:u(e.name),e.jsonName=null!==(n=e.jsonName)&&void 0!==n?n:u(e.name),e.repeat=null!==(r=e.repeat)&&void 0!==r?r:p.NO,e.opt=null!==(s=e.opt)&&void 0!==s?s:!e.repeat&&!e.oneof&&"message"==e.kind,e}function v(e){if("object"!=typeof e||null===e||!e.hasOwnProperty("oneofKind"))return!1;switch(typeof e.oneofKind){case"string":return void 0!==e[e.oneofKind]&&2==Object.keys(e).length;case"undefined":return 1==Object.keys(e).length;default:return!1}}!function(e){e[e.DOUBLE=1]="DOUBLE",e[e.FLOAT=2]="FLOAT",e[e.INT64=3]="INT64",e[e.UINT64=4]="UINT64",e[e.INT32=5]="INT32",e[e.FIXED64=6]="FIXED64",e[e.FIXED32=7]="FIXED32",e[e.BOOL=8]="BOOL",e[e.STRING=9]="STRING",e[e.BYTES=12]="BYTES",e[e.UINT32=13]="UINT32",e[e.SFIXED32=15]="SFIXED32",e[e.SFIXED64=16]="SFIXED64",e[e.SINT32=17]="SINT32",e[e.SINT64=18]="SINT64"}(g||(g={})),function(e){e[e.BIGINT=0]="BIGINT",e[e.STRING=1]="STRING",e[e.NUMBER=2]="NUMBER"}(m||(m={})),function(e){e[e.NO=0]="NO",e[e.PACKED=1]="PACKED",e[e.UNPACKED=2]="UNPACKED"}(p||(p={}));class y{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}prepare(){if(this.data)return;const e=[],t=[],n=[];for(let r of this.fields)if(r.oneof)n.includes(r.oneof)||(n.push(r.oneof),e.push(r.oneof),t.push(r.oneof));else switch(t.push(r.localName),r.kind){case"scalar":case"enum":r.opt&&!r.repeat||e.push(r.localName);break;case"message":r.repeat&&e.push(r.localName);break;case"map":e.push(r.localName)}this.data={req:e,known:t,oneofs:Object.values(n)}}is(e,t,n=!1){if(t<0)return!0;if(null==e||"object"!=typeof e)return!1;this.prepare();let r=Object.keys(e),s=this.data;if(r.length<s.req.length||s.req.some((e=>!r.includes(e))))return!1;if(!n&&r.some((e=>!s.known.includes(e))))return!1;if(t<1)return!0;for(const r of s.oneofs){const s=e[r];if(!v(s))return!1;if(void 0===s.oneofKind)continue;const i=this.fields.find((e=>e.localName===s.oneofKind));if(!i)return!1;if(!this.field(s[s.oneofKind],i,n,t))return!1}for(const r of this.fields)if(void 0===r.oneof&&!this.field(e[r.localName],r,n,t))return!1;return!0}field(e,t,n,r){let s=t.repeat;switch(t.kind){case"scalar":return void 0===e?t.opt:s?this.scalars(e,t.T,r,t.L):this.scalar(e,t.T,t.L);case"enum":return void 0===e?t.opt:s?this.scalars(e,g.INT32,r):this.scalar(e,g.INT32);case"message":return void 0===e||(s?this.messages(e,t.T(),n,r):this.message(e,t.T(),n,r));case"map":if("object"!=typeof e||null===e)return!1;if(r<2)return!0;if(!this.mapKeys(e,t.K,r))return!1;switch(t.V.kind){case"scalar":return this.scalars(Object.values(e),t.V.T,r,t.V.L);case"enum":return this.scalars(Object.values(e),g.INT32,r);case"message":return this.messages(Object.values(e),t.V.T(),n,r)}}return!0}message(e,t,n,r){return n?t.isAssignable(e,r):t.is(e,r)}messages(e,t,n,r){if(!Array.isArray(e))return!1;if(r<2)return!0;if(n){for(let n=0;n<e.length&&n<r;n++)if(!t.isAssignable(e[n],r-1))return!1}else for(let n=0;n<e.length&&n<r;n++)if(!t.is(e[n],r-1))return!1;return!0}scalar(e,t,n){let r=typeof e;switch(t){case g.UINT64:case g.FIXED64:case g.INT64:case g.SFIXED64:case g.SINT64:switch(n){case m.BIGINT:return"bigint"==r;case m.NUMBER:return"number"==r&&!isNaN(e);default:return"string"==r}case g.BOOL:return"boolean"==r;case g.STRING:return"string"==r;case g.BYTES:return e instanceof Uint8Array;case g.DOUBLE:case g.FLOAT:return"number"==r&&!isNaN(e);default:return"number"==r&&Number.isInteger(e)}}scalars(e,t,n,r){if(!Array.isArray(e))return!1;if(n<2)return!0;if(Array.isArray(e))for(let s=0;s<e.length&&s<n;s++)if(!this.scalar(e[s],t,r))return!1;return!0}mapKeys(e,t,n){let r=Object.keys(e);switch(t){case g.INT32:case g.FIXED32:case g.SFIXED32:case g.SINT32:case g.UINT32:return this.scalars(r.slice(0,n).map((e=>parseInt(e))),t,n);case g.BOOL:return this.scalars(r.slice(0,n).map((e=>"true"==e||"false"!=e&&e)),t,n);default:return this.scalars(r,t,n,m.STRING)}}}function S(e){let t=typeof e;if("object"==t){if(Array.isArray(e))return"array";if(null===e)return"null"}return t}let w="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".split(""),b=[];for(let e=0;e<w.length;e++)b[w[e].charCodeAt(0)]=e;function T(){let e=0,t=0;for(let n=0;n<28;n+=7){let r=this.buf[this.pos++];if(e|=(127&r)<<n,0==(128&r))return this.assertBounds(),[e,t]}let n=this.buf[this.pos++];if(e|=(15&n)<<28,t=(112&n)>>4,0==(128&n))return this.assertBounds(),[e,t];for(let n=3;n<=31;n+=7){let r=this.buf[this.pos++];if(t|=(127&r)<<n,0==(128&r))return this.assertBounds(),[e,t]}throw new Error("invalid varint")}function C(e,t,n){for(let r=0;r<28;r+=7){const s=e>>>r,i=!(s>>>7==0&&0==t),a=255&(i?128|s:s);if(n.push(a),!i)return}const r=e>>>28&15|(7&t)<<4,s=!(t>>3==0);if(n.push(255&(s?128|r:r)),s){for(let e=3;e<31;e+=7){const r=t>>>e,s=!(r>>>7==0),i=255&(s?128|r:r);if(n.push(i),!s)return}n.push(t>>>31&1)}}b["-".charCodeAt(0)]=w.indexOf("+"),b["_".charCodeAt(0)]=w.indexOf("/");const E=4294967296;function k(e){let t="-"==e[0];t&&(e=e.slice(1));const n=1e6;let r=0,s=0;function i(t,i){const a=Number(e.slice(t,i));s*=n,r=r*n+a,r>=E&&(s+=r/E|0,r%=E)}return i(-24,-18),i(-18,-12),i(-12,-6),i(-6),[t,r,s]}function M(e,t){if(t>>>0<=2097151)return""+(E*t+(e>>>0));let n=(e>>>24|t<<8)>>>0&16777215,r=t>>16&65535,s=(16777215&e)+6777216*n+6710656*r,i=n+8147497*r,a=2*r,o=1e7;function l(e,t){let n=e?String(e):"";return t?"0000000".slice(n.length)+n:n}return s>=o&&(i+=Math.floor(s/o),s%=o),i>=o&&(a+=Math.floor(i/o),i%=o),l(a,0)+l(i,a)+l(s,1)}function R(e,t){if(e>=0){for(;e>127;)t.push(127&e|128),e>>>=7;t.push(e)}else{for(let n=0;n<9;n++)t.push(127&e|128),e>>=7;t.push(1)}}function P(){let e=this.buf[this.pos++],t=127&e;if(0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<7,0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<14,0==(128&e))return this.assertBounds(),t;if(e=this.buf[this.pos++],t|=(127&e)<<21,0==(128&e))return this.assertBounds(),t;e=this.buf[this.pos++],t|=(15&e)<<28;for(let t=5;0!=(128&e)&&t<10;t++)e=this.buf[this.pos++];if(0!=(128&e))throw new Error("invalid varint");return this.assertBounds(),t>>>0}let L;function I(e){if(!e)throw new Error("BigInt unavailable, see https://github.com/timostamm/protobuf-ts/blob/v1.0.8/MANUAL.md#bigint-support")}!function(){const e=new DataView(new ArrayBuffer(8)),t=void 0!==globalThis.BigInt&&"function"==typeof e.getBigInt64&&"function"==typeof e.getBigUint64&&"function"==typeof e.setBigInt64&&"function"==typeof e.setBigUint64;L=t?{MIN:BigInt("-9223372036854775808"),MAX:BigInt("9223372036854775807"),UMIN:BigInt("0"),UMAX:BigInt("18446744073709551615"),C:BigInt,V:e}:void 0}();const F=/^-?[0-9]+$/,O=4294967296,x=2147483648;class D{constructor(e,t){this.lo=0|e,this.hi=0|t}isZero(){return 0==this.lo&&0==this.hi}toNumber(){let e=this.hi*O+(this.lo>>>0);if(!Number.isSafeInteger(e))throw new Error("cannot convert to safe number");return e}}class A extends D{static from(e){if(L)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=L.C(e);case"number":if(0===e)return this.ZERO;e=L.C(e);case"bigint":if(!e)return this.ZERO;if(e<L.UMIN)throw new Error("signed value for ulong");if(e>L.UMAX)throw new Error("ulong too large");return L.V.setBigUint64(0,e,!0),new A(L.V.getInt32(0,!0),L.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!F.test(e))throw new Error("string is no integer");let[t,n,r]=k(e);if(t)throw new Error("signed value for ulong");return new A(n,r);case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");if(e<0)throw new Error("signed value for ulong");return new A(e,e/O)}throw new Error("unknown value "+typeof e)}toString(){return L?this.toBigInt().toString():M(this.lo,this.hi)}toBigInt(){return I(L),L.V.setInt32(0,this.lo,!0),L.V.setInt32(4,this.hi,!0),L.V.getBigUint64(0,!0)}}A.ZERO=new A(0,0);class U extends D{static from(e){if(L)switch(typeof e){case"string":if("0"==e)return this.ZERO;if(""==e)throw new Error("string is no integer");e=L.C(e);case"number":if(0===e)return this.ZERO;e=L.C(e);case"bigint":if(!e)return this.ZERO;if(e<L.MIN)throw new Error("signed long too small");if(e>L.MAX)throw new Error("signed long too large");return L.V.setBigInt64(0,e,!0),new U(L.V.getInt32(0,!0),L.V.getInt32(4,!0))}else switch(typeof e){case"string":if("0"==e)return this.ZERO;if(e=e.trim(),!F.test(e))throw new Error("string is no integer");let[t,n,r]=k(e);if(t){if(r>x||r==x&&0!=n)throw new Error("signed long too small")}else if(r>=x)throw new Error("signed long too large");let s=new U(n,r);return t?s.negate():s;case"number":if(0==e)return this.ZERO;if(!Number.isSafeInteger(e))throw new Error("number is no integer");return e>0?new U(e,e/O):new U(-e,-e/O).negate()}throw new Error("unknown value "+typeof e)}isNegative(){return 0!=(this.hi&x)}negate(){let e=~this.hi,t=this.lo;return t?t=1+~t:e+=1,new U(t,e)}toString(){if(L)return this.toBigInt().toString();if(this.isNegative()){let e=this.negate();return"-"+M(e.lo,e.hi)}return M(this.lo,this.hi)}toBigInt(){return I(L),L.V.setInt32(0,this.lo,!0),L.V.setInt32(4,this.hi,!0),L.V.getBigInt64(0,!0)}}function N(e,t){if(!e)throw new Error(t)}function B(e){if("number"!=typeof e)throw new Error("invalid int 32: "+typeof e);if(!Number.isInteger(e)||e>2147483647||e<-2147483648)throw new Error("invalid int 32: "+e)}function V(e){if("number"!=typeof e)throw new Error("invalid uint 32: "+typeof e);if(!Number.isInteger(e)||e>4294967295||e<0)throw new Error("invalid uint 32: "+e)}function G(e){if("number"!=typeof e)throw new Error("invalid float 32: "+typeof e);if(Number.isFinite(e)&&(e>34028234663852886e22||e<-34028234663852886e22))throw new Error("invalid float 32: "+e)}function W(e,t){switch(t){case m.BIGINT:return e.toBigInt();case m.NUMBER:return e.toNumber();default:return e.toString()}}U.ZERO=new U(0,0);class _{constructor(e){this.info=e}prepare(){var e;if(void 0===this.fMap){this.fMap={};const t=null!==(e=this.info.fields)&&void 0!==e?e:[];for(const e of t)this.fMap[e.name]=e,this.fMap[e.jsonName]=e,this.fMap[e.localName]=e}}assert(e,t,n){if(!e){let e=S(n);throw"number"!=e&&"boolean"!=e||(e=n.toString()),new Error(`Cannot parse JSON ${e} for ${this.info.typeName}#${t}`)}}read(e,t,n){this.prepare();const r=[];for(const[i,a]of Object.entries(e)){const e=this.fMap[i];if(!e){if(!n.ignoreUnknownFields)throw new Error(`Found unknown field while reading ${this.info.typeName} from JSON format. JSON key: ${i}`);continue}const o=e.localName;let l;if(e.oneof){if(null===a&&("enum"!==e.kind||"google.protobuf.NullValue"!==e.T()[0]))continue;if(r.includes(e.oneof))throw new Error(`Multiple members of the oneof group "${e.oneof}" of ${this.info.typeName} are present in JSON.`);r.push(e.oneof),l=t[e.oneof]={oneofKind:o}}else l=t;if("map"==e.kind){if(null===a)continue;this.assert(null!==(s=a)&&"object"==typeof s&&!Array.isArray(s),e.name,a);const t=l[o];for(const[r,s]of Object.entries(a)){let i;switch(this.assert(null!==s,e.name+" map value",null),e.V.kind){case"message":i=e.V.T().internalJsonRead(s,n);break;case"enum":if(i=this.enum(e.V.T(),s,e.name,n.ignoreUnknownFields),!1===i)continue;break;case"scalar":i=this.scalar(s,e.V.T,e.V.L,e.name)}this.assert(void 0!==i,e.name+" map value",s);let a=r;e.K==g.BOOL&&(a="true"==a||"false"!=a&&a),a=this.scalar(a,e.K,m.STRING,e.name).toString(),t[a]=i}}else if(e.repeat){if(null===a)continue;this.assert(Array.isArray(a),e.name,a);const t=l[o];for(const r of a){let s;switch(this.assert(null!==r,e.name,null),e.kind){case"message":s=e.T().internalJsonRead(r,n);break;case"enum":if(s=this.enum(e.T(),r,e.name,n.ignoreUnknownFields),!1===s)continue;break;case"scalar":s=this.scalar(r,e.T,e.L,e.name)}this.assert(void 0!==s,e.name,a),t.push(s)}}else switch(e.kind){case"message":if(null===a&&"google.protobuf.Value"!=e.T().typeName){this.assert(void 0===e.oneof,e.name+" (oneof member)",null);continue}l[o]=e.T().internalJsonRead(a,n,l[o]);break;case"enum":let t=this.enum(e.T(),a,e.name,n.ignoreUnknownFields);if(!1===t)continue;l[o]=t;break;case"scalar":l[o]=this.scalar(a,e.T,e.L,e.name)}}var s}enum(e,t,n,r){if("google.protobuf.NullValue"==e[0]&&N(null===t||"NULL_VALUE"===t,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} only accepts null.`),null===t)return 0;switch(typeof t){case"number":return N(Number.isInteger(t),`Unable to parse field ${this.info.typeName}#${n}, enum can only be integral number, got ${t}.`),t;case"string":let s=t;e[2]&&t.substring(0,e[2].length)===e[2]&&(s=t.substring(e[2].length));let i=e[1][s];return(void 0!==i||!r)&&(N("number"==typeof i,`Unable to parse field ${this.info.typeName}#${n}, enum ${e[0]} has no value for "${t}".`),i)}N(!1,`Unable to parse field ${this.info.typeName}#${n}, cannot parse enum value from ${typeof t}".`)}scalar(e,t,n,r){let s;try{switch(t){case g.DOUBLE:case g.FLOAT:if(null===e)return 0;if("NaN"===e)return Number.NaN;if("Infinity"===e)return Number.POSITIVE_INFINITY;if("-Infinity"===e)return Number.NEGATIVE_INFINITY;if(""===e){s="empty string";break}if("string"==typeof e&&e.trim().length!==e.length){s="extra whitespace";break}if("string"!=typeof e&&"number"!=typeof e)break;let r=Number(e);if(Number.isNaN(r)){s="not a number";break}if(!Number.isFinite(r)){s="too large or small";break}return t==g.FLOAT&&G(r),r;case g.INT32:case g.FIXED32:case g.SFIXED32:case g.SINT32:case g.UINT32:if(null===e)return 0;let i;if("number"==typeof e?i=e:""===e?s="empty string":"string"==typeof e&&(e.trim().length!==e.length?s="extra whitespace":i=Number(e)),void 0===i)break;return t==g.UINT32?V(i):B(i),i;case g.INT64:case g.SFIXED64:case g.SINT64:if(null===e)return W(U.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return W(U.from(e),n);case g.FIXED64:case g.UINT64:if(null===e)return W(A.ZERO,n);if("number"!=typeof e&&"string"!=typeof e)break;return W(A.from(e),n);case g.BOOL:if(null===e)return!1;if("boolean"!=typeof e)break;return e;case g.STRING:if(null===e)return"";if("string"!=typeof e){s="extra whitespace";break}try{encodeURIComponent(e)}catch(s){s="invalid UTF8";break}return e;case g.BYTES:if(null===e||""===e)return new Uint8Array(0);if("string"!=typeof e)break;return function(e){let t=3*e.length/4;"="==e[e.length-2]?t-=2:"="==e[e.length-1]&&(t-=1);let n,r=new Uint8Array(t),s=0,i=0,a=0;for(let t=0;t<e.length;t++){if(n=b[e.charCodeAt(t)],void 0===n)switch(e[t]){case"=":i=0;case"\n":case"\r":case"\t":case" ":continue;default:throw Error("invalid base64 string.")}switch(i){case 0:a=n,i=1;break;case 1:r[s++]=a<<2|(48&n)>>4,a=n,i=2;break;case 2:r[s++]=(15&a)<<4|(60&n)>>2,a=n,i=3;break;case 3:r[s++]=(3&a)<<6|n,i=0}}if(1==i)throw Error("invalid base64 string.");return r.subarray(0,s)}(e)}}catch(e){s=e.message}this.assert(!1,r+(s?" - "+s:""),e)}}class z{constructor(e){var t;this.fields=null!==(t=e.fields)&&void 0!==t?t:[]}write(e,t){const n={},r=e;for(const e of this.fields){if(!e.oneof){let s=this.field(e,r[e.localName],t);void 0!==s&&(n[t.useProtoFieldName?e.name:e.jsonName]=s);continue}const s=r[e.oneof];if(s.oneofKind!==e.localName)continue;const i="scalar"==e.kind||"enum"==e.kind?Object.assign(Object.assign({},t),{emitDefaultValues:!0}):t;let a=this.field(e,s[e.localName],i);N(void 0!==a),n[t.useProtoFieldName?e.name:e.jsonName]=a}return n}field(e,t,n){let r;if("map"==e.kind){N("object"==typeof t&&null!==t);const s={};switch(e.V.kind){case"scalar":for(const[n,r]of Object.entries(t)){const t=this.scalar(e.V.T,r,e.name,!1,!0);N(void 0!==t),s[n.toString()]=t}break;case"message":const r=e.V.T();for(const[i,a]of Object.entries(t)){const t=this.message(r,a,e.name,n);N(void 0!==t),s[i.toString()]=t}break;case"enum":const i=e.V.T();for(const[r,a]of Object.entries(t)){N(void 0===a||"number"==typeof a);const t=this.enum(i,a,e.name,!1,!0,n.enumAsInteger);N(void 0!==t),s[r.toString()]=t}}(n.emitDefaultValues||Object.keys(s).length>0)&&(r=s)}else if(e.repeat){N(Array.isArray(t));const s=[];switch(e.kind){case"scalar":for(let n=0;n<t.length;n++){const r=this.scalar(e.T,t[n],e.name,e.opt,!0);N(void 0!==r),s.push(r)}break;case"enum":const r=e.T();for(let i=0;i<t.length;i++){N(void 0===t[i]||"number"==typeof t[i]);const a=this.enum(r,t[i],e.name,e.opt,!0,n.enumAsInteger);N(void 0!==a),s.push(a)}break;case"message":const i=e.T();for(let r=0;r<t.length;r++){const a=this.message(i,t[r],e.name,n);N(void 0!==a),s.push(a)}}(n.emitDefaultValues||s.length>0||n.emitDefaultValues)&&(r=s)}else switch(e.kind){case"scalar":r=this.scalar(e.T,t,e.name,e.opt,n.emitDefaultValues);break;case"enum":r=this.enum(e.T(),t,e.name,e.opt,n.emitDefaultValues,n.enumAsInteger);break;case"message":r=this.message(e.T(),t,e.name,n)}return r}enum(e,t,n,r,s,i){if("google.protobuf.NullValue"==e[0])return s||r?null:void 0;if(void 0!==t){if(0!==t||s||r)return N("number"==typeof t),N(Number.isInteger(t)),i||!e[1].hasOwnProperty(t)?t:e[2]?e[2]+e[1][t]:e[1][t]}else N(r)}message(e,t,n,r){return void 0===t?r.emitDefaultValues?null:void 0:e.internalJsonWrite(t,r)}scalar(e,t,n,r,s){if(void 0===t)return void N(r);const i=s||r;switch(e){case g.INT32:case g.SFIXED32:case g.SINT32:return 0===t?i?0:void 0:(B(t),t);case g.FIXED32:case g.UINT32:return 0===t?i?0:void 0:(V(t),t);case g.FLOAT:G(t);case g.DOUBLE:return 0===t?i?0:void 0:(N("number"==typeof t),Number.isNaN(t)?"NaN":t===Number.POSITIVE_INFINITY?"Infinity":t===Number.NEGATIVE_INFINITY?"-Infinity":t);case g.STRING:return""===t?i?"":void 0:(N("string"==typeof t),t);case g.BOOL:return!1===t?!i&&void 0:(N("boolean"==typeof t),t);case g.UINT64:case g.FIXED64:N("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let e=A.from(t);if(e.isZero()&&!i)return;return e.toString();case g.INT64:case g.SFIXED64:case g.SINT64:N("number"==typeof t||"string"==typeof t||"bigint"==typeof t);let n=U.from(t);if(n.isZero()&&!i)return;return n.toString();case g.BYTES:return N(t instanceof Uint8Array),t.byteLength?function(e){let t,n="",r=0,s=0;for(let i=0;i<e.length;i++)switch(t=e[i],r){case 0:n+=w[t>>2],s=(3&t)<<4,r=1;break;case 1:n+=w[s|t>>4],s=(15&t)<<2,r=2;break;case 2:n+=w[s|t>>6],n+=w[63&t],r=0}return r&&(n+=w[s],n+="=",1==r&&(n+="=")),n}(t):i?"":void 0}}}function $(e,t=m.STRING){switch(e){case g.BOOL:return!1;case g.UINT64:case g.FIXED64:return W(A.ZERO,t);case g.INT64:case g.SFIXED64:case g.SINT64:return W(U.ZERO,t);case g.DOUBLE:case g.FLOAT:return 0;case g.BYTES:return new Uint8Array(0);case g.STRING:return"";default:return 0}}class H{constructor(e){this.info=e}prepare(){var e;if(!this.fieldNoToField){const t=null!==(e=this.info.fields)&&void 0!==e?e:[];this.fieldNoToField=new Map(t.map((e=>[e.no,e])))}}read(e,t,n,r){this.prepare();const s=void 0===r?e.len:e.pos+r;for(;e.pos<s;){const[r,s]=e.tag(),i=this.fieldNoToField.get(r);if(!i){let i=n.readUnknownField;if("throw"==i)throw new Error(`Unknown field ${r} (wire type ${s}) for ${this.info.typeName}`);let o=e.skip(s);!1!==i&&(!0===i?a.onRead:i)(this.info.typeName,t,r,s,o);continue}let l=t,c=i.repeat,d=i.localName;switch(i.oneof&&(l=l[i.oneof],l.oneofKind!==d&&(l=t[i.oneof]={oneofKind:d})),i.kind){case"scalar":case"enum":let t="enum"==i.kind?g.INT32:i.T,r="scalar"==i.kind?i.L:void 0;if(c){let n=l[d];if(s==o.LengthDelimited&&t!=g.STRING&&t!=g.BYTES){let s=e.uint32()+e.pos;for(;e.pos<s;)n.push(this.scalar(e,t,r))}else n.push(this.scalar(e,t,r))}else l[d]=this.scalar(e,t,r);break;case"message":if(c){let t=l[d],r=i.T().internalBinaryRead(e,e.uint32(),n);t.push(r)}else l[d]=i.T().internalBinaryRead(e,e.uint32(),n,l[d]);break;case"map":let[a,h]=this.mapEntry(i,e,n);l[d][a]=h}}}mapEntry(e,t,n){let r,s,i=t.uint32(),a=t.pos+i;for(;t.pos<a;){let[i,a]=t.tag();switch(i){case 1:r=e.K==g.BOOL?t.bool().toString():this.scalar(t,e.K,m.STRING);break;case 2:switch(e.V.kind){case"scalar":s=this.scalar(t,e.V.T,e.V.L);break;case"enum":s=t.int32();break;case"message":s=e.V.T().internalBinaryRead(t,t.uint32(),n)}break;default:throw new Error(`Unknown field ${i} (wire type ${a}) in map entry for ${this.info.typeName}#${e.name}`)}}if(void 0===r){let t=$(e.K);r=e.K==g.BOOL?t.toString():t}if(void 0===s)switch(e.V.kind){case"scalar":s=$(e.V.T,e.V.L);break;case"enum":s=0;break;case"message":s=e.V.T().create()}return[r,s]}scalar(e,t,n){switch(t){case g.INT32:return e.int32();case g.STRING:return e.string();case g.BOOL:return e.bool();case g.DOUBLE:return e.double();case g.FLOAT:return e.float();case g.INT64:return W(e.int64(),n);case g.UINT64:return W(e.uint64(),n);case g.FIXED64:return W(e.fixed64(),n);case g.FIXED32:return e.fixed32();case g.BYTES:return e.bytes();case g.UINT32:return e.uint32();case g.SFIXED32:return e.sfixed32();case g.SFIXED64:return W(e.sfixed64(),n);case g.SINT32:return e.sint32();case g.SINT64:return W(e.sint64(),n)}}}class j{constructor(e){this.info=e}prepare(){if(!this.fields){const e=this.info.fields?this.info.fields.concat():[];this.fields=e.sort(((e,t)=>e.no-t.no))}}write(e,t,n){this.prepare();for(const r of this.fields){let s,i,a=r.repeat,o=r.localName;if(r.oneof){const t=e[r.oneof];if(t.oneofKind!==o)continue;s=t[o],i=!0}else s=e[o],i=!1;switch(r.kind){case"scalar":case"enum":let e="enum"==r.kind?g.INT32:r.T;if(a)if(N(Array.isArray(s)),a==p.PACKED)this.packed(t,e,r.no,s);else for(const n of s)this.scalar(t,e,r.no,n,!0);else void 0===s?N(r.opt):this.scalar(t,e,r.no,s,i||r.opt);break;case"message":if(a){N(Array.isArray(s));for(const e of s)this.message(t,n,r.T(),r.no,e)}else this.message(t,n,r.T(),r.no,s);break;case"map":N("object"==typeof s&&null!==s);for(const[e,i]of Object.entries(s))this.mapEntry(t,n,r,e,i)}}let r=n.writeUnknownFields;!1!==r&&(!0===r?a.onWrite:r)(this.info.typeName,e,t)}mapEntry(e,t,n,r,s){e.tag(n.no,o.LengthDelimited),e.fork();let i=r;switch(n.K){case g.INT32:case g.FIXED32:case g.UINT32:case g.SFIXED32:case g.SINT32:i=Number.parseInt(r);break;case g.BOOL:N("true"==r||"false"==r),i="true"==r}switch(this.scalar(e,n.K,1,i,!0),n.V.kind){case"scalar":this.scalar(e,n.V.T,2,s,!0);break;case"enum":this.scalar(e,g.INT32,2,s,!0);break;case"message":this.message(e,t,n.V.T(),2,s)}e.join()}message(e,t,n,r,s){void 0!==s&&(n.internalBinaryWrite(s,e.tag(r,o.LengthDelimited).fork(),t),e.join())}scalar(e,t,n,r,s){let[i,a,o]=this.scalarInfo(t,r);o&&!s||(e.tag(n,i),e[a](r))}packed(e,t,n,r){if(!r.length)return;N(t!==g.BYTES&&t!==g.STRING),e.tag(n,o.LengthDelimited),e.fork();let[,s]=this.scalarInfo(t);for(let t=0;t<r.length;t++)e[s](r[t]);e.join()}scalarInfo(e,t){let n,r=o.Varint,s=void 0===t,i=0===t;switch(e){case g.INT32:n="int32";break;case g.STRING:i=s||!t.length,r=o.LengthDelimited,n="string";break;case g.BOOL:i=!1===t,n="bool";break;case g.UINT32:n="uint32";break;case g.DOUBLE:r=o.Bit64,n="double";break;case g.FLOAT:r=o.Bit32,n="float";break;case g.INT64:i=s||U.from(t).isZero(),n="int64";break;case g.UINT64:i=s||A.from(t).isZero(),n="uint64";break;case g.FIXED64:i=s||A.from(t).isZero(),r=o.Bit64,n="fixed64";break;case g.BYTES:i=s||!t.byteLength,r=o.LengthDelimited,n="bytes";break;case g.FIXED32:r=o.Bit32,n="fixed32";break;case g.SFIXED32:r=o.Bit32,n="sfixed32";break;case g.SFIXED64:i=s||U.from(t).isZero(),r=o.Bit64,n="sfixed64";break;case g.SINT32:n="sint32";break;case g.SINT64:i=s||U.from(t).isZero(),n="sint64"}return[r,n,s||i]}}const K={emitDefaultValues:!1,enumAsInteger:!1,useProtoFieldName:!1,prettySpaces:0},Q={ignoreUnknownFields:!1},q=Object.values;function X(e,t,n){if(t===n)return!0;if(e!==g.BYTES)return!1;let r=t,s=n;if(r.length!==s.length)return!1;for(let e=0;e<r.length;e++)if(r[e]!=s[e])return!1;return!0}function J(e,t,n){if(t.length!==n.length)return!1;for(let r=0;r<t.length;r++)if(!X(e,t[r],n[r]))return!1;return!0}function Y(e,t,n){if(t.length!==n.length)return!1;for(let r=0;r<t.length;r++)if(!e.equals(t[r],n[r]))return!1;return!0}const Z={writeUnknownFields:!0,writerFactory:()=>new ee};class ee{constructor(e){this.stack=[],this.textEncoder=null!=e?e:new TextEncoder,this.chunks=[],this.buf=[]}finish(){this.chunks.push(new Uint8Array(this.buf));let e=0;for(let t=0;t<this.chunks.length;t++)e+=this.chunks[t].length;let t=new Uint8Array(e),n=0;for(let e=0;e<this.chunks.length;e++)t.set(this.chunks[e],n),n+=this.chunks[e].length;return this.chunks=[],t}fork(){return this.stack.push({chunks:this.chunks,buf:this.buf}),this.chunks=[],this.buf=[],this}join(){let e=this.finish(),t=this.stack.pop();if(!t)throw new Error("invalid state, fork stack empty");return this.chunks=t.chunks,this.buf=t.buf,this.uint32(e.byteLength),this.raw(e)}tag(e,t){return this.uint32((e<<3|t)>>>0)}raw(e){return this.buf.length&&(this.chunks.push(new Uint8Array(this.buf)),this.buf=[]),this.chunks.push(e),this}uint32(e){for(V(e);e>127;)this.buf.push(127&e|128),e>>>=7;return this.buf.push(e),this}int32(e){return B(e),R(e,this.buf),this}bool(e){return this.buf.push(e?1:0),this}bytes(e){return this.uint32(e.byteLength),this.raw(e)}string(e){let t=this.textEncoder.encode(e);return this.uint32(t.byteLength),this.raw(t)}float(e){G(e);let t=new Uint8Array(4);return new DataView(t.buffer).setFloat32(0,e,!0),this.raw(t)}double(e){let t=new Uint8Array(8);return new DataView(t.buffer).setFloat64(0,e,!0),this.raw(t)}fixed32(e){V(e);let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,e,!0),this.raw(t)}sfixed32(e){B(e);let t=new Uint8Array(4);return new DataView(t.buffer).setInt32(0,e,!0),this.raw(t)}sint32(e){return B(e),R(e=(e<<1^e>>31)>>>0,this.buf),this}sfixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=U.from(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}fixed64(e){let t=new Uint8Array(8),n=new DataView(t.buffer),r=A.from(e);return n.setInt32(0,r.lo,!0),n.setInt32(4,r.hi,!0),this.raw(t)}int64(e){let t=U.from(e);return C(t.lo,t.hi,this.buf),this}sint64(e){let t=U.from(e),n=t.hi>>31;return C(t.lo<<1^n,(t.hi<<1|t.lo>>>31)^n,this.buf),this}uint64(e){let t=A.from(e);return C(t.lo,t.hi,this.buf),this}}const te={readUnknownField:!0,readerFactory:e=>new ne(e)};class ne{constructor(e,t){this.varint64=T,this.uint32=P,this.buf=e,this.len=e.length,this.pos=0,this.view=new DataView(e.buffer,e.byteOffset,e.byteLength),this.textDecoder=null!=t?t:new TextDecoder("utf-8",{fatal:!0,ignoreBOM:!0})}tag(){let e=this.uint32(),t=e>>>3,n=7&e;if(t<=0||n<0||n>5)throw new Error("illegal tag: field no "+t+" wire type "+n);return[t,n]}skip(e){let t=this.pos;switch(e){case o.Varint:for(;128&this.buf[this.pos++];);break;case o.Bit64:this.pos+=4;case o.Bit32:this.pos+=4;break;case o.LengthDelimited:let t=this.uint32();this.pos+=t;break;case o.StartGroup:let n;for(;(n=this.tag()[1])!==o.EndGroup;)this.skip(n);break;default:throw new Error("cant skip wire type "+e)}return this.assertBounds(),this.buf.subarray(t,this.pos)}assertBounds(){if(this.pos>this.len)throw new RangeError("premature EOF")}int32(){return 0|this.uint32()}sint32(){let e=this.uint32();return e>>>1^-(1&e)}int64(){return new U(...this.varint64())}uint64(){return new A(...this.varint64())}sint64(){let[e,t]=this.varint64(),n=-(1&e);return e=(e>>>1|(1&t)<<31)^n,t=t>>>1^n,new U(e,t)}bool(){let[e,t]=this.varint64();return 0!==e||0!==t}fixed32(){return this.view.getUint32((this.pos+=4)-4,!0)}sfixed32(){return this.view.getInt32((this.pos+=4)-4,!0)}fixed64(){return new A(this.sfixed32(),this.sfixed32())}sfixed64(){return new U(this.sfixed32(),this.sfixed32())}float(){return this.view.getFloat32((this.pos+=4)-4,!0)}double(){return this.view.getFloat64((this.pos+=8)-8,!0)}bytes(){let e=this.uint32(),t=this.pos;return this.pos+=e,this.assertBounds(),this.buf.subarray(t,t+e)}string(){return this.textDecoder.decode(this.bytes())}}class re{constructor(e,t,n){this.defaultCheckDepth=16,this.typeName=e,this.fields=t.map(f),this.options=null!=n?n:{},this.messagePrototype=Object.defineProperty({},h,{value:this}),this.refTypeCheck=new y(this),this.refJsonReader=new _(this),this.refJsonWriter=new z(this),this.refBinReader=new H(this),this.refBinWriter=new j(this)}create(e){let t=function(e){const t=e.messagePrototype?Object.create(e.messagePrototype):Object.defineProperty({},h,{value:e});for(let n of e.fields){let e=n.localName;if(!n.opt)if(n.oneof)t[n.oneof]={oneofKind:void 0};else if(n.repeat)t[e]=[];else switch(n.kind){case"scalar":t[e]=$(n.T,n.L);break;case"enum":t[e]=0;break;case"map":t[e]={}}}return t}(this);return void 0!==e&&d(this,t,e),t}clone(e){let t=this.create();return d(this,t,e),t}equals(e,t){return function(e,t,n){if(t===n)return!0;if(!t||!n)return!1;for(let r of e.fields){let e=r.localName,s=r.oneof?t[r.oneof][e]:t[e],i=r.oneof?n[r.oneof][e]:n[e];switch(r.kind){case"enum":case"scalar":let e="enum"==r.kind?g.INT32:r.T;if(!(r.repeat?J(e,s,i):X(e,s,i)))return!1;break;case"map":if(!("message"==r.V.kind?Y(r.V.T(),q(s),q(i)):J("enum"==r.V.kind?g.INT32:r.V.T,q(s),q(i))))return!1;break;case"message":let t=r.T();if(!(r.repeat?Y(t,s,i):t.equals(s,i)))return!1}}return!0}(this,e,t)}is(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!1)}isAssignable(e,t=this.defaultCheckDepth){return this.refTypeCheck.is(e,t,!0)}mergePartial(e,t){d(this,e,t)}fromBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},te),e):te}(t);return this.internalBinaryRead(n.readerFactory(e),e.byteLength,n)}fromJson(e,t){return this.internalJsonRead(e,function(e){return e?Object.assign(Object.assign({},Q),e):Q}(t))}fromJsonString(e,t){let n=JSON.parse(e);return this.fromJson(n,t)}toJson(e,t){return this.internalJsonWrite(e,function(e){return e?Object.assign(Object.assign({},K),e):K}(t))}toJsonString(e,t){var n;let r=this.toJson(e,t);return JSON.stringify(r,null,null!==(n=null==t?void 0:t.prettySpaces)&&void 0!==n?n:0)}toBinary(e,t){let n=function(e){return e?Object.assign(Object.assign({},Z),e):Z}(t);return this.internalBinaryWrite(e,n.writerFactory(),n).finish()}internalJsonRead(e,t,n){if(null!==e&&"object"==typeof e&&!Array.isArray(e)){let r=null!=n?n:this.create();return this.refJsonReader.read(e,r,t),r}throw new Error(`Unable to parse message ${this.typeName} from JSON ${S(e)}.`)}internalJsonWrite(e,t){return this.refJsonWriter.write(e,t)}internalBinaryWrite(e,t,n){return this.refBinWriter.write(e,t,n),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create();return this.refBinReader.read(e,s,n,t),s}}const se=new class extends re{constructor(){super("base_message",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ie=new class extends re{constructor(){super("peerConnectionOptions",[])}create(e){const t=globalThis.Object.create(this.messagePrototype);return void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){return null!=r?r:this.create()}internalBinaryWrite(e,t,n){let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ae=new class extends re{constructor(){super("config",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"peerConnectionOptions",kind:"message",T:()=>ie},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.peerConnectionOptions=ie.internalBinaryRead(e,e.uint32(),n,s.peerConnectionOptions);break;case 3:s.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),e.peerConnectionOptions&&ie.internalBinaryWrite(e.peerConnectionOptions,t.tag(2,o.LengthDelimited).fork(),n).join(),void 0!==e.protocolVersion&&t.tag(3,o.LengthDelimited).string(e.protocolVersion);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},oe=new class extends re{constructor(){super("identify",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},le=new class extends re{constructor(){super("endpointId",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"id",kind:"scalar",T:9},{no:3,name:"protocolVersion",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.id="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.id=e.string();break;case 3:s.protocolVersion=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.id&&t.tag(2,o.LengthDelimited).string(e.id),void 0!==e.protocolVersion&&t.tag(3,o.LengthDelimited).string(e.protocolVersion);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ce=new class extends re{constructor(){super("endpointIdConfirm",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"committedId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.committedId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.committedId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.committedId&&t.tag(2,o.LengthDelimited).string(e.committedId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},de=new class extends re{constructor(){super("streamerIdChanged",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"newID",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.newID="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.newID=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.newID&&t.tag(2,o.LengthDelimited).string(e.newID);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},he=new class extends re{constructor(){super("listStreamers",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ue=new class extends re{constructor(){super("streamerList",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"ids",kind:"scalar",repeat:2,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.ids=[],void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.ids.push(e.string());break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);for(let n=0;n<e.ids.length;n++)t.tag(2,o.LengthDelimited).string(e.ids[n]);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ge=new class extends re{constructor(){super("subscribe",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"streamerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.streamerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.streamerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.streamerId&&t.tag(2,o.LengthDelimited).string(e.streamerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},me=new class extends re{constructor(){super("unsubscribe",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},pe=new class extends re{constructor(){super("playerConnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"dataChannel",kind:"scalar",T:8},{no:3,name:"sfu",kind:"scalar",T:8},{no:4,name:"sendOffer",kind:"scalar",T:8},{no:5,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.dataChannel=!1,t.sfu=!1,t.sendOffer=!1,t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.dataChannel=e.bool();break;case 3:s.sfu=e.bool();break;case 4:s.sendOffer=e.bool();break;case 5:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),!1!==e.dataChannel&&t.tag(2,o.Varint).bool(e.dataChannel),!1!==e.sfu&&t.tag(3,o.Varint).bool(e.sfu),!1!==e.sendOffer&&t.tag(4,o.Varint).bool(e.sendOffer),""!==e.playerId&&t.tag(5,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},fe=new class extends re{constructor(){super("playerDisconnected",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ve=new class extends re{constructor(){super("offer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9},{no:4,name:"sfu",kind:"scalar",opt:!0,T:8}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sdp=e.string();break;case 3:s.playerId=e.string();break;case 4:s.sfu=e.bool();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,o.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId),void 0!==e.sfu&&t.tag(4,o.Varint).bool(e.sfu);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ye=new class extends re{constructor(){super("answer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sdp",kind:"scalar",T:9},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sdp="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sdp=e.string();break;case 3:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sdp&&t.tag(2,o.LengthDelimited).string(e.sdp),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Se=new class extends re{constructor(){super("iceCandidateData",[{no:1,name:"candidate",kind:"scalar",T:9},{no:2,name:"sdpMid",kind:"scalar",T:9},{no:3,name:"sdpMLineIndex",kind:"scalar",T:5},{no:4,name:"usernameFragment",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.candidate="",t.sdpMid="",t.sdpMLineIndex=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.candidate=e.string();break;case 2:s.sdpMid=e.string();break;case 3:s.sdpMLineIndex=e.int32();break;case 4:s.usernameFragment=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.candidate&&t.tag(1,o.LengthDelimited).string(e.candidate),""!==e.sdpMid&&t.tag(2,o.LengthDelimited).string(e.sdpMid),0!==e.sdpMLineIndex&&t.tag(3,o.Varint).int32(e.sdpMLineIndex),void 0!==e.usernameFragment&&t.tag(4,o.LengthDelimited).string(e.usernameFragment);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},we=new class extends re{constructor(){super("iceCandidate",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"candidate",kind:"message",T:()=>Se},{no:3,name:"playerId",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.candidate=Se.internalBinaryRead(e,e.uint32(),n,s.candidate);break;case 3:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),e.candidate&&Se.internalBinaryWrite(e.candidate,t.tag(2,o.LengthDelimited).fork(),n).join(),void 0!==e.playerId&&t.tag(3,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},be=new class extends re{constructor(){super("disconnectPlayer",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"reason",kind:"scalar",opt:!0,T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;case 3:s.reason=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId),void 0!==e.reason&&t.tag(3,o.LengthDelimited).string(e.reason);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Te=new class extends re{constructor(){super("ping",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,o.Varint).int32(e.time);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ce=new class extends re{constructor(){super("pong",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"time",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.time=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.time=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.time&&t.tag(2,o.Varint).int32(e.time);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ee=new class extends re{constructor(){super("streamerDisconnected",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},ke=new class extends re{constructor(){super("layerPreference",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"spatialLayer",kind:"scalar",T:5},{no:3,name:"temporalLayer",kind:"scalar",T:5},{no:4,name:"playerId",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.spatialLayer=0,t.temporalLayer=0,t.playerId="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.spatialLayer=e.int32();break;case 3:s.temporalLayer=e.int32();break;case 4:s.playerId=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.spatialLayer&&t.tag(2,o.Varint).int32(e.spatialLayer),0!==e.temporalLayer&&t.tag(3,o.Varint).int32(e.temporalLayer),""!==e.playerId&&t.tag(4,o.LengthDelimited).string(e.playerId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Me=new class extends re{constructor(){super("dataChannelRequest",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Re=new class extends re{constructor(){super("peerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"playerId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.playerId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.playerId=e.string();break;case 3:s.sendStreamId=e.int32();break;case 4:s.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.playerId&&t.tag(2,o.LengthDelimited).string(e.playerId),0!==e.sendStreamId&&t.tag(3,o.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,o.Varint).int32(e.recvStreamId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Pe=new class extends re{constructor(){super("peerDataChannelsReady",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Le=new class extends re{constructor(){super("streamerDataChannels",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"sfuId",kind:"scalar",T:9},{no:3,name:"sendStreamId",kind:"scalar",T:5},{no:4,name:"recvStreamId",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.sfuId="",t.sendStreamId=0,t.recvStreamId=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.sfuId=e.string();break;case 3:s.sendStreamId=e.int32();break;case 4:s.recvStreamId=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.sfuId&&t.tag(2,o.LengthDelimited).string(e.sfuId),0!==e.sendStreamId&&t.tag(3,o.Varint).int32(e.sendStreamId),0!==e.recvStreamId&&t.tag(4,o.Varint).int32(e.recvStreamId);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Ie=new class extends re{constructor(){super("startStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Fe=new class extends re{constructor(){super("stopStreaming",[{no:1,name:"type",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();if(1===t)s.type=e.string();else{let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},Oe=new class extends re{constructor(){super("playerCount",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"count",kind:"scalar",T:5}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.count=0,void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.count=e.int32();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),0!==e.count&&t.tag(2,o.Varint).int32(e.count);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},xe=new class extends re{constructor(){super("stats",[{no:1,name:"type",kind:"scalar",T:9},{no:2,name:"data",kind:"scalar",T:9}])}create(e){const t=globalThis.Object.create(this.messagePrototype);return t.type="",t.data="",void 0!==e&&d(this,t,e),t}internalBinaryRead(e,t,n,r){let s=null!=r?r:this.create(),i=e.pos+t;for(;e.pos<i;){let[t,r]=e.tag();switch(t){case 1:s.type=e.string();break;case 2:s.data=e.string();break;default:let i=n.readUnknownField;if("throw"===i)throw new globalThis.Error(`Unknown field ${t} (wire type ${r}) for ${this.typeName}`);let o=e.skip(r);!1!==i&&(!0===i?a.onRead:i)(this.typeName,s,t,r,o)}}return s}internalBinaryWrite(e,t,n){""!==e.type&&t.tag(1,o.LengthDelimited).string(e.type),""!==e.data&&t.tag(2,o.LengthDelimited).string(e.data);let r=n.writeUnknownFields;return!1!==r&&(1==r?a.onWrite:r)(this.typeName,e,t),t}},De={answer:ye,config:ae,disconnectPlayer:be,endpointId:le,endpointIdConfirm:ce,iceCandidate:we,identify:oe,listStreamers:he,offer:ve,ping:Te,playerConnected:pe,playerCount:Oe,playerDisconnected:fe,pong:Ce,stats:xe,streamerDisconnected:Ee,streamerList:ue,subscribe:ge,unsubscribe:me,layerPreference:ke,dataChannelRequest:Me,peerDataChannels:Re,peerDataChannelsReady:Pe,streamerDataChannels:Le,startStreaming:Ie,stopStreaming:Fe};function Ae(e,t){const n=e.create();return n.type=e.typeName,t&&e.mergePartial(n,t),n}function Ue(e){let t=!0;if(!e.type)return i.Error(i.GetStackTrace(),`Parsed message has no type. Rejected. ${JSON.stringify(e)}`),null;const n=De[e.type];if(!n)return i.Error(i.GetStackTrace(),`Message is of an unknown type: "${e.type}". Rejected.`),null;if(n.fields)for(const r of n.fields)r.opt||Object.prototype.hasOwnProperty.call(e,r.name)||(i.Error(i.GetStackTrace(),`Message "${e.type}"" is missing required field "${r.name}". Rejected.`),t=!1);for(const r in e)n.fields.find((e=>e.name===r))||(i.Error(i.GetStackTrace(),`Message "${e.type}" contains unknown field "${r}". Rejected.`),t=!1);return t?n:null}class Ne extends l.EventEmitter{static get SIGNALLING_VERSION(){return"1.1.1"}constructor(e){super(),this.transport=e,e.onMessage=t=>{if(t.type==Te.typeName){const t=Ae(Ce,{time:(new Date).getTime()});e.sendMessage(t)}e.emit("message",t),this.emit(t.type,t)}}connect(e){return this.transport.connect(e)}disconnect(e,t){this.transport.disconnect(e,t)}isConnected(){return this.transport.isConnected()}sendMessage(e){this.transport.sendMessage(e),this.transport.emit("out",e)}}class Be{constructor(e){this.videoElementProvider=e,this.audioElement=document.createElement("Audio"),this.videoElementProvider.setAudioElement(this.audioElement)}handleOnTrack(e){if(i.Log(i.GetStackTrace(),"handleOnTrack "+JSON.stringify(e.streams),6),e.streams.length<1||"probator"==e.streams[0].id)return;const t=this.videoElementProvider.getVideoElement();if(e.track&&i.Log(i.GetStackTrace(),"Got track - "+e.track.kind+" id="+e.track.id+" readyState="+e.track.readyState,6),"audio"!=e.track.kind)return"video"==e.track.kind&&t.srcObject!==e.streams[0]?(t.srcObject=e.streams[0],void i.Log(i.GetStackTrace(),"Set video source from video track ontrack.")):void 0;this.CreateAudioTrack(e.streams[0])}CreateAudioTrack(e){const t=this.videoElementProvider.getVideoElement();t.srcObject!=e&&t.srcObject&&t.srcObject!==e&&(this.audioElement.srcObject=e,i.Log(i.GetStackTrace(),"Created new audio element to play separate audio stream."))}}class Ve{constructor(e){this.freezeFrameHeight=0,this.freezeFrameWidth=0,this.rootDiv=e,this.rootElement=document.createElement("div"),this.rootElement.id="freezeFrame",this.rootElement.style.display="none",this.rootElement.style.pointerEvents="none",this.rootElement.style.position="absolute",this.rootElement.style.zIndex="20",this.imageElement=document.createElement("img"),this.imageElement.style.position="absolute",this.rootElement.appendChild(this.imageElement),this.rootDiv.appendChild(this.rootElement)}setElementForShow(){this.rootElement.style.display="block"}setElementForHide(){this.rootElement.style.display="none"}updateImageElementSource(e){const t=btoa(e.reduce(((e,t)=>e+String.fromCharCode(t)),""));this.imageElement.src="data:image/jpeg;base64,"+t}setDimensionsFromElementAndResize(){this.freezeFrameHeight=this.imageElement.naturalHeight,this.freezeFrameWidth=this.imageElement.naturalWidth,this.resize()}resize(){if(0!==this.freezeFrameWidth&&0!==this.freezeFrameHeight){let e=0,t=0,n=0,r=0;const s=this.rootDiv.clientWidth/this.rootDiv.clientHeight,i=this.freezeFrameWidth/this.freezeFrameHeight;s<i?(e=this.rootDiv.clientWidth,t=Math.floor(this.rootDiv.clientWidth/i),n=Math.floor(.5*(this.rootDiv.clientHeight-t)),r=0):(e=Math.floor(this.rootDiv.clientHeight*i),t=this.rootDiv.clientHeight,n=0,r=Math.floor(.5*(this.rootDiv.clientWidth-e))),this.rootElement.style.width=this.rootDiv.offsetWidth+"px",this.rootElement.style.height=this.rootDiv.offsetHeight+"px",this.rootElement.style.left="0px",this.rootElement.style.top="0px",this.imageElement.style.width=e+"px",this.imageElement.style.height=t+"px",this.imageElement.style.left=r+"px",this.imageElement.style.top=n+"px"}}}class Ge{constructor(e){this.receiving=!1,this.size=0,this.jpeg=void 0,this.valid=!1,this.freezeFrameDelay=50,this.freezeFrame=new Ve(e)}showFreezeFrame(){this.valid&&this.freezeFrame.setElementForShow()}hideFreezeFrame(){this.valid=!1,this.freezeFrame.setElementForHide()}updateFreezeFrameAndShow(e,t){this.freezeFrame.updateImageElementSource(e),this.freezeFrame.imageElement.onload=()=>{this.freezeFrame.setDimensionsFromElementAndResize(),t()}}processFreezeFrameMessage(e,t){this.receiving||(this.receiving=!0,this.valid=!1,this.size=0,this.jpeg=void 0),this.size=new DataView(e.slice(1,5).buffer).getInt32(0,!0);const n=e.slice(5);if(this.jpeg){const e=new Uint8Array(this.jpeg.length+n.length);e.set(this.jpeg,0),e.set(n,this.jpeg.length),this.jpeg=e}else this.jpeg=n,this.receiving=!0,i.Log(i.GetStackTrace(),`received first chunk of freeze frame: ${this.jpeg.length}/${this.size}`,6);this.jpeg.length===this.size?(this.receiving=!1,this.valid=!0,i.Log(i.GetStackTrace(),`received complete freeze frame ${this.size}`,6),this.updateFreezeFrameAndShow(this.jpeg,t)):this.jpeg.length>this.size&&(i.Error(i.GetStackTrace(),`received bigger freeze frame than advertised: ${this.jpeg.length}/${this.size}`),this.jpeg=void 0,this.receiving=!1)}}class We{constructor(e,t,n,r,s=(()=>{})){this.onChange=s,this.onChangeEmit=()=>{},this.id=e,this.description=n,this.label=t,this.value=r}set label(e){this._label=e,this.onChangeEmit(this._value)}get label(){return this._label}get value(){return this._value}set value(e){this._value=e,this.onChange(this._value,this),this.onChangeEmit(this._value)}}class _e extends We{constructor(e,t,n,r,s,i=(()=>{})){super(e,t,n,r,i);const a=new URLSearchParams(window.location.search);if(s&&a.has(this.id)){const e=this.getUrlParamFlag();this.flag=e}else this.flag=r;this.useUrlParams=s}getUrlParamFlag(){const e=new URLSearchParams(window.location.search);return!!e.has(this.id)&&"false"!==e.get(this.id)&&"False"!==e.get(this.id)}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);!0===this.flag?e.set(this.id,"true"):e.set(this.id,"false"),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}enable(){this.flag=!0}get flag(){return!!this.value}set flag(e){this.value=e}}class ze extends We{constructor(e,t,n,r,s,i,a,o=(()=>{})){super(e,t,n,i,o),this._min=r,this._max=s;const l=new URLSearchParams(window.location.search);if(a&&l.has(this.id)){const e=Number.parseFloat(l.get(this.id));this.number=Number.isNaN(e)?i:e}else this.number=i;this.useUrlParams=a}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.number.toString()),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}set number(e){this.value=this.clamp(e)}get number(){return this.value}clamp(e){return Math.max(Math.min(this._max,e),this._min)}get min(){return this._min}get max(){return this._max}addOnChangedListener(e){this.onChange=e}}class $e extends We{constructor(e,t,n,r,s,i=(()=>{})){super(e,t,n,r,i);const a=new URLSearchParams(window.location.search);if(s&&a.has(this.id)){const e=this.getUrlParamText();this.text=e}else this.text=r;this.useUrlParams=s}getUrlParamText(){var e;const t=new URLSearchParams(window.location.search);return t.has(this.id)&&null!==(e=t.get(this.id))&&void 0!==e?e:""}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.text),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}get text(){return this.value}set text(e){this.value=e}}class He extends We{constructor(e,t,n,r,s,i,a=(()=>{})){super(e,t,n,r,a),this.options=s;const o=new URLSearchParams(window.location.search),l=i&&o.has(this.id)?this.getUrlParamText():r;this.selected=l,this.useUrlParams=i}getUrlParamText(){var e;const t=new URLSearchParams(window.location.search);return t.has(this.id)&&null!==(e=t.get(this.id))&&void 0!==e?e:""}updateURLParams(){if(this.useUrlParams){const e=new URLSearchParams(window.location.search);e.set(this.id,this.selected),window.history.replaceState({},"",""!==e.toString()?`${location.pathname}?${e}`:`${location.pathname}`)}}addOnChangedListener(e){this.onChange=e}get options(){return this._options}set options(e){this._options=e,this.onChangeEmit(this.selected)}get selected(){return this.value}set selected(e){let t=this.options.filter((t=>-1!==t.indexOf(e)));t.length?this.value=t[0]:(t=this.options.filter((t=>-1!==t.indexOf(e.split(" ")[0]))),t.length&&(this.value=t[0]))}}class je extends Event{constructor(e){super("afkWarningActivate"),this.data=e}}class Ke extends Event{constructor(e){super("afkWarningUpdate"),this.data=e}}class Qe extends Event{constructor(){super("afkWarningDeactivate")}}class qe extends Event{constructor(){super("afkTimedOut")}}class Xe extends Event{constructor(e){super("videoEncoderAvgQP"),this.data=e}}class Je extends Event{constructor(){super("webRtcSdp")}}class Ye extends Event{constructor(){super("webRtcAutoConnect")}}class Ze extends Event{constructor(){super("webRtcConnecting")}}class et extends Event{constructor(){super("webRtcConnected")}}class tt extends Event{constructor(){super("webRtcFailed")}}class nt extends Event{constructor(e){super("webRtcDisconnected"),this.data=e}}class rt extends Event{constructor(e){super("dataChannelOpen"),this.data=e}}class st extends Event{constructor(e){super("dataChannelClose"),this.data=e}}class it extends Event{constructor(e){super("dataChannelError"),this.data=e}}class at extends Event{constructor(){super("videoInitialized")}}class ot extends Event{constructor(){super("streamLoading")}}class lt extends Event{constructor(){super("streamConnect")}}class ct extends Event{constructor(){super("streamDisconnect")}}class dt extends Event{constructor(){super("streamReconnect")}}class ht extends Event{constructor(e){super("playStreamError"),this.data=e}}class ut extends Event{constructor(){super("playStream")}}class gt extends Event{constructor(e){super("playStreamRejected"),this.data=e}}class mt extends Event{constructor(e){super("loadFreezeFrame"),this.data=e}}class pt extends Event{constructor(){super("hideFreezeFrame")}}class ft extends Event{constructor(e){super("statsReceived"),this.data=e}}class vt extends Event{constructor(e){super("streamerListMessage"),this.data=e}}class yt extends Event{constructor(e){super("StreamerIDChangedMessage"),this.data=e}}class St extends Event{constructor(e){super("latencyTestResult"),this.data=e}}class wt extends Event{constructor(e){super("dataChannelLatencyTestResponse"),this.data=e}}class bt extends Event{constructor(e){super("dataChannelLatencyTestResult"),this.data=e}}class Tt extends Event{constructor(e){super("initialSettings"),this.data=e}}class Ct extends Event{constructor(e){super("settingsChanged"),this.data=e}}class Et extends Event{constructor(){super("xrSessionStarted")}}class kt extends Event{constructor(){super("xrSessionEnded")}}class Mt extends Event{constructor(e){super("xrFrame"),this.data=e}}class Rt extends Event{constructor(e){super("playerCount"),this.data=e}}class Pt extends Event{constructor(){super("webRtcTCPRelayDetected")}}class Lt extends EventTarget{dispatchEvent(e){return super.dispatchEvent(e)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}}class It{}It.AutoConnect="AutoConnect",It.AutoPlayVideo="AutoPlayVideo",It.AFKDetection="TimeoutIfIdle",It.BrowserSendOffer="OfferToReceive",It.HoveringMouseMode="HoveringMouse",It.ForceMonoAudio="ForceMonoAudio",It.ForceTURN="ForceTURN",It.FakeMouseWithTouches="FakeMouseWithTouches",It.IsQualityController="ControlsQuality",It.MatchViewportResolution="MatchViewportRes",It.StartVideoMuted="StartVideoMuted",It.SuppressBrowserKeys="SuppressBrowserKeys",It.UseMic="UseMic",It.KeyboardInput="KeyboardInput",It.MouseInput="MouseInput",It.TouchInput="TouchInput",It.GamepadInput="GamepadInput",It.XRControllerInput="XRControllerInput",It.WaitForStreamer="WaitForStreamer",It.HideUI="HideUI";const Ft=e=>Object.getOwnPropertyNames(It).some((t=>It[t]===e));class Ot{}Ot.AFKTimeoutSecs="AFKTimeout",Ot.MinQP="MinQP",Ot.MaxQP="MaxQP",Ot.WebRTCFPS="WebRTCFPS",Ot.WebRTCMinBitrate="WebRTCMinBitrate",Ot.WebRTCMaxBitrate="WebRTCMaxBitrate",Ot.MaxReconnectAttempts="MaxReconnectAttempts",Ot.StreamerAutoJoinInterval="StreamerAutoJoinInterval";const xt=e=>Object.getOwnPropertyNames(Ot).some((t=>Ot[t]===e));class Dt{}Dt.SignallingServerUrl="ss";const At=e=>Object.getOwnPropertyNames(Dt).some((t=>Dt[t]===e));class Ut{}Ut.PreferredCodec="PreferredCodec",Ut.StreamerId="StreamerId";const Nt=e=>Object.getOwnPropertyNames(Ut).some((t=>Ut[t]===e));class Bt{constructor(e={}){this.flags=new Map,this.numericParameters=new Map,this.textParameters=new Map,this.optionParameters=new Map;const{initialSettings:t,useUrlParams:n}=e;this._useUrlParams=!!n,this.populateDefaultSettings(this._useUrlParams,t)}get useUrlParams(){return this._useUrlParams}populateDefaultSettings(e,t){this.textParameters.set(Dt.SignallingServerUrl,new $e(Dt.SignallingServerUrl,"Signalling url","Url of the signalling server",t&&Object.prototype.hasOwnProperty.call(t,Dt.SignallingServerUrl)?t[Dt.SignallingServerUrl]:("https:"===location.protocol?"wss://":"ws://")+window.location.hostname+("80"===window.location.port||""===window.location.port?"":`:${window.location.port}`),e)),this.optionParameters.set(Ut.StreamerId,new He(Ut.StreamerId,"Streamer ID","The ID of the streamer to stream.",t&&Object.prototype.hasOwnProperty.call(t,Ut.StreamerId)?t[Ut.StreamerId]:"",[],e)),this.optionParameters.set(Ut.PreferredCodec,new He(Ut.PreferredCodec,"Preferred Codec","The preferred codec to be used during codec negotiation","H264 level-asymmetry-allowed=1;packetization-mode=1;profile-level-id=42e01f",t&&Object.prototype.hasOwnProperty.call(t,Ut.PreferredCodec)?[t[Ut.PreferredCodec]]:function(){const e=[];if(!RTCRtpReceiver.getCapabilities)return e.push("Only available on Chrome"),e;const t=/(VP\d|H26\d|AV1).*/;return RTCRtpReceiver.getCapabilities("video").codecs.forEach((n=>{const r=n.mimeType.split("/")[1]+" "+(n.sdpFmtpLine||"");null!==t.exec(r)&&e.push(r)})),e}(),e)),this.flags.set(It.AutoConnect,new _e(It.AutoConnect,"Auto connect to stream","Whether we should attempt to auto connect to the signalling server or show a click to start prompt.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.AutoConnect))&&t[It.AutoConnect],e)),this.flags.set(It.AutoPlayVideo,new _e(It.AutoPlayVideo,"Auto play video","When video is ready automatically start playing it as opposed to showing a play button.",!t||!Object.prototype.hasOwnProperty.call(t,It.AutoPlayVideo)||t[It.AutoPlayVideo],e)),this.flags.set(It.BrowserSendOffer,new _e(It.BrowserSendOffer,"Browser send offer","Browser will initiate the WebRTC handshake by sending the offer to the streamer",!(!t||!Object.prototype.hasOwnProperty.call(t,It.BrowserSendOffer))&&t[It.BrowserSendOffer],e)),this.flags.set(It.UseMic,new _e(It.UseMic,"Use microphone","Make browser request microphone access and open an input audio track.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.UseMic))&&t[It.UseMic],e)),this.flags.set(It.StartVideoMuted,new _e(It.StartVideoMuted,"Start video muted","Video will start muted if true.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.StartVideoMuted))&&t[It.StartVideoMuted],e)),this.flags.set(It.SuppressBrowserKeys,new _e(It.SuppressBrowserKeys,"Suppress browser keys","Suppress certain browser keys that we use in UE, for example F5 to show shader complexity instead of refresh the page.",!t||!Object.prototype.hasOwnProperty.call(t,It.SuppressBrowserKeys)||t[It.SuppressBrowserKeys],e)),this.flags.set(It.IsQualityController,new _e(It.IsQualityController,"Is quality controller?","True if this peer controls stream quality",!t||!Object.prototype.hasOwnProperty.call(t,It.IsQualityController)||t[It.IsQualityController],e)),this.flags.set(It.ForceMonoAudio,new _e(It.ForceMonoAudio,"Force mono audio","Force browser to request mono audio in the SDP",!(!t||!Object.prototype.hasOwnProperty.call(t,It.ForceMonoAudio))&&t[It.ForceMonoAudio],e)),this.flags.set(It.ForceTURN,new _e(It.ForceTURN,"Force TURN","Only generate TURN/Relayed ICE candidates.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.ForceTURN))&&t[It.ForceTURN],e)),this.flags.set(It.AFKDetection,new _e(It.AFKDetection,"AFK if idle","Timeout the experience if user is AFK for a period.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.AFKDetection))&&t[It.AFKDetection],e)),this.flags.set(It.MatchViewportResolution,new _e(It.MatchViewportResolution,"Match viewport resolution","Pixel Streaming will be instructed to dynamically resize the video stream to match the size of the video element.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.MatchViewportResolution))&&t[It.MatchViewportResolution],e)),this.flags.set(It.HoveringMouseMode,new _e(It.HoveringMouseMode,"Control Scheme: Locked Mouse","Either locked mouse, where the pointer is consumed by the video and locked to it, or hovering mouse, where the mouse is not consumed.",!(!t||!Object.prototype.hasOwnProperty.call(t,It.HoveringMouseMode))&&t[It.HoveringMouseMode],e,((e,t)=>{t.label=`Control Scheme: ${e?"Hovering":"Locked"} Mouse`}))),this.flags.set(It.FakeMouseWithTouches,new _e(It.FakeMouseWithTouches,"Fake mouse with touches","A single finger touch is converted into a mouse event. This allows a non-touch application to be controlled partially via a touch device.",!t||!Object.prototype.hasOwnProperty.call(t,It.FakeMouseWithTouches)||t[It.FakeMouseWithTouches],e)),this.flags.set(It.KeyboardInput,new _e(It.KeyboardInput,"Keyboard input","If enabled, send keyboard events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,It.KeyboardInput)||t[It.KeyboardInput],e)),this.flags.set(It.MouseInput,new _e(It.MouseInput,"Mouse input","If enabled, send mouse events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,It.MouseInput)||t[It.MouseInput],e)),this.flags.set(It.TouchInput,new _e(It.TouchInput,"Touch input","If enabled, send touch events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,It.TouchInput)||t[It.TouchInput],e)),this.flags.set(It.GamepadInput,new _e(It.GamepadInput,"Gamepad input","If enabled, send gamepad events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,It.GamepadInput)||t[It.GamepadInput],e)),this.flags.set(It.XRControllerInput,new _e(It.XRControllerInput,"XR controller input","If enabled, send XR controller events to streamer",!t||!Object.prototype.hasOwnProperty.call(t,It.XRControllerInput)||t[It.XRControllerInput],e)),this.flags.set(It.WaitForStreamer,new _e(It.WaitForStreamer,"Wait for streamer","Will continue trying to connect to the first streamer available.",!t||!Object.prototype.hasOwnProperty.call(t,It.WaitForStreamer)||t[It.WaitForStreamer],e)),this.flags.set(It.HideUI,new _e(It.HideUI,"Hide the UI overlay","Will hide all UI overlay details",!(!t||!Object.prototype.hasOwnProperty.call(t,It.HideUI))&&t[It.HideUI],e)),this.numericParameters.set(Ot.AFKTimeoutSecs,new ze(Ot.AFKTimeoutSecs,"AFK timeout","The time (in seconds) it takes for the application to time out if AFK timeout is enabled.",0,600,t&&Object.prototype.hasOwnProperty.call(t,Ot.AFKTimeoutSecs)?t[Ot.AFKTimeoutSecs]:120,e)),this.numericParameters.set(Ot.MaxReconnectAttempts,new ze(Ot.MaxReconnectAttempts,"Max Reconnects","Maximum number of reconnects the application will attempt when a streamer disconnects.",0,999,t&&Object.prototype.hasOwnProperty.call(t,Ot.MaxReconnectAttempts)?t[Ot.MaxReconnectAttempts]:3,e)),this.numericParameters.set(Ot.MinQP,new ze(Ot.MinQP,"Min QP","The lower bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,Ot.MinQP)?t[Ot.MinQP]:0,e)),this.numericParameters.set(Ot.MaxQP,new ze(Ot.MaxQP,"Max QP","The upper bound for the quantization parameter (QP) of the encoder. 0 = Best quality, 51 = worst quality.",0,51,t&&Object.prototype.hasOwnProperty.call(t,Ot.MaxQP)?t[Ot.MaxQP]:51,e)),this.numericParameters.set(Ot.WebRTCFPS,new ze(Ot.WebRTCFPS,"Max FPS","The maximum FPS that WebRTC will try to transmit frames at.",1,999,t&&Object.prototype.hasOwnProperty.call(t,Ot.WebRTCFPS)?t[Ot.WebRTCFPS]:60,e)),this.numericParameters.set(Ot.WebRTCMinBitrate,new ze(Ot.WebRTCMinBitrate,"Min Bitrate (kbps)","The minimum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,Ot.WebRTCMinBitrate)?t[Ot.WebRTCMinBitrate]:0,e)),this.numericParameters.set(Ot.WebRTCMaxBitrate,new ze(Ot.WebRTCMaxBitrate,"Max Bitrate (kbps)","The maximum bitrate that WebRTC should use.",0,5e5,t&&Object.prototype.hasOwnProperty.call(t,Ot.WebRTCMaxBitrate)?t[Ot.WebRTCMaxBitrate]:0,e)),this.numericParameters.set(Ot.StreamerAutoJoinInterval,new ze(Ot.StreamerAutoJoinInterval,"Streamer Auto Join Interval (ms)","Delay between retries when waiting for an available streamer.",500,9e5,t&&Object.prototype.hasOwnProperty.call(t,Ot.StreamerAutoJoinInterval)?t[Ot.StreamerAutoJoinInterval]:3e3,e))}_addOnNumericSettingChangedListener(e,t){this.numericParameters.has(e)&&this.numericParameters.get(e).addOnChangedListener(t)}_addOnOptionSettingChangedListener(e,t){this.optionParameters.has(e)&&this.optionParameters.get(e).addOnChangedListener(t)}getNumericSettingValue(e){if(this.numericParameters.has(e))return this.numericParameters.get(e).number;throw new Error(`There is no numeric setting with the id of ${e}`)}getTextSettingValue(e){if(this.textParameters.has(e))return this.textParameters.get(e).value;throw new Error(`There is no numeric setting with the id of ${e}`)}setNumericSetting(e,t){if(!this.numericParameters.has(e))throw new Error(`There is no numeric setting with the id of ${e}`);this.numericParameters.get(e).number=t}_addOnSettingChangedListener(e,t){this.flags.has(e)&&(this.flags.get(e).onChange=t)}_addOnTextSettingChangedListener(e,t){this.textParameters.has(e)&&(this.textParameters.get(e).onChange=t)}getSettingOption(e){return this.optionParameters.get(e)}isFlagEnabled(e){return this.flags.get(e).flag}setFlagEnabled(e,t){this.flags.has(e)?this.flags.get(e).flag=t:i.Warning(i.GetStackTrace(),`Cannot toggle flag called ${e} - it does not exist in the Config.flags map.`)}setTextSetting(e,t){this.textParameters.has(e)?this.textParameters.get(e).text=t:i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.textParameters map.`)}setOptionSettingOptions(e,t){this.optionParameters.has(e)?this.optionParameters.get(e).options=t:i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.optionParameters map.`)}setOptionSettingValue(e,t){if(this.optionParameters.has(e)){const n=this.optionParameters.get(e),r=n.options;r.includes(t)||(r.push(t),n.options=r),n.selected=t}else i.Warning(i.GetStackTrace(),`Cannot set text setting called ${e} - it does not exist in the Config.enumParameters map.`)}setFlagLabel(e,t){this.flags.has(e)?this.flags.get(e).label=t:i.Warning(i.GetStackTrace(),`Cannot set label for flag called ${e} - it does not exist in the Config.flags map.`)}setSettings(e){for(const t of Object.keys(e))Ft(t)?this.setFlagEnabled(t,e[t]):xt(t)?this.setNumericSetting(t,e[t]):At(t)?this.setTextSetting(t,e[t]):Nt(t)&&this.setOptionSettingValue(t,e[t])}getSettings(){const e={};for(const[t,n]of this.flags.entries())e[t]=n.flag;for(const[t,n]of this.numericParameters.entries())e[t]=n.number;for(const[t,n]of this.textParameters.entries())e[t]=n.text;for(const[t,n]of this.optionParameters.entries())e[t]=n.selected;return e}getFlags(){return Array.from(this.flags.values())}getTextSettings(){return Array.from(this.textParameters.values())}getNumericSettings(){return Array.from(this.numericParameters.values())}getOptionSettings(){return Array.from(this.optionParameters.values())}_registerOnChangeEvents(e){for(const t of this.flags.keys()){const n=this.flags.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"flag",value:t,target:n})))}for(const t of this.numericParameters.keys()){const n=this.numericParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"number",value:t,target:n})))}for(const t of this.textParameters.keys()){const n=this.textParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"text",value:t,target:n})))}for(const t of this.optionParameters.keys()){const n=this.optionParameters.get(t);n&&(n.onChangeEmit=t=>e.dispatchEvent(new Ct({id:n.id,type:"option",value:t,target:n})))}}}var Vt;!function(e){e[e.LockedMouse=0]="LockedMouse",e[e.HoveringMouse=1]="HoveringMouse"}(Vt||(Vt={}));class Gt{constructor(e,t,n){this.closeTimeout=10,this.active=!1,this.countdownActive=!1,this.warnTimer=void 0,this.countDown=0,this.countDownTimer=void 0,this.config=e,this.pixelStreaming=t,this.onDismissAfk=n,this.onAFKTimedOutCallback=()=>{console.log("AFK timed out, did you want to override this callback?")}}onAfkClick(){clearInterval(this.countDownTimer),(this.active||this.countdownActive)&&(this.startAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new Qe))}startAfkWarningTimer(){this.config.getNumericSettingValue(Ot.AFKTimeoutSecs)>0&&this.config.isFlagEnabled(It.AFKDetection)?this.active=!0:this.active=!1,this.resetAfkWarningTimer()}stopAfkWarningTimer(){this.active=!1,this.countdownActive=!1,clearTimeout(this.warnTimer),clearInterval(this.countDownTimer)}pauseAfkWarningTimer(){this.active=!1}resetAfkWarningTimer(){this.active&&this.config.isFlagEnabled(It.AFKDetection)&&(clearTimeout(this.warnTimer),this.warnTimer=setTimeout((()=>this.activateAfkEvent()),1e3*this.config.getNumericSettingValue(Ot.AFKTimeoutSecs)))}activateAfkEvent(){this.pauseAfkWarningTimer(),this.pixelStreaming.dispatchEvent(new je({countDown:this.countDown,dismissAfk:this.onDismissAfk})),this.countDown=this.closeTimeout,this.countdownActive=!0,this.pixelStreaming.dispatchEvent(new Ke({countDown:this.countDown})),this.config.isFlagEnabled(It.HoveringMouseMode)||document.exitPointerLock&&document.exitPointerLock(),this.countDownTimer=setInterval((()=>{this.countDown--,0==this.countDown?(this.pixelStreaming.dispatchEvent(new qe),this.onAFKTimedOutCallback(),i.Log(i.GetStackTrace(),"You have been disconnected due to inactivity"),this.stopAfkWarningTimer()):this.pixelStreaming.dispatchEvent(new Ke({countDown:this.countDown}))}),1e3)}}class Wt{constructor(){this.isReceivingFreezeFrame=!1}getDataChannelInstance(){return this}createDataChannel(e,t,n){this.peerConnection=e,this.label=t,this.datachannelOptions=n,null==n&&(this.datachannelOptions={},this.datachannelOptions.ordered=!0),this.dataChannel=this.peerConnection.createDataChannel(this.label,this.datachannelOptions),this.setupDataChannel()}setupDataChannel(){this.dataChannel.binaryType="arraybuffer",this.dataChannel.onopen=e=>this.handleOnOpen(e),this.dataChannel.onclose=e=>this.handleOnClose(e),this.dataChannel.onmessage=e=>this.handleOnMessage(e),this.dataChannel.onerror=e=>this.handleOnError(e)}handleOnOpen(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) opened.`,7),this.onOpen(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnClose(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) closed.`,7),this.onClose(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}handleOnMessage(e){i.Log(i.GetStackTrace(),`Data Channel (${this.label}) message: ${e}`,8)}handleOnError(e){var t;i.Log(i.GetStackTrace(),`Data Channel (${this.label}) error: ${e}`,7),this.onError(null===(t=this.dataChannel)||void 0===t?void 0:t.label,e)}onOpen(e,t){}onClose(e,t){}onError(e,t){}}class _t{}class zt{}class $t{}class Ht{}class jt{}class Kt{}class Qt{}class qt{constructor(){this.inboundVideoStats=new zt,this.inboundAudioStats=new _t,this.DataChannelStats=new $t,this.outBoundVideoStats=new jt,this.sessionStats=new Kt,this.streamStats=new Qt,this.codecs=new Map}processStats(e){this.localCandidates=new Array,this.remoteCandidates=new Array,this.candidatePairs=new Array,e.forEach((e=>{switch(e.type){case"candidate-pair":this.handleCandidatePair(e);break;case"certificate":case"media-source":case"media-playout":case"outbound-rtp":case"peer-connection":case"remote-inbound-rtp":break;case"codec":this.handleCodec(e);break;case"data-channel":this.handleDataChannel(e);break;case"inbound-rtp":this.handleInBoundRTP(e);break;case"local-candidate":this.handleLocalCandidate(e);break;case"remote-candidate":this.handleRemoteCandidate(e);break;case"remote-outbound-rtp":this.handleRemoteOutBound(e);break;case"track":this.handleTrack(e);break;case"transport":this.handleTransport(e);break;case"stream":this.handleStream(e);break;default:i.Error(i.GetStackTrace(),"unhandled Stat Type"),i.Log(i.GetStackTrace(),e)}}))}handleStream(e){this.streamStats=e}handleCandidatePair(e){this.candidatePairs.push(e)}handleDataChannel(e){this.DataChannelStats.bytesReceived=e.bytesReceived,this.DataChannelStats.bytesSent=e.bytesSent,this.DataChannelStats.dataChannelIdentifier=e.dataChannelIdentifier,this.DataChannelStats.id=e.id,this.DataChannelStats.label=e.label,this.DataChannelStats.messagesReceived=e.messagesReceived,this.DataChannelStats.messagesSent=e.messagesSent,this.DataChannelStats.protocol=e.protocol,this.DataChannelStats.state=e.state,this.DataChannelStats.timestamp=e.timestamp}handleLocalCandidate(e){const t=new Ht;t.label="local-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.candidateType=e.candidateType,t.id=e.id,t.relayProtocol=e.relayProtocol,t.transportId=e.transportId,this.localCandidates.push(t)}handleRemoteCandidate(e){const t=new Ht;t.label="remote-candidate",t.address=e.address,t.port=e.port,t.protocol=e.protocol,t.id=e.id,t.candidateType=e.candidateType,t.relayProtocol=e.relayProtocol,t.transportId=e.transportId,this.remoteCandidates.push(t)}handleInBoundRTP(e){switch(e.kind){case"video":this.inboundVideoStats=e,null!=this.lastVideoStats&&(this.inboundVideoStats.bitrate=8*(this.inboundVideoStats.bytesReceived-this.lastVideoStats.bytesReceived)/(this.inboundVideoStats.timestamp-this.lastVideoStats.timestamp),this.inboundVideoStats.bitrate=Math.floor(this.inboundVideoStats.bitrate)),this.lastVideoStats=Object.assign({},this.inboundVideoStats);break;case"audio":this.inboundAudioStats=e,null!=this.lastAudioStats&&(this.inboundAudioStats.bitrate=8*(this.inboundAudioStats.bytesReceived-this.lastAudioStats.bytesReceived)/(this.inboundAudioStats.timestamp-this.lastAudioStats.timestamp),this.inboundAudioStats.bitrate=Math.floor(this.inboundAudioStats.bitrate)),this.lastAudioStats=Object.assign({},this.inboundAudioStats);break;default:i.Log(i.GetStackTrace(),"Kind is not handled")}}handleRemoteOutBound(e){"video"===e.kind&&(this.outBoundVideoStats.bytesSent=e.bytesSent,this.outBoundVideoStats.id=e.id,this.outBoundVideoStats.localId=e.localId,this.outBoundVideoStats.packetsSent=e.packetsSent,this.outBoundVideoStats.remoteTimestamp=e.remoteTimestamp,this.outBoundVideoStats.timestamp=e.timestamp)}handleTrack(e){"track"!==e.type||"video_label"!==e.trackIdentifier&&"video"!==e.kind||(this.inboundVideoStats.framesDropped=e.framesDropped,this.inboundVideoStats.framesReceived=e.framesReceived,this.inboundVideoStats.frameHeight=e.frameHeight,this.inboundVideoStats.frameWidth=e.frameWidth)}handleTransport(e){this.transportStats=e}handleCodec(e){const t=e.id,n=`${e.mimeType.replace("video/","").replace("audio/","")}${e.sdpFmtpLine?` ${e.sdpFmtpLine}`:""}`;this.codecs.set(t,n)}handleSessionStatistics(e,t,n){const r=Date.now()-e;this.sessionStats.runTime=new Date(r).toISOString().substr(11,8).toString();const s=null===t?"Not sent yet":t?"true":"false";this.sessionStats.controlsStreamInput=s,this.sessionStats.videoEncoderAvgQP=n}isNumber(e){return"number"==typeof e&&isFinite(e)}getActiveCandidatePair(){return this.transportStats?this.candidatePairs.find((e=>e.id===this.transportStats.selectedCandidatePairId),null):this.candidatePairs.find((e=>e.selected),null)}}const Xt=(Jt={parseRtpParameters:()=>e.parseRtpParameters,splitSections:()=>e.splitSections},Yt={},r.d(Yt,Jt),Yt);var Jt,Yt;class Zt{static isVideoTransciever(e){return this.canTransceiverReceiveVideo(e)||this.canTransceiverSendVideo(e)}static canTransceiverReceiveVideo(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind}static canTransceiverSendVideo(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"video"===e.sender.track.kind}static isAudioTransciever(e){return this.canTransceiverReceiveAudio(e)||this.canTransceiverSendAudio(e)}static canTransceiverReceiveAudio(e){return!!e&&("sendrecv"===e.direction||"recvonly"===e.direction)&&e.receiver&&e.receiver.track&&"audio"===e.receiver.track.kind}static canTransceiverSendAudio(e){return!!e&&("sendrecv"===e.direction||"sendonly"===e.direction)&&e.sender&&e.sender.track&&"audio"===e.sender.track.kind}}var en,tn,nn=function(e,t,n,r){return new(n||(n=Promise))((function(s,i){function a(e){try{l(r.next(e))}catch(e){i(e)}}function o(e){try{l(r.throw(e))}catch(e){i(e)}}function l(e){var t;e.done?s(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(a,o)}l((r=r.apply(e,t||[])).next())}))};class rn{constructor(e,t,n){this.config=t,this.createPeerConnection(e,n)}createPeerConnection(e,t){this.config.isFlagEnabled(It.ForceTURN)&&(e.iceTransportPolicy="relay",i.Log(i.GetStackTrace(),"Forcing TURN usage by setting ICE Transport Policy in peer connection config.")),this.peerConnection=new RTCPeerConnection(e),this.peerConnection.onsignalingstatechange=e=>this.handleSignalStateChange(e),this.peerConnection.oniceconnectionstatechange=e=>this.handleIceConnectionStateChange(e),this.peerConnection.onicegatheringstatechange=e=>this.handleIceGatheringStateChange(e),this.peerConnection.ontrack=e=>this.handleOnTrack(e),this.peerConnection.onicecandidate=e=>this.handleIceCandidate(e),this.peerConnection.ondatachannel=e=>this.handleDataChannel(e),this.aggregatedStats=new qt,this.preferredCodec=t,this.updateCodecSelection=!0}createOffer(e,t){return nn(this,void 0,void 0,(function*(){i.Log(i.GetStackTrace(),"Create Offer",6);const n="localhost"===location.hostname||"127.0.0.1"===location.hostname,r="https:"===location.protocol;let s=t.isFlagEnabled(It.UseMic);!s||n||r||(s=!1,i.Error(i.GetStackTrace(),"Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access."),i.Error(i.GetStackTrace(),"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(s).finally((()=>{var t;null===(t=this.peerConnection)||void 0===t||t.createOffer(e).then((e=>{var t;this.showTextOverlayConnecting(),e.sdp=this.mungeSDP(e.sdp,s),null===(t=this.peerConnection)||void 0===t||t.setLocalDescription(e),this.onSendWebRTCOffer(e)})).catch((()=>{this.showTextOverlaySetupFailure()}))}))}))}receiveOffer(e,t){var n;return nn(this,void 0,void 0,(function*(){i.Log(i.GetStackTrace(),"Receive Offer",6),null===(n=this.peerConnection)||void 0===n||n.setRemoteDescription(e).then((()=>{const e="localhost"===location.hostname||"127.0.0.1"===location.hostname,n="https:"===location.protocol;let r=t.isFlagEnabled(It.UseMic);!r||e||n||(r=!1,i.Error(i.GetStackTrace(),"Microphone access in the browser will not work if you are not on HTTPS or localhost. Disabling mic access."),i.Error(i.GetStackTrace(),"For testing you can enable HTTP microphone access Chrome by visiting chrome://flags/ and enabling 'unsafely-treat-insecure-origin-as-secure'")),this.setupTransceiversAsync(r).finally((()=>{var e;null===(e=this.peerConnection)||void 0===e||e.createAnswer().then((e=>{var t;return e.sdp=this.mungeSDP(e.sdp,r),null===(t=this.peerConnection)||void 0===t?void 0:t.setLocalDescription(e)})).then((()=>{var e;this.onSendWebRTCAnswer(null===(e=this.peerConnection)||void 0===e?void 0:e.currentLocalDescription)})).catch((()=>{i.Error(i.GetStackTrace(),"createAnswer() failed")}))}))})),this.config.setOptionSettingOptions(Ut.PreferredCodec,this.parseAvailableCodecs(e).filter((e=>this.config.getSettingOption(Ut.PreferredCodec).options.includes(e))))}))}receiveAnswer(e){var t;null===(t=this.peerConnection)||void 0===t||t.setRemoteDescription(e),this.config.setOptionSettingOptions(Ut.PreferredCodec,this.parseAvailableCodecs(e).filter((e=>this.config.getSettingOption(Ut.PreferredCodec).options.includes(e))))}generateStats(){var e,t;const n=e=>{this.aggregatedStats.processStats(e)},r=null===(e=this.peerConnection)||void 0===e?void 0:e.getStats(this.audioTrack).then(n),s=null===(t=this.peerConnection)||void 0===t?void 0:t.getStats(this.videoTrack).then(n);Promise.allSettled([r,s]).then((()=>{this.onVideoStats(this.aggregatedStats),this.updateCodecSelection&&this.aggregatedStats.inboundVideoStats.codecId&&this.config.setOptionSettingValue(Ut.PreferredCodec,this.aggregatedStats.codecs.get(this.aggregatedStats.inboundVideoStats.codecId))}))}close(){this.peerConnection&&(this.peerConnection.close(),this.peerConnection=null)}mungeSDP(e,t){let n=e.replace(/(a=fmtp:\d+ .*level-asymmetry-allowed=.*)\r\n/gm,"$1;x-google-start-bitrate=10000;x-google-max-bitrate=100000\r\n"),r="maxaveragebitrate=510000;";return t&&(r+="sprop-maxcapturerate=48000;"),r+=this.config.isFlagEnabled(It.ForceMonoAudio)?"stereo=0;":"stereo=1;",r+="useinbandfec=1",n=n.replace("useinbandfec=1",r),n}handleOnIce(e){var t;i.Log(i.GetStackTrace(),"peerconnection handleOnIce",6),this.config.isFlagEnabled(It.ForceTURN)&&e.candidate.indexOf("relay")<0?i.Info(i.GetStackTrace(),`Dropping candidate because it was not TURN relay. | Type= ${e.type} | Protocol= ${e.protocol} | Address=${e.address} | Port=${e.port} |`,6):null===(t=this.peerConnection)||void 0===t||t.addIceCandidate(e)}handleSignalStateChange(e){i.Log(i.GetStackTrace(),"signaling state change: "+e,6)}handleIceConnectionStateChange(e){i.Log(i.GetStackTrace(),"ice connection state change: "+e,6),this.onIceConnectionStateChange(e)}handleIceGatheringStateChange(e){i.Log(i.GetStackTrace(),"ice gathering state change: "+JSON.stringify(e),6)}handleOnTrack(e){e.streams.length<1||"probator"==e.streams[0].id||("video"==e.track.kind&&(this.videoTrack=e.track),"audio"==e.track.kind&&(this.audioTrack=e.track),this.onTrack(e))}handleIceCandidate(e){this.onPeerIceCandidate(e)}handleDataChannel(e){this.onDataChannel(e)}onTrack(e){}onIceConnectionStateChange(e){}onPeerIceCandidate(e){}onDataChannel(e){}setupTransceiversAsync(e){var t,n,r,s,i,a,o,l,c;return nn(this,void 0,void 0,(function*(){const d=(null===(t=this.peerConnection)||void 0===t?void 0:t.getTransceivers().length)>0;if(null===(n=this.peerConnection)||void 0===n||n.addTransceiver("video",{direction:"recvonly"}),RTCRtpReceiver.getCapabilities&&""!=this.preferredCodec)for(const e of null!==(s=null===(r=this.peerConnection)||void 0===r?void 0:r.getTransceivers())&&void 0!==s?s:[])if(e&&e.receiver&&e.receiver.track&&"video"===e.receiver.track.kind&&e.setCodecPreferences){const t=this.preferredCodec.split(" "),n=[{mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""}];this.config.getSettingOption(Ut.PreferredCodec).options.filter((e=>e!=this.preferredCodec)).forEach((e=>{const t=e.split(" ");n.push({mimeType:"video/"+t[0],clockRate:9e4,sdpFmtpLine:t[1]?t[1]:""})}));for(const e of n)""===e.sdpFmtpLine&&delete e.sdpFmtpLine;e.setCodecPreferences(n)}if(e){const e={video:!1,audio:{autoGainControl:!1,channelCount:1,echoCancellation:!1,latency:0,noiseSuppression:!1,sampleRate:48e3,sampleSize:16,volume:1}},t=yield navigator.mediaDevices.getUserMedia(e);if(t)if(d){for(const e of null!==(o=null===(a=this.peerConnection)||void 0===a?void 0:a.getTransceivers())&&void 0!==o?o:[])if(Zt.canTransceiverReceiveAudio(e))for(const n of t.getTracks())n.kind&&"audio"==n.kind&&(e.sender.replaceTrack(n),e.direction="sendrecv")}else for(const e of t.getTracks())e.kind&&"audio"==e.kind&&(null===(l=this.peerConnection)||void 0===l||l.addTransceiver(e,{direction:"sendrecv"}));else null===(c=this.peerConnection)||void 0===c||c.addTransceiver("audio",{direction:"recvonly"})}else null===(i=this.peerConnection)||void 0===i||i.addTransceiver("audio",{direction:"recvonly"})}))}onVideoStats(e){}onSendWebRTCOffer(e){}onSendWebRTCAnswer(e){}showTextOverlayConnecting(){}showTextOverlaySetupFailure(){}parseAvailableCodecs(e){if(!RTCRtpReceiver.getCapabilities)return["Only available on Chrome"];const t=[],n=(0,Xt.splitSections)(e.sdp);return n.shift(),n.forEach((e=>{const{codecs:n}=(0,Xt.parseRtpParameters)(e),r=/(VP\d|H26\d|AV1).*/;n.forEach((e=>{const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");if(null!==r.exec(n)){"VP9"==e.name&&(e.parameters={"profile-id":"0"});const n=e.name+" "+Object.keys(e.parameters||{}).map((t=>t+"="+e.parameters[t])).join(";");t.push(n)}}))})),t}}class sn{constructor(){this.PixelStreamingSettings=new an,this.EncoderSettings=new on,this.WebRTCSettings=new ln}ueCompatible(){null!=this.WebRTCSettings.MaxFPS&&(this.WebRTCSettings.FPS=this.WebRTCSettings.MaxFPS)}}class an{}class on{}class ln{}class cn{constructor(){this.ReceiptTimeMs=null,this.TransmissionTimeMs=null,this.PreCaptureTimeMs=null,this.PostCaptureTimeMs=null,this.PreEncodeTimeMs=null,this.PostEncodeTimeMs=null,this.EncodeMs=null,this.CaptureToSendMs=null,this.testStartTimeMs=0,this.browserReceiptTimeMs=0,this.latencyExcludingDecode=0,this.testDuration=0,this.networkLatency=0,this.browserSendLatency=0,this.frameDisplayDeltaTimeMs=0,this.endToEndLatency=0,this.encodeLatency=0}setFrameDisplayDeltaTime(e){0==this.frameDisplayDeltaTimeMs&&(this.frameDisplayDeltaTimeMs=Math.round(e))}processFields(){null!=this.EncodeMs||null==this.PreEncodeTimeMs&&null==this.PostEncodeTimeMs||(i.Log(i.GetStackTrace(),`Setting Encode Ms \n ${this.PostEncodeTimeMs} \n ${this.PreEncodeTimeMs}`,6),this.EncodeMs=this.PostEncodeTimeMs-this.PreEncodeTimeMs),null!=this.CaptureToSendMs||null==this.PreCaptureTimeMs&&null==this.PostCaptureTimeMs||(i.Log(i.GetStackTrace(),`Setting CaptureToSendMs Ms \n ${this.PostCaptureTimeMs} \n ${this.PreCaptureTimeMs}`,6),this.CaptureToSendMs=this.PostCaptureTimeMs-this.PreCaptureTimeMs)}}class dn{static setExtensionFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),i.Log(i.GetStackTrace(),"Received first chunk of file",6));const n=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),n,6),t.extension=n}static setMimeTypeFromBytes(e,t){t.receiving||(t.mimetype="",t.extension="",t.receiving=!0,t.valid=!1,t.size=0,t.data=[],t.timestampStart=(new Date).getTime(),i.Log(i.GetStackTrace(),"Received first chunk of file",6));const n=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),n,6),t.mimetype=n}static setContentsFromBytes(e,t){if(!t.receiving)return;t.size=Math.ceil(new DataView(e.slice(1,5).buffer).getInt32(0,!0)/16379);const n=e.slice(5);if(t.data.push(n),i.Log(i.GetStackTrace(),`Received file chunk: ${t.data.length}/${t.size}`,6),t.data.length===t.size){t.receiving=!1,t.valid=!0,i.Log(i.GetStackTrace(),"Received complete file",6);const e=(new Date).getTime()-t.timestampStart,n=Math.round(16*t.size*1024/e);i.Log(i.GetStackTrace(),`Average transfer bitrate: ${n}kb/s over ${e/1e3} seconds`,6);const r=new Blob(t.data,{type:t.mimetype}),s=document.createElement("a");s.setAttribute("href",URL.createObjectURL(r)),s.setAttribute("download",`transfer.${t.extension}`),document.body.append(s),s.remove()}else t.data.length>t.size&&(t.receiving=!1,i.Error(i.GetStackTrace(),`Received bigger file than advertised: ${t.data.length}/${t.size}`))}}class hn{constructor(){this.mimetype="",this.extension="",this.receiving=!1,this.size=0,this.data=[],this.valid=!1}}class un{}un.mainButton=0,un.auxiliaryButton=1,un.secondaryButton=2,un.fourthButton=3,un.fifthButton=4;class gn{}gn.primaryButton=1,gn.secondaryButton=2,gn.auxiliaryButton=4,gn.fourthButton=8,gn.fifthButton=16;class mn{constructor(){this.unregisterCallbacks=[]}addUnregisterCallback(e){this.unregisterCallbacks.push(e)}unregisterAll(){for(const e of this.unregisterCallbacks)e();this.unregisterCallbacks=[]}}class pn{constructor(e,t,n){this.touchEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n;const r=e=>this.onTouchStart(e),s=e=>this.onTouchEnd(e),i=e=>this.onTouchMove(e);document.addEventListener("touchstart",r,{passive:!1}),document.addEventListener("touchend",s,{passive:!1}),document.addEventListener("touchmove",i,{passive:!1}),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchstart",r))),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchend",s))),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchmove",i)))}unregisterTouchEvents(){this.touchEventListenerTracker.unregisterAll()}setVideoElementParentClientRect(e){this.videoElementParentClientRect=e}onTouchStart(e){if(this.videoElementProvider.isVideoReady()&&e.target===this.videoElementProvider.getVideoElement()){if(null==this.fakeTouchFinger){const t=e.changedTouches[0];this.fakeTouchFinger=new fn(t.identifier,t.clientX-this.videoElementParentClientRect.left,t.clientY-this.videoElementParentClientRect.top);const n=this.videoElementProvider.getVideoParentElement(),r=new MouseEvent("mouseenter",t);n.dispatchEvent(r);const s=this.coordinateConverter.normalizeAndQuantizeUnsigned(this.fakeTouchFinger.x,this.fakeTouchFinger.y);this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([un.mainButton,s.x,s.y])}e.preventDefault()}}onTouchEnd(e){if(!this.videoElementProvider.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.videoElementProvider.getVideoParentElement(),n=this.toStreamerMessagesProvider.toStreamerHandlers;for(let r=0;r<e.changedTouches.length;r++){const s=e.changedTouches[r];if(s.identifier===this.fakeTouchFinger.id){const e=s.clientX-this.videoElementParentClientRect.left,r=s.clientY-this.videoElementParentClientRect.top,i=this.coordinateConverter.normalizeAndQuantizeUnsigned(e,r);n.get("MouseUp")([un.mainButton,i.x,i.y]);const a=new MouseEvent("mouseleave",s);t.dispatchEvent(a),this.fakeTouchFinger=null;break}}e.preventDefault()}onTouchMove(e){if(!this.videoElementProvider.isVideoReady()||null==this.fakeTouchFinger)return;const t=this.toStreamerMessagesProvider.toStreamerHandlers;for(let n=0;n<e.touches.length;n++){const r=e.touches[n];if(r.identifier===this.fakeTouchFinger.id){const e=r.clientX-this.videoElementParentClientRect.left,n=r.clientY-this.videoElementParentClientRect.top,s=this.coordinateConverter.normalizeAndQuantizeUnsigned(e,n),i=this.coordinateConverter.normalizeAndQuantizeSigned(e-this.fakeTouchFinger.x,n-this.fakeTouchFinger.y);t.get("MouseMove")([s.x,s.y,i.x,i.y]),this.fakeTouchFinger.x=e,this.fakeTouchFinger.y=n;break}}e.preventDefault()}}class fn{constructor(e,t,n){this.id=e,this.x=t,this.y=n}}class vn{}vn.backSpace=8,vn.shift=16,vn.control=17,vn.alt=18,vn.rightShift=253,vn.rightControl=254,vn.rightAlt=255;class yn{constructor(e,t,n){this.keyboardEventListenerTracker=new mn,this.CodeToKeyCode={Escape:27,Digit0:48,Digit1:49,Digit2:50,Digit3:51,Digit4:52,Digit5:53,Digit6:54,Digit7:55,Digit8:56,Digit9:57,Minus:173,Equal:187,Backspace:8,Tab:9,KeyQ:81,KeyW:87,KeyE:69,KeyR:82,KeyT:84,KeyY:89,KeyU:85,KeyI:73,KeyO:79,KeyP:80,BracketLeft:219,BracketRight:221,Enter:13,ControlLeft:17,KeyA:65,KeyS:83,KeyD:68,KeyF:70,KeyG:71,KeyH:72,KeyJ:74,KeyK:75,KeyL:76,Semicolon:186,Quote:222,Backquote:192,ShiftLeft:16,Backslash:220,KeyZ:90,KeyX:88,KeyC:67,KeyV:86,KeyB:66,KeyN:78,KeyM:77,Comma:188,Period:190,Slash:191,ShiftRight:253,AltLeft:18,Space:32,CapsLock:20,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,Pause:19,ScrollLock:145,NumpadDivide:111,NumpadMultiply:106,NumpadSubtract:109,NumpadAdd:107,NumpadDecimal:110,Numpad9:105,Numpad8:104,Numpad7:103,Numpad6:102,Numpad5:101,Numpad4:100,Numpad3:99,Numpad2:98,Numpad1:97,Numpad0:96,NumLock:144,ControlRight:254,AltRight:255,Home:36,End:35,ArrowUp:38,ArrowLeft:37,ArrowRight:39,ArrowDown:40,PageUp:33,PageDown:34,Insert:45,Delete:46,ContextMenu:93},this.toStreamerMessagesProvider=e,this.config=t,this.activeKeysProvider=n}registerKeyBoardEvents(){const e=e=>this.handleOnCompositionEnd(e),t=e=>this.handleOnKeyDown(e),n=e=>this.handleOnKeyUp(e),r=e=>this.handleOnKeyPress(e);document.addEventListener("compositionend",e),document.addEventListener("keydown",t),document.addEventListener("keyup",n),document.addEventListener("keypress",r),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("compositionend",e))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keydown",t))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keyup",n))),this.keyboardEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("keypress",r)))}unregisterKeyBoardEvents(){this.keyboardEventListenerTracker.unregisterAll()}handleOnKeyDown(e){const t=this.getKeycode(e);t&&229!==t&&(i.Log(i.GetStackTrace(),`key down ${t}, repeat = ${e.repeat}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyDown")([this.getKeycode(e),e.repeat?1:0]),this.activeKeysProvider.getActiveKeys().push(t),t===vn.backSpace&&document.dispatchEvent(new KeyboardEvent("keypress",{charCode:vn.backSpace})),this.config.isFlagEnabled(It.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyUp(e){const t=this.getKeycode(e);t&&(i.Log(i.GetStackTrace(),`key up ${t}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyUp")([t]),this.config.isFlagEnabled(It.SuppressBrowserKeys)&&this.isKeyCodeBrowserKey(t)&&e.preventDefault())}handleOnKeyPress(e){if(!("charCode"in e))return void i.Warning(i.GetStackTrace(),"KeyboardEvent.charCode is deprecated in this browser, cannot send key press.");const t=e.charCode;i.Log(i.GetStackTrace(),`key press ${t}`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("KeyPress")([t])}handleOnCompositionEnd(e){e.data&&e.data.length&&e.data.split("").forEach((e=>{this.handleOnKeyDown(new KeyboardEvent("keydown",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyPress(new KeyboardEvent("keypress",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)})),this.handleOnKeyUp(new KeyboardEvent("keyup",{keyCode:e.toUpperCase().charCodeAt(0),charCode:e.charCodeAt(0)}))}))}getKeycode(e){if(!("keyCode"in e)){const t=e;return t.code in this.CodeToKeyCode?this.CodeToKeyCode[t.code]:(i.Warning(i.GetStackTrace(),`Keyboard code of ${t.code} is not supported in our mapping, ignoring this key.`),null)}return e.keyCode===vn.shift&&"ShiftRight"===e.code?vn.rightShift:e.keyCode===vn.control&&"ControlRight"===e.code?vn.rightControl:e.keyCode===vn.alt&&"AltRight"===e.code?vn.rightAlt:e.keyCode}isKeyCodeBrowserKey(e){return e>=112&&e<=123||9===e}}class Sn{constructor(e,t,n){this.x=0,this.y=0,this.updateMouseMovePositionEvent=e=>{this.updateMouseMovePosition(e)},this.mouseEventListenerTracker=new mn,this.videoElementProvider=e,this.mouseController=t,this.activeKeysProvider=n;const r=this.videoElementProvider.getVideoParentElement();this.x=r.getBoundingClientRect().width/2,this.y=r.getBoundingClientRect().height/2,this.coord=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(this.x,this.y)}unregisterMouseEvents(){this.mouseEventListenerTracker.unregisterAll()}lockStateChange(){const e=this.videoElementProvider.getVideoParentElement(),t=this.mouseController.toStreamerMessagesProvider.toStreamerHandlers;if(document.pointerLockElement===e||document.mozPointerLockElement===e)i.Log(i.GetStackTrace(),"Pointer locked",6),document.addEventListener("mousemove",this.updateMouseMovePositionEvent,!1),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("mousemove",this.updateMouseMovePositionEvent,!1)));else{i.Log(i.GetStackTrace(),"The pointer lock status is now unlocked",6),document.removeEventListener("mousemove",this.updateMouseMovePositionEvent,!1);let e=this.activeKeysProvider.getActiveKeys();const n=new Set(e),r=[];n.forEach((e=>{r[e]})),r.forEach((e=>{t.get("KeyUp")([e])})),e=[]}}updateMouseMovePosition(e){if(!this.videoElementProvider.isVideoReady())return;const t=this.mouseController.toStreamerMessagesProvider.toStreamerHandlers,n=this.videoElementProvider.getVideoParentElement().clientWidth,r=this.videoElementProvider.getVideoParentElement().clientHeight;this.x+=e.movementX,this.y+=e.movementY,this.x>n&&(this.x-=n),this.y>r&&(this.y-=r),this.x<0&&(this.x=n+this.x),this.y<0&&(this.y=r-this.y),this.coord=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(this.x,this.y);const s=this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(e.movementX,e.movementY);t.get("MouseMove")([this.coord.x,this.coord.y,s.x,s.y])}handleMouseDown(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e.button,this.coord.x,this.coord.y])}handleMouseUp(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e.button,this.coord.x,this.coord.y])}handleMouseWheel(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,this.coord.x,this.coord.y])}handleMouseDouble(e){this.videoElementProvider.isVideoReady()&&this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDouble")([e.button,this.coord.x,this.coord.y])}handlePressMouseButtons(e){this.videoElementProvider.isVideoReady()&&this.mouseController.pressMouseButtons(e.buttons,this.x,this.y)}handleReleaseMouseButtons(e){this.videoElementProvider.isVideoReady()&&this.mouseController.releaseMouseButtons(e.buttons,this.x,this.y)}}class wn{constructor(e){this.mouseController=e}unregisterMouseEvents(){}updateMouseMovePosition(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"MouseMove",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY),n=this.mouseController.coordinateConverter.normalizeAndQuantizeSigned(e.movementX,e.movementY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseMove")([t.x,t.y,n.x,n.y]),e.preventDefault()}handleMouseDown(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"onMouse Down",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e.button,t.x,t.y]),e.preventDefault()}handleMouseUp(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),"onMouse Up",6);const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e.button,t.x,t.y]),e.preventDefault()}handleContextMenu(e){this.mouseController.videoElementProvider.isVideoReady()&&e.preventDefault()}handleMouseWheel(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseWheel")([e.wheelDelta,t.x,t.y]),e.preventDefault()}handleMouseDouble(e){if(!this.mouseController.videoElementProvider.isVideoReady())return;const t=this.mouseController.coordinateConverter.normalizeAndQuantizeUnsigned(e.offsetX,e.offsetY);this.mouseController.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDouble")([e.button,t.x,t.y])}handlePressMouseButtons(e){this.mouseController.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"onMouse press",6),this.mouseController.pressMouseButtons(e.buttons,e.offsetX,e.offsetY))}handleReleaseMouseButtons(e){this.mouseController.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"onMouse release",6),this.mouseController.releaseMouseButtons(e.buttons,e.offsetX,e.offsetY))}}class bn{constructor(e,t,n,r){this.mouseEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.coordinateConverter=n,this.videoElementProvider=t,this.activeKeysProvider=r,this.registerMouseEnterAndLeaveEvents()}unregisterMouseEvents(){this.mouseEventListenerTracker.unregisterAll()}registerLockedMouseEvents(e){const t=this.videoElementProvider.getVideoParentElement(),n=new Sn(this.videoElementProvider,e,this.activeKeysProvider);if(t.requestPointerLock=t.requestPointerLock||t.mozRequestPointerLock,document.exitPointerLock=document.exitPointerLock||document.mozExitPointerLock,t.requestPointerLock){const e=()=>{t.requestPointerLock()};t.addEventListener("click",e),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("click",e)))}const r=()=>n.lockStateChange();document.addEventListener("pointerlockchange",r,!1),document.addEventListener("mozpointerlockchange",r,!1),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("pointerlockchange",r,!1))),this.mouseEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("mozpointerlockchange",r,!1)));const s=e=>n.handleMouseDown(e),i=e=>n.handleMouseUp(e),a=e=>n.handleMouseWheel(e),o=e=>n.handleMouseDouble(e);t.addEventListener("mousedown",s),t.addEventListener("mouseup",i),t.addEventListener("wheel",a),t.addEventListener("dblclick",o),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousedown",s))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mouseup",i))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("wheel",a))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("dblclick",o))),this.mouseEventListenerTracker.addUnregisterCallback((()=>n.unregisterMouseEvents())),this.mouseEventListenerTracker.addUnregisterCallback((()=>{!document.exitPointerLock||document.pointerLockElement!==t&&document.mozPointerLockElement!==t||document.exitPointerLock()}))}registerHoveringMouseEvents(e){const t=this.videoElementProvider.getVideoParentElement(),n=new wn(e),r=e=>n.updateMouseMovePosition(e),s=e=>n.handleMouseDown(e),i=e=>n.handleMouseUp(e),a=e=>n.handleContextMenu(e),o=e=>n.handleMouseWheel(e),l=e=>n.handleMouseDouble(e);t.addEventListener("mousemove",r),t.addEventListener("mousedown",s),t.addEventListener("mouseup",i),t.addEventListener("contextmenu",a),t.addEventListener("wheel",o),t.addEventListener("dblclick",l),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousemove",r))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mousedown",s))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("mouseup",i))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("contextmenu",a))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("wheel",o))),this.mouseEventListenerTracker.addUnregisterCallback((()=>t.removeEventListener("dblclick",l))),this.mouseEventListenerTracker.addUnregisterCallback((()=>n.unregisterMouseEvents()))}registerMouseEnterAndLeaveEvents(){const e=this.videoElementProvider.getVideoParentElement(),t=e=>{this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"Mouse Entered",6),this.sendMouseEnter(),this.pressMouseButtons(e.buttons,e.x,e.y))},n=e=>{this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"Mouse Left",6),this.sendMouseLeave(),this.releaseMouseButtons(e.buttons,e.x,e.y))};e.addEventListener("mouseenter",t),e.addEventListener("mouseleave",n),this.mouseEventListenerTracker.addUnregisterCallback((()=>e.removeEventListener("mouseenter",t))),this.mouseEventListenerTracker.addUnregisterCallback((()=>e.removeEventListener("mouseleave",n)))}releaseMouseButtons(e,t,n){const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);e&gn.primaryButton&&this.sendMouseUp(un.mainButton,r.x,r.y),e&gn.secondaryButton&&this.sendMouseUp(un.secondaryButton,r.x,r.y),e&gn.auxiliaryButton&&this.sendMouseUp(un.auxiliaryButton,r.x,r.y),e&gn.fourthButton&&this.sendMouseUp(un.fourthButton,r.x,r.y),e&gn.fifthButton&&this.sendMouseUp(un.fifthButton,r.x,r.y)}pressMouseButtons(e,t,n){if(!this.videoElementProvider.isVideoReady())return;const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);e&gn.primaryButton&&this.sendMouseDown(un.mainButton,r.x,r.y),e&gn.secondaryButton&&this.sendMouseDown(un.secondaryButton,r.x,r.y),e&gn.auxiliaryButton&&this.sendMouseDown(un.auxiliaryButton,r.x,r.y),e&gn.fourthButton&&this.sendMouseDown(un.fourthButton,r.x,r.y),e&gn.fifthButton&&this.sendMouseDown(un.fifthButton,r.x,r.y)}sendMouseEnter(){this.videoElementProvider.isVideoReady()&&this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseEnter")()}sendMouseLeave(){this.videoElementProvider.isVideoReady()&&this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseLeave")()}sendMouseDown(e,t,n){this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),`mouse button ${e} down at (${t}, ${n})`,6),this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseDown")([e,t,n]))}sendMouseUp(e,t,n){if(!this.videoElementProvider.isVideoReady())return;i.Log(i.GetStackTrace(),`mouse button ${e} up at (${t}, ${n})`,6);const r=this.coordinateConverter.normalizeAndQuantizeUnsigned(t,n);this.toStreamerMessagesProvider.toStreamerHandlers.get("MouseUp")([e,r.x,r.y])}}class Tn{constructor(e,t,n){this.fingers=[9,8,7,6,5,4,3,2,1,0],this.fingerIds=new Map,this.maxByteValue=255,this.touchEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n,this.videoElementParent=t.getVideoElement();const r=e=>this.onTouchStart(e),s=e=>this.onTouchEnd(e),a=e=>this.onTouchMove(e);this.videoElementParent.addEventListener("touchstart",r),this.videoElementParent.addEventListener("touchend",s),this.videoElementParent.addEventListener("touchmove",a),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchstart",r))),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchend",s))),this.touchEventListenerTracker.addUnregisterCallback((()=>this.videoElementParent.removeEventListener("touchmove",a))),i.Log(i.GetStackTrace(),"Touch Events Registered",6);const o=e=>{e.preventDefault()};document.addEventListener("touchmove",o),this.touchEventListenerTracker.addUnregisterCallback((()=>document.removeEventListener("touchmove",o)))}unregisterTouchEvents(){this.touchEventListenerTracker.unregisterAll()}rememberTouch(e){const t=this.fingers.pop();void 0===t&&i.Log(i.GetStackTrace(),"exhausted touch identifiers",6),this.fingerIds.set(e.identifier,t)}forgetTouch(e){this.fingers.push(this.fingerIds.get(e.identifier)),this.fingers.sort((function(e,t){return t-e})),this.fingerIds.delete(e.identifier)}onTouchStart(e){if(this.videoElementProvider.isVideoReady()){for(let t=0;t<e.changedTouches.length;t++)this.rememberTouch(e.changedTouches[t]);i.Log(i.GetStackTrace(),"touch start",6),this.emitTouchData("TouchStart",e.changedTouches),e.preventDefault()}}onTouchEnd(e){if(this.videoElementProvider.isVideoReady()){i.Log(i.GetStackTrace(),"touch end",6),this.emitTouchData("TouchEnd",e.changedTouches);for(let t=0;t<e.changedTouches.length;t++)this.forgetTouch(e.changedTouches[t]);e.preventDefault()}}onTouchMove(e){this.videoElementProvider.isVideoReady()&&(i.Log(i.GetStackTrace(),"touch move",6),this.emitTouchData("TouchMove",e.touches),e.preventDefault())}emitTouchData(e,t){if(!this.videoElementProvider.isVideoReady())return;const n=this.videoElementProvider.getVideoParentElement().getBoundingClientRect(),r=this.toStreamerMessagesProvider.toStreamerHandlers;for(let s=0;s<t.length;s++){const a=1,o=t[s],l=o.clientX-n.left,c=o.clientY-n.top;i.Log(i.GetStackTrace(),`F${this.fingerIds.get(o.identifier)}=(${l}, ${c})`,6);const d=this.coordinateConverter.normalizeAndQuantizeUnsigned(l,c);switch(e){case"TouchStart":r.get("TouchStart")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*(o.force>0?o.force:1),d.inRange?1:0]);break;case"TouchEnd":r.get("TouchEnd")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*o.force,d.inRange?1:0]);break;case"TouchMove":r.get("TouchMove")([a,d.x,d.y,this.fingerIds.get(o.identifier),this.maxByteValue*(o.force>0?o.force:1),d.inRange?1:0])}}}}class Cn{constructor(e){this.gamePadEventListenerTracker=new mn,this.toStreamerMessagesProvider=e,this.requestAnimationFrame=(window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame||window.requestAnimationFrame).bind(window);const t=window;if(window.addEventListener("beforeunload",(e=>this.onBeforeUnload(e))),"GamepadEvent"in t){const e=e=>this.gamePadConnectHandler(e),t=e=>this.gamePadDisconnectHandler(e);window.addEventListener("gamepadconnected",e),window.addEventListener("gamepaddisconnected",t),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("gamepadconnected",e))),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("gamepaddisconnected",t)))}else if("WebKitGamepadEvent"in t){const e=e=>this.gamePadConnectHandler(e),t=e=>this.gamePadDisconnectHandler(e);window.addEventListener("webkitgamepadconnected",e),window.addEventListener("webkitgamepaddisconnected",t),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("webkitgamepadconnected",e))),this.gamePadEventListenerTracker.addUnregisterCallback((()=>window.removeEventListener("webkitgamepaddisconnected",t)))}if(this.controllers=[],navigator.getGamepads)for(const e of navigator.getGamepads())e&&this.gamePadConnectHandler(new GamepadEvent("gamepadconnected",{gamepad:e}))}unregisterGamePadEvents(){this.gamePadEventListenerTracker.unregisterAll();for(const e of this.controllers)void 0!==e.id&&this.onGamepadDisconnected(e.id);this.controllers=[],this.onGamepadConnected=()=>{},this.onGamepadDisconnected=()=>{}}gamePadConnectHandler(e){i.Log(i.GetStackTrace(),"Gamepad connect handler",6);const t=e.gamepad,n={currentState:t,prevState:t,id:void 0};this.controllers.push(n),this.controllers[t.index].currentState=t,this.controllers[t.index].prevState=t,i.Log(i.GetStackTrace(),"gamepad: "+t.id+" connected",6),window.requestAnimationFrame((()=>this.updateStatus())),this.onGamepadConnected()}gamePadDisconnectHandler(e){i.Log(i.GetStackTrace(),"Gamepad disconnect handler",6),i.Log(i.GetStackTrace(),"gamepad: "+e.gamepad.id+" disconnected",6);const t=this.controllers[e.gamepad.index];delete this.controllers[e.gamepad.index],this.controllers=this.controllers.filter((e=>void 0!==e)),this.onGamepadDisconnected(t.id)}scanGamePads(){const e=navigator.getGamepads?navigator.getGamepads():navigator.webkitGetGamepads?navigator.webkitGetGamepads():[];for(let t=0;t<e.length;t++)e[t]&&e[t].index in this.controllers&&(this.controllers[e[t].index].currentState=e[t])}updateStatus(){this.scanGamePads();const e=this.toStreamerMessagesProvider.toStreamerHandlers;for(const t of this.controllers){const n=void 0===t.id?this.controllers.indexOf(t):t.id,r=t.currentState;for(let r=0;r<t.currentState.buttons.length;r++){const s=t.currentState.buttons[r],i=t.prevState.buttons[r];s.pressed?r==en.LeftTrigger?e.get("GamepadAnalog")([n,5,s.value]):r==en.RightTrigger?e.get("GamepadAnalog")([n,6,s.value]):e.get("GamepadButtonPressed")([n,r,i.pressed?1:0]):!s.pressed&&i.pressed&&(r==en.LeftTrigger?e.get("GamepadAnalog")([n,5,0]):r==en.RightTrigger?e.get("GamepadAnalog")([n,6,0]):e.get("GamepadButtonReleased")([n,r,0]))}for(let t=0;t<r.axes.length;t+=2){const s=parseFloat(r.axes[t].toFixed(4)),i=-parseFloat(r.axes[t+1].toFixed(4));e.get("GamepadAnalog")([n,t+1,s]),e.get("GamepadAnalog")([n,t+2,i])}this.controllers[n].prevState=r}this.controllers.length>0&&this.requestAnimationFrame((()=>this.updateStatus()))}onGamepadResponseReceived(e){for(const t of this.controllers)if(void 0===t.id){t.id=e;break}}onGamepadConnected(){}onGamepadDisconnected(e){}onBeforeUnload(e){for(const e of this.controllers)this.onGamepadDisconnected(e.id)}}!function(e){e[e.RightClusterBottomButton=0]="RightClusterBottomButton",e[e.RightClusterRightButton=1]="RightClusterRightButton",e[e.RightClusterLeftButton=2]="RightClusterLeftButton",e[e.RightClusterTopButton=3]="RightClusterTopButton",e[e.LeftShoulder=4]="LeftShoulder",e[e.RightShoulder=5]="RightShoulder",e[e.LeftTrigger=6]="LeftTrigger",e[e.RightTrigger=7]="RightTrigger",e[e.SelectOrBack=8]="SelectOrBack",e[e.StartOrForward=9]="StartOrForward",e[e.LeftAnalogPress=10]="LeftAnalogPress",e[e.RightAnalogPress=11]="RightAnalogPress",e[e.LeftClusterTopButton=12]="LeftClusterTopButton",e[e.LeftClusterBottomButton=13]="LeftClusterBottomButton",e[e.LeftClusterLeftButton=14]="LeftClusterLeftButton",e[e.LeftClusterRightButton=15]="LeftClusterRightButton",e[e.CentreButton=16]="CentreButton",e[e.LeftStickHorizontal=0]="LeftStickHorizontal",e[e.LeftStickVertical=1]="LeftStickVertical",e[e.RightStickHorizontal=2]="RightStickHorizontal",e[e.RightStickVertical=3]="RightStickVertical"}(en||(en={}));class En{constructor(e,t,n){this.activeKeys=new kn,this.toStreamerMessagesProvider=e,this.videoElementProvider=t,this.coordinateConverter=n}registerKeyBoard(e){i.Log(i.GetStackTrace(),"Register Keyboard Events",7);const t=new yn(this.toStreamerMessagesProvider,e,this.activeKeys);return t.registerKeyBoardEvents(),t}registerMouse(e){i.Log(i.GetStackTrace(),"Register Mouse Events",7);const t=new bn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter,this.activeKeys);switch(e){case Vt.LockedMouse:t.registerLockedMouseEvents(t);break;case Vt.HoveringMouse:t.registerHoveringMouseEvents(t);break;default:i.Info(i.GetStackTrace(),"unknown Control Scheme Type Defaulting to Locked Mouse Events"),t.registerLockedMouseEvents(t)}return t}registerTouch(e,t){if(i.Log(i.GetStackTrace(),"Registering Touch",6),e){const e=new pn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter);return e.setVideoElementParentClientRect(t),e}return new Tn(this.toStreamerMessagesProvider,this.videoElementProvider,this.coordinateConverter)}registerGamePad(){return i.Log(i.GetStackTrace(),"Register Game Pad",7),new Cn(this.toStreamerMessagesProvider)}}class kn{constructor(){this.activeKeys=[],this.activeKeys=[]}getActiveKeys(){return this.activeKeys}}class Mn{constructor(e,t){this.lastTimeResized=(new Date).getTime(),this.videoElement=document.createElement("video"),this.config=t,this.videoElement.id="streamingVideo",this.videoElement.disablePictureInPicture=!0,this.videoElement.playsInline=!0,this.videoElement.style.width="100%",this.videoElement.style.height="100%",this.videoElement.style.position="absolute",this.videoElement.style.pointerEvents="all",e.appendChild(this.videoElement),this.onResizePlayerCallback=()=>{console.log("Resolution changed, restyling player, did you forget to override this function?")},this.onMatchViewportResolutionCallback=()=>{console.log("Resolution changed and match viewport resolution is turned on, did you forget to override this function?")},this.videoElement.onclick=()=>{null!=this.audioElement&&this.audioElement.paused&&this.audioElement.play(),this.videoElement.paused&&this.videoElement.play()},this.videoElement.onloadedmetadata=()=>{this.onVideoInitialized()},window.addEventListener("resize",(()=>this.resizePlayerStyle()),!0),window.addEventListener("orientationchange",(()=>this.onOrientationChange()))}setAudioElement(e){this.audioElement=e}play(){return this.videoElement.muted=this.config.isFlagEnabled(It.StartVideoMuted),this.videoElement.autoplay=this.config.isFlagEnabled(It.AutoPlayVideo),this.videoElement.play()}isPaused(){return this.videoElement.paused}isVideoReady(){return void 0!==this.videoElement.readyState&&this.videoElement.readyState>0}hasVideoSource(){return void 0!==this.videoElement.srcObject&&null!==this.videoElement.srcObject}getVideoElement(){return this.videoElement}getVideoParentElement(){return this.videoElement.parentElement}setVideoEnabled(e){this.videoElement.srcObject.getTracks().forEach((t=>t.enabled=e))}onVideoInitialized(){}onOrientationChange(){clearTimeout(this.orientationChangeTimeout),this.orientationChangeTimeout=window.setTimeout((()=>{this.resizePlayerStyle()}),500)}resizePlayerStyle(){const e=this.getVideoParentElement();e&&(this.updateVideoStreamSize(),e.classList.contains("fixed-size")||this.resizePlayerStyleToFillParentElement(),this.onResizePlayerCallback())}resizePlayerStyleToFillParentElement(){this.getVideoParentElement().setAttribute("style","top: 0px; left: 0px; width: 100%; height: 100%; cursor: default;")}updateVideoStreamSize(){if(this.config.isFlagEnabled(It.MatchViewportResolution))if((new Date).getTime()-this.lastTimeResized>300){const e=this.getVideoParentElement();if(!e)return;this.onMatchViewportResolutionCallback(e.clientWidth,e.clientHeight),this.lastTimeResized=(new Date).getTime()}else i.Log(i.GetStackTrace(),"Resizing too often - skipping",6),clearTimeout(this.resizeTimeoutHandle),this.resizeTimeoutHandle=window.setTimeout((()=>this.updateVideoStreamSize()),100)}}class Rn{constructor(){this.toStreamerHandlers=new Map,this.fromStreamerHandlers=new Map,this.toStreamerMessages=new Map,this.fromStreamerMessages=new Map}populateDefaultProtocol(){this.toStreamerMessages.set("IFrameRequest",{id:0,structure:[]}),this.toStreamerMessages.set("RequestQualityControl",{id:1,structure:[]}),this.toStreamerMessages.set("FpsRequest",{id:2,structure:[]}),this.toStreamerMessages.set("AverageBitrateRequest",{id:3,structure:[]}),this.toStreamerMessages.set("StartStreaming",{id:4,structure:[]}),this.toStreamerMessages.set("StopStreaming",{id:5,structure:[]}),this.toStreamerMessages.set("LatencyTest",{id:6,structure:["string"]}),this.toStreamerMessages.set("RequestInitialSettings",{id:7,structure:[]}),this.toStreamerMessages.set("TestEcho",{id:8,structure:[]}),this.toStreamerMessages.set("DataChannelLatencyTest",{id:9,structure:[]}),this.toStreamerMessages.set("UIInteraction",{id:50,structure:["string"]}),this.toStreamerMessages.set("Command",{id:51,structure:["string"]}),this.toStreamerMessages.set("KeyDown",{id:60,structure:["uint8","uint8"]}),this.toStreamerMessages.set("KeyUp",{id:61,structure:["uint8"]}),this.toStreamerMessages.set("KeyPress",{id:62,structure:["uint16"]}),this.toStreamerMessages.set("MouseEnter",{id:70,structure:[]}),this.toStreamerMessages.set("MouseLeave",{id:71,structure:[]}),this.toStreamerMessages.set("MouseDown",{id:72,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseUp",{id:73,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("MouseMove",{id:74,structure:["uint16","uint16","int16","int16"]}),this.toStreamerMessages.set("MouseWheel",{id:75,structure:["int16","uint16","uint16"]}),this.toStreamerMessages.set("MouseDouble",{id:76,structure:["uint8","uint16","uint16"]}),this.toStreamerMessages.set("TouchStart",{id:80,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchEnd",{id:81,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("TouchMove",{id:82,structure:["uint8","uint16","uint16","uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadConnected",{id:93,structure:[]}),this.toStreamerMessages.set("GamepadButtonPressed",{id:90,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadButtonReleased",{id:91,structure:["uint8","uint8","uint8"]}),this.toStreamerMessages.set("GamepadAnalog",{id:92,structure:["uint8","uint8","double"]}),this.toStreamerMessages.set("GamepadDisconnected",{id:94,structure:["uint8"]}),this.fromStreamerMessages.set(0,"QualityControlOwnership"),this.fromStreamerMessages.set(1,"Response"),this.fromStreamerMessages.set(2,"Command"),this.fromStreamerMessages.set(3,"FreezeFrame"),this.fromStreamerMessages.set(4,"UnfreezeFrame"),this.fromStreamerMessages.set(5,"VideoEncoderAvgQP"),this.fromStreamerMessages.set(6,"LatencyTest"),this.fromStreamerMessages.set(7,"InitialSettings"),this.fromStreamerMessages.set(8,"FileExtension"),this.fromStreamerMessages.set(9,"FileMimeType"),this.fromStreamerMessages.set(10,"FileContents"),this.fromStreamerMessages.set(11,"TestEcho"),this.fromStreamerMessages.set(12,"InputControlOwnership"),this.fromStreamerMessages.set(13,"GamepadResponse"),this.fromStreamerMessages.set(14,"DataChannelLatencyTest"),this.fromStreamerMessages.set(255,"Protocol")}registerMessageHandler(e,t,n){switch(e){case tn.ToStreamer:this.toStreamerHandlers.set(t,n);break;case tn.FromStreamer:this.fromStreamerHandlers.set(t,n);break;default:i.Log(i.GetStackTrace(),`Unknown message direction ${e}`)}}}!function(e){e[e.ToStreamer=0]="ToStreamer",e[e.FromStreamer=1]="FromStreamer"}(tn||(tn={}));class Pn{constructor(){this.responseEventListeners=new Map}addResponseEventListener(e,t){this.responseEventListeners.set(e,t)}removeResponseEventListener(e){this.responseEventListeners.delete(e)}onResponse(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.Response",6);const t=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),t,6),this.responseEventListeners.forEach((e=>{e(t)}))}}class Ln{constructor(e,t){this.dataChannelSender=e,this.toStreamerMessagesMapProvider=t}sendMessageToStreamer(e,t){void 0===t&&(t=[]);const n=this.toStreamerMessagesMapProvider.toStreamerMessages.get(e);if(void 0===n)return void i.Error(i.GetStackTrace(),`Attempted to send a message to the streamer with message type: ${e}, but the frontend hasn't been configured to send such a message. Check you've added the message type in your cpp`);if(n.structure&&t&&n.structure.length!==t.length)return void i.Error(i.GetStackTrace(),`Provided message data doesn't match expected layout. Expected [ ${n.structure.map((e=>{switch(e){case"uint8":case"uint16":case"int16":case"float":case"double":return"number";case"string":return"string"}})).toString()} ] but received [ ${t.map((e=>typeof e)).toString()} ]`);let r=0;const s=new TextEncoder;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":r+=1;break;case"uint16":case"int16":r+=2;break;case"float":r+=4;break;case"double":r+=8;break;case"string":r+=2,r+=2*s.encode(e).length}}));const a=new DataView(new ArrayBuffer(r+1));a.setUint8(0,n.id);let o=1;t.forEach(((e,t)=>{switch(n.structure[t]){case"uint8":a.setUint8(o,e),o+=1;break;case"uint16":a.setUint16(o,e,!0),o+=2;break;case"int16":a.setInt16(o,e,!0),o+=2;break;case"float":a.setFloat32(o,e,!0),o+=4;break;case"double":a.setFloat64(o,e,!0),o+=8;break;case"string":a.setUint16(o,e.length,!0),o+=2;for(let t=0;t<e.length;t++)a.setUint16(o,e.charCodeAt(t),!0),o+=2}})),this.dataChannelSender.canSend()?this.dataChannelSender.sendData(a.buffer):i.Info(i.GetStackTrace(),`Data channel cannot send yet, skipping sending message: ${e} - ${new Uint8Array(a.buffer)}`)}}class In{constructor(e){this.sendMessageController=e}SendRequestQualityControl(){this.sendMessageController.sendMessageToStreamer("RequestQualityControl")}SendMaxFpsRequest(){this.sendMessageController.sendMessageToStreamer("FpsRequest")}SendAverageBitrateRequest(){this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest")}SendStartStreaming(){this.sendMessageController.sendMessageToStreamer("StartStreaming")}SendStopStreaming(){this.sendMessageController.sendMessageToStreamer("StopStreaming")}SendRequestInitialSettings(){this.sendMessageController.sendMessageToStreamer("RequestInitialSettings")}}class Fn{constructor(e){this.dataChannelProvider=e}canSend(){return void 0!==this.dataChannelProvider.getDataChannelInstance().dataChannel&&"open"==this.dataChannelProvider.getDataChannelInstance().dataChannel.readyState}sendData(e){const t=this.dataChannelProvider.getDataChannelInstance();"open"==t.dataChannel.readyState?(t.dataChannel.send(e),i.Log(i.GetStackTrace(),`Message Sent: ${new Uint8Array(e)}`,6),this.resetAfkWarningTimerOnDataSend()):i.Error(i.GetStackTrace(),`Message Failed: ${new Uint8Array(e)}`)}resetAfkWarningTimerOnDataSend(){}}class On{constructor(e){this.videoElementProvider=e,this.normalizeAndQuantizeUnsignedFunc=()=>{throw new Error("Normalize and quantize unsigned, method not implemented.")},this.normalizeAndQuantizeSignedFunc=()=>{throw new Error("Normalize and unquantize signed, method not implemented.")},this.denormalizeAndUnquantizeUnsignedFunc=()=>{throw new Error("Denormalize and unquantize unsigned, method not implemented.")}}normalizeAndQuantizeUnsigned(e,t){return this.normalizeAndQuantizeUnsignedFunc(e,t)}unquantizeAndDenormalizeUnsigned(e,t){return this.denormalizeAndUnquantizeUnsignedFunc(e,t)}normalizeAndQuantizeSigned(e,t){return this.normalizeAndQuantizeSignedFunc(e,t)}setupNormalizeAndQuantize(){if(this.videoElementParent=this.videoElementProvider.getVideoParentElement(),this.videoElement=this.videoElementProvider.getVideoElement(),this.videoElementParent&&this.videoElement){const e=this.videoElementParent.clientHeight/this.videoElementParent.clientWidth,t=this.videoElement.videoHeight/this.videoElement.videoWidth;e>t?(i.Log(i.GetStackTrace(),"Setup Normalize and Quantize for playerAspectRatio > videoAspectRatio",6),this.ratio=e/t,this.normalizeAndQuantizeUnsignedFunc=(e,t)=>this.normalizeAndQuantizeUnsignedPlayerBigger(e,t),this.normalizeAndQuantizeSignedFunc=(e,t)=>this.normalizeAndQuantizeSignedPlayerBigger(e,t),this.denormalizeAndUnquantizeUnsignedFunc=(e,t)=>this.denormalizeAndUnquantizeUnsignedPlayerBigger(e,t)):(i.Log(i.GetStackTrace(),"Setup Normalize and Quantize for playerAspectRatio <= videoAspectRatio",6),this.ratio=t/e,this.normalizeAndQuantizeUnsignedFunc=(e,t)=>this.normalizeAndQuantizeUnsignedPlayerSmaller(e,t),this.normalizeAndQuantizeSignedFunc=(e,t)=>this.normalizeAndQuantizeSignedPlayerSmaller(e,t),this.denormalizeAndUnquantizeUnsignedFunc=(e,t)=>this.denormalizeAndUnquantizeUnsignedPlayerSmaller(e,t))}}normalizeAndQuantizeUnsignedPlayerBigger(e,t){const n=e/this.videoElementParent.clientWidth,r=this.ratio*(t/this.videoElementParent.clientHeight-.5)+.5;return n<0||n>1||r<0||r>1?new xn(!1,65535,65535):new xn(!0,65536*n,65536*r)}denormalizeAndUnquantizeUnsignedPlayerBigger(e,t){const n=e/65536,r=(t/65536-.5)/this.ratio+.5;return new Dn(n*this.videoElementParent.clientWidth,r*this.videoElementParent.clientHeight)}normalizeAndQuantizeSignedPlayerBigger(e,t){const n=e/(.5*this.videoElementParent.clientWidth),r=this.ratio*t/(.5*this.videoElementParent.clientHeight);return new An(32767*n,32767*r)}normalizeAndQuantizeUnsignedPlayerSmaller(e,t){const n=this.ratio*(e/this.videoElementParent.clientWidth-.5)+.5,r=t/this.videoElementParent.clientHeight;return n<0||n>1||r<0||r>1?new xn(!1,65535,65535):new xn(!0,65536*n,65536*r)}denormalizeAndUnquantizeUnsignedPlayerSmaller(e,t){const n=(e/65536-.5)/this.ratio+.5,r=t/65536;return new Dn(n*this.videoElementParent.clientWidth,r*this.videoElementParent.clientHeight)}normalizeAndQuantizeSignedPlayerSmaller(e,t){const n=this.ratio*e/(.5*this.videoElementParent.clientWidth),r=t/(.5*this.videoElementParent.clientHeight);return new An(32767*n,32767*r)}}class xn{constructor(e,t,n){this.inRange=e,this.x=t,this.y=n}}class Dn{constructor(e,t){this.x=e,this.y=t}}class An{constructor(e,t){this.x=e,this.y=t}}class Un{constructor(e,t){this.shouldShowPlayOverlay=!0,this.autoJoinTimer=void 0,this.config=e,this.pixelStreaming=t,this.responseController=new Pn,this.file=new hn,this.sdpConstraints={offerToReceiveAudio:!0,offerToReceiveVideo:!0},this.afkController=new Gt(this.config,this.pixelStreaming,this.onAfkTriggered.bind(this)),this.afkController.onAFKTimedOutCallback=()=>{this.closeSignalingServer("You have been disconnected due to inactivity")},this.freezeFrameController=new Ge(this.pixelStreaming.videoElementParent),this.videoPlayer=new Mn(this.pixelStreaming.videoElementParent,this.config),this.videoPlayer.onVideoInitialized=()=>this.handleVideoInitialized(),this.videoPlayer.onMatchViewportResolutionCallback=(e,t)=>{const n={"Resolution.Width":e,"Resolution.Height":t};this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(n)])},this.videoPlayer.onResizePlayerCallback=()=>{this.setUpMouseAndFreezeFrame()},this.streamController=new Be(this.videoPlayer),this.coordinateConverter=new On(this.videoPlayer),this.sendrecvDataChannelController=new Wt,this.recvDataChannelController=new Wt,this.registerDataChannelEventEmitters(this.sendrecvDataChannelController),this.registerDataChannelEventEmitters(this.recvDataChannelController),this.dataChannelSender=new Fn(this.sendrecvDataChannelController),this.dataChannelSender.resetAfkWarningTimerOnDataSend=()=>this.afkController.resetAfkWarningTimer(),this.streamMessageController=new Rn,this.transport=new c,this.protocol=new Ne(this.transport),this.protocol.addListener(ae.typeName,(e=>this.handleOnConfigMessage(e))),this.protocol.addListener(ue.typeName,(e=>this.handleStreamerListMessage(e))),this.protocol.addListener(de.typeName,(e=>this.handleStreamerIDChangedMessage(e))),this.protocol.addListener(Oe.typeName,(e=>{const t=e;this.pixelStreaming._onPlayerCount(t.count)})),this.protocol.addListener(ye.typeName,(e=>this.handleWebRtcAnswer(e))),this.protocol.addListener(ve.typeName,(e=>this.handleWebRtcOffer(e))),this.protocol.addListener(Re.typeName,(e=>this.handleWebRtcSFUPeerDatachannels(e))),this.protocol.addListener(we.typeName,(e=>{const t=e;this.handleIceCandidate(t.candidate)})),this.protocol.transport.addListener("open",(()=>{if(!this.config.isFlagEnabled(It.BrowserSendOffer)){const e=Ae(he);this.protocol.sendMessage(e)}this.reconnectAttempt=0})),this.protocol.transport.addListener("error",(()=>{i.Error(i.GetStackTrace(),"Got a transport error.")})),this.protocol.transport.addListener("close",(e=>{const t=this.shouldReconnect&&1001!=e.code&&this.config.getNumericSettingValue(Ot.MaxReconnectAttempts)>0,n=this.disconnectMessage?this.disconnectMessage:e.reason;this.pixelStreaming._onDisconnect(n,!t&&!this.isReconnecting),this.afkController.stopAfkWarningTimer(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.setVideoEncoderAvgQP(0),this.setTouchInputEnabled(!1),this.setMouseInputEnabled(!1),this.setKeyboardInputEnabled(!1),this.setGamePadInputEnabled(!1),t&&setTimeout((()=>{this.isReconnecting=!0,this.reconnectAttempt++,this.tryReconnect(e.reason)}),2e3)})),this.sendMessageController=new Ln(this.dataChannelSender,this.streamMessageController),this.toStreamerMessagesController=new In(this.sendMessageController),this.registerMessageHandlers(),this.streamMessageController.populateDefaultProtocol(),this.inputClassesFactory=new En(this.streamMessageController,this.videoPlayer,this.coordinateConverter),this.isUsingSFU=!1,this.isQualityController=!1,this.preferredCodec="",this.shouldReconnect=!0,this.isReconnecting=!1,this.reconnectAttempt=0,this.config._addOnOptionSettingChangedListener(Ut.StreamerId,(e=>{if(""===e)return;this.peerConnectionController.peerConnection.close(),this.peerConnectionController.createPeerConnection(this.peerConfig,this.preferredCodec),this.subscribedStream=e;const t=Ae(ge,{streamerId:e});this.protocol.sendMessage(t)})),this.setVideoEncoderAvgQP(-1),this.signallingUrlBuilder=()=>{let e=this.config.getTextSettingValue(Dt.SignallingServerUrl);return this.config.isFlagEnabled(It.BrowserSendOffer)&&(e+="?"+It.BrowserSendOffer+"=true"),e}}requestUnquantizedAndDenormalizeUnsigned(e,t){return this.coordinateConverter.unquantizeAndDenormalizeUnsigned(e,t)}handleOnMessage(e){const t=new Uint8Array(e.data);i.Log(i.GetStackTrace(),"Message incoming:"+t,6);const n=this.streamMessageController.fromStreamerMessages.get(t[0]);this.streamMessageController.fromStreamerHandlers.get(n)(e.data)}registerMessageHandlers(){this.streamMessageController.registerMessageHandler(tn.FromStreamer,"QualityControlOwnership",(e=>this.onQualityControlOwnership(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"Response",(e=>this.responseController.onResponse(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"Command",(e=>{this.onCommand(e)})),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FreezeFrame",(e=>this.onFreezeFrameMessage(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"UnfreezeFrame",(()=>this.invalidateFreezeFrameAndEnableVideo())),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"VideoEncoderAvgQP",(e=>this.handleVideoEncoderAvgQP(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"LatencyTest",(e=>this.handleLatencyTestResult(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"DataChannelLatencyTest",(e=>this.handleDataChannelLatencyTestResponse(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"InitialSettings",(e=>this.handleInitialSettings(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FileExtension",(e=>this.onFileExtension(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FileMimeType",(e=>this.onFileMimeType(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"FileContents",(e=>this.onFileContents(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"InputControlOwnership",(e=>this.onInputControlOwnership(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"GamepadResponse",(e=>this.onGamepadResponse(e))),this.streamMessageController.registerMessageHandler(tn.FromStreamer,"Protocol",(e=>this.onProtocolMessage(e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"IFrameRequest",(()=>this.sendMessageController.sendMessageToStreamer("IFrameRequest"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"RequestQualityControl",(()=>this.sendMessageController.sendMessageToStreamer("RequestQualityControl"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"FpsRequest",(()=>this.sendMessageController.sendMessageToStreamer("FpsRequest"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"AverageBitrateRequest",(()=>this.sendMessageController.sendMessageToStreamer("AverageBitrateRequest"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"StartStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StartStreaming"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"StopStreaming",(()=>this.sendMessageController.sendMessageToStreamer("StopStreaming"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"LatencyTest",(e=>this.sendMessageController.sendMessageToStreamer("LatencyTest",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"RequestInitialSettings",(()=>this.sendMessageController.sendMessageToStreamer("RequestInitialSettings"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TestEcho",(()=>{})),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"UIInteraction",(e=>this.sendMessageController.sendMessageToStreamer("UIInteraction",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"Command",(e=>this.sendMessageController.sendMessageToStreamer("Command",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TextboxEntry",(e=>this.sendMessageController.sendMessageToStreamer("TextboxEntry",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"KeyDown",(e=>this.sendMessageController.sendMessageToStreamer("KeyDown",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"KeyUp",(e=>this.sendMessageController.sendMessageToStreamer("KeyUp",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"KeyPress",(e=>this.sendMessageController.sendMessageToStreamer("KeyPress",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseEnter",(e=>this.sendMessageController.sendMessageToStreamer("MouseEnter",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseLeave",(e=>this.sendMessageController.sendMessageToStreamer("MouseLeave",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseDown",(e=>this.sendMessageController.sendMessageToStreamer("MouseDown",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseUp",(e=>this.sendMessageController.sendMessageToStreamer("MouseUp",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseMove",(e=>this.sendMessageController.sendMessageToStreamer("MouseMove",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseWheel",(e=>this.sendMessageController.sendMessageToStreamer("MouseWheel",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"MouseDouble",(e=>this.sendMessageController.sendMessageToStreamer("MouseDouble",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TouchStart",(e=>this.sendMessageController.sendMessageToStreamer("TouchStart",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TouchEnd",(e=>this.sendMessageController.sendMessageToStreamer("TouchEnd",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"TouchMove",(e=>this.sendMessageController.sendMessageToStreamer("TouchMove",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadConnected",(()=>this.sendMessageController.sendMessageToStreamer("GamepadConnected"))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonPressed",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("GamepadButtonReleased",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadAnalog",(e=>this.sendMessageController.sendMessageToStreamer("GamepadAnalog",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"GamepadDisconnected",(e=>this.sendMessageController.sendMessageToStreamer("GamepadDisconnected",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRHMDTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRHMDTransform",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRControllerTransform",(e=>this.sendMessageController.sendMessageToStreamer("XRControllerTransform",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRSystem",(e=>this.sendMessageController.sendMessageToStreamer("XRSystem",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRButtonTouched",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonTouched",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRButtonPressed",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonPressed",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRButtonReleased",(e=>this.sendMessageController.sendMessageToStreamer("XRButtonReleased",e))),this.streamMessageController.registerMessageHandler(tn.ToStreamer,"XRAnalog",(e=>this.sendMessageController.sendMessageToStreamer("XRAnalog",e)))}onCommand(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.Command",6);const t=new TextDecoder("utf-16").decode(e.slice(1));i.Log(i.GetStackTrace(),"Data Channel Command: "+t,6);const n=JSON.parse(t);"onScreenKeyboard"===n.command&&this.pixelStreaming._activateOnScreenKeyboard(n)}onProtocolMessage(e){try{const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);Object.prototype.hasOwnProperty.call(n,"Direction")||i.Error(i.GetStackTrace(),"Malformed protocol received. Ensure the protocol message contains a direction");const r=n.Direction;delete n.Direction,i.Log(i.GetStackTrace(),`Received new ${r==tn.FromStreamer?"FromStreamer":"ToStreamer"} protocol. Updating existing protocol...`),Object.keys(n).forEach((e=>{const t=n[e];switch(r){case tn.ToStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void i.Error(i.GetStackTrace(),`ToStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);if("UIInteraction"===e||"Command"===e||"LatencyTest"===e)return;this.streamMessageController.toStreamerHandlers.get(e)?this.streamMessageController.toStreamerMessages.set(e,t):i.Error(i.GetStackTrace(),`There was no registered handler for "${e}" - try adding one using registerMessageHandler(MessageDirection.ToStreamer, "${e}", myHandler)`);break;case tn.FromStreamer:if(!Object.prototype.hasOwnProperty.call(t,"id"))return void i.Error(i.GetStackTrace(),`FromStreamer->${e} protocol definition was malformed as it didn't contain at least an id\n\n Definition was: ${JSON.stringify(t,null,2)}`);this.streamMessageController.fromStreamerHandlers.get(e)?this.streamMessageController.fromStreamerMessages.set(t.id,e):i.Error(i.GetStackTrace(),`There was no registered handler for "${t}" - try adding one using registerMessageHandler(MessageDirection.FromStreamer, "${e}", myHandler)`);break;default:i.Error(i.GetStackTrace(),`Unknown direction: ${r}`)}})),this.toStreamerMessagesController.SendRequestInitialSettings(),this.toStreamerMessagesController.SendRequestQualityControl()}catch(e){i.Log(i.GetStackTrace(),e)}}onInputControlOwnership(e){const t=new Uint8Array(e);i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.InputControlOwnership",6);const n=new Boolean(t[1]).valueOf();i.Log(i.GetStackTrace(),`Received input controller message - will your input control the stream: ${n}`),this.pixelStreaming._onInputControlOwnership(n)}onGamepadResponse(e){const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.gamePadController.onGamepadResponseReceived(n.controllerId)}onAfkTriggered(){this.afkController.onAfkClick(),this.videoPlayer.isPaused()&&this.videoPlayer.hasVideoSource()&&this.playStream()}setAfkEnabled(e){e?this.onAfkTriggered():this.afkController.stopAfkWarningTimer()}tryReconnect(e){this.protocol?(this.isReconnecting=!0,this.protocol.isConnected()?(this.closeSignalingServer(`${e} Restarting stream...`),setTimeout((()=>{this.tryReconnect(e)}),3e3)):(this.pixelStreaming._onWebRtcAutoConnect(),this.connectToSignallingServer())):i.Log(i.GetStackTrace(),"This player has no protocol connection.")}loadFreezeFrameOrShowPlayOverlay(){this.pixelStreaming.dispatchEvent(new mt({shouldShowPlayOverlay:this.shouldShowPlayOverlay,isValid:this.freezeFrameController.valid,jpegData:this.freezeFrameController.jpeg})),!0===this.shouldShowPlayOverlay?(i.Log(i.GetStackTrace(),"showing play overlay"),this.resizePlayerStyle()):(i.Log(i.GetStackTrace(),"showing freeze frame"),this.freezeFrameController.showFreezeFrame()),setTimeout((()=>{this.videoPlayer.setVideoEnabled(!1)}),this.freezeFrameController.freezeFrameDelay)}onFreezeFrameMessage(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.FreezeFrame",6);const t=new Uint8Array(e);this.freezeFrameController.processFreezeFrameMessage(t,(()=>this.loadFreezeFrameOrShowPlayOverlay()))}invalidateFreezeFrameAndEnableVideo(){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.FreezeFrame",6),setTimeout((()=>{this.pixelStreaming.dispatchEvent(new pt),this.freezeFrameController.hideFreezeFrame()}),this.freezeFrameController.freezeFrameDelay),this.videoPlayer.getVideoElement()&&this.videoPlayer.setVideoEnabled(!0)}onFileExtension(e){const t=new Uint8Array(e);dn.setExtensionFromBytes(t,this.file)}onFileMimeType(e){const t=new Uint8Array(e);dn.setMimeTypeFromBytes(t,this.file)}onFileContents(e){const t=new Uint8Array(e);dn.setContentsFromBytes(t,this.file)}playStream(){if(!this.videoPlayer.getVideoElement()){const e="Could not play video stream because the video player was not initialized correctly.";return this.pixelStreaming.dispatchEvent(new ht({message:e})),i.Error(i.GetStackTrace(),e),void this.closeSignalingServer("Stream not initialized correctly")}if(this.videoPlayer.hasVideoSource()){if(this.setTouchInputEnabled(this.config.isFlagEnabled(It.TouchInput)),this.pixelStreaming.dispatchEvent(new ut),this.streamController.audioElement.srcObject){const e=this.config.isFlagEnabled(It.StartVideoMuted);this.streamController.audioElement.muted=e,e?this.playVideo():this.streamController.audioElement.play().then((()=>{this.playVideo()})).catch((e=>{i.Log(i.GetStackTrace(),e),i.Log(i.GetStackTrace(),"Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new gt({reason:e}))}))}else this.playVideo();this.shouldShowPlayOverlay=!1,this.freezeFrameController.showFreezeFrame()}else i.Warning(i.GetStackTrace(),"Cannot play stream, the video element has no srcObject to play.")}playVideo(){this.videoPlayer.play().catch((e=>{this.streamController.audioElement.srcObject&&this.streamController.audioElement.pause(),i.Log(i.GetStackTrace(),e),i.Log(i.GetStackTrace(),"Browser does not support autoplaying video without interaction - to resolve this we are going to show the play button overlay."),this.pixelStreaming.dispatchEvent(new gt({reason:e}))}))}autoPlayVideoOrSetUpPlayOverlay(){this.config.isFlagEnabled(It.AutoPlayVideo)&&this.playStream(),this.resizePlayerStyle()}connectToSignallingServer(){this.locallyClosed=!1,this.shouldReconnect=!0,this.disconnectMessage=null;const e=this.signallingUrlBuilder();this.protocol.connect(e)}startSession(e){if(this.peerConfig=e,this.config.isFlagEnabled(It.ForceTURN)&&!this.checkTurnServerAvailability(e))return i.Info(i.GetStackTrace(),"No turn server was found in the Peer Connection Options. TURN cannot be forced, closing connection. Please use STUN instead"),void this.closeSignalingServer("TURN cannot be forced, closing connection. Please use STUN instead.");this.peerConnectionController=new rn(this.peerConfig,this.config,this.preferredCodec),this.peerConnectionController.onVideoStats=e=>this.handleVideoStats(e),this.peerConnectionController.onSendWebRTCOffer=e=>this.handleSendWebRTCOffer(e),this.peerConnectionController.onSendWebRTCAnswer=e=>this.handleSendWebRTCAnswer(e),this.peerConnectionController.onPeerIceCandidate=e=>this.handleSendIceCandidate(e),this.peerConnectionController.onDataChannel=e=>this.handleDataChannel(e),this.peerConnectionController.showTextOverlayConnecting=()=>this.pixelStreaming._onWebRtcConnecting(),this.peerConnectionController.showTextOverlaySetupFailure=()=>this.pixelStreaming._onWebRtcFailed();let t=!1;this.peerConnectionController.onIceConnectionStateChange=()=>{!t&&["connected","completed"].includes(this.peerConnectionController.peerConnection.iceConnectionState)&&(this.pixelStreaming._onWebRtcConnected(),t=!0)},this.peerConnectionController.onTrack=e=>this.streamController.handleOnTrack(e),this.config.isFlagEnabled(It.BrowserSendOffer)&&(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"cirrus",this.datachannelOptions),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e),this.peerConnectionController.createOffer(this.sdpConstraints,this.config))}checkTurnServerAvailability(e){if(!e.iceServers)return i.Info(i.GetStackTrace(),"A turn sever was not found"),!1;for(const t of e.iceServers)for(const e of t.urls)if(e.includes("turn"))return i.Log(i.GetStackTrace(),`A turn sever was found at ${e}`),!0;return i.Info(i.GetStackTrace(),"A turn sever was not found"),!1}handleOnConfigMessage(e){this.resizePlayerStyle(),this.startSession(e.peerConnectionOptions)}handleStreamerListMessage(e){i.Log(i.GetStackTrace(),`Got streamer list ${e.ids}`,6);let t="";const n=this.config.getSettingOption(Ut.StreamerId);n.selected.toString().trim()&&(t=n.selected);const r=[...e.ids];r.unshift(""),this.config.setOptionSettingOptions(Ut.StreamerId,r);let s="";const a=this.config.isFlagEnabled(It.WaitForStreamer),o=this.config.getNumericSettingValue(Ot.MaxReconnectAttempts),l=this.config.getNumericSettingValue(Ot.StreamerAutoJoinInterval),c=this.config.useUrlParams,d=new URLSearchParams(window.location.search);c&&d.has(Ut.StreamerId)?t=d.get(Ut.StreamerId):this.subscribedStream&&(t=this.subscribedStream),t&&e.ids.includes(t)?s=t:t&&a||1!=e.ids.length||(s=e.ids[0]),s?(this.isReconnecting=!1,this.reconnectAttempt=0,this.config.setOptionSettingValue(Ut.StreamerId,s)):a&&(this.reconnectAttempt<o?(this.isReconnecting=!0,this.reconnectAttempt++,setTimeout((()=>{this.protocol.sendMessage(Ae(he))}),l)):(this.reconnectAttempt=0,this.isReconnecting=!1,this.shouldReconnect=!1)),this.pixelStreaming.dispatchEvent(new vt({messageStreamerList:e,autoSelectedStreamerId:s,wantedStreamerId:t}))}handleStreamerIDChangedMessage(e){const t=e.newID,n=this.config.getSettingOption(Ut.StreamerId),r=n.onChange;n.onChange=()=>{};const s=n.options;for(let e=0;e<s.length;++e)if(s[e]==this.subscribedStream){s[e]=t;break}n.options=s,n.selected=t,n.onChange=r,this.subscribedStream=e.newID,this.pixelStreaming.dispatchEvent(new yt({newID:t}))}handleWebRtcAnswer(e){i.Log(i.GetStackTrace(),`Got answer sdp ${e.sdp}`,6);const t={sdp:e.sdp,type:"answer"};this.peerConnectionController.receiveAnswer(t),this.handlePostWebrtcNegotiation()}handleWebRtcOffer(e){i.Log(i.GetStackTrace(),`Got offer sdp ${e.sdp}`,6),this.isUsingSFU=!!e.sfu&&e.sfu,this.isUsingSFU&&(this.peerConnectionController.preferredCodec="");const t={sdp:e.sdp,type:"offer"};this.peerConnectionController.receiveOffer(t,this.config),this.handlePostWebrtcNegotiation()}handleWebRtcSFUPeerDatachannels(e){const t={ordered:!0,negotiated:!0,id:e.sendStreamId},n=e.sendStreamId!=e.recvStreamId;if(this.sendrecvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,n?"send-datachannel":"datachannel",t),n){const t={ordered:!0,negotiated:!0,id:e.recvStreamId};this.recvDataChannelController.createDataChannel(this.peerConnectionController.peerConnection,"recv-datachannel",t),this.recvDataChannelController.handleOnOpen=()=>this.protocol.sendMessage(Ae(Pe)),this.recvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}else this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handlePostWebrtcNegotiation(){this.afkController.startAfkWarningTimer(),this.pixelStreaming._onWebRtcSdp(),this.statsTimerHandle&&void 0!==this.statsTimerHandle&&window.clearInterval(this.statsTimerHandle),this.statsTimerHandle=window.setInterval((()=>this.getStats()),1e3),this.setMouseInputEnabled(this.config.isFlagEnabled(It.MouseInput)),this.setKeyboardInputEnabled(this.config.isFlagEnabled(It.KeyboardInput)),this.setGamePadInputEnabled(this.config.isFlagEnabled(It.GamepadInput))}handleIceCandidate(e){i.Log(i.GetStackTrace(),"Web RTC Controller: onWebRtcIce",6);const t=new RTCIceCandidate(e);this.peerConnectionController.handleOnIce(t)}handleSendIceCandidate(e){i.Log(i.GetStackTrace(),"OnIceCandidate",6),e.candidate&&e.candidate.candidate&&this.protocol.sendMessage(Ae(we,{candidate:e.candidate}))}handleDataChannel(e){i.Log(i.GetStackTrace(),"Data channel created for us by browser as we are a receiving peer.",6),this.sendrecvDataChannelController.dataChannel=e.channel,this.sendrecvDataChannelController.setupDataChannel(),this.sendrecvDataChannelController.handleOnMessage=e=>this.handleOnMessage(e)}handleSendWebRTCOffer(e){i.Log(i.GetStackTrace(),"Sending the offer to the Server",6);const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(Ot.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(Ot.WebRTCMaxBitrate)};this.protocol.sendMessage(Ae(ve,t))}handleSendWebRTCAnswer(e){i.Log(i.GetStackTrace(),"Sending the answer to the Server",6);const t={sdp:e.sdp,minBitrateBps:1e3*this.config.getNumericSettingValue(Ot.WebRTCMinBitrate),maxBitrateBps:1e3*this.config.getNumericSettingValue(Ot.WebRTCMaxBitrate)};this.protocol.sendMessage(Ae(ye,t)),this.isUsingSFU&&this.protocol.sendMessage(Ae(Me))}setUpMouseAndFreezeFrame(){this.videoElementParentClientRect=this.videoPlayer.getVideoParentElement().getBoundingClientRect(),this.coordinateConverter.setupNormalizeAndQuantize(),this.freezeFrameController.freezeFrame.resize()}closeSignalingServer(e){var t;this.locallyClosed=!0,this.shouldReconnect=!1,this.disconnectMessage=e,null===(t=this.protocol)||void 0===t||t.disconnect()}closePeerConnection(){var e;null===(e=this.peerConnectionController)||void 0===e||e.close()}close(){this.closeSignalingServer(""),this.closePeerConnection()}getStats(){this.peerConnectionController.generateStats()}sendLatencyTest(){this.latencyStartTime=Date.now(),this.streamMessageController.toStreamerHandlers.get("LatencyTest")([JSON.stringify({StartTime:this.latencyStartTime})])}sendDataChannelLatencyTest(e){this.streamMessageController.toStreamerHandlers.get("DataChannelLatencyTest")([JSON.stringify(e)])}sendEncoderMinQP(e){i.Log(i.GetStackTrace(),`MinQP=${e}\n`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MinQP":e})])}sendEncoderMaxQP(e){i.Log(i.GetStackTrace(),`MaxQP=${e}\n`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"Encoder.MaxQP":e})])}sendWebRTCMinBitrate(e){i.Log(i.GetStackTrace(),`WebRTC Min Bitrate=${e}`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MinBitrate":e})])}sendWebRTCMaxBitrate(e){i.Log(i.GetStackTrace(),`WebRTC Max Bitrate=${e}`,6),null!=e&&this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxBitrate":e})])}sendWebRTCFps(e){i.Log(i.GetStackTrace(),`WebRTC FPS=${e}`,6),null!=e&&(this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.Fps":e})]),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"WebRTC.MaxFps":e})]))}sendShowFps(){i.Log(i.GetStackTrace(),"---- Sending show stat to UE ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({"stat.fps":""})])}sendIframeRequest(){i.Log(i.GetStackTrace(),"---- Sending Request for an IFrame ----",6),this.streamMessageController.toStreamerHandlers.get("IFrameRequest")()}emitUIInteraction(e){i.Log(i.GetStackTrace(),"---- Sending custom UIInteraction message ----",6),this.streamMessageController.toStreamerHandlers.get("UIInteraction")([JSON.stringify(e)])}emitCommand(e){i.Log(i.GetStackTrace(),"---- Sending custom Command message ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify(e)])}emitConsoleCommand(e){i.Log(i.GetStackTrace(),"---- Sending custom Command:ConsoleCommand message ----",6),this.streamMessageController.toStreamerHandlers.get("Command")([JSON.stringify({ConsoleCommand:e})])}sendRequestQualityControlOwnership(){i.Log(i.GetStackTrace(),"---- Sending Request to Control Quality ----",6),this.toStreamerMessagesController.SendRequestQualityControl()}handleLatencyTestResult(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.latencyTest",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=new cn;Object.assign(n,JSON.parse(t)),n.processFields(),n.testStartTimeMs=this.latencyStartTime,n.browserReceiptTimeMs=Date.now(),n.latencyExcludingDecode=~~(n.browserReceiptTimeMs-n.testStartTimeMs),n.testDuration=~~(n.TransmissionTimeMs-n.ReceiptTimeMs),n.networkLatency=~~(n.latencyExcludingDecode-n.testDuration),n.frameDisplayDeltaTimeMs&&n.browserReceiptTimeMs&&(n.endToEndLatency=(n.frameDisplayDeltaTimeMs,n.networkLatency,~~+n.CaptureToSendMs)),this.pixelStreaming._onLatencyTestResult(n)}handleDataChannelLatencyTestResponse(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.dataChannelLatencyResponse",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t);this.pixelStreaming._onDataChannelLatencyTestResponse(n)}handleInitialSettings(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.InitialSettings",6);const t=new TextDecoder("utf-16").decode(e.slice(1)),n=JSON.parse(t),r=new sn;n.Encoder&&(r.EncoderSettings=n.Encoder),n.WebRTC&&(r.WebRTCSettings=n.WebRTC),n.PixelStreaming&&(r.PixelStreamingSettings=n.PixelStreaming),n.ConfigOptions&&void 0!==n.ConfigOptions.DefaultToHover&&this.config.setFlagEnabled(It.HoveringMouseMode,!!n.ConfigOptions.DefaultToHover),r.ueCompatible(),i.Log(i.GetStackTrace(),t,6),this.pixelStreaming._onInitialSettings(r)}handleVideoEncoderAvgQP(e){i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.VideoEncoderAvgQP",6);const t=Number(new TextDecoder("utf-16").decode(e.slice(1)));this.setVideoEncoderAvgQP(t)}handleVideoInitialized(){this.pixelStreaming._onVideoInitialized(),this.autoPlayVideoOrSetUpPlayOverlay(),this.resizePlayerStyle(),this.videoPlayer.updateVideoStreamSize()}onQualityControlOwnership(e){const t=new Uint8Array(e);i.Log(i.GetStackTrace(),"DataChannelReceiveMessageType.QualityControlOwnership",6),this.isQualityController=new Boolean(t[1]).valueOf(),i.Log(i.GetStackTrace(),`Received quality controller message, will control quality: ${this.isQualityController}`),this.pixelStreaming._onQualityControlOwnership(this.isQualityController)}handleVideoStats(e){this.pixelStreaming._onVideoStats(e)}resizePlayerStyle(){this.videoPlayer.resizePlayerStyle()}setPreferredCodec(e){this.preferredCodec=e,this.peerConnectionController&&(this.peerConnectionController.preferredCodec=e,this.peerConnectionController.updateCodecSelection=!1)}setVideoEncoderAvgQP(e){this.videoAvgQp=e,this.pixelStreaming._onVideoEncoderAvgQP(this.videoAvgQp)}setKeyboardInputEnabled(e){var t;null===(t=this.keyboardController)||void 0===t||t.unregisterKeyBoardEvents(),e&&(this.keyboardController=this.inputClassesFactory.registerKeyBoard(this.config))}setMouseInputEnabled(e){var t;if(null===(t=this.mouseController)||void 0===t||t.unregisterMouseEvents(),e){const e=this.config.isFlagEnabled(It.HoveringMouseMode)?Vt.HoveringMouse:Vt.LockedMouse;this.mouseController=this.inputClassesFactory.registerMouse(e)}}setTouchInputEnabled(e){var t;null===(t=this.touchController)||void 0===t||t.unregisterTouchEvents(),e&&(this.touchController=this.inputClassesFactory.registerTouch(this.config.isFlagEnabled(It.FakeMouseWithTouches),this.videoElementParentClientRect))}setGamePadInputEnabled(e){var t;null===(t=this.gamePadController)||void 0===t||t.unregisterGamePadEvents(),e&&(this.gamePadController=this.inputClassesFactory.registerGamePad(),this.gamePadController.onGamepadConnected=()=>{this.streamMessageController.toStreamerHandlers.get("GamepadConnected")()},this.gamePadController.onGamepadDisconnected=e=>{this.streamMessageController.toStreamerHandlers.get("GamepadDisconnected")([e])})}registerDataChannelEventEmitters(e){e.onOpen=(e,t)=>this.pixelStreaming.dispatchEvent(new rt({label:e,event:t})),e.onClose=(e,t)=>this.pixelStreaming.dispatchEvent(new st({label:e,event:t})),e.onError=(e,t)=>this.pixelStreaming.dispatchEvent(new it({label:e,event:t}))}registerMessageHandler(e,t,n){t===tn.FromStreamer&&void 0===n&&i.Warning(i.GetStackTrace(),`Unable to register handler for ${e} as no handler was passed`),this.streamMessageController.registerMessageHandler(t,e,(r=>void 0===n&&t===tn.ToStreamer?this.sendMessageController.sendMessageToStreamer(e,r):n(r)))}}class Nn{static vertexShader(){return"\n\t\tattribute vec2 a_position;\n\t\tattribute vec2 a_texCoord;\n\n\t\t// input\n\t\tuniform vec2 u_resolution;\n\t\tuniform vec4 u_offset;\n\n\t\t//\n\t\tvarying vec2 v_texCoord;\n\n\t\tvoid main() {\n\t\t // convert the rectangle from pixels to 0.0 to 1.0\n\t\t vec2 zeroToOne = a_position / u_resolution;\n\n\t\t // convert from 0->1 to 0->2\n\t\t vec2 zeroToTwo = zeroToOne * 2.0;\n\n\t\t // convert from 0->2 to -1->+1 (clipspace)\n\t\t vec2 clipSpace = zeroToTwo - 1.0;\n\n\t\t gl_Position = vec4(clipSpace * vec2(1, -1), 0, 1);\n\t\t // pass the texCoord to the fragment shader\n\t\t // The GPU will interpolate this value between points.\n\t\t v_texCoord = (a_texCoord * u_offset.xy) + u_offset.zw;\n\t\t}\n\t\t"}static fragmentShader(){return"\n\t\tprecision mediump float;\n\n\t\t// our texture\n\t\tuniform sampler2D u_image;\n\n\t\t// the texCoords passed in from the vertex shader.\n\t\tvarying vec2 v_texCoord;\n\n\t\tvoid main() {\n\t\t gl_FragColor = texture2D(u_image, v_texCoord);\n\t\t}\n\t\t"}}class Bn{static deepCopyGamepad(e){return JSON.parse(JSON.stringify({buttons:e.buttons.map((e=>JSON.parse(JSON.stringify({pressed:e.pressed,touched:e.touched})))),axes:e.axes}))}}class Vn{constructor(e){this.toStreamerMessagesProvider=e,this.controllers=[]}updateStatus(e,t,n){if(e.gamepad){const r=t.getPose(e.gripSpace,n);if(!r)return;let s=0;e.profiles.includes("htc-vive")?s=1:e.profiles.includes("oculus-touch")&&(s=2),this.toStreamerMessagesProvider.toStreamerHandlers.get("XRSystem")([s]);let i=2;switch(e.handedness){case"left":i=0;break;case"right":i=1}const a=r.transform.matrix,o=[];for(let e=0;e<16;e++)o[e]=new Float32Array([a[e]])[0];this.toStreamerMessagesProvider.toStreamerHandlers.get("XRControllerTransform")([o[0],o[4],o[8],o[12],o[1],o[5],o[9],o[13],o[2],o[6],o[10],o[14],o[3],o[7],o[11],o[15],i]),void 0===this.controllers[i]&&(this.controllers[i]={prevState:void 0,currentState:void 0,id:void 0},this.controllers[i].prevState=Bn.deepCopyGamepad(e.gamepad)),this.controllers[i].currentState=Bn.deepCopyGamepad(e.gamepad);const l=this.controllers[i],c=l.currentState,d=l.prevState;for(let e=0;e<c.buttons.length;e++){const t=c.buttons[e],n=d.buttons[e];t.pressed?this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonPressed")([i,e,n.pressed?1:0]):!t.pressed&&n.pressed&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonReleased")([i,e,0]),t.touched&&!t.pressed?this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonPressed")([i,3,n.touched?1:0]):!t.touched&&n.touched&&this.toStreamerMessagesProvider.toStreamerHandlers.get("XRButtonReleased")([i,3,0])}for(let e=0;e<c.axes.length;e++)this.toStreamerMessagesProvider.toStreamerHandlers.get("XRAnalog")([i,e,c.axes[e]]);this.controllers[i].prevState=c}}}class Gn{constructor(e){this.xrSession=null,this.webRtcController=e,this.xrControllers=[],this.xrGamepadController=new Vn(this.webRtcController.streamMessageController),this.onSessionEnded=new EventTarget,this.onSessionStarted=new EventTarget,this.onFrame=new EventTarget}xrClicked(){this.xrSession?this.xrSession.end():navigator.xr.requestSession("immersive-vr").then((e=>{this.onXrSessionStarted(e)}))}onXrSessionEnded(){i.Log(i.GetStackTrace(),"XR Session ended"),this.xrSession=null,this.onSessionEnded.dispatchEvent(new Event("xrSessionEnded"))}onXrSessionStarted(e){i.Log(i.GetStackTrace(),"XR Session started"),this.xrSession=e,this.xrSession.addEventListener("end",(()=>{this.onXrSessionEnded()}));const t=document.createElement("canvas");this.gl=t.getContext("webgl2",{xrCompatible:!0}),this.xrSession.updateRenderState({baseLayer:new XRWebGLLayer(this.xrSession,this.gl)});const n=this.gl.createShader(this.gl.VERTEX_SHADER);this.gl.shaderSource(n,Nn.vertexShader()),this.gl.compileShader(n);const r=this.gl.createShader(this.gl.FRAGMENT_SHADER);this.gl.shaderSource(r,Nn.fragmentShader()),this.gl.compileShader(r);const s=this.gl.createProgram();this.gl.attachShader(s,n),this.gl.attachShader(s,r),this.gl.linkProgram(s),this.gl.useProgram(s),this.positionLocation=this.gl.getAttribLocation(s,"a_position"),this.texcoordLocation=this.gl.getAttribLocation(s,"a_texCoord"),this.positionBuffer=this.gl.createBuffer(),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),this.gl.enableVertexAttribArray(this.positionLocation);const a=this.gl.createTexture();this.gl.bindTexture(this.gl.TEXTURE_2D,a),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,this.gl.CLAMP_TO_EDGE),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MIN_FILTER,this.gl.NEAREST),this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_MAG_FILTER,this.gl.NEAREST),this.texcoordBuffer=this.gl.createBuffer(),this.resolutionLocation=this.gl.getUniformLocation(s,"u_resolution"),this.offsetLocation=this.gl.getUniformLocation(s,"u_offset"),e.requestReferenceSpace("local").then((e=>{this.xrRefSpace=e,this.xrSession.requestAnimationFrame(((e,t)=>this.onXrFrame(e,t)))})),this.onSessionStarted.dispatchEvent(new Event("xrSessionStarted"))}onXrFrame(e,t){const n=t.getViewerPose(this.xrRefSpace);if(n){const e=n.transform.matrix,t=[];for(let n=0;n<16;n++)t[n]=new Float32Array([e[n]])[0];this.webRtcController.streamMessageController.toStreamerHandlers.get("XRHMDTransform")([t[0],t[4],t[8],t[12],t[1],t[5],t[9],t[13],t[2],t[6],t[10],t[14],t[3],t[7],t[11],t[15]]);const r=this.xrSession.renderState.baseLayer;this.gl.bindFramebuffer(this.gl.FRAMEBUFFER,r.framebuffer),this.gl.texImage2D(this.gl.TEXTURE_2D,0,this.gl.RGBA,this.gl.RGBA,this.gl.UNSIGNED_BYTE,this.webRtcController.videoPlayer.getVideoElement()),this.render(this.webRtcController.videoPlayer.getVideoElement())}this.webRtcController.config.isFlagEnabled(It.XRControllerInput)&&this.xrSession.inputSources.forEach(((e,n,r)=>{this.xrGamepadController.updateStatus(e,t,this.xrRefSpace)}),this),this.xrSession.requestAnimationFrame(((e,t)=>this.onXrFrame(e,t))),this.onFrame.dispatchEvent(new Mt({time:e,frame:t}))}render(e){if(!this.gl)return;const t=this.xrSession.renderState.baseLayer;let n,r,s,i,a;this.gl.viewport(0,0,t.framebufferWidth,t.framebufferHeight),this.gl.uniform4f(this.offsetLocation,1,1,0,0),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,e.videoWidth,0,0,e.videoHeight,0,e.videoHeight,e.videoWidth,0,e.videoWidth,e.videoHeight]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texcoordBuffer),this.gl.bufferData(this.gl.ARRAY_BUFFER,new Float32Array([0,0,1,0,0,1,0,1,1,0,1,1]),this.gl.STATIC_DRAW),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.positionBuffer),n=2,r=this.gl.FLOAT,s=!1,i=0,a=0,this.gl.vertexAttribPointer(this.positionLocation,n,r,s,i,a),this.gl.enableVertexAttribArray(this.texcoordLocation),this.gl.bindBuffer(this.gl.ARRAY_BUFFER,this.texcoordBuffer),n=2,r=this.gl.FLOAT,s=!1,i=0,a=0,this.gl.vertexAttribPointer(this.texcoordLocation,n,r,s,i,a),this.gl.uniform2f(this.resolutionLocation,e.videoWidth,e.videoHeight);const o=this.gl.TRIANGLES;a=0,this.gl.drawArrays(o,a,6)}static isSessionSupported(e){return navigator.xr?navigator.xr.isSessionSupported(e):new Promise((()=>!1))}}class Wn{constructor(e){this.editTextButton=null,this.hiddenInput=null,"ontouchstart"in document.documentElement&&this.createOnScreenKeyboardHelpers(e)}unquantizeAndDenormalizeUnsigned(e,t){return null}createOnScreenKeyboardHelpers(e){this.hiddenInput||(this.hiddenInput=document.createElement("input"),this.hiddenInput.id="hiddenInput",this.hiddenInput.maxLength=0,e.appendChild(this.hiddenInput)),this.editTextButton||(this.editTextButton=document.createElement("button"),this.editTextButton.id="editTextButton",this.editTextButton.innerHTML="edit text",e.appendChild(this.editTextButton),this.editTextButton.classList.add("hiddenState"),this.editTextButton.addEventListener("touchend",(e=>{this.hiddenInput.focus(),e.preventDefault()})))}showOnScreenKeyboard(e){if(e.showOnScreenKeyboard){this.editTextButton.classList.remove("hiddenState");const t=this.unquantizeAndDenormalizeUnsigned(e.x,e.y);this.editTextButton.style.top=t.y.toString()+"px",this.editTextButton.style.left=(t.x-40).toString()+"px"}else this.editTextButton.classList.add("hiddenState"),this.hiddenInput.blur()}}class _n{constructor(e){this.seq=e.Seq,this.playerSentTimestamp=Date.now(),this.requestFillerSize=e.Filler?e.Filler.length:0}update(e){this.playerReceivedTimestamp=Date.now(),this.streamerReceivedTimestamp=e.ReceivedTimestamp,this.streamerSentTimestamp=e.SentTimestamp,this.responseFillerSize=e.Filler?e.Filler.length:0}}class zn{constructor(e,t){this.sink=e,this.callback=t,this.records=new Map,this.seq=0}start(e){return!this.isRunning()&&(this.startTime=Date.now(),this.records.clear(),this.interval=setInterval((()=>{Date.now()-this.startTime>=e.duration?this.stop():this.sendRequest(e.requestSize,e.responseSize)}).bind(this),Math.floor(1e3/e.rps)),!0)}stop(){this.interval&&(clearInterval(this.interval),this.interval=void 0,this.callback(this.produceResult()))}produceResult(){const e=new Map(this.records);return{records:e,dataChannelRtt:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),playerToStreamerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.streamerReceivedTimestamp-t.playerSentTimestamp)),0)/this.records.size),streamerToPlayerTime:Math.ceil(Array.from(this.records.values()).reduce(((e,t)=>e+(t.playerReceivedTimestamp-t.streamerSentTimestamp)),0)/this.records.size),exportLatencyAsCSV:()=>{let t="Timestamp;RTT;PlayerToStreamer;StreamerToPlayer;\n";return e.forEach((e=>{t+=e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.streamerReceivedTimestamp-e.playerSentTimestamp+";",t+=e.playerReceivedTimestamp-e.streamerSentTimestamp+";",t+="\n"})),t}}}isRunning(){return!!this.interval}receive(e){if(!this.isRunning())return;if(!e)return void i.Error(i.GetStackTrace(),"Undefined response from server");const t=this.records.get(e.Seq);t&&t.update(e)}sendRequest(e,t){const n=this.createRequest(e,t),r=new _n(n);this.records.set(r.seq,r),this.sink(n)}createRequest(e,t){return{Seq:this.seq++,FillResponseSize:t,Filler:e?"A".repeat(e):""}}}class $n{constructor(e,t){this.allowConsoleCommands=!1,this.config=e,(null==t?void 0:t.videoElementParent)&&(this._videoElementParent=t.videoElementParent),this._eventEmitter=new Lt,this.configureSettings(),this.setWebRtcPlayerController(new Un(this.config,this)),this.onScreenKeyboardHelper=new Wn(this.videoElementParent),this.onScreenKeyboardHelper.unquantizeAndDenormalizeUnsigned=(e,t)=>this._webRtcController.requestUnquantizedAndDenormalizeUnsigned(e,t),this._activateOnScreenKeyboard=e=>this.onScreenKeyboardHelper.showOnScreenKeyboard(e),this._webXrController=new Gn(this._webRtcController),this._setupWebRtcTCPRelayDetection=this._setupWebRtcTCPRelayDetection.bind(this),this._eventEmitter.addEventListener("webRtcConnected",(e=>{this._eventEmitter.addEventListener("statsReceived",this._setupWebRtcTCPRelayDetection)}))}get videoElementParent(){return this._videoElementParent||(this._videoElementParent=document.createElement("div"),this._videoElementParent.id="videoElementParent"),this._videoElementParent}configureSettings(){this.config._addOnSettingChangedListener(It.IsQualityController,(e=>{!0!==e||this._webRtcController.isQualityController||this._webRtcController.sendRequestQualityControlOwnership()})),this.config._addOnSettingChangedListener(It.AFKDetection,(e=>{this._webRtcController.setAfkEnabled(e)})),this.config._addOnSettingChangedListener(It.MatchViewportResolution,(()=>{this._webRtcController.videoPlayer.updateVideoStreamSize()})),this.config._addOnSettingChangedListener(It.HoveringMouseMode,(e=>{this.config.setFlagLabel(It.HoveringMouseMode,`Control Scheme: ${e?"Hovering":"Locked"} Mouse`),this._webRtcController.setMouseInputEnabled(this.config.isFlagEnabled(It.MouseInput))})),this.config._addOnSettingChangedListener(It.KeyboardInput,(e=>{this._webRtcController.setKeyboardInputEnabled(e)})),this.config._addOnSettingChangedListener(It.MouseInput,(e=>{this._webRtcController.setMouseInputEnabled(e)})),this.config._addOnSettingChangedListener(It.TouchInput,(e=>{this._webRtcController.setTouchInputEnabled(e)})),this.config._addOnSettingChangedListener(It.GamepadInput,(e=>{this._webRtcController.setGamePadInputEnabled(e)})),this.config._addOnNumericSettingChangedListener(Ot.MinQP,(e=>{i.Log(i.GetStackTrace(),"-------- Sending MinQP --------",7),this._webRtcController.sendEncoderMinQP(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ot.MaxQP,(e=>{i.Log(i.GetStackTrace(),"-------- Sending encoder settings --------",7),this._webRtcController.sendEncoderMaxQP(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ot.WebRTCMinBitrate,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCMinBitrate(1e3*e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ot.WebRTCMaxBitrate,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCMaxBitrate(1e3*e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnNumericSettingChangedListener(Ot.WebRTCFPS,(e=>{i.Log(i.GetStackTrace(),"-------- Sending web rtc settings --------",7),this._webRtcController.sendWebRTCFps(e),i.Log(i.GetStackTrace(),"-------------------------------------------",7)})),this.config._addOnOptionSettingChangedListener(Ut.PreferredCodec,(e=>{this._webRtcController&&this._webRtcController.setPreferredCodec(e)})),this.config._registerOnChangeEvents(this._eventEmitter)}_activateOnScreenKeyboard(e){throw new Error("Method not implemented.")}_onInputControlOwnership(e){this._inputController=e}setWebRtcPlayerController(e){this._webRtcController=e,this._webRtcController.setPreferredCodec(this.config.getSettingOption(Ut.PreferredCodec).selected),this._webRtcController.resizePlayerStyle(),this.checkForAutoConnect()}connect(){this._eventEmitter.dispatchEvent(new lt),this._webRtcController.connectToSignallingServer()}reconnect(){this._eventEmitter.dispatchEvent(new dt),this._webRtcController.tryReconnect("Reconnecting...")}disconnect(){this._eventEmitter.dispatchEvent(new ct),this._webRtcController.close()}play(){this._onStreamLoading(),this._webRtcController.playStream()}checkForAutoConnect(){this.config.isFlagEnabled(It.AutoConnect)&&(this._onWebRtcAutoConnect(),this._webRtcController.connectToSignallingServer())}unmuteMicrophone(e=!1){if(!this.config.isFlagEnabled("UseMic"))return e?(this.config.setFlagEnabled("UseMic",!0),void this.reconnect()):void i.Warning(i.GetStackTrace(),"Trying to unmute mic, but PixelStreaming was initialized with no microphone track. Call with forceEnable == true to re-connect with a mic track.");this.setMicrophoneMuted(!1)}muteMicrophone(){this.config.isFlagEnabled("UseMic")?this.setMicrophoneMuted(!0):i.Info(i.GetStackTrace(),"Trying to mute mic, but PixelStreaming has no microphone track, so sending sound is already disabled.")}setMicrophoneMuted(e){var t,n,r,s;for(const i of null!==(s=null===(r=null===(n=null===(t=this._webRtcController)||void 0===t?void 0:t.peerConnectionController)||void 0===n?void 0:n.peerConnection)||void 0===r?void 0:r.getTransceivers())&&void 0!==s?s:[])Zt.canTransceiverSendAudio(i)&&(i.sender.track.enabled=!e)}_onWebRtcAutoConnect(){this._eventEmitter.dispatchEvent(new Ye)}_onWebRtcSdp(){this._eventEmitter.dispatchEvent(new Je)}_onStreamLoading(){this._eventEmitter.dispatchEvent(new ot)}_onDisconnect(e,t){this._eventEmitter.dispatchEvent(new nt({eventString:e,allowClickToReconnect:t}))}_onWebRtcConnecting(){this._eventEmitter.dispatchEvent(new Ze)}_onWebRtcConnected(){this._eventEmitter.dispatchEvent(new et)}_onWebRtcFailed(){this._eventEmitter.dispatchEvent(new tt)}_onVideoInitialized(){this._eventEmitter.dispatchEvent(new at),this._videoStartTime=Date.now()}_onLatencyTestResult(e){this._eventEmitter.dispatchEvent(new St({latencyTimings:e}))}_onDataChannelLatencyTestResponse(e){this._eventEmitter.dispatchEvent(new wt({response:e}))}_onVideoStats(e){this._videoStartTime&&void 0!==this._videoStartTime||(this._videoStartTime=Date.now()),e.handleSessionStatistics(this._videoStartTime,this._inputController,this._webRtcController.videoAvgQp),this._eventEmitter.dispatchEvent(new ft({aggregatedStats:e}))}_onVideoEncoderAvgQP(e){this._eventEmitter.dispatchEvent(new Xe({avgQP:e}))}_onInitialSettings(e){var t;this._eventEmitter.dispatchEvent(new Tt({settings:e})),e.PixelStreamingSettings&&(this.allowConsoleCommands=null!==(t=e.PixelStreamingSettings.AllowPixelStreamingCommands)&&void 0!==t&&t,!1===this.allowConsoleCommands&&i.Info(i.GetStackTrace(),"-AllowPixelStreamingCommands=false, sending arbitrary console commands from browser to UE is disabled."));const n=this.config.useUrlParams,r=new URLSearchParams(window.location.search);i.Info(i.GetStackTrace(),`using URL parameters ${n}`),e.EncoderSettings&&(this.config.setNumericSetting(Ot.MinQP,n&&r.has(Ot.MinQP)?Number.parseFloat(r.get(Ot.MinQP)):e.EncoderSettings.MinQP),this.config.setNumericSetting(Ot.MaxQP,n&&r.has(Ot.MaxQP)?Number.parseFloat(r.get(Ot.MaxQP)):e.EncoderSettings.MaxQP)),e.WebRTCSettings&&(this.config.setNumericSetting(Ot.WebRTCMinBitrate,n&&r.has(Ot.WebRTCMinBitrate)?Number.parseFloat(r.get(Ot.WebRTCMinBitrate)):e.WebRTCSettings.MinBitrate/1e3),this.config.setNumericSetting(Ot.WebRTCMaxBitrate,n&&r.has(Ot.WebRTCMaxBitrate)?Number.parseFloat(r.get(Ot.WebRTCMaxBitrate)):e.WebRTCSettings.MaxBitrate/1e3),this.config.setNumericSetting(Ot.WebRTCFPS,n&&r.has(Ot.WebRTCFPS)?Number.parseFloat(r.get(Ot.WebRTCFPS)):e.WebRTCSettings.FPS))}_onQualityControlOwnership(e){this.config.setFlagEnabled(It.IsQualityController,e)}_onPlayerCount(e){this._eventEmitter.dispatchEvent(new Rt({count:e}))}_setupWebRtcTCPRelayDetection(e){const t=e.data.aggregatedStats.getActiveCandidatePair();if(null!=t){const n=e.data.aggregatedStats.localCandidates.find((e=>e.id==t.localCandidateId),null);null!=n&&"relay"==n.candidateType&&"tcp"==n.relayProtocol&&this._eventEmitter.dispatchEvent(new Pt),this._eventEmitter.removeEventListener("statsReceived",this._setupWebRtcTCPRelayDetection)}}requestLatencyTest(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendLatencyTest(),!0)}requestDataChannelLatencyTest(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._dataChannelLatencyTestController||(this._dataChannelLatencyTestController=new zn(this._webRtcController.sendDataChannelLatencyTest.bind(this._webRtcController),(e=>{this._eventEmitter.dispatchEvent(new bt({result:e}))})),this.addEventListener("dataChannelLatencyTestResponse",(({data:{response:e}})=>{this._dataChannelLatencyTestController.receive(e)}))),this._dataChannelLatencyTestController.start(e))}requestShowFps(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendShowFps(),!0)}requestIframe(){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.sendIframeRequest(),!0)}emitUIInteraction(e){return!!this._webRtcController.videoPlayer.isVideoReady()&&(this._webRtcController.emitUIInteraction(e),!0)}emitCommand(e){return!(!this._webRtcController.videoPlayer.isVideoReady()||!this.allowConsoleCommands&&"ConsoleCommand"in e||(this._webRtcController.emitCommand(e),0))}emitConsoleCommand(e){return!(!this.allowConsoleCommands||!this._webRtcController.videoPlayer.isVideoReady()||(this._webRtcController.emitConsoleCommand(e),0))}addResponseEventListener(e,t){this._webRtcController.responseController.addResponseEventListener(e,t)}removeResponseEventListener(e){this._webRtcController.responseController.removeResponseEventListener(e)}dispatchEvent(e){return this._eventEmitter.dispatchEvent(e)}addEventListener(e,t){this._eventEmitter.addEventListener(e,t)}removeEventListener(e,t){this._eventEmitter.removeEventListener(e,t)}toggleXR(){this.webXrController.xrClicked()}setSignallingUrlBuilder(e){this._webRtcController.signallingUrlBuilder=e}get signallingProtocol(){return this._webRtcController.protocol}get webXrController(){return this._webXrController}registerMessageHandler(e,t,n){t!==tn.FromStreamer||void 0!==n?t===tn.ToStreamer&&void 0===n?this._webRtcController.streamMessageController.registerMessageHandler(t,e,(t=>this._webRtcController.sendMessageController.sendMessageToStreamer(e,t))):this._webRtcController.streamMessageController.registerMessageHandler(t,e,(e=>n(e))):i.Warning(i.GetStackTrace(),`Unable to register an undefined handler for ${e}`)}get toStreamerHandlers(){return this._webRtcController.streamMessageController.toStreamerHandlers}isReconnecting(){return this._webRtcController.isReconnecting}}class Hn{}var jn=r(499),Kn=r.n(jn);class Qn extends l.EventEmitter{constructor(e){super(),this.WS_OPEN_STATE=1,e&&(this.webSocket=e,this.setupSocketHandlers(),this.emit("open"))}sendMessage(e){this.webSocket&&this.webSocket.send(JSON.stringify(e))}connect(e){return this.webSocket=new(Kn())(e),this.setupSocketHandlers(),!0}disconnect(e,t){this.webSocket&&this.webSocket.close(e,t)}isConnected(){return!!this.webSocket&&this.webSocket.readyState!=Kn().CLOSED}handleOnMessage(e){let t;try{t=JSON.parse(e.data)}catch(e){return}this.onMessage&&this.onMessage(t)}handleOnOpen(e){this.emit("open",e)}handleOnError(e){this.emit("error",e)}handleOnClose(e){this.emit("close",e)}close(){var e;null===(e=this.webSocket)||void 0===e||e.close()}setupSocketHandlers(){this.webSocket&&(this.webSocket.addEventListener("open",this.handleOnOpen.bind(this)),this.webSocket.addEventListener("error",this.handleOnError.bind(this)),this.webSocket.addEventListener("close",this.handleOnClose.bind(this)),this.webSocket.addEventListener("message",this.handleOnMessage.bind(this)))}}})();var i=s.Dz,a=s.g$,o=s.Lt,l=s.Q9,c=s.qf,d=s.hV,h=s.z$,u=s.J0,g=s.De,m=s.$C,p=s.al,f=s._W,v=s.Gv,y=s.m,S=s.tz,w=s.Nu,b=s.zg,T=s.vp,C=s.vU,E=s.wF,k=s.rv,M=s.Nh,R=s.ss,P=s.qW,L=s.QL,I=s.cf,F=s.eM,O=s.Yd,x=s.Tk,D=s.iw,A=s.pr,U=s.Vm,N=s.sK,B=s.Ok,V=s.q5,G=s.g,W=s.xl,_=s.I,z=s.bx,$=s.dD,H=s.Ib,j=s.Az,K=s.Iw,Q=s.qY,q=s.db,X=s.mR,J=s.Tn,Y=s.rV,Z=s.gh,ee=s.Mi,te=s.j,ne=s.YB,re=s.Yt,se=s.i5,ie=s.x_,ae=s.Am,oe=s.eR,le=s.r8,ce=s.u3,de=s.vd,he=s.iV,ue=s.jZ,ge=s.SW,me=s.ZH,pe=s.Ni,fe=s.lh,ve=s.ZP,ye=s.qo,Se=s.Q8,we=s.$f,be=s.eu,Te=s.Ax,Ce=s.Mc;export{i as AfkLogic,a as AfkTimedOutEvent,o as AfkWarningActivateEvent,l as AfkWarningDeactivateEvent,c as AfkWarningUpdateEvent,d as AggregatedStats,h as CandidatePairStats,u as CandidateStat,g as Config,m as ControlSchemeType,p as DataChannelCloseEvent,f as DataChannelErrorEvent,v as DataChannelLatencyTestResponseEvent,y as DataChannelLatencyTestResultEvent,S as DataChannelOpenEvent,w as DataChannelStats,b as EncoderSettings,T as EventEmitter,C as Flags,E as HideFreezeFrameEvent,k as InboundAudioStats,M as InboundVideoStats,R as InitialSettings,P as InitialSettingsEvent,L as LatencyTestResultEvent,I as LatencyTestResults,F as LoadFreezeFrameEvent,O as Logger,x as MessageDirection,D as MessageHelpers,A as MessageRegistry,U as Messages,N as NumericParameters,B as OptionParameters,V as OutBoundVideoStats,G as PixelStreaming,W as PlayStreamErrorEvent,_ as PlayStreamEvent,z as PlayStreamRejectedEvent,$ as PlayerCountEvent,H as SettingBase,j as SettingFlag,K as SettingNumber,Q as SettingOption,q as SettingText,X as SettingsChangedEvent,J as SignallingProtocol,Y as StatsReceivedEvent,Z as StreamLoadingEvent,ee as StreamPreConnectEvent,te as StreamPreDisconnectEvent,ne as StreamReconnectEvent,re as StreamerIDChangedMessageEvent,se as StreamerListMessageEvent,ie as TextParameters,ae as UnquantizedAndDenormalizeUnsigned,oe as VideoEncoderAvgQPEvent,le as VideoInitializedEvent,ce as WebRTCSettings,de as WebRtcAutoConnectEvent,he as WebRtcConnectedEvent,ue as WebRtcConnectingEvent,ge as WebRtcDisconnectedEvent,me as WebRtcFailedEvent,pe as WebRtcPlayerController,fe as WebRtcSdpEvent,ve as WebRtcTCPRelayDetectedEvent,ye as WebSocketTransport,Se as WebSocketTransportNJS,we as WebXRController,be as XrFrameEvent,Te as XrSessionEndedEvent,Ce as XrSessionStartedEvent};
|