@signalwire/js 3.14.0-dev.202208170849.eff4736.0 → 3.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -1230,7 +1230,7 @@ var JWTSession = class extends BaseJWTSession {
1230
1230
  }));
1231
1231
  this.options = options;
1232
1232
  __publicField(this, "WebSocketConstructor", WebSocket);
1233
- __publicField(this, "agent", "@signalwire/js/browser/3.14.0-dev.202208170849.eff4736.0");
1233
+ __publicField(this, "agent", "@signalwire/js/browser/3.14.0");
1234
1234
  }
1235
1235
  get allowHijack() {
1236
1236
  return this.options._hijack;
package/dist/index.js CHANGED
@@ -1232,7 +1232,7 @@ var JWTSession = class extends import_core14.BaseJWTSession {
1232
1232
  }));
1233
1233
  this.options = options;
1234
1234
  __publicField(this, "WebSocketConstructor", WebSocket);
1235
- __publicField(this, "agent", "@signalwire/js/browser/3.14.0-dev.202208170849.eff4736.0");
1235
+ __publicField(this, "agent", "@signalwire/js/browser/3.14.0");
1236
1236
  }
1237
1237
  get allowHijack() {
1238
1238
  return this.options._hijack;
package/dist/index.umd.js CHANGED
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * SignalWire JS SDK v3.14.0-dev.202208170849.eff4736.0 (https://signalwire.com)
2
+ * SignalWire JS SDK v3.14.0 (https://signalwire.com)
3
3
  * Copyright 2018-2022 SignalWire
4
4
  * Licensed under MIT(https://github.com/signalwire/signalwire-js/blob/main/LICENSE)
5
5
  */
@@ -17,5 +17,5 @@
17
17
  LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
18
18
  OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19
19
  PERFORMANCE OF THIS SOFTWARE.
20
- ***************************************************************************** */function hs(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}const ps=function*(e){Yt().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:i}=n;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");for(;;){const e=yield Ae(o,(e=>{var t;return"webrtc.message"===e.type&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===i})),{id:t,method:n,params:s={}}=e.payload,{callID:a,nodeId:c}=s,d=r.getRTCPeerById(a);if(!d){Yt().warn(`RTCPeer '${a}' not found for method: '${n}'`,s);continue}const u=r.peer;switch(n){case"verto.media":case"verto.answer":d.uuid===(null==u?void 0:u.uuid)&&r.setState("verto.media"===n?"early":"active"),(null==s?void 0:s.sdp)&&d.onRemoteSdp(s.sdp),yield xe(Or.executeAction({method:"video.message",params:{message:Mr(t,n),node_id:c}}));break;case"verto.bye":yield Le(r.onVertoBye,{rtcPeerId:a,byeCause:null==s?void 0:s.cause,byeCauseCode:null==s?void 0:s.causeCode,redirectDestination:null==s?void 0:s.redirectDestination}),yield xe(Or.executeAction({method:"video.message",params:{message:Mr(t,n),node_id:c}}));break;case"verto.ping":{const{nodeId:e}=s,t=hs(s,["nodeId"]);yield xe(Or.executeAction({method:"video.message",params:{message:Pr(t),node_id:e}}));break}case"verto.mediaParams":{if(!a||!s.mediaParams){Yt().warn("Invalid mediaParams event",s);break}const{audio:e,video:t}=s.mediaParams;d&&t&&d.applyMediaConstraints("video",t),d&&e&&d.applyMediaConstraints("audio",e);break}default:return Yt().warn(`Unknown Verto method: ${n}`,s)}}Yt().trace("vertoEventWorker ended")},ms=function*(e){Yt().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 Ae(o,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===s)),c=a.payload.member_id,d=a.payload.room_session.id;if(r.options.additionalDevice||r.options.screenShare){if(!c)throw new Error("[roomSubscribedWorker] missing memberId");r._attachListeners(c)}else{if(!d)throw new Error("[roomSubscribedWorker] missing roomSessionId");r._attachListeners(d)}r.applyEmitterTransforms(),r.setActiveRTCPeer(s),yield xe(pn.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 xe(i,{type:"video.room.joined",payload:a.payload}),Yt().debug("roomSubscribedWorker ended",s)},fs=function*(e){Yt().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 Ae(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===i));Yt().debug("promoteDemoteWorker:",s.type,s.payload);const a="video.member.promoted"===s.type;yield xe(on.updateAuthState(s.payload.authorization));const c=yield De(Oi.getAuthState);if(!c)throw new Error(`Invalid authState for '${s.type}'`);r.updateMediaOptions({audio:a&&"none"!==c.audio_allowed,video:a&&"none"!==c.video_allowed,negotiateAudio:!0,negotiateVideo:!0}),r._triggerNewRTCPeer(),Yt().debug("promoteDemoteWorker ended",i)},gs={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:!0,video:{aspectRatio:16/9},useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3};class vs extends Yn{constructor(e){super(e),this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.onVertoBye=e=>{const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:n="16",redirectDestination:o}=e;this.cause=String(r),this.causeCode=String(n);const 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({},gs),e),this.setState("new"),this.logger.debug("New Call with Options:",this.options),this.applyEmitterTransforms({local:!0})}get id(){return this.__uuid}get active(){return"active"===this.state}get trying(){return"trying"===this.state}get memberId(){return this.component.memberId}get previewUrl(){return this.component.previewUrl}get roomId(){return this.component.roomId}get roomSessionId(){return this.component.roomSessionId}get localStream(){var e;return null===(e=this.peer)||void 0===e?void 0:e.localStream}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(Oi.getIceServers)}get component(){var e,t;const r=null!==(t=null===(e=this.peer)||void 0===e?void 0:e.uuid)&&void 0!==t?t:"";return this.select((e=>qn.getComponent(e,r)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:u=!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:u}}}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){var t;if(e){if(this.logger.debug("Set RTCPeer",e.uuid,e),this.rtcPeerMap.set(e.uuid,e),this.peer&&(null===(t=this.peer)||void 0===t?void 0:t.uuid)!==e.uuid){const e=this.peer.uuid;this.logger.info(">>> Stop old RTCPeer",e),this.hangup(e).then(console.warn).catch(console.error),this.peer.detachAndStop()}this.logger.info(">>> 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.rtcPeerMap.get(e)}vertoExecute(e){return this.execute({method:"video.message",params:e})}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new ls(this,"offer");this.appendRTCPeer(e),this.logger.debug("Run workers for the new RTCPeer",e.uuid),this.runRTCPeerWorkers(e.uuid),this.logger.debug("Trigger start for the new RTCPeer!"),await e.start()}catch(e){this.logger.error("Error building new RTCPeer to promote/demote",e)}}updateCamera(e){return this.updateConstraints({video:Object.assign({aspectRatio:16/9},e)})}updateMicrophone(e){return this.updateConstraints({audio:e})}manageSendersWithConstraints(e){return!1===e.audio&&(this.logger.info("Switching off the microphone"),this.stopOutboundAudio()),!1===e.video&&(this.logger.info("Switching off the camera"),this.stopOutboundVideo()),e.audio||e.video}updateConstraints(e,{attempt:t=0}={}){return t>1?Promise.reject(new Error("Failed to update constraints")):new Promise((async(r,n)=>{var o;try{if(!this.peer)return n(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return n(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return void this.logger.debug("Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped");let i;try{i=await Ji(e)}catch(i){if(i instanceof DOMException&&"Concurrent mic process limit."===i.message){let n={};null===(o=this.options.localStream)||void 0===o||o.getTracks().forEach((t=>{var r;n[t.kind]=t.getConstraints(),void 0!==e[t.kind]&&(this.logger.debug("updateConstraints stop old tracks to retrieve new ones"),Wi(t),null===(r=this.options.localStream)||void 0===r||r.removeTrack(t))}));try{return r(this.updateConstraints(e,{attempt:t+1}))}catch(e){return this.logger.error("Restoring previous constraints"),r(this.updateConstraints(n,{attempt:t+1}))}}return this.logger.error("updateConstraints",i),n(i)}this.logger.debug("updateConstraints got stream",i),this.options.localStream||(this.options.localStream=new MediaStream);const{instance:s}=this.peer,a=i.getTracks();this.logger.debug(`updateConstraints got ${a.length} tracks`);for(let e=0;e<a.length;e++){const t=a[e];this.logger.debug("updateConstraints apply track: ",t);const r=s.getTransceivers().find((({mid:e,sender:r,receiver:n})=>r.track&&r.track.kind===t.kind?(this.logger.debug("Found transceiver by sender"),!0):n.track&&n.track.kind===t.kind?(this.logger.debug("Found transceiver by receiver"),!0):null===e&&(this.logger.debug("Found disassociated transceiver"),!0)));r&&r.sender?(this.logger.debug("updateConstraints got transceiver",r.currentDirection,r.mid),await r.sender.replaceTrack(t),this.logger.debug("updateConstraints replaceTrack"),r.direction="sendrecv",this.logger.debug("updateConstraints set to sendrecv"),this.options.localStream.getTracks().forEach((e=>{var r;e.kind===t.kind&&e.id!==t.id&&(this.logger.debug("updateConstraints stop old track and apply new one - "),Wi(e),null===(r=this.options.localStream)||void 0===r||r.removeTrack(e))})),this.options.localStream.addTrack(t)):(this.logger.debug("updateConstraints no transceiver found. addTrack and start dancing!"),this.peer.type="offer",this.doReinvite=!0,this.options.localStream.addTrack(t),s.addTrack(t,this.options.localStream)),this.logger.debug("updateConstraints simply update mic/cam"),"audio"===t.kind?this.options.micId=t.getSettings().deviceId:"video"===t.kind&&(this.options.camId=t.getSettings().deviceId)}this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),n(e)}}))}runRTCPeerWorkers(e){this.runWorker("vertoEventWorker",{worker:ps,initialState:{rtcPeerId:e}}),this.runWorker("roomSubscribedWorker",{worker:ms,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:fs,initialState:{rtcPeerId:e}})}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new ls(this,"offer");try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Invite error",e),t(e)}}))}answer(){return new Promise((async(e,t)=>{this.direction="inbound",this.peer=new ls(this,"answer");try{await this.peer.start(),e(this)}catch(e){this.logger.error("Answer error",e),t(e)}}))}onLocalSDPReady(e){if(!e.instance.localDescription)throw this.logger.error("Missing localDescription",e),new Error("Invalid RTCPeerConnection localDescription");const{type:t,sdp:r}=e.instance.localDescription,n=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",n),t){case"offer":return e.instance.remoteDescription?this.executeUpdateMedia(n,e.uuid):this.executeInvite(n,e.uuid);case"answer":this.logger.warn("Unhandled verto.answer");break;default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}async executeInvite(e,t,r){const n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const n=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},o=Er(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,node_id:r,subscribe:i});this.logger.debug("Invite response",s)}catch(e){throw this.setState("hangup"),e.jsonrpc}}async executeUpdateMedia(e,t){try{const r=Tr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r});if(n.sdp||this.logger.error("UpdateMedia invalid SDP answer",n),this.logger.debug("UpdateMedia response",n),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(n.sdp)}catch(e){throw this.logger.error("UpdateMedia error",e),e.jsonrpc}}async hangup(e){var t,r,n;const o=null!=e?e:null===(t=this.peer)||void 0===t?void 0:t.uuid;if(!o)throw new Error("Invalid RTCPeer ID to hangup");try{const e=Cr(this.dialogParams(o));await this.vertoExecute({message:e})}catch(e){this.logger.error("Hangup error:",e)}finally{if(o!==(null===(r=this.peer)||void 0===r?void 0:r.uuid))return this.logger.warn("Prevent setState hangup",o,null===(n=this.peer)||void 0===n?void 0:n.uuid);this.setState("hangup")}}dtmf(e){var t;const r=null===(t=this.peer)||void 0===t?void 0:t.uuid;if(!r)throw new Error("Invalid RTCPeer ID to send DTMF");const n=Ir(Object.assign(Object.assign({},this.dialogParams(r)),{dtmf:e}));this.vertoExecute({message:n})}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.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this.emit(this.state,this),e){case"purge":this._finalize();break;case"hangup":this.setState("destroy");break;case"destroy":this._finalize()}}updateMediaOptions(e){this.options=Object.assign(Object.assign({},this.options),e)}_mungeSDP(e){return e}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear(),this.destroy()}}const ys=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{Yt().error("Video Element Paused",e,t)}))})),e},bs=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),_s=Or.createAction("swJs/audioSetSpeakerAction"),ws=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,i=ys(),s={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(Yt().debug("Set localOverlay",e),o.set(this.id,e)):(Yt().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return Yt().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?Yt().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):Yt().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return Yt().warn("Missing localOverlay to set the local overlay stream");const t=this.domElement.querySelector("video");t&&(t.srcObject=e)}},a=(({localOverlay:e,rootElement:t})=>async({layout:r,myMemberId:n,localStream:o})=>{Yt().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 Yt().debug("Location not found"),void(a&&(Yt().debug("Current layer not visible"),e.hide()));if(!a){Yt().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=bs(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=ys();r.srcObject=o,r.style.width="100%",r.style.height="100%",a.appendChild(r);const n=t.querySelector(".mcuLayers"),i=n?.querySelector(`#${a.id}`);return void(n&&!i&&(n.appendChild(a),e.domElement=a))}const{top:c,left:d,width:u,height:l}=bs(s);Yt().debug("Update myLayer:",c,d,u,l);const h=o.getVideoTracks().length>0;a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=u,a.style.height=l}catch(e){Yt().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:s});let c;r.on("layout.changed",(e=>{Yt().debug("Received layout.changed"),r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):s.hide()})),r.once("room.subscribed",(e=>{const t=e.room_session.members?.find((e=>e.id===r.memberId));if(t?.audio_muted)try{r.stopOutboundAudio()}catch(e){Yt().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){Yt().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){Yt().error("Error handling video_muted",e)}})),r.on("track",(function(r){switch(r.track.kind){case"video":c=n(Es,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:i})}})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),o.clear(),c?.cancel()}))}catch(e){Yt().error("videoElementSaga",e)}};function*Ss({element:e,room:t}){const r=Or.getCustomSagaActionType(t.__uuid,_s);for(;;){const n=yield Ae([r]);try{switch(n.type){case r:const o=yield Le(Ni,e,n.payload);t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:o,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),Yt().error(e)}}}function*ks({track:e,element:t,speakerId:r,room:n}){(({track:e,element:t})=>{t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({track:e,element:t}),r&&Ni(t,r).catch((()=>{})),yield Ne(Ss,{element:t,room:n})}function*Es({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){(async r=>{if((({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({element:n,track:r}),n.style.width="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void Yt().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.style.paddingBottom="56.25%",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.margin="0 auto",a.appendChild(i);const c=document.createElement("div");c.style.display="flex",c.style.alignItems="center",c.style.justifyContent="center",c.appendChild(a),e.appendChild(c),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(Yt().debug("Wait for the MCU to be ready"),await(({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()}))})))({element:n})),s.style.display="block"})(r).catch((e=>{Yt().error("Handle video track error",e)}))}const Cs={errors:"onError",responses:"onSuccess"},Ts={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},Is=sr(class extends vs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:no.audioMuteMember,audioUnmute:no.audioUnmuteMember,videoMute:no.videoMuteMember,videoUnmute:no.videoUnmuteMember,setMicrophoneVolume:no.setInputVolumeMember,setInputVolume:no.setInputVolumeMember,setInputSensitivity:no.setInputSensitivityMember}),Ps=sr(class extends vs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:no.audioMuteMember,audioUnmute:no.audioUnmuteMember,videoMute:no.videoMuteMember,videoUnmute:no.videoUnmuteMember,setInputVolume:no.setInputVolumeMember,setMicrophoneVolume:no.setInputVolumeMember,setInputSensitivity:no.setInputSensitivityMember}),Ms=()=>{},Os="video.memberList.updated",Rs=or({event:Os}),As=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(Bt),e)),[]).join(".")})(Rs),xs=["video.room.joined","video.member.joined","video.member.left","video.member.updated"];function*js({pubSubChannel:e}){const t=new Map;function*r(r){const n={room_session_id:"video.room.joined"===r.type?r.payload.room_session.id:r.payload.room_session_id,members:(({action:e,memberList:t})=>{const r=(e=>"video.room.joined"===e.type?e.payload.room_session.members:[e.payload.member])(e);switch(e.type){case"video.member.left":r.forEach((e=>{t.delete(e.id)}));break;default:r.forEach((e=>{t.set(e.id,e)}))}return Array.from(t.values())})({action:r,memberList:t})};yield xe(e,{type:As,payload:n})}for(;;){const t=yield Ae(e,(({type:e})=>xs.includes(e)));yield Ne(r,t)}}const Ls=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(Rs))))(r))return;const{cleanup:n}=((e,t)=>{(e=>mr(xs).filter((t=>!e.includes(t))))(t).forEach((t=>{e.once(t,Ms)}));const r=({members:t})=>{e.emit(Os,{members:t})};return e.on(As,r),{cleanup:()=>{e.off(As,r)}}})(t,r);yield Ne(js,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},Ns=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield Ne(mi.memberPositionWorker,e)},Ds=function*(e){Yt().trace("childMemberJoinedWorker started");const{channels:t,initialState:r}=e,{swEventChannel:n}=t,{parentId:o}=r;if(!o)throw new Error("Missing parentId for roomSubscribedWorker");const i=yield Ae(n,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===o)),{member:s}=i.payload;s?.parent_id&&(yield De(qn.getComponent,s.parent_id))&&(yield xe(pn.upsert({id:s.id,roomId:i.payload.room_id,roomSessionId:i.payload.room_session_id,memberId:s.id}))),Yt().trace("childMemberJoinedWorker ended")},Ws=sr(class extends vs{_screenShareList=new Set;_deviceList=new Set;get screenShareList(){return Array.from(this._screenShareList)}get deviceList(){return Array.from(this._deviceList)}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})}}}],[[gr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[gr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[gr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>no.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>tr({...e.recording,room_session_id:this.roomSessionId})}],[[gr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>no.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>tr({...e.playback,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...mi.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:Ls})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:Ns,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!0,layout:o,positions:i}=e,s=await Qi({audio:!0===r?Ts:r,video:n}),a={...this.options,screenShare:!0,recoverCall:!1,localStream:s,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.memberId,memberId:this.memberId},layout:o,positions:i},c=Qn({store:this.store,Component:Is,componentListeners:Cs})(a);s.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{c&&c.active&&c.leave()}))})),c.on("destroy",(()=>{this._screenShareList.delete(c)}));try{return this.runWorker("childMemberJoinedWorker",{worker:Ds,initialState:{parentId:this.memberId}}),this._screenShareList.add(c),t&&await c.join(),c}catch(e){throw this.logger.error("ScreenShare Error",e),e}}addCamera(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,video:r})}addMicrophone(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,audio:r})}async addDevice(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!1}=e;if(!r&&!n)throw new TypeError("At least one of `audio` or `video` must be requested.");const o={...this.options,localStream:void 0,remoteStream:void 0,audio:r,video:n,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.memberId,memberId:this.memberId}},i=Qn({store:this.store,Component:Ps,componentListeners:Cs})(o);i.on("destroy",(()=>{this._deviceList.delete(i)}));try{return this.runWorker("childMemberJoinedWorker",{worker:Ds,initialState:{parentId:this.memberId}}),this._deviceList.add(i),t&&await i.join(),i}catch(e){throw this.logger.error("RoomDevice Error",e),e}}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){return this.triggerCustomSaga(_s(e))}async hangup(e){return this._screenShareList.forEach((e=>{e.leave()})),this._deviceList.forEach((e=>{e.leave()})),super.hangup(e)}_finalize(){this._screenShareList.clear(),this._deviceList.clear(),super._finalize()}getLayoutList(){return this.getLayouts()}getMemberList(){return this.getMembers()}},{audioMute:no.audioMuteMember,audioUnmute:no.audioUnmuteMember,videoMute:no.videoMuteMember,videoUnmute:no.videoUnmuteMember,deaf:no.deafMember,undeaf:no.undeafMember,setInputVolume:no.setInputVolumeMember,setOutputVolume:no.setOutputVolumeMember,setMicrophoneVolume:no.setInputVolumeMember,setSpeakerVolume:no.setOutputVolumeMember,setInputSensitivity:no.setInputSensitivityMember,removeMember:no.removeMember,removeAllMembers:no.removeAllMembers,getMembers:no.getMembers,getLayouts:no.getLayouts,setLayout:no.setLayout,setPositions:no.setPositions,setMemberPosition:no.setMemberPosition,hideVideoMuted:no.hideVideoMuted,showVideoMuted:no.showVideoMuted,getRecordings:no.getRecordings,startRecording:no.startRecording,getPlaybacks:no.getPlaybacks,play:no.play,setHideVideoMuted:no.setHideVideoMuted,setMeta:no.setMeta,updateMeta:no.updateMeta,deleteMeta:no.deleteMeta,setMemberMeta:no.setMemberMeta,updateMemberMeta:no.updateMemberMeta,deleteMemberMeta:no.deleteMemberMeta,promote:no.promote,demote:no.demote}),Us=function*(e){Yt().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Ae(r,(e=>e.type.startsWith("video-manager.")));yield xe(n,e)}};class Vs extends eo{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:Us})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>tr(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>tr(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=>tr(e),payloadTransform:e=>tr(e)}]])}}class $s extends Zn{_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=new Audio;let o;t.on("track",(function(i){switch(i.track.kind){case"audio":o=r(ks,{track:i.track,element:n,speakerId:e,room:t})}})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){Yt().error("audioElementSaga",e)}else Yt().warn("`Audio` is not supported on this environment.")})({speakerId:i.speakerId})),t&&s.push(ws({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...i,store:this.store,emitter:this.emitter,customSagas:s},Qn({store:c.store,customSagas:c.customSagas,Component:Ws,componentListeners:Cs})(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=Ho.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=ri.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=Qn({store:e.store,Component:Vs,componentListeners:{errors:"onError",responses:"onSuccess"}})(e);return new Proxy(t,{get:(e,t,r)=>"_eventsNamespace"===t?"":"eventChannel"===t?"video-manager.rooms":Reflect.get(e,t,r)})})(this.options)),this._videoManager}reauthenticate(e){this.store.dispatch(Or.reauthAction({token:e}))}}function Bs(e){this.message=e}(Bs.prototype=new Error).name="InvalidCharacterError";var Fs="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new Bs("'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 qs(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(Fs(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 Fs(t)}}function zs(e){this.message=e}function Hs(e,t){if("string"!=typeof e)throw new zs("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(qs(e.split(".")[r]))}catch(e){throw new zs("Invalid token specified: "+e.message)}}(zs.prototype=new Error).name="InvalidTokenError";class Js extends dn{options;WebSocketConstructor=WebSocket;agent="@signalwire/js/browser/3.14.0-dev.202208170849.eff4736.0";constructor(e){let t;try{t=Hs(e.token,{header:!0})}catch(e){}super({...e,host:t?.ch||e.host}),this.options=e}get allowHijack(){return this.options._hijack}async retrieveRelayProtocol(){if(!this.allowHijack)return"";const e=this.getRoomNameFromJWT();return e?(this.logger.info("Hijacking: search protocol for",e),window.sessionStorage.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowHijack)return;const e=this.getRoomNameFromJWT();e&&(this.logger.info("Hijacking: persist protocol",e,this.relayProtocol),window.sessionStorage.setItem(e,this.relayProtocol))}getRoomNameFromJWT(){try{return Hs(this.options.token)?.r}catch(e){return""}}}const Qs=e=>{const t={...e,emitter:new Et},r=Kn({userOptions:t,SessionConstructor:Js});return Qn({store:r,Component:$s,componentListeners:{errors:"onError",responses:"onSuccess"}})(t)},Ks=["subscribe","publish","updateToken","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Gs=Object.freeze({__proto__:null,ChatMember:Ho.ChatMember,ChatMessage:Ho.ChatMessage,Client:function(e){const t=Qs(e);return new Proxy(t.chat,{get:(e,r,n)=>Ks.includes(r)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(r):Reflect.get(e,r,n)})}});const Xs=["getAllowedChannels","subscribe","publish","updateToken"];var Ys=Object.freeze({__proto__:null,PubSubMessage:ri.PubSubMessage,Client:function(e){const t=Qs(e);return new Proxy(t.pubSub,{get:(e,r,n)=>Xs.includes(r)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(r):Reflect.get(e,r,n)})}});const Zs={aspectRatio:{ideal:16/9}},ea=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:u=!0,speakerId:l,...h}=e,p=Qs({...h});if(await p.connect(),!p)return;let m;if(s){const e=document.getElementById(s);e?m=e:(m=document.body,Yt().warn(`We couldn't find an element with id: ${s}: using 'document.body' instead.`))}const f=p.rooms.makeRoomObject({audio:n,video:!0===o?Zs:o,negotiateAudio:!0,negotiateVideo:!0,iceServers:i,rootElement:m,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:u,speakerId:l});f.once("destroy",(()=>{f.emit("room.left"),p.disconnect()}));const g=()=>new Promise((async(e,t)=>{try{f.once("room.subscribed",(t=>{e(f)})),await f.join()}catch(e){Yt().error("Join",e),p.disconnect(),t(e)}})),v=new Proxy(f,{get:(e,t,r)=>"join"===t?g:Reflect.get(e,t,r)});if(c)try{await v.join(),t(v)}catch(e){r(e)}else t(v)})),ta={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},ra=["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","setMeta","setMemberMeta"];var na=Object.freeze({__proto__:null,RoomSession:function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:i=!0,stopCameraWhileMuted:s=!0,stopMicrophoneWhileMuted:a=!0,speakerId:c,...d}=e,u=Qs(d),l=u.rooms.makeRoomObject({audio:t,video:!0===r?ta:r,negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:i,stopCameraWhileMuted:s,stopMicrophoneWhileMuted:a,speakerId:c});l.once("destroy",(()=>{l.emit("room.left"),u.disconnect()}));const h={join:()=>new Promise((async(e,t)=>{try{l.attachPreConnectWorkers(),await u.connect(),l.once("room.subscribed",(t=>{l.attachOnSubscribedWorkers(t),e(l)})),await l.join()}catch(e){Yt().error("RoomSession Join",e),u.disconnect(),t(e)}})),joinAudience:e=>new Promise((async(t,r)=>{try{l.attachPreConnectWorkers();const n=await u.connect(),o=(({authState:e,receiveAudio:t=!0,receiveVideo:r=!0})=>{const n=({remote:e,local:t,kind:r})=>{const n="none"!==e;return!n&&t&&Yt().warn(`[joinAudience] ${r} is currently not allowed on this room.`),!(!n||!t)};return{audio:!1,video:!1,negotiateAudio:n({remote:e.audio_allowed,local:t,kind:"audio"}),negotiateVideo:n({remote:e.video_allowed,local:r,kind:"video"})}})({authState:n._sessionAuthState,...e});if(!Object.values(o).some(Boolean))return await n.disconnect(),r(new Error("[joinAudience] Either (or both) `audio` and `video` must be `true` when calling this method."));l.updateMediaOptions(o),l.once("room.subscribed",(e=>{l.attachOnSubscribedWorkers(e),t(l)})),await l.join()}catch(e){Yt().error("RoomSession JoinAudience",e),u.disconnect(),r(e)}}))};return new Proxy(l,{get(e,t,r){if(t in h)return h[t];if(!e.active&&ra.includes(t))throw new Error(`Tried to access the property/method "${t}" before the room was connected. Please call roomSession.join() first.`);return Reflect.get(e,t,r)}})},createRoomObject:ea,joinRoom:e=>ea({...e,autoJoin:!0}),createClient:Qs}),oa=Object.freeze({__proto__:null,getDevices:Xi,getCameraDevices:()=>Xi("camera"),getMicrophoneDevices:()=>Xi("microphone"),getSpeakerDevices:()=>Xi("speaker"),getDevicesWithPermissions:Ki,getCameraDevicesWithPermissions:()=>Ki("camera"),getMicrophoneDevicesWithPermissions:()=>Ki("microphone"),getSpeakerDevicesWithPermissions:()=>Ki("speaker"),checkPermissions:Fi,checkCameraPermissions:qi,checkMicrophonePermissions:zi,checkSpeakerPermissions:Hi,requestPermissions:async e=>{try{const t=await Ji(e);Di(t)}catch(e){throw e}},createDeviceWatcher:os,createCameraDeviceWatcher:()=>os({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>os({targets:["microphone"]}),createSpeakerDeviceWatcher:()=>os({targets:["speaker"]}),supportsMediaDevices:Ri,supportsGetUserMedia:()=>"function"==typeof Ai().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Ai().getDisplayMedia,getUserMedia:Ji,getDisplayMedia:Qi,enumerateDevices:$i,getSupportedConstraints:xi,supportsMediaOutput:Li,setMediaElementSinkId:Ni,stopStream:Di,stopTrack:Wi,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(is(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},Ji(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Et,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=>{Yt().error("Error closing the AudioContext",e)})),is(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=Gs,e.PubSub=Ys,e.Video=na,e.WebRTC=oa,Object.defineProperty(e,"__esModule",{value:!0})}));
20
+ ***************************************************************************** */function hs(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}const ps=function*(e){Yt().debug("vertoEventWorker started");const{channels:t,instance:r,initialState:n}=e,{swEventChannel:o}=t,{rtcPeerId:i}=n;if(!i)throw new Error("Missing rtcPeerId for roomSubscribedWorker");for(;;){const e=yield Ae(o,(e=>{var t;return"webrtc.message"===e.type&&(null===(t=e.payload.params)||void 0===t?void 0:t.callID)===i})),{id:t,method:n,params:s={}}=e.payload,{callID:a,nodeId:c}=s,d=r.getRTCPeerById(a);if(!d){Yt().warn(`RTCPeer '${a}' not found for method: '${n}'`,s);continue}const u=r.peer;switch(n){case"verto.media":case"verto.answer":d.uuid===(null==u?void 0:u.uuid)&&r.setState("verto.media"===n?"early":"active"),(null==s?void 0:s.sdp)&&d.onRemoteSdp(s.sdp),yield xe(Or.executeAction({method:"video.message",params:{message:Mr(t,n),node_id:c}}));break;case"verto.bye":yield Le(r.onVertoBye,{rtcPeerId:a,byeCause:null==s?void 0:s.cause,byeCauseCode:null==s?void 0:s.causeCode,redirectDestination:null==s?void 0:s.redirectDestination}),yield xe(Or.executeAction({method:"video.message",params:{message:Mr(t,n),node_id:c}}));break;case"verto.ping":{const{nodeId:e}=s,t=hs(s,["nodeId"]);yield xe(Or.executeAction({method:"video.message",params:{message:Pr(t),node_id:e}}));break}case"verto.mediaParams":{if(!a||!s.mediaParams){Yt().warn("Invalid mediaParams event",s);break}const{audio:e,video:t}=s.mediaParams;d&&t&&d.applyMediaConstraints("video",t),d&&e&&d.applyMediaConstraints("audio",e);break}default:return Yt().warn(`Unknown Verto method: ${n}`,s)}}Yt().trace("vertoEventWorker ended")},ms=function*(e){Yt().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 Ae(o,(e=>"video.room.subscribed"===e.type&&e.payload.call_id===s)),c=a.payload.member_id,d=a.payload.room_session.id;if(r.options.additionalDevice||r.options.screenShare){if(!c)throw new Error("[roomSubscribedWorker] missing memberId");r._attachListeners(c)}else{if(!d)throw new Error("[roomSubscribedWorker] missing roomSessionId");r._attachListeners(d)}r.applyEmitterTransforms(),r.setActiveRTCPeer(s),yield xe(pn.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 xe(i,{type:"video.room.joined",payload:a.payload}),Yt().debug("roomSubscribedWorker ended",s)},fs=function*(e){Yt().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 Ae(o,(e=>("video.member.promoted"===e.type||"video.member.demoted"===e.type)&&e.payload.member_id===i));Yt().debug("promoteDemoteWorker:",s.type,s.payload);const a="video.member.promoted"===s.type;yield xe(on.updateAuthState(s.payload.authorization));const c=yield De(Oi.getAuthState);if(!c)throw new Error(`Invalid authState for '${s.type}'`);r.updateMediaOptions({audio:a&&"none"!==c.audio_allowed,video:a&&"none"!==c.video_allowed,negotiateAudio:!0,negotiateVideo:!0}),r._triggerNewRTCPeer(),Yt().debug("promoteDemoteWorker ended",i)},gs={destinationNumber:"room",remoteCallerName:"Outbound Call",remoteCallerNumber:"",callerName:"",callerNumber:"",audio:!0,video:{aspectRatio:16/9},useStereo:!1,attach:!1,screenShare:!1,additionalDevice:!1,userVariables:{},requestTimeout:1e4,autoApplyMediaParams:!0,iceGatheringTimeout:2e3};class vs extends Yn{constructor(e){super(e),this.gotEarly=!1,this.doReinvite=!1,this._eventsPrefix="video",this.state="new",this.prevState="new",this.rtcPeerMap=new Map,this.onVertoBye=e=>{const{rtcPeerId:t,byeCause:r="NORMAL_CLEARING",byeCauseCode:n="16",redirectDestination:o}=e;this.cause=String(r),this.causeCode=String(n);const 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({},gs),e),this.setState("new"),this.logger.debug("New Call with Options:",this.options),this.applyEmitterTransforms({local:!0})}get id(){return this.__uuid}get active(){return"active"===this.state}get trying(){return"trying"===this.state}get memberId(){return this.component.memberId}get previewUrl(){return this.component.previewUrl}get roomId(){return this.component.roomId}get roomSessionId(){return this.component.roomSessionId}get localStream(){var e;return null===(e=this.peer)||void 0===e?void 0:e.localStream}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(Oi.getIceServers)}get component(){var e,t;const r=null!==(t=null===(e=this.peer)||void 0===e?void 0:e.uuid)&&void 0!==t?t:"";return this.select((e=>qn.getComponent(e,r)))||{}}dialogParams(e){const{destinationNumber:t,attach:r,callerName:n,callerNumber:o,remoteCallerName:i,remoteCallerNumber:s,userVariables:a,screenShare:c,additionalDevice:d,pingSupported:u=!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:u}}}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){var t;if(e){if(this.logger.debug("Set RTCPeer",e.uuid,e),this.rtcPeerMap.set(e.uuid,e),this.peer&&(null===(t=this.peer)||void 0===t?void 0:t.uuid)!==e.uuid){const e=this.peer.uuid;this.logger.info(">>> Stop old RTCPeer",e),this.hangup(e).then(console.warn).catch(console.error),this.peer.detachAndStop()}this.logger.info(">>> 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.rtcPeerMap.get(e)}vertoExecute(e){return this.execute({method:"video.message",params:e})}async _triggerNewRTCPeer(){this.logger.debug("_triggerNewRTCPeer Start");try{this.logger.debug("Build a new RTCPeer");const e=new ls(this,"offer");this.appendRTCPeer(e),this.logger.debug("Run workers for the new RTCPeer",e.uuid),this.runRTCPeerWorkers(e.uuid),this.logger.debug("Trigger start for the new RTCPeer!"),await e.start()}catch(e){this.logger.error("Error building new RTCPeer to promote/demote",e)}}updateCamera(e){return this.updateConstraints({video:Object.assign({aspectRatio:16/9},e)})}updateMicrophone(e){return this.updateConstraints({audio:e})}manageSendersWithConstraints(e){return!1===e.audio&&(this.logger.info("Switching off the microphone"),this.stopOutboundAudio()),!1===e.video&&(this.logger.info("Switching off the camera"),this.stopOutboundVideo()),e.audio||e.video}updateConstraints(e,{attempt:t=0}={}){return t>1?Promise.reject(new Error("Failed to update constraints")):new Promise((async(r,n)=>{var o;try{if(!this.peer)return n(new Error("Invalid RTCPeerConnection."));if(!Object.keys(e).length)return n(new Error("Invalid audio/video constraints."));if(this.logger.debug("updateConstraints trying constraints",this.__uuid,e),!this.manageSendersWithConstraints(e))return void this.logger.debug("Either `video` and `audio` (or both) constraints were set to `false` so their corresponding senders (if any) were stopped");let i;try{i=await Ji(e)}catch(i){if(i instanceof DOMException&&"Concurrent mic process limit."===i.message){let n={};null===(o=this.options.localStream)||void 0===o||o.getTracks().forEach((t=>{var r;n[t.kind]=t.getConstraints(),void 0!==e[t.kind]&&(this.logger.debug("updateConstraints stop old tracks to retrieve new ones"),Wi(t),null===(r=this.options.localStream)||void 0===r||r.removeTrack(t))}));try{return r(this.updateConstraints(e,{attempt:t+1}))}catch(e){return this.logger.error("Restoring previous constraints"),r(this.updateConstraints(n,{attempt:t+1}))}}return this.logger.error("updateConstraints",i),n(i)}this.logger.debug("updateConstraints got stream",i),this.options.localStream||(this.options.localStream=new MediaStream);const{instance:s}=this.peer,a=i.getTracks();this.logger.debug(`updateConstraints got ${a.length} tracks`);for(let e=0;e<a.length;e++){const t=a[e];this.logger.debug("updateConstraints apply track: ",t);const r=s.getTransceivers().find((({mid:e,sender:r,receiver:n})=>r.track&&r.track.kind===t.kind?(this.logger.debug("Found transceiver by sender"),!0):n.track&&n.track.kind===t.kind?(this.logger.debug("Found transceiver by receiver"),!0):null===e&&(this.logger.debug("Found disassociated transceiver"),!0)));r&&r.sender?(this.logger.debug("updateConstraints got transceiver",r.currentDirection,r.mid),await r.sender.replaceTrack(t),this.logger.debug("updateConstraints replaceTrack"),r.direction="sendrecv",this.logger.debug("updateConstraints set to sendrecv"),this.options.localStream.getTracks().forEach((e=>{var r;e.kind===t.kind&&e.id!==t.id&&(this.logger.debug("updateConstraints stop old track and apply new one - "),Wi(e),null===(r=this.options.localStream)||void 0===r||r.removeTrack(e))})),this.options.localStream.addTrack(t)):(this.logger.debug("updateConstraints no transceiver found. addTrack and start dancing!"),this.peer.type="offer",this.doReinvite=!0,this.options.localStream.addTrack(t),s.addTrack(t,this.options.localStream)),this.logger.debug("updateConstraints simply update mic/cam"),"audio"===t.kind?this.options.micId=t.getSettings().deviceId:"video"===t.kind&&(this.options.camId=t.getSettings().deviceId)}this.logger.debug("updateConstraints done"),r()}catch(e){this.logger.error("updateConstraints",e),n(e)}}))}runRTCPeerWorkers(e){this.runWorker("vertoEventWorker",{worker:ps,initialState:{rtcPeerId:e}}),this.runWorker("roomSubscribedWorker",{worker:ms,initialState:{rtcPeerId:e}}),this.runWorker("promoteDemoteWorker",{worker:fs,initialState:{rtcPeerId:e}})}invite(){return new Promise((async(e,t)=>{this.direction="outbound",this.peer=new ls(this,"offer");try{this.runRTCPeerWorkers(this.peer.uuid),await this.peer.start(),e(this)}catch(e){this.logger.error("Invite error",e),t(e)}}))}answer(){return new Promise((async(e,t)=>{this.direction="inbound",this.peer=new ls(this,"answer");try{await this.peer.start(),e(this)}catch(e){this.logger.error("Answer error",e),t(e)}}))}onLocalSDPReady(e){if(!e.instance.localDescription)throw this.logger.error("Missing localDescription",e),new Error("Invalid RTCPeerConnection localDescription");const{type:t,sdp:r}=e.instance.localDescription,n=this._mungeSDP(r);switch(this.logger.debug("LOCAL SDP \n",`Type: ${t}`,"\n\n",n),t){case"offer":return e.instance.remoteDescription?this.executeUpdateMedia(n,e.uuid):this.executeInvite(n,e.uuid);case"answer":this.logger.warn("Unhandled verto.answer");break;default:return this.logger.error(`Unknown SDP type: '${t}' on call ${this.id}`)}}async executeInvite(e,t,r){const n=this.getRTCPeerById(t);if(!n||n.instance.remoteDescription)throw new Error(`RTCPeer '${t}' already has a remoteDescription. Invalid invite.`);"new"===this.state&&this.setState("requesting");try{const n=this.options.screenShare?{layout:this.options.layout,positions:this.options.positions}:{},o=Er(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,node_id:r,subscribe:i});this.logger.debug("Invite response",s)}catch(e){throw this.setState("hangup"),e.jsonrpc}}async executeUpdateMedia(e,t){try{const r=Tr(Object.assign(Object.assign({},this.dialogParams(t)),{sdp:e,action:"updateMedia"})),n=await this.vertoExecute({message:r});if(n.sdp||this.logger.error("UpdateMedia invalid SDP answer",n),this.logger.debug("UpdateMedia response",n),!this.peer)return this.logger.error("Invalid RTCPeer to updateMedia");await this.peer.onRemoteSdp(n.sdp)}catch(e){throw this.logger.error("UpdateMedia error",e),e.jsonrpc}}async hangup(e){var t,r,n;const o=null!=e?e:null===(t=this.peer)||void 0===t?void 0:t.uuid;if(!o)throw new Error("Invalid RTCPeer ID to hangup");try{const e=Cr(this.dialogParams(o));await this.vertoExecute({message:e})}catch(e){this.logger.error("Hangup error:",e)}finally{if(o!==(null===(r=this.peer)||void 0===r?void 0:r.uuid))return this.logger.warn("Prevent setState hangup",o,null===(n=this.peer)||void 0===n?void 0:n.uuid);this.setState("hangup")}}dtmf(e){var t;const r=null===(t=this.peer)||void 0===t?void 0:t.uuid;if(!r)throw new Error("Invalid RTCPeer ID to send DTMF");const n=Ir(Object.assign(Object.assign({},this.dialogParams(r)),{dtmf:e}));this.vertoExecute({message:n})}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.debug(`Call ${this.id} state change from ${this.prevState} to ${this.state}`),this.emit(this.state,this),e){case"purge":this._finalize();break;case"hangup":this.setState("destroy");break;case"destroy":this._finalize()}}updateMediaOptions(e){this.options=Object.assign(Object.assign({},this.options),e)}_mungeSDP(e){return e}_finalize(){this.rtcPeerMap.forEach((e=>{e.stop()})),this.rtcPeerMap.clear(),this.destroy()}}const ys=()=>{const e=document.createElement("video");return e.muted=!0,e.autoplay=!0,e.playsInline=!0,e.addEventListener("pause",(()=>{e.play().catch((t=>{Yt().error("Video Element Paused",e,t)}))})),e},bs=({x:e,y:t,width:r,height:n})=>({top:`${t}%`,left:`${e}%`,width:`${r}%`,height:`${n}%`}),_s=Or.createAction("swJs/audioSetSpeakerAction"),ws=({rootElement:e,applyLocalVideoOverlay:t})=>function*({instance:r,runSaga:n}){try{const o=new Map,i=ys(),s={status:"hidden",get id(){return`sw-sdk-${r.id}`},get domElement(){return o.get(this.id)},set domElement(e){e?(Yt().debug("Set localOverlay",e),o.set(this.id,e)):(Yt().debug("Remove localOverlay"),o.delete(this.id))},hide(){if(!this.domElement)return Yt().warn("Missing localOverlay to hide");this.domElement.style.opacity="0"},show(){return this.domElement?"hidden"===this.status?Yt().info("localOverlay not visible"):void(this.domElement.style.opacity="1"):Yt().warn("Missing localOverlay to show")},setLocalOverlayMediaStream(e){if(!this.domElement)return Yt().warn("Missing localOverlay to set the local overlay stream");const t=this.domElement.querySelector("video");t&&(t.srcObject=e)}},a=(({localOverlay:e,rootElement:t})=>async({layout:r,myMemberId:n,localStream:o})=>{Yt().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 Yt().debug("Location not found"),void(a&&(Yt().debug("Current layer not visible"),e.hide()));if(!a){Yt().debug("Build myLayer"),a=(({location:e})=>{const{top:t,left:r,width:n,height:o}=bs(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=ys();r.srcObject=o,r.style.width="100%",r.style.height="100%",a.appendChild(r);const n=t.querySelector(".mcuLayers"),i=n?.querySelector(`#${a.id}`);return void(n&&!i&&(n.appendChild(a),e.domElement=a))}const{top:c,left:d,width:u,height:l}=bs(s);Yt().debug("Update myLayer:",c,d,u,l);const h=o.getVideoTracks().length>0;a.style.opacity=h?"1":"0",a.style.top=c,a.style.left=d,a.style.width=u,a.style.height=l}catch(e){Yt().error("Layout Changed Error",e)}})({rootElement:e,localOverlay:s});let c;r.on("layout.changed",(e=>{Yt().debug("Received layout.changed"),r.peer?.hasVideoSender&&r.localStream?a({layout:e.layout,localStream:r.localStream,myMemberId:r.memberId}):s.hide()})),r.once("room.subscribed",(e=>{const t=e.room_session.members?.find((e=>e.id===r.memberId));if(t?.audio_muted)try{r.stopOutboundAudio()}catch(e){Yt().error("Error handling audio_muted",e)}if(t?.video_muted)try{r.stopOutboundVideo()}catch(e){Yt().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){Yt().error("Error handling video_muted",e)}})),r.on("track",(function(r){switch(r.track.kind){case"video":c=n(Es,{applyLocalVideoOverlay:t,rootElement:e,track:r.track,element:i})}})),r.once("destroy",(()=>{(e=>{for(;e.firstChild;)e.removeChild(e.firstChild)})(e),o.clear(),c?.cancel()}))}catch(e){Yt().error("videoElementSaga",e)}};function*Ss({element:e,room:t}){const r=Or.getCustomSagaActionType(t.__uuid,_s);for(;;){const n=yield Ae([r]);try{switch(n.type){case r:const o=yield Le(Ni,e,n.payload);t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:o,kind:"resolve"})}}catch(e){t.settleCustomSagaTrigger({dispatchId:n.dispatchId,payload:e,kind:"reject"}),Yt().error(e)}}}function*ks({track:e,element:t,speakerId:r,room:n}){(({track:e,element:t})=>{t.autoplay=!0,t.playsinline=!0,t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({track:e,element:t}),r&&Ni(t,r).catch((()=>{})),yield Ne(Ss,{element:t,room:n})}function*Es({rootElement:e,applyLocalVideoOverlay:t=!0,track:r,element:n}){(async r=>{if((({track:e,element:t})=>{t.srcObject=new MediaStream([e]),e.addEventListener("ended",(()=>{t.srcObject=null,t.remove()}))})({element:n,track:r}),n.style.width="100%",!t)return void e.appendChild(n);if(e.querySelector(".mcuContent"))return void Yt().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.style.paddingBottom="56.25%",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.margin="0 auto",a.appendChild(i);const c=document.createElement("div");c.style.display="flex",c.style.alignItems="center",c.style.justifyContent="center",c.appendChild(a),e.appendChild(c),n.readyState===HTMLMediaElement.HAVE_NOTHING&&(Yt().debug("Wait for the MCU to be ready"),await(({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()}))})))({element:n})),s.style.display="block"})(r).catch((e=>{Yt().error("Handle video track error",e)}))}const Cs={errors:"onError",responses:"onSuccess"},Ts={echoCancellation:!0,noiseSuppression:!1,autoGainControl:!1,googAutoGainControl:!1},Is=sr(class extends vs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:no.audioMuteMember,audioUnmute:no.audioUnmuteMember,videoMute:no.videoMuteMember,videoUnmute:no.videoUnmuteMember,setMicrophoneVolume:no.setInputVolumeMember,setInputVolume:no.setInputVolumeMember,setInputSensitivity:no.setInputSensitivityMember}),Ps=sr(class extends vs{join(){return super.invite()}leave(){return super.hangup()}},{audioMute:no.audioMuteMember,audioUnmute:no.audioUnmuteMember,videoMute:no.videoMuteMember,videoUnmute:no.videoUnmuteMember,setInputVolume:no.setInputVolumeMember,setMicrophoneVolume:no.setInputVolumeMember,setInputSensitivity:no.setInputSensitivityMember}),Ms=()=>{},Os="video.memberList.updated",Rs=or({event:Os}),As=(e=>{const t=e.split(".")[0];return e.split(".").reduce(((e,r)=>(e.push(r),r===t&&e.push(Bt),e)),[]).join(".")})(Rs),xs=["video.room.joined","video.member.joined","video.member.left","video.member.updated"];function*js({pubSubChannel:e}){const t=new Map;function*r(r){const n={room_session_id:"video.room.joined"===r.type?r.payload.room_session.id:r.payload.room_session_id,members:(({action:e,memberList:t})=>{const r=(e=>"video.room.joined"===e.type?e.payload.room_session.members:[e.payload.member])(e);switch(e.type){case"video.member.left":r.forEach((e=>{t.delete(e.id)}));break;default:r.forEach((e=>{t.set(e.id,e)}))}return Array.from(t.values())})({action:r,memberList:t})};yield xe(e,{type:As,payload:n})}for(;;){const t=yield Ae(e,(({type:e})=>xs.includes(e)));yield Ne(r,t)}}const Ls=function*({channels:{pubSubChannel:e},instance:t}){const r=t.getSubscriptions();if(!(e=>e.some((e=>e.includes(Rs))))(r))return;const{cleanup:n}=((e,t)=>{(e=>mr(xs).filter((t=>!e.includes(t))))(t).forEach((t=>{e.once(t,Ms)}));const r=({members:t})=>{e.emit(Os,{members:t})};return e.on(As,r),{cleanup:()=>{e.off(As,r)}}})(t,r);yield Ne(js,{pubSubChannel:e}),t.once("destroy",(()=>{n()}))},Ns=function*(e){if(!e.initialState)throw new Error("[memberPositionWorker] Missing initialState");yield Ne(mi.memberPositionWorker,e)},Ds=function*(e){Yt().trace("childMemberJoinedWorker started");const{channels:t,initialState:r}=e,{swEventChannel:n}=t,{parentId:o}=r;if(!o)throw new Error("Missing parentId for roomSubscribedWorker");const i=yield Ae(n,(e=>"video.member.joined"===e.type&&e.payload.member.parent_id===o)),{member:s}=i.payload;s?.parent_id&&(yield De(qn.getComponent,s.parent_id))&&(yield xe(pn.upsert({id:s.id,roomId:i.payload.room_id,roomSessionId:i.payload.room_session_id,memberId:s.id}))),Yt().trace("childMemberJoinedWorker ended")},Ws=sr(class extends vs{_screenShareList=new Set;_deviceList=new Set;get screenShareList(){return Array.from(this._screenShareList)}get deviceList(){return Array.from(this._deviceList)}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})}}}],[[gr("video.recording.list")],{type:"roomSessionRecordingList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{recordings:{eventTransformType:"roomSessionRecording",processInstancePayload:e=>({recording:e})}}}],[[gr("video.playback.list")],{type:"roomSessionPlaybackList",instanceFactory:e=>({}),payloadTransform:e=>e,nestedFieldsToProcess:{playbacks:{eventTransformType:"roomSessionPlayback",processInstancePayload:e=>({playback:e})}}}],[[gr("video.recording.start"),"video.recording.started","video.recording.updated","video.recording.ended"],{type:"roomSessionRecording",instanceFactory:e=>no.createRoomSessionRecordingObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>tr({...e.recording,room_session_id:this.roomSessionId})}],[[gr("video.playback.start"),"video.playback.started","video.playback.updated","video.playback.ended"],{type:"roomSessionPlayback",instanceFactory:e=>no.createRoomSessionPlaybackObject({store:this.store,emitter:this.emitter}),payloadTransform:e=>tr({...e.playback,room_session_id:this.roomSessionId})}]])}getCompoundEvents(){return new Map([...mi.MEMBER_POSITION_COMPOUND_EVENTS])}attachPreConnectWorkers(){this.runWorker("memberListUpdated",{worker:Ls})}attachOnSubscribedWorkers(e){this.runWorker("memberPositionWorker",{worker:Ns,initialState:e})}async createScreenShareObject(e={}){return this.startScreenShare(e)}async startScreenShare(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!0,layout:o,positions:i}=e,s=await Qi({audio:!0===r?Ts:r,video:n}),a={...this.options,screenShare:!0,recoverCall:!1,localStream:s,remoteStream:void 0,userVariables:{...this.options?.userVariables||{},memberCallId:this.memberId,memberId:this.memberId},layout:o,positions:i},c=Qn({store:this.store,Component:Is,componentListeners:Cs})(a);s.getVideoTracks().forEach((e=>{e.addEventListener("ended",(()=>{c&&c.active&&c.leave()}))})),c.on("destroy",(()=>{this._screenShareList.delete(c)}));try{return this.runWorker("childMemberJoinedWorker",{worker:Ds,initialState:{parentId:this.memberId}}),this._screenShareList.add(c),t&&await c.join(),c}catch(e){throw this.logger.error("ScreenShare Error",e),e}}addCamera(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,video:r})}addMicrophone(e={}){const{autoJoin:t=!0,...r}=e;return this.addDevice({autoJoin:t,audio:r})}async addDevice(e={}){const{autoJoin:t=!0,audio:r=!1,video:n=!1}=e;if(!r&&!n)throw new TypeError("At least one of `audio` or `video` must be requested.");const o={...this.options,localStream:void 0,remoteStream:void 0,audio:r,video:n,additionalDevice:!0,recoverCall:!1,userVariables:{...this.options?.userVariables||{},memberCallId:this.memberId,memberId:this.memberId}},i=Qn({store:this.store,Component:Ps,componentListeners:Cs})(o);i.on("destroy",(()=>{this._deviceList.delete(i)}));try{return this.runWorker("childMemberJoinedWorker",{worker:Ds,initialState:{parentId:this.memberId}}),this._deviceList.add(i),t&&await i.join(),i}catch(e){throw this.logger.error("RoomDevice Error",e),e}}join(){return super.invite()}leave(){return this.hangup()}updateSpeaker({deviceId:e}){return this.triggerCustomSaga(_s(e))}async hangup(e){return this._screenShareList.forEach((e=>{e.leave()})),this._deviceList.forEach((e=>{e.leave()})),super.hangup(e)}_finalize(){this._screenShareList.clear(),this._deviceList.clear(),super._finalize()}getLayoutList(){return this.getLayouts()}getMemberList(){return this.getMembers()}},{audioMute:no.audioMuteMember,audioUnmute:no.audioUnmuteMember,videoMute:no.videoMuteMember,videoUnmute:no.videoUnmuteMember,deaf:no.deafMember,undeaf:no.undeafMember,setInputVolume:no.setInputVolumeMember,setOutputVolume:no.setOutputVolumeMember,setMicrophoneVolume:no.setInputVolumeMember,setSpeakerVolume:no.setOutputVolumeMember,setInputSensitivity:no.setInputSensitivityMember,removeMember:no.removeMember,removeAllMembers:no.removeAllMembers,getMembers:no.getMembers,getLayouts:no.getLayouts,setLayout:no.setLayout,setPositions:no.setPositions,setMemberPosition:no.setMemberPosition,hideVideoMuted:no.hideVideoMuted,showVideoMuted:no.showVideoMuted,getRecordings:no.getRecordings,startRecording:no.startRecording,getPlaybacks:no.getPlaybacks,play:no.play,setHideVideoMuted:no.setHideVideoMuted,setMeta:no.setMeta,updateMeta:no.updateMeta,deleteMeta:no.deleteMeta,setMemberMeta:no.setMemberMeta,updateMemberMeta:no.updateMemberMeta,deleteMemberMeta:no.deleteMemberMeta,promote:no.promote,demote:no.demote}),Us=function*(e){Yt().trace("videoManagerWorker started");const{channels:t}=e,{swEventChannel:r,pubSubChannel:n}=t;for(;;){const e=yield Ae(r,(e=>e.type.startsWith("video-manager.")));yield xe(n,e)}};class Vs extends eo{_eventsPrefix="video-manager";constructor(e){super(e),this.runWorker("videoManagerWorker",{worker:Us})}getEmitterTransforms(){return new Map([[["video-manager.rooms.subscribed"],{type:"roomSession",instanceFactory:({rooms:e})=>({rooms:e.map((e=>tr(e)))}),payloadTransform:({rooms:e})=>({rooms:e.map((e=>tr(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=>tr(e),payloadTransform:e=>tr(e)}]])}}class $s extends Zn{_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=new Audio;let o;t.on("track",(function(i){switch(i.track.kind){case"audio":o=r(ks,{track:i.track,element:n,speakerId:e,room:t})}})),t.once("destroy",(()=>{o?.cancel()}))}catch(e){Yt().error("audioElementSaga",e)}else Yt().warn("`Audio` is not supported on this environment.")})({speakerId:i.speakerId})),t&&s.push(ws({rootElement:t,applyLocalVideoOverlay:r}));const a=(c={...i,store:this.store,emitter:this.emitter,customSagas:s},Qn({store:c.store,customSagas:c.customSagas,Component:Ws,componentListeners:Cs})(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=Ho.createBaseChatObject({store:this.store,emitter:this.options.emitter})),this._chat}get pubSub(){return this._pubSub||(this._pubSub=ri.createBasePubSubObject({store:this.store,emitter:this.options.emitter})),this._pubSub}get videoManager(){return this._videoManager||(this._videoManager=(e=>{const t=Qn({store:e.store,Component:Vs,componentListeners:{errors:"onError",responses:"onSuccess"}})(e);return new Proxy(t,{get:(e,t,r)=>"_eventsNamespace"===t?"":"eventChannel"===t?"video-manager.rooms":Reflect.get(e,t,r)})})(this.options)),this._videoManager}reauthenticate(e){this.store.dispatch(Or.reauthAction({token:e}))}}function Bs(e){this.message=e}(Bs.prototype=new Error).name="InvalidCharacterError";var Fs="undefined"!=typeof window&&window.atob&&window.atob.bind(window)||function(e){var t=String(e).replace(/=+$/,"");if(t.length%4==1)throw new Bs("'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 qs(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(Fs(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 Fs(t)}}function zs(e){this.message=e}function Hs(e,t){if("string"!=typeof e)throw new zs("Invalid token specified");var r=!0===(t=t||{}).header?0:1;try{return JSON.parse(qs(e.split(".")[r]))}catch(e){throw new zs("Invalid token specified: "+e.message)}}(zs.prototype=new Error).name="InvalidTokenError";class Js extends dn{options;WebSocketConstructor=WebSocket;agent="@signalwire/js/browser/3.14.0";constructor(e){let t;try{t=Hs(e.token,{header:!0})}catch(e){}super({...e,host:t?.ch||e.host}),this.options=e}get allowHijack(){return this.options._hijack}async retrieveRelayProtocol(){if(!this.allowHijack)return"";const e=this.getRoomNameFromJWT();return e?(this.logger.info("Hijacking: search protocol for",e),window.sessionStorage.getItem(e)??""):""}async persistRelayProtocol(){if(!this.allowHijack)return;const e=this.getRoomNameFromJWT();e&&(this.logger.info("Hijacking: persist protocol",e,this.relayProtocol),window.sessionStorage.setItem(e,this.relayProtocol))}getRoomNameFromJWT(){try{return Hs(this.options.token)?.r}catch(e){return""}}}const Qs=e=>{const t={...e,emitter:new Et},r=Kn({userOptions:t,SessionConstructor:Js});return Qn({store:r,Component:$s,componentListeners:{errors:"onError",responses:"onSuccess"}})(t)},Ks=["subscribe","publish","updateToken","getMessages","getMembers","getMemberState","getAllowedChannels","setMemberState"];var Gs=Object.freeze({__proto__:null,ChatMember:Ho.ChatMember,ChatMessage:Ho.ChatMessage,Client:function(e){const t=Qs(e);return new Proxy(t.chat,{get:(e,r,n)=>Ks.includes(r)?(e=>async(...r)=>(await t.connect(),t.chat[e](...r)))(r):Reflect.get(e,r,n)})}});const Xs=["getAllowedChannels","subscribe","publish","updateToken"];var Ys=Object.freeze({__proto__:null,PubSubMessage:ri.PubSubMessage,Client:function(e){const t=Qs(e);return new Proxy(t.pubSub,{get:(e,r,n)=>Xs.includes(r)?(e=>async(...r)=>(await t.connect(),t.pubSub[e](...r)))(r):Reflect.get(e,r,n)})}});const Zs={aspectRatio:{ideal:16/9}},ea=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:u=!0,speakerId:l,...h}=e,p=Qs({...h});if(await p.connect(),!p)return;let m;if(s){const e=document.getElementById(s);e?m=e:(m=document.body,Yt().warn(`We couldn't find an element with id: ${s}: using 'document.body' instead.`))}const f=p.rooms.makeRoomObject({audio:n,video:!0===o?Zs:o,negotiateAudio:!0,negotiateVideo:!0,iceServers:i,rootElement:m,applyLocalVideoOverlay:a,stopCameraWhileMuted:d,stopMicrophoneWhileMuted:u,speakerId:l});f.once("destroy",(()=>{f.emit("room.left"),p.disconnect()}));const g=()=>new Promise((async(e,t)=>{try{f.once("room.subscribed",(t=>{e(f)})),await f.join()}catch(e){Yt().error("Join",e),p.disconnect(),t(e)}})),v=new Proxy(f,{get:(e,t,r)=>"join"===t?g:Reflect.get(e,t,r)});if(c)try{await v.join(),t(v)}catch(e){r(e)}else t(v)})),ta={width:{ideal:1280,min:320},height:{ideal:720,min:180},aspectRatio:{ideal:16/9}},ra=["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","setMeta","setMemberMeta"];var na=Object.freeze({__proto__:null,RoomSession:function(e){const{audio:t=!0,video:r=!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:i=!0,stopCameraWhileMuted:s=!0,stopMicrophoneWhileMuted:a=!0,speakerId:c,...d}=e,u=Qs(d),l=u.rooms.makeRoomObject({audio:t,video:!0===r?ta:r,negotiateAudio:!0,negotiateVideo:!0,iceServers:n,rootElement:o,applyLocalVideoOverlay:i,stopCameraWhileMuted:s,stopMicrophoneWhileMuted:a,speakerId:c});l.once("destroy",(()=>{l.emit("room.left"),u.disconnect()}));const h={join:()=>new Promise((async(e,t)=>{try{l.attachPreConnectWorkers(),await u.connect(),l.once("room.subscribed",(t=>{l.attachOnSubscribedWorkers(t),e(l)})),await l.join()}catch(e){Yt().error("RoomSession Join",e),u.disconnect(),t(e)}})),joinAudience:e=>new Promise((async(t,r)=>{try{l.attachPreConnectWorkers();const n=await u.connect(),o=(({authState:e,receiveAudio:t=!0,receiveVideo:r=!0})=>{const n=({remote:e,local:t,kind:r})=>{const n="none"!==e;return!n&&t&&Yt().warn(`[joinAudience] ${r} is currently not allowed on this room.`),!(!n||!t)};return{audio:!1,video:!1,negotiateAudio:n({remote:e.audio_allowed,local:t,kind:"audio"}),negotiateVideo:n({remote:e.video_allowed,local:r,kind:"video"})}})({authState:n._sessionAuthState,...e});if(!Object.values(o).some(Boolean))return await n.disconnect(),r(new Error("[joinAudience] Either (or both) `audio` and `video` must be `true` when calling this method."));l.updateMediaOptions(o),l.once("room.subscribed",(e=>{l.attachOnSubscribedWorkers(e),t(l)})),await l.join()}catch(e){Yt().error("RoomSession JoinAudience",e),u.disconnect(),r(e)}}))};return new Proxy(l,{get(e,t,r){if(t in h)return h[t];if(!e.active&&ra.includes(t))throw new Error(`Tried to access the property/method "${t}" before the room was connected. Please call roomSession.join() first.`);return Reflect.get(e,t,r)}})},createRoomObject:ea,joinRoom:e=>ea({...e,autoJoin:!0}),createClient:Qs}),oa=Object.freeze({__proto__:null,getDevices:Xi,getCameraDevices:()=>Xi("camera"),getMicrophoneDevices:()=>Xi("microphone"),getSpeakerDevices:()=>Xi("speaker"),getDevicesWithPermissions:Ki,getCameraDevicesWithPermissions:()=>Ki("camera"),getMicrophoneDevicesWithPermissions:()=>Ki("microphone"),getSpeakerDevicesWithPermissions:()=>Ki("speaker"),checkPermissions:Fi,checkCameraPermissions:qi,checkMicrophonePermissions:zi,checkSpeakerPermissions:Hi,requestPermissions:async e=>{try{const t=await Ji(e);Di(t)}catch(e){throw e}},createDeviceWatcher:os,createCameraDeviceWatcher:()=>os({targets:["camera"]}),createMicrophoneDeviceWatcher:()=>os({targets:["microphone"]}),createSpeakerDeviceWatcher:()=>os({targets:["speaker"]}),supportsMediaDevices:Ri,supportsGetUserMedia:()=>"function"==typeof Ai().getUserMedia,supportsGetDisplayMedia:()=>"function"==typeof Ai().getDisplayMedia,getUserMedia:Ji,getDisplayMedia:Qi,enumerateDevices:$i,getSupportedConstraints:xi,supportsMediaOutput:Li,setMediaElementSinkId:Ni,stopStream:Di,stopTrack:Wi,createMicrophoneAnalyzer:async e=>{const t=await(async e=>{if(is(e))return e;let t;return t="string"==typeof e?{audio:{deviceId:e}}:{audio:e},Ji(t)})(e);if(!t)throw new Error("Failed to get the audio stream");const r=new Et,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=>{Yt().error("Error closing the AudioContext",e)})),is(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=Gs,e.PubSub=Ys,e.Video=na,e.WebRTC=oa,Object.defineProperty(e,"__esModule",{value:!0})}));
21
21
  //# sourceMappingURL=index.umd.js.map