sip-connector 18.0.0 → 19.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.
Files changed (34) hide show
  1. package/README.md +123 -29
  2. package/dist/{@SipConnector-UTHCoMXw.js → @SipConnector-DC8z6npa.js} +835 -473
  3. package/dist/@SipConnector-eNxG0NqG.cjs +1 -0
  4. package/dist/AutoConnectorManager/@AutoConnectorManager.d.ts +41 -0
  5. package/dist/AutoConnectorManager/AttemptsState.d.ts +21 -0
  6. package/dist/AutoConnectorManager/CheckTelephonyRequester.d.ts +19 -0
  7. package/dist/AutoConnectorManager/PingServerIfNotActiveCallRequester.d.ts +18 -0
  8. package/dist/AutoConnectorManager/PingServerRequester.d.ts +13 -0
  9. package/dist/AutoConnectorManager/RegistrationFailedOutOfCallSubscriber.d.ts +18 -0
  10. package/dist/AutoConnectorManager/eventNames.d.ts +18 -0
  11. package/dist/AutoConnectorManager/index.d.ts +3 -0
  12. package/dist/AutoConnectorManager/types.d.ts +22 -0
  13. package/dist/AutoConnectorManager/utils/errors.d.ts +2 -0
  14. package/dist/AutoConnectorManager/utils/index.d.ts +1 -0
  15. package/dist/CallManager/@CallManager.d.ts +3 -0
  16. package/dist/CallManager/eventNames.d.ts +6 -2
  17. package/dist/ConnectionManager/@ConnectionManager.d.ts +11 -1
  18. package/dist/ConnectionManager/eventNames.d.ts +6 -2
  19. package/dist/ConnectionManager/index.d.ts +1 -0
  20. package/dist/ConnectionManager/utils/errors.d.ts +2 -0
  21. package/dist/ConnectionManager/utils/index.d.ts +2 -0
  22. package/dist/ConnectionManager/utils/resolveParameters.d.ts +2 -0
  23. package/dist/ConnectionQueueManager/@ConnectionQueueManager.d.ts +1 -7
  24. package/dist/ConnectionQueueManager/index.d.ts +1 -0
  25. package/dist/SipConnector/@SipConnector.d.ts +8 -4
  26. package/dist/SipConnector/eventNames.d.ts +1 -1
  27. package/dist/SipConnectorFacade/@SipConnectorFacade.d.ts +16 -10
  28. package/dist/doMock.cjs +1 -1
  29. package/dist/doMock.js +1 -1
  30. package/dist/index.cjs +1 -1
  31. package/dist/index.d.ts +2 -0
  32. package/dist/index.js +227 -213
  33. package/package.json +10 -10
  34. package/dist/@SipConnector-CFYT0HQB.cjs +0 -1
@@ -0,0 +1 @@
1
+ "use strict";const D=require("events-constructor"),G=require("debug"),$=require("@krivega/cancelable-promise"),b=require("@krivega/timeout-requester"),Q=require("repeated-calls"),se=require("xstate"),Y=require("stack-promises");require("ua-parser-js");require("sequent-promises");const z="sip-connector",d=G(z),ye=()=>{G.enable(z)},be=()=>{G.enable(`-${z}`)},we="Error decline with 603",Ue=1006,Le=n=>typeof n=="object"&&n!==null&&"code"in n&&n.code===Ue,Be=n=>n.message===we;var l=(n=>(n.CONTENT_TYPE="content-type",n.CONTENT_ENTER_ROOM="x-webrtc-enter-room",n.CONTENT_USE_LICENSE="X-WEBRTC-USE-LICENSE",n.PARTICIPANT_NAME="X-WEBRTC-PARTICIPANT-NAME",n.INPUT_CHANNELS="X-WEBRTC-INPUT-CHANNELS",n.OUTPUT_CHANNELS="X-WEBRTC-OUTPUT-CHANNELS",n.MAIN_CAM="X-WEBRTC-MAINCAM",n.MIC="X-WEBRTC-MIC",n.MEDIA_SYNC="X-WEBRTC-SYNC",n.MAIN_CAM_RESOLUTION="X-WEBRTC-MAINCAM-RESOLUTION",n.MEDIA_STATE="X-WEBRTC-MEDIA-STATE",n.MEDIA_TYPE="X-Vinteo-Media-Type",n.MAIN_CAM_STATE="X-Vinteo-MainCam-State",n.MIC_STATE="X-Vinteo-Mic-State",n.CONTENT_PARTICIPANT_STATE="X-WEBRTC-PARTSTATE",n.NOTIFY="X-VINTEO-NOTIFY",n.CONTENT_ENABLE_MEDIA_DEVICE="X-WEBRTC-REQUEST-ENABLE-MEDIA-DEVICE",n.CONTENT_SHARE_STATE="x-webrtc-share-state",n.MUST_STOP_PRESENTATION_P2P="x-webrtc-share-state: YOUMUSTSTOPSENDCONTENT",n.START_PRESENTATION_P2P="x-webrtc-share-state: YOUCANRECEIVECONTENT",n.STOP_PRESENTATION_P2P="x-webrtc-share-state: CONTENTEND",n.STOP_PRESENTATION="x-webrtc-share-state: STOPPRESENTATION",n.START_PRESENTATION="x-webrtc-share-state: LETMESTARTPRESENTATION",n.ENABLE_MAIN_CAM="X-WEBRTC-REQUEST-ENABLE-MEDIA-DEVICE: LETMESTARTMAINCAM",n.AVAILABLE_INCOMING_BITRATE="X-WEBRTC-AVAILABLE-INCOMING-BITRATE",n.AUDIO_TRACK_COUNT="X-WEBRTC-AUDIO-TRACK-COUNT",n.VIDEO_TRACK_COUNT="X-WEBRTC-VIDEO-TRACK-COUNT",n.TRACKS_DIRECTION="X-WEBRTC-TRACKS-DIRECTION",n))(l||{}),k=(n=>(n.AVAILABLE_SECOND_REMOTE_STREAM="YOUCANRECEIVECONTENT",n.NOT_AVAILABLE_SECOND_REMOTE_STREAM="CONTENTEND",n.MUST_STOP_PRESENTATION="YOUMUSTSTOPSENDCONTENT",n))(k||{}),W=(n=>(n.SPECTATOR="SPECTATOR",n.PARTICIPANT="PARTICIPANT",n))(W||{}),P=(n=>(n.ENTER_ROOM="application/vinteo.webrtc.roomname",n.MIC="application/vinteo.webrtc.mic",n.USE_LICENSE="application/vinteo.webrtc.uselic",n.PARTICIPANT_STATE="application/vinteo.webrtc.partstate",n.NOTIFY="application/vinteo.webrtc.notify",n.SHARE_STATE="application/vinteo.webrtc.sharedesktop",n.MAIN_CAM="application/vinteo.webrtc.maincam",n.RESTART="application/vinteo.webrtc.restart",n))(P||{}),_=(n=>(n.CHANNELS="application/vinteo.webrtc.channels",n.MEDIA_STATE="application/vinteo.webrtc.mediastate",n.REFUSAL="application/vinteo.webrtc.refusal",n.SHARE_STATE="application/vinteo.webrtc.sharedesktop",n.MAIN_CAM="application/vinteo.webrtc.maincam",n.STATS="application/vinteo.webrtc.stats",n))(_||{}),v=(n=>(n.PAUSE_MAIN_CAM="PAUSEMAINCAM",n.RESUME_MAIN_CAM="RESUMEMAINCAM",n.MAX_MAIN_CAM_RESOLUTION="MAXMAINCAMRESOLUTION",n.ADMIN_STOP_MAIN_CAM="ADMINSTOPMAINCAM",n.ADMIN_START_MAIN_CAM="ADMINSTARTMAINCAM",n))(v||{}),H=(n=>(n.ADMIN_STOP_MIC="ADMINSTOPMIC",n.ADMIN_START_MIC="ADMINSTARTMIC",n))(H||{}),x=(n=>(n.ADMIN_SYNC_FORCED="1",n.ADMIN_SYNC_NOT_FORCED="0",n))(x||{}),ie=(n=>(n.AUDIO="AUDIO",n.VIDEO="VIDEO",n.AUDIOPLUSPRESENTATION="AUDIOPLUSPRESENTATION",n))(ie||{}),u=(n=>(n.CHANNELS_NOTIFY="channels:notify",n.PARTICIPANT_ADDED_TO_LIST_MODERATORS="participant:added-to-list-moderators",n.PARTICIPANT_REMOVED_FROM_LIST_MODERATORS="participant:removed-from-list-moderators",n.PARTICIPANT_MOVE_REQUEST_TO_STREAM="participant:move-request-to-stream",n.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS="participant:move-request-to-spectators",n.PARTICIPANT_MOVE_REQUEST_TO_PARTICIPANTS="participant:move-request-to-participants",n.PARTICIPATION_ACCEPTING_WORD_REQUEST="participation:accepting-word-request",n.PARTICIPATION_CANCELLING_WORD_REQUEST="participation:cancelling-word-request",n.WEBCAST_STARTED="webcast:started",n.WEBCAST_STOPPED="webcast:stopped",n.ACCOUNT_CHANGED="account:changed",n.ACCOUNT_DELETED="account:deleted",n.CONFERENCE_PARTICIPANT_TOKEN_ISSUED="conference:participant-token-issued",n.CHANNELS="channels",n.ENTER_ROOM="enterRoom",n.SHARE_STATE="shareState",n.MAIN_CAM_CONTROL="main-cam-control",n.USE_LICENSE="useLicense",n.ADMIN_START_MAIN_CAM="admin-start-main-cam",n.ADMIN_STOP_MAIN_CAM="admin-stop-main-cam",n.ADMIN_START_MIC="admin-start-mic",n.ADMIN_STOP_MIC="admin-stop-mic",n.ADMIN_FORCE_SYNC_MEDIA_STATE="admin-force-sync-media-state",n.AVAILABLE_SECOND_REMOTE_STREAM="availableSecondRemoteStream",n.NOT_AVAILABLE_SECOND_REMOTE_STREAM="notAvailableSecondRemoteStream",n.MUST_STOP_PRESENTATION="mustStopPresentation",n.NEW_DTMF="newDTMF",n.RESTART="restart",n))(u||{});const re=["participation:accepting-word-request","participation:cancelling-word-request","participant:move-request-to-stream","channels:notify","conference:participant-token-issued","account:changed","account:deleted","webcast:started","webcast:stopped","participant:added-to-list-moderators","participant:removed-from-list-moderators","participant:move-request-to-spectators","participant:move-request-to-participants","channels","enterRoom","shareState","main-cam-control","useLicense","admin-start-main-cam","admin-stop-main-cam","admin-start-mic","admin-stop-mic","admin-force-sync-media-state","availableSecondRemoteStream","notAvailableSecondRemoteStream","mustStopPresentation","newDTMF","restart"];var p=(n=>(n.CHANNELS="channels",n.WEBCAST_STARTED="WebcastStarted",n.WEBCAST_STOPPED="WebcastStopped",n.ACCOUNT_CHANGED="accountChanged",n.ACCOUNT_DELETED="accountDeleted",n.ADDED_TO_LIST_MODERATORS="addedToListModerators",n.REMOVED_FROM_LIST_MODERATORS="removedFromListModerators",n.ACCEPTING_WORD_REQUEST="ParticipationRequestAccepted",n.CANCELLING_WORD_REQUEST="ParticipationRequestRejected",n.MOVE_REQUEST_TO_STREAM="ParticipantMovedToWebcast",n.CONFERENCE_PARTICIPANT_TOKEN_ISSUED="ConferenceParticipantTokenIssued",n))(p||{});class Fe{events;connectionManager;callManager;constructor({connectionManager:e,callManager:t}){this.connectionManager=e,this.callManager=t,this.events=new D.Events(re),this.subscribe()}async waitChannels(){return this.wait(u.CHANNELS)}async waitSyncMediaState(){return this.wait(u.ADMIN_FORCE_SYNC_MEDIA_STATE)}async sendDTMF(e){return new Promise((t,s)=>{let i;try{i=this.getEstablishedRTCSessionProtected()}catch(r){s(r)}i&&(this.callManager.once("newDTMF",({originator:r})=>{r==="local"&&t()}),i.sendDTMF(e,{duration:120,interToneGap:600}))})}async sendChannels({inputChannels:e,outputChannels:t}){const s=this.getEstablishedRTCSessionProtected(),i=`${l.INPUT_CHANNELS}: ${e}`,r=`${l.OUTPUT_CHANNELS}: ${t}`,a=[i,r];return s.sendInfo(_.CHANNELS,void 0,{extraHeaders:a})}async sendMediaState({cam:e,mic:t},s={}){const i=this.getEstablishedRTCSessionProtected(),r=`${l.MEDIA_STATE}: currentstate`,a=`${l.MAIN_CAM_STATE}: ${Number(e)}`,o=`${l.MIC_STATE}: ${Number(t)}`,c=[r,a,o];return i.sendInfo(_.MEDIA_STATE,void 0,{noTerminateWhenError:!0,...s,extraHeaders:c})}async sendStats({availableIncomingBitrate:e}){const t=this.getEstablishedRTCSessionProtected(),i=[`${l.AVAILABLE_INCOMING_BITRATE}: ${e}`];return t.sendInfo(_.STATS,void 0,{noTerminateWhenError:!0,extraHeaders:i})}async sendRefusalToTurnOn(e,t={}){const s=this.getEstablishedRTCSessionProtected(),a=e==="mic"?0:1,c=[`${l.MEDIA_TYPE}: ${a}`];return s.sendInfo(_.REFUSAL,void 0,{noTerminateWhenError:!0,...t,extraHeaders:c})}async sendRefusalToTurnOnMic(e={}){return this.sendRefusalToTurnOn("mic",{noTerminateWhenError:!0,...e})}async sendRefusalToTurnOnCam(e={}){return this.sendRefusalToTurnOn("cam",{noTerminateWhenError:!0,...e})}async sendMustStopPresentationP2P(){await this.getEstablishedRTCSessionProtected().sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[l.MUST_STOP_PRESENTATION_P2P]})}async sendStoppedPresentationP2P(){await this.getEstablishedRTCSessionProtected().sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[l.STOP_PRESENTATION_P2P]})}async sendStoppedPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[l.STOP_PRESENTATION]})}async askPermissionToStartPresentationP2P(){await this.getEstablishedRTCSessionProtected().sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[l.START_PRESENTATION_P2P]})}async askPermissionToStartPresentation(){await this.getEstablishedRTCSessionProtected().sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[l.START_PRESENTATION]})}async askPermissionToEnableCam(e={}){const t=this.getEstablishedRTCSessionProtected(),s=[l.ENABLE_MAIN_CAM];return t.sendInfo(_.MAIN_CAM,void 0,{noTerminateWhenError:!0,...e,extraHeaders:s}).catch(i=>{if(Be(i))throw i})}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}getEstablishedRTCSessionProtected=()=>{const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");return e};subscribe(){this.connectionManager.on("sipEvent",this.handleSipEvent),this.callManager.on("newInfo",this.handleNewInfo),this.callManager.on("newDTMF",e=>{this.events.trigger("newDTMF",e)})}handleSipEvent=({request:e})=>{this.maybeHandleNotify(e)};maybeHandleNotify=e=>{try{const t=e.getHeader(l.NOTIFY);if(t){const s=JSON.parse(t);this.handleNotify(s)}}catch(t){d("error parse notify",t)}};handleNotify=e=>{switch(e.cmd){case p.CHANNELS:{const t=e;this.triggerChannelsNotify(t);break}case p.WEBCAST_STARTED:{const t=e;this.triggerWebcastStartedNotify(t);break}case p.WEBCAST_STOPPED:{const t=e;this.triggerWebcastStoppedNotify(t);break}case p.ADDED_TO_LIST_MODERATORS:{const t=e;this.triggerAddedToListModeratorsNotify(t);break}case p.REMOVED_FROM_LIST_MODERATORS:{const t=e;this.triggerRemovedFromListModeratorsNotify(t);break}case p.ACCEPTING_WORD_REQUEST:{const t=e;this.triggerParticipationAcceptingWordRequest(t);break}case p.CANCELLING_WORD_REQUEST:{const t=e;this.triggerParticipationCancellingWordRequest(t);break}case p.MOVE_REQUEST_TO_STREAM:{const t=e;this.triggerParticipantMoveRequestToStream(t);break}case p.ACCOUNT_CHANGED:{this.triggerAccountChangedNotify();break}case p.ACCOUNT_DELETED:{this.triggerAccountDeletedNotify();break}case p.CONFERENCE_PARTICIPANT_TOKEN_ISSUED:{const t=e;this.triggerConferenceParticipantTokenIssued(t);break}default:d("unknown cmd",e)}};handleNewInfo=e=>{const{originator:t}=e;if(t!=="remote")return;const{request:s}=e,i=s,r=i.getHeader(l.CONTENT_TYPE);if(r!==void 0)switch(r){case P.ENTER_ROOM:{this.triggerEnterRoom(i),this.maybeTriggerChannels(i);break}case P.NOTIFY:{this.maybeHandleNotify(i);break}case P.SHARE_STATE:{this.triggerShareState(i);break}case P.MAIN_CAM:{this.triggerMainCamControl(i);break}case P.MIC:{this.triggerMicControl(i);break}case P.USE_LICENSE:{this.triggerUseLicense(i);break}case P.PARTICIPANT_STATE:{this.maybeTriggerParticipantMoveRequest(i);break}case P.RESTART:{this.triggerRestart(i);break}}};triggerChannelsNotify=e=>{const t=e.input,s=e.output,i={inputChannels:t,outputChannels:s};this.events.trigger(u.CHANNELS_NOTIFY,i)};triggerWebcastStartedNotify=({body:{conference:e,type:t}})=>{const s={conference:e,type:t};this.events.trigger(u.WEBCAST_STARTED,s)};triggerWebcastStoppedNotify=({body:{conference:e,type:t}})=>{const s={conference:e,type:t};this.events.trigger(u.WEBCAST_STOPPED,s)};triggerAddedToListModeratorsNotify=({conference:e})=>{const t={conference:e};this.events.trigger(u.PARTICIPANT_ADDED_TO_LIST_MODERATORS,t)};triggerRemovedFromListModeratorsNotify=({conference:e})=>{const t={conference:e};this.events.trigger(u.PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,t)};triggerParticipationAcceptingWordRequest=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(u.PARTICIPATION_ACCEPTING_WORD_REQUEST,t)};triggerParticipationCancellingWordRequest=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(u.PARTICIPATION_CANCELLING_WORD_REQUEST,t)};triggerParticipantMoveRequestToStream=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(u.PARTICIPANT_MOVE_REQUEST_TO_STREAM,t)};triggerAccountChangedNotify=()=>{this.events.trigger(u.ACCOUNT_CHANGED,void 0)};triggerAccountDeletedNotify=()=>{this.events.trigger(u.ACCOUNT_DELETED,void 0)};triggerConferenceParticipantTokenIssued=({body:{conference:e,participant:t,jwt:s}})=>{const i={conference:e,participant:t,jwt:s};this.events.trigger(u.CONFERENCE_PARTICIPANT_TOKEN_ISSUED,i)};maybeTriggerChannels=e=>{const t=e.getHeader(l.INPUT_CHANNELS),s=e.getHeader(l.OUTPUT_CHANNELS);if(t&&s){const i={inputChannels:t,outputChannels:s};this.events.trigger(u.CHANNELS,i)}};triggerEnterRoom=e=>{const t=e.getHeader(l.CONTENT_ENTER_ROOM),s=e.getHeader(l.PARTICIPANT_NAME);this.events.trigger(u.ENTER_ROOM,{room:t,participantName:s})};triggerShareState=e=>{const t=e.getHeader(l.CONTENT_SHARE_STATE);if(t!==void 0)switch(t){case k.AVAILABLE_SECOND_REMOTE_STREAM:{this.events.trigger(u.AVAILABLE_SECOND_REMOTE_STREAM,void 0);break}case k.NOT_AVAILABLE_SECOND_REMOTE_STREAM:{this.events.trigger(u.NOT_AVAILABLE_SECOND_REMOTE_STREAM,void 0);break}case k.MUST_STOP_PRESENTATION:{this.events.trigger(u.MUST_STOP_PRESENTATION,void 0);break}}};maybeTriggerParticipantMoveRequest=e=>{const t=e.getHeader(l.CONTENT_PARTICIPANT_STATE);t===W.SPECTATOR&&this.events.trigger(u.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS,void 0),t===W.PARTICIPANT&&this.events.trigger(u.PARTICIPANT_MOVE_REQUEST_TO_PARTICIPANTS,void 0)};triggerMainCamControl=e=>{const t=e.getHeader(l.MAIN_CAM),s=e.getHeader(l.MEDIA_SYNC),i=s===x.ADMIN_SYNC_FORCED;if(t===v.ADMIN_START_MAIN_CAM){this.events.trigger(u.ADMIN_START_MAIN_CAM,{isSyncForced:i});return}if(t===v.ADMIN_STOP_MAIN_CAM){this.events.trigger(u.ADMIN_STOP_MAIN_CAM,{isSyncForced:i});return}(t===v.RESUME_MAIN_CAM||t===v.PAUSE_MAIN_CAM)&&s!==void 0&&this.events.trigger(u.ADMIN_FORCE_SYNC_MEDIA_STATE,{isSyncForced:i});const r=e.getHeader(l.MAIN_CAM_RESOLUTION);this.events.trigger(u.MAIN_CAM_CONTROL,{mainCam:t,resolutionMainCam:r})};triggerMicControl=e=>{const t=e.getHeader(l.MIC),i=e.getHeader(l.MEDIA_SYNC)===x.ADMIN_SYNC_FORCED;t===H.ADMIN_START_MIC?this.events.trigger(u.ADMIN_START_MIC,{isSyncForced:i}):t===H.ADMIN_STOP_MIC&&this.events.trigger(u.ADMIN_STOP_MIC,{isSyncForced:i})};triggerUseLicense=e=>{const t=e.getHeader(l.CONTENT_USE_LICENSE);this.events.trigger(u.USE_LICENSE,t)};triggerRestart=e=>{const t=e.getHeader(l.TRACKS_DIRECTION),s=Number(e.getHeader(l.AUDIO_TRACK_COUNT)),i=Number(e.getHeader(l.VIDEO_TRACK_COUNT)),r={tracksDirection:t,audioTrackCount:s,videoTrackCount:i};this.events.trigger(u.RESTART,r)}}var N=(n=>(n.PEER_CONNECTION="peerconnection",n.CONNECTING="connecting",n.SENDING="sending",n.PROGRESS="progress",n.ACCEPTED="accepted",n.CONFIRMED="confirmed",n.ENDED="ended",n.FAILED="failed",n.NEW_DTMF="newDTMF",n.NEW_INFO="newInfo",n.HOLD="hold",n.UNHOLD="unhold",n.MUTED="muted",n.UNMUTED="unmuted",n.REINVITE="reinvite",n.UPDATE="update",n.REFER="refer",n.REPLACES="replaces",n.SDP="sdp",n.ICE_CANDIDATE="icecandidate",n.GET_USER_MEDIA_FAILED="getusermediafailed",n.PEER_CONNECTION_CREATE_OFFER_FAILED="peerconnection:createofferfailed",n.PEER_CONNECTION_CREATE_ANSWER_FAILED="peerconnection:createanswerfailed",n.PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED="peerconnection:setlocaldescriptionfailed",n.PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED="peerconnection:setremotedescriptionfailed",n.START_PRESENTATION="presentation:start",n.STARTED_PRESENTATION="presentation:started",n.END_PRESENTATION="presentation:end",n.ENDED_PRESENTATION="presentation:ended",n.FAILED_PRESENTATION="presentation:failed",n.PEER_CONNECTION_CONFIRMED="peerconnection:confirmed",n.PEER_CONNECTION_ONTRACK="peerconnection:ontrack",n.ENDED_FROM_SERVER="ended:fromserver",n.CALL_STATUS_CHANGED="call-status-changed",n))(N||{}),ae=(n=>(n.LOCAL="local",n.REMOTE="remote",n.SYSTEM="system",n))(ae||{});const oe=["peerconnection","connecting","sending","progress","accepted","confirmed","ended","failed","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"],ke=["peerconnection:confirmed","peerconnection:ontrack","ended:fromserver","call-status-changed"],ce=[...oe,...ke],$e=(n,e)=>{n.getVideoTracks().forEach(s=>{"contentHint"in s&&s.contentHint!==e&&(s.contentHint=e)})},B=(n,{directionVideo:e,directionAudio:t,contentHint:s}={})=>{if(!n||e==="recvonly"&&t==="recvonly")return;const i=t==="recvonly"?[]:n.getAudioTracks(),r=e==="recvonly"?[]:n.getVideoTracks(),a=[...i,...r],o=new MediaStream(a);return o.getTracks=()=>[...o.getAudioTracks(),...o.getVideoTracks()],s&&s!=="none"&&$e(o,s),o};function qe(n){return e=>`sip:${e}@${n}`}const Ve=(n,e)=>()=>Math.floor(Math.random()*(e-n))+n,de=n=>n.trim().replaceAll(" ","_"),We=Ve(1e5,99999999),He=n=>n.some(t=>{const{kind:s}=t;return s==="video"});class xe{isPendingCall=!1;isPendingAnswer=!1;rtcSession;remoteStreams={};events;callConfiguration={};constructor(e){this.events=e}}var X=(n=>(n.BYE="Terminated",n.WEBRTC_ERROR="WebRTC Error",n.CANCELED="Canceled",n.REQUEST_TIMEOUT="Request Timeout",n.REJECTED="Rejected",n.REDIRECTED="Redirected",n.UNAVAILABLE="Unavailable",n.NOT_FOUND="Not Found",n.ADDRESS_INCOMPLETE="Address Incomplete",n.INCOMPATIBLE_SDP="Incompatible SDP",n.BAD_MEDIA_DESCRIPTION="Bad Media Description",n))(X||{});class Ge{remoteStreams={};reset(){this.remoteStreams={}}generateStream(e,t){const{id:s}=e,i=this.remoteStreams[s]??new MediaStream;return t&&i.addTrack(t),i.addTrack(e),this.remoteStreams[s]=i,i}generateAudioStream(e){const{id:t}=e,s=this.remoteStreams[t]??new MediaStream;return s.addTrack(e),this.remoteStreams[t]=s,s}generateStreams(e){const t=[];return e.forEach((s,i)=>{if(s.kind==="audio")return;const r=s,a=e[i-1];let o;a?.kind==="audio"&&(o=a);const c=this.generateStream(r,o);t.push(c)}),t}generateAudioStreams(e){return e.map(t=>this.generateAudioStream(t))}}class Qe extends xe{remoteStreamsManager=new Ge;disposers=new Set;constructor(e){super(e),e.on(N.FAILED,this.handleEnded),e.on(N.ENDED,this.handleEnded)}get requested(){return this.isPendingCall||this.isPendingAnswer}get connection(){return this.rtcSession?.connection}get isCallActive(){return this.rtcSession?.isEstablished()===!0}get establishedRTCSession(){return this.rtcSession?.isEstablished()===!0?this.rtcSession:void 0}startCall=async(e,t,{number:s,mediaStream:i,extraHeaders:r=[],ontrack:a,iceServers:o,directionVideo:c,directionAudio:h,contentHint:T,offerToReceiveAudio:S=!0,offerToReceiveVideo:g=!0,degradationPreference:E,sendEncodings:m,onAddedTransceiver:I})=>(this.isPendingCall=!0,new Promise((R,w)=>{this.callConfiguration.number=s,this.callConfiguration.answer=!1,this.handleCall({ontrack:a}).then(R).catch(q=>{w(q)}),this.rtcSession=e.call(t(s),{mediaStream:B(i,{directionVideo:c,directionAudio:h,contentHint:T}),pcConfig:{iceServers:o},rtcOfferConstraints:{offerToReceiveAudio:S,offerToReceiveVideo:g},eventHandlers:this.events.triggers,extraHeaders:r,directionVideo:c,directionAudio:h,degradationPreference:E,sendEncodings:m,onAddedTransceiver:I})}).finally(()=>{this.isPendingCall=!1}));async endCall(){const{rtcSession:e}=this;if(e&&!e.isEnded())return e.terminateAsync({cause:X.CANCELED}).finally(()=>{this.reset()});this.reset()}answerToIncomingCall=async(e,{mediaStream:t,ontrack:s,extraHeaders:i=[],iceServers:r,directionVideo:a,directionAudio:o,offerToReceiveAudio:c,offerToReceiveVideo:h,contentHint:T,degradationPreference:S,sendEncodings:g,onAddedTransceiver:E})=>(this.isPendingAnswer=!0,new Promise((m,I)=>{try{const R=e();this.rtcSession=R,this.subscribeToSessionEvents(R),this.callConfiguration.answer=!0,this.callConfiguration.number=R.remote_identity.uri.user,this.handleCall({ontrack:s}).then(m).catch(w=>{I(w)}),R.answer({pcConfig:{iceServers:r},rtcOfferConstraints:{offerToReceiveAudio:c,offerToReceiveVideo:h},mediaStream:B(t,{directionVideo:a,directionAudio:o,contentHint:T}),extraHeaders:i,directionVideo:a,directionAudio:o,degradationPreference:S,sendEncodings:g,onAddedTransceiver:E})}catch(R){I(R)}}).finally(()=>{this.isPendingAnswer=!1}));getEstablishedRTCSession(){return this.rtcSession?.isEstablished()===!0?this.rtcSession:void 0}getCallConfiguration(){return{...this.callConfiguration}}getRemoteStreams(){if(!this.connection)return;const t=this.connection.getReceivers().map(({track:s})=>s);return He(t)?this.remoteStreamsManager.generateStreams(t):this.remoteStreamsManager.generateAudioStreams(t)}async replaceMediaStream(e,t){if(!this.rtcSession)throw new Error("No rtcSession established");const{contentHint:s}=t??{},i=B(e,{contentHint:s});if(i===void 0)throw new Error("No preparedMediaStream");return this.rtcSession.replaceMediaStream(i,t)}async restartIce(e){if(!this.rtcSession)throw new Error("No rtcSession established");return this.rtcSession.restartIce(e)}async addTransceiver(e,t){if(!this.rtcSession)throw new Error("No rtcSession established");return this.rtcSession.addTransceiver(e,t)}handleCall=async({ontrack:e})=>new Promise((t,s)=>{const i=()=>{this.events.on(N.PEER_CONNECTION,T),this.events.on(N.CONFIRMED,S)},r=()=>{this.events.off(N.PEER_CONNECTION,T),this.events.off(N.CONFIRMED,S)},a=()=>{this.events.on(N.FAILED,c),this.events.on(N.ENDED,c)},o=()=>{this.events.off(N.FAILED,c),this.events.off(N.ENDED,c)},c=g=>{r(),o(),s(g)};let h;const T=({peerconnection:g})=>{h=g;const E=m=>{this.events.trigger(N.PEER_CONNECTION_ONTRACK,m),e&&e(m)};g.addEventListener("track",E),this.disposers.add(()=>{g.removeEventListener("track",E)})},S=()=>{h!==void 0&&this.events.trigger(N.PEER_CONNECTION_CONFIRMED,h),r(),o(),t(h)};i(),a()});subscribeToSessionEvents(e){this.events.eachTriggers((t,s)=>{const i=oe.find(r=>r===s);i&&(e.on(i,t),this.disposers.add(()=>{e.off(i,t)}))})}unsubscribeFromSessionEvents(){this.disposers.forEach(e=>{e()}),this.disposers.clear()}handleEnded=e=>{const{originator:t}=e;t==="remote"&&this.events.trigger(N.ENDED_FROM_SERVER,e),this.reset()};reset=()=>{delete this.rtcSession,this.remoteStreamsManager.reset(),this.unsubscribeFromSessionEvents(),this.callConfiguration.number=void 0,this.callConfiguration.answer=!1}}class Ye{events;strategy;constructor(e){this.events=new D.TypedEvents(ce),this.strategy=e??new Qe(this.events),this.subscribeCallStatusChange()}get requested(){return this.strategy.requested}get connection(){return this.strategy.connection}get establishedRTCSession(){return this.strategy.establishedRTCSession}get isCallActive(){return this.strategy.isCallActive}on(e,t){return this.events.on(e,t)}onRace(e,t){return this.events.onRace(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}setStrategy(e){this.strategy=e}startCall=async(...e)=>this.strategy.startCall(...e);endCall=async()=>this.strategy.endCall();answerToIncomingCall=async(...e)=>this.strategy.answerToIncomingCall(...e);getEstablishedRTCSession=()=>this.strategy.getEstablishedRTCSession();getCallConfiguration=()=>this.strategy.getCallConfiguration();getRemoteStreams=()=>this.strategy.getRemoteStreams();addTransceiver=async(...e)=>this.strategy.addTransceiver(...e);replaceMediaStream=async(...e)=>this.strategy.replaceMediaStream(...e);restartIce=async e=>this.strategy.restartIce(e);subscribeCallStatusChange(){let{isCallActive:e}=this;const{ACCEPTED:t,CONFIRMED:s,ENDED:i,FAILED:r}=N;this.onRace([t,s,i,r],()=>{e=this.maybeTriggerCallStatus(e)})}maybeTriggerCallStatus(e){const t=this.isCallActive;return t!==e&&this.events.trigger(N.CALL_STATUS_CHANGED,{isCallActive:t}),t}}const ze=(n,e)=>(n.degradationPreference=e.degradationPreference,n),Xe=(n,e)=>{n.encodings??=[];for(let t=n.encodings.length;t<e;t+=1)n.encodings.push({});return n},he=n=>(e,t)=>t!==void 0&&e!==t||t===void 0&&e!==n,Je=he(),Ke=(n,e)=>{if(Je(n,e))return n},je=(n,e)=>{const t=n.maxBitrate,s=Ke(e,t);return s!==void 0&&(n.maxBitrate=s),n},le=1,Ze=he(le),et=(n,e)=>{const t=n===void 0?void 0:Math.max(n,le);if(t!==void 0&&Ze(t,e))return t},tt=(n,e)=>{const t=n.scaleResolutionDownBy,s=et(e,t);return s!==void 0&&(n.scaleResolutionDownBy=s),n},nt=(n,e)=>{const t=e.encodings?.length??0;return Xe(n,t),n.encodings.forEach((s,i)=>{const r=(e?.encodings??[])[i],a=r?.maxBitrate,o=r?.scaleResolutionDownBy;je(s,a),tt(s,o)}),n},st=(n,e)=>{if(n.codecs?.length!==e.codecs?.length)return!0;for(let t=0;t<(n.codecs?.length??0);t++)if(JSON.stringify(n.codecs[t])!==JSON.stringify(e.codecs[t]))return!0;if(n.headerExtensions?.length!==e.headerExtensions?.length)return!0;for(let t=0;t<(n.headerExtensions?.length??0);t++)if(JSON.stringify(n.headerExtensions[t])!==JSON.stringify(e.headerExtensions[t]))return!0;if(n.encodings?.length!==e.encodings?.length)return!0;for(let t=0;t<(n.encodings?.length??0);t++)if(JSON.stringify(n.encodings[t])!==JSON.stringify(e.encodings[t]))return!0;return n.rtcp?.cname!==e.rtcp?.cname||n.rtcp?.reducedSize!==e.rtcp?.reducedSize||n.degradationPreference!==e.degradationPreference},ge=async(n,e)=>{const t=n.getParameters(),s=JSON.parse(JSON.stringify(t));nt(t,e),ze(t,e);const i=st(s,t);return i&&await n.setParameters(t),{parameters:t,isChanged:i}},J=async(n,e,t)=>{const{isChanged:s,parameters:i}=await ge(n,{encodings:[{scaleResolutionDownBy:e.scaleResolutionDownBy,maxBitrate:e.maxBitrate}]});return s&&t&&t(i),{isChanged:s,parameters:i}},it=(n,e)=>n.find(t=>t.track!==null&&e.getTracks().includes(t.track)),rt=async(n,e,t)=>{const s=it(n,e);if(s)return J(s,{maxBitrate:t})};var f=(n=>(n.START_PRESENTATION="presentation:start",n.STARTED_PRESENTATION="presentation:started",n.END_PRESENTATION="presentation:end",n.ENDED_PRESENTATION="presentation:ended",n.FAILED_PRESENTATION="presentation:failed",n))(f||{});const ue=["presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed"],at=1,ot=n=>Q.hasCanceledError(n);class ct{events;promisePendingStartPresentation;promisePendingStopPresentation;streamPresentationCurrent;maxBitrate;cancelableSendPresentationWithRepeatedCalls;callManager;constructor({callManager:e,maxBitrate:t}){this.callManager=e,this.maxBitrate=t,this.events=new D.Events(ue),this.subscribe()}get isPendingPresentation(){return!!this.promisePendingStartPresentation||!!this.promisePendingStopPresentation}async startPresentation(e,t,{isNeedReinvite:s,contentHint:i,sendEncodings:r,onAddedTransceiver:a}={},o){const c=this.getRtcSessionProtected();if(this.streamPresentationCurrent)throw new Error("Presentation is already started");return this.sendPresentationWithDuplicatedCalls(e,{rtcSession:c,stream:t,presentationOptions:{isNeedReinvite:s,contentHint:i,sendEncodings:r,onAddedTransceiver:a},options:o})}async stopPresentation(e){this.cancelSendPresentationWithRepeatedCalls();const t=this.streamPresentationCurrent;let s=this.promisePendingStartPresentation??Promise.resolve(void 0);this.promisePendingStartPresentation&&await this.promisePendingStartPresentation.catch(()=>{});const i=this.callManager.getEstablishedRTCSession();return i&&t?s=e().then(async()=>i.stopPresentation(t)).catch(r=>{throw this.events.trigger(f.FAILED_PRESENTATION,r),r}):t&&this.events.trigger(f.ENDED_PRESENTATION,t),this.promisePendingStopPresentation=s,s.finally(()=>{this.resetPresentation()})}async updatePresentation(e,t,{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,t,{contentHint:s,isNeedReinvite:!1,sendEncodings:i,onAddedTransceiver:r}).then(async o=>(await this.setMaxBitrate(),o))}cancelSendPresentationWithRepeatedCalls(){this.cancelableSendPresentationWithRepeatedCalls?.stopRepeatedCalls()}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}subscribe(){this.callManager.on("presentation:start",e=>{this.events.trigger(f.START_PRESENTATION,e)}),this.callManager.on("presentation:started",e=>{this.events.trigger(f.STARTED_PRESENTATION,e)}),this.callManager.on("presentation:end",e=>{this.events.trigger(f.END_PRESENTATION,e)}),this.callManager.on("presentation:ended",e=>{this.events.trigger(f.ENDED_PRESENTATION,e)}),this.callManager.on("presentation:failed",e=>{this.events.trigger(f.FAILED_PRESENTATION,e)}),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded)}async sendPresentationWithDuplicatedCalls(e,{rtcSession:t,stream:s,presentationOptions:i,options:r={callLimit:at}}){const a=async()=>this.sendPresentation(e,t,s,i),o=()=>!!this.streamPresentationCurrent;return this.cancelableSendPresentationWithRepeatedCalls=Q.repeatedCallsAsync({targetFunction:a,isComplete:o,isRejectAsValid:!0,...r}),this.cancelableSendPresentationWithRepeatedCalls.then(c=>c)}async sendPresentation(e,t,s,{isNeedReinvite:i=!0,contentHint:r="detail",degradationPreference:a,sendEncodings:o,onAddedTransceiver:c}){const h=B(s,{contentHint:r});if(h===void 0)throw new Error("No streamPresentationTarget");this.streamPresentationCurrent=h;const T=e().then(async()=>t.startPresentation(h,i,{degradationPreference:a,sendEncodings:o,onAddedTransceiver:c})).then(this.setMaxBitrate).then(()=>s).catch(S=>{throw this.removeStreamPresentationCurrent(),this.events.trigger(f.FAILED_PRESENTATION,S),S});return this.promisePendingStartPresentation=T,T.finally(()=>{this.promisePendingStartPresentation=void 0})}setMaxBitrate=async()=>{const{connection:e}=this.callManager,{streamPresentationCurrent:t}=this,{maxBitrate:s}=this;if(!e||!t||s===void 0)return;const i=e.getSenders();await rt(i,t,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}}class dt{data={};getUa;constructor(e){this.getUa=e.getUa}isConfigured(){return this.getUa()!==void 0}get(){return{...this.data}}set(e){this.data={...e}}update(e,t){this.data[e]=t}clear(){this.data={}}isRegister(){return this.data.register===!0}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}}var A=(n=>(n.CONNECTING="connecting",n.CONNECTED="connected",n.DISCONNECTED="disconnected",n.DISCONNECTING="disconnecting",n.NEW_RTC_SESSION="newRTCSession",n.REGISTERED="registered",n.UNREGISTERED="unregistered",n.REGISTRATION_FAILED="registrationFailed",n.NEW_MESSAGE="newMessage",n.SIP_EVENT="sipEvent",n.CONNECT_STARTED="connect-started",n.CONNECT_SUCCEEDED="connect-succeeded",n.CONNECT_FAILED="connect-failed",n))(A||{});const Te=["connecting","connected","disconnected","newRTCSession","registered","unregistered","registrationFailed","newMessage","sipEvent"],ht=["disconnecting","connect-started","connect-succeeded","connect-failed"],Se=[...Te,...ht],lt=3;class gt{cancelableConnectWithRepeatedCalls;JsSIP;events;uaFactory;stateMachine;registrationManager;getUa;setUa;getConnectionConfiguration;setConnectionConfiguration;updateConnectionConfiguration;setSipServerUrl;setSocket;constructor(e){this.JsSIP=e.JsSIP,this.events=e.events,this.uaFactory=e.uaFactory,this.stateMachine=e.stateMachine,this.registrationManager=e.registrationManager,this.getUa=e.getUa,this.setUa=e.setUa,this.getConnectionConfiguration=e.getConnectionConfiguration,this.setConnectionConfiguration=e.setConnectionConfiguration,this.updateConnectionConfiguration=e.updateConnectionConfiguration,this.setSipServerUrl=e.setSipServerUrl,this.setSocket=e.setSocket}connect=async(e,t)=>(this.cancelRequests(),this.connectWithDuplicatedCalls(e,t));set=async({displayName:e})=>new Promise((t,s)=>{const i=this.getUa();if(!i){s(new Error("this.ua is not initialized"));return}let r=!1;const a=this.getConnectionConfiguration();e!==void 0&&e!==a.displayName&&(r=i.set("display_name",de(e)),this.updateConnectionConfiguration("displayName",e));const o=r;o?t(o):s(new Error("nothing changed"))});disconnect=async()=>{this.events.trigger(A.DISCONNECTING,void 0);const e=new Promise(s=>{this.events.once(A.DISCONNECTED,()=>{s()})}),t=this.getUa();return t?t.stop():this.events.trigger(A.DISCONNECTED,void 0),e.finally(()=>{this.setUa(void 0),this.stateMachine.reset()})};cancelRequests(){this.cancelConnectWithRepeatedCalls()}connectWithDuplicatedCalls=async(e,{callLimit:t=lt}={})=>{const s=async()=>this.connectInner(e),i=r=>{const c=this.getUa()?.isConnected()===!0&&this.hasEqualConnectionConfiguration(e),h=r!=null&&!Le(r);return c||h};return this.stateMachine.startConnect(),this.cancelableConnectWithRepeatedCalls=Q.repeatedCallsAsync({targetFunction:s,isComplete:i,callLimit:t,isRejectAsValid:!0,isCheckBeforeCall:!1}),this.cancelableConnectWithRepeatedCalls.then(r=>{if(r instanceof this.JsSIP.UA)return r;throw r})};hasEqualConnectionConfiguration(e){const{configuration:t}=this.uaFactory.createConfiguration(e),i=this.getUa()?.configuration;return i?i.password===t.password&&i.register===t.register&&i.uri.toString()===t.uri&&i.display_name===t.display_name&&i.user_agent===t.user_agent&&i.sockets===t.sockets&&i.session_timers===t.session_timers&&i.register_expires===t.register_expires&&i.connection_recovery_min_interval===t.connection_recovery_min_interval&&i.connection_recovery_max_interval===t.connection_recovery_max_interval:!1}connectInner=async e=>this.initUa(e).then(async()=>this.start());initUa=async({user:e,password:t,sipServerUrl:s,sipWebSocketServerURL:i,remoteAddress:r,sessionTimers:a,registerExpires:o,connectionRecoveryMinInterval:c,connectionRecoveryMaxInterval:h,userAgent:T,displayName:S="",register:g=!1,extraHeaders:E=[]})=>{this.stateMachine.startInitUa(),this.setConnectionConfiguration({sipServerUrl:s,displayName:S,register:g,user:e,password:t}),this.getUa()&&await this.disconnect();const{ua:I,helpers:R}=this.uaFactory.createUAWithConfiguration({user:e,password:t,sipServerUrl:s,sipWebSocketServerURL:i,displayName:S,register:g,sessionTimers:a,registerExpires:o,connectionRecoveryMinInterval:c,connectionRecoveryMaxInterval:h,userAgent:T,remoteAddress:r,extraHeaders:E},this.events);return this.setUa(I),this.setSipServerUrl(R.getSipServerUrl),this.setSocket(R.socket),I};start=async()=>new Promise((e,t)=>{const s=this.getUa();if(!s){t(new Error("this.ua is not initialized"));return}let i;i=((c,h)=>{if(this.getConnectionConfiguration().register===!0)return this.registrationManager.subscribeToStartEvents(c,h);const S=A.CONNECTED,g=[A.DISCONNECTED];return this.events.on(S,c),g.forEach(E=>{this.events.on(E,h)}),()=>{this.events.off(S,c),g.forEach(E=>{this.events.off(E,h)})}})(()=>{i?.(),e(s)},c=>{i?.(),t(c)}),s.start()});cancelConnectWithRepeatedCalls(){this.cancelableConnectWithRepeatedCalls?.cancel()}}var Ce=(n=>(n.START_CONNECT="START_CONNECT",n.START_INIT_UA="START_INIT_UA",n.UA_CONNECTED="UA_CONNECTED",n.UA_REGISTERED="UA_REGISTERED",n.UA_UNREGISTERED="UA_UNREGISTERED",n.UA_DISCONNECTED="UA_DISCONNECTED",n.CONNECTION_FAILED="CONNECTION_FAILED",n.RESET="RESET",n))(Ce||{});const ut=se.setup({types:{context:{},events:{}},actions:{logTransition:(n,e)=>{d(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(n,e)=>{d("ConnectionStateMachine state changed",e.state)}}}).createMachine({id:"connection",initial:"idle",context:{},states:{idle:{entry:{type:"logStateChange",params:{state:"idle"}},on:{START_CONNECT:{target:"connecting",actions:{type:"logTransition",params:{from:"idle",to:"connecting",event:"START_CONNECT"}}}}},connecting:{entry:{type:"logStateChange",params:{state:"connecting"}},on:{START_INIT_UA:{target:"initializing",actions:{type:"logTransition",params:{from:"connecting",to:"initializing",event:"START_INIT_UA"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"connecting",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"connecting",to:"failed",event:"CONNECTION_FAILED"}}}}},initializing:{entry:{type:"logStateChange",params:{state:"initializing"}},on:{UA_CONNECTED:{target:"connected",actions:{type:"logTransition",params:{from:"initializing",to:"connected",event:"UA_CONNECTED"}}},UA_REGISTERED:{target:"registered",actions:{type:"logTransition",params:{from:"initializing",to:"registered",event:"UA_REGISTERED"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"initializing",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"initializing",to:"failed",event:"CONNECTION_FAILED"}}}}},connected:{entry:{type:"logStateChange",params:{state:"connected"}},on:{UA_REGISTERED:{target:"registered",actions:{type:"logTransition",params:{from:"connected",to:"registered",event:"UA_REGISTERED"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"connected",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"connected",to:"failed",event:"CONNECTION_FAILED"}}}}},registered:{entry:{type:"logStateChange",params:{state:"registered"}},on:{UA_UNREGISTERED:{target:"connected",actions:{type:"logTransition",params:{from:"registered",to:"connected",event:"UA_UNREGISTERED"}}},UA_DISCONNECTED:{target:"disconnected",actions:{type:"logTransition",params:{from:"registered",to:"disconnected",event:"UA_DISCONNECTED"}}},CONNECTION_FAILED:{target:"failed",actions:{type:"logTransition",params:{from:"registered",to:"failed",event:"CONNECTION_FAILED"}}}}},disconnected:{entry:{type:"logStateChange",params:{state:"disconnected"}},on:{RESET:{target:"idle",actions:{type:"logTransition",params:{from:"disconnected",to:"idle",event:"RESET"}}},START_CONNECT:{target:"connecting",actions:{type:"logTransition",params:{from:"disconnected",to:"connecting",event:"START_CONNECT"}}}}},failed:{entry:{type:"logStateChange",params:{state:"failed"}},on:{RESET:{target:"idle",actions:{type:"logTransition",params:{from:"failed",to:"idle",event:"RESET"}}},START_CONNECT:{target:"connecting",actions:{type:"logTransition",params:{from:"failed",to:"connecting",event:"START_CONNECT"}}}}}}});class Tt{actor;stateChangeListeners=new Set;events;unsubscribeFromEvents;actorSubscription;constructor(e){this.events=e,this.actor=se.createActor(ut),this.actorSubscription=this.actor.subscribe(t=>{const s=t.value;this.stateChangeListeners.forEach(i=>{i(s)})}),this.actor.start(),this.subscribeToEvents()}get state(){return this.actor.getSnapshot().value}get isIdle(){return this.hasState("idle")}get isConnecting(){return this.hasState("connecting")}get isInitializing(){return this.hasState("initializing")}get isConnected(){return this.hasState("connected")}get isRegistered(){return this.hasState("registered")}get isDisconnected(){return this.hasState("disconnected")}get isFailed(){return this.hasState("failed")}get isPending(){return this.isConnecting||this.isInitializing}get isPendingConnect(){return this.isConnecting}get isPendingInitUa(){return this.isInitializing}get isActiveConnection(){return this.isConnected||this.isRegistered}startConnect(){this.toStartConnect()}startInitUa(){this.toStartInitUa()}reset(){this.toIdle()}destroy(){this.unsubscribeFromEvents?.(),this.actorSubscription?.unsubscribe(),this.actor.stop()}onStateChange(e){return this.stateChangeListeners.add(e),()=>{this.stateChangeListeners.delete(e)}}canTransition(e){return this.actor.getSnapshot().can({type:e})}getValidEvents(){return Object.values(Ce).filter(e=>this.canTransition(e))}hasState(e){return this.actor.getSnapshot().matches(e)}sendEvent(e){const t=this.actor.getSnapshot(),s={type:e};if(!t.can(s)){d(`Invalid transition: ${s.type} from ${this.state}. Event cannot be processed in current state.`);return}this.actor.send(s)}toStartConnect=()=>{this.sendEvent("START_CONNECT")};toStartInitUa=()=>{this.sendEvent("START_INIT_UA")};toConnected=()=>{this.sendEvent("UA_CONNECTED")};toRegistered=()=>{this.sendEvent("UA_REGISTERED")};toUnregistered=()=>{this.sendEvent("UA_UNREGISTERED")};toDisconnected=()=>{this.sendEvent("UA_DISCONNECTED")};toFailed=()=>{this.sendEvent("CONNECTION_FAILED")};toIdle=()=>{this.sendEvent("RESET")};subscribeToEvents(){this.events.on("connected",this.toConnected),this.events.on("registered",this.toRegistered),this.events.on("unregistered",this.toUnregistered),this.events.on("disconnected",this.toDisconnected),this.events.on("registrationFailed",this.toFailed),this.unsubscribeFromEvents=()=>{this.events.off("connected",this.toConnected),this.events.off("registered",this.toRegistered),this.events.off("unregistered",this.toUnregistered),this.events.off("disconnected",this.toDisconnected),this.events.off("registrationFailed",this.toFailed)}}}class St{events;getUaProtected;constructor(e){this.events=e.events,this.getUaProtected=e.getUaProtected}async register(){const e=this.getUaProtected();return new Promise((t,s)=>{e.on(A.REGISTERED,t),e.on(A.REGISTRATION_FAILED,s),e.register()})}async unregister(){const e=this.getUaProtected();return new Promise(t=>{e.on(A.UNREGISTERED,t),e.unregister()})}async tryRegister(){try{await this.unregister()}catch(e){d("tryRegister",e)}return this.register()}subscribeToStartEvents(e,t){const s=A.REGISTERED,i=[A.REGISTRATION_FAILED,A.DISCONNECTED];return this.events.on(s,e),i.forEach(r=>{this.events.on(r,t)}),()=>{this.events.off(s,e),i.forEach(r=>{this.events.off(r,t)})}}}class Ct{uaFactory;getUaProtected;constructor(e){this.uaFactory=e.uaFactory,this.getUaProtected=e.getUaProtected}async sendOptions(e,t,s){const i=this.getUaProtected();return new Promise((r,a)=>{try{i.sendOptions(e,t,{extraHeaders:s,eventHandlers:{succeeded:()=>{r()},failed:a}})}catch(o){a(o)}})}async ping(e,t){const i=this.getUaProtected().configuration.uri;return this.sendOptions(i,e,t)}async checkTelephony({userAgent:e,displayName:t,sipServerUrl:s,sipWebSocketServerURL:i,remoteAddress:r,extraHeaders:a}){return new Promise((o,c)=>{const{configuration:h}=this.uaFactory.createConfiguration({sipWebSocketServerURL:i,displayName:t,userAgent:e,sipServerUrl:s}),T=this.uaFactory.createUA({...h,remoteAddress:r,extraHeaders:a}),S=()=>{const E=new Error("Telephony is not available");c(E)};T.once(A.DISCONNECTED,S);const g=()=>{T.removeAllListeners(),T.once(A.DISCONNECTED,()=>{o()}),T.stop()};T.once(A.CONNECTED,g),T.start()})}}const Et=n=>{const e=[];return n!==void 0&&n!==""&&e.push(`X-Vinteo-Remote: ${n}`),e};class y{JsSIP;constructor(e){this.JsSIP=e}static isRegisteredUA(e){return!!e&&e.isRegistered()}static validateConfiguration({register:e,password:t,user:s,sipServerUrl:i,sipWebSocketServerURL:r}){if(!i)throw new Error("sipServerUrl is required");if(!r)throw new Error("sipWebSocketServerURL is required");if(e&&(t===void 0||t===""))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,t){return e&&t!==void 0&&t.trim()!==""?t.trim():`${We()}`}static buildExtraHeaders(e,t){const s=e!==void 0&&e!==""?Et(e):[];return t===void 0?s:[...s,...t]}createConfiguration({user:e,password:t,sipWebSocketServerURL:s,displayName:i="",sipServerUrl:r,register:a=!1,sessionTimers:o=!1,registerExpires:c=300,connectionRecoveryMinInterval:h=2,connectionRecoveryMaxInterval:T=6,userAgent:S}){y.validateConfiguration({register:a,password:t,user:e,sipServerUrl:r,sipWebSocketServerURL:s});const g=y.resolveAuthorizationUser(a,e),E=qe(r),m=E(g),I=new this.JsSIP.WebSocketInterface(s);return{configuration:{password:t,register:a,uri:m,display_name:de(i),user_agent:S,sdpSemantics:"unified-plan",sockets:[I],session_timers:o,register_expires:c,connection_recovery_min_interval:h,connection_recovery_max_interval:T},helpers:{socket:I,getSipServerUrl:E}}}createUA({remoteAddress:e,extraHeaders:t,...s}){const i=new this.JsSIP.UA(s),r=y.buildExtraHeaders(e,t);return r.length>0&&i.registrator().setExtraHeaders(r),i}createUAWithConfiguration(e,t){const{configuration:s,helpers:i}=this.createConfiguration(e),r=this.createUA({...s,remoteAddress:e.remoteAddress,extraHeaders:e.extraHeaders});return t.eachTriggers((a,o)=>{const c=Te.find(h=>h===o);c&&r.on(c,a)}),{ua:r,helpers:i}}}const Ee="Not ready for connection",Ae=n=>n instanceof Error&&n.message===Ee,At=()=>new Error(Ee),Ne=async n=>typeof n=="function"?n():n;class Nt{events;ua;socket;uaFactory;registrationManager;stateMachine;connectionFlow;sipOperations;configurationManager;JsSIP;constructor({JsSIP:e}){this.JsSIP=e,this.events=new D.Events(Se),this.uaFactory=new y(e),this.registrationManager=new St({events:this.events,getUaProtected:this.getUaProtected}),this.stateMachine=new Tt(this.events),this.configurationManager=new dt({getUa:this.getUa}),this.sipOperations=new Ct({uaFactory:this.uaFactory,getUaProtected:this.getUaProtected}),this.connectionFlow=new gt({JsSIP:this.JsSIP,events:this.events,uaFactory:this.uaFactory,stateMachine:this.stateMachine,registrationManager:this.registrationManager,getUa:this.getUa,getConnectionConfiguration:this.getConnectionConfiguration,setConnectionConfiguration:t=>{this.configurationManager.set(t)},updateConnectionConfiguration:(t,s)=>{this.configurationManager.update(t,s)},setUa:t=>{this.ua=t},setSipServerUrl:t=>{this.getSipServerUrl=t},setSocket:t=>{this.socket=t}})}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 isFailed(){return this.stateMachine.isFailed}get connectionState(){return this.stateMachine.state}get isRegistered(){return y.isRegisteredUA(this.ua)}get isRegisterConfig(){return this.configurationManager.isRegister()}connect=async(e,t)=>this.disconnect().catch(s=>{d("connect: disconnect error",s)}).then(async()=>this.connectWithProcessError(e,t));set=async({displayName:e})=>this.connectionFlow.set({displayName:e});disconnect=async()=>{if(this.isConfigured())return this.connectionFlow.disconnect()};async register(){return this.registrationManager.register()}async unregister(){return this.registrationManager.unregister()}tryRegister=async()=>this.registrationManager.tryRegister();sendOptions=async(e,t,s)=>this.sipOperations.sendOptions(e,t,s);ping=async(e,t)=>this.sipOperations.ping(e,t);checkTelephony=async e=>this.sipOperations.checkTelephony(e);on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}isConfigured(){return this.configurationManager.isConfigured()}getConnectionConfiguration=()=>this.configurationManager.get();destroy(){this.stateMachine.destroy()}getSipServerUrl=e=>e;getUaProtected=()=>{if(!this.ua)throw new Error("UA not initialized");return this.ua};getUa=()=>this.ua;connectWithProcessError=async(e,t)=>{if(!(t?.hasReadyForConnection?.()??!0))throw At();return this.processConnect(e,t).catch(async i=>{const r=i;return this.disconnect().then(()=>{throw r}).catch(()=>{throw r})})};processConnect=async(e,t)=>(this.events.trigger(A.CONNECT_STARTED,{}),Ne(e).then(async s=>this.connectionFlow.connect(s,t)).then(s=>(this.events.trigger(A.CONNECT_SUCCEEDED,{ua:s}),s)).catch(s=>{const i=s??new Error("Failed to connect to server");throw this.events.trigger(A.CONNECT_FAILED,i),i}))}class Rt{connectionManager;stackPromises=Y.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()}}var O=(n=>(n.BEFORE_ATTEMPT="before-attempt",n.SUCCEEDED_ATTEMPT="succeeded-attempt",n.FAILED_ATTEMPT="failed-attempt",n.CANCELLED_ATTEMPT="cancelled-attempt",n.CHANGED_ATTEMPT_STATUS="changed-attempt-status",n))(O||{});const Re=["before-attempt","succeeded-attempt","failed-attempt","cancelled-attempt","changed-attempt-status"],j=0,It=30;class pt{events;countInner=j;initialCount=j;limitInner=It;isInProgress=!1;constructor({events:e}){this.events=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.emitStatusChange())}finishAttempt(){this.isInProgress&&(this.isInProgress=!1,this.emitStatusChange())}increment(){this.count<this.limit&&(this.countInner+=1)}reset(){this.countInner=this.initialCount,this.finishAttempt()}emitStatusChange(){this.events.trigger(O.CHANGED_ATTEMPT_STATUS,{isInProgress:this.isInProgress})}}class mt{connectionManager;interval;checkTelephonyByTimeout=void 0;cancelableBeforeRequest=void 0;constructor({connectionManager:e,interval:t}){this.connectionManager=e,this.interval=t}start({onBeforeRequest:e,onSuccessRequest:t,onFailRequest:s}){this.stop(),this.cancelableBeforeRequest=new $.CancelableRequest(e),this.checkTelephonyByTimeout=b.resolveRequesterByTimeout({isDontStopOnFail:!0,requestInterval:this.interval,request:async()=>{if(!this.cancelableBeforeRequest)throw new Error("cancelableBeforeRequest is not defined");const i=await this.cancelableBeforeRequest.request();return this.connectionManager.checkTelephony(i)}}),this.checkTelephonyByTimeout.start(void 0,{onFailRequest:s,onSuccessRequest:()=>{this.stop(),t()}})}stop(){this.checkTelephonyByTimeout?.stop(),this.checkTelephonyByTimeout=void 0,this.cancelableBeforeRequest?.cancelRequest(),this.cancelableBeforeRequest=void 0}}const _t=15e3,Mt=2;class vt{connectionManager;pingServerByTimeoutWithFailCalls;constructor({connectionManager:e}){this.connectionManager=e,this.pingServerByTimeoutWithFailCalls=b.requesterByTimeoutsWithFailCalls(Mt,{whenPossibleRequest:async()=>{},requestInterval:_t,request:async()=>(d("ping"),this.connectionManager.ping().then(()=>{d("ping success")}))})}start({onFailRequest:e}){this.pingServerByTimeoutWithFailCalls.start(void 0,{onFailRequest:e}).catch(d)}stop(){this.pingServerByTimeoutWithFailCalls.stop()}}class Pt{callManager;pingServerRequester;disposeCallStatusChange;constructor({connectionManager:e,callManager:t}){this.callManager=t,this.pingServerRequester=new vt({connectionManager:e})}start({onFailRequest:e}){d("start"),this.disposeCallStatusChange=this.callManager.on("call-status-changed",()=>{this.handleCallStatusChange({onFailRequest:e})}),this.handleCallStatusChange({onFailRequest:e})}stop(){d("stop"),this.pingServerRequester.stop(),this.unsubscribeCallStatusChange()}unsubscribeCallStatusChange(){this.disposeCallStatusChange?.(),this.disposeCallStatusChange=void 0}handleCallStatusChange({onFailRequest:e}){this.callManager.isCallActive?this.pingServerRequester.stop():this.pingServerRequester.start({onFailRequest:e})}}class ft{connectionManager;callManager;isRegistrationFailed=!1;disposers=[];constructor({connectionManager:e,callManager:t}){this.connectionManager=e,this.callManager=t}subscribe(e){this.unsubscribe(),this.disposers.push(this.connectionManager.on("registrationFailed",()=>{this.setIsRegistrationFailed()})),this.disposers.push(this.callManager.on("call-status-changed",({isCallActive:t})=>{!t&&this.isRegistrationFailed&&e()}))}unsubscribe(){this.disposers.forEach(e=>{e()}),this.disposers=[],this.resetIsRegistrationFailed()}setIsRegistrationFailed(){this.isRegistrationFailed=!0}resetIsRegistrationFailed(){this.isRegistrationFailed=!1}}const Ie="Parameters are missing",Ot=n=>n instanceof Error&&n.message===Ie,Dt=()=>new Error(Ie),yt=3e3,bt=15e3,wt=async()=>{};class Ut{events;connectionManager;connectionQueueManager;checkTelephonyRequester;pingServerIfNotActiveCallRequester;registrationFailedOutOfCallSubscriber;attemptsState;delayBetweenAttempts;cancelableRequestBeforeRetry;onBeforeRetry;constructor({connectionQueueManager:e,connectionManager:t,callManager:s},i){const r=i?.onBeforeRetry??wt;this.connectionQueueManager=e,this.connectionManager=t,this.onBeforeRetry=r,this.events=new D.TypedEvents(Re),this.checkTelephonyRequester=new mt({connectionManager:t,interval:i?.checkTelephonyRequestInterval??bt}),this.pingServerIfNotActiveCallRequester=new Pt({connectionManager:t,callManager:s}),this.registrationFailedOutOfCallSubscriber=new ft({connectionManager:t,callManager:s}),this.attemptsState=new pt({events:this.events}),this.cancelableRequestBeforeRetry=new $.CancelableRequest(r),this.delayBetweenAttempts=new b.DelayRequester(i?.timeoutBetweenAttempts??yt)}start(e){d("auto connector start"),this.stop(),this.connect(e).catch(t=>{d("auto connector failed to connect:",t)})}stop(){d("auto connector stop"),this.stopAttempts(),this.stopConnectTriggers(),this.connectionQueueManager.disconnect().catch(e=>{d("auto connector disconnect: error",e)})}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}stopAttempts(){this.attemptsState.isAttemptInProgress&&this.connectionQueueManager.stop(),this.delayBetweenAttempts.cancelRequest(),this.cancelableRequestBeforeRetry.cancelRequest(),this.attemptsState.reset()}stopConnectTriggers(){d("stopConnectTriggers"),this.pingServerIfNotActiveCallRequester.stop(),this.checkTelephonyRequester.stop(),this.registrationFailedOutOfCallSubscriber.unsubscribe()}runCheckTelephony(e){d("runCheckTelephony"),this.checkTelephonyRequester.start({onBeforeRequest:async()=>(await this.onBeforeRetry(),e.getParameters()),onSuccessRequest:()=>{d("runCheckTelephony: onSuccessRequest"),this.connectIfDisconnected(e)},onFailRequest:t=>{d("runCheckTelephony: onFailRequest",t.message)}})}async connect(e){if(d("connect: attempts.count",this.attemptsState.count),this.events.trigger(O.BEFORE_ATTEMPT,{}),this.stopConnectTriggers(),this.attemptsState.hasLimitReached()){d("connect: isLimitReached!"),this.handleLimitReached(e);return}return this.attemptsState.startAttempt(),this.attemptsState.increment(),this.processConnect(e)}async processConnect(e){try{await this.connectionQueueManager.connect(e.getParameters,e.options),d("processConnect success"),this.handleSucceededAttempt(e)}catch(t){if(Ae(t)){this.handleSucceededAttempt(e);return}if(Ot(t)){d("processConnect: parameters not exist error",t);return}if(Y.isPromiseIsNotActualError(t)){d("processConnect: not actual error",t),this.events.trigger(O.CANCELLED_ATTEMPT,t);return}d("processConnect: error",t),this.reconnect(e)}}handleLimitReached(e){this.attemptsState.finishAttempt(),this.events.trigger(O.FAILED_ATTEMPT,new Error("Limit reached")),this.runCheckTelephony(e)}handleSucceededAttempt(e){d("handleSucceededAttempt"),this.subscribeToConnectTriggers(e),this.events.trigger(O.SUCCEEDED_ATTEMPT,{})}subscribeToConnectTriggers(e){this.pingServerIfNotActiveCallRequester.start({onFailRequest:()=>{d("pingServer onFailRequest"),this.start(e)}}),this.registrationFailedOutOfCallSubscriber.subscribe(()=>{d("registrationFailedOutOfCallListener callback"),this.start(e)})}connectIfDisconnected(e){const t=this.hasFailedOrDisconnectedConnection();d("connectIfDisconnected: isFailedOrDisconnected",t),t?this.start(e):(this.stopConnectTriggers(),this.events.trigger(O.SUCCEEDED_ATTEMPT,{}))}reconnect(e){d("reconnect"),this.delayBetweenAttempts.request().then(async()=>(d("reconnect: delayBetweenAttempts success"),this.cancelableRequestBeforeRetry.request())).then(async()=>(d("reconnect: onBeforeRetry success"),this.connect(e))).catch(t=>{const s=t instanceof Error?t:new Error("Failed to reconnect");$.isCanceledError(t)||b.hasCanceledError(t)?this.events.trigger(O.CANCELLED_ATTEMPT,s):this.events.trigger(O.FAILED_ATTEMPT,s),d("reconnect: error",t)})}hasFailedOrDisconnectedConnection(){const{isFailed:e,isDisconnected:t,isIdle:s}=this.connectionManager;return e||t||s}}var L=(n=>(n.INCOMING_CALL="incomingCall",n.DECLINED_INCOMING_CALL="declinedIncomingCall",n.TERMINATED_INCOMING_CALL="terminatedIncomingCall",n.FAILED_INCOMING_CALL="failedIncomingCall",n))(L||{});const pe=["incomingCall","declinedIncomingCall","terminatedIncomingCall","failedIncomingCall"],Lt=486,Bt=487;class Ft{events;incomingRTCSession;connectionManager;constructor(e){this.connectionManager=e,this.events=new D.Events(pe),this.start()}get remoteCallerData(){return{displayName:this.incomingRTCSession?.remote_identity.display_name,host:this.incomingRTCSession?.remote_identity.uri.host,incomingNumber:this.incomingRTCSession?.remote_identity.uri.user,rtcSession: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.removeIncomingSession(),e};async declineToIncomingCall({statusCode:e=Bt}={}){return new Promise((t,s)=>{try{const i=this.getIncomingRTCSession(),r=this.remoteCallerData;this.removeIncomingSession(),this.events.trigger(L.DECLINED_INCOMING_CALL,r),i.terminate({status_code:e}),t()}catch(i){s(i)}})}async busyIncomingCall(){return this.declineToIncomingCall({statusCode:Lt})}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}subscribe(){this.connectionManager.on("newRTCSession",this.handleNewRTCSession)}unsubscribe(){this.connectionManager.off("newRTCSession",this.handleNewRTCSession)}handleNewRTCSession=({originator:e,session:t})=>{e==="remote"&&this.setIncomingSession(t)};setIncomingSession(e){this.incomingRTCSession=e;const t=this.remoteCallerData;e.on("failed",s=>{this.removeIncomingSession(),s.originator==="local"?this.events.trigger(L.TERMINATED_INCOMING_CALL,t):this.events.trigger(L.FAILED_INCOMING_CALL,t)}),this.events.trigger(L.INCOMING_CALL,t)}removeIncomingSession(){delete this.incomingRTCSession}}const U=1e3;var C=(n=>(n.INBOUND_RTP="inbound-rtp",n.REMOTE_OUTBOUND_RTP="remote-outbound-rtp",n.MEDIA_SOURCE="media-source",n.OUTBOUND_RTP="outbound-rtp",n.REMOTE_INBOUND_RTP="remote-inbound-rtp",n.CODEC="codec",n.CANDIDATE_PAIR="candidate-pair",n.CERTIFICATE="certificate",n.TRANSPORT="transport",n.LOCAL_CANDIDATE="local-candidate",n.REMOTE_CANDIDATE="remote-candidate",n))(C||{});const me=["collected"],Z=()=>"performance"in window?performance.now():Date.now(),F=n=>[...n.keys()].reduce((e,t)=>{const s=n.get(t);return s===void 0?e:{...e,[s.type]:s}},{}),kt=n=>{if(!n)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=F(n);return{outboundRtp:e[C.OUTBOUND_RTP],codec:e[C.CODEC],mediaSource:e[C.MEDIA_SOURCE],remoteInboundRtp:e[C.REMOTE_INBOUND_RTP]}},ee=n=>{if(!n)return{outboundRtp:void 0,codec:void 0,mediaSource:void 0,remoteInboundRtp:void 0};const e=F(n);return{outboundRtp:e[C.OUTBOUND_RTP],codec:e[C.CODEC],mediaSource:e[C.MEDIA_SOURCE],remoteInboundRtp:e[C.REMOTE_INBOUND_RTP]}},te=({videoReceiversStats:n,synchronizationSourcesVideo:e})=>{if(!n)return{inboundRtp:void 0,codec:void 0,synchronizationSources:e};const t=F(n);return{inboundRtp:t[C.INBOUND_RTP],codec:t[C.CODEC],synchronizationSources:e}},$t=({audioReceiverStats:n,synchronizationSourcesAudio:e})=>{if(!n)return{inboundRtp:void 0,codec:void 0,remoteOutboundRtp:void 0,synchronizationSources:e};const t=F(n);return{inboundRtp:t[C.INBOUND_RTP],codec:t[C.CODEC],remoteOutboundRtp:t[C.REMOTE_OUTBOUND_RTP],synchronizationSources:e}},_e=n=>{if(!n)return{candidatePair:void 0,certificate:void 0,localCandidate:void 0,remoteCandidate:void 0,transport:void 0};const e=F(n);return{candidatePair:e[C.CANDIDATE_PAIR],certificate:e[C.CERTIFICATE],localCandidate:e[C.LOCAL_CANDIDATE],remoteCandidate:e[C.REMOTE_CANDIDATE],transport:e[C.TRANSPORT]}},qt=({audioSenderStats:n,videoSenderFirstStats:e,videoSenderSecondStats:t})=>({video:ee(e),secondVideo:ee(t),audio:kt(n),additional:_e(n??e??t)}),Vt=({audioReceiverStats:n,videoReceiverFirstStats:e,videoReceiverSecondStats:t,synchronizationSources:s})=>({video:te({videoReceiversStats:e,synchronizationSourcesVideo:s.video}),secondVideo:te({videoReceiversStats:t,synchronizationSourcesVideo:s.video}),audio:$t({audioReceiverStats:n,synchronizationSourcesAudio:s.audio}),additional:_e(n??e??t)}),Wt=({audioSenderStats:n,videoSenderFirstStats:e,videoSenderSecondStats:t,audioReceiverStats:s,videoReceiverFirstStats:i,videoReceiverSecondStats:r,synchronizationSources:a})=>{const o=qt({audioSenderStats:n,videoSenderFirstStats:e,videoSenderSecondStats:t}),c=Vt({audioReceiverStats:s,videoReceiverFirstStats:i,videoReceiverSecondStats:r,synchronizationSources:a});return{outbound:o,inbound:c}},Ht=async n=>{const e="audio",t="video",s=n.getSenders(),i=s.find(g=>g.track?.kind===e),r=s.filter(g=>g.track?.kind===t),a=n.getReceivers(),o=a.find(g=>g.track.kind===e),c=a.filter(g=>g.track.kind===t),h={trackIdentifier:o?.track.id,item:o?.getSynchronizationSources()[0]},T={trackIdentifier:c[0]?.track.id,item:c[0]?.getSynchronizationSources()[0]},S={audio:h,video:T};return Promise.all([i?.getStats()??Promise.resolve(void 0),r[0]?.getStats()??Promise.resolve(void 0),r[1]?.getStats()??Promise.resolve(void 0),o?.getStats()??Promise.resolve(void 0),c[0]?.getStats()??Promise.resolve(void 0),c[1]?.getStats()??Promise.resolve(void 0)]).then(g=>{const[E,m,I,R,w,q]=g;return{synchronizationSources:S,audioSenderStats:E,videoSenderFirstStats:m,videoSenderSecondStats:I,audioReceiverStats:R,videoReceiverFirstStats:w,videoReceiverSecondStats:q}})},xt=n=>{d(String(n))};class Me{events;setTimeoutRequest;requesterAllStatistics=new $.CancelableRequest(Ht);constructor(){this.events=new D.TypedEvents(me),this.setTimeoutRequest=new b.SetTimeoutRequest}get requested(){return this.setTimeoutRequest.requested}start(e,{interval:t=U,onError:s=xt}={}){this.stop(),this.setTimeoutRequest.request(()=>{this.collectStatistics(e,{onError:s})},t)}stop(){this.setTimeoutRequest.cancelRequest(),this.requesterAllStatistics.cancelRequest()}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}collectStatistics=(e,{onError:t})=>{const s=Z();this.requesterAllStatistics.request(e).then(i=>{this.events.trigger("collected",Wt(i));const a=Z()-s;let o=U;a>48?o=U*4:a>32?o=U*3:a>16&&(o=U*2),this.start(e,{onError:t,interval:o})}).catch(i=>{t&&t(i)})}}class Gt{availableIncomingBitrate;statsPeerConnection;callManager;apiManager;previousAvailableIncomingBitrate;constructor({callManager:e,apiManager:t}){this.callManager=e,this.apiManager=t,this.statsPeerConnection=new Me,this.subscribe()}get events(){return this.statsPeerConnection.events}on(e,t){return this.statsPeerConnection.on(e,t)}once(e,t){return this.statsPeerConnection.once(e,t)}onceRace(e,t){return this.statsPeerConnection.onceRace(e,t)}async wait(e){return this.statsPeerConnection.wait(e)}off(e,t){this.statsPeerConnection.off(e,t)}hasAvailableIncomingBitrateChangedQuarter(){const e=this.previousAvailableIncomingBitrate,t=this.availableIncomingBitrate;return e===void 0||t===void 0?!1:e===0?t>0:Math.abs(t-e)/e>=.25}subscribe(){this.callManager.on("peerconnection:confirmed",this.handleStarted),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded),this.statsPeerConnection.on("collected",this.handleStatsCollected)}handleStatsCollected=e=>{this.previousAvailableIncomingBitrate=this.availableIncomingBitrate,this.availableIncomingBitrate=e.inbound.additional.candidatePair?.availableIncomingBitrate,this.maybeSendStats()};handleStarted=e=>{this.statsPeerConnection.start(e)};handleEnded=()=>{this.statsPeerConnection.stop(),this.availableIncomingBitrate=void 0,this.previousAvailableIncomingBitrate=void 0};maybeSendStats(){this.availableIncomingBitrate!==void 0&&this.hasAvailableIncomingBitrateChangedQuarter()&&this.apiManager.sendStats({availableIncomingBitrate:this.availableIncomingBitrate}).catch(e=>{d("Failed to send stats",e)})}}const Qt=(n,e)=>n.filter(s=>e.some(i=>i.clockRate===s.clockRate&&i.mimeType===s.mimeType&&i.channels===s.channels&&i.sdpFmtpLine===s.sdpFmtpLine)),Yt=n=>{const e=RTCRtpSender.getCapabilities(n),t=RTCRtpReceiver.getCapabilities(n),s=e===null?[]:e.codecs,i=t===null?[]:t.codecs;return Qt(s,i)},zt=(n,e)=>e===void 0||e.length===0?n:n.sort((t,s)=>{const i=e.indexOf(t.mimeType),r=e.indexOf(s.mimeType),a=i===-1?Number.MAX_VALUE:i,o=r===-1?Number.MAX_VALUE:r;return a-o}),Xt=(n,e)=>e===void 0||e.length===0?n:n.filter(t=>!e.includes(t.mimeType)),Jt=(n,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:t})=>{try{if(typeof n.setCodecPreferences=="function"&&n.sender.track?.kind==="video"&&(e!==void 0&&e.length>0||t!==void 0&&t.length>0)){const s=Yt("video"),i=Xt(s,t),r=zt(i,e);n.setCodecPreferences(r)}}catch(s){d("setCodecPreferences error",s)}};class Kt{transceivers={};callManager;apiManager;constructor({callManager:e,apiManager:t}){this.callManager=e,this.apiManager=t,this.subscribe()}storeTransceiver(e,t){const{kind:s}=t;if(s==="audio")this.transceivers.mainAudio??=e;else{const{mid:i}=e;i==="2"?this.transceivers.presentationVideo??=e:this.transceivers.mainVideo??=e}}getTransceivers(){return{...this.transceivers}}getMainAudioTransceiver(){return this.transceivers.mainAudio}getMainVideoTransceiver(){return this.transceivers.mainVideo}getPresentationVideoTransceiver(){return this.transceivers.presentationVideo}hasTransceiver(e){return this.transceivers[e]!==void 0}clear(){this.transceivers.mainVideo=void 0,this.transceivers.mainAudio=void 0,this.transceivers.presentationVideo=void 0}getCount(){let e=0;return this.transceivers.mainAudio&&(e+=1),this.transceivers.mainVideo&&(e+=1),this.transceivers.presentationVideo&&(e+=1),e}isEmpty(){return this.getCount()===0}handleRestart=e=>{this.updateTransceivers(e).catch(t=>{d("Failed to update transceivers",t)}).finally(()=>{this.callManager.restartIce().catch(t=>{d("Failed to restart ICE",t)})})};updateTransceivers=async e=>{const{videoTrackCount:t}=e;t===2&&(this.getTransceivers().presentationVideo!==void 0||await this.callManager.addTransceiver("video",{direction:"recvonly"}).catch(r=>{d("Failed to add presentation video transceiver",r)}))};subscribe(){this.callManager.on("peerconnection:ontrack",this.handleTrack),this.callManager.on("failed",this.handleEnded),this.callManager.on("ended",this.handleEnded),this.apiManager.on("restart",this.handleRestart)}handleTrack=e=>{this.storeTransceiver(e.transceiver,e.track)};handleEnded=()=>{this.clear()}}const jt=n=>[...n.keys()].map(e=>n.get(e)),Zt=(n,e)=>jt(n).find(t=>t?.type===e),ve=async n=>n.getStats().then(e=>Zt(e,"codec")?.mimeType);class en{async getCodecFromSender(e){return await ve(e)??""}}class tn{stackPromises=Y.createStackPromises({noRunIsNotActual:!0});async add(e){return this.stackPromises.add(e),this.run()}stop(){this.stackPromises.stop()}async run(){return this.stackPromises().catch(e=>{d("TaskQueue: error",e)})}}class nn{taskQueue;onSetParameters;constructor(e){this.onSetParameters=e,this.taskQueue=new tn}async setEncodingsToSender(e,t){return this.taskQueue.add(async()=>J(e,t,this.onSetParameters))}stop(){this.taskQueue.stop()}}const Pe=(n,e)=>n!==void 0&&e!==void 0&&n.toLowerCase().includes(e.toLowerCase()),sn=1e6,M=n=>n*sn,fe=M(.06),Oe=M(4),rn=n=>n<=64?fe:n<=128?M(.12):n<=256?M(.25):n<=384?M(.32):n<=426?M(.38):n<=640?M(.5):n<=848?M(.7):n<=1280?M(1):n<=1920?M(2):Oe,an="av1",on=n=>Pe(n,an),cn=.6,K=(n,e)=>on(e)?n*cn:n,dn=n=>K(fe,n),hn=n=>K(Oe,n),ne=(n,e)=>{const t=rn(n);return K(t,e)},V=1,ln=({videoTrack:n,targetSize:e})=>{const t=n.getSettings(),s=t.width,i=t.height,r=s===void 0?V:s/e.width,a=i===void 0?V:i/e.height;return Math.max(r,a,V)};class gn{ignoreForCodec;senderFinder;codecProvider;parametersSetter;resultNoChanged={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}};constructor({senderFinder:e,codecProvider:t,parametersSetter:s},i){this.senderFinder=e,this.codecProvider=t,this.parametersSetter=s,this.ignoreForCodec=i.ignoreForCodec}async balance(e,t){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(Pe(r,this.ignoreForCodec))return{...this.resultNoChanged,sender:i};const{mainCam:a,resolutionMainCam:o}=t??{};return this.processSender({mainCam:a,resolutionMainCam:o},{sender:i,codec:r,videoTrack:i.track}).then(c=>({...c,sender:i}))}async processSender(e,t){const{mainCam:s,resolutionMainCam:i}=e;switch(s){case v.PAUSE_MAIN_CAM:return this.downgradeResolutionSender(t);case v.RESUME_MAIN_CAM:return this.setBitrateByTrackResolution(t);case v.MAX_MAIN_CAM_RESOLUTION:return i!==void 0?this.setResolutionSender(i,t):this.setBitrateByTrackResolution(t);case v.ADMIN_STOP_MAIN_CAM:case v.ADMIN_START_MAIN_CAM:case void 0:return this.setBitrateByTrackResolution(t);default:return this.setBitrateByTrackResolution(t)}}async downgradeResolutionSender(e){const{sender:t,codec:s}=e,i={scaleResolutionDownBy:200,maxBitrate:dn(s)};return this.parametersSetter.setEncodingsToSender(t,i)}async setBitrateByTrackResolution(e){const{sender:t,videoTrack:s,codec:i}=e,a=s.getSettings().width,o=a===void 0?hn(i):ne(a,i);return this.parametersSetter.setEncodingsToSender(t,{scaleResolutionDownBy:1,maxBitrate:o})}async setResolutionSender(e,t){const[s,i]=e.split("x"),{sender:r,videoTrack:a,codec:o}=t,c={width:Number(s),height:Number(i)},h=ln({videoTrack:a,targetSize:c}),T=ne(c.width,o),S={scaleResolutionDownBy:h,maxBitrate:T};return this.parametersSetter.setEncodingsToSender(r,S)}}const un=n=>n.find(e=>e.track?.kind==="video");class Tn{findVideoSender(e){return un(e)}}class Sn{currentSender;originalReplaceTrack;lastWidth;lastHeight;maxPollIntervalMs;currentPollIntervalMs;pollIntervalMs;setTimeoutRequest;constructor({pollIntervalMs:e=1e3,maxPollIntervalMs:t}){this.pollIntervalMs=e,this.maxPollIntervalMs=t??e*16,this.currentPollIntervalMs=this.pollIntervalMs,this.setTimeoutRequest=new b.SetTimeoutRequest}subscribe(e,t){if(!e){this.detachSender();return}this.currentSender!==e&&(this.detachSender(),this.attachSender(e,t))}unsubscribe(){this.detachSender()}attachSender(e,t){this.currentSender=e;const s=e.replaceTrack.bind(e);this.originalReplaceTrack=s,e.replaceTrack=async i=>{await s(i),this.attachTrack(t,i??void 0),t()},this.attachTrack(t,e.track)}detachSender(){this.currentSender&&this.originalReplaceTrack&&(this.currentSender.replaceTrack=this.originalReplaceTrack),this.originalReplaceTrack=void 0,this.currentSender=void 0,this.detachTrack()}attachTrack(e,t){if(this.detachTrack(),!t)return;const{width:s,height:i}=t.getSettings();this.lastWidth=s,this.lastHeight=i,this.currentPollIntervalMs=this.pollIntervalMs,this.schedulePoll(t,e)}schedulePoll(e,t){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,t()):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 Cn{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)}}class En{eventHandler;senderBalancer;parametersSetterWithQueue;getConnection;serverHeaders;trackMonitor;constructor(e,t,{ignoreForCodec:s,onSetParameters:i,pollIntervalMs:r}={}){this.getConnection=t,this.eventHandler=new Cn(e),this.parametersSetterWithQueue=new nn(i),this.senderBalancer=new gn({senderFinder:new Tn,codecProvider:new en,parametersSetter:this.parametersSetterWithQueue},{ignoreForCodec:s}),this.trackMonitor=new Sn({pollIntervalMs:r})}subscribe(){this.eventHandler.subscribe(this.handleMainCamControl)}unsubscribe(){this.eventHandler.unsubscribe(),this.parametersSetterWithQueue.stop(),this.reset()}reset(){delete this.serverHeaders,this.trackMonitor.unsubscribe()}async balance(){const e=this.getConnection();if(!e)throw new Error("connection is not exist");const t=await this.senderBalancer.balance(e,this.serverHeaders);return this.trackMonitor.subscribe(t.sender,()=>{this.balance().catch(s=>{d("balance on track change: error",s)})}),t}handleMainCamControl=e=>{this.serverHeaders=e,this.balance().catch(t=>{d("handleMainCamControl: error",t)})}}const De=["balancing-scheduled","balancing-started","balancing-stopped","parameters-updated"];class An{isBalancingActive=!1;events;callManager;balancingStartDelay;videoSendingBalancer;startBalancingTimer;constructor(e,t,s={}){this.events=new D.TypedEvents(De),this.callManager=e,this.balancingStartDelay=s.balancingStartDelay??1e4,this.videoSendingBalancer=new En(t,()=>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()}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}subscribe(){this.callManager.on("peerconnection:confirmed",this.handleCallStarted),this.callManager.on("ended",this.handleCallEnded),this.callManager.on("failed",this.handleCallEnded)}handleCallStarted=()=>{this.scheduleBalancingStart()};handleCallEnded=()=>{this.stopBalancing()};scheduleBalancingStart(){this.clearStartTimer(),this.startBalancingTimer=setTimeout(()=>{this.startBalancingTimer=void 0,this.startBalancing().catch(e=>{d("startBalancing: error",e)})},this.balancingStartDelay),this.events.trigger("balancing-scheduled",{delay:this.balancingStartDelay})}clearStartTimer(){this.startBalancingTimer&&(clearTimeout(this.startBalancingTimer),this.startBalancingTimer=void 0)}}const Nn=1e6,Rn=Re.map(n=>`auto-connect:${n}`),In=Se.map(n=>`connection:${n}`),pn=ce.map(n=>`call:${n}`),mn=re.map(n=>`api:${n}`),_n=pe.map(n=>`incoming-call:${n}`),Mn=ue.map(n=>`presentation:${n}`),vn=me.map(n=>`stats:${n}`),Pn=De.map(n=>`video-balancer:${n}`),fn=[...Rn,...In,...pn,...mn,..._n,...Mn,...vn,...Pn];class On{events;connectionManager;connectionQueueManager;callManager;autoConnectorManager;apiManager;incomingCallManager;presentationManager;statsManager;videoSendingBalancerManager;transceiverManager;preferredMimeTypesVideoCodecs;excludeMimeTypesVideoCodecs;constructor({JsSIP:e},{preferredMimeTypesVideoCodecs:t,excludeMimeTypesVideoCodecs:s,videoBalancerOptions:i,autoConnectorOptions:r}={}){this.preferredMimeTypesVideoCodecs=t,this.excludeMimeTypesVideoCodecs=s,this.events=new D.Events(fn),this.connectionManager=new Nt({JsSIP:e}),this.connectionQueueManager=new Rt({connectionManager:this.connectionManager}),this.callManager=new Ye,this.apiManager=new Fe({connectionManager:this.connectionManager,callManager:this.callManager}),this.incomingCallManager=new Ft(this.connectionManager),this.presentationManager=new ct({callManager:this.callManager,maxBitrate:Nn}),this.statsManager=new Gt({callManager:this.callManager,apiManager:this.apiManager}),this.autoConnectorManager=new Ut({connectionQueueManager:this.connectionQueueManager,connectionManager:this.connectionManager,callManager:this.callManager},r),this.transceiverManager=new Kt({callManager:this.callManager,apiManager:this.apiManager}),this.videoSendingBalancerManager=new An(this.callManager,this.apiManager,i),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 establishedRTCSession(){return this.callManager.establishedRTCSession}get isCallActive(){return this.callManager.isCallActive}get remoteCallerData(){return this.incomingCallManager.remoteCallerData}get isAvailableIncomingCall(){return this.incomingCallManager.isAvailableIncomingCall}on(e,t){return this.events.on(e,t)}once(e,t){return this.events.once(e,t)}onceRace(e,t){return this.events.onceRace(e,t)}async wait(e){return this.events.wait(e)}off(e,t){this.events.off(e,t)}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,t,s)=>this.connectionManager.sendOptions(e,t,s);ping=async(e,t)=>this.connectionManager.ping(e,t);checkTelephony=async e=>this.connectionManager.checkTelephony(e);isConfigured=()=>this.connectionManager.isConfigured();getConnectionConfiguration=()=>this.connectionManager.getConnectionConfiguration();getSipServerUrl=e=>this.connectionManager.getSipServerUrl(e);startAutoConnect=(...e)=>{this.autoConnectorManager.start(...e)};stopAutoConnect=()=>{this.autoConnectorManager.stop()};call=async e=>{const{onAddedTransceiver:t,...s}=e;return this.callManager.startCall(this.connectionManager.getUaProtected(),this.getSipServerUrl,{...s,onAddedTransceiver:this.resolveHandleAddTransceiver(t)})};hangUp=async()=>this.callManager.endCall();answerToIncomingCall=async e=>{const{onAddedTransceiver:t,...s}=e;return this.callManager.answerToIncomingCall(this.incomingCallManager.extractIncomingRTCSession,{...s,onAddedTransceiver:this.resolveHandleAddTransceiver(t)})};declineToIncomingCall=async(...e)=>this.incomingCallManager.declineToIncomingCall(...e);getEstablishedRTCSession=()=>this.callManager.getEstablishedRTCSession();getCallConfiguration=()=>this.callManager.getCallConfiguration();getRemoteStreams=()=>this.callManager.getRemoteStreams();replaceMediaStream=async(...e)=>this.callManager.replaceMediaStream(...e);async startPresentation(e,t={}){const{isP2P:s,callLimit:i,onAddedTransceiver:r,...a}=t;return this.presentationManager.startPresentation(async()=>{s===!0?(await this.apiManager.sendMustStopPresentationP2P(),await this.apiManager.askPermissionToStartPresentationP2P()):await this.apiManager.askPermissionToStartPresentation()},e,{...a,onAddedTransceiver:this.resolveHandleAddTransceiver(r)},i===void 0?void 0:{callLimit:i})}async stopPresentation(e={}){const{isP2P:t}=e;return this.presentationManager.stopPresentation(async()=>{await(t===!0?this.apiManager.sendMustStopPresentationP2P():this.apiManager.sendStoppedPresentation())})}async updatePresentation(e,t={}){const{isP2P:s,onAddedTransceiver:i,...r}=t;return this.presentationManager.updatePresentation(async()=>{s===!0?(await this.apiManager.sendMustStopPresentationP2P(),await this.apiManager.askPermissionToStartPresentationP2P()):await this.apiManager.askPermissionToStartPresentation()},e,{...r,onAddedTransceiver:this.resolveHandleAddTransceiver(i)})}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 sendMustStopPresentationP2P(...e){return this.apiManager.sendMustStopPresentationP2P(...e)}async sendStoppedPresentationP2P(...e){return this.apiManager.sendStoppedPresentationP2P(...e)}async sendStoppedPresentation(...e){return this.apiManager.sendStoppedPresentation(...e)}async askPermissionToStartPresentationP2P(...e){return this.apiManager.askPermissionToStartPresentationP2P(...e)}async askPermissionToStartPresentation(...e){return this.apiManager.askPermissionToStartPresentation(...e)}async askPermissionToEnableCam(...e){return this.apiManager.askPermissionToEnableCam(...e)}setCodecPreferences(e){Jt(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)}bridgeEvents=(e,t)=>{t.events.eachTriggers((s,i)=>{t.on(i,r=>{this.events.trigger(`${e}:${i}`,r)})})};resolveHandleAddTransceiver=e=>async(t,s,i)=>{this.setCodecPreferences(t),await e?.(t,s,i)}}exports.ECallCause=X;exports.EStatsTypes=C;exports.EUseLicense=ie;exports.Originator=ae;exports.SipConnector=On;exports.StatsPeerConnection=Me;exports.createParametersNotExistError=Dt;exports.disableDebug=be;exports.enableDebug=ye;exports.getCodecFromSender=ve;exports.hasCanceledStartPresentationError=ot;exports.hasNotReadyForConnectionError=Ae;exports.logger=d;exports.prepareMediaStream=B;exports.resolveParameters=Ne;exports.setEncodingsToSender=J;exports.setParametersToSender=ge;
@@ -0,0 +1,41 @@
1
+ import { ConnectionManager } from '../ConnectionManager';
2
+ import { CallManager } from '../CallManager';
3
+ import { ConnectionQueueManager } from '../ConnectionQueueManager';
4
+ import { TEventMap, TEvents } from './eventNames';
5
+ import { IAutoConnectorOptions, TParametersAutoConnect } from './types';
6
+ declare class AutoConnectorManager {
7
+ readonly events: TEvents;
8
+ private readonly connectionManager;
9
+ private readonly connectionQueueManager;
10
+ private readonly checkTelephonyRequester;
11
+ private readonly pingServerIfNotActiveCallRequester;
12
+ private readonly registrationFailedOutOfCallSubscriber;
13
+ private readonly attemptsState;
14
+ private readonly delayBetweenAttempts;
15
+ private readonly cancelableRequestBeforeRetry;
16
+ private readonly onBeforeRetry;
17
+ constructor({ connectionQueueManager, connectionManager, callManager, }: {
18
+ connectionQueueManager: ConnectionQueueManager;
19
+ connectionManager: ConnectionManager;
20
+ callManager: CallManager;
21
+ }, options?: IAutoConnectorOptions);
22
+ start(parameters: TParametersAutoConnect): void;
23
+ stop(): void;
24
+ on<T extends keyof TEventMap>(eventName: T, handler: (data: TEventMap[T]) => void): () => void;
25
+ once<T extends keyof TEventMap>(eventName: T, handler: (data: TEventMap[T]) => void): () => void;
26
+ onceRace<T extends keyof TEventMap>(eventNames: T[], handler: (data: TEventMap[T], eventName: string) => void): () => void;
27
+ wait<T extends keyof TEventMap>(eventName: T): Promise<TEventMap[T]>;
28
+ off<T extends keyof TEventMap>(eventName: T, handler: (data: TEventMap[T]) => void): void;
29
+ private stopAttempts;
30
+ private stopConnectTriggers;
31
+ private runCheckTelephony;
32
+ private connect;
33
+ private processConnect;
34
+ private handleLimitReached;
35
+ private handleSucceededAttempt;
36
+ private subscribeToConnectTriggers;
37
+ private connectIfDisconnected;
38
+ private reconnect;
39
+ private hasFailedOrDisconnectedConnection;
40
+ }
41
+ export default AutoConnectorManager;
@@ -0,0 +1,21 @@
1
+ import { TEvents } from './eventNames';
2
+ declare class AttemptsState {
3
+ private readonly events;
4
+ private countInner;
5
+ private readonly initialCount;
6
+ private readonly limitInner;
7
+ private isInProgress;
8
+ constructor({ events }: {
9
+ events: TEvents;
10
+ });
11
+ get count(): number;
12
+ get limit(): number;
13
+ get isAttemptInProgress(): boolean;
14
+ hasLimitReached(): boolean;
15
+ startAttempt(): void;
16
+ finishAttempt(): void;
17
+ increment(): void;
18
+ reset(): void;
19
+ private emitStatusChange;
20
+ }
21
+ export default AttemptsState;
@@ -0,0 +1,19 @@
1
+ import { ConnectionManager } from '../ConnectionManager';
2
+ import { TParametersCheckTelephony } from './types';
3
+ declare class CheckTelephonyRequester {
4
+ private readonly connectionManager;
5
+ private readonly interval;
6
+ private checkTelephonyByTimeout;
7
+ private cancelableBeforeRequest;
8
+ constructor({ connectionManager, interval, }: {
9
+ connectionManager: ConnectionManager;
10
+ interval: number;
11
+ });
12
+ start({ onBeforeRequest, onSuccessRequest, onFailRequest, }: {
13
+ onBeforeRequest: () => Promise<TParametersCheckTelephony>;
14
+ onSuccessRequest: () => void;
15
+ onFailRequest: () => void;
16
+ }): void;
17
+ stop(): void;
18
+ }
19
+ export default CheckTelephonyRequester;
@@ -0,0 +1,18 @@
1
+ import { CallManager } from '../CallManager';
2
+ import { ConnectionManager } from '../ConnectionManager';
3
+ declare class PingServerIfNotActiveCallRequester {
4
+ private readonly callManager;
5
+ private readonly pingServerRequester;
6
+ private disposeCallStatusChange;
7
+ constructor({ connectionManager, callManager, }: {
8
+ connectionManager: ConnectionManager;
9
+ callManager: CallManager;
10
+ });
11
+ start({ onFailRequest }: {
12
+ onFailRequest: () => void;
13
+ }): void;
14
+ stop(): void;
15
+ private unsubscribeCallStatusChange;
16
+ private handleCallStatusChange;
17
+ }
18
+ export default PingServerIfNotActiveCallRequester;
@@ -0,0 +1,13 @@
1
+ import { ConnectionManager } from '../ConnectionManager';
2
+ declare class PingServerRequester {
3
+ private readonly connectionManager;
4
+ private readonly pingServerByTimeoutWithFailCalls;
5
+ constructor({ connectionManager }: {
6
+ connectionManager: ConnectionManager;
7
+ });
8
+ start({ onFailRequest }: {
9
+ onFailRequest: () => void;
10
+ }): void;
11
+ stop(): void;
12
+ }
13
+ export default PingServerRequester;
@@ -0,0 +1,18 @@
1
+ import { CallManager } from '../CallManager';
2
+ import { ConnectionManager } from '../ConnectionManager';
3
+ import { ISubscriber } from './types';
4
+ declare class RegistrationFailedOutOfCallSubscriber implements ISubscriber {
5
+ private readonly connectionManager;
6
+ private readonly callManager;
7
+ private isRegistrationFailed;
8
+ private disposers;
9
+ constructor({ connectionManager, callManager, }: {
10
+ connectionManager: ConnectionManager;
11
+ callManager: CallManager;
12
+ });
13
+ subscribe(callback: () => void): void;
14
+ unsubscribe(): void;
15
+ private setIsRegistrationFailed;
16
+ private resetIsRegistrationFailed;
17
+ }
18
+ export default RegistrationFailedOutOfCallSubscriber;
@@ -0,0 +1,18 @@
1
+ import { TypedEvents } from 'events-constructor';
2
+ import { TAttemptStatus } from './types';
3
+ export declare enum EEvent {
4
+ BEFORE_ATTEMPT = "before-attempt",
5
+ SUCCEEDED_ATTEMPT = "succeeded-attempt",
6
+ FAILED_ATTEMPT = "failed-attempt",
7
+ CANCELLED_ATTEMPT = "cancelled-attempt",
8
+ CHANGED_ATTEMPT_STATUS = "changed-attempt-status"
9
+ }
10
+ export declare const EVENT_NAMES: readonly ["before-attempt", "succeeded-attempt", "failed-attempt", "cancelled-attempt", "changed-attempt-status"];
11
+ export type TEventMap = {
12
+ 'before-attempt': Record<string, never>;
13
+ 'succeeded-attempt': Record<string, never>;
14
+ 'failed-attempt': Error;
15
+ 'cancelled-attempt': Error;
16
+ 'changed-attempt-status': TAttemptStatus;
17
+ };
18
+ export type TEvents = TypedEvents<TEventMap>;
@@ -0,0 +1,3 @@
1
+ export { default as AutoConnectorManager } from './@AutoConnectorManager';
2
+ export { createParametersNotExistError } from './utils';
3
+ export type { IAutoConnectorOptions } from './types';
@@ -0,0 +1,22 @@
1
+ import { ConnectionManager } from '../ConnectionManager';
2
+ import { ConnectionQueueManager } from '../ConnectionQueueManager';
3
+ export interface IAutoConnectorOptions {
4
+ checkTelephonyRequestInterval?: number;
5
+ timeoutBetweenAttempts?: number;
6
+ onBeforeRetry?: () => Promise<void>;
7
+ }
8
+ export type ISubscriber<T = void> = {
9
+ subscribe: (callback: (value: T) => void) => void;
10
+ unsubscribe: () => void;
11
+ };
12
+ export type TParametersCheckTelephony = Parameters<ConnectionManager['checkTelephony']>[0];
13
+ export type TParametersConnect = Parameters<ConnectionQueueManager['connect']>[0] extends (() => Promise<infer T>) | infer T ? T : never;
14
+ type TOptionsConnect = Parameters<ConnectionQueueManager['connect']>[1];
15
+ export type TParametersAutoConnect = {
16
+ getParameters: () => Promise<TParametersConnect & TParametersCheckTelephony>;
17
+ options?: TOptionsConnect;
18
+ };
19
+ export type TAttemptStatus = {
20
+ isInProgress: boolean;
21
+ };
22
+ export {};
@@ -0,0 +1,2 @@
1
+ export declare const hasParametersNotExistError: (error: unknown) => boolean;
2
+ export declare const createParametersNotExistError: () => Error;
@@ -0,0 +1 @@
1
+ export { hasParametersNotExistError, createParametersNotExistError } from './errors';
@@ -10,6 +10,7 @@ declare class CallManager {
10
10
  get establishedRTCSession(): RTCSession | undefined;
11
11
  get isCallActive(): ICallStrategy['isCallActive'];
12
12
  on<T extends keyof TEventMap>(eventName: T, handler: (data: TEventMap[T]) => void): () => void;
13
+ onRace<T extends keyof TEventMap>(eventNames: T[], handler: (data: TEventMap[T], eventName: string) => void): () => void;
13
14
  once<T extends keyof TEventMap>(eventName: T, handler: (data: TEventMap[T]) => void): () => void;
14
15
  onceRace<T extends keyof TEventMap>(eventNames: T[], handler: (data: TEventMap[T], eventName: string) => void): () => void;
15
16
  wait<T extends keyof TEventMap>(eventName: T): Promise<TEventMap[T]>;
@@ -24,5 +25,7 @@ declare class CallManager {
24
25
  addTransceiver: ICallStrategy['addTransceiver'];
25
26
  replaceMediaStream: ICallStrategy['replaceMediaStream'];
26
27
  restartIce: ICallStrategy['restartIce'];
28
+ private subscribeCallStatusChange;
29
+ private maybeTriggerCallStatus;
27
30
  }
28
31
  export default CallManager;
@@ -33,7 +33,8 @@ export declare enum EEvent {
33
33
  FAILED_PRESENTATION = "presentation:failed",
34
34
  PEER_CONNECTION_CONFIRMED = "peerconnection:confirmed",
35
35
  PEER_CONNECTION_ONTRACK = "peerconnection:ontrack",
36
- ENDED_FROM_SERVER = "ended:fromserver"
36
+ ENDED_FROM_SERVER = "ended:fromserver",
37
+ CALL_STATUS_CHANGED = "call-status-changed"
37
38
  }
38
39
  export declare enum Originator {
39
40
  LOCAL = "local",
@@ -41,7 +42,7 @@ export declare enum Originator {
41
42
  SYSTEM = "system"
42
43
  }
43
44
  export declare const SESSION_JSSIP_EVENT_NAMES: readonly ["peerconnection", "connecting", "sending", "progress", "accepted", "confirmed", "ended", "failed", "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"];
44
- export declare const EVENT_NAMES: readonly ["peerconnection", "connecting", "sending", "progress", "accepted", "confirmed", "ended", "failed", "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", "peerconnection:confirmed", "peerconnection:ontrack", "ended:fromserver"];
45
+ export declare const EVENT_NAMES: readonly ["peerconnection", "connecting", "sending", "progress", "accepted", "confirmed", "ended", "failed", "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", "peerconnection:confirmed", "peerconnection:ontrack", "ended:fromserver", "call-status-changed"];
45
46
  export type TEvent = (typeof EVENT_NAMES)[number];
46
47
  export type TEventMap = {
47
48
  peerconnection: {
@@ -81,5 +82,8 @@ export type TEventMap = {
81
82
  'peerconnection:confirmed': RTCPeerConnection;
82
83
  'peerconnection:ontrack': RTCTrackEvent;
83
84
  'ended:fromserver': EndEvent;
85
+ 'call-status-changed': {
86
+ isCallActive: boolean;
87
+ };
84
88
  };
85
89
  export type TEvents = TypedEvents<TEventMap>;
@@ -5,6 +5,10 @@ import { RegisteredEvent, UA, UnRegisteredEvent, WebSocketInterface } from '@kri
5
5
  import { TGetServerUrl } from '../CallManager';
6
6
  import { TJsSIP } from '../types';
7
7
  import { TConnect, TSet } from './ConnectionFlow';
8
+ type TConnectParameters = (() => Promise<Parameters<TConnect>[0]>) | Parameters<TConnect>[0];
9
+ type TConnectOptions = Parameters<TConnect>[1] & {
10
+ hasReadyForConnection?: () => boolean;
11
+ };
8
12
  export default class ConnectionManager {
9
13
  readonly events: Events<typeof EVENT_NAMES>;
10
14
  ua?: UA;
@@ -22,10 +26,13 @@ export default class ConnectionManager {
22
26
  get requested(): boolean;
23
27
  get isPendingConnect(): boolean;
24
28
  get isPendingInitUa(): boolean;
29
+ get isIdle(): boolean;
30
+ get isDisconnected(): boolean;
31
+ get isFailed(): boolean;
25
32
  get connectionState(): import('./ConnectionStateMachine').EState;
26
33
  get isRegistered(): boolean;
27
34
  get isRegisterConfig(): boolean;
28
- connect: TConnect;
35
+ connect: (parameters: TConnectParameters, options?: TConnectOptions) => Promise<UA>;
29
36
  set: TSet;
30
37
  disconnect: () => Promise<void>;
31
38
  register(): Promise<RegisteredEvent>;
@@ -45,4 +52,7 @@ export default class ConnectionManager {
45
52
  getSipServerUrl: TGetServerUrl;
46
53
  readonly getUaProtected: () => UA;
47
54
  private readonly getUa;
55
+ private readonly connectWithProcessError;
56
+ private readonly processConnect;
48
57
  }
58
+ export {};
@@ -3,14 +3,18 @@ export declare enum EEvent {
3
3
  CONNECTING = "connecting",
4
4
  CONNECTED = "connected",
5
5
  DISCONNECTED = "disconnected",
6
+ DISCONNECTING = "disconnecting",
6
7
  NEW_RTC_SESSION = "newRTCSession",
7
8
  REGISTERED = "registered",
8
9
  UNREGISTERED = "unregistered",
9
10
  REGISTRATION_FAILED = "registrationFailed",
10
11
  NEW_MESSAGE = "newMessage",
11
- SIP_EVENT = "sipEvent"
12
+ SIP_EVENT = "sipEvent",
13
+ CONNECT_STARTED = "connect-started",
14
+ CONNECT_SUCCEEDED = "connect-succeeded",
15
+ CONNECT_FAILED = "connect-failed"
12
16
  }
13
17
  export declare const UA_EVENT_NAMES: readonly ["connecting", "connected", "disconnected", "newRTCSession", "registered", "unregistered", "registrationFailed", "newMessage", "sipEvent"];
14
- export declare const EVENT_NAMES: ("connecting" | "connected" | "disconnected" | "newRTCSession" | "registered" | "unregistered" | "registrationFailed" | "newMessage" | "sipEvent")[];
18
+ export declare const EVENT_NAMES: readonly ["connecting", "connected", "disconnected", "newRTCSession", "registered", "unregistered", "registrationFailed", "newMessage", "sipEvent", "disconnecting", "connect-started", "connect-succeeded", "connect-failed"];
15
19
  export type TEvent = (typeof EVENT_NAMES)[number];
16
20
  export type TEvents = Events<typeof EVENT_NAMES>;
@@ -1,3 +1,4 @@
1
1
  export { default as ConnectionManager } from './@ConnectionManager';
2
2
  export { EVENT_NAMES as CONNECTION_MANAGER_EVENT_NAMES, EEvent as EConnectionManagerEvent, } from './eventNames';
3
3
  export type { TEvent as TConnectionManagerEvent, TEvents as TConnectionManagerEvents, } from './eventNames';
4
+ export { hasNotReadyForConnectionError, resolveParameters } from './utils';
@@ -0,0 +1,2 @@
1
+ export declare const hasNotReadyForConnectionError: (error: unknown) => boolean;
2
+ export declare const createNotReadyForConnectionError: () => Error;
@@ -0,0 +1,2 @@
1
+ export { hasNotReadyForConnectionError, createNotReadyForConnectionError } from './errors';
2
+ export { default as resolveParameters } from './resolveParameters';
@@ -0,0 +1,2 @@
1
+ declare const resolveParameters: <T extends object>(parameters: (() => Promise<T>) | T) => Promise<T>;
2
+ export default resolveParameters;
@@ -7,12 +7,6 @@ declare class ConnectionQueueManager {
7
7
  });
8
8
  connect: ConnectionManager['connect'];
9
9
  disconnect: ConnectionManager['disconnect'];
10
- register: ConnectionManager['register'];
11
- unregister: ConnectionManager['unregister'];
12
- tryRegister: ConnectionManager['tryRegister'];
13
- checkTelephony: ConnectionManager['checkTelephony'];
14
- sendOptions: ConnectionManager['sendOptions'];
15
- ping: ConnectionManager['ping'];
16
- set: ConnectionManager['set'];
10
+ stop(): void;
17
11
  }
18
12
  export default ConnectionQueueManager;
@@ -1 +1,2 @@
1
1
  export { default as ConnectionQueueManager } from './@ConnectionQueueManager';
2
+ export { isPromiseIsNotActualError as hasConnectionPromiseIsNotActualError } from 'stack-promises';
@@ -1,6 +1,7 @@
1
1
  import { Events } from 'events-constructor';
2
2
  import { ApiManager } from '../ApiManager';
3
- import { default as CallManager } from '../CallManager/@CallManager';
3
+ import { AutoConnectorManager, IAutoConnectorOptions } from '../AutoConnectorManager';
4
+ import { CallManager, TGetServerUrl } from '../CallManager';
4
5
  import { ConnectionManager } from '../ConnectionManager';
5
6
  import { ConnectionQueueManager } from '../ConnectionQueueManager';
6
7
  import { IncomingCallManager } from '../IncomingCallManager';
@@ -9,7 +10,6 @@ import { StatsManager } from '../StatsManager';
9
10
  import { TransceiverManager } from '../TransceiverManager';
10
11
  import { VideoSendingBalancerManager } from '../VideoSendingBalancerManager';
11
12
  import { EVENT_NAMES, TEvent } from './eventNames';
12
- import { TGetServerUrl } from '../CallManager';
13
13
  import { TJsSIP } from '../types';
14
14
  import { IBalancerOptions } from '../VideoSendingBalancer';
15
15
  declare class SipConnector {
@@ -17,6 +17,7 @@ declare class SipConnector {
17
17
  readonly connectionManager: ConnectionManager;
18
18
  readonly connectionQueueManager: ConnectionQueueManager;
19
19
  readonly callManager: CallManager;
20
+ readonly autoConnectorManager: AutoConnectorManager;
20
21
  readonly apiManager: ApiManager;
21
22
  readonly incomingCallManager: IncomingCallManager;
22
23
  readonly presentationManager: PresentationManager;
@@ -27,10 +28,11 @@ declare class SipConnector {
27
28
  private readonly excludeMimeTypesVideoCodecs?;
28
29
  constructor({ JsSIP }: {
29
30
  JsSIP: TJsSIP;
30
- }, { preferredMimeTypesVideoCodecs, excludeMimeTypesVideoCodecs, videoBalancerOptions, }?: {
31
+ }, { preferredMimeTypesVideoCodecs, excludeMimeTypesVideoCodecs, videoBalancerOptions, autoConnectorOptions, }?: {
31
32
  preferredMimeTypesVideoCodecs?: string[];
32
33
  excludeMimeTypesVideoCodecs?: string[];
33
34
  videoBalancerOptions?: IBalancerOptions;
35
+ autoConnectorOptions?: IAutoConnectorOptions;
34
36
  });
35
37
  get requestedConnection(): boolean;
36
38
  get isPendingConnect(): boolean;
@@ -51,17 +53,19 @@ declare class SipConnector {
51
53
  wait<T>(eventName: TEvent): Promise<T>;
52
54
  off<T>(eventName: TEvent, handler: (data: T) => void): void;
53
55
  connect: ConnectionManager['connect'];
54
- set: ConnectionManager['set'];
55
56
  disconnect: () => Promise<void>;
56
57
  register: () => Promise<import('@krivega/jssip').RegisteredEvent>;
57
58
  unregister: () => Promise<import('@krivega/jssip').UnRegisteredEvent>;
58
59
  tryRegister: () => Promise<import('@krivega/jssip').RegisteredEvent>;
60
+ set: ConnectionManager['set'];
59
61
  sendOptions: (target: Parameters<ConnectionManager["sendOptions"]>[0], body?: Parameters<ConnectionManager["sendOptions"]>[1], extraHeaders?: Parameters<ConnectionManager["sendOptions"]>[2]) => Promise<void>;
60
62
  ping: (body?: Parameters<ConnectionManager["ping"]>[0], extraHeaders?: Parameters<ConnectionManager["ping"]>[1]) => Promise<void>;
61
63
  checkTelephony: ConnectionManager['checkTelephony'];
62
64
  isConfigured: () => boolean;
63
65
  getConnectionConfiguration: () => import('../ConnectionManager/ConfigurationManager').IConnectionConfiguration;
64
66
  getSipServerUrl: TGetServerUrl;
67
+ startAutoConnect: AutoConnectorManager['start'];
68
+ stopAutoConnect: AutoConnectorManager['stop'];
65
69
  call: (params: Parameters<CallManager["startCall"]>[2]) => Promise<RTCPeerConnection>;
66
70
  hangUp: CallManager['endCall'];
67
71
  answerToIncomingCall: (params: Parameters<CallManager["answerToIncomingCall"]>[1]) => Promise<RTCPeerConnection>;