@signalwire/js 3.17.0-dev.202211170918.bfb25ed.0 → 3.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1354,7 +1354,7 @@ var JWTSession = class extends BaseJWTSession {
1354
1354
  }));
1355
1355
  this.options = options;
1356
1356
  __publicField(this, "WebSocketConstructor", WebSocket);
1357
- __publicField(this, "agent", "@signalwire/js/browser/3.17.0-dev.202211170918.bfb25ed.0");
1357
+ __publicField(this, "agent", "@signalwire/js/browser/3.17.0");
1358
1358
  }
1359
1359
  get allowHijack() {
1360
1360
  return this.options._hijack;
package/dist/index.js CHANGED
@@ -1359,7 +1359,7 @@ var JWTSession = class extends import_core14.BaseJWTSession {
1359
1359
  }));
1360
1360
  this.options = options;
1361
1361
  __publicField(this, "WebSocketConstructor", WebSocket);
1362
- __publicField(this, "agent", "@signalwire/js/browser/3.17.0-dev.202211170918.bfb25ed.0");
1362
+ __publicField(this, "agent", "@signalwire/js/browser/3.17.0");
1363
1363
  }
1364
1364
  get allowHijack() {
1365
1365
  return this.options._hijack;
package/dist/index.umd.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * SignalWire JS SDK v3.17.0-dev.202211170918.bfb25ed.0 (https://signalwire.com)
2
+ * SignalWire JS SDK v3.17.0 (https://signalwire.com)
3
3
  * Copyright 2018-2022 SignalWire
4
4
  * Licensed under MIT(https://github.com/signalwire/signalwire-js/blob/main/LICENSE)
5
5
  */
@@ -17,5 +17,5 @@
17
17
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
18
18
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19
19
  PERFORMANCE OF THIS SOFTWARE.
20
- ***************************************************************************** */function ii(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}const ai=function*(e){Gt().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for roomSubscribedWorker");for(;;){const e=yield Oe(o,(e=>{var t;return"webrtc.message"===e.type&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===s})),{id:t,method:n,params:i={}}=e.payload,{callID:a,nodeId:c}=i,d=r.getRTCPeerById(a);if(!d){Gt().warn(`RTCPeer '${a}' not found for method: '${n}'`,i);continue}const u=r.peer;switch(n){case"verto.media":case"verto.answer":d.uuid===(null==u?void 0:u.uuid)&&r.setState("verto.media"===n?"early":"active"),(null==i?void 0:i.sdp)&&d.onRemoteSdp(i.sdp),yield Ae(Ir.executeAction({method:"video.message",params:{message:Tr(t,n),node_id:c}}));break;case"verto.bye":yield je(r.onVertoBye,{rtcPeerId:a,byeCause:null==i?void 0:i.cause,byeCauseCode:null==i?void 0:i.causeCode,redirectDestination:null==i?void 0:i.redirectDestination}),yield Ae(Ir.executeAction({method:"video.message",params:{message:Tr(t,n),node_id:c}}));break;case"verto.ping":{const{nodeId:e}=i,t=ii(i,["nodeId"]);yield Ae(Ir.executeAction({method:"video.message",params:{message:Cr(t),node_id:e}}));break}case"verto.mediaParams":{if(!a||!i.mediaParams){Gt().warn("Invalid mediaParams event",i);break}const{audio:e,video:t}=i.mediaParams;d&&t&&d.applyMediaConstraints("video",t),d&&e&&d.applyMediaConstraints("audio",e);break}default:return Gt().warn(`Unknown Verto method: ${n}`,i)}}Gt().trace("vertoEventWorker ended")},ci=function*(e){Gt().debug("roomSubscribedWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o,pubSubChannel:s}=t,{rtcPeerId:i}=n;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const a=yield Oe(o,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===i));r._attachListeners(a.payload.room_session.id),r.applyEmitterTransforms(),r.setActiveRTCPeer(i),yield Ae(cn.upsert({id:a.payload.call_id,roomId:a.payload.room_session.room_id,roomSessionId:a.payload.room_session.id,memberId:a.payload.member_id,previewUrl:a.payload.room_session.preview_url})),yield Ae(s,{type:"video.room.joined",payload:a.payload}),Gt().debug("roomSubscribedWorker ended",i)},di=function*(e){Gt().debug("promoteDemoteWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for promoteDemoteWorker");const i=yield Oe(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));Gt().debug("promoteDemoteWorker:",i.type,i.payload),yield Ae(Zr.updateAuthState(i.payload.authorization));const a=yield Ne(Es.getAuthState);if(!a)throw new Error(`Invalid authState for '${i.type}'`);const{audio_allowed:c,video_allowed:d}=a;switch(i.type){case"video.member.promoted":r.updateMediaOptions({audio:"both"===c,video:"both"===d,negotiateAudio:"none"!==c,negotiateVideo:"none"!==d});break;case"video.member.demoted":r.updateMediaOptions({audio:!1,video:!1,negotiateAudio:"none"!==c,negotiateVideo:"none"!==d})}r._triggerNewRTCPeer(),Gt().debug("promoteDemoteWorker ended",s)},ui={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},li=Object.assign(Object.assign({},ui),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),hi={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},mi={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:ui,video:hi,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3};class pi extends $n{constructor(e){super(e),this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.onVertoBye=e=>{const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:n="16",redirectDestination:o}=e;this.cause=String(r),this.causeCode=String(n);const s=this.getRTCPeerById(t);return s?o&&s.localSdp?(this.logger.debug("Redirect Destination to:",o,"for RTCPeer:",s.uuid),void this.executeInvite(s.localSdp,s.uuid,o)):(s.onRemoteBye({code:this.causeCode,message:this.cause}),void(this.activeRTCPeerId===(null==s?void 0:s.uuid)&&this.setState("hangup"))):this.logger.warn("Invalid RTCPeer to hangup",e)},this.options=Object.assign(Object.assign({},mi),e),this._checkDefaultMediaConstraints(),this.setState("new"),this.logger.trace("New Call with Options:",this.options),this.applyEmitterTransforms({local:!0})}get id(){return this.__uuid}get active(){return"active"===this.state}get trying(){return"trying"===this.state}get memberId(){return this.component.memberId}get previewUrl(){return this.component.previewUrl}get roomId(){return this.component.roomId}get roomSessionId(){return this.component.roomSessionId}get callId(){var e;return(null===(e=this.peer)||void 0===e?void 0:e.uuid)||""}get localStream(){var e;return null===(e=this.peer)||void 0===e?void 0:e.localStream}set localStream(e){this.peer&&(this.peer.localStream=e)}get remoteStream(){var e;return null===(e=this.peer)||void 0===e?void 0:e.remoteStream}get iceServers(){var e,t;return null!==(t=null===(e=this.options)||void 0===e?void 0:e.iceServers)&&void 0!==t?t:this.select(Es.getIceServers)}get component(){return this.select((e=>In.getComponent(e,this.callId)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:s,remoteCallerNumber:i,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:u=!0}=this.options;return{dialogParams:{id:e,destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:s,remoteCallerNumber:i,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:u,version:1e3}}}get cameraId(){return this.peer?this.peer.getDeviceId("video"):null}get cameraLabel(){return this.peer?this.peer.getDeviceLabel("video"):null}get microphoneId(){return this.peer?this.peer.getDeviceId("audio"):null}get microphoneLabel(){return this.peer?this.peer.getDeviceLabel("audio"):null}get withAudio(){var e;return Boolean(null===(e=this.peer)||void 0===e?void 0:e.hasAudioReceiver)}get withVideo(){var e;return Boolean(null===(e=this.peer)||void 0===e?void 0:e.hasVideoReceiver)}get localVideoTrack(){return this.peer?this.peer.localVideoTrack:null}get localAudioTrack(){return this.peer?this.peer.localAudioTrack:null}get peer(){return this.getRTCPeerById(this.activeRTCPeerId)}set peer(e){e?(this.logger.debug("Set RTCPeer",e.uuid,e),this.rtcPeerMap.set(e.uuid,e),this.peer&&this.callId!==e.uuid&&(this.logger.debug(">>> Stop old RTCPeer",this.peer.uuid),this.peer.detachAndStop()),this.logger.debug(">>> Replace RTCPeer with",e.uuid),this.activeRTCPeerId=e.uuid):this.logger.warn("Invalid RTCPeer",e)}getRTCPeerById(e){return this.rtcPeerMap.get(e)}appendRTCPeer(e){return this.rtcPeerMap.set(e.uuid,e)}setActiveRTCPeer(e){this.peer=this.getRTCPeerById(e)}vertoExecute(e){return this.execute({method:"video.message",params:e})}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new si(this,"offer");this.appendRTCPeer(e),this.logger.debug("Run workers for the new RTCPeer",e.uuid),this.runRTCPeerWorkers(e.uuid),this.logger.debug("Trigger start for the new RTCPeer!"),await e.start()}catch(e){this.logger.error("Error building new RTCPeer to promote/demote",e)}}updateCamera(e){return this.updateConstraints({video:Object.assign({aspectRatio:16/9},e)})}updateMicrophone(e){return this.updateConstraints({audio:e})}manageSendersWithConstraints(e){return!1===e.audio&&(this.logger.info("Switching off the microphone"),this.stopOutboundAudio()),!1===e.video&&(this.logger.info("Switching off the camera"),this.stopOutboundVideo()),e.audio||e.video}updateConstraints(e,{attempt:t=0}={}){return t>1?Promise.reject(new Error("Failed to update constraints")):new Promise((async(r,n)=>{var o;try{if(!this.peer)return n(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return n(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return void this.logger.debug("Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped");let s;try{s=await $s(e)}catch(s){if(s instanceof DOMException&&"Concurrent mic process limit."===s.message){let n={};null===(o=this.localStream)||void 0===o||o.getTracks().forEach((t=>{var r;n[t.kind]=t.getConstraints(),void 0!==e[t.kind]&&(this.logger.debug("updateConstraints stop old tracks to retrieve new ones"),As(t),null===(r=this.localStream)||void 0===r||r.removeTrack(t))}));try{return r(this.updateConstraints(e,{attempt:t+1}))}catch(e){return this.logger.error("Restoring previous constraints"),r(this.updateConstraints(n,{attempt:t+1}))}}return this.logger.error("updateConstraints",s),n(s)}this.logger.debug("updateConstraints got stream",s),this.localStream||(this.localStream=new MediaStream);const{instance:i}=this.peer,a=s.getTracks();this.logger.debug(`updateConstraints got ${a.length} tracks`);for(let e=0;e<a.length;e++){const t=a[e];this.logger.debug("updateConstraints apply track: ",t);const r=i.getTransceivers().find((({mid:e,sender:r,receiver:n})=>r.track&&r.track.kind===t.kind?(this.logger.debug("Found transceiver by sender"),!0):n.track&&n.track.kind===t.kind?(this.logger.debug("Found transceiver by receiver"),!0):null===e&&(this.logger.debug("Found disassociated transceiver"),!0)));r&&r.sender?(this.logger.debug("updateConstraints got transceiver",r.currentDirection,r.mid),await r.sender.replaceTrack(t),this.logger.debug("updateConstraints replaceTrack"),r.direction="sendrecv",this.logger.debug("updateConstraints set to sendrecv"),this.localStream.getTracks().forEach((e=>{var r;e.kind===t.kind&&e.id!==t.id&&(this.logger.debug("updateConstraints stop old track and apply new one - "),As(e),null===(r=this.localStream)||void 0===r||r.removeTrack(e))})),this.localStream.addTrack(t)):(this.logger.debug("updateConstraints no transceiver found. addTrack and start dancing!"),this.peer.type="offer",this.doReinvite=!0,this.localStream.addTrack(t),i.addTrack(t,this.localStream)),this.logger.debug("updateConstraints simply update mic/cam"),"audio"===t.kind?this.options.micId=t.getSettings().deviceId:"video"===t.kind&&(this.options.camId=t.getSettings().deviceId)}this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),n(e)}}))}runRTCPeerWorkers(e){this.runWorker("vertoEventWorker",{worker:ai,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:ci,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:di,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new si(this,"offer");try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Invite error",e),t(e)}}))}answer(){return new Promise((async(e,t)=>{this.direction="inbound",this.peer=new si(this,"answer");try{await this.peer.start(),e(this)}catch(e){this.logger.error("Answer error",e),t(e)}}))}onLocalSDPReady(e){if(!e.instance.localDescription)throw this.logger.error("Missing localDescription",e),new Error("Invalid RTCPeerConnection localDescription");const{type:t,sdp:r}=e.instance.localDescription,n=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",n),t){case"offer":return e.instance.remoteDescription?this.executeUpdateMedia(n,e.uuid):this.executeInvite(n,e.uuid);case"answer":this.logger.warn("Unhandled verto.answer");break;default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}async executeInvite(e,t,r){const n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const n=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},o=wr(Object.assign(Object.assign(Object.assign({},this.dialogParams(t)),n),{sdp:e}));let s=[];s=this.options.screenShare?["video.room.screenshare"]:this.options.additionalDevice?["video.room.additionaldevice"]:this.getSubscriptions();const i=await this.vertoExecute({message:o,node_id:r,subscribe:s});this.logger.debug("Invite response",i)}catch(e){throw this.setState("hangup"),e.jsonrpc}}async executeUpdateMedia(e,t){try{const r=kr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r});if(n.sdp||this.logger.error("UpdateMedia invalid SDP answer",n),this.logger.debug("UpdateMedia response",n),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(n.sdp)}catch(e){throw this.logger.error("UpdateMedia error",e),e.jsonrpc}}async hangup(e){const t=null!=e?e:this.callId;if(!t)throw new Error("Invalid RTCPeer ID to hangup");try{const e=Sr(this.dialogParams(t));await this.vertoExecute({message:e})}catch(e){this.logger.error("Hangup error:",e)}finally{if(t!==this.callId)return this.logger.warn("Prevent setState hangup",t,this.callId);this.setState("hangup")}}dtmf(e){const t=this.callId;if(!t)throw new Error("Invalid RTCPeer ID to send DTMF");const r=Er(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));this.vertoExecute({message:r})}doReinviteWithRelayOnly(){this.peer&&this.active&&this.peer.restartIceWithRelayOnly()}stopOutboundAudio(){this.peer&&this.active&&this.peer.stopTrackSender("audio")}restoreOutboundAudio(){this.peer&&this.active&&this.peer.restoreTrackSender("audio")}stopOutboundVideo(){this.peer&&this.active&&this.peer.stopTrackSender("video")}restoreOutboundVideo(){this.peer&&this.active&&this.peer.restoreTrackSender("video")}setState(e){switch(this.prevState=this.state,this.state=e,this.logger.trace(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this.emit(this.state,this),e){case"purge":this._finalize();break;case"hangup":this.setState("destroy");break;case"destroy":this._finalize()}}updateMediaOptions(e){this.logger.debug("updateMediaOptions",Object.assign({},e)),this.options=Object.assign(Object.assign({},this.options),e),this._checkDefaultMediaConstraints()}_mungeSDP(e){return e}_checkDefaultMediaConstraints(){!0===this.options.video&&(this.options.video=hi),!0===this.options.audio&&(this.options.audio=this.options.screenShare?li:ui)}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear(),this.destroy()}}const gi=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{Gt().error("Video Element Paused",e,t)}))})),e},fi=({element:e})=>new Promise((t=>{e.addEventListener("canplay",(function r(){e.removeEventListener("canplay",r),t()})),e.addEventListener("resize",(function r(){e.removeEventListener("resize",r),t()}))})),vi=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),yi=({video:e,rootElement:t,paddingWrapper:r})=>{const n=e.videoHeight/e.videoWidth*100,o=function(e,t=0,r){let n=null,o=null;const s=function(){n&&(clearTimeout(n),o=null,n=null)},i=function(){if(!t)return e.apply(this,arguments);const i=this,a=arguments,c=r&&!n;return s(),o=function(){e.apply(i,a)},n=setTimeout((function(){if(n=null,!c){const e=o;return o=null,null==e?void 0:e()}}),t),c&&o?o():void 0};return i.cancel=s,i.flush=function(){const e=o;s(),e&&e()},i}((({width:t,height:o})=>{if(r){const s=o/t*100;r.style.paddingBottom=`${s>n?n:s}%`,r.style.width=((t,r)=>{const n=e.videoWidth/e.videoHeight;return n>t/r?"100%":r*n+"px"})(t,o)}}),100),s=new ResizeObserver((e=>{e.forEach((e=>{if(e.contentBoxSize){const{inlineSize:t,blockSize:r}=Array.isArray(e.contentBoxSize)?e.contentBoxSize[0]:e.contentBoxSize;o({width:t,height:r})}else e.contentRect&&o({width:e.contentRect.width,height:e.contentRect.height})}))}));return{start:()=>s.observe(t),stop:()=>s.disconnect()}},bi=Ir.createAction("swJs/audioSetSpeakerAction"),_i=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,s=gi(),i={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(Gt().debug("Set localOverlay",e),o.set(this.id,e)):(Gt().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return Gt().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?Gt().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):Gt().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return Gt().warn("Missing localOverlay to set the local overlay stream");const t=this.domElement.querySelector("video");t&&(t.srcObject=e)}},a=(({localOverlay:e,rootElement:t})=>async({layout:r,myMemberId:n,localStream:o})=>{Gt().debug("Process layout.changed");try{const{layers:s=[]}=r,i=s.find((({member_id:e})=>e===n));let a=e.domElement;if(e.status=i?"visible":"hidden",!i)return Gt().debug("Location not found"),void(a&&(Gt().debug("Current layer not visible"),e.hide()));if(!a){Gt().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=vi(e),s=document.createElement("div");return s.style.position="absolute",s.style.overflow="hidden",s.style.top=t,s.style.left=r,s.style.width=n,s.style.height=o,s})({location:i}),a.id=e.id;const r=gi();r.srcObject=o,r.disablePictureInPicture=!0,r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",a.appendChild(r);const n=t.querySelector(".mcuLayers"),s=n?.querySelector(`#${a.id}`);return void(n&&!s&&(n.appendChild(a),e.domElement=a))}const{top:c,left:d,width:u,height:l}=vi(i);Gt().debug("Update myLayer:",c,d,u,l);const h=o.getVideoTracks().filter((e=>e.enabled&&"live"===e.readyState)).length>0;h&&e.setLocalOverlayMediaStream(o),a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=u,a.style.height=l}catch(e){Gt().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:i});let c;r.on("layout.changed",(e=>{Gt().debug("Received layout.changed"),r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):i.hide()})),r.on("room.subscribed",(e=>{const t=e.room_session.members?.find((e=>e.id===r.memberId));if(t?.audio_muted)try{r.stopOutboundAudio()}catch(e){Gt().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){Gt().error("Error handling video_muted",e)}r.localStream&&i.setLocalOverlayMediaStream(r.localStream)})),r.on("member.updated.video_muted",(e=>{try{const{member:t}=e;t.id===r.memberId&&"video_muted"in t&&(t.video_muted?i.hide():i.show())}catch(e){Gt().error("Error handling video_muted",e)}})),r.on("track",(function(r){switch(r.track.kind){case"video":c=n(ki,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:s})}})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),o.clear(),c?.cancel()}))}catch(e){Gt().error("videoElementSaga",e)}};function*wi({element:e,room:t}){const r=Ir.getCustomSagaActionType(t.__uuid,bi);for(;;){const n=yield Oe([r]);try{switch(n.type){case r:const o=yield je(Rs,e,n.payload);t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:o,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),Gt().error(e)}}}function*Si({track:e,element:t,speakerId:r,room:n}){(({track:e,element:t})=>{t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({track:e,element:t}),r&&Rs(t,r).catch((()=>{})),yield Le(wi,{element:t,room:n})}function*ki({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){try{if((({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({element:n,track:r}),n.style.width="100%",n.style.maxHeight="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void Gt().debug("MCU Content already there");const o=document.createElement("div");o.style.position="absolute",o.style.top="0",o.style.left="0",o.style.right="0",o.style.bottom="0",o.appendChild(n);const s=document.createElement("div");s.classList.add("paddingWrapper"),s.style.paddingBottom="56.25%",s.style.position="relative",s.style.width="100%",s.appendChild(o);const i=document.createElement("div");i.classList.add("mcuLayers"),i.style.display="none",s.appendChild(i);const a=document.createElement("div");a.classList.add("mcuContent"),a.style.position="relative",a.style.width="100%",a.style.height="100%",a.style.margin="0 auto",a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="center",a.appendChild(s),e.style.width="100%",e.style.height="100%",e.appendChild(a),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(Gt().debug("Wait for the MCU to be ready"),yield je(fi,{element:n}));const c=yi({rootElement:e,video:n,paddingWrapper:s});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),i.style.display="block"}catch(e){Gt().error("Handle video track error",e)}}const Ei={errors:"onError",responses:"onSuccess"},Ci={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},Ti=nr(class extends pi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:zn.audioMuteMember,audioUnmute:zn.audioUnmuteMember,videoMute:zn.videoMuteMember,videoUnmute:zn.videoUnmuteMember,setMicrophoneVolume:zn.setInputVolumeMember,setInputVolume:zn.setInputVolumeMember,setInputSensitivity:zn.setInputSensitivityMember}),Ii=nr(class extends pi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:zn.audioMuteMember,audioUnmute:zn.audioUnmuteMember,videoMute:zn.videoMuteMember,videoUnmute:zn.videoUnmuteMember,setInputVolume:zn.setInputVolumeMember,setMicrophoneVolume:zn.setInputVolumeMember,setInputSensitivity:zn.setInputSensitivityMember}),Mi=()=>{},Pi="video.memberList.updated",Ri=tr({event:Pi}),Oi=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(Ut),e)),[]).join(".")})(Ri),Ai=["video.room.joined","video.member.joined","video.member.left","video.member.updated"];function*xi({pubSubChannel:e}){const t=new Map;function*r(r){const n={room_session_id:"video.room.joined"===r.type?r.payload.room_session.id:r.payload.room_session_id,members:(({action:e,memberList:t})=>{const r=(e=>"video.room.joined"===e.type?e.payload.room_session.members:[e.payload.member])(e);switch(e.type){case"video.member.left":r.forEach((e=>{t.delete(e.id)}));break;default:r.forEach((e=>{t.set(e.id,e)}))}return Array.from(t.values())})({action:r,memberList:t})};yield Ae(e,{type:Oi,payload:n})}for(;;){const t=yield Oe(e,(({type:e})=>Ai.includes(e)));yield Le(r,t)}}const ji=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(Ri))))(r))return;const{cleanup:n}=((e,t)=>{(e=>lr(Ai).filter((t=>!e.includes(t))))(t).forEach((t=>{e.once(t,Mi)}));const r=({members:t})=>{e.emit(Pi,{members:t})};return e.on(Oi,r),{cleanup:()=>{e.off(Oi,r)}}})(t,r);yield Le(xi,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},Li=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield Le(cs.memberPositionWorker,e)},Ni=function*(e){Gt().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{parentId:s}=n;if(!s)throw new Error("Missing parentId for childMemberJoinedWorker");const i=yield Oe(o,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===s)),{member:a}=i.payload;a?.parent_id&&(r._attachListeners(a.id),r.applyEmitterTransforms(),(yield Ne(In.getComponent,a.parent_id))&&(yield Ae(cn.upsert({id:r.callId,roomId:i.payload.room_id,roomSessionId:i.payload.room_session_id,memberId:a.id})))),Gt().trace("childMemberJoinedWorker ended")},Di=nr(class extends pi{_screenShareList=new Set;_deviceList=new Set;get screenShareList(){return Array.from(this._screenShareList)}get deviceList(){return Array.from(this._deviceList)}get interactivityMode(){return this.select((({session:e})=>{const{authState:t}=e;return t?.join_as??""}))}get permissions(){return this.select((({session:e})=>{const{authState:t}=e;return t?.room?.scopes??[]}))}getEmitterTransforms(){return new Map([[["video.room.joined"],{type:"roomSession",instanceFactory:()=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})},playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})},streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[mr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[mr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[mr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>zn.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>Yt({...e.recording,room_session_id:this.roomSessionId})}],[[mr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>zn.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>Yt({...e.playback,room_session_id:this.roomSessionId})}],[[mr("video.stream.list")],{type:"roomSessionStreamList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[mr("video.stream.start"),"video.stream.started","video.stream.ended"],{type:"roomSessionStream",instanceFactory:e=>zn.createRoomSessionStreamObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>Yt({...e.stream,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...cs.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:ji})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:Li,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!0,layout:o,positions:s}=e,i=await Bs({audio:!0===r?Ci:r,video:n}),a={...this.options,screenShare:!0,recoverCall:!1,localStream:i,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId},layout:o,positions:s},c=Dn({store:this.store,Component:Ti,componentListeners:Ei})(a);i.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{c&&c.active&&c.leave()}))})),c.once("destroy",(()=>{c.emit("room.left"),this._screenShareList.delete(c)}));try{return c.runWorker("childMemberJoinedWorker",{worker:Ni,initialState:{parentId:this.memberId}}),this._screenShareList.add(c),t&&await c.join(),c}catch(e){throw this.logger.error("ScreenShare Error",e),e}}addCamera(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,video:r})}addMicrophone(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,audio:r})}async addDevice(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!1}=e;if(!r&&!n)throw new TypeError("At least one of `audio` or `video` must be requested.");const o={...this.options,localStream:void 0,remoteStream:void 0,audio:r,video:n,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},s=Dn({store:this.store,Component:Ii,componentListeners:Ei})(o);s.once("destroy",(()=>{s.emit("room.left"),this._deviceList.delete(s)}));try{return s.runWorker("childMemberJoinedWorker",{worker:Ni,initialState:{parentId:this.memberId}}),this._deviceList.add(s),t&&await s.join(),s}catch(e){throw this.logger.error("RoomDevice Error",e),e}}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){return this.triggerCustomSaga(bi(e))}async hangup(e){return this._screenShareList.forEach((e=>{e.leave()})),this._deviceList.forEach((e=>{e.leave()})),super.hangup(e)}_finalize(){this._screenShareList.clear(),this._deviceList.clear(),super._finalize()}getLayoutList(){return this.getLayouts()}getMemberList(){return this.getMembers()}},{audioMute:zn.audioMuteMember,audioUnmute:zn.audioUnmuteMember,videoMute:zn.videoMuteMember,videoUnmute:zn.videoUnmuteMember,deaf:zn.deafMember,undeaf:zn.undeafMember,setInputVolume:zn.setInputVolumeMember,setOutputVolume:zn.setOutputVolumeMember,setMicrophoneVolume:zn.setInputVolumeMember,setSpeakerVolume:zn.setOutputVolumeMember,setInputSensitivity:zn.setInputSensitivityMember,removeMember:zn.removeMember,removeAllMembers:zn.removeAllMembers,getMembers:zn.getMembers,getLayouts:zn.getLayouts,setLayout:zn.setLayout,setPositions:zn.setPositions,setMemberPosition:zn.setMemberPosition,hideVideoMuted:zn.hideVideoMuted,showVideoMuted:zn.showVideoMuted,getRecordings:zn.getRecordings,startRecording:zn.startRecording,getPlaybacks:zn.getPlaybacks,play:zn.play,setHideVideoMuted:zn.setHideVideoMuted,getMeta:zn.getMeta,setMeta:zn.setMeta,updateMeta:zn.updateMeta,deleteMeta:zn.deleteMeta,getMemberMeta:zn.getMemberMeta,setMemberMeta:zn.setMemberMeta,updateMemberMeta:zn.updateMemberMeta,deleteMemberMeta:zn.deleteMemberMeta,promote:zn.promote,demote:zn.demote,getStreams:zn.getStreams,startStream:zn.startStream}),Wi=function*(e){Gt().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Oe(r,(e=>e.type.startsWith("video-manager.")));yield Ae(n,e)}};class Vi extends qn{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:Wi})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>Yt(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>Yt(e)))})}],[["video-manager.room.started","video-manager.room.added","video-manager.room.updated","video-manager.room.ended","video-manager.room.deleted"],{type:"roomSession",instanceFactory:e=>Yt(e),payloadTransform:e=>Yt(e)}]])}}class Ui extends Bn{_videoManager;_chat;_pubSub;get rooms(){return{makeRoomObject:e=>{const{rootElement:t,applyLocalVideoOverlay:r=!0,stopCameraWhileMuted:n=!0,stopMicrophoneWhileMuted:o=!0,...s}=e,i=[];i.push((({speakerId:e})=>function*({instance:t,runSaga:r}){if("undefined"!=typeof Audio)try{const n=new Audio;let o;t.on("track",(function(s){switch(s.track.kind){case"audio":o=r(Si,{track:s.track,element:n,speakerId:e,room:t})}})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){Gt().error("audioElementSaga",e)}else Gt().warn("`Audio` is not supported on this environment.")})({speakerId:s.speakerId})),t&&i.push(_i({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...s,store:this.store,emitter:this.emitter,customSagas:i},Dn({store:c.store,customSagas:c.customSagas,Component:Di,componentListeners:Ei})(c));var c;return o&&a.on("member.updated.audio_muted",(({member:e})=>{try{e.id===a.memberId&&"audio_muted"in e&&(e.audio_muted?a.stopOutboundAudio():a.restoreOutboundAudio())}catch(e){this.logger.error("Error handling audio_muted",e)}})),n&&a.on("member.updated.video_muted",(({member:e})=>{try{e.id===a.memberId&&"video_muted"in e&&(e.video_muted?a.stopOutboundVideo():a.restoreOutboundVideo())}catch(e){this.logger.error("Error handling video_muted",e)}})),a}}}get chat(){return this._chat||(this._chat=Uo.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=Ko.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=Dn({store:e.store,Component:Vi,componentListeners:{errors:"onError",responses:"onSuccess"}})(e);return new Proxy(t,{get:(e,t,r)=>"_eventsNamespace"===t?"":"eventChannel"===t?"video-manager.rooms":Reflect.get(e,t,r)})})(this.options)),this._videoManager}reauthenticate(e){this.store.dispatch(Ir.reauthAction({token:e}))}}function $i(e){this.message=e}($i.prototype=new Error).name="InvalidCharacterError";var Bi="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new $i("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,n,o=0,s=0,i="";n=t.charAt(s++);~n&&(r=o%4?64*r+n:n,o++%4)?i+=String.fromCharCode(255&r>>(-2*o&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return i};function qi(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw"Illegal base64url string!"}try{return function(e){return decodeURIComponent(Bi(e).replace(/(.)/g,(function(e,t){var r=t.charCodeAt(0).toString(16).toUpperCase();return r.length<2&&(r="0"+r),"%"+r})))}(t)}catch(e){return Bi(t)}}function Fi(e){this.message=e}function Hi(e,t){if("string"!=typeof e)throw new Fi("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(qi(e.split(".")[r]))}catch(e){throw new Fi("Invalid token specified: "+e.message)}}(Fi.prototype=new Error).name="InvalidTokenError";class zi extends nn{options;WebSocketConstructor=WebSocket;agent="@signalwire/js/browser/3.17.0-dev.202211170918.bfb25ed.0";constructor(e){let t;try{t=Hi(e.token,{header:!0})}catch(e){}super({...e,host:t?.ch||e.host}),this.options=e}get allowHijack(){return this.options._hijack}async retrieveRelayProtocol(){if(!this.allowHijack)return"";const e=this.getRoomNameFromJWT();return e?(this.logger.info("Hijacking: search protocol for",e),window.sessionStorage.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowHijack)return;const e=this.getRoomNameFromJWT();e&&(this.logger.info("Hijacking: persist protocol",e,this.relayProtocol),window.sessionStorage.setItem(e,this.relayProtocol))}getRoomNameFromJWT(){try{return Hi(this.options.token)?.r}catch(e){return""}}}const Qi=e=>{const t={...e,emitter:new St},r=Wn({userOptions:t,SessionConstructor:zi});return Dn({store:r,Component:Ui,componentListeners:{errors:"onError",responses:"onSuccess"}})(t)},Ji=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Gi=Object.freeze({__proto__:null,ChatMember:Uo.ChatMember,ChatMessage:Uo.ChatMessage,Client:function(e){const t=Qi(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,n,o)=>n in r?r[n]:Ji.includes(n)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(n):Reflect.get(e,n,o)})}});const Ki=["getAllowedChannels","subscribe","publish"];var Xi=Object.freeze({__proto__:null,PubSubMessage:Ko.PubSubMessage,Client:function(e){const t=Qi(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,n,o)=>n in r?r[n]:Ki.includes(n)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(n):Reflect.get(e,n,o)})}});const Yi={aspectRatio:{ideal:16/9}},Zi=e=>new Promise((async(t,r)=>{const{audio:n=!0,video:o=!0,iceServers:s,rootElementId:i,applyLocalVideoOverlay:a=!0,autoJoin:c=!1,stopCameraWhileMuted:d=!0,stopMicrophoneWhileMuted:u=!0,speakerId:l,...h}=e,m=Qi({...h});if(await m.connect(),!m)return;let p;if(i){const e=document.getElementById(i);e?p=e:(p=document.body,Gt().warn(`We couldn't find an element with id: ${i}: using 'document.body' instead.`))}const g=m.rooms.makeRoomObject({audio:n,video:!0===o?Yi:o,negotiateAudio:!0,negotiateVideo:!0,iceServers:s,rootElement:p,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:u,speakerId:l});g.once("destroy",(()=>{g.emit("room.left"),m.disconnect()}));const f=()=>new Promise((async(e,t)=>{try{g.once("room.subscribed",(t=>{e(g)})),await g.join()}catch(e){Gt().error("Join",e),m.disconnect(),t(e)}})),v=new Proxy(g,{get:(e,t,r)=>"join"===t?f:Reflect.get(e,t,r)});if(c)try{await v.join(),t(v)}catch(e){r(e)}else t(v)})),ea=["audioMute","audioUnmute","deaf","getLayouts","getMembers","getRecordings","hideVideoMuted","leave","removerMember","restoreOutboundAudio","restoreOutboundVideo","setInputSensitivity","setInputVolume","setLayout","setPositions","setMemberPosition","setOutputVolume","showVideoMuted","startRecording","stopOutboundAudio","stopOutboundVideo","undeaf","videoMute","videoUnmute","setMicrophoneVolume","setSpeakerVolume","getMeta","setMeta","updateMeta","deleteMeta","getMemberMeta","setMemberMeta","updateMemberMeta","deleteMemberMeta","promote","demote"];var ta=Object.freeze({__proto__:null,RoomSession:function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s=!0,stopCameraWhileMuted:i=!0,stopMicrophoneWhileMuted:a=!0,speakerId:c,...d}=e;["audio","video"].forEach((t=>{t in e&&Gt().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const u=Qi(d),l=u.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s,stopCameraWhileMuted:i,stopMicrophoneWhileMuted:a,speakerId:c});l.once("destroy",(()=>{l.emit("room.left"),u.disconnect()}));const h={join:e=>new Promise((async(n,o)=>{try{l.attachPreConnectWorkers(),await u.connect();const s=e?.audio??t,i=e?.video??r,a=u._sessionAuthState,c=(e=>{const{authState:t,audio:r=!0,video:n=!0,sendAudio:o,sendVideo:s,receiveAudio:i,receiveVideo:a}=e;Gt().debug("getJoinMediaParams options",{...e});const{audio_allowed:c,video_allowed:d,join_as:u}=t,l="member"===(u??"member"),h=l&&"both"===c,m=l&&"both"===d,p="none"!==c,g="none"!==d,f=Boolean(o??r),v=Boolean(s??n),y=Boolean(i??r),b=Boolean(a??n);return!h&&f&&Gt().info("Not allowed to send audio on this room. Default values will be used."),!m&&v&&Gt().info("Not allowed to send video on this room. Default values will be used."),!p&&y&&Gt().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&Gt().info("Not allowed to receive video from the room. Default values will be used."),{mustSendAudio:h&&f,mustSendVideo:m&&v,mustRecvAudio:p&&y,mustRecvVideo:g&&b}})({authState:a,sendAudio:Boolean(t),sendVideo:Boolean(r),...e});if(!Object.values(c).some(Boolean))return u.disconnect(),o(new Error(`Invalid arguments to join the room. The token used has join_as: '${a.join_as}'. \n${JSON.stringify(e,null,2)}\n`));l.updateMediaOptions({audio:!!c.mustSendAudio&&(s||!0),video:!!c.mustSendVideo&&(i||!0),negotiateAudio:c.mustRecvAudio,negotiateVideo:c.mustRecvVideo}),l.once("room.subscribed",(e=>{l.attachOnSubscribedWorkers(e),n(l)})),await l.join()}catch(e){Gt().error("RoomSession Join",e),u.disconnect(),o(e)}}))};return new Proxy(l,{get(e,t,r){if(t in h)return h[t];if(!e.active&&ea.includes(t))throw new Error(`Tried to access the property/method "${t}" before the room was connected. Please call roomSession.join() first.`);return Reflect.get(e,t,r)}})},createRoomObject:Zi,joinRoom:e=>Zi({...e,autoJoin:!0}),createClient:Qi}),ra=Object.freeze({__proto__:null,getDevices:Hs,getCameraDevices:()=>Hs("camera"),getMicrophoneDevices:()=>Hs("microphone"),getSpeakerDevices:()=>Hs("speaker"),getDevicesWithPermissions:qs,getCameraDevicesWithPermissions:()=>qs("camera"),getMicrophoneDevicesWithPermissions:()=>qs("microphone"),getSpeakerDevicesWithPermissions:()=>qs("speaker"),checkPermissions:Ds,checkCameraPermissions:Ws,checkMicrophonePermissions:Vs,checkSpeakerPermissions:Us,requestPermissions:async e=>{try{const t=await $s(e);Os(t)}catch(e){throw e}},createDeviceWatcher:Ys,createCameraDeviceWatcher:()=>Ys({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>Ys({targets:["microphone"]}),createSpeakerDeviceWatcher:()=>Ys({targets:["speaker"]}),supportsMediaDevices:Cs,supportsGetUserMedia:()=>"function"==typeof Ts().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Ts().getDisplayMedia,getUserMedia:$s,getDisplayMedia:Bs,enumerateDevices:Ls,getSupportedConstraints:Is,supportsMediaOutput:Ps,setMediaElementSinkId:Rs,stopStream:Os,stopTrack:As,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(Zs(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},$s(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new St,n=new(window.AudioContext||window.webkitAudioContext),o=(e=>{const t=e.createAnalyser();return t.fftSize=64,t.minDecibels=-90,t.maxDecibels=-10,t.smoothingTimeConstant=.85,t})(n);let s,i;try{n.createMediaStreamSource(t).connect(o)}catch(e){throw new Error("No audio track found")}t.getAudioTracks().forEach((e=>{e.addEventListener("ended",(()=>{r.emit("destroyed","disconnected")}))}));const a=()=>{try{const e=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(e);const t=e.reduce(((e,t)=>e+t),0)/20;i!==t&&(i=t,r.emit("volumeChanged",Math.min(i,100))),s=requestAnimationFrame(a)}catch(e){r.emit("destroyed","error")}};s=requestAnimationFrame(a);const c=()=>{s&&cancelAnimationFrame(s),"closed"!==n.state&&n.close().catch((e=>{Gt().error("Error closing the AudioContext",e)})),Zs(e)||t.getTracks().forEach((e=>e.stop())),r.emit("destroyed",null),r.removeAllListeners()};return new Proxy(r,{get:(e,t,r)=>"destroy"===t?c:Reflect.get(e,t,r)})}});e.Chat=Gi,e.PubSub=Xi,e.Video=ta,e.WebRTC=ra,Object.defineProperty(e,"__esModule",{value:!0})}));
20
+ ***************************************************************************** */function ii(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}const ai=function*(e){Gt().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for roomSubscribedWorker");for(;;){const e=yield Oe(o,(e=>{var t;return"webrtc.message"===e.type&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===s})),{id:t,method:n,params:i={}}=e.payload,{callID:a,nodeId:c}=i,d=r.getRTCPeerById(a);if(!d){Gt().warn(`RTCPeer '${a}' not found for method: '${n}'`,i);continue}const u=r.peer;switch(n){case"verto.media":case"verto.answer":d.uuid===(null==u?void 0:u.uuid)&&r.setState("verto.media"===n?"early":"active"),(null==i?void 0:i.sdp)&&d.onRemoteSdp(i.sdp),yield Ae(Ir.executeAction({method:"video.message",params:{message:Tr(t,n),node_id:c}}));break;case"verto.bye":yield je(r.onVertoBye,{rtcPeerId:a,byeCause:null==i?void 0:i.cause,byeCauseCode:null==i?void 0:i.causeCode,redirectDestination:null==i?void 0:i.redirectDestination}),yield Ae(Ir.executeAction({method:"video.message",params:{message:Tr(t,n),node_id:c}}));break;case"verto.ping":{const{nodeId:e}=i,t=ii(i,["nodeId"]);yield Ae(Ir.executeAction({method:"video.message",params:{message:Cr(t),node_id:e}}));break}case"verto.mediaParams":{if(!a||!i.mediaParams){Gt().warn("Invalid mediaParams event",i);break}const{audio:e,video:t}=i.mediaParams;d&&t&&d.applyMediaConstraints("video",t),d&&e&&d.applyMediaConstraints("audio",e);break}default:return Gt().warn(`Unknown Verto method: ${n}`,i)}}Gt().trace("vertoEventWorker ended")},ci=function*(e){Gt().debug("roomSubscribedWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o,pubSubChannel:s}=t,{rtcPeerId:i}=n;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const a=yield Oe(o,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===i));r._attachListeners(a.payload.room_session.id),r.applyEmitterTransforms(),r.setActiveRTCPeer(i),yield Ae(cn.upsert({id:a.payload.call_id,roomId:a.payload.room_session.room_id,roomSessionId:a.payload.room_session.id,memberId:a.payload.member_id,previewUrl:a.payload.room_session.preview_url})),yield Ae(s,{type:"video.room.joined",payload:a.payload}),Gt().debug("roomSubscribedWorker ended",i)},di=function*(e){Gt().debug("promoteDemoteWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for promoteDemoteWorker");const i=yield Oe(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));Gt().debug("promoteDemoteWorker:",i.type,i.payload),yield Ae(Zr.updateAuthState(i.payload.authorization));const a=yield Ne(Es.getAuthState);if(!a)throw new Error(`Invalid authState for '${i.type}'`);const{audio_allowed:c,video_allowed:d}=a;switch(i.type){case"video.member.promoted":r.updateMediaOptions({audio:"both"===c,video:"both"===d,negotiateAudio:"none"!==c,negotiateVideo:"none"!==d});break;case"video.member.demoted":r.updateMediaOptions({audio:!1,video:!1,negotiateAudio:"none"!==c,negotiateVideo:"none"!==d})}r._triggerNewRTCPeer(),Gt().debug("promoteDemoteWorker ended",s)},ui={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},li=Object.assign(Object.assign({},ui),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),hi={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},mi={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:ui,video:hi,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3};class pi extends $n{constructor(e){super(e),this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.onVertoBye=e=>{const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:n="16",redirectDestination:o}=e;this.cause=String(r),this.causeCode=String(n);const s=this.getRTCPeerById(t);return s?o&&s.localSdp?(this.logger.debug("Redirect Destination to:",o,"for RTCPeer:",s.uuid),void this.executeInvite(s.localSdp,s.uuid,o)):(s.onRemoteBye({code:this.causeCode,message:this.cause}),void(this.activeRTCPeerId===(null==s?void 0:s.uuid)&&this.setState("hangup"))):this.logger.warn("Invalid RTCPeer to hangup",e)},this.options=Object.assign(Object.assign({},mi),e),this._checkDefaultMediaConstraints(),this.setState("new"),this.logger.trace("New Call with Options:",this.options),this.applyEmitterTransforms({local:!0})}get id(){return this.__uuid}get active(){return"active"===this.state}get trying(){return"trying"===this.state}get memberId(){return this.component.memberId}get previewUrl(){return this.component.previewUrl}get roomId(){return this.component.roomId}get roomSessionId(){return this.component.roomSessionId}get callId(){var e;return(null===(e=this.peer)||void 0===e?void 0:e.uuid)||""}get localStream(){var e;return null===(e=this.peer)||void 0===e?void 0:e.localStream}set localStream(e){this.peer&&(this.peer.localStream=e)}get remoteStream(){var e;return null===(e=this.peer)||void 0===e?void 0:e.remoteStream}get iceServers(){var e,t;return null!==(t=null===(e=this.options)||void 0===e?void 0:e.iceServers)&&void 0!==t?t:this.select(Es.getIceServers)}get component(){return this.select((e=>In.getComponent(e,this.callId)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:s,remoteCallerNumber:i,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:u=!0}=this.options;return{dialogParams:{id:e,destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:s,remoteCallerNumber:i,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:u,version:1e3}}}get cameraId(){return this.peer?this.peer.getDeviceId("video"):null}get cameraLabel(){return this.peer?this.peer.getDeviceLabel("video"):null}get microphoneId(){return this.peer?this.peer.getDeviceId("audio"):null}get microphoneLabel(){return this.peer?this.peer.getDeviceLabel("audio"):null}get withAudio(){var e;return Boolean(null===(e=this.peer)||void 0===e?void 0:e.hasAudioReceiver)}get withVideo(){var e;return Boolean(null===(e=this.peer)||void 0===e?void 0:e.hasVideoReceiver)}get localVideoTrack(){return this.peer?this.peer.localVideoTrack:null}get localAudioTrack(){return this.peer?this.peer.localAudioTrack:null}get peer(){return this.getRTCPeerById(this.activeRTCPeerId)}set peer(e){e?(this.logger.debug("Set RTCPeer",e.uuid,e),this.rtcPeerMap.set(e.uuid,e),this.peer&&this.callId!==e.uuid&&(this.logger.debug(">>> Stop old RTCPeer",this.peer.uuid),this.peer.detachAndStop()),this.logger.debug(">>> Replace RTCPeer with",e.uuid),this.activeRTCPeerId=e.uuid):this.logger.warn("Invalid RTCPeer",e)}getRTCPeerById(e){return this.rtcPeerMap.get(e)}appendRTCPeer(e){return this.rtcPeerMap.set(e.uuid,e)}setActiveRTCPeer(e){this.peer=this.getRTCPeerById(e)}vertoExecute(e){return this.execute({method:"video.message",params:e})}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new si(this,"offer");this.appendRTCPeer(e),this.logger.debug("Run workers for the new RTCPeer",e.uuid),this.runRTCPeerWorkers(e.uuid),this.logger.debug("Trigger start for the new RTCPeer!"),await e.start()}catch(e){this.logger.error("Error building new RTCPeer to promote/demote",e)}}updateCamera(e){return this.updateConstraints({video:Object.assign({aspectRatio:16/9},e)})}updateMicrophone(e){return this.updateConstraints({audio:e})}manageSendersWithConstraints(e){return!1===e.audio&&(this.logger.info("Switching off the microphone"),this.stopOutboundAudio()),!1===e.video&&(this.logger.info("Switching off the camera"),this.stopOutboundVideo()),e.audio||e.video}updateConstraints(e,{attempt:t=0}={}){return t>1?Promise.reject(new Error("Failed to update constraints")):new Promise((async(r,n)=>{var o;try{if(!this.peer)return n(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return n(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return void this.logger.debug("Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped");let s;try{s=await $s(e)}catch(s){if(s instanceof DOMException&&"Concurrent mic process limit."===s.message){let n={};null===(o=this.localStream)||void 0===o||o.getTracks().forEach((t=>{var r;n[t.kind]=t.getConstraints(),void 0!==e[t.kind]&&(this.logger.debug("updateConstraints stop old tracks to retrieve new ones"),As(t),null===(r=this.localStream)||void 0===r||r.removeTrack(t))}));try{return r(this.updateConstraints(e,{attempt:t+1}))}catch(e){return this.logger.error("Restoring previous constraints"),r(this.updateConstraints(n,{attempt:t+1}))}}return this.logger.error("updateConstraints",s),n(s)}this.logger.debug("updateConstraints got stream",s),this.localStream||(this.localStream=new MediaStream);const{instance:i}=this.peer,a=s.getTracks();this.logger.debug(`updateConstraints got ${a.length} tracks`);for(let e=0;e<a.length;e++){const t=a[e];this.logger.debug("updateConstraints apply track: ",t);const r=i.getTransceivers().find((({mid:e,sender:r,receiver:n})=>r.track&&r.track.kind===t.kind?(this.logger.debug("Found transceiver by sender"),!0):n.track&&n.track.kind===t.kind?(this.logger.debug("Found transceiver by receiver"),!0):null===e&&(this.logger.debug("Found disassociated transceiver"),!0)));r&&r.sender?(this.logger.debug("updateConstraints got transceiver",r.currentDirection,r.mid),await r.sender.replaceTrack(t),this.logger.debug("updateConstraints replaceTrack"),r.direction="sendrecv",this.logger.debug("updateConstraints set to sendrecv"),this.localStream.getTracks().forEach((e=>{var r;e.kind===t.kind&&e.id!==t.id&&(this.logger.debug("updateConstraints stop old track and apply new one - "),As(e),null===(r=this.localStream)||void 0===r||r.removeTrack(e))})),this.localStream.addTrack(t)):(this.logger.debug("updateConstraints no transceiver found. addTrack and start dancing!"),this.peer.type="offer",this.doReinvite=!0,this.localStream.addTrack(t),i.addTrack(t,this.localStream)),this.logger.debug("updateConstraints simply update mic/cam"),"audio"===t.kind?this.options.micId=t.getSettings().deviceId:"video"===t.kind&&(this.options.camId=t.getSettings().deviceId)}this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),n(e)}}))}runRTCPeerWorkers(e){this.runWorker("vertoEventWorker",{worker:ai,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:ci,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:di,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new si(this,"offer");try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Invite error",e),t(e)}}))}answer(){return new Promise((async(e,t)=>{this.direction="inbound",this.peer=new si(this,"answer");try{await this.peer.start(),e(this)}catch(e){this.logger.error("Answer error",e),t(e)}}))}onLocalSDPReady(e){if(!e.instance.localDescription)throw this.logger.error("Missing localDescription",e),new Error("Invalid RTCPeerConnection localDescription");const{type:t,sdp:r}=e.instance.localDescription,n=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",n),t){case"offer":return e.instance.remoteDescription?this.executeUpdateMedia(n,e.uuid):this.executeInvite(n,e.uuid);case"answer":this.logger.warn("Unhandled verto.answer");break;default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}async executeInvite(e,t,r){const n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const n=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},o=wr(Object.assign(Object.assign(Object.assign({},this.dialogParams(t)),n),{sdp:e}));let s=[];s=this.options.screenShare?["video.room.screenshare"]:this.options.additionalDevice?["video.room.additionaldevice"]:this.getSubscriptions();const i=await this.vertoExecute({message:o,node_id:r,subscribe:s});this.logger.debug("Invite response",i)}catch(e){throw this.setState("hangup"),e.jsonrpc}}async executeUpdateMedia(e,t){try{const r=kr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r});if(n.sdp||this.logger.error("UpdateMedia invalid SDP answer",n),this.logger.debug("UpdateMedia response",n),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(n.sdp)}catch(e){throw this.logger.error("UpdateMedia error",e),e.jsonrpc}}async hangup(e){const t=null!=e?e:this.callId;if(!t)throw new Error("Invalid RTCPeer ID to hangup");try{const e=Sr(this.dialogParams(t));await this.vertoExecute({message:e})}catch(e){this.logger.error("Hangup error:",e)}finally{if(t!==this.callId)return this.logger.warn("Prevent setState hangup",t,this.callId);this.setState("hangup")}}dtmf(e){const t=this.callId;if(!t)throw new Error("Invalid RTCPeer ID to send DTMF");const r=Er(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));this.vertoExecute({message:r})}doReinviteWithRelayOnly(){this.peer&&this.active&&this.peer.restartIceWithRelayOnly()}stopOutboundAudio(){this.peer&&this.active&&this.peer.stopTrackSender("audio")}restoreOutboundAudio(){this.peer&&this.active&&this.peer.restoreTrackSender("audio")}stopOutboundVideo(){this.peer&&this.active&&this.peer.stopTrackSender("video")}restoreOutboundVideo(){this.peer&&this.active&&this.peer.restoreTrackSender("video")}setState(e){switch(this.prevState=this.state,this.state=e,this.logger.trace(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this.emit(this.state,this),e){case"purge":this._finalize();break;case"hangup":this.setState("destroy");break;case"destroy":this._finalize()}}updateMediaOptions(e){this.logger.debug("updateMediaOptions",Object.assign({},e)),this.options=Object.assign(Object.assign({},this.options),e),this._checkDefaultMediaConstraints()}_mungeSDP(e){return e}_checkDefaultMediaConstraints(){!0===this.options.video&&(this.options.video=hi),!0===this.options.audio&&(this.options.audio=this.options.screenShare?li:ui)}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear(),this.destroy()}}const gi=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{Gt().error("Video Element Paused",e,t)}))})),e},fi=({element:e})=>new Promise((t=>{e.addEventListener("canplay",(function r(){e.removeEventListener("canplay",r),t()})),e.addEventListener("resize",(function r(){e.removeEventListener("resize",r),t()}))})),vi=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),yi=({video:e,rootElement:t,paddingWrapper:r})=>{const n=e.videoHeight/e.videoWidth*100,o=function(e,t=0,r){let n=null,o=null;const s=function(){n&&(clearTimeout(n),o=null,n=null)},i=function(){if(!t)return e.apply(this,arguments);const i=this,a=arguments,c=r&&!n;return s(),o=function(){e.apply(i,a)},n=setTimeout((function(){if(n=null,!c){const e=o;return o=null,null==e?void 0:e()}}),t),c&&o?o():void 0};return i.cancel=s,i.flush=function(){const e=o;s(),e&&e()},i}((({width:t,height:o})=>{if(r){const s=o/t*100;r.style.paddingBottom=`${s>n?n:s}%`,r.style.width=((t,r)=>{const n=e.videoWidth/e.videoHeight;return n>t/r?"100%":r*n+"px"})(t,o)}}),100),s=new ResizeObserver((e=>{e.forEach((e=>{if(e.contentBoxSize){const{inlineSize:t,blockSize:r}=Array.isArray(e.contentBoxSize)?e.contentBoxSize[0]:e.contentBoxSize;o({width:t,height:r})}else e.contentRect&&o({width:e.contentRect.width,height:e.contentRect.height})}))}));return{start:()=>s.observe(t),stop:()=>s.disconnect()}},bi=Ir.createAction("swJs/audioSetSpeakerAction"),_i=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,s=gi(),i={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(Gt().debug("Set localOverlay",e),o.set(this.id,e)):(Gt().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return Gt().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?Gt().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):Gt().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return Gt().warn("Missing localOverlay to set the local overlay stream");const t=this.domElement.querySelector("video");t&&(t.srcObject=e)}},a=(({localOverlay:e,rootElement:t})=>async({layout:r,myMemberId:n,localStream:o})=>{Gt().debug("Process layout.changed");try{const{layers:s=[]}=r,i=s.find((({member_id:e})=>e===n));let a=e.domElement;if(e.status=i?"visible":"hidden",!i)return Gt().debug("Location not found"),void(a&&(Gt().debug("Current layer not visible"),e.hide()));if(!a){Gt().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=vi(e),s=document.createElement("div");return s.style.position="absolute",s.style.overflow="hidden",s.style.top=t,s.style.left=r,s.style.width=n,s.style.height=o,s})({location:i}),a.id=e.id;const r=gi();r.srcObject=o,r.disablePictureInPicture=!0,r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",a.appendChild(r);const n=t.querySelector(".mcuLayers"),s=n?.querySelector(`#${a.id}`);return void(n&&!s&&(n.appendChild(a),e.domElement=a))}const{top:c,left:d,width:u,height:l}=vi(i);Gt().debug("Update myLayer:",c,d,u,l);const h=o.getVideoTracks().filter((e=>e.enabled&&"live"===e.readyState)).length>0;h&&e.setLocalOverlayMediaStream(o),a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=u,a.style.height=l}catch(e){Gt().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:i});let c;r.on("layout.changed",(e=>{Gt().debug("Received layout.changed"),r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):i.hide()})),r.on("room.subscribed",(e=>{const t=e.room_session.members?.find((e=>e.id===r.memberId));if(t?.audio_muted)try{r.stopOutboundAudio()}catch(e){Gt().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){Gt().error("Error handling video_muted",e)}r.localStream&&i.setLocalOverlayMediaStream(r.localStream)})),r.on("member.updated.video_muted",(e=>{try{const{member:t}=e;t.id===r.memberId&&"video_muted"in t&&(t.video_muted?i.hide():i.show())}catch(e){Gt().error("Error handling video_muted",e)}})),r.on("track",(function(r){switch(r.track.kind){case"video":c=n(ki,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:s})}})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),o.clear(),c?.cancel()}))}catch(e){Gt().error("videoElementSaga",e)}};function*wi({element:e,room:t}){const r=Ir.getCustomSagaActionType(t.__uuid,bi);for(;;){const n=yield Oe([r]);try{switch(n.type){case r:const o=yield je(Rs,e,n.payload);t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:o,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),Gt().error(e)}}}function*Si({track:e,element:t,speakerId:r,room:n}){(({track:e,element:t})=>{t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({track:e,element:t}),r&&Rs(t,r).catch((()=>{})),yield Le(wi,{element:t,room:n})}function*ki({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){try{if((({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({element:n,track:r}),n.style.width="100%",n.style.maxHeight="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void Gt().debug("MCU Content already there");const o=document.createElement("div");o.style.position="absolute",o.style.top="0",o.style.left="0",o.style.right="0",o.style.bottom="0",o.appendChild(n);const s=document.createElement("div");s.classList.add("paddingWrapper"),s.style.paddingBottom="56.25%",s.style.position="relative",s.style.width="100%",s.appendChild(o);const i=document.createElement("div");i.classList.add("mcuLayers"),i.style.display="none",s.appendChild(i);const a=document.createElement("div");a.classList.add("mcuContent"),a.style.position="relative",a.style.width="100%",a.style.height="100%",a.style.margin="0 auto",a.style.display="flex",a.style.alignItems="center",a.style.justifyContent="center",a.appendChild(s),e.style.width="100%",e.style.height="100%",e.appendChild(a),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(Gt().debug("Wait for the MCU to be ready"),yield je(fi,{element:n}));const c=yi({rootElement:e,video:n,paddingWrapper:s});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),i.style.display="block"}catch(e){Gt().error("Handle video track error",e)}}const Ei={errors:"onError",responses:"onSuccess"},Ci={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},Ti=nr(class extends pi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:zn.audioMuteMember,audioUnmute:zn.audioUnmuteMember,videoMute:zn.videoMuteMember,videoUnmute:zn.videoUnmuteMember,setMicrophoneVolume:zn.setInputVolumeMember,setInputVolume:zn.setInputVolumeMember,setInputSensitivity:zn.setInputSensitivityMember}),Ii=nr(class extends pi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:zn.audioMuteMember,audioUnmute:zn.audioUnmuteMember,videoMute:zn.videoMuteMember,videoUnmute:zn.videoUnmuteMember,setInputVolume:zn.setInputVolumeMember,setMicrophoneVolume:zn.setInputVolumeMember,setInputSensitivity:zn.setInputSensitivityMember}),Mi=()=>{},Pi="video.memberList.updated",Ri=tr({event:Pi}),Oi=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(Ut),e)),[]).join(".")})(Ri),Ai=["video.room.joined","video.member.joined","video.member.left","video.member.updated"];function*xi({pubSubChannel:e}){const t=new Map;function*r(r){const n={room_session_id:"video.room.joined"===r.type?r.payload.room_session.id:r.payload.room_session_id,members:(({action:e,memberList:t})=>{const r=(e=>"video.room.joined"===e.type?e.payload.room_session.members:[e.payload.member])(e);switch(e.type){case"video.member.left":r.forEach((e=>{t.delete(e.id)}));break;default:r.forEach((e=>{t.set(e.id,e)}))}return Array.from(t.values())})({action:r,memberList:t})};yield Ae(e,{type:Oi,payload:n})}for(;;){const t=yield Oe(e,(({type:e})=>Ai.includes(e)));yield Le(r,t)}}const ji=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(Ri))))(r))return;const{cleanup:n}=((e,t)=>{(e=>lr(Ai).filter((t=>!e.includes(t))))(t).forEach((t=>{e.once(t,Mi)}));const r=({members:t})=>{e.emit(Pi,{members:t})};return e.on(Oi,r),{cleanup:()=>{e.off(Oi,r)}}})(t,r);yield Le(xi,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},Li=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield Le(cs.memberPositionWorker,e)},Ni=function*(e){Gt().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{parentId:s}=n;if(!s)throw new Error("Missing parentId for childMemberJoinedWorker");const i=yield Oe(o,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===s)),{member:a}=i.payload;a?.parent_id&&(r._attachListeners(a.id),r.applyEmitterTransforms(),(yield Ne(In.getComponent,a.parent_id))&&(yield Ae(cn.upsert({id:r.callId,roomId:i.payload.room_id,roomSessionId:i.payload.room_session_id,memberId:a.id})))),Gt().trace("childMemberJoinedWorker ended")},Di=nr(class extends pi{_screenShareList=new Set;_deviceList=new Set;get screenShareList(){return Array.from(this._screenShareList)}get deviceList(){return Array.from(this._deviceList)}get interactivityMode(){return this.select((({session:e})=>{const{authState:t}=e;return t?.join_as??""}))}get permissions(){return this.select((({session:e})=>{const{authState:t}=e;return t?.room?.scopes??[]}))}getEmitterTransforms(){return new Map([[["video.room.joined"],{type:"roomSession",instanceFactory:()=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})},playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})},streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[mr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[mr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[mr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>zn.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>Yt({...e.recording,room_session_id:this.roomSessionId})}],[[mr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>zn.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>Yt({...e.playback,room_session_id:this.roomSessionId})}],[[mr("video.stream.list")],{type:"roomSessionStreamList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[mr("video.stream.start"),"video.stream.started","video.stream.ended"],{type:"roomSessionStream",instanceFactory:e=>zn.createRoomSessionStreamObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>Yt({...e.stream,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...cs.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:ji})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:Li,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!0,layout:o,positions:s}=e,i=await Bs({audio:!0===r?Ci:r,video:n}),a={...this.options,screenShare:!0,recoverCall:!1,localStream:i,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId},layout:o,positions:s},c=Dn({store:this.store,Component:Ti,componentListeners:Ei})(a);i.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{c&&c.active&&c.leave()}))})),c.once("destroy",(()=>{c.emit("room.left"),this._screenShareList.delete(c)}));try{return c.runWorker("childMemberJoinedWorker",{worker:Ni,initialState:{parentId:this.memberId}}),this._screenShareList.add(c),t&&await c.join(),c}catch(e){throw this.logger.error("ScreenShare Error",e),e}}addCamera(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,video:r})}addMicrophone(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,audio:r})}async addDevice(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!1}=e;if(!r&&!n)throw new TypeError("At least one of `audio` or `video` must be requested.");const o={...this.options,localStream:void 0,remoteStream:void 0,audio:r,video:n,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},s=Dn({store:this.store,Component:Ii,componentListeners:Ei})(o);s.once("destroy",(()=>{s.emit("room.left"),this._deviceList.delete(s)}));try{return s.runWorker("childMemberJoinedWorker",{worker:Ni,initialState:{parentId:this.memberId}}),this._deviceList.add(s),t&&await s.join(),s}catch(e){throw this.logger.error("RoomDevice Error",e),e}}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){return this.triggerCustomSaga(bi(e))}async hangup(e){return this._screenShareList.forEach((e=>{e.leave()})),this._deviceList.forEach((e=>{e.leave()})),super.hangup(e)}_finalize(){this._screenShareList.clear(),this._deviceList.clear(),super._finalize()}getLayoutList(){return this.getLayouts()}getMemberList(){return this.getMembers()}},{audioMute:zn.audioMuteMember,audioUnmute:zn.audioUnmuteMember,videoMute:zn.videoMuteMember,videoUnmute:zn.videoUnmuteMember,deaf:zn.deafMember,undeaf:zn.undeafMember,setInputVolume:zn.setInputVolumeMember,setOutputVolume:zn.setOutputVolumeMember,setMicrophoneVolume:zn.setInputVolumeMember,setSpeakerVolume:zn.setOutputVolumeMember,setInputSensitivity:zn.setInputSensitivityMember,removeMember:zn.removeMember,removeAllMembers:zn.removeAllMembers,getMembers:zn.getMembers,getLayouts:zn.getLayouts,setLayout:zn.setLayout,setPositions:zn.setPositions,setMemberPosition:zn.setMemberPosition,hideVideoMuted:zn.hideVideoMuted,showVideoMuted:zn.showVideoMuted,getRecordings:zn.getRecordings,startRecording:zn.startRecording,getPlaybacks:zn.getPlaybacks,play:zn.play,setHideVideoMuted:zn.setHideVideoMuted,getMeta:zn.getMeta,setMeta:zn.setMeta,updateMeta:zn.updateMeta,deleteMeta:zn.deleteMeta,getMemberMeta:zn.getMemberMeta,setMemberMeta:zn.setMemberMeta,updateMemberMeta:zn.updateMemberMeta,deleteMemberMeta:zn.deleteMemberMeta,promote:zn.promote,demote:zn.demote,getStreams:zn.getStreams,startStream:zn.startStream}),Wi=function*(e){Gt().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Oe(r,(e=>e.type.startsWith("video-manager.")));yield Ae(n,e)}};class Vi extends qn{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:Wi})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>Yt(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>Yt(e)))})}],[["video-manager.room.started","video-manager.room.added","video-manager.room.updated","video-manager.room.ended","video-manager.room.deleted"],{type:"roomSession",instanceFactory:e=>Yt(e),payloadTransform:e=>Yt(e)}]])}}class Ui extends Bn{_videoManager;_chat;_pubSub;get rooms(){return{makeRoomObject:e=>{const{rootElement:t,applyLocalVideoOverlay:r=!0,stopCameraWhileMuted:n=!0,stopMicrophoneWhileMuted:o=!0,...s}=e,i=[];i.push((({speakerId:e})=>function*({instance:t,runSaga:r}){if("undefined"!=typeof Audio)try{const n=new Audio;let o;t.on("track",(function(s){switch(s.track.kind){case"audio":o=r(Si,{track:s.track,element:n,speakerId:e,room:t})}})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){Gt().error("audioElementSaga",e)}else Gt().warn("`Audio` is not supported on this environment.")})({speakerId:s.speakerId})),t&&i.push(_i({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...s,store:this.store,emitter:this.emitter,customSagas:i},Dn({store:c.store,customSagas:c.customSagas,Component:Di,componentListeners:Ei})(c));var c;return o&&a.on("member.updated.audio_muted",(({member:e})=>{try{e.id===a.memberId&&"audio_muted"in e&&(e.audio_muted?a.stopOutboundAudio():a.restoreOutboundAudio())}catch(e){this.logger.error("Error handling audio_muted",e)}})),n&&a.on("member.updated.video_muted",(({member:e})=>{try{e.id===a.memberId&&"video_muted"in e&&(e.video_muted?a.stopOutboundVideo():a.restoreOutboundVideo())}catch(e){this.logger.error("Error handling video_muted",e)}})),a}}}get chat(){return this._chat||(this._chat=Uo.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=Ko.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=Dn({store:e.store,Component:Vi,componentListeners:{errors:"onError",responses:"onSuccess"}})(e);return new Proxy(t,{get:(e,t,r)=>"_eventsNamespace"===t?"":"eventChannel"===t?"video-manager.rooms":Reflect.get(e,t,r)})})(this.options)),this._videoManager}reauthenticate(e){this.store.dispatch(Ir.reauthAction({token:e}))}}function $i(e){this.message=e}($i.prototype=new Error).name="InvalidCharacterError";var Bi="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new $i("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,n,o=0,s=0,i="";n=t.charAt(s++);~n&&(r=o%4?64*r+n:n,o++%4)?i+=String.fromCharCode(255&r>>(-2*o&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return i};function qi(e){var t=e.replace(/-/g,"+").replace(/_/g,"/");switch(t.length%4){case 0:break;case 2:t+="==";break;case 3:t+="=";break;default:throw"Illegal base64url string!"}try{return function(e){return decodeURIComponent(Bi(e).replace(/(.)/g,(function(e,t){var r=t.charCodeAt(0).toString(16).toUpperCase();return r.length<2&&(r="0"+r),"%"+r})))}(t)}catch(e){return Bi(t)}}function Fi(e){this.message=e}function Hi(e,t){if("string"!=typeof e)throw new Fi("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(qi(e.split(".")[r]))}catch(e){throw new Fi("Invalid token specified: "+e.message)}}(Fi.prototype=new Error).name="InvalidTokenError";class zi extends nn{options;WebSocketConstructor=WebSocket;agent="@signalwire/js/browser/3.17.0";constructor(e){let t;try{t=Hi(e.token,{header:!0})}catch(e){}super({...e,host:t?.ch||e.host}),this.options=e}get allowHijack(){return this.options._hijack}async retrieveRelayProtocol(){if(!this.allowHijack)return"";const e=this.getRoomNameFromJWT();return e?(this.logger.info("Hijacking: search protocol for",e),window.sessionStorage.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowHijack)return;const e=this.getRoomNameFromJWT();e&&(this.logger.info("Hijacking: persist protocol",e,this.relayProtocol),window.sessionStorage.setItem(e,this.relayProtocol))}getRoomNameFromJWT(){try{return Hi(this.options.token)?.r}catch(e){return""}}}const Qi=e=>{const t={...e,emitter:new St},r=Wn({userOptions:t,SessionConstructor:zi});return Dn({store:r,Component:Ui,componentListeners:{errors:"onError",responses:"onSuccess"}})(t)},Ji=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Gi=Object.freeze({__proto__:null,ChatMember:Uo.ChatMember,ChatMessage:Uo.ChatMessage,Client:function(e){const t=Qi(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,n,o)=>n in r?r[n]:Ji.includes(n)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(n):Reflect.get(e,n,o)})}});const Ki=["getAllowedChannels","subscribe","publish"];var Xi=Object.freeze({__proto__:null,PubSubMessage:Ko.PubSubMessage,Client:function(e){const t=Qi(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,n,o)=>n in r?r[n]:Ki.includes(n)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(n):Reflect.get(e,n,o)})}});const Yi={aspectRatio:{ideal:16/9}},Zi=e=>new Promise((async(t,r)=>{const{audio:n=!0,video:o=!0,iceServers:s,rootElementId:i,applyLocalVideoOverlay:a=!0,autoJoin:c=!1,stopCameraWhileMuted:d=!0,stopMicrophoneWhileMuted:u=!0,speakerId:l,...h}=e,m=Qi({...h});if(await m.connect(),!m)return;let p;if(i){const e=document.getElementById(i);e?p=e:(p=document.body,Gt().warn(`We couldn't find an element with id: ${i}: using 'document.body' instead.`))}const g=m.rooms.makeRoomObject({audio:n,video:!0===o?Yi:o,negotiateAudio:!0,negotiateVideo:!0,iceServers:s,rootElement:p,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:u,speakerId:l});g.once("destroy",(()=>{g.emit("room.left"),m.disconnect()}));const f=()=>new Promise((async(e,t)=>{try{g.once("room.subscribed",(t=>{e(g)})),await g.join()}catch(e){Gt().error("Join",e),m.disconnect(),t(e)}})),v=new Proxy(g,{get:(e,t,r)=>"join"===t?f:Reflect.get(e,t,r)});if(c)try{await v.join(),t(v)}catch(e){r(e)}else t(v)})),ea=["audioMute","audioUnmute","deaf","getLayouts","getMembers","getRecordings","hideVideoMuted","leave","removerMember","restoreOutboundAudio","restoreOutboundVideo","setInputSensitivity","setInputVolume","setLayout","setPositions","setMemberPosition","setOutputVolume","showVideoMuted","startRecording","stopOutboundAudio","stopOutboundVideo","undeaf","videoMute","videoUnmute","setMicrophoneVolume","setSpeakerVolume","getMeta","setMeta","updateMeta","deleteMeta","getMemberMeta","setMemberMeta","updateMemberMeta","deleteMemberMeta","promote","demote"];var ta=Object.freeze({__proto__:null,RoomSession:function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s=!0,stopCameraWhileMuted:i=!0,stopMicrophoneWhileMuted:a=!0,speakerId:c,...d}=e;["audio","video"].forEach((t=>{t in e&&Gt().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const u=Qi(d),l=u.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s,stopCameraWhileMuted:i,stopMicrophoneWhileMuted:a,speakerId:c});l.once("destroy",(()=>{l.emit("room.left"),u.disconnect()}));const h={join:e=>new Promise((async(n,o)=>{try{l.attachPreConnectWorkers(),await u.connect();const s=e?.audio??t,i=e?.video??r,a=u._sessionAuthState,c=(e=>{const{authState:t,audio:r=!0,video:n=!0,sendAudio:o,sendVideo:s,receiveAudio:i,receiveVideo:a}=e;Gt().debug("getJoinMediaParams options",{...e});const{audio_allowed:c,video_allowed:d,join_as:u}=t,l="member"===(u??"member"),h=l&&"both"===c,m=l&&"both"===d,p="none"!==c,g="none"!==d,f=Boolean(o??r),v=Boolean(s??n),y=Boolean(i??r),b=Boolean(a??n);return!h&&f&&Gt().info("Not allowed to send audio on this room. Default values will be used."),!m&&v&&Gt().info("Not allowed to send video on this room. Default values will be used."),!p&&y&&Gt().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&Gt().info("Not allowed to receive video from the room. Default values will be used."),{mustSendAudio:h&&f,mustSendVideo:m&&v,mustRecvAudio:p&&y,mustRecvVideo:g&&b}})({authState:a,sendAudio:Boolean(t),sendVideo:Boolean(r),...e});if(!Object.values(c).some(Boolean))return u.disconnect(),o(new Error(`Invalid arguments to join the room. The token used has join_as: '${a.join_as}'. \n${JSON.stringify(e,null,2)}\n`));l.updateMediaOptions({audio:!!c.mustSendAudio&&(s||!0),video:!!c.mustSendVideo&&(i||!0),negotiateAudio:c.mustRecvAudio,negotiateVideo:c.mustRecvVideo}),l.once("room.subscribed",(e=>{l.attachOnSubscribedWorkers(e),n(l)})),await l.join()}catch(e){Gt().error("RoomSession Join",e),u.disconnect(),o(e)}}))};return new Proxy(l,{get(e,t,r){if(t in h)return h[t];if(!e.active&&ea.includes(t))throw new Error(`Tried to access the property/method "${t}" before the room was connected. Please call roomSession.join() first.`);return Reflect.get(e,t,r)}})},createRoomObject:Zi,joinRoom:e=>Zi({...e,autoJoin:!0}),createClient:Qi}),ra=Object.freeze({__proto__:null,getDevices:Hs,getCameraDevices:()=>Hs("camera"),getMicrophoneDevices:()=>Hs("microphone"),getSpeakerDevices:()=>Hs("speaker"),getDevicesWithPermissions:qs,getCameraDevicesWithPermissions:()=>qs("camera"),getMicrophoneDevicesWithPermissions:()=>qs("microphone"),getSpeakerDevicesWithPermissions:()=>qs("speaker"),checkPermissions:Ds,checkCameraPermissions:Ws,checkMicrophonePermissions:Vs,checkSpeakerPermissions:Us,requestPermissions:async e=>{try{const t=await $s(e);Os(t)}catch(e){throw e}},createDeviceWatcher:Ys,createCameraDeviceWatcher:()=>Ys({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>Ys({targets:["microphone"]}),createSpeakerDeviceWatcher:()=>Ys({targets:["speaker"]}),supportsMediaDevices:Cs,supportsGetUserMedia:()=>"function"==typeof Ts().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Ts().getDisplayMedia,getUserMedia:$s,getDisplayMedia:Bs,enumerateDevices:Ls,getSupportedConstraints:Is,supportsMediaOutput:Ps,setMediaElementSinkId:Rs,stopStream:Os,stopTrack:As,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(Zs(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},$s(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new St,n=new(window.AudioContext||window.webkitAudioContext),o=(e=>{const t=e.createAnalyser();return t.fftSize=64,t.minDecibels=-90,t.maxDecibels=-10,t.smoothingTimeConstant=.85,t})(n);let s,i;try{n.createMediaStreamSource(t).connect(o)}catch(e){throw new Error("No audio track found")}t.getAudioTracks().forEach((e=>{e.addEventListener("ended",(()=>{r.emit("destroyed","disconnected")}))}));const a=()=>{try{const e=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(e);const t=e.reduce(((e,t)=>e+t),0)/20;i!==t&&(i=t,r.emit("volumeChanged",Math.min(i,100))),s=requestAnimationFrame(a)}catch(e){r.emit("destroyed","error")}};s=requestAnimationFrame(a);const c=()=>{s&&cancelAnimationFrame(s),"closed"!==n.state&&n.close().catch((e=>{Gt().error("Error closing the AudioContext",e)})),Zs(e)||t.getTracks().forEach((e=>e.stop())),r.emit("destroyed",null),r.removeAllListeners()};return new Proxy(r,{get:(e,t,r)=>"destroy"===t?c:Reflect.get(e,t,r)})}});e.Chat=Gi,e.PubSub=Xi,e.Video=ta,e.WebRTC=ra,Object.defineProperty(e,"__esModule",{value:!0})}));
21
21
  //# sourceMappingURL=index.umd.js.map