sip-connector 15.3.1 → 16.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +763 -103
  3. package/dist/@SipConnector-DcaeAFrM.cjs +1 -0
  4. package/dist/{@SipConnector-5Rac5oq2.js → @SipConnector-uiUlVCMv.js} +955 -395
  5. package/dist/CallManager/types.d.ts +2 -0
  6. package/dist/PresentationManager/@PresentationManager.d.ts +5 -3
  7. package/dist/SipConnector/@SipConnector.d.ts +14 -4
  8. package/dist/SipConnector/eventNames.d.ts +1 -1
  9. package/dist/SipConnectorFacade/SipConnectorFacade.d.ts +10 -21
  10. package/dist/VideoSendingBalancer/SenderBalancer.d.ts +3 -1
  11. package/dist/VideoSendingBalancer/TrackMonitor.d.ts +38 -0
  12. package/dist/VideoSendingBalancer/VideoSendingBalancer.d.ts +8 -9
  13. package/dist/VideoSendingBalancer/VideoSendingEventHandler.d.ts +4 -9
  14. package/dist/VideoSendingBalancer/__fixtures__/createMockTrack.d.ts +5 -0
  15. package/dist/VideoSendingBalancer/__fixtures__/index.d.ts +1 -0
  16. package/dist/VideoSendingBalancer/index.d.ts +1 -2
  17. package/dist/VideoSendingBalancer/types.d.ts +0 -1
  18. package/dist/VideoSendingBalancerManager/@VideoSendingBalancerManager.d.ts +47 -0
  19. package/dist/VideoSendingBalancerManager/eventNames.d.ts +20 -0
  20. package/dist/VideoSendingBalancerManager/index.d.ts +3 -0
  21. package/dist/doMock.cjs +1 -1
  22. package/dist/doMock.js +1 -1
  23. package/dist/index.cjs +1 -1
  24. package/dist/index.d.ts +1 -2
  25. package/dist/index.js +281 -748
  26. package/dist/logger.d.ts +0 -1
  27. package/dist/tools/setCodecPreferences.d.ts +5 -0
  28. package/dist/tools/setParametersToSender/index.d.ts +1 -0
  29. package/package.json +8 -8
  30. package/dist/@SipConnector-Bv3-Y4Rz.cjs +0 -1
  31. package/dist/tools/generateSimulcastEncodings.d.ts +0 -7
  32. package/dist/tools/resolveUpdateTransceiver.d.ts +0 -6
  33. package/dist/tools/scaleResolutionAndBitrate.d.ts +0 -10
  34. /package/dist/{PresentationManager → SipConnector}/constants.d.ts +0 -0
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("events-constructor");const o=require("./@SipConnector-Bv3-Y4Rz.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;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("events-constructor");const r=require("./@SipConnector-DcaeAFrM.cjs"),x=require("@krivega/cancelable-promise"),j=require("repeated-calls"),K=require("ts-debounce"),X=require("ua-parser-js"),Y=require("sequent-promises"),G=n=>n instanceof Object&&("originator"in n||"cause"in n),J=n=>{if(x.isCanceledError(n))return!0;if(!G(n))return!1;const{originator:e,cause:t}=n;return typeof t=="string"?t===r.ECallCause.REQUEST_TIMEOUT||t===r.ECallCause.REJECTED||e===r.Originator.LOCAL&&(t===r.ECallCause.CANCELED||t===r.ECallCause.BYE):!1},z=()=>globalThis.process?.versions?.electron!==void 0,B=()=>{const n=new X.UAParser,{name:e}=n.getBrowser(),t=z();return{isChrome:e==="Chrome"||t}},A=n=>{const{url:e,cause:t}=n;let o=e;return(t===r.ECallCause.BAD_MEDIA_DESCRIPTION||t===r.ECallCause.NOT_FOUND)&&(o=`${n.message.to.uri.user}@${n.message.to.uri.host}`),o};var $=(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))($||{});const Q=new Error("Unknown error"),Z=(n=Q)=>{const{cause:e,socket:t}=n;let o="CONNECT_SERVER_FAILED";switch(e){case"Forbidden":{o="WRONG_USER_OR_PASSWORD";break}case r.ECallCause.BAD_MEDIA_DESCRIPTION:{o="BAD_MEDIA_ERROR";break}case r.ECallCause.NOT_FOUND:{o="NOT_FOUND_ERROR";break}default:t!==void 0&&t._ws?.readyState===3?o="WS_CONNECTION_FAILED":A(n)!==void 0&&A(n)!==""&&(o="CONNECT_SERVER_FAILED_BY_LINK")}return o},ee=n=>{let e="";try{e=JSON.stringify(n)}catch(t){r.logger("failed to stringify message",t)}return e},ne=new Error("Unknown error"),te=(n=ne)=>{const{code:e,cause:t,message:o}=n,a=A(n),s={code:"",cause:"",message:""};return typeof o=="object"&&o!==null?s.message=ee(o):o&&(s.message=String(o)),a!==void 0&&a!==""&&(s.link=a),e!==void 0&&e!==""&&(s.code=e),t!==void 0&&t!==""&&(s.cause=t),s},re=Object.freeze(Object.defineProperty({__proto__:null,EErrorTypes:$,getLinkError:A,getTypeFromError:Z,getValuesFromError:te},Symbol.toStringTag,{value:"Module"})),oe=({sessionId:n,remoteAddress:e,isMutedAudio:t,isMutedVideo:o,isRegistered:a,isPresentationCall:s})=>{const c=[],l=t?"0":"1",u=o?"0":"1";return c.push(`X-Vinteo-Mic-State: ${l}`,`X-Vinteo-MainCam-State: ${u}`),(a===!1||a===void 0)&&c.push("X-Vinteo-Purgatory-Call: yes"),n!==void 0&&n!==""&&c.push(`X-Vinteo-Session: ${n}`),s===!0&&c.push("X-Vinteo-Presentation-Call: yes"),e!==void 0&&e!==""&&c.push(`X-Vinteo-Remote: ${e}`),c},se="[@*!|]",ae="_",ce=n=>{let e=n;return e=e.replaceAll(new RegExp(se,"g"),ae),e},ie=({appName:n,appVersion:e,browserName:t,browserVersion:o})=>{const s=`${ce(n)} ${e}`;return`ChromeNew - ${t===void 0?s:`${t} ${o}, ${s}`}`},le=({isUnifiedSdpSemantic:n,appVersion:e,browserName:t,browserVersion:o,appName:a})=>n?ie({appVersion:e,browserName:t,browserVersion:o,appName:a}):"Chrome",H="purgatory",D=n=>n===H,ue=n=>e=>[...e].map(o=>async()=>n(o)),de=async({accumulatedKeys:n,sendKey:e,canRunTask:t})=>{const a=ue(e)(n);return Y.sequentPromises(a,t)},ge=n=>t=>(r.logger("onStartMainCam"),n.on("api:admin-start-main-cam",t)),Se=n=>t=>(r.logger("onStartMic"),n.on("api:admin-start-mic",t)),Ce=n=>t=>(r.logger("onStopMainCam"),n.on("api:admin-stop-main-cam",t)),me=n=>t=>(r.logger("onStopMic"),n.on("api:admin-stop-mic",t)),fe=({sipConnector:n})=>{const e=(g,C)=>({isSyncForced:S})=>{if(S===!0){g();return}C()},t=ge(n),o=Ce(n),a=Se(n),s=me(n);let c,l,u,f;const h=({onStartMainCamForced:g,onStartMainCamNotForced:C,onStopMainCamForced:S,onStopMainCamNotForced:p,onStartMicForced:E,onStartMicNotForced:b,onStopMicForced:O,onStopMicNotForced:v})=>{const T=e(g,C);c=t(T);const P=e(S,p);l=o(P);const _=e(E,b);u=a(_);const m=e(O,v);f=s(m)},d=()=>{c?.(),l?.(),u?.(),f?.()};return{start:g=>{h(g)},stop:()=>{d()}}},he=Object.freeze(Object.defineProperty({__proto__:null,PURGATORY_CONFERENCE_NUMBER:H,createSyncMediaState:fe,createUaParser:B,error:re,getExtraHeaders:oe,getUserAgent:le,hasPurgatory:D,prepareMediaStream:r.prepareMediaStream,sendDtmfAccumulated:de,setEncodingsToSender:r.setEncodingsToSender,setParametersToSender:r.setParametersToSender},Symbol.toStringTag,{value:"Module"})),pe=()=>B().isChrome,U=n=>{if(!x.isCanceledError(n)&&!j.hasCanceledError(n))throw n;return{isSuccessful:!1}},Re=({kind:n,readyState:e})=>n==="video"&&e==="live",k=(n,e,{onEnterPurgatory:t,onEnterConference:o})=>{D(n)?t&&t():o&&o({isSuccessProgressCall:e})},L=(n,e)=>{n(),e&&e()},V=(n,e,t)=>{throw n&&n(),e(),t},Ee=new Set(["on","once","onceRace","wait","off","sendDTMF","hangUp","declineToIncomingCall","sendChannels","checkTelephony","waitChannels","ping","connection","isConfigured","isRegistered"]);class be{on;once;onceRace;wait;off;sendDTMF;hangUp;declineToIncomingCall;sendChannels;checkTelephony;waitChannels;ping;connection;isConfigured;isRegistered;sipConnector;constructor(e){return this.sipConnector=e,new Proxy(this,{get:(t,o,a)=>{if(typeof o=="string"&&Ee.has(o)&&o in this.sipConnector){const c=Reflect.get(this.sipConnector,o,this.sipConnector);return typeof c=="function"?c.bind(this.sipConnector):c}const s=Reflect.get(t,o,a);return typeof s=="function"?s.bind(t):s}})}connectToServer=async e=>{const{userAgent:t,sipWebSocketServerURL:o,sipServerUrl:a,remoteAddress:s,displayName:c,name:l,password:u,isRegisteredUser:f,isDisconnectOnFail:h}=e;return r.logger("connectToServer",e),this.sipConnector.connect({userAgent:t,sipWebSocketServerURL:o,sipServerUrl:a,remoteAddress:s,displayName:c,password:u,user:l,register:f}).then(d=>(r.logger("connectToServer then"),{ua:d,isSuccessful:!0})).catch(async d=>(r.logger("connectToServer catch: error",d),h===!0?this.sipConnector.disconnect().then(()=>U(d)).catch(()=>U(d)):U(d)))};callToServer=async e=>{const{conference:t,mediaStream:o,extraHeaders:a,iceServers:s,contentHint:c,degradationPreference:l,sendEncodings:u,offerToReceiveAudio:f,offerToReceiveVideo:h,directionVideo:d,directionAudio:N,setRemoteStreams:y,onBeforeProgressCall:g,onSuccessProgressCall:C,onEnterPurgatory:S,onEnterConference:p,onFailProgressCall:E,onFinishProgressCall:b,onEndedCall:O,onAddedTransceiver:v}=e,T=this.resolveHandleReadyRemoteStreamsDebounced({onReadyRemoteStreams:y}),P=this.resolveHandleReadyRemoteStreams({onReadyRemoteStreams:()=>{T().catch(r.logger)}});r.logger("callToServer",e);const _=async()=>(r.logger("startCall"),this.sipConnector.call({mediaStream:o,extraHeaders:a,iceServers:s,contentHint:c,offerToReceiveAudio:f,offerToReceiveVideo:h,directionVideo:d,directionAudio:N,degradationPreference:l,onAddedTransceiver:v,sendEncodings:u,number:t,ontrack:P}));let m=!1,R;const M=(r.logger("subscribeEnterConference: onEnterConference",p),this.sipConnector.on("api:enterRoom",({room:i})=>{r.logger("enterRoom",{_room:i,isSuccessProgressCall:m}),R=i,(S??p)&&k(R,m,{onEnterPurgatory:S,onEnterConference:p})})),F=i=>(r.logger("onSuccess"),m=!0,T().catch(r.logger),C&&C({isPurgatory:D(R)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{L(M,O)}),i),w=i=>(r.logger("onFail"),V(E,M,i)),I=()=>{r.logger("onFinish"),b&&b()};return r.logger("onBeforeProgressCall"),g&&g(t),_().then(F).catch(i=>w(i)).finally(I)};disconnectFromServer=async()=>this.sipConnector.disconnect().then(()=>(r.logger("disconnectFromServer: then"),{isSuccessful:!0})).catch(e=>(r.logger("disconnectFromServer: catch",e),{isSuccessful:!1}));answerToIncomingCall=async e=>{const{mediaStream:t,extraHeaders:o,iceServers:a,contentHint:s,degradationPreference:c,sendEncodings:l,offerToReceiveAudio:u,offerToReceiveVideo:f,directionVideo:h,directionAudio:d,setRemoteStreams:N,onBeforeProgressCall:y,onSuccessProgressCall:g,onEnterPurgatory:C,onEnterConference:S,onFailProgressCall:p,onFinishProgressCall:E,onEndedCall:b,onAddedTransceiver:O}=e,v=this.resolveHandleReadyRemoteStreamsDebounced({onReadyRemoteStreams:N}),T=this.resolveHandleReadyRemoteStreams({onReadyRemoteStreams:()=>{v().catch(r.logger)}});r.logger("answerToIncomingCall",e);const P=async()=>this.sipConnector.answerToIncomingCall({mediaStream:t,extraHeaders:o,iceServers:a,contentHint:s,offerToReceiveAudio:u,offerToReceiveVideo:f,directionVideo:h,directionAudio:d,degradationPreference:c,onAddedTransceiver:O,sendEncodings:l,ontrack:T}),_=()=>{const{remoteCallerData:i}=this.sipConnector;return i.incomingNumber};let m=!1,R;const M=(r.logger("subscribeEnterConference: onEnterConference",S),this.sipConnector.on("api:enterRoom",i=>{r.logger("enterRoom",{_room:i,isSuccessProgressCall:m}),R=i,(C??S)&&k(R,m,{onEnterPurgatory:C,onEnterConference:S})})),F=i=>(r.logger("onSuccess"),m=!0,v().catch(r.logger),g&&g({isPurgatory:D(R)}),this.sipConnector.onceRace(["call:ended","call:failed"],()=>{L(M,b)}),i),w=i=>(r.logger("onFail"),V(p,M,i)),I=()=>{r.logger("onFinish"),E&&E()};if(r.logger("onBeforeProgressCall"),y){const i=_();y(i)}return P().then(F).catch(i=>w(i)).finally(I)};updatePresentation=async({mediaStream:e,isP2P:t,contentHint:o,degradationPreference:a,sendEncodings:s,onAddedTransceiver:c})=>(r.logger("updatePresentation"),this.sipConnector.updatePresentation(e,{isP2P:t,contentHint:o,degradationPreference:a,onAddedTransceiver:c,sendEncodings:s}));startPresentation=async({mediaStream:e,isP2P:t,contentHint:o,degradationPreference:a,sendEncodings:s,callLimit:c,onAddedTransceiver:l})=>(r.logger("startPresentation"),this.sipConnector.startPresentation(e,{isP2P:t,contentHint:o,callLimit:c,degradationPreference:a,onAddedTransceiver:l,sendEncodings:s}));stopShareSipConnector=async({isP2P:e=!1}={})=>(r.logger("stopShareSipConnector"),this.sipConnector.stopPresentation({isP2P:e}).catch(t=>{r.logger(t)}));sendRefusalToTurnOnMic=async()=>{r.logger("sendRefusalToTurnOnMic"),await this.sipConnector.sendRefusalToTurnOnMic().catch(e=>{r.logger("sendRefusalToTurnOnMic: error",e)})};sendRefusalToTurnOnCam=async()=>{r.logger("sendRefusalToTurnOnCam"),await this.sipConnector.sendRefusalToTurnOnCam().catch(e=>{r.logger("sendRefusalToTurnOnCam: error",e)})};sendMediaState=async({isEnabledCam:e,isEnabledMic:t})=>{r.logger("sendMediaState"),await this.sipConnector.sendMediaState({cam:e,mic:t})};replaceMediaStream=async(e,{deleteExisting:t,addMissing:o,forceRenegotiation:a,contentHint:s,degradationPreference:c,sendEncodings:l,onAddedTransceiver:u})=>(r.logger("replaceMediaStream"),this.sipConnector.replaceMediaStream(e,{deleteExisting:t,addMissing:o,forceRenegotiation:a,contentHint:s,degradationPreference:c,onAddedTransceiver:u,sendEncodings:l}));askPermissionToEnableCam=async()=>{r.logger("askPermissionToEnableCam"),await this.sipConnector.askPermissionToEnableCam()};resolveHandleReadyRemoteStreamsDebounced=({onReadyRemoteStreams:e})=>K.debounce(()=>{const t=this.sipConnector.getRemoteStreams();r.logger("remoteStreams",t),t&&e(t)},200);resolveHandleReadyRemoteStreams=({onReadyRemoteStreams:e})=>({track:t})=>{Re(t)&&e()};getRemoteStreams=()=>(r.logger("getRemoteStreams"),this.sipConnector.getRemoteStreams());onUseLicense=e=>(r.logger("onUseLicense"),this.sipConnector.on("api:useLicense",e));onMustStopPresentation=e=>(r.logger("onMustStopPresentation"),this.sipConnector.on("api:mustStopPresentation",e));onMoveToSpectators=e=>(r.logger("onMoveToSpectators"),this.sipConnector.on("api:participant:move-request-to-spectators",e));onMoveToParticipants=e=>(r.logger("onMoveToParticipants"),this.sipConnector.on("api:participant:move-request-to-participants",e));onStats=e=>(r.logger("onStats"),this.sipConnector.on("stats:collected",e));offStats=e=>{r.logger("offStats"),this.sipConnector.off("stats:collected",e)}}var W=(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))(W||{});exports.ECallCause=r.ECallCause;exports.EStatsTypes=r.EStatsTypes;exports.EUseLicense=r.EUseLicense;exports.SipConnector=r.SipConnector;exports.StatsPeerConnection=r.StatsPeerConnection;exports.disableDebug=r.disableDebug;exports.enableDebug=r.enableDebug;exports.getCodecFromSender=r.getCodecFromSender;exports.hasCanceledStartPresentationError=r.hasCanceledStartPresentationError;exports.EMimeTypesVideoCodecs=W;exports.SipConnectorFacade=be;exports.hasAvailableStats=pe;exports.hasCanceledCallError=J;exports.tools=he;
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  export { EUseLicense } from './ApiManager';
2
2
  export { ECallCause, hasCanceledCallError } from './CallManager';
3
3
  export type { TCustomError } from './CallManager';
4
- export { debug, disableDebug, enableDebug } from './logger';
4
+ export { disableDebug, enableDebug } from './logger';
5
5
  export { hasCanceledStartPresentationError } from './PresentationManager';
6
6
  export type { TContentHint } from './PresentationManager';
7
7
  export { SipConnector } from './SipConnector';
@@ -12,4 +12,3 @@ export * as tools from './tools';
12
12
  export { EMimeTypesVideoCodecs } from './types';
13
13
  export type { TJsSIP } from './types';
14
14
  export { default as getCodecFromSender } from './utils/getCodecFromSender';
15
- export { resolveVideoSendingBalancer, VideoSendingBalancer } from './VideoSendingBalancer';