sip-connector 9.0.0 → 9.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.
@@ -93,18 +93,24 @@ type TParametersCheckTelephony = {
93
93
  sipServerUrl: string;
94
94
  sipWebSocketServerURL: string;
95
95
  userAgent?: string;
96
+ remoteAddress?: string;
97
+ extraHeaders?: string[];
98
+ };
99
+ type TParametersCreateUa = UAConfigurationParams & {
100
+ remoteAddress?: string;
101
+ extraHeaders?: string[];
96
102
  };
97
103
  type TConnect = (parameters: TParametersConnection, options?: {
98
104
  callLimit?: number;
99
105
  }) => Promise<UA>;
100
106
  type TInitUa = (parameters: TParametersConnection) => Promise<UA>;
101
- type TCreateUa = (parameters: UAConfigurationParams) => UA;
107
+ type TCreateUa = (parameters: TParametersCreateUa) => UA;
102
108
  type TStart = () => Promise<UA>;
103
109
  type TSet = ({ displayName, password, }: {
104
110
  displayName?: string;
105
111
  password?: string;
106
112
  }) => Promise<boolean>;
107
- type TCall = ({ number, mediaStream, extraHeaders, ontrack, iceServers, videoMode, audioMode, offerToReceiveAudio, offerToReceiveVideo, degradationPreference, }: {
113
+ type TCall = ({ number, mediaStream, extraHeaders, ontrack, iceServers, videoMode, audioMode, offerToReceiveAudio, offerToReceiveVideo, degradationPreference, contentHint, }: {
108
114
  number: string;
109
115
  mediaStream: MediaStream;
110
116
  extraHeaders?: TOptionsExtraHeaders['extraHeaders'];
@@ -115,6 +121,7 @@ type TCall = ({ number, mediaStream, extraHeaders, ontrack, iceServers, videoMod
115
121
  offerToReceiveAudio?: boolean;
116
122
  offerToReceiveVideo?: boolean;
117
123
  degradationPreference?: TDegradationPreference;
124
+ contentHint?: TContentHint;
118
125
  }) => Promise<RTCPeerConnection>;
119
126
  type TDisconnect = () => Promise<void>;
120
127
  type TParametersAnswerToIncomingCall = {
@@ -125,6 +132,7 @@ type TParametersAnswerToIncomingCall = {
125
132
  videoMode?: 'recvonly' | 'sendonly' | 'sendrecv';
126
133
  audioMode?: 'recvonly' | 'sendonly' | 'sendrecv';
127
134
  degradationPreference?: TDegradationPreference;
135
+ contentHint?: TContentHint;
128
136
  };
129
137
  type TAnswerToIncomingCall = (parameters: TParametersAnswerToIncomingCall) => Promise<RTCPeerConnection>;
130
138
  type TSendDTMF = (tone: number | string) => Promise<void>;
@@ -169,11 +177,12 @@ export default class SipConnector {
169
177
  tryRegister: () => Promise<RegisteredEvent>;
170
178
  sendOptions(target: URI | string, body?: string, extraHeaders?: string[]): Promise<void>;
171
179
  ping(body?: string, extraHeaders?: string[]): Promise<void>;
172
- checkTelephony({ userAgent, displayName, sipServerUrl, sipWebSocketServerURL, }: TParametersCheckTelephony): Promise<void>;
180
+ checkTelephony({ userAgent, displayName, sipServerUrl, sipWebSocketServerURL, remoteAddress, extraHeaders, }: TParametersCheckTelephony): Promise<void>;
173
181
  replaceMediaStream(mediaStream: MediaStream, options?: {
174
182
  deleteExisting: boolean;
175
183
  addMissing: boolean;
176
184
  forceRenegotiation: boolean;
185
+ contentHint?: TContentHint;
177
186
  degradationPreference?: TDegradationPreference;
178
187
  }): Promise<void>;
179
188
  declineToIncomingCall: ({ statusCode }?: {
package/dist/doMock.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var b=Object.defineProperty;var k=(o,t,e)=>t in o?b(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var r=(o,t,e)=>k(o,typeof t!="symbol"?t+"":t,e);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g=require("./SipConnector-BCc5pokv.cjs"),D=require("@krivega/jssip/lib/NameAddrHeader"),L=require("@krivega/jssip/lib/URI"),F=require("node:events"),V=require("@krivega/jssip/lib/SIPMessage"),C=require("webrtc-mock"),I=require("events-constructor"),T=require("@krivega/jssip");class y extends V.IncomingRequest{constructor(e){super();r(this,"headers");this.headers=new Headers(e)}getHeader(e){return this.headers.get(e)||""}}class z{constructor({originator:t="local",eventHandlers:e}){r(this,"originator");r(this,"_connection");r(this,"_events");r(this,"_remote_identity");r(this,"_mutedOptions",{audio:!1,video:!1});this.originator=t,this._events=new I(g.SESSION_EVENT_NAMES),this.initEvents(e)}get C(){throw new Error("Method not implemented.")}get causes(){throw new Error("Method not implemented.")}get id(){throw new Error("Method not implemented.")}set data(t){throw new Error("Method not implemented.")}get data(){throw new Error("Method not implemented.")}get connection(){return this._connection}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 remote_identity(){return this._remote_identity}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.")}isInProgress(){throw new Error("Method not implemented.")}isEnded(){throw new Error("Method not implemented.")}isReadyToReOffer(){throw new Error("Method not implemented.")}answer(t){throw new Error("Method not implemented.")}terminate(t){throw new Error("Method not implemented.")}async sendInfo(t,e,n){throw new Error("Method not implemented.")}hold(t,e){throw new Error("Method not implemented.")}unhold(t,e){throw new Error("Method not implemented.")}async renegotiate(t,e){throw new Error("Method not implemented.")}isOnHold(){throw new Error("Method not implemented.")}mute(t){throw new Error("Method not implemented.")}unmute(t){throw new Error("Method not implemented.")}isMuted(){throw new Error("Method not implemented.")}refer(t,e){throw new Error("Method not implemented.")}resetLocalMedia(){throw new Error("Method not implemented.")}async replaceMediaStream(t,e){throw new Error("Method not implemented.")}addListener(t,e){throw new Error("Method not implemented.")}once(t,e){throw new Error("Method not implemented.")}removeListener(t,e){throw new Error("Method not implemented.")}off(t,e){throw new Error("Method not implemented.")}removeAllListeners(t){throw new Error("Method not implemented.")}setMaxListeners(t){throw new Error("Method not implemented.")}getMaxListeners(){throw new Error("Method not implemented.")}listeners(t){throw new Error("Method not implemented.")}rawListeners(t){throw new Error("Method not implemented.")}emit(t,...e){throw new Error("Method not implemented.")}listenerCount(t){throw new Error("Method not implemented.")}prependListener(t,e){throw new Error("Method not implemented.")}prependOnceListener(t,e){throw new Error("Method not implemented.")}eventNames(){throw new Error("Method not implemented.")}initEvents(t=[]){Object.entries(t).forEach(([e,n])=>this.on(e,n))}on(t,e){return this._events.on(t,e),this}trigger(t,e){this._events.trigger(t,e)}sendDTMF(){this.trigger("newDTMF",{originator:this.originator})}async startPresentation(t){return t}async updatePresentation(t){return t}async stopPresentation(t){return t}isEstablished(){return!0}}class U{constructor(t,e){r(this,"_senders",[]);r(this,"_receivers",[]);r(this,"canTrickleIceCandidates");r(this,"connectionState");r(this,"currentLocalDescription");r(this,"currentRemoteDescription");r(this,"iceConnectionState");r(this,"iceGatheringState");r(this,"idpErrorInfo");r(this,"idpLoginUrl");r(this,"localDescription");r(this,"onconnectionstatechange");r(this,"ondatachannel");r(this,"onicecandidate");r(this,"onicecandidateerror",null);r(this,"oniceconnectionstatechange");r(this,"onicegatheringstatechange");r(this,"onnegotiationneeded");r(this,"onsignalingstatechange");r(this,"ontrack");r(this,"peerIdentity");r(this,"pendingLocalDescription");r(this,"pendingRemoteDescription");r(this,"remoteDescription");r(this,"sctp",null);r(this,"signalingState");r(this,"getReceivers",()=>this._receivers);r(this,"getSenders",()=>this._senders);r(this,"addTrack",t=>{const e={track:t};return this._senders.push(e),e});this._receivers=e.map(n=>({track:n}))}getRemoteStreams(){throw new Error("Method not implemented.")}async addIceCandidate(t){throw new Error("Method not implemented.")}addTransceiver(t,e){throw new Error("Method not implemented.")}close(){throw new Error("Method not implemented.")}restartIce(){throw new Error("Method not implemented.")}async createAnswer(t,e){throw new Error("Method not implemented.")}createDataChannel(t,e){throw new Error("Method not implemented.")}async createOffer(t,e,n){throw new Error("Method not implemented.")}getConfiguration(){throw new Error("Method not implemented.")}async getIdentityAssertion(){throw new Error("Method not implemented.")}async getStats(t){throw new Error("Method not implemented.")}getTransceivers(){throw new Error("Method not implemented.")}removeTrack(t){throw new Error("Method not implemented.")}setConfiguration(t){throw new Error("Method not implemented.")}async setLocalDescription(t){throw new Error("Method not implemented.")}async setRemoteDescription(t){throw new Error("Method not implemented.")}addEventListener(t,e,n){throw new Error("Method not implemented.")}removeEventListener(t,e,n){throw new Error("Method not implemented.")}dispatchEvent(t){throw new Error("Method not implemented.")}}function q(o){const t=o.match(/(purgatory)|[\d.]+/g);if(!t)throw new Error("wrong sip url");return t[0]}const w=400,N="777",x=o=>o.getVideoTracks().length>0,a=class a extends z{constructor({url:e="",mediaStream:n,eventHandlers:i,originator:d}){super({originator:d,eventHandlers:i});r(this,"url");r(this,"status_code");r(this,"_isEnded",!1);r(this,"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)},w)}));this.url=e,this.initPeerconnection(n)}static setStartPresentationError(e,{count:n=Number.POSITIVE_INFINITY}={}){this.startPresentationError=e,this.countStartPresentationError=n}static resetStartPresentationError(){this.startPresentationError=void 0,this.countStartPresentationError=Number.POSITIVE_INFINITY,this.countStartsPresentation=0}async startPresentation(e){if(a.countStartsPresentation+=1,a.startPresentationError&&a.countStartsPresentation<a.countStartPresentationError)throw a.startPresentationError;return super.startPresentation(e)}initPeerconnection(e){return e?(this.createPeerconnection(e),!0):!1}createPeerconnection(e){const n=C.createAudioMediaStreamTrackMock();n.id="mainaudio1";const i=[n];if(x(e)){const u=C.createVideoMediaStreamTrackMock();u.id="mainvideo1",i.push(u)}this._connection=new U(void 0,i),this._addStream(e),setTimeout(()=>{this.trigger("peerconnection",{peerconnection:this.connection})},w)}connect(e){const n=q(e);setTimeout(()=>{this.url.includes(N)?this.trigger("failed",{originator:"remote",message:"IncomingResponse",cause:g.REJECTED}):(this.trigger("connecting"),setTimeout(()=>{this.trigger("enterRoom",{room:n})},100),setTimeout(()=>{this.trigger("accepted")},200),setTimeout(()=>{this.trigger("confirmed")},300))},w)}terminate({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e}),this._isEnded=!1,this}async terminateAsync({status_code:e}={}){this.terminate({status_code:e})}terminateRemote({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e,originator:"remote"}),this}_addStream(e,n="getTracks"){e[n]().forEach(i=>this.connection.addTrack(i))}_forEachSenders(e){const n=this.connection.getSenders();for(const i of n)e(i);return n}_toggleMuteAudio(e){this._forEachSenders(({track:n})=>{n&&n.kind==="audio"&&(n.enabled=!e)})}_toggleMuteVideo(e){this._forEachSenders(({track:n})=>{n&&n.kind==="video"&&(n.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}async replaceMediaStream(e){return e}_onmute({audio:e,video:n}){this.trigger("muted",{audio:e,video:n})}async sendInfo(){}isEnded(){return this._isEnded}newInfo(e){this.trigger("newInfo",e)}};r(a,"startPresentationError"),r(a,"countStartPresentationError",Number.POSITIVE_INFINITY),r(a,"countStartsPresentation",0);let l=a;class H{constructor(){r(this,"extraHeaders")}setExtraHeaders(t){this.extraHeaders=t}setExtraContactParams(){}}const c="PASSWORD_CORRECT",f="PASSWORD_CORRECT_2",P="NAME_INCORRECT",m=400,s=class s{constructor(t){r(this,"_events");r(this,"_startedTimeout");r(this,"_stopedTimeout");r(this,"session");r(this,"_isRegistered");r(this,"_isConnected");r(this,"configuration");r(this,"_registrator");r(this,"call",jest.fn((t,e)=>{const{mediaStream:n,eventHandlers:i}=e;return this.session=new l({url:t,mediaStream:n,eventHandlers:i,originator:"local"}),this.session.connect(t),this.session}));this._events=new I(g.UA_EVENT_NAMES);const[e,n]=t.uri.split(":"),[i,d]=n.split("@"),u={...t,uri:new T.URI(e,i,d)};this.configuration=u,this._registrator=new H}static setStartError(t,{count:e=Number.POSITIVE_INFINITY}={}){this.startError=t,this.countStartError=e}static resetStartError(){this.startError=void 0,this.countStartError=Number.POSITIVE_INFINITY,this.countStarts=0}static setAvailableTelephony(){this.isAvailableTelephony=!0}static setNotAvailableTelephony(){this.isAvailableTelephony=!1}isConnected(){return!!this._isConnected}start(){if(s.countStarts+=1,s.startError&&s.countStarts<s.countStartError){this.trigger("disconnected",s.startError);return}this.register()}stop(){this._startedTimeout&&clearTimeout(this._startedTimeout),this._stopedTimeout&&clearTimeout(this._stopedTimeout),this.unregister(),this.isStarted()?this._stopedTimeout=setTimeout(()=>{this.trigger("disconnected",{error:new Error("stoped")})},m):this.trigger("disconnected",{error:new Error("stoped")})}on(t,e){return this._events.on(t,e),this}once(t,e){return this._events.once(t,e),this}off(t,e){return this._events.off(t,e),this}removeAllListeners(){return this._events.removeEventHandlers(),this}trigger(t,e){this._events.trigger(t,e)}terminateSessions(){this.session.terminate()}set(t,e){return this.configuration[t]=e,!0}register(){this._startedTimeout&&clearTimeout(this._startedTimeout);const{password:t,register:e,uri:n}=this.configuration;e&&n.user.includes(P)?(this._isRegistered=!1,this._isConnected=!1,this._startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:null,cause:"Request Timeout"})},m)):!this._isRegistered&&e&&(t===c||t===f)?(this._isRegistered=!0,this._startedTimeout=setTimeout(()=>{this.trigger("registered")},m)):e&&t!==c&&t!==f&&(this._isRegistered=!1,this._isConnected=!1,this._startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:null,cause:"Wrong credentials"})},m)),s.isAvailableTelephony?(this.trigger("connected"),this._isConnected=!0):this.stop()}unregister(){this._isRegistered=!1,this._isConnected=!1,this.trigger("unregistered")}isRegistered(){return!!this._isRegistered}isStarted(){return this.configuration&&(this.configuration.register&&!!this._isRegistered||!this.configuration.register&&!!this._isConnected)}registrator(){return this._registrator}newSipEvent(t){this.trigger("sipEvent",t)}};r(s,"isAvailableTelephony",!0),r(s,"startError"),r(s,"countStartError",Number.POSITIVE_INFINITY),r(s,"countStarts",0);let M=s;class Y{constructor(t){r(this,"url");this.url=t}}class j extends F.EventEmitter{constructor(e,n){super();r(this,"contentType");r(this,"body");this.contentType=e,this.body=n}}const S="remote",B=(o,t)=>{const e=new y(t),n={originator:S,request:e,info:new j("","")};o.newInfo(n)},K=(o,t)=>{const n={request:new y(t)};o.newSipEvent(n)},$=(o,{incomingNumber:t="1234",displayName:e,host:n})=>{const i=new l({originator:S}),d=new L("sip",t,n);i._remote_identity=new D(d,e),o.trigger("newRTCSession",{originator:S,session:i})},J=(o,t)=>{t?o.trigger("failed",t):o.trigger("failed",o)},A={triggerNewInfo:B,triggerNewSipEvent:K,triggerIncomingSession:$,triggerFailIncomingSession:J,WebSocketInterface:Y,UA:M,C:{INVITE:"INVITE"}},_="user",h="displayName",E="SIP_SERVER_URL",R="SIP_WEB_SOCKET_SERVER_URL",G=new A.WebSocketInterface(R),v={userAgent:"Chrome",sipServerUrl:E,sipWebSocketServerURL:R},X={...v},O={...v,user:_,password:c,register:!0},Q={...O,displayName:h},Z={...v,displayName:h,register:!1},p={session_timers:!1,sockets:[G],user_agent:"Chrome",sdp_semantics:"unified-plan",register_expires:300,connection_recovery_max_interval:6,connection_recovery_min_interval:2},ee={...p,password:c,uri:new T.URI("sip",_,E),display_name:"",register:!0},te={...p,password:c,uri:new T.URI("sip",_,E),display_name:h,register:!0},re={...p,display_name:h,register:!1},ne={...p,display_name:"",register:!1},W="10.10.10.10",oe=[`X-Vinteo-Remote: ${W}`],ie=()=>new g.SipConnector({JsSIP:A});exports.FAILED_CONFERENCE_NUMBER=N;exports.NAME_INCORRECT=P;exports.PASSWORD_CORRECT=c;exports.PASSWORD_CORRECT_2=f;exports.SIP_SERVER_URL=E;exports.SIP_WEB_SOCKET_SERVER_URL=R;exports.dataForConnectionWithAuthorization=O;exports.dataForConnectionWithAuthorizationWithDisplayName=Q;exports.dataForConnectionWithoutAuthorization=Z;exports.dataForConnectionWithoutAuthorizationWithoutDisplayName=X;exports.default=ie;exports.displayName=h;exports.extraHeadersRemoteAddress=oe;exports.remoteAddress=W;exports.uaConfigurationWithAuthorization=ee;exports.uaConfigurationWithAuthorizationWithDisplayName=te;exports.uaConfigurationWithoutAuthorization=re;exports.uaConfigurationWithoutAuthorizationWithoutDisplayName=ne;exports.user=_;
1
+ "use strict";var b=Object.defineProperty;var k=(o,t,e)=>t in o?b(o,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):o[t]=e;var r=(o,t,e)=>k(o,typeof t!="symbol"?t+"":t,e);Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const g=require("./SipConnector-lgvJyyG7.cjs"),D=require("@krivega/jssip/lib/NameAddrHeader"),L=require("@krivega/jssip/lib/URI"),F=require("node:events"),V=require("@krivega/jssip/lib/SIPMessage"),C=require("webrtc-mock"),I=require("events-constructor"),T=require("@krivega/jssip");class y extends V.IncomingRequest{constructor(e){super();r(this,"headers");this.headers=new Headers(e)}getHeader(e){return this.headers.get(e)||""}}class z{constructor({originator:t="local",eventHandlers:e}){r(this,"originator");r(this,"_connection");r(this,"_events");r(this,"_remote_identity");r(this,"_mutedOptions",{audio:!1,video:!1});this.originator=t,this._events=new I(g.SESSION_EVENT_NAMES),this.initEvents(e)}get C(){throw new Error("Method not implemented.")}get causes(){throw new Error("Method not implemented.")}get id(){throw new Error("Method not implemented.")}set data(t){throw new Error("Method not implemented.")}get data(){throw new Error("Method not implemented.")}get connection(){return this._connection}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 remote_identity(){return this._remote_identity}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.")}isInProgress(){throw new Error("Method not implemented.")}isEnded(){throw new Error("Method not implemented.")}isReadyToReOffer(){throw new Error("Method not implemented.")}answer(t){throw new Error("Method not implemented.")}terminate(t){throw new Error("Method not implemented.")}async sendInfo(t,e,n){throw new Error("Method not implemented.")}hold(t,e){throw new Error("Method not implemented.")}unhold(t,e){throw new Error("Method not implemented.")}async renegotiate(t,e){throw new Error("Method not implemented.")}isOnHold(){throw new Error("Method not implemented.")}mute(t){throw new Error("Method not implemented.")}unmute(t){throw new Error("Method not implemented.")}isMuted(){throw new Error("Method not implemented.")}refer(t,e){throw new Error("Method not implemented.")}resetLocalMedia(){throw new Error("Method not implemented.")}async replaceMediaStream(t,e){throw new Error("Method not implemented.")}addListener(t,e){throw new Error("Method not implemented.")}once(t,e){throw new Error("Method not implemented.")}removeListener(t,e){throw new Error("Method not implemented.")}off(t,e){throw new Error("Method not implemented.")}removeAllListeners(t){throw new Error("Method not implemented.")}setMaxListeners(t){throw new Error("Method not implemented.")}getMaxListeners(){throw new Error("Method not implemented.")}listeners(t){throw new Error("Method not implemented.")}rawListeners(t){throw new Error("Method not implemented.")}emit(t,...e){throw new Error("Method not implemented.")}listenerCount(t){throw new Error("Method not implemented.")}prependListener(t,e){throw new Error("Method not implemented.")}prependOnceListener(t,e){throw new Error("Method not implemented.")}eventNames(){throw new Error("Method not implemented.")}initEvents(t=[]){Object.entries(t).forEach(([e,n])=>this.on(e,n))}on(t,e){return this._events.on(t,e),this}trigger(t,e){this._events.trigger(t,e)}sendDTMF(){this.trigger("newDTMF",{originator:this.originator})}async startPresentation(t){return t}async updatePresentation(t){return t}async stopPresentation(t){return t}isEstablished(){return!0}}class U{constructor(t,e){r(this,"_senders",[]);r(this,"_receivers",[]);r(this,"canTrickleIceCandidates");r(this,"connectionState");r(this,"currentLocalDescription");r(this,"currentRemoteDescription");r(this,"iceConnectionState");r(this,"iceGatheringState");r(this,"idpErrorInfo");r(this,"idpLoginUrl");r(this,"localDescription");r(this,"onconnectionstatechange");r(this,"ondatachannel");r(this,"onicecandidate");r(this,"onicecandidateerror",null);r(this,"oniceconnectionstatechange");r(this,"onicegatheringstatechange");r(this,"onnegotiationneeded");r(this,"onsignalingstatechange");r(this,"ontrack");r(this,"peerIdentity");r(this,"pendingLocalDescription");r(this,"pendingRemoteDescription");r(this,"remoteDescription");r(this,"sctp",null);r(this,"signalingState");r(this,"getReceivers",()=>this._receivers);r(this,"getSenders",()=>this._senders);r(this,"addTrack",t=>{const e={track:t};return this._senders.push(e),e});this._receivers=e.map(n=>({track:n}))}getRemoteStreams(){throw new Error("Method not implemented.")}async addIceCandidate(t){throw new Error("Method not implemented.")}addTransceiver(t,e){throw new Error("Method not implemented.")}close(){throw new Error("Method not implemented.")}restartIce(){throw new Error("Method not implemented.")}async createAnswer(t,e){throw new Error("Method not implemented.")}createDataChannel(t,e){throw new Error("Method not implemented.")}async createOffer(t,e,n){throw new Error("Method not implemented.")}getConfiguration(){throw new Error("Method not implemented.")}async getIdentityAssertion(){throw new Error("Method not implemented.")}async getStats(t){throw new Error("Method not implemented.")}getTransceivers(){throw new Error("Method not implemented.")}removeTrack(t){throw new Error("Method not implemented.")}setConfiguration(t){throw new Error("Method not implemented.")}async setLocalDescription(t){throw new Error("Method not implemented.")}async setRemoteDescription(t){throw new Error("Method not implemented.")}addEventListener(t,e,n){throw new Error("Method not implemented.")}removeEventListener(t,e,n){throw new Error("Method not implemented.")}dispatchEvent(t){throw new Error("Method not implemented.")}}function q(o){const t=o.match(/(purgatory)|[\d.]+/g);if(!t)throw new Error("wrong sip url");return t[0]}const w=400,N="777",x=o=>o.getVideoTracks().length>0,a=class a extends z{constructor({url:e="",mediaStream:n,eventHandlers:i,originator:d}){super({originator:d,eventHandlers:i});r(this,"url");r(this,"status_code");r(this,"_isEnded",!1);r(this,"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)},w)}));this.url=e,this.initPeerconnection(n)}static setStartPresentationError(e,{count:n=Number.POSITIVE_INFINITY}={}){this.startPresentationError=e,this.countStartPresentationError=n}static resetStartPresentationError(){this.startPresentationError=void 0,this.countStartPresentationError=Number.POSITIVE_INFINITY,this.countStartsPresentation=0}async startPresentation(e){if(a.countStartsPresentation+=1,a.startPresentationError&&a.countStartsPresentation<a.countStartPresentationError)throw a.startPresentationError;return super.startPresentation(e)}initPeerconnection(e){return e?(this.createPeerconnection(e),!0):!1}createPeerconnection(e){const n=C.createAudioMediaStreamTrackMock();n.id="mainaudio1";const i=[n];if(x(e)){const u=C.createVideoMediaStreamTrackMock();u.id="mainvideo1",i.push(u)}this._connection=new U(void 0,i),this._addStream(e),setTimeout(()=>{this.trigger("peerconnection",{peerconnection:this.connection})},w)}connect(e){const n=q(e);setTimeout(()=>{this.url.includes(N)?this.trigger("failed",{originator:"remote",message:"IncomingResponse",cause:g.REJECTED}):(this.trigger("connecting"),setTimeout(()=>{this.trigger("enterRoom",{room:n})},100),setTimeout(()=>{this.trigger("accepted")},200),setTimeout(()=>{this.trigger("confirmed")},300))},w)}terminate({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e}),this._isEnded=!1,this}async terminateAsync({status_code:e}={}){this.terminate({status_code:e})}terminateRemote({status_code:e}={}){return this.status_code=e,this.trigger("ended",{status_code:e,originator:"remote"}),this}_addStream(e,n="getTracks"){e[n]().forEach(i=>this.connection.addTrack(i))}_forEachSenders(e){const n=this.connection.getSenders();for(const i of n)e(i);return n}_toggleMuteAudio(e){this._forEachSenders(({track:n})=>{n&&n.kind==="audio"&&(n.enabled=!e)})}_toggleMuteVideo(e){this._forEachSenders(({track:n})=>{n&&n.kind==="video"&&(n.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}async replaceMediaStream(e){return e}_onmute({audio:e,video:n}){this.trigger("muted",{audio:e,video:n})}async sendInfo(){}isEnded(){return this._isEnded}newInfo(e){this.trigger("newInfo",e)}};r(a,"startPresentationError"),r(a,"countStartPresentationError",Number.POSITIVE_INFINITY),r(a,"countStartsPresentation",0);let l=a;class H{constructor(){r(this,"extraHeaders")}setExtraHeaders(t){this.extraHeaders=t}setExtraContactParams(){}}const c="PASSWORD_CORRECT",f="PASSWORD_CORRECT_2",P="NAME_INCORRECT",m=400,s=class s{constructor(t){r(this,"_events");r(this,"_startedTimeout");r(this,"_stopedTimeout");r(this,"session");r(this,"_isRegistered");r(this,"_isConnected");r(this,"configuration");r(this,"_registrator");r(this,"call",jest.fn((t,e)=>{const{mediaStream:n,eventHandlers:i}=e;return this.session=new l({url:t,mediaStream:n,eventHandlers:i,originator:"local"}),this.session.connect(t),this.session}));this._events=new I(g.UA_EVENT_NAMES);const[e,n]=t.uri.split(":"),[i,d]=n.split("@"),u={...t,uri:new T.URI(e,i,d)};this.configuration=u,this._registrator=new H}static setStartError(t,{count:e=Number.POSITIVE_INFINITY}={}){this.startError=t,this.countStartError=e}static resetStartError(){this.startError=void 0,this.countStartError=Number.POSITIVE_INFINITY,this.countStarts=0}static setAvailableTelephony(){this.isAvailableTelephony=!0}static setNotAvailableTelephony(){this.isAvailableTelephony=!1}isConnected(){return!!this._isConnected}start(){if(s.countStarts+=1,s.startError&&s.countStarts<s.countStartError){this.trigger("disconnected",s.startError);return}this.register()}stop(){this._startedTimeout&&clearTimeout(this._startedTimeout),this._stopedTimeout&&clearTimeout(this._stopedTimeout),this.unregister(),this.isStarted()?this._stopedTimeout=setTimeout(()=>{this.trigger("disconnected",{error:new Error("stoped")})},m):this.trigger("disconnected",{error:new Error("stoped")})}on(t,e){return this._events.on(t,e),this}once(t,e){return this._events.once(t,e),this}off(t,e){return this._events.off(t,e),this}removeAllListeners(){return this._events.removeEventHandlers(),this}trigger(t,e){this._events.trigger(t,e)}terminateSessions(){this.session.terminate()}set(t,e){return this.configuration[t]=e,!0}register(){this._startedTimeout&&clearTimeout(this._startedTimeout);const{password:t,register:e,uri:n}=this.configuration;e&&n.user.includes(P)?(this._isRegistered=!1,this._isConnected=!1,this._startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:null,cause:"Request Timeout"})},m)):!this._isRegistered&&e&&(t===c||t===f)?(this._isRegistered=!0,this._startedTimeout=setTimeout(()=>{this.trigger("registered")},m)):e&&t!==c&&t!==f&&(this._isRegistered=!1,this._isConnected=!1,this._startedTimeout=setTimeout(()=>{this.trigger("registrationFailed",{response:null,cause:"Wrong credentials"})},m)),s.isAvailableTelephony?(this.trigger("connected"),this._isConnected=!0):this.stop()}unregister(){this._isRegistered=!1,this._isConnected=!1,this.trigger("unregistered")}isRegistered(){return!!this._isRegistered}isStarted(){return this.configuration&&(this.configuration.register&&!!this._isRegistered||!this.configuration.register&&!!this._isConnected)}registrator(){return this._registrator}newSipEvent(t){this.trigger("sipEvent",t)}};r(s,"isAvailableTelephony",!0),r(s,"startError"),r(s,"countStartError",Number.POSITIVE_INFINITY),r(s,"countStarts",0);let M=s;class Y{constructor(t){r(this,"url");this.url=t}}class j extends F.EventEmitter{constructor(e,n){super();r(this,"contentType");r(this,"body");this.contentType=e,this.body=n}}const S="remote",B=(o,t)=>{const e=new y(t),n={originator:S,request:e,info:new j("","")};o.newInfo(n)},K=(o,t)=>{const n={request:new y(t)};o.newSipEvent(n)},$=(o,{incomingNumber:t="1234",displayName:e,host:n})=>{const i=new l({originator:S}),d=new L("sip",t,n);i._remote_identity=new D(d,e),o.trigger("newRTCSession",{originator:S,session:i})},J=(o,t)=>{t?o.trigger("failed",t):o.trigger("failed",o)},A={triggerNewInfo:B,triggerNewSipEvent:K,triggerIncomingSession:$,triggerFailIncomingSession:J,WebSocketInterface:Y,UA:M,C:{INVITE:"INVITE"}},_="user",h="displayName",E="SIP_SERVER_URL",R="SIP_WEB_SOCKET_SERVER_URL",G=new A.WebSocketInterface(R),v={userAgent:"Chrome",sipServerUrl:E,sipWebSocketServerURL:R},X={...v},O={...v,user:_,password:c,register:!0},Q={...O,displayName:h},Z={...v,displayName:h,register:!1},p={session_timers:!1,sockets:[G],user_agent:"Chrome",sdp_semantics:"unified-plan",register_expires:300,connection_recovery_max_interval:6,connection_recovery_min_interval:2},ee={...p,password:c,uri:new T.URI("sip",_,E),display_name:"",register:!0},te={...p,password:c,uri:new T.URI("sip",_,E),display_name:h,register:!0},re={...p,display_name:h,register:!1},ne={...p,display_name:"",register:!1},W="10.10.10.10",oe=[`X-Vinteo-Remote: ${W}`],ie=()=>new g.SipConnector({JsSIP:A});exports.FAILED_CONFERENCE_NUMBER=N;exports.NAME_INCORRECT=P;exports.PASSWORD_CORRECT=c;exports.PASSWORD_CORRECT_2=f;exports.SIP_SERVER_URL=E;exports.SIP_WEB_SOCKET_SERVER_URL=R;exports.dataForConnectionWithAuthorization=O;exports.dataForConnectionWithAuthorizationWithDisplayName=Q;exports.dataForConnectionWithoutAuthorization=Z;exports.dataForConnectionWithoutAuthorizationWithoutDisplayName=X;exports.default=ie;exports.displayName=h;exports.extraHeadersRemoteAddress=oe;exports.remoteAddress=W;exports.uaConfigurationWithAuthorization=ee;exports.uaConfigurationWithAuthorizationWithDisplayName=te;exports.uaConfigurationWithoutAuthorization=re;exports.uaConfigurationWithoutAuthorizationWithoutDisplayName=ne;exports.user=_;
package/dist/doMock.js CHANGED
@@ -1,7 +1,7 @@
1
1
  var y = Object.defineProperty;
2
2
  var N = (o, t, e) => t in o ? y(o, t, { enumerable: !0, configurable: !0, writable: !0, value: e }) : o[t] = e;
3
3
  var r = (o, t, e) => N(o, typeof t != "symbol" ? t + "" : t, e);
4
- import { j as P, R as O, U as A, S as b } from "./SipConnector-DagL4rCl.js";
4
+ import { j as P, R as O, U as A, S as b } from "./SipConnector-xflR79mb.js";
5
5
  import k from "@krivega/jssip/lib/NameAddrHeader";
6
6
  import D from "@krivega/jssip/lib/URI";
7
7
  import { EventEmitter as L } from "node:events";
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("./SipConnector-BCc5pokv.cjs"),K=require("ts-debounce"),H=require("@krivega/cancelable-promise"),Y=require("repeated-calls"),z=require("sequent-promises"),J=require("stack-promises"),Q=require("debug"),L="purgatory",A=e=>e===L,D=e=>()=>(r.logger("getRemoteStreams"),e.getRemoteStreams()),Z=({kind:e,readyState:t})=>e==="video"&&t==="live",V=e=>({track:t})=>{Z(t)&&e()},I=({getRemoteStreams:e,setRemoteStreams:t})=>K.debounce(()=>{const n=e();r.logger("remoteStreams",n),n&&t(n)},200),ee=e=>async n=>{const{mediaStream:s,extraHeaders:o,iceServers:c,degradationPreference:a,setRemoteStreams:i,onBeforeProgressCall:l,onSuccessProgressCall:d,onEnterPurgatory:m,onEnterConference:g,onFailProgressCall:S,onFinishProgressCall:T,onEndedCall:f}=n,E=I({setRemoteStreams:i,getRemoteStreams:D(e)}),y=V(E);r.logger("answerIncomingCall",n);const _=async()=>e.answerToIncomingCall({mediaStream:s,extraHeaders:o,iceServers:c,degradationPreference:a,ontrack:y}),h=()=>{const{remoteCallerData:u}=e;return u.incomingNumber};let R=!1,M;const b=(r.logger("subscribeEnterConference: onEnterConference",g),m??g?e.onSession("enterRoom",u=>{r.logger("enterRoom",{_room:u,isSuccessProgressCall:R}),M=u,A(M)?m&&m():g&&g({isSuccessProgressCall:R})}):()=>{}),v=u=>(r.logger("onSuccess"),R=!0,E(),d&&d({isPurgatory:A(M)}),e.onceRaceSession(["ended","failed"],()=>{b(),f&&f()}),u),O=u=>{throw r.logger("onFail"),S&&S(),b(),u},p=()=>{r.logger("onFinish"),T&&T()};if(r.logger("onBeforeProgressCall"),l){const u=h();l(u)}return _().then(v).catch(u=>O(u)).finally(p)},ne=e=>async n=>{const{conference:s,mediaStream:o,extraHeaders:c,iceServers:a,degradationPreference:i,setRemoteStreams:l,onBeforeProgressCall:d,onSuccessProgressCall:m,onEnterPurgatory:g,onEnterConference:S,onFailProgressCall:T,onFinishProgressCall:f,onEndedCall:E}=n,y=I({setRemoteStreams:l,getRemoteStreams:D(e)}),_=V(y);r.logger("callToServer",n);const h=async()=>(r.logger("startCall"),e.call({mediaStream:o,extraHeaders:c,iceServers:a,degradationPreference:i,number:s,ontrack:_}));let R=!1,M;const b=(r.logger("subscribeEnterConference: onEnterConference",S),g??S?e.onSession("enterRoom",({room:u})=>{r.logger("enterRoom",{_room:u,isSuccessProgressCall:R}),M=u,A(M)?g&&g():S&&S({isSuccessProgressCall:R})}):()=>{}),v=u=>(r.logger("onSuccess"),R=!0,y(),m&&m({isPurgatory:A(M)}),e.onceRaceSession(["ended","failed"],()=>{b(),E&&E()}),u),O=u=>{throw r.logger("onFail"),T&&T(),b(),u},p=()=>{r.logger("onFinish"),f&&f()};return r.logger("onBeforeProgressCall"),d&&d(s),h().then(v).catch(u=>O(u)).finally(p)},P=e=>{if(!H.isCanceledError(e)&&!Y.hasCanceledError(e))throw e;return{isSuccessful:!1}},te=e=>async n=>{const{userAgent:s,sipWebSocketServerURL:o,sipServerUrl:c,remoteAddress:a,displayName:i,name:l,password:d,isRegisteredUser:m,isDisconnectOnFail:g}=n;return r.logger("connectToServer",n),e.connect({userAgent:s,sipWebSocketServerURL:o,sipServerUrl:c,remoteAddress:a,displayName:i,password:d,user:l,register:m}).then(S=>(r.logger("connectToServer then"),{ua:S,isSuccessful:!0})).catch(async S=>(r.logger("connectToServer catch: error",S),g===!0?e.disconnect().then(()=>P(S)).catch(()=>P(S)):P(S)))},re=e=>async()=>(r.logger("disconnectFromServer"),e.disconnect().then(()=>(r.logger("disconnectFromServer: then"),{isSuccessful:!0})).catch(t=>(r.logger("disconnectFromServer: catch",t),{isSuccessful:!1}))),w=e=>{const{url:t,cause:n}=e;let s=t;return(n===r.BAD_MEDIA_DESCRIPTION||n===r.NOT_FOUND)&&(s=`${e.message.to.uri.user}@${e.message.to.uri.host}`),s};var x=(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))(x||{});const se=(e=new Error)=>{var o;const{cause:t,socket:n}=e;let s="CONNECT_SERVER_FAILED";switch(t){case"Forbidden":{s="WRONG_USER_OR_PASSWORD";break}case r.BAD_MEDIA_DESCRIPTION:{s="BAD_MEDIA_ERROR";break}case r.NOT_FOUND:{s="NOT_FOUND_ERROR";break}default:n&&((o=n==null?void 0:n._ws)==null?void 0:o.readyState)===3?s="WS_CONNECTION_FAILED":w(e)&&(s="CONNECT_SERVER_FAILED_BY_LINK")}return s},oe=e=>{let t="";try{t=JSON.stringify(e)}catch(n){r.logger("failed to stringify message",n)}return t},ce=(e=new Error)=>{const{code:t,cause:n,message:s}=e,o=w(e),c={code:"",cause:"",message:""};return typeof s=="object"&&s!==null?c.message=oe(s):s&&(c.message=String(s)),o&&(c.link=o),t&&(c.code=t),n&&(c.cause=n),c},ae=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:x,getLinkError:w,getTypeFromError:se,getValuesFromError:ce},Symbol.toStringTag,{value:"Module"})),ie=({sessionId:e,remoteAddress:t,isMutedAudio:n,isMutedVideo:s,isRegistered:o,isPresentationCall:c})=>{const a=[],i=n?"0":"1",l=s?"0":"1";return a.push(`X-Vinteo-Mic-State: ${i}`,`X-Vinteo-MainCam-State: ${l}`),o||a.push("X-Vinteo-Purgatory-Call: yes"),e&&a.push(`X-Vinteo-Session: ${e}`),c&&a.push("X-Vinteo-Presentation-Call: yes"),t&&a.push(`X-Vinteo-Remote: ${t}`),a},ue="[@*!|]",le="_",ge=e=>{let t=e;return t=t.replaceAll(new RegExp(ue,"g"),le),t},Se=({appName:e,appVersion:t,browserName:n,browserVersion:s})=>{const c=`${ge(e)} ${t}`;return`ChromeNew - ${n?`${n} ${s}, ${c}`:c}`},de=({isUnifiedSdpSemantic:e,appVersion:t,browserName:n,browserVersion:s,appName:o})=>e?Se({appVersion:t,browserName:n,browserVersion:s,appName:o}):"Chrome",me=e=>async()=>{if(e.isCallActive)return r.logger("askPermissionToEnableCam"),e.askPermissionToEnableCam()},fe=e=>n=>(r.logger("onMustStopPresentation"),e.onSession("mustStopPresentation",n)),Ce=e=>n=>(r.logger("onMoveToSpectators"),e.onSession("participant:move-request-to-spectators",n)),Ee=e=>n=>(r.logger("onUseLicense"),e.onSession("useLicense",n)),Re=e=>async({isEnabledCam:n,isEnabledMic:s})=>{if(e.isCallActive)return r.logger("sendMediaState"),e.sendMediaState({cam:n,mic:s})},Me=e=>async()=>{if(e.isCallActive)return r.logger("sendRefusalToTurnOnCam"),e.sendRefusalToTurnOnCam().catch(n=>{r.logger("sendRefusalToTurnOnCam: error",n)})},Te=e=>async()=>{if(e.isCallActive)return r.logger("sendRefusalToTurnOnMic"),e.sendRefusalToTurnOnMic().catch(n=>{r.logger("sendRefusalToTurnOnMic: error",n)})},ye=e=>async({mediaStream:n,isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a},i)=>(r.logger("startPresentation"),e.startPresentation(n,{isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a},i)),be=e=>async({isP2P:n=!1}={})=>(r.logger("stopShareSipConnector"),e.stopPresentation({isP2P:n}).catch(s=>{r.logger(s)})),_e=e=>async({mediaStream:n,isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a})=>(r.logger("updatePresentation"),e.updatePresentation(n,{isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a})),he=e=>t=>[...t].map(s=>async()=>e(s)),ve=async({accumulatedKeys:e,sendKey:t,canRunTask:n})=>{const o=he(t)(e);return z.sequentPromises(o,n)},Oe=e=>n=>(r.logger("onStartMainCam"),e.onSession("admin-start-main-cam",n)),pe=e=>n=>(r.logger("onStartMic"),e.onSession("admin-start-mic",n)),Ae=e=>n=>(r.logger("onStopMainCam"),e.onSession("admin-stop-main-cam",n)),Ne=e=>n=>(r.logger("onStopMic"),e.onSession("admin-stop-mic",n)),Pe=({sipConnector:e})=>{const t=(f,E)=>({isSyncForced:y=!1})=>{if(y){f();return}E()},n=Oe(e),s=Ae(e),o=pe(e),c=Ne(e);let a=()=>{},i=()=>{},l=()=>{},d=()=>{};const m=({onStartMainCamForced:f,onStartMainCamNotForced:E,onStopMainCamForced:y,onStopMainCamNotForced:_,onStartMicForced:h,onStartMicNotForced:R,onStopMicForced:M,onStopMicNotForced:N})=>{const b=t(f,E);a=n(b);const v=t(y,_);i=s(v);const O=t(h,R);l=o(O);const p=t(M,N);d=c(p)},g=()=>{a(),i(),l(),d()};return{start:f=>{m(f)},stop:()=>{g()}}},Be=Object.freeze(Object.defineProperty({__proto__:null,PURGATORY_CONFERENCE_NUMBER:L,createSyncMediaState:Pe,error:ae,getExtraHeaders:ie,getUserAgent:de,hasPurgatory:A,resolveAnswerIncomingCall:ee,resolveAskPermissionToEnableCam:me,resolveCallToServer:ne,resolveConnectToServer:te,resolveDisconnectFromServer:re,resolveGetRemoteStreams:D,resolveOnMoveToSpectators:Ce,resolveOnMustStopPresentation:fe,resolveOnUseLicense:Ee,resolveSendMediaState:Re,resolveSendRefusalToTurnOnCam:Me,resolveSendRefusalToTurnOnMic:Te,resolveStartPresentation:ye,resolveStopShareSipConnector:be,resolveUpdatePresentation:_e,resolveUpdateRemoteStreams:I,sendDTMFAccumulated:ve},Symbol.toStringTag,{value:"Module"})),De=e=>[...e.keys()].map(t=>e.get(t)),Ie=(e,t)=>De(e).find(n=>n.type===t),$=async e=>e.getStats().then(t=>{const n=Ie(t,"codec");return n==null?void 0:n.mimeType}),we=e=>e.find(t=>{var n;return((n=t==null?void 0:t.track)==null?void 0:n.kind)==="video"}),q=(e,t)=>e!==void 0&&t!==void 0&&e.toLowerCase().includes(t.toLowerCase()),Fe=1e6,C=e=>e*Fe,X=C(.06),ke=C(4),Ue=e=>e<=64?X:e<=128?C(.12):e<=256?C(.25):e<=384?C(.32):e<=426?C(.38):e<=640?C(.5):e<=848?C(.7):e<=1280?C(1):e<=1920?C(2):ke,Le="av1",Ve=e=>q(e,Le),xe=.6,W=(e,t)=>Ve(t)?e*xe:e,$e=e=>W(X,e),j=(e,t)=>{const n=Ue(e);return W(n,t)},G=J.createStackPromises(),qe=async()=>G().catch(e=>{r.logger("videoSendingBalancer: error",e)}),Xe=async e=>(G.add(e),qe()),F=async({sender:e,scaleResolutionDownBy:t,maxBitrate:n,onSetParameters:s})=>Xe(async()=>r.setEncodingsToSender(e,{scaleResolutionDownBy:t,maxBitrate:n},s)),We=async({sender:e,codec:t},n)=>{const o=$e(t);return F({sender:e,maxBitrate:o,onSetParameters:n,scaleResolutionDownBy:200})},B=async({sender:e,track:t,codec:n},s)=>{const a=t.getSettings().width,i=j(a,n);return F({sender:e,maxBitrate:i,onSetParameters:s,scaleResolutionDownBy:1})},je=async({sender:e,track:t,resolution:n,codec:s},o)=>{const c=t.getSettings(),a=c.width,i=c.height,[l,d]=n.split("x"),m=a/Number(l),g=i/Number(d),T=Math.max(m,g,1),f=j(Number(l),s);return F({sender:e,maxBitrate:f,onSetParameters:o,scaleResolutionDownBy:T})},Ge=async({mainCam:e,resolutionMainCam:t,sender:n,track:s,codec:o},c)=>{switch(e){case r.EEventsMainCAM.PAUSE_MAIN_CAM:return We({sender:n,codec:o},c);case r.EEventsMainCAM.RESUME_MAIN_CAM:return B({sender:n,track:s,codec:o},c);case r.EEventsMainCAM.MAX_MAIN_CAM_RESOLUTION:return t!==void 0?je({sender:n,track:s,codec:o,resolution:t},c):B({sender:n,track:s,codec:o},c);default:return B({sender:n,track:s,codec:o},c)}},k={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}},U=async({mainCam:e,resolutionMainCam:t,connection:n,onSetParameters:s,ignoreForCodec:o})=>{const c=n.getSenders(),a=we(c);if(!(a!=null&&a.track))return k;const i=await $(a);return q(i,o)?k:Ge({mainCam:e,resolutionMainCam:t,sender:a,codec:i,track:a.track},s)},Ke=(e,{ignoreForCodec:t,onSetParameters:n}={})=>{const s=async()=>{const{connection:l}=e;if(!l)throw new Error("connection is not exist");return U({connection:l,onSetParameters:n,ignoreForCodec:t})};let o=s;const c=async l=>(o=async()=>{const{mainCam:d,resolutionMainCam:m}=l,{connection:g}=e;if(!g)throw new Error("connection is not exist");return U({mainCam:d,resolutionMainCam:m,connection:g,onSetParameters:n,ignoreForCodec:t})},o());return{subscribe:()=>{e.onSession("main-cam-control",c)},unsubscribe:()=>{e.offSession("main-cam-control",c)},balanceByTrack:s,resetMainCamControl(){o=s},async reBalance(){return o()}}};exports.EEventsMainCAM=r.EEventsMainCAM;exports.EEventsMic=r.EEventsMic;exports.EEventsSyncMediaState=r.EEventsSyncMediaState;exports.EUseLicense=r.EUseLicense;exports.causes=r.causes;exports.constants=r.constants;exports.default=r.SipConnector;exports.disableDebug=r.disableDebug;exports.enableDebug=r.enableDebug;exports.eventNames=r.eventNames;exports.hasCanceledCallError=r.hasCanceledCallError;exports.debug=Q;exports.getCodecFromSender=$;exports.resolveVideoSendingBalancer=Ke;exports.tools=Be;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const r=require("./SipConnector-lgvJyyG7.cjs"),K=require("ts-debounce"),Y=require("@krivega/cancelable-promise"),z=require("repeated-calls"),J=require("sequent-promises"),Q=require("stack-promises"),Z=require("debug"),V="purgatory",A=e=>e===V,I=e=>()=>(r.logger("getRemoteStreams"),e.getRemoteStreams()),ee=({kind:e,readyState:t})=>e==="video"&&t==="live",x=e=>({track:t})=>{ee(t)&&e()},w=({getRemoteStreams:e,setRemoteStreams:t})=>K.debounce(()=>{const n=e();r.logger("remoteStreams",n),n&&t(n)},200),ne=e=>async n=>{const{mediaStream:s,extraHeaders:o,iceServers:c,degradationPreference:a,contentHint:i,setRemoteStreams:l,onBeforeProgressCall:d,onSuccessProgressCall:m,onEnterPurgatory:S,onEnterConference:g,onFailProgressCall:C,onFinishProgressCall:f,onEndedCall:R}=n,M=w({setRemoteStreams:l,getRemoteStreams:I(e)}),_=x(M);r.logger("answerIncomingCall",n);const h=async()=>e.answerToIncomingCall({mediaStream:s,extraHeaders:o,iceServers:c,contentHint:i,degradationPreference:a,ontrack:_}),v=()=>{const{remoteCallerData:u}=e;return u.incomingNumber};let T=!1,y;const b=(r.logger("subscribeEnterConference: onEnterConference",g),S??g?e.onSession("enterRoom",u=>{r.logger("enterRoom",{_room:u,isSuccessProgressCall:T}),y=u,A(y)?S&&S():g&&g({isSuccessProgressCall:T})}):()=>{}),O=u=>(r.logger("onSuccess"),T=!0,M(),m&&m({isPurgatory:A(y)}),e.onceRaceSession(["ended","failed"],()=>{b(),R&&R()}),u),p=u=>{throw r.logger("onFail"),C&&C(),b(),u},P=()=>{r.logger("onFinish"),f&&f()};if(r.logger("onBeforeProgressCall"),d){const u=v();d(u)}return h().then(O).catch(u=>p(u)).finally(P)},te=e=>async n=>{const{conference:s,mediaStream:o,extraHeaders:c,iceServers:a,degradationPreference:i,contentHint:l,setRemoteStreams:d,onBeforeProgressCall:m,onSuccessProgressCall:S,onEnterPurgatory:g,onEnterConference:C,onFailProgressCall:f,onFinishProgressCall:R,onEndedCall:M}=n,_=w({setRemoteStreams:d,getRemoteStreams:I(e)}),h=x(_);r.logger("callToServer",n);const v=async()=>(r.logger("startCall"),e.call({mediaStream:o,extraHeaders:c,iceServers:a,degradationPreference:i,contentHint:l,number:s,ontrack:h}));let T=!1,y;const b=(r.logger("subscribeEnterConference: onEnterConference",C),g??C?e.onSession("enterRoom",({room:u})=>{r.logger("enterRoom",{_room:u,isSuccessProgressCall:T}),y=u,A(y)?g&&g():C&&C({isSuccessProgressCall:T})}):()=>{}),O=u=>(r.logger("onSuccess"),T=!0,_(),S&&S({isPurgatory:A(y)}),e.onceRaceSession(["ended","failed"],()=>{b(),M&&M()}),u),p=u=>{throw r.logger("onFail"),f&&f(),b(),u},P=()=>{r.logger("onFinish"),R&&R()};return r.logger("onBeforeProgressCall"),m&&m(s),v().then(O).catch(u=>p(u)).finally(P)},B=e=>{if(!Y.isCanceledError(e)&&!z.hasCanceledError(e))throw e;return{isSuccessful:!1}},re=e=>async n=>{const{userAgent:s,sipWebSocketServerURL:o,sipServerUrl:c,remoteAddress:a,displayName:i,name:l,password:d,isRegisteredUser:m,isDisconnectOnFail:S}=n;return r.logger("connectToServer",n),e.connect({userAgent:s,sipWebSocketServerURL:o,sipServerUrl:c,remoteAddress:a,displayName:i,password:d,user:l,register:m}).then(g=>(r.logger("connectToServer then"),{ua:g,isSuccessful:!0})).catch(async g=>(r.logger("connectToServer catch: error",g),S===!0?e.disconnect().then(()=>B(g)).catch(()=>B(g)):B(g)))},se=e=>async()=>(r.logger("disconnectFromServer"),e.disconnect().then(()=>(r.logger("disconnectFromServer: then"),{isSuccessful:!0})).catch(t=>(r.logger("disconnectFromServer: catch",t),{isSuccessful:!1}))),F=e=>{const{url:t,cause:n}=e;let s=t;return(n===r.BAD_MEDIA_DESCRIPTION||n===r.NOT_FOUND)&&(s=`${e.message.to.uri.user}@${e.message.to.uri.host}`),s};var $=(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))($||{});const oe=(e=new Error)=>{var o;const{cause:t,socket:n}=e;let s="CONNECT_SERVER_FAILED";switch(t){case"Forbidden":{s="WRONG_USER_OR_PASSWORD";break}case r.BAD_MEDIA_DESCRIPTION:{s="BAD_MEDIA_ERROR";break}case r.NOT_FOUND:{s="NOT_FOUND_ERROR";break}default:n&&((o=n==null?void 0:n._ws)==null?void 0:o.readyState)===3?s="WS_CONNECTION_FAILED":F(e)&&(s="CONNECT_SERVER_FAILED_BY_LINK")}return s},ce=e=>{let t="";try{t=JSON.stringify(e)}catch(n){r.logger("failed to stringify message",n)}return t},ae=(e=new Error)=>{const{code:t,cause:n,message:s}=e,o=F(e),c={code:"",cause:"",message:""};return typeof s=="object"&&s!==null?c.message=ce(s):s&&(c.message=String(s)),o&&(c.link=o),t&&(c.code=t),n&&(c.cause=n),c},ie=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:$,getLinkError:F,getTypeFromError:oe,getValuesFromError:ae},Symbol.toStringTag,{value:"Module"})),ue=({sessionId:e,remoteAddress:t,isMutedAudio:n,isMutedVideo:s,isRegistered:o,isPresentationCall:c})=>{const a=[],i=n?"0":"1",l=s?"0":"1";return a.push(`X-Vinteo-Mic-State: ${i}`,`X-Vinteo-MainCam-State: ${l}`),o||a.push("X-Vinteo-Purgatory-Call: yes"),e&&a.push(`X-Vinteo-Session: ${e}`),c&&a.push("X-Vinteo-Presentation-Call: yes"),t&&a.push(`X-Vinteo-Remote: ${t}`),a},le="[@*!|]",ge="_",Se=e=>{let t=e;return t=t.replaceAll(new RegExp(le,"g"),ge),t},de=({appName:e,appVersion:t,browserName:n,browserVersion:s})=>{const c=`${Se(e)} ${t}`;return`ChromeNew - ${n?`${n} ${s}, ${c}`:c}`},me=({isUnifiedSdpSemantic:e,appVersion:t,browserName:n,browserVersion:s,appName:o})=>e?de({appVersion:t,browserName:n,browserVersion:s,appName:o}):"Chrome",fe=e=>async()=>{if(e.isCallActive)return r.logger("askPermissionToEnableCam"),e.askPermissionToEnableCam()},Ce=e=>n=>(r.logger("onMustStopPresentation"),e.onSession("mustStopPresentation",n)),Ee=e=>n=>(r.logger("onMoveToSpectators"),e.onSession("participant:move-request-to-spectators",n)),Re=e=>n=>(r.logger("onUseLicense"),e.onSession("useLicense",n)),Me=e=>async({isEnabledCam:n,isEnabledMic:s})=>{if(e.isCallActive)return r.logger("sendMediaState"),e.sendMediaState({cam:n,mic:s})},Te=e=>async()=>{if(e.isCallActive)return r.logger("sendRefusalToTurnOnCam"),e.sendRefusalToTurnOnCam().catch(n=>{r.logger("sendRefusalToTurnOnCam: error",n)})},ye=e=>async()=>{if(e.isCallActive)return r.logger("sendRefusalToTurnOnMic"),e.sendRefusalToTurnOnMic().catch(n=>{r.logger("sendRefusalToTurnOnMic: error",n)})},be=e=>async({mediaStream:n,isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a},i)=>(r.logger("startPresentation"),e.startPresentation(n,{isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a},i)),_e=e=>async({isP2P:n=!1}={})=>(r.logger("stopShareSipConnector"),e.stopPresentation({isP2P:n}).catch(s=>{r.logger(s)})),he=e=>async({mediaStream:n,isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a})=>(r.logger("updatePresentation"),e.updatePresentation(n,{isP2P:s,maxBitrate:o,degradationPreference:c,contentHint:a})),ve=e=>t=>[...t].map(s=>async()=>e(s)),Oe=async({accumulatedKeys:e,sendKey:t,canRunTask:n})=>{const o=ve(t)(e);return J.sequentPromises(o,n)},pe=e=>n=>(r.logger("onStartMainCam"),e.onSession("admin-start-main-cam",n)),Ae=e=>n=>(r.logger("onStartMic"),e.onSession("admin-start-mic",n)),Ne=e=>n=>(r.logger("onStopMainCam"),e.onSession("admin-stop-main-cam",n)),Pe=e=>n=>(r.logger("onStopMic"),e.onSession("admin-stop-mic",n)),Be=({sipConnector:e})=>{const t=(f,R)=>({isSyncForced:M=!1})=>{if(M){f();return}R()},n=pe(e),s=Ne(e),o=Ae(e),c=Pe(e);let a=()=>{},i=()=>{},l=()=>{},d=()=>{};const m=({onStartMainCamForced:f,onStartMainCamNotForced:R,onStopMainCamForced:M,onStopMainCamNotForced:_,onStartMicForced:h,onStartMicNotForced:v,onStopMicForced:T,onStopMicNotForced:y})=>{const N=t(f,R);a=n(N);const b=t(M,_);i=s(b);const O=t(h,v);l=o(O);const p=t(T,y);d=c(p)},S=()=>{a(),i(),l(),d()};return{start:f=>{m(f)},stop:()=>{S()}}},De=Object.freeze(Object.defineProperty({__proto__:null,PURGATORY_CONFERENCE_NUMBER:V,createSyncMediaState:Be,error:ie,getExtraHeaders:ue,getUserAgent:me,hasPurgatory:A,resolveAnswerIncomingCall:ne,resolveAskPermissionToEnableCam:fe,resolveCallToServer:te,resolveConnectToServer:re,resolveDisconnectFromServer:se,resolveGetRemoteStreams:I,resolveOnMoveToSpectators:Ee,resolveOnMustStopPresentation:Ce,resolveOnUseLicense:Re,resolveSendMediaState:Me,resolveSendRefusalToTurnOnCam:Te,resolveSendRefusalToTurnOnMic:ye,resolveStartPresentation:be,resolveStopShareSipConnector:_e,resolveUpdatePresentation:he,resolveUpdateRemoteStreams:w,sendDTMFAccumulated:Oe},Symbol.toStringTag,{value:"Module"})),Ie=e=>[...e.keys()].map(t=>e.get(t)),we=(e,t)=>Ie(e).find(n=>n.type===t),q=async e=>e.getStats().then(t=>{const n=we(t,"codec");return n==null?void 0:n.mimeType}),Fe=e=>e.find(t=>{var n;return((n=t==null?void 0:t.track)==null?void 0:n.kind)==="video"}),X=(e,t)=>e!==void 0&&t!==void 0&&e.toLowerCase().includes(t.toLowerCase()),ke=1e6,E=e=>e*ke,H=E(.06),Ue=E(4),Le=e=>e<=64?H:e<=128?E(.12):e<=256?E(.25):e<=384?E(.32):e<=426?E(.38):e<=640?E(.5):e<=848?E(.7):e<=1280?E(1):e<=1920?E(2):Ue,Ve="av1",xe=e=>X(e,Ve),$e=.6,W=(e,t)=>xe(t)?e*$e:e,qe=e=>W(H,e),j=(e,t)=>{const n=Le(e);return W(n,t)},G=Q.createStackPromises(),Xe=async()=>G().catch(e=>{r.logger("videoSendingBalancer: error",e)}),He=async e=>(G.add(e),Xe()),k=async({sender:e,scaleResolutionDownBy:t,maxBitrate:n,onSetParameters:s})=>He(async()=>r.setEncodingsToSender(e,{scaleResolutionDownBy:t,maxBitrate:n},s)),We=async({sender:e,codec:t},n)=>{const o=qe(t);return k({sender:e,maxBitrate:o,onSetParameters:n,scaleResolutionDownBy:200})},D=async({sender:e,track:t,codec:n},s)=>{const a=t.getSettings().width,i=j(a,n);return k({sender:e,maxBitrate:i,onSetParameters:s,scaleResolutionDownBy:1})},je=async({sender:e,track:t,resolution:n,codec:s},o)=>{const c=t.getSettings(),a=c.width,i=c.height,[l,d]=n.split("x"),m=a/Number(l),S=i/Number(d),C=Math.max(m,S,1),f=j(Number(l),s);return k({sender:e,maxBitrate:f,onSetParameters:o,scaleResolutionDownBy:C})},Ge=async({mainCam:e,resolutionMainCam:t,sender:n,track:s,codec:o},c)=>{switch(e){case r.EEventsMainCAM.PAUSE_MAIN_CAM:return We({sender:n,codec:o},c);case r.EEventsMainCAM.RESUME_MAIN_CAM:return D({sender:n,track:s,codec:o},c);case r.EEventsMainCAM.MAX_MAIN_CAM_RESOLUTION:return t!==void 0?je({sender:n,track:s,codec:o,resolution:t},c):D({sender:n,track:s,codec:o},c);default:return D({sender:n,track:s,codec:o},c)}},U={isChanged:!1,parameters:{encodings:[{}],transactionId:"0",codecs:[],headerExtensions:[],rtcp:{}}},L=async({mainCam:e,resolutionMainCam:t,connection:n,onSetParameters:s,ignoreForCodec:o})=>{const c=n.getSenders(),a=Fe(c);if(!(a!=null&&a.track))return U;const i=await q(a);return X(i,o)?U:Ge({mainCam:e,resolutionMainCam:t,sender:a,codec:i,track:a.track},s)},Ke=(e,{ignoreForCodec:t,onSetParameters:n}={})=>{const s=async()=>{const{connection:l}=e;if(!l)throw new Error("connection is not exist");return L({connection:l,onSetParameters:n,ignoreForCodec:t})};let o=s;const c=async l=>(o=async()=>{const{mainCam:d,resolutionMainCam:m}=l,{connection:S}=e;if(!S)throw new Error("connection is not exist");return L({mainCam:d,resolutionMainCam:m,connection:S,onSetParameters:n,ignoreForCodec:t})},o());return{subscribe:()=>{e.onSession("main-cam-control",c)},unsubscribe:()=>{e.offSession("main-cam-control",c)},balanceByTrack:s,resetMainCamControl(){o=s},async reBalance(){return o()}}};exports.EEventsMainCAM=r.EEventsMainCAM;exports.EEventsMic=r.EEventsMic;exports.EEventsSyncMediaState=r.EEventsSyncMediaState;exports.EUseLicense=r.EUseLicense;exports.causes=r.causes;exports.constants=r.constants;exports.default=r.SipConnector;exports.disableDebug=r.disableDebug;exports.enableDebug=r.enableDebug;exports.eventNames=r.eventNames;exports.hasCanceledCallError=r.hasCanceledCallError;exports.debug=Z;exports.getCodecFromSender=q;exports.resolveVideoSendingBalancer=Ke;exports.tools=De;