@4players/odin-plugin-web 1.10.0 → 1.10.1

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.
@@ -1,4 +1,4 @@
1
- var pA=Object.defineProperty;var q=(v,D)=>()=>(v&&(D=v(v=0)),D);var Vx=(v,D)=>{for(var e in D)pA(v,e,{get:D[e],enumerable:!0})};var i={};Vx(i,{AdditionalCaptureBlocks:()=>qA,AdditionalPlaybackBlocks:()=>hA,ClockJumpCheckInterval:()=>_A,ClockJumpThreshold:()=>LA,ConnectInterval:()=>SA,ConnectTimeout:()=>OA,DefaultRefreshRate:()=>GA,DefaultVideoCodec:()=>RA,HealthCheckTimeout:()=>yA,MainConnectionPingInterval:()=>HA,MaxNumberOfDecoders:()=>gA,MinDBFs:()=>Ux,MinTokenLifetime:()=>MA,MinTokenRefreshInterval:()=>TA,PlaybackPreload:()=>mA,RenderQuantumSize:()=>$A,VadPreload:()=>IA,WebRtcAnswerTimeout:()=>KA,WebRtcIceTimeout:()=>wA,WebRtcMaxNegotiationAttempts:()=>JA,WebRtcStatsSnapshotInterval:()=>NA,WebRtcTimeout:()=>PA});var hA,qA,mA,GA,IA,gA,$A,Ux,yA,_A,LA,HA,NA,wA,PA,KA,JA,OA,MA,TA,SA,RA,Wx=q(()=>{"use strict";hA=3,qA=3,mA=3,GA=250,IA=3,gA=512,$A=128,Ux=-758.596,yA=1e4,_A=1e3,LA=1e4,HA=3e3,NA=1e3,wA=3e3,PA=1e4,KA=1e4,JA=3,OA=5e3,MA=6e4,TA=5e3,SA=[0,100,200,200,500],RA="H264"});function Cx(v){return typeof v!="symbol"}function l(v){return typeof v=="symbol"}var G,n,J,I,Ex=q(()=>{"use strict";G=Symbol("Unencrypted"),n=Symbol("Invalid"),J=Symbol("Retry"),I=Symbol("UnexpectedEof")});function c(v,D,e){return v.postMessage(D,e)}function U(v,D){return new Promise(e=>{let j=B=>{let[C,E]=B.data;C===D&&(e(B.data[1]),v.removeEventListener("message",j))};v.addEventListener("message",j)})}var i0=q(()=>{"use strict"});function Qx(v,D){v.values[0]=D[0],v.values[1]=D[1]}function b0(v,D){return v.values[2+D*5]}function o0(v,D,e){let j=2+D*5+1;v.values[j+0]=e[0],v.values[j+1]=e[1]}function a0(v){return v.values[0]!==0}function l0(v){return v.values[1]}function u0(v){return v.values[2]}function k0(v,D){return v.values[3]=D}var c0=q(()=>{"use strict"});function d0(v,D){let e=new O(v);e.position=D;let j=e.readObjects(1);return Cx(j)?e.position:j}var O,p0=q(()=>{"use strict";Ex();O=class{constructor(D,e=0){this.bytes=D;this.position=e}readArrayLength(){let D=this.readTag();return l(D)?D:(D&240)===144?D&15:D===220?this.readUint16():D===221?this.readUint32():n}readNumber(){let D=this.readTag();return l(D)||(D&128)===0?D:(D&224)===224?D-256:D===202?this.readFloat32():D===203?this.readFloat64():D===204?this.readUint8():D===205?this.readUint16():D===206?this.readUint32():D===207?this.readUint64():D===208?this.readInt8():D===209?this.readInt16():D===210?this.readInt32():D===211?this.readInt64():n}readBytes(){let D=this.readTag();if(l(D))return D;let e;if(D===196)e=this.readUint8();else if(D===197)e=this.readUint16();else if(D===198)e=this.readUint32();else return n;if(l(e))return e;let j=this.consume(e);return j!==I?this.bytes.subarray(j,j+e):I}readObjects(D){for(;D>0;D-=1){let e=this.readTag();if(l(e))return e;let j,B=0,C=0;switch(e){case 192:break;case 194:break;case 195:break;case 196:B=this.readUint8();break;case 197:B=this.readUint16();break;case 198:B=this.readUint32();break;case 199:B=this.readUint8(),C=1;break;case 200:B=this.readUint8(),C=1;break;case 201:B=this.readUint32(),C=1;break;case 202:B=4;break;case 203:B=8;break;case 204:B=1;break;case 205:B=2;break;case 206:B=4;break;case 207:B=8;break;case 208:B=1;break;case 209:B=2;break;case 210:B=4;break;case 211:B=8;break;case 212:B=2;break;case 213:B=3;break;case 214:B=5;break;case 215:B=9;break;case 216:B=17;break;case 217:B=this.readUint8();break;case 218:B=this.readUint16();break;case 219:B=this.readUint32();break;case 220:if(j=this.readUint16(),l(j))return j;D+=j;break;case 221:if(j=this.readUint32(),l(j))return j;D+=j;break;case 222:if(j=this.readUint16(),l(j))return j;D+=j*2;break;case 223:if(j=this.readUint32(),l(j))return j;D+=j*2;break;default:if((e&128)!==0){if((e&240)===128)D+=(e&15)*2;else if((e&240)===144)D+=e&15;else if((e&224)===160)B=e&31;else if((e&224)!==224)return n}}if(B===I)return I;if(this.consume(B+C)===I)return I}}consume(D){if(D===I||this.position+D>this.bytes.length)return I;let e=this.position;return this.position=e+D,e}readTag(){let D=this.consume(1);return Cx(D)?this.bytes[D]:D}readUint8(){let D=this.consume(1);return Cx(D)?this.bytes[D]:D}readUint16(){let D=this.consume(2);return l(D)?D:this.bytes[D]<<8|this.bytes[D+1]}readUint32(){let D=this.consume(4);return l(D)?D:this.bytes[D]<<24|this.bytes[D+1]<<16|this.bytes[D+2]<<8|this.bytes[D+3]}readUint64(){let D=this.readUint32();if(l(D))return D;if(D>=2097152)return n;let e=this.readUint32();return l(e)?e:D<<32|e}readInt8(){let D=this.readUint8();return l(D)||D>=128&&(D=D-256),D}readInt16(){let D=this.readUint16();return l(D)||D>=32768&&(D=D-65536),D}readInt32(){let D=this.readUint32();return l(D)||D>=2147483648&&(D=D-4294967296),D}readInt64(){let D=this.readUint32();if(l(D))return D;if(D>=2097152||D<-2097152)return n;let e=this.readUint32();return l(e)?e:D<<32|e}readFloat32(){let D=this.consume(4);return l(D)?D:new Float32Array(this.bytes.subarray(D,D+4))[0]}readFloat64(){let D=this.consume(8);return l(D)?D:new Float64Array(this.bytes.subarray(D,D+8))[0]}}});var h0,q0=q(()=>{"use strict";h0="1.10.0"});import{error as VA,warn as UA,info as WA,debug as QA,Logger as zA,LogLevel as XA,CallbackSink as ZA,Formatter as YA}from"@4players/odin-common";function m0(v,D){g||(g=v??new zA(XA.DEBUG,"odin-plugin-web",[]),D&&g.sinks.push(new ZA(D,YA.structured)))}function p(v,...D){let e=fx(D);g?g?.error(v,e):VA(v,e)}function k(v,...D){let e=fx(D);g?g?.warn(v,e):UA(v,e)}function o(v,...D){let e=fx(D);g?g?.info(v,e):WA(v,e)}function a(v,...D){let e=fx(D);g?g?.debug(v,e):QA(v,e)}function fx(...v){if(v.length===1&&typeof v[0]=="object"&&v[0]!==null)return{...v[0]};if(v.length>0)return{args:v}}var g,G0=q(()=>{"use strict"});function m(v){return v.connectionId*4294967296+v.mediaId}var _,S,u=q(()=>{"use strict";Wx();Ex();Wx();i0();c0();p0();q0();G0();Ex();_={isSilent:!0,rmsDBFS:-758.596};S=class{constructor(){this.inFlight=null}run(D){return this.inFlight||(this.inFlight=D().finally(()=>{this.inFlight=null})),this.inFlight}}});function Y(v,D,e,j,B){return Promise.all([DF(v),eF(e,D,j,B)])}async function DF(v){let D=URL.createObjectURL(new Blob([v],{type:"text/javascript"})),e=new Worker(D,{type:"module",name:"odin worker"});return Q.push(e),e}async function eF(v,D,e,j){try{let E=new AudioWorkletNode(v,e,j);return R.push(E),E}catch{}let B=zx.get(v);if(B===void 0){let E=URL.createObjectURL(new Blob([D],{type:"text/javascript"}));B=v.audioWorklet.addModule(E),zx.set(v,B),B.catch(()=>zx.delete(v))}await B;let C=new AudioWorkletNode(v,e,j);return R.push(C),C}async function y0(){return{workers:await Promise.all(Q.map(Z)),worklets:await Promise.all(R.map(v=>Z(v.port)))}}function Z(v){let{port1:D,port2:e}=new MessageChannel,{promise:j,resolve:B}=Promise.withResolvers();return e.onmessage=C=>B(C.data),setTimeout(()=>B("timeout"),100),c(v,["dump",{result:D}],[D]),j}var Q,R,z,X,zx,sx=q(()=>{"use strict";u();Q=[],R=[],z=class{constructor(D,e,j){this.audioContext=D;this.worklet=e;this.worker=j;this.availableIndexes=[];this.medias=new Map;j.addEventListener("message",this._OnMessages.bind(this))}connectOutput(D){this.worklet.disconnect(),this.worklet.connect(D)}receivePacket(D,e){c(this.worker,["playbackReceivePacket",{connectionId:D,packet:e}],[e.buffer])}addMedias(D,e,j=[1,1]){let B=[];for(let C of e){let E=this._GetFreeIndex();E!==void 0&&(this.medias.set(m({connectionId:D,mediaId:C}),{index:E}),B.push({connectionId:D,mediaId:C,index:E,volume:j}))}c(this.worker,["playbackUpdateMedias",{added:B,removed:[]}])}removeMedias(D,e){let j=[];for(let B of e){let C=m({connectionId:D,mediaId:B}),E=this.medias.get(C);E!==void 0&&(this.medias.delete(C),this.availableIndexes.push(E.index),j.push({connectionId:D,mediaId:B,index:E.index}))}c(this.worker,["playbackUpdateMedias",{added:[],removed:j}])}close(){c(this.worker,["close",void 0]),c(this.worklet.port,["close",void 0]);let D=Q.indexOf(this.worker);D>=0&&Q.splice(D,1);let e=R.indexOf(this.worklet);e>=0&&R.splice(e,1)}async dump(){return{playbackWorker:await Z(this.worker),playbackWorklet:await Z(this.worklet.port)}}_GetFreeIndex(){return this.availableIndexes.pop()}_OnMessages(D){}},X=class v{constructor(D,e,j,B,C){this.worklet=D;this.worker=e;this.sink=(E,f)=>{C.deref()!==void 0?j(E,f):(p("capture worker was left abandoned, aborting capture worker"),v.shutdown(D,e))},this.monitorSink=(E,f)=>{C.deref()!==void 0?B(E,f):(p("capture worker was left abandoned, aborting capture worker"),v.shutdown(D,e))},e.addEventListener("message",this._OnMessages.bind(this))}get context(){return this.worklet.context}setMedias(D){c(this.worker,["captureSetMedias",{connections:D}])}setVad(D){c(this.worker,["captureSetVad",D])}close(){v.shutdown(this.worklet,this.worker)}static shutdown(D,e){c(D.port,["close",void 0]),c(e,["close",void 0]);let j=Q.indexOf(e);j>=0&&Q.splice(j,1);let B=R.indexOf(D);B>=0&&R.splice(B,1)}async dump(){return{captureWorker:await Z(this.worker),captureWorklet:await Z(this.worklet.port)}}_OnMessages(D){let[e,j]=D.data;e==="sendPacket"&&(j.connectionId===0?this.monitorSink(j.connectionId,j.packet):this.sink(j.connectionId,j.packet))}};zx=new WeakMap});var Xx,_0=q(()=>{Xx=`"use strict";(()=>{var Cn=Object.create;var or=Object.defineProperty;var Gn=Object.getOwnPropertyDescriptor;var pn=Object.getOwnPropertyNames;var hn=Object.getPrototypeOf,In=Object.prototype.hasOwnProperty;var mn=(n,A)=>()=>(A||n((A={exports:{}}).exports,A),A.exports),En=(n,A)=>{for(var t in A)or(n,t,{get:A[t],enumerable:!0})},$n=(n,A,t,e)=>{if(A&&typeof A=="object"||typeof A=="function")for(let i of pn(A))!In.call(n,i)&&i!==t&&or(n,i,{get:()=>A[i],enumerable:!(e=Gn(A,i))||e.enumerable});return n};var Fn=(n,A,t)=>(t=n!=null?Cn(hn(n)):{},$n(A||!n||!n.__esModule?or(t,"default",{value:n,enumerable:!0}):t,n));var $t=mn((Et,MA)=>{"use strict";var wA=(()=>{var n=globalThis.document?.currentScript?.src;return async function(A={}){var t,e=A,i=!!globalThis.window,d=!!globalThis.WorkerGlobalScope,q=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer",C=d&&globalThis.name=="em-pthread",v=[],B="./this.program",CA=(r,j)=>{throw j};d&&(n=self.location.href);var w="",Ht,_t;if(i||d){try{w=new URL(".",n).href}catch{}d&&(_t=r=>{var j=new XMLHttpRequest;return j.open("GET",r,!1),j.responseType="arraybuffer",j.send(null),new Uint8Array(j.response)}),Ht=async r=>{var j=await fetch(r,{credentials:"same-origin"});if(j.ok)return j.arrayBuffer();throw new Error(j.status+" : "+j.url)}}var TA=console.log.bind(console),N=console.error.bind(console),gr,eA,GA=!1,Q;function yt(r){for(var j=0,s=r.length,l=new Uint8Array(s),o;j<s;++j)o=r.charCodeAt(j),l[j]=~o>>8&o;return l}var UA,Lr,Hr;if(C){let r=function(j){try{var s=j.data,l=s.cmd;if(l==="load"){let o=[];self.onmessage=k=>o.push(k),Hr=()=>{postMessage({cmd:"loaded"});for(let k of o)r(k);self.onmessage=r};for(let k of s.handlers)(!e[k]||e[k].proxy)&&(e[k]=(...a)=>{postMessage({cmd:"callHandler",handler:k,args:a})},k=="print"&&(TA=e[k]),k=="printErr"&&(N=e[k]));X=s.wasmMemory,yr(),eA=s.wasmModule,Nr(),Dj()}else if(l==="run"){St(s.pthread_ptr),sr(s.pthread_ptr,0,0,1,0,0),h.threadInitTLS(),tr(s.pthread_ptr),SA||(Ij(),SA=!0);try{Vt(s.start_routine,s.arg)}catch(o){if(o!="unwind")throw o}}else s.target==="setimmediate"||(l==="checkMailbox"?SA&&HA():l&&(N(\`worker: received unknown command \${l}\`),N(s)))}catch(o){throw mj(),o}};var Ds=r,SA=!1;self.onunhandledrejection=j=>{throw j.reason||j},self.onmessage=r}var _r=!1;function yr(){var r=X.buffer;V=new Int8Array(r),pA=new Int16Array(r),e.HEAPU8=x=new Uint8Array(r),nA=new Uint16Array(r),e.HEAP32=z=new Int32Array(r),e.HEAPU32=E=new Uint32Array(r),e.HEAPF32=Jr=new Float32Array(r),hA=new Float64Array(r),S=new BigInt64Array(r),Kr=new BigUint64Array(r)}function xt(){if(!C){if(e.wasmMemory)X=e.wasmMemory;else{var r=e.INITIAL_MEMORY||16777216;X=new WebAssembly.Memory({initial:r/65536,maximum:r/65536,shared:!0})}yr()}}function Dt(){if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)Ot(e.preRun.shift());wr(Mr)}function xr(){if(_r=!0,C)return Hr();jA.F()}function Bt(){if(!C){if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;)Ut(e.postRun.shift());wr(Vr)}}function VA(r){e.onAbort?.(r),r="Aborted("+r+")",N(r),GA=!0,r+=". Build with -sASSERTIONS for more info.";var j=new WebAssembly.RuntimeError(r);throw Lr?.(j),j}var Dr;function Nt(){return yt(\`\\0asm\\0\\0\\0\\xB2>\\\`\\x7F\\0\\\`\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\\`\\0\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`||\\\`\\x7F}\\\`}}\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\0\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\b\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F~\\x7F~\\\`\\x7F\\x7F}\\\`\\x7F}}\\\`\\x7F\\x7F}}\\0\\\`
1
+ var bA=Object.defineProperty;var q=(v,D)=>()=>(v&&(D=v(v=0)),D);var Tx=(v,D)=>{for(var j in D)bA(v,j,{get:D[j],enumerable:!0})};var i={};Tx(i,{AdditionalCaptureBlocks:()=>aA,AdditionalPlaybackBlocks:()=>oA,ClockJumpCheckInterval:()=>hA,ClockJumpThreshold:()=>qA,ConnectInterval:()=>NA,ConnectTimeout:()=>_A,DefaultRefreshRate:()=>uA,DefaultVideoCodec:()=>wA,HealthCheckTimeout:()=>pA,MainConnectionPingInterval:()=>mA,MaxNumberOfDecoders:()=>cA,MinDBFs:()=>Sx,MinTokenLifetime:()=>LA,MinTokenRefreshInterval:()=>HA,PlaybackPreload:()=>lA,RenderQuantumSize:()=>dA,VadPreload:()=>kA,WebRtcAnswerTimeout:()=>$A,WebRtcIceTimeout:()=>IA,WebRtcMaxNegotiationAttempts:()=>yA,WebRtcStatsSnapshotInterval:()=>GA,WebRtcTimeout:()=>gA});var oA,aA,lA,uA,kA,cA,dA,Sx,pA,hA,qA,mA,GA,IA,gA,$A,yA,_A,LA,HA,NA,wA,Rx=q(()=>{"use strict";oA=3,aA=3,lA=3,uA=250,kA=3,cA=512,dA=128,Sx=-758.596,pA=1e4,hA=1e3,qA=1e4,mA=3e3,GA=1e3,IA=3e3,gA=1e4,$A=1e4,yA=3,_A=5e3,LA=6e4,HA=5e3,NA=[0,100,200,200,500],wA="H264"});function vx(v){return typeof v!="symbol"}function l(v){return typeof v=="symbol"}var G,n,J,I,Cx=q(()=>{"use strict";G=Symbol("Unencrypted"),n=Symbol("Invalid"),J=Symbol("Retry"),I=Symbol("UnexpectedEof")});function c(v,D,j){return v.postMessage(D,j)}function U(v,D){return new Promise(j=>{let e=B=>{let[C,E]=B.data;C===D&&(j(B.data[1]),v.removeEventListener("message",e))};v.addEventListener("message",e)})}var C0=q(()=>{"use strict"});function Vx(v,D){v.values[0]=D[0],v.values[1]=D[1]}function E0(v,D){return v.values[2+D*5]}function f0(v,D,j){let e=2+D*5+1;v.values[e+0]=j[0],v.values[e+1]=j[1]}function n0(v){return v.values[0]!==0}function s0(v){return v.values[1]}function i0(v){return v.values[2]}function b0(v,D){return v.values[3]=D}var o0=q(()=>{"use strict"});function a0(v,D){let j=new O(v);j.position=D;let e=j.readObjects(1);return vx(e)?j.position:e}var O,l0=q(()=>{"use strict";Cx();O=class{constructor(D,j=0){this.bytes=D;this.position=j}readArrayLength(){let D=this.readTag();return l(D)?D:(D&240)===144?D&15:D===220?this.readUint16():D===221?this.readUint32():n}readNumber(){let D=this.readTag();return l(D)||(D&128)===0?D:(D&224)===224?D-256:D===202?this.readFloat32():D===203?this.readFloat64():D===204?this.readUint8():D===205?this.readUint16():D===206?this.readUint32():D===207?this.readUint64():D===208?this.readInt8():D===209?this.readInt16():D===210?this.readInt32():D===211?this.readInt64():n}readBytes(){let D=this.readTag();if(l(D))return D;let j;if(D===196)j=this.readUint8();else if(D===197)j=this.readUint16();else if(D===198)j=this.readUint32();else return n;if(l(j))return j;let e=this.consume(j);return e!==I?this.bytes.subarray(e,e+j):I}readObjects(D){for(;D>0;D-=1){let j=this.readTag();if(l(j))return j;let e,B=0,C=0;switch(j){case 192:break;case 194:break;case 195:break;case 196:B=this.readUint8();break;case 197:B=this.readUint16();break;case 198:B=this.readUint32();break;case 199:B=this.readUint8(),C=1;break;case 200:B=this.readUint8(),C=1;break;case 201:B=this.readUint32(),C=1;break;case 202:B=4;break;case 203:B=8;break;case 204:B=1;break;case 205:B=2;break;case 206:B=4;break;case 207:B=8;break;case 208:B=1;break;case 209:B=2;break;case 210:B=4;break;case 211:B=8;break;case 212:B=2;break;case 213:B=3;break;case 214:B=5;break;case 215:B=9;break;case 216:B=17;break;case 217:B=this.readUint8();break;case 218:B=this.readUint16();break;case 219:B=this.readUint32();break;case 220:if(e=this.readUint16(),l(e))return e;D+=e;break;case 221:if(e=this.readUint32(),l(e))return e;D+=e;break;case 222:if(e=this.readUint16(),l(e))return e;D+=e*2;break;case 223:if(e=this.readUint32(),l(e))return e;D+=e*2;break;default:if((j&128)!==0){if((j&240)===128)D+=(j&15)*2;else if((j&240)===144)D+=j&15;else if((j&224)===160)B=j&31;else if((j&224)!==224)return n}}if(B===I)return I;if(this.consume(B+C)===I)return I}}consume(D){if(D===I||this.position+D>this.bytes.length)return I;let j=this.position;return this.position=j+D,j}readTag(){let D=this.consume(1);return vx(D)?this.bytes[D]:D}readUint8(){let D=this.consume(1);return vx(D)?this.bytes[D]:D}readUint16(){let D=this.consume(2);return l(D)?D:this.bytes[D]<<8|this.bytes[D+1]}readUint32(){let D=this.consume(4);return l(D)?D:this.bytes[D]<<24|this.bytes[D+1]<<16|this.bytes[D+2]<<8|this.bytes[D+3]}readUint64(){let D=this.readUint32();if(l(D))return D;if(D>=2097152)return n;let j=this.readUint32();return l(j)?j:D<<32|j}readInt8(){let D=this.readUint8();return l(D)||D>=128&&(D=D-256),D}readInt16(){let D=this.readUint16();return l(D)||D>=32768&&(D=D-65536),D}readInt32(){let D=this.readUint32();return l(D)||D>=2147483648&&(D=D-4294967296),D}readInt64(){let D=this.readUint32();if(l(D))return D;if(D>=2097152||D<-2097152)return n;let j=this.readUint32();return l(j)?j:D<<32|j}readFloat32(){let D=this.consume(4);return l(D)?D:new Float32Array(this.bytes.subarray(D,D+4))[0]}readFloat64(){let D=this.consume(8);return l(D)?D:new Float64Array(this.bytes.subarray(D,D+8))[0]}}});var u0,k0=q(()=>{"use strict";u0="1.10.1"});import{error as PA,warn as KA,info as JA,debug as OA,Logger as MA,LogLevel as TA,CallbackSink as SA,Formatter as RA}from"@4players/odin-common";function c0(v,D){g||(g=v??new MA(TA.DEBUG,"odin-plugin-web",[]),D&&g.sinks.push(new SA(D,RA.structured)))}function p(v,...D){let j=Ex(D);g?g?.error(v,j):PA(v,j)}function k(v,...D){let j=Ex(D);g?g?.warn(v,j):KA(v,j)}function o(v,...D){let j=Ex(D);g?g?.info(v,j):JA(v,j)}function a(v,...D){let j=Ex(D);g?g?.debug(v,j):OA(v,j)}function Ex(...v){if(v.length===1&&typeof v[0]=="object"&&v[0]!==null)return{...v[0]};if(v.length>0)return{args:v}}var g,d0=q(()=>{"use strict"});function m(v){return v.connectionId*4294967296+v.mediaId}var _,S,u=q(()=>{"use strict";Rx();Cx();Rx();C0();o0();l0();k0();d0();Cx();_={isSilent:!0,rmsDBFS:-758.596};S=class{constructor(){this.inFlight=null}run(D){return this.inFlight||(this.inFlight=D().finally(()=>{this.inFlight=null})),this.inFlight}}});function Y(v,D,j,e,B){return Promise.all([XA(v),ZA(j,D,e,B)])}async function XA(v){let D=URL.createObjectURL(new Blob([v],{type:"text/javascript"})),j=new Worker(D,{type:"module",name:"odin worker"});return Q.push(j),j}async function ZA(v,D,j,e){try{let E=new AudioWorkletNode(v,j,e);return R.push(E),E}catch{}let B=Ux.get(v);if(B===void 0){let E=URL.createObjectURL(new Blob([D],{type:"text/javascript"}));B=v.audioWorklet.addModule(E),Ux.set(v,B),B.catch(()=>Ux.delete(v))}await B;let C=new AudioWorkletNode(v,j,e);return R.push(C),C}async function m0(){return{workers:await Promise.all(Q.map(Z)),worklets:await Promise.all(R.map(v=>Z(v.port)))}}function Z(v){let{port1:D,port2:j}=new MessageChannel,{promise:e,resolve:B}=Promise.withResolvers();return j.onmessage=C=>B(C.data),setTimeout(()=>B("timeout"),100),c(v,["dump",{result:D}],[D]),e}var Q,R,z,X,Ux,nx=q(()=>{"use strict";u();Q=[],R=[],z=class{constructor(D,j,e){this.audioContext=D;this.worklet=j;this.worker=e;this.availableIndexes=[];this.medias=new Map;e.addEventListener("message",this._OnMessages.bind(this))}connectOutput(D){this.worklet.disconnect(),this.worklet.connect(D)}receivePacket(D,j){c(this.worker,["playbackReceivePacket",{connectionId:D,packet:j}],[j.buffer])}addMedias(D,j,e=[1,1]){let B=[];for(let C of j){let E=this._GetFreeIndex();E!==void 0&&(this.medias.set(m({connectionId:D,mediaId:C}),{index:E}),B.push({connectionId:D,mediaId:C,index:E,volume:e}))}c(this.worker,["playbackUpdateMedias",{added:B,removed:[]}])}removeMedias(D,j){let e=[];for(let B of j){let C=m({connectionId:D,mediaId:B}),E=this.medias.get(C);E!==void 0&&(this.medias.delete(C),this.availableIndexes.push(E.index),e.push({connectionId:D,mediaId:B,index:E.index}))}c(this.worker,["playbackUpdateMedias",{added:[],removed:e}])}close(){c(this.worker,["close",void 0]),c(this.worklet.port,["close",void 0]);let D=Q.indexOf(this.worker);D>=0&&Q.splice(D,1);let j=R.indexOf(this.worklet);j>=0&&R.splice(j,1)}async dump(){return{playbackWorker:await Z(this.worker),playbackWorklet:await Z(this.worklet.port)}}_GetFreeIndex(){return this.availableIndexes.pop()}_OnMessages(D){}},X=class v{constructor(D,j,e,B,C){this.worklet=D;this.worker=j;this.sink=(E,f)=>{C.deref()!==void 0?e(E,f):(p("capture worker was left abandoned, aborting capture worker"),v.shutdown(D,j))},this.monitorSink=(E,f)=>{C.deref()!==void 0?B(E,f):(p("capture worker was left abandoned, aborting capture worker"),v.shutdown(D,j))},j.addEventListener("message",this._OnMessages.bind(this))}get context(){return this.worklet.context}setMedias(D){c(this.worker,["captureSetMedias",{connections:D}])}setVad(D){c(this.worker,["captureSetVad",D])}close(){v.shutdown(this.worklet,this.worker)}static shutdown(D,j){c(D.port,["close",void 0]),c(j,["close",void 0]);let e=Q.indexOf(j);e>=0&&Q.splice(e,1);let B=R.indexOf(D);B>=0&&R.splice(B,1)}async dump(){return{captureWorker:await Z(this.worker),captureWorklet:await Z(this.worklet.port)}}_OnMessages(D){let[j,e]=D.data;j==="sendPacket"&&(e.connectionId===0?this.monitorSink(e.connectionId,e.packet):this.sink(e.connectionId,e.packet))}};Ux=new WeakMap});var Wx,G0=q(()=>{Wx=`"use strict";(()=>{var Cn=Object.create;var or=Object.defineProperty;var Gn=Object.getOwnPropertyDescriptor;var pn=Object.getOwnPropertyNames;var hn=Object.getPrototypeOf,In=Object.prototype.hasOwnProperty;var mn=(n,A)=>()=>(A||n((A={exports:{}}).exports,A),A.exports),En=(n,A)=>{for(var t in A)or(n,t,{get:A[t],enumerable:!0})},$n=(n,A,t,e)=>{if(A&&typeof A=="object"||typeof A=="function")for(let i of pn(A))!In.call(n,i)&&i!==t&&or(n,i,{get:()=>A[i],enumerable:!(e=Gn(A,i))||e.enumerable});return n};var Fn=(n,A,t)=>(t=n!=null?Cn(hn(n)):{},$n(A||!n||!n.__esModule?or(t,"default",{value:n,enumerable:!0}):t,n));var $t=mn((Et,MA)=>{"use strict";var wA=(()=>{var n=globalThis.document?.currentScript?.src;return async function(A={}){var t,e=A,i=!!globalThis.window,d=!!globalThis.WorkerGlobalScope,q=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer",C=d&&globalThis.name=="em-pthread",v=[],B="./this.program",CA=(r,j)=>{throw j};d&&(n=self.location.href);var w="",Ht,_t;if(i||d){try{w=new URL(".",n).href}catch{}d&&(_t=r=>{var j=new XMLHttpRequest;return j.open("GET",r,!1),j.responseType="arraybuffer",j.send(null),new Uint8Array(j.response)}),Ht=async r=>{var j=await fetch(r,{credentials:"same-origin"});if(j.ok)return j.arrayBuffer();throw new Error(j.status+" : "+j.url)}}var TA=console.log.bind(console),N=console.error.bind(console),gr,eA,GA=!1,Q;function yt(r){for(var j=0,s=r.length,l=new Uint8Array(s),o;j<s;++j)o=r.charCodeAt(j),l[j]=~o>>8&o;return l}var UA,Lr,Hr;if(C){let r=function(j){try{var s=j.data,l=s.cmd;if(l==="load"){let o=[];self.onmessage=k=>o.push(k),Hr=()=>{postMessage({cmd:"loaded"});for(let k of o)r(k);self.onmessage=r};for(let k of s.handlers)(!e[k]||e[k].proxy)&&(e[k]=(...a)=>{postMessage({cmd:"callHandler",handler:k,args:a})},k=="print"&&(TA=e[k]),k=="printErr"&&(N=e[k]));X=s.wasmMemory,yr(),eA=s.wasmModule,Nr(),Dj()}else if(l==="run"){St(s.pthread_ptr),sr(s.pthread_ptr,0,0,1,0,0),h.threadInitTLS(),tr(s.pthread_ptr),SA||(Ij(),SA=!0);try{Vt(s.start_routine,s.arg)}catch(o){if(o!="unwind")throw o}}else s.target==="setimmediate"||(l==="checkMailbox"?SA&&HA():l&&(N(\`worker: received unknown command \${l}\`),N(s)))}catch(o){throw mj(),o}};var Ds=r,SA=!1;self.onunhandledrejection=j=>{throw j.reason||j},self.onmessage=r}var _r=!1;function yr(){var r=X.buffer;V=new Int8Array(r),pA=new Int16Array(r),e.HEAPU8=x=new Uint8Array(r),nA=new Uint16Array(r),e.HEAP32=z=new Int32Array(r),e.HEAPU32=E=new Uint32Array(r),e.HEAPF32=Jr=new Float32Array(r),hA=new Float64Array(r),S=new BigInt64Array(r),Kr=new BigUint64Array(r)}function xt(){if(!C){if(e.wasmMemory)X=e.wasmMemory;else{var r=e.INITIAL_MEMORY||16777216;X=new WebAssembly.Memory({initial:r/65536,maximum:r/65536,shared:!0})}yr()}}function Dt(){if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)Ot(e.preRun.shift());wr(Mr)}function xr(){if(_r=!0,C)return Hr();jA.F()}function Bt(){if(!C){if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;)Ut(e.postRun.shift());wr(Vr)}}function VA(r){e.onAbort?.(r),r="Aborted("+r+")",N(r),GA=!0,r+=". Build with -sASSERTIONS for more info.";var j=new WebAssembly.RuntimeError(r);throw Lr?.(j),j}var Dr;function Nt(){return yt(\`\\0asm\\0\\0\\0\\xB2>\\\`\\x7F\\0\\\`\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\\`\\0\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`||\\\`\\x7F}\\\`}}\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\0\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\b\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F~\\x7F~\\\`\\x7F\\x7F}\\\`\\x7F}}\\\`\\x7F\\x7F}}\\0\\\`
2
2
  \\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`|}\\\`|\\x7F|\\\`\\x7F\\x7F}\\0\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\` \\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\f\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\b\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F|\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F|}\\\`\\0|\\\`\\x7F\\x7F\\x7F~~\\0\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F|\\\`\\r\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F~\\x7F\\x7F\\x7F\\\`\\x7F\\x7F|\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\x7F\\x7F\\x7F\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F}}\\x7F\\x7F\\x7F\\x7F\\0\\\`~\\x7F\\x7F\\\` \\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\x7F\\x7F\\\`||\\x7F|\\\`|||\\\`\\x7F\\x7F\\x7F|\\\`\\x7F\\x7F|\\x7F\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\\`\\f\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`}\\x7F\\x7F\\\`|\\x7F\\x7F\\\`\\x7F\\x7F\\x7F}\\\`\\x7F}\\x7F\\0\\\`\\x7F\\x7F}\\x7F\\x7F\\x7F}\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F}}\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F|\\\`\\x7F\\x7F|\\0\\xBFab\\0ac\\0ad\\0ae\\0af\\0!ag\\0ah\\0"ai\\0aj\\0
3
3
  ak\\0#al\\0am\\0 an\\0$ao\\0ap\\0aq\\0ar\\0\\0as\\0\\0at\\0au\\0av\\0%aw\\0ax\\0\\bay\\0\\0az\\0\\0aA\\0\\baB\\0\\0aC\\0\\baD\\0\\0aE\\0aa\\x80\\x80\\xFB\\xF9\\0\\x07\\f&\\0\\f\\x07\\f\\f\\0\\x07\\0\\x07'(
4
4
  \\b\\v)\\x07*\\0\\f+,-\\v\\0\\0\\x07\\0.\\b\\b\\x1B
@@ -3233,7 +3233,7 @@ K\\xE08\\xDF\\0}\\xBC\\x8A\\x1B\\f\\xE5\\xFF\\xCF\\xE8?\\x9F\\xFFFq\\0\\x88\\xB
3233
3233
  return ret;
3234
3234
  \`),f+=\`}
3235
3235
  \`,new Function(I,f)}function rr(r,j,s,l,o,k){var a=j.length;a<2&&p("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var u=j[1]!==null&&s!==null,c=ij(j),f=!j[0].isVoid,G=j[0],I=j[1],$=[r,p,l,o,sj,G.fromWireType.bind(G),I?.toWireType.bind(I)],m=2;m<a;++m){var F=j[m];$.push(F.toWireType.bind(F))}if(!c)for(var m=u?1:2;m<j.length;++m)j[m].destructorFunction!==null&&$.push(j[m].destructorFunction);var P=Ie(j,u,f,k)(...$);return Aj(r,P)}var me=(r,j,s,l,o,k)=>{var a=Ar(j,s);o=K(l,o),M([],[r],u=>{u=u[0];var c=\`constructor \${u.name}\`;if(u.registeredClass.constructor_body===void 0&&(u.registeredClass.constructor_body=[]),u.registeredClass.constructor_body[j-1]!==void 0)throw new iA(\`Cannot register multiple constructors with identical number of parameters (\${j-1}) for class '\${u.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!\`);return u.registeredClass.constructor_body[j-1]=()=>{AA(\`Cannot construct \${u.name} due to unbound types\`,a)},M([],a,f=>(f.splice(1,0,null),u.registeredClass.constructor_body[j-1]=rr(c,f,null,o,k),[])),[]})},lj=r=>{r=r.trim();let j=r.indexOf("(");return j===-1?r:r.slice(0,j)},Ee=(r,j,s,l,o,k,a,u,c,f)=>{var G=Ar(s,l);j=g(j),j=lj(j),k=K(o,k,c),M([],[r],I=>{I=I[0];var $=\`\${I.name}.\${j}\`;j.startsWith("@@")&&(j=Symbol[j.substring(2)]),u&&I.registeredClass.pureVirtualFunctions.push(j);function m(){AA(\`Cannot call \${$} due to unbound types\`,G)}var F=I.registeredClass.instancePrototype,_=F[j];return _===void 0||_.overloadTable===void 0&&_.className!==I.name&&_.argCount===s-2?(m.argCount=s-2,m.className=I.name,F[j]=m):(jj(F,j,$),F[j].overloadTable[s-2]=m),M([],G,P=>{var y=rr($,P,I,k,a,c);return F[j].overloadTable===void 0?(y.argCount=s-2,F[j]=y):F[j].overloadTable[s-2]=y,[]}),[]})},oj=(r,j,s)=>(r instanceof Object||p(\`\${s} with invalid "this": \${r}\`),r instanceof j.registeredClass.constructor||p(\`\${s} incompatible with "this" of type \${r.constructor.name}\`),r.$$.ptr||p(\`cannot call emscripten binding method \${s} on deleted object\`),$A(r.$$.ptr,r.$$.ptrType.registeredClass,j.registeredClass)),$e=(r,j,s,l,o,k,a,u,c,f)=>{j=g(j),o=K(l,o),M([],[r],G=>{G=G[0];var I=\`\${G.name}.\${j}\`,$={get(){AA(\`Cannot access \${I} due to unbound types\`,[s,a])},enumerable:!0,configurable:!0};return c?$.set=()=>AA(\`Cannot access \${I} due to unbound types\`,[s,a]):$.set=m=>p(I+" is a read-only property"),Object.defineProperty(G.registeredClass.instancePrototype,j,$),M([],c?[s,a]:[s],m=>{var F=m[0],_={get(){var y=oj(this,G,I+" getter");return F.fromWireType(o(k,y))},enumerable:!0};if(c){c=K(u,c);var P=m[1];_.set=function(y){var oA=oj(this,G,I+" setter"),H=[];c(f,oA,P.toWireType(H,y)),sj(H)}}return Object.defineProperty(G.registeredClass.instancePrototype,j,_),[]}),[]})},aj=[],rA=[0,1,,1,null,1,!0,1,!1,1],Fe=r=>{r>9&&--rA[r+1]===0&&(rA[r]=void 0,aj.push(r))},jr={toValue:r=>(r||p(\`Cannot use deleted val. handle = \${r}\`),rA[r]),toHandle:r=>{switch(r){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let j=aj.pop()||rA.length;return rA[j]=r,rA[j+1]=1,j}}}},ve={name:"emscripten::val",fromWireType:r=>{var j=jr.toValue(r);return Fe(r),j},toWireType:(r,j)=>jr.toHandle(j),readValueFromPointer:FA,destructorFunction:null},ge=r=>b(r,ve),Le=(r,j)=>{switch(j){case 4:return function(s){return this.fromWireType(Jr[s>>2])};case 8:return function(s){return this.fromWireType(hA[s>>3])};default:throw new TypeError(\`invalid float width (\${j}): \${r}\`)}},He=(r,j,s)=>{j=g(j),b(r,{name:j,fromWireType:l=>l,toWireType:(l,o)=>o,readValueFromPointer:Le(j,s),destructorFunction:null})},_e=(r,j,s,l,o,k,a,u)=>{var c=Ar(j,s);r=g(r),r=lj(r),o=K(l,o,a),tj(r,function(){AA(\`Cannot call \${r} due to unbound types\`,c)},j-1),M([],c,f=>{var G=[f[0],null].concat(f.slice(1));return nj(r,rr(r,G,null,o,k,a),j-1),[]})},ye=(r,j,s,l,o)=>{j=g(j);let k=l===0,a=c=>c;if(k){var u=32-8*s;a=c=>c<<u>>>u,o=a(o)}b(r,{name:j,fromWireType:a,toWireType:(c,f)=>f,readValueFromPointer:zr(j,s,l!==0),destructorFunction:null})},xe=(r,j,s)=>{var l=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],o=l[j];function k(a){var u=E[a>>2],c=E[a+4>>2];return new o(V.buffer,c,u)}s=g(s),b(r,{name:s,fromWireType:k,readValueFromPointer:k},{ignoreDuplicateRegistrations:!0})},De=(r,j,s,l)=>{if(!(l>0))return 0;for(var o=s,k=s+l-1,a=0;a<r.length;++a){var u=r.codePointAt(a);if(u<=127){if(s>=k)break;j[s++]=u}else if(u<=2047){if(s+1>=k)break;j[s++]=192|u>>6,j[s++]=128|u&63}else if(u<=65535){if(s+2>=k)break;j[s++]=224|u>>12,j[s++]=128|u>>6&63,j[s++]=128|u&63}else{if(s+3>=k)break;j[s++]=240|u>>18,j[s++]=128|u>>12&63,j[s++]=128|u>>6&63,j[s++]=128|u&63,a++}}return j[s]=0,s-o},Be=(r,j,s)=>De(r,x,j,s),Ne=r=>{for(var j=0,s=0;s<r.length;++s){var l=r.charCodeAt(s);l<=127?j++:l<=2047?j+=2:l>=55296&&l<=57343?(j+=4,++s):j+=3}return j},kj=globalThis.TextDecoder&&new TextDecoder,uj=(r,j,s,l)=>{var o=j+s;if(l)return o;for(;r[j]&&!(j>=o);)++j;return j},cj=(r,j=0,s,l)=>{var o=uj(r,j,s,l);if(o-j>16&&r.buffer&&kj)return kj.decode(r.buffer instanceof ArrayBuffer?r.subarray(j,o):r.slice(j,o));for(var k="";j<o;){var a=r[j++];if(!(a&128)){k+=String.fromCharCode(a);continue}var u=r[j++]&63;if((a&224)==192){k+=String.fromCharCode((a&31)<<6|u);continue}var c=r[j++]&63;if((a&240)==224?a=(a&15)<<12|u<<6|c:a=(a&7)<<18|u<<12|c<<6|r[j++]&63,a<65536)k+=String.fromCharCode(a);else{var f=a-65536;k+=String.fromCharCode(55296|f>>10,56320|f&1023)}}return k},be=(r,j,s)=>r?cj(x,r,j,s):"",Je=(r,j)=>{j=g(j);var s=!0;b(r,{name:j,fromWireType(l){var o=E[l>>2],k=l+4,a;if(s)a=be(k,o,!0);else{a="";for(var u=0;u<o;++u)a+=String.fromCharCode(x[k+u])}return O(l),a},toWireType(l,o){o instanceof ArrayBuffer&&(o=new Uint8Array(o));var k,a=typeof o=="string";a||ArrayBuffer.isView(o)&&o.BYTES_PER_ELEMENT==1||p("Cannot pass non-string to std::string"),s&&a?k=Ne(o):k=o.length;var u=nr(4+k+1),c=u+4;if(E[u>>2]=k,a)if(s)Be(o,c,k+1);else for(var f=0;f<k;++f){var G=o.charCodeAt(f);G>255&&(O(u),p("String has UTF-16 code units that do not fit in 8 bits")),x[c+f]=G}else x.set(o,c);return l!==null&&l.push(O,u),u},readValueFromPointer:FA,destructorFunction(l){O(l)}})},dj=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,Ke=(r,j,s)=>{var l=r>>1,o=uj(nA,l,j/2,s);if(o-l>16&&dj)return dj.decode(nA.slice(l,o));for(var k="",a=l;a<o;++a){var u=nA[a];k+=String.fromCharCode(u)}return k},Oe=(r,j,s)=>{if(s??=2147483647,s<2)return 0;s-=2;for(var l=j,o=s<r.length*2?s/2:r.length,k=0;k<o;++k){var a=r.charCodeAt(k);pA[j>>1]=a,j+=2}return pA[j>>1]=0,j-l},Pe=r=>r.length*2,we=(r,j,s)=>{for(var l="",o=r>>2,k=0;!(k>=j/4);k++){var a=E[o+k];if(!a&&!s)break;l+=String.fromCodePoint(a)}return l},Me=(r,j,s)=>{if(s??=2147483647,s<4)return 0;for(var l=j,o=l+s-4,k=0;k<r.length;++k){var a=r.codePointAt(k);if(a>65535&&k++,z[j>>2]=a,j+=4,j+4>o)break}return z[j>>2]=0,j-l},Te=r=>{for(var j=0,s=0;s<r.length;++s){var l=r.codePointAt(s);l>65535&&s++,j+=4}return j},Ue=(r,j,s)=>{s=g(s);var l,o,k;j===2?(l=Ke,o=Oe,k=Pe):(l=we,o=Me,k=Te),b(r,{name:s,fromWireType:a=>{var u=E[a>>2],c=l(a+4,u*j,!0);return O(a),c},toWireType:(a,u)=>{typeof u!="string"&&p(\`Cannot pass non-string to C++ string type \${s}\`);var c=k(u),f=nr(4+c+j);return E[f>>2]=c/j,o(u,f+4,c+j),a!==null&&a.push(O,f),f},readValueFromPointer:FA,destructorFunction(a){O(a)}})},Se=(r,j)=>{j=g(j),b(r,{isVoid:!0,name:j,fromWireType:()=>{},toWireType:(s,l)=>{}})},Ve=r=>{sr(r,!d,1,!i,65536,!1),h.threadInitTLS()},qj=r=>{if(r instanceof br||r=="unwind")return Q;CA(1,r)},Re=()=>{if(!WA())try{if(C){_A()&&ir(Q);return}QA(Q)}catch(r){qj(r)}},fj=r=>{if(!GA)try{return r()}catch(j){qj(j)}finally{Re()}},We=!Atomics.waitAsync||globalThis.navigator?.userAgent&&Number((navigator.userAgent.match(/Chrom(e|ium)\\/([0-9]+)\\./)||[])[2])<91,tr=r=>{if(!We){var j=Atomics.waitAsync(z,r>>2,r);j.value.then(HA);var s=r+120;Atomics.store(z,s>>2,1)}},HA=()=>fj(()=>{var r=_A();r&&(tr(r),vj())}),Qe=(r,j)=>{if(r==j)setTimeout(HA);else if(C)postMessage({targetThread:r,cmd:"checkMailbox"});else{var s=h.pthreads[r];if(!s)return;s.postMessage({cmd:"checkMailbox"})}},er=[],ze=(r,j,s,l,o,k,a)=>{er.length=0;for(var u=o>>3,c=o+l>>3;u<c;){var f;S[u++]?f=S[u++]:f=hA[u++],er.push(f)}var G=kn[r];h.currentProxiedOperationCallerThread=s;var I=G(...er);if(h.currentProxiedOperationCallerThread=0,k){I.then($=>Ej(k,a,$));return}return I},Xe=r=>{C?postMessage({cmd:"cleanupThread",thread:r}):Pr(r)},Ze=r=>{},Ye=()=>performance.timeOrigin+performance.now(),An=9007199254740992,rn=-9007199254740992,jn=r=>r<rn||r>An?NaN:Number(r),tn=()=>{},en=()=>{RA+=1},nn=()=>{throw en(),"unwind"},sn=r=>{VA("OOM")},ln=r=>{var j=x.length;r>>>=0,sn(r)};function Cj(r){return C?sA(2,0,1,r):52}function Gj(r,j,s,l){return C?sA(3,0,1,r,j,s,l):(j=jn(j),70)}var on=[null,[],[]],an=(r,j)=>{var s=on[r];j===0||j===10?((r===1?TA:N)(cj(s)),s.length=0):s.push(j)};function pj(r,j,s,l){if(C)return sA(4,0,1,r,j,s,l);for(var o=0,k=0;k<s;k++){var a=E[j>>2],u=E[j+4>>2];j+=8;for(var c=0;c<u;c++)an(r,x[a+c]);o+=u}return E[l>>2]=o,0}if(h.init(),ee(),Ce(),xt(),e.noExitRuntime&&(zA=e.noExitRuntime),e.print&&(TA=e.print),e.printErr&&(N=e.printErr),e.wasmBinary&&(gr=e.wasmBinary),e.arguments&&(v=e.arguments),e.thisProgram&&(B=e.thisProgram),e.preInit)for(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();var kn=[Ur,Sr,Cj,Gj,pj],hj,Ij,_A,nr,O,un,sr,mj,Ej,$j,Fj,ir,vj,gj,Lj,Hj,_j,cn,yj;function dn(r){hj=r.G,Ij=r.H,_A=r.J,nr=e._malloc=r.K,O=e._free=r.L,un=r.M,sr=r.N,mj=r.O,Ej=r.P,$j=r.Q,Fj=r.R,ir=r.S,vj=r.T,gj=r.U,Lj=r.V,Hj=r.W,_j=r.X,cn=yj=r.I}var xj;function qn(){xj={i:zt,C:Xt,h:Yt,o:Ae,n:he,m:me,e:Ee,b:$e,D:ge,l:He,q:_e,d:ye,c:xe,E:Je,g:Ue,p:Se,z:Ve,u:Qe,k:ze,s:Xe,y:tr,B:Ze,x:tn,A:nn,f:Ye,t:ln,r:QA,w:Cj,v:Gj,j:pj,a:X}}function Dj(){if(C){UA?.(e),xr();return}Dt();function r(){e.calledRun=!0,!GA&&(xr(),UA?.(e),e.onRuntimeInitialized?.(),Bt())}e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1),r()},1)):r()}var jA;return C||(jA=await Nr(),Dj()),_r?t=e:t=new Promise((r,j)=>{UA=r,Lr=j}),t}})();typeof Et=="object"&&typeof MA=="object"?(MA.exports=wA,MA.exports.default=wA):typeof define=="function"&&define.amd&&define([],()=>wA);var ys=globalThis.name=="em-pthread";ys&&wA()});var J={};En(J,{AdditionalCaptureBlocks:()=>gn,AdditionalPlaybackBlocks:()=>vn,ClockJumpCheckInterval:()=>Bn,ClockJumpThreshold:()=>Nn,ConnectInterval:()=>Sn,ConnectTimeout:()=>Mn,DefaultRefreshRate:()=>Hn,DefaultVideoCodec:()=>Vn,HealthCheckTimeout:()=>Dn,MainConnectionPingInterval:()=>bn,MaxNumberOfDecoders:()=>yn,MinDBFs:()=>Jj,MinTokenLifetime:()=>Tn,MinTokenRefreshInterval:()=>Un,PlaybackPreload:()=>Ln,RenderQuantumSize:()=>xn,VadPreload:()=>_n,WebRtcAnswerTimeout:()=>Pn,WebRtcIceTimeout:()=>Kn,WebRtcMaxNegotiationAttempts:()=>wn,WebRtcStatsSnapshotInterval:()=>Jn,WebRtcTimeout:()=>On});var vn=3,gn=3,Ln=3,Hn=250,_n=3,yn=512,xn=128,Jj=-758.596,Dn=1e4,Bn=1e3,Nn=1e4,bn=3e3,Jn=1e3,Kn=3e3,On=1e4,Pn=1e4,wn=3,Mn=5e3,Tn=6e4,Un=5e3,Sn=[0,100,200,200,500],Vn="H264";function aA(n,A,t){return n.postMessage(A,t)}function ar(n){return n.sampleRate*.02*(n.stereo?2:1)}function kr(n,A){let t=ar(n),e=t*A,i=e+t;return n.samples.subarray(e,i)}function ur(n,A,t){n.headers[A]=t.id}function Kj(n){return[n.values[0],n.values[1]]}function Oj(n,A){n.values[0]=A[0],n.values[1]=A[1]}function Pj(n,A){return n.values[2+A*5]}function wj(n,A,t){n.values[2+A*5]=t}function Mj(n,A){let t=2+A*5+1;return[n.values[t+0],n.values[t+1]]}function Tj(n,A,t){let e=2+A*5+1;n.values[e+0]=t[0],n.values[e+1]=t[1]}function Uj(n,A){return n.values[2+A*5+3]}function Sj(n,A,t){n.values[2+A*5+3]=t}function Vj(n,A){return n.values[2+A*5+4]}function Rj(n,A,t){n.values[2+A*5+4]=t}function Wj(n){return n.values[0]!==0}function Qj(n){return n.values[1]}function zj(n){return n.values[2]}function Xj(n){return n.values[3]}function Zj(n,A){return n.values[3]=A}function Yj(n){return n?Array.from(n).map(A=>A.toString(16).padStart(2,"0")).join(""):null}var Rn;(n=>{let A;(t=>(t[t.InvalidPassword=-1]="InvalidPassword",t[t.Unknown=0]="Unknown",t[t.Unencrypted=1]="Unencrypted",t[t.Encrypted=2]="Encrypted"))(A=n.PeerCipherStatus||={})})(Rn||={});function et(n){return{type:"Success",value:n}}function D(n){return{type:"Failure",reason:n}}var{Deno:At}=globalThis,Wn=typeof At?.noColor=="boolean"?At.noColor:!1,Qn=!Wn;function dr(n,A){return{open:\`\\x1B[\${n.join(";")}m\`,close:\`\\x1B[\${A}m\`,regexp:new RegExp(\`\\\\x1b\\\\[\${A}m\`,"g")}}function qr(n,A){return Qn?\`\${A.open}\${n.replace(A.regexp,A.open)}\${A.close}\`:n}function cr(n){return qr(n,dr([0],0))}function rt(n){return qr(n,dr([1],22))}function zn(n){return qr(n,dr([2],22))}var Ss=new RegExp(["[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)","(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g"),Xn=new Date,yA=(n=>(n[n.CRITICAL=0]="CRITICAL",n[n.ERROR=1]="ERROR",n[n.WARN=2]="WARN",n[n.INFO=3]="INFO",n[n.DEBUG=4]="DEBUG",n))(yA||{}),nt={0:"\\u{1F4A5}",1:"\\u{1F534}",2:"\\u{1F7E1}",3:"\\u{1F535}",4:"\\u{1F7E3}"},Zn={4:zn,3:cr,2:cr,1:rt,0:rt};function Yn({message:n}){return String(n)}function jt(n){return JSON.stringify({timestamp:n.date.toISOString(),level:yA[n.level],message:n.message,extra:n.extra})}function tt(n){function A(q,C){return[Math.floor(q/C),q%C]}function t(){let q,C=n.date.valueOf()-Xn.valueOf();[C,q]=A(C,1e3);let[v,B]=A(C,60);return\`\${v.toString().padStart(4,"0")}:\${B.toString().padStart(2,"0")}.\${q.toString().padStart(3,"0")}\`}function e(){return n.extra===void 0?"":typeof Deno=="object"?" "+Deno.inspect(n.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(n.extra)}let i=nt[n.level],d=n.logger.name!==void 0?\`@\${n.logger.name}\`:"";return\`\${cr(t())}\${d} \${i} \${Zn[n.level](String(n.message))}\${e()}\`}function As(n){let A=\`[\${n.date.toISOString()}]\`,t=\`[\${yA[n.level]}]\`,e=n.logger.name!==void 0?\`[\${n.logger.name}] \`:"",i=nt[n.level];return\`\${A} \${i} \${t.padEnd(7," ")} \${e}\${n.message}\`}function rs(){return typeof Deno=="object"&&Deno.stdout.isTerminal()}var st=class{static sparse=Yn;static json=jt;static pretty=tt;static structured=As;static default=rs()?tt:jt;constructor(){}};var js=class{formatter;consoleObject;filter;constructor(n=st.default,A=4,t=console){this.filter=A,this.formatter=n,this.consoleObject=t}handle(n){let A=this.formatter(n);switch(n.level){case 0:case 1:this.consoleObject.error(A);break;case 2:this.consoleObject.warn(A);break;case 3:this.consoleObject.info(A);break;case 4:this.consoleObject.debug(A);break}}};var R=class{#A;sinks;filter;parent;get name(){return this.#A}constructor(n,A=void 0,t=[],e=void 0){this.#A=A,this.sinks=t,this.filter=n,this.parent=e}log(n,A,t=void 0){let e={date:new Date,level:n,logger:this,message:A,extra:t};this.filter<n||this.insert(e)}insert(n){if(!(this.filter<n.level)){for(let A of this.sinks)A.filter>=n.level&&A.handle(n);this.parent!==void 0&&this.parent.insert(n)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},kA=globalThis[Symbol.for("odin-global-logger")]??=new R(3,void 0,[new js]),ts=R.prototype.log.bind(kA,1),es=R.prototype.log.bind(kA,2),it=R.prototype.log.bind(kA,3),ns=R.prototype.log.bind(kA,4),Vs=R.prototype.log.bind(kA);var lt;function ot(n,...A){let t=ss(A);lt?lt?.info(n,t):it(n,t)}function ss(...n){if(n.length===1&&typeof n[0]=="object"&&n[0]!==null)return{...n[0]};if(n.length>0)return{args:n}}function xA(n){return n.connectionId*4294967296+n.mediaId}function at(n){return{mediaId:n%4294967296,connectionId:Math.floor(n/4294967296)}}function T(n,A,t){let e;switch(A){case"f32":e=n.HEAPF32;break;case"u32":e=n.HEAPU32;break;case"i32":e=n.HEAP32;break;case"u8":e=n.HEAPU8;break;default:throw new Error(\`allocating \${A} is not supported\`)}let i=n._malloc(t*e.BYTES_PER_ELEMENT);if(i===0||i%e.BYTES_PER_ELEMENT!==0)throw new Error(\`failed allocating a \${t} \${A} array\`);let d=i/e.BYTES_PER_ELEMENT;return e.subarray(d,d+t)}function tA(n,A){n._free(A.byteOffset)}function fr(n,A,t,e){return{headers:T(n,"i32",t),samples:T(n,"f32",t*ar({sampleRate:A,stereo:e})),length:t,sampleRate:A,stereo:e}}function Cr(n,A){tA(n,A.headers),tA(n,A.samples)}function kt(n,A){return{values:T(n,"f32",2+A*5),length:A}}function ut(n,A){tA(n,A.values)}function ct(n){return{values:T(n,"f32",4)}}function dt(n,A){tA(n,A.values)}function qt(n){let A=n.length,t=0,e=0;for(;e<A;){let i=n.charCodeAt(e++);if((i&4294967168)===0){t++;continue}else if((i&4294965248)===0)t+=2;else{if(i>=55296&&i<=56319&&e<A){let d=n.charCodeAt(e);(d&64512)===56320&&(++e,i=((i&1023)<<10)+(d&1023)+65536)}(i&4294901760)===0?t+=3:t+=4}}return t}function is(n,A,t){let e=n.length,i=t,d=0;for(;d<e;){let q=n.charCodeAt(d++);if((q&4294967168)===0){A[i++]=q;continue}else if((q&4294965248)===0)A[i++]=q>>6&31|192;else{if(q>=55296&&q<=56319&&d<e){let C=n.charCodeAt(d);(C&64512)===56320&&(++d,q=((q&1023)<<10)+(C&1023)+65536)}(q&4294901760)===0?(A[i++]=q>>12&15|224,A[i++]=q>>6&63|128):(A[i++]=q>>18&7|240,A[i++]=q>>12&63|128,A[i++]=q>>6&63|128)}A[i++]=q&63|128}}var ls=new TextEncoder,os=50;function as(n,A,t){ls.encodeInto(n,A.subarray(t))}function ft(n,A,t){n.length>os?as(n,A,t):is(n,A,t)}var ks=4096;function Gr(n,A,t){let e=A,i=e+t,d=[],q="";for(;e<i;){let C=n[e++];if((C&128)===0)d.push(C);else if((C&224)===192){let v=n[e++]&63;d.push((C&31)<<6|v)}else if((C&240)===224){let v=n[e++]&63,B=n[e++]&63;d.push((C&31)<<12|v<<6|B)}else if((C&248)===240){let v=n[e++]&63,B=n[e++]&63,CA=n[e++]&63,w=(C&7)<<18|v<<12|B<<6|CA;w>65535&&(w-=65536,d.push(w>>>10&1023|55296),w=56320|w&1023),d.push(w)}else d.push(C);d.length>=ks&&(q+=String.fromCharCode(...d),d.length=0)}return d.length>0&&(q+=String.fromCharCode(...d)),q}var us=new TextDecoder,cs=200;function ds(n,A,t){let e=n.subarray(A,A+t);return us.decode(e)}function Ct(n,A,t){return t>cs?ds(n,A,t):Gr(n,A,t)}var W=class{constructor(A,t){this.type=A,this.data=t}};var L=class n extends Error{constructor(A){super(A);let t=Object.create(n.prototype);Object.setPrototypeOf(this,t),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:n.name})}};function Gt(n,A,t){let e=t/4294967296,i=t;n.setUint32(A,e),n.setUint32(A+4,i)}function DA(n,A,t){let e=Math.floor(t/4294967296),i=t;n.setUint32(A,e),n.setUint32(A+4,i)}function BA(n,A){let t=n.getInt32(A),e=n.getUint32(A+4);return t*4294967296+e}function pt(n,A){let t=n.getUint32(A),e=n.getUint32(A+4);return t*4294967296+e}var qs=-1,fs=4294967296-1,Cs=17179869184-1;function Gs({sec:n,nsec:A}){if(n>=0&&A>=0&&n<=Cs)if(A===0&&n<=fs){let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,n),t}else{let t=n/4294967296,e=n&4294967295,i=new Uint8Array(8),d=new DataView(i.buffer);return d.setUint32(0,A<<2|t&3),d.setUint32(4,e),i}else{let t=new Uint8Array(12),e=new DataView(t.buffer);return e.setUint32(0,A),DA(e,4,n),t}}function ps(n){let A=n.getTime(),t=Math.floor(A/1e3),e=(A-t*1e3)*1e6,i=Math.floor(e/1e9);return{sec:t+i,nsec:e-i*1e9}}function hs(n){if(n instanceof Date){let A=ps(n);return Gs(A)}else return null}function Is(n){let A=new DataView(n.buffer,n.byteOffset,n.byteLength);switch(n.byteLength){case 4:return{sec:A.getUint32(0),nsec:0};case 8:{let t=A.getUint32(0),e=A.getUint32(4),i=(t&3)*4294967296+e,d=t>>>2;return{sec:i,nsec:d}}case 12:{let t=BA(A,4),e=A.getUint32(0);return{sec:t,nsec:e}}default:throw new L(\`Unrecognized data size for timestamp (expected 4, 8, or 12): \${n.length}\`)}}function ms(n){let A=Is(n);return new Date(A.sec*1e3+A.nsec/1e6)}var ht={type:qs,encode:hs,decode:ms};var U=class{constructor(){this.builtInEncoders=[],this.builtInDecoders=[],this.encoders=[],this.decoders=[],this.register(ht)}register({type:A,encode:t,decode:e}){if(A>=0)this.encoders[A]=t,this.decoders[A]=e;else{let i=-1-A;this.builtInEncoders[i]=t,this.builtInDecoders[i]=e}}tryToEncode(A,t){for(let e=0;e<this.builtInEncoders.length;e++){let i=this.builtInEncoders[e];if(i!=null){let d=i(A,t);if(d!=null){let q=-1-e;return new W(q,d)}}}for(let e=0;e<this.encoders.length;e++){let i=this.encoders[e];if(i!=null){let d=i(A,t);if(d!=null){let q=e;return new W(q,d)}}}return A instanceof W?A:null}decode(A,t,e){let i=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return i?i(A,t,e):new W(t,A)}};U.defaultCodec=new U;function Es(n){return n instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&n instanceof SharedArrayBuffer}function uA(n){return n instanceof Uint8Array?n:ArrayBuffer.isView(n)?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):Es(n)?new Uint8Array(n):Uint8Array.from(n)}var $s=100,Fs=2048,NA=class n{constructor(A){this.entered=!1,this.extensionCodec=A?.extensionCodec??U.defaultCodec,this.context=A?.context,this.useBigInt64=A?.useBigInt64??!1,this.maxDepth=A?.maxDepth??$s,this.initialBufferSize=A?.initialBufferSize??Fs,this.sortKeys=A?.sortKeys??!1,this.forceFloat32=A?.forceFloat32??!1,this.ignoreUndefined=A?.ignoreUndefined??!1,this.forceIntegerToFloat=A?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new n({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,maxDepth:this.maxDepth,initialBufferSize:this.initialBufferSize,sortKeys:this.sortKeys,forceFloat32:this.forceFloat32,ignoreUndefined:this.ignoreUndefined,forceIntegerToFloat:this.forceIntegerToFloat})}reinitializeState(){this.pos=0}encodeSharedRef(A){if(this.entered)return this.clone().encodeSharedRef(A);try{return this.entered=!0,this.reinitializeState(),this.doEncode(A,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(A){if(this.entered)return this.clone().encode(A);try{return this.entered=!0,this.reinitializeState(),this.doEncode(A,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(A,t){if(t>this.maxDepth)throw new Error(\`Too deep objects in depth \${t}\`);A==null?this.encodeNil():typeof A=="boolean"?this.encodeBoolean(A):typeof A=="number"?this.forceIntegerToFloat?this.encodeNumberAsFloat(A):this.encodeNumber(A):typeof A=="string"?this.encodeString(A):this.useBigInt64&&typeof A=="bigint"?this.encodeBigInt64(A):this.encodeObject(A,t)}ensureBufferSizeToWrite(A){let t=this.pos+A;this.view.byteLength<t&&this.resizeBuffer(t*2)}resizeBuffer(A){let t=new ArrayBuffer(A),e=new Uint8Array(t),i=new DataView(t);e.set(this.bytes),this.view=i,this.bytes=e}encodeNil(){this.writeU8(192)}encodeBoolean(A){A===!1?this.writeU8(194):this.writeU8(195)}encodeNumber(A){!this.forceIntegerToFloat&&Number.isSafeInteger(A)?A>=0?A<128?this.writeU8(A):A<256?(this.writeU8(204),this.writeU8(A)):A<65536?(this.writeU8(205),this.writeU16(A)):A<4294967296?(this.writeU8(206),this.writeU32(A)):this.useBigInt64?this.encodeNumberAsFloat(A):(this.writeU8(207),this.writeU64(A)):A>=-32?this.writeU8(224|A+32):A>=-128?(this.writeU8(208),this.writeI8(A)):A>=-32768?(this.writeU8(209),this.writeI16(A)):A>=-2147483648?(this.writeU8(210),this.writeI32(A)):this.useBigInt64?this.encodeNumberAsFloat(A):(this.writeU8(211),this.writeI64(A)):this.encodeNumberAsFloat(A)}encodeNumberAsFloat(A){this.forceFloat32?(this.writeU8(202),this.writeF32(A)):(this.writeU8(203),this.writeF64(A))}encodeBigInt64(A){A>=BigInt(0)?(this.writeU8(207),this.writeBigUint64(A)):(this.writeU8(211),this.writeBigInt64(A))}writeStringHeader(A){if(A<32)this.writeU8(160+A);else if(A<256)this.writeU8(217),this.writeU8(A);else if(A<65536)this.writeU8(218),this.writeU16(A);else if(A<4294967296)this.writeU8(219),this.writeU32(A);else throw new Error(\`Too long string: \${A} bytes in UTF-8\`)}encodeString(A){let e=qt(A);this.ensureBufferSizeToWrite(5+e),this.writeStringHeader(e),ft(A,this.bytes,this.pos),this.pos+=e}encodeObject(A,t){let e=this.extensionCodec.tryToEncode(A,this.context);if(e!=null)this.encodeExtension(e);else if(Array.isArray(A))this.encodeArray(A,t);else if(ArrayBuffer.isView(A))this.encodeBinary(A);else if(typeof A=="object")this.encodeMap(A,t);else throw new Error(\`Unrecognized object: \${Object.prototype.toString.apply(A)}\`)}encodeBinary(A){let t=A.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else if(t<4294967296)this.writeU8(198),this.writeU32(t);else throw new Error(\`Too large binary: \${t}\`);let e=uA(A);this.writeU8a(e)}encodeArray(A,t){let e=A.length;if(e<16)this.writeU8(144+e);else if(e<65536)this.writeU8(220),this.writeU16(e);else if(e<4294967296)this.writeU8(221),this.writeU32(e);else throw new Error(\`Too large array: \${e}\`);for(let i of A)this.doEncode(i,t+1)}countWithoutUndefined(A,t){let e=0;for(let i of t)A[i]!==void 0&&e++;return e}encodeMap(A,t){let e=Object.keys(A);this.sortKeys&&e.sort();let i=this.ignoreUndefined?this.countWithoutUndefined(A,e):e.length;if(i<16)this.writeU8(128+i);else if(i<65536)this.writeU8(222),this.writeU16(i);else if(i<4294967296)this.writeU8(223),this.writeU32(i);else throw new Error(\`Too large map object: \${i}\`);for(let d of e){let q=A[d];this.ignoreUndefined&&q===void 0||(this.encodeString(d),this.doEncode(q,t+1))}}encodeExtension(A){if(typeof A.data=="function"){let e=A.data(this.pos+6),i=e.length;if(i>=4294967296)throw new Error(\`Too large extension object: \${i}\`);this.writeU8(201),this.writeU32(i),this.writeI8(A.type),this.writeU8a(e);return}let t=A.data.length;if(t===1)this.writeU8(212);else if(t===2)this.writeU8(213);else if(t===4)this.writeU8(214);else if(t===8)this.writeU8(215);else if(t===16)this.writeU8(216);else if(t<256)this.writeU8(199),this.writeU8(t);else if(t<65536)this.writeU8(200),this.writeU16(t);else if(t<4294967296)this.writeU8(201),this.writeU32(t);else throw new Error(\`Too large extension object: \${t}\`);this.writeI8(A.type),this.writeU8a(A.data)}writeU8(A){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,A),this.pos++}writeU8a(A){let t=A.length;this.ensureBufferSizeToWrite(t),this.bytes.set(A,this.pos),this.pos+=t}writeI8(A){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,A),this.pos++}writeU16(A){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,A),this.pos+=2}writeI16(A){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,A),this.pos+=2}writeU32(A){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,A),this.pos+=4}writeI32(A){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,A),this.pos+=4}writeF32(A){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,A),this.pos+=4}writeF64(A){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,A),this.pos+=8}writeU64(A){this.ensureBufferSizeToWrite(8),Gt(this.view,this.pos,A),this.pos+=8}writeI64(A){this.ensureBufferSizeToWrite(8),DA(this.view,this.pos,A),this.pos+=8}writeBigUint64(A){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,A),this.pos+=8}writeBigInt64(A){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,A),this.pos+=8}};function pr(n,A){return new NA(A).encodeSharedRef(n)}function bA(n){return\`\${n<0?"-":""}0x\${Math.abs(n).toString(16).padStart(2,"0")}\`}var vs=16,gs=16,JA=class{constructor(A=vs,t=gs){this.hit=0,this.miss=0,this.maxKeyLength=A,this.maxLengthPerKey=t,this.caches=[];for(let e=0;e<this.maxKeyLength;e++)this.caches.push([])}canBeCached(A){return A>0&&A<=this.maxKeyLength}find(A,t,e){let i=this.caches[e-1];A:for(let d of i){let q=d.bytes;for(let C=0;C<e;C++)if(q[C]!==A[t+C])continue A;return d.str}return null}store(A,t){let e=this.caches[A.length-1],i={bytes:A,str:t};e.length>=this.maxLengthPerKey?e[Math.random()*e.length|0]=i:e.push(i)}decode(A,t,e){let i=this.find(A,t,e);if(i!=null)return this.hit++,i;this.miss++;let d=Gr(A,t,e),q=Uint8Array.prototype.slice.call(A,t,t+e);return this.store(q,d),d}};var hr="array",qA="map_key",mt="map_value",Ls=n=>{if(typeof n=="string"||typeof n=="number")return n;throw new L("The type of key must be string or number but "+typeof n)},Ir=class{constructor(){this.stack=[],this.stackHeadPosition=-1}get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(A){let t=this.getUninitializedStateFromPool();t.type=hr,t.position=0,t.size=A,t.array=new Array(A)}pushMapState(A){let t=this.getUninitializedStateFromPool();t.type=qA,t.readCount=0,t.size=A,t.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let A={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(A)}return this.stack[this.stackHeadPosition]}release(A){if(this.stack[this.stackHeadPosition]!==A)throw new Error("Invalid stack state. Released state is not on top of the stack.");if(A.type===hr){let e=A;e.size=0,e.array=void 0,e.position=0,e.type=void 0}if(A.type===qA||A.type===mt){let e=A;e.size=0,e.map=void 0,e.readCount=0,e.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}},dA=-1,mr=new DataView(new ArrayBuffer(0)),Hs=new Uint8Array(mr.buffer);try{mr.getInt8(0)}catch(n){if(!(n instanceof RangeError))throw new Error("This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access")}var It=new RangeError("Insufficient data"),_s=new JA,KA=class n{constructor(A){this.totalPos=0,this.pos=0,this.view=mr,this.bytes=Hs,this.headByte=dA,this.stack=new Ir,this.entered=!1,this.extensionCodec=A?.extensionCodec??U.defaultCodec,this.context=A?.context,this.useBigInt64=A?.useBigInt64??!1,this.rawStrings=A?.rawStrings??!1,this.maxStrLength=A?.maxStrLength??4294967295,this.maxBinLength=A?.maxBinLength??4294967295,this.maxArrayLength=A?.maxArrayLength??4294967295,this.maxMapLength=A?.maxMapLength??4294967295,this.maxExtLength=A?.maxExtLength??4294967295,this.keyDecoder=A?.keyDecoder!==void 0?A.keyDecoder:_s,this.mapKeyConverter=A?.mapKeyConverter??Ls}clone(){return new n({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=dA,this.stack.reset()}setBuffer(A){let t=uA(A);this.bytes=t,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength),this.pos=0}appendBuffer(A){if(this.headByte===dA&&!this.hasRemaining(1))this.setBuffer(A);else{let t=this.bytes.subarray(this.pos),e=uA(A),i=new Uint8Array(t.length+e.length);i.set(t),i.set(e,t.length),this.setBuffer(i)}}hasRemaining(A){return this.view.byteLength-this.pos>=A}createExtraByteError(A){let{view:t,pos:e}=this;return new RangeError(\`Extra \${t.byteLength-e} of \${t.byteLength} byte(s) found at buffer[\${A}]\`)}decode(A){if(this.entered)return this.clone().decode(A);try{this.entered=!0,this.reinitializeState(),this.setBuffer(A);let t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t}finally{this.entered=!1}}*decodeMulti(A){if(this.entered){yield*this.clone().decodeMulti(A);return}try{for(this.entered=!0,this.reinitializeState(),this.setBuffer(A);this.hasRemaining(1);)yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(A){if(this.entered)return this.clone().decodeAsync(A);try{this.entered=!0;let t=!1,e;for await(let C of A){if(t)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(C);try{e=this.doDecodeSync(),t=!0}catch(v){if(!(v instanceof RangeError))throw v}this.totalPos+=this.pos}if(t){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return e}let{headByte:i,pos:d,totalPos:q}=this;throw new RangeError(\`Insufficient data in parsing \${bA(i)} at \${q} (\${d} in the current buffer)\`)}finally{this.entered=!1}}decodeArrayStream(A){return this.decodeMultiAsync(A,!0)}decodeStream(A){return this.decodeMultiAsync(A,!1)}async*decodeMultiAsync(A,t){if(this.entered){yield*this.clone().decodeMultiAsync(A,t);return}try{this.entered=!0;let e=t,i=-1;for await(let d of A){if(t&&i===0)throw this.createExtraByteError(this.totalPos);this.appendBuffer(d),e&&(i=this.readArraySize(),e=!1,this.complete());try{for(;yield this.doDecodeSync(),--i!==0;);}catch(q){if(!(q instanceof RangeError))throw q}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){A:for(;;){let A=this.readHeadByte(),t;if(A>=224)t=A-256;else if(A<192)if(A<128)t=A;else if(A<144){let i=A-128;if(i!==0){this.pushMapState(i),this.complete();continue A}else t={}}else if(A<160){let i=A-144;if(i!==0){this.pushArrayState(i),this.complete();continue A}else t=[]}else{let i=A-160;t=this.decodeString(i,0)}else if(A===192)t=null;else if(A===194)t=!1;else if(A===195)t=!0;else if(A===202)t=this.readF32();else if(A===203)t=this.readF64();else if(A===204)t=this.readU8();else if(A===205)t=this.readU16();else if(A===206)t=this.readU32();else if(A===207)this.useBigInt64?t=this.readU64AsBigInt():t=this.readU64();else if(A===208)t=this.readI8();else if(A===209)t=this.readI16();else if(A===210)t=this.readI32();else if(A===211)this.useBigInt64?t=this.readI64AsBigInt():t=this.readI64();else if(A===217){let i=this.lookU8();t=this.decodeString(i,1)}else if(A===218){let i=this.lookU16();t=this.decodeString(i,2)}else if(A===219){let i=this.lookU32();t=this.decodeString(i,4)}else if(A===220){let i=this.readU16();if(i!==0){this.pushArrayState(i),this.complete();continue A}else t=[]}else if(A===221){let i=this.readU32();if(i!==0){this.pushArrayState(i),this.complete();continue A}else t=[]}else if(A===222){let i=this.readU16();if(i!==0){this.pushMapState(i),this.complete();continue A}else t={}}else if(A===223){let i=this.readU32();if(i!==0){this.pushMapState(i),this.complete();continue A}else t={}}else if(A===196){let i=this.lookU8();t=this.decodeBinary(i,1)}else if(A===197){let i=this.lookU16();t=this.decodeBinary(i,2)}else if(A===198){let i=this.lookU32();t=this.decodeBinary(i,4)}else if(A===212)t=this.decodeExtension(1,0);else if(A===213)t=this.decodeExtension(2,0);else if(A===214)t=this.decodeExtension(4,0);else if(A===215)t=this.decodeExtension(8,0);else if(A===216)t=this.decodeExtension(16,0);else if(A===199){let i=this.lookU8();t=this.decodeExtension(i,1)}else if(A===200){let i=this.lookU16();t=this.decodeExtension(i,2)}else if(A===201){let i=this.lookU32();t=this.decodeExtension(i,4)}else throw new L(\`Unrecognized type byte: \${bA(A)}\`);this.complete();let e=this.stack;for(;e.length>0;){let i=e.top();if(i.type===hr)if(i.array[i.position]=t,i.position++,i.position===i.size)t=i.array,e.release(i);else continue A;else if(i.type===qA){if(t==="__proto__")throw new L("The key __proto__ is not allowed");i.key=this.mapKeyConverter(t),i.type=mt;continue A}else if(i.map[i.key]=t,i.readCount++,i.readCount===i.size)t=i.map,e.release(i);else{i.key=null,i.type=qA;continue A}}return t}}readHeadByte(){return this.headByte===dA&&(this.headByte=this.readU8()),this.headByte}complete(){this.headByte=dA}readArraySize(){let A=this.readHeadByte();switch(A){case 220:return this.readU16();case 221:return this.readU32();default:{if(A<160)return A-144;throw new L(\`Unrecognized array type byte: \${bA(A)}\`)}}}pushMapState(A){if(A>this.maxMapLength)throw new L(\`Max length exceeded: map length (\${A}) > maxMapLengthLength (\${this.maxMapLength})\`);this.stack.pushMapState(A)}pushArrayState(A){if(A>this.maxArrayLength)throw new L(\`Max length exceeded: array length (\${A}) > maxArrayLength (\${this.maxArrayLength})\`);this.stack.pushArrayState(A)}decodeString(A,t){return!this.rawStrings||this.stateIsMapKey()?this.decodeUtf8String(A,t):this.decodeBinary(A,t)}decodeUtf8String(A,t){if(A>this.maxStrLength)throw new L(\`Max length exceeded: UTF-8 byte length (\${A}) > maxStrLength (\${this.maxStrLength})\`);if(this.bytes.byteLength<this.pos+t+A)throw It;let e=this.pos+t,i;return this.stateIsMapKey()&&this.keyDecoder?.canBeCached(A)?i=this.keyDecoder.decode(this.bytes,e,A):i=Ct(this.bytes,e,A),this.pos+=t+A,i}stateIsMapKey(){return this.stack.length>0?this.stack.top().type===qA:!1}decodeBinary(A,t){if(A>this.maxBinLength)throw new L(\`Max length exceeded: bin length (\${A}) > maxBinLength (\${this.maxBinLength})\`);if(!this.hasRemaining(A+t))throw It;let e=this.pos+t,i=this.bytes.subarray(e,e+A);return this.pos+=t+A,i}decodeExtension(A,t){if(A>this.maxExtLength)throw new L(\`Max length exceeded: ext length (\${A}) > maxExtLength (\${this.maxExtLength})\`);let e=this.view.getInt8(this.pos+t),i=this.decodeBinary(A,t+1);return this.extensionCodec.decode(i,e,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let A=this.view.getUint8(this.pos);return this.pos++,A}readI8(){let A=this.view.getInt8(this.pos);return this.pos++,A}readU16(){let A=this.view.getUint16(this.pos);return this.pos+=2,A}readI16(){let A=this.view.getInt16(this.pos);return this.pos+=2,A}readU32(){let A=this.view.getUint32(this.pos);return this.pos+=4,A}readI32(){let A=this.view.getInt32(this.pos);return this.pos+=4,A}readU64(){let A=pt(this.view,this.pos);return this.pos+=8,A}readI64(){let A=BA(this.view,this.pos);return this.pos+=8,A}readU64AsBigInt(){let A=this.view.getBigUint64(this.pos);return this.pos+=8,A}readI64AsBigInt(){let A=this.view.getBigInt64(this.pos);return this.pos+=8,A}readF32(){let A=this.view.getFloat32(this.pos);return this.pos+=4,A}readF64(){let A=this.view.getFloat64(this.pos);return this.pos+=8,A}};function Er(n,A){return new KA(A).decode(n)}var fA=class n{constructor(A,t,e,i,d){this.mediaIds=A;this.sequenceNumber=t;this.timeStamp=e;this.isEndOfSpurt=i;this.payload=d}static parse(A){let t;try{t=Er(A)}catch{return D("not valid msgpack")}if(!Array.isArray(t))return D("container must be an array");if(t.length<6)return D("missing fields");if(t[0]!==1)return D("unknown type");if(!Array.isArray(t[1]))return D("media ids must be an array");if(!t[1].every(B=>typeof B=="number"))return D("media ids must be numbers");if(typeof t[2]!="number")return D("sequence number must be a number");if(typeof t[3]!="number")return D("timestamp must be a number");if(typeof t[4]!="number")return D("flags must be a number");let e=t[1],i=t[2]>>>0,d=t[3]>>>0,C=(t[4]&1)!==0,v=t[t.length-1];return v instanceof Uint8Array?et(new n(e,i,d,C,v)):D("payload must be bytes")}toBytes(){let A=Number(this.isEndOfSpurt),t=[1,this.mediaIds,this.sequenceNumber>>>0,this.timeStamp>>>0,A,this.payload];return new Uint8Array(pr(t,{forceFloat32:!0,ignoreUndefined:!0}))}};var OA=class{constructor(A,t){this.sampleRate=A;this.wasm=t;this.sequenceNumber=Math.random()*Math.pow(2,32)>>0;this.timestamp=Math.random()*Math.pow(2,32)>>0;this.connections=[];this.monitoring=!1;this.active=!1;this.stats={numberPackets:0,numberTicks:0,numberPacketError:0,numberPacketsMediaNotFound:0};this.encoder=new t.Encoder(A,15,!0,J.VadPreload),this.encoder.complexity=navigator.hardwareConcurrency>=4?6:4,this.information=ct(this.wasm),this.outBuffer=T(this.wasm,"u8",1270),Zj(this.information,1)}setVad(A){this.encoder.set_volume_gate(A.volumeGate!==void 0,A.volumeGate?.attackThreshold??0,A.volumeGate?.releaseThreshold??0),this.encoder.set_speech_detection(A.voiceActivity!==void 0,A.voiceActivity?.attackThreshold??0,A.voiceActivity?.releaseThreshold??0)}setMedias(A){this.connections=A.filter(({mediaIds:t})=>t.length>0)}close(){dt(this.wasm,this.information),tA(this.wasm,this.outBuffer),this.encoder.delete()}encode(A){for(this.encoder.push(A.byteOffset,this.information.values.byteOffset);;){let t=this.encoder.pop(this.connections.length===0?0:this.outBuffer.byteOffset,this.outBuffer.length);if(t===0)break;if(t<0){ot(\`failed encoding packet: \${t}\`);return}if(this.timestamp=this.timestamp+1800>>0,t===1)continue;this.sequenceNumber=this.sequenceNumber+1>>0;let e=this.active&&!this.encoder.active;this.active=this.encoder.active,this.monitoring=this.connections.some(i=>i.id===0);for(let i of this.connections){if(this.monitoring&&i.id!==0)continue;let d=new fA(i.mediaIds,this.sequenceNumber,this.timestamp,e,this.outBuffer.subarray(0,t));aA(globalThis,["sendPacket",{connectionId:i.id,packet:d.toBytes()}])}}}onMessage(A){let[t,e]=A;switch(t){case"captureSetVad":this?.setVad(e);break;case"captureSetMedias":this?.setMedias(e.connections);break;case"close":this.close();break;case"dump":e.result.postMessage(this.dump());break}}dump(){return{sequenceNumber:this.sequenceNumber,timestamp:this.timestamp,connections:this.connections.map(A=>\`\${A.id} => \${A.mediaIds.join(",")}\`),active:this.active,monitoring:this.monitoring,information:{active:Wj(this.information),speechProbability:Qj(this.information),rmsDBFS:zj(this.information),volume:Xj(this.information)},encoder:{sample_rate:this.encoder.sample_rate,fec_packet_loss:this.encoder.fec_packet_loss,voip:this.encoder.voip,vad_preload:this.encoder.vad_preload,complexity:this.encoder.complexity,speech_probability:this.encoder.speech_probability,rms_dbfs:this.encoder.rms_dbfs,active:this.encoder.active,speech_detection_enabled:this.encoder.speech_detection_enabled,speech_detection_going_active:this.encoder.speech_detection_going_active,speech_detection_going_inactive:this.encoder.speech_detection_going_inactive,volume_gate_enabled:this.encoder.volume_gate_enabled,volume_gate_going_active:this.encoder.volume_gate_going_active,volume_gate_going_inactive:this.encoder.volume_gate_going_inactive}}}},PA=class{constructor(A){this.wasm=A;this.medias=new Map;this.stats={numberPackets:0,numberTicks:0,numberPacketError:0,numberPacketsMediaNotFound:0,numberTicksWithAudio:0};this.largestIndex=-1;this.decoders=T(this.wasm,"u32",J.MaxNumberOfDecoders),this.information=kt(this.wasm,J.MaxNumberOfDecoders),Oj(this.information,[1,1])}close(){ut(this.wasm,this.information);for(let{decoder:A}of this.medias.values())A.delete()}receivePacket(A,t){this.stats.numberPackets++;let e=fA.parse(t);if(e.type==="Failure"){this.stats.numberPacketError++;let i=Array.from(t).map(d=>d.toString(16).padStart(2,"0")).join("");console.error(\`failed decoding audio packet; reason: \${e.reason}, connection: \${A}, dump: \${i}\`);return}for(let i of e.value.mediaIds){let d=this.medias.get(xA({connectionId:A,mediaId:i}));if(d===void 0){this.stats.numberPacketsMediaNotFound++;continue}d.lastPacket=t;let q=T(this.wasm,"u8",e.value.payload.length);q.set(e.value.payload),d.decoder.push(e.value.sequenceNumber,e.value.timeStamp,e.value.isEndOfSpurt,q.byteOffset,q.length)}}insertMedia(A,t,e,i=[1,1]){let d=xA({connectionId:t,mediaId:e}),q=new this.wasm.Decoder;this.medias.set(d,{index:A,decoder:q,lastPacket:void 0}),this.decoders[A]=q.$$.ptr,this.largestIndex=Math.max(this.largestIndex,A),Tj(this.information,A,i),Rj(this.information,A,0),Sj(this.information,A,0)}removeMedia(A,t,e){let i=xA({connectionId:t,mediaId:e}),d=this.medias.get(i);if(!(d===void 0||d.index!==A)&&(this.medias.delete(i),wj(this.information,A,0),this.decoders[A]=0,d.decoder.delete(),A===this.largestIndex)){for(A=A-1;A>=0&&this.decoders[A]===0;A--);this.largestIndex=A}}decode(A){return{hasAudio:this.wasm.pop_many(this.decoders.byteOffset,this.information.values.byteOffset,this.largestIndex+1,A.byteOffset)}}onMessage(A){let[t,e]=A;switch(t){case"playbackReceivePacket":this.receivePacket(e.connectionId,e.packet);break;case"playbackUpdateMedias":for(let{index:i,connectionId:d,mediaId:q}of e.removed)this.removeMedia(i,d,q);for(let{index:i,connectionId:d,mediaId:q,volume:C}of e.added)this.insertMedia(i,d,q,C);break;case"close":this.close();break;case"dump":e.result.postMessage(this.dump());break}}dump(){let A=[];for(let[t,e]of this.medias){let i=at(t);A.push({index:e.index,connectionId:i.connectionId,mediaId:i.mediaId,rmsDBFS:Pj(this.information,e.index),volume:Mj(this.information,e.index),voicedBlocks:Vj(this.information,e.index),silentBlocks:Uj(this.information,e.index),time:e.decoder.time,consecutive_silence:e.decoder.consecutive_silence,last_voiced_time_point:e.decoder.last_voiced_time_point,sequence_number:e.decoder.sequence_number,packetsSeen:e.decoder.packets_seen,packetsInvalid:e.decoder.packets_invalid,packetsTooLate:e.decoder.packets_too_late,packetsTooEarly:e.decoder.packets_too_early,packetsRepeated:e.decoder.packets_repeated,packetsProcessed:e.decoder.packets_processed,packetsLost:e.decoder.packets_lost,rewinds:e.decoder.rewinds,cacheLength:e.decoder.cache_length,lastPacket:Yj(e.lastPacket)})}return{largestIndex:this.largestIndex,globalVolume:Kj(this.information),decoders:A}}};var Lt=Fn($t()),Ft=(0,Lt.default)(),vt,gt;globalThis.addEventListener("message",$r);async function $r(n){let A=n.data,[t,e]=A;switch(t){case"captureInit":e.workletPort.onmessage=$r,vt=new Fr(e.sampleRate,await Ft);break;case"playbackInit":e.workletPort.onmessage=$r,gt=new vr(await Ft);break;case"close":globalThis.close();break}vt?.onMessage(A),gt?.onMessage(A)}var Fr=class extends OA{constructor(t,e){super(t,e);this.id=-1;this.samples=fr(this.wasm,t,2+J.VadPreload+J.AdditionalCaptureBlocks,!1),aA(globalThis,["captureReady",{sampleBuffer:this.samples,informationBuffer:this.information}])}close(){super.close(),Cr(this.wasm,this.samples)}onMessage(t){super.onMessage(t);let[e,i]=t;e==="captureTick"&&this.tick(i.id)}tick(t){for(;this.id<t;this.id+=1)this.encode(kr(this.samples,this.id%this.samples.length))}dump(){return{type:"shared capture worker",id:this.id,sampleRate:this.samples.sampleRate,stereo:this.samples.stereo,length:this.samples.length,...super.dump()}}},vr=class extends PA{constructor(A){super(A);let t=2+J.AdditionalPlaybackBlocks;this.sampleBuffer=fr(A,48e3,t,!0),this.sampleBuffer.samples.fill(0),this.prefill=t-2;for(let e=0;e<this.prefill;e++)ur(this.sampleBuffer,e,{id:e});this.id=this.prefill,aA(globalThis,["playbackReady",{sampleBuffer:this.sampleBuffer,informationBuffer:this.information}])}close(){super.close(),Cr(this.wasm,this.sampleBuffer)}onMessage(A){super.onMessage(A);let[t,e]=A;t==="playbackTick"&&this.tick(e.id)}tick(A){for(this.stats.numberTicks++;this.id<A+this.prefill;this.id++){let t=this.id%this.sampleBuffer.length,{hasAudio:e}=this.decode(kr(this.sampleBuffer,t));e&&(this.stats.numberTicksWithAudio++,ur(this.sampleBuffer,t,{id:this.id}))}}dump(){return{type:"shared playback worker",id:this.id,prefill:this.prefill,sampleRate:this.sampleBuffer.sampleRate,stereo:this.sampleBuffer.stereo,...super.dump()}}};})();
3236
- `});var Zx,L0=q(()=>{Zx='"use strict";(()=>{var E=Object.defineProperty;var F=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})};var l={};F(l,{AdditionalCaptureBlocks:()=>D,AdditionalPlaybackBlocks:()=>C,ClockJumpCheckInterval:()=>j,ClockJumpThreshold:()=>$,ConnectInterval:()=>X,ConnectTimeout:()=>Q,DefaultRefreshRate:()=>V,DefaultVideoCodec:()=>ee,HealthCheckTimeout:()=>W,MainConnectionPingInterval:()=>H,MaxNumberOfDecoders:()=>_,MinDBFs:()=>k,MinTokenLifetime:()=>Y,MinTokenRefreshInterval:()=>K,PlaybackPreload:()=>L,RenderQuantumSize:()=>N,VadPreload:()=>O,WebRtcAnswerTimeout:()=>Z,WebRtcIceTimeout:()=>z,WebRtcMaxNegotiationAttempts:()=>q,WebRtcStatsSnapshotInterval:()=>J,WebRtcTimeout:()=>G});var C=3,D=3,L=3,V=250,O=3,_=512,N=128,k=-758.596,W=1e4,j=1e3,$=1e4,H=3e3,J=1e3,z=3e3,G=1e4,Z=1e4,q=3,Q=5e3,Y=6e4,K=5e3,X=[0,100,200,200,500],ee="H264";function p(e,t,r){return e.postMessage(t,r)}function te(e){return e.sampleRate*.02*(e.stereo?2:1)}function f(e,t){let r=te(e),n=r*t,s=n+r;return e.samples.subarray(n,s)}function S(e,t){return{id:e.headers[t]}}function I(e,t,r){e.headers[t]=r.id}var re;(e=>{let t;(r=>(r[r.InvalidPassword=-1]="InvalidPassword",r[r.Unknown=0]="Unknown",r[r.Unencrypted=1]="Unencrypted",r[r.Encrypted=2]="Encrypted"))(t=e.PeerCipherStatus||={})})(re||={});var{Deno:U}=globalThis,ne=typeof U?.noColor=="boolean"?U.noColor:!1,se=!ne;function h(e,t){return{open:`\\x1B[${e.join(";")}m`,close:`\\x1B[${t}m`,regexp:new RegExp(`\\\\x1b\\\\[${t}m`,"g")}}function b(e,t){return se?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function m(e){return b(e,h([0],0))}function T(e){return b(e,h([1],22))}function oe(e){return b(e,h([2],22))}var we=new RegExp(["[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)","(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g"),ae=new Date,d=(e=>(e[e.CRITICAL=0]="CRITICAL",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.DEBUG=4]="DEBUG",e))(d||{}),P={0:"\\u{1F4A5}",1:"\\u{1F534}",2:"\\u{1F7E1}",3:"\\u{1F535}",4:"\\u{1F7E3}"},ie={4:oe,3:m,2:m,1:T,0:T};function ce({message:e}){return String(e)}function B(e){return JSON.stringify({timestamp:e.date.toISOString(),level:d[e.level],message:e.message,extra:e.extra})}function w(e){function t(c,i){return[Math.floor(c/i),c%i]}function r(){let c,i=e.date.valueOf()-ae.valueOf();[i,c]=t(i,1e3);let[M,R]=t(i,60);return`${M.toString().padStart(4,"0")}:${R.toString().padStart(2,"0")}.${c.toString().padStart(3,"0")}`}function n(){return e.extra===void 0?"":typeof Deno=="object"?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let s=P[e.level],a=e.logger.name!==void 0?`@${e.logger.name}`:"";return`${m(r())}${a} ${s} ${ie[e.level](String(e.message))}${n()}`}function le(e){let t=`[${e.date.toISOString()}]`,r=`[${d[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",s=P[e.level];return`${t} ${s} ${r.padEnd(7," ")} ${n}${e.message}`}function ue(){return typeof Deno=="object"&&Deno.stdout.isTerminal()}var A=class{static sparse=ce;static json=B;static pretty=w;static structured=le;static default=ue()?w:B;constructor(){}};var fe=class{formatter;consoleObject;filter;constructor(e=A.default,t=4,r=console){this.filter=t,this.formatter=e,this.consoleObject=r}handle(e){let t=this.formatter(e);switch(e.level){case 0:case 1:this.consoleObject.error(t);break;case 2:this.consoleObject.warn(t);break;case 3:this.consoleObject.info(t);break;case 4:this.consoleObject.debug(t);break}}};var o=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(e,t=void 0,r=[],n=void 0){this.#e=t,this.sinks=r,this.filter=e,this.parent=n}log(e,t,r=void 0){let n={date:new Date,level:e,logger:this,message:t,extra:r};this.filter<e||this.insert(n)}insert(e){if(!(this.filter<e.level)){for(let t of this.sinks)t.filter>=e.level&&t.handle(e);this.parent!==void 0&&this.parent.insert(e)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},u=globalThis[Symbol.for("odin-global-logger")]??=new o(3,void 0,[new fe]),de=o.prototype.log.bind(u,1),pe=o.prototype.log.bind(u,2),me=o.prototype.log.bind(u,3),he=o.prototype.log.bind(u,4),Pe=o.prototype.log.bind(u);var x=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.blocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"init":this.state=new g(s.sampleBuffer,s.workerPort,sampleRate*.02);break;case"close":this.alive=!1;break;case"dump":s.result.postMessage(this.dump());break}}process(r,n,s){if(this.state===void 0||r.length<1||r[0].length<1)return this.alive;let a=this.state.fill(0,r[0][0]);return this.state.offset===this.state.length&&(this.blocks+=1,this.state.flush(),this.state.fill(a,r[0][0])),this.alive}dump(){return{type:"shared capture worklet",alive:this.alive,sampleRate,id:this.state?.id||null,offset:this.state?.offset||null,length:this.state?.length||null,blocks:this.blocks}}},y=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.silenceBlocks=0;this.voiceBlocks=0;this.totalBlocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"close":this.alive=!1;break;case"init":this.state=new v(s.workerPort,s.sampleBuffer,sampleRate*.02);break;case"dump":s.result.postMessage(this.dump());break}n==="close"&&(this.alive=!1)}process(r,n,s){if(this.state===void 0||n.length<1||n[0].length<2)return this.alive;let a=this.state.fill(0,n[0][0],n[0][1]);return a<l.RenderQuantumSize&&(this.totalBlocks+=1,this.state.next(),this.state.hasVoice?this.voiceBlocks+=1:this.silenceBlocks+=1,this.state.fill(a,n[0][0],n[0][1])),this.alive}dump(){return{type:"shared playback worklet",alive:this.alive,sampleRate,id:this.state?.id||null,offset:this.state?.offset||null,length:this.state?.length||null,hasVoice:this.state?.hasVoice??!1,silenceBlocks:this.silenceBlocks,voiceBlocks:this.voiceBlocks,totalBlocks:this.totalBlocks}}},g=class{constructor(t,r,n){this.samples=t;this.port=r;this.length=n;this.id=0,this.offset=0,this.entry=f(this.samples,0)}fill(t,r){let n=Math.min(r.length-t,this.length-this.offset);return this.entry.set(r.subarray(t,t+n),this.offset),this.offset+=n,t+n}flush(){this.id+=1,p(this.port,["captureTick",{id:this.id}]);let t=this.id%this.samples.length;this.entry=f(this.samples,t),I(this.samples,t,{id:this.id}),this.offset=0}},v=class{constructor(t,r,n){this.port=t;this.samples=r;this.length=n;this.id=-1,this.offset=0,this.entry=void 0,this.next()}get hasVoice(){return this.entry!==void 0}fill(t,r,n){let s=Math.min(l.RenderQuantumSize-t,this.length-this.offset);return this.entry!==void 0&&(r.set(this.entry.subarray(this.offset,this.offset+s),t),n.set(this.entry.subarray(this.offset+this.length,this.offset+this.length+s),t)),this.offset+=s,t+s}next(){this.id+=1;let t=this.id%this.samples.length,{id:r}=S(this.samples,t);this.entry=this.id===r?f(this.samples,t):void 0,this.offset=0,p(this.port,["playbackTick",{id:this.id}])}};registerProcessor("OdinCaptureProcessor",x);registerProcessor("OdinPlaybackProcessor",y);})();\n'});var H0={};Vx(H0,{createCaptureWorker:()=>EF,createPlaybackWorker:()=>fF});import{Strand as vF}from"@4players/odin-common";function EF(v,D,e,j,B=i.DefaultRefreshRate){return CF.enqueue(async()=>{let[C,E]=await Y(Xx,Zx,v,"OdinCaptureProcessor",{channelCount:1,numberOfInputs:1,numberOfOutputs:0});return x0.create(v,D,e,C,E,j)})}async function fF(v,D=i.DefaultRefreshRate){if(v.sampleRate!==48e3)throw new Error("playback sample rate must be 48kHz ");let[e,j]=await Y(Xx,Zx,v,"OdinPlaybackProcessor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2]});return Yx.create(v,e,j)}var CF,Yx,x0,N0=q(()=>{"use strict";u();sx();_0();L0();CF=new vF;Yx=class v extends z{constructor(e,j,B,C){super(e,j,B);this.information=C}static async create(e,j,B){let{port1:C,port2:E}=new MessageChannel;c(j,["playbackInit",{workletPort:C}],[C]);let{informationBuffer:f,sampleBuffer:s}=await U(j,"playbackReady");return Qx(f,[1,1]),c(B.port,["init",{sampleBuffer:s,workerPort:E}],[E]),new v(e,B,j,f)}getActivity(e){let j=this.medias.get(m(e));if(j===void 0)return;let B=b0(this.information,j.index);return B===0?_:{isSilent:!1,rmsDBFS:B}}getJitterStats(e){}setGlobalVolume(e){Qx(this.information,e)}setVolume(e,j){let B=this.medias.get(m(e));B!==void 0&&o0(this.information,B.index,j)}_GetFreeIndex(){let e=super._GetFreeIndex();if(e!==void 0)return e;if(this.information.length>this.medias.size)return this.medias.size}},x0=class v extends X{constructor(e,j,B,C,E,f){super(e,j,B,C,f);this.information=E}static async create(e,j,B,C,E,f){let{port1:s,port2:b}=new MessageChannel;c(C,["captureInit",{sampleRate:e.sampleRate,workletPort:s}],[s]);let{sampleBuffer:d,informationBuffer:h}=await U(C,"captureReady");return c(E.port,["init",{workerPort:b,sampleBuffer:d}],[b]),new v(E,C,j,B,h,f)}get activity(){return{isSilent:!a0(this.information),rmsDBFS:u0(this.information)}}get speechProbability(){return l0(this.information)}setVolume(e){k0(this.information,e)}}});var A0,w0=q(()=>{A0=`"use strict";(()=>{var oe=Object.create;var WA=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var de=(n,A)=>()=>(A||n((A={exports:{}}).exports,A),A.exports),qe=(n,A)=>{for(var t in A)WA(n,t,{get:A[t],enumerable:!0})},fe=(n,A,t,e)=>{if(A&&typeof A=="object"||typeof A=="function")for(let l of ke(A))!ce.call(n,l)&&l!==t&&WA(n,l,{get:()=>A[l],enumerable:!(e=ae(A,l))||e.enumerable});return n};var Ce=(n,A,t)=>(t=n!=null?oe(ue(n)):{},fe(A||!n||!n.__esModule?WA(t,"default",{value:n,enumerable:!0}):t,n));var Hj=de((Lj,JA)=>{"use strict";var er=(()=>{var n=globalThis.document?.currentScript?.src;return async function(A={}){var t,e=A,l=!!globalThis.window,d=!!globalThis.WorkerGlobalScope,q=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer",p=[],F="./this.program";d&&(n=self.location.href);var D="",KA,O;if(l||d){try{D=new URL(".",n).href}catch{}d&&(O=j=>{var r=new XMLHttpRequest;return r.open("GET",j,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),KA=async j=>{var r=await fetch(j,{credentials:"same-origin"});if(r.ok)return r.arrayBuffer();throw new Error(r.status+" : "+r.url)}}var ir=console.log.bind(console),oA=console.error.bind(console),or,ar=!1;function Nj(j){for(var r=0,s=j.length,i=new Uint8Array(s),o;r<s;++r)o=j.charCodeAt(r),i[r]=~o>>8&o;return i}var kr,ur,cr=!1;function Bj(){var j=Ur.buffer;U=new Int8Array(j),aA=new Int16Array(j),e.HEAPU8=_=new Uint8Array(j),Z=new Uint16Array(j),e.HEAP32=kA=new Int32Array(j),e.HEAPU32=m=new Uint32Array(j),e.HEAPF32=fr=new Float32Array(j),Cr=new Float64Array(j),qr=new BigInt64Array(j),Gr=new BigUint64Array(j)}function bj(){if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)Sj(e.preRun.shift());pr(hr)}function Jj(){cr=!0,rA.v()}function Kj(){if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;)Vj(e.postRun.shift());pr(Ir)}function OA(j){e.onAbort?.(j),j="Aborted("+j+")",oA(j),ar=!0,j+=". Build with -sASSERTIONS for more info.";var r=new WebAssembly.RuntimeError(j);throw ur?.(r),r}var dr;function Oj(){return Nj(\`\\0asm\\0\\0\\0\\x8D9\\\`\\x7F\\x7F\\\`\\x7F\\0\\\`\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\0\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`||\\\`\\x7F}\\\`}}\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\b\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F~\\x7F~\\\`\\x7F\\x7F}\\\`\\x7F}}\\\`\\x7F\\x7F}}\\0\\\`
3236
+ `});var Qx,I0=q(()=>{Qx='"use strict";(()=>{var E=Object.defineProperty;var F=(e,t)=>{for(var r in t)E(e,r,{get:t[r],enumerable:!0})};var l={};F(l,{AdditionalCaptureBlocks:()=>D,AdditionalPlaybackBlocks:()=>C,ClockJumpCheckInterval:()=>j,ClockJumpThreshold:()=>$,ConnectInterval:()=>X,ConnectTimeout:()=>Q,DefaultRefreshRate:()=>V,DefaultVideoCodec:()=>ee,HealthCheckTimeout:()=>W,MainConnectionPingInterval:()=>H,MaxNumberOfDecoders:()=>_,MinDBFs:()=>k,MinTokenLifetime:()=>Y,MinTokenRefreshInterval:()=>K,PlaybackPreload:()=>L,RenderQuantumSize:()=>N,VadPreload:()=>O,WebRtcAnswerTimeout:()=>Z,WebRtcIceTimeout:()=>z,WebRtcMaxNegotiationAttempts:()=>q,WebRtcStatsSnapshotInterval:()=>J,WebRtcTimeout:()=>G});var C=3,D=3,L=3,V=250,O=3,_=512,N=128,k=-758.596,W=1e4,j=1e3,$=1e4,H=3e3,J=1e3,z=3e3,G=1e4,Z=1e4,q=3,Q=5e3,Y=6e4,K=5e3,X=[0,100,200,200,500],ee="H264";function p(e,t,r){return e.postMessage(t,r)}function te(e){return e.sampleRate*.02*(e.stereo?2:1)}function f(e,t){let r=te(e),n=r*t,s=n+r;return e.samples.subarray(n,s)}function S(e,t){return{id:e.headers[t]}}function I(e,t,r){e.headers[t]=r.id}var re;(e=>{let t;(r=>(r[r.InvalidPassword=-1]="InvalidPassword",r[r.Unknown=0]="Unknown",r[r.Unencrypted=1]="Unencrypted",r[r.Encrypted=2]="Encrypted"))(t=e.PeerCipherStatus||={})})(re||={});var{Deno:U}=globalThis,ne=typeof U?.noColor=="boolean"?U.noColor:!1,se=!ne;function h(e,t){return{open:`\\x1B[${e.join(";")}m`,close:`\\x1B[${t}m`,regexp:new RegExp(`\\\\x1b\\\\[${t}m`,"g")}}function b(e,t){return se?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function m(e){return b(e,h([0],0))}function T(e){return b(e,h([1],22))}function oe(e){return b(e,h([2],22))}var we=new RegExp(["[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)","(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g"),ae=new Date,d=(e=>(e[e.CRITICAL=0]="CRITICAL",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.DEBUG=4]="DEBUG",e))(d||{}),P={0:"\\u{1F4A5}",1:"\\u{1F534}",2:"\\u{1F7E1}",3:"\\u{1F535}",4:"\\u{1F7E3}"},ie={4:oe,3:m,2:m,1:T,0:T};function ce({message:e}){return String(e)}function B(e){return JSON.stringify({timestamp:e.date.toISOString(),level:d[e.level],message:e.message,extra:e.extra})}function w(e){function t(c,i){return[Math.floor(c/i),c%i]}function r(){let c,i=e.date.valueOf()-ae.valueOf();[i,c]=t(i,1e3);let[M,R]=t(i,60);return`${M.toString().padStart(4,"0")}:${R.toString().padStart(2,"0")}.${c.toString().padStart(3,"0")}`}function n(){return e.extra===void 0?"":typeof Deno=="object"?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let s=P[e.level],a=e.logger.name!==void 0?`@${e.logger.name}`:"";return`${m(r())}${a} ${s} ${ie[e.level](String(e.message))}${n()}`}function le(e){let t=`[${e.date.toISOString()}]`,r=`[${d[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",s=P[e.level];return`${t} ${s} ${r.padEnd(7," ")} ${n}${e.message}`}function ue(){return typeof Deno=="object"&&Deno.stdout.isTerminal()}var A=class{static sparse=ce;static json=B;static pretty=w;static structured=le;static default=ue()?w:B;constructor(){}};var fe=class{formatter;consoleObject;filter;constructor(e=A.default,t=4,r=console){this.filter=t,this.formatter=e,this.consoleObject=r}handle(e){let t=this.formatter(e);switch(e.level){case 0:case 1:this.consoleObject.error(t);break;case 2:this.consoleObject.warn(t);break;case 3:this.consoleObject.info(t);break;case 4:this.consoleObject.debug(t);break}}};var o=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(e,t=void 0,r=[],n=void 0){this.#e=t,this.sinks=r,this.filter=e,this.parent=n}log(e,t,r=void 0){let n={date:new Date,level:e,logger:this,message:t,extra:r};this.filter<e||this.insert(n)}insert(e){if(!(this.filter<e.level)){for(let t of this.sinks)t.filter>=e.level&&t.handle(e);this.parent!==void 0&&this.parent.insert(e)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},u=globalThis[Symbol.for("odin-global-logger")]??=new o(3,void 0,[new fe]),de=o.prototype.log.bind(u,1),pe=o.prototype.log.bind(u,2),me=o.prototype.log.bind(u,3),he=o.prototype.log.bind(u,4),Pe=o.prototype.log.bind(u);var x=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.blocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"init":this.state=new g(s.sampleBuffer,s.workerPort,sampleRate*.02);break;case"close":this.alive=!1;break;case"dump":s.result.postMessage(this.dump());break}}process(r,n,s){if(this.state===void 0||r.length<1||r[0].length<1)return this.alive;let a=this.state.fill(0,r[0][0]);return this.state.offset===this.state.length&&(this.blocks+=1,this.state.flush(),this.state.fill(a,r[0][0])),this.alive}dump(){return{type:"shared capture worklet",alive:this.alive,sampleRate,id:this.state?.id||null,offset:this.state?.offset||null,length:this.state?.length||null,blocks:this.blocks}}},y=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.silenceBlocks=0;this.voiceBlocks=0;this.totalBlocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"close":this.alive=!1;break;case"init":this.state=new v(s.workerPort,s.sampleBuffer,sampleRate*.02);break;case"dump":s.result.postMessage(this.dump());break}n==="close"&&(this.alive=!1)}process(r,n,s){if(this.state===void 0||n.length<1||n[0].length<2)return this.alive;let a=this.state.fill(0,n[0][0],n[0][1]);return a<l.RenderQuantumSize&&(this.totalBlocks+=1,this.state.next(),this.state.hasVoice?this.voiceBlocks+=1:this.silenceBlocks+=1,this.state.fill(a,n[0][0],n[0][1])),this.alive}dump(){return{type:"shared playback worklet",alive:this.alive,sampleRate,id:this.state?.id||null,offset:this.state?.offset||null,length:this.state?.length||null,hasVoice:this.state?.hasVoice??!1,silenceBlocks:this.silenceBlocks,voiceBlocks:this.voiceBlocks,totalBlocks:this.totalBlocks}}},g=class{constructor(t,r,n){this.samples=t;this.port=r;this.length=n;this.id=0,this.offset=0,this.entry=f(this.samples,0)}fill(t,r){let n=Math.min(r.length-t,this.length-this.offset);return this.entry.set(r.subarray(t,t+n),this.offset),this.offset+=n,t+n}flush(){this.id+=1,p(this.port,["captureTick",{id:this.id}]);let t=this.id%this.samples.length;this.entry=f(this.samples,t),I(this.samples,t,{id:this.id}),this.offset=0}},v=class{constructor(t,r,n){this.port=t;this.samples=r;this.length=n;this.id=-1,this.offset=0,this.entry=void 0,this.next()}get hasVoice(){return this.entry!==void 0}fill(t,r,n){let s=Math.min(l.RenderQuantumSize-t,this.length-this.offset);return this.entry!==void 0&&(r.set(this.entry.subarray(this.offset,this.offset+s),t),n.set(this.entry.subarray(this.offset+this.length,this.offset+this.length+s),t)),this.offset+=s,t+s}next(){this.id+=1;let t=this.id%this.samples.length,{id:r}=S(this.samples,t);this.entry=this.id===r?f(this.samples,t):void 0,this.offset=0,p(this.port,["playbackTick",{id:this.id}])}};registerProcessor("OdinCaptureProcessor",x);registerProcessor("OdinPlaybackProcessor",y);})();\n'});var g0={};Tx(g0,{createCaptureWorker:()=>rF,createPlaybackWorker:()=>tF});import{Strand as AF}from"@4players/odin-common";function rF(v,D,j,e,B=i.DefaultRefreshRate){return FF.enqueue(async()=>{let[C,E]=await Y(Wx,Qx,v,"OdinCaptureProcessor",{channelCount:1,numberOfInputs:1,numberOfOutputs:0});return Xx.create(v,D,j,C,E,e)})}async function tF(v,D=i.DefaultRefreshRate){if(v.sampleRate!==48e3)throw new Error("playback sample rate must be 48kHz ");let[j,e]=await Y(Wx,Qx,v,"OdinPlaybackProcessor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2]});return zx.create(v,j,e)}var FF,zx,Xx,$0=q(()=>{"use strict";u();nx();G0();I0();FF=new AF;zx=class v extends z{constructor(j,e,B,C){super(j,e,B);this.information=C}static async create(j,e,B){let{port1:C,port2:E}=new MessageChannel;c(e,["playbackInit",{workletPort:C}],[C]);let{informationBuffer:f,sampleBuffer:s}=await U(e,"playbackReady");return Vx(f,[1,1]),c(B.port,["init",{sampleBuffer:s,workerPort:E}],[E]),new v(j,B,e,f)}getActivity(j){let e=this.medias.get(m(j));if(e===void 0)return;let B=E0(this.information,e.index);return B===0?_:{isSilent:!1,rmsDBFS:B}}getJitterStats(j){}setGlobalVolume(j){Vx(this.information,j)}setVolume(j,e){let B=this.medias.get(m(j));B!==void 0&&f0(this.information,B.index,e)}_GetFreeIndex(){let j=super._GetFreeIndex();if(j!==void 0)return j;if(this.information.length>this.medias.size)return this.medias.size}},Xx=class v extends X{constructor(j,e,B,C,E,f){super(j,e,B,C,f);this.information=E}static async create(j,e,B,C,E,f){let{port1:s,port2:b}=new MessageChannel;c(C,["captureInit",{sampleRate:j.sampleRate,workletPort:s}],[s]);let{sampleBuffer:d,informationBuffer:h}=await U(C,"captureReady");return c(E.port,["init",{workerPort:b,sampleBuffer:d}],[b]),new v(E,C,e,B,h,f)}get activity(){return{isSilent:!n0(this.information),rmsDBFS:i0(this.information)}}get speechProbability(){return s0(this.information)}setVolume(j){b0(this.information,j)}}});var Zx,y0=q(()=>{Zx=`"use strict";(()=>{var oe=Object.create;var WA=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var ue=Object.getPrototypeOf,ce=Object.prototype.hasOwnProperty;var de=(n,A)=>()=>(A||n((A={exports:{}}).exports,A),A.exports),qe=(n,A)=>{for(var t in A)WA(n,t,{get:A[t],enumerable:!0})},fe=(n,A,t,e)=>{if(A&&typeof A=="object"||typeof A=="function")for(let l of ke(A))!ce.call(n,l)&&l!==t&&WA(n,l,{get:()=>A[l],enumerable:!(e=ae(A,l))||e.enumerable});return n};var Ce=(n,A,t)=>(t=n!=null?oe(ue(n)):{},fe(A||!n||!n.__esModule?WA(t,"default",{value:n,enumerable:!0}):t,n));var Hj=de((Lj,JA)=>{"use strict";var er=(()=>{var n=globalThis.document?.currentScript?.src;return async function(A={}){var t,e=A,l=!!globalThis.window,d=!!globalThis.WorkerGlobalScope,q=globalThis.process?.versions?.node&&globalThis.process?.type!="renderer",p=[],F="./this.program";d&&(n=self.location.href);var D="",KA,O;if(l||d){try{D=new URL(".",n).href}catch{}d&&(O=j=>{var r=new XMLHttpRequest;return r.open("GET",j,!1),r.responseType="arraybuffer",r.send(null),new Uint8Array(r.response)}),KA=async j=>{var r=await fetch(j,{credentials:"same-origin"});if(r.ok)return r.arrayBuffer();throw new Error(r.status+" : "+r.url)}}var ir=console.log.bind(console),oA=console.error.bind(console),or,ar=!1;function Nj(j){for(var r=0,s=j.length,i=new Uint8Array(s),o;r<s;++r)o=j.charCodeAt(r),i[r]=~o>>8&o;return i}var kr,ur,cr=!1;function Bj(){var j=Ur.buffer;U=new Int8Array(j),aA=new Int16Array(j),e.HEAPU8=_=new Uint8Array(j),Z=new Uint16Array(j),e.HEAP32=kA=new Int32Array(j),e.HEAPU32=m=new Uint32Array(j),e.HEAPF32=fr=new Float32Array(j),Cr=new Float64Array(j),qr=new BigInt64Array(j),Gr=new BigUint64Array(j)}function bj(){if(e.preRun)for(typeof e.preRun=="function"&&(e.preRun=[e.preRun]);e.preRun.length;)Sj(e.preRun.shift());pr(hr)}function Jj(){cr=!0,rA.v()}function Kj(){if(e.postRun)for(typeof e.postRun=="function"&&(e.postRun=[e.postRun]);e.postRun.length;)Vj(e.postRun.shift());pr(Ir)}function OA(j){e.onAbort?.(j),j="Aborted("+j+")",oA(j),ar=!0,j+=". Build with -sASSERTIONS for more info.";var r=new WebAssembly.RuntimeError(j);throw ur?.(r),r}var dr;function Oj(){return Nj(\`\\0asm\\0\\0\\0\\x8D9\\\`\\x7F\\x7F\\\`\\x7F\\0\\\`\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\0\\0\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`||\\\`\\x7F}\\\`}}\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\b\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F~\\x7F~\\\`\\x7F\\x7F}\\\`\\x7F}}\\\`\\x7F\\x7F}}\\0\\\`
3237
3237
  \\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`|}\\\`|\\x7F|\\\`\\x7F\\x7F}\\0\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\` \\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\f\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\b\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F|\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F|}\\\`\\0\\x7F\\\`\\x7F\\x7F\\x7F~~\\0\\\`\\r\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F~\\x7F\\x7F\\x7F\\\`\\x7F\\x7F|\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\x7F\\x7F\\x7F\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F}}\\x7F\\x7F\\x7F\\x7F\\0\\\`~\\x7F\\x7F\\\` \\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\x7F\\x7F\\\`||\\x7F|\\\`|||\\\`\\x7F\\x7F\\x7F|\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\v\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x07\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\\`\\f\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`}\\x7F\\x7F\\\`|\\x7F\\x7F\\\`\\x7F\\x7F\\x7F}\\\`\\x7F}\\x7F\\0\\\`\\x7F\\x7F}\\x7F\\x7F\\x7F}\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F}\\x7F\\x7F\\\`\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\x7F\\0\\\`\\x7F\\x7F\\x7F}}\\0yaa\\0ab\\0ac\\0ad\\0ae\\0af\\0!ag\\0ah\\0 ai\\0aj\\0\\bak\\0"al\\0am\\0an\\0ao\\0\\0ap\\0#aq\\0\\0ar\\0
3238
3238
  as\\0at\\0\\xBB\\xB9\\0\\0\\f$\\f\\x07\\0\\f\\x07\\f\\x07\\0%& \\0
3239
3239
  \\0\\x07\\v\\0'\\0\\0(\\0\\f\\0)*+\\x07\\v\\x07\\0
@@ -6433,4 +6433,4 @@ K\\xE08\\xDF\\0}\\xBC\\x8A\\x1B\\f\\xE5\\xFF\\xCF\\xE8?\\x9F\\xFFFq\\0\\x88\\xB
6433
6433
  return ret;
6434
6434
  \`),f+=\`}
6435
6435
  \`,new Function(h,f)}function UA(j,r,s,i,o,a){var k=r.length;k<2&&G("argTypes array size mismatch! Must at least get return value and 'this' types!");for(var u=r[1]!==null&&s!==null,c=Br(r),f=!r[0].isVoid,C=r[0],h=r[1],E=[j,G,i,o,Nr,C.fromWireType.bind(C),h?.toWireType.bind(h)],I=2;I<k;++I){var $=r[I];E.push($.toWireType.bind($))}if(!c)for(var I=u?1:2;I<r.length;++I)r[I].destructorFunction!==null&&E.push(r[I].destructorFunction);var J=mt(r,u,f,a)(...E);return gr(j,J)}var Et=(j,r,s,i,o,a)=>{var k=TA(r,s);o=B(i,o),P([],[j],u=>{u=u[0];var c=\`constructor \${u.name}\`;if(u.registeredClass.constructor_body===void 0&&(u.registeredClass.constructor_body=[]),u.registeredClass.constructor_body[r-1]!==void 0)throw new Y(\`Cannot register multiple constructors with identical number of parameters (\${r-1}) for class '\${u.name}'! Overload resolution is currently only performed using the parameter count, not actual type info!\`);return u.registeredClass.constructor_body[r-1]=()=>{z(\`Cannot construct \${u.name} due to unbound types\`,k)},P([],k,f=>(f.splice(1,0,null),u.registeredClass.constructor_body[r-1]=UA(c,f,null,o,a),[])),[]})},br=j=>{j=j.trim();let r=j.indexOf("(");return r===-1?j:j.slice(0,r)},$t=(j,r,s,i,o,a,k,u,c,f)=>{var C=TA(s,i);r=v(r),r=br(r),a=B(o,a,c),P([],[j],h=>{h=h[0];var E=\`\${h.name}.\${r}\`;r.startsWith("@@")&&(r=Symbol[r.substring(2)]),u&&h.registeredClass.pureVirtualFunctions.push(r);function I(){z(\`Cannot call \${E} due to unbound types\`,C)}var $=h.registeredClass.instancePrototype,H=$[r];return H===void 0||H.overloadTable===void 0&&H.className!==h.name&&H.argCount===s-2?(I.argCount=s-2,I.className=h.name,$[r]=I):(Hr($,r,E),$[r].overloadTable[s-2]=I),P([],C,J=>{var y=UA(E,J,h,a,k,c);return $[r].overloadTable===void 0?(y.argCount=s-2,$[r]=y):$[r].overloadTable[s-2]=y,[]}),[]})},Jr=(j,r,s)=>(j instanceof Object||G(\`\${s} with invalid "this": \${j}\`),j instanceof r.registeredClass.constructor||G(\`\${s} incompatible with "this" of type \${j.constructor.name}\`),j.$$.ptr||G(\`cannot call emscripten binding method \${s} on deleted object\`),qA(j.$$.ptr,j.$$.ptrType.registeredClass,r.registeredClass)),Ft=(j,r,s,i,o,a,k,u,c,f)=>{r=v(r),o=B(i,o),P([],[j],C=>{C=C[0];var h=\`\${C.name}.\${r}\`,E={get(){z(\`Cannot access \${h} due to unbound types\`,[s,k])},enumerable:!0,configurable:!0};return c?E.set=()=>z(\`Cannot access \${h} due to unbound types\`,[s,k]):E.set=I=>G(h+" is a read-only property"),Object.defineProperty(C.registeredClass.instancePrototype,r,E),P([],c?[s,k]:[s],I=>{var $=I[0],H={get(){var y=Jr(this,C,h+" getter");return $.fromWireType(o(a,y))},enumerable:!0};if(c){c=B(u,c);var J=I[1];H.set=function(y){var jA=Jr(this,C,h+" setter"),L=[];c(f,jA,J.toWireType(L,y)),Nr(L)}}return Object.defineProperty(C.registeredClass.instancePrototype,r,H),[]}),[]})},Kr=[],X=[0,1,,1,null,1,!0,1,!1,1],vt=j=>{j>9&&--X[j+1]===0&&(X[j]=void 0,Kr.push(j))},VA={toValue:j=>(j||G(\`Cannot use deleted val. handle = \${j}\`),X[j]),toHandle:j=>{switch(j){case void 0:return 2;case null:return 4;case!0:return 6;case!1:return 8;default:{let r=Kr.pop()||X.length;return X[r]=j,X[r+1]=1,r}}}},gt={name:"emscripten::val",fromWireType:j=>{var r=VA.toValue(j);return vt(j),r},toWireType:(j,r)=>VA.toHandle(r),readValueFromPointer:fA,destructorFunction:null},Lt=j=>N(j,gt),Ht=(j,r)=>{switch(r){case 4:return function(s){return this.fromWireType(fr[s>>2])};case 8:return function(s){return this.fromWireType(Cr[s>>3])};default:throw new TypeError(\`invalid float width (\${r}): \${j}\`)}},yt=(j,r,s)=>{r=v(r),N(j,{name:r,fromWireType:i=>i,toWireType:(i,o)=>o,readValueFromPointer:Ht(r,s),destructorFunction:null})},_t=(j,r,s,i,o,a,k,u)=>{var c=TA(r,s);j=v(j),j=br(j),o=B(i,o,k),yr(j,function(){z(\`Cannot call \${j} due to unbound types\`,c)},r-1),P([],c,f=>{var C=[f[0],null].concat(f.slice(1));return xr(j,UA(j,C,null,o,a,k),r-1),[]})},xt=(j,r,s,i,o)=>{r=v(r);let a=i===0,k=c=>c;if(a){var u=32-8*s;k=c=>c<<u>>>u,o=k(o)}N(j,{name:r,fromWireType:k,toWireType:(c,f)=>f,readValueFromPointer:Er(r,s,i!==0),destructorFunction:null})},Dt=(j,r,s)=>{var i=[Int8Array,Uint8Array,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array,BigInt64Array,BigUint64Array],o=i[r];function a(k){var u=m[k>>2],c=m[k+4>>2];return new o(U.buffer,c,u)}s=v(s),N(j,{name:s,fromWireType:a,readValueFromPointer:a},{ignoreDuplicateRegistrations:!0})},Nt=(j,r,s,i)=>{if(!(i>0))return 0;for(var o=s,a=s+i-1,k=0;k<j.length;++k){var u=j.codePointAt(k);if(u<=127){if(s>=a)break;r[s++]=u}else if(u<=2047){if(s+1>=a)break;r[s++]=192|u>>6,r[s++]=128|u&63}else if(u<=65535){if(s+2>=a)break;r[s++]=224|u>>12,r[s++]=128|u>>6&63,r[s++]=128|u&63}else{if(s+3>=a)break;r[s++]=240|u>>18,r[s++]=128|u>>12&63,r[s++]=128|u>>6&63,r[s++]=128|u&63,k++}}return r[s]=0,s-o},Bt=(j,r,s)=>Nt(j,_,r,s),bt=j=>{for(var r=0,s=0;s<j.length;++s){var i=j.charCodeAt(s);i<=127?r++:i<=2047?r+=2:i>=55296&&i<=57343?(r+=4,++s):r+=3}return r},Or=globalThis.TextDecoder&&new TextDecoder,Pr=(j,r,s,i)=>{var o=r+s;if(i)return o;for(;j[r]&&!(r>=o);)++r;return r},wr=(j,r=0,s,i)=>{var o=Pr(j,r,s,i);if(o-r>16&&j.buffer&&Or)return Or.decode(j.subarray(r,o));for(var a="";r<o;){var k=j[r++];if(!(k&128)){a+=String.fromCharCode(k);continue}var u=j[r++]&63;if((k&224)==192){a+=String.fromCharCode((k&31)<<6|u);continue}var c=j[r++]&63;if((k&240)==224?k=(k&15)<<12|u<<6|c:k=(k&7)<<18|u<<12|c<<6|j[r++]&63,k<65536)a+=String.fromCharCode(k);else{var f=k-65536;a+=String.fromCharCode(55296|f>>10,56320|f&1023)}}return a},Jt=(j,r,s)=>j?wr(_,j,r,s):"",Kt=(j,r)=>{r=v(r);var s=!0;N(j,{name:r,fromWireType(i){var o=m[i>>2],a=i+4,k;if(s)k=Jt(a,o,!0);else{k="";for(var u=0;u<o;++u)k+=String.fromCharCode(_[a+u])}return b(i),k},toWireType(i,o){o instanceof ArrayBuffer&&(o=new Uint8Array(o));var a,k=typeof o=="string";k||ArrayBuffer.isView(o)&&o.BYTES_PER_ELEMENT==1||G("Cannot pass non-string to std::string"),s&&k?a=bt(o):a=o.length;var u=SA(4+a+1),c=u+4;if(m[u>>2]=a,k)if(s)Bt(o,c,a+1);else for(var f=0;f<a;++f){var C=o.charCodeAt(f);C>255&&(b(u),G("String has UTF-16 code units that do not fit in 8 bits")),_[c+f]=C}else _.set(o,c);return i!==null&&i.push(b,u),u},readValueFromPointer:fA,destructorFunction(i){b(i)}})},Mr=globalThis.TextDecoder?new TextDecoder("utf-16le"):void 0,Ot=(j,r,s)=>{var i=j>>1,o=Pr(Z,i,r/2,s);if(o-i>16&&Mr)return Mr.decode(Z.subarray(i,o));for(var a="",k=i;k<o;++k){var u=Z[k];a+=String.fromCharCode(u)}return a},Pt=(j,r,s)=>{if(s??=2147483647,s<2)return 0;s-=2;for(var i=r,o=s<j.length*2?s/2:j.length,a=0;a<o;++a){var k=j.charCodeAt(a);aA[r>>1]=k,r+=2}return aA[r>>1]=0,r-i},wt=j=>j.length*2,Mt=(j,r,s)=>{for(var i="",o=j>>2,a=0;!(a>=r/4);a++){var k=m[o+a];if(!k&&!s)break;i+=String.fromCodePoint(k)}return i},Tt=(j,r,s)=>{if(s??=2147483647,s<4)return 0;for(var i=r,o=i+s-4,a=0;a<j.length;++a){var k=j.codePointAt(a);if(k>65535&&a++,kA[r>>2]=k,r+=4,r+4>o)break}return kA[r>>2]=0,r-i},Ut=j=>{for(var r=0,s=0;s<j.length;++s){var i=j.codePointAt(s);i>65535&&s++,r+=4}return r},Vt=(j,r,s)=>{s=v(s);var i,o,a;r===2?(i=Ot,o=Pt,a=wt):(i=Mt,o=Tt,a=Ut),N(j,{name:s,fromWireType:k=>{var u=m[k>>2],c=i(k+4,u*r,!0);return b(k),c},toWireType:(k,u)=>{typeof u!="string"&&G(\`Cannot pass non-string to C++ string type \${s}\`);var c=a(u),f=SA(4+c+r);return m[f>>2]=c/r,o(u,f+4,c+r),k!==null&&k.push(b,f),f},readValueFromPointer:fA,destructorFunction(k){b(k)}})},St=(j,r)=>{r=v(r),N(j,{isVoid:!0,name:r,fromWireType:()=>{},toWireType:(s,i)=>{}})},Rt=j=>{OA("OOM")},Wt=j=>{var r=_.length;j>>>=0,Rt(j)},Qt=j=>52,zt=9007199254740992,Xt=-9007199254740992,Zt=j=>j<Xt||j>zt?NaN:Number(j);function Yt(j,r,s,i){return r=Zt(r),70}var Ae=[null,[],[]],re=(j,r)=>{var s=Ae[j];r===0||r===10?((j===1?ir:oA)(wr(s)),s.length=0):s.push(r)},je=(j,r,s,i)=>{for(var o=0,a=0;a<s;a++){var k=m[r>>2],u=m[r+4>>2];r+=8;for(var c=0;c<u;c++)re(j,_[k+c]);o+=u}return m[i>>2]=o,0};if(et(),Ct(),e.noExitRuntime&&(Rj=e.noExitRuntime),e.print&&(ir=e.print),e.printErr&&(oA=e.printErr),e.wasmBinary&&(or=e.wasmBinary),e.arguments&&(p=e.arguments),e.thisProgram&&(F=e.thisProgram),e.preInit)for(typeof e.preInit=="function"&&(e.preInit=[e.preInit]);e.preInit.length>0;)e.preInit.shift()();var Tr,SA,b,te,ee,Ur,Vr;function ne(j){Tr=j.w,SA=e._malloc=j.y,b=e._free=j.z,te=Ur=j.u,ee=Vr=j.x}var se={g:zj,r:Xj,f:Yj,l:At,k:ht,j:Et,d:$t,a:Ft,s:Lt,i:yt,n:_t,c:xt,b:Dt,t:Kt,e:Vt,m:St,o:Wt,q:Qt,p:Yt,h:je};function le(){bj();function j(){e.calledRun=!0,!ar&&(Jj(),kr?.(e),e.onRuntimeInitialized?.(),Kj())}e.setStatus?(e.setStatus("Running..."),setTimeout(()=>{setTimeout(()=>e.setStatus(""),1),j()},1)):j()}var rA;return rA=await Uj(),le(),cr?t=e:t=new Promise((j,r)=>{kr=j,ur=r}),t}})();typeof Lj=="object"&&typeof JA=="object"?(JA.exports=er,JA.exports.default=er):typeof define=="function"&&define.amd&&define([],()=>er)});var w={};qe(w,{AdditionalCaptureBlocks:()=>pe,AdditionalPlaybackBlocks:()=>Ge,ClockJumpCheckInterval:()=>ve,ClockJumpThreshold:()=>ge,ConnectInterval:()=>Je,ConnectTimeout:()=>Ne,DefaultRefreshRate:()=>he,DefaultVideoCodec:()=>Ke,HealthCheckTimeout:()=>Fe,MainConnectionPingInterval:()=>Le,MaxNumberOfDecoders:()=>Ee,MinDBFs:()=>Qr,MinTokenLifetime:()=>Be,MinTokenRefreshInterval:()=>be,PlaybackPreload:()=>Ie,RenderQuantumSize:()=>$e,VadPreload:()=>me,WebRtcAnswerTimeout:()=>xe,WebRtcIceTimeout:()=>ye,WebRtcMaxNegotiationAttempts:()=>De,WebRtcStatsSnapshotInterval:()=>He,WebRtcTimeout:()=>_e});var Ge=3,pe=3,Ie=3,he=250,me=3,Ee=512,$e=128,Qr=-758.596,Fe=1e4,ve=1e3,ge=1e4,Le=3e3,He=1e3,ye=3e3,_e=1e4,xe=1e4,De=3,Ne=5e3,Be=6e4,be=5e3,Je=[0,100,200,200,500],Ke="H264";function M(n,A,t){return n.postMessage(A,t)}function zr(n){return[n.values[0],n.values[1]]}function IA(n,A){n.values[0]=A[0],n.values[1]=A[1]}function hA(n,A){return n.values[2+A*5]}function Xr(n,A,t){n.values[2+A*5]=t}function Zr(n,A){let t=2+A*5+1;return[n.values[t+0],n.values[t+1]]}function mA(n,A,t){let e=2+A*5+1;n.values[e+0]=t[0],n.values[e+1]=t[1]}function Yr(n,A){return n.values[2+A*5+3]}function Aj(n,A,t){n.values[2+A*5+3]=t}function rj(n,A){return n.values[2+A*5+4]}function jj(n,A,t){n.values[2+A*5+4]=t}function EA(n){return n.values[0]!==0}function $A(n){return n.values[1]}function FA(n){return n.values[2]}function tj(n){return n.values[3]}function vA(n,A){return n.values[3]=A}function ej(n){return n?Array.from(n).map(A=>A.toString(16).padStart(2,"0")).join(""):null}var Oe;(n=>{let A;(t=>(t[t.InvalidPassword=-1]="InvalidPassword",t[t.Unknown=0]="Unknown",t[t.Unencrypted=1]="Unencrypted",t[t.Encrypted=2]="Encrypted"))(A=n.PeerCipherStatus||={})})(Oe||={});function oj(n){return{type:"Success",value:n}}function x(n){return{type:"Failure",reason:n}}var{Deno:nj}=globalThis,Pe=typeof nj?.noColor=="boolean"?nj.noColor:!1,we=!Pe;function zA(n,A){return{open:\`\\x1B[\${n.join(";")}m\`,close:\`\\x1B[\${A}m\`,regexp:new RegExp(\`\\\\x1b\\\\[\${A}m\`,"g")}}function XA(n,A){return we?\`\${A.open}\${n.replace(A.regexp,A.open)}\${A.close}\`:n}function QA(n){return XA(n,zA([0],0))}function sj(n){return XA(n,zA([1],22))}function Me(n){return XA(n,zA([2],22))}var Jn=new RegExp(["[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)","(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g"),Te=new Date,gA=(n=>(n[n.CRITICAL=0]="CRITICAL",n[n.ERROR=1]="ERROR",n[n.WARN=2]="WARN",n[n.INFO=3]="INFO",n[n.DEBUG=4]="DEBUG",n))(gA||{}),aj={0:"\\u{1F4A5}",1:"\\u{1F534}",2:"\\u{1F7E1}",3:"\\u{1F535}",4:"\\u{1F7E3}"},Ue={4:Me,3:QA,2:QA,1:sj,0:sj};function Ve({message:n}){return String(n)}function lj(n){return JSON.stringify({timestamp:n.date.toISOString(),level:gA[n.level],message:n.message,extra:n.extra})}function ij(n){function A(q,p){return[Math.floor(q/p),q%p]}function t(){let q,p=n.date.valueOf()-Te.valueOf();[p,q]=A(p,1e3);let[F,D]=A(p,60);return\`\${F.toString().padStart(4,"0")}:\${D.toString().padStart(2,"0")}.\${q.toString().padStart(3,"0")}\`}function e(){return n.extra===void 0?"":typeof Deno=="object"?" "+Deno.inspect(n.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(n.extra)}let l=aj[n.level],d=n.logger.name!==void 0?\`@\${n.logger.name}\`:"";return\`\${QA(t())}\${d} \${l} \${Ue[n.level](String(n.message))}\${e()}\`}function Se(n){let A=\`[\${n.date.toISOString()}]\`,t=\`[\${gA[n.level]}]\`,e=n.logger.name!==void 0?\`[\${n.logger.name}] \`:"",l=aj[n.level];return\`\${A} \${l} \${t.padEnd(7," ")} \${e}\${n.message}\`}function Re(){return typeof Deno=="object"&&Deno.stdout.isTerminal()}var kj=class{static sparse=Ve;static json=lj;static pretty=ij;static structured=Se;static default=Re()?ij:lj;constructor(){}};var We=class{formatter;consoleObject;filter;constructor(n=kj.default,A=4,t=console){this.filter=A,this.formatter=n,this.consoleObject=t}handle(n){let A=this.formatter(n);switch(n.level){case 0:case 1:this.consoleObject.error(A);break;case 2:this.consoleObject.warn(A);break;case 3:this.consoleObject.info(A);break;case 4:this.consoleObject.debug(A);break}}};var V=class{#A;sinks;filter;parent;get name(){return this.#A}constructor(n,A=void 0,t=[],e=void 0){this.#A=A,this.sinks=t,this.filter=n,this.parent=e}log(n,A,t=void 0){let e={date:new Date,level:n,logger:this,message:A,extra:t};this.filter<n||this.insert(e)}insert(n){if(!(this.filter<n.level)){for(let A of this.sinks)A.filter>=n.level&&A.handle(n);this.parent!==void 0&&this.parent.insert(n)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},tA=globalThis[Symbol.for("odin-global-logger")]??=new V(3,void 0,[new We]),Qe=V.prototype.log.bind(tA,1),ze=V.prototype.log.bind(tA,2),uj=V.prototype.log.bind(tA,3),Xe=V.prototype.log.bind(tA,4),Kn=V.prototype.log.bind(tA);var cj;function dj(n,...A){let t=Ze(A);cj?cj?.info(n,t):uj(n,t)}function Ze(...n){if(n.length===1&&typeof n[0]=="object"&&n[0]!==null)return{...n[0]};if(n.length>0)return{args:n}}function LA(n){return n.connectionId*4294967296+n.mediaId}function qj(n){return{mediaId:n%4294967296,connectionId:Math.floor(n/4294967296)}}function K(n,A,t){let e;switch(A){case"f32":e=n.HEAPF32;break;case"u32":e=n.HEAPU32;break;case"i32":e=n.HEAP32;break;case"u8":e=n.HEAPU8;break;default:throw new Error(\`allocating \${A} is not supported\`)}let l=n._malloc(t*e.BYTES_PER_ELEMENT);if(l===0||l%e.BYTES_PER_ELEMENT!==0)throw new Error(\`failed allocating a \${t} \${A} array\`);let d=l/e.BYTES_PER_ELEMENT;return e.subarray(d,d+t)}function S(n,A){n._free(A.byteOffset)}function fj(n,A){return{values:K(n,"f32",2+A*5),length:A}}function Cj(n,A){S(n,A.values)}function Gj(n){return{values:K(n,"f32",4)}}function pj(n,A){S(n,A.values)}function Ij(n){let A=n.length,t=0,e=0;for(;e<A;){let l=n.charCodeAt(e++);if((l&4294967168)===0){t++;continue}else if((l&4294965248)===0)t+=2;else{if(l>=55296&&l<=56319&&e<A){let d=n.charCodeAt(e);(d&64512)===56320&&(++e,l=((l&1023)<<10)+(d&1023)+65536)}(l&4294901760)===0?t+=3:t+=4}}return t}function Ye(n,A,t){let e=n.length,l=t,d=0;for(;d<e;){let q=n.charCodeAt(d++);if((q&4294967168)===0){A[l++]=q;continue}else if((q&4294965248)===0)A[l++]=q>>6&31|192;else{if(q>=55296&&q<=56319&&d<e){let p=n.charCodeAt(d);(p&64512)===56320&&(++d,q=((q&1023)<<10)+(p&1023)+65536)}(q&4294901760)===0?(A[l++]=q>>12&15|224,A[l++]=q>>6&63|128):(A[l++]=q>>18&7|240,A[l++]=q>>12&63|128,A[l++]=q>>6&63|128)}A[l++]=q&63|128}}var An=new TextEncoder,rn=50;function jn(n,A,t){An.encodeInto(n,A.subarray(t))}function hj(n,A,t){n.length>rn?jn(n,A,t):Ye(n,A,t)}var tn=4096;function ZA(n,A,t){let e=A,l=e+t,d=[],q="";for(;e<l;){let p=n[e++];if((p&128)===0)d.push(p);else if((p&224)===192){let F=n[e++]&63;d.push((p&31)<<6|F)}else if((p&240)===224){let F=n[e++]&63,D=n[e++]&63;d.push((p&31)<<12|F<<6|D)}else if((p&248)===240){let F=n[e++]&63,D=n[e++]&63,KA=n[e++]&63,O=(p&7)<<18|F<<12|D<<6|KA;O>65535&&(O-=65536,d.push(O>>>10&1023|55296),O=56320|O&1023),d.push(O)}else d.push(p);d.length>=tn&&(q+=String.fromCharCode(...d),d.length=0)}return d.length>0&&(q+=String.fromCharCode(...d)),q}var en=new TextDecoder,nn=200;function sn(n,A,t){let e=n.subarray(A,A+t);return en.decode(e)}function mj(n,A,t){return t>nn?sn(n,A,t):ZA(n,A,t)}var R=class{constructor(A,t){this.type=A,this.data=t}};var g=class n extends Error{constructor(A){super(A);let t=Object.create(n.prototype);Object.setPrototypeOf(this,t),Object.defineProperty(this,"name",{configurable:!0,enumerable:!1,value:n.name})}};function Ej(n,A,t){let e=t/4294967296,l=t;n.setUint32(A,e),n.setUint32(A+4,l)}function HA(n,A,t){let e=Math.floor(t/4294967296),l=t;n.setUint32(A,e),n.setUint32(A+4,l)}function yA(n,A){let t=n.getInt32(A),e=n.getUint32(A+4);return t*4294967296+e}function $j(n,A){let t=n.getUint32(A),e=n.getUint32(A+4);return t*4294967296+e}var ln=-1,on=4294967296-1,an=17179869184-1;function kn({sec:n,nsec:A}){if(n>=0&&A>=0&&n<=an)if(A===0&&n<=on){let t=new Uint8Array(4);return new DataView(t.buffer).setUint32(0,n),t}else{let t=n/4294967296,e=n&4294967295,l=new Uint8Array(8),d=new DataView(l.buffer);return d.setUint32(0,A<<2|t&3),d.setUint32(4,e),l}else{let t=new Uint8Array(12),e=new DataView(t.buffer);return e.setUint32(0,A),HA(e,4,n),t}}function un(n){let A=n.getTime(),t=Math.floor(A/1e3),e=(A-t*1e3)*1e6,l=Math.floor(e/1e9);return{sec:t+l,nsec:e-l*1e9}}function cn(n){if(n instanceof Date){let A=un(n);return kn(A)}else return null}function dn(n){let A=new DataView(n.buffer,n.byteOffset,n.byteLength);switch(n.byteLength){case 4:return{sec:A.getUint32(0),nsec:0};case 8:{let t=A.getUint32(0),e=A.getUint32(4),l=(t&3)*4294967296+e,d=t>>>2;return{sec:l,nsec:d}}case 12:{let t=yA(A,4),e=A.getUint32(0);return{sec:t,nsec:e}}default:throw new g(\`Unrecognized data size for timestamp (expected 4, 8, or 12): \${n.length}\`)}}function qn(n){let A=dn(n);return new Date(A.sec*1e3+A.nsec/1e6)}var Fj={type:ln,encode:cn,decode:qn};var T=class{constructor(){this.builtInEncoders=[],this.builtInDecoders=[],this.encoders=[],this.decoders=[],this.register(Fj)}register({type:A,encode:t,decode:e}){if(A>=0)this.encoders[A]=t,this.decoders[A]=e;else{let l=-1-A;this.builtInEncoders[l]=t,this.builtInDecoders[l]=e}}tryToEncode(A,t){for(let e=0;e<this.builtInEncoders.length;e++){let l=this.builtInEncoders[e];if(l!=null){let d=l(A,t);if(d!=null){let q=-1-e;return new R(q,d)}}}for(let e=0;e<this.encoders.length;e++){let l=this.encoders[e];if(l!=null){let d=l(A,t);if(d!=null){let q=e;return new R(q,d)}}}return A instanceof R?A:null}decode(A,t,e){let l=t<0?this.builtInDecoders[-1-t]:this.decoders[t];return l?l(A,t,e):new R(t,A)}};T.defaultCodec=new T;function fn(n){return n instanceof ArrayBuffer||typeof SharedArrayBuffer<"u"&&n instanceof SharedArrayBuffer}function eA(n){return n instanceof Uint8Array?n:ArrayBuffer.isView(n)?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):fn(n)?new Uint8Array(n):Uint8Array.from(n)}var Cn=100,Gn=2048,_A=class n{constructor(A){this.entered=!1,this.extensionCodec=A?.extensionCodec??T.defaultCodec,this.context=A?.context,this.useBigInt64=A?.useBigInt64??!1,this.maxDepth=A?.maxDepth??Cn,this.initialBufferSize=A?.initialBufferSize??Gn,this.sortKeys=A?.sortKeys??!1,this.forceFloat32=A?.forceFloat32??!1,this.ignoreUndefined=A?.ignoreUndefined??!1,this.forceIntegerToFloat=A?.forceIntegerToFloat??!1,this.pos=0,this.view=new DataView(new ArrayBuffer(this.initialBufferSize)),this.bytes=new Uint8Array(this.view.buffer)}clone(){return new n({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,maxDepth:this.maxDepth,initialBufferSize:this.initialBufferSize,sortKeys:this.sortKeys,forceFloat32:this.forceFloat32,ignoreUndefined:this.ignoreUndefined,forceIntegerToFloat:this.forceIntegerToFloat})}reinitializeState(){this.pos=0}encodeSharedRef(A){if(this.entered)return this.clone().encodeSharedRef(A);try{return this.entered=!0,this.reinitializeState(),this.doEncode(A,1),this.bytes.subarray(0,this.pos)}finally{this.entered=!1}}encode(A){if(this.entered)return this.clone().encode(A);try{return this.entered=!0,this.reinitializeState(),this.doEncode(A,1),this.bytes.slice(0,this.pos)}finally{this.entered=!1}}doEncode(A,t){if(t>this.maxDepth)throw new Error(\`Too deep objects in depth \${t}\`);A==null?this.encodeNil():typeof A=="boolean"?this.encodeBoolean(A):typeof A=="number"?this.forceIntegerToFloat?this.encodeNumberAsFloat(A):this.encodeNumber(A):typeof A=="string"?this.encodeString(A):this.useBigInt64&&typeof A=="bigint"?this.encodeBigInt64(A):this.encodeObject(A,t)}ensureBufferSizeToWrite(A){let t=this.pos+A;this.view.byteLength<t&&this.resizeBuffer(t*2)}resizeBuffer(A){let t=new ArrayBuffer(A),e=new Uint8Array(t),l=new DataView(t);e.set(this.bytes),this.view=l,this.bytes=e}encodeNil(){this.writeU8(192)}encodeBoolean(A){A===!1?this.writeU8(194):this.writeU8(195)}encodeNumber(A){!this.forceIntegerToFloat&&Number.isSafeInteger(A)?A>=0?A<128?this.writeU8(A):A<256?(this.writeU8(204),this.writeU8(A)):A<65536?(this.writeU8(205),this.writeU16(A)):A<4294967296?(this.writeU8(206),this.writeU32(A)):this.useBigInt64?this.encodeNumberAsFloat(A):(this.writeU8(207),this.writeU64(A)):A>=-32?this.writeU8(224|A+32):A>=-128?(this.writeU8(208),this.writeI8(A)):A>=-32768?(this.writeU8(209),this.writeI16(A)):A>=-2147483648?(this.writeU8(210),this.writeI32(A)):this.useBigInt64?this.encodeNumberAsFloat(A):(this.writeU8(211),this.writeI64(A)):this.encodeNumberAsFloat(A)}encodeNumberAsFloat(A){this.forceFloat32?(this.writeU8(202),this.writeF32(A)):(this.writeU8(203),this.writeF64(A))}encodeBigInt64(A){A>=BigInt(0)?(this.writeU8(207),this.writeBigUint64(A)):(this.writeU8(211),this.writeBigInt64(A))}writeStringHeader(A){if(A<32)this.writeU8(160+A);else if(A<256)this.writeU8(217),this.writeU8(A);else if(A<65536)this.writeU8(218),this.writeU16(A);else if(A<4294967296)this.writeU8(219),this.writeU32(A);else throw new Error(\`Too long string: \${A} bytes in UTF-8\`)}encodeString(A){let e=Ij(A);this.ensureBufferSizeToWrite(5+e),this.writeStringHeader(e),hj(A,this.bytes,this.pos),this.pos+=e}encodeObject(A,t){let e=this.extensionCodec.tryToEncode(A,this.context);if(e!=null)this.encodeExtension(e);else if(Array.isArray(A))this.encodeArray(A,t);else if(ArrayBuffer.isView(A))this.encodeBinary(A);else if(typeof A=="object")this.encodeMap(A,t);else throw new Error(\`Unrecognized object: \${Object.prototype.toString.apply(A)}\`)}encodeBinary(A){let t=A.byteLength;if(t<256)this.writeU8(196),this.writeU8(t);else if(t<65536)this.writeU8(197),this.writeU16(t);else if(t<4294967296)this.writeU8(198),this.writeU32(t);else throw new Error(\`Too large binary: \${t}\`);let e=eA(A);this.writeU8a(e)}encodeArray(A,t){let e=A.length;if(e<16)this.writeU8(144+e);else if(e<65536)this.writeU8(220),this.writeU16(e);else if(e<4294967296)this.writeU8(221),this.writeU32(e);else throw new Error(\`Too large array: \${e}\`);for(let l of A)this.doEncode(l,t+1)}countWithoutUndefined(A,t){let e=0;for(let l of t)A[l]!==void 0&&e++;return e}encodeMap(A,t){let e=Object.keys(A);this.sortKeys&&e.sort();let l=this.ignoreUndefined?this.countWithoutUndefined(A,e):e.length;if(l<16)this.writeU8(128+l);else if(l<65536)this.writeU8(222),this.writeU16(l);else if(l<4294967296)this.writeU8(223),this.writeU32(l);else throw new Error(\`Too large map object: \${l}\`);for(let d of e){let q=A[d];this.ignoreUndefined&&q===void 0||(this.encodeString(d),this.doEncode(q,t+1))}}encodeExtension(A){if(typeof A.data=="function"){let e=A.data(this.pos+6),l=e.length;if(l>=4294967296)throw new Error(\`Too large extension object: \${l}\`);this.writeU8(201),this.writeU32(l),this.writeI8(A.type),this.writeU8a(e);return}let t=A.data.length;if(t===1)this.writeU8(212);else if(t===2)this.writeU8(213);else if(t===4)this.writeU8(214);else if(t===8)this.writeU8(215);else if(t===16)this.writeU8(216);else if(t<256)this.writeU8(199),this.writeU8(t);else if(t<65536)this.writeU8(200),this.writeU16(t);else if(t<4294967296)this.writeU8(201),this.writeU32(t);else throw new Error(\`Too large extension object: \${t}\`);this.writeI8(A.type),this.writeU8a(A.data)}writeU8(A){this.ensureBufferSizeToWrite(1),this.view.setUint8(this.pos,A),this.pos++}writeU8a(A){let t=A.length;this.ensureBufferSizeToWrite(t),this.bytes.set(A,this.pos),this.pos+=t}writeI8(A){this.ensureBufferSizeToWrite(1),this.view.setInt8(this.pos,A),this.pos++}writeU16(A){this.ensureBufferSizeToWrite(2),this.view.setUint16(this.pos,A),this.pos+=2}writeI16(A){this.ensureBufferSizeToWrite(2),this.view.setInt16(this.pos,A),this.pos+=2}writeU32(A){this.ensureBufferSizeToWrite(4),this.view.setUint32(this.pos,A),this.pos+=4}writeI32(A){this.ensureBufferSizeToWrite(4),this.view.setInt32(this.pos,A),this.pos+=4}writeF32(A){this.ensureBufferSizeToWrite(4),this.view.setFloat32(this.pos,A),this.pos+=4}writeF64(A){this.ensureBufferSizeToWrite(8),this.view.setFloat64(this.pos,A),this.pos+=8}writeU64(A){this.ensureBufferSizeToWrite(8),Ej(this.view,this.pos,A),this.pos+=8}writeI64(A){this.ensureBufferSizeToWrite(8),HA(this.view,this.pos,A),this.pos+=8}writeBigUint64(A){this.ensureBufferSizeToWrite(8),this.view.setBigUint64(this.pos,A),this.pos+=8}writeBigInt64(A){this.ensureBufferSizeToWrite(8),this.view.setBigInt64(this.pos,A),this.pos+=8}};function YA(n,A){return new _A(A).encodeSharedRef(n)}function xA(n){return\`\${n<0?"-":""}0x\${Math.abs(n).toString(16).padStart(2,"0")}\`}var pn=16,In=16,DA=class{constructor(A=pn,t=In){this.hit=0,this.miss=0,this.maxKeyLength=A,this.maxLengthPerKey=t,this.caches=[];for(let e=0;e<this.maxKeyLength;e++)this.caches.push([])}canBeCached(A){return A>0&&A<=this.maxKeyLength}find(A,t,e){let l=this.caches[e-1];A:for(let d of l){let q=d.bytes;for(let p=0;p<e;p++)if(q[p]!==A[t+p])continue A;return d.str}return null}store(A,t){let e=this.caches[A.length-1],l={bytes:A,str:t};e.length>=this.maxLengthPerKey?e[Math.random()*e.length|0]=l:e.push(l)}decode(A,t,e){let l=this.find(A,t,e);if(l!=null)return this.hit++,l;this.miss++;let d=ZA(A,t,e),q=Uint8Array.prototype.slice.call(A,t,t+e);return this.store(q,d),d}};var Ar="array",lA="map_key",gj="map_value",hn=n=>{if(typeof n=="string"||typeof n=="number")return n;throw new g("The type of key must be string or number but "+typeof n)},rr=class{constructor(){this.stack=[],this.stackHeadPosition=-1}get length(){return this.stackHeadPosition+1}top(){return this.stack[this.stackHeadPosition]}pushArrayState(A){let t=this.getUninitializedStateFromPool();t.type=Ar,t.position=0,t.size=A,t.array=new Array(A)}pushMapState(A){let t=this.getUninitializedStateFromPool();t.type=lA,t.readCount=0,t.size=A,t.map={}}getUninitializedStateFromPool(){if(this.stackHeadPosition++,this.stackHeadPosition===this.stack.length){let A={type:void 0,size:0,array:void 0,position:0,readCount:0,map:void 0,key:null};this.stack.push(A)}return this.stack[this.stackHeadPosition]}release(A){if(this.stack[this.stackHeadPosition]!==A)throw new Error("Invalid stack state. Released state is not on top of the stack.");if(A.type===Ar){let e=A;e.size=0,e.array=void 0,e.position=0,e.type=void 0}if(A.type===lA||A.type===gj){let e=A;e.size=0,e.map=void 0,e.readCount=0,e.type=void 0}this.stackHeadPosition--}reset(){this.stack.length=0,this.stackHeadPosition=-1}},sA=-1,jr=new DataView(new ArrayBuffer(0)),mn=new Uint8Array(jr.buffer);try{jr.getInt8(0)}catch(n){if(!(n instanceof RangeError))throw new Error("This module is not supported in the current JavaScript engine because DataView does not throw RangeError on out-of-bounds access")}var vj=new RangeError("Insufficient data"),En=new DA,NA=class n{constructor(A){this.totalPos=0,this.pos=0,this.view=jr,this.bytes=mn,this.headByte=sA,this.stack=new rr,this.entered=!1,this.extensionCodec=A?.extensionCodec??T.defaultCodec,this.context=A?.context,this.useBigInt64=A?.useBigInt64??!1,this.rawStrings=A?.rawStrings??!1,this.maxStrLength=A?.maxStrLength??4294967295,this.maxBinLength=A?.maxBinLength??4294967295,this.maxArrayLength=A?.maxArrayLength??4294967295,this.maxMapLength=A?.maxMapLength??4294967295,this.maxExtLength=A?.maxExtLength??4294967295,this.keyDecoder=A?.keyDecoder!==void 0?A.keyDecoder:En,this.mapKeyConverter=A?.mapKeyConverter??hn}clone(){return new n({extensionCodec:this.extensionCodec,context:this.context,useBigInt64:this.useBigInt64,rawStrings:this.rawStrings,maxStrLength:this.maxStrLength,maxBinLength:this.maxBinLength,maxArrayLength:this.maxArrayLength,maxMapLength:this.maxMapLength,maxExtLength:this.maxExtLength,keyDecoder:this.keyDecoder})}reinitializeState(){this.totalPos=0,this.headByte=sA,this.stack.reset()}setBuffer(A){let t=eA(A);this.bytes=t,this.view=new DataView(t.buffer,t.byteOffset,t.byteLength),this.pos=0}appendBuffer(A){if(this.headByte===sA&&!this.hasRemaining(1))this.setBuffer(A);else{let t=this.bytes.subarray(this.pos),e=eA(A),l=new Uint8Array(t.length+e.length);l.set(t),l.set(e,t.length),this.setBuffer(l)}}hasRemaining(A){return this.view.byteLength-this.pos>=A}createExtraByteError(A){let{view:t,pos:e}=this;return new RangeError(\`Extra \${t.byteLength-e} of \${t.byteLength} byte(s) found at buffer[\${A}]\`)}decode(A){if(this.entered)return this.clone().decode(A);try{this.entered=!0,this.reinitializeState(),this.setBuffer(A);let t=this.doDecodeSync();if(this.hasRemaining(1))throw this.createExtraByteError(this.pos);return t}finally{this.entered=!1}}*decodeMulti(A){if(this.entered){yield*this.clone().decodeMulti(A);return}try{for(this.entered=!0,this.reinitializeState(),this.setBuffer(A);this.hasRemaining(1);)yield this.doDecodeSync()}finally{this.entered=!1}}async decodeAsync(A){if(this.entered)return this.clone().decodeAsync(A);try{this.entered=!0;let t=!1,e;for await(let p of A){if(t)throw this.entered=!1,this.createExtraByteError(this.totalPos);this.appendBuffer(p);try{e=this.doDecodeSync(),t=!0}catch(F){if(!(F instanceof RangeError))throw F}this.totalPos+=this.pos}if(t){if(this.hasRemaining(1))throw this.createExtraByteError(this.totalPos);return e}let{headByte:l,pos:d,totalPos:q}=this;throw new RangeError(\`Insufficient data in parsing \${xA(l)} at \${q} (\${d} in the current buffer)\`)}finally{this.entered=!1}}decodeArrayStream(A){return this.decodeMultiAsync(A,!0)}decodeStream(A){return this.decodeMultiAsync(A,!1)}async*decodeMultiAsync(A,t){if(this.entered){yield*this.clone().decodeMultiAsync(A,t);return}try{this.entered=!0;let e=t,l=-1;for await(let d of A){if(t&&l===0)throw this.createExtraByteError(this.totalPos);this.appendBuffer(d),e&&(l=this.readArraySize(),e=!1,this.complete());try{for(;yield this.doDecodeSync(),--l!==0;);}catch(q){if(!(q instanceof RangeError))throw q}this.totalPos+=this.pos}}finally{this.entered=!1}}doDecodeSync(){A:for(;;){let A=this.readHeadByte(),t;if(A>=224)t=A-256;else if(A<192)if(A<128)t=A;else if(A<144){let l=A-128;if(l!==0){this.pushMapState(l),this.complete();continue A}else t={}}else if(A<160){let l=A-144;if(l!==0){this.pushArrayState(l),this.complete();continue A}else t=[]}else{let l=A-160;t=this.decodeString(l,0)}else if(A===192)t=null;else if(A===194)t=!1;else if(A===195)t=!0;else if(A===202)t=this.readF32();else if(A===203)t=this.readF64();else if(A===204)t=this.readU8();else if(A===205)t=this.readU16();else if(A===206)t=this.readU32();else if(A===207)this.useBigInt64?t=this.readU64AsBigInt():t=this.readU64();else if(A===208)t=this.readI8();else if(A===209)t=this.readI16();else if(A===210)t=this.readI32();else if(A===211)this.useBigInt64?t=this.readI64AsBigInt():t=this.readI64();else if(A===217){let l=this.lookU8();t=this.decodeString(l,1)}else if(A===218){let l=this.lookU16();t=this.decodeString(l,2)}else if(A===219){let l=this.lookU32();t=this.decodeString(l,4)}else if(A===220){let l=this.readU16();if(l!==0){this.pushArrayState(l),this.complete();continue A}else t=[]}else if(A===221){let l=this.readU32();if(l!==0){this.pushArrayState(l),this.complete();continue A}else t=[]}else if(A===222){let l=this.readU16();if(l!==0){this.pushMapState(l),this.complete();continue A}else t={}}else if(A===223){let l=this.readU32();if(l!==0){this.pushMapState(l),this.complete();continue A}else t={}}else if(A===196){let l=this.lookU8();t=this.decodeBinary(l,1)}else if(A===197){let l=this.lookU16();t=this.decodeBinary(l,2)}else if(A===198){let l=this.lookU32();t=this.decodeBinary(l,4)}else if(A===212)t=this.decodeExtension(1,0);else if(A===213)t=this.decodeExtension(2,0);else if(A===214)t=this.decodeExtension(4,0);else if(A===215)t=this.decodeExtension(8,0);else if(A===216)t=this.decodeExtension(16,0);else if(A===199){let l=this.lookU8();t=this.decodeExtension(l,1)}else if(A===200){let l=this.lookU16();t=this.decodeExtension(l,2)}else if(A===201){let l=this.lookU32();t=this.decodeExtension(l,4)}else throw new g(\`Unrecognized type byte: \${xA(A)}\`);this.complete();let e=this.stack;for(;e.length>0;){let l=e.top();if(l.type===Ar)if(l.array[l.position]=t,l.position++,l.position===l.size)t=l.array,e.release(l);else continue A;else if(l.type===lA){if(t==="__proto__")throw new g("The key __proto__ is not allowed");l.key=this.mapKeyConverter(t),l.type=gj;continue A}else if(l.map[l.key]=t,l.readCount++,l.readCount===l.size)t=l.map,e.release(l);else{l.key=null,l.type=lA;continue A}}return t}}readHeadByte(){return this.headByte===sA&&(this.headByte=this.readU8()),this.headByte}complete(){this.headByte=sA}readArraySize(){let A=this.readHeadByte();switch(A){case 220:return this.readU16();case 221:return this.readU32();default:{if(A<160)return A-144;throw new g(\`Unrecognized array type byte: \${xA(A)}\`)}}}pushMapState(A){if(A>this.maxMapLength)throw new g(\`Max length exceeded: map length (\${A}) > maxMapLengthLength (\${this.maxMapLength})\`);this.stack.pushMapState(A)}pushArrayState(A){if(A>this.maxArrayLength)throw new g(\`Max length exceeded: array length (\${A}) > maxArrayLength (\${this.maxArrayLength})\`);this.stack.pushArrayState(A)}decodeString(A,t){return!this.rawStrings||this.stateIsMapKey()?this.decodeUtf8String(A,t):this.decodeBinary(A,t)}decodeUtf8String(A,t){if(A>this.maxStrLength)throw new g(\`Max length exceeded: UTF-8 byte length (\${A}) > maxStrLength (\${this.maxStrLength})\`);if(this.bytes.byteLength<this.pos+t+A)throw vj;let e=this.pos+t,l;return this.stateIsMapKey()&&this.keyDecoder?.canBeCached(A)?l=this.keyDecoder.decode(this.bytes,e,A):l=mj(this.bytes,e,A),this.pos+=t+A,l}stateIsMapKey(){return this.stack.length>0?this.stack.top().type===lA:!1}decodeBinary(A,t){if(A>this.maxBinLength)throw new g(\`Max length exceeded: bin length (\${A}) > maxBinLength (\${this.maxBinLength})\`);if(!this.hasRemaining(A+t))throw vj;let e=this.pos+t,l=this.bytes.subarray(e,e+A);return this.pos+=t+A,l}decodeExtension(A,t){if(A>this.maxExtLength)throw new g(\`Max length exceeded: ext length (\${A}) > maxExtLength (\${this.maxExtLength})\`);let e=this.view.getInt8(this.pos+t),l=this.decodeBinary(A,t+1);return this.extensionCodec.decode(l,e,this.context)}lookU8(){return this.view.getUint8(this.pos)}lookU16(){return this.view.getUint16(this.pos)}lookU32(){return this.view.getUint32(this.pos)}readU8(){let A=this.view.getUint8(this.pos);return this.pos++,A}readI8(){let A=this.view.getInt8(this.pos);return this.pos++,A}readU16(){let A=this.view.getUint16(this.pos);return this.pos+=2,A}readI16(){let A=this.view.getInt16(this.pos);return this.pos+=2,A}readU32(){let A=this.view.getUint32(this.pos);return this.pos+=4,A}readI32(){let A=this.view.getInt32(this.pos);return this.pos+=4,A}readU64(){let A=$j(this.view,this.pos);return this.pos+=8,A}readI64(){let A=yA(this.view,this.pos);return this.pos+=8,A}readU64AsBigInt(){let A=this.view.getBigUint64(this.pos);return this.pos+=8,A}readI64AsBigInt(){let A=this.view.getBigInt64(this.pos);return this.pos+=8,A}readF32(){let A=this.view.getFloat32(this.pos);return this.pos+=4,A}readF64(){let A=this.view.getFloat64(this.pos);return this.pos+=8,A}};function tr(n,A){return new NA(A).decode(n)}var iA=class n{constructor(A,t,e,l,d){this.mediaIds=A;this.sequenceNumber=t;this.timeStamp=e;this.isEndOfSpurt=l;this.payload=d}static parse(A){let t;try{t=tr(A)}catch{return x("not valid msgpack")}if(!Array.isArray(t))return x("container must be an array");if(t.length<6)return x("missing fields");if(t[0]!==1)return x("unknown type");if(!Array.isArray(t[1]))return x("media ids must be an array");if(!t[1].every(D=>typeof D=="number"))return x("media ids must be numbers");if(typeof t[2]!="number")return x("sequence number must be a number");if(typeof t[3]!="number")return x("timestamp must be a number");if(typeof t[4]!="number")return x("flags must be a number");let e=t[1],l=t[2]>>>0,d=t[3]>>>0,p=(t[4]&1)!==0,F=t[t.length-1];return F instanceof Uint8Array?oj(new n(e,l,d,p,F)):x("payload must be bytes")}toBytes(){let A=Number(this.isEndOfSpurt),t=[1,this.mediaIds,this.sequenceNumber>>>0,this.timeStamp>>>0,A,this.payload];return new Uint8Array(YA(t,{forceFloat32:!0,ignoreUndefined:!0}))}};var BA=class{constructor(A,t){this.sampleRate=A;this.wasm=t;this.sequenceNumber=Math.random()*Math.pow(2,32)>>0;this.timestamp=Math.random()*Math.pow(2,32)>>0;this.connections=[];this.monitoring=!1;this.active=!1;this.stats={numberPackets:0,numberTicks:0,numberPacketError:0,numberPacketsMediaNotFound:0};this.encoder=new t.Encoder(A,15,!0,w.VadPreload),this.encoder.complexity=navigator.hardwareConcurrency>=4?6:4,this.information=Gj(this.wasm),this.outBuffer=K(this.wasm,"u8",1270),vA(this.information,1)}setVad(A){this.encoder.set_volume_gate(A.volumeGate!==void 0,A.volumeGate?.attackThreshold??0,A.volumeGate?.releaseThreshold??0),this.encoder.set_speech_detection(A.voiceActivity!==void 0,A.voiceActivity?.attackThreshold??0,A.voiceActivity?.releaseThreshold??0)}setMedias(A){this.connections=A.filter(({mediaIds:t})=>t.length>0)}close(){pj(this.wasm,this.information),S(this.wasm,this.outBuffer),this.encoder.delete()}encode(A){for(this.encoder.push(A.byteOffset,this.information.values.byteOffset);;){let t=this.encoder.pop(this.connections.length===0?0:this.outBuffer.byteOffset,this.outBuffer.length);if(t===0)break;if(t<0){dj(\`failed encoding packet: \${t}\`);return}if(this.timestamp=this.timestamp+1800>>0,t===1)continue;this.sequenceNumber=this.sequenceNumber+1>>0;let e=this.active&&!this.encoder.active;this.active=this.encoder.active,this.monitoring=this.connections.some(l=>l.id===0);for(let l of this.connections){if(this.monitoring&&l.id!==0)continue;let d=new iA(l.mediaIds,this.sequenceNumber,this.timestamp,e,this.outBuffer.subarray(0,t));M(globalThis,["sendPacket",{connectionId:l.id,packet:d.toBytes()}])}}}onMessage(A){let[t,e]=A;switch(t){case"captureSetVad":this?.setVad(e);break;case"captureSetMedias":this?.setMedias(e.connections);break;case"close":this.close();break;case"dump":e.result.postMessage(this.dump());break}}dump(){return{sequenceNumber:this.sequenceNumber,timestamp:this.timestamp,connections:this.connections.map(A=>\`\${A.id} => \${A.mediaIds.join(",")}\`),active:this.active,monitoring:this.monitoring,information:{active:EA(this.information),speechProbability:$A(this.information),rmsDBFS:FA(this.information),volume:tj(this.information)},encoder:{sample_rate:this.encoder.sample_rate,fec_packet_loss:this.encoder.fec_packet_loss,voip:this.encoder.voip,vad_preload:this.encoder.vad_preload,complexity:this.encoder.complexity,speech_probability:this.encoder.speech_probability,rms_dbfs:this.encoder.rms_dbfs,active:this.encoder.active,speech_detection_enabled:this.encoder.speech_detection_enabled,speech_detection_going_active:this.encoder.speech_detection_going_active,speech_detection_going_inactive:this.encoder.speech_detection_going_inactive,volume_gate_enabled:this.encoder.volume_gate_enabled,volume_gate_going_active:this.encoder.volume_gate_going_active,volume_gate_going_inactive:this.encoder.volume_gate_going_inactive}}}},bA=class{constructor(A){this.wasm=A;this.medias=new Map;this.stats={numberPackets:0,numberTicks:0,numberPacketError:0,numberPacketsMediaNotFound:0,numberTicksWithAudio:0};this.largestIndex=-1;this.decoders=K(this.wasm,"u32",w.MaxNumberOfDecoders),this.information=fj(this.wasm,w.MaxNumberOfDecoders),IA(this.information,[1,1])}close(){Cj(this.wasm,this.information);for(let{decoder:A}of this.medias.values())A.delete()}receivePacket(A,t){this.stats.numberPackets++;let e=iA.parse(t);if(e.type==="Failure"){this.stats.numberPacketError++;let l=Array.from(t).map(d=>d.toString(16).padStart(2,"0")).join("");console.error(\`failed decoding audio packet; reason: \${e.reason}, connection: \${A}, dump: \${l}\`);return}for(let l of e.value.mediaIds){let d=this.medias.get(LA({connectionId:A,mediaId:l}));if(d===void 0){this.stats.numberPacketsMediaNotFound++;continue}d.lastPacket=t;let q=K(this.wasm,"u8",e.value.payload.length);q.set(e.value.payload),d.decoder.push(e.value.sequenceNumber,e.value.timeStamp,e.value.isEndOfSpurt,q.byteOffset,q.length)}}insertMedia(A,t,e,l=[1,1]){let d=LA({connectionId:t,mediaId:e}),q=new this.wasm.Decoder;this.medias.set(d,{index:A,decoder:q,lastPacket:void 0}),this.decoders[A]=q.$$.ptr,this.largestIndex=Math.max(this.largestIndex,A),mA(this.information,A,l),jj(this.information,A,0),Aj(this.information,A,0)}removeMedia(A,t,e){let l=LA({connectionId:t,mediaId:e}),d=this.medias.get(l);if(!(d===void 0||d.index!==A)&&(this.medias.delete(l),Xr(this.information,A,0),this.decoders[A]=0,d.decoder.delete(),A===this.largestIndex)){for(A=A-1;A>=0&&this.decoders[A]===0;A--);this.largestIndex=A}}decode(A){return{hasAudio:this.wasm.pop_many(this.decoders.byteOffset,this.information.values.byteOffset,this.largestIndex+1,A.byteOffset)}}onMessage(A){let[t,e]=A;switch(t){case"playbackReceivePacket":this.receivePacket(e.connectionId,e.packet);break;case"playbackUpdateMedias":for(let{index:l,connectionId:d,mediaId:q}of e.removed)this.removeMedia(l,d,q);for(let{index:l,connectionId:d,mediaId:q,volume:p}of e.added)this.insertMedia(l,d,q,p);break;case"close":this.close();break;case"dump":e.result.postMessage(this.dump());break}}dump(){let A=[];for(let[t,e]of this.medias){let l=qj(t);A.push({index:e.index,connectionId:l.connectionId,mediaId:l.mediaId,rmsDBFS:hA(this.information,e.index),volume:Zr(this.information,e.index),voicedBlocks:rj(this.information,e.index),silentBlocks:Yr(this.information,e.index),time:e.decoder.time,consecutive_silence:e.decoder.consecutive_silence,last_voiced_time_point:e.decoder.last_voiced_time_point,sequence_number:e.decoder.sequence_number,packetsSeen:e.decoder.packets_seen,packetsInvalid:e.decoder.packets_invalid,packetsTooLate:e.decoder.packets_too_late,packetsTooEarly:e.decoder.packets_too_early,packetsRepeated:e.decoder.packets_repeated,packetsProcessed:e.decoder.packets_processed,packetsLost:e.decoder.packets_lost,rewinds:e.decoder.rewinds,cacheLength:e.decoder.cache_length,lastPacket:ej(e.lastPacket)})}return{largestIndex:this.largestIndex,globalVolume:zr(this.information),decoders:A}}};var Dj=Ce(Hj()),yj=(0,Dj.default)(),_j,xj;globalThis.addEventListener("message",nr);async function nr(n){let A=n.data,[t,e]=A;switch(t){case"captureInit":e.workletPort.onmessage=nr,_j=new sr(e.sampleRate,await yj,e.refreshRate);break;case"playbackInit":e.workletPort.onmessage=nr,xj=new lr(await yj,e.workletPort,e.refreshRate);break;case"close":globalThis.close();break}_j?.onMessage(A),xj?.onMessage(A)}var sr=class extends BA{constructor(t,e,l){super(t,e);this.sampleRate=t;this.inBuffer=K(this.wasm,"f32",t*.02),this.updateHandle=setInterval(()=>this.update(),l),M(globalThis,["captureReady",{}])}close(){super.close(),S(this.wasm,this.inBuffer),clearInterval(this.updateHandle)}onMessage(t){super.onMessage(t);let[e,l]=t;switch(e){case"captureSetVolume":this.setVolume(l.value);break;case"captureTick":this.tick(l.buffer);break}}setVolume(t){vA(this.information,t)}tick(t){this.inBuffer.set(t,0),this.encode(this.inBuffer)}update(){M(globalThis,["captureUpdate",{active:EA(this.information),rmsDBFs:FA(this.information),speechProbability:$A(this.information)}])}dump(){return{type:"unshared capture worker",sampleRate:this.sampleRate,...super.dump()}}},lr=class extends bA{constructor(t,e,l){super(t);this.workletPort=e;this.id=w.PlaybackPreload,this.outBuffer=K(this.wasm,"f32",48e3*.02*2),this.updateHandle=setInterval(()=>this.update(),l),M(globalThis,["playbackReady",{}])}close(){super.close(),S(this.wasm,this.outBuffer),clearInterval(this.updateHandle)}onMessage(t){super.onMessage(t);let[e,l]=t;switch(e){case"playbackSetVolume":this.setVolume(l.index,l.value);break;case"playbackTick":this.tick();break}}setVolume(t,e){t==="global"?IA(this.information,e):mA(this.information,t,e)}tick(){this.stats.numberTicks++,this.id+=1;let{hasAudio:t}=this.decode(this.outBuffer);if(t){let e=this.outBuffer.slice();M(this.workletPort,["samples",{id:this.id,buffer:e}],[e.buffer])}}update(){let t=new Float32Array(this.information.length*2);for(let l=0;l<=this.largestIndex;l++)t[l]=hA(this.information,l);let e=[];for(let[l,d]of this.medias)e[d.index]={packetsBuffered:d.decoder.cache_length,packetsSeen:d.decoder.packets_seen,packetsProcessed:d.decoder.packets_processed,packetsTooEarly:d.decoder.packets_too_early,packetsTooLate:d.decoder.packets_too_late,packetsDropped:0,packetsInvalid:d.decoder.packets_invalid,packetsRepeated:d.decoder.packets_repeated,packetsLost:d.decoder.packets_lost};M(globalThis,["playbackUpdate",{activities:t,jitterStats:e}],[t.buffer])}dump(){return{type:"unshared playback worker",id:this.id,...super.dump()}}};})();
6436
- `});var F0,P0=q(()=>{F0='"use strict";(()=>{var P=Object.defineProperty;var M=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})};var u={};M(u,{AdditionalCaptureBlocks:()=>E,AdditionalPlaybackBlocks:()=>R,ClockJumpCheckInterval:()=>_,ClockJumpThreshold:()=>N,ConnectInterval:()=>Q,ConnectTimeout:()=>G,DefaultRefreshRate:()=>C,DefaultVideoCodec:()=>Y,HealthCheckTimeout:()=>O,MainConnectionPingInterval:()=>W,MaxNumberOfDecoders:()=>L,MinDBFs:()=>v,MinTokenLifetime:()=>Z,MinTokenRefreshInterval:()=>q,PlaybackPreload:()=>F,RenderQuantumSize:()=>V,VadPreload:()=>D,WebRtcAnswerTimeout:()=>J,WebRtcIceTimeout:()=>$,WebRtcMaxNegotiationAttempts:()=>z,WebRtcStatsSnapshotInterval:()=>j,WebRtcTimeout:()=>H});var R=3,E=3,F=3,C=250,D=3,L=512,V=128,v=-758.596,O=1e4,_=1e3,N=1e4,W=3e3,j=1e3,$=3e3,H=1e4,J=1e4,z=3,G=5e3,Z=6e4,q=5e3,Q=[0,100,200,200,500],Y="H264";function d(e,t,r){return e.postMessage(t,r)}var K;(e=>{let t;(r=>(r[r.InvalidPassword=-1]="InvalidPassword",r[r.Unknown=0]="Unknown",r[r.Unencrypted=1]="Unencrypted",r[r.Encrypted=2]="Encrypted"))(t=e.PeerCipherStatus||={})})(K||={});var{Deno:k}=globalThis,X=typeof k?.noColor=="boolean"?k.noColor:!1,ee=!X;function m(e,t){return{open:`\\x1B[${e.join(";")}m`,close:`\\x1B[${t}m`,regexp:new RegExp(`\\\\x1b\\\\[${t}m`,"g")}}function h(e,t){return ee?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function p(e){return h(e,m([0],0))}function U(e){return h(e,m([1],22))}function te(e){return h(e,m([2],22))}var Se=new RegExp(["[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)","(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g"),re=new Date,f=(e=>(e[e.CRITICAL=0]="CRITICAL",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.DEBUG=4]="DEBUG",e))(f||{}),T={0:"\\u{1F4A5}",1:"\\u{1F534}",2:"\\u{1F7E1}",3:"\\u{1F535}",4:"\\u{1F7E3}"},ne={4:te,3:p,2:p,1:U,0:U};function se({message:e}){return String(e)}function S(e){return JSON.stringify({timestamp:e.date.toISOString(),level:f[e.level],message:e.message,extra:e.extra})}function I(e){function t(c,i){return[Math.floor(c/i),c%i]}function r(){let c,i=e.date.valueOf()-re.valueOf();[i,c]=t(i,1e3);let[B,A]=t(i,60);return`${B.toString().padStart(4,"0")}:${A.toString().padStart(2,"0")}.${c.toString().padStart(3,"0")}`}function n(){return e.extra===void 0?"":typeof Deno=="object"?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let s=T[e.level],a=e.logger.name!==void 0?`@${e.logger.name}`:"";return`${p(r())}${a} ${s} ${ne[e.level](String(e.message))}${n()}`}function oe(e){let t=`[${e.date.toISOString()}]`,r=`[${f[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",s=T[e.level];return`${t} ${s} ${r.padEnd(7," ")} ${n}${e.message}`}function ae(){return typeof Deno=="object"&&Deno.stdout.isTerminal()}var w=class{static sparse=se;static json=S;static pretty=I;static structured=oe;static default=ae()?I:S;constructor(){}};var ie=class{formatter;consoleObject;filter;constructor(e=w.default,t=4,r=console){this.filter=t,this.formatter=e,this.consoleObject=r}handle(e){let t=this.formatter(e);switch(e.level){case 0:case 1:this.consoleObject.error(t);break;case 2:this.consoleObject.warn(t);break;case 3:this.consoleObject.info(t);break;case 4:this.consoleObject.debug(t);break}}};var o=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(e,t=void 0,r=[],n=void 0){this.#e=t,this.sinks=r,this.filter=e,this.parent=n}log(e,t,r=void 0){let n={date:new Date,level:e,logger:this,message:t,extra:r};this.filter<e||this.insert(n)}insert(e){if(!(this.filter<e.level)){for(let t of this.sinks)t.filter>=e.level&&t.handle(e);this.parent!==void 0&&this.parent.insert(e)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},l=globalThis[Symbol.for("odin-global-logger")]??=new o(3,void 0,[new ie]),ce=o.prototype.log.bind(l,1),ue=o.prototype.log.bind(l,2),le=o.prototype.log.bind(l,3),fe=o.prototype.log.bind(l,4),Ie=o.prototype.log.bind(l);var b=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.blocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"init":this.state=new y(s.workerPort,sampleRate*.02);break;case"close":this.alive=!1;break;case"dump":s.result.postMessage(this.dump());break}}process(r,n,s){if(this.state===void 0||r.length<1||r[0].length<1)return this.alive;let a=this.state.fill(0,r[0][0]);return this.state.offset===this.state.length&&(this.state.flush(),this.state.fill(a,r[0][0])),this.alive}dump(){return{type:"unshared capture worklet",alive:this.alive,sampleRate,offset:this.state?.offset||null,length:this.state?.length||null,blocks:this.blocks}}},x=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.silenceBlocks=0;this.voiceBlocks=0;this.totalBlocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"close":this.alive=!1;break;case"init":this.state=new g(s.workerPort,sampleRate*.02),s.workerPort.onmessage=this.onMessage.bind(this);break;case"samples":this.state?.add(s.id,s.buffer);break;case"dump":s.result.postMessage(this.dump());break}n==="close"&&(this.alive=!1)}process(r,n,s){if(this.state===void 0||n.length<1||n[0].length<2)return this.alive;let a=this.state.fill(0,n[0][0],n[0][1]);return a<u.RenderQuantumSize&&(this.totalBlocks+=1,this.state.next(),this.state.hasVoice?this.voiceBlocks+=1:this.silenceBlocks+=1,this.state.fill(a,n[0][0],n[0][1])),this.alive}dump(){return{type:"unshared playback worklet",alive:this.alive,sampleRate,id:this.state?.id||null,offset:this.state?.offset||null,length:this.state?.length||null,hasVoice:this.state?.hasVoice??!1,silenceBlocks:this.silenceBlocks,voiceBlocks:this.voiceBlocks,totalBlocks:this.totalBlocks}}},y=class{constructor(t,r){this.port=t;this.length=r;this.offset=0,this.buffer=new Float32Array(r)}fill(t,r){let n=Math.min(r.length-t,this.length-this.offset);return this.buffer.set(r.subarray(t,t+n),this.offset),this.offset+=n,t+n}flush(){d(this.port,["captureTick",{buffer:this.buffer}],[this.buffer.buffer]),this.offset=0,this.buffer=new Float32Array(this.length)}},g=class{constructor(t,r){this.port=t;this.length=r;this.cache=[];this.id=-1,this.offset=0,this.buffer=void 0,this.next()}get hasVoice(){return this.buffer!==void 0}fill(t,r,n){let s=Math.min(u.RenderQuantumSize-t,this.length-this.offset);return this.buffer!==void 0&&(r.set(this.buffer.subarray(this.offset,this.offset+s),t),n.set(this.buffer.subarray(this.offset+this.length,this.offset+this.length+s),t)),this.offset+=s,t+s}add(t,r){this.cache.push({id:t,buffer:r})}next(){for(this.id+=1;this.cache[0]?.id<this.id;)this.cache.shift();this.cache[0]?.id===this.id?(this.buffer=this.cache[0].buffer,this.cache.shift()):this.buffer=void 0,this.offset=0,d(this.port,["playbackTick",{}])}};registerProcessor("OdinCaptureProcessor",b);registerProcessor("OdinPlaybackProcessor",x);})();\n'});var K0={};Vx(K0,{UnsharedCaptureWorker:()=>ix,UnsharedPlaybackWorker:()=>bx,createCaptureWorker:()=>oF,createPlaybackWorker:()=>aF});import{Strand as iF}from"@4players/odin-common";function oF(v,D,e,j,B=i.DefaultRefreshRate){return bF.enqueue(async()=>{let[C,E]=await Y(A0,F0,v,"OdinCaptureProcessor",{channelCount:1,numberOfInputs:1,numberOfOutputs:0});return console.warn("SharedArrayBuffer is not available; creating ODIN CaptureWorker in fallback mode"),ix.create(v,D,e,B,C,E,j)})}async function aF(v,D=i.DefaultRefreshRate){if(v.sampleRate!==48e3)throw new Error("playback sample rate must be 48kHz ");let[e,j]=await Y(A0,F0,v,"OdinPlaybackProcessor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2]});return bx.create(v,D,e,j)}var bF,ix,bx,J0=q(()=>{"use strict";u();sx();w0();P0();bF=new iF;ix=class v extends X{constructor(e,j,B,C,E){super(e,j,B,C,E);this._Activity=_;this._SpeechProbability=0;j.addEventListener("message",this._OnMessages.bind(this))}static async create(e,j,B,C,E,f,s){let{port1:b,port2:d}=new MessageChannel;return c(E,["captureInit",{sampleRate:e.sampleRate,refreshRate:C,workletPort:b}],[b]),await U(E,"captureReady"),c(f.port,["init",{workerPort:d}],[d]),new v(f,E,j,B,s)}get activity(){return this._Activity}get speechProbability(){return this._SpeechProbability}setVolume(e){c(this.worker,["captureSetVolume",{value:e}])}_OnMessages(e){super._OnMessages(e);let[j,B]=e.data;j==="captureUpdate"&&(this._Activity={isSilent:!B.active,rmsDBFS:B.rmsDBFs},this._SpeechProbability=B.speechProbability)}},bx=class v extends z{constructor(e,j,B){super(e,j,B);this.activities=new Float32Array;this.jitterStats=[]}static async create(e,j,B,C){let{port1:E,port2:f}=new MessageChannel;return c(B,["playbackInit",{workletPort:E,refreshRate:j}],[E]),await U(B,"playbackReady"),c(C.port,["init",{workerPort:f}],[f]),new v(e,C,B)}getActivity(e){let j=this.medias.get(m(e));if(j===void 0)return;let B=this.activities.at(j.index);if(B!==void 0)return B===0?_:{isSilent:!1,rmsDBFS:B}}getJitterStats(e){let j=this.medias.get(m(e));if(j===void 0)return;let B=this.jitterStats.at(j.index);if(B!==void 0)return B}setGlobalVolume(e){c(this.worker,["playbackSetVolume",{index:"global",value:e}])}setVolume(e,j){let B=this.medias.get(m(e));B!==void 0&&c(this.worker,["playbackSetVolume",{index:B.index,value:j}])}_GetFreeIndex(){let e=super._GetFreeIndex();if(e!==void 0)return e;if(this.medias.size<i.MaxNumberOfDecoders)return this.medias.size}_OnMessages(e){super._OnMessages(e);let[j,B]=e.data;j==="playbackUpdate"&&(this.activities=B.activities,this.jitterStats=B.jitterStats)}}});u();import{Backend as r,generateUUID as Lr}from"@4players/odin-common";u();import{Backend as x,JITTER_STATS_INITIAL as S0,Strand as hF,assert as qF}from"@4players/odin-common";u();import{APM_DEFAULTS as kF,Backend as OB,generateUUID as cF,VAD_DEFAULTS as dF}from"@4players/odin-common";import{failure as I0,isFirefoxBrowser as xF,sleep as AF,success as FF}from"@4players/odin-common";async function g0(v,D,e){let j;if(D.device?.device.kind==="track"&&D.device?.device.audioTrack)j=new MediaStream([D.device.device.audioTrack]);else{let E=D.device?{exact:D.device.device.deviceId==="default"?void 0:D.device.device.deviceId}:void 0;try{let f=await Promise.race([navigator.mediaDevices.getUserMedia({audio:{echoCancellation:e.echoCanceller,noiseSuppression:e.noiseSuppression!=="None",autoGainControl:e.gainController,echoCancellationType:"system",deviceId:E}}),AF(3e4,"timeout")]);if(f==="timeout")return I0("getUserMedia; timeout");j=f}catch(f){return I0(`getUserMedia; ${f}`)}}let B=j.getAudioTracks()[0].getSettings().sampleRate,C=await v.audioContexts.acquire(B);return FF(C.createMediaStreamSource(j))}function W(v){v.getTracks().forEach(D=>{D.stop(),v.removeTrack(D)})}async function $0(v){return new L({deviceId:v.id,kind:"track",name:v.label??"MediaStreamTrack",audioTrack:v},!1)}async function nx(){if(xF()){let B=await rF("microphone");(B==="granted"||B===!1)&&await tF("audio")}let v=(await navigator.mediaDevices.enumerateDevices()).filter(B=>!!B.label),D=[],e=new L({deviceId:"default",name:"Default",kind:"audioinput"},!0),j=new L({deviceId:"default",name:"Default",kind:"audiooutput"},!0);D.push(e),D.push(j);for(let B of v){if(B.deviceId==="default"){B.kind==="audioinput"&&(e=new L({deviceId:"default",name:B.label,kind:"audioinput"},!0),D[0]=e),B.kind==="audiooutput"&&(j=new L({deviceId:"default",name:B.label,kind:"audiooutput"},!0),D[1]=j);continue}B.kind==="audioinput"&&D.push(new L({deviceId:B.deviceId,name:B.label,kind:"audioinput"},!1)),B.kind==="audiooutput"&&D.push(new L({deviceId:B.deviceId,name:B.label,kind:"audiooutput"},!1))}return D}async function rF(v){try{return(await navigator.permissions.query({name:v})).state}catch{return!1}}async function tF(v){try{let D=await navigator.mediaDevices.getUserMedia({[v]:!0});return D?.getTracks().forEach(e=>{e.stop(),D.removeTrack(e)}),!0}catch{return!1}}u();import{isSafariBrowser as lF,isSharedArrayBufferCapable as uF}from"@4players/odin-common";var O0=uF()&&!lF()?Promise.resolve().then(()=>(N0(),H0)):Promise.resolve().then(()=>(J0(),K0));async function M0(v,D,e,j){return O0.then(B=>B.createCaptureWorker(v,D,e,j,i.DefaultRefreshRate))}async function T0(v){return O0.then(D=>D.createPlaybackWorker(v,i.DefaultRefreshRate))}var w=class{constructor(D,e){this.controller=D;this._Medias=new Map;this._Vad={...dF};this._Apm={...kF};this._Volume=1;this._Queue=Promise.resolve();this._DeviceCb=()=>{this._enqueue(async()=>{!this._DeviceParameters?.device||(await nx()).some(B=>B.device.deviceId===this._DeviceParameters?.device?.device.deviceId)||this._Capture?.source.mediaStream?.getAudioTracks()[0]?.readyState==="live"||(this._DeviceParameters?.onStatusChanged?.("stopped"),navigator.mediaDevices.removeEventListener("devicechange",this._DeviceCb),this._DeviceParameters=void 0,await this._closeImpl())}).catch(D=>k("device-change handler failed",D))};e.apm&&this.setApm(e.apm).catch(console.error),e.vad&&this.setVad(e.vad),typeof e.volume<"u"&&this.setVolume(e.volume).catch(console.error),this.uid=cF(),this.#x=e.customType,this.#A=e.ref}#x;#A;_enqueue(D){let e=this._Queue.then(D,D);return this._Queue=e.catch(()=>{}),e}get vad(){return this._Vad}get apm(){return this._Apm}get volume(){return this._Volume}get activity(){return this._Capture?.worker.activity??_}get speechProbability(){return this._Capture?.worker.speechProbability??0}get deviceId(){return this._DeviceParameters?.device?.device.deviceId}async start(D,e){let j=this._Medias.get(e.connectionId);j===void 0&&this._Medias.set(e.connectionId,j=new Set),o(`starting audio capture media ${e.mediaId} on connection ${e.connectionId}`),!j.has(e.mediaId)&&(j.add(e.mediaId),D.mainConnection?.id===e.connectionId&&await D.request("StartMedia",{media_id:e.mediaId,properties:{kind:"audio",uid:this.uid,ref:this.#A,customType:this.#x}}).catch(B=>p(`StartMedia got rejected; ${B}`)),this._UpdateMedias())}async stop(D,e){let j=this._Medias.get(e.connectionId);o(`stopping audio capture media ${e.mediaId} on connection ${e.connectionId}`),j?.delete(e.mediaId)&&(D.mainConnection?.id===e.connectionId&&await D.request("StopMedia",{media_id:e.mediaId}).catch(B=>p(`StopMedia got rejected; ${B}`)),this._UpdateMedias())}setVad(D){a("updating vad config",D),this._Vad=D,this._Capture&&this._Capture.worker.setVad(D)}async setApm(D){await this._enqueue(()=>this._setApmImpl(D))}async _setApmImpl(D){a("updating apm config",D),this._Apm=D,this._DeviceParameters&&await this._setDeviceImpl(this._DeviceParameters)}async setDevice(D){await this._enqueue(()=>this._setDeviceImpl(D))}async _setDeviceImpl(D){a("updating capture device parameters",D);let e=this._DeviceParameters;if(this._DeviceParameters=D,this._Volume!=="muted")try{let j=await g0(this.controller,D,{...this._Apm,echoCanceller:this._Monitor?!1:this._Apm.echoCanceller});if(j.type!=="Success"){p(`unable to open capture device; ${j.reason}`),this._DeviceParameters=e;return}if(this._DeviceParameters.onStatusChanged&&navigator.mediaDevices.addEventListener("devicechange",this._DeviceCb),this._Capture!==void 0){W(this._Capture.source.mediaStream);try{this._Capture.source.disconnect(this._Capture.worker.worklet)}catch(B){k("failed to disconnect previous capture source",B)}}this._Capture===void 0||this._Capture.worker.worklet.context!==j.value.context?(this._Capture?.worker.close(),this._Capture={worker:await M0(j.value.context,this.controller.sink,this.controller.receiveMonitoredPacket.bind(this.controller),new WeakRef(this)),source:j.value},await this._UpdateMedias(),this._Capture.worker.setVolume(this._Volume),this.setVad(this.vad)):this._Capture.source=j.value,this._Capture.source.connect(this._Capture.worker.worklet)}catch(j){throw new Error(`Error in setDevice(); ${j}`)}}async setVolume(D){await this._enqueue(()=>this._setVolumeImpl(D))}async _setVolumeImpl(D){a(`updating capture volume to ${D}`),this._Volume=D,D==="muted"?await this._closeImpl():(!this._Capture&&this._DeviceParameters&&await this._setDeviceImpl(this._DeviceParameters),this._Capture?.worker.setVolume(D))}async close(){await this._enqueue(()=>this._closeImpl())}async _closeImpl(){if(a("closing audio capture"),this._Capture!==void 0){this._Capture.worker.close(),W(this._Capture.source.mediaStream);try{this._Capture.source.disconnect(this._Capture.worker.worklet)}catch(D){k("failed to disconnect audio node",D)}await this.controller.audioContexts.release(this._Capture.source.context)}navigator.mediaDevices.removeEventListener("devicechange",this._DeviceCb),this._Capture=void 0}async dump(){let D=[];for(let[e,j]of this._Medias)D.push(`${e} => ${Array.from(j.values()).join(",")}`);return{uid:this.uid,ref:this.#A??null,customType:this.#x??null,worker:await this._Capture?.worker.dump()??null,vad:this._Vad,apm:this._Apm,volume:this._Volume,medias:D}}async _UpdateMedias(){if(this._Capture!==void 0){let D=Array.from(this._Medias).map(([e,j])=>({id:e,mediaIds:Array.from(j)}));this._Capture.worker.setMedias(D)}}async startLoopback(){this._Monitor===void 0&&(a("starting audio capture loopback"),this.setApm(this._Apm),this._Monitor=await this.controller.createAudioPlayback({uid:"loopback"}),this._Monitor.start({connectionId:0,mediaId:0}),this._Medias.set(0,new Set([0])),await this._UpdateMedias())}async stopLoopback(){this._Monitor!==void 0&&(a("stopping audio capture loopback"),this._Monitor.close(),this._Monitor=void 0,this.setApm(this._Apm),this._Medias.delete(0),await this._UpdateMedias())}};import{assert as ox,Backend as t,generateUUID as pF}from"@4players/odin-common";u();var $=class{constructor(D,e){this.controller=D;this.parameters=e;this.uid=pF()}#x;#A=new Map;#F;get customType(){return this.parameters?.customType}get mediaStream(){return this.#x}get audioCapture(){return this.#F}get volume(){return ox(this.audioCapture,"getting the volume failed, this video has no Audio"),this.audioCapture.volume}async setVolume(D){ox(this.audioCapture,"setVolume() failed, this video has no Audio"),await this.audioCapture.setVolume(D)}get vad(){return ox(this.audioCapture,"getting the vad config failed, this video has no Audio"),this.audioCapture.vad}setVad(D){ox(this.audioCapture,"setVad() failed, this video has no Audio"),this.audioCapture.setVad(D)}async setDevice(D,e={voiceActivity:void 0,volumeGate:void 0}){if(this.#x)throw new Error("This VideoCapture already has a MediaStream.");if(!D.getVideoTracks()[0])throw new Error("Error when calling setDevice(), MediaStream does not contain a VideoStreamTrack!");if(this.#x=D,D.getAudioTracks()[0]){let B={device:await $0(D.getAudioTracks()[0]),vad:e,ref:this.uid};this.#F=await this.controller.createAudioCapture(B)}}async start(D,e){let j=this.#A.get(e.connectionId);if(j===void 0&&this.#A.set(e.connectionId,j=new Set),!j.has(e.mediaId)&&(j.add(e.mediaId),D.mainConnection?.id===e.connectionId)){let B={kind:"video",codec:this.parameters?.codec??i.DefaultVideoCodec,ref:this.#F?.uid,uid:this.uid};this.parameters?.customType&&(B.customType=this.parameters.customType),await D.request("StartMedia",{media_id:e.mediaId,properties:B}).catch(C=>p(`StartMedia got rejected; ${C}`))}}async stop(D,e){this.#x&&W(this.#x),this.#A.get(e.connectionId)?.delete(e.mediaId)&&D.mainConnection?.id===e.connectionId&&await D.request("StopMedia",{media_id:e.mediaId}).catch(B=>p(`StopMedia got rejected; ${B}`))}async dump(){let D=[];for(let[e,j]of this.#A)D.push(`${e} => ${Array.from(j.values()).join(",")}`);return{uid:this.uid,ref:this.#F?.uid??null,customType:this.customType??null,tracks:this.#x?.getVideoTracks().map(e=>({id:e.id,kind:e.kind,label:e.label,ready:e.readyState,muted:e.muted,settings:{...e.getSettings()}}))??[],volume:this.#F?.volume??0,medias:D}}close(){this.#x&&W(this.#x),this.audioCapture?.close(),this.#F=void 0}};u();import{Backend as MB}from"@4players/odin-common";var H=class{constructor(D,e,j){this.controller=D;this.uid=e;this.customType=j}get volume(){return this.controller.playbackGetVolume(this.uid)}get activity(){return this.controller.playbackGetActivity(this.uid)}get jitterStats(){return this.controller.playbackGetJitterStats(this.uid)}start(D){o(`starting audio playback media ${D.mediaId} on connection ${D.connectionId}`),this.controller.playbackStart(this.uid,D)}stop(D){o(`stopping audio playback media ${D.mediaId} on connection ${D.connectionId}`),this.controller.playbackStop(this.uid,D)}setVolume(D){a(`updating audio playback media '${this.uid}' volume to ${D}`),this.controller.playbackSetVolume(this.uid,D)}close(){a(`closing audio playback media '${this.uid}'`),this.controller.closePlayback(this.uid)}};function mF(v,D){let e=v.audioContext;if(typeof e.setSinkId=="function"){v.connectOutput(e.destination);let j,B=()=>{if(e.state==="running"&&j!==void 0){let C=j;j=void 0,e.setSinkId(C).catch(E=>k("failed to apply deferred sinkId",E))}};return e.addEventListener("statechange",B),{async setSinkId(C){if(e.state!=="running"){j=C;return}await e.setSinkId(C)},dispose(){e.removeEventListener("statechange",B)}}}if(D&&typeof document<"u"&&typeof HTMLAudioElement<"u"&&typeof HTMLAudioElement.prototype.setSinkId=="function"){let j=e.createMediaStreamDestination();v.connectOutput(j);let B=new Audio;B.srcObject=j.stream,B.muted=!1,B.volume=1;let C=!1,E=!1,f={once:!0,passive:!0,capture:!0},s=()=>{E=!1,h()},b=()=>{E||C||(E=!0,document.addEventListener("pointerdown",s,f),document.addEventListener("keydown",s,f))},d=()=>{E&&(E=!1,document.removeEventListener("pointerdown",s,!0),document.removeEventListener("keydown",s,!0))},h=()=>{C||B.play().catch(tx=>{C||(tx instanceof DOMException&&tx.name==="NotAllowedError"?b():k("failed to start playback audio element",tx))})},vx=()=>{e.state==="running"&&B.paused&&h()};return e.addEventListener("statechange",vx),h(),{async setSinkId(tx){await B.setSinkId(tx)},dispose(){C=!0,d(),e.removeEventListener("statechange",vx),B.pause(),B.srcObject=null,B.removeAttribute("src");try{B.load()}catch{}j.disconnect()}}}return v.connectOutput(e.destination),{async setSinkId(){},dispose(){}}}var ax=class{constructor(D){this.audioContextFactory=D;this.entries=[]}async acquire(D){for(let j of this.entries){if(j.sampleRate===D)return j.references+=1,j.audioContext;if(j.sampleRate===void 0&&j.audioContext.sampleRate===D)return j.references+=1,j.audioContext}let e={sampleRate:D,audioContext:await this.audioContextFactory(D),references:1};return this.entries.push(e),e.audioContext}async release(D){let e=this.entries.findIndex(j=>j.audioContext===D);if(!(e<0)&&(this.entries[e].references-=1,this.entries[e].references<=0)){let j=this.entries[e].audioContext;this.entries.splice(e,1),await j.close()}}close(){for(let D of this.entries)D.audioContext.close()}},lx=class v{constructor(D,e,j=!1){this.audioContexts=D;this.sink=e;this.enableHTMLAudioElementFallback=j;this.audioCaptures=[];this.videoCaptures=[];this.globalVolume=[1,1];this.playbacks=new Map;this.setPlaybackStrand=new hF}async create(D,e){return new v(D,e)}receivePacket(D,e){this.playbackWorker?.receivePacket(D,e)}receiveMonitoredPacket(D,e){let j=e.slice();this.receivePacket(D,j)}async createAudioPlayback(D){let e=this.playbacks.get(D.uid),j=D.volume;if(e===void 0){j=j??[1,1];let B=new H(this,D.uid,D.customType);e={id:void 0,volume:j,playback:B},this.playbacks.set(D.uid,e)}return j!==void 0&&e.playback.setVolume(j),e.playback}async createAudioCapture(D){let e=new w(this,D);return await e.setDevice(D),this.audioCaptures.push(new WeakRef(e)),e}async createVideoCapture(D,e){let j=new $(this,e);return await j.setDevice(D),this.videoCaptures.push(new WeakRef(j)),j}playbackSetDevice(D){return this.setPlaybackStrand.enqueue(async()=>{let e=D?.device.deviceId??"";if(e==="default"&&(e=""),this.playbackWorker===void 0){let j=await this.audioContexts.acquire(48e3);this.playbackWorker=await T0(j),this.playbackSink=mF(this.playbackWorker,this.enableHTMLAudioElementFallback),this.playbackWorker.setGlobalVolume(this.globalVolume);for(let[,B]of this.playbacks)B.id!==void 0&&this.playbackWorker.addMedias(B.id.connectionId,[B.id.mediaId],B.volume)}if(D&&this.playbackSink!==void 0)try{await this.playbackSink.setSinkId(e)}catch(j){k("failed to set playback sink",j)}})}playbackSetGlobalVolume(D){this.globalVolume=D,this.playbackWorker?.setGlobalVolume(this.globalVolume)}playbackStart(D,e){let j=this.playbacks.get(D);j!==void 0&&(j.id!==void 0&&this.playbackStop(D,j.id),j.id=e,this.playbackWorker?.addMedias(e.connectionId,[e.mediaId],j.volume))}playbackStop(D,e){let j=this.playbacks.get(D);j!==void 0&&(j.id!==e&&k(`playback media ${e.mediaId} on connection ${e.connectionId} is out of sync`,j.id,e),j.id=void 0,this.playbackWorker?.removeMedias(e.connectionId,[e.mediaId]))}playbackGetActivity(D){let e=this.playbacks.get(D);return e?.id===void 0?_:this.playbackWorker?.getActivity(e.id)??_}playbackGetJitterStats(D){let e=this.playbacks.get(D);return e?.id===void 0?S0:this.playbackWorker?.getJitterStats(e.id)??S0}playbackSetVolume(D,e){let j=this.playbacks.get(D);j!==void 0&&(j.volume=e,j.id!==void 0&&this.playbackWorker?.setVolume(j.id,j.volume))}playbackGetVolume(D){return this.playbacks.get(D)?.volume??[1,1]}closePlayback(D){let e=this.playbacks.get(D);e!==void 0&&(e.id!==void 0&&this.playbackStop(D,e.id),this.playbacks.delete(D))}close(){this.playbackSink?.dispose(),this.playbackSink=void 0,this.playbackWorker?.close(),this.audioContexts.close()}async dump(){let D=[];for(let B of this.audioCaptures){let C=B.deref();C!==void 0&&D.push(await C.dump())}let e=[];for(let B of this.videoCaptures){let C=B.deref();C!==void 0&&e.push(await C.dump())}let j=[];for(let[B,C]of this.playbacks)j.push({uid:B,id:C.id||null,volume:C.volume});return{globalVolume:this.globalVolume,playbackWorker:await this.playbackWorker?.dump()||null,audioCaptures:D,videoCaptures:e,playbacks:j}}},L=class{constructor(D,e=!1){this.device=D;this.isDefault=e}get type(){switch(this.device.kind){case"audioinput":return"AudioCapture";case"audiooutput":return"AudioPlayback";default:qF(!1,"not supported device")}}get id(){return this.device.deviceId}get name(){return this.device.name}};u();import{nextTick as er,success as BA}from"@4players/odin-common";import{decode as jr}from"@msgpack/msgpack";u();import{Backend as TB}from"@4players/odin-common";import{Backend as A,failure as px,success as xA,CONNECTION_STATS_INITIAL as WF}from"@4players/odin-common";import{RoomCommandsRpc as QF,RoomNotificationsRpc as zF}from"@4players/odin-common/api";import{MainCommandsRpc as R0,MainNotificationsRpc as GF,MediaIdSchema as IF}from"@4players/odin-common/api";import{array as gF,discriminatedUnion as $F,enum as yF,literal as r0,number as V0,object as t0,string as Dx,tuple as _F,union as LF,null as HF}from"@4players/odin-common/zod";var U0=$F("kind",[t0({kind:r0("Sdp"),type:yF(["Answer","Offer"]),sdp:Dx(),media_map:gF(_F([IF,Dx()])),negotiation_id:V0().optional()}),t0({kind:r0("Trickle"),candidate:Dx(),spd_mid:Dx().optional(),spd_mline_index:V0().optional(),username_fragment:LF([Dx(),HF()]).optional()}),t0({kind:r0("TrickleFinished")})]),ux={...R0,WebRtcUpdate:{request:U0,response:R0.WebRtcUpdate.response}},kx={...GF,WebRtcUpdate:U0};u();u();import{failure as D0,success as e0}from"@4players/odin-common";import{MessagePackRpcSchema as NF,parseRequest as W0,parseResponse as wF}from"@4players/odin-common/api";import{encode as PF,decode as KF}from"@msgpack/msgpack";var M=class{constructor(D){this.stream=D;this._SendQueue=[];this._RecvQueue=[];this._EventQueue=[];this._Requests=new Map;this._Close=new AbortController;this._NextId=1;D instanceof WebSocket?(D.addEventListener("open",this._OnWebSocketOpen.bind(this)),D.addEventListener("close",this.close.bind(this)),D.addEventListener("message",e=>this._OnRpcMessage(e.data)),D.binaryType="arraybuffer"):(OF(D.readable.getReader(),this._OnRpcMessage.bind(this)).finally(this.close.bind(this)),this._Writer=D.writable.getWriter()),this._Close.signal.addEventListener("abort",this._Cleanup.bind(this),{once:!0})}get closed(){return this._Close.signal.aborted}get closeSignal(){return this._Close.signal}async request(D,e,j){if(this.closed)return Promise.resolve("closed");let B=this._NextId,C=j===void 0?void 0:setTimeout(()=>this._TimeoutRequest(B),j);return this._Send([0,B,D,e]),new Promise(E=>{this._Requests.set(B,{accept:E,timeoutId:C}),this._NextId+=1})}notify(D,e){this.closed||this._Send([2,D,e])}recv(){if(this.closed)return Promise.resolve("closed");let D=this._EventQueue.shift();return D!==void 0?Promise.resolve(D):new Promise(e=>this._RecvQueue.push(e))}close(){this._Close.abort()}_TimeoutRequest(D){let e=this._Requests.get(D);e!==void 0&&(this._Requests.delete(D),clearTimeout(e.timeoutId),e.accept("timeout"))}_Send(D){let e;D instanceof Uint8Array?e=D:e=new Uint8Array(PF(D,{ignoreUndefined:!0,forceFloat32:!0})),this.stream instanceof WebSocket?this.stream.send(e):this._Writer.write(e)}_OnWebSocketOpen(D){for(let e of this._SendQueue)this._Send(e);this._SendQueue.length=0}_OnRpcMessage(D){let e=JF(D);if(e.type!=="Success"){this.close();return}switch(e.value[0]){case 0:this._Send([1,e.value[1],"not supported",null]);break;case 1:this._OnResponse(e.value[1],e.value[2],e.value[3]);break;case 2:this._OnEvent(e.value[1],e.value[2]);break}}_OnResponse(D,e,j){let B=this._Requests.get(D);B!==void 0&&(clearTimeout(B.timeoutId),B.accept(e===null?e0(j):D0(e)))}_OnEvent(D,e){let j=this._RecvQueue.shift();j!==void 0?j({name:D,properties:e}):this._EventQueue.push({name:D,properties:e})}_Cleanup(){for(let D of this._Requests.values())clearTimeout(D.timeoutId),D.accept("closed");this._Requests.clear();for(let D of this._RecvQueue)D("closed");this._RecvQueue.length=0,this._SendQueue.length=0,this.stream instanceof WebSocket?this.stream.close():this._Writer?.close().catch(()=>{})}},V=class{constructor(D,e,j){this.rpc=D;this._Commands=e;this._Events=j}get closed(){return this.rpc.closed}get closeSignal(){return this.rpc.closeSignal}async request(D,e,j){e=W0(D,e,this._Commands);let B=await this.rpc.request(D,e,j);if(B==="closed"||B==="timeout"||B.type==="Failure")return B;let C=wF(D,B.value,this._Commands);return C!==void 0?e0(C):D0("response schema failed validation")}notify(D,e){e=W0(D,e,this._Commands),this.rpc.notify(D,e)}async recv(){let D=await this.rpc.recv();if(D==="closed")return D;let e=j0(this._Events,D);return e!==void 0?e:(Q0(this._Events,D.name)?(p(`schema validation for ${D.name} failed; closing connection`),this.rpc.close()):k(`dropping unknown event ${D.name}`),"closed")}close(){this.rpc.close()}};function JF(v){try{return e0(NF.parse(KF(new Uint8Array(v))))}catch(D){return D0(String(D))}}function j0(v,D){if(!Q0(v,D.name))return;let e=v[D.name].safeParse(D.properties);if(e.success)return{name:D.name,properties:e.data}}function Q0(v,D){return D in v}async function OF(v,D){let e=new Uint8Array;for(;;){let j=d0(e,0);if(j===n){v.cancel("protocol violation");break}if(j!==I&&j<=e.length){D(e.subarray(0,j)),e=e.subarray(j);continue}let B;try{B=await v.read()}catch{break}if(B.done)break;e=MF(e,B.value)}e.length>0&&k("unprocessed bytes left in rpc stream",e)}function MF(v,D){if(v.length===0)return D;if(D.length===0)return v;let e=new Uint8Array(v.length+D.length);return e.set(v,0),e.set(D,v.length),e}u();import{failure as cx,fromBase64Url as TF,success as SF}from"@4players/odin-common";import{TokenClaimsSchema as RF}from"@4players/odin-common/api";var y=class v{constructor(D,e){this.text=D;this.claims=e;if(e.ups!==void 0){let j=v.parse(e.ups);j.type==="Success"?this._Upstream=j.value:p(`upstream in token can not be parsed; ${j.reason}`)}}static parse(D){let e=D.split(".");if(e.length!==3)return cx("expected three segments");let j=TF(e[1]);if(j.type==="Failure")return cx(`invalid token; ${j.reason}`);let B;try{B=JSON.parse(j.value)}catch(E){return cx(`invalid token; ${E}`)}let C=RF.safeParse(B);return C.success===!1?cx(`invalid token; ${C.error}`):SF(new v(D,C.data))}get timeLeft(){return this.claims.exp===void 0?1/0:this.claims.exp*1e3-Date.now()}get upstream(){return this._Upstream}get defaultRoomId(){return Array.isArray(this.claims.rid)?this.claims.rid.length===1?this.claims.rid[0]:void 0:this.claims.rid}hasAudience(D){return this.claims.aud===void 0&&D==="gateway"?!0:Array.isArray(this.claims.aud)?this.claims.aud.includes(D):this.claims.aud===D}toString(){return this.text}};u();import{VideoCodec as VF,assert as z0}from"@4players/odin-common";function X0(v){typeof globalThis.rtcDataChannels>"u"&&(globalThis.rtcDataChannels=[]),Array.isArray(globalThis.rtcDataChannels)&&globalThis.rtcDataChannels.length<=100&&globalThis.rtcDataChannels.push(v)}function Z0(v){let D=globalThis.rtcDataChannels?.indexOf(v);D!==void 0&&D>=0&&globalThis.rtcDataChannels.splice(D,1),v.readyState!=="closed"&&v.close()}function dx(v){typeof globalThis.rtcPeerConnections>"u"&&(globalThis.rtcPeerConnections=[]),Array.isArray(globalThis.rtcPeerConnections)&&globalThis.rtcPeerConnections.length<=100&&globalThis.rtcPeerConnections.push(v)}function Y0(v){let D=globalThis.rtcPeerConnections?.indexOf(v);D!==void 0&&D>=0&&globalThis.rtcPeerConnections.splice(D,1),v.connectionState!=="closed"&&v.close()}var xx=class{constructor(D,e,j){this._localVideos=new Map;this._remoteVideos=new Map;this._freeLocalVideoTransceivers=[];this._negotiationRequested=!1;this._negotiationRunning=!1;this._negotiationCounter=0;this._pendingRemoteCandidates=[];this._WebRtcStatsSnapshot=null;this._peerConnection=D,this._signaling=e,this._answerTimeout=j?.answerTimeout??i.WebRtcAnswerTimeout,this._maxNegotiationAttempts=j?.maxNegotiationAttempts??i.WebRtcMaxNegotiationAttempts,this._peerConnection.ontrack=this._onTrack.bind(this),this._peerConnection.onconnectionstatechange=()=>this._onStatusChanged(),this._peerConnection.onicecandidate=B=>{(B.candidate?this._signaling.sendIceCandidate(B.candidate):this._signaling.sendIceComplete()).catch(E=>{k("failed to send local ice candidate",E)})},this._WebRtcStatsInterval=setInterval(()=>{this._snapshotStats()},i.WebRtcStatsSnapshotInterval)}requestNegotiation(){this._negotiationRequested=!0,!this._negotiationRunning&&(this._negotiationRunning=!0,setTimeout(async()=>{let D=0;for(;this._negotiationRequested;){this._negotiationRequested=!1;try{await this._negotiate(),D=0}catch(e){if(D+=1,p(`negotiation failed during sdp offer/answer exchange (attempt ${D})`,e),D<this._maxNegotiationAttempts)this._negotiationRequested=!0;else{this._negotiationRunning=!1,this._signaling.closeConnection().catch(()=>{});return}}}this._negotiationRunning=!1}))}async startLocalVideo(D,e,j){if(this._localVideos.has(D))return;o(`starting local video for media ${D}`);let B=this._freeLocalVideoTransceivers.pop();if(B?(await B.sender.replaceTrack(e),B.direction="sendrecv"):B=this._peerConnection.addTransceiver(e),j){let f=B.sender.getParameters(),{maxBitrate:s,maxFramerate:b,scaleResolutionDownBy:d}=j,h={...s!==void 0&&{maxBitrate:s},...b!==void 0&&{maxFramerate:b},...d!==void 0&&{scaleResolutionDownBy:d}};if(f.encodings.length===0)f.encodings.push(h);else for(let vx of f.encodings)Object.assign(vx,h);j.degradationPreference&&(f.degradationPreference=j.degradationPreference),await B.sender.setParameters(f)}let E=new VF(j?.codec??i.DefaultVideoCodec).isSupported();E&&B.setCodecPreferences([E]),this._localVideos.set(D,{transceiver:B}),this.requestNegotiation()}stopLocalVideo(D){let e=this._localVideos.get(D);e&&(o(`stopping local video for media ${D}`),this._localVideos.delete(D),e.transceiver.sender.track&&(e.transceiver.sender.track.enabled=!1),e.transceiver.direction="inactive",e.transceiver.sender.replaceTrack(null).catch(()=>{}),this._freeLocalVideoTransceivers.push(e.transceiver),this.requestNegotiation())}startRemoteVideo(D){o(`starting remote video for media ${D}`);let e=this._peerConnection.addTransceiver("video",{direction:"recvonly"}),j=new Promise((B,C)=>{this._remoteVideos.set(D,{state:"Requested",transceiver:e,promise:{resolve:B,reject:C}})});return this.requestNegotiation(),j}stopRemoteVideo(D){let e=this._remoteVideos.get(D);if(e){o(`stopping remote video for media ${D}`),this._remoteVideos.delete(D),e.state!=="Active"&&e.promise.reject(new Error("video stopped"));try{e.transceiver.stop()}catch{}this.requestNegotiation()}}async handleWebRtcUpdate(D){try{switch(D.kind){case"Sdp":await this._updateRemoteSdp(D.type==="Answer"?"answer":"offer",D.sdp,D.media_map,D.negotiation_id);break;case"Trickle":this._addIceCandidate({candidate:D.candidate,sdpMid:D.spd_mid??void 0,sdpMLineIndex:D.spd_mline_index??void 0,usernameFragment:D.username_fragment??void 0});break;case"TrickleFinished":this._addIceCandidate(void 0);break}}catch(e){p("failed to handle webrtc update",e,D)}}startup(){this._peerConnection.connectionState==="new"&&this.requestNegotiation()}cleanup(){for(let[,D]of this._remoteVideos)D.state!=="Active"&&D.promise.reject(new Error("connection closed"));this._pendingAnswer?.reject(new Error("connection closed")),this._pendingRemoteCandidates.length=0,clearTimeout(this._WebRtcIceTimeout),clearTimeout(this._WebRtcTimeout),clearInterval(this._WebRtcStatsInterval),this._localVideos.clear(),this._remoteVideos.clear(),this._freeLocalVideoTransceivers.length=0}get stats(){return this._WebRtcStatsSnapshot}get peerConnection(){return this._peerConnection}get localVideos(){return this._localVideos}get remoteVideos(){return this._remoteVideos}get isConnected(){return this._peerConnection.connectionState==="connected"}get isNegotiating(){return this._negotiationRunning}async _snapshotStats(){try{let D=await this._peerConnection.getStats(),e={},j={bytesSent:0,bytesReceived:0,packetsSent:0,packetsReceived:0,rtt:0};D.forEach(B=>{let{type:C,...E}=B;C!=="certificate"&&(C==="candidate-pair"&&B.nominated&&(j.bytesSent+=B.bytesSent??0,j.bytesReceived+=B.bytesReceived??0,j.packetsSent+=B.packetsSent??0,j.packetsReceived+=B.packetsReceived??0,j.rtt=B.currentRoundTripTime??0),e[C]||(e[C]=[]),e[C].push(E))}),this._WebRtcStatsSnapshot={timestamp:Date.now(),status:this._peerConnection.connectionState,stats:j,report:e}}catch{}}_addIceCandidate(D){if(D&&(D.sdpMid===void 0&&D.sdpMLineIndex===void 0&&(D={...D,sdpMid:"0"}),a(`adding new ice ${D.candidate}`,D)),this._peerConnection.remoteDescription===null){this._pendingRemoteCandidates.push(D);return}this._applyIceCandidate(D)}_applyIceCandidate(D){this._peerConnection.addIceCandidate(D).catch(e=>{k("failed to add remote ice candidate",e,D)})}_flushPendingIceCandidates(){let D=this._pendingRemoteCandidates.splice(0);for(let e of D)this._applyIceCandidate(e)}async _negotiate(){let D=++this._negotiationCounter,e=await this._peerConnection.createOffer();z0(e.type==="offer"&&e.sdp,"generated broken payload"),await this._peerConnection.setLocalDescription(e);let j=[];for(let[C,{transceiver:E}]of this._localVideos)E.mid&&j.push([C,E.mid]);for(let[C,E]of this._remoteVideos)E.state!=="Active"&&E.transceiver.mid&&j.push([C,E.transceiver.mid]);let B=new Promise((C,E)=>{this._pendingAnswer={negotiationId:D,resolve:C,reject:E}});try{await this._signaling.sendOffer(e.sdp,j,D),await UF(B,this._answerTimeout,`timed out waiting for answer to offer ${D}`)}finally{this._pendingAnswer=void 0}}async _updateRemoteSdp(D,e,j,B){if(D==="offer"){k("ignoring unexpected sdp offer from server");return}let C=this._pendingAnswer;if(C===void 0){k("ignoring sdp answer without pending negotiation");return}if(B!==void 0&&B!==C.negotiationId){k(`ignoring stale sdp answer for negotiation ${B}; current is ${C.negotiationId}`);return}if(this._peerConnection.signalingState!=="have-local-offer"){k(`ignoring sdp answer in signaling state ${this._peerConnection.signalingState}`);return}for(let[E,f]of j){let s=this._remoteVideos.get(E);s?.state==="Requested"&&(this._remoteVideos.set(E,{state:"Mapped",transceiver:s.transceiver,mid:f,promise:s.promise}),a(`updated remote video list with media ${E}`,s,this._remoteVideos))}try{await this._peerConnection.setRemoteDescription({type:D,sdp:e})}catch(E){C.reject(E);return}this._flushPendingIceCandidates(),C.resolve()}async _onStatusChanged(){switch(a(`peer connection state changed to ${this._peerConnection.connectionState}`),this._peerConnection.connectionState){case"closed":break;case"connected":clearTimeout(this._WebRtcIceTimeout),this._WebRtcIceTimeout=void 0,clearTimeout(this._WebRtcTimeout),this._WebRtcTimeout=void 0;break;case"failed":this._peerConnection.restartIce(),this.requestNegotiation();case"disconnected":i.MainConnectionPingInterval!==void 0&&await this._signaling.checkConnection();default:this._WebRtcIceTimeout===void 0&&(this._WebRtcIceTimeout=setTimeout(()=>{a("ice connection timeout was reached"),this._peerConnection.restartIce(),this._WebRtcIceTimeout=void 0},i.WebRtcIceTimeout)),this._WebRtcTimeout===void 0&&(this._WebRtcTimeout=setTimeout(async()=>{a("peer connection timeout was reached"),await this._signaling.closeConnection()},i.WebRtcTimeout));break}}_onTrack(D){let e=Array.from(this._remoteVideos).find(([,C])=>C.state==="Mapped"&&C.mid===D.transceiver.mid);if(!e){k(`unexpected track with mid: ${D.transceiver.mid}`);return}let[j,B]=e;z0(B.state==="Mapped","expected video state to be Mapped"),this._remoteVideos.set(j,{state:"Active",transceiver:D.transceiver}),a(`updated local video list with media ${j}`,e,D.transceiver,this._localVideos),D.track.onended=()=>{a(`video track with mid ${D.transceiver.mid} ended`,e)},B.promise.resolve(D.track)}};function UF(v,D,e){return new Promise((j,B)=>{let C=setTimeout(()=>B(new Error(e)),D);v.then(E=>{clearTimeout(C),j(E)},E=>{clearTimeout(C),B(E)})})}var hx=class v{constructor(D,e,j,B,C,E,f){this.id=D;this.address=e;this.connection=B;this.datagramWritable=C;this.rpc=E;this.closeController=f;this._ConnectionStats={...WF};this._WebRtcSessionFlight=new S;this._PingFlight=new S;this.status=0;this._ClosePromise=(async()=>{try{await this.connection.closed}catch{}return"closed"})(),i.MainConnectionPingInterval!==void 0&&(this._PingIntervalId=setInterval(async()=>{this.connectionStats.rtt=await this.ping(i.HealthCheckTimeout)},i.MainConnectionPingInterval)),f.signal.addEventListener("abort",()=>this._CleanUp(),{once:!0}),this.datagramWriter=C.getWriter(),this.connection.closed.then(()=>{this.status=2}).catch(()=>{}),this.connection.ready.then(()=>{this.status=1}).catch(()=>{}),this.readDatagrams(this.connection,this.id,(s,b)=>{this._ConnectionStats.packetsReceived+=1,j(s,b)})}static async create(D,e,j,B){try{let C=new URL(`https://${e}?version=${h0}&uid=${qx}`),E=new AbortController;B.addEventListener("abort",()=>E.abort(),{once:!0});let f=new WebTransport(C);E.signal.addEventListener("abort",()=>{try{f.close()}catch{}},{once:!0}),await f.ready;let s=f.datagrams,b=s?.createWritable?.()??s?.writable;if(!b)return E.abort(),px(`connecting to ${e} failed because WebTransport datagrams are not supported by this browser`);let d=await f.createBidirectionalStream(),h=new V(new M(d),ux,kx);return E.signal.addEventListener("abort",()=>h.close(),{once:!0}),h.notify("Hello",{stream:"main"}),xA(new v(D,e,j,f,b,h,E))}catch(C){return px(`connecting to ${e} failed with ${C}`)}}get connectionStats(){return this._ConnectionStats}get transport(){return"H3"}get closePromise(){return this._ClosePromise}get closeSignal(){return this.closeController.signal}get closed(){return this.closeSignal.aborted}waitForConnected(){return Promise.race([this.connection.ready,this.connection.closed.then(()=>{throw new Error("connection closed")})])}close(){o(`closing connection to '${this.address}' with id ${this.id}`),this.closeController.abort("request")}async joinRoom(D,e,j,B){try{if(this.closed)return"closed";let C=await this.connection.createBidirectionalStream().catch(()=>"closed");if(C==="closed")return"closed";let E=new V(new M(C),QF,zF),f=await E.request("Hello",{stream:"room",token:String(D),room_id:e,user_data:j,position:B});return f==="closed"||f.type==="Failure"?f:xA(E.rpc)}catch(C){return px(`JoinRoom failed; ${C}`)}}async getReconnectToken(D){let e=await this._Request("RequestReconnectToken",{peer_id:D});return e.type==="Failure"?e:y.parse(e.value)}async healthCheck(){let D=await this._RequestPing(i.HealthCheckTimeout);return D||this.close(),D}async ping(D=3e4){let e=Date.now();return await this._RequestPing(D)?Date.now()-e:0}sendDatagram(D){try{this.datagramWriter.write(D),this._ConnectionStats.packetsSent+=1;let e=D.byteLength;this.connectionStats.bytesSent+=e}catch{}}async readDatagrams(D,e,j){try{let B=D.datagrams.readable.getReader();for(;;){let C=await B.read();if(C.done)break;let E=C.value.byteLength;this.connectionStats.bytesReceived+=E,j(e,C.value)}}catch{}}_CleanUp(){a(`performing cleanup for connection ${this.id}`),clearInterval(this._PingIntervalId)}async _EnsureWebRtcSession(){return this._WebRtcSession?this._WebRtcSession:this._WebRtcSessionFlight.run(async()=>(this._PeerConnection=new RTCPeerConnection,dx(this._PeerConnection),this._WebRtcSession=new xx(this._PeerConnection,{sendOffer:async(D,e,j)=>{let B=await this._Request("WebRtcUpdate",{kind:"Sdp",type:"Offer",sdp:D,media_map:e,negotiation_id:j});if(B.type==="Failure")throw new Error(`failed to send sdp offer; ${B.reason}`)},sendIceCandidate:async D=>{await this._Request("WebRtcUpdate",{kind:"Trickle",candidate:D.candidate,spd_mid:D.sdpMid??void 0,spd_mline_index:D.sdpMLineIndex??void 0,username_fragment:D.usernameFragment??void 0})},sendIceComplete:async()=>{await this._Request("WebRtcUpdate",{kind:"TrickleFinished"})},closeConnection:async()=>{this._PeerConnection?.restartIce(),this._WebRtcSession?.requestNegotiation()},checkConnection:async()=>{}}),this._HandleWebRtcUpdates(),this._WebRtcSession))}async _HandleWebRtcUpdates(){for(;;){let D=await this.rpc.recv();if(D==="closed")break;D.name==="WebRtcUpdate"&&this._WebRtcSession?.handleWebRtcUpdate(D.properties)}this.close()}async _Request(D,e,j){let B=Date.now(),C=await(j===void 0?this.rpc.request(D,e):this.rpc.request(D,e,j)),E=(Date.now()-B)/1e3;return D!=="Ping"&&a(`sent main rpc '${D}'; took: ${E}s`,{properties:e,timeout:j,result:C}),C==="closed"?px("connection lost"):C}_RequestPing(D=3e4){return this._PingFlight.run(async()=>{let e=await this._Request("Ping",{},D);return e!=="timeout"&&e.type==="Success"})}async startLocalVideo(D,e,j){await(await this._EnsureWebRtcSession()).startLocalVideo(D,e,j)}stopLocalVideo(D){this._WebRtcSession?.stopLocalVideo(D)}async startRemoteVideo(D){return(await this._EnsureWebRtcSession()).startRemoteVideo(D)}stopRemoteVideo(D){this._WebRtcSession?.stopRemoteVideo(D)}async dump(){return{type:"H3",id:this.id,address:this.address,closed:this.closed,status:this.status,datagrams:{sent:this._ConnectionStats.packetsSent,received:this._ConnectionStats.packetsReceived},webRtc:{signalingState:this._PeerConnection?.signalingState??null,connectionState:this._PeerConnection?.connectionState??null,iceGatheringState:this._PeerConnection?.iceGatheringState??null,iceConnectionState:this._PeerConnection?.iceConnectionState??null,connectionStats:this._WebRtcSession?.stats??null}}}};import{Backend as F,extendUrl as FA,failure as mx,success as rA,fail as Ar,CONNECTION_STATS_INITIAL as Fr}from"@4players/odin-common";u();u();import{abortableSleep as XF,failure as ex,success as ZF}from"@4players/odin-common";async function B0(v,D){let e=performance.now(),j=ex("no connection was attempted");for(let B=0;B<i.ConnectInterval.length&&!D.aborted;B++){let C=e+xr(B);if(await XF(C-performance.now(),D)==="aborted")return ex("aborted");if(j=await YF(v,D),j.type==="Success")return j}return j}async function YF(v,D){let e;try{e=new WebSocket(v)}catch(s){return ex(`unable to create websocket; ${s}`)}let j=new AbortController,B=new Promise(s=>e.addEventListener("open",()=>s(ZF(e)),{signal:j.signal})),C=new Promise(s=>e.addEventListener("close",b=>s(ex(b.reason!==""?b.reason:"unable to establish websocket connection")),{signal:j.signal})),E=new Promise(s=>D.addEventListener("abort",()=>s(ex("aborted")),{signal:j.signal})),f=await Promise.race([B,C,E]);return j.abort(),f}function xr(v){let D=i.ConnectInterval.slice(0,v).reduce((j,B)=>j+B,0),e=i.ConnectInterval[v]*Math.random();return D+e}var Gx=class v{constructor(D,e,j,B,C,E){this.id=D;this.address=e;this.url=j;this.onDatagram=B;this.connection=C;this.webRtc=E;this._PeerIdMap=new WeakMap;this._ConnectionStats={...Fr};this._PingFlight=new S;o(`creating new webrtc connection to '${this.address}' with id ${this.id}`),this.closeSignal.addEventListener("abort",()=>this._CleanUp(),{once:!0}),this._ClosePromise=new Promise(f=>{this.closeSignal.addEventListener("abort",()=>{f("closed")},{once:!0})}),dx(E),this._AudioChannel=this.webRtc.createDataChannel("audio",{id:2,negotiated:!0,ordered:!1,maxRetransmits:0}),this._AudioChannel.binaryType="arraybuffer",this._AudioChannel.onmessage=f=>{this._ConnectionStats.packetsReceived++;let s=new Uint8Array(f.data);this._ConnectionStats.bytesReceived+=s.byteLength,this.onDatagram(this.id,s)},this._AudioChannel.onerror=f=>k(`webrtc audio data channel for connection with id ${D} raised an error`,f),this._AudioChannel.onclosing=f=>o(`webrtc audio data channel for connection with id ${D} begins shutting down`,f),this._AudioChannel.onclose=f=>o(`webrtc audio data channel for connection with id ${D} has closed`,f),X0(this._AudioChannel),this._WebRtcSession=new xx(this.webRtc,{sendOffer:async(f,s,b)=>{let d=await this._Request("WebRtcUpdate",{kind:"Sdp",type:"Offer",sdp:f,media_map:s,negotiation_id:b});if(d.type==="Failure")throw new Error(`failed to send sdp offer; ${d.reason}`)},sendIceCandidate:async f=>{await this._Request("WebRtcUpdate",{kind:"Trickle",candidate:f.candidate,spd_mid:f.sdpMid??void 0,spd_mline_index:f.sdpMLineIndex??void 0,username_fragment:f.usernameFragment??void 0})},sendIceComplete:async()=>{await this._Request("WebRtcUpdate",{kind:"TrickleFinished"})},closeConnection:async()=>{this.close()},checkConnection:async()=>{this.healthCheck().then()}}),this._WebRtcSession.startup(),i.MainConnectionPingInterval!==void 0&&(this._PingIntervalId=setInterval(async()=>{this.connectionStats.rtt=await this.ping(i.HealthCheckTimeout)},i.MainConnectionPingInterval)),this._HandleWebRtcUpdates()}static async create(D,e,j,B){if(B.aborted)return mx("aborted");let C;try{C=new URL(`wss://${e}`)}catch(b){return Ar(`address in token(${e}) can not be parsed; ${b}`)}let E=FA(C,`main?uid=${qx}`);if(E.type!=="Success")return E;let f=await B0(E.value,B);if(f.type!=="Success")return f;let s=new V(new M(f.value),ux,kx);try{return rA(new v(D,e,C,j,s,new RTCPeerConnection))}catch(b){return s.close(),mx(`unable to create webrtc connection; ${b}`)}}get status(){switch(this.webRtc.connectionState){case"connected":return 1;case"failed":case"closed":return 2;default:return 0}}get connectionStats(){return this._ConnectionStats}get transport(){return"WebRTC"}get closePromise(){return this._ClosePromise}get closeSignal(){return this.connection.closeSignal}get closed(){return this.connection.closed}async waitForConnected(){return new Promise((D,e)=>{let j=()=>{let B=this.status;B!==0&&(this.webRtc.removeEventListener("connectionstatechange",j),B===1?D():e(new Error("connection closed")))};this.webRtc.addEventListener("connectionstatechange",j),j(),this.closePromise.then(()=>{e(new Error("connection closed"))})})}close(){o(`closing ${this.transport} connection to '${this.address}' with id ${this.id}`),this.connection.close()}async joinRoom(D,e,j,B){let C=await this.connection.request("JoinRoom",{token:String(D),room_id:e,user_data:j,position:B});if(C==="closed"||C.type==="Failure")return C;let E=C.value;if(!("token"in E))return mx("JoinRoom responded without token");let f=FA(this.url,`room?token=${E.token}`);if(f.type==="Failure")return f;let s=await B0(f.value,this.closeSignal);return s.type==="Success"?(this._PeerIdMap.set(s.value,E.peer_id),rA(new M(s.value))):s}async getReconnectToken(D){let e=await this._Request("RequestReconnectToken",{peer_id:D});return e.type==="Failure"?e:y.parse(e.value)}async healthCheck(){let D=await this._RequestPing(i.HealthCheckTimeout);return D||this.close(),D}async ping(D=3e4){let e=Date.now();return await this._RequestPing(D)?Date.now()-e:0}sendDatagram(D){if(this._AudioChannel.readyState==="open"){let e=D.byteLength;this._AudioChannel.send(D),this._ConnectionStats.packetsSent+=1,this._ConnectionStats.bytesSent+=e}}_CleanUp(){a(`performing cleanup for connection ${this.id}`),clearInterval(this._PingIntervalId),Z0(this._AudioChannel),Y0(this.webRtc),this._WebRtcSession.cleanup(),this.connection.close()}async _HandleWebRtcUpdates(){for(;;){let D=await this.connection.recv();if(D==="closed")break;D.name==="WebRtcUpdate"&&this._WebRtcSession.handleWebRtcUpdate(D.properties)}this.close()}async _Request(D,e,j){let B=Date.now(),C=await(j===void 0?this.connection.request(D,e):this.connection.request(D,e,j)),E=(Date.now()-B)/1e3;return D!=="Ping"&&a(`sent main rpc '${D}'; took: ${E}s`,{properties:e,timeout:j,result:C}),C==="closed"?mx("connection lost"):C}_RequestPing(D=3e4){return this._PingFlight.run(async()=>{let e=await this._Request("Ping",{},D);return e!=="timeout"&&e.type==="Success"})}async startLocalVideo(D,e,j){await this._WebRtcSession.startLocalVideo(D,e,j)}stopLocalVideo(D){this._WebRtcSession.stopLocalVideo(D)}async startRemoteVideo(D){return this._WebRtcSession.startRemoteVideo(D)}stopRemoteVideo(D){this._WebRtcSession.stopRemoteVideo(D)}async dump(){return{type:"WebRtc",id:this.id,address:this.address,url:this.url.toString(),closed:this.closed,audioChannel:{readyState:this._AudioChannel.readyState,bufferedAmount:this._AudioChannel.bufferedAmount},datagrams:{sent:this.connectionStats.packetsSent,received:this.connectionStats.packetsReceived},webRtc:{signalingState:this.webRtc.signalingState,connectionState:this.webRtc.connectionState,iceGatheringState:this.webRtc.iceGatheringState,iceConnectionState:this.webRtc.iceConnectionState,connectionStats:this._WebRtcSession.stats}}}};function tA(v,D,e,j,B){switch(o(`creating ${D} main connection to '${e}'`),D){case"H3":return hx.create(v,e,j,B);case"WebRTC":return Gx.create(v,e,j,B);default:throw new Error(`transport ${D} is not supported`)}}import{Backend as SB,failure as jA,success as rr}from"@4players/odin-common";import{parseCommand as tr,parseNotification as Dr,RoomCommandsRpc as DA,RoomNotificationsRpc as eA}from"@4players/odin-common/api";u();var Ix=class{constructor(D,e,j,B){this.id=D;this.connection=e;this.cipher=j;this.mediaMap=B;this._DatagramReceived=0;this._DatagramSent=0;this._DatagramReceivedInvalid=0;this._DatagramSentInvalid=0;e.closeSignal.addEventListener("abort",()=>this.close())}get connectionStats(){return this.connection.connectionStats}get transport(){return this.connection.transport}get address(){return this.connection.address}get status(){return this.closed?2:this.connection.status}get closePromise(){return this.connection.closePromise}get closeSignal(){return this.connection.closeSignal}get closed(){return this.connection.closed}waitForConnected(){return this.connection.waitForConnected()}close(){this.connection.close()}async joinRoom(D,e,j,B){this.cipher.reset();let C=await this.cipher.encryptUserData(j);if(C===n)return jA("unable to encrypt initial user-data");let E=await this.connection.joinRoom(D,e,C,B);return E==="closed"||E.type==="Failure"?E:rr(new v0(E.value,this.cipher,this))}getReconnectToken(D){return this.connection.getReconnectToken(D)}healthCheck(){return this.connection.healthCheck()}async sendDatagram(D){let e=await this.cipher.encryptDatagram(D);e!==n?(this._DatagramSent+=1,this.connection.sendDatagram(e)):this._DatagramSentInvalid+=1}async decryptDatagram(D,e){let j=await this.cipher.decryptDatagram(D,e);return j!==n?this._DatagramReceived+=1:this._DatagramReceivedInvalid+=1,j}startLocalVideo(D,e,j){return this.connection.startLocalVideo(D,e,j)}stopLocalVideo(D){return this.connection.stopLocalVideo(D)}startRemoteVideo(D){return this.connection.startRemoteVideo(D)}stopRemoteVideo(D){return this.connection.stopRemoteVideo(D)}async dump(){return{type:"Encrypted",id:this.id,address:this.address,connectionId:this.connection.id,closed:this.closed,transport:this.transport,datagrams:{sent:this._DatagramSent,received:this._DatagramReceived,sentInvalid:this._DatagramSentInvalid,receivedInvalid:this._DatagramReceivedInvalid},cipher:await this.cipher.dump()}}},gx=class{constructor(D){this.room=D}resendUserData(){this.room.roomConnection?.notify("UpdatePeer",{user_data:this.room.roomConnection.userData})}setUserData(D,e){let j={kind:"UserDataChanged",peer_id:D,user_data:e};this.room.onEvent("PeerUpdated",j)}},v0=class{constructor(D,e,j){this.rpc=D;this.cipher=e;this.connection=j;this.peers=new Map;this.closeSignal.addEventListener("abort",this.cleanup.bind(this),{once:!0})}get closed(){return this.rpc.closed}get closeSignal(){return this.rpc.closeSignal}async request(D,e,j){let B=await this.outgoing(D,e);return B===n?jA("can not be encrypted"):await this.rpc.request(D,B,j)}async notify(D,e){let j=await this.outgoing(D,e);if(j!==n)return this.rpc.notify(D,j)}async recv(){for(;;){let D=await this.rpc.recv();if(D==="closed")return D;let e=await this.incoming(D.name,D.properties);if(e!==n)return{name:D.name,properties:e}}}close(){return this.rpc.close()}async outgoing(D,e){if(!(D in DA))return e;let j=tr(D,e,DA);if(j===void 0)return n;switch(j.name){case"UpdatePeer":{let B=await this.cipher.encryptUserData(j.request.user_data);if(B===n)return n;j.request.user_data=B}break;case"SendMessage":{let B=await this.cipher.encryptMessage(j.request.message);if(B===n)return n;j.request.message=B}break}return j.request}async incoming(D,e){if(!(D in eA))return e;let j=Dr(D,e,eA);if(j===void 0)return n;switch(j.name){case"RoomUpdated":for(let B=0;B<j.properties.updates.length;B++){let C=await this.roomUpdate(j.properties.updates[B]);if(C===n)return n;j.properties.updates[B]=C}break;case"PeerUpdated":{let B=await this.peerUpdate(j.properties);if(B===n)return n;j.properties=B}break;case"MessageReceived":{let B=await this.cipher.decryptMessage(j.properties.sender_peer_id,j.properties.message);if(B===n)return n;j.properties.message=B}break}return j.properties}async peerUpdate(D){switch(D.kind){case"UserDataChanged":{let e=await this.cipher.decryptUserData(D.peer_id,D.user_data);if(e===n)return n;D.user_data=e}break;case"MediaStarted":this.mediaStarted(D.peer_id,D.media.id);break;case"MediaStopped":this.mediaStopped(D.peer_id,D.media_id);break}return D}async roomUpdate(D){switch(D.kind){case"Joined":for(let e of D.room.peers){for(let B of e.medias)this.mediaStarted(e.id,B.id);let j=await this.cipher.decryptUserData(e.id,e.user_data);j!==n?e.user_data=j:e.user_data=new Uint8Array}break;case"PeerJoined":{for(let j of D.peer.medias)this.mediaStarted(D.peer.id,j.id);let e=await this.cipher.decryptUserData(D.peer.id,D.peer.user_data);e!==n?D.peer.user_data=e:D.peer.user_data=new Uint8Array}break;case"PeerLeft":{let e=this.peers.get(D.peer_id);this.peers.delete(D.peer_id),this.cipher.deletePeerKey(D.peer_id);for(let j of e??[])this.mediaStopped(D.peer_id,j)}break}return D}mediaStarted(D,e){let j=this.peers.get(D);j===void 0&&(j=new Set,this.peers.set(D,j)),j.add(e);let B=m({connectionId:this.connection.connection.id,mediaId:e});this.connection.mediaMap.set(B,{peerId:D,connection:this.connection})}mediaStopped(D,e){this.peers.get(D)?.delete(e);let B=m({connectionId:this.connection.connection.id,mediaId:e});this.connection.mediaMap.delete(B)}cleanup(){for(let[D,e]of this.peers)for(let j of e)this.mediaStopped(D,j)}};var $x=class{constructor(D){this.onDatagram=D;this._LastConnectionId=0;this._Connections=new Map;this._Close=new AbortController;this._MediaMap=new Map;let e=Date.now(),j=setInterval(()=>{Math.abs(Date.now()-e)>i.ClockJumpThreshold&&this.checkHealth(),e=Date.now()},i.ClockJumpCheckInterval);addEventListener("offline",()=>this.checkHealth(),{signal:this._Close.signal}),this._Close.signal.addEventListener("abort",()=>{clearInterval(j);for(let B of this._Connections.values())B.type==="establishing"?B.abort.abort():B.connection.close();this._Connections.clear()},{once:!0})}get closed(){return this._Close.signal.aborted}sendDatagram(D,e){let j=this._Connections.get(D);(j?.type==="established"||j?.type==="virtual")&&j.connection.sendDatagram(e)}async recvDatagram(D,e){let j=Br(e);if(j===void 0||j.length===0)return;let B=this._MediaMap.get(m({connectionId:D,mediaId:j[0]}));if(B===void 0)this.onDatagram(D,e);else{let C=await B.connection.decryptDatagram(B.peerId,e);if(C===n)return;this.onDatagram(B.connection.id,C)}}async acquireConnection(D,e,j,B){if(await er(),this.closed)return"closed";let C=this.findConnection(D,e),E;switch(C?.type){case"established":a(`reusing existing connection ${C.id}`),E=C;break;case"establishing":{a(`waiting for connecting to '${e}' finish`);let b=await C.finished;if(b.type!=="Success")return b;E=b.value}break;case void 0:{a(`connecting to '${e}'`);let b=await this.createConnection(D,e,B);if(b.type!=="Success")return b;E=b.value}break}let f=E.id,s=new C0(E.connection,()=>this.releaseConnection(f));return E.references+=1,j&&(s=new Ix(++this._LastConnectionId,s,j,this._MediaMap),this.addConnection({type:"virtual",id:s.id,connection:s,createdAt:Date.now()})),BA(s)}async createConnection(D,e,j){let B=++this._LastConnectionId,C=Date.now(),E=new AbortController;j.addEventListener("abort",()=>E.abort(),{once:!0}),a(`creating new connection ${B}`);let f=tA(B,D,e,this.recvDatagram.bind(this),j),{promise:s,resolve:b}=Promise.withResolvers();this.addConnection({type:"establishing",id:B,address:e,transport:D,finished:s,createdAt:Date.now(),abort:E});let d=await f;if(this._Connections.delete(B),d.type!=="Success")return b(d),d;let h={type:"established",id:B,address:e,transport:D,createdAt:C,references:0,connection:d.value};return this.addConnection(h),BA(h)}addConnection(D){(D.type==="established"||D.type==="virtual")&&D.connection.closeSignal.addEventListener("abort",()=>{o(`connection ${D.id} has been closed`),this._Connections.delete(D.id)},{once:!0}),this._Connections.set(D.id,D)}releaseConnection(D){let e=this._Connections.get(D);e?.type==="established"&&(e.references-=1,e.references<=0&&e.connection.close())}checkHealth(){for(let D of this._Connections.values())D.type==="established"&&D.connection.healthCheck()}close(){this._Close.abort()}async dump(){let D=[];for(let j of this._Connections.values()){let B;switch(j.type){case"established":B={transport:j.transport,address:j.address,connection:await j.connection.dump(),references:j.references};break;case"establishing":B={transport:j.transport,address:j.address,aborted:j.abort.signal.aborted};break;case"virtual":B={connection:await j.connection.dump()};break}D.push({type:j.type,id:j.id,createdAt:j.createdAt,...B})}let e=[];for(let[j,B]of this._MediaMap)e.push(`${j} -> ${B.peerId} @${B.connection.id} `);return{lastConnectionId:this._LastConnectionId,connections:D,mediaMap:e,closed:this.closed}}findConnection(D,e){for(let j of this._Connections.values())if(j.type!=="virtual"&&j.transport===D&&j.address===e)return j}},C0=class{constructor(D,e){this.connection=D;this.release=e;this.closeController=new AbortController;this.closePromise=new Promise(D=>this.closeController.signal.addEventListener("abort",()=>D("closed"),{once:!0}));D.closeSignal.addEventListener("abort",()=>this.close(),{once:!0})}get closeSignal(){return this.closeController.signal}get closed(){return this.closeSignal.aborted}close(){this.release(),this.closeController.abort("closed")}get connectionStats(){return this.connection.connectionStats}get id(){return this.connection.id}get transport(){return this.connection.transport}get address(){return this.connection.address}get status(){return this.connection.status}waitForConnected(){return this.connection.waitForConnected()}joinRoom(D,e,j,B){return this.connection.joinRoom(D,e,j,B)}getReconnectToken(D){return this.connection.getReconnectToken(D)}healthCheck(){return this.connection.healthCheck()}sendDatagram(D){return this.connection.sendDatagram(D)}startLocalVideo(D,e,j){return this.connection.startLocalVideo(D,e,j)}stopLocalVideo(D){return this.connection.stopLocalVideo(D)}startRemoteVideo(D){return this.connection.startRemoteVideo(D)}stopRemoteVideo(D){return this.connection.stopRemoteVideo(D)}async dump(){let D=await this.connection.dump();return typeof D=="object"&&(D={...D,isShared:!0,referenceClosed:this.closed}),D}};function Br(v){let D;try{D=jr(v)}catch{return}if(!Array.isArray(D)||D.length<2)return;let e=D[1];if(Array.isArray(e))return e.map(Number)}import{assert as E0,Backend as RB}from"@4players/odin-common";var P=class{constructor(D,e){this.uid=D;this.customType=e}#x;#A;get mediaStream(){return this.#x}get audioPlayback(){return E0(this.#A,"getting the audioPlayback failed, this video has no Audio"),this.#A}get volume(){return E0(this.audioPlayback,"getting the volume failed, this video has no Audio"),this.audioPlayback.volume}setVolume(D){E0(this.#A,"Can not set the volume, this video has no Audio"),this.#A.setVolume(D)}setMediaStream(D){this.mediaStream||(this.#x=D)}close(){this.#x?.getVideoTracks().forEach(D=>{D.stop(),this.#x?.removeTrack(D)}),this.#x=void 0}};import{Backend as UB,assert as kA,generateUUID as gr,unwrap as $r,CONNECTION_STATS_INITIAL as yr}from"@4players/odin-common";import{RoomNotificationsRpc as _r,RoomV1 as WB}from"@4players/odin-common/api";import{Selector as vr,failure as N,sleep as yx,success as T,assert as Cr}from"@4players/odin-common";import{parseResponse as Er,RoomCommandsRpc as _x,RoomNotificationsRpc as fr,RoomV1 as VB}from"@4players/odin-common/api";u();var Lx=class{constructor(D,e,j,B,C,E,f,s,b,d){this.connectionPool=D;this.transport=e;this.onEvent=j;this.gateway=B;this.roomId=E;this.cipher=b;this.disableAutoReconnect=d;this._Close=new AbortController;this._TokenUsed=!1;this._WasConnected=!1;this._FailedConnections=0;this._LastTokenRenew=performance.now();this._LastReconnectStartedAt=0;this._Closed=new Promise(D=>this._Close.signal.addEventListener("abort",()=>D(this._Close.signal.reason?"disconnected":"closed"),{once:!0}));this._Token=C,this._UserData=f,this._Position=s,this._Main().then(({reason:h})=>a(`_Main() resolved; ${h}`))}get token(){return this._Token}get userData(){return this._UserData}get position(){return this._Position}get closed(){return this._Close.signal.aborted}get mainConnection(){return this._MainConnection}async requestUnsafe(D,e){if(this._RoomConnection===void 0)return N("currently not connected");let j=await this._RoomConnection.request(D,e,void 0);return Cr(j!=="timeout","request should not timeout"),j!=="closed"&&j.type==="Success"&&this._HandleRequests(D,e,j.value),j}async request(D,e){let j=Date.now(),B=_x[D],C=await this.requestUnsafe(D,e),E=(Date.now()-j)/1e3;if(a(`sent room rpc '${D}'; took: ${E}s`,{properties:e,result:C}),C==="closed"||C.type==="Failure")return C;let f=Er(D,C.value,_x);return f!==void 0?T(f):N(`received invalid response from ${D}`)}notify(D,e){this._RoomConnection!==void 0&&this._RoomConnection.notify(D,e)}close(){this._Close.abort(!0)}get renewTokenIn(){let D=this._LastTokenRenew-performance.now()+i.MinTokenRefreshInterval,e=this._Token.timeLeft-i.MinTokenLifetime;return Math.max(D,e)}async _Main(){let D="unable to establish connection";for(let e=0;;this._FailedConnections++){if(await yx(Math.max(e-performance.now(),0)),this._Close.signal.aborted||this.connectionPool.closed){D="user requested";break}if(e=performance.now()+1e3,this._TokenUsed=!0,this._Token.hasAudience("sfu")){let j=await this._ConnectToServer();if(j.type==="Success"&&j.value==="shutdown"){a("connection closed by user request; shutting down"),D="user requested";break}if(this.disableAutoReconnect&&this._WasConnected){D=j.type==="Failure"?j.reason:"connection lost";break}if(this._LastReconnectStartedAt===0&&(this._LastReconnectStartedAt=performance.now()),j.type==="Failure"&&!this._WasConnected&&this._FailedConnections>=3){D=j.reason;break}if(j.type==="Failure"&&!sr(this._LastReconnectStartedAt))continue}if(this.reset(),this._Close.signal.aborted||this.connectionPool.closed){D="user requested";break}if(this.gateway!==void 0&&this._Token.hasAudience("gateway")){this._ChangeStatus("Joining",`requesting new token from ${this.gateway}`);let j=await nr(this.gateway,this._Token,this._Close.signal);if(j.type==="Success")if(j.value instanceof y)e=0,this._Token=j.value,this._TokenUsed=!1;else{D=`gateway error; ${j.value}`;break}else if(!this._WasConnected&&this._FailedConnections>=3){D="unable to contact the gateway";break}}if(this._TokenUsed&&this._Token.timeLeft<=0){D="token has expired";break}if(this._Close.signal.aborted||this.connectionPool.closed){D="user requested";break}}return this._ChangeStatus("Closed",D),this.close(),N(D)}async _ConnectToServer(){let D=this._Token;for(;D.upstream!==void 0;)D=D.upstream;let e=D.claims.adr??this.gateway?.toString();if(!e)return T("continue");if(this._ChangeStatus("Joining",`connecting to ${D.claims.adr}`),this._MainConnection===void 0||this._MainConnection.closed||this._MainConnection.address!==D.claims.adr){this._MainConnection?.close();let C=await this.connectionPool.acquireConnection(this.transport,e,this.cipher,this._Close.signal);if(C==="closed")return N("connection pool closed");if(C.type==="Failure")return this._ChangeStatus("Joining",`connection failed; ${C.reason}`),N(`connection failed; ${C.reason}`);this._MainConnection=C.value,this._OwnPeerId=void 0}let j=await Promise.race([Promise.all([this._MainConnection.joinRoom(D,this.roomId,this.userData,this.position)]),yx(i.ConnectTimeout,"timeout"),this._Closed]);if(j==="closed"||j==="disconnected")return T("continue");if(j==="timeout")return this._ChangeStatus("Joining","timed out"),T("continue");let[B]=j;if(B==="closed")return T("continue");if(B.type==="Failure")return N(`unable to join room; ${B.reason}`);this._RoomConnection=B.value,this._WasConnected=!0,this._FailedConnections=0,this._ChangeStatus("Joined",`joined ${this.roomId}`);try{await this._MainConnection.waitForConnected();let C=await this._HandleConnection(this._MainConnection);return T(C?"shutdown":"continue")}catch(C){return N(`unable to handle connection; ${C}`)}}_ChangeStatus(D,e){let j={status:D,message:e};this.onEvent("RoomStatusChanged",j)}async _HandleConnection(D){if(this._RoomConnection===void 0)return!1;let e=new vr([()=>yx(this.renewTokenIn,"renewToken"),()=>yx(500,"tick"),async()=>await this._RoomConnection?.recv(),()=>this._Closed,()=>D.closePromise]);for(;;){let j=await e.next();switch(j){case void 0:case"closed":return this._RoomConnection?.close(),this._MainConnection?.close(),!1;case"disconnected":return this._RoomConnection?.close(),this._MainConnection?.close(),!0;case"renewToken":this._RenewToken();break;case"tick":break;default:this._HandleEvent(j);break}}}_HandleEvent(D){if(D.name==="RoomUpdated"){let e=fr.RoomUpdated.safeParse(D.properties);if(!e.success)return;for(let j of e.data.updates)j.kind==="Joined"&&(this._OwnPeerId=j.own_peer_id)}this.onEvent(D.name,D.properties)}_HandleRequests(D,e,j){switch(D){case"SetPeerPosition":{let B=_x.SetPeerPosition.request.safeParse(e);if(B.success){let C=B.data.position;this._Position=C.length===2?[C[0],C[1],0]:C}else k("unable to process SetPeerPosition command");break}case"UpdatePeer":{let B=_x.UpdatePeer.request.safeParse(e);B.success?this._UserData=B.data.user_data:k("unable to process UpdatePeer command");break}}}async _RenewToken(D){if(this._LastTokenRenew=performance.now(),!D&&this.token.timeLeft>i.MinTokenLifetime)return;if(this._MainConnection===void 0||this._OwnPeerId===void 0)return N("connection is not established");let e=await this._MainConnection.getReconnectToken(this._OwnPeerId);return e.type==="Success"?(this._Token=e.value,T()):N(`${this._MainConnection.address} rejected reconnect token request; ${e.reason}`)}reset(){this._LastReconnectStartedAt=0,this._RoomConnection?.close(),this._RoomConnection=void 0,this._MainConnection?.close(),this._MainConnection=void 0,this._OwnPeerId=void 0}};async function nr(v,D,e){try{let j={jsonrpc:"2.0",id:1,method:"Connect",params:{}};o(`sending authentication request to '${v}'`,j);let C=await(await fetch(v,{body:JSON.stringify(j),method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${D}`},signal:e})).json();if(o(`received authentication response fom '${v}'`,C),"result"in C)return y.parse(C.result.token);{let E=C.error?.message??"malformed response";return p(`gateway rejected token; ${E}`),T(E)}}catch(j){return N(String(j))}}function sr(v,D=8e3){return performance.now()-v>D}u();import{assert as Ir}from"@4players/odin-common";u();import{Backend as Bx,Strand as Gr}from"@4players/odin-common";u();import{assert as lr}from"@4players/odin-common";u();import{decode as ir}from"@msgpack/msgpack";var vA={name:"PBKDF2",hash:"SHA-256",iterations:6e5,salt:new Uint8Array([111,100,105,110,95,99,114,121,112,116,111,95,109,97,115,116,101,114,95,107,101,121])},CA=v=>({name:"PBKDF2",hash:"SHA-256",iterations:600,salt:v}),EA=32,fA=1e6,nA=2147483648,sA=32,K=[79,68,73,78,1,75,105,109],Ax=16,Fx=64,iA=16;function bA(v,D){if(v.length!==D.length)return!1;for(let e=0;e<v.length;e++)if(v[e]!==D[e])return!1;return!0}function br(v){return isFinite(v)}function or(v){return Array.isArray(v)}function Hx(v){return br(v)?v:n}function jx(v){return v instanceof Uint8Array?v:n}function ar(v,...D){let e;try{e=ir(v)}catch{return n}if(!or(e))return n;let j=new Array(e.length);for(let B in D)if(j[B]=D[B](e[B]),j[B]===n)return n;return j}function Nx(v,...D){if(v.length<K.length)return G;for(let e=0;e<K.length;e++)if(v[e]!==K[e])return G;return ar(v.subarray(K.length),...D)}var rx=class{constructor(D){this.first=1;this.offset=0;this.window=Array(D)}isReplay(D){let e=D-this.first;if(e<0)return!0;if(e>=this.window.length)if(e<this.window.length*2){let C=e-this.window.length+1;e-=C;for(let E=0;E<C;E++)this.advance()}else return this.first=D+1-self.window.length,this.offset=0,this.window.fill(!1),!1;let j=(this.offset+e)%this.window.length,B=this.window[j]===!0;for(this.window[j]=!0;this.window[this.offset]===!0;)this.advance();return B}advance(){this.window[this.offset]=!1,this.first+=1,this.offset=(this.offset+1)%this.window.length}};var wx=class v{constructor(D){this.key=D}static async create(D){typeof D=="string"&&(D=new TextEncoder().encode(D));let e=await globalThis.crypto.subtle.importKey("raw",D,"PBKDF2",!1,["deriveBits"]),j=await globalThis.crypto.subtle.deriveBits(vA,e,256),B=await globalThis.crypto.subtle.importKey("raw",j,"PBKDF2",!1,["deriveKey"]);return new v(B)}async generatePeerKey(D,e){return await globalThis.crypto.subtle.deriveKey(CA(D),this.key,{name:"AES-GCM",length:256},!1,[e])}},Px=class v{constructor(D,e){this.seed=D;this.key=e;this.sequenceNumbers={datagram:1,message:1,userData:1};this.number_of_packets=0;this.number_of_bytes=0}static async create(D){let e=globalThis.crypto.getRandomValues(new Uint8Array(EA)),j=await D.generatePeerKey(e,"encrypt");return new v(e,j)}get limitReached(){return this.key===void 0?!1:this.number_of_bytes>=nA||this.number_of_packets>=fA}nextSequenceNumber(D){return this.sequenceNumbers[D]++}};function f0(v,D){return{kind:"encrypted",key:v,material:D,antiReplays:{datagram:new rx(sA),userData:new rx(0),message:new rx(0)}}}var Kx=class v{constructor(D,e,j,B){this.additionalData=D;this.sequenceNumber=e;this.seed=j;this.encrypted=B}static parse(D){let e=Nx(D,jx,Hx,jx);if(e===n||e===G)return e;let[j,B,C]=e,E=D.subarray(0,D.length-C.length);return new v(E,B,j,C)}isSameSeed(D){return bA(this.seed,D.seed)}async generateKey(D){return await D.generatePeerKey(this.seed,"decrypt")}};function Jx(v,D){let e=new Uint8Array(12);switch(e[0]=D&255,e[1]=D>>8&255,e[2]=D>>16&255,e[3]=D>>24&255,v){case"datagram":e[5]=1;break;case"userData":e[5]=2;break;case"message":e[5]=3;break;default:lr(!1,"missing content implementation")}return e}u();import{encode as aA}from"@msgpack/msgpack";import{assert as kr}from"@4players/odin-common";var Ox=class{constructor(D){this.actions=D}changeKey(D){this.masterKey!==D&&(this.masterKey=D,this.ownKey=n,this.actions.resendUserData())}async encryptDatagram(D){let e=await this.getKey("datagram");return e===void 0?D:e===J?n:await dr(e,D)}async encryptMessage(D){let e=await this.getKey("message");return e===void 0?D:e===J?J:await oA(e,D,"message")}async encryptUserData(D){let e=await this.getKey("userData");return e===void 0?D:(kr(e!==J,"key unavailable for user data encryption"),await oA(e,D,"userData",e.seed))}async getKey(D){if(this.ownKey===n||this.ownKey?.limitReached)if(D==="userData")this.ownKey=this.masterKey?await Px.create(this.masterKey):void 0;else return this.ownKey!==n&&(this.ownKey=n,this.actions.resendUserData()),J;return this.ownKey}reset(){this.ownKey=this.masterKey?n:void 0}};async function oA(v,D,e,...j){let B=v.nextSequenceNumber(e),C=D.length+Ax,E=cr(B,j,C),f=E.length-C,s=await lA(v,e,B,E.subarray(0,f),D);return E.set(new Uint8Array(s),f),E}function cr(v,D,e){let j=[];D.forEach(E=>j.push(E)),j.push(v),j.push(new Uint8Array(e));let B=aA(j),C=new Uint8Array(K.length+B.length);return C.set(K,0),C.set(B,K.length),C}async function dr(v,D){let e=pr(D);if(e===n)return n;if((e.kind&Fx)!==0)return n;let j=e.body.length+Ax,B=v.nextSequenceNumber("datagram"),C=aA([e.kind|Fx,e.mediaIds,B,new Uint8Array(j)]),E=C.length-j,f=await lA(v,"datagram",B,C.subarray(0,E),e.body);return C.set(f,E),C}async function lA(v,D,e,j,B){return new Uint8Array(await globalThis.crypto.subtle.encrypt({name:"AES-GCM",iv:Jx(D,e),additionalData:j,tagLength:Ax*8},v.key,B))}function pr(v){let D=new O(v),e=D.readArrayLength();if(l(e)||e<2)return n;let j=D.readNumber(),B=D.readArrayLength();if(l(j)||l(B))return n;if(B>iA)return n;let C=Array(B);for(let f=0;f<C.length;f++){let s=D.readNumber();if(l(s))return n;C[f]=s}let E=v.subarray(D.position);return{kind:j,mediaIds:C,body:E}}u();import{encode as hr}from"@msgpack/msgpack";var Tx=class{constructor(D){this.actions=D;this.peerKeys=new Map}async changeKey(D){this.masterKey=D;for(let[e,{kind:j,material:B}]of this.peerKeys)if(D!==void 0){let C=await B.generateKey(D),E=f0(C,B),f=await Mx(E,"userData",B.additionalData,B.sequenceNumber,B.encrypted);f!==n?(this.peerKeys.set(e,E),this.actions.setUserData(e,f)):(this.peerKeys.set(e,{kind:"broken",material:B}),this.actions.setUserData(e,new Uint8Array))}else j==="encrypted"&&this.peerKeys.set(e,{kind:"broken",material:B})}async decryptDatagram(D,e){let j=qr(e);if(this.masterKey===void 0)return j===G?e:n;if(j===n||j===G)return n;let B=this.peerKeys.get(D);if(B?.kind!=="encrypted")return n;let C=await Mx(B,"datagram",j.additionalData,j.sequenceNumber,j.encrypted);return C===n?n:mr(j.kind&~Fx,j.mediaIds,C)}async decryptMessage(D,e){let j=Nx(e,Hx,jx);if(this.masterKey===void 0)return j===G?e:n;if(j===n||j===G)return n;let B=this.peerKeys.get(D);if(B?.kind!=="encrypted")return n;let[C,E]=j,f=e.subarray(0,e.length-E.length);return Mx(B,"message",f,C,E)}async decryptUserData(D,e){let j=Kx.parse(e);if(j===n)return n;if(j===G)return this.peerKeys.delete(D),this.masterKey===void 0?e:n;if(this.masterKey===void 0)return this.peerKeys.set(D,{kind:"broken",material:j}),n;let B=this.peerKeys.get(D);if(B?.kind==="encrypted"&&B.material.isSameSeed(j))B.material=j;else{let E=await j.generateKey(this.masterKey);B=f0(E,j)}let C=await Mx(B,"userData",j.additionalData,j.sequenceNumber,j.encrypted);return C===n?this.peerKeys.set(D,{kind:"broken",material:j}):B!==void 0&&this.peerKeys.set(D,B),C}reset(){this.peerKeys.clear()}};function qr(v){let D=new O(v),e=D.readArrayLength();if(l(e)||e<1)return n;let j=D.readNumber();if(l(j))return n;if((j&Fx)===0)return G;if(e!==4)return n;let B=D.position;D.readObjects(1);let C=v.subarray(B,D.position),E=D.readNumber(),f=D.readBytes();if(l(E)||l(f))return n;let s=v.subarray(0,v.length-f.length);return{kind:j,mediaIds:C,additionalData:s,sequenceNumber:E,encrypted:f}}async function Mx(v,D,e,j,B){let C=await globalThis.crypto.subtle.decrypt({name:"AES-GCM",iv:Jx(D,j),additionalData:e,tagLength:Ax*8},v.key,B).catch(()=>n);return C===n?n:v.antiReplays[D].isReplay(j)?n:new Uint8Array(C)}function mr(v,D,e){let j=2;try{let E=new O(e);for(E.position=0;E.position<e.length;)E.readObjects(1),j+=1}catch{return n}let B=hr(v),C=new Uint8Array(3+B.length+D.length+e.length);return C[0]=220,C[1]=j>>8&255,C[2]=j&255,C.set(B,3),C.set(D,3+B.length),C.set(e,3+B.length+D.length),C}var Sx=class{constructor(D,e){this.active=!1;let j=new Tx(e),B=new Ox(e);this.crypto=new Gr({encryption:B,decryption:j}),this.peerKeys=j.peerKeys,this.configure(D)}encryptUserData(D){return this.crypto.enqueue(({encryption:e})=>e.encryptUserData(D))}async encryptMessage(D){let e;do e=await this.crypto.enqueue(({encryption:j})=>j.encryptMessage(D));while(e===J);return e}async encryptDatagram(D){return await this.crypto.enqueue(({encryption:e})=>e.encryptDatagram(D))}decryptUserData(D,e){return this.crypto.enqueue(({decryption:j})=>j.decryptUserData(D,e))}decryptMessage(D,e){return this.crypto.enqueue(({decryption:j})=>j.decryptMessage(D,e))}decryptDatagram(D,e){return this.crypto.enqueue(({decryption:j})=>j.decryptDatagram(D,e))}configure(D){return this.crypto.enqueue(async e=>{let j=D.password?await wx.create(D.password):void 0;this.active=j!==void 0,await e.encryption.changeKey(j),await e.decryption.changeKey(j)})}getPeerStatus(D){switch(this.peerKeys.get(D)?.kind??"unencrypted"){case"broken":return Bx.PeerCipherStatus.InvalidPassword;case"encrypted":return Bx.PeerCipherStatus.Encrypted;case"unencrypted":return this.active?Bx.PeerCipherStatus.InvalidPassword:Bx.PeerCipherStatus.Unencrypted;default:return Bx.PeerCipherStatus.Unknown}}deletePeerKey(D){this.peerKeys.delete(D)}reset(){return this.crypto.enqueue(async({encryption:D,decryption:e})=>{D.reset(),e.reset()})}async dump(){return this.crypto.enqueue(async()=>({active:this.active,peers:Array.from(this.peerKeys).map(([D,e])=>`${D} => ${e.kind}`)}))}};function uA(v,D){return Ir(v.type==="OdinCrypto","only OdinCrypto supported"),new Sx(v,D)}var Rx=class{constructor(D,e,j){this._Captures=new Map;this._Playbacks=new Map;this._Peers=new Map;this._AvailableMediaIds=[];let{url:B,onEvent:C}=e,E=$r(y.parse(e.token)),f=e.roomId??E.defaultRoomId,s=e.userData??new Uint8Array(0),b=e.position??[0,0,0];kA(f!==void 0,"room id required for multi-room-tokens"),this.cipher=e.cipher?uA(e.cipher,new gx(this)):void 0,this.onEvent=C,o(`creating new room '${f}' ${this.cipher?"with":"without"} cipher`,E,s,b),this._Connection=new Lx(D,e.transport??"H3",this._HandleEvent.bind(this),B?new URL(B):void 0,E,f,s,b,this.cipher,j?.disableAutoReconnect??!1)}get connectionStats(){let D={...yr};return this.mainConnection?this.mainConnection.connectionStats:D}get roomConnection(){return this._Connection}get mainConnection(){return this.roomConnection?.mainConnection}get token(){return this._Connection.token.text}request(D,e){return this._Connection.requestUnsafe(D,e)}async link(D){if(D instanceof H){let e=this._Playbacks.get(D.uid)??{media:void 0,playback:void 0};e.playback!==void 0&&this.unlink(e.playback),e.media!==void 0&&D.start(e.media),e.playback=D,o(`linking audio playback media '${D.uid}' with volume ${D.volume} to room '${this._Connection.roomId}'`),this._Playbacks.set(D.uid,e)}else if(D instanceof w){let e=this._Captures.get(D);e&&this.unlink(D);let j=this.mainConnection!==void 0&&this._AvailableMediaIds.shift();e={media:j?{connectionId:this.mainConnection.id,mediaId:j}:void 0},o(`linking audio capture media '${D.uid}' with volume ${D.volume} to room '${this._Connection.roomId}'`),this._Captures.set(D,e),e.media!==void 0&&await D.start(this._Connection,e.media)}else if(D instanceof P){let e=this._Playbacks.get(D.uid)??{media:void 0,playback:void 0};if(e.playback!==void 0&&this.unlink(e.playback),e.media!==void 0){let j=await this.mainConnection?.startRemoteVideo(e.media.mediaId);j&&D.setMediaStream(new MediaStream([j]))}e.playback=D,o(`linking video playback media '${D.uid}' with type '${D.customType}' to room '${this._Connection.roomId}'`),this._Playbacks.set(D.uid,e)}else if(D instanceof $){let e=this._Captures.get(D);e&&this.unlink(D);let j=D.mediaStream?.getVideoTracks()[0];if(j){let B=this.mainConnection!==void 0&&this._AvailableMediaIds.shift();e={media:B?{connectionId:this.mainConnection.id,mediaId:B}:void 0},o(`linking video capture media '${D.uid}' with type '${D.parameters?.customType}' to room '${this._Connection.roomId}'`),this._Captures.set(D,e),e.media!==void 0&&(await D.start(this._Connection,e.media),this.mainConnection?.startLocalVideo(e.media.mediaId,j,D.parameters)),D.audioCapture&&await this.link(D.audioCapture)}}else throw new Error("Linking failed, media was not supported")}unlink(D){if(D instanceof H||D instanceof P){let e=this._Playbacks.get(D.uid);if(e?.playback!==D)return;e.playback=void 0,e.media!==void 0&&(D instanceof H?D.stop(e.media):(this.mainConnection?.stopRemoteVideo(e.media.mediaId),D.setMediaStream(void 0))),o(`unlinking playback media '${D.uid}' from room '${this._Connection.roomId}'`),this._Playbacks.set(D.uid,e)}else if(D instanceof w||D instanceof $){D instanceof $&&D.audioCapture&&this.unlink(D.audioCapture);let e=this._Captures.get(D);if(e===void 0)return;e.media!==void 0&&(D.stop(this._Connection,e.media),this._AvailableMediaIds.push(e.media.mediaId),D instanceof $&&this.mainConnection?.stopLocalVideo(e.media.mediaId)),o(`unlinking capture media '${D.uid}' from room '${this._Connection.roomId}'`),this._Captures.delete(D)}else throw new Error("invalid media")}close(){o(`closing room '${this._Connection.roomId}'`),this._Connection.close()}_HandleEvent(D,e){let j=j0(_r,{name:D,properties:e});j!==void 0&&(this._HandleKnownEvent(j),e=j.properties),this.onEvent(D,e)}_HandleKnownEvent(D){switch(a(`processing event '${D.name}'`,D.properties),D.name){case"RoomStatusChanged":D.properties.status!=="Joined"&&this._HandleConnectionLost();break;case"RoomUpdated":for(let e of D.properties.updates)this._HandleRoomUpdate(e);break;case"PeerUpdated":this._HandlePeerUpdate(D.properties);break}}_HandleConnectionLost(){for(let D of this._Peers.keys())this._HandlePeerLeft(D);for(let[D,e]of this._Captures)e.media!==void 0&&(D instanceof $,D instanceof w&&(D.stop(this._Connection,e.media),e.media=void 0));this._AvailableMediaIds.length=0}_HandleRoomUpdate(D){if(D.kind==="Joined"){kA(this._AvailableMediaIds.length===0,"left over media ids"),this._AvailableMediaIds.push(...D.media_ids),this._HandleRoomJoined();for(let e of D.room.peers)this._HandlePeerJoined(e)}else D.kind==="PeerJoined"?this._HandlePeerJoined(D.peer):D.kind==="PeerLeft"&&this._HandlePeerLeft(D.peer_id)}_HandleRoomJoined(){for(let[D,e]of this._Captures)this._AvailableMediaIds.length===0||this.mainConnection===void 0||(e.media={connectionId:this.mainConnection.id,mediaId:this._AvailableMediaIds.shift()},D instanceof w&&D.start(this._Connection,e.media),D instanceof $)}_HandlePeerUpdate(D){D.kind==="MediaStarted"?this._HandleMediaStart(D.peer_id,D.media):D.kind==="MediaStopped"&&this._HandleMediaStopped(D.peer_id,D.media_id)}_HandlePeerJoined(D){this._Peers.has(D.id)||this._Peers.set(D.id,{mediaIds:new Map});for(let e of D.medias)this._HandleMediaStart(D.id,e)}_HandlePeerLeft(D){let e=this._Peers.get(D);if(e!==void 0){for(let j of e.mediaIds.keys())this._HandleMediaStopped(D,j);this._Peers.delete(D)}}_HandleMediaStart(D,e){if(this.mainConnection===void 0)return;let j=this._Peers.get(D);if(j===void 0||e.properties.kind!=="audio"&&e.properties.kind!=="video")return;let B=String(e.properties.uid??gr());e.properties.uid=B;let C=this._Playbacks.get(B)??{media:void 0,playback:void 0};this._Playbacks.set(B,C),j.mediaIds.set(e.id,B),C.media={connectionId:this.mainConnection.id,mediaId:e.id},C.playback!==void 0&&(C.playback instanceof H&&C.playback.start(C.media),C.playback instanceof P&&this.mainConnection.startRemoteVideo(C.media.mediaId).then())}_HandleMediaStopped(D,e){let j=this._Peers.get(D);if(j===void 0)return;let B=j?.mediaIds.get(e);if(B===void 0)return;let C=this._Playbacks.get(B);C!==void 0&&(C.media!==void 0&&C.media.mediaId===e&&C.playback!==void 0&&(C.playback instanceof H&&C.playback.stop(C.media),C.playback instanceof P&&this.mainConnection?.stopRemoteVideo(C.media.mediaId),C.media=void 0),j.mediaIds.delete(e))}};sx();function $B(v,D){m0(D?.logger,D?.onLogMessage);let e,j=new $x((C,E)=>e.receivePacket(C,E)),B=new ax(v);return e=new lx(B,j.sendDatagram.bind(j),D?.enableHTMLAudioElementFallback??!1),new n0(j,e,D)}var qx=Lr(),s0=[],cA=!1;function Hr(){cA||typeof window>"u"||(window.addEventListener("beforeunload",()=>{for(let v of s0)v.deref()?.close()}),cA=!0)}var n0=class{constructor(D,e,j){this.version="9";this.supportedTransports=["H3","WebRTC"];this._PlaybackVolume=[1,1];this._CreatedAt=Date.now();this._Options=j??{},this._Options.disableBeforeUnload||Hr(),this._ConnectionPool=D,this._MediaController=e,s0.push(new WeakRef(this)),o("plugin initialized")}get playbackVolume(){return this._PlaybackVolume}joinRoom(D){return new Rx(this._ConnectionPool,D,this._Options)}async createAudioPlayback(D){return this._MediaController.createAudioPlayback(D)}async createAudioCapture(D){return this._MediaController.createAudioCapture(D)}async createVideoCapture(D,e){return this._MediaController.createVideoCapture(D,e)}async createVideoPlayback(D){return new P(D.uid,D.customType)}enumerateDevices(){return nx()}setOutputVolume(D){this._MediaController.playbackSetGlobalVolume(D)}async setOutputDevice(D){await this._MediaController.playbackSetDevice(D.device)}close(){this._MediaController.close(),this._ConnectionPool.close(),o("plugin closed")}async dump(){return{createdAt:this._CreatedAt,connections:await this._ConnectionPool.dump(),medias:await this._MediaController.dump()}}};async function dA(){let v=[];for(let D of s0){let e=D.deref();e!==void 0&&v.push(await e.dump())}return JSON.stringify({timestamp:Date.now(),instances:v,background:await y0()})}globalThis.odin_debug_dump_state=dA;window!==void 0&&(window.odin_debug_dump_state=dA);export{qx as SESSION_ID,$B as createPlugin};
6436
+ `});var Yx,_0=q(()=>{Yx='"use strict";(()=>{var P=Object.defineProperty;var M=(e,t)=>{for(var r in t)P(e,r,{get:t[r],enumerable:!0})};var u={};M(u,{AdditionalCaptureBlocks:()=>E,AdditionalPlaybackBlocks:()=>R,ClockJumpCheckInterval:()=>_,ClockJumpThreshold:()=>N,ConnectInterval:()=>Q,ConnectTimeout:()=>G,DefaultRefreshRate:()=>C,DefaultVideoCodec:()=>Y,HealthCheckTimeout:()=>O,MainConnectionPingInterval:()=>W,MaxNumberOfDecoders:()=>L,MinDBFs:()=>v,MinTokenLifetime:()=>Z,MinTokenRefreshInterval:()=>q,PlaybackPreload:()=>F,RenderQuantumSize:()=>V,VadPreload:()=>D,WebRtcAnswerTimeout:()=>J,WebRtcIceTimeout:()=>$,WebRtcMaxNegotiationAttempts:()=>z,WebRtcStatsSnapshotInterval:()=>j,WebRtcTimeout:()=>H});var R=3,E=3,F=3,C=250,D=3,L=512,V=128,v=-758.596,O=1e4,_=1e3,N=1e4,W=3e3,j=1e3,$=3e3,H=1e4,J=1e4,z=3,G=5e3,Z=6e4,q=5e3,Q=[0,100,200,200,500],Y="H264";function d(e,t,r){return e.postMessage(t,r)}var K;(e=>{let t;(r=>(r[r.InvalidPassword=-1]="InvalidPassword",r[r.Unknown=0]="Unknown",r[r.Unencrypted=1]="Unencrypted",r[r.Encrypted=2]="Encrypted"))(t=e.PeerCipherStatus||={})})(K||={});var{Deno:k}=globalThis,X=typeof k?.noColor=="boolean"?k.noColor:!1,ee=!X;function m(e,t){return{open:`\\x1B[${e.join(";")}m`,close:`\\x1B[${t}m`,regexp:new RegExp(`\\\\x1b\\\\[${t}m`,"g")}}function h(e,t){return ee?`${t.open}${e.replace(t.regexp,t.open)}${t.close}`:e}function p(e){return h(e,m([0],0))}function U(e){return h(e,m([1],22))}function te(e){return h(e,m([2],22))}var Se=new RegExp(["[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)","(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TXZcf-nq-uy=><~]))"].join("|"),"g"),re=new Date,f=(e=>(e[e.CRITICAL=0]="CRITICAL",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.DEBUG=4]="DEBUG",e))(f||{}),T={0:"\\u{1F4A5}",1:"\\u{1F534}",2:"\\u{1F7E1}",3:"\\u{1F535}",4:"\\u{1F7E3}"},ne={4:te,3:p,2:p,1:U,0:U};function se({message:e}){return String(e)}function S(e){return JSON.stringify({timestamp:e.date.toISOString(),level:f[e.level],message:e.message,extra:e.extra})}function I(e){function t(c,i){return[Math.floor(c/i),c%i]}function r(){let c,i=e.date.valueOf()-re.valueOf();[i,c]=t(i,1e3);let[B,A]=t(i,60);return`${B.toString().padStart(4,"0")}:${A.toString().padStart(2,"0")}.${c.toString().padStart(3,"0")}`}function n(){return e.extra===void 0?"":typeof Deno=="object"?" "+Deno.inspect(e.extra,{compact:!1,colors:!0,trailingComma:!0}).trimStart():" "+JSON.stringify(e.extra)}let s=T[e.level],a=e.logger.name!==void 0?`@${e.logger.name}`:"";return`${p(r())}${a} ${s} ${ne[e.level](String(e.message))}${n()}`}function oe(e){let t=`[${e.date.toISOString()}]`,r=`[${f[e.level]}]`,n=e.logger.name!==void 0?`[${e.logger.name}] `:"",s=T[e.level];return`${t} ${s} ${r.padEnd(7," ")} ${n}${e.message}`}function ae(){return typeof Deno=="object"&&Deno.stdout.isTerminal()}var w=class{static sparse=se;static json=S;static pretty=I;static structured=oe;static default=ae()?I:S;constructor(){}};var ie=class{formatter;consoleObject;filter;constructor(e=w.default,t=4,r=console){this.filter=t,this.formatter=e,this.consoleObject=r}handle(e){let t=this.formatter(e);switch(e.level){case 0:case 1:this.consoleObject.error(t);break;case 2:this.consoleObject.warn(t);break;case 3:this.consoleObject.info(t);break;case 4:this.consoleObject.debug(t);break}}};var o=class{#e;sinks;filter;parent;get name(){return this.#e}constructor(e,t=void 0,r=[],n=void 0){this.#e=t,this.sinks=r,this.filter=e,this.parent=n}log(e,t,r=void 0){let n={date:new Date,level:e,logger:this,message:t,extra:r};this.filter<e||this.insert(n)}insert(e){if(!(this.filter<e.level)){for(let t of this.sinks)t.filter>=e.level&&t.handle(e);this.parent!==void 0&&this.parent.insert(e)}}error=this.log.bind(this,1);warn=this.log.bind(this,2);info=this.log.bind(this,3);debug=this.log.bind(this,4)},l=globalThis[Symbol.for("odin-global-logger")]??=new o(3,void 0,[new ie]),ce=o.prototype.log.bind(l,1),ue=o.prototype.log.bind(l,2),le=o.prototype.log.bind(l,3),fe=o.prototype.log.bind(l,4),Ie=o.prototype.log.bind(l);var b=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.blocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"init":this.state=new y(s.workerPort,sampleRate*.02);break;case"close":this.alive=!1;break;case"dump":s.result.postMessage(this.dump());break}}process(r,n,s){if(this.state===void 0||r.length<1||r[0].length<1)return this.alive;let a=this.state.fill(0,r[0][0]);return this.state.offset===this.state.length&&(this.state.flush(),this.state.fill(a,r[0][0])),this.alive}dump(){return{type:"unshared capture worklet",alive:this.alive,sampleRate,offset:this.state?.offset||null,length:this.state?.length||null,blocks:this.blocks}}},x=class extends AudioWorkletProcessor{constructor(){super();this.alive=!0;this.silenceBlocks=0;this.voiceBlocks=0;this.totalBlocks=0;this.port.onmessage=this.onMessage.bind(this)}async onMessage(r){let[n,s]=r.data;switch(n){case"close":this.alive=!1;break;case"init":this.state=new g(s.workerPort,sampleRate*.02),s.workerPort.onmessage=this.onMessage.bind(this);break;case"samples":this.state?.add(s.id,s.buffer);break;case"dump":s.result.postMessage(this.dump());break}n==="close"&&(this.alive=!1)}process(r,n,s){if(this.state===void 0||n.length<1||n[0].length<2)return this.alive;let a=this.state.fill(0,n[0][0],n[0][1]);return a<u.RenderQuantumSize&&(this.totalBlocks+=1,this.state.next(),this.state.hasVoice?this.voiceBlocks+=1:this.silenceBlocks+=1,this.state.fill(a,n[0][0],n[0][1])),this.alive}dump(){return{type:"unshared playback worklet",alive:this.alive,sampleRate,id:this.state?.id||null,offset:this.state?.offset||null,length:this.state?.length||null,hasVoice:this.state?.hasVoice??!1,silenceBlocks:this.silenceBlocks,voiceBlocks:this.voiceBlocks,totalBlocks:this.totalBlocks}}},y=class{constructor(t,r){this.port=t;this.length=r;this.offset=0,this.buffer=new Float32Array(r)}fill(t,r){let n=Math.min(r.length-t,this.length-this.offset);return this.buffer.set(r.subarray(t,t+n),this.offset),this.offset+=n,t+n}flush(){d(this.port,["captureTick",{buffer:this.buffer}],[this.buffer.buffer]),this.offset=0,this.buffer=new Float32Array(this.length)}},g=class{constructor(t,r){this.port=t;this.length=r;this.cache=[];this.id=-1,this.offset=0,this.buffer=void 0,this.next()}get hasVoice(){return this.buffer!==void 0}fill(t,r,n){let s=Math.min(u.RenderQuantumSize-t,this.length-this.offset);return this.buffer!==void 0&&(r.set(this.buffer.subarray(this.offset,this.offset+s),t),n.set(this.buffer.subarray(this.offset+this.length,this.offset+this.length+s),t)),this.offset+=s,t+s}add(t,r){this.cache.push({id:t,buffer:r})}next(){for(this.id+=1;this.cache[0]?.id<this.id;)this.cache.shift();this.cache[0]?.id===this.id?(this.buffer=this.cache[0].buffer,this.cache.shift()):this.buffer=void 0,this.offset=0,d(this.port,["playbackTick",{}])}};registerProcessor("OdinCaptureProcessor",b);registerProcessor("OdinPlaybackProcessor",x);})();\n'});var L0={};Tx(L0,{UnsharedCaptureWorker:()=>sx,UnsharedPlaybackWorker:()=>ix,createCaptureWorker:()=>vF,createPlaybackWorker:()=>CF});import{Strand as eF}from"@4players/odin-common";function vF(v,D,j,e,B=i.DefaultRefreshRate){return BF.enqueue(async()=>{let[C,E]=await Y(Zx,Yx,v,"OdinCaptureProcessor",{channelCount:1,numberOfInputs:1,numberOfOutputs:0});return console.warn("SharedArrayBuffer is not available; creating ODIN CaptureWorker in fallback mode"),sx.create(v,D,j,B,C,E,e)})}async function CF(v,D=i.DefaultRefreshRate){if(v.sampleRate!==48e3)throw new Error("playback sample rate must be 48kHz ");let[j,e]=await Y(Zx,Yx,v,"OdinPlaybackProcessor",{numberOfInputs:0,numberOfOutputs:1,outputChannelCount:[2]});return ix.create(v,D,j,e)}var BF,sx,ix,H0=q(()=>{"use strict";u();nx();y0();_0();BF=new eF;sx=class v extends X{constructor(j,e,B,C,E){super(j,e,B,C,E);this._Activity=_;this._SpeechProbability=0;e.addEventListener("message",this._OnMessages.bind(this))}static async create(j,e,B,C,E,f,s){let{port1:b,port2:d}=new MessageChannel;return c(E,["captureInit",{sampleRate:j.sampleRate,refreshRate:C,workletPort:b}],[b]),await U(E,"captureReady"),c(f.port,["init",{workerPort:d}],[d]),new v(f,E,e,B,s)}get activity(){return this._Activity}get speechProbability(){return this._SpeechProbability}setVolume(j){c(this.worker,["captureSetVolume",{value:j}])}_OnMessages(j){super._OnMessages(j);let[e,B]=j.data;e==="captureUpdate"&&(this._Activity={isSilent:!B.active,rmsDBFS:B.rmsDBFs},this._SpeechProbability=B.speechProbability)}},ix=class v extends z{constructor(j,e,B){super(j,e,B);this.activities=new Float32Array;this.jitterStats=[]}static async create(j,e,B,C){let{port1:E,port2:f}=new MessageChannel;return c(B,["playbackInit",{workletPort:E,refreshRate:e}],[E]),await U(B,"playbackReady"),c(C.port,["init",{workerPort:f}],[f]),new v(j,C,B)}getActivity(j){let e=this.medias.get(m(j));if(e===void 0)return;let B=this.activities.at(e.index);if(B!==void 0)return B===0?_:{isSilent:!1,rmsDBFS:B}}getJitterStats(j){let e=this.medias.get(m(j));if(e===void 0)return;let B=this.jitterStats.at(e.index);if(B!==void 0)return B}setGlobalVolume(j){c(this.worker,["playbackSetVolume",{index:"global",value:j}])}setVolume(j,e){let B=this.medias.get(m(j));B!==void 0&&c(this.worker,["playbackSetVolume",{index:B.index,value:e}])}_GetFreeIndex(){let j=super._GetFreeIndex();if(j!==void 0)return j;if(this.medias.size<i.MaxNumberOfDecoders)return this.medias.size}_OnMessages(j){super._OnMessages(j);let[e,B]=j.data;e==="playbackUpdate"&&(this.activities=B.activities,this.jitterStats=B.jitterStats)}}});u();import{Backend as r,generateUUID as cr}from"@4players/odin-common";u();import{Backend as x,JITTER_STATS_INITIAL as K0,Strand as oF,assert as aF}from"@4players/odin-common";u();import{APM_DEFAULTS as nF,Backend as hB,generateUUID as sF,VAD_DEFAULTS as iF}from"@4players/odin-common";import{failure as p0,isFirefoxBrowser as VA,sleep as UA,success as WA}from"@4players/odin-common";async function h0(v,D,j){let e;if(D.device?.device.kind==="track"&&D.device?.device.audioTrack)e=new MediaStream([D.device.device.audioTrack]);else{let E=D.device?{exact:D.device.device.deviceId==="default"?void 0:D.device.device.deviceId}:void 0;try{let f=await Promise.race([navigator.mediaDevices.getUserMedia({audio:{echoCancellation:j.echoCanceller,noiseSuppression:j.noiseSuppression!=="None",autoGainControl:j.gainController,echoCancellationType:"system",deviceId:E}}),UA(3e4,"timeout")]);if(f==="timeout")return p0("getUserMedia; timeout");e=f}catch(f){return p0(`getUserMedia; ${f}`)}}let B=e.getAudioTracks()[0].getSettings().sampleRate,C=await v.audioContexts.acquire(B);return WA(C.createMediaStreamSource(e))}function W(v){v.getTracks().forEach(D=>{D.stop(),v.removeTrack(D)})}async function q0(v){return new L({deviceId:v.id,kind:"track",name:v.label??"MediaStreamTrack",audioTrack:v},!1)}async function fx(){if(VA()){let B=await QA("microphone");(B==="granted"||B===!1)&&await zA("audio")}let v=(await navigator.mediaDevices.enumerateDevices()).filter(B=>!!B.label),D=[],j=new L({deviceId:"default",name:"Default",kind:"audioinput"},!0),e=new L({deviceId:"default",name:"Default",kind:"audiooutput"},!0);D.push(j),D.push(e);for(let B of v){if(B.deviceId==="default"){B.kind==="audioinput"&&(j=new L({deviceId:"default",name:B.label,kind:"audioinput"},!0),D[0]=j),B.kind==="audiooutput"&&(e=new L({deviceId:"default",name:B.label,kind:"audiooutput"},!0),D[1]=e);continue}B.kind==="audioinput"&&D.push(new L({deviceId:B.deviceId,name:B.label,kind:"audioinput"},!1)),B.kind==="audiooutput"&&D.push(new L({deviceId:B.deviceId,name:B.label,kind:"audiooutput"},!1))}return D}async function QA(v){try{return(await navigator.permissions.query({name:v})).state}catch{return!1}}async function zA(v){try{let D=await navigator.mediaDevices.getUserMedia({[v]:!0});return D?.getTracks().forEach(j=>{j.stop(),D.removeTrack(j)}),!0}catch{return!1}}u();import{isSafariBrowser as EF,isSharedArrayBufferCapable as fF}from"@4players/odin-common";var N0=fF()&&!EF()?Promise.resolve().then(()=>($0(),g0)):Promise.resolve().then(()=>(H0(),L0));async function w0(v,D,j,e){return N0.then(B=>B.createCaptureWorker(v,D,j,e,i.DefaultRefreshRate))}async function P0(v){return N0.then(D=>D.createPlaybackWorker(v,i.DefaultRefreshRate))}var w=class{constructor(D,j){this.controller=D;this._Medias=new Map;this._Vad={...iF};this._Apm={...nF};this._Volume=1;this._Queue=Promise.resolve();this._DeviceCb=()=>{this._enqueue(async()=>{!this._DeviceParameters?.device||(await fx()).some(B=>B.device.deviceId===this._DeviceParameters?.device?.device.deviceId)||this._Capture?.source.mediaStream?.getAudioTracks()[0]?.readyState==="live"||(this._DeviceParameters?.onStatusChanged?.("stopped"),navigator.mediaDevices.removeEventListener("devicechange",this._DeviceCb),this._DeviceParameters=void 0,await this._closeImpl())}).catch(D=>k("device-change handler failed",D))};j.apm&&this.setApm(j.apm).catch(console.error),j.vad&&this.setVad(j.vad),typeof j.volume<"u"&&this.setVolume(j.volume).catch(console.error),this.uid=sF(),this.#x=j.customType,this.#A=j.ref}#x;#A;_enqueue(D){let j=this._Queue.then(D,D);return this._Queue=j.catch(()=>{}),j}get vad(){return this._Vad}get apm(){return this._Apm}get volume(){return this._Volume}get activity(){return this._Capture?.worker.activity??_}get speechProbability(){return this._Capture?.worker.speechProbability??0}get deviceId(){return this._DeviceParameters?.device?.device.deviceId}async start(D,j){let e=this._Medias.get(j.connectionId);e===void 0&&this._Medias.set(j.connectionId,e=new Set),o(`starting audio capture media ${j.mediaId} on connection ${j.connectionId}`),!e.has(j.mediaId)&&(e.add(j.mediaId),D.mainConnection?.id===j.connectionId&&await D.request("StartMedia",{media_id:j.mediaId,properties:{kind:"audio",uid:this.uid,ref:this.#A,customType:this.#x}}).catch(B=>p(`StartMedia got rejected; ${B}`)),this._UpdateMedias())}async stop(D,j){let e=this._Medias.get(j.connectionId);o(`stopping audio capture media ${j.mediaId} on connection ${j.connectionId}`),e?.delete(j.mediaId)&&(D.mainConnection?.id===j.connectionId&&await D.request("StopMedia",{media_id:j.mediaId}).catch(B=>p(`StopMedia got rejected; ${B}`)),this._UpdateMedias())}setVad(D){a("updating vad config",D),this._Vad=D,this._Capture&&this._Capture.worker.setVad(D)}async setApm(D){await this._enqueue(()=>this._setApmImpl(D))}async _setApmImpl(D){a("updating apm config",D),this._Apm=D,this._DeviceParameters&&await this._setDeviceImpl(this._DeviceParameters)}async setDevice(D){await this._enqueue(()=>this._setDeviceImpl(D))}async _setDeviceImpl(D){a("updating capture device parameters",D);let j=this._DeviceParameters;if(this._DeviceParameters=D,this._Volume!=="muted")try{let e=await h0(this.controller,D,{...this._Apm,echoCanceller:this._Monitor?!1:this._Apm.echoCanceller});if(e.type!=="Success"){p(`unable to open capture device; ${e.reason}`),this._DeviceParameters=j;return}if(this._DeviceParameters.onStatusChanged&&navigator.mediaDevices.addEventListener("devicechange",this._DeviceCb),this._Capture!==void 0){W(this._Capture.source.mediaStream);try{this._Capture.source.disconnect(this._Capture.worker.worklet)}catch(B){k("failed to disconnect previous capture source",B)}}this._Capture===void 0||this._Capture.worker.worklet.context!==e.value.context?(this._Capture?.worker.close(),this._Capture={worker:await w0(e.value.context,this.controller.sink,this.controller.receiveMonitoredPacket.bind(this.controller),new WeakRef(this)),source:e.value},await this._UpdateMedias(),this._Capture.worker.setVolume(this._Volume),this.setVad(this.vad)):this._Capture.source=e.value,this._Capture.source.connect(this._Capture.worker.worklet)}catch(e){throw new Error(`Error in setDevice(); ${e}`)}}async setVolume(D){await this._enqueue(()=>this._setVolumeImpl(D))}async _setVolumeImpl(D){a(`updating capture volume to ${D}`),this._Volume=D,D==="muted"?await this._closeImpl():(!this._Capture&&this._DeviceParameters&&await this._setDeviceImpl(this._DeviceParameters),this._Capture?.worker.setVolume(D))}async close(){await this._enqueue(()=>this._closeImpl())}async _closeImpl(){if(a("closing audio capture"),this._Capture!==void 0){this._Capture.worker.close(),W(this._Capture.source.mediaStream);try{this._Capture.source.disconnect(this._Capture.worker.worklet)}catch(D){k("failed to disconnect audio node",D)}await this.controller.audioContexts.release(this._Capture.source.context)}navigator.mediaDevices.removeEventListener("devicechange",this._DeviceCb),this._Capture=void 0}async dump(){let D=[];for(let[j,e]of this._Medias)D.push(`${j} => ${Array.from(e.values()).join(",")}`);return{uid:this.uid,ref:this.#A??null,customType:this.#x??null,worker:await this._Capture?.worker.dump()??null,vad:this._Vad,apm:this._Apm,volume:this._Volume,medias:D}}async _UpdateMedias(){if(this._Capture!==void 0){let D=Array.from(this._Medias).map(([j,e])=>({id:j,mediaIds:Array.from(e)}));this._Capture.worker.setMedias(D)}}async startLoopback(){this._Monitor===void 0&&(a("starting audio capture loopback"),this.setApm(this._Apm),this._Monitor=await this.controller.createAudioPlayback({uid:"loopback"}),this._Monitor.start({connectionId:0,mediaId:0}),this._Medias.set(0,new Set([0])),await this._UpdateMedias())}async stopLoopback(){this._Monitor!==void 0&&(a("stopping audio capture loopback"),this._Monitor.close(),this._Monitor=void 0,this.setApm(this._Apm),this._Medias.delete(0),await this._UpdateMedias())}};import{assert as bx,Backend as t,generateUUID as bF}from"@4players/odin-common";u();var $=class{constructor(D,j){this.controller=D;this.parameters=j;this.uid=bF()}#x;#A=new Map;#F;get customType(){return this.parameters?.customType}get mediaStream(){return this.#x}get audioCapture(){return this.#F}get volume(){return bx(this.audioCapture,"getting the volume failed, this video has no Audio"),this.audioCapture.volume}async setVolume(D){bx(this.audioCapture,"setVolume() failed, this video has no Audio"),await this.audioCapture.setVolume(D)}get vad(){return bx(this.audioCapture,"getting the vad config failed, this video has no Audio"),this.audioCapture.vad}setVad(D){bx(this.audioCapture,"setVad() failed, this video has no Audio"),this.audioCapture.setVad(D)}async setDevice(D,j={voiceActivity:void 0,volumeGate:void 0}){if(this.#x)throw new Error("This VideoCapture already has a MediaStream.");if(!D.getVideoTracks()[0])throw new Error("Error when calling setDevice(), MediaStream does not contain a VideoStreamTrack!");if(this.#x=D,D.getAudioTracks()[0]){let B={device:await q0(D.getAudioTracks()[0]),vad:j,ref:this.uid};this.#F=await this.controller.createAudioCapture(B)}}async start(D,j){let e=this.#A.get(j.connectionId);if(e===void 0&&this.#A.set(j.connectionId,e=new Set),!e.has(j.mediaId)&&(e.add(j.mediaId),D.mainConnection?.id===j.connectionId)){let B={kind:"video",codec:this.parameters?.codec??i.DefaultVideoCodec,ref:this.#F?.uid,uid:this.uid};this.parameters?.customType&&(B.customType=this.parameters.customType),await D.request("StartMedia",{media_id:j.mediaId,properties:B}).catch(C=>p(`StartMedia got rejected; ${C}`))}}async stop(D,j){this.#x&&W(this.#x),this.#A.get(j.connectionId)?.delete(j.mediaId)&&D.mainConnection?.id===j.connectionId&&await D.request("StopMedia",{media_id:j.mediaId}).catch(B=>p(`StopMedia got rejected; ${B}`))}async dump(){let D=[];for(let[j,e]of this.#A)D.push(`${j} => ${Array.from(e.values()).join(",")}`);return{uid:this.uid,ref:this.#F?.uid??null,customType:this.customType??null,tracks:this.#x?.getVideoTracks().map(j=>({id:j.id,kind:j.kind,label:j.label,ready:j.readyState,muted:j.muted,settings:{...j.getSettings()}}))??[],volume:this.#F?.volume??0,medias:D}}close(){this.#x&&W(this.#x),this.audioCapture?.close(),this.#F=void 0}};u();import{Backend as qB}from"@4players/odin-common";var H=class{constructor(D,j,e){this.controller=D;this.uid=j;this.customType=e}get volume(){return this.controller.playbackGetVolume(this.uid)}get activity(){return this.controller.playbackGetActivity(this.uid)}get jitterStats(){return this.controller.playbackGetJitterStats(this.uid)}start(D){o(`starting audio playback media ${D.mediaId} on connection ${D.connectionId}`),this.controller.playbackStart(this.uid,D)}stop(D){o(`stopping audio playback media ${D.mediaId} on connection ${D.connectionId}`),this.controller.playbackStop(this.uid,D)}setVolume(D){a(`updating audio playback media '${this.uid}' volume to ${D}`),this.controller.playbackSetVolume(this.uid,D)}close(){a(`closing audio playback media '${this.uid}'`),this.controller.closePlayback(this.uid)}};function lF(v,D){let j=v.audioContext;if(typeof j.setSinkId=="function"){v.connectOutput(j.destination);let e,B=()=>{if(j.state==="running"&&e!==void 0){let C=e;e=void 0,j.setSinkId(C).catch(E=>k("failed to apply deferred sinkId",E))}};return j.addEventListener("statechange",B),{async setSinkId(C){if(j.state!=="running"){e=C;return}await j.setSinkId(C)},dispose(){j.removeEventListener("statechange",B)}}}if(D&&typeof document<"u"&&typeof HTMLAudioElement<"u"&&typeof HTMLAudioElement.prototype.setSinkId=="function"){let e=j.createMediaStreamDestination();v.connectOutput(e);let B=new Audio;B.srcObject=e.stream,B.muted=!1,B.volume=1;let C=!1,E=!1,f={once:!0,passive:!0,capture:!0},s=()=>{E=!1,h()},b=()=>{E||C||(E=!0,document.addEventListener("pointerdown",s,f),document.addEventListener("keydown",s,f))},d=()=>{E&&(E=!1,document.removeEventListener("pointerdown",s,!0),document.removeEventListener("keydown",s,!0))},h=()=>{C||B.play().catch(tx=>{C||(tx instanceof DOMException&&tx.name==="NotAllowedError"?b():k("failed to start playback audio element",tx))})},Bx=()=>{j.state==="running"&&B.paused&&h()};return j.addEventListener("statechange",Bx),h(),{async setSinkId(tx){await B.setSinkId(tx)},dispose(){C=!0,d(),j.removeEventListener("statechange",Bx),B.pause(),B.srcObject=null,B.removeAttribute("src");try{B.load()}catch{}e.disconnect()}}}return v.connectOutput(j.destination),{async setSinkId(){},dispose(){}}}var ox=class{constructor(D){this.audioContextFactory=D;this.entries=[]}async acquire(D){for(let e of this.entries){if(e.sampleRate===D)return e.references+=1,e.audioContext;if(e.sampleRate===void 0&&e.audioContext.sampleRate===D)return e.references+=1,e.audioContext}let j={sampleRate:D,audioContext:await this.audioContextFactory(D),references:1};return this.entries.push(j),j.audioContext}async release(D){let j=this.entries.findIndex(e=>e.audioContext===D);if(!(j<0)&&(this.entries[j].references-=1,this.entries[j].references<=0)){let e=this.entries[j].audioContext;this.entries.splice(j,1),await e.close()}}close(){for(let D of this.entries)D.audioContext.close()}},ax=class v{constructor(D,j,e=!1){this.audioContexts=D;this.sink=j;this.enableHTMLAudioElementFallback=e;this.audioCaptures=[];this.videoCaptures=[];this.globalVolume=[1,1];this.playbacks=new Map;this.setPlaybackStrand=new oF}async create(D,j){return new v(D,j)}receivePacket(D,j){this.playbackWorker?.receivePacket(D,j)}receiveMonitoredPacket(D,j){let e=j.slice();this.receivePacket(D,e)}async createAudioPlayback(D){let j=this.playbacks.get(D.uid),e=D.volume;if(j===void 0){e=e??[1,1];let B=new H(this,D.uid,D.customType);j={id:void 0,volume:e,playback:B},this.playbacks.set(D.uid,j)}return e!==void 0&&j.playback.setVolume(e),j.playback}async createAudioCapture(D){let j=new w(this,D);return await j.setDevice(D),this.audioCaptures.push(new WeakRef(j)),j}async createVideoCapture(D,j){let e=new $(this,j);return await e.setDevice(D),this.videoCaptures.push(new WeakRef(e)),e}playbackSetDevice(D){return this.setPlaybackStrand.enqueue(async()=>{let j=D?.device.deviceId??"";if(j==="default"&&(j=""),this.playbackWorker===void 0){let e=await this.audioContexts.acquire(48e3);this.playbackWorker=await P0(e),this.playbackSink=lF(this.playbackWorker,this.enableHTMLAudioElementFallback),this.playbackWorker.setGlobalVolume(this.globalVolume);for(let[,B]of this.playbacks)B.id!==void 0&&this.playbackWorker.addMedias(B.id.connectionId,[B.id.mediaId],B.volume)}if(D&&this.playbackSink!==void 0)try{await this.playbackSink.setSinkId(j)}catch(e){k("failed to set playback sink",e)}})}playbackSetGlobalVolume(D){this.globalVolume=D,this.playbackWorker?.setGlobalVolume(this.globalVolume)}playbackStart(D,j){let e=this.playbacks.get(D);e!==void 0&&(e.id!==void 0&&this.playbackStop(D,e.id),e.id=j,this.playbackWorker?.addMedias(j.connectionId,[j.mediaId],e.volume))}playbackStop(D,j){let e=this.playbacks.get(D);e!==void 0&&(e.id!==j&&k(`playback media ${j.mediaId} on connection ${j.connectionId} is out of sync`,e.id,j),e.id=void 0,this.playbackWorker?.removeMedias(j.connectionId,[j.mediaId]))}playbackGetActivity(D){let j=this.playbacks.get(D);return j?.id===void 0?_:this.playbackWorker?.getActivity(j.id)??_}playbackGetJitterStats(D){let j=this.playbacks.get(D);return j?.id===void 0?K0:this.playbackWorker?.getJitterStats(j.id)??K0}playbackSetVolume(D,j){let e=this.playbacks.get(D);e!==void 0&&(e.volume=j,e.id!==void 0&&this.playbackWorker?.setVolume(e.id,e.volume))}playbackGetVolume(D){return this.playbacks.get(D)?.volume??[1,1]}closePlayback(D){let j=this.playbacks.get(D);j!==void 0&&(j.id!==void 0&&this.playbackStop(D,j.id),this.playbacks.delete(D))}close(){this.playbackSink?.dispose(),this.playbackSink=void 0,this.playbackWorker?.close(),this.audioContexts.close()}async dump(){let D=[];for(let B of this.audioCaptures){let C=B.deref();C!==void 0&&D.push(await C.dump())}let j=[];for(let B of this.videoCaptures){let C=B.deref();C!==void 0&&j.push(await C.dump())}let e=[];for(let[B,C]of this.playbacks)e.push({uid:B,id:C.id||null,volume:C.volume});return{globalVolume:this.globalVolume,playbackWorker:await this.playbackWorker?.dump()||null,audioCaptures:D,videoCaptures:j,playbacks:e}}},L=class{constructor(D,j=!1){this.device=D;this.isDefault=j}get type(){switch(this.device.kind){case"audioinput":return"AudioCapture";case"audiooutput":return"AudioPlayback";default:aF(!1,"not supported device")}}get id(){return this.device.deviceId}get name(){return this.device.name}};u();import{nextTick as WF,success as xA}from"@4players/odin-common";import{decode as QF}from"@msgpack/msgpack";u();import{Backend as mB}from"@4players/odin-common";u();import{Backend as A,failure as kx,success as V0,CONNECTION_STATS_INITIAL as yF}from"@4players/odin-common";import{MainCommandsRpc as _F,MainNotificationsRpc as LF,RoomCommandsRpc as HF,RoomNotificationsRpc as NF}from"@4players/odin-common/api";u();import{failure as x0,success as A0}from"@4players/odin-common";import{MessagePackRpcSchema as uF,parseRequest as J0,parseResponse as kF}from"@4players/odin-common/api";import{encode as cF,decode as dF}from"@msgpack/msgpack";var M=class{constructor(D){this.stream=D;this._SendQueue=[];this._RecvQueue=[];this._EventQueue=[];this._Requests=new Map;this._Close=new AbortController;this._NextId=1;D instanceof WebSocket?(D.addEventListener("open",this._OnWebSocketOpen.bind(this)),D.addEventListener("close",this.close.bind(this)),D.addEventListener("message",j=>this._OnRpcMessage(j.data)),D.binaryType="arraybuffer"):(hF(D.readable.getReader(),this._OnRpcMessage.bind(this)).finally(this.close.bind(this)),this._Writer=D.writable.getWriter()),this._Close.signal.addEventListener("abort",this._Cleanup.bind(this),{once:!0})}get closed(){return this._Close.signal.aborted}get closeSignal(){return this._Close.signal}async request(D,j,e){if(this.closed)return Promise.resolve("closed");let B=this._NextId,C=e===void 0?void 0:setTimeout(()=>this._TimeoutRequest(B),e);return this._Send([0,B,D,j]),new Promise(E=>{this._Requests.set(B,{accept:E,timeoutId:C}),this._NextId+=1})}notify(D,j){this.closed||this._Send([2,D,j])}recv(){if(this.closed)return Promise.resolve("closed");let D=this._EventQueue.shift();return D!==void 0?Promise.resolve(D):new Promise(j=>this._RecvQueue.push(j))}close(){this._Close.abort()}_TimeoutRequest(D){let j=this._Requests.get(D);j!==void 0&&(this._Requests.delete(D),clearTimeout(j.timeoutId),j.accept("timeout"))}_Send(D){let j;D instanceof Uint8Array?j=D:j=new Uint8Array(cF(D,{ignoreUndefined:!0,forceFloat32:!0})),this.stream instanceof WebSocket?this.stream.send(j):this._Writer.write(j)}_OnWebSocketOpen(D){for(let j of this._SendQueue)this._Send(j);this._SendQueue.length=0}_OnRpcMessage(D){let j=pF(D);if(j.type!=="Success"){this.close();return}switch(j.value[0]){case 0:this._Send([1,j.value[1],"not supported",null]);break;case 1:this._OnResponse(j.value[1],j.value[2],j.value[3]);break;case 2:this._OnEvent(j.value[1],j.value[2]);break}}_OnResponse(D,j,e){let B=this._Requests.get(D);B!==void 0&&(clearTimeout(B.timeoutId),B.accept(j===null?A0(e):x0(j)))}_OnEvent(D,j){let e=this._RecvQueue.shift();e!==void 0?e({name:D,properties:j}):this._EventQueue.push({name:D,properties:j})}_Cleanup(){for(let D of this._Requests.values())clearTimeout(D.timeoutId),D.accept("closed");this._Requests.clear();for(let D of this._RecvQueue)D("closed");this._RecvQueue.length=0,this._SendQueue.length=0,this.stream instanceof WebSocket?this.stream.close():this._Writer?.close().catch(()=>{})}},V=class{constructor(D,j,e){this.rpc=D;this._Commands=j;this._Events=e}get closed(){return this.rpc.closed}get closeSignal(){return this.rpc.closeSignal}async request(D,j,e){j=J0(D,j,this._Commands);let B=await this.rpc.request(D,j,e);if(B==="closed"||B==="timeout"||B.type==="Failure")return B;let C=kF(D,B.value,this._Commands);return C!==void 0?A0(C):x0("response schema failed validation")}notify(D,j){j=J0(D,j,this._Commands),this.rpc.notify(D,j)}async recv(){let D=await this.rpc.recv();if(D==="closed")return D;let j=F0(this._Events,D);return j!==void 0?j:(O0(this._Events,D.name)?(p(`schema validation for ${D.name} failed; closing connection`),this.rpc.close()):k(`dropping unknown event ${D.name}`),"closed")}close(){this.rpc.close()}};function pF(v){try{return A0(uF.parse(dF(new Uint8Array(v))))}catch(D){return x0(String(D))}}function F0(v,D){if(!O0(v,D.name))return;let j=v[D.name].safeParse(D.properties);if(j.success)return{name:D.name,properties:j.data}}function O0(v,D){return D in v}async function hF(v,D){let j=new Uint8Array;for(;;){let e=a0(j,0);if(e===n){v.cancel("protocol violation");break}if(e!==I&&e<=j.length){D(j.subarray(0,e)),j=j.subarray(e);continue}let B;try{B=await v.read()}catch{break}if(B.done)break;j=qF(j,B.value)}j.length>0&&k("unprocessed bytes left in rpc stream",j)}function qF(v,D){if(v.length===0)return D;if(D.length===0)return v;let j=new Uint8Array(v.length+D.length);return j.set(v,0),j.set(D,v.length),j}u();import{failure as lx,fromBase64Url as mF,success as GF}from"@4players/odin-common";import{TokenClaimsSchema as IF}from"@4players/odin-common/api";var y=class v{constructor(D,j){this.text=D;this.claims=j;if(j.ups!==void 0){let e=v.parse(j.ups);e.type==="Success"?this._Upstream=e.value:p(`upstream in token can not be parsed; ${e.reason}`)}}static parse(D){let j=D.split(".");if(j.length!==3)return lx("expected three segments");let e=mF(j[1]);if(e.type==="Failure")return lx(`invalid token; ${e.reason}`);let B;try{B=JSON.parse(e.value)}catch(E){return lx(`invalid token; ${E}`)}let C=IF.safeParse(B);return C.success===!1?lx(`invalid token; ${C.error}`):GF(new v(D,C.data))}get timeLeft(){return this.claims.exp===void 0?1/0:this.claims.exp*1e3-Date.now()}get upstream(){return this._Upstream}get defaultRoomId(){return Array.isArray(this.claims.rid)?this.claims.rid.length===1?this.claims.rid[0]:void 0:this.claims.rid}hasAudience(D){return this.claims.aud===void 0&&D==="gateway"?!0:Array.isArray(this.claims.aud)?this.claims.aud.includes(D):this.claims.aud===D}toString(){return this.text}};u();import{VideoCodec as gF,assert as M0}from"@4players/odin-common";function T0(v){typeof globalThis.rtcDataChannels>"u"&&(globalThis.rtcDataChannels=[]),Array.isArray(globalThis.rtcDataChannels)&&globalThis.rtcDataChannels.length<=100&&globalThis.rtcDataChannels.push(v)}function S0(v){let D=globalThis.rtcDataChannels?.indexOf(v);D!==void 0&&D>=0&&globalThis.rtcDataChannels.splice(D,1),v.readyState!=="closed"&&v.close()}function ux(v){typeof globalThis.rtcPeerConnections>"u"&&(globalThis.rtcPeerConnections=[]),Array.isArray(globalThis.rtcPeerConnections)&&globalThis.rtcPeerConnections.length<=100&&globalThis.rtcPeerConnections.push(v)}function R0(v){let D=globalThis.rtcPeerConnections?.indexOf(v);D!==void 0&&D>=0&&globalThis.rtcPeerConnections.splice(D,1),v.connectionState!=="closed"&&v.close()}var xx=class{constructor(D,j,e){this._localVideos=new Map;this._remoteVideos=new Map;this._freeLocalVideoTransceivers=[];this._negotiationRequested=!1;this._negotiationRunning=!1;this._negotiationCounter=0;this._pendingRemoteCandidates=[];this._WebRtcStatsSnapshot=null;this._peerConnection=D,this._signaling=j,this._answerTimeout=e?.answerTimeout??i.WebRtcAnswerTimeout,this._maxNegotiationAttempts=e?.maxNegotiationAttempts??i.WebRtcMaxNegotiationAttempts,this._peerConnection.ontrack=this._onTrack.bind(this),this._peerConnection.onconnectionstatechange=()=>this._onStatusChanged(),this._peerConnection.onicecandidate=B=>{(B.candidate?this._signaling.sendIceCandidate(B.candidate):this._signaling.sendIceComplete()).catch(E=>{k("failed to send local ice candidate",E)})},this._WebRtcStatsInterval=setInterval(()=>{this._snapshotStats()},i.WebRtcStatsSnapshotInterval)}requestNegotiation(){this._negotiationRequested=!0,!this._negotiationRunning&&(this._negotiationRunning=!0,setTimeout(async()=>{let D=0;for(;this._negotiationRequested;){this._negotiationRequested=!1;try{await this._negotiate(),D=0}catch(j){if(D+=1,p(`negotiation failed during sdp offer/answer exchange (attempt ${D})`,j),D<this._maxNegotiationAttempts)this._negotiationRequested=!0;else{this._negotiationRunning=!1,this._signaling.closeConnection().catch(()=>{});return}}}this._negotiationRunning=!1}))}async startLocalVideo(D,j,e){if(this._localVideos.has(D))return;o(`starting local video for media ${D}`);let B=this._freeLocalVideoTransceivers.pop();if(B?(await B.sender.replaceTrack(j),B.direction="sendrecv"):B=this._peerConnection.addTransceiver(j),e){let f=B.sender.getParameters(),{maxBitrate:s,maxFramerate:b,scaleResolutionDownBy:d}=e,h={...s!==void 0&&{maxBitrate:s},...b!==void 0&&{maxFramerate:b},...d!==void 0&&{scaleResolutionDownBy:d}};if(f.encodings.length===0)f.encodings.push(h);else for(let Bx of f.encodings)Object.assign(Bx,h);e.degradationPreference&&(f.degradationPreference=e.degradationPreference),await B.sender.setParameters(f)}let E=new gF(e?.codec??i.DefaultVideoCodec).isSupported();E&&B.setCodecPreferences([E]),this._localVideos.set(D,{transceiver:B}),this.requestNegotiation()}stopLocalVideo(D){let j=this._localVideos.get(D);j&&(o(`stopping local video for media ${D}`),this._localVideos.delete(D),j.transceiver.sender.track&&(j.transceiver.sender.track.enabled=!1),j.transceiver.direction="inactive",j.transceiver.sender.replaceTrack(null).catch(()=>{}),this._freeLocalVideoTransceivers.push(j.transceiver),this.requestNegotiation())}startRemoteVideo(D){o(`starting remote video for media ${D}`);let j=this._peerConnection.addTransceiver("video",{direction:"recvonly"}),e=new Promise((B,C)=>{this._remoteVideos.set(D,{state:"Requested",transceiver:j,promise:{resolve:B,reject:C}})});return this.requestNegotiation(),e}stopRemoteVideo(D){let j=this._remoteVideos.get(D);if(j){o(`stopping remote video for media ${D}`),this._remoteVideos.delete(D),j.state!=="Active"&&j.promise.reject(new Error("video stopped"));try{j.transceiver.stop()}catch{}this.requestNegotiation()}}async handleWebRtcUpdate(D){try{switch(D.kind){case"Sdp":await this._updateRemoteSdp(D.type==="Answer"?"answer":"offer",D.sdp,D.media_map,D.negotiation_id);break;case"Trickle":this._addIceCandidate({candidate:D.candidate,sdpMid:D.spd_mid??void 0,sdpMLineIndex:D.spd_mline_index??void 0,usernameFragment:D.username_fragment??void 0});break;case"TrickleFinished":this._addIceCandidate(void 0);break}}catch(j){p("failed to handle webrtc update",j,D)}}startup(){this._peerConnection.connectionState==="new"&&this.requestNegotiation()}cleanup(){for(let[,D]of this._remoteVideos)D.state!=="Active"&&D.promise.reject(new Error("connection closed"));this._pendingAnswer?.reject(new Error("connection closed")),this._pendingRemoteCandidates.length=0,clearTimeout(this._WebRtcIceTimeout),clearTimeout(this._WebRtcTimeout),clearInterval(this._WebRtcStatsInterval),this._localVideos.clear(),this._remoteVideos.clear(),this._freeLocalVideoTransceivers.length=0}get stats(){return this._WebRtcStatsSnapshot}get peerConnection(){return this._peerConnection}get localVideos(){return this._localVideos}get remoteVideos(){return this._remoteVideos}get isConnected(){return this._peerConnection.connectionState==="connected"}get isNegotiating(){return this._negotiationRunning}async _snapshotStats(){try{let D=await this._peerConnection.getStats(),j={},e={bytesSent:0,bytesReceived:0,packetsSent:0,packetsReceived:0,rtt:0};D.forEach(B=>{let{type:C,...E}=B;C!=="certificate"&&(C==="candidate-pair"&&B.nominated&&(e.bytesSent+=B.bytesSent??0,e.bytesReceived+=B.bytesReceived??0,e.packetsSent+=B.packetsSent??0,e.packetsReceived+=B.packetsReceived??0,e.rtt=B.currentRoundTripTime??0),j[C]||(j[C]=[]),j[C].push(E))}),this._WebRtcStatsSnapshot={timestamp:Date.now(),status:this._peerConnection.connectionState,stats:e,report:j}}catch{}}_addIceCandidate(D){if(D&&(D.sdpMid===void 0&&D.sdpMLineIndex===void 0&&(D={...D,sdpMid:"0"}),a(`adding new ice ${D.candidate}`,D)),this._peerConnection.remoteDescription===null){this._pendingRemoteCandidates.push(D);return}this._applyIceCandidate(D)}_applyIceCandidate(D){this._peerConnection.addIceCandidate(D).catch(j=>{k("failed to add remote ice candidate",j,D)})}_flushPendingIceCandidates(){let D=this._pendingRemoteCandidates.splice(0);for(let j of D)this._applyIceCandidate(j)}async _negotiate(){let D=++this._negotiationCounter,j=await this._peerConnection.createOffer();M0(j.type==="offer"&&j.sdp,"generated broken payload"),await this._peerConnection.setLocalDescription(j);let e=[];for(let[C,{transceiver:E}]of this._localVideos)E.mid&&e.push([C,E.mid]);for(let[C,E]of this._remoteVideos)E.state!=="Active"&&E.transceiver.mid&&e.push([C,E.transceiver.mid]);let B=new Promise((C,E)=>{this._pendingAnswer={negotiationId:D,resolve:C,reject:E}});try{await this._signaling.sendOffer(j.sdp,e,D),await $F(B,this._answerTimeout,`timed out waiting for answer to offer ${D}`)}finally{this._pendingAnswer=void 0}}async _updateRemoteSdp(D,j,e,B){if(D==="offer"){k("ignoring unexpected sdp offer from server");return}let C=this._pendingAnswer;if(C===void 0){k("ignoring sdp answer without pending negotiation");return}if(B!==void 0&&B!==C.negotiationId){k(`ignoring stale sdp answer for negotiation ${B}; current is ${C.negotiationId}`);return}if(this._peerConnection.signalingState!=="have-local-offer"){k(`ignoring sdp answer in signaling state ${this._peerConnection.signalingState}`);return}for(let[E,f]of e){let s=this._remoteVideos.get(E);s?.state==="Requested"&&(this._remoteVideos.set(E,{state:"Mapped",transceiver:s.transceiver,mid:f,promise:s.promise}),a(`updated remote video list with media ${E}`,s,this._remoteVideos))}try{await this._peerConnection.setRemoteDescription({type:D,sdp:j})}catch(E){C.reject(E);return}this._flushPendingIceCandidates(),C.resolve()}async _onStatusChanged(){switch(a(`peer connection state changed to ${this._peerConnection.connectionState}`),this._peerConnection.connectionState){case"closed":break;case"connected":clearTimeout(this._WebRtcIceTimeout),this._WebRtcIceTimeout=void 0,clearTimeout(this._WebRtcTimeout),this._WebRtcTimeout=void 0;break;case"failed":this._peerConnection.restartIce(),this.requestNegotiation();case"disconnected":i.MainConnectionPingInterval!==void 0&&await this._signaling.checkConnection();default:this._WebRtcIceTimeout===void 0&&(this._WebRtcIceTimeout=setTimeout(()=>{a("ice connection timeout was reached"),this._peerConnection.restartIce(),this._WebRtcIceTimeout=void 0},i.WebRtcIceTimeout)),this._WebRtcTimeout===void 0&&(this._WebRtcTimeout=setTimeout(async()=>{a("peer connection timeout was reached"),await this._signaling.closeConnection()},i.WebRtcTimeout));break}}_onTrack(D){let j=Array.from(this._remoteVideos).find(([,C])=>C.state==="Mapped"&&C.mid===D.transceiver.mid);if(!j){k(`unexpected track with mid: ${D.transceiver.mid}`);return}let[e,B]=j;M0(B.state==="Mapped","expected video state to be Mapped"),this._remoteVideos.set(e,{state:"Active",transceiver:D.transceiver}),a(`updated local video list with media ${e}`,j,D.transceiver,this._localVideos),D.track.onended=()=>{a(`video track with mid ${D.transceiver.mid} ended`,j)},B.promise.resolve(D.track)}};function $F(v,D,j){return new Promise((e,B)=>{let C=setTimeout(()=>B(new Error(j)),D);v.then(E=>{clearTimeout(C),e(E)},E=>{clearTimeout(C),B(E)})})}var cx=class v{constructor(D,j,e,B,C,E,f){this.id=D;this.address=j;this.connection=B;this.datagramWritable=C;this.rpc=E;this.closeController=f;this._ConnectionStats={...yF};this._WebRtcSessionFlight=new S;this._PingFlight=new S;this.status=0;this._ClosePromise=(async()=>{try{await this.connection.closed}catch{}return"closed"})(),i.MainConnectionPingInterval!==void 0&&(this._PingIntervalId=setInterval(async()=>{this.connectionStats.rtt=await this.ping(i.HealthCheckTimeout)},i.MainConnectionPingInterval)),f.signal.addEventListener("abort",()=>this._CleanUp(),{once:!0}),this.datagramWriter=C.getWriter(),this.connection.closed.then(()=>{this.status=2}).catch(()=>{}),this.connection.ready.then(()=>{this.status=1}).catch(()=>{}),this.readDatagrams(this.connection,this.id,(s,b)=>{this._ConnectionStats.packetsReceived+=1,e(s,b)})}static async create(D,j,e,B){try{let C=new URL(`https://${j}?version=${u0}&uid=${dx}`),E=new AbortController;B.addEventListener("abort",()=>E.abort(),{once:!0});let f=new WebTransport(C);E.signal.addEventListener("abort",()=>{try{f.close()}catch{}},{once:!0}),await f.ready;let s=f.datagrams,b=s?.createWritable?.()??s?.writable;if(!b)return E.abort(),kx(`connecting to ${j} failed because WebTransport datagrams are not supported by this browser`);let d=await f.createBidirectionalStream(),h=new V(new M(d),_F,LF);return E.signal.addEventListener("abort",()=>h.close(),{once:!0}),h.notify("Hello",{stream:"main"}),V0(new v(D,j,e,f,b,h,E))}catch(C){return kx(`connecting to ${j} failed with ${C}`)}}get connectionStats(){return this._ConnectionStats}get transport(){return"H3"}get closePromise(){return this._ClosePromise}get closeSignal(){return this.closeController.signal}get closed(){return this.closeSignal.aborted}waitForConnected(){return Promise.race([this.connection.ready,this.connection.closed.then(()=>{throw new Error("connection closed")})])}close(){o(`closing connection to '${this.address}' with id ${this.id}`),this.closeController.abort("request")}async joinRoom(D,j,e,B){try{if(this.closed)return"closed";let C=await this.connection.createBidirectionalStream().catch(()=>"closed");if(C==="closed")return"closed";let E=new V(new M(C),HF,NF),f=await E.request("Hello",{stream:"room",token:String(D),room_id:j,user_data:e,position:B});return f==="closed"||f.type==="Failure"?f:V0(E.rpc)}catch(C){return kx(`JoinRoom failed; ${C}`)}}async getReconnectToken(D){let j=await this._Request("RequestReconnectToken",{peer_id:D});return j.type==="Failure"?j:y.parse(j.value)}async healthCheck(){let D=await this._RequestPing(i.HealthCheckTimeout);return D||this.close(),D}async ping(D=3e4){let j=Date.now();return await this._RequestPing(D)?Date.now()-j:0}sendDatagram(D){try{this.datagramWriter.write(D),this._ConnectionStats.packetsSent+=1;let j=D.byteLength;this.connectionStats.bytesSent+=j}catch{}}async readDatagrams(D,j,e){try{let B=D.datagrams.readable.getReader();for(;;){let C=await B.read();if(C.done)break;let E=C.value.byteLength;this.connectionStats.bytesReceived+=E,e(j,C.value)}}catch{}}_CleanUp(){a(`performing cleanup for connection ${this.id}`),clearInterval(this._PingIntervalId)}async _EnsureWebRtcSession(){return this._WebRtcSession?this._WebRtcSession:this._WebRtcSessionFlight.run(async()=>(this._PeerConnection=new RTCPeerConnection,ux(this._PeerConnection),this._WebRtcSession=new xx(this._PeerConnection,{sendOffer:async(D,j,e)=>{let B=await this._Request("WebRtcUpdate",{kind:"Sdp",type:"Offer",sdp:D,media_map:j,negotiation_id:e});if(B.type==="Failure")throw new Error(`failed to send sdp offer; ${B.reason}`)},sendIceCandidate:async D=>{await this._Request("WebRtcUpdate",{kind:"Trickle",candidate:D.candidate,spd_mid:D.sdpMid??void 0,spd_mline_index:D.sdpMLineIndex??void 0,username_fragment:D.usernameFragment??void 0})},sendIceComplete:async()=>{await this._Request("WebRtcUpdate",{kind:"TrickleFinished"})},closeConnection:async()=>{this._PeerConnection?.restartIce(),this._WebRtcSession?.requestNegotiation()},checkConnection:async()=>{}}),this._HandleWebRtcUpdates(),this._WebRtcSession))}async _HandleWebRtcUpdates(){for(;;){let D=await this.rpc.recv();if(D==="closed")break;D.name==="WebRtcUpdate"&&this._WebRtcSession?.handleWebRtcUpdate(D.properties)}this.close()}async _Request(D,j,e){let B=Date.now(),C=await(e===void 0?this.rpc.request(D,j):this.rpc.request(D,j,e)),E=(Date.now()-B)/1e3;return D!=="Ping"&&a(`sent main rpc '${D}'; took: ${E}s`,{properties:j,timeout:e,result:C}),C==="closed"?kx("connection lost"):C}_RequestPing(D=3e4){return this._PingFlight.run(async()=>{let j=await this._Request("Ping",{},D);return j!=="timeout"&&j.type==="Success"})}async startLocalVideo(D,j,e){await(await this._EnsureWebRtcSession()).startLocalVideo(D,j,e)}stopLocalVideo(D){this._WebRtcSession?.stopLocalVideo(D)}async startRemoteVideo(D){return(await this._EnsureWebRtcSession()).startRemoteVideo(D)}stopRemoteVideo(D){this._WebRtcSession?.stopRemoteVideo(D)}async dump(){return{type:"H3",id:this.id,address:this.address,closed:this.closed,status:this.status,datagrams:{sent:this._ConnectionStats.packetsSent,received:this._ConnectionStats.packetsReceived},webRtc:{signalingState:this._PeerConnection?.signalingState??null,connectionState:this._PeerConnection?.connectionState??null,iceGatheringState:this._PeerConnection?.iceGatheringState??null,iceConnectionState:this._PeerConnection?.iceConnectionState??null,connectionStats:this._WebRtcSession?.stats??null}}}};u();import{Backend as F,extendUrl as W0,failure as px,success as Q0,fail as OF,CONNECTION_STATS_INITIAL as MF}from"@4players/odin-common";import{MainCommandsRpc as TF,MainNotificationsRpc as SF}from"@4players/odin-common/api";u();import{abortableSleep as wF,failure as Dx,success as PF}from"@4players/odin-common";async function r0(v,D){let j=performance.now(),e=Dx("no connection was attempted");for(let B=0;B<i.ConnectInterval.length&&!D.aborted;B++){let C=j+JF(B);if(await wF(C-performance.now(),D)==="aborted")return Dx("aborted");if(e=await KF(v,D),e.type==="Success")return e}return e}async function KF(v,D){let j;try{j=new WebSocket(v)}catch(s){return Dx(`unable to create websocket; ${s}`)}let e=new AbortController,B=new Promise(s=>j.addEventListener("open",()=>s(PF(j)),{signal:e.signal})),C=new Promise(s=>j.addEventListener("close",b=>s(Dx(b.reason!==""?b.reason:"unable to establish websocket connection")),{signal:e.signal})),E=new Promise(s=>D.addEventListener("abort",()=>s(Dx("aborted")),{signal:e.signal})),f=await Promise.race([B,C,E]);return e.abort(),f}function JF(v){let D=i.ConnectInterval.slice(0,v).reduce((e,B)=>e+B,0),j=i.ConnectInterval[v]*Math.random();return D+j}var hx=class v{constructor(D,j,e,B,C,E){this.id=D;this.address=j;this.url=e;this.onDatagram=B;this.connection=C;this.webRtc=E;this._PeerIdMap=new WeakMap;this._ConnectionStats={...MF};this._PingFlight=new S;o(`creating new webrtc connection to '${this.address}' with id ${this.id}`),this.closeSignal.addEventListener("abort",()=>this._CleanUp(),{once:!0}),this._ClosePromise=new Promise(f=>{this.closeSignal.addEventListener("abort",()=>{f("closed")},{once:!0})}),ux(E),this._AudioChannel=this.webRtc.createDataChannel("audio",{id:2,negotiated:!0,ordered:!1,maxRetransmits:0}),this._AudioChannel.binaryType="arraybuffer",this._AudioChannel.onmessage=f=>{this._ConnectionStats.packetsReceived++;let s=new Uint8Array(f.data);this._ConnectionStats.bytesReceived+=s.byteLength,this.onDatagram(this.id,s)},this._AudioChannel.onerror=f=>k(`webrtc audio data channel for connection with id ${D} raised an error`,f),this._AudioChannel.onclosing=f=>o(`webrtc audio data channel for connection with id ${D} begins shutting down`,f),this._AudioChannel.onclose=f=>o(`webrtc audio data channel for connection with id ${D} has closed`,f),T0(this._AudioChannel),this._WebRtcSession=new xx(this.webRtc,{sendOffer:async(f,s,b)=>{let d=await this._Request("WebRtcUpdate",{kind:"Sdp",type:"Offer",sdp:f,media_map:s,negotiation_id:b});if(d.type==="Failure")throw new Error(`failed to send sdp offer; ${d.reason}`)},sendIceCandidate:async f=>{await this._Request("WebRtcUpdate",{kind:"Trickle",candidate:f.candidate,spd_mid:f.sdpMid??void 0,spd_mline_index:f.sdpMLineIndex??void 0,username_fragment:f.usernameFragment??void 0})},sendIceComplete:async()=>{await this._Request("WebRtcUpdate",{kind:"TrickleFinished"})},closeConnection:async()=>{this.close()},checkConnection:async()=>{this.healthCheck().then()}}),this._WebRtcSession.startup(),i.MainConnectionPingInterval!==void 0&&(this._PingIntervalId=setInterval(async()=>{this.connectionStats.rtt=await this.ping(i.HealthCheckTimeout)},i.MainConnectionPingInterval)),this._HandleWebRtcUpdates()}static async create(D,j,e,B){if(B.aborted)return px("aborted");let C;try{C=new URL(`wss://${j}`)}catch(b){return OF(`address in token(${j}) can not be parsed; ${b}`)}let E=W0(C,`main?uid=${dx}`);if(E.type!=="Success")return E;let f=await r0(E.value,B);if(f.type!=="Success")return f;let s=new V(new M(f.value),TF,SF);try{return Q0(new v(D,j,C,e,s,new RTCPeerConnection))}catch(b){return s.close(),px(`unable to create webrtc connection; ${b}`)}}get status(){switch(this.webRtc.connectionState){case"connected":return 1;case"failed":case"closed":return 2;default:return 0}}get connectionStats(){return this._ConnectionStats}get transport(){return"WebRTC"}get closePromise(){return this._ClosePromise}get closeSignal(){return this.connection.closeSignal}get closed(){return this.connection.closed}async waitForConnected(){return new Promise((D,j)=>{let e=()=>{let B=this.status;B!==0&&(this.webRtc.removeEventListener("connectionstatechange",e),B===1?D():j(new Error("connection closed")))};this.webRtc.addEventListener("connectionstatechange",e),e(),this.closePromise.then(()=>{j(new Error("connection closed"))})})}close(){o(`closing ${this.transport} connection to '${this.address}' with id ${this.id}`),this.connection.close()}async joinRoom(D,j,e,B){let C=await this.connection.request("JoinRoom",{token:String(D),room_id:j,user_data:e,position:B});if(C==="closed"||C.type==="Failure")return C;let E=C.value;if(!("token"in E))return px("JoinRoom responded without token");let f=W0(this.url,`room?token=${E.token}`);if(f.type==="Failure")return f;let s=await r0(f.value,this.closeSignal);return s.type==="Success"?(this._PeerIdMap.set(s.value,E.peer_id),Q0(new M(s.value))):s}async getReconnectToken(D){let j=await this._Request("RequestReconnectToken",{peer_id:D});return j.type==="Failure"?j:y.parse(j.value)}async healthCheck(){let D=await this._RequestPing(i.HealthCheckTimeout);return D||this.close(),D}async ping(D=3e4){let j=Date.now();return await this._RequestPing(D)?Date.now()-j:0}sendDatagram(D){if(this._AudioChannel.readyState==="open"){let j=D.byteLength;this._AudioChannel.send(D),this._ConnectionStats.packetsSent+=1,this._ConnectionStats.bytesSent+=j}}_CleanUp(){a(`performing cleanup for connection ${this.id}`),clearInterval(this._PingIntervalId),S0(this._AudioChannel),R0(this.webRtc),this._WebRtcSession.cleanup(),this.connection.close()}async _HandleWebRtcUpdates(){for(;;){let D=await this.connection.recv();if(D==="closed")break;D.name==="WebRtcUpdate"&&this._WebRtcSession.handleWebRtcUpdate(D.properties)}this.close()}async _Request(D,j,e){let B=Date.now(),C=await(e===void 0?this.connection.request(D,j):this.connection.request(D,j,e)),E=(Date.now()-B)/1e3;return D!=="Ping"&&a(`sent main rpc '${D}'; took: ${E}s`,{properties:j,timeout:e,result:C}),C==="closed"?px("connection lost"):C}_RequestPing(D=3e4){return this._PingFlight.run(async()=>{let j=await this._Request("Ping",{},D);return j!=="timeout"&&j.type==="Success"})}async startLocalVideo(D,j,e){await this._WebRtcSession.startLocalVideo(D,j,e)}stopLocalVideo(D){this._WebRtcSession.stopLocalVideo(D)}async startRemoteVideo(D){return this._WebRtcSession.startRemoteVideo(D)}stopRemoteVideo(D){this._WebRtcSession.stopRemoteVideo(D)}async dump(){return{type:"WebRtc",id:this.id,address:this.address,url:this.url.toString(),closed:this.closed,audioChannel:{readyState:this._AudioChannel.readyState,bufferedAmount:this._AudioChannel.bufferedAmount},datagrams:{sent:this.connectionStats.packetsSent,received:this.connectionStats.packetsReceived},webRtc:{signalingState:this.webRtc.signalingState,connectionState:this.webRtc.connectionState,iceGatheringState:this.webRtc.iceGatheringState,iceConnectionState:this.webRtc.iceConnectionState,connectionStats:this._WebRtcSession.stats}}}};function z0(v,D,j,e,B){switch(o(`creating ${D} main connection to '${j}'`),D){case"H3":return cx.create(v,j,e,B);case"WebRTC":return hx.create(v,j,e,B);default:throw new Error(`transport ${D} is not supported`)}}import{Backend as GB,failure as Y0,success as RF}from"@4players/odin-common";import{parseCommand as VF,parseNotification as UF,RoomCommandsRpc as X0,RoomNotificationsRpc as Z0}from"@4players/odin-common/api";u();var qx=class{constructor(D,j,e,B){this.id=D;this.connection=j;this.cipher=e;this.mediaMap=B;this._DatagramReceived=0;this._DatagramSent=0;this._DatagramReceivedInvalid=0;this._DatagramSentInvalid=0;j.closeSignal.addEventListener("abort",()=>this.close())}get connectionStats(){return this.connection.connectionStats}get transport(){return this.connection.transport}get address(){return this.connection.address}get status(){return this.closed?2:this.connection.status}get closePromise(){return this.connection.closePromise}get closeSignal(){return this.connection.closeSignal}get closed(){return this.connection.closed}waitForConnected(){return this.connection.waitForConnected()}close(){this.connection.close()}async joinRoom(D,j,e,B){this.cipher.reset();let C=await this.cipher.encryptUserData(e);if(C===n)return Y0("unable to encrypt initial user-data");let E=await this.connection.joinRoom(D,j,C,B);return E==="closed"||E.type==="Failure"?E:RF(new t0(E.value,this.cipher,this))}getReconnectToken(D){return this.connection.getReconnectToken(D)}healthCheck(){return this.connection.healthCheck()}async sendDatagram(D){let j=await this.cipher.encryptDatagram(D);j!==n?(this._DatagramSent+=1,this.connection.sendDatagram(j)):this._DatagramSentInvalid+=1}async decryptDatagram(D,j){let e=await this.cipher.decryptDatagram(D,j);return e!==n?this._DatagramReceived+=1:this._DatagramReceivedInvalid+=1,e}startLocalVideo(D,j,e){return this.connection.startLocalVideo(D,j,e)}stopLocalVideo(D){return this.connection.stopLocalVideo(D)}startRemoteVideo(D){return this.connection.startRemoteVideo(D)}stopRemoteVideo(D){return this.connection.stopRemoteVideo(D)}async dump(){return{type:"Encrypted",id:this.id,address:this.address,connectionId:this.connection.id,closed:this.closed,transport:this.transport,datagrams:{sent:this._DatagramSent,received:this._DatagramReceived,sentInvalid:this._DatagramSentInvalid,receivedInvalid:this._DatagramReceivedInvalid},cipher:await this.cipher.dump()}}},mx=class{constructor(D){this.room=D}resendUserData(){this.room.roomConnection?.notify("UpdatePeer",{user_data:this.room.roomConnection.userData})}setUserData(D,j){let e={kind:"UserDataChanged",peer_id:D,user_data:j};this.room.onEvent("PeerUpdated",e)}},t0=class{constructor(D,j,e){this.rpc=D;this.cipher=j;this.connection=e;this.peers=new Map;this.closeSignal.addEventListener("abort",this.cleanup.bind(this),{once:!0})}get closed(){return this.rpc.closed}get closeSignal(){return this.rpc.closeSignal}async request(D,j,e){let B=await this.outgoing(D,j);return B===n?Y0("can not be encrypted"):await this.rpc.request(D,B,e)}async notify(D,j){let e=await this.outgoing(D,j);if(e!==n)return this.rpc.notify(D,e)}async recv(){for(;;){let D=await this.rpc.recv();if(D==="closed")return D;let j=await this.incoming(D.name,D.properties);if(j!==n)return{name:D.name,properties:j}}}close(){return this.rpc.close()}async outgoing(D,j){if(!(D in X0))return j;let e=VF(D,j,X0);if(e===void 0)return n;switch(e.name){case"UpdatePeer":{let B=await this.cipher.encryptUserData(e.request.user_data);if(B===n)return n;e.request.user_data=B}break;case"SendMessage":{let B=await this.cipher.encryptMessage(e.request.message);if(B===n)return n;e.request.message=B}break}return e.request}async incoming(D,j){if(!(D in Z0))return j;let e=UF(D,j,Z0);if(e===void 0)return n;switch(e.name){case"RoomUpdated":for(let B=0;B<e.properties.updates.length;B++){let C=await this.roomUpdate(e.properties.updates[B]);if(C===n)return n;e.properties.updates[B]=C}break;case"PeerUpdated":{let B=await this.peerUpdate(e.properties);if(B===n)return n;e.properties=B}break;case"MessageReceived":{let B=await this.cipher.decryptMessage(e.properties.sender_peer_id,e.properties.message);if(B===n)return n;e.properties.message=B}break}return e.properties}async peerUpdate(D){switch(D.kind){case"UserDataChanged":{let j=await this.cipher.decryptUserData(D.peer_id,D.user_data);if(j===n)return n;D.user_data=j}break;case"MediaStarted":this.mediaStarted(D.peer_id,D.media.id);break;case"MediaStopped":this.mediaStopped(D.peer_id,D.media_id);break}return D}async roomUpdate(D){switch(D.kind){case"Joined":for(let j of D.room.peers){for(let B of j.medias)this.mediaStarted(j.id,B.id);let e=await this.cipher.decryptUserData(j.id,j.user_data);e!==n?j.user_data=e:j.user_data=new Uint8Array}break;case"PeerJoined":{for(let e of D.peer.medias)this.mediaStarted(D.peer.id,e.id);let j=await this.cipher.decryptUserData(D.peer.id,D.peer.user_data);j!==n?D.peer.user_data=j:D.peer.user_data=new Uint8Array}break;case"PeerLeft":{let j=this.peers.get(D.peer_id);this.peers.delete(D.peer_id),this.cipher.deletePeerKey(D.peer_id);for(let e of j??[])this.mediaStopped(D.peer_id,e)}break}return D}mediaStarted(D,j){let e=this.peers.get(D);e===void 0&&(e=new Set,this.peers.set(D,e)),e.add(j);let B=m({connectionId:this.connection.connection.id,mediaId:j});this.connection.mediaMap.set(B,{peerId:D,connection:this.connection})}mediaStopped(D,j){this.peers.get(D)?.delete(j);let B=m({connectionId:this.connection.connection.id,mediaId:j});this.connection.mediaMap.delete(B)}cleanup(){for(let[D,j]of this.peers)for(let e of j)this.mediaStopped(D,e)}};var Gx=class{constructor(D){this.onDatagram=D;this._LastConnectionId=0;this._Connections=new Map;this._Close=new AbortController;this._MediaMap=new Map;let j=Date.now(),e=setInterval(()=>{Math.abs(Date.now()-j)>i.ClockJumpThreshold&&this.checkHealth(),j=Date.now()},i.ClockJumpCheckInterval);addEventListener("offline",()=>this.checkHealth(),{signal:this._Close.signal}),this._Close.signal.addEventListener("abort",()=>{clearInterval(e);for(let B of this._Connections.values())B.type==="establishing"?B.abort.abort():B.connection.close();this._Connections.clear()},{once:!0})}get closed(){return this._Close.signal.aborted}sendDatagram(D,j){let e=this._Connections.get(D);(e?.type==="established"||e?.type==="virtual")&&e.connection.sendDatagram(j)}async recvDatagram(D,j){let e=zF(j);if(e===void 0||e.length===0)return;let B=this._MediaMap.get(m({connectionId:D,mediaId:e[0]}));if(B===void 0)this.onDatagram(D,j);else{let C=await B.connection.decryptDatagram(B.peerId,j);if(C===n)return;this.onDatagram(B.connection.id,C)}}async acquireConnection(D,j,e,B){if(await WF(),this.closed)return"closed";let C=this.findConnection(D,j),E;switch(C?.type){case"established":a(`reusing existing connection ${C.id}`),E=C;break;case"establishing":{a(`waiting for connecting to '${j}' finish`);let b=await C.finished;if(b.type!=="Success")return b;E=b.value}break;case void 0:{a(`connecting to '${j}'`);let b=await this.createConnection(D,j,B);if(b.type!=="Success")return b;E=b.value}break}let f=E.id,s=new D0(E.connection,()=>this.releaseConnection(f));return E.references+=1,e&&(s=new qx(++this._LastConnectionId,s,e,this._MediaMap),this.addConnection({type:"virtual",id:s.id,connection:s,createdAt:Date.now()})),xA(s)}async createConnection(D,j,e){let B=++this._LastConnectionId,C=Date.now(),E=new AbortController;e.addEventListener("abort",()=>E.abort(),{once:!0}),a(`creating new connection ${B}`);let f=z0(B,D,j,this.recvDatagram.bind(this),e),{promise:s,resolve:b}=Promise.withResolvers();this.addConnection({type:"establishing",id:B,address:j,transport:D,finished:s,createdAt:Date.now(),abort:E});let d=await f;if(this._Connections.delete(B),d.type!=="Success")return b(d),d;let h={type:"established",id:B,address:j,transport:D,createdAt:C,references:0,connection:d.value};return this.addConnection(h),xA(h)}addConnection(D){(D.type==="established"||D.type==="virtual")&&D.connection.closeSignal.addEventListener("abort",()=>{o(`connection ${D.id} has been closed`),this._Connections.delete(D.id)},{once:!0}),this._Connections.set(D.id,D)}releaseConnection(D){let j=this._Connections.get(D);j?.type==="established"&&(j.references-=1,j.references<=0&&j.connection.close())}checkHealth(){for(let D of this._Connections.values())D.type==="established"&&D.connection.healthCheck()}close(){this._Close.abort()}async dump(){let D=[];for(let e of this._Connections.values()){let B;switch(e.type){case"established":B={transport:e.transport,address:e.address,connection:await e.connection.dump(),references:e.references};break;case"establishing":B={transport:e.transport,address:e.address,aborted:e.abort.signal.aborted};break;case"virtual":B={connection:await e.connection.dump()};break}D.push({type:e.type,id:e.id,createdAt:e.createdAt,...B})}let j=[];for(let[e,B]of this._MediaMap)j.push(`${e} -> ${B.peerId} @${B.connection.id} `);return{lastConnectionId:this._LastConnectionId,connections:D,mediaMap:j,closed:this.closed}}findConnection(D,j){for(let e of this._Connections.values())if(e.type!=="virtual"&&e.transport===D&&e.address===j)return e}},D0=class{constructor(D,j){this.connection=D;this.release=j;this.closeController=new AbortController;this.closePromise=new Promise(D=>this.closeController.signal.addEventListener("abort",()=>D("closed"),{once:!0}));D.closeSignal.addEventListener("abort",()=>this.close(),{once:!0})}get closeSignal(){return this.closeController.signal}get closed(){return this.closeSignal.aborted}close(){this.release(),this.closeController.abort("closed")}get connectionStats(){return this.connection.connectionStats}get id(){return this.connection.id}get transport(){return this.connection.transport}get address(){return this.connection.address}get status(){return this.connection.status}waitForConnected(){return this.connection.waitForConnected()}joinRoom(D,j,e,B){return this.connection.joinRoom(D,j,e,B)}getReconnectToken(D){return this.connection.getReconnectToken(D)}healthCheck(){return this.connection.healthCheck()}sendDatagram(D){return this.connection.sendDatagram(D)}startLocalVideo(D,j,e){return this.connection.startLocalVideo(D,j,e)}stopLocalVideo(D){return this.connection.stopLocalVideo(D)}startRemoteVideo(D){return this.connection.startRemoteVideo(D)}stopRemoteVideo(D){return this.connection.stopRemoteVideo(D)}async dump(){let D=await this.connection.dump();return typeof D=="object"&&(D={...D,isShared:!0,referenceClosed:this.closed}),D}};function zF(v){let D;try{D=QF(v)}catch{return}if(!Array.isArray(D)||D.length<2)return;let j=D[1];if(Array.isArray(j))return j.map(Number)}import{assert as j0,Backend as IB}from"@4players/odin-common";var P=class{constructor(D,j){this.uid=D;this.customType=j}#x;#A;get mediaStream(){return this.#x}get audioPlayback(){return j0(this.#A,"getting the audioPlayback failed, this video has no Audio"),this.#A}get volume(){return j0(this.audioPlayback,"getting the volume failed, this video has no Audio"),this.audioPlayback.volume}setVolume(D){j0(this.#A,"Can not set the volume, this video has no Audio"),this.#A.setVolume(D)}setMediaStream(D){this.mediaStream||(this.#x=D)}close(){this.#x?.getVideoTracks().forEach(D=>{D.stop(),this.#x?.removeTrack(D)}),this.#x=void 0}};import{Backend as $B,assert as nA,generateUUID as ar,unwrap as lr,CONNECTION_STATS_INITIAL as ur}from"@4players/odin-common";import{RoomNotificationsRpc as kr,RoomV1 as yB}from"@4players/odin-common/api";import{Selector as XF,failure as N,sleep as Ix,success as T,assert as ZF}from"@4players/odin-common";import{parseResponse as YF,RoomCommandsRpc as gx,RoomNotificationsRpc as xr,RoomV1 as gB}from"@4players/odin-common/api";u();var $x=class{constructor(D,j,e,B,C,E,f,s,b,d){this.connectionPool=D;this.transport=j;this.onEvent=e;this.gateway=B;this.roomId=E;this.cipher=b;this.disableAutoReconnect=d;this._Close=new AbortController;this._TokenUsed=!1;this._WasConnected=!1;this._FailedConnections=0;this._LastTokenRenew=performance.now();this._LastReconnectStartedAt=0;this._Closed=new Promise(D=>this._Close.signal.addEventListener("abort",()=>D(this._Close.signal.reason?"disconnected":"closed"),{once:!0}));this._Token=C,this._UserData=f,this._Position=s,this._Main().then(({reason:h})=>a(`_Main() resolved; ${h}`))}get token(){return this._Token}get userData(){return this._UserData}get position(){return this._Position}get closed(){return this._Close.signal.aborted}get mainConnection(){return this._MainConnection}async requestUnsafe(D,j){if(this._RoomConnection===void 0)return N("currently not connected");let e=await this._RoomConnection.request(D,j,void 0);return ZF(e!=="timeout","request should not timeout"),e!=="closed"&&e.type==="Success"&&this._HandleRequests(D,j,e.value),e}async request(D,j){let e=Date.now(),B=gx[D],C=await this.requestUnsafe(D,j),E=(Date.now()-e)/1e3;if(a(`sent room rpc '${D}'; took: ${E}s`,{properties:j,result:C}),C==="closed"||C.type==="Failure")return C;let f=YF(D,C.value,gx);return f!==void 0?T(f):N(`received invalid response from ${D}`)}notify(D,j){this._RoomConnection!==void 0&&this._RoomConnection.notify(D,j)}close(){this._Close.abort(!0)}get renewTokenIn(){let D=this._LastTokenRenew-performance.now()+i.MinTokenRefreshInterval,j=this._Token.timeLeft-i.MinTokenLifetime;return Math.max(D,j)}async _Main(){let D="unable to establish connection";for(let j=0;;this._FailedConnections++){if(await Ix(Math.max(j-performance.now(),0)),this._Close.signal.aborted||this.connectionPool.closed){D="user requested";break}if(j=performance.now()+1e3,this._TokenUsed=!0,this._Token.hasAudience("sfu")){let e=await this._ConnectToServer();if(e.type==="Success"&&e.value==="shutdown"){a("connection closed by user request; shutting down"),D="user requested";break}if(this.disableAutoReconnect&&this._WasConnected){D=e.type==="Failure"?e.reason:"connection lost";break}if(this._LastReconnectStartedAt===0&&(this._LastReconnectStartedAt=performance.now()),e.type==="Failure"&&!this._WasConnected&&this._FailedConnections>=3){D=e.reason;break}if(e.type==="Failure"&&!Fr(this._LastReconnectStartedAt))continue}if(this.reset(),this._Close.signal.aborted||this.connectionPool.closed){D="user requested";break}if(this.gateway!==void 0&&this._Token.hasAudience("gateway")){this._ChangeStatus("Joining",`requesting new token from ${this.gateway}`);let e=await Ar(this.gateway,this._Token,this._Close.signal);if(e.type==="Success")if(e.value instanceof y)j=0,this._Token=e.value,this._TokenUsed=!1;else{D=`gateway error; ${e.value}`;break}else if(!this._WasConnected&&this._FailedConnections>=3){D="unable to contact the gateway";break}}if(this._TokenUsed&&this._Token.timeLeft<=0){D="token has expired";break}if(this._Close.signal.aborted||this.connectionPool.closed){D="user requested";break}}return this._ChangeStatus("Closed",D),this.close(),N(D)}async _ConnectToServer(){let D=this._Token;for(;D.upstream!==void 0;)D=D.upstream;let j=D.claims.adr??this.gateway?.toString();if(!j)return T("continue");if(this._ChangeStatus("Joining",`connecting to ${D.claims.adr}`),this._MainConnection===void 0||this._MainConnection.closed||this._MainConnection.address!==D.claims.adr){this._MainConnection?.close();let C=await this.connectionPool.acquireConnection(this.transport,j,this.cipher,this._Close.signal);if(C==="closed")return N("connection pool closed");if(C.type==="Failure")return this._ChangeStatus("Joining",`connection failed; ${C.reason}`),N(`connection failed; ${C.reason}`);this._MainConnection=C.value,this._OwnPeerId=void 0}let e=await Promise.race([Promise.all([this._MainConnection.joinRoom(D,this.roomId,this.userData,this.position)]),Ix(i.ConnectTimeout,"timeout"),this._Closed]);if(e==="closed"||e==="disconnected")return T("continue");if(e==="timeout")return this._ChangeStatus("Joining","timed out"),T("continue");let[B]=e;if(B==="closed")return T("continue");if(B.type==="Failure")return N(`unable to join room; ${B.reason}`);this._RoomConnection=B.value,this._WasConnected=!0,this._FailedConnections=0,this._ChangeStatus("Joined",`joined ${this.roomId}`);try{await this._MainConnection.waitForConnected();let C=await this._HandleConnection(this._MainConnection);return T(C?"shutdown":"continue")}catch(C){return N(`unable to handle connection; ${C}`)}}_ChangeStatus(D,j){let e={status:D,message:j};this.onEvent("RoomStatusChanged",e)}async _HandleConnection(D){if(this._RoomConnection===void 0)return!1;let j=new XF([()=>Ix(this.renewTokenIn,"renewToken"),()=>Ix(500,"tick"),async()=>await this._RoomConnection?.recv(),()=>this._Closed,()=>D.closePromise]);for(;;){let e=await j.next();switch(e){case void 0:case"closed":return this._RoomConnection?.close(),this._MainConnection?.close(),!1;case"disconnected":return this._RoomConnection?.close(),this._MainConnection?.close(),!0;case"renewToken":this._RenewToken();break;case"tick":break;default:this._HandleEvent(e);break}}}_HandleEvent(D){if(D.name==="RoomUpdated"){let j=xr.RoomUpdated.safeParse(D.properties);if(!j.success)return;for(let e of j.data.updates)e.kind==="Joined"&&(this._OwnPeerId=e.own_peer_id)}this.onEvent(D.name,D.properties)}_HandleRequests(D,j,e){switch(D){case"SetPeerPosition":{let B=gx.SetPeerPosition.request.safeParse(j);if(B.success){let C=B.data.position;this._Position=C.length===2?[C[0],C[1],0]:C}else k("unable to process SetPeerPosition command");break}case"UpdatePeer":{let B=gx.UpdatePeer.request.safeParse(j);B.success?this._UserData=B.data.user_data:k("unable to process UpdatePeer command");break}}}async _RenewToken(D){if(this._LastTokenRenew=performance.now(),!D&&this.token.timeLeft>i.MinTokenLifetime)return;if(this._MainConnection===void 0||this._OwnPeerId===void 0)return N("connection is not established");let j=await this._MainConnection.getReconnectToken(this._OwnPeerId);return j.type==="Success"?(this._Token=j.value,T()):N(`${this._MainConnection.address} rejected reconnect token request; ${j.reason}`)}reset(){this._LastReconnectStartedAt=0,this._RoomConnection?.close(),this._RoomConnection=void 0,this._MainConnection?.close(),this._MainConnection=void 0,this._OwnPeerId=void 0}};async function Ar(v,D,j){try{let e={jsonrpc:"2.0",id:1,method:"Connect",params:{}};o(`sending authentication request to '${v}'`,e);let C=await(await fetch(v,{body:JSON.stringify(e),method:"POST",headers:{"content-type":"application/json",authorization:`Bearer ${D}`},signal:j})).json();if(o(`received authentication response fom '${v}'`,C),"result"in C)return y.parse(C.result.token);{let E=C.error?.message??"malformed response";return p(`gateway rejected token; ${E}`),T(E)}}catch(e){return N(String(e))}}function Fr(v,D=8e3){return performance.now()-v>D}u();import{assert as or}from"@4players/odin-common";u();import{Backend as ex,Strand as br}from"@4players/odin-common";u();import{assert as er}from"@4players/odin-common";u();import{decode as rr}from"@msgpack/msgpack";var AA={name:"PBKDF2",hash:"SHA-256",iterations:6e5,salt:new Uint8Array([111,100,105,110,95,99,114,121,112,116,111,95,109,97,115,116,101,114,95,107,101,121])},FA=v=>({name:"PBKDF2",hash:"SHA-256",iterations:600,salt:v}),rA=32,tA=1e6,DA=2147483648,jA=32,K=[79,68,73,78,1,75,105,109],Ax=16,Fx=64,eA=16;function BA(v,D){if(v.length!==D.length)return!1;for(let j=0;j<v.length;j++)if(v[j]!==D[j])return!1;return!0}function tr(v){return isFinite(v)}function Dr(v){return Array.isArray(v)}function yx(v){return tr(v)?v:n}function jx(v){return v instanceof Uint8Array?v:n}function jr(v,...D){let j;try{j=rr(v)}catch{return n}if(!Dr(j))return n;let e=new Array(j.length);for(let B in D)if(e[B]=D[B](j[B]),e[B]===n)return n;return e}function _x(v,...D){if(v.length<K.length)return G;for(let j=0;j<K.length;j++)if(v[j]!==K[j])return G;return jr(v.subarray(K.length),...D)}var rx=class{constructor(D){this.first=1;this.offset=0;this.window=Array(D)}isReplay(D){let j=D-this.first;if(j<0)return!0;if(j>=this.window.length)if(j<this.window.length*2){let C=j-this.window.length+1;j-=C;for(let E=0;E<C;E++)this.advance()}else return this.first=D+1-self.window.length,this.offset=0,this.window.fill(!1),!1;let e=(this.offset+j)%this.window.length,B=this.window[e]===!0;for(this.window[e]=!0;this.window[this.offset]===!0;)this.advance();return B}advance(){this.window[this.offset]=!1,this.first+=1,this.offset=(this.offset+1)%this.window.length}};var Lx=class v{constructor(D){this.key=D}static async create(D){typeof D=="string"&&(D=new TextEncoder().encode(D));let j=await globalThis.crypto.subtle.importKey("raw",D,"PBKDF2",!1,["deriveBits"]),e=await globalThis.crypto.subtle.deriveBits(AA,j,256),B=await globalThis.crypto.subtle.importKey("raw",e,"PBKDF2",!1,["deriveKey"]);return new v(B)}async generatePeerKey(D,j){return await globalThis.crypto.subtle.deriveKey(FA(D),this.key,{name:"AES-GCM",length:256},!1,[j])}},Hx=class v{constructor(D,j){this.seed=D;this.key=j;this.sequenceNumbers={datagram:1,message:1,userData:1};this.number_of_packets=0;this.number_of_bytes=0}static async create(D){let j=globalThis.crypto.getRandomValues(new Uint8Array(rA)),e=await D.generatePeerKey(j,"encrypt");return new v(j,e)}get limitReached(){return this.key===void 0?!1:this.number_of_bytes>=DA||this.number_of_packets>=tA}nextSequenceNumber(D){return this.sequenceNumbers[D]++}};function e0(v,D){return{kind:"encrypted",key:v,material:D,antiReplays:{datagram:new rx(jA),userData:new rx(0),message:new rx(0)}}}var Nx=class v{constructor(D,j,e,B){this.additionalData=D;this.sequenceNumber=j;this.seed=e;this.encrypted=B}static parse(D){let j=_x(D,jx,yx,jx);if(j===n||j===G)return j;let[e,B,C]=j,E=D.subarray(0,D.length-C.length);return new v(E,B,e,C)}isSameSeed(D){return BA(this.seed,D.seed)}async generateKey(D){return await D.generatePeerKey(this.seed,"decrypt")}};function wx(v,D){let j=new Uint8Array(12);switch(j[0]=D&255,j[1]=D>>8&255,j[2]=D>>16&255,j[3]=D>>24&255,v){case"datagram":j[5]=1;break;case"userData":j[5]=2;break;case"message":j[5]=3;break;default:er(!1,"missing content implementation")}return j}u();import{encode as CA}from"@msgpack/msgpack";import{assert as vr}from"@4players/odin-common";var Px=class{constructor(D){this.actions=D}changeKey(D){this.masterKey!==D&&(this.masterKey=D,this.ownKey=n,this.actions.resendUserData())}async encryptDatagram(D){let j=await this.getKey("datagram");return j===void 0?D:j===J?n:await Er(j,D)}async encryptMessage(D){let j=await this.getKey("message");return j===void 0?D:j===J?J:await vA(j,D,"message")}async encryptUserData(D){let j=await this.getKey("userData");return j===void 0?D:(vr(j!==J,"key unavailable for user data encryption"),await vA(j,D,"userData",j.seed))}async getKey(D){if(this.ownKey===n||this.ownKey?.limitReached)if(D==="userData")this.ownKey=this.masterKey?await Hx.create(this.masterKey):void 0;else return this.ownKey!==n&&(this.ownKey=n,this.actions.resendUserData()),J;return this.ownKey}reset(){this.ownKey=this.masterKey?n:void 0}};async function vA(v,D,j,...e){let B=v.nextSequenceNumber(j),C=D.length+Ax,E=Cr(B,e,C),f=E.length-C,s=await EA(v,j,B,E.subarray(0,f),D);return E.set(new Uint8Array(s),f),E}function Cr(v,D,j){let e=[];D.forEach(E=>e.push(E)),e.push(v),e.push(new Uint8Array(j));let B=CA(e),C=new Uint8Array(K.length+B.length);return C.set(K,0),C.set(B,K.length),C}async function Er(v,D){let j=fr(D);if(j===n)return n;if((j.kind&Fx)!==0)return n;let e=j.body.length+Ax,B=v.nextSequenceNumber("datagram"),C=CA([j.kind|Fx,j.mediaIds,B,new Uint8Array(e)]),E=C.length-e,f=await EA(v,"datagram",B,C.subarray(0,E),j.body);return C.set(f,E),C}async function EA(v,D,j,e,B){return new Uint8Array(await globalThis.crypto.subtle.encrypt({name:"AES-GCM",iv:wx(D,j),additionalData:e,tagLength:Ax*8},v.key,B))}function fr(v){let D=new O(v),j=D.readArrayLength();if(l(j)||j<2)return n;let e=D.readNumber(),B=D.readArrayLength();if(l(e)||l(B))return n;if(B>eA)return n;let C=Array(B);for(let f=0;f<C.length;f++){let s=D.readNumber();if(l(s))return n;C[f]=s}let E=v.subarray(D.position);return{kind:e,mediaIds:C,body:E}}u();import{encode as nr}from"@msgpack/msgpack";var Jx=class{constructor(D){this.actions=D;this.peerKeys=new Map}async changeKey(D){this.masterKey=D;for(let[j,{kind:e,material:B}]of this.peerKeys)if(D!==void 0){let C=await B.generateKey(D),E=e0(C,B),f=await Kx(E,"userData",B.additionalData,B.sequenceNumber,B.encrypted);f!==n?(this.peerKeys.set(j,E),this.actions.setUserData(j,f)):(this.peerKeys.set(j,{kind:"broken",material:B}),this.actions.setUserData(j,new Uint8Array))}else e==="encrypted"&&this.peerKeys.set(j,{kind:"broken",material:B})}async decryptDatagram(D,j){let e=sr(j);if(this.masterKey===void 0)return e===G?j:n;if(e===n||e===G)return n;let B=this.peerKeys.get(D);if(B?.kind!=="encrypted")return n;let C=await Kx(B,"datagram",e.additionalData,e.sequenceNumber,e.encrypted);return C===n?n:ir(e.kind&~Fx,e.mediaIds,C)}async decryptMessage(D,j){let e=_x(j,yx,jx);if(this.masterKey===void 0)return e===G?j:n;if(e===n||e===G)return n;let B=this.peerKeys.get(D);if(B?.kind!=="encrypted")return n;let[C,E]=e,f=j.subarray(0,j.length-E.length);return Kx(B,"message",f,C,E)}async decryptUserData(D,j){let e=Nx.parse(j);if(e===n)return n;if(e===G)return this.peerKeys.delete(D),this.masterKey===void 0?j:n;if(this.masterKey===void 0)return this.peerKeys.set(D,{kind:"broken",material:e}),n;let B=this.peerKeys.get(D);if(B?.kind==="encrypted"&&B.material.isSameSeed(e))B.material=e;else{let E=await e.generateKey(this.masterKey);B=e0(E,e)}let C=await Kx(B,"userData",e.additionalData,e.sequenceNumber,e.encrypted);return C===n?this.peerKeys.set(D,{kind:"broken",material:e}):B!==void 0&&this.peerKeys.set(D,B),C}reset(){this.peerKeys.clear()}};function sr(v){let D=new O(v),j=D.readArrayLength();if(l(j)||j<1)return n;let e=D.readNumber();if(l(e))return n;if((e&Fx)===0)return G;if(j!==4)return n;let B=D.position;D.readObjects(1);let C=v.subarray(B,D.position),E=D.readNumber(),f=D.readBytes();if(l(E)||l(f))return n;let s=v.subarray(0,v.length-f.length);return{kind:e,mediaIds:C,additionalData:s,sequenceNumber:E,encrypted:f}}async function Kx(v,D,j,e,B){let C=await globalThis.crypto.subtle.decrypt({name:"AES-GCM",iv:wx(D,e),additionalData:j,tagLength:Ax*8},v.key,B).catch(()=>n);return C===n?n:v.antiReplays[D].isReplay(e)?n:new Uint8Array(C)}function ir(v,D,j){let e=2;try{let E=new O(j);for(E.position=0;E.position<j.length;)E.readObjects(1),e+=1}catch{return n}let B=nr(v),C=new Uint8Array(3+B.length+D.length+j.length);return C[0]=220,C[1]=e>>8&255,C[2]=e&255,C.set(B,3),C.set(D,3+B.length),C.set(j,3+B.length+D.length),C}var Ox=class{constructor(D,j){this.active=!1;let e=new Jx(j),B=new Px(j);this.crypto=new br({encryption:B,decryption:e}),this.peerKeys=e.peerKeys,this.configure(D)}encryptUserData(D){return this.crypto.enqueue(({encryption:j})=>j.encryptUserData(D))}async encryptMessage(D){let j;do j=await this.crypto.enqueue(({encryption:e})=>e.encryptMessage(D));while(j===J);return j}async encryptDatagram(D){return await this.crypto.enqueue(({encryption:j})=>j.encryptDatagram(D))}decryptUserData(D,j){return this.crypto.enqueue(({decryption:e})=>e.decryptUserData(D,j))}decryptMessage(D,j){return this.crypto.enqueue(({decryption:e})=>e.decryptMessage(D,j))}decryptDatagram(D,j){return this.crypto.enqueue(({decryption:e})=>e.decryptDatagram(D,j))}configure(D){return this.crypto.enqueue(async j=>{let e=D.password?await Lx.create(D.password):void 0;this.active=e!==void 0,await j.encryption.changeKey(e),await j.decryption.changeKey(e)})}getPeerStatus(D){switch(this.peerKeys.get(D)?.kind??"unencrypted"){case"broken":return ex.PeerCipherStatus.InvalidPassword;case"encrypted":return ex.PeerCipherStatus.Encrypted;case"unencrypted":return this.active?ex.PeerCipherStatus.InvalidPassword:ex.PeerCipherStatus.Unencrypted;default:return ex.PeerCipherStatus.Unknown}}deletePeerKey(D){this.peerKeys.delete(D)}reset(){return this.crypto.enqueue(async({encryption:D,decryption:j})=>{D.reset(),j.reset()})}async dump(){return this.crypto.enqueue(async()=>({active:this.active,peers:Array.from(this.peerKeys).map(([D,j])=>`${D} => ${j.kind}`)}))}};function fA(v,D){return or(v.type==="OdinCrypto","only OdinCrypto supported"),new Ox(v,D)}var Mx=class{constructor(D,j,e){this._Captures=new Map;this._Playbacks=new Map;this._Peers=new Map;this._AvailableMediaIds=[];let{url:B,onEvent:C}=j,E=lr(y.parse(j.token)),f=j.roomId??E.defaultRoomId,s=j.userData??new Uint8Array(0),b=j.position??[0,0,0];nA(f!==void 0,"room id required for multi-room-tokens"),this.cipher=j.cipher?fA(j.cipher,new mx(this)):void 0,this.onEvent=C,o(`creating new room '${f}' ${this.cipher?"with":"without"} cipher`,E,s,b),this._Connection=new $x(D,j.transport??"H3",this._HandleEvent.bind(this),B?new URL(B):void 0,E,f,s,b,this.cipher,e?.disableAutoReconnect??!1)}get connectionStats(){let D={...ur};return this.mainConnection?this.mainConnection.connectionStats:D}get roomConnection(){return this._Connection}get mainConnection(){return this.roomConnection?.mainConnection}get token(){return this._Connection.token.text}request(D,j){return this._Connection.requestUnsafe(D,j)}async link(D){if(D instanceof H){let j=this._Playbacks.get(D.uid)??{media:void 0,playback:void 0};j.playback!==void 0&&this.unlink(j.playback),j.media!==void 0&&D.start(j.media),j.playback=D,o(`linking audio playback media '${D.uid}' with volume ${D.volume} to room '${this._Connection.roomId}'`),this._Playbacks.set(D.uid,j)}else if(D instanceof w){let j=this._Captures.get(D);j&&this.unlink(D);let e=this.mainConnection!==void 0&&this._AvailableMediaIds.shift();j={media:e?{connectionId:this.mainConnection.id,mediaId:e}:void 0},o(`linking audio capture media '${D.uid}' with volume ${D.volume} to room '${this._Connection.roomId}'`),this._Captures.set(D,j),j.media!==void 0&&await D.start(this._Connection,j.media)}else if(D instanceof P){let j=this._Playbacks.get(D.uid)??{media:void 0,playback:void 0};if(j.playback!==void 0&&this.unlink(j.playback),j.media!==void 0){let e=await this.mainConnection?.startRemoteVideo(j.media.mediaId);e&&D.setMediaStream(new MediaStream([e]))}j.playback=D,o(`linking video playback media '${D.uid}' with type '${D.customType}' to room '${this._Connection.roomId}'`),this._Playbacks.set(D.uid,j)}else if(D instanceof $){let j=this._Captures.get(D);j&&this.unlink(D);let e=D.mediaStream?.getVideoTracks()[0];if(e){let B=this.mainConnection!==void 0&&this._AvailableMediaIds.shift();j={media:B?{connectionId:this.mainConnection.id,mediaId:B}:void 0},o(`linking video capture media '${D.uid}' with type '${D.parameters?.customType}' to room '${this._Connection.roomId}'`),this._Captures.set(D,j),j.media!==void 0&&(await D.start(this._Connection,j.media),this.mainConnection?.startLocalVideo(j.media.mediaId,e,D.parameters)),D.audioCapture&&await this.link(D.audioCapture)}}else throw new Error("Linking failed, media was not supported")}unlink(D){if(D instanceof H||D instanceof P){let j=this._Playbacks.get(D.uid);if(j?.playback!==D)return;j.playback=void 0,j.media!==void 0&&(D instanceof H?D.stop(j.media):(this.mainConnection?.stopRemoteVideo(j.media.mediaId),D.setMediaStream(void 0))),o(`unlinking playback media '${D.uid}' from room '${this._Connection.roomId}'`),this._Playbacks.set(D.uid,j)}else if(D instanceof w||D instanceof $){D instanceof $&&D.audioCapture&&this.unlink(D.audioCapture);let j=this._Captures.get(D);if(j===void 0)return;j.media!==void 0&&(D.stop(this._Connection,j.media),this._AvailableMediaIds.push(j.media.mediaId),D instanceof $&&this.mainConnection?.stopLocalVideo(j.media.mediaId)),o(`unlinking capture media '${D.uid}' from room '${this._Connection.roomId}'`),this._Captures.delete(D)}else throw new Error("invalid media")}close(){o(`closing room '${this._Connection.roomId}'`),this._Connection.close()}_HandleEvent(D,j){let e=F0(kr,{name:D,properties:j});e!==void 0&&(this._HandleKnownEvent(e),j=e.properties),this.onEvent(D,j)}_HandleKnownEvent(D){switch(a(`processing event '${D.name}'`,D.properties),D.name){case"RoomStatusChanged":D.properties.status!=="Joined"&&this._HandleConnectionLost();break;case"RoomUpdated":for(let j of D.properties.updates)this._HandleRoomUpdate(j);break;case"PeerUpdated":this._HandlePeerUpdate(D.properties);break}}_HandleConnectionLost(){for(let D of this._Peers.keys())this._HandlePeerLeft(D);for(let[D,j]of this._Captures)j.media!==void 0&&(D instanceof $,D instanceof w&&(D.stop(this._Connection,j.media),j.media=void 0));this._AvailableMediaIds.length=0}_HandleRoomUpdate(D){if(D.kind==="Joined"){nA(this._AvailableMediaIds.length===0,"left over media ids"),this._AvailableMediaIds.push(...D.media_ids),this._HandleRoomJoined();for(let j of D.room.peers)this._HandlePeerJoined(j)}else D.kind==="PeerJoined"?this._HandlePeerJoined(D.peer):D.kind==="PeerLeft"&&this._HandlePeerLeft(D.peer_id)}_HandleRoomJoined(){for(let[D,j]of this._Captures)this._AvailableMediaIds.length===0||this.mainConnection===void 0||(j.media={connectionId:this.mainConnection.id,mediaId:this._AvailableMediaIds.shift()},D instanceof w&&D.start(this._Connection,j.media),D instanceof $)}_HandlePeerUpdate(D){D.kind==="MediaStarted"?this._HandleMediaStart(D.peer_id,D.media):D.kind==="MediaStopped"&&this._HandleMediaStopped(D.peer_id,D.media_id)}_HandlePeerJoined(D){this._Peers.has(D.id)||this._Peers.set(D.id,{mediaIds:new Map});for(let j of D.medias)this._HandleMediaStart(D.id,j)}_HandlePeerLeft(D){let j=this._Peers.get(D);if(j!==void 0){for(let e of j.mediaIds.keys())this._HandleMediaStopped(D,e);this._Peers.delete(D)}}_HandleMediaStart(D,j){if(this.mainConnection===void 0)return;let e=this._Peers.get(D);if(e===void 0||j.properties.kind!=="audio"&&j.properties.kind!=="video")return;let B=String(j.properties.uid??ar());j.properties.uid=B;let C=this._Playbacks.get(B)??{media:void 0,playback:void 0};this._Playbacks.set(B,C),e.mediaIds.set(j.id,B),C.media={connectionId:this.mainConnection.id,mediaId:j.id},C.playback!==void 0&&(C.playback instanceof H&&C.playback.start(C.media),C.playback instanceof P&&this.mainConnection.startRemoteVideo(C.media.mediaId).then())}_HandleMediaStopped(D,j){let e=this._Peers.get(D);if(e===void 0)return;let B=e?.mediaIds.get(j);if(B===void 0)return;let C=this._Playbacks.get(B);C!==void 0&&(C.media!==void 0&&C.media.mediaId===j&&C.playback!==void 0&&(C.playback instanceof H&&C.playback.stop(C.media),C.playback instanceof P&&this.mainConnection?.stopRemoteVideo(C.media.mediaId),C.media=void 0),e.mediaIds.delete(j))}};nx();function iB(v,D){c0(D?.logger,D?.onLogMessage);let j,e=new Gx((C,E)=>j.receivePacket(C,E)),B=new ox(v);return j=new ax(B,e.sendDatagram.bind(e),D?.enableHTMLAudioElementFallback??!1),new B0(e,j,D)}var dx=cr(),v0=[],sA=!1;function dr(){sA||typeof window>"u"||(window.addEventListener("beforeunload",()=>{for(let v of v0)v.deref()?.close()}),sA=!0)}var B0=class{constructor(D,j,e){this.version="9";this.supportedTransports=["H3","WebRTC"];this._PlaybackVolume=[1,1];this._CreatedAt=Date.now();this._Options=e??{},this._Options.disableBeforeUnload||dr(),this._ConnectionPool=D,this._MediaController=j,v0.push(new WeakRef(this)),o("plugin initialized")}get playbackVolume(){return this._PlaybackVolume}joinRoom(D){return new Mx(this._ConnectionPool,D,this._Options)}async createAudioPlayback(D){return this._MediaController.createAudioPlayback(D)}async createAudioCapture(D){return this._MediaController.createAudioCapture(D)}async createVideoCapture(D,j){return this._MediaController.createVideoCapture(D,j)}async createVideoPlayback(D){return new P(D.uid,D.customType)}enumerateDevices(){return fx()}setOutputVolume(D){this._MediaController.playbackSetGlobalVolume(D)}async setOutputDevice(D){await this._MediaController.playbackSetDevice(D.device)}close(){this._MediaController.close(),this._ConnectionPool.close(),o("plugin closed")}async dump(){return{createdAt:this._CreatedAt,connections:await this._ConnectionPool.dump(),medias:await this._MediaController.dump()}}};async function iA(){let v=[];for(let D of v0){let j=D.deref();j!==void 0&&v.push(await j.dump())}return JSON.stringify({timestamp:Date.now(),instances:v,background:await m0()})}globalThis.odin_debug_dump_state=iA;window!==void 0&&(window.odin_debug_dump_state=iA);export{dx as SESSION_ID,iB as createPlugin};