sip-connector 27.0.0 → 27.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- "use strict";const ie=require("@krivega/jssip"),S=require("events-constructor"),Ie=require("debug"),V=require("@krivega/timeout-requester"),q=require("@krivega/cancelable-promise"),g=require("xstate"),he=require("repeated-calls"),ue=require("stack-promises"),Qt=require("ua-parser-js");require("sequent-promises");const Yt=require("lodash"),Me="sip-connector",jt=Ie(Me),zt=()=>{Ie.enable(`${Me}:*`)},Jt=()=>{Ie.enable(`-${Me}:*`)},C=t=>jt.extend(t),Xt="Error decline with 603",Kt=1006,Zt=t=>typeof t=="object"&&t!==null&&"code"in t&&t.code===Kt,en=t=>t.message===Xt;var re=(t=>(t.SPECTATOR="SPECTATOR",t.PARTICIPANT="PARTICIPANT",t))(re||{}),_=(t=>(t.SHARE_STATE="application/vinteo.webrtc.sharedesktop",t.MAIN_CAM="application/vinteo.webrtc.maincam",t.ENTER_ROOM="application/vinteo.webrtc.roomname",t.MIC="application/vinteo.webrtc.mic",t.USE_LICENSE="application/vinteo.webrtc.uselic",t.PARTICIPANT_STATE="application/vinteo.webrtc.partstate",t.NOTIFY="application/vinteo.webrtc.notify",t))(_||{}),O=(t=>(t.SHARE_STATE="application/vinteo.webrtc.sharedesktop",t.MAIN_CAM="application/vinteo.webrtc.maincam",t.CHANNELS="application/vinteo.webrtc.channels",t.MEDIA_STATE="application/vinteo.webrtc.mediastate",t.REFUSAL="application/vinteo.webrtc.refusal",t.STATS="application/vinteo.webrtc.stats",t))(O||{}),P=(t=>(t.PAUSE_MAIN_CAM="PAUSEMAINCAM",t.RESUME_MAIN_CAM="RESUMEMAINCAM",t.MAX_MAIN_CAM_RESOLUTION="MAXMAINCAMRESOLUTION",t.ADMIN_STOP_MAIN_CAM="ADMINSTOPMAINCAM",t.ADMIN_START_MAIN_CAM="ADMINSTARTMAINCAM",t))(P||{}),ae=(t=>(t.ADMIN_STOP_MIC="ADMINSTOPMIC",t.ADMIN_START_MIC="ADMINSTARTMIC",t))(ae||{}),Ze=(t=>(t.H264="H264",t.VP8="VP8",t.VP9="VP9",t.AV1="AV1",t))(Ze||{}),h=(t=>(t.CONTENT_TYPE="content-type",t.CONTENT_ENTER_ROOM="x-webrtc-enter-room",t.CONTENT_USE_LICENSE="x-webrtc-use-license",t.PARTICIPANT_NAME="x-webrtc-participant-name",t.INPUT_CHANNELS="x-webrtc-input-channels",t.OUTPUT_CHANNELS="x-webrtc-output-channels",t.MAIN_CAM="x-webrtc-maincam",t.MIC="x-webrtc-mic",t.MEDIA_SYNC="x-webrtc-sync",t.MAIN_CAM_RESOLUTION="x-webrtc-maincam-resolution",t.MEDIA_STATE="x-webrtc-media-state",t.MEDIA_TYPE="x-vinteo-media-type",t.MAIN_CAM_STATE="x-vinteo-maincam-state",t.MIC_STATE="x-vinteo-mic-state",t.CONTENT_PARTICIPANT_STATE="x-webrtc-partstate",t.AUDIO_ID="x-webrtc-audioid",t.SPECTATOR_MODE="x-webrtc-spectator-mode",t.NOTIFY="x-vinteo-notify",t.CONTENT_ENABLE_MEDIA_DEVICE="x-webrtc-request-enable-media-device",t.CONTENTED_STREAM_STATE="x-webrtc-share-state",t.CONTENTED_STREAM_CODEC="x-webrtc-share-codec",t.AVAILABLE_INCOMING_BITRATE="x-webrtc-available-incoming-bitrate",t.AUDIO_TRACK_COUNT="x-webrtc-audio-track-count",t.VIDEO_TRACK_COUNT="x-webrtc-video-track-count",t.TRACKS_DIRECTION="x-webrtc-tracks-direction",t.BEARER_TOKEN="x-bearer-token",t.IS_DIRECT_PEER_TO_PEER="x-webrtc-is-direct-p2p",t))(h||{}),X=(t=>(t.AVAILABLE_CONTENTED_STREAM="YOUCANRECEIVECONTENT",t.NOT_AVAILABLE_CONTENTED_STREAM="CONTENTEND",t.MUST_STOP_PRESENTATION="YOUMUSTSTOPSENDCONTENT",t))(X||{}),G=(t=>(t.AVAILABLE_CONTENTED_STREAM="x-webrtc-share-state: YOUCANRECEIVECONTENT",t.NOT_AVAILABLE_CONTENTED_STREAM="x-webrtc-share-state: CONTENTEND",t.ACK_PERMISSION_TO_START_PRESENTATION="x-webrtc-share-state: LETMESTARTPRESENTATION",t.STOPPED_CLIENT_PRESENTATION="x-webrtc-share-state: STOPPRESENTATION",t.ENABLE_MAIN_CAM="x-webrtc-request-enable-media-device: LETMESTARTMAINCAM",t))(G||{}),oe=(t=>(t.ADMIN_SYNC_FORCED="1",t.ADMIN_SYNC_NOT_FORCED="0",t))(oe||{}),be=(t=>(t.SPECTATOR_MANUAL="0",t.BY_STATE_CAM="1",t.SPECTATOR_FORCED="2",t))(be||{}),ye=(t=>(t.AUDIO="AUDIO",t.VIDEO="VIDEO",t.AUDIOPLUSPRESENTATION="AUDIOPLUSPRESENTATION",t))(ye||{});const w=t=>typeof t=="string"&&t.trim().length>0,tn=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),et=t=>typeof t=="boolean",nn=t=>Array.isArray(t)&&t.every(e=>typeof e=="string"),tt=["enter-room","main-cam-control","use-license","new-dtmf","conference:participant-token-issued","contented-stream:available","contented-stream:not-available","presentation:must-stop","channels:all","channels:notify","participant:added-to-list-moderators","participant:removed-from-list-moderators","participant:move-request-to-stream","participant:move-request-to-spectators","participant:move-request-to-spectators-synthetic","participant:move-request-to-spectators-with-audio-id","participant:move-request-to-participants","participation:accepting-word-request","participation:cancelling-word-request","webcast:started","webcast:stopped","account:changed","account:deleted","admin:start-main-cam","admin:stop-main-cam","admin:start-mic","admin:stop-mic","admin:force-sync-media-state","failed-send-room-direct-p2p"],sn=()=>new S.TypedEvents(tt),rn=t=>!(!tn(t)||!w(t.conference)||!w(t.participant)||!w(t.jwt)),k=(t,e)=>{const n=e.toLowerCase(),s=Object.entries(t).find(([,i])=>typeof i=="string"&&i.toLowerCase()===n);return s?s[1]:void 0},an=t=>typeof t=="string"&&!Number.isNaN(Number(t))&&Number.isFinite(Number(t)),on=t=>{if(an(t))return Number(t)},cn=t=>{const e=t.toLowerCase();if(e==="true"||e==="1")return!0;if(e==="false"||e==="0")return!1},A=(t,e)=>{const n=t.getHeader(e.toLowerCase());if(!w(n))return;const s=n.toLowerCase();switch(e){case h.BEARER_TOKEN:return n;case h.CONTENT_ENTER_ROOM:case h.PARTICIPANT_NAME:case h.INPUT_CHANNELS:case h.OUTPUT_CHANNELS:case h.TRACKS_DIRECTION:case h.AUDIO_ID:case h.MAIN_CAM_RESOLUTION:case h.MEDIA_STATE:case h.NOTIFY:case h.CONTENT_ENABLE_MEDIA_DEVICE:return s;case h.MEDIA_TYPE:case h.MAIN_CAM_STATE:case h.MIC_STATE:case h.AVAILABLE_INCOMING_BITRATE:case h.AUDIO_TRACK_COUNT:case h.VIDEO_TRACK_COUNT:return on(s);case h.CONTENTED_STREAM_CODEC:return k(Ze,s);case h.CONTENT_TYPE:return k(_,s);case h.CONTENT_USE_LICENSE:return k(ye,s);case h.MAIN_CAM:return k(P,s);case h.MIC:return k(ae,s);case h.MEDIA_SYNC:return k(oe,s);case h.CONTENT_PARTICIPANT_STATE:return k(re,s);case h.SPECTATOR_MODE:return k(be,s);case h.CONTENTED_STREAM_STATE:return k(X,s);case h.IS_DIRECT_PEER_TO_PEER:return cn(s);default:return}};var y=(t=>(t.CHANNELS="channels",t.WEBCAST_STARTED="WebcastStarted",t.WEBCAST_STOPPED="WebcastStopped",t.ACCOUNT_CHANGED="accountChanged",t.ACCOUNT_DELETED="accountDeleted",t.ADDED_TO_LIST_MODERATORS="addedToListModerators",t.REMOVED_FROM_LIST_MODERATORS="removedFromListModerators",t.ACCEPTING_WORD_REQUEST="ParticipationRequestAccepted",t.CANCELLING_WORD_REQUEST="ParticipationRequestRejected",t.MOVE_REQUEST_TO_STREAM="ParticipantMovedToWebcast",t.CONFERENCE_PARTICIPANT_TOKEN_ISSUED="ConferenceParticipantTokenIssued",t))(y||{});const ke=C("ApiManager");class dn extends S.EventEmitterProxy{callManager;constructor(){super(sn())}subscribe({connectionManager:e,callManager:n}){this.callManager=n,e.on("sipEvent",this.handleSipEvent),n.on("newInfo",this.handleNewInfo),n.on("newDTMF",({originator:s})=>{this.events.trigger("new-dtmf",{originator:s})})}async waitChannels(){return this.wait("channels:all")}async waitSyncMediaState(){return this.wait("admin:force-sync-media-state")}async sendDTMF(e){return new Promise((n,s)=>{let i;try{i=this.getEstablishedRTCSessionProtected()}catch(r){s(r)}i&&(this.callManager?.once("newDTMF",({originator:r})=>{r==="local"&&n()}),i.sendDTMF(e,{duration:120,interToneGap:600}))})}async sendChannels({inputChannels:e,outputChannels:n}){const s=this.getEstablishedRTCSessionProtected(),i=`${h.INPUT_CHANNELS}: ${e}`,r=`${h.OUTPUT_CHANNELS}: ${n}`,a=[i,r];return s.sendInfo(O.CHANNELS,void 0,{extraHeaders:a})}sendEnterRoom(e){this.sendEnterRoomProtected(e).catch(n=>{this.events.trigger("failed-send-room-direct-p2p",{error:n})})}async sendMediaState({cam:e,mic:n},s={}){const i=this.getEstablishedRTCSessionProtected(),r=`${h.MEDIA_STATE}: currentstate`,a=`${h.MAIN_CAM_STATE}: ${Number(e)}`,c=`${h.MIC_STATE}: ${Number(n)}`,o=[r,a,c];return i.sendInfo(O.MEDIA_STATE,void 0,{noTerminateWhenError:!0,...s,extraHeaders:o})}async sendStats({availableIncomingBitrate:e}){const n=this.getEstablishedRTCSessionProtected(),i=[`${h.AVAILABLE_INCOMING_BITRATE}: ${e}`];return n.sendInfo(O.STATS,void 0,{noTerminateWhenError:!0,extraHeaders:i})}async sendRefusalToTurnOn(e,n={}){const s=this.getEstablishedRTCSessionProtected(),a=e==="mic"?0:1,o=[`${h.MEDIA_TYPE}: ${a}`];return s.sendInfo(O.REFUSAL,void 0,{noTerminateWhenError:!0,...n,extraHeaders:o})}async sendRefusalToTurnOnMic(e={}){return this.sendRefusalToTurnOn("mic",{noTerminateWhenError:!0,...e})}async sendRefusalToTurnOnCam(e={}){return this.sendRefusalToTurnOn("cam",{noTerminateWhenError:!0,...e})}async sendAvailableContentedStream(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.AVAILABLE_CONTENTED_STREAM]})}async askPermissionToStartPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.ACK_PERMISSION_TO_START_PRESENTATION]})}async sendStoppedPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.STOPPED_CLIENT_PRESENTATION]})}async sendNotAvailableContentedStream(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.NOT_AVAILABLE_CONTENTED_STREAM]})}async askPermissionToEnableCam(e={}){const n=this.getEstablishedRTCSessionProtected(),s=[G.ENABLE_MAIN_CAM];return n.sendInfo(O.MAIN_CAM,void 0,{noTerminateWhenError:!0,...e,extraHeaders:s}).catch(i=>{if(en(i))throw i})}getEstablishedRTCSessionProtected=()=>{const e=this.callManager?.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};handleSipEvent=({request:e})=>{this.maybeHandleNotify(e)};maybeHandleNotify=e=>{try{const n=e.getHeader(h.NOTIFY);if(n){const s=JSON.parse(n);this.handleNotify(s)}}catch(n){ke("error parse notify",n)}};handleNotify=e=>{switch(e.cmd){case y.CHANNELS:{this.triggerChannelsNotify(e);break}case y.WEBCAST_STARTED:{this.triggerWebcastStartedNotify(e);break}case y.WEBCAST_STOPPED:{this.triggerWebcastStoppedNotify(e);break}case y.ADDED_TO_LIST_MODERATORS:{this.triggerAddedToListModeratorsNotify(e);break}case y.REMOVED_FROM_LIST_MODERATORS:{this.triggerRemovedFromListModeratorsNotify(e);break}case y.ACCEPTING_WORD_REQUEST:{this.triggerParticipationAcceptingWordRequest(e);break}case y.CANCELLING_WORD_REQUEST:{this.triggerParticipationCancellingWordRequest(e);break}case y.MOVE_REQUEST_TO_STREAM:{this.triggerParticipantMoveRequestToStream(e);break}case y.ACCOUNT_CHANGED:{this.triggerAccountChangedNotify();break}case y.ACCOUNT_DELETED:{this.triggerAccountDeletedNotify();break}case y.CONFERENCE_PARTICIPANT_TOKEN_ISSUED:{this.maybeTriggerConferenceParticipantTokenIssued(e);break}default:ke("unknown cmd",e)}};handleNewInfo=e=>{const{originator:n}=e;if(n!=="remote")return;const{request:s}=e,i=s,r=A(i,h.CONTENT_TYPE);if(r!==void 0)switch(r){case _.ENTER_ROOM:{this.triggerEnterRoom(i),this.maybeTriggerChannels(i);break}case _.NOTIFY:{this.maybeHandleNotify(i);break}case _.SHARE_STATE:{this.triggerContentedStreamState(i);break}case _.MAIN_CAM:{this.triggerMainCamControl(i);break}case _.MIC:{this.triggerMicControl(i);break}case _.USE_LICENSE:{this.triggerUseLicense(i);break}case _.PARTICIPANT_STATE:{this.maybeTriggerParticipantMoveRequest(i);break}}};triggerChannelsNotify=e=>{const n=e.input,s=e.output,i={inputChannels:n,outputChannels:s};this.events.trigger("channels:notify",i)};triggerWebcastStartedNotify=({body:{conference:e,type:n}})=>{const s={conference:e,type:n};this.events.trigger("webcast:started",s)};triggerWebcastStoppedNotify=({body:{conference:e,type:n}})=>{const s={conference:e,type:n};this.events.trigger("webcast:stopped",s)};triggerAddedToListModeratorsNotify=({conference:e})=>{const n={conference:e};this.events.trigger("participant:added-to-list-moderators",n)};triggerRemovedFromListModeratorsNotify=({conference:e})=>{const n={conference:e};this.events.trigger("participant:removed-from-list-moderators",n)};triggerParticipationAcceptingWordRequest=({body:{conference:e}})=>{const n={conference:e};this.events.trigger("participation:accepting-word-request",n)};triggerParticipationCancellingWordRequest=({body:{conference:e}})=>{const n={conference:e};this.events.trigger("participation:cancelling-word-request",n)};triggerParticipantMoveRequestToStream=({body:{conference:e}})=>{const n={conference:e};this.events.trigger("participant:move-request-to-stream",n)};triggerAccountChangedNotify=()=>{this.events.trigger("account:changed")};triggerAccountDeletedNotify=()=>{this.events.trigger("account:deleted")};maybeTriggerConferenceParticipantTokenIssued=({body:{conference:e,participant:n,jwt:s}})=>{const i={conference:e,participant:n,jwt:s};rn(i)&&this.events.trigger("conference:participant-token-issued",i)};maybeTriggerChannels=e=>{const n=A(e,h.INPUT_CHANNELS),s=A(e,h.OUTPUT_CHANNELS);if(n!==void 0&&s!==void 0){const i={inputChannels:n,outputChannels:s};this.events.trigger("channels:all",i)}};triggerEnterRoom=e=>{const n=A(e,h.CONTENT_ENTER_ROOM),s=A(e,h.PARTICIPANT_NAME),i=A(e,h.BEARER_TOKEN),r=A(e,h.IS_DIRECT_PEER_TO_PEER);n!==void 0&&s!==void 0&&this.events.trigger("enter-room",{room:n,participantName:s,bearerToken:i,isDirectPeerToPeer:r})};triggerContentedStreamState=e=>{const n=A(e,h.CONTENTED_STREAM_STATE);if(n!==void 0)switch(n){case X.AVAILABLE_CONTENTED_STREAM:{const s=A(e,h.CONTENTED_STREAM_CODEC);this.events.trigger("contented-stream:available",{codec:s});break}case X.NOT_AVAILABLE_CONTENTED_STREAM:{this.events.trigger("contented-stream:not-available");break}case X.MUST_STOP_PRESENTATION:{this.events.trigger("presentation:must-stop");break}}};maybeTriggerParticipantMoveRequest=e=>{const n=A(e,h.CONTENT_PARTICIPANT_STATE),s=A(e,h.AUDIO_ID),i=A(e,h.SPECTATOR_MODE);if(n===re.SPECTATOR){const r=i===be.BY_STATE_CAM;s===void 0?(this.events.trigger("participant:move-request-to-spectators-synthetic",{isAvailableSendingMedia:r}),this.events.trigger("participant:move-request-to-spectators",{isAvailableSendingMedia:r,isSynthetic:!0})):(this.events.trigger("participant:move-request-to-spectators-with-audio-id",{isAvailableSendingMedia:r,audioId:s}),this.events.trigger("participant:move-request-to-spectators",{isAvailableSendingMedia:r,isSynthetic:!1,audioId:s}))}n===re.PARTICIPANT&&this.events.trigger("participant:move-request-to-participants")};triggerMainCamControl=e=>{const n=A(e,h.MAIN_CAM),s=A(e,h.MEDIA_SYNC),i=s===oe.ADMIN_SYNC_FORCED;if(n===P.ADMIN_START_MAIN_CAM){this.events.trigger("admin:start-main-cam",{isSyncForced:i});return}if(n===P.ADMIN_STOP_MAIN_CAM){this.events.trigger("admin:stop-main-cam",{isSyncForced:i});return}(n===P.RESUME_MAIN_CAM||n===P.PAUSE_MAIN_CAM)&&s!==void 0&&this.events.trigger("admin:force-sync-media-state",{isSyncForced:i});const r=A(e,h.MAIN_CAM_RESOLUTION);this.events.trigger("main-cam-control",{mainCam:n,resolutionMainCam:r})};triggerMicControl=e=>{const n=A(e,h.MIC),i=A(e,h.MEDIA_SYNC)===oe.ADMIN_SYNC_FORCED;n===ae.ADMIN_START_MIC?this.events.trigger("admin:start-mic",{isSyncForced:i}):n===ae.ADMIN_STOP_MIC&&this.events.trigger("admin:stop-mic",{isSyncForced:i})};triggerUseLicense=e=>{const n=A(e,h.CONTENT_USE_LICENSE);n!==void 0&&this.events.trigger("use-license",n)};async sendEnterRoomProtected(e){return this.getEstablishedRTCSessionProtected().sendInfo(_.ENTER_ROOM,void 0,{extraHeaders:e})}}const ln=(t,e)=>{const n=e.major===t.major,s=e.minor===t.minor,i=e.major>t.major,r=n&&e.minor>t.minor,a=n&&s&&e.patch>t.patch;return i||r||a},hn=t=>t.major!==void 0&&t.minor!==void 0&&t.patch!==void 0,un=t=>e=>hn(t)&&ln(t,e),gn=(t="")=>{const e=t.split(".");if(e.length<=1)return{major:void 0,minor:void 0,patch:void 0};const[n,s,i]=e.map(r=>Number.parseInt(r,10));return{major:n,minor:s,patch:i}},mn=()=>globalThis.process?.versions?.electron!==void 0,Pe=()=>{const t=new Qt.UAParser,{name:e,version:n}=t.getBrowser(),{name:s}=t.getOS(),{type:i}=t.getDevice(),r=mn(),a=i==="mobile",c=gn(n);return{hasGreaterThanBrowserVersion:un(c),isMobileDevice:a,isChrome:e==="Chrome"||r,isYandexBrowser:e==="Yandex",isSafari:e==="Safari",isOpera:e==="Opera",isWindows:s==="Windows"}},pn=C("stringifyMessage"),Cn=t=>{let e="";try{e=JSON.stringify(t)}catch(n){pn("failed to stringify message",n)}return e},En=/^p2p.+to.+$/i,ce=t=>t!==void 0&&t.length>0&&En.test(t),nt="purgatory",ee=t=>t===nt,Tn=(t,e)=>{t.getVideoTracks().forEach(s=>{"contentHint"in s&&s.contentHint!==e&&(s.contentHint=e)})},K=(t,{directionVideo:e,directionAudio:n,contentHint:s}={})=>{if(!t||e==="recvonly"&&n==="recvonly")return;const i=n==="recvonly"?[]:t.getAudioTracks(),r=e==="recvonly"?[]:t.getVideoTracks(),a=[...i,...r],c=new MediaStream(a);return c.getTracks=()=>[...c.getAudioTracks(),...c.getVideoTracks()],s&&s!=="none"&&Tn(c,s),c},Sn="api/v2/rtp2webrtc/offer",st=async({serverUrl:t,conferenceNumber:e,quality:n,audio:s,offer:i,token:r})=>{const a=new URL(`https://${t.replace(/\/$/,"")}/${Sn}/${encodeURIComponent(e)}`);a.searchParams.set("quality",n),a.searchParams.set("audio",String(s));const c={"Content-Type":"application/json",Authorization:`Bearer ${r}`},o=await fetch(a.toString(),{method:"POST",headers:c,credentials:"same-origin",body:JSON.stringify(i)});if(!o.ok)throw new Error(`sendOffer failed with status ${o.status}`);const l=await o.json();return{type:l.type,sdp:l.sdp,toJSON(){return l}}},Rn=(t,e)=>(t.degradationPreference=e.degradationPreference,t),vn=(t,e)=>{t.encodings??=[];for(let n=t.encodings.length;n<e;n+=1)t.encodings.push({});return t},it=t=>(e,n)=>n!==void 0&&e!==n||n===void 0&&e!==t,fn=it(),Nn=(t,e)=>{if(fn(t,e))return t},An=(t,e,{isResetAllowed:n=!1}={})=>{const s=t.maxBitrate,i=Nn(e,s);return(i!==void 0||n)&&(t.maxBitrate=i??e),t},rt=1,In=it(rt),Mn=(t,e)=>{const n=t===void 0?void 0:Math.max(t,rt);if(n!==void 0&&In(n,e))return n},bn=(t,e)=>{const n=t.scaleResolutionDownBy,s=Mn(e,n);return s!==void 0&&(t.scaleResolutionDownBy=s),t},yn=(t,e,{isResetAllowed:n}={})=>{const s=e.encodings?.length??0;return vn(t,s),t.encodings.forEach((i,r)=>{const a=(e?.encodings??[])[r],c=a?.maxBitrate,o=a?.scaleResolutionDownBy;An(i,c,{isResetAllowed:n}),bn(i,o)}),t},Pn=(t,e)=>{if(t.codecs?.length!==e.codecs?.length)return!0;for(let n=0;n<(t.codecs?.length??0);n++)if(JSON.stringify(t.codecs[n])!==JSON.stringify(e.codecs[n]))return!0;if(t.headerExtensions?.length!==e.headerExtensions?.length)return!0;for(let n=0;n<(t.headerExtensions?.length??0);n++)if(JSON.stringify(t.headerExtensions[n])!==JSON.stringify(e.headerExtensions[n]))return!0;if(t.encodings?.length!==e.encodings?.length)return!0;for(let n=0;n<(t.encodings?.length??0);n++)if(JSON.stringify(t.encodings[n])!==JSON.stringify(e.encodings[n]))return!0;return t.rtcp?.cname!==e.rtcp?.cname||t.rtcp?.reducedSize!==e.rtcp?.reducedSize||t.degradationPreference!==e.degradationPreference},de=async(t,e,{isResetAllowed:n}={})=>{const s=t.getParameters(),i=JSON.parse(JSON.stringify(s));yn(s,e,{isResetAllowed:n}),Rn(s,e);const r=Pn(i,s);return r&&await t.setParameters(s),{parameters:s,isChanged:r}},Oe=async(t,e,n)=>{const{isChanged:s,parameters:i}=await de(t,{encodings:[{scaleResolutionDownBy:e.scaleResolutionDownBy,maxBitrate:e.maxBitrate}]});return s&&n&&n(i),{isChanged:s,parameters:i}},On=(t,e)=>t.find(n=>n.track!==null&&e.getTracks().includes(n.track)),_n=async(t,e,n)=>{const s=On(t,e);if(s)return Oe(s,{maxBitrate:n})},Dn=C("resolveOnStartMainCam"),wn=t=>n=>(Dn("onStartMainCam"),t.on("api:admin:start-main-cam",n)),Ln=C("resolveOnStartMic"),kn=t=>n=>(Ln("onStartMic"),t.on("api:admin:start-mic",n)),Un=C("resolveOnStopMainCam"),Bn=t=>n=>(Un("onStopMainCam"),t.on("api:admin:stop-main-cam",n)),Fn=C("resolveOnStopMic"),$n=t=>n=>(Fn("onStopMic"),t.on("api:admin:stop-mic",n));class at{command=void 0;unsubscribe;options;constructor(e){this.options=e}set(e){this.cancel(),this.command=e,this.unsubscribe=this.options.subscribe(n=>{this.options.isReady(n)?(this.command!==void 0&&this.options.onExecute(this.command),this.cancel()):this.options.isCancelled(n)&&this.cancel()})}cancel(){this.unsubscribe?.(),this.unsubscribe=void 0,this.command=void 0}}const p="evaluate";var d=(t=>(t.IDLE="call:idle",t.CONNECTING="call:connecting",t.PRESENTATION_CALL="call:presentationCall",t.ROOM_PENDING_AUTH="call:roomPendingAuth",t.PURGATORY="call:purgatory",t.P2P_ROOM="call:p2pRoom",t.DIRECT_P2P_ROOM="call:directP2pRoom",t.IN_ROOM="call:inRoom",t.DISCONNECTING="call:disconnecting",t))(d||{});class H{actor;subscriptions=[];stateChangeListeners=new Set;constructor(e){this.actor=g.createActor(e),this.actor.start(),this.addSubscription(this.subscribe(n=>{const s=n.value;this.stateChangeListeners.forEach(i=>{i(s)})}))}get state(){return this.getSnapshot().value}get context(){return this.getSnapshot().context}send(e){this.actor.send(e)}getSnapshot(){return this.actor.getSnapshot()}subscribe(e){const n=this.actor.subscribe(e);return this.addSubscription(n),n}onStateChange(e){return this.stateChangeListeners.add(e),()=>{this.stateChangeListeners.delete(e)}}stop(){this.stateChangeListeners.clear(),this.subscriptions.forEach(e=>{e()}),this.subscriptions.length=0,this.actor.stop()}addSubscription(e){const n=typeof e=="function"?e:()=>{e.unsubscribe()};return this.subscriptions.push(n),n}}const ot=t=>"number"in t&&w(t.number)&&et(t.answer),ct=t=>"room"in t&&w(t.room)&&w(t.participantName),Gn=t=>"token"in t&&w(t.token),dt=t=>Gn(t)&&"conferenceForToken"in t&&w(t.conferenceForToken),J=t=>ot(t)&&ct(t),lt=t=>!dt(t)||!ct(t)?!1:t.conferenceForToken===t.room,ht=({isDirectPeerToPeer:t})=>t===!0,ge=t=>"isDirectPeerToPeer"in t&&ht(t),xn="x-vinteo-presentation-call: yes",qn=t=>nn(t)&&t.some(e=>e.trim().toLowerCase()===xn),Vn=t=>"extraHeaders"in t&&qn(t.extraHeaders)&&"isConfirmed"in t&&t.isConfirmed===!0,ne=t=>J(t)&&!ee(t.room)&&dt(t)&&lt(t),Q=t=>{const e=t;return{number:e.number,answer:e.answer,room:e.room,participantName:e.participantName}},I={[d.IDLE]:{guard:()=>!0,buildContext:()=>({})},[d.CONNECTING]:{guard:ot,buildContext:t=>{const{number:e,answer:n,extraHeaders:s}=t;return{number:e,answer:n,extraHeaders:s}}},[d.PRESENTATION_CALL]:{guard:Vn,buildContext:t=>{const{number:e,answer:n}=t;return{number:e,answer:n}}},[d.ROOM_PENDING_AUTH]:{guard:t=>J(t)&&!ee(t.room)&&!ce(t.room)&&!ge(t)&&!lt(t),buildContext:Q},[d.PURGATORY]:{guard:t=>J(t)&&ee(t.room)&&!ne(t),buildContext:Q},[d.P2P_ROOM]:{guard:t=>J(t)&&ce(t.room)&&!ge(t)&&!ne(t),buildContext:Q},[d.DIRECT_P2P_ROOM]:{guard:t=>J(t)&&ge(t)&&!ne(t),buildContext:t=>({...Q(t),isDirectPeerToPeer:!0})},[d.IN_ROOM]:{guard:ne,buildContext:t=>{const{token:e,conferenceForToken:n}=t;return{...Q(t),token:e,conferenceForToken:n}}},[d.DISCONNECTING]:{guard:t=>t.pendingDisconnect===!0,buildContext:()=>({})}},Hn=t=>ee(t.room)||ce(t.room)||ht(t),Ue={raw:{},state:{}},me=()=>({}),Wn=()=>g.setup({types:{context:Ue,events:{}},actions:{setConnecting:g.assign(({event:t,context:e})=>t.type!=="CALL.CONNECTING"?e:{raw:{...me(),number:t.number,answer:t.answer,extraHeaders:t.extraHeaders}}),setRoomInfo:g.assign(({event:t,context:e})=>{if(t.type!=="CALL.ENTER_ROOM")return e;const n={room:t.room,participantName:t.participantName};return w(t.token)?(n.token=t.token,n.conferenceForToken=t.room):Hn(t)&&(n.token=void 0,n.conferenceForToken=void 0),et(t.isDirectPeerToPeer)&&(n.isDirectPeerToPeer=t.isDirectPeerToPeer),{raw:{...e.raw,...n}}}),setTokenInfo:g.assign(({event:t,context:e})=>t.type!=="CALL.TOKEN_ISSUED"?e:{raw:{...e.raw,token:t.token,conferenceForToken:t.conferenceForToken,participantName:t.participantName}}),setConfirmed:g.assign(({event:t,context:e})=>t.type!=="CALL.PRESENTATION_CALL"?e:{raw:{...e.raw,isConfirmed:!0}}),reset:g.assign(()=>({raw:me()})),prepareDisconnect:g.assign(()=>({raw:{...me(),pendingDisconnect:!0}}))}}).createMachine({id:"call",initial:d.IDLE,context:Ue,states:{[d.IDLE]:{entry:g.assign(()=>({state:I[d.IDLE].buildContext()})),on:{"CALL.CONNECTING":{target:p,actions:"setConnecting"}}},[d.CONNECTING]:{entry:g.assign(({context:t})=>({state:I[d.CONNECTING].buildContext(t.raw)})),on:{"CALL.PRESENTATION_CALL":{target:p,actions:"setConfirmed"},"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.ROOM_PENDING_AUTH]:{entry:g.assign(({context:t})=>({state:I[d.ROOM_PENDING_AUTH].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.IN_ROOM]:{entry:g.assign(t=>({state:I[d.IN_ROOM].buildContext(t.context.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[p]:{always:[{target:d.DISCONNECTING,guard:({context:t})=>I[d.DISCONNECTING].guard(t.raw)},{target:d.PRESENTATION_CALL,guard:({context:t})=>I[d.PRESENTATION_CALL].guard(t.raw)},{target:d.IN_ROOM,guard:({context:t})=>I[d.IN_ROOM].guard(t.raw)},{target:d.DIRECT_P2P_ROOM,guard:({context:t})=>I[d.DIRECT_P2P_ROOM].guard(t.raw)},{target:d.P2P_ROOM,guard:({context:t})=>I[d.P2P_ROOM].guard(t.raw)},{target:d.PURGATORY,guard:({context:t})=>I[d.PURGATORY].guard(t.raw)},{target:d.ROOM_PENDING_AUTH,guard:({context:t})=>I[d.ROOM_PENDING_AUTH].guard(t.raw)},{target:d.CONNECTING,guard:({context:t})=>I[d.CONNECTING].guard(t.raw)},{target:d.IDLE}]},[d.PURGATORY]:{entry:g.assign(({context:t})=>({state:I[d.PURGATORY].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.P2P_ROOM]:{entry:g.assign(({context:t})=>({state:I[d.P2P_ROOM].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.PRESENTATION_CALL]:{entry:g.assign(({context:t})=>({state:I[d.PRESENTATION_CALL].buildContext(t.raw)})),on:{"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.DIRECT_P2P_ROOM]:{entry:g.assign(({context:t})=>({state:I[d.DIRECT_P2P_ROOM].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.DISCONNECTING]:{entry:g.assign(()=>({state:I[d.DISCONNECTING].buildContext()})),on:{"CALL.RESET":{target:p,actions:"reset"}}}}});function Qn(t){return t!==p}const Yn=C("CallStateMachine");class jn extends H{constructor(e,n){super(e),this.subscribeToEvents(n)}get isIdle(){return this.state===d.IDLE}get isConnecting(){return this.state===d.CONNECTING}get isPresentationCall(){return this.state===d.PRESENTATION_CALL}get isRoomPendingAuth(){return this.state===d.ROOM_PENDING_AUTH}get isInPurgatory(){return this.state===d.PURGATORY}get isP2PRoom(){return this.state===d.P2P_ROOM}get isDirectP2PRoom(){return this.state===d.DIRECT_P2P_ROOM}get isInRoom(){return this.state===d.IN_ROOM}get isDisconnecting(){return this.state===d.DISCONNECTING}get idleContext(){if(this.state===d.IDLE)return this.context.state}get connectingContext(){if(this.state===d.CONNECTING)return this.context.state}get roomPendingAuthContext(){if(this.state===d.ROOM_PENDING_AUTH)return this.context.state}get purgatoryContext(){if(this.state===d.PURGATORY)return this.context.state}get p2pRoomContext(){if(this.state===d.P2P_ROOM)return this.context.state}get directP2pRoomContext(){if(this.state===d.DIRECT_P2P_ROOM)return this.context.state}get inRoomContext(){if(this.state===d.IN_ROOM)return this.context.state}get disconnectingContext(){if(this.state===d.DISCONNECTING)return this.context.state}get isActive(){return this.isInRoom||this.isPresentationCall||this.isRoomPendingAuth||this.isInPurgatory||this.isP2PRoom||this.isDirectP2PRoom}get number(){const{raw:e}=this.context;if("number"in e)return e.number}get token(){return this.inRoomContext?.token}get isCallInitiator(){return!this.isCallAnswerer}get isCallAnswerer(){return this.connectingContext?.answer??!1}getInRoomCredentials(){const e=this.inRoomContext;if(e!==void 0)return{token:e.token,conferenceForToken:e.conferenceForToken}}onInRoomCredentialsChange(e){let n;const s=this.subscribe(i=>{if(i.value===d.IN_ROOM){const r=i.context.state,a={token:r.token,conferenceForToken:r.conferenceForToken},c=n?.token,o=n?.conferenceForToken;(c!==a.token||o!==a.conferenceForToken)&&(n=a,e(a));return}Qn(i.value)&&(n=void 0)});return()=>{s.unsubscribe()}}reset(){this.send({type:"CALL.RESET"})}send(e){if(!this.actor.getSnapshot().can(e)){Yn(`[CallStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}subscribeToApiEvents(e){this.addSubscription(e.on("enter-room",({room:n,participantName:s,bearerToken:i,isDirectPeerToPeer:r})=>{this.send({room:n,participantName:s,isDirectPeerToPeer:r,type:"CALL.ENTER_ROOM",token:i})})),this.addSubscription(e.on("conference:participant-token-issued",({jwt:n,conference:s,participant:i})=>{this.send({token:n,type:"CALL.TOKEN_ISSUED",conferenceForToken:s,participantName:i})}))}subscribeToEvents(e){this.addSubscription(e.on("start-call",({number:n,answer:s,extraHeaders:i})=>{this.send({type:"CALL.CONNECTING",number:n,answer:s,extraHeaders:i})})),this.addSubscription(e.on("confirmed",()=>{this.send({type:"CALL.PRESENTATION_CALL"})})),this.addSubscription(e.on("end-call",()=>{this.send({type:"CALL.START_DISCONNECT"})})),this.addSubscription(e.on("ended",()=>{this.send({type:"CALL.RESET"})})),this.addSubscription(e.on("failed",()=>{this.send({type:"CALL.RESET"})}))}}const zn=t=>new jn(Wn(),t);var ut=(t=>(t.LOCAL="local",t.REMOTE="remote",t.SYSTEM="system",t))(ut||{});const gt=["peerconnection","connecting","sending","progress","accepted","confirmed","ended","failed","hold","unhold","muted","unmuted","newInfo","newDTMF","presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed","reinvite","update","refer","replaces","sdp","icecandidate","getusermediafailed","peerconnection:createofferfailed","peerconnection:createanswerfailed","peerconnection:setlocaldescriptionfailed","peerconnection:setremotedescriptionfailed"],Jn=["start-call","end-call","peerconnection:confirmed","peerconnection:ontrack","ended:fromserver","call-status-changed","remote-tracks-changed","remote-streams-changed","recv-session-started","recv-session-ended","recv-quality-changed"],mt=[...gt,...Jn],Xn=()=>new S.TypedEvents(mt),Kn=t=>[...t.keys()].map(e=>t.get(e)),Zn=(t,e)=>Kn(t).find(n=>n?.type===e),_e=async t=>t.getStats().then(e=>Zn(e,"codec")?.mimeType);class es{async getCodecFromSender(e){return await _e(e)??""}}const ts=C("TaskQueue");class ns{stackPromises=ue.createStackPromises({noRunIsNotActual:!0});async add(e){return this.stackPromises.add(e),this.run()}stop(){this.stackPromises.stop()}async run(){return this.stackPromises().catch(e=>{ts("TaskQueue: error",e)})}}class ss{taskQueue;onSetParameters;constructor(e){this.onSetParameters=e,this.taskQueue=new ns}async setEncodingsToSender(e,n){return this.taskQueue.add(async()=>Oe(e,n,this.onSetParameters))}stop(){this.taskQueue.stop()}}const Re=(t,e)=>t!==void 0&&e!==void 0&&t.toLowerCase().includes(e.toLowerCase()),is=1e6,D=t=>t*is,pt=D(.06),Ct=D(4),rs=t=>t<=64?pt:t<=128?D(.12):t<=256?D(.25):t<=384?D(.32):t<=426?D(.38):t<=640?D(.5):t<=848?D(.7):t<=1280?D(1):t<=1920?D(2):Ct,as="av1",os=t=>Re(t,as),cs=.6,De=(t,e)=>os(e)?t*cs:t,Et=t=>De(pt,t),Tt=t=>De(Ct,t),Be=(t,e)=>{const n=rs(t);return De(n,e)},pe=1,ds=({videoTrack:t,targetSize:e})=>{const n=t.getSettings(),s=n.width,i=n.height,r=s===void 0?pe:s/e.width,a=i===void 0?pe:i/e.height;return Math.max(r,a,pe)};class ls{ignoreForCodec;senderFinder;codecProvider;parametersSetter;resultNoChanged={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}};constructor({senderFinder:e,codecProvider:n,parametersSetter:s},i){this.senderFinder=e,this.codecProvider=n,this.parametersSetter=s,this.ignoreForCodec=i.ignoreForCodec}async balance(e,n){const s=e.getSenders(),i=this.senderFinder.findVideoSender(s);if(!i?.track)return{...this.resultNoChanged,sender:i};const r=await this.codecProvider.getCodecFromSender(i);if(Re(r,this.ignoreForCodec))return{...this.resultNoChanged,sender:i};const{mainCam:a,resolutionMainCam:c}=n??{};return this.processSender({mainCam:a,resolutionMainCam:c},{sender:i,codec:r,videoTrack:i.track}).then(o=>({...o,sender:i}))}async reset(e){const n=e.getSenders(),s=this.senderFinder.findVideoSender(n);if(!s?.track)return{...this.resultNoChanged,sender:s};const i=await this.codecProvider.getCodecFromSender(s);if(Re(i,this.ignoreForCodec))return{...this.resultNoChanged,sender:s};const r={sender:s,codec:i,videoTrack:s.track};return{...await this.setBitrateByTrackResolution(r),sender:s}}async processSender(e,n){const{mainCam:s,resolutionMainCam:i}=e;switch(s){case P.PAUSE_MAIN_CAM:return this.downgradeResolutionSender(n);case P.RESUME_MAIN_CAM:return this.setBitrateByTrackResolution(n);case P.MAX_MAIN_CAM_RESOLUTION:return i!==void 0?this.setResolutionSender(i,n):this.setBitrateByTrackResolution(n);case P.ADMIN_STOP_MAIN_CAM:case P.ADMIN_START_MAIN_CAM:case void 0:return this.setBitrateByTrackResolution(n);default:return this.setBitrateByTrackResolution(n)}}async downgradeResolutionSender(e){const{sender:n,codec:s}=e,i={scaleResolutionDownBy:200,maxBitrate:Et(s)};return this.parametersSetter.setEncodingsToSender(n,i)}async setBitrateByTrackResolution(e){const{sender:n,videoTrack:s,codec:i}=e,a=s.getSettings().width,c=a===void 0?Tt(i):Be(a,i);return this.parametersSetter.setEncodingsToSender(n,{scaleResolutionDownBy:1,maxBitrate:c})}async setResolutionSender(e,n){const[s,i]=e.split("x"),{sender:r,videoTrack:a,codec:c}=n,o={width:Number(s),height:Number(i)},l=ds({videoTrack:a,targetSize:o}),u=Be(o.width,c),m={scaleResolutionDownBy:l,maxBitrate:u};return this.parametersSetter.setEncodingsToSender(r,m)}}const hs=t=>t.find(e=>e.track?.kind==="video");class us{findVideoSender(e){return hs(e)}}class gs{currentSender;originalReplaceTrack;lastWidth;lastHeight;maxPollIntervalMs;currentPollIntervalMs;pollIntervalMs;setTimeoutRequest;constructor({pollIntervalMs:e=1e3,maxPollIntervalMs:n}){this.pollIntervalMs=e,this.maxPollIntervalMs=n??e*16,this.currentPollIntervalMs=this.pollIntervalMs,this.setTimeoutRequest=new V.SetTimeoutRequest}subscribe(e,n){if(!e){this.detachSender();return}this.currentSender!==e&&(this.detachSender(),this.attachSender(e,n))}unsubscribe(){this.detachSender()}attachSender(e,n){this.currentSender=e;const s=e.replaceTrack.bind(e);this.originalReplaceTrack=s,e.replaceTrack=async i=>{await s(i),this.attachTrack(n,i??void 0),n()},this.attachTrack(n,e.track)}detachSender(){this.currentSender&&this.originalReplaceTrack&&(this.currentSender.replaceTrack=this.originalReplaceTrack),this.originalReplaceTrack=void 0,this.currentSender=void 0,this.detachTrack()}attachTrack(e,n){if(this.detachTrack(),!n)return;const{width:s,height:i}=n.getSettings();this.lastWidth=s,this.lastHeight=i,this.currentPollIntervalMs=this.pollIntervalMs,this.schedulePoll(n,e)}schedulePoll(e,n){const s=()=>{const{width:i,height:r}=e.getSettings();i!==this.lastWidth||r!==this.lastHeight?(this.lastWidth=i,this.lastHeight=r,this.currentPollIntervalMs=this.pollIntervalMs,n()):this.currentPollIntervalMs=Math.min(this.currentPollIntervalMs*2,this.maxPollIntervalMs),this.setTimeoutRequest.request(s,this.currentPollIntervalMs)};this.setTimeoutRequest.request(s,this.currentPollIntervalMs)}detachTrack(){this.setTimeoutRequest.cancelRequest(),this.lastWidth=void 0,this.lastHeight=void 0}}class ms{apiManager;currentHandler;constructor(e){this.apiManager=e}subscribe(e){this.currentHandler=e,this.apiManager.on("main-cam-control",e)}unsubscribe(){this.currentHandler&&(this.apiManager.off("main-cam-control",this.currentHandler),this.currentHandler=void 0)}}const Ce=C("VideoSendingBalancer");class ps{eventHandler;senderBalancer;parametersSetterWithQueue;getConnection;serverHeaders;trackMonitor;constructor(e,n,{ignoreForCodec:s,onSetParameters:i,pollIntervalMs:r}={}){this.getConnection=n,this.eventHandler=new ms(e),this.parametersSetterWithQueue=new ss(i),this.senderBalancer=new ls({senderFinder:new us,codecProvider:new es,parametersSetter:this.parametersSetterWithQueue},{ignoreForCodec:s}),this.trackMonitor=new gs({pollIntervalMs:r})}subscribe(){this.eventHandler.subscribe(this.handleMainCamControl)}unsubscribe(){this.eventHandler.unsubscribe(),this.reset()}reset(){this.clearState();const e=this.getConnection();e?this.senderBalancer.reset(e).catch(n=>{Ce("reset sender encodings: error",n)}).finally(()=>{this.parametersSetterWithQueue.stop()}):this.parametersSetterWithQueue.stop()}async balance(){const e=this.getConnection();if(!e)throw new Error("connection is not exist");const n=await this.senderBalancer.balance(e,this.serverHeaders);return this.trackMonitor.subscribe(n.sender,()=>{this.balance().catch(s=>{Ce("balance on track change: error",s)})}),n}clearState(){delete this.serverHeaders,this.trackMonitor.unsubscribe()}handleMainCamControl=e=>{this.serverHeaders=e,this.balance().catch(n=>{Ce("handleMainCamControl: error",n)})}}const Cs=6e3,Es=52e4,se=(t,e)=>t.getSenders().filter(n=>n.track?.kind===e),Ts=(t,e)=>t==="audio"?Cs:Et(e),Ss=t=>t.track!==null;class Rs{previousBitrates=new Map;async setMinBitrateForSenders(e,n="all"){const s=[];if(!e)return;(n==="audio"||n==="all")&&s.push(...se(e,"audio")),(n==="video"||n==="all")&&s.push(...se(e,"video"));const i=s.filter(Ss).map(async r=>{const a=r.getParameters();this.saveCurrentBitrate(r,a);const c={...a,encodings:a.encodings.map(o=>({...o,maxBitrate:Ts(r.track.kind)}))};await de(r,c)});await Promise.all(i)}async restoreBitrateForSenders(e,n="all"){const s=[];if(!e)return;(n==="audio"||n==="all")&&s.push(...se(e,"audio")),(n==="video"||n==="all")&&s.push(...se(e,"video"));const i=s.map(async r=>{const a=this.getSavedBitrate(r);if(a){const c=r.getParameters(),o=r.track?.kind==="video",l=o?await _e(r):void 0,u={...c,encodings:a.map(m=>{const R=o?Tt(l):Es;return{...m,maxBitrate:m.maxBitrate??R}})};await de(r,u,{isResetAllowed:!0}),this.clearSavedBitrate(r)}});await Promise.all(i)}getSavedBitrate(e){return this.previousBitrates.get(e)}clearSavedBitrate(e){this.previousBitrates.delete(e)}clearAll(){this.previousBitrates.clear()}hasSavedBitrate(e){return this.previousBitrates.has(e)}getSavedCount(){return this.previousBitrates.size}saveCurrentBitrate(e,n){const s=n.encodings.map(i=>({...i}));this.previousBitrates.set(e,s)}}var we=(t=>(t.BYE="Terminated",t.WEBRTC_ERROR="WebRTC Error",t.CANCELED="Canceled",t.REQUEST_TIMEOUT="Request Timeout",t.REJECTED="Rejected",t.REDIRECTED="Redirected",t.UNAVAILABLE="Unavailable",t.NOT_FOUND="Not Found",t.ADDRESS_INCOMPLETE="Address Incomplete",t.INCOMPATIBLE_SDP="Incompatible SDP",t.BAD_MEDIA_DESCRIPTION="Bad Media Description",t))(we||{});const Fe=C("MCUSession");class vs{events;rtcSession;disposers=new Set;onReset;pcConfig;bitrateStateManager=new Rs;constructor(e,{onReset:n}){this.events=e,this.onReset=n,e.on("failed",this.handleEnded),e.on("ended",this.handleEnded)}get connection(){return this.rtcSession?.connection}get isCallActive(){return this.rtcSession?.isEstablished()===!0}getEstablishedRTCSession=()=>this.rtcSession?.isEstablished()===!0?this.rtcSession:void 0;getPcConfig(){return this.pcConfig}async renegotiate(){if(this.rtcSession===void 0)throw new Error("No rtcSession established");return this.rtcSession.renegotiate()}startCall=async(e,n,{number:s,mediaStream:i,extraHeaders:r=[],iceServers:a,directionVideo:c,directionAudio:o,contentHint:l,offerToReceiveAudio:u=!0,offerToReceiveVideo:m=!0,degradationPreference:R,sendEncodings:T,onAddedTransceiver:L})=>new Promise((M,F)=>{this.handleCall().then(M).catch(W=>{F(W)}),this.pcConfig={iceServers:a},this.rtcSession=e.call(n(s),{mediaStream:K(i,{directionVideo:c,directionAudio:o,contentHint:l}),pcConfig:{iceServers:a},rtcOfferConstraints:{offerToReceiveAudio:u,offerToReceiveVideo:m},eventHandlers:this.events.triggers,extraHeaders:r,directionVideo:c,directionAudio:o,degradationPreference:R,sendEncodings:T,onAddedTransceiver:L})});async endCall(){const{rtcSession:e}=this;if(e&&!e.isEnded())return e.terminateAsync({cause:we.CANCELED}).finally(()=>{this.reset()});this.reset()}answerToIncomingCall=async(e,{mediaStream:n,extraHeaders:s=[],iceServers:i,directionVideo:r,directionAudio:a,offerToReceiveAudio:c,offerToReceiveVideo:o,contentHint:l,degradationPreference:u,sendEncodings:m,onAddedTransceiver:R})=>new Promise((T,L)=>{try{this.rtcSession=e,this.subscribeToSessionEvents(e),this.handleCall().then(T).catch(M=>{L(M)}),this.pcConfig={iceServers:i},e.answer({pcConfig:{iceServers:i},rtcOfferConstraints:{offerToReceiveAudio:c,offerToReceiveVideo:o},mediaStream:K(n,{directionVideo:r,directionAudio:a,contentHint:l}),extraHeaders:s,directionVideo:r,directionAudio:a,degradationPreference:u,sendEncodings:m,onAddedTransceiver:R})}catch(M){L(M)}});async replaceMediaStream(e,n){if(!this.rtcSession)throw new Error("No rtcSession established");const{contentHint:s}=n??{},i=K(e,{contentHint:s});if(i===void 0)throw new Error("No preparedMediaStream");return this.rtcSession.replaceMediaStream(i,n)}async restartIce(e){if(!this.rtcSession)throw new Error("No rtcSession established");return this.rtcSession.restartIce(e)}setMinBitrateForSenders(e="all"){this.bitrateStateManager.setMinBitrateForSenders(this.connection,e).catch(n=>{Fe("setMinBitrateForSenders",n)})}restoreBitrateForSenders(e="all"){this.bitrateStateManager.restoreBitrateForSenders(this.connection,e).catch(n=>{Fe("restoreBitrateForSenders",n)})}handleCall=async()=>new Promise((e,n)=>{const s=()=>{this.events.on("peerconnection",l),this.events.on("confirmed",u)},i=()=>{this.events.off("peerconnection",l),this.events.off("confirmed",u)},r=()=>{this.events.on("failed",c),this.events.on("ended",c)},a=()=>{this.events.off("failed",c),this.events.off("ended",c)},c=m=>{i(),a(),n(m)};let o;const l=({peerconnection:m})=>{o=m;const R=T=>{this.events.trigger("peerconnection:ontrack",T)};m.addEventListener("track",R),this.disposers.add(()=>{m.removeEventListener("track",R)})},u=()=>{o!==void 0&&this.events.trigger("peerconnection:confirmed",o),i(),a(),e(o)};s(),r()});subscribeToSessionEvents(e){this.events.eachTriggers((n,s)=>{const i=gt.find(r=>r===s);i&&(e.on(i,n),this.disposers.add(()=>{e.off(i,n)}))})}unsubscribeFromSessionEvents(){this.disposers.forEach(e=>{e()}),this.disposers.clear()}handleEnded=e=>{const{originator:n}=e;n==="remote"&&this.events.trigger("ended:fromserver",e),this.reset()};reset=()=>{delete this.rtcSession,delete this.pcConfig,this.unsubscribeFromSessionEvents(),this.bitrateStateManager.clearAll(),this.onReset()}}const ve=t=>t==="auto"?"high":t,fs=10,Ns=500,As=5e3;class Is{cancelableSendOfferWithRepeatedCalls;currentRenegotiation;config;tools;connection;lastCallParams;constructor(e,n){const s=e.quality??"auto";this.config={...e,quality:s,effectiveQuality:ve(s)},this.tools=n,this.connection=new RTCPeerConnection(e.pcConfig),this.addTransceivers()}get settings(){return this.config}get peerConnection(){return this.connection}getAudioChannel(){return this.config.audioChannel}getQuality(){return this.config.quality}getEffectiveQuality(){return this.config.effectiveQuality}async setQuality(e){if(!this.lastCallParams)return!1;const n=this.config.effectiveQuality,s=this.config.quality,i=ve(e);return e===s&&i===n?!1:(this.config.quality=e,this.config.effectiveQuality=i,i!==n&&await this.renegotiate(this.lastCallParams),!0)}async applyQuality(e){const n=await this.setQuality(e),s=this.getEffectiveQuality();return{applied:n,effectiveQuality:s}}close(){this.cancelSendOfferWithRepeatedCalls(),this.connection.close()}async call({conferenceNumber:e,token:n}){const s=this.waitForTracks(),i=await this.renegotiate({conferenceNumber:e,token:n});return await s,i}async renegotiate({conferenceNumber:e,token:n}){this.lastCallParams={conferenceNumber:e,token:n},this.cancelSendOfferWithRepeatedCalls();const s=this.currentRenegotiation;s&&await s.catch(()=>{});const i=this.performRenegotiate({conferenceNumber:e,token:n});this.currentRenegotiation=i;try{return await i}finally{this.currentRenegotiation===i&&(this.currentRenegotiation=void 0)}}async performRenegotiate({conferenceNumber:e,token:n}){this.hasHaveLocalOfferSignalingState()&&await this.connection.setLocalDescription({type:"rollback"}),await this.waitForPeerConnectionReady();const s=await this.createOffer(),i=async()=>this.tools.sendOffer({conferenceNumber:e,token:n,quality:this.config.effectiveQuality,audioChannel:this.config.audioChannel},s),r=c=>!(c instanceof Error);this.cancelableSendOfferWithRepeatedCalls=he.repeatedCallsAsync({targetFunction:i,isComplete:r,callLimit:fs,delay:Ns,isRejectAsValid:!0,isCheckBeforeCall:!1});const a=await this.cancelableSendOfferWithRepeatedCalls.then(c=>c).finally(()=>{this.cancelableSendOfferWithRepeatedCalls=void 0});return await this.setRemoteDescription(a),await this.waitForPeerConnectionReady(),!0}async createOffer(){const e=await this.connection.createOffer();return await this.connection.setLocalDescription(e),e}async setRemoteDescription(e){return this.connection.setRemoteDescription(e)}hasStableSignalingState(){return this.connection.signalingState==="stable"}hasReadyConnectionState(){const e=this.connection.connectionState;return e==="connected"||e==="new"}hasTerminalConnectionState(){const e=this.connection.connectionState;return e==="failed"||e==="closed"}isStableAndReady(){return this.hasStableSignalingState()&&this.hasReadyConnectionState()}hasHaveLocalOfferSignalingState(){return this.connection.signalingState==="have-local-offer"}async waitForPeerConnectionReady(){if(this.isStableAndReady())return;const e=()=>{const s=this.connection.connectionState;return new Error(`Peer connection in terminal state: ${s}. Recovery is not possible.`)},n=()=>this.hasTerminalConnectionState()?"error":this.isStableAndReady()?"success":"loading";if(n()==="error")throw e();return new Promise((s,i)=>{let r,a=!1;const c=()=>{a||(a=!0,clearTimeout(r),this.connection.removeEventListener("signalingstatechange",l),this.connection.removeEventListener("connectionstatechange",l),s())},o=u=>{a||(a=!0,clearTimeout(r),this.connection.removeEventListener("signalingstatechange",l),this.connection.removeEventListener("connectionstatechange",l),i(u))};function l(){const u=n();if(u==="error"){o(e());return}u==="success"&&c()}r=setTimeout(()=>{o(new Error("Timed out waiting for stable signaling state and ready connection state"))},As),this.connection.addEventListener("signalingstatechange",l),this.connection.addEventListener("connectionstatechange",l),l()})}async waitForTracks(){return new Promise(e=>{const n=new Set,s=i=>{const{track:r}=i;n.add(r.kind),n.has("audio")&&n.has("video")&&(this.connection.removeEventListener("track",s),e())};this.connection.addEventListener("track",s)})}addTransceivers(){this.addRecvOnlyTransceiver("audio"),this.addRecvOnlyTransceiver("video"),this.addRecvOnlyTransceiver("video"),this.addRecvOnlyTransceiver("video"),this.addRecvOnlyTransceiver("video")}addRecvOnlyTransceiver(e){const n={direction:"recvonly"};return this.connection.addTransceiver(e,n)}cancelSendOfferWithRepeatedCalls(){this.cancelableSendOfferWithRepeatedCalls?.cancel()}}const St=t=>t.getSettings(),Ms=(t,e)=>{const n=St(t);let s=e;s??=t.label;let i=n?.msid;return i??=s,i??=t.id,i},bs=(t,e)=>{const n=St(t);let s=e;return s??=n?.msid,s??=t.label,(s&&s.length>0?s:void 0)??t.id};class $e{participantGroups=new Map;trackToGroup=new Map;trackDisposers=new Map;get mainStream(){const e=this.getStreams(),[n]=e;return n}reset(){this.participantGroups.clear(),this.trackToGroup.clear(),this.trackDisposers.forEach(e=>{e()}),this.trackDisposers.clear()}addTrack(e,{onRemoved:n,streamHint:s}={}){const i=bs(e,s),r=Ms(e,s);if(this.trackToGroup.has(e.id))return{isAddedTrack:!1,isAddedStream:!1};const a=this.getParticipantGroups(i),c=a.get(r),o=!c;let l=c;l||(l={participantId:i,groupId:r,stream:new MediaStream,trackIds:new Set},a.set(r,l)),l.stream.addTrack(e),l.trackIds.add(e.id),this.trackToGroup.set(e.id,{participantId:i,groupId:r});const u=()=>{this.disposeTrackListener(e.id);const m=this.removeTrack(e.id);m.isRemovedTrack&&n?.({participantId:i,trackId:e.id,isRemovedStream:m.isRemovedStream})};return e.addEventListener("ended",u),this.trackDisposers.set(e.id,()=>{e.removeEventListener("ended",u)}),{isAddedTrack:!0,isAddedStream:o,participantId:i}}removeTrack(e){this.disposeTrackListener(e);const n=this.trackToGroup.get(e);if(!n)return{isRemovedTrack:!1,isRemovedStream:!1};const{participantId:s,groupId:i}=n,r=this.participantGroups.get(s),a=r?.get(i);if(!a)return this.trackToGroup.delete(e),{isRemovedTrack:!1,isRemovedStream:!1};const c=a.stream.getTracks().find(l=>l.id===e);c&&a.stream.removeTrack(c),a.trackIds.delete(e),this.trackToGroup.delete(e);const o=a.trackIds.size===0;return o&&(r?.delete(i),r?.size===0&&this.participantGroups.delete(s)),{isRemovedTrack:!0,isRemovedStream:o}}removeStaleTracks(e,n){const s=this.participantGroups.get(e);if(!s)return!1;let i=!1;return[...s.values()].forEach(a=>{[...a.trackIds].filter(o=>!n.includes(o)).forEach(o=>{const l=this.removeTrack(o);i||=l.isRemovedTrack})}),i}getStreams(e){if(e!==void 0){const n=this.participantGroups.get(e);return n?[...n.values()].map(s=>s.stream):[]}return[...this.participantGroups.values()].flatMap(n=>[...n.values()]).map(n=>n.stream)}disposeTrackListener(e){const n=this.trackDisposers.get(e);n&&(n(),this.trackDisposers.delete(e))}getParticipantGroups(e){const n=this.participantGroups.get(e);if(n)return n;const s=new Map;return this.participantGroups.set(e,s),s}}const Ee={type:"participant"},ys={type:"spectator_synthetic"},Ps=t=>({type:"spectator",recvParams:t});class f{role=Ee;onRoleChanged;constructor(e){this.onRoleChanged=e}static hasParticipant(e){return e.type==="participant"}static hasSpectatorSynthetic(e){return e.type==="spectator_synthetic"}static hasSpectator(e){return e.type==="spectator"}static isExitingSpectatorRole(e,n){return f.hasSpectator(e)&&!f.hasSpectator(n)}static isEnteringSpectatorRole(e,n){return f.hasSpectator(n)}static isExitingAnySpectatorRole(e,n){const s=f.hasSpectator(e)||f.hasSpectatorSynthetic(e),i=f.hasSpectator(n)||f.hasSpectatorSynthetic(n);return s&&!i}static isEnteringAnySpectatorRole(e,n){const s=f.hasSpectator(e)||f.hasSpectatorSynthetic(e),i=f.hasSpectator(n)||f.hasSpectatorSynthetic(n);return!s&&i}getRole(){return this.role}setCallRoleParticipant(){this.changeRole(Ee)}setCallRoleSpectatorSynthetic(){this.changeRole(ys)}setCallRoleSpectator(e){this.changeRole(Ps(e))}changeRole(e){const n=this.role;if(n.type!==e.type){this.setRole(e);return}f.hasSpectator(e)&&f.hasSpectator(n)&&n.recvParams.audioId!==e.recvParams.audioId&&this.setRole(e)}reset(){this.role=Ee}hasParticipant(){return f.hasParticipant(this.role)}hasSpectatorSynthetic(){return f.hasSpectatorSynthetic(this.role)}hasSpectator(){return f.hasSpectator(this.role)}setRole(e){const n=this.role;this.role=e,this.onRoleChanged?.({previous:n,next:e})}}const Os=(t,e)=>{if(!t||!e)return t===e;const n=t.mainStream?.id,s=e.mainStream?.id,i=t.contentedStream?.id,r=e.contentedStream?.id;return n===s&&i===r};class _s{lastEmittedStreams;hasChanged(e){return!Os(this.lastEmittedStreams,e)}updateLastEmittedStreams(e){this.lastEmittedStreams=e}getLastEmittedStreams(){return this.lastEmittedStreams}reset(){this.lastEmittedStreams=void 0}}const Ds="default",ws="dual",Ls="content_",ks=t=>`${Ls}${t.toLowerCase()}`,Us=t=>[...t.getTracks()].some(e=>e.label.includes(ws));class Bs{mainRemoteStreamsManager;recvRemoteStreamsManager;constructor(e,n){this.mainRemoteStreamsManager=e,this.recvRemoteStreamsManager=n}getActiveStreamsManagerTools({isSpectator:e,stateInfo:n}){return e?this.getRecvRemoteStreamsManagerTools({stateInfo:n}):this.getMainRemoteStreamsManagerTools({stateInfo:n})}getMainRemoteStreamsManagerTools({stateInfo:e}){const n=this.mainRemoteStreamsManager;return{manager:n,getRemoteStreams:()=>{const i=n.getStreams(),r=i.find(c=>!Us(c)),a=e.isAvailable?i.find(c=>c!==r):void 0;return{mainStream:r,contentedStream:a}}}}getRecvRemoteStreamsManagerTools({stateInfo:e}){const n=this.recvRemoteStreamsManager;return{manager:n,getRemoteStreams:()=>{const r=n.getStreams(Ds)[0],a=this.getRecvRemoteContentedStream({stateInfo:e});return{mainStream:r,contentedStream:a}}}}getRecvRemoteContentedStream({stateInfo:e}){if(!e.isAvailable||e.codec===void 0)return;const n=ks(e.codec);return this.recvRemoteStreamsManager.getStreams(n)[0]}}const Fs="udp",$s=t=>t.transport?.iceTransport?t.transport.iceTransport.getLocalCandidates():[],Gs=t=>t.getReceivers().flatMap($s),xs=t=>{const s=Gs(t).filter(({protocol:i,port:r})=>r!==null&&Fs===i).map(({port:i})=>i);return[...new Set(s)]},Ge=t=>t.streams[0]?.id;class qs extends S.EventEmitterProxy{stateMachine;isPendingCall=!1;isPendingAnswer=!1;mainRemoteStreamsManager=new $e;recvRemoteStreamsManager=new $e;streamsManagerProvider;contentedStreamManager;tools;roleManager=new f(e=>{this.onRoleChanged(e)});mcuSession;recvSession;disposeRecvSessionTrackListener;disposeInRoomCredentialsListener;deferredStartRecvSessionRunner;streamsChangeTracker=new _s;constructor({contentedStreamManager:e},n){super(Xn()),this.contentedStreamManager=e,this.tools=n,this.mcuSession=new vs(this.events,{onReset:this.reset}),this.stateMachine=zn(this.events),this.streamsManagerProvider=new Bs(this.mainRemoteStreamsManager,this.recvRemoteStreamsManager),this.deferredStartRecvSessionRunner=new at({subscribe:s=>this.stateMachine.onStateChange(s),isReady:s=>s===d.IN_ROOM,isCancelled:s=>s===d.IDLE,onExecute:s=>{this.startRecvSessionForced({audioChannel:s.audioId}).catch(()=>{})}}),this.subscribeCallStatusChange(),this.subscribeMcuRemoteTrackEvents(),this.subscribeContentedStreamEvents()}get requested(){return this.isPendingCall||this.isPendingAnswer}get connection(){return this.mcuSession.connection}get isCallActive(){return this.mcuSession.isCallActive}get number(){return this.stateMachine.number}get isCallInitiator(){return this.stateMachine.isCallInitiator}get isDirectP2PRoom(){return this.stateMachine.isDirectP2PRoom}get isPresentationCall(){return this.stateMachine.isPresentationCall}get isDisconnecting(){return this.stateMachine.isDisconnecting}get localPorts(){const e=this.getActivePeerConnection();return e?xs(e):[]}getStreamsManagerProvider(){return this.streamsManagerProvider}getContentedStreamManager(){return this.contentedStreamManager}getEstablishedRTCSession=()=>this.mcuSession.getEstablishedRTCSession();subscribeToApiEvents(e){this.stateMachine.subscribeToApiEvents(e.events)}startCall=async(e,n,s)=>(this.isPendingCall=!0,this.events.emit("start-call",{extraHeaders:s.extraHeaders,number:s.number,answer:!1}),this.mcuSession.startCall(e,n,s).finally(()=>{this.isPendingCall=!1}));async endCall(){return this.events.emit("end-call"),this.mcuSession.endCall()}async renegotiate(){return this.hasSpectator()?this.renegotiateRecvSession():this.renegotiateMcuSession()}answerToIncomingCall=async(e,n)=>{this.isPendingAnswer=!0;const s=e();return this.events.emit("start-call",{answer:!0,extraHeaders:n.extraHeaders,number:s.remote_identity.uri.user}),this.mcuSession.answerToIncomingCall(s,n).finally(()=>{this.isPendingAnswer=!1})};getMainRemoteStream(){const{mainStream:e}=this.getRemoteStreams();return e}getRemoteStreams(){const{getRemoteStreams:e}=this.getActiveStreamsManagerTools();return e()}getToken(){return this.stateMachine.token}getRecvQuality(){const{recvSession:e}=this;if(e===void 0)return;const n=e.getEffectiveQuality();return{quality:e.getQuality(),effectiveQuality:n}}getActivePeerConnection=()=>this.hasSpectator()?this.recvSession?.peerConnection:this.mcuSession.connection;hasSpectator(){return this.roleManager.hasSpectator()}setCallRoleParticipant(){this.roleManager.setCallRoleParticipant()}setCallRoleSpectatorSynthetic(){this.roleManager.setCallRoleSpectatorSynthetic()}setCallRoleSpectator(e){this.roleManager.setCallRoleSpectator(e)}async replaceMediaStream(e,n){return this.mcuSession.replaceMediaStream(e,n)}async restartIce(e){return this.mcuSession.restartIce(e)}async restartRecvSession(){const{recvSession:e}=this;if(!this.hasSpectator()||!e)return!1;const n=e.getAudioChannel(),s=e.getQuality(),{callResult:i}=await this.startRecvSessionForced({audioChannel:n,quality:s},{silent:!0});return i}async setRecvQuality(e){const{recvSession:n}=this;if(!this.hasSpectator()||!n)return!1;const s=n.getQuality(),i=n.getEffectiveQuality(),r=n.getAudioChannel(),a=ve(e);if(e===s&&a===i)return!1;if(a===i)return await n.setQuality(e),this.events.trigger("recv-quality-changed",{previousQuality:s,quality:e,effectiveQuality:i}),!0;const{session:c,callResult:o}=await this.startRecvSessionForced({audioChannel:r,quality:e},{silent:!0});if(o){const l=c.getEffectiveQuality();this.events.trigger("recv-quality-changed",{previousQuality:s,quality:e,effectiveQuality:l})}return o}async applyQuality(e){const{recvSession:n}=this;if(!this.hasSpectator()||!n)return!1;const s=n.getQuality(),i=await n.applyQuality(e);return i.applied&&this.events.trigger("recv-quality-changed",{previousQuality:s,quality:e,effectiveQuality:i.effectiveQuality}),i.applied}async failed(e,n){this.emitFailedCall(e,n),await this.endCall()}emitFailedCall(e,n){this.events.trigger("failed",{message:e,cause:n,originator:"local"})}reset=()=>{this.mainRemoteStreamsManager.reset(),this.roleManager.reset(),this.recvRemoteStreamsManager.reset(),this.stopRecvSession(),this.deferredStartRecvSessionRunner.cancel(),this.streamsChangeTracker.reset()};subscribeCallStatusChange(){const e=this.createCallStatusChangeListener();this.onRace(["accepted","confirmed","ended","failed"],e)}createCallStatusChangeListener(){let e=this.isCallActive;return()=>{const n=this.isCallActive;n!==e&&this.events.trigger("call-status-changed",{isCallActive:n}),e=n}}subscribeMcuRemoteTrackEvents(){this.on("peerconnection:ontrack",e=>{this.addRemoteTrack(this.mainRemoteStreamsManager,e.track,Ge(e))})}addRemoteTrack(e,n,s){const i=e.addTrack(n,{streamHint:s,onRemoved:r=>{this.handleChangedRemoteTracks(e,"removed",{isRemovedStream:r.isRemovedStream,isAddedStream:!1,trackId:r.trackId,participantId:r.participantId})}});i.isAddedTrack&&this.handleChangedRemoteTracks(e,"added",{isRemovedStream:!1,isAddedStream:i.isAddedStream,trackId:n.id,participantId:i.participantId})}handleChangedRemoteTracks(e,n,{trackId:s,participantId:i,isRemovedStream:r,isAddedStream:a}){const c=this.getActiveStreamsManagerTools();if(e!==c.manager)return;const o=c.getRemoteStreams();this.emitEventChangedRemoteTracks(o,n,{trackId:s,participantId:i}),(a||r)&&this.emitEventChangedRemoteStreams(o)}emitEventChangedRemoteTracks(e,n,{trackId:s,participantId:i}){this.events.trigger("remote-tracks-changed",{streams:e,changeType:n,trackId:s,participantId:i})}emitEventChangedRemoteStreamsConnected=()=>{this.emitEventChangedRemoteStreams(this.getRemoteStreams())};emitEventChangedRemoteStreams(e){this.streamsChangeTracker.hasChanged(e)&&(this.streamsChangeTracker.updateLastEmittedStreams(e),this.events.trigger("remote-streams-changed",{streams:e}))}getActiveStreamsManagerTools(){return this.streamsManagerProvider.getActiveStreamsManagerTools({isSpectator:this.hasSpectator(),stateInfo:this.contentedStreamManager.getStateInfo()})}attachRecvSessionTracks(e){const{peerConnection:n}=e,s=i=>{this.addRemoteTrack(this.recvRemoteStreamsManager,i.track,Ge(i))};n.addEventListener("track",s),this.disposeRecvSessionTrackListener=()=>{n.removeEventListener("track",s)}}async startRecvSessionForced(e,{silent:n}={}){return this.startRecvSession({audioChannel:e.audioChannel,quality:e.quality},{silent:n})}async startRecvSession({audioChannel:e,quality:n},{silent:s}={}){this.disposeInRoomCredentialsListener?.();const i=this.stateMachine.getInRoomCredentials();if(i===void 0)return{session:void 0,callResult:!1};this.stopRecvSession({silent:s});const r={audioChannel:e,quality:n,pcConfig:this.mcuSession.getPcConfig()},a=new Is(r,{sendOffer:this.tools.sendOffer});return this.recvSession=a,this.recvRemoteStreamsManager.reset(),this.attachRecvSessionTracks(a),a.call({conferenceNumber:i.conferenceForToken,token:i.token}).then(o=>(s!==!0&&this.events.emit("recv-session-started"),o&&(this.disposeInRoomCredentialsListener=this.stateMachine.onInRoomCredentialsChange(()=>{this.renegotiateRecvSession().catch(()=>{})})),{session:a,callResult:o})).catch(async o=>{this.stopRecvSession();const l=new ie.IncomingResponse;l.body=o instanceof Error?o.message:String(o);const u=ie.C.causes.INTERNAL_ERROR;throw await this.failed(l,u),o})}stopRecvSession({silent:e}={}){const n=!!this.recvSession;this.disposeInRoomCredentialsListener?.(),this.disposeInRoomCredentialsListener=void 0,this.recvSession?.close(),this.recvSession=void 0,this.disposeRecvSessionTrackListener?.(),this.disposeRecvSessionTrackListener=void 0,this.recvRemoteStreamsManager.reset(),n&&e!==!0&&this.events.emit("recv-session-ended")}onRoleChanged=({previous:e,next:n})=>{if(f.isExitingSpectatorRole(e,n)&&(this.stopRecvSession(),this.deferredStartRecvSessionRunner.cancel(),this.emitEventChangedRemoteStreamsConnected()),f.isEnteringSpectatorRole(e,n)){const s=n.recvParams;this.stateMachine.getInRoomCredentials()===void 0?this.deferredStartRecvSessionRunner.set({audioId:s.audioId}):this.startRecvSession({audioChannel:s.audioId}).catch(()=>{})}f.isExitingAnySpectatorRole(e,n)&&this.mcuSession.restoreBitrateForSenders(),f.isEnteringAnySpectatorRole(e,n)&&this.mcuSession.setMinBitrateForSenders()};subscribeContentedStreamEvents(){this.contentedStreamManager.on("available",this.emitEventChangedRemoteStreamsConnected),this.contentedStreamManager.on("not-available",this.emitEventChangedRemoteStreamsConnected)}async renegotiateRecvSession(){const e=this.stateMachine.getInRoomCredentials();return e===void 0||this.recvSession===void 0?!1:this.recvSession.renegotiate({conferenceNumber:e.conferenceForToken,token:e.token})}async renegotiateMcuSession(){return this.mcuSession.renegotiate()}}const Rt=["presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed"],Vs=()=>new S.TypedEvents(Rt),fe=C("PresentationStateMachine");var vt=(t=>(t.IDLE="presentation:idle",t.STARTING="presentation:starting",t.ACTIVE="presentation:active",t.STOPPING="presentation:stopping",t.FAILED="presentation:failed",t))(vt||{});const Hs=g.setup({types:{context:{},events:{}},actions:{logTransition:(t,e)=>{fe(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(t,e)=>{fe("PresentationStateMachine state changed",e.state)},setError:g.assign(({event:t})=>"error"in t&&t.error!==void 0?{lastError:t.error instanceof Error?t.error:new Error(JSON.stringify(t.error))}:{lastError:void 0}),clearError:g.assign({lastError:void 0})}}).createMachine({id:"presentation",initial:"presentation:idle",context:{},states:{"presentation:idle":{entry:{type:"logStateChange",params:{state:"presentation:idle"}},on:{"SCREEN.STARTING":{target:"presentation:starting",actions:["clearError",{type:"logTransition",params:{from:"presentation:idle",to:"presentation:starting",event:"SCREEN.STARTING"}}]}}},"presentation:starting":{entry:{type:"logStateChange",params:{state:"presentation:starting"}},on:{"SCREEN.STARTED":{target:"presentation:active",actions:{type:"logTransition",params:{from:"presentation:starting",to:"presentation:active",event:"SCREEN.STARTED"}}},"SCREEN.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:failed",event:"SCREEN.FAILED"}}]},"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"CALL.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:idle",event:"CALL.ENDED"}}]},"CALL.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:failed",event:"CALL.FAILED"}}]}}},"presentation:active":{entry:{type:"logStateChange",params:{state:"presentation:active"}},on:{"SCREEN.ENDING":{target:"presentation:stopping",actions:{type:"logTransition",params:{from:"presentation:active",to:"presentation:stopping",event:"SCREEN.ENDING"}}},"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"SCREEN.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:failed",event:"SCREEN.FAILED"}}]},"CALL.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:idle",event:"CALL.ENDED"}}]},"CALL.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:failed",event:"CALL.FAILED"}}]}}},"presentation:stopping":{entry:{type:"logStateChange",params:{state:"presentation:stopping"}},on:{"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"SCREEN.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:failed",event:"SCREEN.FAILED"}}]},"CALL.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:idle",event:"CALL.ENDED"}}]},"CALL.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:failed",event:"CALL.FAILED"}}]}}},"presentation:failed":{entry:{type:"logStateChange",params:{state:"presentation:failed"}},on:{"SCREEN.STARTING":{target:"presentation:starting",actions:["clearError",{type:"logTransition",params:{from:"presentation:failed",to:"presentation:starting",event:"SCREEN.STARTING"}}]},"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:failed",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"PRESENTATION.RESET":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:failed",to:"presentation:idle",event:"PRESENTATION.RESET"}}]}}}}});class Ws extends H{constructor(e){super(Hs),this.subscribeCallEvents(e)}get isIdle(){return this.state==="presentation:idle"}get isStarting(){return this.state==="presentation:starting"}get isActive(){return this.state==="presentation:active"}get isStopping(){return this.state==="presentation:stopping"}get isFailed(){return this.state==="presentation:failed"}get isPending(){return this.isStarting||this.isStopping}get isActiveOrPending(){return this.isActive||this.isPending}get lastError(){return this.getSnapshot().context.lastError}reset(){this.send({type:"PRESENTATION.RESET"})}send(e){if(!this.actor.getSnapshot().can(e)){fe(`[PresentationStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}subscribeCallEvents(e){this.addSubscription(e.on("presentation:start",()=>{this.send({type:"SCREEN.STARTING"})})),this.addSubscription(e.on("presentation:started",()=>{this.send({type:"SCREEN.STARTED"})})),this.addSubscription(e.on("presentation:end",()=>{this.send({type:"SCREEN.ENDING"})})),this.addSubscription(e.on("presentation:ended",()=>{this.send({type:"SCREEN.ENDED"})})),this.addSubscription(e.on("presentation:failed",n=>{this.send({type:"SCREEN.FAILED",error:n})})),this.addSubscription(e.on("ended",()=>{this.send({type:"CALL.ENDED"})})),this.addSubscription(e.on("failed",n=>{this.send({type:"CALL.FAILED",error:n})}))}}const Qs=1,Ys=t=>he.hasCanceledError(t);class js extends S.EventEmitterProxy{stateMachine;promisePendingStartPresentation;promisePendingStopPresentation;streamPresentationCurrent;maxBitrate;cancelableSendPresentationWithRepeatedCalls;callManager;constructor({callManager:e,maxBitrate:n}){super(Vs()),this.callManager=e,this.maxBitrate=n,this.stateMachine=new Ws(this.callManager.events),this.subscribe()}get isPendingPresentation(){return!!this.promisePendingStartPresentation||!!this.promisePendingStopPresentation}get isPresentationInProcess(){return!!this.streamPresentationCurrent||this.isPendingPresentation}async startPresentation(e,n,{isNeedReinvite:s,contentHint:i,sendEncodings:r,onAddedTransceiver:a}={},c){const o=this.getRtcSessionProtected();if(this.streamPresentationCurrent)throw new Error("Presentation is already started");return this.sendPresentationWithDuplicatedCalls(e,{rtcSession:o,stream:n,presentationOptions:{isNeedReinvite:s,contentHint:i,sendEncodings:r,onAddedTransceiver:a},options:c})}async stopPresentation(e){this.cancelSendPresentationWithRepeatedCalls();const n=this.streamPresentationCurrent;let s=this.promisePendingStartPresentation??Promise.resolve(void 0);this.promisePendingStartPresentation&&await this.promisePendingStartPresentation.catch(()=>{});const i=this.callManager.getEstablishedRTCSession();return i&&n?s=e().then(async()=>i.stopPresentation(n)).catch(r=>{const a=r instanceof Error?r:new Error(String(r));throw this.events.trigger("presentation:failed",a),r}):n&&this.events.trigger("presentation:ended",n),this.promisePendingStopPresentation=s,s.finally(()=>{this.resetPresentation()})}async updatePresentation(e,n,{contentHint:s,sendEncodings:i,onAddedTransceiver:r}={}){const a=this.getRtcSessionProtected();if(!this.streamPresentationCurrent)throw new Error("Presentation has not started yet");return this.promisePendingStartPresentation&&await this.promisePendingStartPresentation,this.sendPresentation(e,a,n,{contentHint:s,isNeedReinvite:!1,sendEncodings:i,onAddedTransceiver:r}).then(async c=>(await this.setMaxBitrate(),c))}cancelSendPresentationWithRepeatedCalls(){this.cancelableSendPresentationWithRepeatedCalls?.stopRepeatedCalls()}subscribe(){this.callManager.on("presentation:start",e=>{this.events.trigger("presentation:start",e)}),this.callManager.on("presentation:started",e=>{this.events.trigger("presentation:started",e)}),this.callManager.on("presentation:end",e=>{this.events.trigger("presentation:end",e)}),this.callManager.on("presentation:ended",e=>{this.events.trigger("presentation:ended",e)}),this.callManager.on("presentation:failed",e=>{this.events.trigger("presentation:failed",e)}),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded)}async sendPresentationWithDuplicatedCalls(e,{rtcSession:n,stream:s,presentationOptions:i,options:r={callLimit:Qs}}){const a=async()=>this.sendPresentation(e,n,s,i),c=()=>!!this.streamPresentationCurrent;return this.cancelableSendPresentationWithRepeatedCalls=he.repeatedCallsAsync({targetFunction:a,isComplete:c,isRejectAsValid:!0,...r}),this.cancelableSendPresentationWithRepeatedCalls.then(o=>o)}async sendPresentation(e,n,s,{isNeedReinvite:i=!0,contentHint:r="detail",degradationPreference:a,sendEncodings:c,onAddedTransceiver:o}){const l=K(s,{contentHint:r});if(l===void 0)throw new Error("No streamPresentationTarget");this.streamPresentationCurrent=l;const u=e().then(async()=>n.startPresentation(l,i,{degradationPreference:a,sendEncodings:c,onAddedTransceiver:o})).then(this.setMaxBitrate).then(()=>s).catch(m=>{this.removeStreamPresentationCurrent();const R=m instanceof Error?m:new Error(String(m));throw this.events.trigger("presentation:failed",R),m});return this.promisePendingStartPresentation=u,u.finally(()=>{this.promisePendingStartPresentation=void 0})}setMaxBitrate=async()=>{const{connection:e}=this.callManager,{streamPresentationCurrent:n}=this,{maxBitrate:s}=this;if(!e||!n||s===void 0)return;const i=e.getSenders();await _n(i,n,s)};getRtcSessionProtected=()=>{const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};handleEnded=()=>{this.reset()};reset(){this.cancelSendPresentationWithRepeatedCalls(),this.resetPresentation()}resetPresentation(){this.removeStreamPresentationCurrent(),this.promisePendingStartPresentation=void 0,this.promisePendingStopPresentation=void 0}removeStreamPresentationCurrent(){delete this.streamPresentationCurrent}}const xe=0,zs=30;class Js{countInner=xe;initialCount=xe;limitInner=zs;isInProgress=!1;onStatusChange;constructor({onStatusChange:e}){this.onStatusChange=e}get count(){return this.countInner}get limit(){return this.limitInner}get isAttemptInProgress(){return this.isInProgress}hasLimitReached(){return this.countInner>=this.limitInner}startAttempt(){this.isInProgress||(this.isInProgress=!0,this.onStatusChange({isInProgress:this.isInProgress}))}finishAttempt(){this.isInProgress&&(this.isInProgress=!1,this.onStatusChange({isInProgress:this.isInProgress}))}increment(){this.count<this.limit&&(this.countInner+=1)}reset(){this.countInner=this.initialCount,this.finishAttempt()}}class Xs{connectionManager;interval;checkTelephonyByTimeout=void 0;cancelableGetParameters=void 0;constructor({connectionManager:e,interval:n}){this.connectionManager=e,this.interval=n}start(e,{onSuccessRequest:n,onFailRequest:s}){this.stop(),this.cancelableGetParameters=new q.CancelableRequest(e),this.checkTelephonyByTimeout=V.resolveRequesterByTimeout({isDontStopOnFail:!0,requestInterval:this.interval,request:async()=>{if(!this.cancelableGetParameters)throw new Error("cancelableGetParameters is not defined");const i=await this.cancelableGetParameters.request();return this.connectionManager.checkTelephony(i)}}),this.checkTelephonyByTimeout.start(void 0,{onFailRequest:s,onSuccessRequest:()=>{this.stop(),n()}})}stop(){this.checkTelephonyByTimeout?.stop(),this.checkTelephonyByTimeout=void 0,this.cancelableGetParameters?.cancelRequest(),this.cancelableGetParameters=void 0}}class ft{callManager;disposers=[];constructor({callManager:e}){this.callManager=e}subscribe(e){this.unsubscribe(),this.disposers.push(this.callManager.on("call-status-changed",()=>{this.handleCallStatusChange(e)})),this.handleCallStatusChange(e)}unsubscribe(){this.disposers.forEach(e=>{e()}),this.disposers=[]}handleCallStatusChange({onActive:e,onInactive:n}){this.callManager.isCallActive?e?.():n()}}const Ks=15e3,Zs=2,Te=C("PingServerRequester");class ei{connectionManager;pingServerByTimeoutWithFailCalls;constructor({connectionManager:e}){this.connectionManager=e,this.pingServerByTimeoutWithFailCalls=V.requesterByTimeoutsWithFailCalls(Zs,{whenPossibleRequest:async()=>{},requestInterval:Ks,request:async()=>(Te("ping"),this.connectionManager.ping().then(()=>{Te("ping success")}))})}start({onFailRequest:e}){this.pingServerByTimeoutWithFailCalls.start(void 0,{onFailRequest:e}).catch(Te)}stop(){this.pingServerByTimeoutWithFailCalls.stop()}}const qe=C("PingServerIfNotActiveCallRequester");class ti{pingServerRequester;notActiveCallSubscriber;constructor({connectionManager:e,callManager:n}){this.pingServerRequester=new ei({connectionManager:e}),this.notActiveCallSubscriber=new ft({callManager:n})}start({onFailRequest:e}){qe("start"),this.notActiveCallSubscriber.subscribe({onActive:()=>{this.pingServerRequester.stop()},onInactive:()=>{this.pingServerRequester.start({onFailRequest:e})}})}stop(){qe("stop"),this.pingServerRequester.stop(),this.unsubscribeCallStatusChange()}unsubscribeCallStatusChange(){this.notActiveCallSubscriber.unsubscribe()}}class ni{connectionManager;isRegistrationFailed=!1;disposers=[];notActiveCallSubscriber;constructor({connectionManager:e,callManager:n}){this.connectionManager=e,this.notActiveCallSubscriber=new ft({callManager:n})}subscribe(e){this.unsubscribe(),this.disposers.push(this.connectionManager.on("registrationFailed",()=>{this.setIsRegistrationFailed()})),this.notActiveCallSubscriber.subscribe({onInactive:()=>{this.isRegistrationFailed&&e()}}),this.disposers.push(()=>{this.notActiveCallSubscriber.unsubscribe()})}unsubscribe(){this.disposers.forEach(e=>{e()}),this.disposers=[],this.resetIsRegistrationFailed()}setIsRegistrationFailed(){this.isRegistrationFailed=!0}resetIsRegistrationFailed(){this.isRegistrationFailed=!1}}const si={baseRetryDelayMs:1e3,maxRetryDelayMs:3e4,warningThreshold:3,criticalThreshold:5},Ve={none:0,warning:1,critical:2};class ii{failCount=0;nextRetryAtMs=0;escalationLevel="none";options;constructor(e){this.options={...si,...e}}registerFailure(){this.failCount+=1;const e=this.resolveEscalationLevel(this.failCount),n=Ve[e]>Ve[this.escalationLevel];this.escalationLevel=e;const s=Date.now(),i=Math.max(this.nextRetryAtMs-s,0);if(i>0)return{failCount:this.failCount,escalationLevel:this.escalationLevel,hasEscalated:n,shouldRequestReconnect:!1,nextRetryDelayMs:i};const r=this.resolveBackoffDelayMs(this.failCount);return this.nextRetryAtMs=s+r,{failCount:this.failCount,escalationLevel:this.escalationLevel,hasEscalated:n,shouldRequestReconnect:!0,nextRetryDelayMs:r}}reset(){this.failCount=0,this.nextRetryAtMs=0,this.escalationLevel="none"}resolveEscalationLevel(e){return e>=this.options.criticalThreshold?"critical":e>=this.options.warningThreshold?"warning":"none"}resolveBackoffDelayMs(e){return Math.min(this.options.baseRetryDelayMs*2**Math.max(e-1,0),this.options.maxRetryDelayMs)}}const b=C("AutoConnectorRuntime"),ri=3e3,ai=15e3;class oi{connectionManager;connectionQueueManager;checkTelephonyRequester;pingServerIfNotActiveCallRequester;registrationFailedOutOfCallSubscriber;attemptsState;delayBetweenAttempts;telephonyFailPolicy;emitters;reconnectActions;constructor(e){this.connectionManager=e.connectionManager,this.connectionQueueManager=e.connectionQueueManager,this.emitters=e.emitters,this.reconnectActions=e.reconnectActions,this.checkTelephonyRequester=new Xs({connectionManager:this.connectionManager,interval:e.options?.checkTelephonyRequestInterval??ai}),this.pingServerIfNotActiveCallRequester=new ti({connectionManager:this.connectionManager,callManager:e.callManager}),this.registrationFailedOutOfCallSubscriber=new ni({connectionManager:this.connectionManager,callManager:e.callManager}),this.delayBetweenAttempts=new V.DelayRequester(e.options?.timeoutBetweenAttempts??ri),this.telephonyFailPolicy=new ii(e.options?.telephonyFailPolicy),this.attemptsState=new Js({onStatusChange:this.emitters.emitStatusChange})}async stopConnectionFlow(){b("stopConnectionFlow"),this.stopAttempts(),this.stopConnectTriggers(),await this.connectionQueueManager.disconnect()}async connect(e){await this.connectionQueueManager.connect(e.getParameters,e.options)}async delayBeforeRetry(){await this.delayBetweenAttempts.request()}cancelPendingRetry(){this.delayBetweenAttempts.cancelRequest()}hasLimitReached(){return this.attemptsState.hasLimitReached()}shouldDisconnectBeforeAttempt(){const{isDisconnected:e,isIdle:n,isDisconnecting:s,requested:i}=this.connectionManager;return s||i?!0:!(e||n)}beforeAttempt(){b("entryAttemptingGate"),this.emitters.emitBeforeAttempt(),this.stopConnectTriggers()}beforeConnectAttempt(){b("entryAttemptingConnect"),this.attemptsState.startAttempt(),this.attemptsState.increment()}onLimitReached(e){b("onLimitReachedTransition"),this.attemptsState.finishAttempt(),this.emitters.emitLimitReachedAttempts(),this.startCheckTelephony(e)}onConnectSucceeded(e){this.subscribeToConnectTriggers(e),this.emitters.emitSuccess()}emitTerminalOutcome({stopReason:e,lastError:n}){if(this.attemptsState.finishAttempt(),e==="halted"){this.emitters.emitStopAttemptsByError(n);return}if(e==="cancelled"){this.emitters.emitCancelledAttempts(n);return}if(e==="failed"){this.emitters.emitFailedAllAttempts(n);return}b("emitTerminalOutcome without stopReason",n)}onTelephonyStillConnected(){b("onTelephonyStillConnected"),this.stopConnectTriggers(),this.emitters.emitSuccess()}stopConnectTriggers(){b("stopConnectTriggers"),this.pingServerIfNotActiveCallRequester.stop(),this.checkTelephonyRequester.stop(),this.registrationFailedOutOfCallSubscriber.unsubscribe()}stopAttempts(){this.attemptsState.isAttemptInProgress&&this.connectionQueueManager.stop(),this.cancelPendingRetry(),this.attemptsState.reset()}startCheckTelephony(e){b("startCheckTelephony"),this.checkTelephonyRequester.start(async()=>e.getParameters(),{onSuccessRequest:()=>{b("startCheckTelephony: onSuccessRequest"),this.telephonyFailPolicy.reset(),this.isConnectionUnavailable()?this.reconnectActions.requestReconnect(e,"telephony-disconnected"):this.reconnectActions.notifyTelephonyStillConnected()},onFailRequest:n=>{const s=this.telephonyFailPolicy.registerFailure();this.emitters.emitTelephonyCheckFailure({failCount:s.failCount,escalationLevel:s.escalationLevel,shouldRequestReconnect:s.shouldRequestReconnect,nextRetryDelayMs:s.nextRetryDelayMs,error:n}),s.escalationLevel!=="none"&&s.hasEscalated&&this.emitters.emitTelephonyCheckEscalated({failCount:s.failCount,escalationLevel:s.escalationLevel,error:n}),s.shouldRequestReconnect&&this.reconnectActions.requestReconnect(e,"telephony-check-failed"),b("startCheckTelephony: onFailRequest",n?.message)}})}subscribeToConnectTriggers(e){this.pingServerIfNotActiveCallRequester.start({onFailRequest:()=>{b("pingRequester: onFailRequest")}}),this.registrationFailedOutOfCallSubscriber.subscribe(()=>{b("registrationFailedOutOfCallListener callback"),this.reconnectActions.requestReconnect(e,"registration-failed-out-of-call")})}isConnectionUnavailable(){const{isDisconnected:e,isIdle:n}=this.connectionManager;return e||n}}class ci{data;getUa;constructor(e){this.getUa=e.getUa}isConfigured(){return this.getUa()!==void 0}get(){if(this.data!==void 0)return{...this.data}}set(e){if(e===void 0){this.data=void 0;return}this.data={...e}}update(e,n){if(this.data===void 0)throw new Error("data is not exist");this.data[e]=n}clear(){this.data=void 0}isRegister(){return this.data?.register===!0}getSipServerIp(){return this.data?.sipServerIp}getSipServerUrl(){return this.data?.sipServerUrl}getDisplayName(){return this.data?.displayName}getUser(){return this.data?.user}getPassword(){return this.data?.password}isRegisterEnabled(){return this.data?.register===!0}}const Nt="Not ready for connection",At=t=>t instanceof Error&&t.message===Nt,di=()=>new Error(Nt),li=async t=>typeof t=="function"?t():t;function hi(t){return e=>`sip:${e}@${t}`}const ui=(t,e)=>()=>Math.floor(Math.random()*(e-t))+t,It=t=>t.trim().replaceAll(" ","_"),gi=ui(1e5,99999999),mi=3;class pi{resolveParametersRequester=new q.CancelableRequest(li);cancelableConnectWithRepeatedCalls;numberOfConnectionAttempts;dependencies;constructor(e,{numberOfConnectionAttempts:n=mi}={}){this.dependencies=e,this.numberOfConnectionAttempts=n,this.proxyEvents()}connect=async(e,n)=>(this.dependencies.stateMachine.startConnect(),this.dependencies.events.trigger("connect-started",{}),this.cancelRequests(),this.resolveParametersRequester.request(e).then(s=>(this.dependencies.events.trigger("connect-parameters-resolve-success",s),s)).catch(s=>{throw this.dependencies.events.trigger("connect-parameters-resolve-failed",s),s}).then(async s=>this.connectWithDuplicatedCalls(s,n)).then(s=>(this.dependencies.events.trigger("connect-succeeded",{...s}),s)).catch(s=>{const i=s??new Error("Failed to connect to server");throw q.isCanceledError(i)||this.dependencies.events.trigger("connect-failed",i),i}));set=async({displayName:e})=>new Promise((n,s)=>{const i=this.dependencies.getUa();if(!i){s(new Error("this.ua is not initialized"));return}let r=!1;const a=this.dependencies.getConnectionConfiguration();e!==void 0&&e!==a?.displayName&&(r=i.set("display_name",It(e)),this.dependencies.updateConnectionConfiguration("displayName",e));const c=r;c?n(c):s(new Error("nothing changed"))});disconnect=async({cancelRequests:e=!0}={})=>{e&&this.cancelRequests(),this.dependencies.events.trigger("disconnecting",{});const n=new Promise(i=>{this.dependencies.events.once("disconnected",()=>{i()})}),s=this.dependencies.getUa();return s?s.stop():this.dependencies.events.trigger("disconnected",{socket:{},error:!1}),n.finally(()=>{s?.removeAllListeners(),this.dependencies.setUa(void 0),this.dependencies.stateMachine.reset()})};cancelRequests(){this.resolveParametersRequester.cancelRequest(),this.cancelConnectWithRepeatedCalls()}connectWithDuplicatedCalls=async(e,{numberOfConnectionAttempts:n=this.numberOfConnectionAttempts}={})=>{const s=async()=>this.connectInner(e),i=r=>{const o=this.dependencies.getUa()?.isConnected()===!0&&this.hasEqualConnectionConfiguration(e),l=r!=null&&!Zt(r);return o||l};return this.cancelableConnectWithRepeatedCalls=he.repeatedCallsAsync({targetFunction:s,isComplete:i,callLimit:n,isRejectAsValid:!0,isCheckBeforeCall:!1}),this.cancelableConnectWithRepeatedCalls.then(r=>{if(typeof r=="object"&&r!==null&&"authorizationUser"in r)return r;throw r})};hasEqualConnectionConfiguration(e){const{configuration:n}=this.dependencies.uaFactory.createConfiguration(e),i=this.dependencies.getUa()?.configuration;return i?i.password===n.password&&i.register===n.register&&i.uri.toString()===n.uri&&i.display_name===n.display_name&&i.user_agent===n.user_agent&&i.sockets===n.sockets&&i.session_timers===n.session_timers&&i.register_expires===n.register_expires&&i.connection_recovery_min_interval===n.connection_recovery_min_interval&&i.connection_recovery_max_interval===n.connection_recovery_max_interval:!1}connectInner=async e=>this.initUa(e).then(async()=>this.start()).then(()=>{const n=this.dependencies.getConnectionConfiguration();if(n===void 0)throw new Error("connectionConfiguration has not defined");return n});initUa=async({user:e,password:n,sipServerIp:s,sipServerUrl:i,remoteAddress:r,sessionTimers:a,registerExpires:c,connectionRecoveryMinInterval:o,connectionRecoveryMaxInterval:l,userAgent:u,displayName:m="",register:R=!1,extraHeaders:T=[]})=>{this.dependencies.stateMachine.startInitUa(R),this.dependencies.getUa()&&await this.disconnect({cancelRequests:!1});const{ua:M,helpers:F}=this.dependencies.uaFactory.createUAWithConfiguration({user:e,password:n,sipServerIp:s,sipServerUrl:i,displayName:m,register:R,sessionTimers:a,registerExpires:c,connectionRecoveryMinInterval:o,connectionRecoveryMaxInterval:l,userAgent:u,remoteAddress:r,extraHeaders:T},this.dependencies.events),W=M.configuration.uri.user;return this.dependencies.setConnectionConfiguration({sipServerIp:s,sipServerUrl:i,displayName:m,authorizationUser:W,register:R,user:e,password:n}),this.dependencies.setUa(M),this.dependencies.setGetUri(F.getUri),this.dependencies.setSocket(F.socket),M};start=async()=>new Promise((e,n)=>{const s=this.dependencies.getUa();if(!s){n(new Error("this.ua is not initialized"));return}let i;i=((o,l)=>{if(this.dependencies.getConnectionConfiguration()?.register===!0)return this.dependencies.registrationManager.subscribeToStartEvents(o,l);const m="connected",R=["disconnected"];return this.dependencies.events.on(m,o),R.forEach(T=>{this.dependencies.events.on(T,l)}),()=>{this.dependencies.events.off(m,o),R.forEach(T=>{this.dependencies.events.off(T,l)})}})(()=>{i?.(),e(s)},o=>{i?.(),n(o)}),s.start()});cancelConnectWithRepeatedCalls(){this.cancelableConnectWithRepeatedCalls?.cancel()}proxyEvents(){this.dependencies.events.on("connected",()=>{const e=this.dependencies.getConnectionConfiguration();e!==void 0&&this.dependencies.events.trigger("connected-with-configuration",e)})}}const Ne=C("ConnectionStateMachine");var Mt=(t=>(t.IDLE="connection:idle",t.PREPARING="connection:preparing",t.CONNECTING="connection:connecting",t.CONNECTED="connection:connected",t.REGISTERED="connection:registered",t.ESTABLISHED="connection:established",t.DISCONNECTING="connection:disconnecting",t.DISCONNECTED="connection:disconnected",t))(Mt||{}),bt=(t=>(t.START_CONNECT="START_CONNECT",t.START_INIT_UA="START_INIT_UA",t.START_DISCONNECT="START_DISCONNECT",t.UA_CONNECTED="UA_CONNECTED",t.UA_CONNECTING="UA_CONNECTING",t.UA_REGISTERED="UA_REGISTERED",t.UA_UNREGISTERED="UA_UNREGISTERED",t.UA_DISCONNECTED="UA_DISCONNECTED",t.RESET="RESET",t))(bt||{});const Ci=Object.values(bt);function Ei(t){return t.type!=="START_INIT_UA"?{}:{registerRequired:t.registerRequired}}const Ti=g.setup({types:{context:{},events:{}},guards:{canAutoEstablish:({context:t})=>!t.registerRequired},actions:{setRegisterRequired:g.assign(({event:t})=>Ei(t)),resetRegisterRequired:g.assign(()=>({registerRequired:!1})),logTransition:(t,e)=>{Ne(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(t,e)=>{Ne("ConnectionStateMachine state changed",e.state)}}}).createMachine({id:"connection",initial:"connection:idle",context:{registerRequired:!1},states:{"connection:idle":{entry:{type:"logStateChange",params:{state:"connection:idle"}},on:{START_CONNECT:{target:"connection:preparing",actions:{type:"logTransition",params:{from:"connection:idle",to:"connection:preparing",event:"START_CONNECT"}}}}},"connection:preparing":{entry:{type:"logStateChange",params:{state:"connection:preparing"}},on:{START_INIT_UA:{target:"connection:connecting",actions:["setRegisterRequired",{type:"logTransition",params:{from:"connection:preparing",to:"connection:connecting",event:"START_INIT_UA"}}]},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:preparing",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:connecting":{entry:{type:"logStateChange",params:{state:"connection:connecting"}},on:{UA_CONNECTED:{target:"connection:connected",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:connected",event:"UA_CONNECTED"}}},UA_REGISTERED:{target:"connection:registered",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:registered",event:"UA_REGISTERED"}}},START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:connected":{entry:{type:"logStateChange",params:{state:"connection:connected"}},always:{target:"connection:established",guard:"canAutoEstablish",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:established",event:"always"}}},on:{UA_REGISTERED:{target:"connection:registered",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:registered",event:"UA_REGISTERED"}}},START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:registered":{entry:{type:"logStateChange",params:{state:"connection:registered"}},always:{target:"connection:established",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:established",event:"always"}}},on:{UA_UNREGISTERED:{target:"connection:connected",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:connected",event:"UA_UNREGISTERED"}}},START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:established":{entry:{type:"logStateChange",params:{state:"connection:established"}},on:{START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:established",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:established",to:"connection:disconnected",event:"UA_DISCONNECTED"}}},RESET:{target:"connection:idle",actions:["resetRegisterRequired",{type:"logTransition",params:{from:"connection:established",to:"connection:idle",event:"RESET"}}]}}},"connection:disconnecting":{entry:{type:"logStateChange",params:{state:"connection:disconnecting"}},on:{UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:disconnecting",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:disconnected":{entry:{type:"logStateChange",params:{state:"connection:disconnected"}},on:{RESET:{target:"connection:idle",actions:["resetRegisterRequired",{type:"logTransition",params:{from:"connection:disconnected",to:"connection:idle",event:"RESET"}}]},START_CONNECT:{target:"connection:preparing",actions:{type:"logTransition",params:{from:"connection:disconnected",to:"connection:preparing",event:"START_CONNECT"}}},UA_CONNECTING:{target:"connection:connecting",actions:{type:"logTransition",params:{from:"connection:disconnected",to:"connection:connecting",event:"UA_CONNECTING"}}}}}}});class Si extends H{events;unsubscribeFromEvents;constructor(e){super(Ti),this.events=e,this.subscribeToEvents()}get isIdle(){return this.hasState("connection:idle")}get isPreparing(){return this.hasState("connection:preparing")}get isConnecting(){return this.hasState("connection:connecting")}get isConnected(){return this.hasState("connection:connected")}get isRegistered(){return this.hasState("connection:registered")}get isEstablished(){return this.hasState("connection:established")}get isDisconnecting(){return this.hasState("connection:disconnecting")}get isDisconnected(){return this.hasState("connection:disconnected")}get isPending(){return this.isPreparing||this.isConnecting}get isPendingConnect(){return this.isPreparing}get isPendingInitUa(){return this.isConnecting}get isActiveConnection(){return this.isEstablished||this.isConnected||this.isRegistered}startConnect(){this.toStartConnect()}startInitUa(e=!1){this.toStartInitUa(e)}startDisconnect(){this.toStartDisconnect()}reset(){this.toIdle()}destroy(){this.unsubscribeFromEvents?.(),this.stop()}canTransition(e){const n=this.actor.getSnapshot(),s=e==="START_INIT_UA"?{type:"START_INIT_UA",registerRequired:!1}:{type:e};return n.can(s)}getValidEvents(){return Ci.filter(e=>this.canTransition(e))}hasState(e){return this.actor.getSnapshot().matches(e)}sendEvent(e){if(!this.actor.getSnapshot().can(e)){Ne(`Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}this.send(e)}toStartConnect=()=>{this.sendEvent({type:"START_CONNECT"})};toStartInitUa=e=>{this.sendEvent({type:"START_INIT_UA",registerRequired:e})};toStartDisconnect=()=>{this.sendEvent({type:"START_DISCONNECT"})};toConnecting=()=>{this.sendEvent({type:"UA_CONNECTING"})};toConnected=()=>{this.sendEvent({type:"UA_CONNECTED"})};toRegistered=()=>{this.sendEvent({type:"UA_REGISTERED"})};toUnregistered=()=>{this.sendEvent({type:"UA_UNREGISTERED"})};toDisconnected=()=>{this.sendEvent({type:"UA_DISCONNECTED"})};toIdle=()=>{this.sendEvent({type:"RESET"})};subscribeToEvents(){this.events.on("connected",this.toConnected),this.events.on("connecting",this.toConnecting),this.events.on("registered",this.toRegistered),this.events.on("unregistered",this.toUnregistered),this.events.on("disconnecting",this.toStartDisconnect),this.events.on("disconnected",this.toDisconnected),this.events.on("registrationFailed",this.toDisconnected),this.events.on("connect-failed",this.toDisconnected),this.unsubscribeFromEvents=()=>{this.events.off("connected",this.toConnected),this.events.off("connecting",this.toConnecting),this.events.off("registered",this.toRegistered),this.events.off("unregistered",this.toUnregistered),this.events.off("disconnecting",this.toStartDisconnect),this.events.off("disconnected",this.toDisconnected),this.events.off("registrationFailed",this.toDisconnected),this.events.off("connect-failed",this.toDisconnected)}}}const yt=["connecting","connected","disconnected","newRTCSession","registered","unregistered","registrationFailed","newMessage","sipEvent"],Ri=["disconnecting","connect-started","connect-succeeded","connect-failed","connect-parameters-resolve-success","connect-parameters-resolve-failed","connected-with-configuration"],Pt=[...yt,...Ri],vi=()=>new S.TypedEvents(Pt),fi=C("RegistrationManager");class Ni{events;getUaProtected;constructor(e){this.events=e.events,this.getUaProtected=e.getUaProtected}async register(){const e=this.getUaProtected();return new Promise((n,s)=>{e.on("registered",n),e.on("registrationFailed",s),e.register()})}async unregister(){const e=this.getUaProtected();return new Promise(n=>{e.on("unregistered",n),e.unregister()})}async tryRegister(){try{await this.unregister()}catch(e){fi("tryRegister",e)}return this.register()}subscribeToStartEvents(e,n){const s="registered",i=["registrationFailed","disconnected"];return this.events.on(s,e),i.forEach(r=>{this.events.on(r,n)}),()=>{this.events.off(s,e),i.forEach(r=>{this.events.off(r,n)})}}}class Ai{uaFactory;getUaProtected;constructor(e){this.uaFactory=e.uaFactory,this.getUaProtected=e.getUaProtected}async sendOptions(e,n,s){const i=this.getUaProtected();return new Promise((r,a)=>{try{i.sendOptions(e,n,{extraHeaders:s,eventHandlers:{succeeded:()=>{r()},failed:a}})}catch(c){a(c)}})}async ping(e,n){const i=this.getUaProtected().configuration.uri;return this.sendOptions(i,e,n)}async checkTelephony({userAgent:e,displayName:n,sipServerIp:s,sipServerUrl:i,remoteAddress:r,extraHeaders:a}){return new Promise((c,o)=>{const{configuration:l}=this.uaFactory.createConfiguration({sipServerUrl:i,displayName:n,userAgent:e,sipServerIp:s}),u=this.uaFactory.createUA({...l,remoteAddress:r,extraHeaders:a}),m=()=>{const T=new Error("Telephony is not available");o(T)};u.once("disconnected",m);const R=()=>{u.removeAllListeners(),u.once("disconnected",()=>{c()}),u.stop()};u.once("connected",R),u.start()})}}const Ii=t=>{const e=[];return t!==void 0&&t!==""&&e.push(`X-Vinteo-Remote: ${t}`),e};class x{JsSIP;constructor(e){this.JsSIP=e}static isRegisteredUA(e){return!!e&&e.isRegistered()}static validateParametersConnection({register:e,password:n,user:s,sipServerIp:i,sipServerUrl:r}){if(!i)throw new Error("sipServerIp is required");if(!r)throw new Error("sipServerUrl is required");if(e&&(n===void 0||n===""))throw new Error("password is required for authorized connection");if(e&&(s===void 0||s===""))throw new Error("user is required for authorized connection")}static resolveAuthorizationUser(e,n){return e&&n!==void 0&&n.trim()!==""?n.trim():`${gi()}`}static buildExtraHeaders(e,n){const s=e!==void 0&&e!==""?Ii(e):[];return n===void 0?s:[...s,...n]}createConfiguration({user:e,password:n,sipServerUrl:s,displayName:i="",sipServerIp:r,register:a=!1,sessionTimers:c=!1,registerExpires:o=300,connectionRecoveryMinInterval:l=2,connectionRecoveryMaxInterval:u=6,userAgent:m}){x.validateParametersConnection({register:a,password:n,user:e,sipServerIp:r,sipServerUrl:s});const R=x.resolveAuthorizationUser(a,e),T=hi(r),L=T(R),M=new this.JsSIP.WebSocketInterface(`wss://${s}/webrtc/wss/`);return{configuration:{password:n,register:a,uri:L,display_name:It(i),user_agent:m,sdpSemantics:"unified-plan",sockets:[M],session_timers:c,register_expires:o,connection_recovery_min_interval:l,connection_recovery_max_interval:u},helpers:{socket:M,getUri:T}}}createUA({remoteAddress:e,extraHeaders:n,...s}){const i=new this.JsSIP.UA(s),r=x.buildExtraHeaders(e,n);return r.length>0&&i.registrator().setExtraHeaders(r),i}createUAWithConfiguration(e,n){const{configuration:s,helpers:i}=this.createConfiguration(e),r=this.createUA({...s,remoteAddress:e.remoteAddress,extraHeaders:e.extraHeaders});return n.eachTriggers((a,c)=>{const o=yt.find(l=>l===c);o&&r.on(o,a)}),{ua:r,helpers:i}}}const Mi=C("ConnectionManager");class bi extends S.EventEmitterProxy{stateMachine;ua;socket;uaFactory;registrationManager;connectionFlow;sipOperations;configurationManager;constructor({JsSIP:e},{numberOfConnectionAttempts:n}={}){super(vi()),this.uaFactory=new x(e),this.registrationManager=new Ni({events:this.events,getUaProtected:this.getUaProtected}),this.stateMachine=new Si(this.events),this.configurationManager=new ci({getUa:this.getUa}),this.sipOperations=new Ai({uaFactory:this.uaFactory,getUaProtected:this.getUaProtected}),this.connectionFlow=new pi({events:this.events,uaFactory:this.uaFactory,stateMachine:this.stateMachine,registrationManager:this.registrationManager,getUa:this.getUa,getConnectionConfiguration:this.getConnectionConfiguration,setConnectionConfiguration:s=>{this.configurationManager.set(s)},updateConnectionConfiguration:(s,i)=>{this.configurationManager.update(s,i)},setUa:s=>{this.ua=s},setGetUri:s=>{this.getUri=s},setSocket:s=>{this.socket=s}},{numberOfConnectionAttempts:n})}get requested(){return this.stateMachine.isPending}get isPendingConnect(){return this.stateMachine.isPendingConnect}get isPendingInitUa(){return this.stateMachine.isPendingInitUa}get isIdle(){return this.stateMachine.isIdle}get isDisconnected(){return this.stateMachine.isDisconnected}get isDisconnecting(){return this.stateMachine.isDisconnecting}get connectionState(){return this.stateMachine.state}get isRegistered(){return x.isRegisteredUA(this.ua)}get isRegisterConfig(){return this.configurationManager.isRegister()}connect=async(e,n)=>this.disconnect().catch(s=>{Mi("connect: disconnect error",s)}).then(async()=>this.connectWithProcessError(e,n));set=async({displayName:e})=>this.connectionFlow.set({displayName:e});disconnect=async()=>{if(this.isConfigured()||this.requested)return this.connectionFlow.disconnect()};async register(){return this.registrationManager.register()}async unregister(){return this.registrationManager.unregister()}tryRegister=async()=>this.registrationManager.tryRegister();sendOptions=async(e,n,s)=>this.sipOperations.sendOptions(e,n,s);ping=async(e,n)=>this.sipOperations.ping(e,n);checkTelephony=async e=>this.sipOperations.checkTelephony(e);isConfigured(){return this.configurationManager.isConfigured()}getConnectionConfiguration=()=>this.configurationManager.get();destroy(){this.stateMachine.destroy()}getUri=e=>e;getUser(){try{return this.getUaProtected().configuration.uri.user}catch{return}}getUaProtected=()=>{if(!this.ua)throw new Error("UA not initialized");return this.ua};getUa=()=>this.ua;connectWithProcessError=async(e,n)=>{if(!(n?.hasReadyForConnection?.()??!0))throw di();return this.connectionFlow.connect(e,n).catch(async i=>{const r=i;return this.disconnect().then(()=>{throw r}).catch(()=>{throw r})})}}class yi{connectionManager;stackPromises=ue.createStackPromises({noRunIsNotActual:!0});constructor({connectionManager:e}){this.connectionManager=e}connect=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.connect(...e));disconnect=async()=>this.stackPromises.run(async()=>this.connectionManager.disconnect());stop(){this.stackPromises.stop()}}const U=t=>{if(t!==null&&typeof t=="object"&&"error"in t)return t.error},v=C("AutoConnectorMachine"),He=(t,e)=>{if(!t.parameters)throw new Error(`Auto connector parameters are missing in ${e} action`);return t.parameters},Pi=t=>g.setup({types:{context:{},events:{}},actors:{stopConnectionFlow:g.fromPromise(async()=>{v("stopConnectionFlow"),await t.stopConnectionFlow()}),connect:g.fromPromise(async({input:e})=>{if(v("connect",e),!e)throw new Error("Auto connector parameters are missing in attemptingConnect state");await t.connect(e)}),waitBeforeRetry:g.fromPromise(async()=>{v("waitBeforeRetry"),await t.delayBetweenAttempts()})},guards:{shouldDisconnectBeforeAttempt:()=>{const e=t.shouldDisconnectBeforeAttempt();return v("shouldDisconnectBeforeAttempt:",e),e},shouldGoIdleAfterDisconnect:({context:e})=>{const n=e.afterDisconnect==="idle";return v("shouldGoIdleAfterDisconnect:",n),n},shouldAttemptAfterDisconnect:({context:e})=>{const n=e.afterDisconnect==="attempt";return v("shouldAttemptAfterDisconnect:",n),n},isLimitReached:()=>{const e=t.hasLimitReached();return v("isLimitReached:",e),e},isNotReadyForConnection:({event:e})=>{const n=At(U(e));return v("isNotReadyForConnection:",n),n},isNoRetryPolicy:({event:e})=>{const n=!t.canRetryOnError(U(e));return v("isNoRetryPolicy:",n),n},isNotActualPromise:({event:e})=>{const n=ue.isPromiseIsNotActualError(U(e));return v("isNotActualPromise:",n),n},isWaitRetryCancelled:({event:e})=>{const n=U(e),s=q.isCanceledError(n)||V.hasCanceledError(n);return v("isWaitRetryCancelled:",s),s}},actions:{logRestartFailed:({event:e})=>{v("auto connector failed to restart connection attempts:",U(e))},assignRestart:g.assign({parameters:({event:e})=>e.parameters,afterDisconnect:()=>"attempt",stopReason:()=>{},lastError:()=>{}}),assignStop:g.assign({afterDisconnect:"idle",stopReason:()=>{},lastError:()=>{}}),entryAttemptingGate:()=>{v("entryAttemptingGate"),t.beforeAttempt()},entryAttemptingConnect:()=>{v("entryAttemptingConnect"),t.beforeConnectAttempt()},onLimitReachedTransition:({context:e})=>{v("onLimitReachedTransition"),t.onLimitReached(He(e,"onLimitReachedTransition"))},onConnectDone:({context:e})=>{v("onConnectDone"),t.onConnectSucceeded(He(e,"onConnectDone"))},assignHaltedError:g.assign({stopReason:()=>"halted",lastError:({event:e})=>{const n=U(e);return v("assignHaltedError",n),n}}),assignCancelledNotActualError:g.assign({stopReason:()=>"cancelled",lastError:({event:e})=>{const n=U(e);return v("assignCancelledNotActualError",n),n}}),assignWaitRetryCancelledError:g.assign({stopReason:()=>"cancelled",lastError:({event:e})=>{const n=U(e);return v("assignWaitRetryCancelledError",n),n}}),assignWaitRetryFailedError:g.assign({stopReason:()=>"failed",lastError:({event:e})=>{const n=U(e);return v("assignWaitRetryFailedError",n),n}}),emitTerminalOutcome:({context:e})=>{v("emitTerminalOutcome"),t.emitTerminalOutcome({stopReason:e.stopReason,lastError:e.lastError})},onTelephonyStillConnected:()=>{v("onTelephonyStillConnected"),t.onTelephonyStillConnected()}}});var E=(t=>(t.IDLE="idle",t.DISCONNECTING="disconnecting",t.ATTEMPTING_GATE="attemptingGate",t.ATTEMPTING_CONNECT="attemptingConnect",t.WAITING_BEFORE_RETRY="waitingBeforeRetry",t.CONNECTED_MONITORING="connectedMonitoring",t.TELEPHONY_CHECKING="telephonyChecking",t.ERROR_TERMINAL="errorTerminal",t))(E||{});const Oi=()=>({parameters:void 0,afterDisconnect:"idle",stopReason:void 0,lastError:void 0}),Y=()=>({"AUTO.STOP":{target:E.DISCONNECTING,actions:"assignStop"},"AUTO.RESTART":{target:E.DISCONNECTING,actions:"assignRestart"}}),_i=t=>Pi(t).createMachine({id:"autoConnector",initial:E.IDLE,context:Oi,states:{[E.IDLE]:{on:{"AUTO.STOP":{target:E.IDLE},"AUTO.RESTART":[{guard:"shouldDisconnectBeforeAttempt",target:E.DISCONNECTING,actions:"assignRestart"},{target:E.ATTEMPTING_GATE,actions:"assignRestart"}]}},[E.DISCONNECTING]:{invoke:{id:"stopConnectionFlow",src:"stopConnectionFlow",onDone:[{guard:"shouldGoIdleAfterDisconnect",target:E.IDLE},{guard:"shouldAttemptAfterDisconnect",target:E.ATTEMPTING_GATE}],onError:{actions:"logRestartFailed",target:E.IDLE}},on:{"AUTO.STOP":{target:E.DISCONNECTING,reenter:!0,actions:"assignStop"},"AUTO.RESTART":{actions:"assignRestart"}}},[E.ATTEMPTING_GATE]:{entry:"entryAttemptingGate",always:[{guard:"isLimitReached",target:E.TELEPHONY_CHECKING,actions:"onLimitReachedTransition"},{target:E.ATTEMPTING_CONNECT}],on:Y()},[E.ATTEMPTING_CONNECT]:{entry:"entryAttemptingConnect",invoke:{id:"connect",src:"connect",input:({context:e})=>e.parameters,onDone:{target:E.CONNECTED_MONITORING,actions:"onConnectDone"},onError:[{guard:"isNotReadyForConnection",target:"errorTerminal",actions:"assignHaltedError"},{guard:"isNoRetryPolicy",target:"errorTerminal",actions:"assignHaltedError"},{guard:"isNotActualPromise",target:"errorTerminal",actions:"assignCancelledNotActualError"},{target:E.WAITING_BEFORE_RETRY}]},on:Y()},[E.WAITING_BEFORE_RETRY]:{invoke:{id:"waitBeforeRetry",src:"waitBeforeRetry",onDone:{target:E.ATTEMPTING_GATE},onError:[{guard:"isWaitRetryCancelled",target:"errorTerminal",actions:"assignWaitRetryCancelledError"},{target:"errorTerminal",actions:"assignWaitRetryFailedError"}]},on:Y()},[E.CONNECTED_MONITORING]:{on:Y()},[E.TELEPHONY_CHECKING]:{on:{"AUTO.STOP":{target:E.DISCONNECTING,actions:"assignStop"},"AUTO.RESTART":{target:E.DISCONNECTING,actions:"assignRestart"},"TELEPHONY.RESULT":{target:E.CONNECTED_MONITORING,actions:"onTelephonyStillConnected"}}},[E.ERROR_TERMINAL]:{entry:"emitTerminalOutcome",on:Y()}}}),Di=C("AutoConnectorStateMachine");class wi extends H{constructor(e){super(e)}send(e){if(!this.actor.getSnapshot().can(e)){Di(`[AutoConnectorStateMachine] Invalid transition: ${e.type} from ${String(this.state)}. Event cannot be processed in current state.`);return}super.send(e)}toStop(){this.send({type:"AUTO.STOP"})}toRestart(e){this.send({type:"AUTO.RESTART",parameters:e})}toTelephonyResult(e){this.send({type:"TELEPHONY.RESULT",outcome:e})}toTelephonyResultStillConnected(){this.toTelephonyResult("stillConnected")}}const Li=t=>new wi(_i(t)),ki="Failed to reconnect",We=t=>t instanceof Error?t:new Error(ki),Ui=t=>{const e=({stopReason:n,lastError:s})=>n==="cancelled"&&!ue.isPromiseIsNotActualError(s)||n==="failed"?We(s):s;return{canRetryOnError:t.canRetryOnError,shouldDisconnectBeforeAttempt:()=>t.runtime.shouldDisconnectBeforeAttempt(),stopConnectionFlow:async()=>{await t.runtime.stopConnectionFlow()},connect:async n=>{await t.runtime.connect(n)},delayBetweenAttempts:async()=>{await t.runtime.delayBeforeRetry()},hasLimitReached:()=>t.runtime.hasLimitReached(),beforeAttempt:()=>{t.runtime.beforeAttempt()},beforeConnectAttempt:()=>{t.runtime.beforeConnectAttempt()},onLimitReached:n=>{t.runtime.onLimitReached(n)},onConnectSucceeded:n=>{t.runtime.onConnectSucceeded(n)},emitTerminalOutcome:({stopReason:n,lastError:s})=>{t.runtime.emitTerminalOutcome({stopReason:n,lastError:e({stopReason:n,lastError:s})})},onTelephonyStillConnected:()=>{t.runtime.onTelephonyStillConnected()}}},Ot=["before-attempt","success","failed-all-attempts","cancelled-attempts","changed-attempt-status","stop-attempts-by-error","limit-reached-attempts","telephony-check-failure","telephony-check-escalated"],Bi=()=>new S.TypedEvents(Ot),j={START:"start",MANUAL_RESTART:"manual-restart",REGISTRATION_FAILED_OUT_OF_CALL:"registration-failed-out-of-call",TELEPHONY_DISCONNECTED:"telephony-disconnected",TELEPHONY_CHECK_FAILED:"telephony-check-failed"},Fi={[j.START]:0,[j.TELEPHONY_DISCONNECTED]:1,[j.TELEPHONY_CHECK_FAILED]:1,[j.REGISTRATION_FAILED_OUT_OF_CALL]:3,[j.MANUAL_RESTART]:4},Qe=t=>Fi[t];class $i{generation=0;lastRequest;coalesceWindowMs;constructor({coalesceWindowMs:e}){this.coalesceWindowMs=e}register(e){const n=Date.now(),s=Qe(e),{lastRequest:i}=this;if(i!==void 0&&n-i.timestamp<this.coalesceWindowMs){const a=Qe(i.reason);if(s<=a)return{shouldRequest:!1,generation:this.generation,currentPriority:s,coalescedBy:i.reason,coalescedByPriority:a}}return this.generation+=1,this.lastRequest={reason:e,timestamp:n},{shouldRequest:!0,generation:this.generation,currentPriority:s}}reset(){this.lastRequest=void 0}}const Gi=250,xi={LIMIT_REACHED:"Limit reached"},qi=t=>!0,B=C("AutoConnectorManager"),Vi="start",Hi="manual-restart";class Wi extends S.EventEmitterProxy{stateMachine;runtime;reconnectCoalescer=new $i({coalesceWindowMs:Gi});constructor({connectionQueueManager:e,connectionManager:n,callManager:s},i){super(Bi()),this.runtime=new oi({connectionManager:n,connectionQueueManager:e,callManager:s,options:i,emitters:{emitBeforeAttempt:()=>{this.events.trigger("before-attempt",{})},emitLimitReachedAttempts:()=>{this.events.trigger("limit-reached-attempts",new Error(xi.LIMIT_REACHED))},emitSuccess:()=>{B("handleSucceededAttempt"),this.events.trigger("success")},emitStopAttemptsByError:r=>{this.events.trigger("stop-attempts-by-error",r)},emitCancelledAttempts:r=>{this.events.trigger("cancelled-attempts",r)},emitFailedAllAttempts:r=>{this.events.trigger("failed-all-attempts",r)},emitTelephonyCheckFailure:r=>{this.events.trigger("telephony-check-failure",r)},emitTelephonyCheckEscalated:r=>{this.events.trigger("telephony-check-escalated",r)},emitStatusChange:({isInProgress:r})=>{this.events.trigger("changed-attempt-status",{isInProgress:r})}},reconnectActions:{requestReconnect:this.requestReconnect,notifyTelephonyStillConnected:()=>{this.stateMachine.toTelephonyResultStillConnected()}}}),this.stateMachine=Li(Ui({runtime:this.runtime,canRetryOnError:i?.canRetryOnError??qi}))}start(e){B("auto connector start"),this.requestReconnect(e,Vi)}restart(e){B("auto connector restart"),this.requestReconnect(e,Hi)}stop(){B("auto connector stop"),this.resetReconnectCoalescingState(),this.stateMachine.toStop()}cancelPendingRetry(){this.runtime.cancelPendingRetry()}requestReconnect=(e,n)=>{const s=this.shouldRequestReconnect(n);B("auto connector requestReconnect",{isAvailableToRestart:s,reason:n}),s&&this.stateMachine.toRestart(e)};shouldRequestReconnect(e){const n=this.reconnectCoalescer.register(e);return n.shouldRequest?(B(`auto connector reconnect requested: ${e}`,{state:String(this.stateMachine.state),generation:n.generation}),!0):(B(`auto connector reconnect coalesced: ${e}`,{state:String(this.stateMachine.state),coalescedBy:n.coalescedBy,currentPriority:n.currentPriority,coalescedByPriority:n.coalescedByPriority}),!1)}resetReconnectCoalescingState(){this.reconnectCoalescer.reset()}}const Qi=C("ContentedStreamStateMachine"),Yi=g.setup({types:{context:{},events:{}},actions:{setCodec:g.assign(({event:t})=>"codec"in t?{codec:t.codec}:{}),clearCodec:g.assign({codec:void 0})}}).createMachine({id:"contented-stream",initial:"contented-stream:not-available",context:{},states:{"contented-stream:not-available":{on:{"CONTENTED_STREAM.AVAILABLE":{target:"contented-stream:available",actions:"setCodec"}}},"contented-stream:available":{on:{"CONTENTED_STREAM.NOT_AVAILABLE":{target:"contented-stream:not-available",actions:"clearCodec"},"CONTENTED_STREAM.AVAILABLE":{target:"contented-stream:available",actions:"setCodec",reenter:!0},"CONTENTED_STREAM.RESET":{target:"contented-stream:not-available",actions:"clearCodec"}}}}});class ji extends H{constructor(){super(Yi)}get isAvailable(){return this.state==="contented-stream:available"}get isNotAvailable(){return this.state==="contented-stream:not-available"}get codec(){return this.getSnapshot().context.codec}getStateInfo(){return{isAvailable:this.isAvailable,codec:this.codec}}reset(){this.send({type:"CONTENTED_STREAM.RESET"})}send(e){if(!this.actor.getSnapshot().can(e)){Qi(`[ContentedStreamStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}subscribeToApiEvents(e){this.addSubscription(e.on("contented-stream:available",n=>{this.send({type:"CONTENTED_STREAM.AVAILABLE",codec:n.codec})})),this.addSubscription(e.on("contented-stream:not-available",()=>{this.send({type:"CONTENTED_STREAM.NOT_AVAILABLE"})}))}}const zi=["available","not-available"],Ji=()=>new S.TypedEvents(zi);class Xi extends S.EventEmitterProxy{stateMachine;constructor(){super(Ji()),this.stateMachine=new ji,this.proxyEvents()}get isAvailable(){return this.stateMachine.isAvailable}get codec(){return this.stateMachine.codec}getStateInfo(){return this.stateMachine.getStateInfo()}reset(){this.stateMachine.reset()}subscribeToApiEvents(e){this.stateMachine.subscribeToApiEvents(e.events)}proxyEvents(){this.stateMachine.onStateChange(()=>{const e=this.getStateInfo();e.isAvailable?this.events.trigger("available",{codec:e.codec}):this.events.trigger("not-available",{})})}}const _t=["ringing","declinedIncomingCall","terminatedIncomingCall","failedIncomingCall"],Ki=()=>new S.TypedEvents(_t),Ae=C("IncomingCallStateMachine");var Dt=(t=>(t.IDLE="incoming:idle",t.RINGING="incoming:ringing",t.CONSUMED="incoming:consumed",t.DECLINED="incoming:declined",t.TERMINATED="incoming:terminated",t.FAILED="incoming:failed",t))(Dt||{});const Zi=g.setup({types:{context:{},events:{}},actions:{logTransition:(t,e)=>{Ae(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(t,e)=>{Ae("IncomingCallStateMachine state changed",e.state)},rememberIncoming:g.assign(({event:t})=>{const{data:e}=t;return{remoteCallerData:e,lastReason:void 0}}),rememberReason:g.assign(({event:t,context:e})=>t.type==="INCOMING.CONSUMED"?{remoteCallerData:e.remoteCallerData,lastReason:"incoming:consumed"}:t.type==="INCOMING.DECLINED"?{remoteCallerData:t.data,lastReason:"incoming:declined"}:t.type==="INCOMING.TERMINATED"?{remoteCallerData:t.data,lastReason:"incoming:terminated"}:{remoteCallerData:t.data,lastReason:"incoming:failed"}),clearIncoming:g.assign(()=>({remoteCallerData:void 0,lastReason:void 0}))}}).createMachine({id:"incoming",initial:"incoming:idle",context:{},states:{"incoming:idle":{entry:{type:"logStateChange",params:{state:"incoming:idle"}},on:{"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:idle",to:"incoming:ringing",event:"INCOMING.RINGING"}}]},"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:idle",to:"incoming:idle",event:"INCOMING.CLEAR"}}]}}},"incoming:ringing":{entry:{type:"logStateChange",params:{state:"incoming:ringing"}},on:{"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:ringing",event:"INCOMING.RINGING"}}]},"INCOMING.CONSUMED":{target:"incoming:consumed",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:consumed",event:"INCOMING.CONSUMED"}}]},"INCOMING.DECLINED":{target:"incoming:declined",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:declined",event:"INCOMING.DECLINED"}}]},"INCOMING.TERMINATED":{target:"incoming:terminated",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:terminated",event:"INCOMING.TERMINATED"}}]},"INCOMING.FAILED":{target:"incoming:failed",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:failed",event:"INCOMING.FAILED"}}]},"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:idle",event:"INCOMING.CLEAR"}}]}}},"incoming:consumed":{entry:{type:"logStateChange",params:{state:"incoming:consumed"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:consumed",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:consumed",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}},"incoming:declined":{entry:{type:"logStateChange",params:{state:"incoming:declined"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:declined",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:declined",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}},"incoming:terminated":{entry:{type:"logStateChange",params:{state:"incoming:terminated"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:terminated",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:terminated",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}},"incoming:failed":{entry:{type:"logStateChange",params:{state:"incoming:failed"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:failed",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:failed",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}}}});class er extends H{constructor({incomingEvents:e,connectionEvents:n}){super(Zi),this.subscribeIncomingEvents(e),this.subscribeConnectionEvents(n)}get isIdle(){return this.state==="incoming:idle"}get isRinging(){return this.state==="incoming:ringing"}get isConsumed(){return this.state==="incoming:consumed"}get isDeclined(){return this.state==="incoming:declined"}get isTerminated(){return this.state==="incoming:terminated"}get isFailed(){return this.state==="incoming:failed"}get isActive(){return this.isRinging}get isFinished(){return this.isConsumed||this.isDeclined||this.isTerminated||this.isFailed}get remoteCallerData(){return this.getSnapshot().context.remoteCallerData}get lastReason(){return this.getSnapshot().context.lastReason}reset(){this.send({type:"INCOMING.CLEAR"})}send(e){if(!this.actor.getSnapshot().can(e)){Ae(`[IncomingCallStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}toConsumed(){this.send({type:"INCOMING.CONSUMED"})}subscribeIncomingEvents(e){this.addSubscription(e.on("ringing",n=>{this.send({type:"INCOMING.RINGING",data:n})})),this.addSubscription(e.on("declinedIncomingCall",n=>{this.send({type:"INCOMING.DECLINED",data:n})})),this.addSubscription(e.on("terminatedIncomingCall",n=>{this.send({type:"INCOMING.TERMINATED",data:n})})),this.addSubscription(e.on("failedIncomingCall",n=>{this.send({type:"INCOMING.FAILED",data:n})}))}subscribeConnectionEvents(e){this.addSubscription(e.on("disconnected",()=>{this.toClearIncoming()})),this.addSubscription(e.on("registrationFailed",()=>{this.toClearIncoming()})),this.addSubscription(e.on("connect-failed",()=>{this.toClearIncoming()}))}toClearIncoming(){this.send({type:"INCOMING.CLEAR"})}}const tr=486,nr=487,Se=t=>({displayName:t.remote_identity.display_name,host:t.remote_identity.uri.host,incomingNumber:t.remote_identity.uri.user,rtcSession:t});class sr extends S.EventEmitterProxy{stateMachine;incomingRTCSession;connectionManager;constructor(e){super(Ki()),this.connectionManager=e,this.stateMachine=new er({incomingEvents:this.events,connectionEvents:this.connectionManager.events}),this.start()}get remoteCallerData(){if(this.incomingRTCSession)return Se(this.incomingRTCSession)}get isAvailableIncomingCall(){return!!this.incomingRTCSession}start(){this.subscribe()}stop(){this.unsubscribe(),this.removeIncomingSession()}getIncomingRTCSession=()=>{const{incomingRTCSession:e}=this;if(!e)throw new Error("No incomingRTCSession");return e};extractIncomingRTCSession=()=>{const e=this.getIncomingRTCSession();return this.stateMachine.toConsumed(),this.removeIncomingSession(),e};async declineToIncomingCall({statusCode:e=nr}={}){return new Promise((n,s)=>{try{const i=this.getIncomingRTCSession(),r=Se(i);this.removeIncomingSession(),this.events.trigger("declinedIncomingCall",r),i.terminate({status_code:e}),n()}catch(i){s(i)}})}async busyIncomingCall(){return this.declineToIncomingCall({statusCode:tr})}subscribe(){this.connectionManager.on("newRTCSession",this.handleNewRTCSession)}unsubscribe(){this.connectionManager.off("newRTCSession",this.handleNewRTCSession)}handleNewRTCSession=({originator:e,session:n})=>{e==="remote"&&this.setIncomingSession(n)};setIncomingSession(e){this.incomingRTCSession=e;const n=Se(e);e.on("failed",s=>{this.removeIncomingSession(),s.originator==="local"?this.events.trigger("terminatedIncomingCall",n):this.events.trigger("failedIncomingCall",n)}),this.events.trigger("ringing",n)}removeIncomingSession(){delete this.incomingRTCSession}}class ir{apiManager;connectionManager;callManager;get user(){return this.connectionManager?.getUser()}get number(){return this.callManager?.number}get isCallInitiator(){return!!this.callManager?.isCallInitiator}get peerToPeerRoom(){if(!(this.user===void 0||this.number===void 0))return this.isCallInitiator?`p2p${this.user}to${this.number}`:`p2p${this.number}to${this.user}`}subscribe({apiManager:e,connectionManager:n,callManager:s}){this.apiManager=e,this.connectionManager=n,this.callManager=s,s.on("confirmed",this.maybeSendDirectPeerToPeerRoom)}maybeSendDirectPeerToPeerRoom=()=>{const{peerToPeerRoom:e,number:n,apiManager:s}=this;if(e===void 0||n===void 0||s===void 0)return;const i=[`${h.CONTENT_ENTER_ROOM}: ${this.peerToPeerRoom}`,`${h.PARTICIPANT_NAME}: ${this.number}`,`${h.IS_DIRECT_PEER_TO_PEER}: true`];s.sendEnterRoom(i)}}const wt=["snapshot-changed"],rr=()=>new S.TypedEvents(wt),ar=(t,e)=>Object.is(t,e),Ye=(t,e)=>t.connection.value===e.connection.value&&t.call.value===e.call.value&&t.incoming.value===e.incoming.value&&t.presentation.value===e.presentation.value&&t.autoConnector.value===e.autoConnector.value,je=t=>({connection:t.connection.getSnapshot(),call:t.call.getSnapshot(),incoming:t.incoming.getSnapshot(),presentation:t.presentation.getSnapshot(),autoConnector:t.autoConnector.getSnapshot()});class or extends S.EventEmitterProxy{machines;currentSnapshot;subscribers=new Set;actorSubscriptions=[];constructor(e){super(rr()),this.machines={connection:e.connectionManager.stateMachine,call:e.callManager.stateMachine,incoming:e.incomingCallManager.stateMachine,presentation:e.presentationManager.stateMachine,autoConnector:e.autoConnectorManager.stateMachine},this.currentSnapshot=je(this.machines),this.actorSubscriptions.push(this.machines.connection.subscribe(this.notifySubscribers),this.machines.call.subscribe(this.notifySubscribers),this.machines.incoming.subscribe(this.notifySubscribers),this.machines.presentation.subscribe(this.notifySubscribers),this.machines.autoConnector.subscribe(this.notifySubscribers))}getSnapshot(){return this.currentSnapshot}subscribe(e,n,s){const i=typeof n=="function",r=i?e:m=>m,a=i?n:e,o=i?s??ar:Ye,l=r(this.currentSnapshot),u={selector:r,listener:a,equals:o,current:l};return this.subscribers.add(u),()=>{this.subscribers.delete(u)}}stop(){this.subscribers.clear(),this.actorSubscriptions.forEach(e=>{e.unsubscribe()})}notifySubscribers=()=>{const e=this.currentSnapshot;this.currentSnapshot=je(this.machines);const n=Ye(e,this.currentSnapshot);for(const s of this.subscribers){const i=s.selector(this.currentSnapshot);s.equals(s.current,i)||(s.current=i,s.listener(i))}n||this.events.trigger("snapshot-changed",{previous:e,current:this.currentSnapshot})}}const z=1e3;var N=(t=>(t.INBOUND_RTP="inbound-rtp",t.REMOTE_OUTBOUND_RTP="remote-outbound-rtp",t.MEDIA_SOURCE="media-source",t.OUTBOUND_RTP="outbound-rtp",t.REMOTE_INBOUND_RTP="remote-inbound-rtp",t.CODEC="codec",t.CANDIDATE_PAIR="candidate-pair",t.CERTIFICATE="certificate",t.TRANSPORT="transport",t.LOCAL_CANDIDATE="local-candidate",t.REMOTE_CANDIDATE="remote-candidate",t))(N||{});const Lt=["collected","stopped"],cr=()=>new S.TypedEvents(Lt),ze=()=>"performance"in window?performance.now():Date.now(),te=t=>[...t.keys()].reduce((e,n)=>{const s=t.get(n);return s===void 0?e:{...e,[s.type]:s}},{}),dr=t=>{if(!t)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=te(t);return{outboundRtp:e[N.OUTBOUND_RTP],codec:e[N.CODEC],mediaSource:e[N.MEDIA_SOURCE],remoteInboundRtp:e[N.REMOTE_INBOUND_RTP]}},Je=t=>{if(!t)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=te(t);return{outboundRtp:e[N.OUTBOUND_RTP],codec:e[N.CODEC],mediaSource:e[N.MEDIA_SOURCE],remoteInboundRtp:e[N.REMOTE_INBOUND_RTP]}},Xe=({videoReceiversStats:t,synchronizationSourcesVideo:e})=>{if(!t)return{inboundRtp:void 0,codec:void 0,synchronizationSources:e};const n=te(t);return{inboundRtp:n[N.INBOUND_RTP],codec:n[N.CODEC],synchronizationSources:e}},lr=({audioReceiverStats:t,synchronizationSourcesAudio:e})=>{if(!t)return{inboundRtp:void 0,codec:void 0,remoteOutboundRtp:void 0,synchronizationSources:e};const n=te(t);return{inboundRtp:n[N.INBOUND_RTP],codec:n[N.CODEC],remoteOutboundRtp:n[N.REMOTE_OUTBOUND_RTP],synchronizationSources:e}},kt=t=>{if(!t)return{candidatePair:void 0,certificate:void 0,localCandidate:void 0,remoteCandidate:void 0,transport:void 0};const e=te(t);return{candidatePair:e[N.CANDIDATE_PAIR],certificate:e[N.CERTIFICATE],localCandidate:e[N.LOCAL_CANDIDATE],remoteCandidate:e[N.REMOTE_CANDIDATE],transport:e[N.TRANSPORT]}},hr=({audioSenderStats:t,videoSenderFirstStats:e,videoSenderSecondStats:n})=>({video:Je(e),secondVideo:Je(n),audio:dr(t),additional:kt(t??e??n)}),ur=({audioReceiverStats:t,videoReceiverFirstStats:e,videoReceiverSecondStats:n,synchronizationSources:s})=>({video:Xe({videoReceiversStats:e,synchronizationSourcesVideo:s.video}),secondVideo:Xe({videoReceiversStats:n,synchronizationSourcesVideo:s.secondVideo??s.video}),audio:lr({audioReceiverStats:t,synchronizationSourcesAudio:s.audio}),additional:kt(t??e??n)}),gr=({audioSenderStats:t,videoSenderFirstStats:e,videoSenderSecondStats:n,audioReceiverStats:s,videoReceiverFirstStats:i,videoReceiverSecondStats:r,synchronizationSources:a})=>{const c=hr({audioSenderStats:t,videoSenderFirstStats:e,videoSenderSecondStats:n}),o=ur({audioReceiverStats:s,videoReceiverFirstStats:i,videoReceiverSecondStats:r,synchronizationSources:a});return{outbound:c,inbound:o}},mr=async t=>{const e="audio",n="video",s=t.getSenders(),i=s.find(T=>T.track?.kind===e),r=s.filter(T=>T.track?.kind===n),a=t.getReceivers(),c=a.find(T=>T.track.kind===e),o=a.filter(T=>T.track.kind===n),l={trackIdentifier:c?.track.id,item:c?.getSynchronizationSources()[0]},u={trackIdentifier:o[0]?.track.id,item:o[0]?.getSynchronizationSources()[0]},m={trackIdentifier:o[1]?.track.id,item:o[1]?.getSynchronizationSources()[0]},R={audio:l,video:u,secondVideo:m};return Promise.all([i?.getStats()??Promise.resolve(void 0),r[0]?.getStats()??Promise.resolve(void 0),r[1]?.getStats()??Promise.resolve(void 0),c?.getStats()??Promise.resolve(void 0),o[0]?.getStats()??Promise.resolve(void 0),o[1]?.getStats()??Promise.resolve(void 0)]).then(T=>{const[L,M,F,W,Ht,Wt]=T;return{synchronizationSources:R,audioSenderStats:L,videoSenderFirstStats:M,videoSenderSecondStats:F,audioReceiverStats:W,videoReceiverFirstStats:Ht,videoReceiverSecondStats:Wt}})},pr=C("StatsPeerConnection");class Ut extends S.EventEmitterProxy{setTimeoutRequest;requesterAllStatistics=new q.CancelableRequest(mr);constructor(){super(cr()),this.setTimeoutRequest=new V.SetTimeoutRequest}get requested(){return this.setTimeoutRequest.requested}start(e,{interval:n=z,onError:s=pr}={}){this.setTimeoutRequest.request(()=>{this.collectStatistics(e,{onError:s,onSuccess:i=>{this.start(e,{onError:s,interval:i.interval})}})},n)}stop({reason:e}){this.setTimeoutRequest.cancelRequest(),this.requesterAllStatistics.cancelRequest(),this.events.trigger("stopped",{reason:e})}collectStatistics=(e,{onError:n,onSuccess:s})=>{const i=ze();this.requestAllStatistics(e).then(r=>{this.events.trigger("collected",gr(r));const c=ze()-i;let o=z;c>48?o=z*4:c>32?o=z*3:c>16&&(o=z*2),s({interval:o})}).catch(r=>{n&&n(r)})};requestAllStatistics=async e=>{const n=e();if(n===void 0)throw new Error("failed to collect statistics: peerConnection is not defined");return this.requesterAllStatistics.request(n)}}const Cr=500,Er=C("StatsManager");class Tr extends S.EventEmitterProxy{statsPeerConnection;availableStats;previousAvailableStats;callManager;apiManager;constructor({callManager:e,apiManager:n}){const s=new Ut;super(s.events),this.statsPeerConnection=s,this.callManager=e,this.apiManager=n,this.subscribe()}get availableIncomingBitrate(){return this.availableStats?.inbound.additional.candidatePair?.availableIncomingBitrate}get isInvalidInboundFrames(){return this.isEmptyInboundFrames&&this.isReceivingPackets}get isNoInboundVideoTraffic(){return this.packetsReceived===0&&this.bytesReceived===0}get isInboundVideoStalled(){if(this.packetsReceived===void 0||this.previousPacketsReceived===void 0||this.bytesReceived===void 0||this.previousBytesReceived===void 0)return!1;const e=this.previousPacketsReceived>0||this.previousBytesReceived>0,n=this.packetsReceived===this.previousPacketsReceived,s=this.bytesReceived===this.previousBytesReceived;return e&&n&&s}get isEmptyInboundFrames(){return!this.isFramesReceived||!this.isFramesDecoded}get previousAvailableIncomingBitrate(){return this.previousAvailableStats?.inbound.additional.candidatePair?.availableIncomingBitrate}get previousInboundRtp(){return this.previousAvailableStats?.inbound.video.inboundRtp}get previousFramesReceived(){return this.previousInboundRtp?.framesReceived}get previousFramesDecoded(){return this.previousInboundRtp?.framesDecoded}get inboundRtp(){return this.availableStats?.inbound.video.inboundRtp}get framesReceived(){return this.inboundRtp?.framesReceived}get framesDecoded(){return this.inboundRtp?.framesDecoded}get isFramesReceived(){const e=this.framesReceived!==void 0&&this.framesReceived>0,n=this.framesReceived!==this.previousFramesReceived;return e&&n}get isFramesDecoded(){const e=this.framesDecoded!==void 0&&this.framesDecoded>0,n=this.framesDecoded!==this.previousFramesDecoded;return e&&n}get packetsReceived(){return this.inboundRtp?.packetsReceived}get previousPacketsReceived(){return this.previousInboundRtp?.packetsReceived}get bytesReceived(){return this.inboundRtp?.bytesReceived}get previousBytesReceived(){return this.previousInboundRtp?.bytesReceived}get isReceivingPackets(){const e=this.packetsReceived!==void 0&&this.packetsReceived>=Cr,n=this.packetsReceived!==this.previousPacketsReceived;return e&&n}hasAvailableIncomingBitrateChangedQuarter(){const e=this.previousAvailableIncomingBitrate,n=this.availableIncomingBitrate;return e===void 0||n===void 0?!1:e===0?n>0:Math.abs(n-e)/e>=.25}subscribe(){this.callManager.on("peerconnection:confirmed",this.start),this.callManager.on("recv-session-started",this.handleRecvSessionStarted),this.callManager.on("recv-session-ended",this.handleRecvSessionEnded),this.callManager.on("recv-quality-changed",this.handleRecvQualityChanged),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded),this.statsPeerConnection.on("collected",this.handleStatsCollected)}handleStatsCollected=e=>{this.previousAvailableStats=this.availableStats,this.availableStats=e,this.maybeSendStats()};start=()=>{this.statsPeerConnection.start(this.callManager.getActivePeerConnection)};stop=e=>{this.statsPeerConnection.stop({reason:e}),this.availableStats=void 0,this.previousAvailableStats=void 0};restart(e){this.stop(e),this.statsPeerConnection.start(this.callManager.getActivePeerConnection)}handleRecvSessionStarted=()=>{this.restart("recv-session-started")};handleRecvSessionEnded=()=>{this.restart("recv-session-ended")};handleRecvQualityChanged=()=>{this.restart("recv-quality-changed")};handleEnded=()=>{this.stop("call-ended")};maybeSendStats(){this.availableIncomingBitrate!==void 0&&this.hasAvailableIncomingBitrateChangedQuarter()&&this.apiManager.sendStats({availableIncomingBitrate:this.availableIncomingBitrate}).catch(e=>{Er("Failed to send stats",e)})}}const Sr=C("setCodecPreferences"),Rr=(t,e)=>t.filter(s=>e.some(i=>i.clockRate===s.clockRate&&i.mimeType===s.mimeType&&i.channels===s.channels&&i.sdpFmtpLine===s.sdpFmtpLine)),vr=t=>{const e=RTCRtpSender.getCapabilities(t),n=RTCRtpReceiver.getCapabilities(t),s=e===null?[]:e.codecs,i=n===null?[]:n.codecs;return Rr(s,i)},fr=(t,e)=>e===void 0||e.length===0?t:t.sort((n,s)=>{const i=e.indexOf(n.mimeType),r=e.indexOf(s.mimeType),a=i===-1?Number.MAX_VALUE:i,c=r===-1?Number.MAX_VALUE:r;return a-c}),Nr=(t,e)=>e===void 0||e.length===0?t:t.filter(n=>!e.includes(n.mimeType)),Ar=(t,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:n})=>{try{if(typeof t.setCodecPreferences=="function"&&t.sender.track?.kind==="video"&&(e!==void 0&&e.length>0||n!==void 0&&n.length>0)){const s=vr("video"),i=Nr(s,n),r=fr(i,e);t.setCodecPreferences(r)}}catch(s){Sr("setCodecPreferences error",s)}},Bt=["balancing-scheduled","balancing-started","balancing-stopped","parameters-updated"],Ir=()=>new S.TypedEvents(Bt),Mr=C("VideoSendingBalancerManager");class br extends S.EventEmitterProxy{isBalancingActive=!1;callManager;balancingStartDelay;videoSendingBalancer;startBalancingTimer;constructor(e,n,s={}){super(Ir()),this.callManager=e,this.balancingStartDelay=s.balancingStartDelay??1e4,this.videoSendingBalancer=new ps(n,()=>e.connection,{...s,onSetParameters:i=>{this.events.trigger("parameters-updated",i),s.onSetParameters?.(i)}}),this.subscribe()}get isBalancingScheduled(){return this.startBalancingTimer!==void 0}async startBalancing(){this.isBalancingActive||(this.clearStartTimer(),await this.videoSendingBalancer.balance(),this.videoSendingBalancer.subscribe(),this.isBalancingActive=!0,this.events.trigger("balancing-started",{delay:this.balancingStartDelay}))}stopBalancing(){this.clearStartTimer(),this.videoSendingBalancer.unsubscribe(),this.isBalancingActive=!1,this.events.trigger("balancing-stopped",{})}async balance(){return this.videoSendingBalancer.balance()}subscribe(){this.callManager.on("peerconnection:confirmed",this.handleCallStarted),this.callManager.on("recv-session-started",this.handleRecvSessionStarted),this.callManager.on("recv-session-ended",this.handleRecvSessionEnded),this.callManager.on("recv-quality-changed",this.handleRecvQualityChanged),this.callManager.on("ended",this.handleCallEnded),this.callManager.on("failed",this.handleCallEnded)}handleCallStarted=()=>{this.scheduleBalancingStart()};handleCallEnded=()=>{this.stopBalancing()};handleRecvSessionStarted=()=>{this.stopBalancing()};handleRecvSessionEnded=()=>{this.scheduleBalancingStart()};handleRecvQualityChanged=()=>{this.stopBalancing()};scheduleBalancingStart(){this.clearStartTimer(),this.startBalancingTimer=setTimeout(()=>{this.startBalancingTimer=void 0,this.startBalancing().catch(e=>{Mr("startBalancing: error",e)})},this.balancingStartDelay),this.events.trigger("balancing-scheduled",{delay:this.balancingStartDelay})}clearStartTimer(){this.startBalancingTimer&&(clearTimeout(this.startBalancingTimer),this.startBalancingTimer=void 0)}}const Ft="health-snapshot",$t="inbound-video-problem-detected",Gt="inbound-video-problem-resolved",xt="inbound-video-problem-reset",qt=[Ft,$t,Gt,xt],yr=()=>new S.TypedEvents(qt),Pr=3;class Z extends S.EventEmitterProxy{statsManager;callManager;minConsecutiveProblemSamplesCount;consecutiveProblemSamplesCount=0;currentProblemReason;hasEmittedCurrentProblem=!1;constructor(e,n,s=Pr){super(yr()),this.statsManager=e,this.callManager=n,Z.assertValidMinConsecutiveProblemSamplesCount(s),this.minConsecutiveProblemSamplesCount=s,this.subscribe()}get mainVideoTrack(){return this.callManager.getMainRemoteStream()?.getVideoTracks()[0]}get isMutedMainVideoTrack(){const{mainVideoTrack:e}=this;return e===void 0?!1:e.muted}get isInvalidInboundFrames(){return this.statsManager.isInvalidInboundFrames}get isNoInboundVideoTraffic(){return this.statsManager.isNoInboundVideoTraffic}get isInboundVideoStalled(){return this.statsManager.isInboundVideoStalled}get healthSnapshot(){return{isMutedMainVideoTrack:this.isMutedMainVideoTrack,isInvalidInboundFrames:this.isInvalidInboundFrames,isNoInboundVideoTraffic:this.isNoInboundVideoTraffic,isInboundVideoStalled:this.isInboundVideoStalled}}static resolveProblemReason(e){if(e.isInboundVideoStalled)return"inbound-video-stalled";if(e.isNoInboundVideoTraffic)return"no-inbound-video-traffic";if(e.isMutedMainVideoTrack&&e.isInvalidInboundFrames)return"invalid-inbound-frames"}static assertValidMinConsecutiveProblemSamplesCount(e){if(!Number.isInteger(e)||e<1)throw new Error("minConsecutiveProblemSamplesCount should be a positive integer")}setMinConsecutiveProblemSamplesCount(e){Z.assertValidMinConsecutiveProblemSamplesCount(e),this.minConsecutiveProblemSamplesCount=e,this.resetProblemDetectionState()}handleStatsCollected=()=>{const{healthSnapshot:e}=this;this.events.trigger(Ft,e);const n=Z.resolveProblemReason(e);if(n===void 0){this.maybeEmitResolvedProblem(e),this.resetProblemDetectionState();return}this.updateProblemDetectionState(n),this.consecutiveProblemSamplesCount>=this.minConsecutiveProblemSamplesCount&&!this.hasEmittedCurrentProblem&&(this.events.trigger($t,{...e,consecutiveProblemSamplesCount:this.consecutiveProblemSamplesCount,reason:n}),this.hasEmittedCurrentProblem=!0)};subscribe(){this.statsManager.on("collected",this.handleStatsCollected),this.callManager.on("peerconnection:confirmed",this.handleProblemReset("peerconnection:confirmed")),this.callManager.on("recv-session-started",this.handleProblemReset("recv-session-started")),this.callManager.on("recv-session-ended",this.handleProblemReset("recv-session-ended")),this.callManager.on("recv-quality-changed",this.handleProblemReset("recv-quality-changed")),this.callManager.on("failed",this.handleProblemReset("failed")),this.callManager.on("ended",this.handleProblemReset("ended"))}updateProblemDetectionState=e=>{if(this.currentProblemReason===e){this.consecutiveProblemSamplesCount+=1;return}this.currentProblemReason=e,this.consecutiveProblemSamplesCount=1,this.hasEmittedCurrentProblem=!1};maybeEmitResolvedProblem=e=>{!this.hasEmittedCurrentProblem||this.currentProblemReason===void 0||this.events.trigger(Gt,{...e,reason:this.currentProblemReason})};handleProblemReset=e=>()=>{this.maybeEmitResetProblem(e),this.resetProblemDetectionState()};maybeEmitResetProblem=e=>{!this.hasEmittedCurrentProblem||this.currentProblemReason===void 0||this.events.trigger(xt,{reason:this.currentProblemReason,resetCause:e})};resetProblemDetectionState=()=>{this.currentProblemReason=void 0,this.consecutiveProblemSamplesCount=0,this.hasEmittedCurrentProblem=!1}}const $=C("MainStreamRecovery"),Or=4e3;class le{renegotiateRequester;renegotiateThrottled;callManager;constructor(e,n=Or){this.callManager=e,this.renegotiateRequester=new q.CancelableRequest(e.renegotiate.bind(e)),this.renegotiateThrottled=this.createRenegotiateThrottled(n),this.subscribe()}static assertValidThrottleRecoveryTimeout(e){if(!Number.isInteger(e)||e<1)throw new Error("throttleRecoveryTimeout should be a positive integer")}setThrottleRecoveryTimeout(e){le.assertValidThrottleRecoveryTimeout(e),this.renegotiateThrottled.cancel(),this.renegotiateThrottled=this.createRenegotiateThrottled(e)}recover(){$("trying to recover main stream"),this.renegotiateThrottled()}requestRenegotiate=()=>{if($("trying to renegotiate"),this.renegotiateRequester.requested){$("previous renegotiate is not finished yet");return}this.renegotiateRequester.request().then(()=>{$("renegotiate has successful")}).catch(e=>{$("failed to renegotiate main media stream",e)})};createRenegotiateThrottled(e){return le.assertValidThrottleRecoveryTimeout(e),Yt.throttle(this.requestRenegotiate.bind(this),e)}subscribe(){this.callManager.on("ended",()=>{this.cancel()})}cancel(){$("cancel recover main stream"),this.renegotiateThrottled.cancel(),this.renegotiateRequester.cancelRequest()}}var Le=(t=>(t.VP8="video/VP8",t.VP9="video/VP9",t.H264="video/H264",t.AV1="video/AV1",t.rtx="video/rtx",t.red="video/red",t.flexfec03="video/flexfec-03",t))(Le||{});const _r={major:25,minor:8,patch:0},Dr=({isYandexBrowser:t,hasGreaterThanBrowserVersion:e})=>{const n=e(_r);return t&&n},wr=()=>{const t=Pe();if(Dr(t))return[Le.VP8]},Lr=()=>{const{isMobileDevice:t,isSafari:e,isOpera:n,isWindows:s}=Pe();return t||e||n&&s};let Vt;Lr()&&(Vt="h264");const kr={ignoreForCodec:Vt},Ur=wr(),Br=1e6,Fr=Ot.map(t=>`auto-connect:${t}`),$r=Pt.map(t=>`connection:${t}`),Gr=mt.map(t=>`call:${t}`),xr=tt.map(t=>`api:${t}`),qr=_t.map(t=>`incoming-call:${t}`),Vr=Rt.map(t=>`presentation:${t}`),Hr=Lt.map(t=>`stats:${t}`),Wr=Bt.map(t=>`video-balancer:${t}`),Qr=qt.map(t=>`main-stream-health:${t}`),Yr=wt.map(t=>`session:${t}`),jr=["disconnected-from-out-of-call","connected-with-configuration-from-out-of-call","stopped-presentation-by-server-command"],zr=[...Fr,...$r,...Gr,...xr,...qr,...Vr,...Hr,...Wr,...Qr,...Yr,...jr],Jr=()=>new S.TypedEvents(zr),Ke=C("SipConnector");class Xr extends S.EventEmitterProxy{connectionManager;connectionQueueManager;contentedStreamManager;callManager;autoConnectorManager;apiManager;incomingCallManager;presentationManager;statsManager;videoSendingBalancerManager;sessionManager;mainStreamHealthMonitor;peerToPeerManager;mainStreamRecovery;preferredMimeTypesVideoCodecs;excludeMimeTypesVideoCodecs;constructor({JsSIP:e},{preferredMimeTypesVideoCodecs:n,excludeMimeTypesVideoCodecs:s,videoBalancerOptions:i,autoConnectorOptions:r,numberOfConnectionAttempts:a,minConsecutiveProblemSamplesCount:c,throttleRecoveryTimeout:o}={}){super(Jr()),this.preferredMimeTypesVideoCodecs=n??Ur,this.excludeMimeTypesVideoCodecs=s,this.apiManager=new dn,this.connectionManager=new bi({JsSIP:e},{numberOfConnectionAttempts:a}),this.connectionQueueManager=new yi({connectionManager:this.connectionManager}),this.contentedStreamManager=new Xi,this.callManager=new qs({contentedStreamManager:this.contentedStreamManager},{sendOffer:this.sendOffer}),this.incomingCallManager=new sr(this.connectionManager),this.presentationManager=new js({callManager:this.callManager,maxBitrate:Br}),this.statsManager=new Tr({callManager:this.callManager,apiManager:this.apiManager}),this.autoConnectorManager=new Wi({connectionQueueManager:this.connectionQueueManager,connectionManager:this.connectionManager,callManager:this.callManager},r),this.videoSendingBalancerManager=new br(this.callManager,this.apiManager,i??kr),this.mainStreamHealthMonitor=new Z(this.statsManager,this.callManager,c),this.mainStreamRecovery=new le(this.callManager,o),this.sessionManager=new or({connectionManager:this.connectionManager,callManager:this.callManager,incomingCallManager:this.incomingCallManager,presentationManager:this.presentationManager,autoConnectorManager:this.autoConnectorManager}),this.callManager.subscribeToApiEvents(this.apiManager),this.contentedStreamManager.subscribeToApiEvents(this.apiManager),this.apiManager.subscribe({connectionManager:this.connectionManager,callManager:this.callManager}),this.peerToPeerManager=new ir,this.peerToPeerManager.subscribe({connectionManager:this.connectionManager,callManager:this.callManager,apiManager:this.apiManager}),this.subscribe()}get requestedConnection(){return this.connectionManager.requested}get isPendingConnect(){return this.connectionManager.isPendingConnect}get isPendingInitUa(){return this.connectionManager.isPendingInitUa}get connectionState(){return this.connectionManager.connectionState}get isRegistered(){return this.connectionManager.isRegistered}get isRegisterConfig(){return this.connectionManager.isRegisterConfig}get socket(){return this.connectionManager.socket}get requestedCall(){return this.callManager.requested}get connection(){return this.callManager.connection}get isCallActive(){return this.callManager.isCallActive}get localPorts(){return this.callManager.localPorts}get remoteCallerData(){return this.incomingCallManager.remoteCallerData}get isAvailableIncomingCall(){return this.incomingCallManager.isAvailableIncomingCall}get isDirectP2PRoom(){return this.callManager.isDirectP2PRoom}get isPresentationCall(){return this.callManager.isPresentationCall}get isOptionalPresentationPermission(){return this.isDirectP2PRoom||this.isPresentationCall}connect=async(...e)=>this.connectionQueueManager.connect(...e);disconnect=async()=>this.connectionQueueManager.disconnect();register=async()=>this.connectionManager.register();unregister=async()=>this.connectionManager.unregister();tryRegister=async()=>this.connectionManager.tryRegister();set=async(...e)=>this.connectionManager.set(...e);sendOptions=async(e,n,s)=>this.connectionManager.sendOptions(e,n,s);ping=async(e,n)=>this.connectionManager.ping(e,n);checkTelephony=async e=>this.connectionManager.checkTelephony(e);isConfigured=()=>this.connectionManager.isConfigured();getConnectionConfiguration=()=>this.connectionManager.getConnectionConfiguration();getUri=e=>this.connectionManager.getUri(e);startAutoConnect=(...e)=>{this.autoConnectorManager.start(...e)};stopAutoConnect=()=>{this.autoConnectorManager.stop()};call=async e=>{const{onAddedTransceiver:n,...s}=e;return this.callManager.startCall(this.connectionManager.getUaProtected(),this.getUri,{...s,onAddedTransceiver:this.resolveHandleAddTransceiver(n)})};hangUp=async()=>this.callManager.endCall();answerToIncomingCall=async e=>{const{onAddedTransceiver:n,...s}=e;return this.callManager.answerToIncomingCall(this.incomingCallManager.extractIncomingRTCSession,{...s,onAddedTransceiver:this.resolveHandleAddTransceiver(n)})};declineToIncomingCall=async(...e)=>this.incomingCallManager.declineToIncomingCall(...e);getEstablishedRTCSession=()=>this.callManager.getEstablishedRTCSession();getRemoteStreams=()=>this.callManager.getRemoteStreams();getRecvQuality=()=>this.callManager.getRecvQuality();setRecvQuality=async e=>this.callManager.setRecvQuality(e);applyQuality=async e=>this.callManager.applyQuality(e);replaceMediaStream=async(...e)=>this.callManager.replaceMediaStream(...e);async startPresentation(e,n={}){const{callLimit:s,onAddedTransceiver:i,...r}=n;return this.presentationManager.startPresentation(async()=>{await(this.isOptionalPresentationPermission?this.apiManager.sendAvailableContentedStream():this.apiManager.askPermissionToStartPresentation())},e,{...r,onAddedTransceiver:this.resolveHandleAddTransceiver(i)},s===void 0?void 0:{callLimit:s})}async stopPresentation(){return this.presentationManager.stopPresentation(async()=>{await(this.isOptionalPresentationPermission?this.apiManager.sendNotAvailableContentedStream():this.apiManager.sendStoppedPresentation())})}async updatePresentation(e,n={}){const{onAddedTransceiver:s,...i}=n;return this.presentationManager.updatePresentation(async()=>{await(this.isOptionalPresentationPermission?this.apiManager.sendAvailableContentedStream():this.apiManager.askPermissionToStartPresentation())},e,{...i,onAddedTransceiver:this.resolveHandleAddTransceiver(s)})}async waitChannels(...e){return this.apiManager.waitChannels(...e)}async waitSyncMediaState(...e){return this.apiManager.waitSyncMediaState(...e)}async sendDTMF(...e){return this.apiManager.sendDTMF(...e)}async sendChannels(...e){return this.apiManager.sendChannels(...e)}async sendMediaState(...e){return this.apiManager.sendMediaState(...e)}async sendRefusalToTurnOn(...e){return this.apiManager.sendRefusalToTurnOn(...e)}async sendRefusalToTurnOnMic(...e){return this.apiManager.sendRefusalToTurnOnMic(...e)}async sendRefusalToTurnOnCam(...e){return this.apiManager.sendRefusalToTurnOnCam(...e)}async askPermissionToEnableCam(...e){return this.apiManager.askPermissionToEnableCam(...e)}setMinConsecutiveProblemSamplesCount=e=>{this.mainStreamHealthMonitor.setMinConsecutiveProblemSamplesCount(e)};setThrottleRecoveryTimeout=e=>{this.mainStreamRecovery.setThrottleRecoveryTimeout(e)};subscribeDisconnectedFromOutOfCall(){this.connectionManager.on("disconnected",()=>{this.isCallActive||this.events.trigger("disconnected-from-out-of-call",{})})}subscribeConnectedWithConfigurationFromOutOfCall(){this.connectionManager.on("connected-with-configuration",e=>{this.isCallActive||this.events.trigger("connected-with-configuration-from-out-of-call",e)})}mayBeStopPresentationAndNotify(){this.presentationManager.isPresentationInProcess&&(this.stopPresentation().catch(()=>{}),this.events.trigger("stopped-presentation-by-server-command",{}))}subscribeToApiEvents(){this.apiManager.on("participant:move-request-to-participants",()=>{this.callManager.setCallRoleParticipant()}),this.apiManager.on("participant:move-request-to-spectators-synthetic",()=>{this.callManager.setCallRoleSpectatorSynthetic(),this.mayBeStopPresentationAndNotify()}),this.apiManager.on("participant:move-request-to-spectators-with-audio-id",({audioId:e})=>{this.callManager.setCallRoleSpectator({audioId:e}),this.mayBeStopPresentationAndNotify()}),this.apiManager.on("presentation:must-stop",()=>{this.mayBeStopPresentationAndNotify()}),this.apiManager.on("failed-send-room-direct-p2p",({error:e})=>{const n=new ie.IncomingResponse;n.body=e instanceof Error?e.message:String(e);const s=ie.C.causes.INTERNAL_ERROR;this.callManager.failed(n,s).catch(i=>{Ke("Failed to end call after failed:",i)})})}sendOffer=async(e,n)=>{const i=this.connectionManager.getConnectionConfiguration()?.sipServerUrl;if(i===void 0)throw new Error("No sipServerUrl for sendOffer");return st({serverUrl:i,offer:n,token:e.token,conferenceNumber:e.conferenceNumber,quality:e.quality,audio:e.audioChannel})};setCodecPreferences(e){Ar(e,{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs})}subscribe(){this.bridgeEvents("auto-connect",this.autoConnectorManager),this.bridgeEvents("connection",this.connectionManager),this.bridgeEvents("call",this.callManager),this.bridgeEvents("api",this.apiManager),this.bridgeEvents("incoming-call",this.incomingCallManager),this.bridgeEvents("presentation",this.presentationManager),this.bridgeEvents("stats",this.statsManager),this.bridgeEvents("video-balancer",this.videoSendingBalancerManager),this.bridgeEvents("main-stream-health",this.mainStreamHealthMonitor),this.bridgeEvents("session",this.sessionManager),this.subscribeToApiEvents(),this.subscribeDisconnectedFromOutOfCall(),this.subscribeConnectedWithConfigurationFromOutOfCall(),this.subscribeToMainStreamHealthMonitorEvents()}subscribeToMainStreamHealthMonitorEvents(){this.mainStreamHealthMonitor.on("inbound-video-problem-detected",({reason:e})=>{Ke("detected inbound video problem",{reason:e}),this.mainStreamRecovery.recover()})}bridgeEvents=(e,n)=>{n.events.eachTriggers((s,i)=>{n.on(i,r=>{this.events.trigger(`${e}:${i}`,r)})})};resolveHandleAddTransceiver=e=>async(n,s,i)=>{this.setCodecPreferences(n),await e?.(n,s,i)}}exports.DeferredCommandRunner=at;exports.ECallCause=we;exports.EContentUseLicense=ye;exports.EMimeTypesVideoCodecs=Le;exports.EState=d;exports.EState$1=Mt;exports.EState$2=E;exports.EState$3=Dt;exports.EState$4=vt;exports.EStatsTypes=N;exports.Originator=ut;exports.PURGATORY_CONFERENCE_NUMBER=nt;exports.SipConnector=Xr;exports.StatsPeerConnection=Ut;exports.createUaParser=Pe;exports.disableDebug=Jt;exports.enableDebug=zt;exports.getCodecFromSender=_e;exports.hasCanceledStartPresentationError=Ys;exports.hasNotReadyForConnectionError=At;exports.hasPeerToPeer=ce;exports.hasPurgatory=ee;exports.prepareMediaStream=K;exports.resolveDebug=C;exports.resolveOnStartMainCam=wn;exports.resolveOnStartMic=kn;exports.resolveOnStopMainCam=Bn;exports.resolveOnStopMic=$n;exports.sendOffer=st;exports.setEncodingsToSender=Oe;exports.setParametersToSender=de;exports.stringifyMessage=Cn;
1
+ "use strict";const ie=require("@krivega/jssip"),S=require("events-constructor"),Ie=require("debug"),V=require("@krivega/timeout-requester"),q=require("@krivega/cancelable-promise"),g=require("xstate"),he=require("repeated-calls"),ue=require("stack-promises"),Qt=require("ua-parser-js");require("sequent-promises");const Yt=require("lodash"),Me="sip-connector",jt=Ie(Me),zt=()=>{Ie.enable(`${Me}:*`)},Jt=()=>{Ie.enable(`-${Me}:*`)},C=t=>jt.extend(t),Xt="Error decline with 603",Kt=1006,Zt=t=>typeof t=="object"&&t!==null&&"code"in t&&t.code===Kt,en=t=>t.message===Xt;var re=(t=>(t.SPECTATOR="SPECTATOR",t.PARTICIPANT="PARTICIPANT",t))(re||{}),_=(t=>(t.SHARE_STATE="application/vinteo.webrtc.sharedesktop",t.MAIN_CAM="application/vinteo.webrtc.maincam",t.ENTER_ROOM="application/vinteo.webrtc.roomname",t.MIC="application/vinteo.webrtc.mic",t.USE_LICENSE="application/vinteo.webrtc.uselic",t.PARTICIPANT_STATE="application/vinteo.webrtc.partstate",t.NOTIFY="application/vinteo.webrtc.notify",t))(_||{}),O=(t=>(t.SHARE_STATE="application/vinteo.webrtc.sharedesktop",t.MAIN_CAM="application/vinteo.webrtc.maincam",t.CHANNELS="application/vinteo.webrtc.channels",t.MEDIA_STATE="application/vinteo.webrtc.mediastate",t.REFUSAL="application/vinteo.webrtc.refusal",t.STATS="application/vinteo.webrtc.stats",t))(O||{}),P=(t=>(t.PAUSE_MAIN_CAM="PAUSEMAINCAM",t.RESUME_MAIN_CAM="RESUMEMAINCAM",t.MAX_MAIN_CAM_RESOLUTION="MAXMAINCAMRESOLUTION",t.ADMIN_STOP_MAIN_CAM="ADMINSTOPMAINCAM",t.ADMIN_START_MAIN_CAM="ADMINSTARTMAINCAM",t))(P||{}),ae=(t=>(t.ADMIN_STOP_MIC="ADMINSTOPMIC",t.ADMIN_START_MIC="ADMINSTARTMIC",t))(ae||{}),Ze=(t=>(t.H264="H264",t.VP8="VP8",t.VP9="VP9",t.AV1="AV1",t))(Ze||{}),h=(t=>(t.CONTENT_TYPE="content-type",t.CONTENT_ENTER_ROOM="x-webrtc-enter-room",t.CONTENT_USE_LICENSE="x-webrtc-use-license",t.PARTICIPANT_NAME="x-webrtc-participant-name",t.INPUT_CHANNELS="x-webrtc-input-channels",t.OUTPUT_CHANNELS="x-webrtc-output-channels",t.MAIN_CAM="x-webrtc-maincam",t.MIC="x-webrtc-mic",t.MEDIA_SYNC="x-webrtc-sync",t.MAIN_CAM_RESOLUTION="x-webrtc-maincam-resolution",t.MEDIA_STATE="x-webrtc-media-state",t.MEDIA_TYPE="x-vinteo-media-type",t.MAIN_CAM_STATE="x-vinteo-maincam-state",t.MIC_STATE="x-vinteo-mic-state",t.CONTENT_PARTICIPANT_STATE="x-webrtc-partstate",t.AUDIO_ID="x-webrtc-audioid",t.SPECTATOR_MODE="x-webrtc-spectator-mode",t.NOTIFY="x-vinteo-notify",t.CONTENT_ENABLE_MEDIA_DEVICE="x-webrtc-request-enable-media-device",t.CONTENTED_STREAM_STATE="x-webrtc-share-state",t.CONTENTED_STREAM_CODEC="x-webrtc-share-codec",t.AVAILABLE_INCOMING_BITRATE="x-webrtc-available-incoming-bitrate",t.AUDIO_TRACK_COUNT="x-webrtc-audio-track-count",t.VIDEO_TRACK_COUNT="x-webrtc-video-track-count",t.TRACKS_DIRECTION="x-webrtc-tracks-direction",t.BEARER_TOKEN="x-bearer-token",t.IS_DIRECT_PEER_TO_PEER="x-webrtc-is-direct-p2p",t))(h||{}),X=(t=>(t.AVAILABLE_CONTENTED_STREAM="YOUCANRECEIVECONTENT",t.NOT_AVAILABLE_CONTENTED_STREAM="CONTENTEND",t.MUST_STOP_PRESENTATION="YOUMUSTSTOPSENDCONTENT",t))(X||{}),G=(t=>(t.AVAILABLE_CONTENTED_STREAM="x-webrtc-share-state: YOUCANRECEIVECONTENT",t.NOT_AVAILABLE_CONTENTED_STREAM="x-webrtc-share-state: CONTENTEND",t.ACK_PERMISSION_TO_START_PRESENTATION="x-webrtc-share-state: LETMESTARTPRESENTATION",t.STOPPED_CLIENT_PRESENTATION="x-webrtc-share-state: STOPPRESENTATION",t.ENABLE_MAIN_CAM="x-webrtc-request-enable-media-device: LETMESTARTMAINCAM",t))(G||{}),oe=(t=>(t.ADMIN_SYNC_FORCED="1",t.ADMIN_SYNC_NOT_FORCED="0",t))(oe||{}),be=(t=>(t.SPECTATOR_MANUAL="0",t.BY_STATE_CAM="1",t.SPECTATOR_FORCED="2",t))(be||{}),ye=(t=>(t.AUDIO="AUDIO",t.VIDEO="VIDEO",t.AUDIOPLUSPRESENTATION="AUDIOPLUSPRESENTATION",t))(ye||{});const w=t=>typeof t=="string"&&t.trim().length>0,tn=t=>typeof t=="object"&&t!==null&&!Array.isArray(t),et=t=>typeof t=="boolean",nn=t=>Array.isArray(t)&&t.every(e=>typeof e=="string"),tt=["enter-room","main-cam-control","use-license","new-dtmf","conference:participant-token-issued","contented-stream:available","contented-stream:not-available","presentation:must-stop","channels:all","channels:notify","participant:added-to-list-moderators","participant:removed-from-list-moderators","participant:move-request-to-stream","participant:move-request-to-spectators","participant:move-request-to-spectators-synthetic","participant:move-request-to-spectators-with-audio-id","participant:move-request-to-participants","participation:accepting-word-request","participation:cancelling-word-request","webcast:started","webcast:stopped","account:changed","account:deleted","admin:start-main-cam","admin:stop-main-cam","admin:start-mic","admin:stop-mic","admin:force-sync-media-state","failed-send-room-direct-p2p"],sn=()=>new S.TypedEvents(tt),rn=t=>!(!tn(t)||!w(t.conference)||!w(t.participant)||!w(t.jwt)),k=(t,e)=>{const n=e.toLowerCase(),s=Object.entries(t).find(([,i])=>typeof i=="string"&&i.toLowerCase()===n);return s?s[1]:void 0},an=t=>typeof t=="string"&&!Number.isNaN(Number(t))&&Number.isFinite(Number(t)),on=t=>{if(an(t))return Number(t)},cn=t=>{const e=t.toLowerCase();if(e==="true"||e==="1")return!0;if(e==="false"||e==="0")return!1},A=(t,e)=>{const n=t.getHeader(e.toLowerCase());if(!w(n))return;const s=n.toLowerCase();switch(e){case h.BEARER_TOKEN:return n;case h.CONTENT_ENTER_ROOM:case h.PARTICIPANT_NAME:case h.INPUT_CHANNELS:case h.OUTPUT_CHANNELS:case h.TRACKS_DIRECTION:case h.AUDIO_ID:case h.MAIN_CAM_RESOLUTION:case h.MEDIA_STATE:case h.NOTIFY:case h.CONTENT_ENABLE_MEDIA_DEVICE:return s;case h.MEDIA_TYPE:case h.MAIN_CAM_STATE:case h.MIC_STATE:case h.AVAILABLE_INCOMING_BITRATE:case h.AUDIO_TRACK_COUNT:case h.VIDEO_TRACK_COUNT:return on(s);case h.CONTENTED_STREAM_CODEC:return k(Ze,s);case h.CONTENT_TYPE:return k(_,s);case h.CONTENT_USE_LICENSE:return k(ye,s);case h.MAIN_CAM:return k(P,s);case h.MIC:return k(ae,s);case h.MEDIA_SYNC:return k(oe,s);case h.CONTENT_PARTICIPANT_STATE:return k(re,s);case h.SPECTATOR_MODE:return k(be,s);case h.CONTENTED_STREAM_STATE:return k(X,s);case h.IS_DIRECT_PEER_TO_PEER:return cn(s);default:return}};var y=(t=>(t.CHANNELS="channels",t.WEBCAST_STARTED="WebcastStarted",t.WEBCAST_STOPPED="WebcastStopped",t.ACCOUNT_CHANGED="accountChanged",t.ACCOUNT_DELETED="accountDeleted",t.ADDED_TO_LIST_MODERATORS="addedToListModerators",t.REMOVED_FROM_LIST_MODERATORS="removedFromListModerators",t.ACCEPTING_WORD_REQUEST="ParticipationRequestAccepted",t.CANCELLING_WORD_REQUEST="ParticipationRequestRejected",t.MOVE_REQUEST_TO_STREAM="ParticipantMovedToWebcast",t.CONFERENCE_PARTICIPANT_TOKEN_ISSUED="ConferenceParticipantTokenIssued",t))(y||{});const ke=C("ApiManager");class dn extends S.EventEmitterProxy{callManager;constructor(){super(sn())}subscribe({connectionManager:e,callManager:n}){this.callManager=n,e.on("sipEvent",this.handleSipEvent),n.on("newInfo",this.handleNewInfo),n.on("newDTMF",({originator:s})=>{this.events.trigger("new-dtmf",{originator:s})})}async waitChannels(){return this.wait("channels:all")}async waitSyncMediaState(){return this.wait("admin:force-sync-media-state")}async sendDTMF(e){return new Promise((n,s)=>{let i;try{i=this.getEstablishedRTCSessionProtected()}catch(r){s(r)}i&&(this.callManager?.once("newDTMF",({originator:r})=>{r==="local"&&n()}),i.sendDTMF(e,{duration:120,interToneGap:600}))})}async sendChannels({inputChannels:e,outputChannels:n}){const s=this.getEstablishedRTCSessionProtected(),i=`${h.INPUT_CHANNELS}: ${e}`,r=`${h.OUTPUT_CHANNELS}: ${n}`,a=[i,r];return s.sendInfo(O.CHANNELS,void 0,{extraHeaders:a})}sendEnterRoom(e){this.sendEnterRoomProtected(e).catch(n=>{this.events.trigger("failed-send-room-direct-p2p",{error:n})})}async sendMediaState({cam:e,mic:n},s={}){const i=this.getEstablishedRTCSessionProtected(),r=`${h.MEDIA_STATE}: currentstate`,a=`${h.MAIN_CAM_STATE}: ${Number(e)}`,c=`${h.MIC_STATE}: ${Number(n)}`,o=[r,a,c];return i.sendInfo(O.MEDIA_STATE,void 0,{noTerminateWhenError:!0,...s,extraHeaders:o})}async sendStats({availableIncomingBitrate:e}){const n=this.getEstablishedRTCSessionProtected(),i=[`${h.AVAILABLE_INCOMING_BITRATE}: ${e}`];return n.sendInfo(O.STATS,void 0,{noTerminateWhenError:!0,extraHeaders:i})}async sendRefusalToTurnOn(e,n={}){const s=this.getEstablishedRTCSessionProtected(),a=e==="mic"?0:1,o=[`${h.MEDIA_TYPE}: ${a}`];return s.sendInfo(O.REFUSAL,void 0,{noTerminateWhenError:!0,...n,extraHeaders:o})}async sendRefusalToTurnOnMic(e={}){return this.sendRefusalToTurnOn("mic",{noTerminateWhenError:!0,...e})}async sendRefusalToTurnOnCam(e={}){return this.sendRefusalToTurnOn("cam",{noTerminateWhenError:!0,...e})}async sendAvailableContentedStream(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.AVAILABLE_CONTENTED_STREAM]})}async askPermissionToStartPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.ACK_PERMISSION_TO_START_PRESENTATION]})}async sendStoppedPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.STOPPED_CLIENT_PRESENTATION]})}async sendNotAvailableContentedStream(){await this.getEstablishedRTCSessionProtected().sendInfo(O.SHARE_STATE,void 0,{extraHeaders:[G.NOT_AVAILABLE_CONTENTED_STREAM]})}async askPermissionToEnableCam(e={}){const n=this.getEstablishedRTCSessionProtected(),s=[G.ENABLE_MAIN_CAM];return n.sendInfo(O.MAIN_CAM,void 0,{noTerminateWhenError:!0,...e,extraHeaders:s}).catch(i=>{if(en(i))throw i})}getEstablishedRTCSessionProtected=()=>{const e=this.callManager?.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};handleSipEvent=({request:e})=>{this.maybeHandleNotify(e)};maybeHandleNotify=e=>{try{const n=e.getHeader(h.NOTIFY);if(n){const s=JSON.parse(n);this.handleNotify(s)}}catch(n){ke("error parse notify",n)}};handleNotify=e=>{switch(e.cmd){case y.CHANNELS:{this.triggerChannelsNotify(e);break}case y.WEBCAST_STARTED:{this.triggerWebcastStartedNotify(e);break}case y.WEBCAST_STOPPED:{this.triggerWebcastStoppedNotify(e);break}case y.ADDED_TO_LIST_MODERATORS:{this.triggerAddedToListModeratorsNotify(e);break}case y.REMOVED_FROM_LIST_MODERATORS:{this.triggerRemovedFromListModeratorsNotify(e);break}case y.ACCEPTING_WORD_REQUEST:{this.triggerParticipationAcceptingWordRequest(e);break}case y.CANCELLING_WORD_REQUEST:{this.triggerParticipationCancellingWordRequest(e);break}case y.MOVE_REQUEST_TO_STREAM:{this.triggerParticipantMoveRequestToStream(e);break}case y.ACCOUNT_CHANGED:{this.triggerAccountChangedNotify();break}case y.ACCOUNT_DELETED:{this.triggerAccountDeletedNotify();break}case y.CONFERENCE_PARTICIPANT_TOKEN_ISSUED:{this.maybeTriggerConferenceParticipantTokenIssued(e);break}default:ke("unknown cmd",e)}};handleNewInfo=e=>{const{originator:n}=e;if(n!=="remote")return;const{request:s}=e,i=s,r=A(i,h.CONTENT_TYPE);if(r!==void 0)switch(r){case _.ENTER_ROOM:{this.triggerEnterRoom(i),this.maybeTriggerChannels(i);break}case _.NOTIFY:{this.maybeHandleNotify(i);break}case _.SHARE_STATE:{this.triggerContentedStreamState(i);break}case _.MAIN_CAM:{this.triggerMainCamControl(i);break}case _.MIC:{this.triggerMicControl(i);break}case _.USE_LICENSE:{this.triggerUseLicense(i);break}case _.PARTICIPANT_STATE:{this.maybeTriggerParticipantMoveRequest(i);break}}};triggerChannelsNotify=e=>{const n=e.input,s=e.output,i={inputChannels:n,outputChannels:s};this.events.trigger("channels:notify",i)};triggerWebcastStartedNotify=({body:{conference:e,type:n}})=>{const s={conference:e,type:n};this.events.trigger("webcast:started",s)};triggerWebcastStoppedNotify=({body:{conference:e,type:n}})=>{const s={conference:e,type:n};this.events.trigger("webcast:stopped",s)};triggerAddedToListModeratorsNotify=({conference:e})=>{const n={conference:e};this.events.trigger("participant:added-to-list-moderators",n)};triggerRemovedFromListModeratorsNotify=({conference:e})=>{const n={conference:e};this.events.trigger("participant:removed-from-list-moderators",n)};triggerParticipationAcceptingWordRequest=({body:{conference:e}})=>{const n={conference:e};this.events.trigger("participation:accepting-word-request",n)};triggerParticipationCancellingWordRequest=({body:{conference:e}})=>{const n={conference:e};this.events.trigger("participation:cancelling-word-request",n)};triggerParticipantMoveRequestToStream=({body:{conference:e}})=>{const n={conference:e};this.events.trigger("participant:move-request-to-stream",n)};triggerAccountChangedNotify=()=>{this.events.trigger("account:changed")};triggerAccountDeletedNotify=()=>{this.events.trigger("account:deleted")};maybeTriggerConferenceParticipantTokenIssued=({body:{conference:e,participant:n,jwt:s}})=>{const i={conference:e,participant:n,jwt:s};rn(i)&&this.events.trigger("conference:participant-token-issued",i)};maybeTriggerChannels=e=>{const n=A(e,h.INPUT_CHANNELS),s=A(e,h.OUTPUT_CHANNELS);if(n!==void 0&&s!==void 0){const i={inputChannels:n,outputChannels:s};this.events.trigger("channels:all",i)}};triggerEnterRoom=e=>{const n=A(e,h.CONTENT_ENTER_ROOM),s=A(e,h.PARTICIPANT_NAME),i=A(e,h.BEARER_TOKEN),r=A(e,h.IS_DIRECT_PEER_TO_PEER);n!==void 0&&s!==void 0&&this.events.trigger("enter-room",{room:n,participantName:s,bearerToken:i,isDirectPeerToPeer:r})};triggerContentedStreamState=e=>{const n=A(e,h.CONTENTED_STREAM_STATE);if(n!==void 0)switch(n){case X.AVAILABLE_CONTENTED_STREAM:{const s=A(e,h.CONTENTED_STREAM_CODEC);this.events.trigger("contented-stream:available",{codec:s});break}case X.NOT_AVAILABLE_CONTENTED_STREAM:{this.events.trigger("contented-stream:not-available");break}case X.MUST_STOP_PRESENTATION:{this.events.trigger("presentation:must-stop");break}}};maybeTriggerParticipantMoveRequest=e=>{const n=A(e,h.CONTENT_PARTICIPANT_STATE),s=A(e,h.AUDIO_ID),i=A(e,h.SPECTATOR_MODE);if(n===re.SPECTATOR){const r=i===be.BY_STATE_CAM;s===void 0?(this.events.trigger("participant:move-request-to-spectators-synthetic",{isAvailableSendingMedia:r}),this.events.trigger("participant:move-request-to-spectators",{isAvailableSendingMedia:r,isSynthetic:!0})):(this.events.trigger("participant:move-request-to-spectators-with-audio-id",{isAvailableSendingMedia:r,audioId:s}),this.events.trigger("participant:move-request-to-spectators",{isAvailableSendingMedia:r,isSynthetic:!1,audioId:s}))}n===re.PARTICIPANT&&this.events.trigger("participant:move-request-to-participants")};triggerMainCamControl=e=>{const n=A(e,h.MAIN_CAM),s=A(e,h.MEDIA_SYNC),i=s===oe.ADMIN_SYNC_FORCED;if(n===P.ADMIN_START_MAIN_CAM){this.events.trigger("admin:start-main-cam",{isSyncForced:i});return}if(n===P.ADMIN_STOP_MAIN_CAM){this.events.trigger("admin:stop-main-cam",{isSyncForced:i});return}(n===P.RESUME_MAIN_CAM||n===P.PAUSE_MAIN_CAM)&&s!==void 0&&this.events.trigger("admin:force-sync-media-state",{isSyncForced:i});const r=A(e,h.MAIN_CAM_RESOLUTION);this.events.trigger("main-cam-control",{mainCam:n,resolutionMainCam:r})};triggerMicControl=e=>{const n=A(e,h.MIC),i=A(e,h.MEDIA_SYNC)===oe.ADMIN_SYNC_FORCED;n===ae.ADMIN_START_MIC?this.events.trigger("admin:start-mic",{isSyncForced:i}):n===ae.ADMIN_STOP_MIC&&this.events.trigger("admin:stop-mic",{isSyncForced:i})};triggerUseLicense=e=>{const n=A(e,h.CONTENT_USE_LICENSE);n!==void 0&&this.events.trigger("use-license",n)};async sendEnterRoomProtected(e){return this.getEstablishedRTCSessionProtected().sendInfo(_.ENTER_ROOM,void 0,{extraHeaders:e})}}const ln=(t,e)=>{const n=e.major===t.major,s=e.minor===t.minor,i=e.major>t.major,r=n&&e.minor>t.minor,a=n&&s&&e.patch>t.patch;return i||r||a},hn=t=>t.major!==void 0&&t.minor!==void 0&&t.patch!==void 0,un=t=>e=>hn(t)&&ln(t,e),gn=(t="")=>{const e=t.split(".");if(e.length<=1)return{major:void 0,minor:void 0,patch:void 0};const[n,s,i]=e.map(r=>Number.parseInt(r,10));return{major:n,minor:s,patch:i}},mn=()=>globalThis.process?.versions?.electron!==void 0,Pe=()=>{const t=new Qt.UAParser,{name:e,version:n}=t.getBrowser(),{name:s}=t.getOS(),{type:i}=t.getDevice(),r=mn(),a=i==="mobile",c=gn(n);return{hasGreaterThanBrowserVersion:un(c),isMobileDevice:a,isChrome:e==="Chrome"||r,isYandexBrowser:e==="Yandex",isSafari:e==="Safari",isOpera:e==="Opera",isWindows:s==="Windows"}},pn=C("stringifyMessage"),Cn=t=>{let e="";try{e=JSON.stringify(t)}catch(n){pn("failed to stringify message",n)}return e},En=/^p2p.+to.+$/i,ce=t=>t!==void 0&&t.length>0&&En.test(t),nt="purgatory",ee=t=>t===nt,Tn=(t,e)=>{t.getVideoTracks().forEach(s=>{"contentHint"in s&&s.contentHint!==e&&(s.contentHint=e)})},K=(t,{directionVideo:e,directionAudio:n,contentHint:s}={})=>{if(!t||e==="recvonly"&&n==="recvonly")return;const i=n==="recvonly"?[]:t.getAudioTracks(),r=e==="recvonly"?[]:t.getVideoTracks(),a=[...i,...r],c=new MediaStream(a);return c.getTracks=()=>[...c.getAudioTracks(),...c.getVideoTracks()],s&&s!=="none"&&Tn(c,s),c},Sn="api/v2/rtp2webrtc/offer",st=async({serverUrl:t,conferenceNumber:e,quality:n,audio:s,offer:i,token:r})=>{const a=new URL(`https://${t.replace(/\/$/,"")}/${Sn}/${encodeURIComponent(e)}`);a.searchParams.set("quality",n),a.searchParams.set("audio",String(s));const c={"Content-Type":"application/json",Authorization:`Bearer ${r}`},o=await fetch(a.toString(),{method:"POST",headers:c,credentials:"same-origin",body:JSON.stringify(i)});if(!o.ok)throw new Error(`sendOffer failed with status ${o.status}`);const l=await o.json();return{type:l.type,sdp:l.sdp,toJSON(){return l}}},Rn=(t,e)=>(t.degradationPreference=e.degradationPreference,t),vn=(t,e)=>{t.encodings??=[];for(let n=t.encodings.length;n<e;n+=1)t.encodings.push({});return t},it=t=>(e,n)=>n!==void 0&&e!==n||n===void 0&&e!==t,fn=it(),Nn=(t,e)=>{if(fn(t,e))return t},An=(t,e,{isResetAllowed:n=!1}={})=>{const s=t.maxBitrate,i=Nn(e,s);return(i!==void 0||n)&&(t.maxBitrate=i??e),t},rt=1,In=it(rt),Mn=(t,e)=>{const n=t===void 0?void 0:Math.max(t,rt);if(n!==void 0&&In(n,e))return n},bn=(t,e)=>{const n=t.scaleResolutionDownBy,s=Mn(e,n);return s!==void 0&&(t.scaleResolutionDownBy=s),t},yn=(t,e,{isResetAllowed:n}={})=>{const s=e.encodings?.length??0;return vn(t,s),t.encodings.forEach((i,r)=>{const a=(e?.encodings??[])[r],c=a?.maxBitrate,o=a?.scaleResolutionDownBy;An(i,c,{isResetAllowed:n}),bn(i,o)}),t},Pn=(t,e)=>{if(t.codecs?.length!==e.codecs?.length)return!0;for(let n=0;n<(t.codecs?.length??0);n++)if(JSON.stringify(t.codecs[n])!==JSON.stringify(e.codecs[n]))return!0;if(t.headerExtensions?.length!==e.headerExtensions?.length)return!0;for(let n=0;n<(t.headerExtensions?.length??0);n++)if(JSON.stringify(t.headerExtensions[n])!==JSON.stringify(e.headerExtensions[n]))return!0;if(t.encodings?.length!==e.encodings?.length)return!0;for(let n=0;n<(t.encodings?.length??0);n++)if(JSON.stringify(t.encodings[n])!==JSON.stringify(e.encodings[n]))return!0;return t.rtcp?.cname!==e.rtcp?.cname||t.rtcp?.reducedSize!==e.rtcp?.reducedSize||t.degradationPreference!==e.degradationPreference},de=async(t,e,{isResetAllowed:n}={})=>{const s=t.getParameters(),i=JSON.parse(JSON.stringify(s));yn(s,e,{isResetAllowed:n}),Rn(s,e);const r=Pn(i,s);return r&&await t.setParameters(s),{parameters:s,isChanged:r}},Oe=async(t,e,n)=>{const{isChanged:s,parameters:i}=await de(t,{encodings:[{scaleResolutionDownBy:e.scaleResolutionDownBy,maxBitrate:e.maxBitrate}]});return s&&n&&n(i),{isChanged:s,parameters:i}},On=(t,e)=>t.find(n=>n.track!==null&&e.getTracks().includes(n.track)),_n=async(t,e,n)=>{const s=On(t,e);if(s)return Oe(s,{maxBitrate:n})},Dn=C("resolveOnStartMainCam"),wn=t=>n=>(Dn("onStartMainCam"),t.on("api:admin:start-main-cam",n)),Ln=C("resolveOnStartMic"),kn=t=>n=>(Ln("onStartMic"),t.on("api:admin:start-mic",n)),Un=C("resolveOnStopMainCam"),Bn=t=>n=>(Un("onStopMainCam"),t.on("api:admin:stop-main-cam",n)),Fn=C("resolveOnStopMic"),$n=t=>n=>(Fn("onStopMic"),t.on("api:admin:stop-mic",n));class at{command=void 0;unsubscribe;options;constructor(e){this.options=e}set(e){this.cancel(),this.command=e,this.unsubscribe=this.options.subscribe(n=>{this.options.isReady(n)?(this.command!==void 0&&this.options.onExecute(this.command),this.cancel()):this.options.isCancelled(n)&&this.cancel()})}cancel(){this.unsubscribe?.(),this.unsubscribe=void 0,this.command=void 0}}const p="evaluate";var d=(t=>(t.IDLE="call:idle",t.CONNECTING="call:connecting",t.PRESENTATION_CALL="call:presentationCall",t.ROOM_PENDING_AUTH="call:roomPendingAuth",t.PURGATORY="call:purgatory",t.P2P_ROOM="call:p2pRoom",t.DIRECT_P2P_ROOM="call:directP2pRoom",t.IN_ROOM="call:inRoom",t.DISCONNECTING="call:disconnecting",t))(d||{});class H{actor;subscriptions=[];stateChangeListeners=new Set;constructor(e){this.actor=g.createActor(e),this.actor.start(),this.addSubscription(this.subscribe(n=>{const s=n.value;this.stateChangeListeners.forEach(i=>{i(s)})}))}get state(){return this.getSnapshot().value}get context(){return this.getSnapshot().context}send(e){this.actor.send(e)}getSnapshot(){return this.actor.getSnapshot()}subscribe(e){const n=this.actor.subscribe(e);return this.addSubscription(n),n}onStateChange(e){return this.stateChangeListeners.add(e),()=>{this.stateChangeListeners.delete(e)}}stop(){this.stateChangeListeners.clear(),this.subscriptions.forEach(e=>{e()}),this.subscriptions.length=0,this.actor.stop()}addSubscription(e){const n=typeof e=="function"?e:()=>{e.unsubscribe()};return this.subscriptions.push(n),n}}const ot=t=>"number"in t&&w(t.number)&&et(t.answer),ct=t=>"room"in t&&w(t.room)&&w(t.participantName),Gn=t=>"token"in t&&w(t.token),dt=t=>Gn(t)&&"conferenceForToken"in t&&w(t.conferenceForToken),J=t=>ot(t)&&ct(t),lt=t=>!dt(t)||!ct(t)?!1:t.conferenceForToken===t.room,ht=({isDirectPeerToPeer:t})=>t===!0,ge=t=>"isDirectPeerToPeer"in t&&ht(t),xn="x-vinteo-presentation-call: yes",qn=t=>nn(t)&&t.some(e=>e.trim().toLowerCase()===xn),Vn=t=>"extraHeaders"in t&&qn(t.extraHeaders)&&"isConfirmed"in t&&t.isConfirmed===!0,ne=t=>J(t)&&!ee(t.room)&&dt(t)&&lt(t),Q=t=>{const e=t;return{number:e.number,answer:e.answer,room:e.room,participantName:e.participantName}},I={[d.IDLE]:{guard:()=>!0,buildContext:()=>({})},[d.CONNECTING]:{guard:ot,buildContext:t=>{const{number:e,answer:n,extraHeaders:s}=t;return{number:e,answer:n,extraHeaders:s}}},[d.PRESENTATION_CALL]:{guard:Vn,buildContext:t=>{const{number:e,answer:n}=t;return{number:e,answer:n}}},[d.ROOM_PENDING_AUTH]:{guard:t=>J(t)&&!ee(t.room)&&!ce(t.room)&&!ge(t)&&!lt(t),buildContext:Q},[d.PURGATORY]:{guard:t=>J(t)&&ee(t.room)&&!ne(t),buildContext:Q},[d.P2P_ROOM]:{guard:t=>J(t)&&ce(t.room)&&!ge(t)&&!ne(t),buildContext:Q},[d.DIRECT_P2P_ROOM]:{guard:t=>J(t)&&ge(t)&&!ne(t),buildContext:t=>({...Q(t),isDirectPeerToPeer:!0})},[d.IN_ROOM]:{guard:ne,buildContext:t=>{const{token:e,conferenceForToken:n}=t;return{...Q(t),token:e,conferenceForToken:n}}},[d.DISCONNECTING]:{guard:t=>t.pendingDisconnect===!0,buildContext:()=>({})}},Hn=t=>ee(t.room)||ce(t.room)||ht(t),Ue={raw:{},state:{}},me=()=>({}),Wn=()=>g.setup({types:{context:Ue,events:{}},actions:{setConnecting:g.assign(({event:t,context:e})=>t.type!=="CALL.CONNECTING"?e:{raw:{...me(),number:t.number,answer:t.answer,extraHeaders:t.extraHeaders}}),setRoomInfo:g.assign(({event:t,context:e})=>{if(t.type!=="CALL.ENTER_ROOM")return e;const n={room:t.room,participantName:t.participantName};return w(t.token)?(n.token=t.token,n.conferenceForToken=t.room):Hn(t)&&(n.token=void 0,n.conferenceForToken=void 0),et(t.isDirectPeerToPeer)&&(n.isDirectPeerToPeer=t.isDirectPeerToPeer),{raw:{...e.raw,...n}}}),setTokenInfo:g.assign(({event:t,context:e})=>t.type!=="CALL.TOKEN_ISSUED"?e:{raw:{...e.raw,token:t.token,conferenceForToken:t.conferenceForToken,participantName:t.participantName}}),setConfirmed:g.assign(({event:t,context:e})=>t.type!=="CALL.PRESENTATION_CALL"?e:{raw:{...e.raw,isConfirmed:!0}}),reset:g.assign(()=>({raw:me()})),prepareDisconnect:g.assign(()=>({raw:{...me(),pendingDisconnect:!0}}))}}).createMachine({id:"call",initial:d.IDLE,context:Ue,states:{[d.IDLE]:{entry:g.assign(()=>({state:I[d.IDLE].buildContext()})),on:{"CALL.CONNECTING":{target:p,actions:"setConnecting"}}},[d.CONNECTING]:{entry:g.assign(({context:t})=>({state:I[d.CONNECTING].buildContext(t.raw)})),on:{"CALL.PRESENTATION_CALL":{target:p,actions:"setConfirmed"},"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.ROOM_PENDING_AUTH]:{entry:g.assign(({context:t})=>({state:I[d.ROOM_PENDING_AUTH].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.IN_ROOM]:{entry:g.assign(t=>({state:I[d.IN_ROOM].buildContext(t.context.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[p]:{always:[{target:d.DISCONNECTING,guard:({context:t})=>I[d.DISCONNECTING].guard(t.raw)},{target:d.PRESENTATION_CALL,guard:({context:t})=>I[d.PRESENTATION_CALL].guard(t.raw)},{target:d.IN_ROOM,guard:({context:t})=>I[d.IN_ROOM].guard(t.raw)},{target:d.DIRECT_P2P_ROOM,guard:({context:t})=>I[d.DIRECT_P2P_ROOM].guard(t.raw)},{target:d.P2P_ROOM,guard:({context:t})=>I[d.P2P_ROOM].guard(t.raw)},{target:d.PURGATORY,guard:({context:t})=>I[d.PURGATORY].guard(t.raw)},{target:d.ROOM_PENDING_AUTH,guard:({context:t})=>I[d.ROOM_PENDING_AUTH].guard(t.raw)},{target:d.CONNECTING,guard:({context:t})=>I[d.CONNECTING].guard(t.raw)},{target:d.IDLE}]},[d.PURGATORY]:{entry:g.assign(({context:t})=>({state:I[d.PURGATORY].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.P2P_ROOM]:{entry:g.assign(({context:t})=>({state:I[d.P2P_ROOM].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.PRESENTATION_CALL]:{entry:g.assign(({context:t})=>({state:I[d.PRESENTATION_CALL].buildContext(t.raw)})),on:{"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.DIRECT_P2P_ROOM]:{entry:g.assign(({context:t})=>({state:I[d.DIRECT_P2P_ROOM].buildContext(t.raw)})),on:{"CALL.ENTER_ROOM":{target:p,actions:"setRoomInfo"},"CALL.TOKEN_ISSUED":{target:p,actions:"setTokenInfo"},"CALL.START_DISCONNECT":{target:p,actions:"prepareDisconnect"},"CALL.RESET":{target:p,actions:"reset"}}},[d.DISCONNECTING]:{entry:g.assign(()=>({state:I[d.DISCONNECTING].buildContext()})),on:{"CALL.RESET":{target:p,actions:"reset"}}}}});function Qn(t){return t!==p}const Yn=C("CallStateMachine");class jn extends H{constructor(e,n){super(e),this.subscribeToEvents(n)}get isIdle(){return this.state===d.IDLE}get isConnecting(){return this.state===d.CONNECTING}get isPresentationCall(){return this.state===d.PRESENTATION_CALL}get isRoomPendingAuth(){return this.state===d.ROOM_PENDING_AUTH}get isInPurgatory(){return this.state===d.PURGATORY}get isP2PRoom(){return this.state===d.P2P_ROOM}get isDirectP2PRoom(){return this.state===d.DIRECT_P2P_ROOM}get isInRoom(){return this.state===d.IN_ROOM}get isDisconnecting(){return this.state===d.DISCONNECTING}get idleContext(){if(this.state===d.IDLE)return this.context.state}get connectingContext(){if(this.state===d.CONNECTING)return this.context.state}get roomPendingAuthContext(){if(this.state===d.ROOM_PENDING_AUTH)return this.context.state}get purgatoryContext(){if(this.state===d.PURGATORY)return this.context.state}get p2pRoomContext(){if(this.state===d.P2P_ROOM)return this.context.state}get directP2pRoomContext(){if(this.state===d.DIRECT_P2P_ROOM)return this.context.state}get inRoomContext(){if(this.state===d.IN_ROOM)return this.context.state}get disconnectingContext(){if(this.state===d.DISCONNECTING)return this.context.state}get isActive(){return this.isInRoom||this.isPresentationCall||this.isRoomPendingAuth||this.isInPurgatory||this.isP2PRoom||this.isDirectP2PRoom}get number(){const{raw:e}=this.context;if("number"in e)return e.number}get token(){return this.inRoomContext?.token}get isCallInitiator(){return!this.isCallAnswerer}get isCallAnswerer(){return this.connectingContext?.answer??!1}getInRoomCredentials(){const e=this.inRoomContext;if(e!==void 0)return{token:e.token,conferenceForToken:e.conferenceForToken}}onInRoomCredentialsChange(e){let n;const s=this.subscribe(i=>{if(i.value===d.IN_ROOM){const r=i.context.state,a={token:r.token,conferenceForToken:r.conferenceForToken},c=n?.token,o=n?.conferenceForToken;(c!==a.token||o!==a.conferenceForToken)&&(n=a,e(a));return}Qn(i.value)&&(n=void 0)});return()=>{s.unsubscribe()}}reset(){this.send({type:"CALL.RESET"})}send(e){if(!this.actor.getSnapshot().can(e)){Yn(`[CallStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}subscribeToApiEvents(e){this.addSubscription(e.on("enter-room",({room:n,participantName:s,bearerToken:i,isDirectPeerToPeer:r})=>{this.send({room:n,participantName:s,isDirectPeerToPeer:r,type:"CALL.ENTER_ROOM",token:i})})),this.addSubscription(e.on("conference:participant-token-issued",({jwt:n,conference:s,participant:i})=>{this.send({token:n,type:"CALL.TOKEN_ISSUED",conferenceForToken:s,participantName:i})}))}subscribeToEvents(e){this.addSubscription(e.on("start-call",({number:n,answer:s,extraHeaders:i})=>{this.send({type:"CALL.CONNECTING",number:n,answer:s,extraHeaders:i})})),this.addSubscription(e.on("confirmed",()=>{this.send({type:"CALL.PRESENTATION_CALL"})})),this.addSubscription(e.on("end-call",()=>{this.send({type:"CALL.START_DISCONNECT"})})),this.addSubscription(e.on("ended",()=>{this.send({type:"CALL.RESET"})})),this.addSubscription(e.on("failed",()=>{this.send({type:"CALL.RESET"})}))}}const zn=t=>new jn(Wn(),t);var ut=(t=>(t.LOCAL="local",t.REMOTE="remote",t.SYSTEM="system",t))(ut||{});const gt=["peerconnection","connecting","sending","progress","accepted","confirmed","ended","failed","hold","unhold","muted","unmuted","newInfo","newDTMF","presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed","reinvite","update","refer","replaces","sdp","icecandidate","getusermediafailed","peerconnection:createofferfailed","peerconnection:createanswerfailed","peerconnection:setlocaldescriptionfailed","peerconnection:setremotedescriptionfailed"],Jn=["start-call","end-call","peerconnection:confirmed","peerconnection:ontrack","ended:fromserver","call-status-changed","remote-tracks-changed","remote-streams-changed","recv-session-started","recv-session-ended","recv-quality-changed"],mt=[...gt,...Jn],Xn=()=>new S.TypedEvents(mt),Kn=t=>[...t.keys()].map(e=>t.get(e)),Zn=(t,e)=>Kn(t).find(n=>n?.type===e),_e=async t=>t.getStats().then(e=>Zn(e,"codec")?.mimeType);class es{async getCodecFromSender(e){return await _e(e)??""}}const ts=C("TaskQueue");class ns{stackPromises=ue.createStackPromises({noRunIsNotActual:!0});async add(e){return this.stackPromises.add(e),this.run()}stop(){this.stackPromises.stop()}async run(){return this.stackPromises().catch(e=>{ts("TaskQueue: error",e)})}}class ss{taskQueue;onSetParameters;constructor(e){this.onSetParameters=e,this.taskQueue=new ns}async setEncodingsToSender(e,n){return this.taskQueue.add(async()=>Oe(e,n,this.onSetParameters))}stop(){this.taskQueue.stop()}}const Re=(t,e)=>t!==void 0&&e!==void 0&&t.toLowerCase().includes(e.toLowerCase()),is=1e6,D=t=>t*is,pt=D(.06),Ct=D(4),rs=t=>t<=64?pt:t<=128?D(.12):t<=256?D(.25):t<=384?D(.32):t<=426?D(.38):t<=640?D(.5):t<=848?D(.7):t<=1280?D(1):t<=1920?D(2):Ct,as="av1",os=t=>Re(t,as),cs=.6,De=(t,e)=>os(e)?t*cs:t,Et=t=>De(pt,t),Tt=t=>De(Ct,t),Be=(t,e)=>{const n=rs(t);return De(n,e)},pe=1,ds=({videoTrack:t,targetSize:e})=>{const n=t.getSettings(),s=n.width,i=n.height,r=s===void 0?pe:s/e.width,a=i===void 0?pe:i/e.height;return Math.max(r,a,pe)};class ls{ignoreForCodec;senderFinder;codecProvider;parametersSetter;resultNoChanged={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}};constructor({senderFinder:e,codecProvider:n,parametersSetter:s},i){this.senderFinder=e,this.codecProvider=n,this.parametersSetter=s,this.ignoreForCodec=i.ignoreForCodec}async balance(e,n){const s=e.getSenders(),i=this.senderFinder.findVideoSender(s);if(!i?.track)return{...this.resultNoChanged,sender:i};const r=await this.codecProvider.getCodecFromSender(i);if(Re(r,this.ignoreForCodec))return{...this.resultNoChanged,sender:i};const{mainCam:a,resolutionMainCam:c}=n??{};return this.processSender({mainCam:a,resolutionMainCam:c},{sender:i,codec:r,videoTrack:i.track}).then(o=>({...o,sender:i}))}async reset(e){const n=e.getSenders(),s=this.senderFinder.findVideoSender(n);if(!s?.track)return{...this.resultNoChanged,sender:s};const i=await this.codecProvider.getCodecFromSender(s);if(Re(i,this.ignoreForCodec))return{...this.resultNoChanged,sender:s};const r={sender:s,codec:i,videoTrack:s.track};return{...await this.setBitrateByTrackResolution(r),sender:s}}async processSender(e,n){const{mainCam:s,resolutionMainCam:i}=e;switch(s){case P.PAUSE_MAIN_CAM:return this.downgradeResolutionSender(n);case P.RESUME_MAIN_CAM:return this.setBitrateByTrackResolution(n);case P.MAX_MAIN_CAM_RESOLUTION:return i!==void 0?this.setResolutionSender(i,n):this.setBitrateByTrackResolution(n);case P.ADMIN_STOP_MAIN_CAM:case P.ADMIN_START_MAIN_CAM:case void 0:return this.setBitrateByTrackResolution(n);default:return this.setBitrateByTrackResolution(n)}}async downgradeResolutionSender(e){const{sender:n,codec:s}=e,i={scaleResolutionDownBy:200,maxBitrate:Et(s)};return this.parametersSetter.setEncodingsToSender(n,i)}async setBitrateByTrackResolution(e){const{sender:n,videoTrack:s,codec:i}=e,a=s.getSettings().width,c=a===void 0?Tt(i):Be(a,i);return this.parametersSetter.setEncodingsToSender(n,{scaleResolutionDownBy:1,maxBitrate:c})}async setResolutionSender(e,n){const[s,i]=e.split("x"),{sender:r,videoTrack:a,codec:c}=n,o={width:Number(s),height:Number(i)},l=ds({videoTrack:a,targetSize:o}),u=Be(o.width,c),m={scaleResolutionDownBy:l,maxBitrate:u};return this.parametersSetter.setEncodingsToSender(r,m)}}const hs=t=>t.find(e=>e.track?.kind==="video");class us{findVideoSender(e){return hs(e)}}class gs{currentSender;originalReplaceTrack;lastWidth;lastHeight;maxPollIntervalMs;currentPollIntervalMs;pollIntervalMs;setTimeoutRequest;constructor({pollIntervalMs:e=1e3,maxPollIntervalMs:n}){this.pollIntervalMs=e,this.maxPollIntervalMs=n??e*16,this.currentPollIntervalMs=this.pollIntervalMs,this.setTimeoutRequest=new V.SetTimeoutRequest}subscribe(e,n){if(!e){this.detachSender();return}this.currentSender!==e&&(this.detachSender(),this.attachSender(e,n))}unsubscribe(){this.detachSender()}attachSender(e,n){this.currentSender=e;const s=e.replaceTrack.bind(e);this.originalReplaceTrack=s,e.replaceTrack=async i=>{await s(i),this.attachTrack(n,i??void 0),n()},this.attachTrack(n,e.track)}detachSender(){this.currentSender&&this.originalReplaceTrack&&(this.currentSender.replaceTrack=this.originalReplaceTrack),this.originalReplaceTrack=void 0,this.currentSender=void 0,this.detachTrack()}attachTrack(e,n){if(this.detachTrack(),!n)return;const{width:s,height:i}=n.getSettings();this.lastWidth=s,this.lastHeight=i,this.currentPollIntervalMs=this.pollIntervalMs,this.schedulePoll(n,e)}schedulePoll(e,n){const s=()=>{const{width:i,height:r}=e.getSettings();i!==this.lastWidth||r!==this.lastHeight?(this.lastWidth=i,this.lastHeight=r,this.currentPollIntervalMs=this.pollIntervalMs,n()):this.currentPollIntervalMs=Math.min(this.currentPollIntervalMs*2,this.maxPollIntervalMs),this.setTimeoutRequest.request(s,this.currentPollIntervalMs)};this.setTimeoutRequest.request(s,this.currentPollIntervalMs)}detachTrack(){this.setTimeoutRequest.cancelRequest(),this.lastWidth=void 0,this.lastHeight=void 0}}class ms{apiManager;currentHandler;constructor(e){this.apiManager=e}subscribe(e){this.currentHandler=e,this.apiManager.on("main-cam-control",e)}unsubscribe(){this.currentHandler&&(this.apiManager.off("main-cam-control",this.currentHandler),this.currentHandler=void 0)}}const Ce=C("VideoSendingBalancer");class ps{eventHandler;senderBalancer;parametersSetterWithQueue;getConnection;serverHeaders;trackMonitor;constructor(e,n,{ignoreForCodec:s,onSetParameters:i,pollIntervalMs:r}={}){this.getConnection=n,this.eventHandler=new ms(e),this.parametersSetterWithQueue=new ss(i),this.senderBalancer=new ls({senderFinder:new us,codecProvider:new es,parametersSetter:this.parametersSetterWithQueue},{ignoreForCodec:s}),this.trackMonitor=new gs({pollIntervalMs:r})}subscribe(){this.eventHandler.subscribe(this.handleMainCamControl)}unsubscribe(){this.eventHandler.unsubscribe(),this.reset()}reset(){this.clearState();const e=this.getConnection();e?this.senderBalancer.reset(e).catch(n=>{Ce("reset sender encodings: error",n)}).finally(()=>{this.parametersSetterWithQueue.stop()}):this.parametersSetterWithQueue.stop()}async balance(){const e=this.getConnection();if(!e)throw new Error("connection is not exist");const n=await this.senderBalancer.balance(e,this.serverHeaders);return this.trackMonitor.subscribe(n.sender,()=>{this.balance().catch(s=>{Ce("balance on track change: error",s)})}),n}clearState(){delete this.serverHeaders,this.trackMonitor.unsubscribe()}handleMainCamControl=e=>{this.serverHeaders=e,this.balance().catch(n=>{Ce("handleMainCamControl: error",n)})}}const Cs=6e3,Es=52e4,se=(t,e)=>t.getSenders().filter(n=>n.track?.kind===e),Ts=(t,e)=>t==="audio"?Cs:Et(e),Ss=t=>t.track!==null;class Rs{previousBitrates=new Map;async setMinBitrateForSenders(e,n="all"){const s=[];if(!e)return;(n==="audio"||n==="all")&&s.push(...se(e,"audio")),(n==="video"||n==="all")&&s.push(...se(e,"video"));const i=s.filter(Ss).map(async r=>{const a=r.getParameters();this.saveCurrentBitrate(r,a);const c={...a,encodings:a.encodings.map(o=>({...o,maxBitrate:Ts(r.track.kind)}))};await de(r,c)});await Promise.all(i)}async restoreBitrateForSenders(e,n="all"){const s=[];if(!e)return;(n==="audio"||n==="all")&&s.push(...se(e,"audio")),(n==="video"||n==="all")&&s.push(...se(e,"video"));const i=s.map(async r=>{const a=this.getSavedBitrate(r);if(a){const c=r.getParameters(),o=r.track?.kind==="video",l=o?await _e(r):void 0,u={...c,encodings:a.map(m=>{const R=o?Tt(l):Es;return{...m,maxBitrate:m.maxBitrate??R}})};await de(r,u,{isResetAllowed:!0}),this.clearSavedBitrate(r)}});await Promise.all(i)}getSavedBitrate(e){return this.previousBitrates.get(e)}clearSavedBitrate(e){this.previousBitrates.delete(e)}clearAll(){this.previousBitrates.clear()}hasSavedBitrate(e){return this.previousBitrates.has(e)}getSavedCount(){return this.previousBitrates.size}saveCurrentBitrate(e,n){const s=n.encodings.map(i=>({...i}));this.previousBitrates.set(e,s)}}var we=(t=>(t.BYE="Terminated",t.WEBRTC_ERROR="WebRTC Error",t.CANCELED="Canceled",t.REQUEST_TIMEOUT="Request Timeout",t.REJECTED="Rejected",t.REDIRECTED="Redirected",t.UNAVAILABLE="Unavailable",t.NOT_FOUND="Not Found",t.ADDRESS_INCOMPLETE="Address Incomplete",t.INCOMPATIBLE_SDP="Incompatible SDP",t.BAD_MEDIA_DESCRIPTION="Bad Media Description",t))(we||{});const Fe=C("MCUSession");class vs{events;rtcSession;disposers=new Set;onReset;pcConfig;bitrateStateManager=new Rs;constructor(e,{onReset:n}){this.events=e,this.onReset=n,e.on("failed",this.handleEnded),e.on("ended",this.handleEnded)}get connection(){return this.rtcSession?.connection}get isCallActive(){return this.rtcSession?.isEstablished()===!0}getEstablishedRTCSession=()=>this.rtcSession?.isEstablished()===!0?this.rtcSession:void 0;getPcConfig(){return this.pcConfig}async renegotiate(){if(this.rtcSession===void 0)throw new Error("No rtcSession established");return this.rtcSession.renegotiate()}startCall=async(e,n,{number:s,mediaStream:i,extraHeaders:r=[],iceServers:a,directionVideo:c,directionAudio:o,contentHint:l,offerToReceiveAudio:u=!0,offerToReceiveVideo:m=!0,degradationPreference:R,sendEncodings:T,onAddedTransceiver:L})=>new Promise((M,F)=>{this.handleCall().then(M).catch(W=>{F(W)}),this.pcConfig={iceServers:a},this.rtcSession=e.call(n(s),{mediaStream:K(i,{directionVideo:c,directionAudio:o,contentHint:l}),pcConfig:{iceServers:a},rtcOfferConstraints:{offerToReceiveAudio:u,offerToReceiveVideo:m},eventHandlers:this.events.triggers,extraHeaders:r,directionVideo:c,directionAudio:o,degradationPreference:R,sendEncodings:T,onAddedTransceiver:L})});async endCall(){const{rtcSession:e}=this;if(e&&!e.isEnded())return e.terminateAsync({cause:we.CANCELED}).finally(()=>{this.reset()});this.reset()}answerToIncomingCall=async(e,{mediaStream:n,extraHeaders:s=[],iceServers:i,directionVideo:r,directionAudio:a,offerToReceiveAudio:c,offerToReceiveVideo:o,contentHint:l,degradationPreference:u,sendEncodings:m,onAddedTransceiver:R})=>new Promise((T,L)=>{try{this.rtcSession=e,this.subscribeToSessionEvents(e),this.handleCall().then(T).catch(M=>{L(M)}),this.pcConfig={iceServers:i},e.answer({pcConfig:{iceServers:i},rtcOfferConstraints:{offerToReceiveAudio:c,offerToReceiveVideo:o},mediaStream:K(n,{directionVideo:r,directionAudio:a,contentHint:l}),extraHeaders:s,directionVideo:r,directionAudio:a,degradationPreference:u,sendEncodings:m,onAddedTransceiver:R})}catch(M){L(M)}});async replaceMediaStream(e,n){if(!this.rtcSession)throw new Error("No rtcSession established");const{contentHint:s}=n??{},i=K(e,{contentHint:s});if(i===void 0)throw new Error("No preparedMediaStream");return this.rtcSession.replaceMediaStream(i,n)}async restartIce(e){if(!this.rtcSession)throw new Error("No rtcSession established");return this.rtcSession.restartIce(e)}setMinBitrateForSenders(e="all"){this.bitrateStateManager.setMinBitrateForSenders(this.connection,e).catch(n=>{Fe("setMinBitrateForSenders",n)})}restoreBitrateForSenders(e="all"){this.bitrateStateManager.restoreBitrateForSenders(this.connection,e).catch(n=>{Fe("restoreBitrateForSenders",n)})}handleCall=async()=>new Promise((e,n)=>{const s=()=>{this.events.on("peerconnection",l),this.events.on("confirmed",u)},i=()=>{this.events.off("peerconnection",l),this.events.off("confirmed",u)},r=()=>{this.events.on("failed",c),this.events.on("ended",c)},a=()=>{this.events.off("failed",c),this.events.off("ended",c)},c=m=>{i(),a(),n(m)};let o;const l=({peerconnection:m})=>{o=m;const R=T=>{this.events.trigger("peerconnection:ontrack",T)};m.addEventListener("track",R),this.disposers.add(()=>{m.removeEventListener("track",R)})},u=()=>{o!==void 0&&this.events.trigger("peerconnection:confirmed",o),i(),a(),e(o)};s(),r()});subscribeToSessionEvents(e){this.events.eachTriggers((n,s)=>{const i=gt.find(r=>r===s);i&&(e.on(i,n),this.disposers.add(()=>{e.off(i,n)}))})}unsubscribeFromSessionEvents(){this.disposers.forEach(e=>{e()}),this.disposers.clear()}handleEnded=e=>{const{originator:n}=e;n==="remote"&&this.events.trigger("ended:fromserver",e),this.reset()};reset=()=>{delete this.rtcSession,delete this.pcConfig,this.unsubscribeFromSessionEvents(),this.bitrateStateManager.clearAll(),this.onReset()}}const ve=t=>t==="auto"?"high":t,fs=10,Ns=500,As=5e3;class Is{cancelableSendOfferWithRepeatedCalls;currentRenegotiation;config;tools;connection;lastCallParams;constructor(e,n){const s=e.quality??"auto";this.config={...e,quality:s,effectiveQuality:ve(s)},this.tools=n,this.connection=new RTCPeerConnection(e.pcConfig),this.addTransceivers()}get settings(){return this.config}get peerConnection(){return this.connection}getAudioChannel(){return this.config.audioChannel}getQuality(){return this.config.quality}getEffectiveQuality(){return this.config.effectiveQuality}async setQuality(e){if(!this.lastCallParams)return!1;const n=this.config.effectiveQuality,s=this.config.quality,i=ve(e);return e===s&&i===n?!1:(this.config.quality=e,this.config.effectiveQuality=i,i!==n&&await this.renegotiate(this.lastCallParams),!0)}async applyQuality(e){const n=await this.setQuality(e),s=this.getEffectiveQuality();return{applied:n,effectiveQuality:s}}close(){this.cancelSendOfferWithRepeatedCalls(),this.connection.close()}async call({conferenceNumber:e,token:n}){const s=this.waitForTracks(),i=await this.renegotiate({conferenceNumber:e,token:n});return await s,i}async renegotiate({conferenceNumber:e,token:n}){this.lastCallParams={conferenceNumber:e,token:n},this.cancelSendOfferWithRepeatedCalls();const s=this.currentRenegotiation;s&&await s.catch(()=>{});const i=this.performRenegotiate({conferenceNumber:e,token:n});this.currentRenegotiation=i;try{return await i}finally{this.currentRenegotiation===i&&(this.currentRenegotiation=void 0)}}async performRenegotiate({conferenceNumber:e,token:n}){this.hasHaveLocalOfferSignalingState()&&await this.connection.setLocalDescription({type:"rollback"}),await this.waitForPeerConnectionReady();const s=await this.createOffer(),i=async()=>this.tools.sendOffer({conferenceNumber:e,token:n,quality:this.config.effectiveQuality,audioChannel:this.config.audioChannel},s),r=c=>!(c instanceof Error);this.cancelableSendOfferWithRepeatedCalls=he.repeatedCallsAsync({targetFunction:i,isComplete:r,callLimit:fs,delay:Ns,isRejectAsValid:!0,isCheckBeforeCall:!1});const a=await this.cancelableSendOfferWithRepeatedCalls.then(c=>c).finally(()=>{this.cancelableSendOfferWithRepeatedCalls=void 0});return await this.setRemoteDescription(a),await this.waitForPeerConnectionReady(),!0}async createOffer(){const e=await this.connection.createOffer();return await this.connection.setLocalDescription(e),e}async setRemoteDescription(e){return this.connection.setRemoteDescription(e)}hasStableSignalingState(){return this.connection.signalingState==="stable"}hasReadyConnectionState(){const e=this.connection.connectionState;return e==="connected"||e==="new"}hasTerminalConnectionState(){const e=this.connection.connectionState;return e==="failed"||e==="closed"}isStableAndReady(){return this.hasStableSignalingState()&&this.hasReadyConnectionState()}hasHaveLocalOfferSignalingState(){return this.connection.signalingState==="have-local-offer"}async waitForPeerConnectionReady(){if(this.isStableAndReady())return;const e=()=>{const s=this.connection.connectionState;return new Error(`Peer connection in terminal state: ${s}. Recovery is not possible.`)},n=()=>this.hasTerminalConnectionState()?"error":this.isStableAndReady()?"success":"loading";if(n()==="error")throw e();return new Promise((s,i)=>{let r,a=!1;const c=()=>{a||(a=!0,clearTimeout(r),this.connection.removeEventListener("signalingstatechange",l),this.connection.removeEventListener("connectionstatechange",l),s())},o=u=>{a||(a=!0,clearTimeout(r),this.connection.removeEventListener("signalingstatechange",l),this.connection.removeEventListener("connectionstatechange",l),i(u))};function l(){const u=n();if(u==="error"){o(e());return}u==="success"&&c()}r=setTimeout(()=>{o(new Error("Timed out waiting for stable signaling state and ready connection state"))},As),this.connection.addEventListener("signalingstatechange",l),this.connection.addEventListener("connectionstatechange",l),l()})}async waitForTracks(){return new Promise(e=>{const n=new Set,s=i=>{const{track:r}=i;n.add(r.kind),n.has("audio")&&n.has("video")&&(this.connection.removeEventListener("track",s),e())};this.connection.addEventListener("track",s)})}addTransceivers(){this.addRecvOnlyTransceiver("audio"),this.addRecvOnlyTransceiver("video"),this.addRecvOnlyTransceiver("video"),this.addRecvOnlyTransceiver("video"),this.addRecvOnlyTransceiver("video")}addRecvOnlyTransceiver(e){const n={direction:"recvonly"};return this.connection.addTransceiver(e,n)}cancelSendOfferWithRepeatedCalls(){this.cancelableSendOfferWithRepeatedCalls?.cancel()}}const St=t=>t.getSettings(),Ms=(t,e)=>{const n=St(t);let s=e;s??=t.label;let i=n?.msid;return i??=s,i??=t.id,i},bs=(t,e)=>{const n=St(t);let s=e;return s??=n?.msid,s??=t.label,(s&&s.length>0?s:void 0)??t.id};class $e{participantGroups=new Map;trackToGroup=new Map;trackDisposers=new Map;get mainStream(){const e=this.getStreams(),[n]=e;return n}reset(){this.participantGroups.clear(),this.trackToGroup.clear(),this.trackDisposers.forEach(e=>{e()}),this.trackDisposers.clear()}addTrack(e,{onRemoved:n,streamHint:s}={}){const i=bs(e,s),r=Ms(e,s);if(this.trackToGroup.has(e.id))return{isAddedTrack:!1,isAddedStream:!1};const a=this.getParticipantGroups(i),c=a.get(r),o=!c;let l=c;l||(l={participantId:i,groupId:r,stream:new MediaStream,trackIds:new Set},a.set(r,l)),l.stream.addTrack(e),l.trackIds.add(e.id),this.trackToGroup.set(e.id,{participantId:i,groupId:r});const u=()=>{this.disposeTrackListener(e.id);const m=this.removeTrack(e.id);m.isRemovedTrack&&n?.({participantId:i,trackId:e.id,isRemovedStream:m.isRemovedStream})};return e.addEventListener("ended",u),this.trackDisposers.set(e.id,()=>{e.removeEventListener("ended",u)}),{isAddedTrack:!0,isAddedStream:o,participantId:i}}removeTrack(e){this.disposeTrackListener(e);const n=this.trackToGroup.get(e);if(!n)return{isRemovedTrack:!1,isRemovedStream:!1};const{participantId:s,groupId:i}=n,r=this.participantGroups.get(s),a=r?.get(i);if(!a)return this.trackToGroup.delete(e),{isRemovedTrack:!1,isRemovedStream:!1};const c=a.stream.getTracks().find(l=>l.id===e);c&&a.stream.removeTrack(c),a.trackIds.delete(e),this.trackToGroup.delete(e);const o=a.trackIds.size===0;return o&&(r?.delete(i),r?.size===0&&this.participantGroups.delete(s)),{isRemovedTrack:!0,isRemovedStream:o}}removeStaleTracks(e,n){const s=this.participantGroups.get(e);if(!s)return!1;let i=!1;return[...s.values()].forEach(a=>{[...a.trackIds].filter(o=>!n.includes(o)).forEach(o=>{const l=this.removeTrack(o);i||=l.isRemovedTrack})}),i}getStreams(e){if(e!==void 0){const n=this.participantGroups.get(e);return n?[...n.values()].map(s=>s.stream):[]}return[...this.participantGroups.values()].flatMap(n=>[...n.values()]).map(n=>n.stream)}disposeTrackListener(e){const n=this.trackDisposers.get(e);n&&(n(),this.trackDisposers.delete(e))}getParticipantGroups(e){const n=this.participantGroups.get(e);if(n)return n;const s=new Map;return this.participantGroups.set(e,s),s}}const Ee={type:"participant"},ys={type:"spectator_synthetic"},Ps=t=>({type:"spectator",recvParams:t});class f{role=Ee;onRoleChanged;constructor(e){this.onRoleChanged=e}static hasParticipant(e){return e.type==="participant"}static hasSpectatorSynthetic(e){return e.type==="spectator_synthetic"}static hasSpectator(e){return e.type==="spectator"}static isExitingSpectatorRole(e,n){return f.hasSpectator(e)&&!f.hasSpectator(n)}static isEnteringSpectatorRole(e,n){return f.hasSpectator(n)}static isExitingAnySpectatorRole(e,n){const s=f.hasSpectator(e)||f.hasSpectatorSynthetic(e),i=f.hasSpectator(n)||f.hasSpectatorSynthetic(n);return s&&!i}static isEnteringAnySpectatorRole(e,n){const s=f.hasSpectator(e)||f.hasSpectatorSynthetic(e),i=f.hasSpectator(n)||f.hasSpectatorSynthetic(n);return!s&&i}getRole(){return this.role}setCallRoleParticipant(){this.changeRole(Ee)}setCallRoleSpectatorSynthetic(){this.changeRole(ys)}setCallRoleSpectator(e){this.changeRole(Ps(e))}changeRole(e){const n=this.role;if(n.type!==e.type){this.setRole(e);return}f.hasSpectator(e)&&f.hasSpectator(n)&&n.recvParams.audioId!==e.recvParams.audioId&&this.setRole(e)}reset(){this.role=Ee}hasParticipant(){return f.hasParticipant(this.role)}hasSpectatorSynthetic(){return f.hasSpectatorSynthetic(this.role)}hasSpectator(){return f.hasSpectator(this.role)}setRole(e){const n=this.role;this.role=e,this.onRoleChanged?.({previous:n,next:e})}}const Os=(t,e)=>{if(!t||!e)return t===e;const n=t.mainStream?.id,s=e.mainStream?.id,i=t.contentedStream?.id,r=e.contentedStream?.id;return n===s&&i===r};class _s{lastEmittedStreams;hasChanged(e){return!Os(this.lastEmittedStreams,e)}updateLastEmittedStreams(e){this.lastEmittedStreams=e}getLastEmittedStreams(){return this.lastEmittedStreams}reset(){this.lastEmittedStreams=void 0}}const Ds="default",ws="dual",Ls="content_",ks=t=>`${Ls}${t.toLowerCase()}`,Us=t=>[...t.getTracks()].some(e=>e.label.includes(ws));class Bs{mainRemoteStreamsManager;recvRemoteStreamsManager;constructor(e,n){this.mainRemoteStreamsManager=e,this.recvRemoteStreamsManager=n}getActiveStreamsManagerTools({isSpectator:e,stateInfo:n}){return e?this.getRecvRemoteStreamsManagerTools({stateInfo:n}):this.getMainRemoteStreamsManagerTools({stateInfo:n})}getMainRemoteStreamsManagerTools({stateInfo:e}){const n=this.mainRemoteStreamsManager;return{manager:n,getRemoteStreams:()=>{const i=n.getStreams(),r=i.find(c=>!Us(c)),a=e.isAvailable?i.find(c=>c!==r):void 0;return{mainStream:r,contentedStream:a}}}}getRecvRemoteStreamsManagerTools({stateInfo:e}){const n=this.recvRemoteStreamsManager;return{manager:n,getRemoteStreams:()=>{const r=n.getStreams(Ds)[0],a=this.getRecvRemoteContentedStream({stateInfo:e});return{mainStream:r,contentedStream:a}}}}getRecvRemoteContentedStream({stateInfo:e}){if(!e.isAvailable||e.codec===void 0)return;const n=ks(e.codec);return this.recvRemoteStreamsManager.getStreams(n)[0]}}const Fs="udp",$s=t=>t.transport?.iceTransport?t.transport.iceTransport.getLocalCandidates():[],Gs=t=>t.getReceivers().flatMap($s),xs=t=>{const s=Gs(t).filter(({protocol:i,port:r})=>r!==null&&Fs===i).map(({port:i})=>i);return[...new Set(s)]},Ge=t=>t.streams[0]?.id;class qs extends S.EventEmitterProxy{stateMachine;isPendingCall=!1;isPendingAnswer=!1;mainRemoteStreamsManager=new $e;recvRemoteStreamsManager=new $e;streamsManagerProvider;contentedStreamManager;tools;roleManager=new f(e=>{this.onRoleChanged(e)});mcuSession;recvSession;disposeRecvSessionTrackListener;disposeInRoomCredentialsListener;deferredStartRecvSessionRunner;streamsChangeTracker=new _s;constructor({contentedStreamManager:e},n){super(Xn()),this.contentedStreamManager=e,this.tools=n,this.mcuSession=new vs(this.events,{onReset:this.reset}),this.stateMachine=zn(this.events),this.streamsManagerProvider=new Bs(this.mainRemoteStreamsManager,this.recvRemoteStreamsManager),this.deferredStartRecvSessionRunner=new at({subscribe:s=>this.stateMachine.onStateChange(s),isReady:s=>s===d.IN_ROOM,isCancelled:s=>s===d.IDLE,onExecute:s=>{this.startRecvSessionForced({audioChannel:s.audioId}).catch(()=>{})}}),this.subscribeCallStatusChange(),this.subscribeMcuRemoteTrackEvents(),this.subscribeContentedStreamEvents()}get requested(){return this.isPendingCall||this.isPendingAnswer}get connection(){return this.mcuSession.connection}get isCallActive(){return this.mcuSession.isCallActive}get number(){return this.stateMachine.number}get isCallInitiator(){return this.stateMachine.isCallInitiator}get isDirectP2PRoom(){return this.stateMachine.isDirectP2PRoom}get isPresentationCall(){return this.stateMachine.isPresentationCall}get isDisconnecting(){return this.stateMachine.isDisconnecting}get localPorts(){const e=this.getActivePeerConnection();return e?xs(e):[]}getStreamsManagerProvider(){return this.streamsManagerProvider}getContentedStreamManager(){return this.contentedStreamManager}getEstablishedRTCSession=()=>this.mcuSession.getEstablishedRTCSession();subscribeToApiEvents(e){this.stateMachine.subscribeToApiEvents(e.events)}startCall=async(e,n,s)=>(this.isPendingCall=!0,this.events.emit("start-call",{extraHeaders:s.extraHeaders,number:s.number,answer:!1}),this.mcuSession.startCall(e,n,s).finally(()=>{this.isPendingCall=!1}));async endCall(){return this.events.emit("end-call"),this.mcuSession.endCall()}async renegotiate(){return this.hasSpectator()?this.renegotiateRecvSession():this.renegotiateMcuSession()}answerToIncomingCall=async(e,n)=>{this.isPendingAnswer=!0;const s=e();return this.events.emit("start-call",{answer:!0,extraHeaders:n.extraHeaders,number:s.remote_identity.uri.user}),this.mcuSession.answerToIncomingCall(s,n).finally(()=>{this.isPendingAnswer=!1})};getMainRemoteStream(){const{mainStream:e}=this.getRemoteStreams();return e}getRemoteStreams(){const{getRemoteStreams:e}=this.getActiveStreamsManagerTools();return e()}getToken(){return this.stateMachine.token}getRecvQuality(){const{recvSession:e}=this;if(e===void 0)return;const n=e.getEffectiveQuality();return{quality:e.getQuality(),effectiveQuality:n}}getActivePeerConnection=()=>this.hasSpectator()?this.recvSession?.peerConnection:this.mcuSession.connection;hasSpectator(){return this.roleManager.hasSpectator()}setCallRoleParticipant(){this.roleManager.setCallRoleParticipant()}setCallRoleSpectatorSynthetic(){this.roleManager.setCallRoleSpectatorSynthetic()}setCallRoleSpectator(e){this.roleManager.setCallRoleSpectator(e)}async replaceMediaStream(e,n){return this.mcuSession.replaceMediaStream(e,n)}async restartIce(e){return this.mcuSession.restartIce(e)}async restartRecvSession(){const{recvSession:e}=this;if(!this.hasSpectator()||!e)return!1;const n=e.getAudioChannel(),s=e.getQuality(),{callResult:i}=await this.startRecvSessionForced({audioChannel:n,quality:s},{silent:!0});return i}async setRecvQuality(e){const{recvSession:n}=this;if(!this.hasSpectator()||!n)return!1;const s=n.getQuality(),i=n.getEffectiveQuality(),r=n.getAudioChannel(),a=ve(e);if(e===s&&a===i)return!1;if(a===i)return await n.setQuality(e),this.events.trigger("recv-quality-changed",{previousQuality:s,quality:e,effectiveQuality:i}),!0;const{session:c,callResult:o}=await this.startRecvSessionForced({audioChannel:r,quality:e},{silent:!0});if(o){const l=c.getEffectiveQuality();this.events.trigger("recv-quality-changed",{previousQuality:s,quality:e,effectiveQuality:l})}return o}async applyQuality(e){const{recvSession:n}=this;if(!this.hasSpectator()||!n)return!1;const s=n.getQuality(),i=await n.applyQuality(e);return i.applied&&this.events.trigger("recv-quality-changed",{previousQuality:s,quality:e,effectiveQuality:i.effectiveQuality}),i.applied}async failed(e,n){this.emitFailedCall(e,n),await this.endCall()}emitFailedCall(e,n){this.events.trigger("failed",{message:e,cause:n,originator:"local"})}reset=()=>{this.mainRemoteStreamsManager.reset(),this.roleManager.reset(),this.recvRemoteStreamsManager.reset(),this.stopRecvSession(),this.deferredStartRecvSessionRunner.cancel(),this.streamsChangeTracker.reset()};subscribeCallStatusChange(){const e=this.createCallStatusChangeListener();this.onRace(["accepted","confirmed","ended","failed"],e)}createCallStatusChangeListener(){let e=this.isCallActive;return()=>{const n=this.isCallActive;n!==e&&this.events.trigger("call-status-changed",{isCallActive:n}),e=n}}subscribeMcuRemoteTrackEvents(){this.on("peerconnection:ontrack",e=>{this.addRemoteTrack(this.mainRemoteStreamsManager,e.track,Ge(e))})}addRemoteTrack(e,n,s){const i=e.addTrack(n,{streamHint:s,onRemoved:r=>{this.handleChangedRemoteTracks(e,"removed",{isRemovedStream:r.isRemovedStream,isAddedStream:!1,trackId:r.trackId,participantId:r.participantId})}});i.isAddedTrack&&this.handleChangedRemoteTracks(e,"added",{isRemovedStream:!1,isAddedStream:i.isAddedStream,trackId:n.id,participantId:i.participantId})}handleChangedRemoteTracks(e,n,{trackId:s,participantId:i,isRemovedStream:r,isAddedStream:a}){const c=this.getActiveStreamsManagerTools();if(e!==c.manager)return;const o=c.getRemoteStreams();this.emitEventChangedRemoteTracks(o,n,{trackId:s,participantId:i}),(a||r)&&this.emitEventChangedRemoteStreams(o)}emitEventChangedRemoteTracks(e,n,{trackId:s,participantId:i}){this.events.trigger("remote-tracks-changed",{streams:e,changeType:n,trackId:s,participantId:i})}emitEventChangedRemoteStreamsConnected=()=>{this.emitEventChangedRemoteStreams(this.getRemoteStreams())};emitEventChangedRemoteStreams(e){this.streamsChangeTracker.hasChanged(e)&&(this.streamsChangeTracker.updateLastEmittedStreams(e),this.events.trigger("remote-streams-changed",{streams:e}))}getActiveStreamsManagerTools(){return this.streamsManagerProvider.getActiveStreamsManagerTools({isSpectator:this.hasSpectator(),stateInfo:this.contentedStreamManager.getStateInfo()})}attachRecvSessionTracks(e){const{peerConnection:n}=e,s=i=>{this.addRemoteTrack(this.recvRemoteStreamsManager,i.track,Ge(i))};n.addEventListener("track",s),this.disposeRecvSessionTrackListener=()=>{n.removeEventListener("track",s)}}async startRecvSessionForced(e,{silent:n}={}){return this.startRecvSession({audioChannel:e.audioChannel,quality:e.quality},{silent:n})}async startRecvSession({audioChannel:e,quality:n},{silent:s}={}){this.disposeInRoomCredentialsListener?.();const i=this.stateMachine.getInRoomCredentials();if(i===void 0)return{session:void 0,callResult:!1};this.stopRecvSession({silent:s});const r={audioChannel:e,quality:n,pcConfig:this.mcuSession.getPcConfig()},a=new Is(r,{sendOffer:this.tools.sendOffer});return this.recvSession=a,this.recvRemoteStreamsManager.reset(),this.attachRecvSessionTracks(a),a.call({conferenceNumber:i.conferenceForToken,token:i.token}).then(o=>(s!==!0&&this.events.emit("recv-session-started"),o&&(this.disposeInRoomCredentialsListener=this.stateMachine.onInRoomCredentialsChange(()=>{this.renegotiateRecvSession().catch(()=>{})})),{session:a,callResult:o})).catch(async o=>{this.stopRecvSession();const l=new ie.IncomingResponse;l.body=o instanceof Error?o.message:String(o);const u=ie.C.causes.INTERNAL_ERROR;throw await this.failed(l,u),o})}stopRecvSession({silent:e}={}){const n=!!this.recvSession;this.disposeInRoomCredentialsListener?.(),this.disposeInRoomCredentialsListener=void 0,this.recvSession?.close(),this.recvSession=void 0,this.disposeRecvSessionTrackListener?.(),this.disposeRecvSessionTrackListener=void 0,this.recvRemoteStreamsManager.reset(),n&&e!==!0&&this.events.emit("recv-session-ended")}onRoleChanged=({previous:e,next:n})=>{if(f.isExitingSpectatorRole(e,n)&&(this.stopRecvSession(),this.deferredStartRecvSessionRunner.cancel(),this.emitEventChangedRemoteStreamsConnected()),f.isEnteringSpectatorRole(e,n)){const s=n.recvParams;this.stateMachine.getInRoomCredentials()===void 0?this.deferredStartRecvSessionRunner.set({audioId:s.audioId}):this.startRecvSession({audioChannel:s.audioId}).catch(()=>{})}f.isExitingAnySpectatorRole(e,n)&&this.mcuSession.restoreBitrateForSenders(),f.isEnteringAnySpectatorRole(e,n)&&this.mcuSession.setMinBitrateForSenders()};subscribeContentedStreamEvents(){this.contentedStreamManager.on("available",this.emitEventChangedRemoteStreamsConnected),this.contentedStreamManager.on("not-available",this.emitEventChangedRemoteStreamsConnected)}async renegotiateRecvSession(){const e=this.stateMachine.getInRoomCredentials();return e===void 0||this.recvSession===void 0?!1:this.recvSession.renegotiate({conferenceNumber:e.conferenceForToken,token:e.token})}async renegotiateMcuSession(){return this.mcuSession.renegotiate()}}const Rt=["presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed"],Vs=()=>new S.TypedEvents(Rt),fe=C("PresentationStateMachine");var vt=(t=>(t.IDLE="presentation:idle",t.STARTING="presentation:starting",t.ACTIVE="presentation:active",t.STOPPING="presentation:stopping",t.FAILED="presentation:failed",t))(vt||{});const Hs=g.setup({types:{context:{},events:{}},actions:{logTransition:(t,e)=>{fe(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(t,e)=>{fe("PresentationStateMachine state changed",e.state)},setError:g.assign(({event:t})=>"error"in t&&t.error!==void 0?{lastError:t.error instanceof Error?t.error:new Error(JSON.stringify(t.error))}:{lastError:void 0}),clearError:g.assign({lastError:void 0})}}).createMachine({id:"presentation",initial:"presentation:idle",context:{},states:{"presentation:idle":{entry:{type:"logStateChange",params:{state:"presentation:idle"}},on:{"SCREEN.STARTING":{target:"presentation:starting",actions:["clearError",{type:"logTransition",params:{from:"presentation:idle",to:"presentation:starting",event:"SCREEN.STARTING"}}]}}},"presentation:starting":{entry:{type:"logStateChange",params:{state:"presentation:starting"}},on:{"SCREEN.STARTED":{target:"presentation:active",actions:{type:"logTransition",params:{from:"presentation:starting",to:"presentation:active",event:"SCREEN.STARTED"}}},"SCREEN.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:failed",event:"SCREEN.FAILED"}}]},"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"CALL.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:idle",event:"CALL.ENDED"}}]},"CALL.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:starting",to:"presentation:failed",event:"CALL.FAILED"}}]}}},"presentation:active":{entry:{type:"logStateChange",params:{state:"presentation:active"}},on:{"SCREEN.ENDING":{target:"presentation:stopping",actions:{type:"logTransition",params:{from:"presentation:active",to:"presentation:stopping",event:"SCREEN.ENDING"}}},"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"SCREEN.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:failed",event:"SCREEN.FAILED"}}]},"CALL.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:idle",event:"CALL.ENDED"}}]},"CALL.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:active",to:"presentation:failed",event:"CALL.FAILED"}}]}}},"presentation:stopping":{entry:{type:"logStateChange",params:{state:"presentation:stopping"}},on:{"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"SCREEN.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:failed",event:"SCREEN.FAILED"}}]},"CALL.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:idle",event:"CALL.ENDED"}}]},"CALL.FAILED":{target:"presentation:failed",actions:["setError",{type:"logTransition",params:{from:"presentation:stopping",to:"presentation:failed",event:"CALL.FAILED"}}]}}},"presentation:failed":{entry:{type:"logStateChange",params:{state:"presentation:failed"}},on:{"SCREEN.STARTING":{target:"presentation:starting",actions:["clearError",{type:"logTransition",params:{from:"presentation:failed",to:"presentation:starting",event:"SCREEN.STARTING"}}]},"SCREEN.ENDED":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:failed",to:"presentation:idle",event:"SCREEN.ENDED"}}]},"PRESENTATION.RESET":{target:"presentation:idle",actions:["clearError",{type:"logTransition",params:{from:"presentation:failed",to:"presentation:idle",event:"PRESENTATION.RESET"}}]}}}}});class Ws extends H{constructor(e){super(Hs),this.subscribeCallEvents(e)}get isIdle(){return this.state==="presentation:idle"}get isStarting(){return this.state==="presentation:starting"}get isActive(){return this.state==="presentation:active"}get isStopping(){return this.state==="presentation:stopping"}get isFailed(){return this.state==="presentation:failed"}get isPending(){return this.isStarting||this.isStopping}get isActiveOrPending(){return this.isActive||this.isPending}get lastError(){return this.getSnapshot().context.lastError}reset(){this.send({type:"PRESENTATION.RESET"})}send(e){if(!this.actor.getSnapshot().can(e)){fe(`[PresentationStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}subscribeCallEvents(e){this.addSubscription(e.on("presentation:start",()=>{this.send({type:"SCREEN.STARTING"})})),this.addSubscription(e.on("presentation:started",()=>{this.send({type:"SCREEN.STARTED"})})),this.addSubscription(e.on("presentation:end",()=>{this.send({type:"SCREEN.ENDING"})})),this.addSubscription(e.on("presentation:ended",()=>{this.send({type:"SCREEN.ENDED"})})),this.addSubscription(e.on("presentation:failed",n=>{this.send({type:"SCREEN.FAILED",error:n})})),this.addSubscription(e.on("ended",()=>{this.send({type:"CALL.ENDED"})})),this.addSubscription(e.on("failed",n=>{this.send({type:"CALL.FAILED",error:n})}))}}const Qs=1,Ys=t=>he.hasCanceledError(t);class js extends S.EventEmitterProxy{stateMachine;promisePendingStartPresentation;promisePendingStopPresentation;streamPresentationCurrent;maxBitrate;cancelableSendPresentationWithRepeatedCalls;callManager;constructor({callManager:e,maxBitrate:n}){super(Vs()),this.callManager=e,this.maxBitrate=n,this.stateMachine=new Ws(this.callManager.events),this.subscribe()}get isPendingPresentation(){return!!this.promisePendingStartPresentation||!!this.promisePendingStopPresentation}get isPresentationInProcess(){return!!this.streamPresentationCurrent||this.isPendingPresentation}async startPresentation(e,n,{isNeedReinvite:s,contentHint:i,sendEncodings:r,onAddedTransceiver:a}={},c){const o=this.getRtcSessionProtected();if(this.streamPresentationCurrent)throw new Error("Presentation is already started");return this.sendPresentationWithDuplicatedCalls(e,{rtcSession:o,stream:n,presentationOptions:{isNeedReinvite:s,contentHint:i,sendEncodings:r,onAddedTransceiver:a},options:c})}async stopPresentation(e){this.cancelSendPresentationWithRepeatedCalls();const n=this.streamPresentationCurrent;let s=this.promisePendingStartPresentation??Promise.resolve(void 0);this.promisePendingStartPresentation&&await this.promisePendingStartPresentation.catch(()=>{});const i=this.callManager.getEstablishedRTCSession();return i&&n?s=e().then(async()=>i.stopPresentation(n)).catch(r=>{const a=r instanceof Error?r:new Error(String(r));throw this.events.trigger("presentation:failed",a),r}):n&&this.events.trigger("presentation:ended",n),this.promisePendingStopPresentation=s,s.finally(()=>{this.resetPresentation()})}async updatePresentation(e,n,{contentHint:s,sendEncodings:i,onAddedTransceiver:r}={}){const a=this.getRtcSessionProtected();if(!this.streamPresentationCurrent)throw new Error("Presentation has not started yet");return this.promisePendingStartPresentation&&await this.promisePendingStartPresentation,this.sendPresentation(e,a,n,{contentHint:s,isNeedReinvite:!1,sendEncodings:i,onAddedTransceiver:r}).then(async c=>(await this.setMaxBitrate(),c))}cancelSendPresentationWithRepeatedCalls(){this.cancelableSendPresentationWithRepeatedCalls?.stopRepeatedCalls()}subscribe(){this.callManager.on("presentation:start",e=>{this.events.trigger("presentation:start",e)}),this.callManager.on("presentation:started",e=>{this.events.trigger("presentation:started",e)}),this.callManager.on("presentation:end",e=>{this.events.trigger("presentation:end",e)}),this.callManager.on("presentation:ended",e=>{this.events.trigger("presentation:ended",e)}),this.callManager.on("presentation:failed",e=>{this.events.trigger("presentation:failed",e)}),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded)}async sendPresentationWithDuplicatedCalls(e,{rtcSession:n,stream:s,presentationOptions:i,options:r={callLimit:Qs}}){const a=async()=>this.sendPresentation(e,n,s,i),c=()=>!!this.streamPresentationCurrent;return this.cancelableSendPresentationWithRepeatedCalls=he.repeatedCallsAsync({targetFunction:a,isComplete:c,isRejectAsValid:!0,...r}),this.cancelableSendPresentationWithRepeatedCalls.then(o=>o)}async sendPresentation(e,n,s,{isNeedReinvite:i=!0,contentHint:r="detail",degradationPreference:a,sendEncodings:c,onAddedTransceiver:o}){const l=K(s,{contentHint:r});if(l===void 0)throw new Error("No streamPresentationTarget");this.streamPresentationCurrent=l;const u=e().then(async()=>n.startPresentation(l,i,{degradationPreference:a,sendEncodings:c,onAddedTransceiver:o})).then(this.setMaxBitrate).then(()=>s).catch(m=>{this.removeStreamPresentationCurrent();const R=m instanceof Error?m:new Error(String(m));throw this.events.trigger("presentation:failed",R),m});return this.promisePendingStartPresentation=u,u.finally(()=>{this.promisePendingStartPresentation=void 0})}setMaxBitrate=async()=>{const{connection:e}=this.callManager,{streamPresentationCurrent:n}=this,{maxBitrate:s}=this;if(!e||!n||s===void 0)return;const i=e.getSenders();await _n(i,n,s)};getRtcSessionProtected=()=>{const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};handleEnded=()=>{this.reset()};reset(){this.cancelSendPresentationWithRepeatedCalls(),this.resetPresentation()}resetPresentation(){this.removeStreamPresentationCurrent(),this.promisePendingStartPresentation=void 0,this.promisePendingStopPresentation=void 0}removeStreamPresentationCurrent(){delete this.streamPresentationCurrent}}const xe=0,zs=30;class Js{countInner=xe;initialCount=xe;limitInner=zs;isInProgress=!1;onStatusChange;constructor({onStatusChange:e}){this.onStatusChange=e}get count(){return this.countInner}get limit(){return this.limitInner}get isAttemptInProgress(){return this.isInProgress}hasLimitReached(){return this.countInner>=this.limitInner}startAttempt(){this.isInProgress||(this.isInProgress=!0,this.onStatusChange({isInProgress:this.isInProgress}))}finishAttempt(){this.isInProgress&&(this.isInProgress=!1,this.onStatusChange({isInProgress:this.isInProgress}))}increment(){this.count<this.limit&&(this.countInner+=1)}reset(){this.countInner=this.initialCount,this.finishAttempt()}}class Xs{connectionManager;interval;checkTelephonyByTimeout=void 0;cancelableGetParameters=void 0;constructor({connectionManager:e,interval:n}){this.connectionManager=e,this.interval=n}start(e,{onSuccessRequest:n,onFailRequest:s}){this.stop(),this.cancelableGetParameters=new q.CancelableRequest(e),this.checkTelephonyByTimeout=V.resolveRequesterByTimeout({isDontStopOnFail:!0,requestInterval:this.interval,request:async()=>{if(!this.cancelableGetParameters)throw new Error("cancelableGetParameters is not defined");const i=await this.cancelableGetParameters.request();return this.connectionManager.checkTelephony(i)}}),this.checkTelephonyByTimeout.start(void 0,{onFailRequest:s,onSuccessRequest:()=>{this.stop(),n()}})}stop(){this.checkTelephonyByTimeout?.stop(),this.checkTelephonyByTimeout=void 0,this.cancelableGetParameters?.cancelRequest(),this.cancelableGetParameters=void 0}}class ft{callManager;disposers=[];constructor({callManager:e}){this.callManager=e}subscribe(e){this.unsubscribe(),this.disposers.push(this.callManager.on("call-status-changed",()=>{this.handleCallStatusChange(e)})),this.handleCallStatusChange(e)}unsubscribe(){this.disposers.forEach(e=>{e()}),this.disposers=[]}handleCallStatusChange({onActive:e,onInactive:n}){this.callManager.isCallActive?e?.():n()}}const Ks=15e3,Zs=2,Te=C("PingServerRequester");class ei{connectionManager;pingServerByTimeoutWithFailCalls;constructor({connectionManager:e}){this.connectionManager=e,this.pingServerByTimeoutWithFailCalls=V.requesterByTimeoutsWithFailCalls(Zs,{whenPossibleRequest:async()=>{},requestInterval:Ks,request:async()=>(Te("ping"),this.connectionManager.ping().then(()=>{Te("ping success")}))})}start({onFailRequest:e}){this.pingServerByTimeoutWithFailCalls.start(void 0,{onFailRequest:e}).catch(Te)}stop(){this.pingServerByTimeoutWithFailCalls.stop()}}const qe=C("PingServerIfNotActiveCallRequester");class ti{pingServerRequester;notActiveCallSubscriber;constructor({connectionManager:e,callManager:n}){this.pingServerRequester=new ei({connectionManager:e}),this.notActiveCallSubscriber=new ft({callManager:n})}start({onFailRequest:e}){qe("start"),this.notActiveCallSubscriber.subscribe({onActive:()=>{this.pingServerRequester.stop()},onInactive:()=>{this.pingServerRequester.start({onFailRequest:e})}})}stop(){qe("stop"),this.pingServerRequester.stop(),this.unsubscribeCallStatusChange()}unsubscribeCallStatusChange(){this.notActiveCallSubscriber.unsubscribe()}}class ni{connectionManager;isRegistrationFailed=!1;disposers=[];notActiveCallSubscriber;constructor({connectionManager:e,callManager:n}){this.connectionManager=e,this.notActiveCallSubscriber=new ft({callManager:n})}subscribe(e){this.unsubscribe(),this.disposers.push(this.connectionManager.on("registrationFailed",()=>{this.setIsRegistrationFailed()})),this.notActiveCallSubscriber.subscribe({onInactive:()=>{this.isRegistrationFailed&&e()}}),this.disposers.push(()=>{this.notActiveCallSubscriber.unsubscribe()})}unsubscribe(){this.disposers.forEach(e=>{e()}),this.disposers=[],this.resetIsRegistrationFailed()}setIsRegistrationFailed(){this.isRegistrationFailed=!0}resetIsRegistrationFailed(){this.isRegistrationFailed=!1}}const si={baseRetryDelayMs:1e3,maxRetryDelayMs:3e4,warningThreshold:3,criticalThreshold:5},Ve={none:0,warning:1,critical:2};class ii{failCount=0;nextRetryAtMs=0;escalationLevel="none";options;constructor(e){this.options={...si,...e}}registerFailure(){this.failCount+=1;const e=this.resolveEscalationLevel(this.failCount),n=Ve[e]>Ve[this.escalationLevel];this.escalationLevel=e;const s=Date.now(),i=Math.max(this.nextRetryAtMs-s,0);if(i>0)return{failCount:this.failCount,escalationLevel:this.escalationLevel,hasEscalated:n,shouldRequestReconnect:!1,nextRetryDelayMs:i};const r=this.resolveBackoffDelayMs(this.failCount);return this.nextRetryAtMs=s+r,{failCount:this.failCount,escalationLevel:this.escalationLevel,hasEscalated:n,shouldRequestReconnect:!0,nextRetryDelayMs:r}}reset(){this.failCount=0,this.nextRetryAtMs=0,this.escalationLevel="none"}resolveEscalationLevel(e){return e>=this.options.criticalThreshold?"critical":e>=this.options.warningThreshold?"warning":"none"}resolveBackoffDelayMs(e){return Math.min(this.options.baseRetryDelayMs*2**Math.max(e-1,0),this.options.maxRetryDelayMs)}}const b=C("AutoConnectorRuntime"),ri=3e3,ai=15e3;class oi{connectionManager;connectionQueueManager;checkTelephonyRequester;pingServerIfNotActiveCallRequester;registrationFailedOutOfCallSubscriber;attemptsState;delayBetweenAttempts;telephonyFailPolicy;emitters;reconnectActions;constructor(e){this.connectionManager=e.connectionManager,this.connectionQueueManager=e.connectionQueueManager,this.emitters=e.emitters,this.reconnectActions=e.reconnectActions,this.checkTelephonyRequester=new Xs({connectionManager:this.connectionManager,interval:e.options?.checkTelephonyRequestInterval??ai}),this.pingServerIfNotActiveCallRequester=new ti({connectionManager:this.connectionManager,callManager:e.callManager}),this.registrationFailedOutOfCallSubscriber=new ni({connectionManager:this.connectionManager,callManager:e.callManager}),this.delayBetweenAttempts=new V.DelayRequester(e.options?.timeoutBetweenAttempts??ri),this.telephonyFailPolicy=new ii(e.options?.telephonyFailPolicy),this.attemptsState=new Js({onStatusChange:this.emitters.emitStatusChange})}async stopConnectionFlow(){b("stopConnectionFlow"),this.stopAttempts(),this.stopConnectTriggers(),await this.connectionQueueManager.disconnect()}async connect(e){await this.connectionQueueManager.connect(e.getParameters,e.options)}async delayBeforeRetry(){await this.delayBetweenAttempts.request()}cancelPendingRetry(){this.delayBetweenAttempts.cancelRequest()}hasLimitReached(){return this.attemptsState.hasLimitReached()}shouldDisconnectBeforeAttempt(){const{isDisconnected:e,isIdle:n,isDisconnecting:s,requested:i}=this.connectionManager;return s||i?!0:!(e||n)}beforeAttempt(){b("entryAttemptingGate"),this.emitters.emitBeforeAttempt(),this.stopConnectTriggers()}beforeConnectAttempt(){b("entryAttemptingConnect"),this.attemptsState.startAttempt(),this.attemptsState.increment()}onLimitReached(e){b("onLimitReachedTransition"),this.attemptsState.finishAttempt(),this.emitters.emitLimitReachedAttempts(),this.startCheckTelephony(e)}onConnectSucceeded(e){this.subscribeToConnectTriggers(e),this.emitters.emitSuccess()}emitTerminalOutcome({stopReason:e,lastError:n}){if(this.attemptsState.finishAttempt(),e==="halted"){this.emitters.emitStopAttemptsByError(n);return}if(e==="cancelled"){this.emitters.emitCancelledAttempts(n);return}if(e==="failed"){this.emitters.emitFailedAllAttempts(n);return}b("emitTerminalOutcome without stopReason",n)}onTelephonyStillConnected(){b("onTelephonyStillConnected"),this.stopConnectTriggers(),this.emitters.emitSuccess()}stopConnectTriggers(){b("stopConnectTriggers"),this.pingServerIfNotActiveCallRequester.stop(),this.checkTelephonyRequester.stop(),this.registrationFailedOutOfCallSubscriber.unsubscribe()}stopAttempts(){this.attemptsState.isAttemptInProgress&&this.connectionQueueManager.stop(),this.cancelPendingRetry(),this.attemptsState.reset()}startCheckTelephony(e){b("startCheckTelephony"),this.checkTelephonyRequester.start(async()=>e.getParameters(),{onSuccessRequest:()=>{b("startCheckTelephony: onSuccessRequest"),this.telephonyFailPolicy.reset(),this.isConnectionUnavailable()?this.reconnectActions.requestReconnect(e,"telephony-disconnected"):this.reconnectActions.notifyTelephonyStillConnected()},onFailRequest:n=>{const s=this.telephonyFailPolicy.registerFailure();this.emitters.emitTelephonyCheckFailure({failCount:s.failCount,escalationLevel:s.escalationLevel,shouldRequestReconnect:s.shouldRequestReconnect,nextRetryDelayMs:s.nextRetryDelayMs,error:n}),s.escalationLevel!=="none"&&s.hasEscalated&&this.emitters.emitTelephonyCheckEscalated({failCount:s.failCount,escalationLevel:s.escalationLevel,error:n}),s.shouldRequestReconnect&&this.reconnectActions.requestReconnect(e,"telephony-check-failed"),b("startCheckTelephony: onFailRequest",n?.message)}})}subscribeToConnectTriggers(e){this.pingServerIfNotActiveCallRequester.start({onFailRequest:()=>{b("pingRequester: onFailRequest")}}),this.registrationFailedOutOfCallSubscriber.subscribe(()=>{b("registrationFailedOutOfCallListener callback"),this.reconnectActions.requestReconnect(e,"registration-failed-out-of-call")})}isConnectionUnavailable(){const{isDisconnected:e,isIdle:n}=this.connectionManager;return e||n}}class ci{data;getUa;constructor(e){this.getUa=e.getUa}isConfigured(){return this.getUa()!==void 0}get(){if(this.data!==void 0)return{...this.data}}set(e){if(e===void 0){this.data=void 0;return}this.data={...e}}update(e,n){if(this.data===void 0)throw new Error("data is not exist");this.data[e]=n}clear(){this.data=void 0}isRegister(){return this.data?.register===!0}getSipServerIp(){return this.data?.sipServerIp}getSipServerUrl(){return this.data?.sipServerUrl}getDisplayName(){return this.data?.displayName}getUser(){return this.data?.user}getPassword(){return this.data?.password}isRegisterEnabled(){return this.data?.register===!0}}const Nt="Not ready for connection",At=t=>t instanceof Error&&t.message===Nt,di=()=>new Error(Nt),li=async t=>typeof t=="function"?t():t;function hi(t){return e=>`sip:${e}@${t}`}const ui=(t,e)=>()=>Math.floor(Math.random()*(e-t))+t,It=t=>t.trim().replaceAll(" ","_"),gi=ui(1e5,99999999),mi=3;class pi{resolveParametersRequester=new q.CancelableRequest(li);cancelableConnectWithRepeatedCalls;numberOfConnectionAttempts;dependencies;constructor(e,{numberOfConnectionAttempts:n=mi}={}){this.dependencies=e,this.numberOfConnectionAttempts=n,this.proxyEvents()}connect=async(e,n)=>(this.dependencies.stateMachine.startConnect(),this.dependencies.events.trigger("connect-started",{}),this.cancelRequests(),this.resolveParametersRequester.request(e).then(s=>(this.dependencies.events.trigger("connect-parameters-resolve-success",s),s)).catch(s=>{throw this.dependencies.events.trigger("connect-parameters-resolve-failed",s),s}).then(async s=>this.connectWithDuplicatedCalls(s,n)).then(s=>(this.dependencies.events.trigger("connect-succeeded",{...s}),s)).catch(s=>{const i=s??new Error("Failed to connect to server");throw q.isCanceledError(i)||this.dependencies.events.trigger("connect-failed",i),i}));set=async({displayName:e})=>new Promise((n,s)=>{const i=this.dependencies.getUa();if(!i){s(new Error("this.ua is not initialized"));return}let r=!1;const a=this.dependencies.getConnectionConfiguration();e!==void 0&&e!==a?.displayName&&(r=i.set("display_name",It(e)),this.dependencies.updateConnectionConfiguration("displayName",e));const c=r;c?n(c):s(new Error("nothing changed"))});disconnect=async({cancelRequests:e=!0}={})=>{e&&this.cancelRequests(),this.dependencies.events.trigger("disconnecting",{});const n=new Promise(i=>{this.dependencies.events.once("disconnected",()=>{i()})}),s=this.dependencies.getUa();return s?s.stop():this.dependencies.events.trigger("disconnected",{socket:{},error:!1}),n.finally(()=>{s?.removeAllListeners(),this.dependencies.setUa(void 0),this.dependencies.stateMachine.reset()})};cancelRequests(){this.resolveParametersRequester.cancelRequest(),this.cancelConnectWithRepeatedCalls()}connectWithDuplicatedCalls=async(e,{numberOfConnectionAttempts:n=this.numberOfConnectionAttempts}={})=>{const s=async()=>this.connectInner(e),i=r=>{const o=this.dependencies.getUa()?.isConnected()===!0&&this.hasEqualConnectionConfiguration(e),l=r!=null&&!Zt(r);return o||l};return this.cancelableConnectWithRepeatedCalls=he.repeatedCallsAsync({targetFunction:s,isComplete:i,callLimit:n,isRejectAsValid:!0,isCheckBeforeCall:!1}),this.cancelableConnectWithRepeatedCalls.then(r=>{if(typeof r=="object"&&r!==null&&"authorizationUser"in r)return r;throw r})};hasEqualConnectionConfiguration(e){const{configuration:n}=this.dependencies.uaFactory.createConfiguration(e),i=this.dependencies.getUa()?.configuration;return i?i.password===n.password&&i.register===n.register&&i.uri.toString()===n.uri&&i.display_name===n.display_name&&i.user_agent===n.user_agent&&i.sockets===n.sockets&&i.session_timers===n.session_timers&&i.register_expires===n.register_expires&&i.connection_recovery_min_interval===n.connection_recovery_min_interval&&i.connection_recovery_max_interval===n.connection_recovery_max_interval:!1}connectInner=async e=>this.initUa(e).then(async()=>this.start()).then(()=>{const n=this.dependencies.getConnectionConfiguration();if(n===void 0)throw new Error("connectionConfiguration has not defined");return n});initUa=async({user:e,password:n,sipServerIp:s,sipServerUrl:i,remoteAddress:r,sessionTimers:a,registerExpires:c,connectionRecoveryMinInterval:o,connectionRecoveryMaxInterval:l,userAgent:u,displayName:m="",register:R=!1,extraHeaders:T=[]})=>{this.dependencies.stateMachine.startInitUa(R),this.dependencies.getUa()&&await this.disconnect({cancelRequests:!1});const{ua:M,helpers:F}=this.dependencies.uaFactory.createUAWithConfiguration({user:e,password:n,sipServerIp:s,sipServerUrl:i,displayName:m,register:R,sessionTimers:a,registerExpires:c,connectionRecoveryMinInterval:o,connectionRecoveryMaxInterval:l,userAgent:u,remoteAddress:r,extraHeaders:T},this.dependencies.events),W=M.configuration.uri.user;return this.dependencies.setConnectionConfiguration({sipServerIp:s,sipServerUrl:i,displayName:m,authorizationUser:W,register:R,user:e,password:n}),this.dependencies.setUa(M),this.dependencies.setGetUri(F.getUri),this.dependencies.setSocket(F.socket),M};start=async()=>new Promise((e,n)=>{const s=this.dependencies.getUa();if(!s){n(new Error("this.ua is not initialized"));return}let i;i=((o,l)=>{if(this.dependencies.getConnectionConfiguration()?.register===!0)return this.dependencies.registrationManager.subscribeToStartEvents(o,l);const m="connected",R=["disconnected"];return this.dependencies.events.on(m,o),R.forEach(T=>{this.dependencies.events.on(T,l)}),()=>{this.dependencies.events.off(m,o),R.forEach(T=>{this.dependencies.events.off(T,l)})}})(()=>{i?.(),e(s)},o=>{i?.(),n(o)}),s.start()});cancelConnectWithRepeatedCalls(){this.cancelableConnectWithRepeatedCalls?.cancel()}proxyEvents(){this.dependencies.events.on("connected",()=>{const e=this.dependencies.getConnectionConfiguration();e!==void 0&&this.dependencies.events.trigger("connected-with-configuration",e)})}}const Ne=C("ConnectionStateMachine");var Mt=(t=>(t.IDLE="connection:idle",t.PREPARING="connection:preparing",t.CONNECTING="connection:connecting",t.CONNECTED="connection:connected",t.REGISTERED="connection:registered",t.ESTABLISHED="connection:established",t.DISCONNECTING="connection:disconnecting",t.DISCONNECTED="connection:disconnected",t))(Mt||{}),bt=(t=>(t.START_CONNECT="START_CONNECT",t.START_INIT_UA="START_INIT_UA",t.START_DISCONNECT="START_DISCONNECT",t.UA_CONNECTED="UA_CONNECTED",t.UA_CONNECTING="UA_CONNECTING",t.UA_REGISTERED="UA_REGISTERED",t.UA_UNREGISTERED="UA_UNREGISTERED",t.UA_DISCONNECTED="UA_DISCONNECTED",t.RESET="RESET",t))(bt||{});const Ci=Object.values(bt);function Ei(t){return t.type!=="START_INIT_UA"?{}:{registerRequired:t.registerRequired}}const Ti=g.setup({types:{context:{},events:{}},guards:{canAutoEstablish:({context:t})=>!t.registerRequired},actions:{setRegisterRequired:g.assign(({event:t})=>Ei(t)),resetRegisterRequired:g.assign(()=>({registerRequired:!1})),logTransition:(t,e)=>{Ne(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(t,e)=>{Ne("ConnectionStateMachine state changed",e.state)}}}).createMachine({id:"connection",initial:"connection:idle",context:{registerRequired:!1},states:{"connection:idle":{entry:{type:"logStateChange",params:{state:"connection:idle"}},on:{START_CONNECT:{target:"connection:preparing",actions:{type:"logTransition",params:{from:"connection:idle",to:"connection:preparing",event:"START_CONNECT"}}}}},"connection:preparing":{entry:{type:"logStateChange",params:{state:"connection:preparing"}},on:{START_INIT_UA:{target:"connection:connecting",actions:["setRegisterRequired",{type:"logTransition",params:{from:"connection:preparing",to:"connection:connecting",event:"START_INIT_UA"}}]},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:preparing",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:connecting":{entry:{type:"logStateChange",params:{state:"connection:connecting"}},on:{UA_CONNECTED:{target:"connection:connected",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:connected",event:"UA_CONNECTED"}}},UA_REGISTERED:{target:"connection:registered",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:registered",event:"UA_REGISTERED"}}},START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:connecting",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:connected":{entry:{type:"logStateChange",params:{state:"connection:connected"}},always:{target:"connection:established",guard:"canAutoEstablish",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:established",event:"always"}}},on:{UA_REGISTERED:{target:"connection:registered",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:registered",event:"UA_REGISTERED"}}},START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:connected",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:registered":{entry:{type:"logStateChange",params:{state:"connection:registered"}},always:{target:"connection:established",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:established",event:"always"}}},on:{UA_UNREGISTERED:{target:"connection:connected",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:connected",event:"UA_UNREGISTERED"}}},START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:registered",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:established":{entry:{type:"logStateChange",params:{state:"connection:established"}},on:{START_DISCONNECT:{target:"connection:disconnecting",actions:{type:"logTransition",params:{from:"connection:established",to:"connection:disconnecting",event:"START_DISCONNECT"}}},UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:established",to:"connection:disconnected",event:"UA_DISCONNECTED"}}},RESET:{target:"connection:idle",actions:["resetRegisterRequired",{type:"logTransition",params:{from:"connection:established",to:"connection:idle",event:"RESET"}}]}}},"connection:disconnecting":{entry:{type:"logStateChange",params:{state:"connection:disconnecting"}},on:{UA_DISCONNECTED:{target:"connection:disconnected",actions:{type:"logTransition",params:{from:"connection:disconnecting",to:"connection:disconnected",event:"UA_DISCONNECTED"}}}}},"connection:disconnected":{entry:{type:"logStateChange",params:{state:"connection:disconnected"}},on:{RESET:{target:"connection:idle",actions:["resetRegisterRequired",{type:"logTransition",params:{from:"connection:disconnected",to:"connection:idle",event:"RESET"}}]},START_CONNECT:{target:"connection:preparing",actions:{type:"logTransition",params:{from:"connection:disconnected",to:"connection:preparing",event:"START_CONNECT"}}},UA_CONNECTING:{target:"connection:connecting",actions:{type:"logTransition",params:{from:"connection:disconnected",to:"connection:connecting",event:"UA_CONNECTING"}}}}}}});class Si extends H{events;unsubscribeFromEvents;constructor(e){super(Ti),this.events=e,this.subscribeToEvents()}get isIdle(){return this.hasState("connection:idle")}get isPreparing(){return this.hasState("connection:preparing")}get isConnecting(){return this.hasState("connection:connecting")}get isConnected(){return this.hasState("connection:connected")}get isRegistered(){return this.hasState("connection:registered")}get isEstablished(){return this.hasState("connection:established")}get isDisconnecting(){return this.hasState("connection:disconnecting")}get isDisconnected(){return this.hasState("connection:disconnected")}get isPending(){return this.isPreparing||this.isConnecting}get isPendingConnect(){return this.isPreparing}get isPendingInitUa(){return this.isConnecting}get isActiveConnection(){return this.isEstablished||this.isConnected||this.isRegistered}startConnect(){this.toStartConnect()}startInitUa(e=!1){this.toStartInitUa(e)}startDisconnect(){this.toStartDisconnect()}reset(){this.toIdle()}destroy(){this.unsubscribeFromEvents?.(),this.stop()}canTransition(e){const n=this.actor.getSnapshot(),s=e==="START_INIT_UA"?{type:"START_INIT_UA",registerRequired:!1}:{type:e};return n.can(s)}getValidEvents(){return Ci.filter(e=>this.canTransition(e))}hasState(e){return this.actor.getSnapshot().matches(e)}sendEvent(e){if(!this.actor.getSnapshot().can(e)){Ne(`Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}this.send(e)}toStartConnect=()=>{this.sendEvent({type:"START_CONNECT"})};toStartInitUa=e=>{this.sendEvent({type:"START_INIT_UA",registerRequired:e})};toStartDisconnect=()=>{this.sendEvent({type:"START_DISCONNECT"})};toConnecting=()=>{this.sendEvent({type:"UA_CONNECTING"})};toConnected=()=>{this.sendEvent({type:"UA_CONNECTED"})};toRegistered=()=>{this.sendEvent({type:"UA_REGISTERED"})};toUnregistered=()=>{this.sendEvent({type:"UA_UNREGISTERED"})};toDisconnected=()=>{this.sendEvent({type:"UA_DISCONNECTED"})};toIdle=()=>{this.sendEvent({type:"RESET"})};subscribeToEvents(){this.events.on("connected",this.toConnected),this.events.on("connecting",this.toConnecting),this.events.on("registered",this.toRegistered),this.events.on("unregistered",this.toUnregistered),this.events.on("disconnecting",this.toStartDisconnect),this.events.on("disconnected",this.toDisconnected),this.events.on("registrationFailed",this.toDisconnected),this.events.on("connect-failed",this.toDisconnected),this.unsubscribeFromEvents=()=>{this.events.off("connected",this.toConnected),this.events.off("connecting",this.toConnecting),this.events.off("registered",this.toRegistered),this.events.off("unregistered",this.toUnregistered),this.events.off("disconnecting",this.toStartDisconnect),this.events.off("disconnected",this.toDisconnected),this.events.off("registrationFailed",this.toDisconnected),this.events.off("connect-failed",this.toDisconnected)}}}const yt=["connecting","connected","disconnected","newRTCSession","registered","unregistered","registrationFailed","newMessage","sipEvent"],Ri=["disconnecting","connect-started","connect-succeeded","connect-failed","connect-parameters-resolve-success","connect-parameters-resolve-failed","connected-with-configuration"],Pt=[...yt,...Ri],vi=()=>new S.TypedEvents(Pt),fi=C("RegistrationManager");class Ni{events;getUaProtected;constructor(e){this.events=e.events,this.getUaProtected=e.getUaProtected}async register(){const e=this.getUaProtected();return new Promise((n,s)=>{e.on("registered",n),e.on("registrationFailed",s),e.register()})}async unregister(){const e=this.getUaProtected();return new Promise(n=>{e.on("unregistered",n),e.unregister()})}async tryRegister(){try{await this.unregister()}catch(e){fi("tryRegister",e)}return this.register()}subscribeToStartEvents(e,n){const s="registered",i=["registrationFailed","disconnected"];return this.events.on(s,e),i.forEach(r=>{this.events.on(r,n)}),()=>{this.events.off(s,e),i.forEach(r=>{this.events.off(r,n)})}}}class Ai{uaFactory;getUaProtected;constructor(e){this.uaFactory=e.uaFactory,this.getUaProtected=e.getUaProtected}async sendOptions(e,n,s){const i=this.getUaProtected();return new Promise((r,a)=>{try{i.sendOptions(e,n,{extraHeaders:s,eventHandlers:{succeeded:()=>{r()},failed:a}})}catch(c){a(c)}})}async ping(e,n){const i=this.getUaProtected().configuration.uri;return this.sendOptions(i,e,n)}async checkTelephony({userAgent:e,displayName:n,sipServerIp:s,sipServerUrl:i,remoteAddress:r,extraHeaders:a}){return new Promise((c,o)=>{const{configuration:l}=this.uaFactory.createConfiguration({sipServerUrl:i,displayName:n,userAgent:e,sipServerIp:s}),u=this.uaFactory.createUA({...l,remoteAddress:r,extraHeaders:a}),m=()=>{const T=new Error("Telephony is not available");o(T)};u.once("disconnected",m);const R=()=>{u.removeAllListeners(),u.once("disconnected",()=>{c()}),u.stop()};u.once("connected",R),u.start()})}}const Ii=t=>{const e=[];return t!==void 0&&t!==""&&e.push(`X-Vinteo-Remote: ${t}`),e};class x{JsSIP;constructor(e){this.JsSIP=e}static isRegisteredUA(e){return!!e&&e.isRegistered()}static validateParametersConnection({register:e,password:n,user:s,sipServerIp:i,sipServerUrl:r}){if(!i)throw new Error("sipServerIp is required");if(!r)throw new Error("sipServerUrl is required");if(e&&(n===void 0||n===""))throw new Error("password is required for authorized connection");if(e&&(s===void 0||s===""))throw new Error("user is required for authorized connection")}static resolveAuthorizationUser(e,n){return e&&n!==void 0&&n.trim()!==""?n.trim():`${gi()}`}static buildExtraHeaders(e,n){const s=e!==void 0&&e!==""?Ii(e):[];return n===void 0?s:[...s,...n]}createConfiguration({user:e,password:n,sipServerUrl:s,displayName:i="",sipServerIp:r,register:a=!1,sessionTimers:c=!1,registerExpires:o=300,connectionRecoveryMinInterval:l=2,connectionRecoveryMaxInterval:u=6,userAgent:m}){x.validateParametersConnection({register:a,password:n,user:e,sipServerIp:r,sipServerUrl:s});const R=x.resolveAuthorizationUser(a,e),T=hi(r),L=T(R),M=new this.JsSIP.WebSocketInterface(`wss://${s}/webrtc/wss/`);return{configuration:{password:n,register:a,uri:L,display_name:It(i),user_agent:m,sdpSemantics:"unified-plan",sockets:[M],session_timers:c,register_expires:o,connection_recovery_min_interval:l,connection_recovery_max_interval:u},helpers:{socket:M,getUri:T}}}createUA({remoteAddress:e,extraHeaders:n,...s}){const i=new this.JsSIP.UA(s),r=x.buildExtraHeaders(e,n);return r.length>0&&i.registrator().setExtraHeaders(r),i}createUAWithConfiguration(e,n){const{configuration:s,helpers:i}=this.createConfiguration(e),r=this.createUA({...s,remoteAddress:e.remoteAddress,extraHeaders:e.extraHeaders});return n.eachTriggers((a,c)=>{const o=yt.find(l=>l===c);o&&r.on(o,a)}),{ua:r,helpers:i}}}const Mi=C("ConnectionManager");class bi extends S.EventEmitterProxy{stateMachine;ua;socket;uaFactory;registrationManager;connectionFlow;sipOperations;configurationManager;constructor({JsSIP:e},{numberOfConnectionAttempts:n}={}){super(vi()),this.uaFactory=new x(e),this.registrationManager=new Ni({events:this.events,getUaProtected:this.getUaProtected}),this.stateMachine=new Si(this.events),this.configurationManager=new ci({getUa:this.getUa}),this.sipOperations=new Ai({uaFactory:this.uaFactory,getUaProtected:this.getUaProtected}),this.connectionFlow=new pi({events:this.events,uaFactory:this.uaFactory,stateMachine:this.stateMachine,registrationManager:this.registrationManager,getUa:this.getUa,getConnectionConfiguration:this.getConnectionConfiguration,setConnectionConfiguration:s=>{this.configurationManager.set(s)},updateConnectionConfiguration:(s,i)=>{this.configurationManager.update(s,i)},setUa:s=>{this.ua=s},setGetUri:s=>{this.getUri=s},setSocket:s=>{this.socket=s}},{numberOfConnectionAttempts:n})}get requested(){return this.stateMachine.isPending}get isPendingConnect(){return this.stateMachine.isPendingConnect}get isPendingInitUa(){return this.stateMachine.isPendingInitUa}get isIdle(){return this.stateMachine.isIdle}get isDisconnected(){return this.stateMachine.isDisconnected}get isDisconnecting(){return this.stateMachine.isDisconnecting}get connectionState(){return this.stateMachine.state}get isRegistered(){return x.isRegisteredUA(this.ua)}get isRegisterConfig(){return this.configurationManager.isRegister()}connect=async(e,n)=>this.disconnect().catch(s=>{Mi("connect: disconnect error",s)}).then(async()=>this.connectWithProcessError(e,n));set=async({displayName:e})=>this.connectionFlow.set({displayName:e});disconnect=async()=>{if(this.isConfigured()||this.requested)return this.connectionFlow.disconnect()};async register(){return this.registrationManager.register()}async unregister(){return this.registrationManager.unregister()}tryRegister=async()=>this.registrationManager.tryRegister();sendOptions=async(e,n,s)=>this.sipOperations.sendOptions(e,n,s);ping=async(e,n)=>this.sipOperations.ping(e,n);checkTelephony=async e=>this.sipOperations.checkTelephony(e);isConfigured(){return this.configurationManager.isConfigured()}getConnectionConfiguration=()=>this.configurationManager.get();destroy(){this.stateMachine.destroy()}getUri=e=>e;getUser(){try{return this.getUaProtected().configuration.uri.user}catch{return}}getUaProtected=()=>{if(!this.ua)throw new Error("UA not initialized");return this.ua};getUa=()=>this.ua;connectWithProcessError=async(e,n)=>{if(!(n?.hasReadyForConnection?.()??!0))throw di();return this.connectionFlow.connect(e,n).catch(async i=>{const r=i;return this.disconnect().then(()=>{throw r}).catch(()=>{throw r})})}}class yi{connectionManager;stackPromises=ue.createStackPromises({noRunIsNotActual:!0});constructor({connectionManager:e}){this.connectionManager=e}connect=async(...e)=>this.stackPromises.run(async()=>this.connectionManager.connect(...e));disconnect=async()=>this.stackPromises.run(async()=>this.connectionManager.disconnect());stop(){this.stackPromises.stop()}}const U=t=>{if(t!==null&&typeof t=="object"&&"error"in t)return t.error},v=C("AutoConnectorMachine"),He=(t,e)=>{if(!t.parameters)throw new Error(`Auto connector parameters are missing in ${e} action`);return t.parameters},Pi=t=>g.setup({types:{context:{},events:{}},actors:{stopConnectionFlow:g.fromPromise(async()=>{v("stopConnectionFlow"),await t.stopConnectionFlow()}),connect:g.fromPromise(async({input:e})=>{if(v("connect",e),!e)throw new Error("Auto connector parameters are missing in attemptingConnect state");await t.connect(e)}),waitBeforeRetry:g.fromPromise(async()=>{v("waitBeforeRetry"),await t.delayBetweenAttempts()})},guards:{shouldDisconnectBeforeAttempt:()=>{const e=t.shouldDisconnectBeforeAttempt();return v("shouldDisconnectBeforeAttempt:",e),e},shouldGoIdleAfterDisconnect:({context:e})=>{const n=e.afterDisconnect==="idle";return v("shouldGoIdleAfterDisconnect:",n),n},shouldAttemptAfterDisconnect:({context:e})=>{const n=e.afterDisconnect==="attempt";return v("shouldAttemptAfterDisconnect:",n),n},isLimitReached:()=>{const e=t.hasLimitReached();return v("isLimitReached:",e),e},isNotReadyForConnection:({event:e})=>{const n=At(U(e));return v("isNotReadyForConnection:",n),n},isNoRetryPolicy:({event:e})=>{const n=!t.canRetryOnError(U(e));return v("isNoRetryPolicy:",n),n},isNotActualPromise:({event:e})=>{const n=ue.isPromiseIsNotActualError(U(e));return v("isNotActualPromise:",n),n},isWaitRetryCancelled:({event:e})=>{const n=U(e),s=q.isCanceledError(n)||V.hasCanceledError(n);return v("isWaitRetryCancelled:",s),s}},actions:{logRestartFailed:({event:e})=>{v("auto connector failed to restart connection attempts:",U(e))},assignRestart:g.assign({parameters:({event:e})=>e.parameters,afterDisconnect:()=>"attempt",stopReason:()=>{},lastError:()=>{}}),assignStop:g.assign({afterDisconnect:"idle",stopReason:()=>{},lastError:()=>{}}),entryAttemptingGate:()=>{v("entryAttemptingGate"),t.beforeAttempt()},entryAttemptingConnect:()=>{v("entryAttemptingConnect"),t.beforeConnectAttempt()},onLimitReachedTransition:({context:e})=>{v("onLimitReachedTransition"),t.onLimitReached(He(e,"onLimitReachedTransition"))},onConnectDone:({context:e})=>{v("onConnectDone"),t.onConnectSucceeded(He(e,"onConnectDone"))},assignHaltedError:g.assign({stopReason:()=>"halted",lastError:({event:e})=>{const n=U(e);return v("assignHaltedError",n),n}}),assignCancelledNotActualError:g.assign({stopReason:()=>"cancelled",lastError:({event:e})=>{const n=U(e);return v("assignCancelledNotActualError",n),n}}),assignWaitRetryCancelledError:g.assign({stopReason:()=>"cancelled",lastError:({event:e})=>{const n=U(e);return v("assignWaitRetryCancelledError",n),n}}),assignWaitRetryFailedError:g.assign({stopReason:()=>"failed",lastError:({event:e})=>{const n=U(e);return v("assignWaitRetryFailedError",n),n}}),emitTerminalOutcome:({context:e})=>{v("emitTerminalOutcome"),t.emitTerminalOutcome({stopReason:e.stopReason,lastError:e.lastError})},onTelephonyStillConnected:()=>{v("onTelephonyStillConnected"),t.onTelephonyStillConnected()}}});var E=(t=>(t.IDLE="idle",t.DISCONNECTING="disconnecting",t.ATTEMPTING_GATE="attemptingGate",t.ATTEMPTING_CONNECT="attemptingConnect",t.WAITING_BEFORE_RETRY="waitingBeforeRetry",t.CONNECTED_MONITORING="connectedMonitoring",t.TELEPHONY_CHECKING="telephonyChecking",t.ERROR_TERMINAL="errorTerminal",t))(E||{});const Oi=()=>({parameters:void 0,afterDisconnect:"idle",stopReason:void 0,lastError:void 0}),Y=()=>({"AUTO.STOP":{target:E.DISCONNECTING,actions:"assignStop"},"AUTO.RESTART":{target:E.DISCONNECTING,actions:"assignRestart"}}),_i=t=>Pi(t).createMachine({id:"autoConnector",initial:E.IDLE,context:Oi,states:{[E.IDLE]:{on:{"AUTO.STOP":{target:E.IDLE},"AUTO.RESTART":[{guard:"shouldDisconnectBeforeAttempt",target:E.DISCONNECTING,actions:"assignRestart"},{target:E.ATTEMPTING_GATE,actions:"assignRestart"}]}},[E.DISCONNECTING]:{invoke:{id:"stopConnectionFlow",src:"stopConnectionFlow",onDone:[{guard:"shouldGoIdleAfterDisconnect",target:E.IDLE},{guard:"shouldAttemptAfterDisconnect",target:E.ATTEMPTING_GATE}],onError:{actions:"logRestartFailed",target:E.IDLE}},on:{"AUTO.STOP":{target:E.DISCONNECTING,reenter:!0,actions:"assignStop"},"AUTO.RESTART":{actions:"assignRestart"}}},[E.ATTEMPTING_GATE]:{entry:"entryAttemptingGate",always:[{guard:"isLimitReached",target:E.TELEPHONY_CHECKING,actions:"onLimitReachedTransition"},{target:E.ATTEMPTING_CONNECT}],on:Y()},[E.ATTEMPTING_CONNECT]:{entry:"entryAttemptingConnect",invoke:{id:"connect",src:"connect",input:({context:e})=>e.parameters,onDone:{target:E.CONNECTED_MONITORING,actions:"onConnectDone"},onError:[{guard:"isNotReadyForConnection",target:"errorTerminal",actions:"assignHaltedError"},{guard:"isNoRetryPolicy",target:"errorTerminal",actions:"assignHaltedError"},{guard:"isNotActualPromise",target:"errorTerminal",actions:"assignCancelledNotActualError"},{target:E.WAITING_BEFORE_RETRY}]},on:Y()},[E.WAITING_BEFORE_RETRY]:{invoke:{id:"waitBeforeRetry",src:"waitBeforeRetry",onDone:{target:E.ATTEMPTING_GATE},onError:[{guard:"isWaitRetryCancelled",target:"errorTerminal",actions:"assignWaitRetryCancelledError"},{target:"errorTerminal",actions:"assignWaitRetryFailedError"}]},on:Y()},[E.CONNECTED_MONITORING]:{on:Y()},[E.TELEPHONY_CHECKING]:{on:{"AUTO.STOP":{target:E.DISCONNECTING,actions:"assignStop"},"AUTO.RESTART":{target:E.DISCONNECTING,actions:"assignRestart"},"TELEPHONY.RESULT":{target:E.CONNECTED_MONITORING,actions:"onTelephonyStillConnected"}}},[E.ERROR_TERMINAL]:{entry:"emitTerminalOutcome",on:Y()}}}),Di=C("AutoConnectorStateMachine");class wi extends H{constructor(e){super(e)}send(e){if(!this.actor.getSnapshot().can(e)){Di(`[AutoConnectorStateMachine] Invalid transition: ${e.type} from ${String(this.state)}. Event cannot be processed in current state.`);return}super.send(e)}toStop(){this.send({type:"AUTO.STOP"})}toRestart(e){this.send({type:"AUTO.RESTART",parameters:e})}toTelephonyResult(e){this.send({type:"TELEPHONY.RESULT",outcome:e})}toTelephonyResultStillConnected(){this.toTelephonyResult("stillConnected")}}const Li=t=>new wi(_i(t)),ki="Failed to reconnect",We=t=>t instanceof Error?t:new Error(ki),Ui=t=>{const e=({stopReason:n,lastError:s})=>n==="cancelled"&&!ue.isPromiseIsNotActualError(s)||n==="failed"?We(s):s;return{canRetryOnError:t.canRetryOnError,shouldDisconnectBeforeAttempt:()=>t.runtime.shouldDisconnectBeforeAttempt(),stopConnectionFlow:async()=>{await t.runtime.stopConnectionFlow()},connect:async n=>{await t.runtime.connect(n)},delayBetweenAttempts:async()=>{await t.runtime.delayBeforeRetry()},hasLimitReached:()=>t.runtime.hasLimitReached(),beforeAttempt:()=>{t.runtime.beforeAttempt()},beforeConnectAttempt:()=>{t.runtime.beforeConnectAttempt()},onLimitReached:n=>{t.runtime.onLimitReached(n)},onConnectSucceeded:n=>{t.runtime.onConnectSucceeded(n)},emitTerminalOutcome:({stopReason:n,lastError:s})=>{t.runtime.emitTerminalOutcome({stopReason:n,lastError:e({stopReason:n,lastError:s})})},onTelephonyStillConnected:()=>{t.runtime.onTelephonyStillConnected()}}},Ot=["before-attempt","success","failed-all-attempts","cancelled-attempts","changed-attempt-status","stop-attempts-by-error","limit-reached-attempts","telephony-check-failure","telephony-check-escalated"],Bi=()=>new S.TypedEvents(Ot),j={START:"start",MANUAL_RESTART:"manual-restart",REGISTRATION_FAILED_OUT_OF_CALL:"registration-failed-out-of-call",TELEPHONY_DISCONNECTED:"telephony-disconnected",TELEPHONY_CHECK_FAILED:"telephony-check-failed"},Fi={[j.START]:0,[j.TELEPHONY_DISCONNECTED]:1,[j.TELEPHONY_CHECK_FAILED]:1,[j.REGISTRATION_FAILED_OUT_OF_CALL]:3,[j.MANUAL_RESTART]:4},Qe=t=>Fi[t];class $i{generation=0;lastRequest;coalesceWindowMs;constructor({coalesceWindowMs:e}){this.coalesceWindowMs=e}register(e){const n=Date.now(),s=Qe(e),{lastRequest:i}=this;if(i!==void 0&&n-i.timestamp<this.coalesceWindowMs){const a=Qe(i.reason);if(s<=a)return{shouldRequest:!1,generation:this.generation,currentPriority:s,coalescedBy:i.reason,coalescedByPriority:a}}return this.generation+=1,this.lastRequest={reason:e,timestamp:n},{shouldRequest:!0,generation:this.generation,currentPriority:s}}reset(){this.lastRequest=void 0}}const Gi=250,xi={LIMIT_REACHED:"Limit reached"},qi=t=>!0,B=C("AutoConnectorManager"),Vi="start",Hi="manual-restart";class Wi extends S.EventEmitterProxy{stateMachine;runtime;reconnectCoalescer=new $i({coalesceWindowMs:Gi});constructor({connectionQueueManager:e,connectionManager:n,callManager:s},i){super(Bi()),this.runtime=new oi({connectionManager:n,connectionQueueManager:e,callManager:s,options:i,emitters:{emitBeforeAttempt:()=>{this.events.trigger("before-attempt",{})},emitLimitReachedAttempts:()=>{this.events.trigger("limit-reached-attempts",new Error(xi.LIMIT_REACHED))},emitSuccess:()=>{B("handleSucceededAttempt"),this.events.trigger("success")},emitStopAttemptsByError:r=>{this.events.trigger("stop-attempts-by-error",r)},emitCancelledAttempts:r=>{this.events.trigger("cancelled-attempts",r)},emitFailedAllAttempts:r=>{this.events.trigger("failed-all-attempts",r)},emitTelephonyCheckFailure:r=>{this.events.trigger("telephony-check-failure",r)},emitTelephonyCheckEscalated:r=>{this.events.trigger("telephony-check-escalated",r)},emitStatusChange:({isInProgress:r})=>{this.events.trigger("changed-attempt-status",{isInProgress:r})}},reconnectActions:{requestReconnect:this.requestReconnect,notifyTelephonyStillConnected:()=>{this.stateMachine.toTelephonyResultStillConnected()}}}),this.stateMachine=Li(Ui({runtime:this.runtime,canRetryOnError:i?.canRetryOnError??qi}))}start(e){B("auto connector start"),this.requestReconnect(e,Vi)}restart(){B("auto connector restart");const{parameters:e}=this.stateMachine.context;if(!e){B("auto connector restart skipped: no parameters in context");return}this.requestReconnect(e,Hi)}stop(){B("auto connector stop"),this.resetReconnectCoalescingState(),this.stateMachine.toStop()}cancelPendingRetry(){this.runtime.cancelPendingRetry()}requestReconnect=(e,n)=>{const s=this.shouldRequestReconnect(n);B("auto connector requestReconnect",{isAvailableToRestart:s,reason:n}),s&&this.stateMachine.toRestart(e)};shouldRequestReconnect(e){const n=this.reconnectCoalescer.register(e);return n.shouldRequest?(B(`auto connector reconnect requested: ${e}`,{state:String(this.stateMachine.state),generation:n.generation}),!0):(B(`auto connector reconnect coalesced: ${e}`,{state:String(this.stateMachine.state),coalescedBy:n.coalescedBy,currentPriority:n.currentPriority,coalescedByPriority:n.coalescedByPriority}),!1)}resetReconnectCoalescingState(){this.reconnectCoalescer.reset()}}const Qi=C("ContentedStreamStateMachine"),Yi=g.setup({types:{context:{},events:{}},actions:{setCodec:g.assign(({event:t})=>"codec"in t?{codec:t.codec}:{}),clearCodec:g.assign({codec:void 0})}}).createMachine({id:"contented-stream",initial:"contented-stream:not-available",context:{},states:{"contented-stream:not-available":{on:{"CONTENTED_STREAM.AVAILABLE":{target:"contented-stream:available",actions:"setCodec"}}},"contented-stream:available":{on:{"CONTENTED_STREAM.NOT_AVAILABLE":{target:"contented-stream:not-available",actions:"clearCodec"},"CONTENTED_STREAM.AVAILABLE":{target:"contented-stream:available",actions:"setCodec",reenter:!0},"CONTENTED_STREAM.RESET":{target:"contented-stream:not-available",actions:"clearCodec"}}}}});class ji extends H{constructor(){super(Yi)}get isAvailable(){return this.state==="contented-stream:available"}get isNotAvailable(){return this.state==="contented-stream:not-available"}get codec(){return this.getSnapshot().context.codec}getStateInfo(){return{isAvailable:this.isAvailable,codec:this.codec}}reset(){this.send({type:"CONTENTED_STREAM.RESET"})}send(e){if(!this.actor.getSnapshot().can(e)){Qi(`[ContentedStreamStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}subscribeToApiEvents(e){this.addSubscription(e.on("contented-stream:available",n=>{this.send({type:"CONTENTED_STREAM.AVAILABLE",codec:n.codec})})),this.addSubscription(e.on("contented-stream:not-available",()=>{this.send({type:"CONTENTED_STREAM.NOT_AVAILABLE"})}))}}const zi=["available","not-available"],Ji=()=>new S.TypedEvents(zi);class Xi extends S.EventEmitterProxy{stateMachine;constructor(){super(Ji()),this.stateMachine=new ji,this.proxyEvents()}get isAvailable(){return this.stateMachine.isAvailable}get codec(){return this.stateMachine.codec}getStateInfo(){return this.stateMachine.getStateInfo()}reset(){this.stateMachine.reset()}subscribeToApiEvents(e){this.stateMachine.subscribeToApiEvents(e.events)}proxyEvents(){this.stateMachine.onStateChange(()=>{const e=this.getStateInfo();e.isAvailable?this.events.trigger("available",{codec:e.codec}):this.events.trigger("not-available",{})})}}const _t=["ringing","declinedIncomingCall","terminatedIncomingCall","failedIncomingCall"],Ki=()=>new S.TypedEvents(_t),Ae=C("IncomingCallStateMachine");var Dt=(t=>(t.IDLE="incoming:idle",t.RINGING="incoming:ringing",t.CONSUMED="incoming:consumed",t.DECLINED="incoming:declined",t.TERMINATED="incoming:terminated",t.FAILED="incoming:failed",t))(Dt||{});const Zi=g.setup({types:{context:{},events:{}},actions:{logTransition:(t,e)=>{Ae(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(t,e)=>{Ae("IncomingCallStateMachine state changed",e.state)},rememberIncoming:g.assign(({event:t})=>{const{data:e}=t;return{remoteCallerData:e,lastReason:void 0}}),rememberReason:g.assign(({event:t,context:e})=>t.type==="INCOMING.CONSUMED"?{remoteCallerData:e.remoteCallerData,lastReason:"incoming:consumed"}:t.type==="INCOMING.DECLINED"?{remoteCallerData:t.data,lastReason:"incoming:declined"}:t.type==="INCOMING.TERMINATED"?{remoteCallerData:t.data,lastReason:"incoming:terminated"}:{remoteCallerData:t.data,lastReason:"incoming:failed"}),clearIncoming:g.assign(()=>({remoteCallerData:void 0,lastReason:void 0}))}}).createMachine({id:"incoming",initial:"incoming:idle",context:{},states:{"incoming:idle":{entry:{type:"logStateChange",params:{state:"incoming:idle"}},on:{"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:idle",to:"incoming:ringing",event:"INCOMING.RINGING"}}]},"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:idle",to:"incoming:idle",event:"INCOMING.CLEAR"}}]}}},"incoming:ringing":{entry:{type:"logStateChange",params:{state:"incoming:ringing"}},on:{"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:ringing",event:"INCOMING.RINGING"}}]},"INCOMING.CONSUMED":{target:"incoming:consumed",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:consumed",event:"INCOMING.CONSUMED"}}]},"INCOMING.DECLINED":{target:"incoming:declined",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:declined",event:"INCOMING.DECLINED"}}]},"INCOMING.TERMINATED":{target:"incoming:terminated",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:terminated",event:"INCOMING.TERMINATED"}}]},"INCOMING.FAILED":{target:"incoming:failed",actions:["rememberReason",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:failed",event:"INCOMING.FAILED"}}]},"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:ringing",to:"incoming:idle",event:"INCOMING.CLEAR"}}]}}},"incoming:consumed":{entry:{type:"logStateChange",params:{state:"incoming:consumed"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:consumed",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:consumed",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}},"incoming:declined":{entry:{type:"logStateChange",params:{state:"incoming:declined"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:declined",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:declined",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}},"incoming:terminated":{entry:{type:"logStateChange",params:{state:"incoming:terminated"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:terminated",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:terminated",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}},"incoming:failed":{entry:{type:"logStateChange",params:{state:"incoming:failed"}},on:{"INCOMING.CLEAR":{target:"incoming:idle",actions:["clearIncoming",{type:"logTransition",params:{from:"incoming:failed",to:"incoming:idle",event:"INCOMING.CLEAR"}}]},"INCOMING.RINGING":{target:"incoming:ringing",actions:["rememberIncoming",{type:"logTransition",params:{from:"incoming:failed",to:"incoming:ringing",event:"INCOMING.RINGING"}}]}}}}});class er extends H{constructor({incomingEvents:e,connectionEvents:n}){super(Zi),this.subscribeIncomingEvents(e),this.subscribeConnectionEvents(n)}get isIdle(){return this.state==="incoming:idle"}get isRinging(){return this.state==="incoming:ringing"}get isConsumed(){return this.state==="incoming:consumed"}get isDeclined(){return this.state==="incoming:declined"}get isTerminated(){return this.state==="incoming:terminated"}get isFailed(){return this.state==="incoming:failed"}get isActive(){return this.isRinging}get isFinished(){return this.isConsumed||this.isDeclined||this.isTerminated||this.isFailed}get remoteCallerData(){return this.getSnapshot().context.remoteCallerData}get lastReason(){return this.getSnapshot().context.lastReason}reset(){this.send({type:"INCOMING.CLEAR"})}send(e){if(!this.actor.getSnapshot().can(e)){Ae(`[IncomingCallStateMachine] Invalid transition: ${e.type} from ${this.state}. Event cannot be processed in current state.`);return}super.send(e)}toConsumed(){this.send({type:"INCOMING.CONSUMED"})}subscribeIncomingEvents(e){this.addSubscription(e.on("ringing",n=>{this.send({type:"INCOMING.RINGING",data:n})})),this.addSubscription(e.on("declinedIncomingCall",n=>{this.send({type:"INCOMING.DECLINED",data:n})})),this.addSubscription(e.on("terminatedIncomingCall",n=>{this.send({type:"INCOMING.TERMINATED",data:n})})),this.addSubscription(e.on("failedIncomingCall",n=>{this.send({type:"INCOMING.FAILED",data:n})}))}subscribeConnectionEvents(e){this.addSubscription(e.on("disconnected",()=>{this.toClearIncoming()})),this.addSubscription(e.on("registrationFailed",()=>{this.toClearIncoming()})),this.addSubscription(e.on("connect-failed",()=>{this.toClearIncoming()}))}toClearIncoming(){this.send({type:"INCOMING.CLEAR"})}}const tr=486,nr=487,Se=t=>({displayName:t.remote_identity.display_name,host:t.remote_identity.uri.host,incomingNumber:t.remote_identity.uri.user,rtcSession:t});class sr extends S.EventEmitterProxy{stateMachine;incomingRTCSession;connectionManager;constructor(e){super(Ki()),this.connectionManager=e,this.stateMachine=new er({incomingEvents:this.events,connectionEvents:this.connectionManager.events}),this.start()}get remoteCallerData(){if(this.incomingRTCSession)return Se(this.incomingRTCSession)}get isAvailableIncomingCall(){return!!this.incomingRTCSession}start(){this.subscribe()}stop(){this.unsubscribe(),this.removeIncomingSession()}getIncomingRTCSession=()=>{const{incomingRTCSession:e}=this;if(!e)throw new Error("No incomingRTCSession");return e};extractIncomingRTCSession=()=>{const e=this.getIncomingRTCSession();return this.stateMachine.toConsumed(),this.removeIncomingSession(),e};async declineToIncomingCall({statusCode:e=nr}={}){return new Promise((n,s)=>{try{const i=this.getIncomingRTCSession(),r=Se(i);this.removeIncomingSession(),this.events.trigger("declinedIncomingCall",r),i.terminate({status_code:e}),n()}catch(i){s(i)}})}async busyIncomingCall(){return this.declineToIncomingCall({statusCode:tr})}subscribe(){this.connectionManager.on("newRTCSession",this.handleNewRTCSession)}unsubscribe(){this.connectionManager.off("newRTCSession",this.handleNewRTCSession)}handleNewRTCSession=({originator:e,session:n})=>{e==="remote"&&this.setIncomingSession(n)};setIncomingSession(e){this.incomingRTCSession=e;const n=Se(e);e.on("failed",s=>{this.removeIncomingSession(),s.originator==="local"?this.events.trigger("terminatedIncomingCall",n):this.events.trigger("failedIncomingCall",n)}),this.events.trigger("ringing",n)}removeIncomingSession(){delete this.incomingRTCSession}}class ir{apiManager;connectionManager;callManager;get user(){return this.connectionManager?.getUser()}get number(){return this.callManager?.number}get isCallInitiator(){return!!this.callManager?.isCallInitiator}get peerToPeerRoom(){if(!(this.user===void 0||this.number===void 0))return this.isCallInitiator?`p2p${this.user}to${this.number}`:`p2p${this.number}to${this.user}`}subscribe({apiManager:e,connectionManager:n,callManager:s}){this.apiManager=e,this.connectionManager=n,this.callManager=s,s.on("confirmed",this.maybeSendDirectPeerToPeerRoom)}maybeSendDirectPeerToPeerRoom=()=>{const{peerToPeerRoom:e,number:n,apiManager:s}=this;if(e===void 0||n===void 0||s===void 0)return;const i=[`${h.CONTENT_ENTER_ROOM}: ${this.peerToPeerRoom}`,`${h.PARTICIPANT_NAME}: ${this.number}`,`${h.IS_DIRECT_PEER_TO_PEER}: true`];s.sendEnterRoom(i)}}const wt=["snapshot-changed"],rr=()=>new S.TypedEvents(wt),ar=(t,e)=>Object.is(t,e),Ye=(t,e)=>t.connection.value===e.connection.value&&t.call.value===e.call.value&&t.incoming.value===e.incoming.value&&t.presentation.value===e.presentation.value&&t.autoConnector.value===e.autoConnector.value,je=t=>({connection:t.connection.getSnapshot(),call:t.call.getSnapshot(),incoming:t.incoming.getSnapshot(),presentation:t.presentation.getSnapshot(),autoConnector:t.autoConnector.getSnapshot()});class or extends S.EventEmitterProxy{machines;currentSnapshot;subscribers=new Set;actorSubscriptions=[];constructor(e){super(rr()),this.machines={connection:e.connectionManager.stateMachine,call:e.callManager.stateMachine,incoming:e.incomingCallManager.stateMachine,presentation:e.presentationManager.stateMachine,autoConnector:e.autoConnectorManager.stateMachine},this.currentSnapshot=je(this.machines),this.actorSubscriptions.push(this.machines.connection.subscribe(this.notifySubscribers),this.machines.call.subscribe(this.notifySubscribers),this.machines.incoming.subscribe(this.notifySubscribers),this.machines.presentation.subscribe(this.notifySubscribers),this.machines.autoConnector.subscribe(this.notifySubscribers))}getSnapshot(){return this.currentSnapshot}subscribe(e,n,s){const i=typeof n=="function",r=i?e:m=>m,a=i?n:e,o=i?s??ar:Ye,l=r(this.currentSnapshot),u={selector:r,listener:a,equals:o,current:l};return this.subscribers.add(u),()=>{this.subscribers.delete(u)}}stop(){this.subscribers.clear(),this.actorSubscriptions.forEach(e=>{e.unsubscribe()})}notifySubscribers=()=>{const e=this.currentSnapshot;this.currentSnapshot=je(this.machines);const n=Ye(e,this.currentSnapshot);for(const s of this.subscribers){const i=s.selector(this.currentSnapshot);s.equals(s.current,i)||(s.current=i,s.listener(i))}n||this.events.trigger("snapshot-changed",{previous:e,current:this.currentSnapshot})}}const z=1e3;var N=(t=>(t.INBOUND_RTP="inbound-rtp",t.REMOTE_OUTBOUND_RTP="remote-outbound-rtp",t.MEDIA_SOURCE="media-source",t.OUTBOUND_RTP="outbound-rtp",t.REMOTE_INBOUND_RTP="remote-inbound-rtp",t.CODEC="codec",t.CANDIDATE_PAIR="candidate-pair",t.CERTIFICATE="certificate",t.TRANSPORT="transport",t.LOCAL_CANDIDATE="local-candidate",t.REMOTE_CANDIDATE="remote-candidate",t))(N||{});const Lt=["collected","stopped"],cr=()=>new S.TypedEvents(Lt),ze=()=>"performance"in window?performance.now():Date.now(),te=t=>[...t.keys()].reduce((e,n)=>{const s=t.get(n);return s===void 0?e:{...e,[s.type]:s}},{}),dr=t=>{if(!t)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=te(t);return{outboundRtp:e[N.OUTBOUND_RTP],codec:e[N.CODEC],mediaSource:e[N.MEDIA_SOURCE],remoteInboundRtp:e[N.REMOTE_INBOUND_RTP]}},Je=t=>{if(!t)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=te(t);return{outboundRtp:e[N.OUTBOUND_RTP],codec:e[N.CODEC],mediaSource:e[N.MEDIA_SOURCE],remoteInboundRtp:e[N.REMOTE_INBOUND_RTP]}},Xe=({videoReceiversStats:t,synchronizationSourcesVideo:e})=>{if(!t)return{inboundRtp:void 0,codec:void 0,synchronizationSources:e};const n=te(t);return{inboundRtp:n[N.INBOUND_RTP],codec:n[N.CODEC],synchronizationSources:e}},lr=({audioReceiverStats:t,synchronizationSourcesAudio:e})=>{if(!t)return{inboundRtp:void 0,codec:void 0,remoteOutboundRtp:void 0,synchronizationSources:e};const n=te(t);return{inboundRtp:n[N.INBOUND_RTP],codec:n[N.CODEC],remoteOutboundRtp:n[N.REMOTE_OUTBOUND_RTP],synchronizationSources:e}},kt=t=>{if(!t)return{candidatePair:void 0,certificate:void 0,localCandidate:void 0,remoteCandidate:void 0,transport:void 0};const e=te(t);return{candidatePair:e[N.CANDIDATE_PAIR],certificate:e[N.CERTIFICATE],localCandidate:e[N.LOCAL_CANDIDATE],remoteCandidate:e[N.REMOTE_CANDIDATE],transport:e[N.TRANSPORT]}},hr=({audioSenderStats:t,videoSenderFirstStats:e,videoSenderSecondStats:n})=>({video:Je(e),secondVideo:Je(n),audio:dr(t),additional:kt(t??e??n)}),ur=({audioReceiverStats:t,videoReceiverFirstStats:e,videoReceiverSecondStats:n,synchronizationSources:s})=>({video:Xe({videoReceiversStats:e,synchronizationSourcesVideo:s.video}),secondVideo:Xe({videoReceiversStats:n,synchronizationSourcesVideo:s.secondVideo??s.video}),audio:lr({audioReceiverStats:t,synchronizationSourcesAudio:s.audio}),additional:kt(t??e??n)}),gr=({audioSenderStats:t,videoSenderFirstStats:e,videoSenderSecondStats:n,audioReceiverStats:s,videoReceiverFirstStats:i,videoReceiverSecondStats:r,synchronizationSources:a})=>{const c=hr({audioSenderStats:t,videoSenderFirstStats:e,videoSenderSecondStats:n}),o=ur({audioReceiverStats:s,videoReceiverFirstStats:i,videoReceiverSecondStats:r,synchronizationSources:a});return{outbound:c,inbound:o}},mr=async t=>{const e="audio",n="video",s=t.getSenders(),i=s.find(T=>T.track?.kind===e),r=s.filter(T=>T.track?.kind===n),a=t.getReceivers(),c=a.find(T=>T.track.kind===e),o=a.filter(T=>T.track.kind===n),l={trackIdentifier:c?.track.id,item:c?.getSynchronizationSources()[0]},u={trackIdentifier:o[0]?.track.id,item:o[0]?.getSynchronizationSources()[0]},m={trackIdentifier:o[1]?.track.id,item:o[1]?.getSynchronizationSources()[0]},R={audio:l,video:u,secondVideo:m};return Promise.all([i?.getStats()??Promise.resolve(void 0),r[0]?.getStats()??Promise.resolve(void 0),r[1]?.getStats()??Promise.resolve(void 0),c?.getStats()??Promise.resolve(void 0),o[0]?.getStats()??Promise.resolve(void 0),o[1]?.getStats()??Promise.resolve(void 0)]).then(T=>{const[L,M,F,W,Ht,Wt]=T;return{synchronizationSources:R,audioSenderStats:L,videoSenderFirstStats:M,videoSenderSecondStats:F,audioReceiverStats:W,videoReceiverFirstStats:Ht,videoReceiverSecondStats:Wt}})},pr=C("StatsPeerConnection");class Ut extends S.EventEmitterProxy{setTimeoutRequest;requesterAllStatistics=new q.CancelableRequest(mr);constructor(){super(cr()),this.setTimeoutRequest=new V.SetTimeoutRequest}get requested(){return this.setTimeoutRequest.requested}start(e,{interval:n=z,onError:s=pr}={}){this.setTimeoutRequest.request(()=>{this.collectStatistics(e,{onError:s,onSuccess:i=>{this.start(e,{onError:s,interval:i.interval})}})},n)}stop({reason:e}){this.setTimeoutRequest.cancelRequest(),this.requesterAllStatistics.cancelRequest(),this.events.trigger("stopped",{reason:e})}collectStatistics=(e,{onError:n,onSuccess:s})=>{const i=ze();this.requestAllStatistics(e).then(r=>{this.events.trigger("collected",gr(r));const c=ze()-i;let o=z;c>48?o=z*4:c>32?o=z*3:c>16&&(o=z*2),s({interval:o})}).catch(r=>{n&&n(r)})};requestAllStatistics=async e=>{const n=e();if(n===void 0)throw new Error("failed to collect statistics: peerConnection is not defined");return this.requesterAllStatistics.request(n)}}const Cr=500,Er=C("StatsManager");class Tr extends S.EventEmitterProxy{statsPeerConnection;availableStats;previousAvailableStats;callManager;apiManager;constructor({callManager:e,apiManager:n}){const s=new Ut;super(s.events),this.statsPeerConnection=s,this.callManager=e,this.apiManager=n,this.subscribe()}get availableIncomingBitrate(){return this.availableStats?.inbound.additional.candidatePair?.availableIncomingBitrate}get isInvalidInboundFrames(){return this.isEmptyInboundFrames&&this.isReceivingPackets}get isNoInboundVideoTraffic(){return this.packetsReceived===0&&this.bytesReceived===0}get isInboundVideoStalled(){if(this.packetsReceived===void 0||this.previousPacketsReceived===void 0||this.bytesReceived===void 0||this.previousBytesReceived===void 0)return!1;const e=this.previousPacketsReceived>0||this.previousBytesReceived>0,n=this.packetsReceived===this.previousPacketsReceived,s=this.bytesReceived===this.previousBytesReceived;return e&&n&&s}get isEmptyInboundFrames(){return!this.isFramesReceived||!this.isFramesDecoded}get previousAvailableIncomingBitrate(){return this.previousAvailableStats?.inbound.additional.candidatePair?.availableIncomingBitrate}get previousInboundRtp(){return this.previousAvailableStats?.inbound.video.inboundRtp}get previousFramesReceived(){return this.previousInboundRtp?.framesReceived}get previousFramesDecoded(){return this.previousInboundRtp?.framesDecoded}get inboundRtp(){return this.availableStats?.inbound.video.inboundRtp}get framesReceived(){return this.inboundRtp?.framesReceived}get framesDecoded(){return this.inboundRtp?.framesDecoded}get isFramesReceived(){const e=this.framesReceived!==void 0&&this.framesReceived>0,n=this.framesReceived!==this.previousFramesReceived;return e&&n}get isFramesDecoded(){const e=this.framesDecoded!==void 0&&this.framesDecoded>0,n=this.framesDecoded!==this.previousFramesDecoded;return e&&n}get packetsReceived(){return this.inboundRtp?.packetsReceived}get previousPacketsReceived(){return this.previousInboundRtp?.packetsReceived}get bytesReceived(){return this.inboundRtp?.bytesReceived}get previousBytesReceived(){return this.previousInboundRtp?.bytesReceived}get isReceivingPackets(){const e=this.packetsReceived!==void 0&&this.packetsReceived>=Cr,n=this.packetsReceived!==this.previousPacketsReceived;return e&&n}hasAvailableIncomingBitrateChangedQuarter(){const e=this.previousAvailableIncomingBitrate,n=this.availableIncomingBitrate;return e===void 0||n===void 0?!1:e===0?n>0:Math.abs(n-e)/e>=.25}subscribe(){this.callManager.on("peerconnection:confirmed",this.start),this.callManager.on("recv-session-started",this.handleRecvSessionStarted),this.callManager.on("recv-session-ended",this.handleRecvSessionEnded),this.callManager.on("recv-quality-changed",this.handleRecvQualityChanged),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded),this.statsPeerConnection.on("collected",this.handleStatsCollected)}handleStatsCollected=e=>{this.previousAvailableStats=this.availableStats,this.availableStats=e,this.maybeSendStats()};start=()=>{this.statsPeerConnection.start(this.callManager.getActivePeerConnection)};stop=e=>{this.statsPeerConnection.stop({reason:e}),this.availableStats=void 0,this.previousAvailableStats=void 0};restart(e){this.stop(e),this.statsPeerConnection.start(this.callManager.getActivePeerConnection)}handleRecvSessionStarted=()=>{this.restart("recv-session-started")};handleRecvSessionEnded=()=>{this.restart("recv-session-ended")};handleRecvQualityChanged=()=>{this.restart("recv-quality-changed")};handleEnded=()=>{this.stop("call-ended")};maybeSendStats(){this.availableIncomingBitrate!==void 0&&this.hasAvailableIncomingBitrateChangedQuarter()&&this.apiManager.sendStats({availableIncomingBitrate:this.availableIncomingBitrate}).catch(e=>{Er("Failed to send stats",e)})}}const Sr=C("setCodecPreferences"),Rr=(t,e)=>t.filter(s=>e.some(i=>i.clockRate===s.clockRate&&i.mimeType===s.mimeType&&i.channels===s.channels&&i.sdpFmtpLine===s.sdpFmtpLine)),vr=t=>{const e=RTCRtpSender.getCapabilities(t),n=RTCRtpReceiver.getCapabilities(t),s=e===null?[]:e.codecs,i=n===null?[]:n.codecs;return Rr(s,i)},fr=(t,e)=>e===void 0||e.length===0?t:t.sort((n,s)=>{const i=e.indexOf(n.mimeType),r=e.indexOf(s.mimeType),a=i===-1?Number.MAX_VALUE:i,c=r===-1?Number.MAX_VALUE:r;return a-c}),Nr=(t,e)=>e===void 0||e.length===0?t:t.filter(n=>!e.includes(n.mimeType)),Ar=(t,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:n})=>{try{if(typeof t.setCodecPreferences=="function"&&t.sender.track?.kind==="video"&&(e!==void 0&&e.length>0||n!==void 0&&n.length>0)){const s=vr("video"),i=Nr(s,n),r=fr(i,e);t.setCodecPreferences(r)}}catch(s){Sr("setCodecPreferences error",s)}},Bt=["balancing-scheduled","balancing-started","balancing-stopped","parameters-updated"],Ir=()=>new S.TypedEvents(Bt),Mr=C("VideoSendingBalancerManager");class br extends S.EventEmitterProxy{isBalancingActive=!1;callManager;balancingStartDelay;videoSendingBalancer;startBalancingTimer;constructor(e,n,s={}){super(Ir()),this.callManager=e,this.balancingStartDelay=s.balancingStartDelay??1e4,this.videoSendingBalancer=new ps(n,()=>e.connection,{...s,onSetParameters:i=>{this.events.trigger("parameters-updated",i),s.onSetParameters?.(i)}}),this.subscribe()}get isBalancingScheduled(){return this.startBalancingTimer!==void 0}async startBalancing(){this.isBalancingActive||(this.clearStartTimer(),await this.videoSendingBalancer.balance(),this.videoSendingBalancer.subscribe(),this.isBalancingActive=!0,this.events.trigger("balancing-started",{delay:this.balancingStartDelay}))}stopBalancing(){this.clearStartTimer(),this.videoSendingBalancer.unsubscribe(),this.isBalancingActive=!1,this.events.trigger("balancing-stopped",{})}async balance(){return this.videoSendingBalancer.balance()}subscribe(){this.callManager.on("peerconnection:confirmed",this.handleCallStarted),this.callManager.on("recv-session-started",this.handleRecvSessionStarted),this.callManager.on("recv-session-ended",this.handleRecvSessionEnded),this.callManager.on("recv-quality-changed",this.handleRecvQualityChanged),this.callManager.on("ended",this.handleCallEnded),this.callManager.on("failed",this.handleCallEnded)}handleCallStarted=()=>{this.scheduleBalancingStart()};handleCallEnded=()=>{this.stopBalancing()};handleRecvSessionStarted=()=>{this.stopBalancing()};handleRecvSessionEnded=()=>{this.scheduleBalancingStart()};handleRecvQualityChanged=()=>{this.stopBalancing()};scheduleBalancingStart(){this.clearStartTimer(),this.startBalancingTimer=setTimeout(()=>{this.startBalancingTimer=void 0,this.startBalancing().catch(e=>{Mr("startBalancing: error",e)})},this.balancingStartDelay),this.events.trigger("balancing-scheduled",{delay:this.balancingStartDelay})}clearStartTimer(){this.startBalancingTimer&&(clearTimeout(this.startBalancingTimer),this.startBalancingTimer=void 0)}}const Ft="health-snapshot",$t="inbound-video-problem-detected",Gt="inbound-video-problem-resolved",xt="inbound-video-problem-reset",qt=[Ft,$t,Gt,xt],yr=()=>new S.TypedEvents(qt),Pr=3;class Z extends S.EventEmitterProxy{statsManager;callManager;minConsecutiveProblemSamplesCount;consecutiveProblemSamplesCount=0;currentProblemReason;hasEmittedCurrentProblem=!1;constructor(e,n,s=Pr){super(yr()),this.statsManager=e,this.callManager=n,Z.assertValidMinConsecutiveProblemSamplesCount(s),this.minConsecutiveProblemSamplesCount=s,this.subscribe()}get mainVideoTrack(){return this.callManager.getMainRemoteStream()?.getVideoTracks()[0]}get isMutedMainVideoTrack(){const{mainVideoTrack:e}=this;return e===void 0?!1:e.muted}get isInvalidInboundFrames(){return this.statsManager.isInvalidInboundFrames}get isNoInboundVideoTraffic(){return this.statsManager.isNoInboundVideoTraffic}get isInboundVideoStalled(){return this.statsManager.isInboundVideoStalled}get healthSnapshot(){return{isMutedMainVideoTrack:this.isMutedMainVideoTrack,isInvalidInboundFrames:this.isInvalidInboundFrames,isNoInboundVideoTraffic:this.isNoInboundVideoTraffic,isInboundVideoStalled:this.isInboundVideoStalled}}static resolveProblemReason(e){if(e.isInboundVideoStalled)return"inbound-video-stalled";if(e.isNoInboundVideoTraffic)return"no-inbound-video-traffic";if(e.isMutedMainVideoTrack&&e.isInvalidInboundFrames)return"invalid-inbound-frames"}static assertValidMinConsecutiveProblemSamplesCount(e){if(!Number.isInteger(e)||e<1)throw new Error("minConsecutiveProblemSamplesCount should be a positive integer")}setMinConsecutiveProblemSamplesCount(e){Z.assertValidMinConsecutiveProblemSamplesCount(e),this.minConsecutiveProblemSamplesCount=e,this.resetProblemDetectionState()}handleStatsCollected=()=>{const{healthSnapshot:e}=this;this.events.trigger(Ft,e);const n=Z.resolveProblemReason(e);if(n===void 0){this.maybeEmitResolvedProblem(e),this.resetProblemDetectionState();return}this.updateProblemDetectionState(n),this.consecutiveProblemSamplesCount>=this.minConsecutiveProblemSamplesCount&&!this.hasEmittedCurrentProblem&&(this.events.trigger($t,{...e,consecutiveProblemSamplesCount:this.consecutiveProblemSamplesCount,reason:n}),this.hasEmittedCurrentProblem=!0)};subscribe(){this.statsManager.on("collected",this.handleStatsCollected),this.callManager.on("peerconnection:confirmed",this.handleProblemReset("peerconnection:confirmed")),this.callManager.on("recv-session-started",this.handleProblemReset("recv-session-started")),this.callManager.on("recv-session-ended",this.handleProblemReset("recv-session-ended")),this.callManager.on("recv-quality-changed",this.handleProblemReset("recv-quality-changed")),this.callManager.on("failed",this.handleProblemReset("failed")),this.callManager.on("ended",this.handleProblemReset("ended"))}updateProblemDetectionState=e=>{if(this.currentProblemReason===e){this.consecutiveProblemSamplesCount+=1;return}this.currentProblemReason=e,this.consecutiveProblemSamplesCount=1,this.hasEmittedCurrentProblem=!1};maybeEmitResolvedProblem=e=>{!this.hasEmittedCurrentProblem||this.currentProblemReason===void 0||this.events.trigger(Gt,{...e,reason:this.currentProblemReason})};handleProblemReset=e=>()=>{this.maybeEmitResetProblem(e),this.resetProblemDetectionState()};maybeEmitResetProblem=e=>{!this.hasEmittedCurrentProblem||this.currentProblemReason===void 0||this.events.trigger(xt,{reason:this.currentProblemReason,resetCause:e})};resetProblemDetectionState=()=>{this.currentProblemReason=void 0,this.consecutiveProblemSamplesCount=0,this.hasEmittedCurrentProblem=!1}}const $=C("MainStreamRecovery"),Or=4e3;class le{renegotiateRequester;renegotiateThrottled;callManager;constructor(e,n=Or){this.callManager=e,this.renegotiateRequester=new q.CancelableRequest(e.renegotiate.bind(e)),this.renegotiateThrottled=this.createRenegotiateThrottled(n),this.subscribe()}static assertValidThrottleRecoveryTimeout(e){if(!Number.isInteger(e)||e<1)throw new Error("throttleRecoveryTimeout should be a positive integer")}setThrottleRecoveryTimeout(e){le.assertValidThrottleRecoveryTimeout(e),this.renegotiateThrottled.cancel(),this.renegotiateThrottled=this.createRenegotiateThrottled(e)}recover(){$("trying to recover main stream"),this.renegotiateThrottled()}requestRenegotiate=()=>{if($("trying to renegotiate"),this.renegotiateRequester.requested){$("previous renegotiate is not finished yet");return}this.renegotiateRequester.request().then(()=>{$("renegotiate has successful")}).catch(e=>{$("failed to renegotiate main media stream",e)})};createRenegotiateThrottled(e){return le.assertValidThrottleRecoveryTimeout(e),Yt.throttle(this.requestRenegotiate.bind(this),e)}subscribe(){this.callManager.on("ended",()=>{this.cancel()})}cancel(){$("cancel recover main stream"),this.renegotiateThrottled.cancel(),this.renegotiateRequester.cancelRequest()}}var Le=(t=>(t.VP8="video/VP8",t.VP9="video/VP9",t.H264="video/H264",t.AV1="video/AV1",t.rtx="video/rtx",t.red="video/red",t.flexfec03="video/flexfec-03",t))(Le||{});const _r={major:25,minor:8,patch:0},Dr=({isYandexBrowser:t,hasGreaterThanBrowserVersion:e})=>{const n=e(_r);return t&&n},wr=()=>{const t=Pe();if(Dr(t))return[Le.VP8]},Lr=()=>{const{isMobileDevice:t,isSafari:e,isOpera:n,isWindows:s}=Pe();return t||e||n&&s};let Vt;Lr()&&(Vt="h264");const kr={ignoreForCodec:Vt},Ur=wr(),Br=1e6,Fr=Ot.map(t=>`auto-connect:${t}`),$r=Pt.map(t=>`connection:${t}`),Gr=mt.map(t=>`call:${t}`),xr=tt.map(t=>`api:${t}`),qr=_t.map(t=>`incoming-call:${t}`),Vr=Rt.map(t=>`presentation:${t}`),Hr=Lt.map(t=>`stats:${t}`),Wr=Bt.map(t=>`video-balancer:${t}`),Qr=qt.map(t=>`main-stream-health:${t}`),Yr=wt.map(t=>`session:${t}`),jr=["disconnected-from-out-of-call","connected-with-configuration-from-out-of-call","stopped-presentation-by-server-command"],zr=[...Fr,...$r,...Gr,...xr,...qr,...Vr,...Hr,...Wr,...Qr,...Yr,...jr],Jr=()=>new S.TypedEvents(zr),Ke=C("SipConnector");class Xr extends S.EventEmitterProxy{connectionManager;connectionQueueManager;contentedStreamManager;callManager;autoConnectorManager;apiManager;incomingCallManager;presentationManager;statsManager;videoSendingBalancerManager;sessionManager;mainStreamHealthMonitor;peerToPeerManager;mainStreamRecovery;preferredMimeTypesVideoCodecs;excludeMimeTypesVideoCodecs;constructor({JsSIP:e},{preferredMimeTypesVideoCodecs:n,excludeMimeTypesVideoCodecs:s,videoBalancerOptions:i,autoConnectorOptions:r,numberOfConnectionAttempts:a,minConsecutiveProblemSamplesCount:c,throttleRecoveryTimeout:o}={}){super(Jr()),this.preferredMimeTypesVideoCodecs=n??Ur,this.excludeMimeTypesVideoCodecs=s,this.apiManager=new dn,this.connectionManager=new bi({JsSIP:e},{numberOfConnectionAttempts:a}),this.connectionQueueManager=new yi({connectionManager:this.connectionManager}),this.contentedStreamManager=new Xi,this.callManager=new qs({contentedStreamManager:this.contentedStreamManager},{sendOffer:this.sendOffer}),this.incomingCallManager=new sr(this.connectionManager),this.presentationManager=new js({callManager:this.callManager,maxBitrate:Br}),this.statsManager=new Tr({callManager:this.callManager,apiManager:this.apiManager}),this.autoConnectorManager=new Wi({connectionQueueManager:this.connectionQueueManager,connectionManager:this.connectionManager,callManager:this.callManager},r),this.videoSendingBalancerManager=new br(this.callManager,this.apiManager,i??kr),this.mainStreamHealthMonitor=new Z(this.statsManager,this.callManager,c),this.mainStreamRecovery=new le(this.callManager,o),this.sessionManager=new or({connectionManager:this.connectionManager,callManager:this.callManager,incomingCallManager:this.incomingCallManager,presentationManager:this.presentationManager,autoConnectorManager:this.autoConnectorManager}),this.callManager.subscribeToApiEvents(this.apiManager),this.contentedStreamManager.subscribeToApiEvents(this.apiManager),this.apiManager.subscribe({connectionManager:this.connectionManager,callManager:this.callManager}),this.peerToPeerManager=new ir,this.peerToPeerManager.subscribe({connectionManager:this.connectionManager,callManager:this.callManager,apiManager:this.apiManager}),this.subscribe()}get requestedConnection(){return this.connectionManager.requested}get isPendingConnect(){return this.connectionManager.isPendingConnect}get isPendingInitUa(){return this.connectionManager.isPendingInitUa}get connectionState(){return this.connectionManager.connectionState}get isRegistered(){return this.connectionManager.isRegistered}get isRegisterConfig(){return this.connectionManager.isRegisterConfig}get socket(){return this.connectionManager.socket}get requestedCall(){return this.callManager.requested}get connection(){return this.callManager.connection}get isCallActive(){return this.callManager.isCallActive}get localPorts(){return this.callManager.localPorts}get remoteCallerData(){return this.incomingCallManager.remoteCallerData}get isAvailableIncomingCall(){return this.incomingCallManager.isAvailableIncomingCall}get isDirectP2PRoom(){return this.callManager.isDirectP2PRoom}get isPresentationCall(){return this.callManager.isPresentationCall}get isOptionalPresentationPermission(){return this.isDirectP2PRoom||this.isPresentationCall}connect=async(...e)=>this.connectionQueueManager.connect(...e);disconnect=async()=>this.connectionQueueManager.disconnect();register=async()=>this.connectionManager.register();unregister=async()=>this.connectionManager.unregister();tryRegister=async()=>this.connectionManager.tryRegister();set=async(...e)=>this.connectionManager.set(...e);sendOptions=async(e,n,s)=>this.connectionManager.sendOptions(e,n,s);ping=async(e,n)=>this.connectionManager.ping(e,n);checkTelephony=async e=>this.connectionManager.checkTelephony(e);isConfigured=()=>this.connectionManager.isConfigured();getConnectionConfiguration=()=>this.connectionManager.getConnectionConfiguration();getUri=e=>this.connectionManager.getUri(e);startAutoConnect=(...e)=>{this.autoConnectorManager.start(...e)};stopAutoConnect=()=>{this.autoConnectorManager.stop()};call=async e=>{const{onAddedTransceiver:n,...s}=e;return this.callManager.startCall(this.connectionManager.getUaProtected(),this.getUri,{...s,onAddedTransceiver:this.resolveHandleAddTransceiver(n)})};hangUp=async()=>this.callManager.endCall();answerToIncomingCall=async e=>{const{onAddedTransceiver:n,...s}=e;return this.callManager.answerToIncomingCall(this.incomingCallManager.extractIncomingRTCSession,{...s,onAddedTransceiver:this.resolveHandleAddTransceiver(n)})};declineToIncomingCall=async(...e)=>this.incomingCallManager.declineToIncomingCall(...e);getEstablishedRTCSession=()=>this.callManager.getEstablishedRTCSession();getRemoteStreams=()=>this.callManager.getRemoteStreams();getRecvQuality=()=>this.callManager.getRecvQuality();setRecvQuality=async e=>this.callManager.setRecvQuality(e);applyQuality=async e=>this.callManager.applyQuality(e);replaceMediaStream=async(...e)=>this.callManager.replaceMediaStream(...e);async startPresentation(e,n={}){const{callLimit:s,onAddedTransceiver:i,...r}=n;return this.presentationManager.startPresentation(async()=>{await(this.isOptionalPresentationPermission?this.apiManager.sendAvailableContentedStream():this.apiManager.askPermissionToStartPresentation())},e,{...r,onAddedTransceiver:this.resolveHandleAddTransceiver(i)},s===void 0?void 0:{callLimit:s})}async stopPresentation(){return this.presentationManager.stopPresentation(async()=>{await(this.isOptionalPresentationPermission?this.apiManager.sendNotAvailableContentedStream():this.apiManager.sendStoppedPresentation())})}async updatePresentation(e,n={}){const{onAddedTransceiver:s,...i}=n;return this.presentationManager.updatePresentation(async()=>{await(this.isOptionalPresentationPermission?this.apiManager.sendAvailableContentedStream():this.apiManager.askPermissionToStartPresentation())},e,{...i,onAddedTransceiver:this.resolveHandleAddTransceiver(s)})}async waitChannels(...e){return this.apiManager.waitChannels(...e)}async waitSyncMediaState(...e){return this.apiManager.waitSyncMediaState(...e)}async sendDTMF(...e){return this.apiManager.sendDTMF(...e)}async sendChannels(...e){return this.apiManager.sendChannels(...e)}async sendMediaState(...e){return this.apiManager.sendMediaState(...e)}async sendRefusalToTurnOn(...e){return this.apiManager.sendRefusalToTurnOn(...e)}async sendRefusalToTurnOnMic(...e){return this.apiManager.sendRefusalToTurnOnMic(...e)}async sendRefusalToTurnOnCam(...e){return this.apiManager.sendRefusalToTurnOnCam(...e)}async askPermissionToEnableCam(...e){return this.apiManager.askPermissionToEnableCam(...e)}setMinConsecutiveProblemSamplesCount=e=>{this.mainStreamHealthMonitor.setMinConsecutiveProblemSamplesCount(e)};setThrottleRecoveryTimeout=e=>{this.mainStreamRecovery.setThrottleRecoveryTimeout(e)};subscribeDisconnectedFromOutOfCall(){this.connectionManager.on("disconnected",()=>{this.isCallActive||this.events.trigger("disconnected-from-out-of-call",{})})}subscribeConnectedWithConfigurationFromOutOfCall(){this.connectionManager.on("connected-with-configuration",e=>{this.isCallActive||this.events.trigger("connected-with-configuration-from-out-of-call",e)})}mayBeStopPresentationAndNotify(){this.presentationManager.isPresentationInProcess&&(this.stopPresentation().catch(()=>{}),this.events.trigger("stopped-presentation-by-server-command",{}))}subscribeToApiEvents(){this.apiManager.on("participant:move-request-to-participants",()=>{this.callManager.setCallRoleParticipant()}),this.apiManager.on("participant:move-request-to-spectators-synthetic",()=>{this.callManager.setCallRoleSpectatorSynthetic(),this.mayBeStopPresentationAndNotify()}),this.apiManager.on("participant:move-request-to-spectators-with-audio-id",({audioId:e})=>{this.callManager.setCallRoleSpectator({audioId:e}),this.mayBeStopPresentationAndNotify()}),this.apiManager.on("presentation:must-stop",()=>{this.mayBeStopPresentationAndNotify()}),this.apiManager.on("failed-send-room-direct-p2p",({error:e})=>{const n=new ie.IncomingResponse;n.body=e instanceof Error?e.message:String(e);const s=ie.C.causes.INTERNAL_ERROR;this.callManager.failed(n,s).catch(i=>{Ke("Failed to end call after failed:",i)})})}sendOffer=async(e,n)=>{const i=this.connectionManager.getConnectionConfiguration()?.sipServerUrl;if(i===void 0)throw new Error("No sipServerUrl for sendOffer");return st({serverUrl:i,offer:n,token:e.token,conferenceNumber:e.conferenceNumber,quality:e.quality,audio:e.audioChannel})};setCodecPreferences(e){Ar(e,{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs})}subscribe(){this.bridgeEvents("auto-connect",this.autoConnectorManager),this.bridgeEvents("connection",this.connectionManager),this.bridgeEvents("call",this.callManager),this.bridgeEvents("api",this.apiManager),this.bridgeEvents("incoming-call",this.incomingCallManager),this.bridgeEvents("presentation",this.presentationManager),this.bridgeEvents("stats",this.statsManager),this.bridgeEvents("video-balancer",this.videoSendingBalancerManager),this.bridgeEvents("main-stream-health",this.mainStreamHealthMonitor),this.bridgeEvents("session",this.sessionManager),this.subscribeToApiEvents(),this.subscribeDisconnectedFromOutOfCall(),this.subscribeConnectedWithConfigurationFromOutOfCall(),this.subscribeToMainStreamHealthMonitorEvents()}subscribeToMainStreamHealthMonitorEvents(){this.mainStreamHealthMonitor.on("inbound-video-problem-detected",({reason:e})=>{Ke("detected inbound video problem",{reason:e}),this.mainStreamRecovery.recover()})}bridgeEvents=(e,n)=>{n.events.eachTriggers((s,i)=>{n.on(i,r=>{this.events.trigger(`${e}:${i}`,r)})})};resolveHandleAddTransceiver=e=>async(n,s,i)=>{this.setCodecPreferences(n),await e?.(n,s,i)}}exports.DeferredCommandRunner=at;exports.ECallCause=we;exports.EContentUseLicense=ye;exports.EMimeTypesVideoCodecs=Le;exports.EState=d;exports.EState$1=Mt;exports.EState$2=E;exports.EState$3=Dt;exports.EState$4=vt;exports.EStatsTypes=N;exports.Originator=ut;exports.PURGATORY_CONFERENCE_NUMBER=nt;exports.SipConnector=Xr;exports.StatsPeerConnection=Ut;exports.createUaParser=Pe;exports.disableDebug=Jt;exports.enableDebug=zt;exports.getCodecFromSender=_e;exports.hasCanceledStartPresentationError=Ys;exports.hasNotReadyForConnectionError=At;exports.hasPeerToPeer=ce;exports.hasPurgatory=ee;exports.prepareMediaStream=K;exports.resolveDebug=C;exports.resolveOnStartMainCam=wn;exports.resolveOnStartMic=kn;exports.resolveOnStopMainCam=Bn;exports.resolveOnStopMic=$n;exports.sendOffer=st;exports.setEncodingsToSender=Oe;exports.setParametersToSender=de;exports.stringifyMessage=Cn;
@@ -5423,8 +5423,14 @@ class Yi extends M {
5423
5423
  start(e) {
5424
5424
  F("auto connector start"), this.requestReconnect(e, Wi);
5425
5425
  }
5426
- restart(e) {
5427
- F("auto connector restart"), this.requestReconnect(e, Qi);
5426
+ restart() {
5427
+ F("auto connector restart");
5428
+ const { parameters: e } = this.stateMachine.context;
5429
+ if (!e) {
5430
+ F("auto connector restart skipped: no parameters in context");
5431
+ return;
5432
+ }
5433
+ this.requestReconnect(e, Qi);
5428
5434
  }
5429
5435
  stop() {
5430
5436
  F("auto connector stop"), this.resetReconnectCoalescingState(), this.stateMachine.toStop();
@@ -15,7 +15,7 @@ declare class AutoConnectorManager extends EventEmitterProxy<TEventMap> {
15
15
  callManager: CallManager;
16
16
  }, options?: IAutoConnectorOptions);
17
17
  start(parameters: TParametersAutoConnect): void;
18
- restart(parameters: TParametersAutoConnect): void;
18
+ restart(): void;
19
19
  stop(): void;
20
20
  cancelPendingRetry(): void;
21
21
  private readonly requestReconnect;
package/dist/doMock.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("node:events"),a=require("@krivega/jssip"),T=require("webrtc-mock"),y=require("events-constructor"),m=require("./@SipConnector-PAReth0T.cjs");class N extends a.IncomingRequest{headers;constructor(e){super(),this.headers=new Headers(e)}getHeader(e){return this.headers.get(e)??""}}const U="incomingCall",j="declinedIncomingCall",z="failedIncomingCall",G="terminatedIncomingCall",L="connecting",H="connected",x="disconnected",q="newRTCSession",Y="registered",B="unregistered",K="registrationFailed",$="newMessage",J="sipEvent",Q="availableSecondRemoteStream",X="notAvailableSecondRemoteStream",Z="mustStopPresentation",ee="enterRoom",te="useLicense",ne="peerconnection:confirmed",re="peerconnection:ontrack",oe="channels",ie="channels:notify",se="ended:fromserver",ae="main-cam-control",ce="admin:stop-main-cam",de="admin:start-main-cam",he="admin:stop-mic",Ee="admin:start-mic",ue="admin:force-sync-media-state",me="participant:added-to-list-moderators",le="participant:removed-from-list-moderators",pe="participant:move-request-to-stream",ge="participant:move-request-to-spectators",_e="participant:move-request-to-participants",Te="participation:accepting-word-request",Ie="participation:cancelling-word-request",Se="webcast:started",we="webcast:stopped",Ne="account:changed",Ce="account:deleted",fe="conference:participant-token-issued",Re="ended",Ae="sending",Me="reinvite",Oe="replaces",Pe="refer",ve="progress",De="accepted",ye="confirmed",Le="peerconnection",be="failed",Fe="muted",ke="unmuted",We="newDTMF",Ve="newInfo",Ue="hold",je="unhold",ze="update",Ge="sdp",He="icecandidate",xe="getusermediafailed",qe="peerconnection:createofferfailed",Ye="peerconnection:createanswerfailed",Be="peerconnection:setlocaldescriptionfailed",Ke="peerconnection:setremotedescriptionfailed",$e="presentation:start",Je="presentation:started",Qe="presentation:end",Xe="presentation:ended",Ze="presentation:failed",et=[U,j,G,z,Te,Ie,pe,ie,fe,Ne,Ce,Se,we,me,le],b=[L,H,x,q,Y,B,K,$,J],tt=[Q,X,Z,ee,te,ne,re,oe,se,ae,de,ce,he,Ee,ue,ge,_e],I=[Re,L,Ae,Me,Oe,Pe,ve,De,ye,Le,be,Fe,ke,We,Ve,Ue,je,ze,Ge,He,xe,qe,Ye,Be,Ke,$e,Je,Qe,Xe,Ze];[...b,...et];[...I,...tt];const nt=m.resolveDebug("BaseSession.mock");class rt{originator;connection;events;remote_identity;mutedOptions={audio:!1,video:!1};addTransceiver=jest.fn(async(e,t,n)=>({}));constructor({originator:e="local",eventHandlers:t,remoteIdentity:n}){this.originator=e,this.events=new y.Events(I),this.initEvents(t),this.remote_identity=n}get contact(){throw new Error("Method not implemented.")}get direction(){throw new Error("Method not implemented.")}get local_identity(){throw new Error("Method not implemented.")}get start_time(){throw new Error("Method not implemented.")}get end_time(){throw new Error("Method not implemented.")}get status(){throw new Error("Method not implemented.")}get C(){throw new Error("Method not implemented.")}get causes(){throw new Error("Method not implemented.")}get id(){throw new Error("Method not implemented.")}get data(){throw new Error("Method not implemented.")}set data(e){throw new Error("Method not implemented.")}isInProgress(){throw new Error("Method not implemented.")}isEnded(){throw new Error("Method not implemented.")}isReadyToReOffer(){throw new Error("Method not implemented.")}answer(e){throw new Error("Method not implemented.")}terminate(e){throw new Error("Method not implemented.")}async sendInfo(e,t,n){throw new Error("Method not implemented.")}hold(e,t){throw new Error("Method not implemented.")}unhold(e,t){throw new Error("Method not implemented.")}async renegotiate(e,t){throw new Error("Method not implemented.")}isOnHold(){throw new Error("Method not implemented.")}mute(e){throw new Error("Method not implemented.")}unmute(e){throw new Error("Method not implemented.")}isMuted(){throw new Error("Method not implemented.")}refer(e,t){throw new Error("Method not implemented.")}resetLocalMedia(){throw new Error("Method not implemented.")}async replaceMediaStream(e,t){throw new Error("Method not implemented.")}addListener(e,t){throw new Error("Method not implemented.")}once(e,t){throw new Error("Method not implemented.")}removeListener(e,t){throw new Error("Method not implemented.")}off(e,t){return this.events.off(e,t),this}removeAllListeners(e){return nt("Method not implemented. Event:",e),this}setMaxListeners(e){throw new Error("Method not implemented.")}getMaxListeners(){throw new Error("Method not implemented.")}listeners(e){throw new Error("Method not implemented.")}rawListeners(e){throw new Error("Method not implemented.")}emit(e,...t){throw new Error("Method not implemented.")}listenerCount(e){throw new Error("Method not implemented.")}prependListener(e,t){throw new Error("Method not implemented.")}prependOnceListener(e,t){throw new Error("Method not implemented.")}eventNames(){throw new Error("Method not implemented.")}initEvents(e){e&&Object.entries(e).forEach(([t,n])=>{this.on(t,n)})}on=(e,t)=>(I.includes(e)&&this.events.on(e,t),this);trigger(e,t){this.events.trigger(e,t)}sendDTMF(){this.trigger("newDTMF",{originator:this.originator})}async startPresentation(e){return this.trigger("presentation:start",e),this.trigger("presentation:started",e),e}async stopPresentation(e){return this.trigger("presentation:end",e),this.trigger("presentation:ended",e),e}isEstablished(){return!0}}class A{stats=new Map().set("codec",{mimeType:"video/h264"});dtmf=null;track=null;transport=null;transform=null;parameters={encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}};parametersGets;constructor({track:e}={}){this.track=e??null}async getStats(){return this.stats}async replaceTrack(e){this.track=e??null}async setParameters(e){if(e!==this.parametersGets)throw new Error("Failed to execute 'setParameters' on 'RTCRtpSender': Read-only field modified in setParameters().");const{transactionId:t}=this.parameters;this.parameters={...this.parameters,...e,transactionId:`${Number(t)+1}`}}getParameters(){return this.parametersGets={...this.parameters},this.parametersGets}setStreams(){throw new Error("Method not implemented.")}}class M{currentDirection="sendrecv";direction="sendrecv";mid=null;receiver;sender;stopped=!1;constructor(e){this.sender=e}setCodecPreferences(e){}stop(){}}class ot extends EventTarget{senders=[];receivers=[];canTrickleIceCandidates;connectionState="new";currentLocalDescription;currentRemoteDescription;iceConnectionState;iceGatheringState;idpErrorInfo;idpLoginUrl;localDescription;onconnectionstatechange;ondatachannel;onicecandidate;onicecandidateerror=null;oniceconnectionstatechange;onicegatheringstatechange;onnegotiationneeded;onsignalingstatechange;ontrack;peerIdentity=void 0;pendingLocalDescription;pendingRemoteDescription;remoteDescription;sctp=null;signalingState="stable";close=jest.fn();setLocalDescription=jest.fn(async e=>{this.signalingState=e.type==="rollback"?"stable":"have-local-offer",this.dispatchEvent(new Event("signalingstatechange"))});setRemoteDescription=jest.fn(async e=>{this.signalingState="stable",this.connectionState="connected",this.dispatchEvent(new Event("signalingstatechange")),this.dispatchEvent(new Event("connectionstatechange"))});addTransceiver=jest.fn((e,t)=>({}));createOffer=jest.fn(async(e,t,n)=>({type:"offer",sdp:"offer-sdp"}));constructor(e,t){super(),this.receivers=t?.map(n=>({track:n}))??[]}getRemoteStreams(){throw new Error("Method not implemented.")}async addIceCandidate(e){throw new Error("Method not implemented.")}restartIce(){throw new Error("Method not implemented.")}async createAnswer(e,t){throw new Error("Method not implemented.")}createDataChannel(e,t){throw new Error("Method not implemented.")}getConfiguration(){throw new Error("Method not implemented.")}async getIdentityAssertion(){throw new Error("Method not implemented.")}async getStats(e){throw new Error("Method not implemented.")}getTransceivers(){throw new Error("Method not implemented.")}removeTrack(e){throw new Error("Method not implemented.")}setConfiguration(e){throw new Error("Method not implemented.")}getReceivers=()=>this.receivers;getSenders=()=>this.senders;addTrack=(e,...t)=>{const n=new A({track:e}),o=new M(n);return o.mid=e.kind==="audio"?"0":"1",this.senders.push(n),this.dispatchTrackInternal(e,...t),n};addTrackWithMid=(e,t)=>{const n=new A({track:e}),o=new M(n);return t===void 0?o.mid=e.kind==="audio"?"0":"1":o.mid=t,this.senders.push(n),this.dispatchTrackInternal(e),n};dispatchTrack(e){this.dispatchTrackInternal(new T.MediaStreamTrackMock(e))}dispatchTrackInternal(e,...t){const n=new Event("track");Object.defineProperty(n,"track",{value:e}),Object.defineProperty(n,"streams",{value:t.length===0?[new MediaStream([e])]:t}),this.dispatchEvent(n)}}function it(r){const e=r.match(/(purgatory)|[\d.]+/g);if(!e)throw new Error("wrong sip url");return e[0]}const O=400,F="777",st=r=>r.getVideoTracks().length>0;class s extends rt{static presentationError;static startPresentationError;static countStartPresentationError=Number.POSITIVE_INFINITY;static countStartsPresentation=0;url;status_code;renegotiate=jest.fn(async()=>!0);answer=jest.fn(({mediaStream:e})=>{if(this.originator!=="remote")throw new Error("answer available only for remote sessions");this.initPeerconnection(e),setTimeout(()=>{this.trigger("connecting"),setTimeout(()=>{this.trigger("accepted")},100),setTimeout(()=>{this.trigger("confirmed")},200)},O)});replaceMediaStream=jest.fn(async e=>{});_isReadyToReOffer=jest.fn(()=>!0);restartIce=jest.fn(async e=>!0);isEndedInner=!1;delayStartPresentation=0;timeoutStartPresentation;timeoutConnect;timeoutNewInfo;timeoutAccepted;timeoutConfirmed;constructor({eventHandlers:e,originator:t,remoteIdentity:n=new a.NameAddrHeader(new a.URI("sip","caller1","test1.com",5060),"Test Caller 1"),delayStartPresentation:o=0}){super({originator:t,eventHandlers:e,remoteIdentity:n}),this.delayStartPresentation=o}static get C(){return a.SessionStatus}static setPresentationError(e){this.presentationError=e}static resetPresentationError(){this.presentationError=void 0}static setStartPresentationError(e,{count:t=Number.POSITIVE_INFINITY}={}){this.startPresentationError=e,this.countStartPresentationError=t}static resetStartPresentationError(){this.startPresentationError=void 0,this.countStartPresentationError=Number.POSITIVE_INFINITY,this.countStartsPresentation=0}startPresentation=async e=>(s.countStartsPresentation+=1,new Promise((t,n)=>{this.timeoutStartPresentation=setTimeout(()=>{if(s.presentationError){this.trigger("presentation:start",e),this.trigger("presentation:failed",e),n(s.presentationError);return}if(s.startPresentationError&&s.countStartsPresentation<s.countStartPresentationError){this.trigger("presentation:start",e),this.trigger("presentation:failed",e),n(s.startPresentationError);return}t(super.startPresentation(e))},this.delayStartPresentation)}));stopPresentation=async e=>{if(s.presentationError)throw this.trigger("presentation:end",e),this.trigger("presentation:failed",e),s.presentationError;return super.stopPresentation(e)};initPeerconnection(e){return e?(this.createPeerconnection(e),!0):!1}createPeerconnection(e){const t=T.createAudioMediaStreamTrackMock();t.id="mainaudio1";const n=[t];if(st(e)){const c=T.createVideoMediaStreamTrackMock();c.id="mainvideo1",n.push(c)}this.connection=new ot(void 0,n),this.trigger("peerconnection",{peerconnection:this.connection}),this.addStream(e)}connect(e,{mediaStream:t}={}){const n=it(e);return this.initPeerconnection(t),this.timeoutConnect=setTimeout(()=>{e.includes(F)?this.trigger("failed",{originator:"remote",message:"IncomingResponse",cause:"Rejected"}):(this.trigger("connecting"),this.timeoutNewInfo=setTimeout(()=>{this.newInfo({originator:m.Originator.REMOTE,request:{getHeader:o=>o==="content-type"?"application/vinteo.webrtc.roomname":o==="x-webrtc-enter-room"?n:o==="x-webrtc-participant-name"?"Test Caller 1":""}})},100),this.timeoutAccepted=setTimeout(()=>{this.trigger("accepted")},200),this.timeoutConfirmed=setTimeout(()=>{this.trigger("confirmed")},300))},O),this.connection}terminate({status_code:e,cause:t}={}){return this.status_code=e,this.trigger("ended",{status_code:e,cause:t,originator:"local"}),this.isEndedInner=!1,this}async terminateAsync({status_code:e,cause:t}={}){this.terminate({status_code:e,cause:t})}terminateRemote({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e,originator:"remote"}),this}addStream(e,t="getTracks"){e[t]().forEach(n=>this.connection.addTrack(n,e))}forEachSenders(e){const t=this.connection.getSenders();for(const n of t)e(n);return t}toggleMuteAudio(e){this.forEachSenders(({track:t})=>{t?.kind==="audio"&&(t.enabled=!e)})}toggleMuteVideo(e){this.forEachSenders(({track:t})=>{t?.kind==="video"&&(t.enabled=!e)})}mute(e){e.audio&&(this.mutedOptions.audio=!0,this.toggleMuteAudio(this.mutedOptions.audio)),e.video&&(this.mutedOptions.video=!0,this.toggleMuteVideo(this.mutedOptions.video)),this.onmute(e)}unmute(e){e.audio&&(this.mutedOptions.audio=!1),e.video&&(this.mutedOptions.video=!1),this.trigger("unmuted",e)}isMuted(){return this.mutedOptions}onmute({audio:e,video:t}){this.trigger("muted",{audio:e,video:t})}async sendInfo(){}isEnded(){return this.isEndedInner}newInfo(e){this.trigger("newInfo",e)}clear(){clearTimeout(this.timeoutStartPresentation),clearTimeout(this.timeoutConnect),clearTimeout(this.timeoutNewInfo),clearTimeout(this.timeoutAccepted),clearTimeout(this.timeoutConfirmed)}}class at{extraHeaders=[];setExtraHeaders(e){this.extraHeaders=e}setExtraContactParams(){}}const ct=m.resolveDebug("UA.mock"),d="PASSWORD_CORRECT",S="PASSWORD_CORRECT_2",k="NAME_INCORRECT",u=400,_={url:"wss://sipServerUrl/webrtc/wss/",sip_uri:"sip:sipServerUrl;transport=ws",via_transport:"WSS"},P={status_code:200,reason_phrase:"OK"},v={status_code:401,reason_phrase:"Unauthorized"};class i extends D.EventEmitter{static isAvailableTelephony=!0;static startError;static countStartError=Number.POSITIVE_INFINITY;static countStarts=0;events;registratorInner;call=jest.fn((e,t)=>{const{mediaStream:n,eventHandlers:o}=t;return this.session=new s({eventHandlers:o,originator:"local"}),this.session.connect(e,{mediaStream:n}),this.session});sendOptions=jest.fn((e,t,n)=>{ct("sendOptions",e,t,n)});start=jest.fn(()=>{if(i.countStarts+=1,i.startError&&i.countStarts<i.countStartError){this.trigger("disconnected",i.startError);return}this.register()});stop=jest.fn(()=>{this.startedTimeout&&clearTimeout(this.startedTimeout),this.stopedTimeout&&clearTimeout(this.stopedTimeout),this.unregister(),this.isStarted()?this.stopedTimeout=setTimeout(()=>{this.trigger("disconnected",{error:!0,socket:_})},u):this.trigger("disconnected",{error:!0,socket:_})});removeAllListeners=jest.fn(()=>(this.events.removeEventHandlers(),this));once=jest.fn((e,t)=>(this.events.once(e,t),this));configuration;startedTimeout;stopedTimeout;session;isRegisteredInner;isConnectedInner;constructor(e){super(),this.events=new y.Events(b);const[t,n]=e.uri.split(":"),[o,c]=n.split("@"),g={...e,uri:new a.URI(t,o,c)};this.configuration=g,this.registratorInner=new at}get C(){throw new Error("Method not implemented.")}get status(){throw new Error("Method not implemented.")}get contact(){throw new Error("Method not implemented.")}get transport(){throw new Error("Method not implemented.")}static C(){throw new Error("Method not implemented.")}static setStartError(e,{count:t=Number.POSITIVE_INFINITY}={}){i.startError=e,i.countStartError=t}static resetStartError(){i.startError=void 0,i.countStartError=Number.POSITIVE_INFINITY,i.countStarts=0}static setAvailableTelephony(){i.isAvailableTelephony=!0}static setNotAvailableTelephony(){i.isAvailableTelephony=!1}static reset(){i.resetStartError(),i.setAvailableTelephony()}on(e,t){return this.events.on(e,t),this}sendMessage(){throw new Error("Method not implemented.")}normalizeTarget(){throw new Error("Method not implemented.")}get(){throw new Error("Method not implemented.")}off(e,t){return this.events.off(e,t),this}trigger(e,t){this.events.trigger(e,t)}terminateSessions(){this.session?.terminate()}set(e,t){return this.configuration[e]=t,!0}register(){this.startedTimeout&&clearTimeout(this.startedTimeout);const{password:e,register:t,uri:n}=this.configuration;t===!0&&n.user.includes(k)?(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:v,cause:a.C.causes.REJECTED})},u)):!this.isRegistered()&&t===!0&&(e===d||e===S)?(this.isRegisteredInner=!0,this.startedTimeout=setTimeout(()=>{this.trigger("registered",{response:P})},u)):t===!0&&e!==d&&e!==S&&(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:v,cause:a.C.causes.REJECTED})},u)),i.isAvailableTelephony?(this.trigger("connected",{socket:_}),this.isConnectedInner=!0):this.stop()}unregister(){this.isRegisteredInner=!1,this.isConnectedInner=!1,this.trigger("unregistered",{response:P})}isRegistered(){return this.isRegisteredInner===!0}isConnected(){return this.isConnectedInner===!0}isStarted(){return this.configuration.register===!0&&this.isRegisteredInner===!0||this.configuration.register!==!0&&this.isConnectedInner===!0}newSipEvent(e){this.trigger("sipEvent",e)}registrator(){return this.registratorInner}}class dt{url;constructor(e){this.url=e}}class ht extends D.EventEmitter{contentType;body;constructor(e,t){super(),this.contentType=e,this.body=t}}const w="remote",Et=(r,e)=>{const t=new N(e),n={originator:w,request:t,info:new ht("","")};r.newInfo(n)},ut=(r,e)=>{const n={event:"sipEvent",request:new N(e)};r.newSipEvent(n)},mt=(r,{incomingNumber:e="1234",displayName:t,host:n})=>{const o=new s({originator:w,eventHandlers:{}}),c=new a.URI("sip",e,n);o.remote_identity=new a.NameAddrHeader(c,t);const g=new N([]);r.trigger("newRTCSession",{originator:w,session:o,request:g})},lt=(r,e)=>{e?r.trigger("failed",e):r.trigger("failed",r)},C={triggerNewInfo:Et,triggerNewSipEvent:ut,triggerIncomingSession:mt,triggerFailIncomingSession:lt,WebSocketInterface:dt,UA:i,C:{INVITE:"INVITE"}},h="user",E="displayName",l="SIP_SERVER_URL",f="SIP_WEB_SOCKET_SERVER_URL",pt=new C.WebSocketInterface(`wss://${f}/webrtc/wss/`),R={displayName:"DISPLAY_NAME",userAgent:"Chrome",sipServerIp:l,sipServerUrl:f},gt={...R,displayName:"DISPLAY_NAME",register:!1},W={...R,user:h,password:d,register:!0,authorizationUser:h},_t={...W,displayName:E},Tt={...R,displayName:E,authorizationUser:h,register:!1},p={session_timers:!1,sockets:[pt],user_agent:"Chrome",sdpSemantics:"unified-plan",register_expires:300,connection_recovery_max_interval:6,connection_recovery_min_interval:2},It={...p,password:d,uri:new a.URI("sip",h,l),display_name:"DISPLAY_NAME",register:!0},St={...p,password:d,uri:new a.URI("sip",h,l),display_name:E,register:!0},wt={...p,display_name:E,register:!1},Nt={...p,display_name:"DISPLAY_NAME",register:!1},V="10.10.10.10",Ct=[`X-Vinteo-Remote: ${V}`],ft=()=>new m.SipConnector({JsSIP:C});exports.FAILED_CONFERENCE_NUMBER=F;exports.JsSIP=C;exports.NAME_INCORRECT=k;exports.PASSWORD_CORRECT=d;exports.PASSWORD_CORRECT_2=S;exports.SIP_SERVER_URL=l;exports.SIP_WEB_SOCKET_SERVER_URL=f;exports.dataForConnectionWithAuthorization=W;exports.dataForConnectionWithAuthorizationWithDisplayName=_t;exports.dataForConnectionWithoutAuthorization=Tt;exports.dataForConnectionWithoutAuthorizationWithoutDisplayName=gt;exports.displayName=E;exports.doMockSipConnector=ft;exports.extraHeadersRemoteAddress=Ct;exports.remoteAddress=V;exports.uaConfigurationWithAuthorization=It;exports.uaConfigurationWithAuthorizationWithDisplayName=St;exports.uaConfigurationWithoutAuthorization=wt;exports.uaConfigurationWithoutAuthorizationWithoutDisplayName=Nt;exports.user=h;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const D=require("node:events"),a=require("@krivega/jssip"),T=require("webrtc-mock"),y=require("events-constructor"),m=require("./@SipConnector-CrRam6ae.cjs");class N extends a.IncomingRequest{headers;constructor(e){super(),this.headers=new Headers(e)}getHeader(e){return this.headers.get(e)??""}}const U="incomingCall",j="declinedIncomingCall",z="failedIncomingCall",G="terminatedIncomingCall",L="connecting",H="connected",x="disconnected",q="newRTCSession",Y="registered",B="unregistered",K="registrationFailed",$="newMessage",J="sipEvent",Q="availableSecondRemoteStream",X="notAvailableSecondRemoteStream",Z="mustStopPresentation",ee="enterRoom",te="useLicense",ne="peerconnection:confirmed",re="peerconnection:ontrack",oe="channels",ie="channels:notify",se="ended:fromserver",ae="main-cam-control",ce="admin:stop-main-cam",de="admin:start-main-cam",he="admin:stop-mic",Ee="admin:start-mic",ue="admin:force-sync-media-state",me="participant:added-to-list-moderators",le="participant:removed-from-list-moderators",pe="participant:move-request-to-stream",ge="participant:move-request-to-spectators",_e="participant:move-request-to-participants",Te="participation:accepting-word-request",Ie="participation:cancelling-word-request",Se="webcast:started",we="webcast:stopped",Ne="account:changed",Ce="account:deleted",fe="conference:participant-token-issued",Re="ended",Ae="sending",Me="reinvite",Oe="replaces",Pe="refer",ve="progress",De="accepted",ye="confirmed",Le="peerconnection",be="failed",Fe="muted",ke="unmuted",We="newDTMF",Ve="newInfo",Ue="hold",je="unhold",ze="update",Ge="sdp",He="icecandidate",xe="getusermediafailed",qe="peerconnection:createofferfailed",Ye="peerconnection:createanswerfailed",Be="peerconnection:setlocaldescriptionfailed",Ke="peerconnection:setremotedescriptionfailed",$e="presentation:start",Je="presentation:started",Qe="presentation:end",Xe="presentation:ended",Ze="presentation:failed",et=[U,j,G,z,Te,Ie,pe,ie,fe,Ne,Ce,Se,we,me,le],b=[L,H,x,q,Y,B,K,$,J],tt=[Q,X,Z,ee,te,ne,re,oe,se,ae,de,ce,he,Ee,ue,ge,_e],I=[Re,L,Ae,Me,Oe,Pe,ve,De,ye,Le,be,Fe,ke,We,Ve,Ue,je,ze,Ge,He,xe,qe,Ye,Be,Ke,$e,Je,Qe,Xe,Ze];[...b,...et];[...I,...tt];const nt=m.resolveDebug("BaseSession.mock");class rt{originator;connection;events;remote_identity;mutedOptions={audio:!1,video:!1};addTransceiver=jest.fn(async(e,t,n)=>({}));constructor({originator:e="local",eventHandlers:t,remoteIdentity:n}){this.originator=e,this.events=new y.Events(I),this.initEvents(t),this.remote_identity=n}get contact(){throw new Error("Method not implemented.")}get direction(){throw new Error("Method not implemented.")}get local_identity(){throw new Error("Method not implemented.")}get start_time(){throw new Error("Method not implemented.")}get end_time(){throw new Error("Method not implemented.")}get status(){throw new Error("Method not implemented.")}get C(){throw new Error("Method not implemented.")}get causes(){throw new Error("Method not implemented.")}get id(){throw new Error("Method not implemented.")}get data(){throw new Error("Method not implemented.")}set data(e){throw new Error("Method not implemented.")}isInProgress(){throw new Error("Method not implemented.")}isEnded(){throw new Error("Method not implemented.")}isReadyToReOffer(){throw new Error("Method not implemented.")}answer(e){throw new Error("Method not implemented.")}terminate(e){throw new Error("Method not implemented.")}async sendInfo(e,t,n){throw new Error("Method not implemented.")}hold(e,t){throw new Error("Method not implemented.")}unhold(e,t){throw new Error("Method not implemented.")}async renegotiate(e,t){throw new Error("Method not implemented.")}isOnHold(){throw new Error("Method not implemented.")}mute(e){throw new Error("Method not implemented.")}unmute(e){throw new Error("Method not implemented.")}isMuted(){throw new Error("Method not implemented.")}refer(e,t){throw new Error("Method not implemented.")}resetLocalMedia(){throw new Error("Method not implemented.")}async replaceMediaStream(e,t){throw new Error("Method not implemented.")}addListener(e,t){throw new Error("Method not implemented.")}once(e,t){throw new Error("Method not implemented.")}removeListener(e,t){throw new Error("Method not implemented.")}off(e,t){return this.events.off(e,t),this}removeAllListeners(e){return nt("Method not implemented. Event:",e),this}setMaxListeners(e){throw new Error("Method not implemented.")}getMaxListeners(){throw new Error("Method not implemented.")}listeners(e){throw new Error("Method not implemented.")}rawListeners(e){throw new Error("Method not implemented.")}emit(e,...t){throw new Error("Method not implemented.")}listenerCount(e){throw new Error("Method not implemented.")}prependListener(e,t){throw new Error("Method not implemented.")}prependOnceListener(e,t){throw new Error("Method not implemented.")}eventNames(){throw new Error("Method not implemented.")}initEvents(e){e&&Object.entries(e).forEach(([t,n])=>{this.on(t,n)})}on=(e,t)=>(I.includes(e)&&this.events.on(e,t),this);trigger(e,t){this.events.trigger(e,t)}sendDTMF(){this.trigger("newDTMF",{originator:this.originator})}async startPresentation(e){return this.trigger("presentation:start",e),this.trigger("presentation:started",e),e}async stopPresentation(e){return this.trigger("presentation:end",e),this.trigger("presentation:ended",e),e}isEstablished(){return!0}}class A{stats=new Map().set("codec",{mimeType:"video/h264"});dtmf=null;track=null;transport=null;transform=null;parameters={encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}};parametersGets;constructor({track:e}={}){this.track=e??null}async getStats(){return this.stats}async replaceTrack(e){this.track=e??null}async setParameters(e){if(e!==this.parametersGets)throw new Error("Failed to execute 'setParameters' on 'RTCRtpSender': Read-only field modified in setParameters().");const{transactionId:t}=this.parameters;this.parameters={...this.parameters,...e,transactionId:`${Number(t)+1}`}}getParameters(){return this.parametersGets={...this.parameters},this.parametersGets}setStreams(){throw new Error("Method not implemented.")}}class M{currentDirection="sendrecv";direction="sendrecv";mid=null;receiver;sender;stopped=!1;constructor(e){this.sender=e}setCodecPreferences(e){}stop(){}}class ot extends EventTarget{senders=[];receivers=[];canTrickleIceCandidates;connectionState="new";currentLocalDescription;currentRemoteDescription;iceConnectionState;iceGatheringState;idpErrorInfo;idpLoginUrl;localDescription;onconnectionstatechange;ondatachannel;onicecandidate;onicecandidateerror=null;oniceconnectionstatechange;onicegatheringstatechange;onnegotiationneeded;onsignalingstatechange;ontrack;peerIdentity=void 0;pendingLocalDescription;pendingRemoteDescription;remoteDescription;sctp=null;signalingState="stable";close=jest.fn();setLocalDescription=jest.fn(async e=>{this.signalingState=e.type==="rollback"?"stable":"have-local-offer",this.dispatchEvent(new Event("signalingstatechange"))});setRemoteDescription=jest.fn(async e=>{this.signalingState="stable",this.connectionState="connected",this.dispatchEvent(new Event("signalingstatechange")),this.dispatchEvent(new Event("connectionstatechange"))});addTransceiver=jest.fn((e,t)=>({}));createOffer=jest.fn(async(e,t,n)=>({type:"offer",sdp:"offer-sdp"}));constructor(e,t){super(),this.receivers=t?.map(n=>({track:n}))??[]}getRemoteStreams(){throw new Error("Method not implemented.")}async addIceCandidate(e){throw new Error("Method not implemented.")}restartIce(){throw new Error("Method not implemented.")}async createAnswer(e,t){throw new Error("Method not implemented.")}createDataChannel(e,t){throw new Error("Method not implemented.")}getConfiguration(){throw new Error("Method not implemented.")}async getIdentityAssertion(){throw new Error("Method not implemented.")}async getStats(e){throw new Error("Method not implemented.")}getTransceivers(){throw new Error("Method not implemented.")}removeTrack(e){throw new Error("Method not implemented.")}setConfiguration(e){throw new Error("Method not implemented.")}getReceivers=()=>this.receivers;getSenders=()=>this.senders;addTrack=(e,...t)=>{const n=new A({track:e}),o=new M(n);return o.mid=e.kind==="audio"?"0":"1",this.senders.push(n),this.dispatchTrackInternal(e,...t),n};addTrackWithMid=(e,t)=>{const n=new A({track:e}),o=new M(n);return t===void 0?o.mid=e.kind==="audio"?"0":"1":o.mid=t,this.senders.push(n),this.dispatchTrackInternal(e),n};dispatchTrack(e){this.dispatchTrackInternal(new T.MediaStreamTrackMock(e))}dispatchTrackInternal(e,...t){const n=new Event("track");Object.defineProperty(n,"track",{value:e}),Object.defineProperty(n,"streams",{value:t.length===0?[new MediaStream([e])]:t}),this.dispatchEvent(n)}}function it(r){const e=r.match(/(purgatory)|[\d.]+/g);if(!e)throw new Error("wrong sip url");return e[0]}const O=400,F="777",st=r=>r.getVideoTracks().length>0;class s extends rt{static presentationError;static startPresentationError;static countStartPresentationError=Number.POSITIVE_INFINITY;static countStartsPresentation=0;url;status_code;renegotiate=jest.fn(async()=>!0);answer=jest.fn(({mediaStream:e})=>{if(this.originator!=="remote")throw new Error("answer available only for remote sessions");this.initPeerconnection(e),setTimeout(()=>{this.trigger("connecting"),setTimeout(()=>{this.trigger("accepted")},100),setTimeout(()=>{this.trigger("confirmed")},200)},O)});replaceMediaStream=jest.fn(async e=>{});_isReadyToReOffer=jest.fn(()=>!0);restartIce=jest.fn(async e=>!0);isEndedInner=!1;delayStartPresentation=0;timeoutStartPresentation;timeoutConnect;timeoutNewInfo;timeoutAccepted;timeoutConfirmed;constructor({eventHandlers:e,originator:t,remoteIdentity:n=new a.NameAddrHeader(new a.URI("sip","caller1","test1.com",5060),"Test Caller 1"),delayStartPresentation:o=0}){super({originator:t,eventHandlers:e,remoteIdentity:n}),this.delayStartPresentation=o}static get C(){return a.SessionStatus}static setPresentationError(e){this.presentationError=e}static resetPresentationError(){this.presentationError=void 0}static setStartPresentationError(e,{count:t=Number.POSITIVE_INFINITY}={}){this.startPresentationError=e,this.countStartPresentationError=t}static resetStartPresentationError(){this.startPresentationError=void 0,this.countStartPresentationError=Number.POSITIVE_INFINITY,this.countStartsPresentation=0}startPresentation=async e=>(s.countStartsPresentation+=1,new Promise((t,n)=>{this.timeoutStartPresentation=setTimeout(()=>{if(s.presentationError){this.trigger("presentation:start",e),this.trigger("presentation:failed",e),n(s.presentationError);return}if(s.startPresentationError&&s.countStartsPresentation<s.countStartPresentationError){this.trigger("presentation:start",e),this.trigger("presentation:failed",e),n(s.startPresentationError);return}t(super.startPresentation(e))},this.delayStartPresentation)}));stopPresentation=async e=>{if(s.presentationError)throw this.trigger("presentation:end",e),this.trigger("presentation:failed",e),s.presentationError;return super.stopPresentation(e)};initPeerconnection(e){return e?(this.createPeerconnection(e),!0):!1}createPeerconnection(e){const t=T.createAudioMediaStreamTrackMock();t.id="mainaudio1";const n=[t];if(st(e)){const c=T.createVideoMediaStreamTrackMock();c.id="mainvideo1",n.push(c)}this.connection=new ot(void 0,n),this.trigger("peerconnection",{peerconnection:this.connection}),this.addStream(e)}connect(e,{mediaStream:t}={}){const n=it(e);return this.initPeerconnection(t),this.timeoutConnect=setTimeout(()=>{e.includes(F)?this.trigger("failed",{originator:"remote",message:"IncomingResponse",cause:"Rejected"}):(this.trigger("connecting"),this.timeoutNewInfo=setTimeout(()=>{this.newInfo({originator:m.Originator.REMOTE,request:{getHeader:o=>o==="content-type"?"application/vinteo.webrtc.roomname":o==="x-webrtc-enter-room"?n:o==="x-webrtc-participant-name"?"Test Caller 1":""}})},100),this.timeoutAccepted=setTimeout(()=>{this.trigger("accepted")},200),this.timeoutConfirmed=setTimeout(()=>{this.trigger("confirmed")},300))},O),this.connection}terminate({status_code:e,cause:t}={}){return this.status_code=e,this.trigger("ended",{status_code:e,cause:t,originator:"local"}),this.isEndedInner=!1,this}async terminateAsync({status_code:e,cause:t}={}){this.terminate({status_code:e,cause:t})}terminateRemote({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e,originator:"remote"}),this}addStream(e,t="getTracks"){e[t]().forEach(n=>this.connection.addTrack(n,e))}forEachSenders(e){const t=this.connection.getSenders();for(const n of t)e(n);return t}toggleMuteAudio(e){this.forEachSenders(({track:t})=>{t?.kind==="audio"&&(t.enabled=!e)})}toggleMuteVideo(e){this.forEachSenders(({track:t})=>{t?.kind==="video"&&(t.enabled=!e)})}mute(e){e.audio&&(this.mutedOptions.audio=!0,this.toggleMuteAudio(this.mutedOptions.audio)),e.video&&(this.mutedOptions.video=!0,this.toggleMuteVideo(this.mutedOptions.video)),this.onmute(e)}unmute(e){e.audio&&(this.mutedOptions.audio=!1),e.video&&(this.mutedOptions.video=!1),this.trigger("unmuted",e)}isMuted(){return this.mutedOptions}onmute({audio:e,video:t}){this.trigger("muted",{audio:e,video:t})}async sendInfo(){}isEnded(){return this.isEndedInner}newInfo(e){this.trigger("newInfo",e)}clear(){clearTimeout(this.timeoutStartPresentation),clearTimeout(this.timeoutConnect),clearTimeout(this.timeoutNewInfo),clearTimeout(this.timeoutAccepted),clearTimeout(this.timeoutConfirmed)}}class at{extraHeaders=[];setExtraHeaders(e){this.extraHeaders=e}setExtraContactParams(){}}const ct=m.resolveDebug("UA.mock"),d="PASSWORD_CORRECT",S="PASSWORD_CORRECT_2",k="NAME_INCORRECT",u=400,_={url:"wss://sipServerUrl/webrtc/wss/",sip_uri:"sip:sipServerUrl;transport=ws",via_transport:"WSS"},P={status_code:200,reason_phrase:"OK"},v={status_code:401,reason_phrase:"Unauthorized"};class i extends D.EventEmitter{static isAvailableTelephony=!0;static startError;static countStartError=Number.POSITIVE_INFINITY;static countStarts=0;events;registratorInner;call=jest.fn((e,t)=>{const{mediaStream:n,eventHandlers:o}=t;return this.session=new s({eventHandlers:o,originator:"local"}),this.session.connect(e,{mediaStream:n}),this.session});sendOptions=jest.fn((e,t,n)=>{ct("sendOptions",e,t,n)});start=jest.fn(()=>{if(i.countStarts+=1,i.startError&&i.countStarts<i.countStartError){this.trigger("disconnected",i.startError);return}this.register()});stop=jest.fn(()=>{this.startedTimeout&&clearTimeout(this.startedTimeout),this.stopedTimeout&&clearTimeout(this.stopedTimeout),this.unregister(),this.isStarted()?this.stopedTimeout=setTimeout(()=>{this.trigger("disconnected",{error:!0,socket:_})},u):this.trigger("disconnected",{error:!0,socket:_})});removeAllListeners=jest.fn(()=>(this.events.removeEventHandlers(),this));once=jest.fn((e,t)=>(this.events.once(e,t),this));configuration;startedTimeout;stopedTimeout;session;isRegisteredInner;isConnectedInner;constructor(e){super(),this.events=new y.Events(b);const[t,n]=e.uri.split(":"),[o,c]=n.split("@"),g={...e,uri:new a.URI(t,o,c)};this.configuration=g,this.registratorInner=new at}get C(){throw new Error("Method not implemented.")}get status(){throw new Error("Method not implemented.")}get contact(){throw new Error("Method not implemented.")}get transport(){throw new Error("Method not implemented.")}static C(){throw new Error("Method not implemented.")}static setStartError(e,{count:t=Number.POSITIVE_INFINITY}={}){i.startError=e,i.countStartError=t}static resetStartError(){i.startError=void 0,i.countStartError=Number.POSITIVE_INFINITY,i.countStarts=0}static setAvailableTelephony(){i.isAvailableTelephony=!0}static setNotAvailableTelephony(){i.isAvailableTelephony=!1}static reset(){i.resetStartError(),i.setAvailableTelephony()}on(e,t){return this.events.on(e,t),this}sendMessage(){throw new Error("Method not implemented.")}normalizeTarget(){throw new Error("Method not implemented.")}get(){throw new Error("Method not implemented.")}off(e,t){return this.events.off(e,t),this}trigger(e,t){this.events.trigger(e,t)}terminateSessions(){this.session?.terminate()}set(e,t){return this.configuration[e]=t,!0}register(){this.startedTimeout&&clearTimeout(this.startedTimeout);const{password:e,register:t,uri:n}=this.configuration;t===!0&&n.user.includes(k)?(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:v,cause:a.C.causes.REJECTED})},u)):!this.isRegistered()&&t===!0&&(e===d||e===S)?(this.isRegisteredInner=!0,this.startedTimeout=setTimeout(()=>{this.trigger("registered",{response:P})},u)):t===!0&&e!==d&&e!==S&&(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:v,cause:a.C.causes.REJECTED})},u)),i.isAvailableTelephony?(this.trigger("connected",{socket:_}),this.isConnectedInner=!0):this.stop()}unregister(){this.isRegisteredInner=!1,this.isConnectedInner=!1,this.trigger("unregistered",{response:P})}isRegistered(){return this.isRegisteredInner===!0}isConnected(){return this.isConnectedInner===!0}isStarted(){return this.configuration.register===!0&&this.isRegisteredInner===!0||this.configuration.register!==!0&&this.isConnectedInner===!0}newSipEvent(e){this.trigger("sipEvent",e)}registrator(){return this.registratorInner}}class dt{url;constructor(e){this.url=e}}class ht extends D.EventEmitter{contentType;body;constructor(e,t){super(),this.contentType=e,this.body=t}}const w="remote",Et=(r,e)=>{const t=new N(e),n={originator:w,request:t,info:new ht("","")};r.newInfo(n)},ut=(r,e)=>{const n={event:"sipEvent",request:new N(e)};r.newSipEvent(n)},mt=(r,{incomingNumber:e="1234",displayName:t,host:n})=>{const o=new s({originator:w,eventHandlers:{}}),c=new a.URI("sip",e,n);o.remote_identity=new a.NameAddrHeader(c,t);const g=new N([]);r.trigger("newRTCSession",{originator:w,session:o,request:g})},lt=(r,e)=>{e?r.trigger("failed",e):r.trigger("failed",r)},C={triggerNewInfo:Et,triggerNewSipEvent:ut,triggerIncomingSession:mt,triggerFailIncomingSession:lt,WebSocketInterface:dt,UA:i,C:{INVITE:"INVITE"}},h="user",E="displayName",l="SIP_SERVER_URL",f="SIP_WEB_SOCKET_SERVER_URL",pt=new C.WebSocketInterface(`wss://${f}/webrtc/wss/`),R={displayName:"DISPLAY_NAME",userAgent:"Chrome",sipServerIp:l,sipServerUrl:f},gt={...R,displayName:"DISPLAY_NAME",register:!1},W={...R,user:h,password:d,register:!0,authorizationUser:h},_t={...W,displayName:E},Tt={...R,displayName:E,authorizationUser:h,register:!1},p={session_timers:!1,sockets:[pt],user_agent:"Chrome",sdpSemantics:"unified-plan",register_expires:300,connection_recovery_max_interval:6,connection_recovery_min_interval:2},It={...p,password:d,uri:new a.URI("sip",h,l),display_name:"DISPLAY_NAME",register:!0},St={...p,password:d,uri:new a.URI("sip",h,l),display_name:E,register:!0},wt={...p,display_name:E,register:!1},Nt={...p,display_name:"DISPLAY_NAME",register:!1},V="10.10.10.10",Ct=[`X-Vinteo-Remote: ${V}`],ft=()=>new m.SipConnector({JsSIP:C});exports.FAILED_CONFERENCE_NUMBER=F;exports.JsSIP=C;exports.NAME_INCORRECT=k;exports.PASSWORD_CORRECT=d;exports.PASSWORD_CORRECT_2=S;exports.SIP_SERVER_URL=l;exports.SIP_WEB_SOCKET_SERVER_URL=f;exports.dataForConnectionWithAuthorization=W;exports.dataForConnectionWithAuthorizationWithDisplayName=_t;exports.dataForConnectionWithoutAuthorization=Tt;exports.dataForConnectionWithoutAuthorizationWithoutDisplayName=gt;exports.displayName=E;exports.doMockSipConnector=ft;exports.extraHeadersRemoteAddress=Ct;exports.remoteAddress=V;exports.uaConfigurationWithAuthorization=It;exports.uaConfigurationWithAuthorizationWithDisplayName=St;exports.uaConfigurationWithoutAuthorization=wt;exports.uaConfigurationWithoutAuthorizationWithoutDisplayName=Nt;exports.user=h;
package/dist/doMock.js CHANGED
@@ -2,7 +2,7 @@ import { EventEmitter as O } from "node:events";
2
2
  import { IncomingRequest as F, NameAddrHeader as P, URI as h, SessionStatus as V, C as S } from "@krivega/jssip";
3
3
  import { MediaStreamTrackMock as W, createAudioMediaStreamTrackMock as U, createVideoMediaStreamTrackMock as j } from "webrtc-mock";
4
4
  import { Events as v } from "events-constructor";
5
- import { n as D, O as G, S as x } from "./@SipConnector-BFt0K6Oz.js";
5
+ import { n as D, O as G, S as x } from "./@SipConnector-DRUXzP_d.js";
6
6
  class _ extends F {
7
7
  headers;
8
8
  constructor(e) {
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./@SipConnector-PAReth0T.cjs");require("events-constructor");require("@krivega/jssip");require("ua-parser-js");const x=require("sequent-promises"),q=require("repeated-calls"),G=require("@krivega/cancelable-promise"),W=require("ts-debounce"),Y=require("stack-promises"),D=t=>{const{url:e,cause:o}=t;let r=e;return(o===n.ECallCause.BAD_MEDIA_DESCRIPTION||o===n.ECallCause.NOT_FOUND)&&(r=`${t.message.to.uri.user}@${t.message.to.uri.host}`),r};var k=(t=>(t.CONNECT_SERVER_FAILED="CONNECT_SERVER_FAILED",t.WRONG_USER_OR_PASSWORD="WRONG_USER_OR_PASSWORD",t.BAD_MEDIA_ERROR="BAD_MEDIA_ERROR",t.NOT_FOUND_ERROR="NOT_FOUND_ERROR",t.WS_CONNECTION_FAILED="WS_CONNECTION_FAILED",t.CONNECT_SERVER_FAILED_BY_LINK="CONNECT_SERVER_FAILED_BY_LINK",t))(k||{});const H=new Error("Unknown error"),j=(t=H)=>{const{cause:e,socket:o}=t;let r="CONNECT_SERVER_FAILED";switch(e){case"Forbidden":{r="WRONG_USER_OR_PASSWORD";break}case n.ECallCause.BAD_MEDIA_DESCRIPTION:{r="BAD_MEDIA_ERROR";break}case n.ECallCause.NOT_FOUND:{r="NOT_FOUND_ERROR";break}default:o!==void 0&&o._ws?.readyState===3?r="WS_CONNECTION_FAILED":D(t)!==void 0&&D(t)!==""&&(r="CONNECT_SERVER_FAILED_BY_LINK")}return r},K=new Error("Unknown error"),X=(t=K)=>{const{code:e,cause:o,message:r}=t,c=D(t),a={code:"",cause:"",message:""};return typeof r=="object"&&r!==null?a.message=n.stringifyMessage(r):r&&(a.message=String(r)),c!==void 0&&c!==""&&(a.link=c),e!==void 0&&e!==""&&(a.code=e),o!==void 0&&o!==""&&(a.cause=o),a},z=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:k,getLinkError:D,getTypeFromError:j,getValuesFromError:X},Symbol.toStringTag,{value:"Module"})),J=({sessionId:t,remoteAddress:e,isMutedAudio:o,isMutedVideo:r,isRegistered:c,isPresentationCall:a})=>{const i=[],l=o?"0":"1",S=r?"0":"1";return i.push(`X-Vinteo-Mic-State: ${l}`,`X-Vinteo-MainCam-State: ${S}`),(c===!1||c===void 0)&&i.push("X-Vinteo-Purgatory-Call: yes"),t!==void 0&&t!==""&&i.push(`X-Vinteo-Session: ${t}`),a===!0&&i.push("X-Vinteo-Presentation-Call: yes"),e!==void 0&&e!==""&&i.push(`X-Vinteo-Remote: ${e}`),i},Q="[@*!|]",Z="_",ee=t=>{let e=t;return e=e.replaceAll(new RegExp(Q,"g"),Z),e},te=({appName:t,appVersion:e,browserName:o,browserVersion:r})=>{const a=`${ee(t)} ${e}`;return`ChromeNew - ${o===void 0?a:`${o} ${r}, ${a}`}`},ne=({isUnifiedSdpSemantic:t,appVersion:e,browserName:o,browserVersion:r,appName:c})=>t?te({appVersion:e,browserName:o,browserVersion:r,appName:c}):"Chrome",oe=t=>e=>[...e].map(r=>async()=>t(r)),re=async({accumulatedKeys:t,sendKey:e,canRunTask:o})=>{const c=oe(e)(t);return x.sequentPromises(c,o)},se=({sipConnector:t})=>{const e=(C,d)=>({isSyncForced:f})=>{if(f===!0){C();return}d()},o=n.resolveOnStartMainCam(t),r=n.resolveOnStopMainCam(t),c=n.resolveOnStartMic(t),a=n.resolveOnStopMic(t);let i,l,S,R;const g=({onStartMainCamForced:C,onStartMainCamNotForced:d,onStopMainCamForced:f,onStopMainCamNotForced:p,onStartMicForced:h,onStartMicNotForced:I,onStopMicForced:A,onStopMicNotForced:b})=>{const m=e(C,d);i=o(m);const T=e(f,p);l=r(T);const M=e(h,I);S=c(M);const N=e(A,b);R=a(N)},_=()=>{i?.(),l?.(),S?.(),R?.()};return{start:C=>{g(C)},stop:()=>{_()}}},ae=Object.freeze(Object.defineProperty({__proto__:null,DeferredCommandRunner:n.DeferredCommandRunner,PURGATORY_CONFERENCE_NUMBER:n.PURGATORY_CONFERENCE_NUMBER,createSyncMediaState:se,createUaParser:n.createUaParser,error:z,getExtraHeaders:J,getUserAgent:ne,hasPeerToPeer:n.hasPeerToPeer,hasPurgatory:n.hasPurgatory,prepareMediaStream:n.prepareMediaStream,sendDtmfAccumulated:re,sendOffer:n.sendOffer,setEncodingsToSender:n.setEncodingsToSender,setParametersToSender:n.setParametersToSender},Symbol.toStringTag,{value:"Module"})),ce=t=>t instanceof Object&&("originator"in t||"cause"in t),ie=t=>{if(G.isCanceledError(t))return!0;if(!ce(t))return!1;const{originator:e,cause:o}=t;return typeof o=="string"?o===n.ECallCause.REQUEST_TIMEOUT||o===n.ECallCause.REJECTED||e==="local"&&(o===n.ECallCause.CANCELED||o===n.ECallCause.BYE):!1};var E=(t=>(t.DISCONNECTED="system:disconnected",t.DISCONNECTING="system:disconnecting",t.CONNECTING="system:connecting",t.READY_TO_CALL="system:readyToCall",t.CALL_CONNECTING="system:callConnecting",t.CALL_DISCONNECTING="system:callDisconnecting",t.CALL_ACTIVE="system:callActive",t))(E||{});const V=t=>t.connection.value,B=t=>t.autoConnector.value,ue=t=>t.call,L=t=>t.call.value,le=t=>t.incoming.value,Ce=t=>{if(t.incoming.value!==n.EState$3.IDLE)return t.incoming.context.remoteCallerData},Ee=t=>t.presentation.value,Se=t=>{const e=L(t);return e===n.EState.IN_ROOM||e===n.EState.ROOM_PENDING_AUTH||e===n.EState.PURGATORY||e===n.EState.P2P_ROOM||e===n.EState.DIRECT_P2P_ROOM||e===n.EState.PRESENTATION_CALL},de=t=>{const e=L(t);if(e===n.EState.IN_ROOM||e===n.EState.ROOM_PENDING_AUTH||e===n.EState.PURGATORY||e===n.EState.P2P_ROOM||e===n.EState.DIRECT_P2P_ROOM||e===n.EState.PRESENTATION_CALL)return E.CALL_ACTIVE;const o=V(t),r=B(t);if(o===n.EState$1.DISCONNECTING||r===n.EState$2.DISCONNECTING)return E.DISCONNECTING;if(r===n.EState$2.ATTEMPTING_CONNECT||r===n.EState$2.ATTEMPTING_GATE||r===n.EState$2.WAITING_BEFORE_RETRY||r===n.EState$2.CONNECTED_MONITORING&&o!==n.EState$1.ESTABLISHED)return E.CONNECTING;if(o===n.EState$1.IDLE||o===n.EState$1.DISCONNECTED)return E.DISCONNECTED;if(o===n.EState$1.PREPARING||o===n.EState$1.CONNECTING||o===n.EState$1.CONNECTED||o===n.EState$1.REGISTERED)return E.CONNECTING;switch(e){case n.EState.IDLE:return E.READY_TO_CALL;case n.EState.CONNECTING:return E.CALL_CONNECTING;case n.EState.DISCONNECTING:return E.CALL_DISCONNECTING;default:return E.READY_TO_CALL}},fe={selectConnectionStatus:V,selectAutoConnectorStatus:B,selectCallState:ue,selectCallStatus:L,selectIncomingStatus:le,selectIncomingRemoteCaller:Ce,selectPresentationStatus:Ee,selectIsInCall:Se,selectSystemStatus:de},me=()=>n.createUaParser().isChrome,s=n.resolveDebug("SipConnectorFacade"),Te=t=>{if(!G.isCanceledError(t)&&!q.hasCanceledError(t)&&!n.hasNotReadyForConnectionError(t))throw t;return{configuration:void 0,isSuccessful:!1}},Ne=({kind:t,readyState:e})=>t==="video"&&e==="live",U=(t,e,{onEnterPurgatory:o,onEnterConference:r})=>{n.hasPurgatory(t)?o&&o():r&&r({isSuccessProgressCall:e})},$=(t,e)=>{t(),e&&e()},w=(t,e,o)=>{throw t&&t(),e(),o},Re=new Set(["on","once","onceRace","wait","off","sendDTMF","hangUp","declineToIncomingCall","sendChannels","checkTelephony","waitChannels","ping","startAutoConnect","stopAutoConnect","connection","isConfigured","isRegistered"]);class Oe{on;once;onceRace;wait;off;sendDTMF;hangUp;declineToIncomingCall;sendChannels;checkTelephony;waitChannels;ping;startAutoConnect;stopAutoConnect;connection;isConfigured;isRegistered;sipConnector;constructor(e){return this.sipConnector=e,new Proxy(this,{get:(o,r,c)=>{if(typeof r=="string"&&Re.has(r)&&r in this.sipConnector){const i=Reflect.get(this.sipConnector,r,this.sipConnector);return typeof i=="function"?i.bind(this.sipConnector):i}const a=Reflect.get(o,r,c);return typeof a=="function"?a.bind(o):a}})}connectToServer=async(e,o)=>this.sipConnector.connect(e,o).then(r=>(s("connectToServer then"),{configuration:r,isSuccessful:!0})).catch(async r=>(s("connectToServer catch: error",r),Te(r)));callToServer=async e=>{const{conference:o,mediaStream:r,extraHeaders:c,iceServers:a,contentHint:i,degradationPreference:l,sendEncodings:S,offerToReceiveAudio:R,offerToReceiveVideo:g,directionVideo:_,directionAudio:P,onBeforeProgressCall:O,onSuccessProgressCall:C,onEnterPurgatory:d,onEnterConference:f,onFailProgressCall:p,onFinishProgressCall:h,onEndedCall:I,onAddedTransceiver:A}=e;s("callToServer",e);const b=async()=>(s("startCall"),this.sipConnector.call({mediaStream:r,extraHeaders:c,iceServers:a,contentHint:i,offerToReceiveAudio:R,offerToReceiveVideo:g,directionVideo:_,directionAudio:P,degradationPreference:l,onAddedTransceiver:A,sendEncodings:S,number:o}));let m=!1,T;const N=(s("subscribeEnterConference: onEnterConference",f),this.sipConnector.on("api:enter-room",({room:u})=>{s("enterRoom",{_room:u,isSuccessProgressCall:m}),T=u,(d??f)&&U(T,m,{onEnterPurgatory:d,onEnterConference:f})})),y=u=>(s("onSuccess"),m=!0,C&&C({isPurgatory:n.hasPurgatory(T)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{$(N,I)}),u),v=u=>(s("onFail"),w(p,N,u)),F=()=>{s("onFinish"),h&&h()};return s("onBeforeProgressCall"),O&&O(o),b().then(y).catch(u=>v(u)).finally(F)};disconnectFromServer=async()=>this.sipConnector.disconnect().then(()=>(s("disconnectFromServer: then"),{isSuccessful:!0})).catch(e=>(s("disconnectFromServer: catch",e),{isSuccessful:!1}));answerToIncomingCall=async e=>{const{mediaStream:o,extraHeaders:r,iceServers:c,contentHint:a,degradationPreference:i,sendEncodings:l,offerToReceiveAudio:S,offerToReceiveVideo:R,directionVideo:g,directionAudio:_,onBeforeProgressCall:P,onSuccessProgressCall:O,onEnterPurgatory:C,onEnterConference:d,onFailProgressCall:f,onFinishProgressCall:p,onEndedCall:h,onAddedTransceiver:I}=e;s("answerToIncomingCall",e);const A=async()=>this.sipConnector.answerToIncomingCall({mediaStream:o,extraHeaders:r,iceServers:c,contentHint:a,offerToReceiveAudio:S,offerToReceiveVideo:R,directionVideo:g,directionAudio:_,degradationPreference:i,onAddedTransceiver:I,sendEncodings:l}),b=()=>{const{remoteCallerData:u}=this.sipConnector;return u?.incomingNumber};let m=!1,T;const N=(s("subscribeEnterConference: onEnterConference",d),this.sipConnector.on("api:enter-room",u=>{s("enterRoom",{room:u.room,isSuccessProgressCall:m}),T=u.room,(C??d)&&U(T,m,{onEnterPurgatory:C,onEnterConference:d})})),y=u=>(s("onSuccess"),m=!0,O&&O({isPurgatory:n.hasPurgatory(T)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{$(N,h)}),u),v=u=>(s("onFail"),w(f,N,u)),F=()=>{s("onFinish"),p&&p()};if(s("onBeforeProgressCall"),P){const u=b();P(u)}return A().then(y).catch(u=>v(u)).finally(F)};updatePresentation=async({mediaStream:e,contentHint:o,degradationPreference:r,sendEncodings:c,onAddedTransceiver:a})=>(s("updatePresentation"),this.sipConnector.updatePresentation(e,{contentHint:o,degradationPreference:r,onAddedTransceiver:a,sendEncodings:c}));startPresentation=async({mediaStream:e,contentHint:o,degradationPreference:r,sendEncodings:c,callLimit:a,onAddedTransceiver:i})=>(s("startPresentation"),this.sipConnector.startPresentation(e,{contentHint:o,callLimit:a,degradationPreference:r,onAddedTransceiver:i,sendEncodings:c}));stopPresentation=async()=>(s("stopPresentation"),this.sipConnector.stopPresentation().catch(e=>{s(e)}));sendRefusalToTurnOnMic=async()=>{s("sendRefusalToTurnOnMic"),await this.sipConnector.sendRefusalToTurnOnMic().catch(e=>{s("sendRefusalToTurnOnMic: error",e)})};sendRefusalToTurnOnCam=async()=>{s("sendRefusalToTurnOnCam"),await this.sipConnector.sendRefusalToTurnOnCam().catch(e=>{s("sendRefusalToTurnOnCam: error",e)})};sendMediaState=async({isEnabledCam:e,isEnabledMic:o})=>{s("sendMediaState"),await this.sipConnector.sendMediaState({cam:e,mic:o})};replaceMediaStream=async(e,{deleteExisting:o,addMissing:r,forceRenegotiation:c,contentHint:a,degradationPreference:i,sendEncodings:l,onAddedTransceiver:S})=>(s("replaceMediaStream"),this.sipConnector.replaceMediaStream(e,{deleteExisting:o,addMissing:r,forceRenegotiation:c,contentHint:a,degradationPreference:i,onAddedTransceiver:S,sendEncodings:l}));askPermissionToEnableCam=async()=>{s("askPermissionToEnableCam"),await this.sipConnector.askPermissionToEnableCam()};resolveHandleReadyRemoteStreamsDebounced=({onReadyRemoteStreams:e})=>W.debounce(()=>{const o=this.sipConnector.getRemoteStreams();s("remoteStreams",o),e(o)},200);resolveHandleReadyRemoteStreams=({onReadyRemoteStreams:e})=>({track:o})=>{Ne(o)&&e()};getRemoteStreams=()=>(s("getRemoteStreams"),this.sipConnector.getRemoteStreams());onUseLicense=e=>(s("onUseLicense"),this.sipConnector.on("api:use-license",e));onMustStopPresentation=e=>(s("onMustStopPresentation"),this.sipConnector.on("api:presentation:must-stop",e));onMoveToSpectators=e=>(s("onMoveToSpectators"),this.sipConnector.on("api:participant:move-request-to-spectators",e));onMoveToParticipants=e=>(s("onMoveToParticipants"),this.sipConnector.on("api:participant:move-request-to-participants",e));onStats=e=>(s("onStats"),this.sipConnector.on("stats:collected",e));offStats=e=>{s("offStats"),this.sipConnector.off("stats:collected",e)}}exports.ECallCause=n.ECallCause;exports.ECallStatus=n.EState;exports.EConnectionStatus=n.EState$1;exports.EContentUseLicense=n.EContentUseLicense;exports.EIncomingStatus=n.EState$3;exports.EMimeTypesVideoCodecs=n.EMimeTypesVideoCodecs;exports.EPresentationStatus=n.EState$4;exports.EStatsTypes=n.EStatsTypes;exports.SipConnector=n.SipConnector;exports.StatsPeerConnection=n.StatsPeerConnection;exports.disableDebug=n.disableDebug;exports.enableDebug=n.enableDebug;exports.getCodecFromSender=n.getCodecFromSender;exports.hasCanceledStartPresentationError=n.hasCanceledStartPresentationError;Object.defineProperty(exports,"hasConnectionPromiseIsNotActualError",{enumerable:!0,get:()=>Y.isPromiseIsNotActualError});exports.ESystemStatus=E;exports.SipConnectorFacade=Oe;exports.hasAvailableStats=me;exports.hasCanceledCallError=ie;exports.sessionSelectors=fe;exports.tools=ae;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("./@SipConnector-CrRam6ae.cjs");require("events-constructor");require("@krivega/jssip");require("ua-parser-js");const x=require("sequent-promises"),q=require("repeated-calls"),G=require("@krivega/cancelable-promise"),W=require("ts-debounce"),Y=require("stack-promises"),D=t=>{const{url:e,cause:o}=t;let r=e;return(o===n.ECallCause.BAD_MEDIA_DESCRIPTION||o===n.ECallCause.NOT_FOUND)&&(r=`${t.message.to.uri.user}@${t.message.to.uri.host}`),r};var k=(t=>(t.CONNECT_SERVER_FAILED="CONNECT_SERVER_FAILED",t.WRONG_USER_OR_PASSWORD="WRONG_USER_OR_PASSWORD",t.BAD_MEDIA_ERROR="BAD_MEDIA_ERROR",t.NOT_FOUND_ERROR="NOT_FOUND_ERROR",t.WS_CONNECTION_FAILED="WS_CONNECTION_FAILED",t.CONNECT_SERVER_FAILED_BY_LINK="CONNECT_SERVER_FAILED_BY_LINK",t))(k||{});const H=new Error("Unknown error"),j=(t=H)=>{const{cause:e,socket:o}=t;let r="CONNECT_SERVER_FAILED";switch(e){case"Forbidden":{r="WRONG_USER_OR_PASSWORD";break}case n.ECallCause.BAD_MEDIA_DESCRIPTION:{r="BAD_MEDIA_ERROR";break}case n.ECallCause.NOT_FOUND:{r="NOT_FOUND_ERROR";break}default:o!==void 0&&o._ws?.readyState===3?r="WS_CONNECTION_FAILED":D(t)!==void 0&&D(t)!==""&&(r="CONNECT_SERVER_FAILED_BY_LINK")}return r},K=new Error("Unknown error"),X=(t=K)=>{const{code:e,cause:o,message:r}=t,c=D(t),a={code:"",cause:"",message:""};return typeof r=="object"&&r!==null?a.message=n.stringifyMessage(r):r&&(a.message=String(r)),c!==void 0&&c!==""&&(a.link=c),e!==void 0&&e!==""&&(a.code=e),o!==void 0&&o!==""&&(a.cause=o),a},z=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:k,getLinkError:D,getTypeFromError:j,getValuesFromError:X},Symbol.toStringTag,{value:"Module"})),J=({sessionId:t,remoteAddress:e,isMutedAudio:o,isMutedVideo:r,isRegistered:c,isPresentationCall:a})=>{const i=[],l=o?"0":"1",S=r?"0":"1";return i.push(`X-Vinteo-Mic-State: ${l}`,`X-Vinteo-MainCam-State: ${S}`),(c===!1||c===void 0)&&i.push("X-Vinteo-Purgatory-Call: yes"),t!==void 0&&t!==""&&i.push(`X-Vinteo-Session: ${t}`),a===!0&&i.push("X-Vinteo-Presentation-Call: yes"),e!==void 0&&e!==""&&i.push(`X-Vinteo-Remote: ${e}`),i},Q="[@*!|]",Z="_",ee=t=>{let e=t;return e=e.replaceAll(new RegExp(Q,"g"),Z),e},te=({appName:t,appVersion:e,browserName:o,browserVersion:r})=>{const a=`${ee(t)} ${e}`;return`ChromeNew - ${o===void 0?a:`${o} ${r}, ${a}`}`},ne=({isUnifiedSdpSemantic:t,appVersion:e,browserName:o,browserVersion:r,appName:c})=>t?te({appVersion:e,browserName:o,browserVersion:r,appName:c}):"Chrome",oe=t=>e=>[...e].map(r=>async()=>t(r)),re=async({accumulatedKeys:t,sendKey:e,canRunTask:o})=>{const c=oe(e)(t);return x.sequentPromises(c,o)},se=({sipConnector:t})=>{const e=(C,d)=>({isSyncForced:f})=>{if(f===!0){C();return}d()},o=n.resolveOnStartMainCam(t),r=n.resolveOnStopMainCam(t),c=n.resolveOnStartMic(t),a=n.resolveOnStopMic(t);let i,l,S,R;const g=({onStartMainCamForced:C,onStartMainCamNotForced:d,onStopMainCamForced:f,onStopMainCamNotForced:p,onStartMicForced:h,onStartMicNotForced:I,onStopMicForced:A,onStopMicNotForced:b})=>{const m=e(C,d);i=o(m);const T=e(f,p);l=r(T);const M=e(h,I);S=c(M);const N=e(A,b);R=a(N)},_=()=>{i?.(),l?.(),S?.(),R?.()};return{start:C=>{g(C)},stop:()=>{_()}}},ae=Object.freeze(Object.defineProperty({__proto__:null,DeferredCommandRunner:n.DeferredCommandRunner,PURGATORY_CONFERENCE_NUMBER:n.PURGATORY_CONFERENCE_NUMBER,createSyncMediaState:se,createUaParser:n.createUaParser,error:z,getExtraHeaders:J,getUserAgent:ne,hasPeerToPeer:n.hasPeerToPeer,hasPurgatory:n.hasPurgatory,prepareMediaStream:n.prepareMediaStream,sendDtmfAccumulated:re,sendOffer:n.sendOffer,setEncodingsToSender:n.setEncodingsToSender,setParametersToSender:n.setParametersToSender},Symbol.toStringTag,{value:"Module"})),ce=t=>t instanceof Object&&("originator"in t||"cause"in t),ie=t=>{if(G.isCanceledError(t))return!0;if(!ce(t))return!1;const{originator:e,cause:o}=t;return typeof o=="string"?o===n.ECallCause.REQUEST_TIMEOUT||o===n.ECallCause.REJECTED||e==="local"&&(o===n.ECallCause.CANCELED||o===n.ECallCause.BYE):!1};var E=(t=>(t.DISCONNECTED="system:disconnected",t.DISCONNECTING="system:disconnecting",t.CONNECTING="system:connecting",t.READY_TO_CALL="system:readyToCall",t.CALL_CONNECTING="system:callConnecting",t.CALL_DISCONNECTING="system:callDisconnecting",t.CALL_ACTIVE="system:callActive",t))(E||{});const V=t=>t.connection.value,B=t=>t.autoConnector.value,ue=t=>t.call,L=t=>t.call.value,le=t=>t.incoming.value,Ce=t=>{if(t.incoming.value!==n.EState$3.IDLE)return t.incoming.context.remoteCallerData},Ee=t=>t.presentation.value,Se=t=>{const e=L(t);return e===n.EState.IN_ROOM||e===n.EState.ROOM_PENDING_AUTH||e===n.EState.PURGATORY||e===n.EState.P2P_ROOM||e===n.EState.DIRECT_P2P_ROOM||e===n.EState.PRESENTATION_CALL},de=t=>{const e=L(t);if(e===n.EState.IN_ROOM||e===n.EState.ROOM_PENDING_AUTH||e===n.EState.PURGATORY||e===n.EState.P2P_ROOM||e===n.EState.DIRECT_P2P_ROOM||e===n.EState.PRESENTATION_CALL)return E.CALL_ACTIVE;const o=V(t),r=B(t);if(o===n.EState$1.DISCONNECTING||r===n.EState$2.DISCONNECTING)return E.DISCONNECTING;if(r===n.EState$2.ATTEMPTING_CONNECT||r===n.EState$2.ATTEMPTING_GATE||r===n.EState$2.WAITING_BEFORE_RETRY||r===n.EState$2.CONNECTED_MONITORING&&o!==n.EState$1.ESTABLISHED)return E.CONNECTING;if(o===n.EState$1.IDLE||o===n.EState$1.DISCONNECTED)return E.DISCONNECTED;if(o===n.EState$1.PREPARING||o===n.EState$1.CONNECTING||o===n.EState$1.CONNECTED||o===n.EState$1.REGISTERED)return E.CONNECTING;switch(e){case n.EState.IDLE:return E.READY_TO_CALL;case n.EState.CONNECTING:return E.CALL_CONNECTING;case n.EState.DISCONNECTING:return E.CALL_DISCONNECTING;default:return E.READY_TO_CALL}},fe={selectConnectionStatus:V,selectAutoConnectorStatus:B,selectCallState:ue,selectCallStatus:L,selectIncomingStatus:le,selectIncomingRemoteCaller:Ce,selectPresentationStatus:Ee,selectIsInCall:Se,selectSystemStatus:de},me=()=>n.createUaParser().isChrome,s=n.resolveDebug("SipConnectorFacade"),Te=t=>{if(!G.isCanceledError(t)&&!q.hasCanceledError(t)&&!n.hasNotReadyForConnectionError(t))throw t;return{configuration:void 0,isSuccessful:!1}},Ne=({kind:t,readyState:e})=>t==="video"&&e==="live",U=(t,e,{onEnterPurgatory:o,onEnterConference:r})=>{n.hasPurgatory(t)?o&&o():r&&r({isSuccessProgressCall:e})},$=(t,e)=>{t(),e&&e()},w=(t,e,o)=>{throw t&&t(),e(),o},Re=new Set(["on","once","onceRace","wait","off","sendDTMF","hangUp","declineToIncomingCall","sendChannels","checkTelephony","waitChannels","ping","startAutoConnect","stopAutoConnect","connection","isConfigured","isRegistered"]);class Oe{on;once;onceRace;wait;off;sendDTMF;hangUp;declineToIncomingCall;sendChannels;checkTelephony;waitChannels;ping;startAutoConnect;stopAutoConnect;connection;isConfigured;isRegistered;sipConnector;constructor(e){return this.sipConnector=e,new Proxy(this,{get:(o,r,c)=>{if(typeof r=="string"&&Re.has(r)&&r in this.sipConnector){const i=Reflect.get(this.sipConnector,r,this.sipConnector);return typeof i=="function"?i.bind(this.sipConnector):i}const a=Reflect.get(o,r,c);return typeof a=="function"?a.bind(o):a}})}connectToServer=async(e,o)=>this.sipConnector.connect(e,o).then(r=>(s("connectToServer then"),{configuration:r,isSuccessful:!0})).catch(async r=>(s("connectToServer catch: error",r),Te(r)));callToServer=async e=>{const{conference:o,mediaStream:r,extraHeaders:c,iceServers:a,contentHint:i,degradationPreference:l,sendEncodings:S,offerToReceiveAudio:R,offerToReceiveVideo:g,directionVideo:_,directionAudio:P,onBeforeProgressCall:O,onSuccessProgressCall:C,onEnterPurgatory:d,onEnterConference:f,onFailProgressCall:p,onFinishProgressCall:h,onEndedCall:I,onAddedTransceiver:A}=e;s("callToServer",e);const b=async()=>(s("startCall"),this.sipConnector.call({mediaStream:r,extraHeaders:c,iceServers:a,contentHint:i,offerToReceiveAudio:R,offerToReceiveVideo:g,directionVideo:_,directionAudio:P,degradationPreference:l,onAddedTransceiver:A,sendEncodings:S,number:o}));let m=!1,T;const N=(s("subscribeEnterConference: onEnterConference",f),this.sipConnector.on("api:enter-room",({room:u})=>{s("enterRoom",{_room:u,isSuccessProgressCall:m}),T=u,(d??f)&&U(T,m,{onEnterPurgatory:d,onEnterConference:f})})),y=u=>(s("onSuccess"),m=!0,C&&C({isPurgatory:n.hasPurgatory(T)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{$(N,I)}),u),v=u=>(s("onFail"),w(p,N,u)),F=()=>{s("onFinish"),h&&h()};return s("onBeforeProgressCall"),O&&O(o),b().then(y).catch(u=>v(u)).finally(F)};disconnectFromServer=async()=>this.sipConnector.disconnect().then(()=>(s("disconnectFromServer: then"),{isSuccessful:!0})).catch(e=>(s("disconnectFromServer: catch",e),{isSuccessful:!1}));answerToIncomingCall=async e=>{const{mediaStream:o,extraHeaders:r,iceServers:c,contentHint:a,degradationPreference:i,sendEncodings:l,offerToReceiveAudio:S,offerToReceiveVideo:R,directionVideo:g,directionAudio:_,onBeforeProgressCall:P,onSuccessProgressCall:O,onEnterPurgatory:C,onEnterConference:d,onFailProgressCall:f,onFinishProgressCall:p,onEndedCall:h,onAddedTransceiver:I}=e;s("answerToIncomingCall",e);const A=async()=>this.sipConnector.answerToIncomingCall({mediaStream:o,extraHeaders:r,iceServers:c,contentHint:a,offerToReceiveAudio:S,offerToReceiveVideo:R,directionVideo:g,directionAudio:_,degradationPreference:i,onAddedTransceiver:I,sendEncodings:l}),b=()=>{const{remoteCallerData:u}=this.sipConnector;return u?.incomingNumber};let m=!1,T;const N=(s("subscribeEnterConference: onEnterConference",d),this.sipConnector.on("api:enter-room",u=>{s("enterRoom",{room:u.room,isSuccessProgressCall:m}),T=u.room,(C??d)&&U(T,m,{onEnterPurgatory:C,onEnterConference:d})})),y=u=>(s("onSuccess"),m=!0,O&&O({isPurgatory:n.hasPurgatory(T)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{$(N,h)}),u),v=u=>(s("onFail"),w(f,N,u)),F=()=>{s("onFinish"),p&&p()};if(s("onBeforeProgressCall"),P){const u=b();P(u)}return A().then(y).catch(u=>v(u)).finally(F)};updatePresentation=async({mediaStream:e,contentHint:o,degradationPreference:r,sendEncodings:c,onAddedTransceiver:a})=>(s("updatePresentation"),this.sipConnector.updatePresentation(e,{contentHint:o,degradationPreference:r,onAddedTransceiver:a,sendEncodings:c}));startPresentation=async({mediaStream:e,contentHint:o,degradationPreference:r,sendEncodings:c,callLimit:a,onAddedTransceiver:i})=>(s("startPresentation"),this.sipConnector.startPresentation(e,{contentHint:o,callLimit:a,degradationPreference:r,onAddedTransceiver:i,sendEncodings:c}));stopPresentation=async()=>(s("stopPresentation"),this.sipConnector.stopPresentation().catch(e=>{s(e)}));sendRefusalToTurnOnMic=async()=>{s("sendRefusalToTurnOnMic"),await this.sipConnector.sendRefusalToTurnOnMic().catch(e=>{s("sendRefusalToTurnOnMic: error",e)})};sendRefusalToTurnOnCam=async()=>{s("sendRefusalToTurnOnCam"),await this.sipConnector.sendRefusalToTurnOnCam().catch(e=>{s("sendRefusalToTurnOnCam: error",e)})};sendMediaState=async({isEnabledCam:e,isEnabledMic:o})=>{s("sendMediaState"),await this.sipConnector.sendMediaState({cam:e,mic:o})};replaceMediaStream=async(e,{deleteExisting:o,addMissing:r,forceRenegotiation:c,contentHint:a,degradationPreference:i,sendEncodings:l,onAddedTransceiver:S})=>(s("replaceMediaStream"),this.sipConnector.replaceMediaStream(e,{deleteExisting:o,addMissing:r,forceRenegotiation:c,contentHint:a,degradationPreference:i,onAddedTransceiver:S,sendEncodings:l}));askPermissionToEnableCam=async()=>{s("askPermissionToEnableCam"),await this.sipConnector.askPermissionToEnableCam()};resolveHandleReadyRemoteStreamsDebounced=({onReadyRemoteStreams:e})=>W.debounce(()=>{const o=this.sipConnector.getRemoteStreams();s("remoteStreams",o),e(o)},200);resolveHandleReadyRemoteStreams=({onReadyRemoteStreams:e})=>({track:o})=>{Ne(o)&&e()};getRemoteStreams=()=>(s("getRemoteStreams"),this.sipConnector.getRemoteStreams());onUseLicense=e=>(s("onUseLicense"),this.sipConnector.on("api:use-license",e));onMustStopPresentation=e=>(s("onMustStopPresentation"),this.sipConnector.on("api:presentation:must-stop",e));onMoveToSpectators=e=>(s("onMoveToSpectators"),this.sipConnector.on("api:participant:move-request-to-spectators",e));onMoveToParticipants=e=>(s("onMoveToParticipants"),this.sipConnector.on("api:participant:move-request-to-participants",e));onStats=e=>(s("onStats"),this.sipConnector.on("stats:collected",e));offStats=e=>{s("offStats"),this.sipConnector.off("stats:collected",e)}}exports.ECallCause=n.ECallCause;exports.ECallStatus=n.EState;exports.EConnectionStatus=n.EState$1;exports.EContentUseLicense=n.EContentUseLicense;exports.EIncomingStatus=n.EState$3;exports.EMimeTypesVideoCodecs=n.EMimeTypesVideoCodecs;exports.EPresentationStatus=n.EState$4;exports.EStatsTypes=n.EStatsTypes;exports.SipConnector=n.SipConnector;exports.StatsPeerConnection=n.StatsPeerConnection;exports.disableDebug=n.disableDebug;exports.enableDebug=n.enableDebug;exports.getCodecFromSender=n.getCodecFromSender;exports.hasCanceledStartPresentationError=n.hasCanceledStartPresentationError;Object.defineProperty(exports,"hasConnectionPromiseIsNotActualError",{enumerable:!0,get:()=>Y.isPromiseIsNotActualError});exports.ESystemStatus=E;exports.SipConnectorFacade=Oe;exports.hasAvailableStats=me;exports.hasCanceledCallError=ie;exports.sessionSelectors=fe;exports.tools=ae;
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { E as R, s as K, r as X, a as q, b as z, c as J, D as Q, P as Z, d as B, h as ee, e as y, p as ne, f as te, g as oe, i as se, j as u, k as T, l as v, m as re, n as ae, o as ce } from "./@SipConnector-BFt0K6Oz.js";
2
- import { q as ze, t as Je, u as Qe, v as Ze, S as en, w as nn, x as tn, y as on, z as sn, A as rn } from "./@SipConnector-BFt0K6Oz.js";
1
+ import { E as R, s as K, r as X, a as q, b as z, c as J, D as Q, P as Z, d as B, h as ee, e as y, p as ne, f as te, g as oe, i as se, j as u, k as T, l as v, m as re, n as ae, o as ce } from "./@SipConnector-DRUXzP_d.js";
2
+ import { q as ze, t as Je, u as Qe, v as Ze, S as en, w as nn, x as tn, y as on, z as sn, A as rn } from "./@SipConnector-DRUXzP_d.js";
3
3
  import "events-constructor";
4
4
  import "@krivega/jssip";
5
5
  import "ua-parser-js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sip-connector",
3
- "version": "27.0.0",
3
+ "version": "27.0.1",
4
4
  "description": "Module for connect to Vinteo server",
5
5
  "keywords": [
6
6
  "webrtc",