sip-connector 14.1.0-alpha.1 → 14.1.0-alpha.11

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 (55) hide show
  1. package/dist/{SipConnector-CK3GgjXE.js → @SipConnector-C-ThpS1P.js} +459 -680
  2. package/dist/@SipConnector-Xh6_JpUI.cjs +1 -0
  3. package/dist/ApiManager/@ApiManager.d.ts +2 -2
  4. package/dist/ApiManager/constants.d.ts +1 -1
  5. package/dist/ApiManager/eventNames.d.ts +1 -1
  6. package/dist/ApiManager/index.d.ts +1 -0
  7. package/dist/CallManager/causes.d.ts +2 -1
  8. package/dist/CallManager/eventNames.d.ts +1 -1
  9. package/dist/CallManager/index.d.ts +2 -0
  10. package/dist/CallManager/types.d.ts +1 -1
  11. package/dist/ConnectionManager/@ConnectionManager.d.ts +3 -2
  12. package/dist/ConnectionManager/ConnectionFlow.d.ts +3 -2
  13. package/dist/ConnectionManager/ConnectionStateMachine.d.ts +1 -1
  14. package/dist/ConnectionManager/RegistrationManager.d.ts +1 -1
  15. package/dist/ConnectionManager/eventNames.d.ts +1 -1
  16. package/dist/IncomingCallManager/@IncomingCallManager.d.ts +3 -2
  17. package/dist/PresentationManager/@PresentationManager.d.ts +2 -2
  18. package/dist/PresentationManager/eventNames.d.ts +1 -1
  19. package/dist/PresentationManager/index.d.ts +1 -0
  20. package/dist/{SipConnector.d.ts → SipConnector/@SipConnector.d.ts} +19 -30
  21. package/dist/SipConnector/eventNames.d.ts +4 -0
  22. package/dist/SipConnector/index.d.ts +2 -0
  23. package/dist/SipConnectorFacade/SipConnectorFacade.d.ts +10 -28
  24. package/dist/__fixtures__/BaseSession.mock.d.ts +5 -5
  25. package/dist/__fixtures__/RTCPeerConnectionMock.d.ts +6 -0
  26. package/dist/__fixtures__/RTCSessionMock.d.ts +5 -5
  27. package/dist/__fixtures__/UA.mock.d.ts +1 -1
  28. package/dist/{eventNames.d.ts → __fixtures__/eventNames.d.ts} +1 -1
  29. package/dist/doMock.cjs +1 -1
  30. package/dist/doMock.d.ts +1 -1
  31. package/dist/doMock.js +219 -137
  32. package/dist/index.cjs +1 -1
  33. package/dist/index.d.ts +9 -8
  34. package/dist/index.js +512 -546
  35. package/dist/tools/__fixtures__/processRequest.d.ts +1 -1
  36. package/dist/tools/error/getLinkError.d.ts +1 -1
  37. package/dist/tools/error/getTypeFromError.d.ts +1 -1
  38. package/dist/tools/error/getValuesFromError.d.ts +1 -1
  39. package/dist/tools/prepareMediaStream.d.ts +1 -1
  40. package/dist/tools/setVideoTrackContentHints.d.ts +1 -1
  41. package/dist/tools/syncMediaState/index.d.ts +1 -1
  42. package/dist/tools/syncMediaState/resolveOnStartMainCam.d.ts +1 -1
  43. package/dist/tools/syncMediaState/resolveOnStartMic.d.ts +1 -1
  44. package/dist/tools/syncMediaState/resolveOnStopMainCam.d.ts +1 -1
  45. package/dist/tools/syncMediaState/resolveOnStopMic.d.ts +1 -1
  46. package/dist/types.d.ts +0 -46
  47. package/dist/videoSendingBalancer/balance.d.ts +1 -1
  48. package/dist/videoSendingBalancer/index.d.ts +1 -1
  49. package/dist/videoSendingBalancer/processSender.d.ts +1 -1
  50. package/package.json +3 -3
  51. package/dist/SipConnector-CwI8aFEA.cjs +0 -1
  52. package/dist/causes.d.ts +0 -23
  53. package/dist/headers.d.ts +0 -37
  54. /package/dist/{getExtraHeadersRemoteAddress.d.ts → ConnectionManager/getExtraHeadersRemoteAddress.d.ts} +0 -0
  55. /package/dist/{constants.d.ts → __fixtures__/constants.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ "use strict";const f=require("events-constructor");require("@krivega/cancelable-promise");const k=require("debug"),W=require("repeated-calls"),G=require("xstate");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))(N||{}),v=(n=>(n.LOCAL="local",n.REMOTE="remote",n.SYSTEM="system",n))(v||{});const B=["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"],Z=["peerconnection:confirmed","peerconnection:ontrack","ended:fromserver"],q=[...B,...Z];function ee(n){return e=>`sip:${e}@${n}`}const te=(n,e)=>()=>Math.floor(Math.random()*(e-n))+n,x=n=>n.trim().replaceAll(" ","_"),ne=te(1e5,99999999),se=n=>n.some(t=>{const{kind:s}=t;return s==="video"}),ie=(n,e)=>{n.getVideoTracks().forEach(s=>{"contentHint"in s&&s.contentHint!==e&&(s.contentHint=e)})},y=(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"&&ie(o,s),o};class re{isPendingCall=!1;isPendingAnswer=!1;rtcSession;remoteStreams={};events;callConfiguration={};constructor(e){this.events=e}}var V=(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))(V||{});class ae{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 oe extends re{remoteStreamsManager=new ae;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:g,contentHint:d,offerToReceiveAudio:S=!0,offerToReceiveVideo:l=!0,sendEncodings:E,onAddedTransceiver:I})=>(this.isPendingCall=!0,new Promise((C,P)=>{this.callConfiguration.number=s,this.callConfiguration.answer=!1,this.handleCall({ontrack:a}).then(C).catch(b=>{P(b)}),this.rtcSession=e.call(t(s),{extraHeaders:r,mediaStream:y(i,{directionVideo:c,directionAudio:g,contentHint:d}),eventHandlers:this.events.triggers,directionVideo:c,directionAudio:g,pcConfig:{iceServers:o},rtcOfferConstraints:{offerToReceiveAudio:S,offerToReceiveVideo:l},sendEncodings:E,onAddedTransceiver:I})}).finally(()=>{this.isPendingCall=!1}));async endCall(){const{rtcSession:e}=this;if(e&&!e.isEnded())return e.terminateAsync({cause:V.CANCELED}).finally(()=>{this.reset()});this.reset()}answerToIncomingCall=async(e,{mediaStream:t,ontrack:s,extraHeaders:i=[],iceServers:r,directionVideo:a,directionAudio:o,offerToReceiveAudio:c,offerToReceiveVideo:g,contentHint:d,sendEncodings:S,onAddedTransceiver:l})=>(this.isPendingAnswer=!0,new Promise((E,I)=>{try{const C=e();this.rtcSession=C,this.subscribeToSessionEvents(C),this.callConfiguration.answer=!0,this.callConfiguration.number=C.remote_identity.uri.user,this.handleCall({ontrack:s}).then(E).catch(b=>{I(b)});const P=y(t,{directionVideo:a,directionAudio:o,contentHint:d});C.answer({extraHeaders:i,directionVideo:a,directionAudio:o,mediaStream:P,pcConfig:{iceServers:r},rtcOfferConstraints:{offerToReceiveAudio:c,offerToReceiveVideo:g},sendEncodings:S,onAddedTransceiver:l})}catch(C){I(C)}}).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 se(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=y(e,{contentHint:s});if(i===void 0)throw new Error("No preparedMediaStream");return this.rtcSession.replaceMediaStream(i,t)}handleCall=async({ontrack:e})=>new Promise((t,s)=>{const i=()=>{this.events.on(N.PEER_CONNECTION,d),this.events.on(N.CONFIRMED,S)},r=()=>{this.events.off(N.PEER_CONNECTION,d),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=l=>{r(),o(),s(l)};let g;const d=({peerconnection:l})=>{g=l;const E=I=>{this.events.trigger(N.PEER_CONNECTION_ONTRACK,l),e&&e(I)};l.addEventListener("track",E),this.disposers.add(()=>{l.removeEventListener("track",E)})},S=()=>{g!==void 0&&this.events.trigger(N.PEER_CONNECTION_CONFIRMED,g),r(),o(),t(g)};i(),a()});subscribeToSessionEvents(e){this.events.eachTriggers((t,s)=>{const i=B.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===v.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 ce{events;strategy;constructor(e){this.events=new f.Events(q),this.strategy=e??new oe(this.events)}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)}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();replaceMediaStream=async(...e)=>this.strategy.replaceMediaStream(...e)}const H="sip-connector",p=k(H),ge=()=>{k.enable(H)},Te=()=>{k.enable(`-${H}`)},he="Error decline with 603",de=1006,le=n=>typeof n=="object"&&n!==null&&"code"in n&&n.code===de,Ee=n=>n.message===he;var h=(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))(h||{}),U=(n=>(n.AVAILABLE_SECOND_REMOTE_STREAM="YOUCANRECEIVECONTENT",n.NOT_AVAILABLE_SECOND_REMOTE_STREAM="CONTENTEND",n.MUST_STOP_PRESENTATION="YOUMUSTSTOPSENDCONTENT",n))(U||{}),w=(n=>(n.SPECTATOR="SPECTATOR",n.PARTICIPANT="PARTICIPANT",n))(w||{}),M=(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))(M||{}),_=(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))(_||{}),m=(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))(m||{}),L=(n=>(n.ADMIN_STOP_MIC="ADMINSTOPMIC",n.ADMIN_START_MIC="ADMINSTARTMIC",n))(L||{}),F=(n=>(n.ADMIN_SYNC_FORCED="1",n.ADMIN_SYNC_NOT_FORCED="0",n))(F||{}),Y=(n=>(n.AUDIO="AUDIO",n.VIDEO="VIDEO",n.AUDIOPLUSPRESENTATION="AUDIOPLUSPRESENTATION",n))(Y||{}),T=(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))(T||{});const z=["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"];var A=(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))(A||{});class Se{events;connectionManager;callManager;constructor({connectionManager:e,callManager:t}){this.connectionManager=e,this.callManager=t,this.events=new f.Events(z),this.subscribe()}async waitChannels(){return this.wait(T.CHANNELS)}async waitSyncMediaState(){return this.wait(T.ADMIN_FORCE_SYNC_MEDIA_STATE)}async sendDTMF(e){return new Promise((t,s)=>{const i=this.callManager.getEstablishedRTCSession();if(!i){s(new Error("No rtcSession established"));return}this.callManager.once("newDTMF",({originator:r})=>{r===v.LOCAL&&t()}),i.sendDTMF(e,{duration:120,interToneGap:600})})}async sendChannels({inputChannels:e,outputChannels:t}){const s=this.callManager.getEstablishedRTCSession();if(!s)throw new Error("No rtcSession established");const i=`${h.INPUT_CHANNELS}: ${e}`,r=`${h.OUTPUT_CHANNELS}: ${t}`,a=[i,r];return s.sendInfo(_.CHANNELS,void 0,{extraHeaders:a})}async sendMediaState({cam:e,mic:t},s={}){const i=this.callManager.getEstablishedRTCSession();if(!i)throw new Error("No rtcSession established");const r=`${h.MEDIA_STATE}: currentstate`,a=`${h.MAIN_CAM_STATE}: ${Number(e)}`,o=`${h.MIC_STATE}: ${Number(t)}`,c=[r,a,o];return i.sendInfo(_.MEDIA_STATE,void 0,{noTerminateWhenError:!0,...s,extraHeaders:c})}async sendRefusalToTurnOn(e,t={}){const s=this.callManager.getEstablishedRTCSession();if(!s)throw new Error("No rtcSession established");const a=e==="mic"?0:1,c=[`${h.MEDIA_TYPE}: ${a}`];return s.sendInfo(_.REFUSAL,void 0,{noTerminateWhenError:!0,...t,extraHeaders:c})}async sendRefusalToTurnOnMic(e={}){if(!this.callManager.getEstablishedRTCSession())throw new Error("No rtcSession established");return this.sendRefusalToTurnOn("mic",{noTerminateWhenError:!0,...e})}async sendRefusalToTurnOnCam(e={}){if(!this.callManager.getEstablishedRTCSession())throw new Error("No rtcSession established");return this.sendRefusalToTurnOn("cam",{noTerminateWhenError:!0,...e})}async sendMustStopPresentationP2P(){const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");await e.sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[h.MUST_STOP_PRESENTATION_P2P]})}async sendStoppedPresentationP2P(){const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");await e.sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[h.STOP_PRESENTATION_P2P]})}async sendStoppedPresentation(){const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");await e.sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[h.STOP_PRESENTATION]})}async askPermissionToStartPresentationP2P(){const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");await e.sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[h.START_PRESENTATION_P2P]})}async askPermissionToStartPresentation(){const e=this.callManager.getEstablishedRTCSession();if(!e)throw new Error("No rtcSession established");await e.sendInfo(_.SHARE_STATE,void 0,{extraHeaders:[h.START_PRESENTATION]})}async askPermissionToEnableCam(e={}){const t=this.callManager.getEstablishedRTCSession();if(!t)throw new Error("No rtcSession established");const s=[h.ENABLE_MAIN_CAM];return t.sendInfo(_.MAIN_CAM,void 0,{noTerminateWhenError:!0,...e,extraHeaders:s}).catch(i=>{if(Ee(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)}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(h.NOTIFY);if(t){const s=JSON.parse(t);this.handleNotify(s)}}catch(t){p("error parse notify",t)}};handleNotify=e=>{switch(e.cmd){case A.CHANNELS:{const t=e;this.triggerChannelsNotify(t);break}case A.WEBCAST_STARTED:{const t=e;this.triggerWebcastStartedNotify(t);break}case A.WEBCAST_STOPPED:{const t=e;this.triggerWebcastStoppedNotify(t);break}case A.ADDED_TO_LIST_MODERATORS:{const t=e;this.triggerAddedToListModeratorsNotify(t);break}case A.REMOVED_FROM_LIST_MODERATORS:{const t=e;this.triggerRemovedFromListModeratorsNotify(t);break}case A.ACCEPTING_WORD_REQUEST:{const t=e;this.triggerParticipationAcceptingWordRequest(t);break}case A.CANCELLING_WORD_REQUEST:{const t=e;this.triggerParticipationCancellingWordRequest(t);break}case A.MOVE_REQUEST_TO_STREAM:{const t=e;this.triggerParticipantMoveRequestToStream(t);break}case A.ACCOUNT_CHANGED:{this.triggerAccountChangedNotify();break}case A.ACCOUNT_DELETED:{this.triggerAccountDeletedNotify();break}case A.CONFERENCE_PARTICIPANT_TOKEN_ISSUED:{const t=e;this.triggerConferenceParticipantTokenIssued(t);break}default:p("unknown cmd",e)}};handleNewInfo=e=>{const{originator:t}=e;if(t!==v.REMOTE)return;const{request:s}=e,i=s.getHeader(h.CONTENT_TYPE);if(i!==void 0)switch(i){case M.ENTER_ROOM:{this.triggerEnterRoom(s),this.maybeTriggerChannels(s);break}case M.NOTIFY:{this.maybeHandleNotify(s);break}case M.SHARE_STATE:{this.triggerShareState(s);break}case M.MAIN_CAM:{this.triggerMainCamControl(s);break}case M.MIC:{this.triggerMicControl(s);break}case M.USE_LICENSE:{this.triggerUseLicense(s);break}case M.PARTICIPANT_STATE:{this.maybeTriggerParticipantMoveRequest(s);break}}};triggerChannelsNotify=e=>{const t=e.input,s=e.output,i={inputChannels:t,outputChannels:s};this.events.trigger(T.CHANNELS_NOTIFY,i)};triggerWebcastStartedNotify=({body:{conference:e,type:t}})=>{const s={conference:e,type:t};this.events.trigger(T.WEBCAST_STARTED,s)};triggerWebcastStoppedNotify=({body:{conference:e,type:t}})=>{const s={conference:e,type:t};this.events.trigger(T.WEBCAST_STOPPED,s)};triggerAddedToListModeratorsNotify=({conference:e})=>{const t={conference:e};this.events.trigger(T.PARTICIPANT_ADDED_TO_LIST_MODERATORS,t)};triggerRemovedFromListModeratorsNotify=({conference:e})=>{const t={conference:e};this.events.trigger(T.PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,t)};triggerParticipationAcceptingWordRequest=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(T.PARTICIPATION_ACCEPTING_WORD_REQUEST,t)};triggerParticipationCancellingWordRequest=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(T.PARTICIPATION_CANCELLING_WORD_REQUEST,t)};triggerParticipantMoveRequestToStream=({body:{conference:e}})=>{const t={conference:e};this.events.trigger(T.PARTICIPANT_MOVE_REQUEST_TO_STREAM,t)};triggerAccountChangedNotify=()=>{this.events.trigger(T.ACCOUNT_CHANGED,void 0)};triggerAccountDeletedNotify=()=>{this.events.trigger(T.ACCOUNT_DELETED,void 0)};triggerConferenceParticipantTokenIssued=({body:{conference:e,participant:t,jwt:s}})=>{const i={conference:e,participant:t,jwt:s};this.events.trigger(T.CONFERENCE_PARTICIPANT_TOKEN_ISSUED,i)};maybeTriggerChannels=e=>{const t=e.getHeader(h.INPUT_CHANNELS),s=e.getHeader(h.OUTPUT_CHANNELS);if(t&&s){const i={inputChannels:t,outputChannels:s};this.events.trigger(T.CHANNELS,i)}};triggerEnterRoom=e=>{const t=e.getHeader(h.CONTENT_ENTER_ROOM),s=e.getHeader(h.PARTICIPANT_NAME);this.events.trigger(T.ENTER_ROOM,{room:t,participantName:s})};triggerShareState=e=>{const t=e.getHeader(h.CONTENT_SHARE_STATE);if(t!==void 0)switch(t){case U.AVAILABLE_SECOND_REMOTE_STREAM:{this.events.trigger(T.AVAILABLE_SECOND_REMOTE_STREAM,void 0);break}case U.NOT_AVAILABLE_SECOND_REMOTE_STREAM:{this.events.trigger(T.NOT_AVAILABLE_SECOND_REMOTE_STREAM,void 0);break}case U.MUST_STOP_PRESENTATION:{this.events.trigger(T.MUST_STOP_PRESENTATION,void 0);break}}};maybeTriggerParticipantMoveRequest=e=>{const t=e.getHeader(h.CONTENT_PARTICIPANT_STATE);t===w.SPECTATOR&&this.events.trigger(T.PARTICIPANT_MOVE_REQUEST_TO_SPECTATORS,void 0),t===w.PARTICIPANT&&this.events.trigger(T.PARTICIPANT_MOVE_REQUEST_TO_PARTICIPANTS,void 0)};triggerMainCamControl=e=>{const t=e.getHeader(h.MAIN_CAM),s=e.getHeader(h.MEDIA_SYNC),i=s===F.ADMIN_SYNC_FORCED;if(t===m.ADMIN_START_MAIN_CAM){this.events.trigger(T.ADMIN_START_MAIN_CAM,{isSyncForced:i});return}if(t===m.ADMIN_STOP_MAIN_CAM){this.events.trigger(T.ADMIN_STOP_MAIN_CAM,{isSyncForced:i});return}(t===m.RESUME_MAIN_CAM||t===m.PAUSE_MAIN_CAM)&&s!==void 0&&this.events.trigger(T.ADMIN_FORCE_SYNC_MEDIA_STATE,{isSyncForced:i});const r=e.getHeader(h.MAIN_CAM_RESOLUTION);this.events.trigger(T.MAIN_CAM_CONTROL,{mainCam:t,resolutionMainCam:r})};triggerMicControl=e=>{const t=e.getHeader(h.MIC),i=e.getHeader(h.MEDIA_SYNC)===F.ADMIN_SYNC_FORCED;t===L.ADMIN_START_MIC?this.events.trigger(T.ADMIN_START_MIC,{isSyncForced:i}):t===L.ADMIN_STOP_MIC&&this.events.trigger(T.ADMIN_STOP_MIC,{isSyncForced:i})};triggerUseLicense=e=>{const t=e.getHeader(h.CONTENT_USE_LICENSE);this.events.trigger(T.USE_LICENSE,t)}}var R=(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))(R||{});const Q=["presentation:start","presentation:started","presentation:end","presentation:ended","presentation:failed"],Ce=1,Ne=n=>W.hasCanceledError(n);class ue{events;promisePendingStartPresentation;promisePendingStopPresentation;streamPresentationCurrent;cancelableSendPresentationWithRepeatedCalls;callManager;constructor({callManager:e}){this.callManager=e,this.events=new f.Events(Q),this.subscribe()}get isPendingPresentation(){return!!this.promisePendingStartPresentation||!!this.promisePendingStopPresentation}async startPresentation(e,t,{isNeedReinvite:s,maxBitrate:i,contentHint:r,sendEncodings:a,onAddedTransceiver:o}={},c){const g=this.getRtcSessionProtected();if(this.streamPresentationCurrent)throw new Error("Presentation is already started");return this.sendPresentationWithDuplicatedCalls(e,{rtcSession:g,stream:t,presentationOptions:{isNeedReinvite:s,maxBitrate:i,contentHint:r,sendEncodings:a,onAddedTransceiver:o},options:c})}async stopPresentation(e){this.cancelSendPresentationWithRepeatedCalls();const t=this.streamPresentationCurrent;let s=this.promisePendingStartPresentation??Promise.resolve(void 0);const i=this.callManager.getEstablishedRTCSession();return i&&t?s=e().then(async()=>i.stopPresentation(t)).catch(r=>{throw this.events.trigger(R.FAILED_PRESENTATION,r),r}):t&&this.events.trigger(R.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})}cancelSendPresentationWithRepeatedCalls(){this.cancelableSendPresentationWithRepeatedCalls?.cancel()}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(R.START_PRESENTATION,e)}),this.callManager.on("presentation:started",e=>{this.events.trigger(R.STARTED_PRESENTATION,e)}),this.callManager.on("presentation:end",e=>{this.events.trigger(R.END_PRESENTATION,e)}),this.callManager.on("presentation:ended",e=>{this.events.trigger(R.ENDED_PRESENTATION,e)}),this.callManager.on("presentation:failed",e=>{this.events.trigger(R.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:Ce}}){const a=async()=>this.sendPresentation(e,t,s,i),o=()=>!!this.streamPresentationCurrent;return this.cancelableSendPresentationWithRepeatedCalls=W.repeatedCallsAsync({targetFunction:a,isComplete:o,isRejectAsValid:!0,...r}),this.cancelableSendPresentationWithRepeatedCalls.then(c=>c)}async sendPresentation(e,t,s,{isNeedReinvite:i=!0,contentHint:r="detail",sendEncodings:a,onAddedTransceiver:o}){const c=y(s,{contentHint:r});if(c===void 0)throw new Error("No streamPresentationTarget");this.streamPresentationCurrent=c;const g=e().then(async()=>t.startPresentation(c,i,{sendEncodings:a,onAddedTransceiver:o})).then(()=>s).catch(d=>{throw this.removeStreamPresentationCurrent(),this.events.trigger(R.FAILED_PRESENTATION,d),d});return this.promisePendingStartPresentation=g,g.finally(()=>{this.promisePendingStartPresentation=void 0})}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 Ae{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 u=(n=>(n.CONNECTING="connecting",n.CONNECTED="connected",n.DISCONNECTED="disconnected",n.NEW_RTC_SESSION="newRTCSession",n.REGISTERED="registered",n.UNREGISTERED="unregistered",n.REGISTRATION_FAILED="registrationFailed",n.NEW_MESSAGE="newMessage",n.SIP_EVENT="sipEvent",n))(u||{});const X=["connecting","connected","disconnected","newRTCSession","registered","unregistered","registrationFailed","newMessage","sipEvent"],J=[...X],_e=3;class Ie{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",x(e)),this.updateConnectionConfiguration("displayName",e));const o=r;o?t(o):s(new Error("nothing changed"))});disconnect=async()=>{const e=new Promise(s=>{this.events.once(u.DISCONNECTED,()=>{s()})}),t=this.getUa();return t?t.stop():this.events.trigger(u.DISCONNECTED,void 0),e.finally(()=>{this.setUa(void 0),this.stateMachine.reset()})};cancelRequests(){this.cancelConnectWithRepeatedCalls()}connectWithDuplicatedCalls=async(e,{callLimit:t=_e}={})=>{const s=async()=>this.connectInner(e),i=r=>{const c=this.getUa()?.isConnected()===!0&&this.hasEqualConnectionConfiguration(e),g=r!=null&&!le(r);return c||g};return this.stateMachine.startConnect(),this.cancelableConnectWithRepeatedCalls=W.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:g,userAgent:d,displayName:S="",register:l=!1,extraHeaders:E=[]})=>{this.stateMachine.startInitUa(),this.setConnectionConfiguration({sipServerUrl:s,displayName:S,register:l,user:e,password:t}),this.getUa()&&await this.disconnect();const{ua:C,helpers:P}=this.uaFactory.createUAWithConfiguration({user:e,password:t,sipServerUrl:s,sipWebSocketServerURL:i,displayName:S,register:l,sessionTimers:a,registerExpires:o,connectionRecoveryMinInterval:c,connectionRecoveryMaxInterval:g,userAgent:d,remoteAddress:r,extraHeaders:E},this.events);return this.setUa(C),this.setSipServerUrl(P.getSipServerUrl),this.setSocket(P.socket),C};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,g)=>{if(this.getConnectionConfiguration().register===!0)return this.registrationManager.subscribeToStartEvents(c,g);const S=u.CONNECTED,l=[u.DISCONNECTED];return this.events.on(S,c),l.forEach(E=>{this.events.on(E,g)}),()=>{this.events.off(S,c),l.forEach(E=>{this.events.off(E,g)})}})(()=>{i?.(),e(s)},c=>{i?.(),t(c)}),s.start()});cancelConnectWithRepeatedCalls(){this.cancelableConnectWithRepeatedCalls?.cancel()}}var K=(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))(K||{});const Re=G.setup({types:{context:{},events:{}},actions:{logTransition:(n,e)=>{p(`State transition: ${e.from} -> ${e.to} (${e.event})`)},logStateChange:(n,e)=>{p("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 Me{actor;stateChangeListeners=new Set;events;unsubscribeFromEvents;actorSubscription;constructor(e){this.events=e,this.actor=G.createActor(Re),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(K).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)){p(`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 pe{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(u.REGISTERED,t),e.on(u.REGISTRATION_FAILED,s),e.register()})}async unregister(){const e=this.getUaProtected();return new Promise(t=>{e.on(u.UNREGISTERED,t),e.unregister()})}async tryRegister(){try{await this.unregister()}catch(e){p("tryRegister",e)}return this.register()}subscribeToStartEvents(e,t){const s=u.REGISTERED,i=[u.REGISTRATION_FAILED,u.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 Pe{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:g}=this.uaFactory.createConfiguration({sipWebSocketServerURL:i,displayName:t,userAgent:e,sipServerUrl:s}),d=this.uaFactory.createUA({...g,remoteAddress:r,extraHeaders:a}),S=()=>{const E=new Error("Telephony is not available");c(E)};d.once(u.DISCONNECTED,S);const l=()=>{d.removeAllListeners(),d.once(u.DISCONNECTED,()=>{o()}),d.stop()};d.once(u.CONNECTED,l),d.start()})}}const me=n=>{const e=[];return n!==void 0&&n!==""&&e.push(`X-Vinteo-Remote: ${n}`),e};class O{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():`${ne()}`}static buildExtraHeaders(e,t){const s=e!==void 0&&e!==""?me(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:g=2,connectionRecoveryMaxInterval:d=6,userAgent:S}){O.validateConfiguration({register:a,password:t,user:e,sipServerUrl:r,sipWebSocketServerURL:s});const l=O.resolveAuthorizationUser(a,e),E=ee(r),I=E(l),C=new this.JsSIP.WebSocketInterface(s);return{configuration:{password:t,register:a,uri:I,display_name:x(i),user_agent:S,sdpSemantics:"unified-plan",sockets:[C],session_timers:o,register_expires:c,connection_recovery_min_interval:g,connection_recovery_max_interval:d},helpers:{socket:C,getSipServerUrl:E}}}createUA({remoteAddress:e,extraHeaders:t,...s}){const i=new this.JsSIP.UA(s),r=O.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=X.find(g=>g===o);c&&r.on(c,a)}),{ua:r,helpers:i}}}class Oe{events;ua;socket;uaFactory;registrationManager;stateMachine;connectionFlow;sipOperations;configurationManager;JsSIP;constructor({JsSIP:e}){this.JsSIP=e,this.events=new f.Events(J),this.uaFactory=new O(e),this.registrationManager=new pe({events:this.events,getUaProtected:this.getUaProtected}),this.stateMachine=new Me(this.events),this.configurationManager=new Ae({getUa:this.getUa}),this.sipOperations=new Pe({uaFactory:this.uaFactory,getUaProtected:this.getUaProtected}),this.connectionFlow=new Ie({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 connectionState(){return this.stateMachine.state}get isRegistered(){return O.isRegisteredUA(this.ua)}get isRegisterConfig(){return this.configurationManager.isRegister()}connect=async(e,t)=>this.connectionFlow.connect(e,t);set=async({displayName:e})=>this.connectionFlow.set({displayName:e});disconnect=async()=>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}var D=(n=>(n.INCOMING_CALL="incomingCall",n.DECLINED_INCOMING_CALL="declinedIncomingCall",n.TERMINATED_INCOMING_CALL="terminatedIncomingCall",n.FAILED_INCOMING_CALL="failedIncomingCall",n))(D||{}),$=(n=>(n.LOCAL="local",n.REMOTE="remote",n.SYSTEM="system",n))($||{});const j=["incomingCall","declinedIncomingCall","terminatedIncomingCall","failedIncomingCall"],fe=486,De=487;class ve{events;incomingRTCSession;connectionManager;constructor(e){this.connectionManager=e,this.events=new f.Events(j),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=De}={}){return new Promise((t,s)=>{try{const i=this.getIncomingRTCSession(),r=this.remoteCallerData;this.removeIncomingSession(),this.events.trigger(D.DECLINED_INCOMING_CALL,r),i.terminate({status_code:e}),t()}catch(i){s(i)}})}async busyIncomingCall(){return this.declineToIncomingCall({statusCode:fe})}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(D.TERMINATED_INCOMING_CALL,t):this.events.trigger(D.FAILED_INCOMING_CALL,t)}),this.events.trigger(D.INCOMING_CALL,t)}removeIncomingSession(){delete this.incomingRTCSession}}const ye=J.map(n=>`connection:${n}`),Ue=q.map(n=>`call:${n}`),be=z.map(n=>`api:${n}`),we=j.map(n=>`incoming-call:${n}`),Le=Q.map(n=>`presentation:${n}`),Fe=[...ye,...Ue,...be,...we,...Le];class $e{events;connectionManager;callManager;apiManager;incomingCallManager;presentationManager;constructor({JsSIP:e}){this.events=new f.Events(Fe),this.connectionManager=new Oe({JsSIP:e}),this.callManager=new ce,this.apiManager=new Se({connectionManager:this.connectionManager,callManager:this.callManager}),this.incomingCallManager=new ve(this.connectionManager),this.presentationManager=new ue({callManager:this.callManager}),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.connectionManager.connect(...e);set=async(...e)=>this.connectionManager.set(...e);disconnect=async()=>this.connectionManager.disconnect();register=async()=>this.connectionManager.register();unregister=async()=>this.connectionManager.unregister();tryRegister=async()=>this.connectionManager.tryRegister();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);call=async e=>this.callManager.startCall(this.connectionManager.getUaProtected(),this.getSipServerUrl,e);hangUp=async()=>this.callManager.endCall();answerToIncomingCall=async e=>this.callManager.answerToIncomingCall(this.incomingCallManager.extractIncomingRTCSession,e);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,...r}=t;return this.presentationManager.startPresentation(async()=>{s===!0?(await this.apiManager.sendMustStopPresentationP2P(),await this.apiManager.askPermissionToStartPresentationP2P()):await this.apiManager.askPermissionToStartPresentation()},e,r,i===void 0?void 0:{callLimit:i})}async stopPresentation(e={}){const{isP2P:t}=e;return this.presentationManager.stopPresentation(async()=>{t===!0?await this.apiManager.sendMustStopPresentationP2P():await this.apiManager.sendStoppedPresentation()})}async updatePresentation(e,t={}){const{isP2P:s,...i}=t;return this.presentationManager.updatePresentation(async()=>{s===!0?(await this.apiManager.sendMustStopPresentationP2P(),await this.apiManager.askPermissionToStartPresentationP2P()):await this.apiManager.askPermissionToStartPresentation()},e,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)}subscribe(){this.connectionManager.events.eachTriggers((e,t)=>{this.connectionManager.on(t,s=>{this.events.trigger(`connection:${t}`,s)})}),this.callManager.events.eachTriggers((e,t)=>{this.callManager.on(t,s=>{this.events.trigger(`call:${t}`,s)})}),this.apiManager.events.eachTriggers((e,t)=>{this.apiManager.on(t,s=>{this.events.trigger(`api:${t}`,s)})}),this.incomingCallManager.events.eachTriggers((e,t)=>{this.incomingCallManager.on(t,s=>{this.events.trigger(`incoming-call:${t}`,s)})}),this.presentationManager.events.eachTriggers((e,t)=>{this.presentationManager.on(t,s=>{this.events.trigger(`presentation:${t}`,s)})})}}exports.ECallCause=V;exports.EEventsMainCAM=m;exports.EUseLicense=Y;exports.Originator=v;exports.SipConnector=$e;exports.disableDebug=Te;exports.enableDebug=ge;exports.hasCanceledStartPresentationError=Ne;exports.logger=p;
@@ -1,9 +1,9 @@
1
1
  import { CallManager } from '../CallManager';
2
2
  import { ConnectionManager } from '../ConnectionManager';
3
- import { TEvent } from './eventNames';
3
+ import { TEvent, TEvents } from './eventNames';
4
4
  import { TChannels, TMediaState, TOptionsInfoMediaState } from './types';
5
5
  declare class ApiManager {
6
- private readonly events;
6
+ readonly events: TEvents;
7
7
  private readonly connectionManager;
8
8
  private readonly callManager;
9
9
  constructor({ connectionManager, callManager, }: {
@@ -1,5 +1,5 @@
1
1
  export declare enum EHeader {
2
- CONTENT_TYPE_NAME = "content-type",
2
+ CONTENT_TYPE = "content-type",
3
3
  CONTENT_ENTER_ROOM = "x-webrtc-enter-room",
4
4
  CONTENT_USE_LICENSE = "X-WEBRTC-USE-LICENSE",
5
5
  PARTICIPANT_NAME = "X-WEBRTC-PARTICIPANT-NAME",
@@ -1,4 +1,4 @@
1
- import { default as Events } from 'events-constructor';
1
+ import { Events } from 'events-constructor';
2
2
  export declare enum EEvent {
3
3
  CHANNELS_NOTIFY = "channels:notify",
4
4
  PARTICIPANT_ADDED_TO_LIST_MODERATORS = "participant:added-to-list-moderators",
@@ -1,2 +1,3 @@
1
1
  export { default as ApiManager } from './@ApiManager';
2
+ export { EContentTypeReceived, EContentTypeSent, EEventsMainCAM, EEventsMic, EEventsSyncMediaState, EHeader, EShareState, EUseLicense, } from './constants';
2
3
  export type { TEvent as TApiEvent } from './eventNames';
@@ -8,5 +8,6 @@ export declare enum ECallCause {
8
8
  UNAVAILABLE = "Unavailable",
9
9
  NOT_FOUND = "Not Found",
10
10
  ADDRESS_INCOMPLETE = "Address Incomplete",
11
- INCOMPATIBLE_SDP = "Incompatible SDP"
11
+ INCOMPATIBLE_SDP = "Incompatible SDP",
12
+ BAD_MEDIA_DESCRIPTION = "Bad Media Description"
12
13
  }
@@ -1,4 +1,4 @@
1
- import { default as Events } from 'events-constructor';
1
+ import { Events } from 'events-constructor';
2
2
  export declare enum EEvent {
3
3
  PEER_CONNECTION = "peerconnection",
4
4
  CONNECTING = "connecting",
@@ -1,5 +1,7 @@
1
1
  export { default as CallManager } from './@CallManager';
2
+ export { ECallCause } from './causes';
2
3
  export { EEvent as ECallEvent, Originator } from './eventNames';
3
4
  export type { TEvent as TCallEvent, TEvents as TCallEvents } from './eventNames';
4
5
  export { default as hasCanceledCallError } from './hasCanceledCallError';
5
6
  export { MCUCallStrategy } from './MCUCallStrategy';
7
+ export type { TCustomError, TGetServerUrl } from './types';
@@ -1,8 +1,8 @@
1
1
  import { RTCSession, UA } from '@krivega/jssip';
2
+ import { TContentHint } from '../PresentationManager';
2
3
  import { Originator } from './eventNames';
3
4
  export type TOntrack = (track: RTCTrackEvent) => void;
4
5
  export type TOnAddedTransceiver = (transceiver: RTCRtpTransceiver, track: MediaStreamTrack, stream: MediaStream) => Promise<void>;
5
- export type TContentHint = 'motion' | 'detail' | 'text' | 'none';
6
6
  export type TGetServerUrl = (id: string) => string;
7
7
  type TOptionsExtraHeaders = {
8
8
  extraHeaders?: string[];
@@ -1,6 +1,7 @@
1
1
  import { RegisteredEvent, UA, UnRegisteredEvent, WebSocketInterface } from '@krivega/jssip';
2
- import { default as Events } from 'events-constructor';
3
- import { TGetServerUrl, TJsSIP } from '../types';
2
+ import { Events } from 'events-constructor';
3
+ import { TGetServerUrl } from '../CallManager';
4
+ import { TJsSIP } from '../types';
4
5
  import { TConnect, TSet } from './ConnectionFlow';
5
6
  import { TEvent, EVENT_NAMES } from './eventNames';
6
7
  import { TParametersCheckTelephony, default as SipOperations } from './SipOperations';
@@ -1,6 +1,7 @@
1
1
  import { UA, WebSocketInterface } from '@krivega/jssip';
2
- import { default as Events } from 'events-constructor';
3
- import { TGetServerUrl, TJsSIP } from '../types';
2
+ import { Events } from 'events-constructor';
3
+ import { TGetServerUrl } from '../CallManager';
4
+ import { TJsSIP } from '../types';
4
5
  import { default as ConnectionStateMachine } from './ConnectionStateMachine';
5
6
  import { EVENT_NAMES } from './eventNames';
6
7
  import { default as RegistrationManager } from './RegistrationManager';
@@ -1,4 +1,4 @@
1
- import { default as Events } from 'events-constructor';
1
+ import { Events } from 'events-constructor';
2
2
  import { EVENT_NAMES } from './eventNames';
3
3
  export declare enum EEvents {
4
4
  START_CONNECT = "START_CONNECT",
@@ -1,5 +1,5 @@
1
1
  import { RegisteredEvent, UA, UnRegisteredEvent } from '@krivega/jssip';
2
- import { default as Events } from 'events-constructor';
2
+ import { Events } from 'events-constructor';
3
3
  import { EVENT_NAMES } from './eventNames';
4
4
  interface IDependencies {
5
5
  events: Events<typeof EVENT_NAMES>;
@@ -1,4 +1,4 @@
1
- import { default as Events } from 'events-constructor';
1
+ import { Events } from 'events-constructor';
2
2
  export declare enum EEvent {
3
3
  CONNECTING = "connecting",
4
4
  CONNECTED = "connected",
@@ -1,6 +1,7 @@
1
1
  import { RTCSession } from '@krivega/jssip';
2
+ import { Events } from 'events-constructor';
2
3
  import { ConnectionManager } from '../ConnectionManager';
3
- import { TEvent } from './eventNames';
4
+ import { TEvent, EVENT_NAMES } from './eventNames';
4
5
  type TRemoteCallerData = {
5
6
  displayName?: string;
6
7
  host?: string;
@@ -8,9 +9,9 @@ type TRemoteCallerData = {
8
9
  rtcSession?: RTCSession;
9
10
  };
10
11
  export default class IncomingCallManager {
12
+ readonly events: Events<typeof EVENT_NAMES>;
11
13
  private incomingRTCSession?;
12
14
  private readonly connectionManager;
13
- private readonly events;
14
15
  constructor(connectionManager: ConnectionManager);
15
16
  get remoteCallerData(): TRemoteCallerData;
16
17
  get isAvailableIncomingCall(): boolean;
@@ -1,12 +1,12 @@
1
1
  import { CallManager } from '../CallManager';
2
- import { TEvent } from './eventNames';
2
+ import { TEvent, TEvents } from './eventNames';
3
3
  import { TContentHint, TOnAddedTransceiver } from './types';
4
4
  export declare const hasCanceledStartPresentationError: (error: unknown) => error is import('repeated-calls').TCanceledError<unknown>;
5
5
  declare class PresentationManager {
6
+ readonly events: TEvents;
6
7
  promisePendingStartPresentation?: Promise<MediaStream>;
7
8
  promisePendingStopPresentation?: Promise<MediaStream | undefined>;
8
9
  streamPresentationCurrent?: MediaStream;
9
- private readonly events;
10
10
  private cancelableSendPresentationWithRepeatedCalls;
11
11
  private readonly callManager;
12
12
  constructor({ callManager }: {
@@ -1,4 +1,4 @@
1
- import { default as Events } from 'events-constructor';
1
+ import { Events } from 'events-constructor';
2
2
  export declare enum EEvent {
3
3
  START_PRESENTATION = "presentation:start",
4
4
  STARTED_PRESENTATION = "presentation:started",
@@ -1 +1,2 @@
1
1
  export { hasCanceledStartPresentationError, default as PresentationManager, } from './@PresentationManager';
2
+ export type { TContentHint } from './types';
@@ -1,11 +1,14 @@
1
- import { TApiEvent, ApiManager } from './ApiManager';
2
- import { TCallEvent, CallManager } from './CallManager';
3
- import { TConnectionManagerEvent, ConnectionManager } from './ConnectionManager';
4
- import { TIncomingCallEvent, IncomingCallManager } from './IncomingCallManager';
5
- import { PresentationManager } from './PresentationManager';
6
- import { TContentHint, TOnAddedTransceiver } from './PresentationManager/types';
7
- import { TGetServerUrl, TJsSIP } from './types';
1
+ import { Events } from 'events-constructor';
2
+ import { ApiManager } from '../ApiManager';
3
+ import { TGetServerUrl, CallManager } from '../CallManager';
4
+ import { ConnectionManager } from '../ConnectionManager';
5
+ import { IncomingCallManager } from '../IncomingCallManager';
6
+ import { PresentationManager } from '../PresentationManager';
7
+ import { TContentHint, TOnAddedTransceiver } from '../PresentationManager/types';
8
+ import { TJsSIP } from '../types';
9
+ import { TEvent, EVENT_NAMES } from './eventNames';
8
10
  declare class SipConnector {
11
+ readonly events: Events<typeof EVENT_NAMES>;
9
12
  readonly connectionManager: ConnectionManager;
10
13
  readonly callManager: CallManager;
11
14
  readonly apiManager: ApiManager;
@@ -17,7 +20,7 @@ declare class SipConnector {
17
20
  get requestedConnection(): boolean;
18
21
  get isPendingConnect(): boolean;
19
22
  get isPendingInitUa(): boolean;
20
- get connectionState(): import('./ConnectionManager/ConnectionStateMachine').EState;
23
+ get connectionState(): import('../ConnectionManager/ConnectionStateMachine').EState;
21
24
  get isRegistered(): boolean;
22
25
  get isRegisterConfig(): boolean;
23
26
  get socket(): import('@krivega/jssip').WebSocketInterface | undefined;
@@ -27,6 +30,11 @@ declare class SipConnector {
27
30
  get isCallActive(): boolean;
28
31
  get remoteCallerData(): IncomingCallManager['remoteCallerData'];
29
32
  get isAvailableIncomingCall(): IncomingCallManager['isAvailableIncomingCall'];
33
+ on<T>(eventName: TEvent, handler: (data: T) => void): () => void;
34
+ once<T>(eventName: TEvent, handler: (data: T) => void): () => void;
35
+ onceRace<T>(eventNames: TEvent[], handler: (data: T, eventName: string) => void): () => void;
36
+ wait<T>(eventName: TEvent): Promise<T>;
37
+ off<T>(eventName: TEvent, handler: (data: T) => void): void;
30
38
  connect: ConnectionManager['connect'];
31
39
  set: ConnectionManager['set'];
32
40
  disconnect: () => Promise<void>;
@@ -36,13 +44,8 @@ declare class SipConnector {
36
44
  sendOptions: (target: Parameters<ConnectionManager["sendOptions"]>[0], body?: Parameters<ConnectionManager["sendOptions"]>[1], extraHeaders?: Parameters<ConnectionManager["sendOptions"]>[2]) => Promise<void>;
37
45
  ping: (body?: Parameters<ConnectionManager["ping"]>[0], extraHeaders?: Parameters<ConnectionManager["ping"]>[1]) => Promise<void>;
38
46
  checkTelephony: ConnectionManager['checkTelephony'];
39
- onConnection<T>(eventName: TConnectionManagerEvent, handler: (data: T) => void): () => void;
40
- onceConnection<T>(eventName: TConnectionManagerEvent, handler: (data: T) => void): () => void;
41
- onceRaceConnection<T>(eventNames: TConnectionManagerEvent[], handler: (data: T, eventName: string) => void): () => void;
42
- waitConnection<T>(eventName: TConnectionManagerEvent): Promise<T>;
43
- offConnection<T>(eventName: TConnectionManagerEvent, handler: (data: T) => void): void;
44
47
  isConfigured: () => boolean;
45
- getConnectionConfiguration: () => import('./ConnectionManager/ConfigurationManager').IConnectionConfiguration;
48
+ getConnectionConfiguration: () => import('../ConnectionManager/ConfigurationManager').IConnectionConfiguration;
46
49
  getSipServerUrl: TGetServerUrl;
47
50
  call: (params: Parameters<CallManager["startCall"]>[2]) => Promise<RTCPeerConnection>;
48
51
  hangUp: CallManager['endCall'];
@@ -52,16 +55,6 @@ declare class SipConnector {
52
55
  getCallConfiguration: CallManager['getCallConfiguration'];
53
56
  getRemoteStreams: CallManager['getRemoteStreams'];
54
57
  replaceMediaStream: CallManager['replaceMediaStream'];
55
- onCall<T>(eventName: TCallEvent, handler: (data: T) => void): () => void;
56
- onceCall<T>(eventName: TCallEvent, handler: (data: T) => void): () => void;
57
- onceRaceCall<T>(eventNames: TCallEvent[], handler: (data: T, eventName: string) => void): () => void;
58
- waitCall<T>(eventName: TCallEvent): Promise<T>;
59
- offIncomingCall<T>(eventName: TIncomingCallEvent, handler: (data: T) => void): void;
60
- onIncomingCall<T>(eventName: TIncomingCallEvent, handler: (data: T) => void): () => void;
61
- onceIncomingCall<T>(eventName: TIncomingCallEvent, handler: (data: T) => void): () => void;
62
- onceRaceIncomingCall<T>(eventNames: TIncomingCallEvent[], handler: (data: T, eventName: string) => void): () => void;
63
- waitIncomingCall<T>(eventName: TIncomingCallEvent): Promise<T>;
64
- offCall<T>(eventName: TCallEvent, handler: (data: T) => void): void;
65
58
  startPresentation(stream: MediaStream, options?: {
66
59
  isP2P?: boolean;
67
60
  isNeedReinvite?: boolean;
@@ -82,7 +75,7 @@ declare class SipConnector {
82
75
  sendEncodings?: RTCRtpEncodingParameters[];
83
76
  onAddedTransceiver?: TOnAddedTransceiver;
84
77
  }): Promise<MediaStream | undefined>;
85
- waitChannels(...args: Parameters<ApiManager['waitChannels']>): Promise<import('./ApiManager/types').TChannels>;
78
+ waitChannels(...args: Parameters<ApiManager['waitChannels']>): Promise<import('../ApiManager/types').TChannels>;
86
79
  waitSyncMediaState(...args: Parameters<ApiManager['waitSyncMediaState']>): Promise<{
87
80
  isSyncForced: boolean;
88
81
  }>;
@@ -98,10 +91,6 @@ declare class SipConnector {
98
91
  askPermissionToStartPresentationP2P(...args: Parameters<ApiManager['askPermissionToStartPresentationP2P']>): Promise<void>;
99
92
  askPermissionToStartPresentation(...args: Parameters<ApiManager['askPermissionToStartPresentation']>): Promise<void>;
100
93
  askPermissionToEnableCam(...args: Parameters<ApiManager['askPermissionToEnableCam']>): Promise<void>;
101
- onApi<T>(eventName: TApiEvent, handler: (data: T) => void): () => void;
102
- onceApi<T>(eventName: TApiEvent, handler: (data: T) => void): () => void;
103
- onceRaceApi<T>(eventNames: TApiEvent[], handler: (data: T, eventName: string) => void): () => void;
104
- waitApi<T>(eventName: TApiEvent): Promise<T>;
105
- offApi<T>(eventName: TApiEvent, handler: (data: T) => void): void;
94
+ private subscribe;
106
95
  }
107
96
  export default SipConnector;
@@ -0,0 +1,4 @@
1
+ import { Events } from 'events-constructor';
2
+ export declare const EVENT_NAMES: readonly ("connection:connecting" | "connection:connected" | "connection:disconnected" | "connection:newRTCSession" | "connection:registered" | "connection:unregistered" | "connection:registrationFailed" | "connection:newMessage" | "connection:sipEvent" | "call:peerconnection" | "call:connecting" | "call:sending" | "call:progress" | "call:accepted" | "call:confirmed" | "call:ended" | "call:failed" | "call:newDTMF" | "call:newInfo" | "call:reinvite" | "call:update" | "call:refer" | "call:replaces" | "call:sdp" | "call:icecandidate" | "call:getusermediafailed" | "call:peerconnection:createofferfailed" | "call:peerconnection:createanswerfailed" | "call:peerconnection:setlocaldescriptionfailed" | "call:peerconnection:setremotedescriptionfailed" | "call:presentation:start" | "call:presentation:started" | "call:presentation:end" | "call:presentation:ended" | "call:presentation:failed" | "call:peerconnection:confirmed" | "call:peerconnection:ontrack" | "call:ended:fromserver" | "api:newDTMF" | "api:channels:notify" | "api:participant:added-to-list-moderators" | "api:participant:removed-from-list-moderators" | "api:participant:move-request-to-stream" | "api:participant:move-request-to-spectators" | "api:participant:move-request-to-participants" | "api:participation:accepting-word-request" | "api:participation:cancelling-word-request" | "api:webcast:started" | "api:webcast:stopped" | "api:account:changed" | "api:account:deleted" | "api:conference:participant-token-issued" | "api:channels" | "api:enterRoom" | "api:shareState" | "api:main-cam-control" | "api:useLicense" | "api:admin-start-main-cam" | "api:admin-stop-main-cam" | "api:admin-start-mic" | "api:admin-stop-mic" | "api:admin-force-sync-media-state" | "api:availableSecondRemoteStream" | "api:notAvailableSecondRemoteStream" | "api:mustStopPresentation" | "incoming-call:incomingCall" | "incoming-call:declinedIncomingCall" | "incoming-call:terminatedIncomingCall" | "incoming-call:failedIncomingCall" | "presentation:presentation:start" | "presentation:presentation:started" | "presentation:presentation:end" | "presentation:presentation:ended" | "presentation:presentation:failed")[];
3
+ export type TEvent = (typeof EVENT_NAMES)[number];
4
+ export type TEvents = Events<typeof EVENT_NAMES>;
@@ -0,0 +1,2 @@
1
+ export { default as SipConnector } from './@SipConnector';
2
+ export type { TEvent, TEvents } from './eventNames';
@@ -1,22 +1,14 @@
1
1
  import { UA } from '@krivega/jssip';
2
- import { default as SipConnector } from '../SipConnector';
3
- import { EUseLicense, TContentHint, TSimulcastEncoding } from '../types';
2
+ import { EUseLicense } from '../ApiManager';
3
+ import { TContentHint } from '../PresentationManager';
4
+ import { SipConnector } from '../SipConnector';
5
+ import { TSimulcastEncoding } from '../types';
4
6
  interface IProxyMethods {
5
- on: SipConnector['onConnection'];
6
- once: SipConnector['onceConnection'];
7
- onceRace: SipConnector['onceRaceConnection'];
8
- wait: SipConnector['waitConnection'];
9
- off: SipConnector['offConnection'];
10
- onCall: SipConnector['onCall'];
11
- onceCall: SipConnector['onceCall'];
12
- onceRaceCall: SipConnector['onceRaceCall'];
13
- waitCall: SipConnector['waitCall'];
14
- offCall: SipConnector['offCall'];
15
- onIncomingCall: SipConnector['onIncomingCall'];
16
- onceIncomingCall: SipConnector['onceIncomingCall'];
17
- onceRaceIncomingCall: SipConnector['onceRaceIncomingCall'];
18
- waitIncomingCall: SipConnector['waitIncomingCall'];
19
- offIncomingCall: SipConnector['offIncomingCall'];
7
+ on: SipConnector['on'];
8
+ once: SipConnector['once'];
9
+ onceRace: SipConnector['onceRace'];
10
+ wait: SipConnector['wait'];
11
+ off: SipConnector['off'];
20
12
  sendDTMF: SipConnector['sendDTMF'];
21
13
  hangUp: SipConnector['hangUp'];
22
14
  declineToIncomingCall: SipConnector['declineToIncomingCall'];
@@ -34,16 +26,6 @@ declare class SipConnectorFacade implements IProxyMethods {
34
26
  onceRace: IProxyMethods['onceRace'];
35
27
  wait: IProxyMethods['wait'];
36
28
  off: IProxyMethods['off'];
37
- onCall: IProxyMethods['onCall'];
38
- onceCall: IProxyMethods['onceCall'];
39
- onceRaceCall: IProxyMethods['onceRaceCall'];
40
- waitCall: IProxyMethods['waitCall'];
41
- offCall: IProxyMethods['offCall'];
42
- onIncomingCall: IProxyMethods['onIncomingCall'];
43
- onceIncomingCall: IProxyMethods['onceIncomingCall'];
44
- onceRaceIncomingCall: IProxyMethods['onceRaceIncomingCall'];
45
- waitIncomingCall: IProxyMethods['waitIncomingCall'];
46
- offIncomingCall: IProxyMethods['offIncomingCall'];
47
29
  sendDTMF: IProxyMethods['sendDTMF'];
48
30
  hangUp: IProxyMethods['hangUp'];
49
31
  declineToIncomingCall: IProxyMethods['declineToIncomingCall'];
@@ -150,7 +132,7 @@ declare class SipConnectorFacade implements IProxyMethods {
150
132
  sendEncodings?: RTCRtpEncodingParameters[];
151
133
  preferredMimeTypesVideoCodecs?: string[];
152
134
  excludeMimeTypesVideoCodecs?: string[];
153
- callLimit: number;
135
+ callLimit?: number;
154
136
  }) => Promise<MediaStream | undefined>;
155
137
  stopShareSipConnector: ({ isP2P }?: {
156
138
  isP2P?: boolean;
@@ -1,11 +1,11 @@
1
1
  import { AnswerOptions, ExtraHeaders, HoldOptions, MediaStreamTypes, NameAddrHeader, OnHoldResult, RTCPeerConnectionDeprecated, RTCSession, ReferOptions, RenegotiateOptions, SessionDirection, SessionStatus, TerminateOptions, URI, C as constants } from '@krivega/jssip';
2
- import { default as Events } from 'events-constructor';
3
- import { TEventSession, SESSION_EVENT_NAMES } from '../eventNames';
2
+ import { Events } from 'events-constructor';
3
+ import { SESSION_JSSIP_EVENT_NAMES } from './eventNames';
4
4
  export type TEventHandlers = Record<string, (data: unknown) => void>;
5
5
  declare class BaseSession implements RTCSession {
6
6
  originator: string;
7
7
  connection: RTCPeerConnectionDeprecated;
8
- events: Events<typeof SESSION_EVENT_NAMES>;
8
+ events: Events<typeof SESSION_JSSIP_EVENT_NAMES>;
9
9
  remote_identity: NameAddrHeader;
10
10
  mutedOptions: {
11
11
  audio: boolean;
@@ -61,8 +61,8 @@ declare class BaseSession implements RTCSession {
61
61
  prependOnceListener(_event: string | symbol, _listener: (...arguments_: unknown[]) => void): this;
62
62
  eventNames(): (string | symbol)[];
63
63
  initEvents(eventHandlers?: TEventHandlers): void;
64
- on<T>(eventName: string, handler: (data: T) => void): this;
65
- trigger(eventName: TEventSession, data?: unknown): void;
64
+ on<T>(eventName: (typeof SESSION_JSSIP_EVENT_NAMES)[number], handler: (data: T) => void): this;
65
+ trigger(eventName: (typeof SESSION_JSSIP_EVENT_NAMES)[number], data?: unknown): void;
66
66
  /**
67
67
  * sendDTMF
68
68
  *
@@ -1,6 +1,11 @@
1
1
  import { RTCPeerConnectionDeprecated } from '@krivega/jssip';
2
+ import { Events } from 'events-constructor';
2
3
  import { MediaStreamTrackMock } from 'webrtc-mock';
3
4
  import { default as RTCRtpSenderMock } from './RTCRtpSenderMock';
5
+ export declare enum EEvent {
6
+ TRACK = "track"
7
+ }
8
+ declare const EVENT_NAMES: readonly ["track"];
4
9
  declare class RTCPeerConnectionMock implements RTCPeerConnectionDeprecated {
5
10
  senders: RTCRtpSender[];
6
11
  receivers: RTCRtpReceiver[];
@@ -28,6 +33,7 @@ declare class RTCPeerConnectionMock implements RTCPeerConnectionDeprecated {
28
33
  remoteDescription: RTCSessionDescription | null;
29
34
  sctp: null;
30
35
  signalingState: RTCSignalingState;
36
+ events: Events<typeof EVENT_NAMES>;
31
37
  constructor(_configuration?: RTCConfiguration, tracks: MediaStreamTrackMock[]);
32
38
  getRemoteStreams(): MediaStream[];
33
39
  addIceCandidate(_candidate: RTCIceCandidate | RTCIceCandidateInit): Promise<void>;
@@ -7,7 +7,7 @@ declare class RTCSessionMock extends BaseSession {
7
7
  private static startPresentationError?;
8
8
  private static countStartPresentationError;
9
9
  private static countStartsPresentation;
10
- url: string;
10
+ url?: string;
11
11
  status_code?: number;
12
12
  /**
13
13
  * answer
@@ -23,9 +23,7 @@ declare class RTCSessionMock extends BaseSession {
23
23
  }], any>;
24
24
  replaceMediaStream: jest.Mock<Promise<void>, [_mediaStream: MediaStream], any>;
25
25
  private isEndedInner;
26
- constructor({ url, mediaStream, eventHandlers, originator, remoteIdentity, }: {
27
- url?: string;
28
- mediaStream?: MediaStream;
26
+ constructor({ eventHandlers, originator, remoteIdentity, }: {
29
27
  eventHandlers: TEventHandlers;
30
28
  originator: string;
31
29
  remoteIdentity?: NameAddrHeader;
@@ -40,7 +38,9 @@ declare class RTCSessionMock extends BaseSession {
40
38
  stopPresentation: (stream: MediaStream) => Promise<MediaStream>;
41
39
  initPeerconnection(mediaStream: MediaStream | undefined): boolean;
42
40
  createPeerconnection(sendedStream: MediaStream): void;
43
- connect(target: string): void;
41
+ connect(target: string, { mediaStream }?: {
42
+ mediaStream?: MediaStream;
43
+ }): import('@krivega/jssip').RTCPeerConnectionDeprecated;
44
44
  terminate({ status_code, cause }?: {
45
45
  status_code?: number;
46
46
  cause?: string;
@@ -1,5 +1,5 @@
1
1
  import { DisconnectEvent, UA as IUA, IncomingRequest, UAConfiguration, UAConfigurationParams, UAEventMap } from '@krivega/jssip';
2
- import { default as Events } from 'events-constructor';
2
+ import { Events } from 'events-constructor';
3
3
  import { TEventHandlers } from './BaseSession.mock';
4
4
  import { default as Registrator } from './Registrator.mock';
5
5
  import { default as RTCSessionMock } from './RTCSessionMock';
@@ -2,7 +2,7 @@ export declare const UA_SYNTHETICS_EVENT_NAMES: readonly ["incomingCall", "decli
2
2
  export declare const UA_JSSIP_EVENT_NAMES: readonly ["connecting", "connected", "disconnected", "newRTCSession", "registered", "unregistered", "registrationFailed", "newMessage", "sipEvent"];
3
3
  export declare const SESSION_SYNTHETICS_EVENT_NAMES: readonly ["availableSecondRemoteStream", "notAvailableSecondRemoteStream", "mustStopPresentation", "shareState", "enterRoom", "useLicense", "peerconnection:confirmed", "peerconnection:ontrack", "channels", "ended:fromserver", "main-cam-control", "admin-start-main-cam", "admin-stop-main-cam", "admin-stop-mic", "admin-start-mic", "admin-force-sync-media-state", "participant:move-request-to-spectators", "participant:move-request-to-participants"];
4
4
  export declare const SESSION_JSSIP_EVENT_NAMES: readonly ["ended", "connecting", "sending", "reinvite", "replaces", "refer", "progress", "accepted", "confirmed", "peerconnection", "failed", "muted", "unmuted", "newDTMF", "newInfo", "hold", "unhold", "update", "sdp", "icecandidate", "getusermediafailed", "peerconnection:createofferfailed", "peerconnection:createanswerfailed", "peerconnection:setlocaldescriptionfailed", "peerconnection:setremotedescriptionfailed", "presentation:start", "presentation:started", "presentation:end", "presentation:ended", "presentation:failed"];
5
- export declare const UA_EVENT_NAMES: ("incomingCall" | "declinedIncomingCall" | "failedIncomingCall" | "terminatedIncomingCall" | "connecting" | "connected" | "disconnected" | "newRTCSession" | "registered" | "unregistered" | "registrationFailed" | "newMessage" | "sipEvent" | "channels:notify" | "participant:added-to-list-moderators" | "participant:removed-from-list-moderators" | "participant:move-request-to-stream" | "participation:accepting-word-request" | "participation:cancelling-word-request" | "webcast:started" | "webcast:stopped" | "account:changed" | "account:deleted" | "conference:participant-token-issued")[];
5
+ export declare const UA_EVENT_NAMES: ("connecting" | "connected" | "disconnected" | "newRTCSession" | "registered" | "unregistered" | "registrationFailed" | "newMessage" | "sipEvent" | "channels:notify" | "participant:added-to-list-moderators" | "participant:removed-from-list-moderators" | "participant:move-request-to-stream" | "participation:accepting-word-request" | "participation:cancelling-word-request" | "webcast:started" | "webcast:stopped" | "account:changed" | "account:deleted" | "conference:participant-token-issued" | "incomingCall" | "declinedIncomingCall" | "terminatedIncomingCall" | "failedIncomingCall")[];
6
6
  export declare const SESSION_EVENT_NAMES: readonly ["ended", "connecting", "sending", "reinvite", "replaces", "refer", "progress", "accepted", "confirmed", "peerconnection", "failed", "muted", "unmuted", "newDTMF", "newInfo", "hold", "unhold", "update", "sdp", "icecandidate", "getusermediafailed", "peerconnection:createofferfailed", "peerconnection:createanswerfailed", "peerconnection:setlocaldescriptionfailed", "peerconnection:setremotedescriptionfailed", "presentation:start", "presentation:started", "presentation:end", "presentation:ended", "presentation:failed", "availableSecondRemoteStream", "notAvailableSecondRemoteStream", "mustStopPresentation", "shareState", "enterRoom", "useLicense", "peerconnection:confirmed", "peerconnection:ontrack", "channels", "ended:fromserver", "main-cam-control", "admin-start-main-cam", "admin-stop-main-cam", "admin-stop-mic", "admin-start-mic", "admin-force-sync-media-state", "participant:move-request-to-spectators", "participant:move-request-to-participants"];
7
7
  export type TEventUA = (typeof UA_EVENT_NAMES)[number];
8
8
  export type TEventSession = (typeof SESSION_EVENT_NAMES)[number];