@signalwire/js 3.19.1 → 3.19.2
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 +8 -1
- package/dist/index.esm.js.map +2 -2
- package/dist/index.js +8 -1
- package/dist/index.js.map +2 -2
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/RoomSession.d.ts.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/RoomSession.ts +16 -1
package/dist/index.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SignalWire JS SDK v3.19.
|
|
2
|
+
* SignalWire JS SDK v3.19.2 (https://signalwire.com)
|
|
3
3
|
* Copyright 2018-2023 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
|
-
***************************************************************************** */const Oi=e=>gr(e.type),ji=function*(e){hr().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");const i=jn.createCatchableSaga((function*(e){const{id:t,method:n,params:o={}}=e.payload,{callID:s,nodeId:i}=o,a=r.getRTCPeerById(s);if(!a)return void hr().warn(`RTCPeer '${s}' not found for method: '${n}'`,o);const c=r.peer;switch(n){case"verto.media":case"verto.answer":a.uuid===(null==c?void 0:c.uuid)&&r.setState("verto.media"===n?"early":"active"),(null==o?void 0:o.sdp)&&a.onRemoteSdp(o.sdp),yield Fe([r,r.execute],{method:r._getRPCMethod(),params:{message:Gr(t,n),node_id:i}});break;case"verto.bye":yield Fe([r,r.onVertoBye],{rtcPeerId:s,byeCause:null==o?void 0:o.cause,byeCauseCode:null==o?void 0:o.causeCode,redirectDestination:null==o?void 0:o.redirectDestination}),yield Fe([r,r.execute],{method:r._getRPCMethod(),params:{message:Gr(t,n),node_id:i}});break;case"verto.ping":{const{nodeId:e}=o,t=function(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}(o,["nodeId"]);yield Fe([r,r.execute],{method:r._getRPCMethod(),params:{message:Qr(t),node_id:e}});break}case"verto.mediaParams":{if(!s||!o.mediaParams){hr().warn("Invalid mediaParams event",o);break}const{audio:e,video:t}=o.mediaParams;a&&t&&a.applyMediaConstraints("video",t),a&&e&&a.applyMediaConstraints("audio",e);break}default:return hr().warn(`Unknown Verto method: ${n}`,o)}}),(e=>{hr().error("Verto Error",e)}));for(;;){const e=yield Ue(o,(e=>{var t;return!!Oi(e)&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===s}));yield ze(i,e)}hr().trace("vertoEventWorker ended")},Li=function*(e){hr().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 Ue(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 $e(xn.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 $e(s,{type:"video.room.joined",payload:a.payload}),hr().debug("roomSubscribedWorker ended",i)},Di=function*(e){hr().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 Ue(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));hr().debug("promoteDemoteWorker:",i.type,i.payload),yield $e(Cn.updateAuthState(i.payload.authorization));const a=yield He(Gs.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(),hr().debug("promoteDemoteWorker ended",s)},Ni=function*(e){hr().debug("sessionAuthWorker started");const{instance:t}=e;switch((yield Ue([Jr.authSuccessAction.type,Jr.authErrorAction.type])).type){case Jr.authSuccessAction.type:yield Fe([t,t.resume]);break;case Jr.authErrorAction.type:yield Fe([t,t.setState],"hangup")}hr().debug("sessionAuthWorker ended")},Wi={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},Vi=Object.assign(Object.assign({},Wi),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),Ui={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},$i={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:Wi,video:Ui,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3,maxIceGatheringTimeout:5e3,maxConnectionStateTimeout:3e3,watchMediaPackets:!0,watchMediaPacketsTimeout:2e3};class Bi extends ao{constructor(e){super(e),this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.resuming=!1,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({},$i),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(Gs.getIceServers)}get component(){return this.select((e=>po.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){if(e){if(this.logger.debug("Set RTCPeer",e.uuid,e),this.rtcPeerMap.set(e.uuid,e),this.peer&&this.callId!==e.uuid){const e=this.peer.uuid;this.logger.debug(">>> Stop old RTCPeer",e),this.hangup(e).catch(console.error),this.peer.detachAndStop()}this.logger.debug(">>> Replace RTCPeer with",e.uuid),this.activeRTCPeerId=e.uuid}else 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:this._getRPCMethod(),params:e})}_getRPCMethod(){const e=this.select(Gs.getAuthState);return e&&Dr(e)?"webrtc.verto":"video.message"}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new Ai(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 hi(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"),ni(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 - "),ni(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:ji,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:Li,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:Di,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new Ai(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 Ai(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 this._watchSessionAuth(),!this.resuming&&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}`)}}_closeWSConnection(){this._watchSessionAuth(),this.store.dispatch(Jr.sessionForceCloseAction())}_watchSessionAuth(){this.sessionAuthTask&&this.sessionAuthTask.cancel(),this.sessionAuthTask=this.runWorker("sessionAuthWorker",{worker:Ni})}async resume(){var e;if(this.logger.debug(`[resume] Call ${this.id}`),null===(e=this.peer)||void 0===e?void 0:e.instance){const{connectionState:e}=this.peer.instance;this.logger.debug(`[resume] connectionState for ${this.id} is '${e}'`),"closed"!==e&&(this.resuming=!0,this.peer.restartIce())}}async executeInvite(e,t,r){const n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription&&!this.resuming)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=zr(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,callID:t,node_id:r,subscribe:s});this.logger.debug("Invite response",i),this.resuming=!1}catch(e){throw this.setState("hangup"),e}}async executeUpdateMedia(e,t){try{const r=qr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r,callID:t});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}}async hangup(e){const t=null!=e?e:this.callId;if(!t)throw new Error("Invalid RTCPeer ID to hangup");try{const e=Hr(this.dialogParams(t));await this.vertoExecute({message:e,callID:t})}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=Kr(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));this.vertoExecute({message:r,callID:t})}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":case"destroy":this._finalize();break;case"hangup":this.setState("destroy")}}updateMediaOptions(e){this.logger.debug("updateMediaOptions",Object.assign({},e)),this.options=Object.assign(Object.assign({},this.options),e),this._checkDefaultMediaConstraints()}_mungeSDP(e){return(e=>{const t=/^a=candidate.*.local\ .*/;return e.split("\r\n").filter((e=>!t.test(e))).join("\r\n")})(e)}_checkDefaultMediaConstraints(){!0===this.options.video&&(this.options.video=Ui),!0===this.options.audio&&(this.options.audio=this.options.screenShare?Vi:Wi)}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear()}}const Fi=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{hr().error("Video Element Paused",e,t)}))})),e},zi=({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()}))})),Hi=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),qi=({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))},Ki=({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()}},Qi=({track:e,element:t})=>(t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()})),t),Gi=Jr.createAction("swJs/audioSetSpeakerAction"),Ji=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,s=Fi(),i={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(hr().debug("Set localOverlay",e),o.set(this.id,e)):(hr().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return hr().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?hr().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):hr().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return hr().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})=>{hr().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 hr().debug("Location not found"),void(a&&(hr().debug("Current layer not visible"),e.hide()));if(!a){hr().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=Hi(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=Fi();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 n&&!s?(hr().debug("Build myLayer append it"),n.appendChild(a),void(e.domElement=a)):void hr().debug("Build myLayer >> wait next")}const{top:c,left:d,width:u,height:l}=Hi(i);hr().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){hr().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:i});let c=!1,d=null;const u=e=>{r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):i.hide()};let l;r.on("layout.changed",(e=>{hr().debug("Received layout.changed - videoTrack",c),c?u(e):d=e})),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){hr().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){hr().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){hr().error("Error handling video_muted",e)}})),r.on("track",(function(r){"video"===r.track.kind&&(l=n(Zi,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:s}),c=!0,d&&u(d))})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),o.clear(),l?.cancel()}))}catch(e){hr().error("videoElementSaga",e)}};function*Xi({element:e,room:t}){const r=Jr.getCustomSagaActionType(t.__uuid,Gi);for(;;){const n=yield Ue([r]);try{if(n.type===r){const r=yield Fe(ti,e,n.payload);t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:r,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),hr().error(e)}}}function*Yi({track:e,element:t,speakerId:r,room:n}){Qi({track:e,element:t}),r&&ti(t,r).catch((()=>{})),yield ze(Xi,{element:t,room:n})}function*Zi({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){try{if(qi({element:n,track:r}),n.style.width="100%",n.style.maxHeight="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void hr().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),hr().debug("MCU readyState 1 >>",n.readyState),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(hr().debug("Wait for the MCU to be ready"),yield Fe(zi,{element:n})),hr().debug("MCU is ready..");const c=Ki({rootElement:e,video:n,paddingWrapper:s});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),i.style.display="block"}catch(e){hr().error("Handle video track error",e)}}const ea={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},ta=Cr(class extends Bi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:vo.audioMuteMember,audioUnmute:vo.audioUnmuteMember,videoMute:vo.videoMuteMember,videoUnmute:vo.videoUnmuteMember,setMicrophoneVolume:vo.setInputVolumeMember,setInputVolume:vo.setInputVolumeMember,setInputSensitivity:vo.setInputSensitivityMember}),ra=Cr(class extends Bi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:vo.audioMuteMember,audioUnmute:vo.audioUnmuteMember,videoMute:vo.videoMuteMember,videoUnmute:vo.videoUnmuteMember,setInputVolume:vo.setInputVolumeMember,setMicrophoneVolume:vo.setInputVolumeMember,setInputSensitivity:vo.setInputSensitivityMember}),na=()=>{},oa="video.memberList.updated",sa=_r({event:oa}),ia=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(er),e)),[]).join(".")})(sa),aa=["video.room.joined","video.member.joined","video.member.left","video.member.updated"],ca=e=>aa.includes(e),da=({action:e,memberList:t})=>{const r=(e=>"video.room.joined"===e.type?e.payload.room_session.members:[e.payload.member])(e);return r.forEach("video.member.left"===e.type?e=>{t.delete(e.id)}:e=>{t.set(e.id,e)}),Array.from(t.values())};function*ua({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:da({action:r,memberList:t})};yield $e(e,{type:ia,payload:n})}for(;;){const t=yield Ue(e,(({type:e})=>ca(e)));yield ze(r,t)}}const la=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(sa))))(r))return;const{cleanup:n}=((e,t)=>{const r=(e=>Or(aa).filter((t=>!e.includes(t))))(t);r.forEach((t=>{e.once(t,na)}));const n=({members:t})=>{e.emit(oa,{members:t})};return e.on(ia,n),{cleanup:()=>{e.off(ia,n)}}})(t,r);yield ze(ua,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},ha=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield ze(As.memberPositionWorker,e)},pa=function*(e){hr().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:n,onDone:o,onFail:s}=e,{swEventChannel:i}=t,{parentId:a}=n;if(!a)throw new Error("Missing parentId for childMemberJoinedWorker");const c=yield Ue(i,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===a)),{member:d}=c.payload;if(d?.parent_id){const e=yield He(po.getComponentsById);Object.values(e).find((e=>"memberId"in e&&e.memberId===d.parent_id))?(r._attachListeners(d.id),r.applyEmitterTransforms(),yield $e(xn.upsert({id:r.callId,roomId:c.payload.room_id,roomSessionId:c.payload.room_session_id,memberId:d.id})),o?.()):s?.({error:new Error("Unknown parent_id")})}hr().trace("childMemberJoinedWorker ended")},ma=Cr(class extends Bi{_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})}}}],[[Lr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[Lr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[Lr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>vo.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>br({...e.recording,room_session_id:this.roomSessionId})}],[[Lr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>vo.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>br({...e.playback,room_session_id:this.roomSessionId})}],[[Lr("video.stream.list")],{type:"roomSessionStreamList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[Lr("video.stream.start"),"video.stream.started","video.stream.ended"],{type:"roomSessionStream",instanceFactory:e=>vo.createRoomSessionStreamObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>br({...e.stream,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...As.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:la})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:ha,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){return new Promise((async(t,r)=>{const{autoJoin:n=!0,audio:o=!1,video:s=!0,layout:i,positions:a}=e,c=await pi({audio:!0===o?ea:o,video:s}),d={...this.options,screenShare:!0,recoverCall:!1,localStream:c,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId},layout:i,positions:a},u=ro({store:this.store,Component:ta})(d);c.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{u&&u.active&&u.leave()}))})),u.once("destroy",(()=>{u.emit("room.left"),this._screenShareList.delete(u)}));try{return u.runWorker("childMemberJoinedWorker",{worker:pa,onDone:()=>t(u),onFail:r,initialState:{parentId:this.memberId}}),this._screenShareList.add(u),n?await u.join():t(u)}catch(e){this.logger.error("ScreenShare Error",e),r(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={}){return new Promise((async(t,r)=>{const{autoJoin:n=!0,audio:o=!1,video:s=!1}=e;if(!o&&!s)throw new TypeError("At least one of `audio` or `video` must be requested.");const i={...this.options,localStream:void 0,remoteStream:void 0,audio:o,video:s,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},a=ro({store:this.store,Component:ra})(i);a.once("destroy",(()=>{a.emit("room.left"),this._deviceList.delete(a)}));try{return a.runWorker("childMemberJoinedWorker",{worker:pa,onDone:()=>t(a),onFail:r,initialState:{parentId:this.memberId}}),this._deviceList.add(a),n?await a.join():t(a)}catch(e){this.logger.error("RoomDevice Error",e),r(e)}}))}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){return this.triggerCustomSaga(Gi(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:vo.audioMuteMember,audioUnmute:vo.audioUnmuteMember,videoMute:vo.videoMuteMember,videoUnmute:vo.videoUnmuteMember,deaf:vo.deafMember,undeaf:vo.undeafMember,setInputVolume:vo.setInputVolumeMember,setOutputVolume:vo.setOutputVolumeMember,setMicrophoneVolume:vo.setInputVolumeMember,setSpeakerVolume:vo.setOutputVolumeMember,setInputSensitivity:vo.setInputSensitivityMember,removeMember:vo.removeMember,removeAllMembers:vo.removeAllMembers,getMembers:vo.getMembers,getLayouts:vo.getLayouts,setLayout:vo.setLayout,setPositions:vo.setPositions,setMemberPosition:vo.setMemberPosition,hideVideoMuted:vo.hideVideoMuted,showVideoMuted:vo.showVideoMuted,getRecordings:vo.getRecordings,startRecording:vo.startRecording,getPlaybacks:vo.getPlaybacks,play:vo.play,setHideVideoMuted:vo.setHideVideoMuted,getMeta:vo.getMeta,setMeta:vo.setMeta,updateMeta:vo.updateMeta,deleteMeta:vo.deleteMeta,getMemberMeta:vo.getMemberMeta,setMemberMeta:vo.setMemberMeta,updateMemberMeta:vo.updateMemberMeta,deleteMemberMeta:vo.deleteMemberMeta,promote:vo.promote,demote:vo.demote,getStreams:vo.getStreams,startStream:vo.startStream}),ga=function*(e){hr().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Ue(r,(e=>e.type.startsWith("video-manager.")));yield $e(n,e)}};class fa extends uo{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:ga})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>br(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>br(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=>br(e),payloadTransform:e=>br(e)}]])}}class va extends co{_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){"audio"===s.track.kind&&(o=r(Yi,{track:s.track,element:n,speakerId:e,room:t}))})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){hr().error("audioElementSaga",e)}else hr().warn("`Audio` is not supported on this environment.")})({speakerId:s.speakerId})),t&&i.push(Ji({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...s,store:this.store,emitter:this.emitter,customSagas:i},ro({store:c.store,customSagas:c.customSagas,Component:ma})(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=us.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=Ss.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=ro({store:e.store,Component:fa})(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(Jr.reauthAction({token:e}))}}function ya(e){this.message=e}(ya.prototype=new Error).name="InvalidCharacterError";var ba="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new ya("'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 Sa(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(ba(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 ba(t)}}function _a(e){this.message=e}function wa(e,t){if("string"!=typeof e)throw new _a("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(Sa(e.split(".")[r]))}catch(e){throw new _a("Invalid token specified: "+e.message)}}(_a.prototype=new Error).name="InvalidTokenError";const ka="callId",Ca=()=>{if(window&&window.sessionStorage)return window.sessionStorage};class Ea extends In{options;WebSocketConstructor=WebSocket;CloseEventConstructor=CloseEvent;agent="@signalwire/js/browser/3.19.1";constructor(e){let t;try{t=wa(e.token,{header:!0})}catch(e){}super({...e,host:e.host||t?.ch}),this.options=e}get allowReattach(){return!1!==this.options?.reattach}async retrieveRelayProtocol(){if(!this.allowReattach)return"";const e=this.getProtocolSessionStorageKey();return e?(this.logger.info("Hijacking: search protocol for",e),Ca()?.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowReattach)return;const e=this.getProtocolSessionStorageKey();e&&(this.logger.info("Hijacking: persist protocol",e,this.relayProtocol),Ca()?.setItem(e,this.relayProtocol))}async retrieveSwAuthorizationState(){const e=this.getAuthStateSessionStorageKey();return e?Ca()?.getItem(e)??"":""}async persistSwAuthorizationState(e){if(!this.allowReattach)return;const t=this.getAuthStateSessionStorageKey();t&&(this.logger.info("Hijacking: persist auth state",t,e),Ca()?.setItem(t,e))}_onSocketClose(e){if("unknown"===this.status){this.logger.info("Hijacking: invalid values - cleaning up storage");const e=this.getProtocolSessionStorageKey();e&&Ca()?.removeItem(e);const t=this.getAuthStateSessionStorageKey();t&&Ca()?.removeItem(t),Ca()?.removeItem(ka)}super._onSocketClose(e)}getAuthStateSessionStorageKey(){return`as-${this.getSessionStorageKey()}`}getProtocolSessionStorageKey(){return`pt-${this.getSessionStorageKey()}`}getSessionStorageKey(){try{const e=wa(this.options.token);return`${e?.r}`}catch(e){return""}}}const Ta=e=>{const t={...e,emitter:new Dt},r=no({userOptions:t,SessionConstructor:Ea});return ro({store:r,Component:va})(t)},Pa=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Ia=Object.freeze({__proto__:null,ChatMember:us.ChatMember,ChatMessage:us.ChatMessage,Client:function(e){const t=Ta(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,n,o)=>n in r?r[n]:Pa.includes(n)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(n):Reflect.get(e,n,o)})}});const Ma=["getAllowedChannels","subscribe","publish"];var Ra=Object.freeze({__proto__:null,PubSubMessage:Ss.PubSubMessage,Client:function(e){const t=Ta(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,n,o)=>n in r?r[n]:Ma.includes(n)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(n):Reflect.get(e,n,o)})}});async function xa(e,t){const r=await fetch(e,t);if(!r.ok){if(401===r.status)throw new zn(r.status,"Unauthorized");let e;try{e=await r.json()}catch(e){}const t=e?.errors?JSON.stringify(e.errors):"Not Found";throw new Hn(r.status,t,e)}try{r.parsedBody=await r.json()}catch(e){}return r}const Aa=({baseUrl:e,timeout:t=3e4,...r},n=xa)=>async(o,s)=>{const i={...s?.body?{"Content-Type":"application/json"}:{},...r.headers,...s?.headers},a=Oa({...r,...s,headers:i});let c;if(t){const e=new AbortController;a.signal=e.signal,c=setTimeout((()=>{e.abort()}),t)}try{return{body:(await n(ja({path:o,baseUrl:e,searchParams:s?.searchParams}),a)).parsedBody}}catch(e){throw e}finally{c&&clearTimeout(c)}},Oa=e=>Object.entries(e).reduce(((e,[t,r])=>{return"body"===t?{...e,body:(n=r,"string"==typeof n?n:JSON.stringify(n))}:null!=r?{...e,[t]:r}:e;var n}),{}),ja=({path:e,baseUrl:t,searchParams:r})=>{const n=new URL(e,t);return r&&Object.entries(r).forEach((([e,t])=>{null!=t&&n.searchParams.append(e,t)})),n.toString()},La={aspectRatio:{ideal:16/9}},Da=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,p=Ta({...h});if(await p.connect(),!p)return;let m;if(i){const e=document.getElementById(i);e?m=e:(m=document.body,hr().warn(`We couldn't find an element with id: ${i}: using 'document.body' instead.`))}const g=p.rooms.makeRoomObject({audio:n,video:!0===o?La:o,negotiateAudio:!0,negotiateVideo:!0,iceServers:s,rootElement:m,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:u,speakerId:l});g.once("destroy",(()=>{g.emit("room.left"),p.disconnect()}));const f=()=>new Promise((async(e,t)=>{try{g.once("room.subscribed",(t=>{e(g)})),await g.join()}catch(e){hr().error("Join",e),p.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)})),Na=["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"],Wa=function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s=!0,stopCameraWhileMuted:i=!0,stopMicrophoneWhileMuted:a=!0,speakerId:c,destinationNumber:d,...u}=e;["audio","video"].forEach((t=>{t in e&&hr().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const l=Ta(u),h=l.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s,stopCameraWhileMuted:i,stopMicrophoneWhileMuted:a,speakerId:c,destinationNumber:d}),p=!1!==e?.reattach,m={joined:({call_id:e})=>{p&&Ca()?.setItem(ka,e)},init:()=>{if(!p)return;h.on("room.subscribed",m.joined);const e=Ca()?.getItem(ka);e&&(h.options.prevCallId=e)},destroy:()=>{p&&(h.off("room.subscribed",m.joined),Ca()?.removeItem(ka))}};h.once("destroy",(()=>{h.emit("room.left"),m.destroy(),l.disconnect()})),l.once("session.disconnected",(()=>{h.destroy()}));const g={join:e=>new Promise((async(n,o)=>{try{h.attachPreConnectWorkers(),await l.connect();const s=e?.audio??t,i=e?.video??r,a=l._sessionAuthState,c=(e=>{const{authState:t,audio:r=!0,video:n=!0,sendAudio:o,sendVideo:s,receiveAudio:i,receiveVideo:a}=e;hr().debug("getJoinMediaParams options",{...e});const{audio_allowed:c,video_allowed:d,join_as:u}=t,l="member"===(u??"member"),h=l&&"both"===c,p=l&&"both"===d,m="none"!==c,g="none"!==d,f=Boolean(o??r),v=Boolean(s??n),y=Boolean(i??r),b=Boolean(a??n);return!h&&f&&hr().info("Not allowed to send audio on this room. Default values will be used."),!p&&v&&hr().info("Not allowed to send video on this room. Default values will be used."),!m&&y&&hr().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&hr().info("Not allowed to receive video from the room. Default values will be used."),{mustSendAudio:h&&f,mustSendVideo:p&&v,mustRecvAudio:m&&y,mustRecvVideo:g&&b}})({authState:a,sendAudio:Boolean(s),sendVideo:Boolean(i),...e});if(!Object.values(c).some(Boolean))return l.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`));hr().debug("Set mediaOptions",c),h.updateMediaOptions({audio:!!c.mustSendAudio&&(s||!0),video:!!c.mustSendVideo&&(i||!0),negotiateAudio:c.mustRecvAudio,negotiateVideo:c.mustRecvVideo}),h.once("room.subscribed",(e=>{h.attachOnSubscribedWorkers(e),n(h)})),m.init(),await h.join()}catch(e){hr().error("RoomSession Join",e),l.disconnect(),o(e)}}))};return new Proxy(h,{get(e,t,r){if(t in g)return g[t];if(!e.active&&Na.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)}})};var Va=Object.freeze({__proto__:null,RoomSession:Wa,createRoomObject:Da,joinRoom:e=>Da({...e,autoJoin:!0}),createClient:Ta}),Ua=Object.freeze({__proto__:null,getAddresses:async({spaceHost:e,accessToken:t})=>{const r="/addresses",n=Aa({baseUrl:`https://${e}`,headers:{Authorization:`Bearer ${t}`}}),{body:o}=await n(r),s=async e=>{const{search:t}=new URL(e),{body:o}=await n(`${r}${t}`);return i(o)},i=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?s(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?s(t):void 0}});return i(o)},Client:class{options;httpClient;constructor(e){this.options=e,this.httpClient=Aa({baseUrl:`https://${this.host}`,headers:{Authorization:`Bearer ${this.options.accessToken}`}})}get host(){return this.options.host??"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async createCall({uri:e,...t}){const{body:r}=await this.httpClient("/call",{method:"POST",body:{uri:e}});return console.log("Dial Response",r),(({strategy:e,params:t,userParams:r})=>{let n,o;if("room"!==e)throw new Error(`Unknown strategy: '${e}'`);n=new Wa({token:t.token,...r}),o=e=>new Promise(((t,r)=>(n.on("room.joined",(e=>t(e))),n.join(e).catch((e=>r(e))))));const s={start:o};return new Proxy(n,{get:(e,t,r)=>t in s?s[t]:Reflect.get(e,t,r)})})({...r,userParams:{host:this.host.includes("swire")?"relay.swire.io":void 0,...t}})}async createSATCall(e){return console.log("createSATCall to",e),new Wa({host:this.host.includes("swire")?"relay.swire.io":void 0,token:this.options.accessToken,...e})}}}),$a=Object.freeze({__proto__:null,getDevices:fi,getCameraDevices:()=>fi("camera"),getMicrophoneDevices:()=>fi("microphone"),getSpeakerDevices:()=>fi("speaker"),getDevicesWithPermissions:mi,getCameraDevicesWithPermissions:()=>mi("camera"),getMicrophoneDevicesWithPermissions:()=>mi("microphone"),getSpeakerDevicesWithPermissions:()=>mi("speaker"),checkPermissions:ci,checkCameraPermissions:di,checkMicrophonePermissions:ui,checkSpeakerPermissions:li,requestPermissions:async e=>{try{const t=await hi(e);ri(t)}catch(e){throw e}},createDeviceWatcher:ki,createCameraDeviceWatcher:()=>ki({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>ki({targets:["microphone"]}),createSpeakerDeviceWatcher:()=>ki({targets:["speaker"]}),supportsMediaDevices:Js,supportsGetUserMedia:()=>"function"==typeof Xs().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Xs().getDisplayMedia,getUserMedia:hi,getDisplayMedia:pi,enumerateDevices:ii,getSupportedConstraints:Ys,supportsMediaOutput:ei,setMediaElementSinkId:ti,stopStream:ri,stopTrack:ni,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(Ci(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},hi(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Dt,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=>{hr().error("Error closing the AudioContext",e)})),Ci(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=Ia,e.Fabric=Ua,e.PubSub=Ra,e.Video=Va,e.WebRTC=$a,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
20
|
+
***************************************************************************** */const Oi=e=>gr(e.type),ji=function*(e){hr().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");const i=jn.createCatchableSaga((function*(e){const{id:t,method:n,params:o={}}=e.payload,{callID:s,nodeId:i}=o,a=r.getRTCPeerById(s);if(!a)return void hr().warn(`RTCPeer '${s}' not found for method: '${n}'`,o);const c=r.peer;switch(n){case"verto.media":case"verto.answer":a.uuid===(null==c?void 0:c.uuid)&&r.setState("verto.media"===n?"early":"active"),(null==o?void 0:o.sdp)&&a.onRemoteSdp(o.sdp),yield Fe([r,r.execute],{method:r._getRPCMethod(),params:{message:Gr(t,n),node_id:i}});break;case"verto.bye":yield Fe([r,r.onVertoBye],{rtcPeerId:s,byeCause:null==o?void 0:o.cause,byeCauseCode:null==o?void 0:o.causeCode,redirectDestination:null==o?void 0:o.redirectDestination}),yield Fe([r,r.execute],{method:r._getRPCMethod(),params:{message:Gr(t,n),node_id:i}});break;case"verto.ping":{const{nodeId:e}=o,t=function(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}(o,["nodeId"]);yield Fe([r,r.execute],{method:r._getRPCMethod(),params:{message:Qr(t),node_id:e}});break}case"verto.mediaParams":{if(!s||!o.mediaParams){hr().warn("Invalid mediaParams event",o);break}const{audio:e,video:t}=o.mediaParams;a&&t&&a.applyMediaConstraints("video",t),a&&e&&a.applyMediaConstraints("audio",e);break}default:return hr().warn(`Unknown Verto method: ${n}`,o)}}),(e=>{hr().error("Verto Error",e)}));for(;;){const e=yield Ue(o,(e=>{var t;return!!Oi(e)&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===s}));yield ze(i,e)}hr().trace("vertoEventWorker ended")},Li=function*(e){hr().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 Ue(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 $e(xn.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 $e(s,{type:"video.room.joined",payload:a.payload}),hr().debug("roomSubscribedWorker ended",i)},Di=function*(e){hr().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 Ue(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));hr().debug("promoteDemoteWorker:",i.type,i.payload),yield $e(Cn.updateAuthState(i.payload.authorization));const a=yield He(Gs.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(),hr().debug("promoteDemoteWorker ended",s)},Ni=function*(e){hr().debug("sessionAuthWorker started");const{instance:t}=e;switch((yield Ue([Jr.authSuccessAction.type,Jr.authErrorAction.type])).type){case Jr.authSuccessAction.type:yield Fe([t,t.resume]);break;case Jr.authErrorAction.type:yield Fe([t,t.setState],"hangup")}hr().debug("sessionAuthWorker ended")},Wi={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},Vi=Object.assign(Object.assign({},Wi),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),Ui={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},$i={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:Wi,video:Ui,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3,maxIceGatheringTimeout:5e3,maxConnectionStateTimeout:3e3,watchMediaPackets:!0,watchMediaPacketsTimeout:2e3};class Bi extends ao{constructor(e){super(e),this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.resuming=!1,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({},$i),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(Gs.getIceServers)}get component(){return this.select((e=>po.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){if(e){if(this.logger.debug("Set RTCPeer",e.uuid,e),this.rtcPeerMap.set(e.uuid,e),this.peer&&this.callId!==e.uuid){const e=this.peer.uuid;this.logger.debug(">>> Stop old RTCPeer",e),this.hangup(e).catch(console.error),this.peer.detachAndStop()}this.logger.debug(">>> Replace RTCPeer with",e.uuid),this.activeRTCPeerId=e.uuid}else 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:this._getRPCMethod(),params:e})}_getRPCMethod(){const e=this.select(Gs.getAuthState);return e&&Dr(e)?"webrtc.verto":"video.message"}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new Ai(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 hi(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"),ni(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 - "),ni(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:ji,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:Li,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:Di,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new Ai(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 Ai(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 this._watchSessionAuth(),!this.resuming&&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}`)}}_closeWSConnection(){this._watchSessionAuth(),this.store.dispatch(Jr.sessionForceCloseAction())}_watchSessionAuth(){this.sessionAuthTask&&this.sessionAuthTask.cancel(),this.sessionAuthTask=this.runWorker("sessionAuthWorker",{worker:Ni})}async resume(){var e;if(this.logger.debug(`[resume] Call ${this.id}`),null===(e=this.peer)||void 0===e?void 0:e.instance){const{connectionState:e}=this.peer.instance;this.logger.debug(`[resume] connectionState for ${this.id} is '${e}'`),"closed"!==e&&(this.resuming=!0,this.peer.restartIce())}}async executeInvite(e,t,r){const n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription&&!this.resuming)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=zr(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,callID:t,node_id:r,subscribe:s});this.logger.debug("Invite response",i),this.resuming=!1}catch(e){throw this.setState("hangup"),e}}async executeUpdateMedia(e,t){try{const r=qr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r,callID:t});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}}async hangup(e){const t=null!=e?e:this.callId;if(!t)throw new Error("Invalid RTCPeer ID to hangup");try{const e=Hr(this.dialogParams(t));await this.vertoExecute({message:e,callID:t})}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=Kr(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));this.vertoExecute({message:r,callID:t})}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":case"destroy":this._finalize();break;case"hangup":this.setState("destroy")}}updateMediaOptions(e){this.logger.debug("updateMediaOptions",Object.assign({},e)),this.options=Object.assign(Object.assign({},this.options),e),this._checkDefaultMediaConstraints()}_mungeSDP(e){return(e=>{const t=/^a=candidate.*.local\ .*/;return e.split("\r\n").filter((e=>!t.test(e))).join("\r\n")})(e)}_checkDefaultMediaConstraints(){!0===this.options.video&&(this.options.video=Ui),!0===this.options.audio&&(this.options.audio=this.options.screenShare?Vi:Wi)}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear()}}const Fi=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{hr().error("Video Element Paused",e,t)}))})),e},zi=({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()}))})),Hi=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),qi=({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))},Ki=({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()}},Qi=({track:e,element:t})=>(t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()})),t),Gi=Jr.createAction("swJs/audioSetSpeakerAction"),Ji=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,s=Fi(),i={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(hr().debug("Set localOverlay",e),o.set(this.id,e)):(hr().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return hr().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?hr().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):hr().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return hr().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})=>{hr().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 hr().debug("Location not found"),void(a&&(hr().debug("Current layer not visible"),e.hide()));if(!a){hr().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=Hi(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=Fi();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 n&&!s?(hr().debug("Build myLayer append it"),n.appendChild(a),void(e.domElement=a)):void hr().debug("Build myLayer >> wait next")}const{top:c,left:d,width:u,height:l}=Hi(i);hr().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){hr().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:i});let c=!1,d=null;const u=e=>{r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):i.hide()};let l;r.on("layout.changed",(e=>{hr().debug("Received layout.changed - videoTrack",c),c?u(e):d=e})),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){hr().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){hr().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){hr().error("Error handling video_muted",e)}})),r.on("track",(function(r){"video"===r.track.kind&&(l=n(Zi,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:s}),c=!0,d&&u(d))})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),o.clear(),l?.cancel()}))}catch(e){hr().error("videoElementSaga",e)}};function*Xi({element:e,room:t}){const r=Jr.getCustomSagaActionType(t.__uuid,Gi);for(;;){const n=yield Ue([r]);try{if(n.type===r){const r=yield Fe(ti,e,n.payload);t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:r,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),hr().error(e)}}}function*Yi({track:e,element:t,speakerId:r,room:n}){Qi({track:e,element:t}),r&&ti(t,r).catch((()=>{})),yield ze(Xi,{element:t,room:n})}function*Zi({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){try{if(qi({element:n,track:r}),n.style.width="100%",n.style.maxHeight="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void hr().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),hr().debug("MCU readyState 1 >>",n.readyState),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(hr().debug("Wait for the MCU to be ready"),yield Fe(zi,{element:n})),hr().debug("MCU is ready..");const c=Ki({rootElement:e,video:n,paddingWrapper:s});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),i.style.display="block"}catch(e){hr().error("Handle video track error",e)}}const ea={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},ta=Cr(class extends Bi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:vo.audioMuteMember,audioUnmute:vo.audioUnmuteMember,videoMute:vo.videoMuteMember,videoUnmute:vo.videoUnmuteMember,setMicrophoneVolume:vo.setInputVolumeMember,setInputVolume:vo.setInputVolumeMember,setInputSensitivity:vo.setInputSensitivityMember}),ra=Cr(class extends Bi{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:vo.audioMuteMember,audioUnmute:vo.audioUnmuteMember,videoMute:vo.videoMuteMember,videoUnmute:vo.videoUnmuteMember,setInputVolume:vo.setInputVolumeMember,setMicrophoneVolume:vo.setInputVolumeMember,setInputSensitivity:vo.setInputSensitivityMember}),na=()=>{},oa="video.memberList.updated",sa=_r({event:oa}),ia=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(er),e)),[]).join(".")})(sa),aa=["video.room.joined","video.member.joined","video.member.left","video.member.updated"],ca=e=>aa.includes(e),da=({action:e,memberList:t})=>{const r=(e=>"video.room.joined"===e.type?e.payload.room_session.members:[e.payload.member])(e);return r.forEach("video.member.left"===e.type?e=>{t.delete(e.id)}:e=>{t.set(e.id,e)}),Array.from(t.values())};function*ua({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:da({action:r,memberList:t})};yield $e(e,{type:ia,payload:n})}for(;;){const t=yield Ue(e,(({type:e})=>ca(e)));yield ze(r,t)}}const la=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(sa))))(r))return;const{cleanup:n}=((e,t)=>{const r=(e=>Or(aa).filter((t=>!e.includes(t))))(t);r.forEach((t=>{e.once(t,na)}));const n=({members:t})=>{e.emit(oa,{members:t})};return e.on(ia,n),{cleanup:()=>{e.off(ia,n)}}})(t,r);yield ze(ua,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},ha=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield ze(As.memberPositionWorker,e)},pa=function*(e){hr().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:n,onDone:o,onFail:s}=e,{swEventChannel:i}=t,{parentId:a}=n;if(!a)throw new Error("Missing parentId for childMemberJoinedWorker");const c=yield Ue(i,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===a)),{member:d}=c.payload;if(d?.parent_id){const e=yield He(po.getComponentsById);Object.values(e).find((e=>"memberId"in e&&e.memberId===d.parent_id))?(r._attachListeners(d.id),r.applyEmitterTransforms(),yield $e(xn.upsert({id:r.callId,roomId:c.payload.room_id,roomSessionId:c.payload.room_session_id,memberId:d.id})),o?.()):s?.({error:new Error("Unknown parent_id")})}hr().trace("childMemberJoinedWorker ended")},ma=Cr(class extends Bi{_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})}}}],[[Lr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[Lr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[Lr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>vo.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>br({...e.recording,room_session_id:this.roomSessionId})}],[[Lr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>vo.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>br({...e.playback,room_session_id:this.roomSessionId})}],[[Lr("video.stream.list")],{type:"roomSessionStreamList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[Lr("video.stream.start"),"video.stream.started","video.stream.ended"],{type:"roomSessionStream",instanceFactory:e=>vo.createRoomSessionStreamObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>br({...e.stream,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...As.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:la})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:ha,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){return new Promise((async(t,r)=>{const{autoJoin:n=!0,audio:o=!1,video:s=!0,layout:i,positions:a}=e,c=await pi({audio:!0===o?ea:o,video:s}),d={...this.options,screenShare:!0,recoverCall:!1,localStream:c,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId},layout:i,positions:a},u=ro({store:this.store,Component:ta})(d);c.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{u&&u.active&&u.leave()}))})),u.once("destroy",(()=>{u.emit("room.left"),this._screenShareList.delete(u)}));try{return u.runWorker("childMemberJoinedWorker",{worker:pa,onDone:()=>t(u),onFail:r,initialState:{parentId:this.memberId}}),this._screenShareList.add(u),n?await u.join():t(u)}catch(e){this.logger.error("ScreenShare Error",e),r(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={}){return new Promise((async(t,r)=>{const{autoJoin:n=!0,audio:o=!1,video:s=!1}=e;if(!o&&!s)throw new TypeError("At least one of `audio` or `video` must be requested.");const i={...this.options,localStream:void 0,remoteStream:void 0,audio:o,video:s,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},a=ro({store:this.store,Component:ra})(i);a.once("destroy",(()=>{a.emit("room.left"),this._deviceList.delete(a)}));try{return a.runWorker("childMemberJoinedWorker",{worker:pa,onDone:()=>t(a),onFail:r,initialState:{parentId:this.memberId}}),this._deviceList.add(a),n?await a.join():t(a)}catch(e){this.logger.error("RoomDevice Error",e),r(e)}}))}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){return this.triggerCustomSaga(Gi(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:vo.audioMuteMember,audioUnmute:vo.audioUnmuteMember,videoMute:vo.videoMuteMember,videoUnmute:vo.videoUnmuteMember,deaf:vo.deafMember,undeaf:vo.undeafMember,setInputVolume:vo.setInputVolumeMember,setOutputVolume:vo.setOutputVolumeMember,setMicrophoneVolume:vo.setInputVolumeMember,setSpeakerVolume:vo.setOutputVolumeMember,setInputSensitivity:vo.setInputSensitivityMember,removeMember:vo.removeMember,removeAllMembers:vo.removeAllMembers,getMembers:vo.getMembers,getLayouts:vo.getLayouts,setLayout:vo.setLayout,setPositions:vo.setPositions,setMemberPosition:vo.setMemberPosition,hideVideoMuted:vo.hideVideoMuted,showVideoMuted:vo.showVideoMuted,getRecordings:vo.getRecordings,startRecording:vo.startRecording,getPlaybacks:vo.getPlaybacks,play:vo.play,setHideVideoMuted:vo.setHideVideoMuted,getMeta:vo.getMeta,setMeta:vo.setMeta,updateMeta:vo.updateMeta,deleteMeta:vo.deleteMeta,getMemberMeta:vo.getMemberMeta,setMemberMeta:vo.setMemberMeta,updateMemberMeta:vo.updateMemberMeta,deleteMemberMeta:vo.deleteMemberMeta,promote:vo.promote,demote:vo.demote,getStreams:vo.getStreams,startStream:vo.startStream}),ga=function*(e){hr().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Ue(r,(e=>e.type.startsWith("video-manager.")));yield $e(n,e)}};class fa extends uo{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:ga})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>br(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>br(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=>br(e),payloadTransform:e=>br(e)}]])}}class va extends co{_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){"audio"===s.track.kind&&(o=r(Yi,{track:s.track,element:n,speakerId:e,room:t}))})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){hr().error("audioElementSaga",e)}else hr().warn("`Audio` is not supported on this environment.")})({speakerId:s.speakerId})),t&&i.push(Ji({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...s,store:this.store,emitter:this.emitter,customSagas:i},ro({store:c.store,customSagas:c.customSagas,Component:ma})(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=us.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=Ss.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=ro({store:e.store,Component:fa})(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(Jr.reauthAction({token:e}))}}function ya(e){this.message=e}(ya.prototype=new Error).name="InvalidCharacterError";var ba="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new ya("'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 Sa(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(ba(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 ba(t)}}function _a(e){this.message=e}function wa(e,t){if("string"!=typeof e)throw new _a("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(Sa(e.split(".")[r]))}catch(e){throw new _a("Invalid token specified: "+e.message)}}(_a.prototype=new Error).name="InvalidTokenError";const ka="callId",Ca=()=>{if(window&&window.sessionStorage)return window.sessionStorage};class Ea extends In{options;WebSocketConstructor=WebSocket;CloseEventConstructor=CloseEvent;agent="@signalwire/js/browser/3.19.2";constructor(e){let t;try{t=wa(e.token,{header:!0})}catch(e){}super({...e,host:e.host||t?.ch}),this.options=e}get allowReattach(){return!1!==this.options?.reattach}async retrieveRelayProtocol(){if(!this.allowReattach)return"";const e=this.getProtocolSessionStorageKey();return e?(this.logger.info("Hijacking: search protocol for",e),Ca()?.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowReattach)return;const e=this.getProtocolSessionStorageKey();e&&(this.logger.info("Hijacking: persist protocol",e,this.relayProtocol),Ca()?.setItem(e,this.relayProtocol))}async retrieveSwAuthorizationState(){const e=this.getAuthStateSessionStorageKey();return e?Ca()?.getItem(e)??"":""}async persistSwAuthorizationState(e){if(!this.allowReattach)return;const t=this.getAuthStateSessionStorageKey();t&&(this.logger.info("Hijacking: persist auth state",t,e),Ca()?.setItem(t,e))}_onSocketClose(e){if("unknown"===this.status){this.logger.info("Hijacking: invalid values - cleaning up storage");const e=this.getProtocolSessionStorageKey();e&&Ca()?.removeItem(e);const t=this.getAuthStateSessionStorageKey();t&&Ca()?.removeItem(t),Ca()?.removeItem(ka)}super._onSocketClose(e)}getAuthStateSessionStorageKey(){return`as-${this.getSessionStorageKey()}`}getProtocolSessionStorageKey(){return`pt-${this.getSessionStorageKey()}`}getSessionStorageKey(){try{const e=wa(this.options.token);return`${e?.r}`}catch(e){return""}}}const Ta=e=>{const t={...e,emitter:new Dt},r=no({userOptions:t,SessionConstructor:Ea});return ro({store:r,Component:va})(t)},Pa=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Ia=Object.freeze({__proto__:null,ChatMember:us.ChatMember,ChatMessage:us.ChatMessage,Client:function(e){const t=Ta(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,n,o)=>n in r?r[n]:Pa.includes(n)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(n):Reflect.get(e,n,o)})}});const Ma=["getAllowedChannels","subscribe","publish"];var Ra=Object.freeze({__proto__:null,PubSubMessage:Ss.PubSubMessage,Client:function(e){const t=Ta(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,n,o)=>n in r?r[n]:Ma.includes(n)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(n):Reflect.get(e,n,o)})}});async function xa(e,t){const r=await fetch(e,t);if(!r.ok){if(401===r.status)throw new zn(r.status,"Unauthorized");let e;try{e=await r.json()}catch(e){}const t=e?.errors?JSON.stringify(e.errors):"Not Found";throw new Hn(r.status,t,e)}try{r.parsedBody=await r.json()}catch(e){}return r}const Aa=({baseUrl:e,timeout:t=3e4,...r},n=xa)=>async(o,s)=>{const i={...s?.body?{"Content-Type":"application/json"}:{},...r.headers,...s?.headers},a=Oa({...r,...s,headers:i});let c;if(t){const e=new AbortController;a.signal=e.signal,c=setTimeout((()=>{e.abort()}),t)}try{return{body:(await n(ja({path:o,baseUrl:e,searchParams:s?.searchParams}),a)).parsedBody}}catch(e){throw e}finally{c&&clearTimeout(c)}},Oa=e=>Object.entries(e).reduce(((e,[t,r])=>{return"body"===t?{...e,body:(n=r,"string"==typeof n?n:JSON.stringify(n))}:null!=r?{...e,[t]:r}:e;var n}),{}),ja=({path:e,baseUrl:t,searchParams:r})=>{const n=new URL(e,t);return r&&Object.entries(r).forEach((([e,t])=>{null!=t&&n.searchParams.append(e,t)})),n.toString()},La={aspectRatio:{ideal:16/9}},Da=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,p=Ta({...h});if(await p.connect(),!p)return;let m;if(i){const e=document.getElementById(i);e?m=e:(m=document.body,hr().warn(`We couldn't find an element with id: ${i}: using 'document.body' instead.`))}const g=p.rooms.makeRoomObject({audio:n,video:!0===o?La:o,negotiateAudio:!0,negotiateVideo:!0,iceServers:s,rootElement:m,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:u,speakerId:l});g.once("destroy",(()=>{g.emit("room.left"),p.disconnect()}));const f=()=>new Promise((async(e,t)=>{try{g.once("room.subscribed",(t=>{e(g)})),await g.join()}catch(e){hr().error("Join",e),p.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)})),Na=["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"],Wa=["member.joined","layout.changed"],Va=()=>{},Ua=function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s=!0,stopCameraWhileMuted:i=!0,stopMicrophoneWhileMuted:a=!0,speakerId:c,destinationNumber:d,...u}=e;["audio","video"].forEach((t=>{t in e&&hr().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const l=Ta(u),h=l.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:s,stopCameraWhileMuted:i,stopMicrophoneWhileMuted:a,speakerId:c,destinationNumber:d}),p=!1!==e?.reattach,m={joined:({call_id:e})=>{p&&Ca()?.setItem(ka,e)},init:()=>{if(!p)return;h.on("room.subscribed",m.joined);const e=Ca()?.getItem(ka);e&&(h.options.prevCallId=e)},destroy:()=>{p&&(h.off("room.subscribed",m.joined),Ca()?.removeItem(ka))}};h.once("destroy",(()=>{h.emit("room.left"),m.destroy(),l.disconnect()})),l.once("session.disconnected",(()=>{h.destroy()}));const g={join:e=>new Promise((async(n,o)=>{try{h.attachPreConnectWorkers(),await l.connect();const s=e?.audio??t,i=e?.video??r,a=l._sessionAuthState,c=(e=>{const{authState:t,audio:r=!0,video:n=!0,sendAudio:o,sendVideo:s,receiveAudio:i,receiveVideo:a}=e;hr().debug("getJoinMediaParams options",{...e});const{audio_allowed:c,video_allowed:d,join_as:u}=t,l="member"===(u??"member"),h=l&&"both"===c,p=l&&"both"===d,m="none"!==c,g="none"!==d,f=Boolean(o??r),v=Boolean(s??n),y=Boolean(i??r),b=Boolean(a??n);return!h&&f&&hr().info("Not allowed to send audio on this room. Default values will be used."),!p&&v&&hr().info("Not allowed to send video on this room. Default values will be used."),!m&&y&&hr().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&hr().info("Not allowed to receive video from the room. Default values will be used."),{mustSendAudio:h&&f,mustSendVideo:p&&v,mustRecvAudio:m&&y,mustRecvVideo:g&&b}})({authState:a,sendAudio:Boolean(s),sendVideo:Boolean(i),...e});if(!Object.values(c).some(Boolean))return l.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`));hr().debug("Set mediaOptions",c),h.updateMediaOptions({audio:!!c.mustSendAudio&&(s||!0),video:!!c.mustSendVideo&&(i||!0),negotiateAudio:c.mustRecvAudio,negotiateVideo:c.mustRecvVideo}),h.once("room.subscribed",(e=>{h.attachOnSubscribedWorkers(e),n(h)})),m.init(),Wa.forEach((e=>h.once(e,Va))),await h.join()}catch(e){hr().error("RoomSession Join",e),l.disconnect(),o(e)}}))};return new Proxy(h,{get(e,t,r){if(t in g)return g[t];if(!e.active&&Na.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)}})};var $a=Object.freeze({__proto__:null,RoomSession:Ua,createRoomObject:Da,joinRoom:e=>Da({...e,autoJoin:!0}),createClient:Ta}),Ba=Object.freeze({__proto__:null,getAddresses:async({spaceHost:e,accessToken:t})=>{const r="/addresses",n=Aa({baseUrl:`https://${e}`,headers:{Authorization:`Bearer ${t}`}}),{body:o}=await n(r),s=async e=>{const{search:t}=new URL(e),{body:o}=await n(`${r}${t}`);return i(o)},i=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?s(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?s(t):void 0}});return i(o)},Client:class{options;httpClient;constructor(e){this.options=e,this.httpClient=Aa({baseUrl:`https://${this.host}`,headers:{Authorization:`Bearer ${this.options.accessToken}`}})}get host(){return this.options.host??"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async createCall({uri:e,...t}){const{body:r}=await this.httpClient("/call",{method:"POST",body:{uri:e}});return console.log("Dial Response",r),(({strategy:e,params:t,userParams:r})=>{let n,o;if("room"!==e)throw new Error(`Unknown strategy: '${e}'`);n=new Ua({token:t.token,...r}),o=e=>new Promise(((t,r)=>(n.on("room.joined",(e=>t(e))),n.join(e).catch((e=>r(e))))));const s={start:o};return new Proxy(n,{get:(e,t,r)=>t in s?s[t]:Reflect.get(e,t,r)})})({...r,userParams:{host:this.host.includes("swire")?"relay.swire.io":void 0,...t}})}async createSATCall(e){return console.log("createSATCall to",e),new Ua({host:this.host.includes("swire")?"relay.swire.io":void 0,token:this.options.accessToken,...e})}}}),Fa=Object.freeze({__proto__:null,getDevices:fi,getCameraDevices:()=>fi("camera"),getMicrophoneDevices:()=>fi("microphone"),getSpeakerDevices:()=>fi("speaker"),getDevicesWithPermissions:mi,getCameraDevicesWithPermissions:()=>mi("camera"),getMicrophoneDevicesWithPermissions:()=>mi("microphone"),getSpeakerDevicesWithPermissions:()=>mi("speaker"),checkPermissions:ci,checkCameraPermissions:di,checkMicrophonePermissions:ui,checkSpeakerPermissions:li,requestPermissions:async e=>{try{const t=await hi(e);ri(t)}catch(e){throw e}},createDeviceWatcher:ki,createCameraDeviceWatcher:()=>ki({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>ki({targets:["microphone"]}),createSpeakerDeviceWatcher:()=>ki({targets:["speaker"]}),supportsMediaDevices:Js,supportsGetUserMedia:()=>"function"==typeof Xs().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Xs().getDisplayMedia,getUserMedia:hi,getDisplayMedia:pi,enumerateDevices:ii,getSupportedConstraints:Ys,supportsMediaOutput:ei,setMediaElementSinkId:ti,stopStream:ri,stopTrack:ni,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(Ci(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},hi(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Dt,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=>{hr().error("Error closing the AudioContext",e)})),Ci(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=Ia,e.Fabric=Ba,e.PubSub=Ra,e.Video=$a,e.WebRTC=Fa,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
21
21
|
//# sourceMappingURL=index.umd.js.map
|