sip-connector 15.0.0 → 15.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (89) hide show
  1. package/README.md +160 -11
  2. package/dist/{@SipConnector-DbvV1Leg.js → @SipConnector-BEZk1hmx.js} +511 -229
  3. package/dist/@SipConnector-hpySQIBa.cjs +1 -0
  4. package/dist/ApiManager/__tests-utils__/helpers.d.ts +9 -0
  5. package/dist/ApiManager/constants.d.ts +2 -1
  6. package/dist/ApiManager/eventNames.d.ts +2 -1
  7. package/dist/CallManager/MCUCallStrategy.d.ts +1 -1
  8. package/dist/ConnectionManager/@ConnectionManager.d.ts +3 -3
  9. package/dist/ConnectionManager/getExtraHeadersRemoteAddress.d.ts +2 -2
  10. package/dist/IncomingCallManager/@IncomingCallManager.d.ts +2 -2
  11. package/dist/SipConnector/@SipConnector.d.ts +4 -2
  12. package/dist/SipConnector/eventNames.d.ts +1 -1
  13. package/dist/SipConnectorFacade/SipConnectorFacade.d.ts +15 -1
  14. package/dist/StatsManager/@StatsManager.d.ts +19 -0
  15. package/dist/StatsManager/eventNames.d.ts +2 -0
  16. package/dist/StatsManager/index.d.ts +2 -0
  17. package/dist/StatsPeerConnection/StatsPeerConnection.d.ts +20 -0
  18. package/dist/StatsPeerConnection/__fixtures__/callStaticsState.d.ts +3923 -0
  19. package/dist/StatsPeerConnection/constants.d.ts +14 -0
  20. package/dist/StatsPeerConnection/eventNames.d.ts +10 -0
  21. package/dist/StatsPeerConnection/index.d.ts +4 -0
  22. package/dist/StatsPeerConnection/parseStatsReports.d.ts +14 -0
  23. package/dist/StatsPeerConnection/requestAllStatistics.d.ts +11 -0
  24. package/dist/StatsPeerConnection/typings.d.ts +194 -0
  25. package/dist/StatsPeerConnection/utils/hasAvailableStats.d.ts +2 -0
  26. package/dist/StatsPeerConnection/utils/index.d.ts +3 -0
  27. package/dist/StatsPeerConnection/utils/now.d.ts +2 -0
  28. package/dist/StatsPeerConnection/utils/statsReportToObject.d.ts +4 -0
  29. package/dist/VideoSendingBalancer/CodecProvider.d.ts +7 -0
  30. package/dist/VideoSendingBalancer/ParametersSetterWithQueue.d.ts +12 -0
  31. package/dist/VideoSendingBalancer/SenderBalancer.d.ts +52 -0
  32. package/dist/VideoSendingBalancer/SenderFinder.d.ts +7 -0
  33. package/dist/VideoSendingBalancer/TaskQueue.d.ts +20 -0
  34. package/dist/VideoSendingBalancer/VideoSendingBalancer.d.ts +44 -0
  35. package/dist/VideoSendingBalancer/VideoSendingEventHandler.d.ts +25 -0
  36. package/dist/VideoSendingBalancer/calcBitrate/calcMaxBitrateByWidth.d.ts +4 -0
  37. package/dist/VideoSendingBalancer/calcBitrate/calcMaxBitrateByWidthAndCodec.d.ts +4 -0
  38. package/dist/VideoSendingBalancer/calcBitrate/index.d.ts +1 -0
  39. package/dist/VideoSendingBalancer/calcResolution/calcScaleResolutionDownBy.d.ts +6 -0
  40. package/dist/VideoSendingBalancer/calcResolution/index.d.ts +1 -0
  41. package/dist/VideoSendingBalancer/index.d.ts +3 -0
  42. package/dist/VideoSendingBalancer/types.d.ts +36 -0
  43. package/dist/__fixtures__/BaseSession.mock.d.ts +1 -1
  44. package/dist/__fixtures__/RTCPeerConnectionMock.d.ts +2 -2
  45. package/dist/__fixtures__/RTCRtpSenderMock.d.ts +1 -0
  46. package/dist/__fixtures__/RTCSessionMock.d.ts +2 -2
  47. package/dist/__fixtures__/UA.mock.d.ts +2 -2
  48. package/dist/__fixtures__/eventNames.d.ts +1 -1
  49. package/dist/__fixtures__/jssip.mock.d.ts +1 -1
  50. package/dist/doMock.cjs +1 -1
  51. package/dist/doMock.js +21 -22
  52. package/dist/index.cjs +1 -1
  53. package/dist/index.d.ts +2 -2
  54. package/dist/index.js +697 -562
  55. package/dist/tools/createUaParser/createUaParser.d.ts +4 -0
  56. package/dist/tools/createUaParser/index.d.ts +1 -0
  57. package/dist/tools/createUaParser/isElectronEnvironment.d.ts +2 -0
  58. package/dist/tools/error/index.d.ts +1 -1
  59. package/dist/tools/index.d.ts +5 -1
  60. package/dist/{setParametersToSender → tools/setParametersToSender}/configureDegradationPreference.d.ts +1 -1
  61. package/dist/{setParametersToSender → tools/setParametersToSender}/configureEncodings.d.ts +1 -1
  62. package/dist/tools/setParametersToSender/index.d.ts +3 -0
  63. package/dist/tools/setParametersToSender/setEncodingsToSender.d.ts +6 -0
  64. package/dist/tools/setParametersToSender/setMaxBitrateToSender.d.ts +2 -0
  65. package/dist/tools/setParametersToSender/setParametersToSender.d.ts +4 -0
  66. package/dist/tools/setParametersToSender/types.d.ts +5 -0
  67. package/dist/tools/syncMediaState/createSyncMediaState.d.ts +18 -0
  68. package/dist/tools/syncMediaState/index.d.ts +1 -18
  69. package/dist/utils/utils.d.ts +4 -0
  70. package/package.json +12 -18
  71. package/dist/@SipConnector-CZo7A8_q.cjs +0 -1
  72. package/dist/setParametersToSender/index.d.ts +0 -1
  73. package/dist/setParametersToSender/setParametersToSender.d.ts +0 -7
  74. package/dist/videoSendingBalancer/balance.d.ts +0 -10
  75. package/dist/videoSendingBalancer/getMaxBitrateByWidth.d.ts +0 -4
  76. package/dist/videoSendingBalancer/getMaxBitrateByWidthAndCodec.d.ts +0 -4
  77. package/dist/videoSendingBalancer/index.d.ts +0 -13
  78. package/dist/videoSendingBalancer/processSender.d.ts +0 -10
  79. package/dist/videoSendingBalancer/scaleBitrate.d.ts +0 -2
  80. package/dist/videoSendingBalancer/setEncodingsToSender.d.ts +0 -10
  81. /package/dist/{videoSendingBalancer → VideoSendingBalancer/calcBitrate}/hasAv1Codec.d.ts +0 -0
  82. /package/dist/{videoSendingBalancer → VideoSendingBalancer/calcBitrate}/scaleBitrateByCodec.d.ts +0 -0
  83. /package/dist/{videoSendingBalancer → tools}/scaleResolutionAndBitrate.d.ts +0 -0
  84. /package/dist/{setParametersToSender → tools/setParametersToSender}/configureEmptyEncodings.d.ts +0 -0
  85. /package/dist/{setParametersToSender → tools/setParametersToSender}/configureMaxBitrate.d.ts +0 -0
  86. /package/dist/{setParametersToSender → tools/setParametersToSender}/configureScaleResolutionDownBy.d.ts +0 -0
  87. /package/dist/{setParametersToSender → tools/setParametersToSender}/hasChangedRTCRtpSendParameters.d.ts +0 -0
  88. /package/dist/{setParametersToSender → tools/setParametersToSender}/resolveHasNeedToUpdateItemEncoding.d.ts +0 -0
  89. /package/dist/{videoSendingBalancer → utils}/hasIncludesString.d.ts +0 -0
package/dist/doMock.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const P=require("./@SipConnector-CZo7A8_q.cjs"),b=require("@krivega/jssip/lib/NameAddrHeader"),V=require("@krivega/jssip/lib/URI"),k=require("node:events"),U=require("@krivega/jssip/lib/SIPMessage"),a=require("@krivega/jssip"),f=require("webrtc-mock"),S=require("events-constructor");class w extends U.IncomingRequest{headers;constructor(e){super(),this.headers=new Headers(e)}getHeader(e){return this.headers.get(e)??""}}const H="incomingCall",q="declinedIncomingCall",G="failedIncomingCall",x="terminatedIncomingCall",v="connecting",z="connected",j="disconnected",Y="newRTCSession",B="registered",K="unregistered",J="registrationFailed",$="newMessage",Q="sipEvent",X="availableSecondRemoteStream",Z="notAvailableSecondRemoteStream",ee="mustStopPresentation",te="shareState",re="enterRoom",ne="useLicense",oe="peerconnection:confirmed",ie="peerconnection:ontrack",se="channels",ae="channels:notify",ce="ended:fromserver",de="main-cam-control",Ee="admin-stop-main-cam",he="admin-start-main-cam",ue="admin-stop-mic",me="admin-start-mic",le="admin-force-sync-media-state",pe="participant:added-to-list-moderators",ge="participant:removed-from-list-moderators",_e="participant:move-request-to-stream",Te="participant:move-request-to-spectators",Ie="participant:move-request-to-participants",Se="participation:accepting-word-request",we="participation:cancelling-word-request",Ne="webcast:started",Ce="webcast:stopped",Re="account:changed",fe="account:deleted",Ae="conference:participant-token-issued",Me="ended",Oe="sending",Pe="reinvite",ve="replaces",De="refer",ye="progress",Le="accepted",Fe="confirmed",We="peerconnection",be="failed",Ve="muted",ke="unmuted",Ue="newDTMF",He="newInfo",qe="hold",Ge="unhold",xe="update",ze="sdp",je="icecandidate",Ye="getusermediafailed",Be="peerconnection:createofferfailed",Ke="peerconnection:createanswerfailed",Je="peerconnection:setlocaldescriptionfailed",$e="peerconnection:setremotedescriptionfailed",Qe="presentation:start",Xe="presentation:started",Ze="presentation:end",et="presentation:ended",tt="presentation:failed",rt=[H,q,x,G,Se,we,_e,ae,Ae,Re,fe,Ne,Ce,pe,ge],D=[v,z,j,Y,B,K,J,$,Q],nt=[X,Z,ee,te,re,ne,oe,ie,se,ce,de,he,Ee,ue,me,le,Te,Ie],_=[Me,v,Oe,Pe,ve,De,ye,Le,Fe,We,be,Ve,ke,Ue,He,qe,Ge,xe,ze,je,Ye,Be,Ke,Je,$e,Qe,Xe,Ze,et,tt];[...D,...rt];[..._,...nt];class ot{originator;connection;events;remote_identity;mutedOptions={audio:!1,video:!1};constructor({originator:e="local",eventHandlers:t,remoteIdentity:r}){this.originator=e,this.events=new S.Events(_),this.initEvents(t),this.remote_identity=r}get contact(){throw new Error("Method not implemented.")}get direction(){throw new Error("Method not implemented.")}get local_identity(){throw new Error("Method not implemented.")}get start_time(){throw new Error("Method not implemented.")}get end_time(){throw new Error("Method not implemented.")}get status(){throw new Error("Method not implemented.")}get C(){throw new Error("Method not implemented.")}get causes(){throw new Error("Method not implemented.")}get id(){throw new Error("Method not implemented.")}get data(){throw new Error("Method not implemented.")}set data(e){throw new Error("Method not implemented.")}isInProgress(){throw new Error("Method not implemented.")}isEnded(){throw new Error("Method not implemented.")}isReadyToReOffer(){throw new Error("Method not implemented.")}answer(e){throw new Error("Method not implemented.")}terminate(e){throw new Error("Method not implemented.")}async sendInfo(e,t,r){throw new Error("Method not implemented.")}hold(e,t){throw new Error("Method not implemented.")}unhold(e,t){throw new Error("Method not implemented.")}async renegotiate(e,t){throw new Error("Method not implemented.")}isOnHold(){throw new Error("Method not implemented.")}mute(e){throw new Error("Method not implemented.")}unmute(e){throw new Error("Method not implemented.")}isMuted(){throw new Error("Method not implemented.")}refer(e,t){throw new Error("Method not implemented.")}resetLocalMedia(){throw new Error("Method not implemented.")}async replaceMediaStream(e,t){throw new Error("Method not implemented.")}addListener(e,t){throw new Error("Method not implemented.")}once(e,t){throw new Error("Method not implemented.")}removeListener(e,t){throw new Error("Method not implemented.")}off(e,t){return this.events.off(e,t),this}removeAllListeners(e){return console.warn("Method not implemented. Event:",e),this}setMaxListeners(e){throw new Error("Method not implemented.")}getMaxListeners(){throw new Error("Method not implemented.")}listeners(e){throw new Error("Method not implemented.")}rawListeners(e){throw new Error("Method not implemented.")}emit(e,...t){throw new Error("Method not implemented.")}listenerCount(e){throw new Error("Method not implemented.")}prependListener(e,t){throw new Error("Method not implemented.")}prependOnceListener(e,t){throw new Error("Method not implemented.")}eventNames(){throw new Error("Method not implemented.")}initEvents(e){e&&Object.entries(e).forEach(([t,r])=>{this.on(t,r)})}on(e,t){return _.includes(e)&&this.events.on(e,t),this}trigger(e,t){this.events.trigger(e,t)}sendDTMF(){this.trigger("newDTMF",{originator:this.originator})}async startPresentation(e){return this.trigger("presentation:start",e),this.trigger("presentation:started",e),e}async stopPresentation(e){return this.trigger("presentation:end",e),this.trigger("presentation:ended",e),e}isEstablished(){return!0}}class it{dtmf=null;track=null;transport=null;transform=null;parameters={encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}};parametersGets;constructor({track:e}={}){this.track=e??null}async getStats(){throw new Error("Method not implemented.")}async replaceTrack(e){this.track=e??null}async setParameters(e){if(e!==this.parametersGets)throw new Error("Failed to execute 'setParameters' on 'RTCRtpSender': Read-only field modified in setParameters().");const{transactionId:t}=this.parameters;this.parameters={...this.parameters,...e,transactionId:`${Number(t)+1}`}}getParameters(){return this.parametersGets={...this.parameters},this.parametersGets}setStreams(){throw new Error("Method not implemented.")}}const st=["track"];class at{senders=[];receivers=[];canTrickleIceCandidates;connectionState;currentLocalDescription;currentRemoteDescription;iceConnectionState;iceGatheringState;idpErrorInfo;idpLoginUrl;localDescription;onconnectionstatechange;ondatachannel;onicecandidate;onicecandidateerror=null;oniceconnectionstatechange;onicegatheringstatechange;onnegotiationneeded;onsignalingstatechange;ontrack;peerIdentity=void 0;pendingLocalDescription;pendingRemoteDescription;remoteDescription;sctp=null;signalingState;events;constructor(e,t){this.events=new S.Events(st),this.receivers=t.map(r=>({track:r}))}getRemoteStreams(){throw new Error("Method not implemented.")}async addIceCandidate(e){throw new Error("Method not implemented.")}addTransceiver(e,t){throw new Error("Method not implemented.")}close(){throw new Error("Method not implemented.")}restartIce(){throw new Error("Method not implemented.")}async createAnswer(e,t){throw new Error("Method not implemented.")}createDataChannel(e,t){throw new Error("Method not implemented.")}async createOffer(e,t,r){throw new Error("Method not implemented.")}getConfiguration(){throw new Error("Method not implemented.")}async getIdentityAssertion(){throw new Error("Method not implemented.")}async getStats(e){throw new Error("Method not implemented.")}getTransceivers(){throw new Error("Method not implemented.")}removeTrack(e){throw new Error("Method not implemented.")}setConfiguration(e){throw new Error("Method not implemented.")}async setLocalDescription(e){throw new Error("Method not implemented.")}async setRemoteDescription(e){throw new Error("Method not implemented.")}addEventListener(e,t,r){this.events.on(e,t)}removeEventListener(e,t,r){this.events.off(e,t)}dispatchEvent(e){throw new Error("Method not implemented.")}getReceivers=()=>this.receivers;getSenders=()=>this.senders;addTrack=e=>{const t=new it({track:e});return this.senders.push(t),this.events.trigger("track",{track:e}),t}}function ct(n){const e=n.match(/(purgatory)|[\d.]+/g);if(!e)throw new Error("wrong sip url");return e[0]}const A=400,y="777",dt=n=>n.getVideoTracks().length>0;class s extends ot{static presentationError;static startPresentationError;static countStartPresentationError=Number.POSITIVE_INFINITY;static countStartsPresentation=0;url;status_code;answer=jest.fn(({mediaStream:e})=>{if(this.originator!=="remote")throw new Error("answer available only for remote sessions");this.initPeerconnection(e),setTimeout(()=>{this.trigger("connecting"),setTimeout(()=>{this.trigger("accepted")},100),setTimeout(()=>{this.trigger("confirmed")},200)},A)});replaceMediaStream=jest.fn(async e=>{});isEndedInner=!1;constructor({eventHandlers:e,originator:t,remoteIdentity:r=new a.NameAddrHeader(new a.URI("sip","caller1","test1.com",5060),"Test Caller 1")}){super({originator:t,eventHandlers:e,remoteIdentity:r})}static setPresentationError(e){this.presentationError=e}static resetPresentationError(){this.presentationError=void 0}static setStartPresentationError(e,{count:t=Number.POSITIVE_INFINITY}={}){this.startPresentationError=e,this.countStartPresentationError=t}static resetStartPresentationError(){this.startPresentationError=void 0,this.countStartPresentationError=Number.POSITIVE_INFINITY,this.countStartsPresentation=0}startPresentation=async e=>{if(s.countStartsPresentation+=1,s.presentationError)throw this.trigger("presentation:start",e),this.trigger("presentation:failed",e),s.presentationError;if(s.startPresentationError&&s.countStartsPresentation<s.countStartPresentationError)throw this.trigger("presentation:start",e),this.trigger("presentation:failed",e),s.startPresentationError;return super.startPresentation(e)};stopPresentation=async e=>{if(s.presentationError)throw this.trigger("presentation:end",e),this.trigger("presentation:failed",e),s.presentationError;return super.stopPresentation(e)};initPeerconnection(e){return e?(this.createPeerconnection(e),!0):!1}createPeerconnection(e){const t=f.createAudioMediaStreamTrackMock();t.id="mainaudio1";const r=[t];if(dt(e)){const c=f.createVideoMediaStreamTrackMock();c.id="mainvideo1",r.push(c)}this.connection=new at(void 0,r),this.addStream(e),this.trigger("peerconnection",{peerconnection:this.connection})}connect(e,{mediaStream:t}={}){const r=ct(e);return this.initPeerconnection(t),setTimeout(()=>{e.includes(y)?this.trigger("failed",{originator:"remote",message:"IncomingResponse",cause:"Rejected"}):(this.trigger("connecting"),setTimeout(()=>{this.newInfo({originator:P.Originator.REMOTE,request:{getHeader:i=>i==="content-type"?"application/vinteo.webrtc.roomname":i==="x-webrtc-enter-room"?r:i==="x-webrtc-participant-name"?"Test Caller 1":""}})},100),setTimeout(()=>{this.trigger("accepted")},200),setTimeout(()=>{this.trigger("confirmed")},300))},A),this.connection}terminate({status_code:e,cause:t}={}){return this.status_code=e,this.trigger("ended",{status_code:e,cause:t,originator:"local"}),this.isEndedInner=!1,this}async terminateAsync({status_code:e,cause:t}={}){this.terminate({status_code:e,cause:t})}terminateRemote({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e,originator:"remote"}),this}addStream(e,t="getTracks"){e[t]().forEach(r=>this.connection.addTrack(r))}forEachSenders(e){const t=this.connection.getSenders();for(const r of t)e(r);return t}toggleMuteAudio(e){this.forEachSenders(({track:t})=>{t&&t.kind==="audio"&&(t.enabled=!e)})}toggleMuteVideo(e){this.forEachSenders(({track:t})=>{t&&t.kind==="video"&&(t.enabled=!e)})}mute(e){e.audio&&(this.mutedOptions.audio=!0,this.toggleMuteAudio(this.mutedOptions.audio)),e.video&&(this.mutedOptions.video=!0,this.toggleMuteVideo(this.mutedOptions.video)),this.onmute(e)}unmute(e){e.audio&&(this.mutedOptions.audio=!1),e.video&&(this.mutedOptions.video=!1),this.trigger("unmuted",e)}isMuted(){return this.mutedOptions}onmute({audio:e,video:t}){this.trigger("muted",{audio:e,video:t})}async sendInfo(){}isEnded(){return this.isEndedInner}newInfo(e){this.trigger("newInfo",e)}}class Et{extraHeaders=[];setExtraHeaders(e){this.extraHeaders=e}setExtraContactParams(){}}const d="PASSWORD_CORRECT",T="PASSWORD_CORRECT_2",L="NAME_INCORRECT",h=400,g={url:"wss://sipServerUrl/webrtc/wss/",sip_uri:"sip:sipServerUrl;transport=ws",via_transport:"WSS"},M={status_code:200,reason_phrase:"OK"},O={status_code:401,reason_phrase:"Unauthorized"};class o{static isAvailableTelephony=!0;static startError;static countStartError=Number.POSITIVE_INFINITY;static countStarts=0;events;registratorInner;call=jest.fn((e,t)=>{const{mediaStream:r,eventHandlers:i}=t;return this.session=new s({eventHandlers:i,originator:"local"}),this.session.connect(e,{mediaStream:r}),this.session});sendOptions=jest.fn((e,t,r)=>{console.log("sendOptions",e,t,r)});start=jest.fn(()=>{if(o.countStarts+=1,o.startError&&o.countStarts<o.countStartError){this.trigger("disconnected",o.startError);return}this.register()});stop=jest.fn(()=>{this.startedTimeout&&clearTimeout(this.startedTimeout),this.stopedTimeout&&clearTimeout(this.stopedTimeout),this.unregister(),this.isStarted()?this.stopedTimeout=setTimeout(()=>{this.trigger("disconnected",{error:!0,socket:g})},h):this.trigger("disconnected",{error:!0,socket:g})});removeAllListeners=jest.fn(()=>(this.events.removeEventHandlers(),this));once=jest.fn((e,t)=>(this.events.once(e,t),this));startedTimeout;stopedTimeout;session;isRegisteredInner;isConnectedInner;configuration;constructor(e){this.events=new S.Events(D);const[t,r]=e.uri.split(":"),[i,c]=r.split("@"),p={...e,uri:new a.URI(t,i,c)};this.configuration=p,this.registratorInner=new Et}static setStartError(e,{count:t=Number.POSITIVE_INFINITY}={}){o.startError=e,o.countStartError=t}static resetStartError(){o.startError=void 0,o.countStartError=Number.POSITIVE_INFINITY,o.countStarts=0}static setAvailableTelephony(){o.isAvailableTelephony=!0}static setNotAvailableTelephony(){o.isAvailableTelephony=!1}static reset(){o.resetStartError(),o.setAvailableTelephony()}on(e,t){return this.events.on(e,t),this}off(e,t){return this.events.off(e,t),this}trigger(e,t){this.events.trigger(e,t)}terminateSessions(){this.session?.terminate()}set(e,t){return this.configuration[e]=t,!0}register(){this.startedTimeout&&clearTimeout(this.startedTimeout);const{password:e,register:t,uri:r}=this.configuration;t===!0&&r.user.includes(L)?(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:O,cause:a.C.causes.REJECTED})},h)):!this.isRegistered()&&t===!0&&(e===d||e===T)?(this.isRegisteredInner=!0,this.startedTimeout=setTimeout(()=>{this.trigger("registered",{response:M})},h)):t===!0&&e!==d&&e!==T&&(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:O,cause:a.C.causes.REJECTED})},h)),o.isAvailableTelephony?(this.trigger("connected",{socket:g}),this.isConnectedInner=!0):this.stop()}unregister(){this.isRegisteredInner=!1,this.isConnectedInner=!1,this.trigger("unregistered",{response:M})}isRegistered(){return this.isRegisteredInner===!0}isConnected(){return this.isConnectedInner===!0}isStarted(){return this.configuration.register===!0&&this.isRegisteredInner===!0||this.configuration.register!==!0&&this.isConnectedInner===!0}newSipEvent(e){this.trigger("sipEvent",e)}registrator(){return this.registratorInner}}class ht{url;constructor(e){this.url=e}}class ut extends k.EventEmitter{contentType;body;constructor(e,t){super(),this.contentType=e,this.body=t}}const I="remote",mt=(n,e)=>{const t=new w(e),r={originator:I,request:t,info:new ut("","")};n.newInfo(r)},lt=(n,e)=>{const r={event:"sipEvent",request:new w(e)};n.newSipEvent(r)},pt=(n,{incomingNumber:e="1234",displayName:t,host:r})=>{const i=new s({originator:I,eventHandlers:{}}),c=new V("sip",e,r);i.remote_identity=new b(c,t);const p=new w([]);n.trigger("newRTCSession",{originator:I,session:i,request:p})},gt=(n,e)=>{e?n.trigger("failed",e):n.trigger("failed",n)},N={triggerNewInfo:mt,triggerNewSipEvent:lt,triggerIncomingSession:pt,triggerFailIncomingSession:gt,WebSocketInterface:ht,UA:o,C:{INVITE:"INVITE"}},u="user",E="displayName",m="SIP_SERVER_URL",C="SIP_WEB_SOCKET_SERVER_URL",_t=new N.WebSocketInterface(C),R={userAgent:"Chrome",sipServerUrl:m,sipWebSocketServerURL:C},Tt={...R},F={...R,user:u,password:d,register:!0},It={...F,displayName:E},St={...R,displayName:E,register:!1},l={session_timers:!1,sockets:[_t],user_agent:"Chrome",sdpSemantics:"unified-plan",register_expires:300,connection_recovery_max_interval:6,connection_recovery_min_interval:2},wt={...l,password:d,uri:new a.URI("sip",u,m),display_name:"",register:!0},Nt={...l,password:d,uri:new a.URI("sip",u,m),display_name:E,register:!0},Ct={...l,display_name:E,register:!1},Rt={...l,display_name:"",register:!1},W="10.10.10.10",ft=[`X-Vinteo-Remote: ${W}`],At=()=>new P.SipConnector({JsSIP:N});exports.FAILED_CONFERENCE_NUMBER=y;exports.JsSIP=N;exports.NAME_INCORRECT=L;exports.PASSWORD_CORRECT=d;exports.PASSWORD_CORRECT_2=T;exports.SIP_SERVER_URL=m;exports.SIP_WEB_SOCKET_SERVER_URL=C;exports.dataForConnectionWithAuthorization=F;exports.dataForConnectionWithAuthorizationWithDisplayName=It;exports.dataForConnectionWithoutAuthorization=St;exports.dataForConnectionWithoutAuthorizationWithoutDisplayName=Tt;exports.displayName=E;exports.doMockSipConnector=At;exports.extraHeadersRemoteAddress=ft;exports.remoteAddress=W;exports.uaConfigurationWithAuthorization=wt;exports.uaConfigurationWithAuthorizationWithDisplayName=Nt;exports.uaConfigurationWithoutAuthorization=Ct;exports.uaConfigurationWithoutAuthorizationWithoutDisplayName=Rt;exports.user=u;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const b=require("node:events"),V=require("@krivega/jssip/lib/NameAddrHeader"),k=require("@krivega/jssip/lib/URI"),U=require("@krivega/jssip/lib/SIPMessage"),a=require("@krivega/jssip"),f=require("webrtc-mock"),S=require("events-constructor"),P=require("./@SipConnector-hpySQIBa.cjs");class N extends U.IncomingRequest{headers;constructor(e){super(),this.headers=new Headers(e)}getHeader(e){return this.headers.get(e)??""}}const H="incomingCall",q="declinedIncomingCall",G="failedIncomingCall",x="terminatedIncomingCall",v="connecting",z="connected",j="disconnected",Y="newRTCSession",B="registered",K="unregistered",J="registrationFailed",$="newMessage",Q="sipEvent",X="availableSecondRemoteStream",Z="notAvailableSecondRemoteStream",ee="mustStopPresentation",te="shareState",re="enterRoom",ne="useLicense",oe="peerconnection:confirmed",se="peerconnection:ontrack",ie="channels",ae="channels:notify",ce="ended:fromserver",de="main-cam-control",Ee="admin-stop-main-cam",he="admin-start-main-cam",ue="admin-stop-mic",me="admin-start-mic",le="admin-force-sync-media-state",pe="participant:added-to-list-moderators",ge="participant:removed-from-list-moderators",_e="participant:move-request-to-stream",Te="participant:move-request-to-spectators",Ie="participant:move-request-to-participants",Se="participation:accepting-word-request",Ne="participation:cancelling-word-request",we="webcast:started",Ce="webcast:stopped",Re="account:changed",fe="account:deleted",Ae="conference:participant-token-issued",Me="ended",Oe="sending",Pe="reinvite",ve="replaces",De="refer",ye="progress",Le="accepted",Fe="confirmed",We="peerconnection",be="failed",Ve="muted",ke="unmuted",Ue="newDTMF",He="newInfo",qe="hold",Ge="unhold",xe="update",ze="sdp",je="icecandidate",Ye="getusermediafailed",Be="peerconnection:createofferfailed",Ke="peerconnection:createanswerfailed",Je="peerconnection:setlocaldescriptionfailed",$e="peerconnection:setremotedescriptionfailed",Qe="presentation:start",Xe="presentation:started",Ze="presentation:end",et="presentation:ended",tt="presentation:failed",rt=[H,q,x,G,Se,Ne,_e,ae,Ae,Re,fe,we,Ce,pe,ge],D=[v,z,j,Y,B,K,J,$,Q],nt=[X,Z,ee,te,re,ne,oe,se,ie,ce,de,he,Ee,ue,me,le,Te,Ie],_=[Me,v,Oe,Pe,ve,De,ye,Le,Fe,We,be,Ve,ke,Ue,He,qe,Ge,xe,ze,je,Ye,Be,Ke,Je,$e,Qe,Xe,Ze,et,tt];[...D,...rt];[..._,...nt];class ot{originator;connection;events;remote_identity;mutedOptions={audio:!1,video:!1};constructor({originator:e="local",eventHandlers:t,remoteIdentity:r}){this.originator=e,this.events=new S.Events(_),this.initEvents(t),this.remote_identity=r}get contact(){throw new Error("Method not implemented.")}get direction(){throw new Error("Method not implemented.")}get local_identity(){throw new Error("Method not implemented.")}get start_time(){throw new Error("Method not implemented.")}get end_time(){throw new Error("Method not implemented.")}get status(){throw new Error("Method not implemented.")}get C(){throw new Error("Method not implemented.")}get causes(){throw new Error("Method not implemented.")}get id(){throw new Error("Method not implemented.")}get data(){throw new Error("Method not implemented.")}set data(e){throw new Error("Method not implemented.")}isInProgress(){throw new Error("Method not implemented.")}isEnded(){throw new Error("Method not implemented.")}isReadyToReOffer(){throw new Error("Method not implemented.")}answer(e){throw new Error("Method not implemented.")}terminate(e){throw new Error("Method not implemented.")}async sendInfo(e,t,r){throw new Error("Method not implemented.")}hold(e,t){throw new Error("Method not implemented.")}unhold(e,t){throw new Error("Method not implemented.")}async renegotiate(e,t){throw new Error("Method not implemented.")}isOnHold(){throw new Error("Method not implemented.")}mute(e){throw new Error("Method not implemented.")}unmute(e){throw new Error("Method not implemented.")}isMuted(){throw new Error("Method not implemented.")}refer(e,t){throw new Error("Method not implemented.")}resetLocalMedia(){throw new Error("Method not implemented.")}async replaceMediaStream(e,t){throw new Error("Method not implemented.")}addListener(e,t){throw new Error("Method not implemented.")}once(e,t){throw new Error("Method not implemented.")}removeListener(e,t){throw new Error("Method not implemented.")}off(e,t){return this.events.off(e,t),this}removeAllListeners(e){return console.warn("Method not implemented. Event:",e),this}setMaxListeners(e){throw new Error("Method not implemented.")}getMaxListeners(){throw new Error("Method not implemented.")}listeners(e){throw new Error("Method not implemented.")}rawListeners(e){throw new Error("Method not implemented.")}emit(e,...t){throw new Error("Method not implemented.")}listenerCount(e){throw new Error("Method not implemented.")}prependListener(e,t){throw new Error("Method not implemented.")}prependOnceListener(e,t){throw new Error("Method not implemented.")}eventNames(){throw new Error("Method not implemented.")}initEvents(e){e&&Object.entries(e).forEach(([t,r])=>{this.on(t,r)})}on(e,t){return _.includes(e)&&this.events.on(e,t),this}trigger(e,t){this.events.trigger(e,t)}sendDTMF(){this.trigger("newDTMF",{originator:this.originator})}async startPresentation(e){return this.trigger("presentation:start",e),this.trigger("presentation:started",e),e}async stopPresentation(e){return this.trigger("presentation:end",e),this.trigger("presentation:ended",e),e}isEstablished(){return!0}}class st{stats=new Map().set("codec",{mimeType:"video/h264"});dtmf=null;track=null;transport=null;transform=null;parameters={encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}};parametersGets;constructor({track:e}={}){this.track=e??null}async getStats(){return this.stats}async replaceTrack(e){this.track=e??null}async setParameters(e){if(e!==this.parametersGets)throw new Error("Failed to execute 'setParameters' on 'RTCRtpSender': Read-only field modified in setParameters().");const{transactionId:t}=this.parameters;this.parameters={...this.parameters,...e,transactionId:`${Number(t)+1}`}}getParameters(){return this.parametersGets={...this.parameters},this.parametersGets}setStreams(){throw new Error("Method not implemented.")}}const it=["track"];class at{senders=[];receivers=[];canTrickleIceCandidates;connectionState;currentLocalDescription;currentRemoteDescription;iceConnectionState;iceGatheringState;idpErrorInfo;idpLoginUrl;localDescription;onconnectionstatechange;ondatachannel;onicecandidate;onicecandidateerror=null;oniceconnectionstatechange;onicegatheringstatechange;onnegotiationneeded;onsignalingstatechange;ontrack;peerIdentity=void 0;pendingLocalDescription;pendingRemoteDescription;remoteDescription;sctp=null;signalingState;events;constructor(e,t){this.events=new S.Events(it),this.receivers=t.map(r=>({track:r}))}getRemoteStreams(){throw new Error("Method not implemented.")}async addIceCandidate(e){throw new Error("Method not implemented.")}addTransceiver(e,t){throw new Error("Method not implemented.")}close(){throw new Error("Method not implemented.")}restartIce(){throw new Error("Method not implemented.")}async createAnswer(e,t){throw new Error("Method not implemented.")}createDataChannel(e,t){throw new Error("Method not implemented.")}async createOffer(e,t,r){throw new Error("Method not implemented.")}getConfiguration(){throw new Error("Method not implemented.")}async getIdentityAssertion(){throw new Error("Method not implemented.")}async getStats(e){throw new Error("Method not implemented.")}getTransceivers(){throw new Error("Method not implemented.")}removeTrack(e){throw new Error("Method not implemented.")}setConfiguration(e){throw new Error("Method not implemented.")}async setLocalDescription(e){throw new Error("Method not implemented.")}async setRemoteDescription(e){throw new Error("Method not implemented.")}addEventListener(e,t,r){this.events.on(e,t)}removeEventListener(e,t,r){this.events.off(e,t)}dispatchEvent(e){throw new Error("Method not implemented.")}getReceivers=()=>this.receivers;getSenders=()=>this.senders;addTrack=e=>{const t=new st({track:e});return this.senders.push(t),this.events.trigger("track",{track:e}),t}}function ct(n){const e=n.match(/(purgatory)|[\d.]+/g);if(!e)throw new Error("wrong sip url");return e[0]}const A=400,y="777",dt=n=>n.getVideoTracks().length>0;class i extends ot{static presentationError;static startPresentationError;static countStartPresentationError=Number.POSITIVE_INFINITY;static countStartsPresentation=0;url;status_code;answer=jest.fn(({mediaStream:e})=>{if(this.originator!=="remote")throw new Error("answer available only for remote sessions");this.initPeerconnection(e),setTimeout(()=>{this.trigger("connecting"),setTimeout(()=>{this.trigger("accepted")},100),setTimeout(()=>{this.trigger("confirmed")},200)},A)});replaceMediaStream=jest.fn(async e=>{});isEndedInner=!1;constructor({eventHandlers:e,originator:t,remoteIdentity:r=new a.NameAddrHeader(new a.URI("sip","caller1","test1.com",5060),"Test Caller 1")}){super({originator:t,eventHandlers:e,remoteIdentity:r})}static setPresentationError(e){this.presentationError=e}static resetPresentationError(){this.presentationError=void 0}static setStartPresentationError(e,{count:t=Number.POSITIVE_INFINITY}={}){this.startPresentationError=e,this.countStartPresentationError=t}static resetStartPresentationError(){this.startPresentationError=void 0,this.countStartPresentationError=Number.POSITIVE_INFINITY,this.countStartsPresentation=0}startPresentation=async e=>{if(i.countStartsPresentation+=1,i.presentationError)throw this.trigger("presentation:start",e),this.trigger("presentation:failed",e),i.presentationError;if(i.startPresentationError&&i.countStartsPresentation<i.countStartPresentationError)throw this.trigger("presentation:start",e),this.trigger("presentation:failed",e),i.startPresentationError;return super.startPresentation(e)};stopPresentation=async e=>{if(i.presentationError)throw this.trigger("presentation:end",e),this.trigger("presentation:failed",e),i.presentationError;return super.stopPresentation(e)};initPeerconnection(e){return e?(this.createPeerconnection(e),!0):!1}createPeerconnection(e){const t=f.createAudioMediaStreamTrackMock();t.id="mainaudio1";const r=[t];if(dt(e)){const c=f.createVideoMediaStreamTrackMock();c.id="mainvideo1",r.push(c)}this.connection=new at(void 0,r),this.addStream(e),this.trigger("peerconnection",{peerconnection:this.connection})}connect(e,{mediaStream:t}={}){const r=ct(e);return this.initPeerconnection(t),setTimeout(()=>{e.includes(y)?this.trigger("failed",{originator:"remote",message:"IncomingResponse",cause:"Rejected"}):(this.trigger("connecting"),setTimeout(()=>{this.newInfo({originator:P.Originator.REMOTE,request:{getHeader:s=>s==="content-type"?"application/vinteo.webrtc.roomname":s==="x-webrtc-enter-room"?r:s==="x-webrtc-participant-name"?"Test Caller 1":""}})},100),setTimeout(()=>{this.trigger("accepted")},200),setTimeout(()=>{this.trigger("confirmed")},300))},A),this.connection}terminate({status_code:e,cause:t}={}){return this.status_code=e,this.trigger("ended",{status_code:e,cause:t,originator:"local"}),this.isEndedInner=!1,this}async terminateAsync({status_code:e,cause:t}={}){this.terminate({status_code:e,cause:t})}terminateRemote({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e,originator:"remote"}),this}addStream(e,t="getTracks"){e[t]().forEach(r=>this.connection.addTrack(r))}forEachSenders(e){const t=this.connection.getSenders();for(const r of t)e(r);return t}toggleMuteAudio(e){this.forEachSenders(({track:t})=>{t&&t.kind==="audio"&&(t.enabled=!e)})}toggleMuteVideo(e){this.forEachSenders(({track:t})=>{t&&t.kind==="video"&&(t.enabled=!e)})}mute(e){e.audio&&(this.mutedOptions.audio=!0,this.toggleMuteAudio(this.mutedOptions.audio)),e.video&&(this.mutedOptions.video=!0,this.toggleMuteVideo(this.mutedOptions.video)),this.onmute(e)}unmute(e){e.audio&&(this.mutedOptions.audio=!1),e.video&&(this.mutedOptions.video=!1),this.trigger("unmuted",e)}isMuted(){return this.mutedOptions}onmute({audio:e,video:t}){this.trigger("muted",{audio:e,video:t})}async sendInfo(){}isEnded(){return this.isEndedInner}newInfo(e){this.trigger("newInfo",e)}}class Et{extraHeaders=[];setExtraHeaders(e){this.extraHeaders=e}setExtraContactParams(){}}const d="PASSWORD_CORRECT",T="PASSWORD_CORRECT_2",L="NAME_INCORRECT",h=400,g={url:"wss://sipServerUrl/webrtc/wss/",sip_uri:"sip:sipServerUrl;transport=ws",via_transport:"WSS"},M={status_code:200,reason_phrase:"OK"},O={status_code:401,reason_phrase:"Unauthorized"};class o{static isAvailableTelephony=!0;static startError;static countStartError=Number.POSITIVE_INFINITY;static countStarts=0;events;registratorInner;call=jest.fn((e,t)=>{const{mediaStream:r,eventHandlers:s}=t;return this.session=new i({eventHandlers:s,originator:"local"}),this.session.connect(e,{mediaStream:r}),this.session});sendOptions=jest.fn((e,t,r)=>{console.log("sendOptions",e,t,r)});start=jest.fn(()=>{if(o.countStarts+=1,o.startError&&o.countStarts<o.countStartError){this.trigger("disconnected",o.startError);return}this.register()});stop=jest.fn(()=>{this.startedTimeout&&clearTimeout(this.startedTimeout),this.stopedTimeout&&clearTimeout(this.stopedTimeout),this.unregister(),this.isStarted()?this.stopedTimeout=setTimeout(()=>{this.trigger("disconnected",{error:!0,socket:g})},h):this.trigger("disconnected",{error:!0,socket:g})});removeAllListeners=jest.fn(()=>(this.events.removeEventHandlers(),this));once=jest.fn((e,t)=>(this.events.once(e,t),this));startedTimeout;stopedTimeout;session;isRegisteredInner;isConnectedInner;configuration;constructor(e){this.events=new S.Events(D);const[t,r]=e.uri.split(":"),[s,c]=r.split("@"),p={...e,uri:new a.URI(t,s,c)};this.configuration=p,this.registratorInner=new Et}static setStartError(e,{count:t=Number.POSITIVE_INFINITY}={}){o.startError=e,o.countStartError=t}static resetStartError(){o.startError=void 0,o.countStartError=Number.POSITIVE_INFINITY,o.countStarts=0}static setAvailableTelephony(){o.isAvailableTelephony=!0}static setNotAvailableTelephony(){o.isAvailableTelephony=!1}static reset(){o.resetStartError(),o.setAvailableTelephony()}on(e,t){return this.events.on(e,t),this}off(e,t){return this.events.off(e,t),this}trigger(e,t){this.events.trigger(e,t)}terminateSessions(){this.session?.terminate()}set(e,t){return this.configuration[e]=t,!0}register(){this.startedTimeout&&clearTimeout(this.startedTimeout);const{password:e,register:t,uri:r}=this.configuration;t===!0&&r.user.includes(L)?(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:O,cause:a.C.causes.REJECTED})},h)):!this.isRegistered()&&t===!0&&(e===d||e===T)?(this.isRegisteredInner=!0,this.startedTimeout=setTimeout(()=>{this.trigger("registered",{response:M})},h)):t===!0&&e!==d&&e!==T&&(this.isRegisteredInner=!1,this.isConnectedInner=!1,this.startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:O,cause:a.C.causes.REJECTED})},h)),o.isAvailableTelephony?(this.trigger("connected",{socket:g}),this.isConnectedInner=!0):this.stop()}unregister(){this.isRegisteredInner=!1,this.isConnectedInner=!1,this.trigger("unregistered",{response:M})}isRegistered(){return this.isRegisteredInner===!0}isConnected(){return this.isConnectedInner===!0}isStarted(){return this.configuration.register===!0&&this.isRegisteredInner===!0||this.configuration.register!==!0&&this.isConnectedInner===!0}newSipEvent(e){this.trigger("sipEvent",e)}registrator(){return this.registratorInner}}class ht{url;constructor(e){this.url=e}}class ut extends b.EventEmitter{contentType;body;constructor(e,t){super(),this.contentType=e,this.body=t}}const I="remote",mt=(n,e)=>{const t=new N(e),r={originator:I,request:t,info:new ut("","")};n.newInfo(r)},lt=(n,e)=>{const r={event:"sipEvent",request:new N(e)};n.newSipEvent(r)},pt=(n,{incomingNumber:e="1234",displayName:t,host:r})=>{const s=new i({originator:I,eventHandlers:{}}),c=new k("sip",e,r);s.remote_identity=new V(c,t);const p=new N([]);n.trigger("newRTCSession",{originator:I,session:s,request:p})},gt=(n,e)=>{e?n.trigger("failed",e):n.trigger("failed",n)},w={triggerNewInfo:mt,triggerNewSipEvent:lt,triggerIncomingSession:pt,triggerFailIncomingSession:gt,WebSocketInterface:ht,UA:o,C:{INVITE:"INVITE"}},u="user",E="displayName",m="SIP_SERVER_URL",C="SIP_WEB_SOCKET_SERVER_URL",_t=new w.WebSocketInterface(C),R={userAgent:"Chrome",sipServerUrl:m,sipWebSocketServerURL:C},Tt={...R},F={...R,user:u,password:d,register:!0},It={...F,displayName:E},St={...R,displayName:E,register:!1},l={session_timers:!1,sockets:[_t],user_agent:"Chrome",sdpSemantics:"unified-plan",register_expires:300,connection_recovery_max_interval:6,connection_recovery_min_interval:2},Nt={...l,password:d,uri:new a.URI("sip",u,m),display_name:"",register:!0},wt={...l,password:d,uri:new a.URI("sip",u,m),display_name:E,register:!0},Ct={...l,display_name:E,register:!1},Rt={...l,display_name:"",register:!1},W="10.10.10.10",ft=[`X-Vinteo-Remote: ${W}`],At=()=>new P.SipConnector({JsSIP:w});exports.FAILED_CONFERENCE_NUMBER=y;exports.JsSIP=w;exports.NAME_INCORRECT=L;exports.PASSWORD_CORRECT=d;exports.PASSWORD_CORRECT_2=T;exports.SIP_SERVER_URL=m;exports.SIP_WEB_SOCKET_SERVER_URL=C;exports.dataForConnectionWithAuthorization=F;exports.dataForConnectionWithAuthorizationWithDisplayName=It;exports.dataForConnectionWithoutAuthorization=St;exports.dataForConnectionWithoutAuthorizationWithoutDisplayName=Tt;exports.displayName=E;exports.doMockSipConnector=At;exports.extraHeadersRemoteAddress=ft;exports.remoteAddress=W;exports.uaConfigurationWithAuthorization=Nt;exports.uaConfigurationWithAuthorizationWithDisplayName=wt;exports.uaConfigurationWithoutAuthorization=Ct;exports.uaConfigurationWithoutAuthorizationWithoutDisplayName=Rt;exports.user=u;
package/dist/doMock.js CHANGED
@@ -1,12 +1,12 @@
1
- import { O as D, S as L } from "./@SipConnector-DbvV1Leg.js";
2
- import y from "@krivega/jssip/lib/NameAddrHeader";
3
- import F from "@krivega/jssip/lib/URI";
4
- import { EventEmitter as b } from "node:events";
5
- import { IncomingRequest as V } from "@krivega/jssip/lib/SIPMessage";
6
- import { NameAddrHeader as k, URI as E, C as N } from "@krivega/jssip";
7
- import { createAudioMediaStreamTrackMock as W, createVideoMediaStreamTrackMock as U } from "webrtc-mock";
1
+ import { EventEmitter as D } from "node:events";
2
+ import L from "@krivega/jssip/lib/NameAddrHeader";
3
+ import y from "@krivega/jssip/lib/URI";
4
+ import { IncomingRequest as F } from "@krivega/jssip/lib/SIPMessage";
5
+ import { NameAddrHeader as b, URI as E, C as N } from "@krivega/jssip";
6
+ import { createAudioMediaStreamTrackMock as V, createVideoMediaStreamTrackMock as k } from "webrtc-mock";
8
7
  import { Events as _ } from "events-constructor";
9
- class T extends V {
8
+ import { O as W, S as U } from "./@SipConnector-BEZk1hmx.js";
9
+ class T extends F {
10
10
  headers;
11
11
  constructor(e) {
12
12
  super(), this.headers = new Headers(e);
@@ -269,6 +269,7 @@ class ot {
269
269
  }
270
270
  }
271
271
  class st {
272
+ stats = (/* @__PURE__ */ new Map()).set("codec", { mimeType: "video/h264" });
272
273
  dtmf = null;
273
274
  track = null;
274
275
  transport = null;
@@ -284,9 +285,8 @@ class st {
284
285
  constructor({ track: e } = {}) {
285
286
  this.track = e ?? null;
286
287
  }
287
- // eslint-disable-next-line class-methods-use-this
288
288
  async getStats() {
289
- throw new Error("Method not implemented.");
289
+ return this.stats;
290
290
  }
291
291
  async replaceTrack(e) {
292
292
  this.track = e ?? null;
@@ -306,7 +306,7 @@ class st {
306
306
  getParameters() {
307
307
  return this.parametersGets = { ...this.parameters }, this.parametersGets;
308
308
  }
309
- // eslint-disable-next-line class-methods-use-this
309
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
310
310
  setStreams() {
311
311
  throw new Error("Method not implemented.");
312
312
  }
@@ -443,14 +443,13 @@ class i extends ot {
443
443
  }, 200);
444
444
  }, f);
445
445
  });
446
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
447
446
  replaceMediaStream = jest.fn(async (e) => {
448
447
  });
449
448
  isEndedInner = !1;
450
449
  constructor({
451
450
  eventHandlers: e,
452
451
  originator: t,
453
- remoteIdentity: r = new k(
452
+ remoteIdentity: r = new b(
454
453
  new E("sip", "caller1", "test1.com", 5060),
455
454
  "Test Caller 1"
456
455
  )
@@ -485,11 +484,11 @@ class i extends ot {
485
484
  return e ? (this.createPeerconnection(e), !0) : !1;
486
485
  }
487
486
  createPeerconnection(e) {
488
- const t = W();
487
+ const t = V();
489
488
  t.id = "mainaudio1";
490
489
  const r = [t];
491
490
  if (Et(e)) {
492
- const a = U();
491
+ const a = k();
493
492
  a.id = "mainvideo1", r.push(a);
494
493
  }
495
494
  this.connection = new at(void 0, r), this.addStream(e), this.trigger("peerconnection", { peerconnection: this.connection });
@@ -503,7 +502,7 @@ class i extends ot {
503
502
  cause: "Rejected"
504
503
  }) : (this.trigger("connecting"), setTimeout(() => {
505
504
  this.newInfo({
506
- originator: D.REMOTE,
505
+ originator: W.REMOTE,
507
506
  // @ts-expect-error
508
507
  request: {
509
508
  getHeader: (s) => s === "content-type" ? "application/vinteo.webrtc.roomname" : s === "x-webrtc-enter-room" ? r : s === "x-webrtc-participant-name" ? "Test Caller 1" : ""
@@ -565,7 +564,7 @@ class i extends ot {
565
564
  video: t
566
565
  });
567
566
  }
568
- // eslint-disable-next-line @typescript-eslint/no-empty-function, class-methods-use-this
567
+ // eslint-disable-next-line @typescript-eslint/no-empty-function, @typescript-eslint/class-methods-use-this
569
568
  async sendInfo() {
570
569
  }
571
570
  isEnded() {
@@ -581,7 +580,7 @@ class ht {
581
580
  setExtraHeaders(e) {
582
581
  this.extraHeaders = e;
583
582
  }
584
- // eslint-disable-next-line class-methods-use-this
583
+ // eslint-disable-next-line @typescript-eslint/class-methods-use-this
585
584
  setExtraContactParams() {
586
585
  }
587
586
  }
@@ -735,7 +734,7 @@ class lt {
735
734
  this.url = e;
736
735
  }
737
736
  }
738
- class ut extends b {
737
+ class ut extends D {
739
738
  contentType;
740
739
  body;
741
740
  constructor(e, t) {
@@ -757,8 +756,8 @@ const g = "remote", pt = (n, e) => {
757
756
  displayName: t,
758
757
  host: r
759
758
  }) => {
760
- const s = new i({ originator: g, eventHandlers: {} }), a = new F("sip", e, r);
761
- s.remote_identity = new y(a, t);
759
+ const s = new i({ originator: g, eventHandlers: {} }), a = new y("sip", e, r);
760
+ s.remote_identity = new L(a, t);
762
761
  const l = new T([]);
763
762
  n.trigger("newRTCSession", {
764
763
  originator: g,
@@ -823,7 +822,7 @@ const g = "remote", pt = (n, e) => {
823
822
  ...m,
824
823
  display_name: "",
825
824
  register: !1
826
- }, St = "10.10.10.10", kt = [`X-Vinteo-Remote: ${St}`], Wt = () => new L({
825
+ }, St = "10.10.10.10", kt = [`X-Vinteo-Remote: ${St}`], Wt = () => new U({
827
826
  JsSIP: P
828
827
  });
829
828
  export {
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("events-constructor");const i=require("./@SipConnector-CZo7A8_q.cjs"),G=require("@krivega/cancelable-promise"),ae=require("repeated-calls"),le=require("ts-debounce"),_=require("debug"),ue=require("sequent-promises"),de=require("stack-promises"),ge=e=>e instanceof Object&&("originator"in e||"cause"in e),fe=e=>{if(G.isCanceledError(e))return!0;if(!ge(e))return!1;const{originator:n,cause:t}=e;return typeof t=="string"?t===i.ECallCause.REQUEST_TIMEOUT||t===i.ECallCause.REJECTED||n===i.Originator.LOCAL&&(t===i.ECallCause.CANCELED||t===i.ECallCause.BYE):!1},Ce=(e,n)=>(e.degradationPreference=n.degradationPreference,e),he=(e,n)=>{e.encodings??=[];for(let t=e.encodings.length;t<n;t+=1)e.encodings.push({});return e},K=e=>(n,t)=>t!==void 0&&n!==t||t===void 0&&n!==e,Se=K(),me=(e,n)=>{if(Se(e,n))return e},Re=(e,n)=>{const t=e.maxBitrate,o=me(n,t);return o!==void 0&&(e.maxBitrate=o),e},Y=1,pe=K(Y),ye=(e,n)=>{const t=e===void 0?void 0:Math.max(e,Y);if(t!==void 0&&pe(t,n))return t},Ee=(e,n)=>{const t=e.scaleResolutionDownBy,o=ye(n,t);return o!==void 0&&(e.scaleResolutionDownBy=o),e},Te=(e,n)=>{const t=n.encodings?.length??0;return he(e,t),e.encodings.forEach((o,r)=>{const s=(n?.encodings??[])[r],c=s?.maxBitrate,a=s?.scaleResolutionDownBy;Re(o,c),Ee(o,a)}),e},ve=(e,n)=>{if(e.codecs?.length!==n.codecs?.length)return!0;for(let t=0;t<(e.codecs?.length??0);t++)if(JSON.stringify(e.codecs[t])!==JSON.stringify(n.codecs[t]))return!0;if(e.headerExtensions?.length!==n.headerExtensions?.length)return!0;for(let t=0;t<(e.headerExtensions?.length??0);t++)if(JSON.stringify(e.headerExtensions[t])!==JSON.stringify(n.headerExtensions[t]))return!0;if(e.encodings?.length!==n.encodings?.length)return!0;for(let t=0;t<(e.encodings.length??0);t++)if(JSON.stringify(e.encodings[t])!==JSON.stringify(n.encodings[t]))return!0;return e.rtcp?.cname!==n.rtcp?.cname||e.rtcp?.reducedSize!==n.rtcp?.reducedSize||e.degradationPreference!==n.degradationPreference},q=async(e,n)=>{const t=e.getParameters(),o=JSON.parse(JSON.stringify(t));Te(t,n),Ce(t,n);const r=ve(o,t);return r&&await e.setParameters(t),{parameters:t,isChanged:r}},Me=e=>e.getVideoTracks()[0],be=1e6,m=e=>e*be,z=m(.06),Q=m(4),_e=e=>e<=64?z:e<=128?m(.12):e<=256?m(.25):e<=384?m(.32):e<=426?m(.38):e<=640?m(.5):e<=848?m(.7):e<=1280?m(1):e<=1920?m(2):Q,Z=(e,n)=>e!==void 0&&n!==void 0&&e.toLowerCase().includes(n.toLowerCase()),Ae="av1",Oe=e=>Z(e,Ae),Ne=.6,J=(e,n)=>Oe(n)?e*Ne:e,Be=e=>J(z,e),we=e=>J(Q,e),ee=(e,n)=>{const t=_e(e);return J(t,n)},H=1,ne=({videoTrack:e,targetSize:n,codec:t})=>{const o=e.getSettings(),r=o.width,s=o.height,c=r===void 0?H:r/n.width,a=s===void 0?H:s/n.height,l=Math.max(c,a,H),d=ee(n.width,t);return{scaleResolutionDownBy:l,maxBitrate:d}},w=({mediaStream:e,simulcastEncodings:n,sendEncodings:t})=>{if(n&&n.length>0){const o=t??[],r=Me(e);if(r===void 0)throw new Error("No video track");return n.forEach((s,c)=>{const a=o[c]??{};a.active=!0,s.rid!==void 0&&(a.rid=s.rid),s.scalabilityMode!==void 0&&(a.scalabilityMode=s.scalabilityMode);const{maxBitrate:l,scaleResolutionDownBy:d}=ne({videoTrack:r,targetSize:{width:s.width,height:s.height}});a.maxBitrate=l,a.scaleResolutionDownBy=d,o[c]=a}),o}return t},te="purgatory",P=e=>e===te,De=(e,n)=>e.filter(o=>n.some(r=>r.clockRate===o.clockRate&&r.mimeType===o.mimeType&&r.channels===o.channels&&r.sdpFmtpLine===o.sdpFmtpLine)),Pe=e=>{const n=RTCRtpSender.getCapabilities(e),t=RTCRtpReceiver.getCapabilities(e),o=n===null?[]:n.codecs,r=t===null?[]:t.codecs;return De(o,r)},Ie=(e,n)=>n===void 0||n.length===0?e:e.sort((t,o)=>{const r=n.indexOf(t.mimeType),s=n.indexOf(o.mimeType),c=r===-1?Number.MAX_VALUE:r,a=s===-1?Number.MAX_VALUE:s;return c-a}),xe=(e,n)=>n===void 0||n.length===0?e:e.filter(t=>!n.includes(t.mimeType)),Fe=(e,{preferredMimeTypesVideoCodecs:n,excludeMimeTypesVideoCodecs:t})=>{if(typeof e.setCodecPreferences=="function"&&e.sender.track?.kind==="video"&&(n!==void 0&&n.length>0||t!==void 0&&t.length>0)){const o=Pe("video"),r=xe(o,t),s=Ie(r,n);e.setCodecPreferences(s)}},D=(e,{preferredMimeTypesVideoCodecs:n,excludeMimeTypesVideoCodecs:t})=>async o=>{try{Fe(o,{preferredMimeTypesVideoCodecs:n,excludeMimeTypesVideoCodecs:t}),Object.values(e).filter(s=>s!=null).length>0&&(i.logger("updateTransceiver setParametersToSender",e),await q(o.sender,e))}catch(r){i.logger("updateTransceiver error",r)}},$=e=>{if(!G.isCanceledError(e)&&!ae.hasCanceledError(e))throw e;return{isSuccessful:!1}},Ue=({kind:e,readyState:n})=>e==="video"&&n==="live",ke=new Set(["on","once","onceRace","wait","off","sendDTMF","hangUp","declineToIncomingCall","sendChannels","checkTelephony","waitChannels","ping","connection","isConfigured","isRegistered"]);class Ve{on;once;onceRace;wait;off;sendDTMF;hangUp;declineToIncomingCall;sendChannels;checkTelephony;waitChannels;ping;connection;isConfigured;isRegistered;sipConnector;preferredMimeTypesVideoCodecs;excludeMimeTypesVideoCodecs;constructor(n,{preferredMimeTypesVideoCodecs:t,excludeMimeTypesVideoCodecs:o}={}){return this.preferredMimeTypesVideoCodecs=t,this.excludeMimeTypesVideoCodecs=o,this.sipConnector=n,new Proxy(this,{get:(r,s,c)=>{if(typeof s=="string"&&ke.has(s)&&s in this.sipConnector){const l=Reflect.get(this.sipConnector,s,this.sipConnector);return typeof l=="function"?l.bind(this.sipConnector):l}const a=Reflect.get(r,s,c);return typeof a=="function"?a.bind(r):a}})}connectToServer=async n=>{const{userAgent:t,sipWebSocketServerURL:o,sipServerUrl:r,remoteAddress:s,displayName:c,name:a,password:l,isRegisteredUser:d,isDisconnectOnFail:f}=n;return i.logger("connectToServer",n),this.sipConnector.connect({userAgent:t,sipWebSocketServerURL:o,sipServerUrl:r,remoteAddress:s,displayName:c,password:l,user:a,register:d}).then(g=>(i.logger("connectToServer then"),{ua:g,isSuccessful:!0})).catch(async g=>(i.logger("connectToServer catch: error",g),f===!0?this.sipConnector.disconnect().then(()=>$(g)).catch(()=>$(g)):$(g)))};callToServer=async n=>{const{conference:t,mediaStream:o,extraHeaders:r,iceServers:s,contentHint:c,simulcastEncodings:a,degradationPreference:l,sendEncodings:d,offerToReceiveAudio:f,offerToReceiveVideo:g,directionVideo:I,directionAudio:x,setRemoteStreams:C,onBeforeProgressCall:R,onSuccessProgressCall:h,onEnterPurgatory:S,onEnterConference:p,onFailProgressCall:y,onFinishProgressCall:E,onEndedCall:T}=n,b=this.resolveHandleReadyRemoteStreamsDebounced({onReadyRemoteStreams:C}),A=this.resolveHandleReadyRemoteStreams({onReadyRemoteStreams:()=>{b().catch(_)}}),O=D({degradationPreference:l},{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs});i.logger("callToServer",n);const N=async()=>(i.logger("startCall"),this.sipConnector.call({mediaStream:o,extraHeaders:r,iceServers:s,contentHint:c,offerToReceiveAudio:f,offerToReceiveVideo:g,directionVideo:I,directionAudio:x,sendEncodings:w({mediaStream:o,simulcastEncodings:a,sendEncodings:d}),number:t,onAddedTransceiver:O,ontrack:A}));let v=!1,M;const B=(i.logger("subscribeEnterConference: onEnterConference",p),S??p?this.sipConnector.on("api:enterRoom",({room:u})=>{i.logger("enterRoom",{_room:u,isSuccessProgressCall:v}),M=u,P(M)?S&&S():p&&p({isSuccessProgressCall:v})}):()=>{}),k=u=>(i.logger("onSuccess"),v=!0,b().catch(_),h&&h({isPurgatory:P(M)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{B(),T&&T()}),u),V=u=>{throw i.logger("onFail"),y&&y(),B(),u},L=()=>{i.logger("onFinish"),E&&E()};return i.logger("onBeforeProgressCall"),R&&R(t),N().then(k).catch(u=>V(u)).finally(L)};disconnectFromServer=async()=>this.sipConnector.disconnect().then(()=>(i.logger("disconnectFromServer: then"),{isSuccessful:!0})).catch(n=>(i.logger("disconnectFromServer: catch",n),{isSuccessful:!1}));answerToIncomingCall=async n=>{const{mediaStream:t,extraHeaders:o,iceServers:r,contentHint:s,simulcastEncodings:c,degradationPreference:a,sendEncodings:l,offerToReceiveAudio:d,offerToReceiveVideo:f,directionVideo:g,directionAudio:I,setRemoteStreams:x,onBeforeProgressCall:C,onSuccessProgressCall:R,onEnterPurgatory:h,onEnterConference:S,onFailProgressCall:p,onFinishProgressCall:y,onEndedCall:E}=n,T=this.resolveHandleReadyRemoteStreamsDebounced({onReadyRemoteStreams:x}),b=this.resolveHandleReadyRemoteStreams({onReadyRemoteStreams:()=>{T().catch(_)}}),A=D({degradationPreference:a},{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs});i.logger("answerToIncomingCall",n);const O=async()=>this.sipConnector.answerToIncomingCall({mediaStream:t,extraHeaders:o,iceServers:r,contentHint:s,offerToReceiveAudio:d,offerToReceiveVideo:f,directionVideo:g,directionAudio:I,sendEncodings:w({mediaStream:t,simulcastEncodings:c,sendEncodings:l}),onAddedTransceiver:A,ontrack:b}),N=()=>{const{remoteCallerData:u}=this.sipConnector;return u.incomingNumber};let v=!1,M;const B=(i.logger("subscribeEnterConference: onEnterConference",S),h??S?this.sipConnector.on("api:enterRoom",u=>{i.logger("enterRoom",{_room:u,isSuccessProgressCall:v}),M=u,P(M)?h&&h():S&&S({isSuccessProgressCall:v})}):()=>{}),k=u=>(i.logger("onSuccess"),v=!0,T().catch(_),R&&R({isPurgatory:P(M)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{B(),E&&E()}),u),V=u=>{throw i.logger("onFail"),p&&p(),B(),u},L=()=>{i.logger("onFinish"),y&&y()};if(i.logger("onBeforeProgressCall"),C){const u=N();C(u)}return O().then(k).catch(u=>V(u)).finally(L)};updatePresentation=async({mediaStream:n,isP2P:t,maxBitrate:o,contentHint:r,simulcastEncodings:s,degradationPreference:c,sendEncodings:a,preferredMimeTypesVideoCodecs:l,excludeMimeTypesVideoCodecs:d})=>{const f=D({degradationPreference:c},{preferredMimeTypesVideoCodecs:l,excludeMimeTypesVideoCodecs:d});return i.logger("updatePresentation"),this.sipConnector.updatePresentation(n,{isP2P:t,maxBitrate:o,contentHint:r,sendEncodings:w({mediaStream:n,simulcastEncodings:s,sendEncodings:a}),onAddedTransceiver:f})};startPresentation=async({mediaStream:n,isP2P:t,maxBitrate:o,contentHint:r,simulcastEncodings:s,degradationPreference:c,sendEncodings:a,preferredMimeTypesVideoCodecs:l,excludeMimeTypesVideoCodecs:d,callLimit:f})=>{const g=D({degradationPreference:c},{preferredMimeTypesVideoCodecs:l,excludeMimeTypesVideoCodecs:d});return i.logger("startPresentation"),this.sipConnector.startPresentation(n,{isP2P:t,maxBitrate:o,contentHint:r,callLimit:f,sendEncodings:w({mediaStream:n,simulcastEncodings:s,sendEncodings:a}),onAddedTransceiver:g})};stopShareSipConnector=async({isP2P:n=!1}={})=>(i.logger("stopShareSipConnector"),this.sipConnector.stopPresentation({isP2P:n}).catch(t=>{i.logger(t)}));sendRefusalToTurnOnMic=async()=>{i.logger("sendRefusalToTurnOnMic"),await this.sipConnector.sendRefusalToTurnOnMic().catch(n=>{i.logger("sendRefusalToTurnOnMic: error",n)})};sendRefusalToTurnOnCam=async()=>{i.logger("sendRefusalToTurnOnCam"),await this.sipConnector.sendRefusalToTurnOnCam().catch(n=>{i.logger("sendRefusalToTurnOnCam: error",n)})};sendMediaState=async({isEnabledCam:n,isEnabledMic:t})=>{i.logger("sendMediaState"),await this.sipConnector.sendMediaState({cam:n,mic:t})};replaceMediaStream=async(n,{deleteExisting:t,addMissing:o,forceRenegotiation:r,contentHint:s,simulcastEncodings:c,degradationPreference:a,sendEncodings:l}={})=>{const d=D({degradationPreference:a},{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs});return i.logger("replaceMediaStream"),this.sipConnector.replaceMediaStream(n,{deleteExisting:t,addMissing:o,forceRenegotiation:r,contentHint:s,sendEncodings:w({mediaStream:n,simulcastEncodings:c,sendEncodings:l}),onAddedTransceiver:d})};askPermissionToEnableCam=async()=>{i.logger("askPermissionToEnableCam"),await this.sipConnector.askPermissionToEnableCam()};resolveHandleReadyRemoteStreamsDebounced=({onReadyRemoteStreams:n})=>le.debounce(()=>{const t=this.sipConnector.getRemoteStreams();i.logger("remoteStreams",t),t&&n(t)},200);resolveHandleReadyRemoteStreams=({onReadyRemoteStreams:n})=>({track:t})=>{Ue(t)&&n()};getRemoteStreams=()=>(i.logger("getRemoteStreams"),this.sipConnector.getRemoteStreams());onUseLicense=n=>(i.logger("onUseLicense"),this.sipConnector.on("api:useLicense",n));onMustStopPresentation=n=>(i.logger("onMustStopPresentation"),this.sipConnector.on("api:mustStopPresentation",n));onMoveToSpectators=n=>(i.logger("onMoveToSpectators"),this.sipConnector.on("api:participant:move-request-to-spectators",n));onMoveToParticipants=n=>(i.logger("onMoveToParticipants"),this.sipConnector.on("api:participant:move-request-to-participants",n))}const U=e=>{const{url:n,cause:t}=e;let o=n;return(t===i.ECallCause.BAD_MEDIA_DESCRIPTION||t===i.ECallCause.NOT_FOUND)&&(o=`${e.message.to.uri.user}@${e.message.to.uri.host}`),o};var oe=(e=>(e.CONNECT_SERVER_FAILED="CONNECT_SERVER_FAILED",e.WRONG_USER_OR_PASSWORD="WRONG_USER_OR_PASSWORD",e.BAD_MEDIA_ERROR="BAD_MEDIA_ERROR",e.NOT_FOUND_ERROR="NOT_FOUND_ERROR",e.WS_CONNECTION_FAILED="WS_CONNECTION_FAILED",e.CONNECT_SERVER_FAILED_BY_LINK="CONNECT_SERVER_FAILED_BY_LINK",e))(oe||{});const Le=new Error("Unknown error"),He=(e=Le)=>{const{cause:n,socket:t}=e;let o="CONNECT_SERVER_FAILED";switch(n){case"Forbidden":{o="WRONG_USER_OR_PASSWORD";break}case i.ECallCause.BAD_MEDIA_DESCRIPTION:{o="BAD_MEDIA_ERROR";break}case i.ECallCause.NOT_FOUND:{o="NOT_FOUND_ERROR";break}default:t!==void 0&&t._ws?.readyState===3?o="WS_CONNECTION_FAILED":U(e)!==void 0&&U(e)!==""&&(o="CONNECT_SERVER_FAILED_BY_LINK")}return o},$e=e=>{let n="";try{n=JSON.stringify(e)}catch(t){i.logger("failed to stringify message",t)}return n},qe=new Error("Unknown error"),Je=(e=qe)=>{const{code:n,cause:t,message:o}=e,r=U(e),s={code:"",cause:"",message:""};return typeof o=="object"&&o!==null?s.message=$e(o):o&&(s.message=String(o)),r!==void 0&&r!==""&&(s.link=r),n!==void 0&&n!==""&&(s.code=n),t!==void 0&&t!==""&&(s.cause=t),s},Xe=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:oe,getLinkError:U,getTypeFromError:He,getValuesFromError:Je},Symbol.toStringTag,{value:"Module"})),je=({sessionId:e,remoteAddress:n,isMutedAudio:t,isMutedVideo:o,isRegistered:r,isPresentationCall:s})=>{const c=[],a=t?"0":"1",l=o?"0":"1";return c.push(`X-Vinteo-Mic-State: ${a}`,`X-Vinteo-MainCam-State: ${l}`),(r===!1||r===void 0)&&c.push("X-Vinteo-Purgatory-Call: yes"),e!==void 0&&e!==""&&c.push(`X-Vinteo-Session: ${e}`),s===!0&&c.push("X-Vinteo-Presentation-Call: yes"),n!==void 0&&n!==""&&c.push(`X-Vinteo-Remote: ${n}`),c},We="[@*!|]",Ge="_",Ke=e=>{let n=e;return n=n.replaceAll(new RegExp(We,"g"),Ge),n},Ye=({appName:e,appVersion:n,browserName:t,browserVersion:o})=>{const s=`${Ke(e)} ${n}`;return`ChromeNew - ${t===void 0?s:`${t} ${o}, ${s}`}`},ze=({isUnifiedSdpSemantic:e,appVersion:n,browserName:t,browserVersion:o,appName:r})=>e?Ye({appVersion:n,browserName:t,browserVersion:o,appName:r}):"Chrome",Qe=e=>n=>[...n].map(o=>async()=>e(o)),Ze=async({accumulatedKeys:e,sendKey:n,canRunTask:t})=>{const r=Qe(n)(e);return ue.sequentPromises(r,t)},en=e=>t=>(i.logger("onStartMainCam"),e.on("api:admin-start-main-cam",t)),nn=e=>t=>(i.logger("onStartMic"),e.on("api:admin-start-mic",t)),tn=e=>t=>(i.logger("onStopMainCam"),e.on("api:admin-stop-main-cam",t)),on=e=>t=>(i.logger("onStopMic"),e.on("api:admin-stop-mic",t)),rn=({sipConnector:e})=>{const n=(C,R)=>({isSyncForced:h})=>{if(h===!0){C();return}R()},t=en(e),o=tn(e),r=nn(e),s=on(e);let c,a,l,d;const f=({onStartMainCamForced:C,onStartMainCamNotForced:R,onStopMainCamForced:h,onStopMainCamNotForced:S,onStartMicForced:p,onStartMicNotForced:y,onStopMicForced:E,onStopMicNotForced:T})=>{const b=n(C,R);c=t(b);const A=n(h,S);a=o(A);const O=n(p,y);l=r(O);const N=n(E,T);d=s(N)},g=()=>{c?.(),a?.(),l?.(),d?.()};return{start:C=>{f(C)},stop:()=>{g()}}},sn=Object.freeze(Object.defineProperty({__proto__:null,PURGATORY_CONFERENCE_NUMBER:te,createSyncMediaState:rn,error:Xe,getExtraHeaders:je,getUserAgent:ze,hasPurgatory:P,sendDtmfAccumulated:Ze},Symbol.toStringTag,{value:"Module"}));var re=(e=>(e.VP8="video/VP8",e.VP9="video/VP9",e.H264="video/H264",e.AV1="video/AV1",e.rtx="video/rtx",e.red="video/red",e.flexfec03="video/flexfec-03",e))(re||{});const cn=e=>[...e.keys()].map(n=>e.get(n)),an=(e,n)=>cn(e).find(t=>t?.type===n),se=async e=>e.getStats().then(n=>an(n,"codec")?.mimeType),ln=e=>e.find(n=>n.track?.kind==="video"),un=async(e,n,t)=>{const{isChanged:o,parameters:r}=await q(e,{encodings:[{scaleResolutionDownBy:n.scaleResolutionDownBy,maxBitrate:n.maxBitrate}]});return o&&t&&t(r),{isChanged:o,parameters:r}},ie=de.createStackPromises(),dn=async()=>ie().catch(e=>{i.logger("videoSendingBalancer: error",e)}),gn=async e=>(ie.add(e),dn()),X=async({sender:e,scaleResolutionDownBy:n,maxBitrate:t,onSetParameters:o})=>gn(async()=>un(e,{scaleResolutionDownBy:n,maxBitrate:t},o)),fn=async({sender:e,codec:n},t)=>{const r=Be(n);return X({sender:e,maxBitrate:r,onSetParameters:t,scaleResolutionDownBy:200})},F=async({sender:e,videoTrack:n,codec:t},o)=>{const c=n.getSettings().width,a=c===void 0?we(t):ee(c,t);return X({sender:e,maxBitrate:a,onSetParameters:o,scaleResolutionDownBy:1})},Cn=async({sender:e,videoTrack:n,resolution:t,codec:o},r)=>{const[s,c]=t.split("x"),{maxBitrate:a,scaleResolutionDownBy:l}=ne({videoTrack:n,codec:o,targetSize:{width:Number(s),height:Number(c)}});return X({sender:e,maxBitrate:a,onSetParameters:r,scaleResolutionDownBy:l})},hn=async({mainCam:e,resolutionMainCam:n,sender:t,videoTrack:o,codec:r},s)=>{switch(e){case i.EEventsMainCAM.PAUSE_MAIN_CAM:return fn({sender:t,codec:r},s);case i.EEventsMainCAM.RESUME_MAIN_CAM:return F({sender:t,videoTrack:o,codec:r},s);case i.EEventsMainCAM.MAX_MAIN_CAM_RESOLUTION:return n!==void 0?Cn({sender:t,videoTrack:o,codec:r,resolution:n},s):F({sender:t,videoTrack:o,codec:r},s);case i.EEventsMainCAM.ADMIN_STOP_MAIN_CAM:case i.EEventsMainCAM.ADMIN_START_MAIN_CAM:case void 0:return F({sender:t,videoTrack:o,codec:r},s);default:return F({sender:t,videoTrack:o,codec:r},s)}},j={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}},W=async({mainCam:e,resolutionMainCam:n,connection:t,onSetParameters:o,ignoreForCodec:r})=>{const s=t.getSenders(),c=ln(s);if(!c?.track)return j;const a=await se(c);return Z(a,r)?j:hn({mainCam:e,resolutionMainCam:n,sender:c,codec:a,videoTrack:c.track},o)},Sn=(e,{ignoreForCodec:n,onSetParameters:t}={})=>{const o=async()=>{const{connection:l}=e;if(!l)throw new Error("connection is not exist");return W({connection:l,onSetParameters:t,ignoreForCodec:n})};let r=o;const s=l=>{r=async()=>{const{mainCam:d,resolutionMainCam:f}=l,{connection:g}=e;if(!g)throw new Error("connection is not exist");return W({mainCam:d,resolutionMainCam:f,connection:g,onSetParameters:t,ignoreForCodec:n})},r().catch(_)};return{subscribe:()=>{e.on("api:main-cam-control",s)},unsubscribe:()=>{e.off("api:main-cam-control",s)},balanceByTrack:o,resetMainCamControl(){r=o},async reBalance(){return r()}}};exports.ECallCause=i.ECallCause;exports.EUseLicense=i.EUseLicense;exports.SipConnector=i.SipConnector;exports.disableDebug=i.disableDebug;exports.enableDebug=i.enableDebug;exports.hasCanceledStartPresentationError=i.hasCanceledStartPresentationError;exports.debug=_;exports.EMimeTypesVideoCodecs=re;exports.SipConnectorFacade=Ve;exports.getCodecFromSender=se;exports.hasCanceledCallError=fe;exports.resolveVideoSendingBalancer=Sn;exports.setParametersToSender=q;exports.tools=sn;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("events-constructor");const o=require("./@SipConnector-hpySQIBa.cjs"),j=require("@krivega/cancelable-promise"),de=require("repeated-calls"),ue=require("ts-debounce"),le=require("ua-parser-js"),ge=require("sequent-promises"),he=require("stack-promises"),B=require("debug"),Ce=n=>n instanceof Object&&("originator"in n||"cause"in n),Se=n=>{if(j.isCanceledError(n))return!0;if(!Ce(n))return!1;const{originator:e,cause:t}=n;return typeof t=="string"?t===o.ECallCause.REQUEST_TIMEOUT||t===o.ECallCause.REJECTED||e===o.Originator.LOCAL&&(t===o.ECallCause.CANCELED||t===o.ECallCause.BYE):!1},fe=()=>globalThis.process?.versions?.electron!==void 0,G=()=>{const n=new le.UAParser,{name:e}=n.getBrowser(),t=fe();return{isChrome:e==="Chrome"||t}},F=n=>{const{url:e,cause:t}=n;let r=e;return(t===o.ECallCause.BAD_MEDIA_DESCRIPTION||t===o.ECallCause.NOT_FOUND)&&(r=`${n.message.to.uri.user}@${n.message.to.uri.host}`),r};var K=(n=>(n.CONNECT_SERVER_FAILED="CONNECT_SERVER_FAILED",n.WRONG_USER_OR_PASSWORD="WRONG_USER_OR_PASSWORD",n.BAD_MEDIA_ERROR="BAD_MEDIA_ERROR",n.NOT_FOUND_ERROR="NOT_FOUND_ERROR",n.WS_CONNECTION_FAILED="WS_CONNECTION_FAILED",n.CONNECT_SERVER_FAILED_BY_LINK="CONNECT_SERVER_FAILED_BY_LINK",n))(K||{});const me=new Error("Unknown error"),pe=(n=me)=>{const{cause:e,socket:t}=n;let r="CONNECT_SERVER_FAILED";switch(e){case"Forbidden":{r="WRONG_USER_OR_PASSWORD";break}case o.ECallCause.BAD_MEDIA_DESCRIPTION:{r="BAD_MEDIA_ERROR";break}case o.ECallCause.NOT_FOUND:{r="NOT_FOUND_ERROR";break}default:t!==void 0&&t._ws?.readyState===3?r="WS_CONNECTION_FAILED":F(n)!==void 0&&F(n)!==""&&(r="CONNECT_SERVER_FAILED_BY_LINK")}return r},Re=n=>{let e="";try{e=JSON.stringify(n)}catch(t){o.logger("failed to stringify message",t)}return e},Ee=new Error("Unknown error"),ye=(n=Ee)=>{const{code:e,cause:t,message:r}=n,s=F(n),i={code:"",cause:"",message:""};return typeof r=="object"&&r!==null?i.message=Re(r):r&&(i.message=String(r)),s!==void 0&&s!==""&&(i.link=s),e!==void 0&&e!==""&&(i.code=e),t!==void 0&&t!==""&&(i.cause=t),i},ve=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:K,getLinkError:F,getTypeFromError:pe,getValuesFromError:ye},Symbol.toStringTag,{value:"Module"})),Te=({sessionId:n,remoteAddress:e,isMutedAudio:t,isMutedVideo:r,isRegistered:s,isPresentationCall:i})=>{const c=[],a=t?"0":"1",d=r?"0":"1";return c.push(`X-Vinteo-Mic-State: ${a}`,`X-Vinteo-MainCam-State: ${d}`),(s===!1||s===void 0)&&c.push("X-Vinteo-Purgatory-Call: yes"),n!==void 0&&n!==""&&c.push(`X-Vinteo-Session: ${n}`),i===!0&&c.push("X-Vinteo-Presentation-Call: yes"),e!==void 0&&e!==""&&c.push(`X-Vinteo-Remote: ${e}`),c},Me="[@*!|]",be="_",Be=n=>{let e=n;return e=e.replaceAll(new RegExp(Me,"g"),be),e},Pe=({appName:n,appVersion:e,browserName:t,browserVersion:r})=>{const i=`${Be(n)} ${e}`;return`ChromeNew - ${t===void 0?i:`${t} ${r}, ${i}`}`},Ae=({isUnifiedSdpSemantic:n,appVersion:e,browserName:t,browserVersion:r,appName:s})=>n?Pe({appVersion:e,browserName:t,browserVersion:r,appName:s}):"Chrome",Y="purgatory",I=n=>n===Y,_e=n=>e=>[...e].map(r=>async()=>n(r)),Ne=async({accumulatedKeys:n,sendKey:e,canRunTask:t})=>{const s=_e(e)(n);return ge.sequentPromises(s,t)},Oe=(n,e)=>(n.degradationPreference=e.degradationPreference,n),we=(n,e)=>{n.encodings??=[];for(let t=n.encodings.length;t<e;t+=1)n.encodings.push({});return n},z=n=>(e,t)=>t!==void 0&&e!==t||t===void 0&&e!==n,De=z(),ke=(n,e)=>{if(De(n,e))return n},Fe=(n,e)=>{const t=n.maxBitrate,r=ke(e,t);return r!==void 0&&(n.maxBitrate=r),n},Z=1,Ie=z(Z),xe=(n,e)=>{const t=n===void 0?void 0:Math.max(n,Z);if(t!==void 0&&Ie(t,e))return t},Ue=(n,e)=>{const t=n.scaleResolutionDownBy,r=xe(e,t);return r!==void 0&&(n.scaleResolutionDownBy=r),n},Ve=(n,e)=>{const t=e.encodings?.length??0;return we(n,t),n.encodings.forEach((r,s)=>{const i=(e?.encodings??[])[s],c=i?.maxBitrate,a=i?.scaleResolutionDownBy;Fe(r,c),Ue(r,a)}),n},Le=(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},$=async(n,e)=>{const t=n.getParameters(),r=JSON.parse(JSON.stringify(t));Ve(t,e),Oe(t,e);const s=Le(r,t);return s&&await n.setParameters(t),{parameters:t,isChanged:s}},ee=async(n,e,t)=>{const{isChanged:r,parameters:s}=await $(n,{encodings:[{scaleResolutionDownBy:e.scaleResolutionDownBy,maxBitrate:e.maxBitrate}]});return r&&t&&t(s),{isChanged:r,parameters:s}},He=n=>t=>(o.logger("onStartMainCam"),n.on("api:admin-start-main-cam",t)),qe=n=>t=>(o.logger("onStartMic"),n.on("api:admin-start-mic",t)),$e=n=>t=>(o.logger("onStopMainCam"),n.on("api:admin-stop-main-cam",t)),We=n=>t=>(o.logger("onStopMic"),n.on("api:admin-stop-mic",t)),Qe=({sipConnector:n})=>{const e=(C,f)=>({isSyncForced:m})=>{if(m===!0){C();return}f()},t=He(n),r=$e(n),s=qe(n),i=We(n);let c,a,d,l;const h=({onStartMainCamForced:C,onStartMainCamNotForced:f,onStopMainCamForced:m,onStopMainCamNotForced:p,onStartMicForced:R,onStartMicNotForced:v,onStopMicForced:T,onStopMicNotForced:M})=>{const b=e(C,f);c=t(b);const P=e(m,p);a=r(P);const A=e(R,v);d=s(A);const _=e(T,M);l=i(_)},g=()=>{c?.(),a?.(),d?.(),l?.()};return{start:C=>{h(C)},stop:()=>{g()}}},Je=Object.freeze(Object.defineProperty({__proto__:null,PURGATORY_CONFERENCE_NUMBER:Y,createSyncMediaState:Qe,createUaParser:G,error:ve,getExtraHeaders:Te,getUserAgent:Ae,hasPurgatory:I,prepareMediaStream:o.prepareMediaStream,sendDtmfAccumulated:Ne,setEncodingsToSender:ee,setParametersToSender:$},Symbol.toStringTag,{value:"Module"})),Xe=()=>G().isChrome,je=n=>n.getVideoTracks()[0],Ge=1e6,S=n=>n*Ge,ne=S(.06),te=S(4),Ke=n=>n<=64?ne:n<=128?S(.12):n<=256?S(.25):n<=384?S(.32):n<=426?S(.38):n<=640?S(.5):n<=848?S(.7):n<=1280?S(1):n<=1920?S(2):te,re=(n,e)=>n!==void 0&&e!==void 0&&n.toLowerCase().includes(e.toLowerCase()),Ye="av1",ze=n=>re(n,Ye),Ze=.6,W=(n,e)=>ze(e)?n*Ze:n,en=n=>W(ne,n),nn=n=>W(te,n),q=(n,e)=>{const t=Ke(n);return W(t,e)},L=1,se=({videoTrack:n,targetSize:e})=>{const t=n.getSettings(),r=t.width,s=t.height,i=r===void 0?L:r/e.width,c=s===void 0?L:s/e.height;return Math.max(i,c,L)},tn=n=>[...n.keys()].map(e=>n.get(e)),rn=(n,e)=>tn(n).find(t=>t?.type===e),oe=async n=>n.getStats().then(e=>rn(e,"codec")?.mimeType);class sn{async getCodecFromSender(e){return await oe(e)??""}}class on{stackPromises=he.createStackPromises({noRunIsNotActual:!0});async add(e){return this.stackPromises.add(e),this.run()}stop(){this.stackPromises.stop()}async run(){return this.stackPromises().catch(e=>{o.logger("TaskQueue: error",e)})}}class cn{taskQueue;onSetParameters;constructor(e){this.onSetParameters=e,this.taskQueue=new on}async setEncodingsToSender(e,t){return this.taskQueue.add(async()=>ee(e,t,this.onSetParameters))}stop(){this.taskQueue.stop()}}class an{ignoreForCodec;senderFinder;codecProvider;parametersSetter;resultNoChanged={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}};constructor({senderFinder:e,codecProvider:t,parametersSetter:r},s){this.senderFinder=e,this.codecProvider=t,this.parametersSetter=r,this.ignoreForCodec=s.ignoreForCodec}async balance(e,t){const r=e.getSenders(),s=this.senderFinder.findVideoSender(r);if(!s?.track)return this.resultNoChanged;const i=await this.codecProvider.getCodecFromSender(s);if(re(i,this.ignoreForCodec))return this.resultNoChanged;const{mainCam:c,resolutionMainCam:a}=t??{};return this.processSender({mainCam:c,resolutionMainCam:a},{sender:s,codec:i,videoTrack:s.track})}async processSender(e,t){const{mainCam:r,resolutionMainCam:s}=e;switch(r){case o.EEventsMainCAM.PAUSE_MAIN_CAM:return this.downgradeResolutionSender(t);case o.EEventsMainCAM.RESUME_MAIN_CAM:return this.setBitrateByTrackResolution(t);case o.EEventsMainCAM.MAX_MAIN_CAM_RESOLUTION:return s!==void 0?this.setResolutionSender(s,t):this.setBitrateByTrackResolution(t);case o.EEventsMainCAM.ADMIN_STOP_MAIN_CAM:case o.EEventsMainCAM.ADMIN_START_MAIN_CAM:case void 0:return this.setBitrateByTrackResolution(t);default:return this.setBitrateByTrackResolution(t)}}async downgradeResolutionSender(e){const{sender:t,codec:r}=e,s={scaleResolutionDownBy:200,maxBitrate:en(r)};return this.parametersSetter.setEncodingsToSender(t,s)}async setBitrateByTrackResolution(e){const{sender:t,videoTrack:r,codec:s}=e,c=r.getSettings().width,a=c===void 0?nn(s):q(c,s);return this.parametersSetter.setEncodingsToSender(t,{scaleResolutionDownBy:1,maxBitrate:a})}async setResolutionSender(e,t){const[r,s]=e.split("x"),{sender:i,videoTrack:c,codec:a}=t,d={width:Number(r),height:Number(s)},l=se({videoTrack:c,targetSize:d}),h=q(d.width,a),g={scaleResolutionDownBy:l,maxBitrate:h};return this.parametersSetter.setEncodingsToSender(i,g)}}const dn=n=>n.find(e=>e.track?.kind==="video");class un{findVideoSender(e){return dn(e)}}class ln{sipConnector;currentHandler;constructor(e){this.sipConnector=e}subscribe(e){this.currentHandler=e,this.sipConnector.on("api:main-cam-control",e)}unsubscribe(){this.currentHandler&&(this.sipConnector.off("api:main-cam-control",this.currentHandler),this.currentHandler=void 0)}getConnection(){return this.sipConnector.connection}}class ie{eventHandler;senderBalancer;parametersSetterWithQueue;serverHeaders;constructor(e,{ignoreForCodec:t,onSetParameters:r}={}){this.eventHandler=new ln(e),this.parametersSetterWithQueue=new cn(r),this.senderBalancer=new an({senderFinder:new un,codecProvider:new sn,parametersSetter:this.parametersSetterWithQueue},{ignoreForCodec:t})}subscribe(){this.eventHandler.subscribe(this.handleMainCamControl)}unsubscribe(){this.eventHandler.unsubscribe(),this.parametersSetterWithQueue.stop(),this.reset()}reset(){delete this.serverHeaders}async reBalance(){return this.balanceByTrack()}async balanceByTrack(){const e=this.eventHandler.getConnection();if(!e)throw new Error("connection is not exist");return this.senderBalancer.balance(e,this.serverHeaders)}handleMainCamControl=e=>{this.serverHeaders=e,this.balanceByTrack().catch(B)}}const gn=(n,e={})=>new ie(n,e),hn=({videoTrack:n,targetSize:e,codec:t})=>{const r=se({videoTrack:n,targetSize:e}),s=q(e.width,t);return{scaleResolutionDownBy:r,maxBitrate:s}},O=({mediaStream:n,simulcastEncodings:e,sendEncodings:t})=>{if(e&&e.length>0){const r=t??[],s=je(n);if(s===void 0)throw new Error("No video track");return e.forEach((i,c)=>{const a=r[c]??{};a.active=!0,i.rid!==void 0&&(a.rid=i.rid),i.scalabilityMode!==void 0&&(a.scalabilityMode=i.scalabilityMode);const{maxBitrate:d,scaleResolutionDownBy:l}=hn({videoTrack:s,targetSize:{width:i.width,height:i.height}});a.maxBitrate=d,a.scaleResolutionDownBy=l,r[c]=a}),r}return t},Cn=(n,e)=>n.filter(r=>e.some(s=>s.clockRate===r.clockRate&&s.mimeType===r.mimeType&&s.channels===r.channels&&s.sdpFmtpLine===r.sdpFmtpLine)),Sn=n=>{const e=RTCRtpSender.getCapabilities(n),t=RTCRtpReceiver.getCapabilities(n),r=e===null?[]:e.codecs,s=t===null?[]:t.codecs;return Cn(r,s)},fn=(n,e)=>e===void 0||e.length===0?n:n.sort((t,r)=>{const s=e.indexOf(t.mimeType),i=e.indexOf(r.mimeType),c=s===-1?Number.MAX_VALUE:s,a=i===-1?Number.MAX_VALUE:i;return c-a}),mn=(n,e)=>e===void 0||e.length===0?n:n.filter(t=>!e.includes(t.mimeType)),pn=(n,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:t})=>{if(typeof n.setCodecPreferences=="function"&&n.sender.track?.kind==="video"&&(e!==void 0&&e.length>0||t!==void 0&&t.length>0)){const r=Sn("video"),s=mn(r,t),i=fn(s,e);n.setCodecPreferences(i)}},w=(n,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:t})=>async r=>{try{pn(r,{preferredMimeTypesVideoCodecs:e,excludeMimeTypesVideoCodecs:t}),Object.values(n).filter(i=>i!=null).length>0&&(o.logger("updateTransceiver setParametersToSender",n),await $(r.sender,n))}catch(s){o.logger("updateTransceiver error",s)}},H=n=>{if(!j.isCanceledError(n)&&!de.hasCanceledError(n))throw n;return{isSuccessful:!1}},Rn=({kind:n,readyState:e})=>n==="video"&&e==="live",Q=(n,e,{onEnterPurgatory:t,onEnterConference:r})=>{I(n)?t&&t():r&&r({isSuccessProgressCall:e})},J=(n,e)=>{n(),e&&e()},X=(n,e,t)=>{throw n&&n(),e(),t},En=new Set(["on","once","onceRace","wait","off","sendDTMF","hangUp","declineToIncomingCall","sendChannels","checkTelephony","waitChannels","ping","connection","isConfigured","isRegistered"]);class yn{on;once;onceRace;wait;off;sendDTMF;hangUp;declineToIncomingCall;sendChannels;checkTelephony;waitChannels;ping;connection;isConfigured;isRegistered;sipConnector;preferredMimeTypesVideoCodecs;excludeMimeTypesVideoCodecs;constructor(e,{preferredMimeTypesVideoCodecs:t,excludeMimeTypesVideoCodecs:r}={}){return this.preferredMimeTypesVideoCodecs=t,this.excludeMimeTypesVideoCodecs=r,this.sipConnector=e,new Proxy(this,{get:(s,i,c)=>{if(typeof i=="string"&&En.has(i)&&i in this.sipConnector){const d=Reflect.get(this.sipConnector,i,this.sipConnector);return typeof d=="function"?d.bind(this.sipConnector):d}const a=Reflect.get(s,i,c);return typeof a=="function"?a.bind(s):a}})}connectToServer=async e=>{const{userAgent:t,sipWebSocketServerURL:r,sipServerUrl:s,remoteAddress:i,displayName:c,name:a,password:d,isRegisteredUser:l,isDisconnectOnFail:h}=e;return o.logger("connectToServer",e),this.sipConnector.connect({userAgent:t,sipWebSocketServerURL:r,sipServerUrl:s,remoteAddress:i,displayName:c,password:d,user:a,register:l}).then(g=>(o.logger("connectToServer then"),{ua:g,isSuccessful:!0})).catch(async g=>(o.logger("connectToServer catch: error",g),h===!0?this.sipConnector.disconnect().then(()=>H(g)).catch(()=>H(g)):H(g)))};callToServer=async e=>{const{conference:t,mediaStream:r,extraHeaders:s,iceServers:i,contentHint:c,simulcastEncodings:a,degradationPreference:d,sendEncodings:l,offerToReceiveAudio:h,offerToReceiveVideo:g,directionVideo:D,directionAudio:k,setRemoteStreams:C,onBeforeProgressCall:f,onSuccessProgressCall:m,onEnterPurgatory:p,onEnterConference:R,onFailProgressCall:v,onFinishProgressCall:T,onEndedCall:M}=e,b=this.resolveHandleReadyRemoteStreamsDebounced({onReadyRemoteStreams:C}),P=this.resolveHandleReadyRemoteStreams({onReadyRemoteStreams:()=>{b().catch(B)}}),A=w({degradationPreference:d},{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs});o.logger("callToServer",e);const _=async()=>(o.logger("startCall"),this.sipConnector.call({mediaStream:r,extraHeaders:s,iceServers:i,contentHint:c,offerToReceiveAudio:h,offerToReceiveVideo:g,directionVideo:D,directionAudio:k,sendEncodings:O({mediaStream:r,simulcastEncodings:a,sendEncodings:l}),number:t,onAddedTransceiver:A,ontrack:P}));let E=!1,y;const N=(o.logger("subscribeEnterConference: onEnterConference",R),this.sipConnector.on("api:enterRoom",({room:u})=>{o.logger("enterRoom",{_room:u,isSuccessProgressCall:E}),y=u,(p??R)&&Q(y,E,{onEnterPurgatory:p,onEnterConference:R})})),x=u=>(o.logger("onSuccess"),E=!0,b().catch(B),m&&m({isPurgatory:I(y)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{J(N,M)}),u),U=u=>(o.logger("onFail"),X(v,N,u)),V=()=>{o.logger("onFinish"),T&&T()};return o.logger("onBeforeProgressCall"),f&&f(t),_().then(x).catch(u=>U(u)).finally(V)};disconnectFromServer=async()=>this.sipConnector.disconnect().then(()=>(o.logger("disconnectFromServer: then"),{isSuccessful:!0})).catch(e=>(o.logger("disconnectFromServer: catch",e),{isSuccessful:!1}));answerToIncomingCall=async e=>{const{mediaStream:t,extraHeaders:r,iceServers:s,contentHint:i,simulcastEncodings:c,degradationPreference:a,sendEncodings:d,offerToReceiveAudio:l,offerToReceiveVideo:h,directionVideo:g,directionAudio:D,setRemoteStreams:k,onBeforeProgressCall:C,onSuccessProgressCall:f,onEnterPurgatory:m,onEnterConference:p,onFailProgressCall:R,onFinishProgressCall:v,onEndedCall:T}=e,M=this.resolveHandleReadyRemoteStreamsDebounced({onReadyRemoteStreams:k}),b=this.resolveHandleReadyRemoteStreams({onReadyRemoteStreams:()=>{M().catch(B)}}),P=w({degradationPreference:a},{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs});o.logger("answerToIncomingCall",e);const A=async()=>this.sipConnector.answerToIncomingCall({mediaStream:t,extraHeaders:r,iceServers:s,contentHint:i,offerToReceiveAudio:l,offerToReceiveVideo:h,directionVideo:g,directionAudio:D,sendEncodings:O({mediaStream:t,simulcastEncodings:c,sendEncodings:d}),onAddedTransceiver:P,ontrack:b}),_=()=>{const{remoteCallerData:u}=this.sipConnector;return u.incomingNumber};let E=!1,y;const N=(o.logger("subscribeEnterConference: onEnterConference",p),this.sipConnector.on("api:enterRoom",u=>{o.logger("enterRoom",{_room:u,isSuccessProgressCall:E}),y=u,(m??p)&&Q(y,E,{onEnterPurgatory:m,onEnterConference:p})})),x=u=>(o.logger("onSuccess"),E=!0,M().catch(B),f&&f({isPurgatory:I(y)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{J(N,T)}),u),U=u=>(o.logger("onFail"),X(R,N,u)),V=()=>{o.logger("onFinish"),v&&v()};if(o.logger("onBeforeProgressCall"),C){const u=_();C(u)}return A().then(x).catch(u=>U(u)).finally(V)};updatePresentation=async({mediaStream:e,isP2P:t,maxBitrate:r,contentHint:s,simulcastEncodings:i,degradationPreference:c,sendEncodings:a,preferredMimeTypesVideoCodecs:d,excludeMimeTypesVideoCodecs:l})=>{const h=w({degradationPreference:c},{preferredMimeTypesVideoCodecs:d,excludeMimeTypesVideoCodecs:l});return o.logger("updatePresentation"),this.sipConnector.updatePresentation(e,{isP2P:t,maxBitrate:r,contentHint:s,sendEncodings:O({mediaStream:e,simulcastEncodings:i,sendEncodings:a}),onAddedTransceiver:h})};startPresentation=async({mediaStream:e,isP2P:t,maxBitrate:r,contentHint:s,simulcastEncodings:i,degradationPreference:c,sendEncodings:a,preferredMimeTypesVideoCodecs:d,excludeMimeTypesVideoCodecs:l,callLimit:h})=>{const g=w({degradationPreference:c},{preferredMimeTypesVideoCodecs:d,excludeMimeTypesVideoCodecs:l});return o.logger("startPresentation"),this.sipConnector.startPresentation(e,{isP2P:t,maxBitrate:r,contentHint:s,callLimit:h,sendEncodings:O({mediaStream:e,simulcastEncodings:i,sendEncodings:a}),onAddedTransceiver:g})};stopShareSipConnector=async({isP2P:e=!1}={})=>(o.logger("stopShareSipConnector"),this.sipConnector.stopPresentation({isP2P:e}).catch(t=>{o.logger(t)}));sendRefusalToTurnOnMic=async()=>{o.logger("sendRefusalToTurnOnMic"),await this.sipConnector.sendRefusalToTurnOnMic().catch(e=>{o.logger("sendRefusalToTurnOnMic: error",e)})};sendRefusalToTurnOnCam=async()=>{o.logger("sendRefusalToTurnOnCam"),await this.sipConnector.sendRefusalToTurnOnCam().catch(e=>{o.logger("sendRefusalToTurnOnCam: error",e)})};sendMediaState=async({isEnabledCam:e,isEnabledMic:t})=>{o.logger("sendMediaState"),await this.sipConnector.sendMediaState({cam:e,mic:t})};replaceMediaStream=async(e,{deleteExisting:t,addMissing:r,forceRenegotiation:s,contentHint:i,simulcastEncodings:c,degradationPreference:a,sendEncodings:d})=>{const l=w({degradationPreference:a},{preferredMimeTypesVideoCodecs:this.preferredMimeTypesVideoCodecs,excludeMimeTypesVideoCodecs:this.excludeMimeTypesVideoCodecs});return o.logger("replaceMediaStream"),this.sipConnector.replaceMediaStream(e,{deleteExisting:t,addMissing:r,forceRenegotiation:s,contentHint:i,sendEncodings:O({mediaStream:e,simulcastEncodings:c,sendEncodings:d}),onAddedTransceiver:l})};askPermissionToEnableCam=async()=>{o.logger("askPermissionToEnableCam"),await this.sipConnector.askPermissionToEnableCam()};resolveHandleReadyRemoteStreamsDebounced=({onReadyRemoteStreams:e})=>ue.debounce(()=>{const t=this.sipConnector.getRemoteStreams();o.logger("remoteStreams",t),t&&e(t)},200);resolveHandleReadyRemoteStreams=({onReadyRemoteStreams:e})=>({track:t})=>{Rn(t)&&e()};getRemoteStreams=()=>(o.logger("getRemoteStreams"),this.sipConnector.getRemoteStreams());onUseLicense=e=>(o.logger("onUseLicense"),this.sipConnector.on("api:useLicense",e));onMustStopPresentation=e=>(o.logger("onMustStopPresentation"),this.sipConnector.on("api:mustStopPresentation",e));onMoveToSpectators=e=>(o.logger("onMoveToSpectators"),this.sipConnector.on("api:participant:move-request-to-spectators",e));onMoveToParticipants=e=>(o.logger("onMoveToParticipants"),this.sipConnector.on("api:participant:move-request-to-participants",e));onStats=e=>(o.logger("onStats"),this.sipConnector.on("stats:collected",e));offStats=e=>{o.logger("offStats"),this.sipConnector.off("stats:collected",e)}}var ce=(n=>(n.VP8="video/VP8",n.VP9="video/VP9",n.H264="video/H264",n.AV1="video/AV1",n.rtx="video/rtx",n.red="video/red",n.flexfec03="video/flexfec-03",n))(ce||{});exports.ECallCause=o.ECallCause;exports.EStatsTypes=o.EStatsTypes;exports.EUseLicense=o.EUseLicense;exports.SipConnector=o.SipConnector;exports.StatsPeerConnection=o.StatsPeerConnection;exports.disableDebug=o.disableDebug;exports.enableDebug=o.enableDebug;exports.hasCanceledStartPresentationError=o.hasCanceledStartPresentationError;exports.debug=B;exports.EMimeTypesVideoCodecs=ce;exports.SipConnectorFacade=yn;exports.VideoSendingBalancer=ie;exports.getCodecFromSender=oe;exports.hasAvailableStats=Xe;exports.hasCanceledCallError=Se;exports.resolveVideoSendingBalancer=gn;exports.tools=Je;
package/dist/index.d.ts CHANGED
@@ -4,11 +4,11 @@ export type { TCustomError } from './CallManager';
4
4
  export { debug, disableDebug, enableDebug } from './logger';
5
5
  export { hasCanceledStartPresentationError } from './PresentationManager';
6
6
  export type { TContentHint } from './PresentationManager';
7
- export { default as setParametersToSender } from './setParametersToSender';
8
7
  export { SipConnector } from './SipConnector';
9
8
  export { SipConnectorFacade } from './SipConnectorFacade';
9
+ export { EStatsTypes, hasAvailableStats, StatsPeerConnection } from './StatsPeerConnection';
10
10
  export * as tools from './tools';
11
11
  export { EMimeTypesVideoCodecs } from './types';
12
12
  export type { TJsSIP } from './types';
13
13
  export { default as getCodecFromSender } from './utils/getCodecFromSender';
14
- export { default as resolveVideoSendingBalancer } from './videoSendingBalancer';
14
+ export { resolveVideoSendingBalancer, VideoSendingBalancer } from './VideoSendingBalancer';