@signalwire/js 3.25.0 → 3.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +8 -10
- package/dist/index.esm.js.map +3 -3
- package/dist/index.js +10 -12
- package/dist/index.js.map +3 -3
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/chat/index.d.ts +4 -6
- package/dist/js/src/chat/index.d.ts.map +1 -1
- package/dist/js/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/chat/index.ts +29 -10
package/dist/index.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SignalWire JS SDK v3.25.
|
|
2
|
+
* SignalWire JS SDK v3.25.1 (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 As=e=>pr(e.type),js=function*(e){lr().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:o}=e,{swEventChannel:n}=t,{rtcPeerId:i}=o;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const s=Co.createCatchableSaga((function*(e){var t,o;const{id:n,method:s,params:a={}}=e.payload,{callID:c,nodeId:d}=a,l=r.getRTCPeerById(c);if(!l)return void lr().warn(`RTCPeer '${c}' not found for method: '${s}'`,a);const u=r.peer;switch(s){case"verto.media":case"verto.answer":l.uuid===(null==u?void 0:u.uuid)&&r.setState("verto.media"===s?"early":"active"),(null==a?void 0:a.sdp)&&l.onRemoteSdp(a.sdp),yield $e(wo.upsert({id:null===(t=e.payload.params)||void 0===t?void 0:t.callID,nodeId:null===(o=e.payload.params)||void 0===o?void 0:o.nodeId})),yield ze([r,r.execute],{method:r._getRPCMethod(),params:{message:zr(n,s),node_id:d}});break;case"verto.bye":yield ze([r,r.onVertoBye],{rtcPeerId:c,byeCause:null==a?void 0:a.cause,byeCauseCode:null==a?void 0:a.causeCode,redirectDestination:null==a?void 0:a.redirectDestination}),yield ze([r,r.execute],{method:r._getRPCMethod(),params:{message:zr(n,s),node_id:d}});break;case"verto.ping":{const{nodeId:e}=a,t=function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r}(a,["nodeId"]);yield ze([r,r.execute],{method:r._getRPCMethod(),params:{message:Br(t),node_id:e}});break}case"verto.mediaParams":{if(!c||!a.mediaParams){lr().warn("Invalid mediaParams event",a);break}const{audio:e,video:t}=a.mediaParams;l&&t&&l.applyMediaConstraints("video",t),l&&e&&l.applyMediaConstraints("audio",e);break}case"verto.display":r.setActiveRTCPeer(i),r.emit("verto.display",e.payload.params);break;default:return lr().warn(`Unknown Verto method: ${s}`,a)}}),(e=>{lr().error("Verto Error",e)}));for(;;){const e=yield Ue(n,(e=>{var t;return!!As(e)&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===i}));yield Fe(s,e)}lr().trace("vertoEventWorker ended")},Ls=function*(e){lr().debug("roomSubscribedWorker started");const{channels:t,instance:r,initialState:o}=e,{swEventChannel:n}=t,{rtcPeerId:i}=o;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const s=yield Ue(n,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===i)),a=JSON.parse(JSON.stringify(s.payload));r.setActiveRTCPeer(i),yield $e(wo.upsert({id:s.payload.call_id,roomId:s.payload.room_session.room_id,roomSessionId:s.payload.room_session.id,memberId:s.payload.member_id,previewUrl:s.payload.room_session.preview_url})),r.emit("room.joined",Ds.call(r,a)),lr().debug("roomSubscribedWorker ended",i)};function Ds(e){return["room_session","room"].forEach((t=>{e[t].recordings&&(e[t].recordings=(e[t].recordings||[]).map((t=>{let r=this.instanceMap.get(t.id);return r?r.setPayload({room_id:e.room.room_id,room_session_id:e.room_session.id,recording:t}):r=sn.createRoomSessionRecordingObject({store:this.store,payload:{room_id:e.room.room_id,room_session_id:e.room_session.id,recording:t}}),this.instanceMap.set(t.id,r),r}))),e[t].playbacks&&(e[t].playbacks=(e[t].playbacks||[]).map((t=>{let r=this.instanceMap.get(t.id);return r?r.setPayload({room_id:e.room.room_id,room_session_id:e.room_session.id,playback:t}):r=sn.createRoomSessionPlaybackObject({store:this.store,payload:{room_id:e.room.room_id,room_session_id:e.room_session.id,playback:t}}),this.instanceMap.set(t.id,r),r}))),e[t].streams&&(e[t].streams=(e[t].streams||[]).map((t=>{let r=this.instanceMap.get(t.id);return r?r.setPayload({room_id:e.room.room_id,room_session_id:e.room_session.id,stream:t}):r=sn.createRoomSessionStreamObject({store:this.store,payload:{room_id:e.room.room_id,room_session_id:e.room_session.id,stream:t}}),this.instanceMap.set(t.id,r),r})))})),e}const Ws=function*(e){lr().debug("promoteDemoteWorker started");const{channels:t,instance:r,initialState:o}=e,{swEventChannel:n}=t,{rtcPeerId:i}=o;if(!i)throw new Error("Missing rtcPeerId for promoteDemoteWorker");const s=yield Ue(n,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));lr().debug("promoteDemoteWorker:",s.type,s.payload),yield $e(mo.updateAuthState(s.payload.authorization));const a=yield qe(Bi.getAuthState);if(!a)throw new Error(`Invalid authState for '${s.type}'`);const{audio_allowed:c,video_allowed:d}=a;switch(s.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(),lr().debug("promoteDemoteWorker ended",i)},Ns=function*(e){lr().debug("sessionAuthWorker started");const{instance:t}=e;switch((yield Ue([Fr.authSuccessAction.type,Fr.authErrorAction.type])).type){case Fr.authSuccessAction.type:yield ze([t,t.resume]);break;case Fr.authErrorAction.type:yield ze([t,t.setState],"hangup")}lr().debug("sessionAuthWorker ended")},Vs={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},Us=Object.assign(Object.assign({},Vs),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),$s={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},Bs={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:Vs,video:$s,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3,maxIceGatheringTimeout:5e3,maxConnectionStateTimeout:3e3,watchMediaPackets:!0,watchMediaPacketsTimeout:2e3};class zs extends Qo{constructor(e){super(e),this.leaveReason=void 0,this.gotEarly=!1,this.doReinvite=!1,this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.resuming=!1,this.onVertoBye=e=>{this.logger.debug("onVertoBye",e);const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:o="16",redirectDestination:n}=e;this.cause=String(r),this.causeCode=String(o);const i=this.getRTCPeerById(t);return i?n&&i.localSdp?(this.logger.debug("Redirect Destination to:",n,"for RTCPeer:",i.uuid),void this.executeInvite(i.localSdp,i.uuid,n)):(i.onRemoteBye({code:this.causeCode,message:this.cause}),void(this.activeRTCPeerId===(null==i?void 0:i.uuid)&&(this.logger.debug("onVertoBye go hangup"),this.setState("hangup")))):this.logger.warn("Invalid RTCPeer to hangup",e)},this.options=Object.assign(Object.assign({},Bs),e),this._checkDefaultMediaConstraints(),this.setState("new"),this.logger.trace("New Call with Options:",this.options),this._initPeer()}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 nodeId(){return this.component.nodeId||this.options.nodeId}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(Bi.getIceServers)}get component(){return this.select((e=>tn.getComponent(e,this.callId)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:o,callerNumber:n,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:l=!0}=this.options;return{dialogParams:{id:e,destinationNumber:t,attach:r,callerName:o,callerNumber:n,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:l,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.peer.instance&&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)}setLocalStream(e){return new Promise((async(t,r)=>{try{if(!this.peer||!this.localStream)return r(new Error("Invalid RTCPeerConnection."));if(!Qi(e))return r(new Error("Invalid stream provided."));const o=this.localStream.getAudioTracks(),n=e.getAudioTracks();n.length<=0?this.logger.info("No audio track found in the stream provided. Audio will be unaffected."):(o.forEach((e=>{var t;es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e)})),n.forEach((e=>{var t;null===(t=this.localStream)||void 0===t||t.addTrack(e)})));const i=this.localStream.getVideoTracks(),s=e.getVideoTracks();s.length<=0?this.logger.info("No video track found in the stream provided. Video will be unaffected."):(i.forEach((e=>{var t;es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e)})),s.forEach((e=>{var t;null===(t=this.localStream)||void 0===t||t.addTrack(e)}))),await this.updateStream(this.localStream),this.logger.debug("setLocalStream done"),t(this.localStream)}catch(e){this.logger.error("setLocalStream",e),r(e)}}))}vertoExecute(e){return this.execute({method:this._getRPCMethod(),params:e})}_getRPCMethod(){const e=this.select(Bi.getAuthState);return e&&Tr(e)?"webrtc.verto":"video.message"}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=this._buildPeer("offer");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,o)=>{var n,i,s;try{if(!this.peer)return o(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return o(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return this.logger.debug("Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped"),r();let i,s={};null===(n=this.localStream)||void 0===n||n.getTracks().forEach((t=>{var r;s[t.kind]=t.getConstraints(),void 0!==e[t.kind]&&(this.logger.debug("updateConstraints stop old tracks first?"),this.logger.debug("Track readyState:",t.kind,t.readyState),es(t),t.stop(),null===(r=this.localStream)||void 0===r||r.removeTrack(t))}));try{this.logger.info("updateConstraints with",e),i=await ds(e)}catch(e){return this.logger.error("Error updating device constraints:",e.name,e.message,e),this.logger.info("Restoring previous constraints",s),await this.updateConstraints(s,{attempt:t+1}),o(e)}await this.updateStream(i),this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),o(e)}finally{null===(i=this.peer)||void 0===i||i._attachAudioTrackListener(),null===(s=this.peer)||void 0===s||s._attachVideoTrackListener()}}))}async updateStream(e){if(!this.peer)throw new Error("Invalid RTCPeerConnection.");const t=this.localVideoTrack,r=this.localAudioTrack;this.peer._detachAudioTrackListener(),this.peer._detachVideoTrackListener(),this.logger.debug("updateStream got stream",e),this.localStream||(this.localStream=new MediaStream);const{instance:o}=this.peer,n=e.getTracks();this.logger.debug(`updateStream got ${n.length} tracks`);for(let e=0;e<n.length;e++){const i=n[e];this.logger.debug("updateStream apply track: ",i);const s=o.getTransceivers().find((({mid:e,sender:t,receiver:r})=>t.track&&t.track.kind===i.kind?(this.logger.debug("Found transceiver by sender"),!0):r.track&&r.track.kind===i.kind?(this.logger.debug("Found transceiver by receiver"),!0):null===e&&(this.logger.debug("Found disassociated transceiver"),!0)));s&&s.sender?(this.logger.debug("updateStream got transceiver",s.currentDirection,s.mid),await s.sender.replaceTrack(i),this.logger.debug("updateStream replaceTrack"),s.direction="sendrecv",this.logger.debug("updateStream set to sendrecv"),this.localStream.getTracks().forEach((e=>{var t;e.kind===i.kind&&e.id!==i.id&&(this.logger.debug("updateStream stop old track and apply new one - "),es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e))})),this.localStream.addTrack(i)):(this.logger.debug("updateStream no transceiver found. addTrack and start dancing!"),this.peer.type="offer",this.doReinvite=!0,this.localStream.addTrack(i),o.addTrack(i,this.localStream)),this.logger.debug("updateStream simply update mic/cam"),"audio"===i.kind?(this.emit("microphone.updated",{previous:{deviceId:null==r?void 0:r.id,label:null==r?void 0:r.label},current:{deviceId:null==i?void 0:i.id,label:null==i?void 0:i.label}}),this.options.micId=i.getSettings().deviceId):"video"===i.kind&&(this.emit("camera.updated",{previous:{deviceId:null==t?void 0:t.id,label:null==t?void 0:t.label},current:{deviceId:null==i?void 0:i.id,label:null==i?void 0:i.label}}),this.options.camId=i.getSettings().deviceId)}this.logger.debug("updateStream done")}runRTCPeerWorkers(e){this.runWorker("vertoEventWorker",{worker:js,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:Ls,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:Ws,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=this._buildPeer("offer");try{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||(this.peer=this._buildPeer("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,o=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",o),t){case"offer":return this._watchSessionAuth(),!this.resuming&&e.instance.remoteDescription?this.executeUpdateMedia(o,e.uuid):this.executeInvite(o,e.uuid);case"answer":return this.executeAnswer(o,e.uuid);default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}_closeWSConnection(){this._watchSessionAuth(),this.store.dispatch(Fr.sessionForceCloseAction())}_watchSessionAuth(){this.sessionAuthTask&&this.sessionAuthTask.cancel(),this.sessionAuthTask=this.runWorker("sessionAuthWorker",{worker:Ns})}async resume(){var e;if(this.logger.warn(`[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 o=this.getRTCPeerById(t);if(!o||o.instance.remoteDescription&&!this.resuming)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const o=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},n=Dr(Object.assign(Object.assign(Object.assign({},this.dialogParams(t)),o),{sdp:e}));let i=[];i=this.options.screenShare?["video.room.screenshare"]:this.options.additionalDevice?["video.room.additionaldevice"]:this.getSubscriptions();const s=await this.vertoExecute({message:n,callID:t,node_id:null!=r?r:this.options.nodeId,subscribe:i});this.logger.debug("Invite response",s),this.resuming=!1}catch(e){throw this.setState("hangup"),e}}async executeAnswer(e,t,r){"new"===this.state&&this.setState("answering");try{const o=Ur(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e})),n=await this.vertoExecute({message:o,callID:t,node_id:null!=r?r:this.options.nodeId,subscribe:this.getSubscriptions()});this.logger.debug("Answer response",n),this.resuming=!1,this.setActiveRTCPeer(t)}catch(e){throw this.setState("hangup"),e}}async executeUpdateMedia(e,t){try{const r=Nr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),o=await this.vertoExecute({message:r,callID:t,node_id:this.nodeId});if(o.sdp||this.logger.error("UpdateMedia invalid SDP answer",o),this.logger.debug("UpdateMedia response",o),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(o.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=Wr(this.dialogParams(t));await this.vertoExecute({message:e,callID:t,node_id:this.nodeId})}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")}}async hangupAll(){const e=this.callId;if(!e)throw new Error("Invalid RTCPeer ID to hangup");try{const t=Wr(Object.assign({cause:"REJECT_ALL",causeCode:"825"},this.dialogParams(e)));await this.vertoExecute({message:t,callID:e,node_id:this.nodeId})}catch(e){this.logger.error("HangupAll error:",e)}finally{this.setState("hangup")}}async sendDigits(e){const t=this.callId;if(!t)throw new Error("Invalid RTCPeer ID to send DTMF");const r=Vr(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));await this.vertoExecute({message:r,callID:t,node_id:this.nodeId})}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.emitter.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=$s),!0===this.options.audio&&(this.options.audio=this.options.screenShare?Us:Vs)}_initPeer(){this.options.remoteSdp&&(this.peer=this._buildPeer("answer"))}_buildPeer(e){const t=new Os(this,e);return this.appendRTCPeer(t),this.runRTCPeerWorkers(t.uuid),t}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear()}}const Fs=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{lr().error("Video Element Paused",e,t)}))})),e},Hs=({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()}))})),qs=({x:e,y:t,width:r,height:o})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${o}%`}),Ks=({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))},Js=({video:e,rootElement:t,paddingWrapper:r})=>{const o=e.videoHeight/e.videoWidth*100,n=function(e,t=0,r){let o=null,n=null;const i=function(){o&&(clearTimeout(o),n=null,o=null)},s=function(){if(!t)return e.apply(this,arguments);const s=this,a=arguments,c=r&&!o;return i(),n=function(){e.apply(s,a)},o=setTimeout((function(){if(o=null,!c){const e=n;return n=null,null==e?void 0:e()}}),t),c&&n?n():void 0};return s.cancel=i,s.flush=function(){const e=n;i(),e&&e()},s}((({width:t,height:n})=>{if(r){const i=n/t*100;r.style.paddingBottom=`${i>o?o:i}%`,r.style.width=((t,r)=>{const o=e.videoWidth/e.videoHeight;return o>t/r?"100%":r*o+"px"})(t,n)}}),100),i=new ResizeObserver((e=>{e.forEach((e=>{if(e.contentBoxSize){const{inlineSize:t,blockSize:r}=Array.isArray(e.contentBoxSize)?e.contentBoxSize[0]:e.contentBoxSize;n({width:t,height:r})}else e.contentRect&&n({width:e.contentRect.width,height:e.contentRect.height})}))}));return{start:()=>i.observe(t),stop:()=>i.disconnect()}},Gs=({track:e,element:t})=>(t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()})),t),Qs=Fr.createAction("swJs/audioSetSpeakerAction"),Xs=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:o}){try{const n=new Map,i=Fs(),s={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return n.get(this.id)},set domElement(e){e?(lr().debug("Set localOverlay",e),n.set(this.id,e)):(lr().debug("Remove localOverlay"),n.delete(this.id))},hide(){if(!this.domElement)return lr().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?lr().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):lr().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return lr().warn("Missing localOverlay to set the local overlay stream");const t=this.domElement.querySelector("video");t&&(t.srcObject=e)},setLocalOverlayMirror(e){if(!this.domElement||!this.domElement.firstChild)return lr().warn("Missing localOverlay to set the mirror");const t=this.domElement.firstChild;e??r.localOverlay.mirrored?(t.style.transform="scale(-1, 1)",t.style.webkitTransform="scale(-1, 1)"):(t.style.transform="scale(1, 1)",t.style.webkitTransform="scale(1, 1)")}},a=(({localOverlay:e,rootElement:t})=>async({layout:r,myMemberId:o,localStream:n})=>{lr().debug("Process layout.changed");try{const{layers:i=[]}=r,s=i.find((({member_id:e})=>e===o));let a=e.domElement;if(e.status=s?"visible":"hidden",!s)return lr().debug("Location not found"),void(a&&(lr().debug("Current layer not visible"),e.hide()));if(!a){lr().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:o,height:n}=qs(e),i=document.createElement("div");return i.style.position="absolute",i.style.overflow="hidden",i.style.top=t,i.style.left=r,i.style.width=o,i.style.height=n,i})({location:s}),a.id=e.id;const r=Fs();r.srcObject=n,r.disablePictureInPicture=!0,r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",r.style.objectFit="cover",a.appendChild(r);const o=t.querySelector(".mcuLayers"),i=o?.querySelector(`#${a.id}`);return o&&!i?(lr().debug("Build myLayer append it"),o.appendChild(a),e.domElement=a,void e.setLocalOverlayMirror()):void lr().debug("Build myLayer >> wait next")}const{top:c,left:d,width:l,height:u}=qs(s);lr().debug("Update myLayer:",c,d,l,u);const h=n.getVideoTracks().filter((e=>e.enabled&&"live"===e.readyState)).length>0;h&&e.setLocalOverlayMediaStream(n),a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=l,a.style.height=u}catch(e){lr().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:s});let c=!1,d=null;const l=e=>{r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):s.hide()};let u;r.on(`${er}.mirror.video`,(e=>{s.setLocalOverlayMirror(e)})),r.on("layout.changed",(e=>{lr().debug("Received layout.changed - videoTrack",c),c?l(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){lr().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){lr().error("Error handling video_muted",e)}r.localStream&&s.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?s.hide():s.show())}catch(e){lr().error("Error handling video_muted",e)}})),r.on("track",(function(r){"video"===r.track.kind&&(u=o(ea,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:i}),c=!0,d&&l(d))})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),n.clear(),u?.cancel()}))}catch(e){lr().error("videoElementSaga",e)}};function*Ys({element:e,room:t}){const r=Fr.getCustomSagaActionType(t.__uuid,Qs);for(;;){const o=yield Ue([r]);try{if(o.type===r){const r=yield ze(Yi,e,o.payload);t.emit(`${er}.speaker.updated`,o.payload),t.settleCustomSagaTrigger({dispatchId:o.dispatchId,payload:r,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:o.dispatchId,payload:e,kind:"reject"}),lr().error(e)}}}function*Zs({track:e,element:t,speakerId:r,room:o}){Gs({track:e,element:t}),r&&Yi(t,r).catch((()=>{})),yield Fe(Ys,{element:t,room:o})}function*ea({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:o}){try{if(Ks({element:o,track:r}),o.style.width="100%",o.style.maxHeight="100%",!t)return void e.appendChild(o);if(e.querySelector(".mcuContent"))return void lr().debug("MCU Content already there");const n=document.createElement("div");n.style.position="absolute",n.style.top="0",n.style.left="0",n.style.right="0",n.style.bottom="0",n.appendChild(o);const i=document.createElement("div");i.classList.add("paddingWrapper"),i.style.paddingBottom="56.25%",i.style.position="relative",i.style.width="100%",i.appendChild(n);const s=document.createElement("div");s.classList.add("mcuLayers"),s.style.display="none",i.appendChild(s);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(i),e.style.width="100%",e.style.height="100%",e.appendChild(a),lr().debug("MCU readyState 1 >>",o.readyState),o.readyState===HTMLMediaElement.HAVE_NOTHING&&(lr().debug("Wait for the MCU to be ready"),yield ze(Hs,{element:o})),lr().debug("MCU is ready..");const c=Js({rootElement:e,video:o,paddingWrapper:i});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),s.style.display="block"}catch(e){lr().error("Handle video track error",e)}}const ta={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},ra=_r(class extends zs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:sn.audioMuteMember,audioUnmute:sn.audioUnmuteMember,videoMute:sn.videoMuteMember,videoUnmute:sn.videoUnmuteMember,setMicrophoneVolume:sn.setInputVolumeMember,setInputVolume:sn.setInputVolumeMember,setInputSensitivity:sn.setInputSensitivityMember}),oa=_r(class extends zs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:sn.audioMuteMember,audioUnmute:sn.audioUnmuteMember,videoMute:sn.videoMuteMember,videoUnmute:sn.videoUnmuteMember,setInputVolume:sn.setInputVolumeMember,setMicrophoneVolume:sn.setInputVolumeMember,setInputSensitivity:sn.setInputSensitivityMember}),na=()=>{},ia="memberList.updated",sa=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(tr),e)),[]).join(".")})((({event:e,namespace:t})=>("string"==typeof e&&(e=(e=>e.replace(ur,(e=>`_${e.toLowerCase()}`)))(e=(({namespace:e,event:t})=>!e||t.startsWith(e)?t:`${e}:${t}`)({event:e,namespace:t}))),e))({event:ia})),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*la({swEventChannel:e,instance:t}){const r=new Map;function*o(e){const o="video.room.joined"===e.type?e.payload.room_session.id:e.payload.room_session_id,n=da({action:e,memberList:r});t.emit(sa,{room_session_id:o,members:n})}for(;;){const t=yield Ue(e,(({type:e})=>ca(e)));yield Fe(o,t)}}const ua=function*({channels:{swEventChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(ia))))(r))return;const{cleanup:o}=((e,t)=>{const r=(e=>Ir(aa).filter((t=>!e.includes(t))))(t);r.forEach((t=>{e.once(t,na)}));const o=({members:t})=>{e.emit(ia,{members:t})};return e.on(sa,o),{cleanup:()=>{e.off(sa,o)}}})(t,r);yield Fe(la,{swEventChannel:e,instance:t}),t.once("destroy",(()=>{o()}))},ha=function*(e){lr().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:o,onDone:n,onFail:i}=e,{swEventChannel:s}=t,{parentId:a}=o;if(!a)throw new Error("Missing parentId for childMemberJoinedWorker");const c=yield Ue(s,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===a)),{member:d}=c.payload;if(d?.parent_id){const e=yield qe(tn.getComponentsById);Object.values(e).find((e=>"memberId"in e&&e.memberId===d.parent_id))?(yield $e(wo.upsert({id:r.callId,roomId:c.payload.room_id,roomSessionId:c.payload.room_session_id,memberId:d.id})),n?.()):i?.({error:new Error("Unknown parent_id")})}lr().trace("childMemberJoinedWorker ended")},pa=function*(e){lr().trace("videoStreamWorker started");const{instance:t,action:{type:r,payload:o},instanceMap:{get:n,set:i,remove:s}}=e;let a=n(o.stream.id);switch(a?a.setPayload(o):a=sn.createRoomSessionStreamObject({store:t.store,payload:o}),i(o.stream.id,a),r){case"video.stream.started":t.emit("stream.started",a);break;case"video.stream.ended":t.emit("stream.ended",a),s(o.stream.id);break;default:lr().warn(`Unknown video.stream event: "${r}"`)}lr().trace("videoStreamWorker ended")},ma=function*(e){lr().trace("videoRecordWorker started");const{instance:t,action:{type:r,payload:o},instanceMap:{get:n,set:i,remove:s}}=e;let a=n(o.recording.id);a?a.setPayload(o):a=sn.createRoomSessionRecordingObject({store:t.store,payload:o}),i(o.recording.id,a);const c=wr(r);switch(r){case"video.recording.started":case"video.recording.updated":t.emit(c,a);break;case"video.recording.ended":t.emit(c,a),s(o.recording.id);break;default:lr().warn(`Unknown video.stream event: "${r}"`)}lr().trace("videoRecordWorker ended")},ga=function*(e){lr().trace("videoPlaybackWorker started");const{instance:t,action:{type:r,payload:o},instanceMap:{get:n,set:i,remove:s}}=e;let a=n(o.playback.id);a?a.setPayload(o):a=sn.createRoomSessionPlaybackObject({store:t.store,payload:o}),i(o.playback.id,a);const c=wr(r);switch(r){case"video.playback.started":case"video.playback.updated":t.emit(c,a);break;case"video.playback.ended":t.emit(c,a),s(o.playback.id);break;default:lr().warn(`Unknown video.stream event: "${r}"`)}lr().trace("videoPlaybackWorker ended")},fa=function*(e){const{channels:t,instance:r}=e,{swEventChannel:o}=t;function*n(t){const{type:o,payload:n}=t;switch(o){case"video.room.subscribed":yield He(Ei.memberPositionWorker,{...e,instance:r,initialState:n});break;case"video.playback.started":case"video.playback.updated":case"video.playback.ended":return void(yield Fe(ga,{action:t,...e}));case"video.recording.started":case"video.recording.updated":case"video.recording.ended":return void(yield Fe(ma,{action:t,...e}));case"video.stream.ended":case"video.stream.started":return void(yield Fe(pa,{action:t,...e}));case"video.room.audience_count":return void r.emit("room.audienceCount",n);case"video.member.talking":{const{member:e}=n;"talking"in e&&(r.emit("member.talking."+(e.talking?"started":"ended"),n),r.emit("member.talking."+(e.talking?"start":"stop"),n));break}}r.emit(wr(o),n)}const i=e=>e.type.startsWith("video.");for(;;){const e=yield Ue(o,i);yield Fe(n,e)}lr().trace("videoWorker ended")},va=_r(class extends zs{_screenShareList=new Set;_deviceList=new Set;_mirrored;_audioEl;constructor(e){super(e),this._mirrored=e.mirrorLocalVideoOverlay,this.runWorker("videoWorker",{worker:fa})}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??[]}))}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:ua})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){return new Promise((async(t,r)=>{const{autoJoin:o=!0,audio:n=!1,video:i=!0,layout:s,positions:a}=e,c=await ls({audio:!0===n?ta:n,video:i}),d={...this.options,screenShare:!0,recoverCall:!1,localStream:c,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId},layout:s,positions:a},l=Fo({store:this.store,Component:ra})(d);c.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{l&&l.active&&l.leave()}))})),l.once("destroy",(()=>{l.emit("room.left"),this._screenShareList.delete(l)}));try{return l.runWorker("childMemberJoinedWorker",{worker:ha,onDone:()=>t(l),onFail:r,initialState:{parentId:this.memberId}}),this._screenShareList.add(l),o?await l.join():t(l)}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:o=!0,audio:n=!1,video:i=!1}=e;if(!n&&!i)throw new TypeError("At least one of `audio` or `video` must be requested.");const s={...this.options,localStream:void 0,remoteStream:void 0,audio:n,video:i,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},a=Fo({store:this.store,Component:oa})(s);a.once("destroy",(()=>{a.emit("room.left"),this._deviceList.delete(a)}));try{return a.runWorker("childMemberJoinedWorker",{worker:ha,onDone:()=>t(a),onFail:r,initialState:{parentId:this.memberId}}),this._deviceList.add(a),o?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}){const t=this._audioEl.sinkId;return this.once(`${er}.speaker.updated`,(async e=>{const r=await Cs(t),o=await Cs(e),n=o?.deviceId===r?.deviceId;o?.deviceId&&!n&&this.emit("speaker.updated",{previous:{deviceId:r?.deviceId,label:r?.label},current:{deviceId:o.deviceId,label:o.label}})})),this.triggerCustomSaga(Qs(e))}_attachSpeakerTrackListener(){Xi()&&Ss().then((e=>{e.on("removed",(async e=>{const t=this._audioEl.sinkId,r=e.changes.find((e=>{const r=e.payload.deviceId;return r===t||""===r&&"default"===t||"default"===r&&""===t}));if(r){this.emit("speaker.disconnected",{deviceId:r.payload.deviceId,label:r.payload.label}),await(this._audioEl.setSinkId?.(""));const e=await Cs("default");if(!e?.deviceId)return;this.emit("speaker.updated",{previous:{deviceId:r.payload.deviceId,label:r.payload.label},current:{deviceId:e.deviceId,label:e.label}})}}))}))}getAudioEl(){return this._audioEl||(this._audioEl=new Audio,this._attachSpeakerTrackListener()),this._audioEl}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()}get localOverlay(){return{mirrored:this._mirrored,setMirrored:e=>{this._mirrored=e,this.emit(`${er}.mirror.video`,this._mirrored)}}}getSubscriptions(){const e=this.eventNames().map((e=>`video.${e}`));return Ir(e)}},{audioMute:sn.audioMuteMember,audioUnmute:sn.audioUnmuteMember,videoMute:sn.videoMuteMember,videoUnmute:sn.videoUnmuteMember,deaf:sn.deafMember,undeaf:sn.undeafMember,setInputVolume:sn.setInputVolumeMember,setOutputVolume:sn.setOutputVolumeMember,setMicrophoneVolume:sn.setInputVolumeMember,setSpeakerVolume:sn.setOutputVolumeMember,setInputSensitivity:sn.setInputSensitivityMember,removeMember:sn.removeMember,removeAllMembers:sn.removeAllMembers,getMembers:sn.getMembers,getLayouts:sn.getLayouts,setLayout:sn.setLayout,setPositions:sn.setPositions,setMemberPosition:sn.setMemberPosition,hideVideoMuted:sn.hideVideoMuted,showVideoMuted:sn.showVideoMuted,getRecordings:sn.getRecordings,startRecording:sn.startRecording,getPlaybacks:sn.getPlaybacks,play:sn.play,setHideVideoMuted:sn.setHideVideoMuted,getMeta:sn.getMeta,setMeta:sn.setMeta,updateMeta:sn.updateMeta,deleteMeta:sn.deleteMeta,getMemberMeta:sn.getMemberMeta,setMemberMeta:sn.setMemberMeta,updateMemberMeta:sn.updateMemberMeta,deleteMemberMeta:sn.deleteMemberMeta,promote:sn.promote,demote:sn.demote,getStreams:sn.getStreams,startStream:sn.startStream,lock:sn.lock,unlock:sn.unlock,setRaisedHand:sn.setRaisedHand,setPrioritizeHandraise:sn.setPrioritizeHandraise}),ya=function*(e){lr().trace("videoManagerRoomsWorker started");const{instance:t,action:{type:r,payload:o}}=e,n={rooms:o.rooms.map((e=>vr(e)))};t.emit(wr(r),n),lr().trace("videoManagerRoomsWorker ended")},ba=function*(e){lr().trace("videoManagerRoomWorker started");const{instance:t,action:{type:r,payload:o}}=e;t.emit(wr(r),vr(o)),lr().trace("videoManagerRoomWorker ended")},_a=function*(e){lr().trace("videoManagerWorker started");const{channels:{swEventChannel:t}}=e;function*r(t){const{type:r}=t;switch(r){case"video-manager.rooms.subscribed":yield Fe(ya,{action:t,...e});break;case"video-manager.room.added":case"video-manager.room.deleted":case"video-manager.room.ended":case"video-manager.room.started":case"video-manager.room.updated":yield Fe(ba,{action:t,...e});break;default:lr().warn(`Unknown video-manager event: "${r}"`)}}for(;;){const e=yield Ue(t,(e=>e.type.startsWith("video-manager.")));yield Fe(r,e)}lr().trace("videoManagerWorker ended")};class wa extends Yo{constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:_a})}getSubscriptions(){const e=this.eventNames().map((e=>`video-manager.${e}`));return Ir(e)}}class Sa extends Xo{_videoManager;_chat;_pubSub;get rooms(){return{makeRoomObject:e=>{const{rootElement:t,applyLocalVideoOverlay:r=!0,stopCameraWhileMuted:o=!0,stopMicrophoneWhileMuted:n=!0,...i}=e,s=[];s.push((({speakerId:e})=>function*({instance:t,runSaga:r}){if("undefined"!=typeof Audio)try{const o=t.getAudioEl();let n;t.on("track",(function(i){"audio"===i.track.kind&&(n=r(Zs,{track:i.track,element:o,speakerId:e,room:t}))})),t.once("destroy",(()=>{n?.cancel()}))}catch(e){lr().error("audioElementSaga",e)}else lr().warn("`Audio` is not supported on this environment.")})({speakerId:i.speakerId})),t&&s.push(Xs({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...i,store:this.store,customSagas:s},Fo({store:c.store,customSagas:c.customSagas,Component:va})(c));var c;return n&&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)}})),o&&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=oi.createBaseChatObject({store:this.store})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=pi.createBasePubSubObject({store:this.store})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=Fo({store:e.store,Component:wa})(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(Fr.reauthAction({token:e}))}}function ka(e){this.message=e}(ka.prototype=new Error).name="InvalidCharacterError";var Ca="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new ka("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,o,n=0,i=0,s="";o=t.charAt(i++);~o&&(r=n%4?64*r+o:o,n++%4)?s+=String.fromCharCode(255&r>>(-2*n&6)):0)o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(o);return s};function Ea(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(Ca(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 Ca(t)}}function Ia(e){this.message=e}function Pa(e,t){if("string"!=typeof e)throw new Ia("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(Ea(e.split(".")[r]))}catch(e){throw new Ia("Invalid token specified: "+e.message)}}(Ia.prototype=new Error).name="InvalidTokenError";const Ta=()=>{if(window&&window.sessionStorage)return window.sessionStorage},Ma=e=>{let t="";try{const r=Pa(e);t=r?.r??""}catch(e){t=""}const r=Boolean(t);return{authStateKey:r&&`as-${t}`,protocolKey:r&&`pt-${t}`,callIdKey:r&&`ci-${t}`}},Ra="function"==typeof CloseEvent?CloseEvent:class{constructor(e,t={}){this.type=e,Zt(this,"code"),Zt(this,"reason"),Zt(this,"wasClean"),this.code=void 0===t.code?0:t.code,this.reason=void 0===t.reason?"":t.reason,this.wasClean=void 0!==t.wasClean&&t.wasClean}};class xa extends yo{options;WebSocketConstructor=WebSocket;CloseEventConstructor=Ra;agent="@signalwire/js/browser/3.25.0";tokenTyp;constructor(e){let t={};try{t=Pa(e.token,{header:!0})}catch(e){}super({...e,host:e.host||t?.ch}),this.options=e,this.tokenTyp=t.typ??"VRT"}get allowReattach(){return!1!==this.options?.reattach&&this.isVRT()}async retrieveRelayProtocol(){if(!this.allowReattach)return"";const{protocolKey:e}=Ma(this.options.token);return e?(this.logger.trace("Search protocol for",e),Ta()?.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowReattach)return;const{protocolKey:e}=Ma(this.options.token);e&&(this.logger.trace("Persist protocol",e,this.relayProtocol),Ta()?.setItem(e,this.relayProtocol))}async retrieveSwAuthorizationState(){const{authStateKey:e}=Ma(this.options.token);return e?Ta()?.getItem(e)??"":""}async persistSwAuthorizationState(e){if(!this.allowReattach)return;const{authStateKey:t}=Ma(this.options.token);t&&(this.logger.trace("Persist auth state",t,e),Ta()?.setItem(t,e))}_onSocketClose(e){if("unknown"===this.status){const{protocolKey:e,authStateKey:t,callIdKey:r}=Ma(this.options.token);this.logger.debug("Cleaning up storage"),e&&(this.logger.debug("Remove protocolKey",e),Ta()?.removeItem(e)),t&&(this.logger.debug("Remove authStateKey",t),Ta()?.removeItem(t)),r&&(this.logger.debug("Remove callIdKey",r),Ta()?.removeItem(r))}super._onSocketClose(e)}isVRT(){return"VRT"===this.tokenTyp}}const Oa=e=>{const t={...e,emitter:Ho()},r=qo({userOptions:t,SessionConstructor:xa});return Fo({store:r,Component:Sa})(t)},Aa={aspectRatio:{ideal:16/9}},ja=e=>new Promise((async(t,r)=>{const{audio:o=!0,video:n=!0,iceServers:i,rootElementId:s,applyLocalVideoOverlay:a=!0,autoJoin:c=!1,stopCameraWhileMuted:d=!0,stopMicrophoneWhileMuted:l=!0,speakerId:u,...h}=e,p=Oa({...h});if(await p.connect(),!p)return;let m;if(s){const e=document.getElementById(s);e?m=e:(m=document.body,lr().warn(`We couldn't find an element with id: ${s}: using 'document.body' instead.`))}const g=p.rooms.makeRoomObject({audio:o,video:!0===n?Aa:n,negotiateAudio:!0,negotiateVideo:!0,iceServers:i,rootElement:m,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:l,speakerId:u});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){lr().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)})),La=["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","lock","unlock"],Da=["member.joined","layout.changed"],Wa=()=>{},Na=function(e){const{audio:t=!0,video:r=!0,iceServers:o,rootElement:n,applyLocalVideoOverlay:i=!0,mirrorLocalVideoOverlay:s=!1,stopCameraWhileMuted:a=!0,stopMicrophoneWhileMuted:c=!0,speakerId:d,destinationNumber:l,localStream:u,watchMediaPackets:h,watchMediaPacketsTimeout:p,...m}=e;["audio","video"].forEach((t=>{t in e&&lr().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const g=!1!==e?.reattach,{callIdKey:f}=Ma(m.token),v={joined:({call_id:e})=>{g&&f&&Ta()?.setItem(f,e)},init:()=>{g&&b.on("room.subscribed",v.joined),b.options.prevCallId=v.getPrevCallId()},destroy:()=>{g&&(b.off("room.subscribed",v.joined),f&&Ta()?.removeItem(f))},getPrevCallId:()=>{if(g&&f)return Ta()?.getItem(f)??void 0}},y=Oa(m),b=y.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:o,rootElement:n,applyLocalVideoOverlay:i,mirrorLocalVideoOverlay:s,stopCameraWhileMuted:a,stopMicrophoneWhileMuted:c,speakerId:d,destinationNumber:l,localStream:u,watchMediaPackets:h,watchMediaPacketsTimeout:p,prevCallId:v.getPrevCallId()});b.once("destroy",(()=>{b.emit("room.left",{reason:b.leaveReason}),v.destroy(),y.disconnect()})),y.session.once("session.disconnected",(()=>{b.destroy()}));const _={join:e=>new Promise((async(o,n)=>{try{b.attachPreConnectWorkers(),await y.connect();const i=e?.audio??t,s=e?.video??r,a=y._sessionAuthState;if(lr().debug("getJoinMediaParams authState?",a),a&&"video"===a.type){const t=(e=>{const{authState:t,audio:r=!0,video:o=!0,sendAudio:n,sendVideo:i,receiveAudio:s,receiveVideo:a}=e;lr().debug("getJoinMediaParams options",{...e});const{audio_allowed:c,video_allowed:d,join_as:l}=t,u="member"===(l??"member"),h=u&&"both"===c,p=u&&"both"===d,m="none"!==c,g="none"!==d,f=Boolean(n??r),v=Boolean(i??o),y=Boolean(s??r),b=Boolean(a??o);return!h&&f&&lr().info("Not allowed to send audio on this room. Default values will be used."),!p&&v&&lr().info("Not allowed to send video on this room. Default values will be used."),!m&&y&&lr().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&lr().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(i),sendVideo:Boolean(s),...e});if(!Object.values(t).some(Boolean))return y.disconnect(),n(new Error(`Invalid arguments to join the room. The token used has join_as: '${a.join_as}'. \n${JSON.stringify(e,null,2)}\n`));lr().debug("Set mediaOptions",t),b.updateMediaOptions({audio:!!t.mustSendAudio&&(i||!0),video:!!t.mustSendVideo&&(s||!0),negotiateAudio:t.mustRecvAudio,negotiateVideo:t.mustRecvVideo})}b.once("room.subscribed",(()=>{o(b)})),v.init(),Da.forEach((e=>b.once(e,Wa))),await b.join()}catch(e){lr().error("RoomSession Join",e),y.disconnect(),n(e)}}))};return new Proxy(b,{get(e,t,r){if(t in _)return _[t];if(!e.active&&La.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:Na,createRoomObject:ja,joinRoom:e=>ja({...e,autoJoin:!0}),createClient:Oa});class Ua{options;httpClient;constructor(e){this.options=e,this.httpClient=Fi({baseUrl:`https://${this.httpHost}`,headers:{Authorization:`Bearer ${this.options.accessToken}`}})}get httpHost(){return this.options.httpHost??"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:n}=await this.httpClient(`${e}${r}`);return o(n)},o=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 o(t)}async registerDevice({deviceType:e,deviceToken:t}){const{body:r}=await this.httpClient("/subscriber/devices",{method:"POST",body:{device_type:e,device_token:t}});return r}async unregisterDevice({id:e}){const t=`/subscriber/devices/${e}`;return await this.httpClient(t,{method:"DELETE"})}}const $a=function*(e){lr().debug("WSClientWorker started");const{channels:t,instance:r}=e,{swEventChannel:o}=t;for(lr().debug("WSClientWorker instance",r);;){const e=yield Ue(o,(e=>(lr().debug("WSClientWorker action",e),"webrtc.message"===e.type&&"verto.invite"===e.payload.method)));lr().debug("Build new call to answer",e)}lr().trace("WSClientWorker ended")};class Ba{options;wsClient;logger=lr();constructor(e){this.options=e,this.wsClient=Oa({host:this.options.host,token:this.options.token,debug:{logWsTraffic:!0},logLevel:"debug"})}connect(){return this.wsClient.runWorker("WSClientWorker",{worker:$a}),this.wsClient.connect()}disconnect(){return this.wsClient.disconnect()}async dial(e){return new Promise((async(t,r)=>{try{console.log("WSClient dial with:",e),await this.connect();const r=this.wsClient.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,rootElement:this.options.rootElement,applyLocalVideoOverlay:!0,stopCameraWhileMuted:!0,stopMicrophoneWhileMuted:!0,destinationNumber:e.to,watchMediaPackets:!1,nodeId:e.nodeId});r.once("destroy",(()=>{this.logger.debug("RTC Connection Destroyed")})),this.wsClient.once("session.disconnected",(()=>{this.logger.debug("Session Disconnected")})),r.attachPreConnectWorkers(),r.start=()=>new Promise((async(e,t)=>{try{r.once("verto.display",(()=>e(r))),r.once("room.subscribed",(()=>e(r))),await r.join()}catch(e){lr().error("WSClient call start",e),t(e)}})),t(r)}catch(e){lr().error("WSClient dial",e),r(e)}}))}handlePushNotification(e){return new Promise((async(t,r)=>{const{decrypted:o,type:n}=e;if("call_invite"!==n)return void this.logger.warn("Unknown notification type",e);this.logger.debug("handlePushNotification",e);const{params:i,node_id:s}=o,{params:{callID:a,sdp:c,caller_id_name:d,caller_id_number:l,callee_id_name:u,callee_id_number:h,display_direction:p}}=i;this.logger.debug("handlePushNotification data",{callID:a,sdp:c,caller_id_name:d,caller_id_number:l,callee_id_name:u,callee_id_number:h,display_direction:p});try{await this.connect();try{await this.executeVertoSubscribe(a,s)}catch(e){this.logger.warn("Verto Subscribe",e)}const e=this.wsClient.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,rootElement:this.options.rootElement,applyLocalVideoOverlay:!0,stopCameraWhileMuted:!0,stopMicrophoneWhileMuted:!0,watchMediaPackets:!1,remoteSdp:c,prevCallId:a,nodeId:s});e.once("destroy",(()=>{lr().debug("RTC Connection Destroyed")})),e.attachPreConnectWorkers(),lr().debug("Resolving Call",e),t({resultType:"inboundCall",resultObject:e})}catch(e){r(e)}}))}async executeVertoSubscribe(e,t){try{return await this.wsClient.execute({method:"webrtc.verto",params:{callID:e,node_id:t,subscribe:[],message:$r({sessid:e,eventChannel:[]})}})}catch(t){throw this.logger.warn("The call is not available anymore",e),t}}updateToken(e){return new Promise(((t,r)=>{this.wsClient.once("session.auth_error",(e=>{r(e)})),this.wsClient.once("session.connected",(()=>{t()})),this.wsClient.reauthenticate(e)}))}}class za{options;httpClient;constructor(e){this.options=e,this.httpClient=Fi({baseUrl:`https://${this.httpHost}`,headers:{Authorization:`Bearer ${this.options.token}`}})}get httpHost(){const{host:e}=this.options;return e?`fabric.${e.split(".").splice(1).join(".")}`:"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:n}=await this.httpClient(`${e}${r}`);return o(n)},o=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 o(t)}async registerDevice({deviceType:e,deviceToken:t}){const{body:r}=await this.httpClient("/subscriber/devices",{method:"POST",body:{device_type:e,device_token:t}});return r}async unregisterDevice({id:e}){const t=`/subscriber/devices/${e}`;return await this.httpClient(t,{method:"DELETE"})}}const Fa=e=>new Promise((async(t,r)=>{try{const r=new za(e),o=new Ba(e);t({httpHost:r.httpHost,getAddresses:r.getAddresses.bind(r),registerDevice:r.registerDevice.bind(r),unregisterDevice:r.unregisterDevice.bind(r),connect:o.connect.bind(o),disconnect:o.disconnect.bind(o),dial:o.dial.bind(o),handlePushNotification:o.handlePushNotification.bind(o),updateToken:o.updateToken.bind(o),__httpClient:r,__wsClient:o})}catch(e){r(e)}}));var Ha=Object.freeze({__proto__:null,Client:class{options;httpClient;constructor(e){this.options=e,this.httpClient=Fi({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:n}=await this.httpClient(`${e}${r}`);return o(n)},o=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 o(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 o,n;if("room"!==e)throw new Error(`Unknown strategy: '${e}'`);o=new Na({token:t.token,debug:{logWsTraffic:!0},logLevel:"debug",watchMediaPackets:!1,...r}),n=e=>new Promise(((t,r)=>(o.once("room.joined",(e=>t(e))),o.emitter.once("verto.display",(e=>t(e))),o.join(e).catch((e=>r(e))))));const i={start:n};return new Proxy(o,{get:(e,t,r)=>t in i?i[t]:Reflect.get(e,t,r)})})({...r,userParams:{host:this.host.includes("swire")?"relay.swire.io":void 0,...t}})}},SWClient:Ua,WSClient:Ba,SignalWire:Fa});const qa=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Ka=Object.freeze({__proto__:null,ChatMember:oi.ChatMember,ChatMessage:oi.ChatMessage,Client:function(e){const t=Oa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,o,n)=>o in r?r[o]:qa.includes(o)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(o):Reflect.get(e,o,n)})}});const Ja=["getAllowedChannels","subscribe","publish"];var Ga=Object.freeze({__proto__:null,PubSubMessage:pi.PubSubMessage,Client:function(e){const t=Oa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,o,n)=>o in r?r[o]:Ja.includes(o)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(o):Reflect.get(e,o,n)})}}),Qa=Object.freeze({__proto__:null,getDevices:ps,getCameraDevices:()=>ps("camera"),getMicrophoneDevices:()=>ps("microphone"),getSpeakerDevices:ms,getDevicesWithPermissions:us,getCameraDevicesWithPermissions:()=>us("camera"),getMicrophoneDevicesWithPermissions:()=>us("microphone"),getSpeakerDevicesWithPermissions:()=>us("speaker"),checkPermissions:is,checkCameraPermissions:ss,checkMicrophonePermissions:as,checkSpeakerPermissions:cs,requestPermissions:async e=>{try{const t=await ds(e);Zi(t)}catch(e){throw e}},createDeviceWatcher:ws,createCameraDeviceWatcher:()=>ws({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>ws({targets:["microphone"]}),createSpeakerDeviceWatcher:Ss,supportsMediaDevices:Ki,supportsGetUserMedia:()=>"function"==typeof Ji().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Ji().getDisplayMedia,getUserMedia:ds,getDisplayMedia:ls,enumerateDevices:os,getSupportedConstraints:Gi,supportsMediaOutput:Xi,setMediaElementSinkId:Yi,stopStream:Zi,stopTrack:es,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(ks(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},ds(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Wt,o=new(window.AudioContext||window.webkitAudioContext),n=(e=>{const t=e.createAnalyser();return t.fftSize=64,t.minDecibels=-90,t.maxDecibels=-10,t.smoothingTimeConstant=.85,t})(o);let i,s;try{o.createMediaStreamSource(t).connect(n)}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(n.frequencyBinCount);n.getByteFrequencyData(e);const t=e.reduce(((e,t)=>e+t),0)/20;s!==t&&(s=t,r.emit("volumeChanged",Math.min(s,100))),i=requestAnimationFrame(a)}catch(e){r.emit("destroyed","error")}};i=requestAnimationFrame(a);const c=()=>{i&&cancelAnimationFrame(i),"closed"!==o.state&&o.close().catch((e=>{lr().error("Error closing the AudioContext",e)})),ks(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=Ka,e.Fabric=Ha,e.PubSub=Ga,e.SWClient=Ua,e.SignalWire=Fa,e.Video=Va,e.WebRTC=Qa,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
20
|
+
***************************************************************************** */const As=e=>pr(e.type),js=function*(e){lr().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:o}=e,{swEventChannel:n}=t,{rtcPeerId:i}=o;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const s=Co.createCatchableSaga((function*(e){var t,o;const{id:n,method:s,params:a={}}=e.payload,{callID:c,nodeId:d}=a,l=r.getRTCPeerById(c);if(!l)return void lr().warn(`RTCPeer '${c}' not found for method: '${s}'`,a);const u=r.peer;switch(s){case"verto.media":case"verto.answer":l.uuid===(null==u?void 0:u.uuid)&&r.setState("verto.media"===s?"early":"active"),(null==a?void 0:a.sdp)&&l.onRemoteSdp(a.sdp),yield $e(wo.upsert({id:null===(t=e.payload.params)||void 0===t?void 0:t.callID,nodeId:null===(o=e.payload.params)||void 0===o?void 0:o.nodeId})),yield ze([r,r.execute],{method:r._getRPCMethod(),params:{message:zr(n,s),node_id:d}});break;case"verto.bye":yield ze([r,r.onVertoBye],{rtcPeerId:c,byeCause:null==a?void 0:a.cause,byeCauseCode:null==a?void 0:a.causeCode,redirectDestination:null==a?void 0:a.redirectDestination}),yield ze([r,r.execute],{method:r._getRPCMethod(),params:{message:zr(n,s),node_id:d}});break;case"verto.ping":{const{nodeId:e}=a,t=function(e,t){var r={};for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var n=0;for(o=Object.getOwnPropertySymbols(e);n<o.length;n++)t.indexOf(o[n])<0&&Object.prototype.propertyIsEnumerable.call(e,o[n])&&(r[o[n]]=e[o[n]])}return r}(a,["nodeId"]);yield ze([r,r.execute],{method:r._getRPCMethod(),params:{message:Br(t),node_id:e}});break}case"verto.mediaParams":{if(!c||!a.mediaParams){lr().warn("Invalid mediaParams event",a);break}const{audio:e,video:t}=a.mediaParams;l&&t&&l.applyMediaConstraints("video",t),l&&e&&l.applyMediaConstraints("audio",e);break}case"verto.display":r.setActiveRTCPeer(i),r.emit("verto.display",e.payload.params);break;default:return lr().warn(`Unknown Verto method: ${s}`,a)}}),(e=>{lr().error("Verto Error",e)}));for(;;){const e=yield Ue(n,(e=>{var t;return!!As(e)&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===i}));yield Fe(s,e)}lr().trace("vertoEventWorker ended")},Ls=function*(e){lr().debug("roomSubscribedWorker started");const{channels:t,instance:r,initialState:o}=e,{swEventChannel:n}=t,{rtcPeerId:i}=o;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const s=yield Ue(n,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===i)),a=JSON.parse(JSON.stringify(s.payload));r.setActiveRTCPeer(i),yield $e(wo.upsert({id:s.payload.call_id,roomId:s.payload.room_session.room_id,roomSessionId:s.payload.room_session.id,memberId:s.payload.member_id,previewUrl:s.payload.room_session.preview_url})),r.emit("room.joined",Ds.call(r,a)),lr().debug("roomSubscribedWorker ended",i)};function Ds(e){return["room_session","room"].forEach((t=>{e[t].recordings&&(e[t].recordings=(e[t].recordings||[]).map((t=>{let r=this.instanceMap.get(t.id);return r?r.setPayload({room_id:e.room.room_id,room_session_id:e.room_session.id,recording:t}):r=sn.createRoomSessionRecordingObject({store:this.store,payload:{room_id:e.room.room_id,room_session_id:e.room_session.id,recording:t}}),this.instanceMap.set(t.id,r),r}))),e[t].playbacks&&(e[t].playbacks=(e[t].playbacks||[]).map((t=>{let r=this.instanceMap.get(t.id);return r?r.setPayload({room_id:e.room.room_id,room_session_id:e.room_session.id,playback:t}):r=sn.createRoomSessionPlaybackObject({store:this.store,payload:{room_id:e.room.room_id,room_session_id:e.room_session.id,playback:t}}),this.instanceMap.set(t.id,r),r}))),e[t].streams&&(e[t].streams=(e[t].streams||[]).map((t=>{let r=this.instanceMap.get(t.id);return r?r.setPayload({room_id:e.room.room_id,room_session_id:e.room_session.id,stream:t}):r=sn.createRoomSessionStreamObject({store:this.store,payload:{room_id:e.room.room_id,room_session_id:e.room_session.id,stream:t}}),this.instanceMap.set(t.id,r),r})))})),e}const Ws=function*(e){lr().debug("promoteDemoteWorker started");const{channels:t,instance:r,initialState:o}=e,{swEventChannel:n}=t,{rtcPeerId:i}=o;if(!i)throw new Error("Missing rtcPeerId for promoteDemoteWorker");const s=yield Ue(n,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));lr().debug("promoteDemoteWorker:",s.type,s.payload),yield $e(mo.updateAuthState(s.payload.authorization));const a=yield qe(Bi.getAuthState);if(!a)throw new Error(`Invalid authState for '${s.type}'`);const{audio_allowed:c,video_allowed:d}=a;switch(s.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(),lr().debug("promoteDemoteWorker ended",i)},Ns=function*(e){lr().debug("sessionAuthWorker started");const{instance:t}=e;switch((yield Ue([Fr.authSuccessAction.type,Fr.authErrorAction.type])).type){case Fr.authSuccessAction.type:yield ze([t,t.resume]);break;case Fr.authErrorAction.type:yield ze([t,t.setState],"hangup")}lr().debug("sessionAuthWorker ended")},Vs={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},Us=Object.assign(Object.assign({},Vs),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),$s={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},Bs={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:Vs,video:$s,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3,maxIceGatheringTimeout:5e3,maxConnectionStateTimeout:3e3,watchMediaPackets:!0,watchMediaPacketsTimeout:2e3};class zs extends Qo{constructor(e){super(e),this.leaveReason=void 0,this.gotEarly=!1,this.doReinvite=!1,this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.resuming=!1,this.onVertoBye=e=>{this.logger.debug("onVertoBye",e);const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:o="16",redirectDestination:n}=e;this.cause=String(r),this.causeCode=String(o);const i=this.getRTCPeerById(t);return i?n&&i.localSdp?(this.logger.debug("Redirect Destination to:",n,"for RTCPeer:",i.uuid),void this.executeInvite(i.localSdp,i.uuid,n)):(i.onRemoteBye({code:this.causeCode,message:this.cause}),void(this.activeRTCPeerId===(null==i?void 0:i.uuid)&&(this.logger.debug("onVertoBye go hangup"),this.setState("hangup")))):this.logger.warn("Invalid RTCPeer to hangup",e)},this.options=Object.assign(Object.assign({},Bs),e),this._checkDefaultMediaConstraints(),this.setState("new"),this.logger.trace("New Call with Options:",this.options),this._initPeer()}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 nodeId(){return this.component.nodeId||this.options.nodeId}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(Bi.getIceServers)}get component(){return this.select((e=>tn.getComponent(e,this.callId)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:o,callerNumber:n,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:l=!0}=this.options;return{dialogParams:{id:e,destinationNumber:t,attach:r,callerName:o,callerNumber:n,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:l,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.peer.instance&&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)}setLocalStream(e){return new Promise((async(t,r)=>{try{if(!this.peer||!this.localStream)return r(new Error("Invalid RTCPeerConnection."));if(!Qi(e))return r(new Error("Invalid stream provided."));const o=this.localStream.getAudioTracks(),n=e.getAudioTracks();n.length<=0?this.logger.info("No audio track found in the stream provided. Audio will be unaffected."):(o.forEach((e=>{var t;es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e)})),n.forEach((e=>{var t;null===(t=this.localStream)||void 0===t||t.addTrack(e)})));const i=this.localStream.getVideoTracks(),s=e.getVideoTracks();s.length<=0?this.logger.info("No video track found in the stream provided. Video will be unaffected."):(i.forEach((e=>{var t;es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e)})),s.forEach((e=>{var t;null===(t=this.localStream)||void 0===t||t.addTrack(e)}))),await this.updateStream(this.localStream),this.logger.debug("setLocalStream done"),t(this.localStream)}catch(e){this.logger.error("setLocalStream",e),r(e)}}))}vertoExecute(e){return this.execute({method:this._getRPCMethod(),params:e})}_getRPCMethod(){const e=this.select(Bi.getAuthState);return e&&Tr(e)?"webrtc.verto":"video.message"}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=this._buildPeer("offer");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,o)=>{var n,i,s;try{if(!this.peer)return o(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return o(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return this.logger.debug("Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped"),r();let i,s={};null===(n=this.localStream)||void 0===n||n.getTracks().forEach((t=>{var r;s[t.kind]=t.getConstraints(),void 0!==e[t.kind]&&(this.logger.debug("updateConstraints stop old tracks first?"),this.logger.debug("Track readyState:",t.kind,t.readyState),es(t),t.stop(),null===(r=this.localStream)||void 0===r||r.removeTrack(t))}));try{this.logger.info("updateConstraints with",e),i=await ds(e)}catch(e){return this.logger.error("Error updating device constraints:",e.name,e.message,e),this.logger.info("Restoring previous constraints",s),await this.updateConstraints(s,{attempt:t+1}),o(e)}await this.updateStream(i),this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),o(e)}finally{null===(i=this.peer)||void 0===i||i._attachAudioTrackListener(),null===(s=this.peer)||void 0===s||s._attachVideoTrackListener()}}))}async updateStream(e){if(!this.peer)throw new Error("Invalid RTCPeerConnection.");const t=this.localVideoTrack,r=this.localAudioTrack;this.peer._detachAudioTrackListener(),this.peer._detachVideoTrackListener(),this.logger.debug("updateStream got stream",e),this.localStream||(this.localStream=new MediaStream);const{instance:o}=this.peer,n=e.getTracks();this.logger.debug(`updateStream got ${n.length} tracks`);for(let e=0;e<n.length;e++){const i=n[e];this.logger.debug("updateStream apply track: ",i);const s=o.getTransceivers().find((({mid:e,sender:t,receiver:r})=>t.track&&t.track.kind===i.kind?(this.logger.debug("Found transceiver by sender"),!0):r.track&&r.track.kind===i.kind?(this.logger.debug("Found transceiver by receiver"),!0):null===e&&(this.logger.debug("Found disassociated transceiver"),!0)));s&&s.sender?(this.logger.debug("updateStream got transceiver",s.currentDirection,s.mid),await s.sender.replaceTrack(i),this.logger.debug("updateStream replaceTrack"),s.direction="sendrecv",this.logger.debug("updateStream set to sendrecv"),this.localStream.getTracks().forEach((e=>{var t;e.kind===i.kind&&e.id!==i.id&&(this.logger.debug("updateStream stop old track and apply new one - "),es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e))})),this.localStream.addTrack(i)):(this.logger.debug("updateStream no transceiver found. addTrack and start dancing!"),this.peer.type="offer",this.doReinvite=!0,this.localStream.addTrack(i),o.addTrack(i,this.localStream)),this.logger.debug("updateStream simply update mic/cam"),"audio"===i.kind?(this.emit("microphone.updated",{previous:{deviceId:null==r?void 0:r.id,label:null==r?void 0:r.label},current:{deviceId:null==i?void 0:i.id,label:null==i?void 0:i.label}}),this.options.micId=i.getSettings().deviceId):"video"===i.kind&&(this.emit("camera.updated",{previous:{deviceId:null==t?void 0:t.id,label:null==t?void 0:t.label},current:{deviceId:null==i?void 0:i.id,label:null==i?void 0:i.label}}),this.options.camId=i.getSettings().deviceId)}this.logger.debug("updateStream done")}runRTCPeerWorkers(e){this.runWorker("vertoEventWorker",{worker:js,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:Ls,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:Ws,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=this._buildPeer("offer");try{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||(this.peer=this._buildPeer("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,o=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",o),t){case"offer":return this._watchSessionAuth(),!this.resuming&&e.instance.remoteDescription?this.executeUpdateMedia(o,e.uuid):this.executeInvite(o,e.uuid);case"answer":return this.executeAnswer(o,e.uuid);default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}_closeWSConnection(){this._watchSessionAuth(),this.store.dispatch(Fr.sessionForceCloseAction())}_watchSessionAuth(){this.sessionAuthTask&&this.sessionAuthTask.cancel(),this.sessionAuthTask=this.runWorker("sessionAuthWorker",{worker:Ns})}async resume(){var e;if(this.logger.warn(`[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 o=this.getRTCPeerById(t);if(!o||o.instance.remoteDescription&&!this.resuming)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const o=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},n=Dr(Object.assign(Object.assign(Object.assign({},this.dialogParams(t)),o),{sdp:e}));let i=[];i=this.options.screenShare?["video.room.screenshare"]:this.options.additionalDevice?["video.room.additionaldevice"]:this.getSubscriptions();const s=await this.vertoExecute({message:n,callID:t,node_id:null!=r?r:this.options.nodeId,subscribe:i});this.logger.debug("Invite response",s),this.resuming=!1}catch(e){throw this.setState("hangup"),e}}async executeAnswer(e,t,r){"new"===this.state&&this.setState("answering");try{const o=Ur(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e})),n=await this.vertoExecute({message:o,callID:t,node_id:null!=r?r:this.options.nodeId,subscribe:this.getSubscriptions()});this.logger.debug("Answer response",n),this.resuming=!1,this.setActiveRTCPeer(t)}catch(e){throw this.setState("hangup"),e}}async executeUpdateMedia(e,t){try{const r=Nr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),o=await this.vertoExecute({message:r,callID:t,node_id:this.nodeId});if(o.sdp||this.logger.error("UpdateMedia invalid SDP answer",o),this.logger.debug("UpdateMedia response",o),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(o.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=Wr(this.dialogParams(t));await this.vertoExecute({message:e,callID:t,node_id:this.nodeId})}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")}}async hangupAll(){const e=this.callId;if(!e)throw new Error("Invalid RTCPeer ID to hangup");try{const t=Wr(Object.assign({cause:"REJECT_ALL",causeCode:"825"},this.dialogParams(e)));await this.vertoExecute({message:t,callID:e,node_id:this.nodeId})}catch(e){this.logger.error("HangupAll error:",e)}finally{this.setState("hangup")}}async sendDigits(e){const t=this.callId;if(!t)throw new Error("Invalid RTCPeer ID to send DTMF");const r=Vr(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));await this.vertoExecute({message:r,callID:t,node_id:this.nodeId})}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.emitter.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=$s),!0===this.options.audio&&(this.options.audio=this.options.screenShare?Us:Vs)}_initPeer(){this.options.remoteSdp&&(this.peer=this._buildPeer("answer"))}_buildPeer(e){const t=new Os(this,e);return this.appendRTCPeer(t),this.runRTCPeerWorkers(t.uuid),t}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear()}}const Fs=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{lr().error("Video Element Paused",e,t)}))})),e},Hs=({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()}))})),qs=({x:e,y:t,width:r,height:o})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${o}%`}),Ks=({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))},Js=({video:e,rootElement:t,paddingWrapper:r})=>{const o=e.videoHeight/e.videoWidth*100,n=function(e,t=0,r){let o=null,n=null;const i=function(){o&&(clearTimeout(o),n=null,o=null)},s=function(){if(!t)return e.apply(this,arguments);const s=this,a=arguments,c=r&&!o;return i(),n=function(){e.apply(s,a)},o=setTimeout((function(){if(o=null,!c){const e=n;return n=null,null==e?void 0:e()}}),t),c&&n?n():void 0};return s.cancel=i,s.flush=function(){const e=n;i(),e&&e()},s}((({width:t,height:n})=>{if(r){const i=n/t*100;r.style.paddingBottom=`${i>o?o:i}%`,r.style.width=((t,r)=>{const o=e.videoWidth/e.videoHeight;return o>t/r?"100%":r*o+"px"})(t,n)}}),100),i=new ResizeObserver((e=>{e.forEach((e=>{if(e.contentBoxSize){const{inlineSize:t,blockSize:r}=Array.isArray(e.contentBoxSize)?e.contentBoxSize[0]:e.contentBoxSize;n({width:t,height:r})}else e.contentRect&&n({width:e.contentRect.width,height:e.contentRect.height})}))}));return{start:()=>i.observe(t),stop:()=>i.disconnect()}},Gs=({track:e,element:t})=>(t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()})),t),Qs=Fr.createAction("swJs/audioSetSpeakerAction"),Xs=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:o}){try{const n=new Map,i=Fs(),s={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return n.get(this.id)},set domElement(e){e?(lr().debug("Set localOverlay",e),n.set(this.id,e)):(lr().debug("Remove localOverlay"),n.delete(this.id))},hide(){if(!this.domElement)return lr().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?lr().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):lr().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return lr().warn("Missing localOverlay to set the local overlay stream");const t=this.domElement.querySelector("video");t&&(t.srcObject=e)},setLocalOverlayMirror(e){if(!this.domElement||!this.domElement.firstChild)return lr().warn("Missing localOverlay to set the mirror");const t=this.domElement.firstChild;e??r.localOverlay.mirrored?(t.style.transform="scale(-1, 1)",t.style.webkitTransform="scale(-1, 1)"):(t.style.transform="scale(1, 1)",t.style.webkitTransform="scale(1, 1)")}},a=(({localOverlay:e,rootElement:t})=>async({layout:r,myMemberId:o,localStream:n})=>{lr().debug("Process layout.changed");try{const{layers:i=[]}=r,s=i.find((({member_id:e})=>e===o));let a=e.domElement;if(e.status=s?"visible":"hidden",!s)return lr().debug("Location not found"),void(a&&(lr().debug("Current layer not visible"),e.hide()));if(!a){lr().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:o,height:n}=qs(e),i=document.createElement("div");return i.style.position="absolute",i.style.overflow="hidden",i.style.top=t,i.style.left=r,i.style.width=o,i.style.height=n,i})({location:s}),a.id=e.id;const r=Fs();r.srcObject=n,r.disablePictureInPicture=!0,r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",r.style.objectFit="cover",a.appendChild(r);const o=t.querySelector(".mcuLayers"),i=o?.querySelector(`#${a.id}`);return o&&!i?(lr().debug("Build myLayer append it"),o.appendChild(a),e.domElement=a,void e.setLocalOverlayMirror()):void lr().debug("Build myLayer >> wait next")}const{top:c,left:d,width:l,height:u}=qs(s);lr().debug("Update myLayer:",c,d,l,u);const h=n.getVideoTracks().filter((e=>e.enabled&&"live"===e.readyState)).length>0;h&&e.setLocalOverlayMediaStream(n),a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=l,a.style.height=u}catch(e){lr().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:s});let c=!1,d=null;const l=e=>{r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):s.hide()};let u;r.on(`${er}.mirror.video`,(e=>{s.setLocalOverlayMirror(e)})),r.on("layout.changed",(e=>{lr().debug("Received layout.changed - videoTrack",c),c?l(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){lr().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){lr().error("Error handling video_muted",e)}r.localStream&&s.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?s.hide():s.show())}catch(e){lr().error("Error handling video_muted",e)}})),r.on("track",(function(r){"video"===r.track.kind&&(u=o(ea,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:i}),c=!0,d&&l(d))})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),n.clear(),u?.cancel()}))}catch(e){lr().error("videoElementSaga",e)}};function*Ys({element:e,room:t}){const r=Fr.getCustomSagaActionType(t.__uuid,Qs);for(;;){const o=yield Ue([r]);try{if(o.type===r){const r=yield ze(Yi,e,o.payload);t.emit(`${er}.speaker.updated`,o.payload),t.settleCustomSagaTrigger({dispatchId:o.dispatchId,payload:r,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:o.dispatchId,payload:e,kind:"reject"}),lr().error(e)}}}function*Zs({track:e,element:t,speakerId:r,room:o}){Gs({track:e,element:t}),r&&Yi(t,r).catch((()=>{})),yield Fe(Ys,{element:t,room:o})}function*ea({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:o}){try{if(Ks({element:o,track:r}),o.style.width="100%",o.style.maxHeight="100%",!t)return void e.appendChild(o);if(e.querySelector(".mcuContent"))return void lr().debug("MCU Content already there");const n=document.createElement("div");n.style.position="absolute",n.style.top="0",n.style.left="0",n.style.right="0",n.style.bottom="0",n.appendChild(o);const i=document.createElement("div");i.classList.add("paddingWrapper"),i.style.paddingBottom="56.25%",i.style.position="relative",i.style.width="100%",i.appendChild(n);const s=document.createElement("div");s.classList.add("mcuLayers"),s.style.display="none",i.appendChild(s);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(i),e.style.width="100%",e.style.height="100%",e.appendChild(a),lr().debug("MCU readyState 1 >>",o.readyState),o.readyState===HTMLMediaElement.HAVE_NOTHING&&(lr().debug("Wait for the MCU to be ready"),yield ze(Hs,{element:o})),lr().debug("MCU is ready..");const c=Js({rootElement:e,video:o,paddingWrapper:i});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),s.style.display="block"}catch(e){lr().error("Handle video track error",e)}}const ta={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},ra=_r(class extends zs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:sn.audioMuteMember,audioUnmute:sn.audioUnmuteMember,videoMute:sn.videoMuteMember,videoUnmute:sn.videoUnmuteMember,setMicrophoneVolume:sn.setInputVolumeMember,setInputVolume:sn.setInputVolumeMember,setInputSensitivity:sn.setInputSensitivityMember}),oa=_r(class extends zs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:sn.audioMuteMember,audioUnmute:sn.audioUnmuteMember,videoMute:sn.videoMuteMember,videoUnmute:sn.videoUnmuteMember,setInputVolume:sn.setInputVolumeMember,setMicrophoneVolume:sn.setInputVolumeMember,setInputSensitivity:sn.setInputSensitivityMember}),na=()=>{},ia="memberList.updated",sa=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(tr),e)),[]).join(".")})((({event:e,namespace:t})=>("string"==typeof e&&(e=(e=>e.replace(ur,(e=>`_${e.toLowerCase()}`)))(e=(({namespace:e,event:t})=>!e||t.startsWith(e)?t:`${e}:${t}`)({event:e,namespace:t}))),e))({event:ia})),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*la({swEventChannel:e,instance:t}){const r=new Map;function*o(e){const o="video.room.joined"===e.type?e.payload.room_session.id:e.payload.room_session_id,n=da({action:e,memberList:r});t.emit(sa,{room_session_id:o,members:n})}for(;;){const t=yield Ue(e,(({type:e})=>ca(e)));yield Fe(o,t)}}const ua=function*({channels:{swEventChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(ia))))(r))return;const{cleanup:o}=((e,t)=>{const r=(e=>Ir(aa).filter((t=>!e.includes(t))))(t);r.forEach((t=>{e.once(t,na)}));const o=({members:t})=>{e.emit(ia,{members:t})};return e.on(sa,o),{cleanup:()=>{e.off(sa,o)}}})(t,r);yield Fe(la,{swEventChannel:e,instance:t}),t.once("destroy",(()=>{o()}))},ha=function*(e){lr().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:o,onDone:n,onFail:i}=e,{swEventChannel:s}=t,{parentId:a}=o;if(!a)throw new Error("Missing parentId for childMemberJoinedWorker");const c=yield Ue(s,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===a)),{member:d}=c.payload;if(d?.parent_id){const e=yield qe(tn.getComponentsById);Object.values(e).find((e=>"memberId"in e&&e.memberId===d.parent_id))?(yield $e(wo.upsert({id:r.callId,roomId:c.payload.room_id,roomSessionId:c.payload.room_session_id,memberId:d.id})),n?.()):i?.({error:new Error("Unknown parent_id")})}lr().trace("childMemberJoinedWorker ended")},pa=function*(e){lr().trace("videoStreamWorker started");const{instance:t,action:{type:r,payload:o},instanceMap:{get:n,set:i,remove:s}}=e;let a=n(o.stream.id);switch(a?a.setPayload(o):a=sn.createRoomSessionStreamObject({store:t.store,payload:o}),i(o.stream.id,a),r){case"video.stream.started":t.emit("stream.started",a);break;case"video.stream.ended":t.emit("stream.ended",a),s(o.stream.id);break;default:lr().warn(`Unknown video.stream event: "${r}"`)}lr().trace("videoStreamWorker ended")},ma=function*(e){lr().trace("videoRecordWorker started");const{instance:t,action:{type:r,payload:o},instanceMap:{get:n,set:i,remove:s}}=e;let a=n(o.recording.id);a?a.setPayload(o):a=sn.createRoomSessionRecordingObject({store:t.store,payload:o}),i(o.recording.id,a);const c=wr(r);switch(r){case"video.recording.started":case"video.recording.updated":t.emit(c,a);break;case"video.recording.ended":t.emit(c,a),s(o.recording.id);break;default:lr().warn(`Unknown video.stream event: "${r}"`)}lr().trace("videoRecordWorker ended")},ga=function*(e){lr().trace("videoPlaybackWorker started");const{instance:t,action:{type:r,payload:o},instanceMap:{get:n,set:i,remove:s}}=e;let a=n(o.playback.id);a?a.setPayload(o):a=sn.createRoomSessionPlaybackObject({store:t.store,payload:o}),i(o.playback.id,a);const c=wr(r);switch(r){case"video.playback.started":case"video.playback.updated":t.emit(c,a);break;case"video.playback.ended":t.emit(c,a),s(o.playback.id);break;default:lr().warn(`Unknown video.stream event: "${r}"`)}lr().trace("videoPlaybackWorker ended")},fa=function*(e){const{channels:t,instance:r}=e,{swEventChannel:o}=t;function*n(t){const{type:o,payload:n}=t;switch(o){case"video.room.subscribed":yield He(Ei.memberPositionWorker,{...e,instance:r,initialState:n});break;case"video.playback.started":case"video.playback.updated":case"video.playback.ended":return void(yield Fe(ga,{action:t,...e}));case"video.recording.started":case"video.recording.updated":case"video.recording.ended":return void(yield Fe(ma,{action:t,...e}));case"video.stream.ended":case"video.stream.started":return void(yield Fe(pa,{action:t,...e}));case"video.room.audience_count":return void r.emit("room.audienceCount",n);case"video.member.talking":{const{member:e}=n;"talking"in e&&(r.emit("member.talking."+(e.talking?"started":"ended"),n),r.emit("member.talking."+(e.talking?"start":"stop"),n));break}}r.emit(wr(o),n)}const i=e=>e.type.startsWith("video.");for(;;){const e=yield Ue(o,i);yield Fe(n,e)}lr().trace("videoWorker ended")},va=_r(class extends zs{_screenShareList=new Set;_deviceList=new Set;_mirrored;_audioEl;constructor(e){super(e),this._mirrored=e.mirrorLocalVideoOverlay,this.runWorker("videoWorker",{worker:fa})}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??[]}))}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:ua})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){return new Promise((async(t,r)=>{const{autoJoin:o=!0,audio:n=!1,video:i=!0,layout:s,positions:a}=e,c=await ls({audio:!0===n?ta:n,video:i}),d={...this.options,screenShare:!0,recoverCall:!1,localStream:c,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId},layout:s,positions:a},l=Fo({store:this.store,Component:ra})(d);c.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{l&&l.active&&l.leave()}))})),l.once("destroy",(()=>{l.emit("room.left"),this._screenShareList.delete(l)}));try{return l.runWorker("childMemberJoinedWorker",{worker:ha,onDone:()=>t(l),onFail:r,initialState:{parentId:this.memberId}}),this._screenShareList.add(l),o?await l.join():t(l)}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:o=!0,audio:n=!1,video:i=!1}=e;if(!n&&!i)throw new TypeError("At least one of `audio` or `video` must be requested.");const s={...this.options,localStream:void 0,remoteStream:void 0,audio:n,video:i,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},a=Fo({store:this.store,Component:oa})(s);a.once("destroy",(()=>{a.emit("room.left"),this._deviceList.delete(a)}));try{return a.runWorker("childMemberJoinedWorker",{worker:ha,onDone:()=>t(a),onFail:r,initialState:{parentId:this.memberId}}),this._deviceList.add(a),o?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}){const t=this._audioEl.sinkId;return this.once(`${er}.speaker.updated`,(async e=>{const r=await Cs(t),o=await Cs(e),n=o?.deviceId===r?.deviceId;o?.deviceId&&!n&&this.emit("speaker.updated",{previous:{deviceId:r?.deviceId,label:r?.label},current:{deviceId:o.deviceId,label:o.label}})})),this.triggerCustomSaga(Qs(e))}_attachSpeakerTrackListener(){Xi()&&Ss().then((e=>{e.on("removed",(async e=>{const t=this._audioEl.sinkId,r=e.changes.find((e=>{const r=e.payload.deviceId;return r===t||""===r&&"default"===t||"default"===r&&""===t}));if(r){this.emit("speaker.disconnected",{deviceId:r.payload.deviceId,label:r.payload.label}),await(this._audioEl.setSinkId?.(""));const e=await Cs("default");if(!e?.deviceId)return;this.emit("speaker.updated",{previous:{deviceId:r.payload.deviceId,label:r.payload.label},current:{deviceId:e.deviceId,label:e.label}})}}))}))}getAudioEl(){return this._audioEl||(this._audioEl=new Audio,this._attachSpeakerTrackListener()),this._audioEl}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()}get localOverlay(){return{mirrored:this._mirrored,setMirrored:e=>{this._mirrored=e,this.emit(`${er}.mirror.video`,this._mirrored)}}}getSubscriptions(){const e=this.eventNames().map((e=>`video.${e}`));return Ir(e)}},{audioMute:sn.audioMuteMember,audioUnmute:sn.audioUnmuteMember,videoMute:sn.videoMuteMember,videoUnmute:sn.videoUnmuteMember,deaf:sn.deafMember,undeaf:sn.undeafMember,setInputVolume:sn.setInputVolumeMember,setOutputVolume:sn.setOutputVolumeMember,setMicrophoneVolume:sn.setInputVolumeMember,setSpeakerVolume:sn.setOutputVolumeMember,setInputSensitivity:sn.setInputSensitivityMember,removeMember:sn.removeMember,removeAllMembers:sn.removeAllMembers,getMembers:sn.getMembers,getLayouts:sn.getLayouts,setLayout:sn.setLayout,setPositions:sn.setPositions,setMemberPosition:sn.setMemberPosition,hideVideoMuted:sn.hideVideoMuted,showVideoMuted:sn.showVideoMuted,getRecordings:sn.getRecordings,startRecording:sn.startRecording,getPlaybacks:sn.getPlaybacks,play:sn.play,setHideVideoMuted:sn.setHideVideoMuted,getMeta:sn.getMeta,setMeta:sn.setMeta,updateMeta:sn.updateMeta,deleteMeta:sn.deleteMeta,getMemberMeta:sn.getMemberMeta,setMemberMeta:sn.setMemberMeta,updateMemberMeta:sn.updateMemberMeta,deleteMemberMeta:sn.deleteMemberMeta,promote:sn.promote,demote:sn.demote,getStreams:sn.getStreams,startStream:sn.startStream,lock:sn.lock,unlock:sn.unlock,setRaisedHand:sn.setRaisedHand,setPrioritizeHandraise:sn.setPrioritizeHandraise}),ya=function*(e){lr().trace("videoManagerRoomsWorker started");const{instance:t,action:{type:r,payload:o}}=e,n={rooms:o.rooms.map((e=>vr(e)))};t.emit(wr(r),n),lr().trace("videoManagerRoomsWorker ended")},ba=function*(e){lr().trace("videoManagerRoomWorker started");const{instance:t,action:{type:r,payload:o}}=e;t.emit(wr(r),vr(o)),lr().trace("videoManagerRoomWorker ended")},_a=function*(e){lr().trace("videoManagerWorker started");const{channels:{swEventChannel:t}}=e;function*r(t){const{type:r}=t;switch(r){case"video-manager.rooms.subscribed":yield Fe(ya,{action:t,...e});break;case"video-manager.room.added":case"video-manager.room.deleted":case"video-manager.room.ended":case"video-manager.room.started":case"video-manager.room.updated":yield Fe(ba,{action:t,...e});break;default:lr().warn(`Unknown video-manager event: "${r}"`)}}for(;;){const e=yield Ue(t,(e=>e.type.startsWith("video-manager.")));yield Fe(r,e)}lr().trace("videoManagerWorker ended")};class wa extends Yo{constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:_a})}getSubscriptions(){const e=this.eventNames().map((e=>`video-manager.${e}`));return Ir(e)}}class Sa extends Xo{_videoManager;_chat;_pubSub;get rooms(){return{makeRoomObject:e=>{const{rootElement:t,applyLocalVideoOverlay:r=!0,stopCameraWhileMuted:o=!0,stopMicrophoneWhileMuted:n=!0,...i}=e,s=[];s.push((({speakerId:e})=>function*({instance:t,runSaga:r}){if("undefined"!=typeof Audio)try{const o=t.getAudioEl();let n;t.on("track",(function(i){"audio"===i.track.kind&&(n=r(Zs,{track:i.track,element:o,speakerId:e,room:t}))})),t.once("destroy",(()=>{n?.cancel()}))}catch(e){lr().error("audioElementSaga",e)}else lr().warn("`Audio` is not supported on this environment.")})({speakerId:i.speakerId})),t&&s.push(Xs({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...i,store:this.store,customSagas:s},Fo({store:c.store,customSagas:c.customSagas,Component:va})(c));var c;return n&&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)}})),o&&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=oi.createBaseChatObject({store:this.store})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=pi.createBasePubSubObject({store:this.store})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=Fo({store:e.store,Component:wa})(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(Fr.reauthAction({token:e}))}}function ka(e){this.message=e}(ka.prototype=new Error).name="InvalidCharacterError";var Ca="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new ka("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,o,n=0,i=0,s="";o=t.charAt(i++);~o&&(r=n%4?64*r+o:o,n++%4)?s+=String.fromCharCode(255&r>>(-2*n&6)):0)o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(o);return s};function Ea(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(Ca(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 Ca(t)}}function Ia(e){this.message=e}function Pa(e,t){if("string"!=typeof e)throw new Ia("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(Ea(e.split(".")[r]))}catch(e){throw new Ia("Invalid token specified: "+e.message)}}(Ia.prototype=new Error).name="InvalidTokenError";const Ta=()=>{if(window&&window.sessionStorage)return window.sessionStorage},Ma=e=>{let t="";try{const r=Pa(e);t=r?.r??""}catch(e){t=""}const r=Boolean(t);return{authStateKey:r&&`as-${t}`,protocolKey:r&&`pt-${t}`,callIdKey:r&&`ci-${t}`}},Ra="function"==typeof CloseEvent?CloseEvent:class{constructor(e,t={}){this.type=e,Zt(this,"code"),Zt(this,"reason"),Zt(this,"wasClean"),this.code=void 0===t.code?0:t.code,this.reason=void 0===t.reason?"":t.reason,this.wasClean=void 0!==t.wasClean&&t.wasClean}};class xa extends yo{options;WebSocketConstructor=WebSocket;CloseEventConstructor=Ra;agent="@signalwire/js/browser/3.25.1";tokenTyp;constructor(e){let t={};try{t=Pa(e.token,{header:!0})}catch(e){}super({...e,host:e.host||t?.ch}),this.options=e,this.tokenTyp=t.typ??"VRT"}get allowReattach(){return!1!==this.options?.reattach&&this.isVRT()}async retrieveRelayProtocol(){if(!this.allowReattach)return"";const{protocolKey:e}=Ma(this.options.token);return e?(this.logger.trace("Search protocol for",e),Ta()?.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowReattach)return;const{protocolKey:e}=Ma(this.options.token);e&&(this.logger.trace("Persist protocol",e,this.relayProtocol),Ta()?.setItem(e,this.relayProtocol))}async retrieveSwAuthorizationState(){const{authStateKey:e}=Ma(this.options.token);return e?Ta()?.getItem(e)??"":""}async persistSwAuthorizationState(e){if(!this.allowReattach)return;const{authStateKey:t}=Ma(this.options.token);t&&(this.logger.trace("Persist auth state",t,e),Ta()?.setItem(t,e))}_onSocketClose(e){if("unknown"===this.status){const{protocolKey:e,authStateKey:t,callIdKey:r}=Ma(this.options.token);this.logger.debug("Cleaning up storage"),e&&(this.logger.debug("Remove protocolKey",e),Ta()?.removeItem(e)),t&&(this.logger.debug("Remove authStateKey",t),Ta()?.removeItem(t)),r&&(this.logger.debug("Remove callIdKey",r),Ta()?.removeItem(r))}super._onSocketClose(e)}isVRT(){return"VRT"===this.tokenTyp}}const Oa=e=>{const t={...e,emitter:Ho()},r=qo({userOptions:t,SessionConstructor:xa});return Fo({store:r,Component:Sa})(t)},Aa={aspectRatio:{ideal:16/9}},ja=e=>new Promise((async(t,r)=>{const{audio:o=!0,video:n=!0,iceServers:i,rootElementId:s,applyLocalVideoOverlay:a=!0,autoJoin:c=!1,stopCameraWhileMuted:d=!0,stopMicrophoneWhileMuted:l=!0,speakerId:u,...h}=e,p=Oa({...h});if(await p.connect(),!p)return;let m;if(s){const e=document.getElementById(s);e?m=e:(m=document.body,lr().warn(`We couldn't find an element with id: ${s}: using 'document.body' instead.`))}const g=p.rooms.makeRoomObject({audio:o,video:!0===n?Aa:n,negotiateAudio:!0,negotiateVideo:!0,iceServers:i,rootElement:m,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:l,speakerId:u});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){lr().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)})),La=["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","lock","unlock"],Da=["member.joined","layout.changed"],Wa=()=>{},Na=function(e){const{audio:t=!0,video:r=!0,iceServers:o,rootElement:n,applyLocalVideoOverlay:i=!0,mirrorLocalVideoOverlay:s=!1,stopCameraWhileMuted:a=!0,stopMicrophoneWhileMuted:c=!0,speakerId:d,destinationNumber:l,localStream:u,watchMediaPackets:h,watchMediaPacketsTimeout:p,...m}=e;["audio","video"].forEach((t=>{t in e&&lr().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const g=!1!==e?.reattach,{callIdKey:f}=Ma(m.token),v={joined:({call_id:e})=>{g&&f&&Ta()?.setItem(f,e)},init:()=>{g&&b.on("room.subscribed",v.joined),b.options.prevCallId=v.getPrevCallId()},destroy:()=>{g&&(b.off("room.subscribed",v.joined),f&&Ta()?.removeItem(f))},getPrevCallId:()=>{if(g&&f)return Ta()?.getItem(f)??void 0}},y=Oa(m),b=y.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:o,rootElement:n,applyLocalVideoOverlay:i,mirrorLocalVideoOverlay:s,stopCameraWhileMuted:a,stopMicrophoneWhileMuted:c,speakerId:d,destinationNumber:l,localStream:u,watchMediaPackets:h,watchMediaPacketsTimeout:p,prevCallId:v.getPrevCallId()});b.once("destroy",(()=>{b.emit("room.left",{reason:b.leaveReason}),v.destroy(),y.disconnect()})),y.session.once("session.disconnected",(()=>{b.destroy()}));const _={join:e=>new Promise((async(o,n)=>{try{b.attachPreConnectWorkers(),await y.connect();const i=e?.audio??t,s=e?.video??r,a=y._sessionAuthState;if(lr().debug("getJoinMediaParams authState?",a),a&&"video"===a.type){const t=(e=>{const{authState:t,audio:r=!0,video:o=!0,sendAudio:n,sendVideo:i,receiveAudio:s,receiveVideo:a}=e;lr().debug("getJoinMediaParams options",{...e});const{audio_allowed:c,video_allowed:d,join_as:l}=t,u="member"===(l??"member"),h=u&&"both"===c,p=u&&"both"===d,m="none"!==c,g="none"!==d,f=Boolean(n??r),v=Boolean(i??o),y=Boolean(s??r),b=Boolean(a??o);return!h&&f&&lr().info("Not allowed to send audio on this room. Default values will be used."),!p&&v&&lr().info("Not allowed to send video on this room. Default values will be used."),!m&&y&&lr().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&lr().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(i),sendVideo:Boolean(s),...e});if(!Object.values(t).some(Boolean))return y.disconnect(),n(new Error(`Invalid arguments to join the room. The token used has join_as: '${a.join_as}'. \n${JSON.stringify(e,null,2)}\n`));lr().debug("Set mediaOptions",t),b.updateMediaOptions({audio:!!t.mustSendAudio&&(i||!0),video:!!t.mustSendVideo&&(s||!0),negotiateAudio:t.mustRecvAudio,negotiateVideo:t.mustRecvVideo})}b.once("room.subscribed",(()=>{o(b)})),v.init(),Da.forEach((e=>b.once(e,Wa))),await b.join()}catch(e){lr().error("RoomSession Join",e),y.disconnect(),n(e)}}))};return new Proxy(b,{get(e,t,r){if(t in _)return _[t];if(!e.active&&La.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:Na,createRoomObject:ja,joinRoom:e=>ja({...e,autoJoin:!0}),createClient:Oa});class Ua{options;httpClient;constructor(e){this.options=e,this.httpClient=Fi({baseUrl:`https://${this.httpHost}`,headers:{Authorization:`Bearer ${this.options.accessToken}`}})}get httpHost(){return this.options.httpHost??"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:n}=await this.httpClient(`${e}${r}`);return o(n)},o=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 o(t)}async registerDevice({deviceType:e,deviceToken:t}){const{body:r}=await this.httpClient("/subscriber/devices",{method:"POST",body:{device_type:e,device_token:t}});return r}async unregisterDevice({id:e}){const t=`/subscriber/devices/${e}`;return await this.httpClient(t,{method:"DELETE"})}}const $a=function*(e){lr().debug("WSClientWorker started");const{channels:t,instance:r}=e,{swEventChannel:o}=t;for(lr().debug("WSClientWorker instance",r);;){const e=yield Ue(o,(e=>(lr().debug("WSClientWorker action",e),"webrtc.message"===e.type&&"verto.invite"===e.payload.method)));lr().debug("Build new call to answer",e)}lr().trace("WSClientWorker ended")};class Ba{options;wsClient;logger=lr();constructor(e){this.options=e,this.wsClient=Oa({host:this.options.host,token:this.options.token,debug:{logWsTraffic:!0},logLevel:"debug"})}connect(){return this.wsClient.runWorker("WSClientWorker",{worker:$a}),this.wsClient.connect()}disconnect(){return this.wsClient.disconnect()}async dial(e){return new Promise((async(t,r)=>{try{console.log("WSClient dial with:",e),await this.connect();const r=this.wsClient.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,rootElement:this.options.rootElement,applyLocalVideoOverlay:!0,stopCameraWhileMuted:!0,stopMicrophoneWhileMuted:!0,destinationNumber:e.to,watchMediaPackets:!1,nodeId:e.nodeId});r.once("destroy",(()=>{this.logger.debug("RTC Connection Destroyed")})),this.wsClient.once("session.disconnected",(()=>{this.logger.debug("Session Disconnected")})),r.attachPreConnectWorkers(),r.start=()=>new Promise((async(e,t)=>{try{r.once("verto.display",(()=>e(r))),r.once("room.subscribed",(()=>e(r))),await r.join()}catch(e){lr().error("WSClient call start",e),t(e)}})),t(r)}catch(e){lr().error("WSClient dial",e),r(e)}}))}handlePushNotification(e){return new Promise((async(t,r)=>{const{decrypted:o,type:n}=e;if("call_invite"!==n)return void this.logger.warn("Unknown notification type",e);this.logger.debug("handlePushNotification",e);const{params:i,node_id:s}=o,{params:{callID:a,sdp:c,caller_id_name:d,caller_id_number:l,callee_id_name:u,callee_id_number:h,display_direction:p}}=i;this.logger.debug("handlePushNotification data",{callID:a,sdp:c,caller_id_name:d,caller_id_number:l,callee_id_name:u,callee_id_number:h,display_direction:p});try{await this.connect();try{await this.executeVertoSubscribe(a,s)}catch(e){this.logger.warn("Verto Subscribe",e)}const e=this.wsClient.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,rootElement:this.options.rootElement,applyLocalVideoOverlay:!0,stopCameraWhileMuted:!0,stopMicrophoneWhileMuted:!0,watchMediaPackets:!1,remoteSdp:c,prevCallId:a,nodeId:s});e.once("destroy",(()=>{lr().debug("RTC Connection Destroyed")})),e.attachPreConnectWorkers(),lr().debug("Resolving Call",e),t({resultType:"inboundCall",resultObject:e})}catch(e){r(e)}}))}async executeVertoSubscribe(e,t){try{return await this.wsClient.execute({method:"webrtc.verto",params:{callID:e,node_id:t,subscribe:[],message:$r({sessid:e,eventChannel:[]})}})}catch(t){throw this.logger.warn("The call is not available anymore",e),t}}updateToken(e){return new Promise(((t,r)=>{this.wsClient.once("session.auth_error",(e=>{r(e)})),this.wsClient.once("session.connected",(()=>{t()})),this.wsClient.reauthenticate(e)}))}}class za{options;httpClient;constructor(e){this.options=e,this.httpClient=Fi({baseUrl:`https://${this.httpHost}`,headers:{Authorization:`Bearer ${this.options.token}`}})}get httpHost(){const{host:e}=this.options;return e?`fabric.${e.split(".").splice(1).join(".")}`:"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:n}=await this.httpClient(`${e}${r}`);return o(n)},o=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 o(t)}async registerDevice({deviceType:e,deviceToken:t}){const{body:r}=await this.httpClient("/subscriber/devices",{method:"POST",body:{device_type:e,device_token:t}});return r}async unregisterDevice({id:e}){const t=`/subscriber/devices/${e}`;return await this.httpClient(t,{method:"DELETE"})}}const Fa=e=>new Promise((async(t,r)=>{try{const r=new za(e),o=new Ba(e);t({httpHost:r.httpHost,getAddresses:r.getAddresses.bind(r),registerDevice:r.registerDevice.bind(r),unregisterDevice:r.unregisterDevice.bind(r),connect:o.connect.bind(o),disconnect:o.disconnect.bind(o),dial:o.dial.bind(o),handlePushNotification:o.handlePushNotification.bind(o),updateToken:o.updateToken.bind(o),__httpClient:r,__wsClient:o})}catch(e){r(e)}}));var Ha=Object.freeze({__proto__:null,Client:class{options;httpClient;constructor(e){this.options=e,this.httpClient=Fi({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:n}=await this.httpClient(`${e}${r}`);return o(n)},o=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 o(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 o,n;if("room"!==e)throw new Error(`Unknown strategy: '${e}'`);o=new Na({token:t.token,debug:{logWsTraffic:!0},logLevel:"debug",watchMediaPackets:!1,...r}),n=e=>new Promise(((t,r)=>(o.once("room.joined",(e=>t(e))),o.emitter.once("verto.display",(e=>t(e))),o.join(e).catch((e=>r(e))))));const i={start:n};return new Proxy(o,{get:(e,t,r)=>t in i?i[t]:Reflect.get(e,t,r)})})({...r,userParams:{host:this.host.includes("swire")?"relay.swire.io":void 0,...t}})}},SWClient:Ua,WSClient:Ba,SignalWire:Fa});const qa=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Ka=Object.freeze({__proto__:null,Client:function(e){const t=Oa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,o,n)=>o in r?r[o]:qa.includes(o)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(o):Reflect.get(e,o,n)})},ChatMember:Ci,ChatMessage:ki});const Ja=["getAllowedChannels","subscribe","publish"];var Ga=Object.freeze({__proto__:null,PubSubMessage:pi.PubSubMessage,Client:function(e){const t=Oa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,o,n)=>o in r?r[o]:Ja.includes(o)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(o):Reflect.get(e,o,n)})}}),Qa=Object.freeze({__proto__:null,getDevices:ps,getCameraDevices:()=>ps("camera"),getMicrophoneDevices:()=>ps("microphone"),getSpeakerDevices:ms,getDevicesWithPermissions:us,getCameraDevicesWithPermissions:()=>us("camera"),getMicrophoneDevicesWithPermissions:()=>us("microphone"),getSpeakerDevicesWithPermissions:()=>us("speaker"),checkPermissions:is,checkCameraPermissions:ss,checkMicrophonePermissions:as,checkSpeakerPermissions:cs,requestPermissions:async e=>{try{const t=await ds(e);Zi(t)}catch(e){throw e}},createDeviceWatcher:ws,createCameraDeviceWatcher:()=>ws({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>ws({targets:["microphone"]}),createSpeakerDeviceWatcher:Ss,supportsMediaDevices:Ki,supportsGetUserMedia:()=>"function"==typeof Ji().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Ji().getDisplayMedia,getUserMedia:ds,getDisplayMedia:ls,enumerateDevices:os,getSupportedConstraints:Gi,supportsMediaOutput:Xi,setMediaElementSinkId:Yi,stopStream:Zi,stopTrack:es,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(ks(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},ds(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Wt,o=new(window.AudioContext||window.webkitAudioContext),n=(e=>{const t=e.createAnalyser();return t.fftSize=64,t.minDecibels=-90,t.maxDecibels=-10,t.smoothingTimeConstant=.85,t})(o);let i,s;try{o.createMediaStreamSource(t).connect(n)}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(n.frequencyBinCount);n.getByteFrequencyData(e);const t=e.reduce(((e,t)=>e+t),0)/20;s!==t&&(s=t,r.emit("volumeChanged",Math.min(s,100))),i=requestAnimationFrame(a)}catch(e){r.emit("destroyed","error")}};i=requestAnimationFrame(a);const c=()=>{i&&cancelAnimationFrame(i),"closed"!==o.state&&o.close().catch((e=>{lr().error("Error closing the AudioContext",e)})),ks(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=Ka,e.Fabric=Ha,e.PubSub=Ga,e.SWClient=Ua,e.SignalWire=Fa,e.Video=Va,e.WebRTC=Qa,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
21
21
|
//# sourceMappingURL=index.umd.js.map
|