@signalwire/js 3.23.2-dev.202307310918.af7072b.0 → 3.23.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.esm.js +1 -1
- package/dist/index.js +1 -1
- package/dist/index.umd.js +2 -2
- package/dist/index.umd.js.map +1 -1
- package/dist/js/src/JWTSession.d.ts.map +1 -1
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -37,4 +37,4 @@ SignalWire JavaScript SDK follows Semantic Versioning 2.0 as defined at <http://
|
|
|
37
37
|
|
|
38
38
|
## License
|
|
39
39
|
|
|
40
|
-
`@signalwire/js` is copyright © 2018-
|
|
40
|
+
`@signalwire/js` is copyright © 2018-2023 [SignalWire](http://signalwire.com). It is free software, and may be redistributed under the terms specified in the [MIT-LICENSE](https://github.com/signalwire/signalwire-js/blob/master/LICENSE) file.
|
package/dist/index.esm.js
CHANGED
|
@@ -1602,7 +1602,7 @@ var JWTSession = class extends BaseJWTSession {
|
|
|
1602
1602
|
this.options = options;
|
|
1603
1603
|
__publicField(this, "WebSocketConstructor", WebSocket);
|
|
1604
1604
|
__publicField(this, "CloseEventConstructor", SwCloseEvent);
|
|
1605
|
-
__publicField(this, "agent", "@signalwire/js/browser/3.23.2
|
|
1605
|
+
__publicField(this, "agent", "@signalwire/js/browser/3.23.2");
|
|
1606
1606
|
__publicField(this, "tokenTyp");
|
|
1607
1607
|
this.tokenTyp = (_a = decodedJwt.typ) != null ? _a : "VRT";
|
|
1608
1608
|
}
|
package/dist/index.js
CHANGED
|
@@ -1606,7 +1606,7 @@ var JWTSession = class extends import_core16.BaseJWTSession {
|
|
|
1606
1606
|
this.options = options;
|
|
1607
1607
|
__publicField(this, "WebSocketConstructor", WebSocket);
|
|
1608
1608
|
__publicField(this, "CloseEventConstructor", SwCloseEvent);
|
|
1609
|
-
__publicField(this, "agent", "@signalwire/js/browser/3.23.2
|
|
1609
|
+
__publicField(this, "agent", "@signalwire/js/browser/3.23.2");
|
|
1610
1610
|
__publicField(this, "tokenTyp");
|
|
1611
1611
|
this.tokenTyp = (_a = decodedJwt.typ) != null ? _a : "VRT";
|
|
1612
1612
|
}
|
package/dist/index.umd.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* SignalWire JS SDK v3.23.2
|
|
2
|
+
* SignalWire JS SDK v3.23.2 (https://signalwire.com)
|
|
3
3
|
* Copyright 2018-2023 SignalWire
|
|
4
4
|
* Licensed under MIT(https://github.com/signalwire/signalwire-js/blob/main/LICENSE)
|
|
5
5
|
*/
|
|
@@ -17,5 +17,5 @@
|
|
|
17
17
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
|
18
18
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
|
19
19
|
PERFORMANCE OF THIS SOFTWARE.
|
|
20
|
-
***************************************************************************** */const na=e=>mr(e.type),oa=function*(e){ur().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o,pubSubChannel:i}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const a=Nn.createCatchableSaga((function*(e){var t,n;const{id:o,method:a,params:c={}}=e.payload,{callID:d,nodeId:l}=c,u=r.getRTCPeerById(d);if(!u)return void ur().warn(`RTCPeer '${d}' not found for method: '${a}'`,c);const h=r.peer;switch(a){case"verto.media":case"verto.answer":u.uuid===(null==h?void 0:h.uuid)&&r.setState("verto.media"===a?"early":"active"),(null==c?void 0:c.sdp)&&u.onRemoteSdp(c.sdp),yield Ue(jn.upsert({id:null===(t=e.payload.params)||void 0===t?void 0:t.callID,nodeId:null===(n=e.payload.params)||void 0===n?void 0:n.nodeId})),yield Be([r,r.execute],{method:r._getRPCMethod(),params:{message:Yr(o,a),node_id:l}});break;case"verto.bye":yield Be([r,r.onVertoBye],{rtcPeerId:d,byeCause:null==c?void 0:c.cause,byeCauseCode:null==c?void 0:c.causeCode,redirectDestination:null==c?void 0:c.redirectDestination}),yield Be([r,r.execute],{method:r._getRPCMethod(),params:{message:Yr(o,a),node_id:l}});break;case"verto.ping":{const{nodeId:e}=c,t=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}(c,["nodeId"]);yield Be([r,r.execute],{method:r._getRPCMethod(),params:{message:Xr(t),node_id:e}});break}case"verto.mediaParams":{if(!d||!c.mediaParams){ur().warn("Invalid mediaParams event",c);break}const{audio:e,video:t}=c.mediaParams;u&&t&&u.applyMediaConstraints("video",t),u&&e&&u.applyMediaConstraints("audio",e);break}case"verto.display":r._attachListeners(""),r.applyEmitterTransforms(),r.setActiveRTCPeer(s),yield Ue(i,{type:"verto.display",payload:e.payload.params});break;default:return ur().warn(`Unknown Verto method: ${a}`,c)}}),(e=>{ur().error("Verto Error",e)}));for(;;){const e=yield Ve(o,(e=>{var t;return!!na(e)&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===s}));yield Fe(a,e)}ur().trace("vertoEventWorker ended")},ia=function*(e){ur().debug("roomSubscribedWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o,pubSubChannel:i}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const a=yield Ve(o,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===s));r._attachListeners(a.payload.room_session.id),r.applyEmitterTransforms(),r.setActiveRTCPeer(s),yield Ue(jn.upsert({id:a.payload.call_id,roomId:a.payload.room_session.room_id,roomSessionId:a.payload.room_session.id,memberId:a.payload.member_id,previewUrl:a.payload.room_session.preview_url})),yield Ue(i,{type:"video.room.joined",payload:a.payload}),ur().debug("roomSubscribedWorker ended",s)},sa=function*(e){ur().debug("promoteDemoteWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:i}=n;if(!i)throw new Error("Missing rtcPeerId for promoteDemoteWorker");const s=yield Ve(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));ur().debug("promoteDemoteWorker:",s.type,s.payload),yield Ue(Pn.updateAuthState(s.payload.authorization));const a=yield ze(hs.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(),ur().debug("promoteDemoteWorker ended",i)},aa=function*(e){ur().debug("sessionAuthWorker started");const{instance:t}=e;switch((yield Ve([Zr.authSuccessAction.type,Zr.authErrorAction.type])).type){case Zr.authSuccessAction.type:yield Be([t,t.resume]);break;case Zr.authErrorAction.type:yield Be([t,t.setState],"hangup")}ur().debug("sessionAuthWorker ended")},ca={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},da=Object.assign(Object.assign({},ca),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),la={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},ua={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:ca,video:la,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3,maxIceGatheringTimeout:5e3,maxConnectionStateTimeout:3e3,watchMediaPackets:!0,watchMediaPacketsTimeout:2e3};class ha extends uo{constructor(e){super(e),this.leaveReason=void 0,this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.resuming=!1,this.onVertoBye=e=>{const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:n="16",redirectDestination:o}=e;this.cause=String(r),this.causeCode=String(n);const i=this.getRTCPeerById(t);return i?o&&i.localSdp?(this.logger.debug("Redirect Destination to:",o,"for RTCPeer:",i.uuid),void this.executeInvite(i.localSdp,i.uuid,o)):(i.onRemoteBye({code:this.causeCode,message:this.cause}),void(this.activeRTCPeerId===(null==i?void 0:i.uuid)&&this.setState("hangup"))):this.logger.warn("Invalid RTCPeer to hangup",e)},this.options=Object.assign(Object.assign({},ua),e),this._checkDefaultMediaConstraints(),this.setState("new"),this.logger.trace("New Call with Options:",this.options),this.applyEmitterTransforms({local:!0}),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(hs.getIceServers)}get component(){return this.select((e=>fo.getComponent(e,this.callId)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:l=!0}=this.options;return{dialogParams:{id:e,destinationNumber:t,attach:r,callerName:n,callerNumber:o,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(!_s(e))return r(new Error("Invalid stream provided."));const n=this.localStream.getAudioTracks(),o=e.getAudioTracks();o.length<=0?this.logger.info("No audio track found in the stream provided. Audio will be unaffected."):(n.forEach((e=>{var t;Es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e)})),o.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(hs.getAuthState);return e&&Nr(e)?"webrtc.verto":"video.message"}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new ra(this,"offer");this.appendRTCPeer(e),this.logger.debug("Run workers for the new RTCPeer",e.uuid),this.runRTCPeerWorkers(e.uuid),this.logger.debug("Trigger start for the new RTCPeer!"),await e.start()}catch(e){this.logger.error("Error building new RTCPeer to promote/demote",e)}}updateCamera(e){return this.updateConstraints({video:Object.assign({aspectRatio:16/9},e)})}updateMicrophone(e){return this.updateConstraints({audio:e})}manageSendersWithConstraints(e){return!1===e.audio&&(this.logger.info("Switching off the microphone"),this.stopOutboundAudio()),!1===e.video&&(this.logger.info("Switching off the camera"),this.stopOutboundVideo()),e.audio||e.video}updateConstraints(e,{attempt:t=0}={}){return t>1?Promise.reject(new Error("Failed to update constraints")):new Promise((async(r,n)=>{var o,i,s;try{if(!this.peer)return n(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return n(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return 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===(o=this.localStream)||void 0===o||o.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 Os(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}),n(e)}await this.updateStream(i),this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),n(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:n}=this.peer,o=e.getTracks();this.logger.debug(`updateStream got ${o.length} tracks`);for(let e=0;e<o.length;e++){const i=o[e];this.logger.debug("updateStream apply track: ",i);const s=n.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),n.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:oa,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:ia,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:sa,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new ra(this,"offer");try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Invite error",e),t(e)}}))}answer(){return new Promise((async(e,t)=>{this.direction="inbound",this.peer||(this.peer=new ra(this,"answer"));try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Answer error",e),t(e)}}))}onLocalSDPReady(e){if(!e.instance.localDescription)throw this.logger.error("Missing localDescription",e),new Error("Invalid RTCPeerConnection localDescription");const{type:t,sdp:r}=e.instance.localDescription,n=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",n),t){case"offer":return this._watchSessionAuth(),!this.resuming&&e.instance.remoteDescription?this.executeUpdateMedia(n,e.uuid):this.executeInvite(n,e.uuid);case"answer":return this.executeAnswer(n,e.uuid);default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}_closeWSConnection(){this._watchSessionAuth(),this.store.dispatch(Zr.sessionForceCloseAction())}_watchSessionAuth(){this.sessionAuthTask&&this.sessionAuthTask.cancel(),this.sessionAuthTask=this.runWorker("sessionAuthWorker",{worker:aa})}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 n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription&&!this.resuming)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const n=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},o=Hr(Object.assign(Object.assign(Object.assign({},this.dialogParams(t)),n),{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:o,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 n=Qr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e})),o=await this.vertoExecute({message:n,callID:t,node_id:null!=r?r:this.options.nodeId,subscribe:this.getSubscriptions()});this.logger.debug("Answer response",o),this.resuming=!1,this._attachListeners(""),this.applyEmitterTransforms(),this.setActiveRTCPeer(t)}catch(e){throw this.setState("hangup"),e}}async executeUpdateMedia(e,t){try{const r=Kr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r,callID:t,node_id:this.nodeId});if(n.sdp||this.logger.error("UpdateMedia invalid SDP answer",n),this.logger.debug("UpdateMedia response",n),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(n.sdp)}catch(e){throw this.logger.error("UpdateMedia error",e),e}}async hangup(e){const t=null!=e?e:this.callId;if(!t)throw new Error("Invalid RTCPeer ID to hangup");try{const e=qr(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=qr(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")}}dtmf(e){const t=this.callId;if(!t)throw new Error("Invalid RTCPeer ID to send DTMF");const r=Gr(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));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.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=la),!0===this.options.audio&&(this.options.audio=this.options.screenShare?da:ca)}_initPeer(){this.peer=new ra(this,this.options.remoteSdp?"answer":"offer")}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear()}}const pa=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{ur().error("Video Element Paused",e,t)}))})),e},ma=({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()}))})),ga=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),fa=({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))},va=({video:e,rootElement:t,paddingWrapper:r})=>{const n=e.videoHeight/e.videoWidth*100,o=function(e,t=0,r){let n=null,o=null;const i=function(){n&&(clearTimeout(n),o=null,n=null)},s=function(){if(!t)return e.apply(this,arguments);const s=this,a=arguments,c=r&&!n;return i(),o=function(){e.apply(s,a)},n=setTimeout((function(){if(n=null,!c){const e=o;return o=null,null==e?void 0:e()}}),t),c&&o?o():void 0};return s.cancel=i,s.flush=function(){const e=o;i(),e&&e()},s}((({width:t,height:o})=>{if(r){const i=o/t*100;r.style.paddingBottom=`${i>n?n:i}%`,r.style.width=((t,r)=>{const n=e.videoWidth/e.videoHeight;return n>t/r?"100%":r*n+"px"})(t,o)}}),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;o({width:t,height:r})}else e.contentRect&&o({width:e.contentRect.width,height:e.contentRect.height})}))}));return{start:()=>i.observe(t),stop:()=>i.disconnect()}},ya=({track:e,element:t})=>(t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()})),t),ba=Zr.createAction("swJs/audioSetSpeakerAction"),_a=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,i=pa(),s={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(ur().debug("Set localOverlay",e),o.set(this.id,e)):(ur().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return ur().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?ur().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):ur().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return ur().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 ur().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:n,localStream:o})=>{ur().debug("Process layout.changed");try{const{layers:i=[]}=r,s=i.find((({member_id:e})=>e===n));let a=e.domElement;if(e.status=s?"visible":"hidden",!s)return ur().debug("Location not found"),void(a&&(ur().debug("Current layer not visible"),e.hide()));if(!a){ur().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=ga(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=n,i.style.height=o,i})({location:s}),a.id=e.id;const r=pa();r.srcObject=o,r.disablePictureInPicture=!0,r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",a.appendChild(r);const n=t.querySelector(".mcuLayers"),i=n?.querySelector(`#${a.id}`);return n&&!i?(ur().debug("Build myLayer append it"),n.appendChild(a),e.domElement=a,void e.setLocalOverlayMirror()):void ur().debug("Build myLayer >> wait next")}const{top:c,left:d,width:l,height:u}=ga(s);ur().debug("Update myLayer:",c,d,l,u);const h=o.getVideoTracks().filter((e=>e.enabled&&"live"===e.readyState)).length>0;h&&e.setLocalOverlayMediaStream(o),a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=l,a.style.height=u}catch(e){ur().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("_internal.mirror.video",(e=>{s.setLocalOverlayMirror(e)})),r.on("layout.changed",(e=>{ur().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){ur().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){ur().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){ur().error("Error handling video_muted",e)}})),r.on("track",(function(r){"video"===r.track.kind&&(u=n(ka,{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),o.clear(),u?.cancel()}))}catch(e){ur().error("videoElementSaga",e)}};function*Sa({element:e,room:t}){const r=Zr.getCustomSagaActionType(t.__uuid,ba);for(;;){const n=yield Ve([r]);try{if(n.type===r){const r=yield Be(ws,e,n.payload);t.emit("_internal.speaker.updated",n.payload),t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:r,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),ur().error(e)}}}function*wa({track:e,element:t,speakerId:r,room:n}){ya({track:e,element:t}),r&&ws(t,r).catch((()=>{})),yield Fe(Sa,{element:t,room:n})}function*ka({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){try{if(fa({element:n,track:r}),n.style.width="100%",n.style.maxHeight="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void ur().debug("MCU Content already there");const o=document.createElement("div");o.style.position="absolute",o.style.top="0",o.style.left="0",o.style.right="0",o.style.bottom="0",o.appendChild(n);const i=document.createElement("div");i.classList.add("paddingWrapper"),i.style.paddingBottom="56.25%",i.style.position="relative",i.style.width="100%",i.appendChild(o);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),ur().debug("MCU readyState 1 >>",n.readyState),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(ur().debug("Wait for the MCU to be ready"),yield Be(ma,{element:n})),ur().debug("MCU is ready..");const c=va({rootElement:e,video:n,paddingWrapper:i});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),s.style.display="block"}catch(e){ur().error("Handle video track error",e)}}const Ea={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},Ca=kr(class extends ha{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:_o.audioMuteMember,audioUnmute:_o.audioUnmuteMember,videoMute:_o.videoMuteMember,videoUnmute:_o.videoUnmuteMember,setMicrophoneVolume:_o.setInputVolumeMember,setInputVolume:_o.setInputVolumeMember,setInputSensitivity:_o.setInputSensitivityMember}),Ta=kr(class extends ha{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:_o.audioMuteMember,audioUnmute:_o.audioUnmuteMember,videoMute:_o.videoMuteMember,videoUnmute:_o.videoUnmuteMember,setInputVolume:_o.setInputVolumeMember,setMicrophoneVolume:_o.setInputVolumeMember,setInputSensitivity:_o.setInputSensitivityMember}),Pa=()=>{},Ia="video.memberList.updated",Ma=_r({event:Ia}),Ra=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(Zt),e)),[]).join(".")})(Ma),xa=["video.room.joined","video.member.joined","video.member.left","video.member.updated"],Aa=e=>xa.includes(e),Oa=({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*ja({pubSubChannel:e}){const t=new Map;function*r(r){const n={room_session_id:"video.room.joined"===r.type?r.payload.room_session.id:r.payload.room_session_id,members:Oa({action:r,memberList:t})};yield Ue(e,{type:Ra,payload:n})}for(;;){const t=yield Ve(e,(({type:e})=>Aa(e)));yield Fe(r,t)}}const La=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(Ma))))(r))return;const{cleanup:n}=((e,t)=>{const r=(e=>jr(xa).filter((t=>!e.includes(t))))(t);r.forEach((t=>{e.once(t,Pa)}));const n=({members:t})=>{e.emit(Ia,{members:t})};return e.on(Ra,n),{cleanup:()=>{e.off(Ra,n)}}})(t,r);yield Fe(ja,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},Da=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield Fe(Gi.memberPositionWorker,e)},Na=function*(e){ur().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:n,onDone:o,onFail:i}=e,{swEventChannel:s}=t,{parentId:a}=n;if(!a)throw new Error("Missing parentId for childMemberJoinedWorker");const c=yield Ve(s,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===a)),{member:d}=c.payload;if(d?.parent_id){const e=yield ze(fo.getComponentsById);Object.values(e).find((e=>"memberId"in e&&e.memberId===d.parent_id))?(r._attachListeners(d.id),r.applyEmitterTransforms(),yield Ue(jn.upsert({id:r.callId,roomId:c.payload.room_id,roomSessionId:c.payload.room_session_id,memberId:d.id})),o?.()):i?.({error:new Error("Unknown parent_id")})}ur().trace("childMemberJoinedWorker ended")},Wa=kr(class extends ha{_screenShareList=new Set;_deviceList=new Set;_mirrored;_audioEl;constructor(e){super(e),this._mirrored=e.mirrorLocalVideoOverlay}get screenShareList(){return Array.from(this._screenShareList)}get deviceList(){return Array.from(this._deviceList)}get interactivityMode(){return this.select((({session:e})=>{const{authState:t}=e;return t?.join_as??""}))}get permissions(){return this.select((({session:e})=>{const{authState:t}=e;return t?.room?.scopes??[]}))}getEmitterTransforms(){return new Map([[["video.room.joined"],{type:"roomSession",instanceFactory:()=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})},playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})},streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[Dr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[Dr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[Dr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>_o.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>yr({...e.recording,room_session_id:this.roomSessionId})}],[[Dr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>_o.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>yr({...e.playback,room_session_id:this.roomSessionId})}],[[Dr("video.stream.list")],{type:"roomSessionStreamList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[Dr("video.stream.start"),"video.stream.started","video.stream.ended"],{type:"roomSessionStream",instanceFactory:e=>_o.createRoomSessionStreamObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>yr({...e.stream,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...Gi.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:La})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:Da,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){return new Promise((async(t,r)=>{const{autoJoin:n=!0,audio:o=!1,video:i=!0,layout:s,positions:a}=e,c=await js({audio:!0===o?Ea:o,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=io({store:this.store,Component:Ca})(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:Na,onDone:()=>t(l),onFail:r,initialState:{parentId:this.memberId}}),this._screenShareList.add(l),n?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:n=!0,audio:o=!1,video:i=!1}=e;if(!o&&!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:o,video:i,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},a=io({store:this.store,Component:Ta})(s);a.once("destroy",(()=>{a.emit("room.left"),this._deviceList.delete(a)}));try{return a.runWorker("childMemberJoinedWorker",{worker:Na,onDone:()=>t(a),onFail:r,initialState:{parentId:this.memberId}}),this._deviceList.add(a),n?await a.join():t(a)}catch(e){this.logger.error("RoomDevice Error",e),r(e)}}))}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){const t=this._audioEl.sinkId;return this.once("_internal.speaker.updated",(async e=>{const r=await Gs(t),n=await Gs(e),o=n?.deviceId===r?.deviceId;n?.deviceId&&!o&&this.emit("speaker.updated",{previous:{deviceId:r?.deviceId,label:r?.label},current:{deviceId:n.deviceId,label:n.label}})})),this.triggerCustomSaga(ba(e))}_attachSpeakerTrackListener(){Ss()&&qs().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 Gs("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,console.log("listener attached!"),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("_internal.mirror.video",this._mirrored)}}}},{audioMute:_o.audioMuteMember,audioUnmute:_o.audioUnmuteMember,videoMute:_o.videoMuteMember,videoUnmute:_o.videoUnmuteMember,deaf:_o.deafMember,undeaf:_o.undeafMember,setInputVolume:_o.setInputVolumeMember,setOutputVolume:_o.setOutputVolumeMember,setMicrophoneVolume:_o.setInputVolumeMember,setSpeakerVolume:_o.setOutputVolumeMember,setInputSensitivity:_o.setInputSensitivityMember,removeMember:_o.removeMember,removeAllMembers:_o.removeAllMembers,getMembers:_o.getMembers,getLayouts:_o.getLayouts,setLayout:_o.setLayout,setPositions:_o.setPositions,setMemberPosition:_o.setMemberPosition,hideVideoMuted:_o.hideVideoMuted,showVideoMuted:_o.showVideoMuted,getRecordings:_o.getRecordings,startRecording:_o.startRecording,getPlaybacks:_o.getPlaybacks,play:_o.play,setHideVideoMuted:_o.setHideVideoMuted,getMeta:_o.getMeta,setMeta:_o.setMeta,updateMeta:_o.updateMeta,deleteMeta:_o.deleteMeta,getMemberMeta:_o.getMemberMeta,setMemberMeta:_o.setMemberMeta,updateMemberMeta:_o.updateMemberMeta,deleteMemberMeta:_o.deleteMemberMeta,promote:_o.promote,demote:_o.demote,getStreams:_o.getStreams,startStream:_o.startStream}),Va=function*(e){ur().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Ve(r,(e=>e.type.startsWith("video-manager.")));yield Ue(n,e)}};class Ua extends po{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:Va})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>yr(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>yr(e)))})}],[["video-manager.room.started","video-manager.room.added","video-manager.room.updated","video-manager.room.ended","video-manager.room.deleted"],{type:"roomSession",instanceFactory:e=>yr(e),payloadTransform:e=>yr(e)}]])}}class $a extends ho{_videoManager;_chat;_pubSub;get rooms(){return{makeRoomObject:e=>{const{rootElement:t,applyLocalVideoOverlay:r=!0,stopCameraWhileMuted:n=!0,stopMicrophoneWhileMuted:o=!0,...i}=e,s=[];s.push((({speakerId:e})=>function*({instance:t,runSaga:r}){if("undefined"!=typeof Audio)try{const n=t.getAudioEl();let o;t.on("track",(function(i){"audio"===i.track.kind&&(o=r(wa,{track:i.track,element:n,speakerId:e,room:t}))})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){ur().error("audioElementSaga",e)}else ur().warn("`Audio` is not supported on this environment.")})({speakerId:i.speakerId})),t&&s.push(_a({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...i,store:this.store,emitter:this.emitter,customSagas:s},io({store:c.store,customSagas:c.customSagas,Component:Wa})(c));var c;return o&&a.on("member.updated.audio_muted",(({member:e})=>{try{e.id===a.memberId&&"audio_muted"in e&&(e.audio_muted?a.stopOutboundAudio():a.restoreOutboundAudio())}catch(e){this.logger.error("Error handling audio_muted",e)}})),n&&a.on("member.updated.video_muted",(({member:e})=>{try{e.id===a.memberId&&"video_muted"in e&&(e.video_muted?a.stopOutboundVideo():a.restoreOutboundVideo())}catch(e){this.logger.error("Error handling video_muted",e)}})),a}}}get chat(){return this._chat||(this._chat=Ci.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=Li.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=io({store:e.store,Component:Ua})(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(Zr.reauthAction({token:e}))}}function Ba(e){this.message=e}(Ba.prototype=new Error).name="InvalidCharacterError";var Fa="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new Ba("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,n,o=0,i=0,s="";n=t.charAt(i++);~n&&(r=o%4?64*r+n:n,o++%4)?s+=String.fromCharCode(255&r>>(-2*o&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return s};function za(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(Fa(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 Fa(t)}}function Ha(e){this.message=e}function qa(e,t){if("string"!=typeof e)throw new Ha("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(za(e.split(".")[r]))}catch(e){throw new Ha("Invalid token specified: "+e.message)}}(Ha.prototype=new Error).name="InvalidTokenError";const Ka=()=>{if(window&&window.sessionStorage)return window.sessionStorage},Ga=e=>{let t="";try{const r=qa(e);t=r?.r??""}catch(e){t=""}const r=Boolean(t);return{authStateKey:r&&`as-${t}`,protocolKey:r&&`pt-${t}`,callIdKey:r&&`ci-${t}`}},Qa="function"==typeof CloseEvent?CloseEvent:Pr;class Ja extends xn{options;WebSocketConstructor=WebSocket;CloseEventConstructor=Qa;agent="@signalwire/js/browser/3.23.2-dev.202307310918.af7072b.0";tokenTyp;constructor(e){let t={};try{t=qa(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}=Ga(this.options.token);return e?(this.logger.trace("Search protocol for",e),Ka()?.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowReattach)return;const{protocolKey:e}=Ga(this.options.token);e&&(this.logger.trace("Persist protocol",e,this.relayProtocol),Ka()?.setItem(e,this.relayProtocol))}async retrieveSwAuthorizationState(){const{authStateKey:e}=Ga(this.options.token);return e?Ka()?.getItem(e)??"":""}async persistSwAuthorizationState(e){if(!this.allowReattach)return;const{authStateKey:t}=Ga(this.options.token);t&&(this.logger.trace("Persist auth state",t,e),Ka()?.setItem(t,e))}_onSocketClose(e){if("unknown"===this.status){const{protocolKey:e,authStateKey:t,callIdKey:r}=Ga(this.options.token);this.logger.debug("Cleaning up storage"),e&&(this.logger.debug("Remove protocolKey",e),Ka()?.removeItem(e)),t&&(this.logger.debug("Remove authStateKey",t),Ka()?.removeItem(t)),r&&(this.logger.debug("Remove callIdKey",r),Ka()?.removeItem(r))}super._onSocketClose(e)}isVRT(){return"VRT"===this.tokenTyp}}const Xa=e=>{const t={...e,emitter:new Lt},r=so({userOptions:t,SessionConstructor:Ja});return io({store:r,Component:$a})(t)},Ya={aspectRatio:{ideal:16/9}},Za=e=>new Promise((async(t,r)=>{const{audio:n=!0,video:o=!0,iceServers:i,rootElementId:s,applyLocalVideoOverlay:a=!0,autoJoin:c=!1,stopCameraWhileMuted:d=!0,stopMicrophoneWhileMuted:l=!0,speakerId:u,...h}=e,p=Xa({...h});if(await p.connect(),!p)return;let m;if(s){const e=document.getElementById(s);e?m=e:(m=document.body,ur().warn(`We couldn't find an element with id: ${s}: using 'document.body' instead.`))}const g=p.rooms.makeRoomObject({audio:n,video:!0===o?Ya:o,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){ur().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)})),ec=["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"],tc=["member.joined","layout.changed"],rc=()=>{},nc=function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,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&&ur().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const g=!1!==e?.reattach,{callIdKey:f}=Ga(m.token),v={joined:({call_id:e})=>{g&&f&&Ka()?.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&&Ka()?.removeItem(f))},getPrevCallId:()=>{if(g&&f)return Ka()?.getItem(f)??void 0}},y=Xa(m),b=y.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,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.once("session.disconnected",(()=>{b.destroy()}));const _={join:e=>new Promise((async(n,o)=>{try{b.attachPreConnectWorkers(),await y.connect();const i=e?.audio??t,s=e?.video??r,a=y._sessionAuthState;if(ur().debug("getJoinMediaParams authState?",a),a&&"video"===a.type){const t=(e=>{const{authState:t,audio:r=!0,video:n=!0,sendAudio:o,sendVideo:i,receiveAudio:s,receiveVideo:a}=e;ur().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(o??r),v=Boolean(i??n),y=Boolean(s??r),b=Boolean(a??n);return!h&&f&&ur().info("Not allowed to send audio on this room. Default values will be used."),!p&&v&&ur().info("Not allowed to send video on this room. Default values will be used."),!m&&y&&ur().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&ur().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(),o(new Error(`Invalid arguments to join the room. The token used has join_as: '${a.join_as}'. \n${JSON.stringify(e,null,2)}\n`));ur().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",(e=>{b.attachOnSubscribedWorkers(e),n(b)})),v.init(),tc.forEach((e=>b.once(e,rc))),await b.join()}catch(e){ur().error("RoomSession Join",e),y.disconnect(),o(e)}}))};return new Proxy(b,{get(e,t,r){if(t in _)return _[t];if(!e.active&&ec.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 oc=Object.freeze({__proto__:null,RoomSession:nc,createRoomObject:Za,joinRoom:e=>Za({...e,autoJoin:!0}),createClient:Xa});class ic{options;httpClient;constructor(e){this.options=e,this.httpClient=ms({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:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async 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 sc=function*(e){ur().debug("WSClientWorker started");const{channels:t,instance:r}=e,{swEventChannel:n}=t;for(ur().debug("WSClientWorker instance",r);;){const e=yield Ve(n,(e=>(ur().debug("WSClientWorker action",e),"webrtc.message"===e.type&&"verto.invite"===e.payload.method)));ur().debug("Build new call to answer",e)}ur().trace("WSClientWorker ended")};class ac{options;wsClient;logger=ur();constructor(e){this.options=e,this.wsClient=Xa({host:this.options.host,token:this.options.token,debug:{logWsTraffic:!0},logLevel:"debug"})}connect(){return this.wsClient.runWorker("WSClientWorker",{worker:sc}),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.emitter.once("verto.display",(()=>e(r))),r.once("room.subscribed",(()=>e(r))),await r.join()}catch(e){ur().error("WSClient call start",e),t(e)}})),t(r)}catch(e){ur().error("WSClient dial",e),r(e)}}))}handlePushNotification(e){return new Promise((async(t,r)=>{const{decrypted:n,type:o}=e;if("call_invite"!==o)return void this.logger.warn("Unknown notification type",e);this.logger.debug("handlePushNotification",e);const{params:i,node_id:s}=n,{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",(()=>{ur().debug("RTC Connection Destroyed")})),e.attachPreConnectWorkers(),ur().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:Jr({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 cc{options;httpClient;constructor(e){this.options=e,this.httpClient=ms({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:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async 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 dc=e=>new Promise((async(t,r)=>{try{const r=new cc(e),n=new ac(e);t({httpHost:r.httpHost,getAddresses:r.getAddresses.bind(r),registerDevice:r.registerDevice.bind(r),unregisterDevice:r.unregisterDevice.bind(r),connect:n.connect.bind(n),disconnect:n.disconnect.bind(n),dial:n.dial.bind(n),handlePushNotification:n.handlePushNotification.bind(n),updateToken:n.updateToken.bind(n),__httpClient:r,__wsClient:n})}catch(e){r(e)}}));var lc=Object.freeze({__proto__:null,Client:class{options;httpClient;constructor(e){this.options=e,this.httpClient=ms({baseUrl:`https://${this.host}`,headers:{Authorization:`Bearer ${this.options.accessToken}`}})}get host(){return this.options.host??"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async createCall({uri:e,...t}){const{body:r}=await this.httpClient("/call",{method:"POST",body:{uri:e}});return console.log("Dial Response",r),(({strategy:e,params:t,userParams:r})=>{let n,o;if("room"!==e)throw new Error(`Unknown strategy: '${e}'`);n=new nc({token:t.token,debug:{logWsTraffic:!0},logLevel:"debug",watchMediaPackets:!1,...r}),o=e=>new Promise(((t,r)=>(n.once("room.joined",(e=>t(e))),n.emitter.once("verto.display",(e=>t(e))),n.join(e).catch((e=>r(e))))));const i={start:o};return new Proxy(n,{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:ic,WSClient:ac,SignalWire:dc});const uc=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var hc=Object.freeze({__proto__:null,ChatMember:Ci.ChatMember,ChatMessage:Ci.ChatMessage,Client:function(e){const t=Xa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,n,o)=>n in r?r[n]:uc.includes(n)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(n):Reflect.get(e,n,o)})}});const pc=["getAllowedChannels","subscribe","publish"];var mc=Object.freeze({__proto__:null,PubSubMessage:Li.PubSubMessage,Client:function(e){const t=Xa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,n,o)=>n in r?r[n]:pc.includes(n)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(n):Reflect.get(e,n,o)})}}),gc=Object.freeze({__proto__:null,getDevices:Ns,getCameraDevices:()=>Ns("camera"),getMicrophoneDevices:()=>Ns("microphone"),getSpeakerDevices:Ws,getDevicesWithPermissions:Ls,getCameraDevicesWithPermissions:()=>Ls("camera"),getMicrophoneDevicesWithPermissions:()=>Ls("microphone"),getSpeakerDevicesWithPermissions:()=>Ls("speaker"),checkPermissions:Ms,checkCameraPermissions:Rs,checkMicrophonePermissions:xs,checkSpeakerPermissions:As,requestPermissions:async e=>{try{const t=await Os(e);ks(t)}catch(e){throw e}},createDeviceWatcher:Hs,createCameraDeviceWatcher:()=>Hs({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>Hs({targets:["microphone"]}),createSpeakerDeviceWatcher:qs,supportsMediaDevices:vs,supportsGetUserMedia:()=>"function"==typeof ys().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof ys().getDisplayMedia,getUserMedia:Os,getDisplayMedia:js,enumerateDevices:Ps,getSupportedConstraints:bs,supportsMediaOutput:Ss,setMediaElementSinkId:ws,stopStream:ks,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},Os(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Lt,n=new(window.AudioContext||window.webkitAudioContext),o=(e=>{const t=e.createAnalyser();return t.fftSize=64,t.minDecibels=-90,t.maxDecibels=-10,t.smoothingTimeConstant=.85,t})(n);let i,s;try{n.createMediaStreamSource(t).connect(o)}catch(e){throw new Error("No audio track found")}t.getAudioTracks().forEach((e=>{e.addEventListener("ended",(()=>{r.emit("destroyed","disconnected")}))}));const a=()=>{try{const e=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(e);const t=e.reduce(((e,t)=>e+t),0)/20;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"!==n.state&&n.close().catch((e=>{ur().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=hc,e.Fabric=lc,e.PubSub=mc,e.SWClient=ic,e.SignalWire=dc,e.Video=oc,e.WebRTC=gc,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
20
|
+
***************************************************************************** */const na=e=>mr(e.type),oa=function*(e){ur().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o,pubSubChannel:i}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const a=Nn.createCatchableSaga((function*(e){var t,n;const{id:o,method:a,params:c={}}=e.payload,{callID:d,nodeId:l}=c,u=r.getRTCPeerById(d);if(!u)return void ur().warn(`RTCPeer '${d}' not found for method: '${a}'`,c);const h=r.peer;switch(a){case"verto.media":case"verto.answer":u.uuid===(null==h?void 0:h.uuid)&&r.setState("verto.media"===a?"early":"active"),(null==c?void 0:c.sdp)&&u.onRemoteSdp(c.sdp),yield Ue(jn.upsert({id:null===(t=e.payload.params)||void 0===t?void 0:t.callID,nodeId:null===(n=e.payload.params)||void 0===n?void 0:n.nodeId})),yield Be([r,r.execute],{method:r._getRPCMethod(),params:{message:Yr(o,a),node_id:l}});break;case"verto.bye":yield Be([r,r.onVertoBye],{rtcPeerId:d,byeCause:null==c?void 0:c.cause,byeCauseCode:null==c?void 0:c.causeCode,redirectDestination:null==c?void 0:c.redirectDestination}),yield Be([r,r.execute],{method:r._getRPCMethod(),params:{message:Yr(o,a),node_id:l}});break;case"verto.ping":{const{nodeId:e}=c,t=function(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}(c,["nodeId"]);yield Be([r,r.execute],{method:r._getRPCMethod(),params:{message:Xr(t),node_id:e}});break}case"verto.mediaParams":{if(!d||!c.mediaParams){ur().warn("Invalid mediaParams event",c);break}const{audio:e,video:t}=c.mediaParams;u&&t&&u.applyMediaConstraints("video",t),u&&e&&u.applyMediaConstraints("audio",e);break}case"verto.display":r._attachListeners(""),r.applyEmitterTransforms(),r.setActiveRTCPeer(s),yield Ue(i,{type:"verto.display",payload:e.payload.params});break;default:return ur().warn(`Unknown Verto method: ${a}`,c)}}),(e=>{ur().error("Verto Error",e)}));for(;;){const e=yield Ve(o,(e=>{var t;return!!na(e)&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===s}));yield Fe(a,e)}ur().trace("vertoEventWorker ended")},ia=function*(e){ur().debug("roomSubscribedWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o,pubSubChannel:i}=t,{rtcPeerId:s}=n;if(!s)throw new Error("Missing rtcPeerId for roomSubscribedWorker");const a=yield Ve(o,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===s));r._attachListeners(a.payload.room_session.id),r.applyEmitterTransforms(),r.setActiveRTCPeer(s),yield Ue(jn.upsert({id:a.payload.call_id,roomId:a.payload.room_session.room_id,roomSessionId:a.payload.room_session.id,memberId:a.payload.member_id,previewUrl:a.payload.room_session.preview_url})),yield Ue(i,{type:"video.room.joined",payload:a.payload}),ur().debug("roomSubscribedWorker ended",s)},sa=function*(e){ur().debug("promoteDemoteWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:i}=n;if(!i)throw new Error("Missing rtcPeerId for promoteDemoteWorker");const s=yield Ve(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===r.memberId));ur().debug("promoteDemoteWorker:",s.type,s.payload),yield Ue(Pn.updateAuthState(s.payload.authorization));const a=yield ze(hs.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(),ur().debug("promoteDemoteWorker ended",i)},aa=function*(e){ur().debug("sessionAuthWorker started");const{instance:t}=e;switch((yield Ve([Zr.authSuccessAction.type,Zr.authErrorAction.type])).type){case Zr.authSuccessAction.type:yield Be([t,t.resume]);break;case Zr.authErrorAction.type:yield Be([t,t.setState],"hangup")}ur().debug("sessionAuthWorker ended")},ca={echoCancellation:!0,noiseSuppression:!0,autoGainControl:!0},da=Object.assign(Object.assign({},ca),{noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1}),la={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},ua={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:ca,video:la,useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3,maxIceGatheringTimeout:5e3,maxConnectionStateTimeout:3e3,watchMediaPackets:!0,watchMediaPacketsTimeout:2e3};class ha extends uo{constructor(e){super(e),this.leaveReason=void 0,this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.resuming=!1,this.onVertoBye=e=>{const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:n="16",redirectDestination:o}=e;this.cause=String(r),this.causeCode=String(n);const i=this.getRTCPeerById(t);return i?o&&i.localSdp?(this.logger.debug("Redirect Destination to:",o,"for RTCPeer:",i.uuid),void this.executeInvite(i.localSdp,i.uuid,o)):(i.onRemoteBye({code:this.causeCode,message:this.cause}),void(this.activeRTCPeerId===(null==i?void 0:i.uuid)&&this.setState("hangup"))):this.logger.warn("Invalid RTCPeer to hangup",e)},this.options=Object.assign(Object.assign({},ua),e),this._checkDefaultMediaConstraints(),this.setState("new"),this.logger.trace("New Call with Options:",this.options),this.applyEmitterTransforms({local:!0}),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(hs.getIceServers)}get component(){return this.select((e=>fo.getComponent(e,this.callId)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:l=!0}=this.options;return{dialogParams:{id:e,destinationNumber:t,attach:r,callerName:n,callerNumber:o,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(!_s(e))return r(new Error("Invalid stream provided."));const n=this.localStream.getAudioTracks(),o=e.getAudioTracks();o.length<=0?this.logger.info("No audio track found in the stream provided. Audio will be unaffected."):(n.forEach((e=>{var t;Es(e),null===(t=this.localStream)||void 0===t||t.removeTrack(e)})),o.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(hs.getAuthState);return e&&Nr(e)?"webrtc.verto":"video.message"}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new ra(this,"offer");this.appendRTCPeer(e),this.logger.debug("Run workers for the new RTCPeer",e.uuid),this.runRTCPeerWorkers(e.uuid),this.logger.debug("Trigger start for the new RTCPeer!"),await e.start()}catch(e){this.logger.error("Error building new RTCPeer to promote/demote",e)}}updateCamera(e){return this.updateConstraints({video:Object.assign({aspectRatio:16/9},e)})}updateMicrophone(e){return this.updateConstraints({audio:e})}manageSendersWithConstraints(e){return!1===e.audio&&(this.logger.info("Switching off the microphone"),this.stopOutboundAudio()),!1===e.video&&(this.logger.info("Switching off the camera"),this.stopOutboundVideo()),e.audio||e.video}updateConstraints(e,{attempt:t=0}={}){return t>1?Promise.reject(new Error("Failed to update constraints")):new Promise((async(r,n)=>{var o,i,s;try{if(!this.peer)return n(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return n(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return 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===(o=this.localStream)||void 0===o||o.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 Os(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}),n(e)}await this.updateStream(i),this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),n(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:n}=this.peer,o=e.getTracks();this.logger.debug(`updateStream got ${o.length} tracks`);for(let e=0;e<o.length;e++){const i=o[e];this.logger.debug("updateStream apply track: ",i);const s=n.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),n.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:oa,initialState:{rtcPeerId:e}}),!this.options.additionalDevice&&!this.options.screenShare&&(this.runWorker("roomSubscribedWorker",{worker:ia,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:sa,initialState:{rtcPeerId:e}}))}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new ra(this,"offer");try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Invite error",e),t(e)}}))}answer(){return new Promise((async(e,t)=>{this.direction="inbound",this.peer||(this.peer=new ra(this,"answer"));try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Answer error",e),t(e)}}))}onLocalSDPReady(e){if(!e.instance.localDescription)throw this.logger.error("Missing localDescription",e),new Error("Invalid RTCPeerConnection localDescription");const{type:t,sdp:r}=e.instance.localDescription,n=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",n),t){case"offer":return this._watchSessionAuth(),!this.resuming&&e.instance.remoteDescription?this.executeUpdateMedia(n,e.uuid):this.executeInvite(n,e.uuid);case"answer":return this.executeAnswer(n,e.uuid);default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}_closeWSConnection(){this._watchSessionAuth(),this.store.dispatch(Zr.sessionForceCloseAction())}_watchSessionAuth(){this.sessionAuthTask&&this.sessionAuthTask.cancel(),this.sessionAuthTask=this.runWorker("sessionAuthWorker",{worker:aa})}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 n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription&&!this.resuming)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const n=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},o=Hr(Object.assign(Object.assign(Object.assign({},this.dialogParams(t)),n),{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:o,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 n=Qr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e})),o=await this.vertoExecute({message:n,callID:t,node_id:null!=r?r:this.options.nodeId,subscribe:this.getSubscriptions()});this.logger.debug("Answer response",o),this.resuming=!1,this._attachListeners(""),this.applyEmitterTransforms(),this.setActiveRTCPeer(t)}catch(e){throw this.setState("hangup"),e}}async executeUpdateMedia(e,t){try{const r=Kr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r,callID:t,node_id:this.nodeId});if(n.sdp||this.logger.error("UpdateMedia invalid SDP answer",n),this.logger.debug("UpdateMedia response",n),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(n.sdp)}catch(e){throw this.logger.error("UpdateMedia error",e),e}}async hangup(e){const t=null!=e?e:this.callId;if(!t)throw new Error("Invalid RTCPeer ID to hangup");try{const e=qr(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=qr(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")}}dtmf(e){const t=this.callId;if(!t)throw new Error("Invalid RTCPeer ID to send DTMF");const r=Gr(Object.assign(Object.assign({},this.dialogParams(t)),{dtmf:e}));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.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=la),!0===this.options.audio&&(this.options.audio=this.options.screenShare?da:ca)}_initPeer(){this.peer=new ra(this,this.options.remoteSdp?"answer":"offer")}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear()}}const pa=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{ur().error("Video Element Paused",e,t)}))})),e},ma=({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()}))})),ga=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),fa=({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))},va=({video:e,rootElement:t,paddingWrapper:r})=>{const n=e.videoHeight/e.videoWidth*100,o=function(e,t=0,r){let n=null,o=null;const i=function(){n&&(clearTimeout(n),o=null,n=null)},s=function(){if(!t)return e.apply(this,arguments);const s=this,a=arguments,c=r&&!n;return i(),o=function(){e.apply(s,a)},n=setTimeout((function(){if(n=null,!c){const e=o;return o=null,null==e?void 0:e()}}),t),c&&o?o():void 0};return s.cancel=i,s.flush=function(){const e=o;i(),e&&e()},s}((({width:t,height:o})=>{if(r){const i=o/t*100;r.style.paddingBottom=`${i>n?n:i}%`,r.style.width=((t,r)=>{const n=e.videoWidth/e.videoHeight;return n>t/r?"100%":r*n+"px"})(t,o)}}),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;o({width:t,height:r})}else e.contentRect&&o({width:e.contentRect.width,height:e.contentRect.height})}))}));return{start:()=>i.observe(t),stop:()=>i.disconnect()}},ya=({track:e,element:t})=>(t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()})),t),ba=Zr.createAction("swJs/audioSetSpeakerAction"),_a=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,i=pa(),s={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(ur().debug("Set localOverlay",e),o.set(this.id,e)):(ur().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return ur().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?ur().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):ur().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return ur().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 ur().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:n,localStream:o})=>{ur().debug("Process layout.changed");try{const{layers:i=[]}=r,s=i.find((({member_id:e})=>e===n));let a=e.domElement;if(e.status=s?"visible":"hidden",!s)return ur().debug("Location not found"),void(a&&(ur().debug("Current layer not visible"),e.hide()));if(!a){ur().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=ga(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=n,i.style.height=o,i})({location:s}),a.id=e.id;const r=pa();r.srcObject=o,r.disablePictureInPicture=!0,r.style.width="100%",r.style.height="100%",r.style.pointerEvents="none",a.appendChild(r);const n=t.querySelector(".mcuLayers"),i=n?.querySelector(`#${a.id}`);return n&&!i?(ur().debug("Build myLayer append it"),n.appendChild(a),e.domElement=a,void e.setLocalOverlayMirror()):void ur().debug("Build myLayer >> wait next")}const{top:c,left:d,width:l,height:u}=ga(s);ur().debug("Update myLayer:",c,d,l,u);const h=o.getVideoTracks().filter((e=>e.enabled&&"live"===e.readyState)).length>0;h&&e.setLocalOverlayMediaStream(o),a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=l,a.style.height=u}catch(e){ur().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("_internal.mirror.video",(e=>{s.setLocalOverlayMirror(e)})),r.on("layout.changed",(e=>{ur().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){ur().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){ur().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){ur().error("Error handling video_muted",e)}})),r.on("track",(function(r){"video"===r.track.kind&&(u=n(ka,{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),o.clear(),u?.cancel()}))}catch(e){ur().error("videoElementSaga",e)}};function*Sa({element:e,room:t}){const r=Zr.getCustomSagaActionType(t.__uuid,ba);for(;;){const n=yield Ve([r]);try{if(n.type===r){const r=yield Be(ws,e,n.payload);t.emit("_internal.speaker.updated",n.payload),t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:r,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),ur().error(e)}}}function*wa({track:e,element:t,speakerId:r,room:n}){ya({track:e,element:t}),r&&ws(t,r).catch((()=>{})),yield Fe(Sa,{element:t,room:n})}function*ka({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){try{if(fa({element:n,track:r}),n.style.width="100%",n.style.maxHeight="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void ur().debug("MCU Content already there");const o=document.createElement("div");o.style.position="absolute",o.style.top="0",o.style.left="0",o.style.right="0",o.style.bottom="0",o.appendChild(n);const i=document.createElement("div");i.classList.add("paddingWrapper"),i.style.paddingBottom="56.25%",i.style.position="relative",i.style.width="100%",i.appendChild(o);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),ur().debug("MCU readyState 1 >>",n.readyState),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(ur().debug("Wait for the MCU to be ready"),yield Be(ma,{element:n})),ur().debug("MCU is ready..");const c=va({rootElement:e,video:n,paddingWrapper:i});c.start(),r.addEventListener("ended",(()=>{c&&c.stop()})),s.style.display="block"}catch(e){ur().error("Handle video track error",e)}}const Ea={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},Ca=kr(class extends ha{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:_o.audioMuteMember,audioUnmute:_o.audioUnmuteMember,videoMute:_o.videoMuteMember,videoUnmute:_o.videoUnmuteMember,setMicrophoneVolume:_o.setInputVolumeMember,setInputVolume:_o.setInputVolumeMember,setInputSensitivity:_o.setInputSensitivityMember}),Ta=kr(class extends ha{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:_o.audioMuteMember,audioUnmute:_o.audioUnmuteMember,videoMute:_o.videoMuteMember,videoUnmute:_o.videoUnmuteMember,setInputVolume:_o.setInputVolumeMember,setMicrophoneVolume:_o.setInputVolumeMember,setInputSensitivity:_o.setInputSensitivityMember}),Pa=()=>{},Ia="video.memberList.updated",Ma=_r({event:Ia}),Ra=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(Zt),e)),[]).join(".")})(Ma),xa=["video.room.joined","video.member.joined","video.member.left","video.member.updated"],Aa=e=>xa.includes(e),Oa=({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*ja({pubSubChannel:e}){const t=new Map;function*r(r){const n={room_session_id:"video.room.joined"===r.type?r.payload.room_session.id:r.payload.room_session_id,members:Oa({action:r,memberList:t})};yield Ue(e,{type:Ra,payload:n})}for(;;){const t=yield Ve(e,(({type:e})=>Aa(e)));yield Fe(r,t)}}const La=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(Ma))))(r))return;const{cleanup:n}=((e,t)=>{const r=(e=>jr(xa).filter((t=>!e.includes(t))))(t);r.forEach((t=>{e.once(t,Pa)}));const n=({members:t})=>{e.emit(Ia,{members:t})};return e.on(Ra,n),{cleanup:()=>{e.off(Ra,n)}}})(t,r);yield Fe(ja,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},Da=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield Fe(Gi.memberPositionWorker,e)},Na=function*(e){ur().trace("childMemberJoinedWorker started");const{channels:t,instance:r,initialState:n,onDone:o,onFail:i}=e,{swEventChannel:s}=t,{parentId:a}=n;if(!a)throw new Error("Missing parentId for childMemberJoinedWorker");const c=yield Ve(s,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===a)),{member:d}=c.payload;if(d?.parent_id){const e=yield ze(fo.getComponentsById);Object.values(e).find((e=>"memberId"in e&&e.memberId===d.parent_id))?(r._attachListeners(d.id),r.applyEmitterTransforms(),yield Ue(jn.upsert({id:r.callId,roomId:c.payload.room_id,roomSessionId:c.payload.room_session_id,memberId:d.id})),o?.()):i?.({error:new Error("Unknown parent_id")})}ur().trace("childMemberJoinedWorker ended")},Wa=kr(class extends ha{_screenShareList=new Set;_deviceList=new Set;_mirrored;_audioEl;constructor(e){super(e),this._mirrored=e.mirrorLocalVideoOverlay}get screenShareList(){return Array.from(this._screenShareList)}get deviceList(){return Array.from(this._deviceList)}get interactivityMode(){return this.select((({session:e})=>{const{authState:t}=e;return t?.join_as??""}))}get permissions(){return this.select((({session:e})=>{const{authState:t}=e;return t?.room?.scopes??[]}))}getEmitterTransforms(){return new Map([[["video.room.joined"],{type:"roomSession",instanceFactory:()=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})},playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})},streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[Dr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[Dr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[Dr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>_o.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>yr({...e.recording,room_session_id:this.roomSessionId})}],[[Dr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>_o.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>yr({...e.playback,room_session_id:this.roomSessionId})}],[[Dr("video.stream.list")],{type:"roomSessionStreamList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{streams:{eventTransformType:"roomSessionStream",processInstancePayload:e=>({stream:e})}}}],[[Dr("video.stream.start"),"video.stream.started","video.stream.ended"],{type:"roomSessionStream",instanceFactory:e=>_o.createRoomSessionStreamObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>yr({...e.stream,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...Gi.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:La})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:Da,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){return new Promise((async(t,r)=>{const{autoJoin:n=!0,audio:o=!1,video:i=!0,layout:s,positions:a}=e,c=await js({audio:!0===o?Ea:o,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=io({store:this.store,Component:Ca})(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:Na,onDone:()=>t(l),onFail:r,initialState:{parentId:this.memberId}}),this._screenShareList.add(l),n?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:n=!0,audio:o=!1,video:i=!1}=e;if(!o&&!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:o,video:i,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.callId,memberId:this.memberId}},a=io({store:this.store,Component:Ta})(s);a.once("destroy",(()=>{a.emit("room.left"),this._deviceList.delete(a)}));try{return a.runWorker("childMemberJoinedWorker",{worker:Na,onDone:()=>t(a),onFail:r,initialState:{parentId:this.memberId}}),this._deviceList.add(a),n?await a.join():t(a)}catch(e){this.logger.error("RoomDevice Error",e),r(e)}}))}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){const t=this._audioEl.sinkId;return this.once("_internal.speaker.updated",(async e=>{const r=await Gs(t),n=await Gs(e),o=n?.deviceId===r?.deviceId;n?.deviceId&&!o&&this.emit("speaker.updated",{previous:{deviceId:r?.deviceId,label:r?.label},current:{deviceId:n.deviceId,label:n.label}})})),this.triggerCustomSaga(ba(e))}_attachSpeakerTrackListener(){Ss()&&qs().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 Gs("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,console.log("listener attached!"),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("_internal.mirror.video",this._mirrored)}}}},{audioMute:_o.audioMuteMember,audioUnmute:_o.audioUnmuteMember,videoMute:_o.videoMuteMember,videoUnmute:_o.videoUnmuteMember,deaf:_o.deafMember,undeaf:_o.undeafMember,setInputVolume:_o.setInputVolumeMember,setOutputVolume:_o.setOutputVolumeMember,setMicrophoneVolume:_o.setInputVolumeMember,setSpeakerVolume:_o.setOutputVolumeMember,setInputSensitivity:_o.setInputSensitivityMember,removeMember:_o.removeMember,removeAllMembers:_o.removeAllMembers,getMembers:_o.getMembers,getLayouts:_o.getLayouts,setLayout:_o.setLayout,setPositions:_o.setPositions,setMemberPosition:_o.setMemberPosition,hideVideoMuted:_o.hideVideoMuted,showVideoMuted:_o.showVideoMuted,getRecordings:_o.getRecordings,startRecording:_o.startRecording,getPlaybacks:_o.getPlaybacks,play:_o.play,setHideVideoMuted:_o.setHideVideoMuted,getMeta:_o.getMeta,setMeta:_o.setMeta,updateMeta:_o.updateMeta,deleteMeta:_o.deleteMeta,getMemberMeta:_o.getMemberMeta,setMemberMeta:_o.setMemberMeta,updateMemberMeta:_o.updateMemberMeta,deleteMemberMeta:_o.deleteMemberMeta,promote:_o.promote,demote:_o.demote,getStreams:_o.getStreams,startStream:_o.startStream}),Va=function*(e){ur().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Ve(r,(e=>e.type.startsWith("video-manager.")));yield Ue(n,e)}};class Ua extends po{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:Va})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>yr(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>yr(e)))})}],[["video-manager.room.started","video-manager.room.added","video-manager.room.updated","video-manager.room.ended","video-manager.room.deleted"],{type:"roomSession",instanceFactory:e=>yr(e),payloadTransform:e=>yr(e)}]])}}class $a extends ho{_videoManager;_chat;_pubSub;get rooms(){return{makeRoomObject:e=>{const{rootElement:t,applyLocalVideoOverlay:r=!0,stopCameraWhileMuted:n=!0,stopMicrophoneWhileMuted:o=!0,...i}=e,s=[];s.push((({speakerId:e})=>function*({instance:t,runSaga:r}){if("undefined"!=typeof Audio)try{const n=t.getAudioEl();let o;t.on("track",(function(i){"audio"===i.track.kind&&(o=r(wa,{track:i.track,element:n,speakerId:e,room:t}))})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){ur().error("audioElementSaga",e)}else ur().warn("`Audio` is not supported on this environment.")})({speakerId:i.speakerId})),t&&s.push(_a({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...i,store:this.store,emitter:this.emitter,customSagas:s},io({store:c.store,customSagas:c.customSagas,Component:Wa})(c));var c;return o&&a.on("member.updated.audio_muted",(({member:e})=>{try{e.id===a.memberId&&"audio_muted"in e&&(e.audio_muted?a.stopOutboundAudio():a.restoreOutboundAudio())}catch(e){this.logger.error("Error handling audio_muted",e)}})),n&&a.on("member.updated.video_muted",(({member:e})=>{try{e.id===a.memberId&&"video_muted"in e&&(e.video_muted?a.stopOutboundVideo():a.restoreOutboundVideo())}catch(e){this.logger.error("Error handling video_muted",e)}})),a}}}get chat(){return this._chat||(this._chat=Ci.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=Li.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=io({store:e.store,Component:Ua})(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(Zr.reauthAction({token:e}))}}function Ba(e){this.message=e}(Ba.prototype=new Error).name="InvalidCharacterError";var Fa="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new Ba("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,n,o=0,i=0,s="";n=t.charAt(i++);~n&&(r=o%4?64*r+n:n,o++%4)?s+=String.fromCharCode(255&r>>(-2*o&6)):0)n="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=".indexOf(n);return s};function za(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(Fa(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 Fa(t)}}function Ha(e){this.message=e}function qa(e,t){if("string"!=typeof e)throw new Ha("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(za(e.split(".")[r]))}catch(e){throw new Ha("Invalid token specified: "+e.message)}}(Ha.prototype=new Error).name="InvalidTokenError";const Ka=()=>{if(window&&window.sessionStorage)return window.sessionStorage},Ga=e=>{let t="";try{const r=qa(e);t=r?.r??""}catch(e){t=""}const r=Boolean(t);return{authStateKey:r&&`as-${t}`,protocolKey:r&&`pt-${t}`,callIdKey:r&&`ci-${t}`}},Qa="function"==typeof CloseEvent?CloseEvent:Pr;class Ja extends xn{options;WebSocketConstructor=WebSocket;CloseEventConstructor=Qa;agent="@signalwire/js/browser/3.23.2";tokenTyp;constructor(e){let t={};try{t=qa(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}=Ga(this.options.token);return e?(this.logger.trace("Search protocol for",e),Ka()?.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowReattach)return;const{protocolKey:e}=Ga(this.options.token);e&&(this.logger.trace("Persist protocol",e,this.relayProtocol),Ka()?.setItem(e,this.relayProtocol))}async retrieveSwAuthorizationState(){const{authStateKey:e}=Ga(this.options.token);return e?Ka()?.getItem(e)??"":""}async persistSwAuthorizationState(e){if(!this.allowReattach)return;const{authStateKey:t}=Ga(this.options.token);t&&(this.logger.trace("Persist auth state",t,e),Ka()?.setItem(t,e))}_onSocketClose(e){if("unknown"===this.status){const{protocolKey:e,authStateKey:t,callIdKey:r}=Ga(this.options.token);this.logger.debug("Cleaning up storage"),e&&(this.logger.debug("Remove protocolKey",e),Ka()?.removeItem(e)),t&&(this.logger.debug("Remove authStateKey",t),Ka()?.removeItem(t)),r&&(this.logger.debug("Remove callIdKey",r),Ka()?.removeItem(r))}super._onSocketClose(e)}isVRT(){return"VRT"===this.tokenTyp}}const Xa=e=>{const t={...e,emitter:new Lt},r=so({userOptions:t,SessionConstructor:Ja});return io({store:r,Component:$a})(t)},Ya={aspectRatio:{ideal:16/9}},Za=e=>new Promise((async(t,r)=>{const{audio:n=!0,video:o=!0,iceServers:i,rootElementId:s,applyLocalVideoOverlay:a=!0,autoJoin:c=!1,stopCameraWhileMuted:d=!0,stopMicrophoneWhileMuted:l=!0,speakerId:u,...h}=e,p=Xa({...h});if(await p.connect(),!p)return;let m;if(s){const e=document.getElementById(s);e?m=e:(m=document.body,ur().warn(`We couldn't find an element with id: ${s}: using 'document.body' instead.`))}const g=p.rooms.makeRoomObject({audio:n,video:!0===o?Ya:o,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){ur().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)})),ec=["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"],tc=["member.joined","layout.changed"],rc=()=>{},nc=function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,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&&ur().warn(`The '${t}' parameter on the RoomSession constructor is deprecated. Set it on the '.join()' function instead.`)}));const g=!1!==e?.reattach,{callIdKey:f}=Ga(m.token),v={joined:({call_id:e})=>{g&&f&&Ka()?.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&&Ka()?.removeItem(f))},getPrevCallId:()=>{if(g&&f)return Ka()?.getItem(f)??void 0}},y=Xa(m),b=y.rooms.makeRoomObject({negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,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.once("session.disconnected",(()=>{b.destroy()}));const _={join:e=>new Promise((async(n,o)=>{try{b.attachPreConnectWorkers(),await y.connect();const i=e?.audio??t,s=e?.video??r,a=y._sessionAuthState;if(ur().debug("getJoinMediaParams authState?",a),a&&"video"===a.type){const t=(e=>{const{authState:t,audio:r=!0,video:n=!0,sendAudio:o,sendVideo:i,receiveAudio:s,receiveVideo:a}=e;ur().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(o??r),v=Boolean(i??n),y=Boolean(s??r),b=Boolean(a??n);return!h&&f&&ur().info("Not allowed to send audio on this room. Default values will be used."),!p&&v&&ur().info("Not allowed to send video on this room. Default values will be used."),!m&&y&&ur().info("Not allowed to receive video from the room. Default values will be used."),!g&&b&&ur().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(),o(new Error(`Invalid arguments to join the room. The token used has join_as: '${a.join_as}'. \n${JSON.stringify(e,null,2)}\n`));ur().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",(e=>{b.attachOnSubscribedWorkers(e),n(b)})),v.init(),tc.forEach((e=>b.once(e,rc))),await b.join()}catch(e){ur().error("RoomSession Join",e),y.disconnect(),o(e)}}))};return new Proxy(b,{get(e,t,r){if(t in _)return _[t];if(!e.active&&ec.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 oc=Object.freeze({__proto__:null,RoomSession:nc,createRoomObject:Za,joinRoom:e=>Za({...e,autoJoin:!0}),createClient:Xa});class ic{options;httpClient;constructor(e){this.options=e,this.httpClient=ms({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:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async 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 sc=function*(e){ur().debug("WSClientWorker started");const{channels:t,instance:r}=e,{swEventChannel:n}=t;for(ur().debug("WSClientWorker instance",r);;){const e=yield Ve(n,(e=>(ur().debug("WSClientWorker action",e),"webrtc.message"===e.type&&"verto.invite"===e.payload.method)));ur().debug("Build new call to answer",e)}ur().trace("WSClientWorker ended")};class ac{options;wsClient;logger=ur();constructor(e){this.options=e,this.wsClient=Xa({host:this.options.host,token:this.options.token,debug:{logWsTraffic:!0},logLevel:"debug"})}connect(){return this.wsClient.runWorker("WSClientWorker",{worker:sc}),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.emitter.once("verto.display",(()=>e(r))),r.once("room.subscribed",(()=>e(r))),await r.join()}catch(e){ur().error("WSClient call start",e),t(e)}})),t(r)}catch(e){ur().error("WSClient dial",e),r(e)}}))}handlePushNotification(e){return new Promise((async(t,r)=>{const{decrypted:n,type:o}=e;if("call_invite"!==o)return void this.logger.warn("Unknown notification type",e);this.logger.debug("handlePushNotification",e);const{params:i,node_id:s}=n,{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",(()=>{ur().debug("RTC Connection Destroyed")})),e.attachPreConnectWorkers(),ur().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:Jr({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 cc{options;httpClient;constructor(e){this.options=e,this.httpClient=ms({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:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async 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 dc=e=>new Promise((async(t,r)=>{try{const r=new cc(e),n=new ac(e);t({httpHost:r.httpHost,getAddresses:r.getAddresses.bind(r),registerDevice:r.registerDevice.bind(r),unregisterDevice:r.unregisterDevice.bind(r),connect:n.connect.bind(n),disconnect:n.disconnect.bind(n),dial:n.dial.bind(n),handlePushNotification:n.handlePushNotification.bind(n),updateToken:n.updateToken.bind(n),__httpClient:r,__wsClient:n})}catch(e){r(e)}}));var lc=Object.freeze({__proto__:null,Client:class{options;httpClient;constructor(e){this.options=e,this.httpClient=ms({baseUrl:`https://${this.host}`,headers:{Authorization:`Bearer ${this.options.accessToken}`}})}get host(){return this.options.host??"fabric.signalwire.com"}async getAddresses(){const e="/addresses",{body:t}=await this.httpClient(e),r=async t=>{const{search:r}=new URL(t),{body:o}=await this.httpClient(`${e}${r}`);return n(o)},n=e=>({addresses:e.data,nextPage:async()=>{const{next:t}=e.links;return t?r(t):void 0},prevPage:async()=>{const{prev:t}=e.links;return t?r(t):void 0}});return n(t)}async createCall({uri:e,...t}){const{body:r}=await this.httpClient("/call",{method:"POST",body:{uri:e}});return console.log("Dial Response",r),(({strategy:e,params:t,userParams:r})=>{let n,o;if("room"!==e)throw new Error(`Unknown strategy: '${e}'`);n=new nc({token:t.token,debug:{logWsTraffic:!0},logLevel:"debug",watchMediaPackets:!1,...r}),o=e=>new Promise(((t,r)=>(n.once("room.joined",(e=>t(e))),n.emitter.once("verto.display",(e=>t(e))),n.join(e).catch((e=>r(e))))));const i={start:o};return new Proxy(n,{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:ic,WSClient:ac,SignalWire:dc});const uc=["subscribe","publish","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var hc=Object.freeze({__proto__:null,ChatMember:Ci.ChatMember,ChatMessage:Ci.ChatMessage,Client:function(e){const t=Xa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.chat,{get:(e,n,o)=>n in r?r[n]:uc.includes(n)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(n):Reflect.get(e,n,o)})}});const pc=["getAllowedChannels","subscribe","publish"];var mc=Object.freeze({__proto__:null,PubSubMessage:Li.PubSubMessage,Client:function(e){const t=Xa(e),r={_session:t,disconnect:()=>t.disconnect()};return new Proxy(t.pubSub,{get:(e,n,o)=>n in r?r[n]:pc.includes(n)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(n):Reflect.get(e,n,o)})}}),gc=Object.freeze({__proto__:null,getDevices:Ns,getCameraDevices:()=>Ns("camera"),getMicrophoneDevices:()=>Ns("microphone"),getSpeakerDevices:Ws,getDevicesWithPermissions:Ls,getCameraDevicesWithPermissions:()=>Ls("camera"),getMicrophoneDevicesWithPermissions:()=>Ls("microphone"),getSpeakerDevicesWithPermissions:()=>Ls("speaker"),checkPermissions:Ms,checkCameraPermissions:Rs,checkMicrophonePermissions:xs,checkSpeakerPermissions:As,requestPermissions:async e=>{try{const t=await Os(e);ks(t)}catch(e){throw e}},createDeviceWatcher:Hs,createCameraDeviceWatcher:()=>Hs({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>Hs({targets:["microphone"]}),createSpeakerDeviceWatcher:qs,supportsMediaDevices:vs,supportsGetUserMedia:()=>"function"==typeof ys().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof ys().getDisplayMedia,getUserMedia:Os,getDisplayMedia:js,enumerateDevices:Ps,getSupportedConstraints:bs,supportsMediaOutput:Ss,setMediaElementSinkId:ws,stopStream:ks,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},Os(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Lt,n=new(window.AudioContext||window.webkitAudioContext),o=(e=>{const t=e.createAnalyser();return t.fftSize=64,t.minDecibels=-90,t.maxDecibels=-10,t.smoothingTimeConstant=.85,t})(n);let i,s;try{n.createMediaStreamSource(t).connect(o)}catch(e){throw new Error("No audio track found")}t.getAudioTracks().forEach((e=>{e.addEventListener("ended",(()=>{r.emit("destroyed","disconnected")}))}));const a=()=>{try{const e=new Uint8Array(o.frequencyBinCount);o.getByteFrequencyData(e);const t=e.reduce(((e,t)=>e+t),0)/20;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"!==n.state&&n.close().catch((e=>{ur().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=hc,e.Fabric=lc,e.PubSub=mc,e.SWClient=ic,e.SignalWire=dc,e.Video=oc,e.WebRTC=gc,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
21
21
|
//# sourceMappingURL=index.umd.js.map
|