sip-connector 6.9.2 → 6.10.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.
- package/dist/SipConnector.d.ts +3 -0
- package/dist/SipConnector.d.ts.map +1 -1
- package/dist/SipConnector.js +23 -0
- package/dist/SipConnector.js.map +1 -1
- package/dist/headers.d.ts +2 -0
- package/dist/headers.d.ts.map +1 -1
- package/dist/headers.js +3 -1
- package/dist/headers.js.map +1 -1
- package/dist/index.es5.js +1 -1
- package/dist/index.es5.js.map +1 -1
- package/dist/index.umd.js +1 -1
- package/dist/index.umd.js.map +1 -1
- package/package.json +12 -12
package/dist/index.umd.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.umd.js","sources":["../src/utils/getCodecFromSender.ts","../src/utils/findSenderByStream.ts","../src/videoSendingBalancer/setEncodingsToSender.ts","../src/constants.ts","../src/eventNames.ts","../src/causes.ts","../src/headers.ts","../src/utils.ts","../src/SipConnector.ts","../src/utils/findVideoSender.ts","../src/videoSendingBalancer/getMaxBitrateByWidth.ts","../src/videoSendingBalancer/processSender.ts","../src/getExtraHeadersRemoteAddress.ts","../src/utils/errors.ts","../src/videoSendingBalancer/scaleBitrate.ts","../src/videoSendingBalancer/index.ts","../src/videoSendingBalancer/balance.ts"],"sourcesContent":["const statsReportToArray = (results: RTCStatsReport) => {\n return [...results.keys()].map((key) => {\n return results.get(key);\n });\n};\n\nconst findInResultByType = (results: RTCStatsReport, type: string) => {\n return statsReportToArray(results).find((value) => {\n return value.type === type;\n });\n};\n\nconst getCodecFromSender = (sender: RTCRtpSender): Promise<string | undefined> => {\n return sender.getStats().then((stats: RTCStatsReport) => {\n const codec = findInResultByType(stats, 'codec');\n\n return codec?.mimeType;\n });\n};\n\nexport default getCodecFromSender;\n","const findSenderByStream = (\n senders: RTCRtpSender[],\n stream: MediaStream\n): RTCRtpSender | undefined => {\n return senders.find((sender) => {\n return sender.track && stream.getTracks().includes(sender.track);\n });\n};\n\nexport default findSenderByStream;\n","export type TOnSetParameters = (parameters: RTCRtpSendParameters) => void;\nexport type TResult = { parameters: RTCRtpSendParameters; isChanged: boolean };\n\nconst MIN_SCALE_RESOLUTION_DOWN_BY = 1;\nconst resolveHasNeedToUpdateItemEncoding = (defaultValue: number | undefined) => {\n return (itemEncodingTarget: typeof defaultValue, itemEncodingCurrent?: number): boolean => {\n const isChangedDefaultScale =\n itemEncodingCurrent === undefined && itemEncodingTarget !== defaultValue;\n const isChangedPrevScale =\n itemEncodingCurrent !== undefined && itemEncodingTarget !== itemEncodingCurrent;\n\n const isNeedToChange = isChangedPrevScale || isChangedDefaultScale;\n\n return isNeedToChange;\n };\n};\n\nconst hasNeedToUpdateScaleResolutionDownBy = resolveHasNeedToUpdateItemEncoding(\n MIN_SCALE_RESOLUTION_DOWN_BY\n);\nconst performUpdateScaleResolutionDownBy = (\n scaleResolutionDownByTarget?: number,\n scaleResolutionDownByCurrent?: number\n): number | undefined => {\n const scaleResolutionDownByTargetParsed: number | null =\n scaleResolutionDownByTarget !== undefined\n ? Math.max(scaleResolutionDownByTarget, MIN_SCALE_RESOLUTION_DOWN_BY)\n : null;\n\n if (\n scaleResolutionDownByTargetParsed !== null &&\n hasNeedToUpdateScaleResolutionDownBy(\n scaleResolutionDownByTargetParsed,\n scaleResolutionDownByCurrent\n )\n ) {\n return scaleResolutionDownByTargetParsed;\n }\n\n return undefined;\n};\n\nconst hasNeedToUpdateMaxBitrate = resolveHasNeedToUpdateItemEncoding(undefined);\nconst performUpdateMaxBitrate = (\n maxBitrateTarget?: number,\n maxBitrateCurrent?: number\n): number | undefined => {\n if (hasNeedToUpdateMaxBitrate(maxBitrateTarget, maxBitrateCurrent)) {\n return maxBitrateTarget;\n }\n\n return undefined;\n};\n\nconst setEncodingsToSender = (\n sender: RTCRtpSender,\n encodingsTarget: { scaleResolutionDownBy?: number; maxBitrate?: number },\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const parameters: RTCRtpSendParameters = sender.getParameters();\n\n if (!parameters.encodings || parameters.encodings.length === 0) {\n parameters.encodings = [{}];\n }\n\n const [encoding] = parameters.encodings;\n const scaleResolutionDownByCurrent = encoding.scaleResolutionDownBy;\n const scaleResolutionDownByTarget = performUpdateScaleResolutionDownBy(\n encodingsTarget.scaleResolutionDownBy,\n scaleResolutionDownByCurrent\n );\n\n let isChanged = false;\n\n if (scaleResolutionDownByTarget !== undefined) {\n parameters.encodings[0].scaleResolutionDownBy = scaleResolutionDownByTarget;\n isChanged = true;\n }\n\n const maxBitrateCurrent = encoding.maxBitrate;\n const maxBitrateTarget = performUpdateMaxBitrate(encodingsTarget.maxBitrate, maxBitrateCurrent);\n\n if (maxBitrateTarget !== undefined) {\n parameters.encodings[0].maxBitrate = maxBitrateTarget;\n isChanged = true;\n }\n\n if (isChanged) {\n if (onSetParameters) {\n onSetParameters(parameters);\n }\n\n return sender.setParameters(parameters).then(() => {\n return { parameters, isChanged };\n });\n }\n\n return Promise.resolve({ parameters, isChanged });\n};\n\nexport default setEncodingsToSender;\n","export const INCOMING_CALL = 'incomingCall';\nexport const DECLINED_INCOMING_CALL = 'declinedIncomingCall';\nexport const FAILED_INCOMING_CALL = 'failedIncomingCall';\nexport const TERMINATED_INCOMING_CALL = 'terminatedIncomingCall';\nexport const CONNECTING = 'connecting';\nexport const CONNECTED = 'connected';\nexport const DISCONNECTED = 'disconnected';\nexport const NEW_RTC_SESSION = 'newRTCSession';\nexport const REGISTERED = 'registered';\nexport const UNREGISTERED = 'unregistered';\nexport const REGISTRATION_FAILED = 'registrationFailed';\nexport const NEW_MESSAGE = 'newMessage';\nexport const SIP_EVENT = 'sipEvent';\nexport const AVAILABLE_SECOND_REMOTE_STREAM_EVENT = 'availableSecondRemoteStream';\nexport const NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT = 'notAvailableSecondRemoteStream';\nexport const MUST_STOP_PRESENTATION_EVENT = 'mustStopPresentation';\nexport const SHARE_STATE = 'shareState';\nexport const ENTER_ROOM = 'enterRoom';\nexport const USE_LICENSE = 'useLicense';\nexport const PEER_CONNECTION_CONFIRMED = 'peerconnection:confirmed';\nexport const PEER_CONNECTION_ONTRACK = 'peerconnection:ontrack';\nexport const CHANNELS = 'channels';\nexport const CHANNELS_NOTIFY = 'channels:notify';\nexport const ENDED_FROM_SERVER = 'ended:fromserver';\nexport const MAIN_CAM_CONTROL = 'main-cam-control';\nexport const ADMIN_STOP_MAIN_CAM = 'admin-stop-main-cam';\nexport const ADMIN_START_MAIN_CAM = 'admin-start-main-cam';\nexport const ADMIN_STOP_MIC = 'admin-stop-mic';\nexport const ADMIN_START_MIC = 'admin-start-mic';\nexport const ADMIN_FORCE_SYNC_MEDIA_STATE = 'admin-force-sync-media-state';\nexport const PARTICIPANT_ADDED_TO_LIST_MODERATORS = 'participant:added-to-list-moderators';\nexport const PARTICIPANT_REMOVED_FROM_LIST_MODERATORS = 'participant:removed-from-list-moderators';\nexport const PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE = 'participant:move-request-to-conference';\nexport const PARTICIPANT_MOVE_REQUEST_TO_STREAM = 'participant:move-request-to-stream';\nexport const PARTICIPANT_CANCELLING_WORD_REQUEST = 'participant:canceling-word-request';\nexport const WEBCAST_STARTED = 'webcast:started';\nexport const WEBCAST_STOPPED = 'webcast:stopped';\nexport const ACCOUNT_CHANGED = 'account:changed';\nexport const ACCOUNT_DELETED = 'account:deleted';\nexport const CONFERENCE_PARTICIPANT_TOKEN_ISSUED = 'conference:participant-token-issued';\nexport const ENDED = 'ended';\nexport const SENDING = 'sending';\nexport const REINVITE = 'reinvite';\nexport const REPLACES = 'replaces';\nexport const REFER = 'refer';\nexport const PROGRESS = 'progress';\nexport const ACCEPTED = 'accepted';\nexport const CONFIRMED = 'confirmed';\nexport const PEER_CONNECTION = 'peerconnection';\nexport const FAILED = 'failed';\nexport const MUTED = 'muted';\nexport const UNMUTED = 'unmuted';\nexport const NEW_DTMF = 'newDTMF';\nexport const NEW_INFO = 'newInfo';\nexport const HOLD = 'hold';\nexport const UNHOLD = 'unhold';\nexport const UPDATE = 'update';\nexport const SDP = 'sdp';\nexport const ICE_CANDIDATE = 'icecandidate';\nexport const GET_USER_MEDIA_FAILED = 'getusermediafailed';\nexport const PEER_CONNECTION_CREATE_OFFER_FAILED = 'peerconnection:createofferfailed';\nexport const PEER_CONNECTION_CREATE_ANSWER_FAILED = 'peerconnection:createanswerfailed';\nexport const PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED =\n 'peerconnection:setlocaldescriptionfailed';\nexport const PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED =\n 'peerconnection:setremotedescriptionfailed';\nexport const PRESENTATION_START = 'presentation:start';\nexport const PRESENTATION_STARTED = 'presentation:started';\nexport const PRESENTATION_END = 'presentation:end';\nexport const PRESENTATION_ENDED = 'presentation:ended';\nexport const PRESENTATION_FAILED = 'presentation:failed';\n","import {\n INCOMING_CALL,\n DECLINED_INCOMING_CALL,\n TERMINATED_INCOMING_CALL,\n FAILED_INCOMING_CALL,\n CONNECTING,\n CONNECTED,\n DISCONNECTED,\n NEW_RTC_SESSION,\n REGISTERED,\n UNREGISTERED,\n REGISTRATION_FAILED,\n NEW_MESSAGE,\n SIP_EVENT,\n AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n MUST_STOP_PRESENTATION_EVENT,\n SHARE_STATE,\n ENTER_ROOM,\n USE_LICENSE,\n PEER_CONNECTION_CONFIRMED,\n PEER_CONNECTION_ONTRACK,\n CHANNELS,\n CHANNELS_NOTIFY,\n ENDED_FROM_SERVER,\n MAIN_CAM_CONTROL,\n ADMIN_START_MAIN_CAM,\n ADMIN_STOP_MAIN_CAM,\n ADMIN_STOP_MIC,\n ADMIN_START_MIC,\n ADMIN_FORCE_SYNC_MEDIA_STATE,\n PARTICIPANT_ADDED_TO_LIST_MODERATORS,\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE,\n PARTICIPANT_MOVE_REQUEST_TO_STREAM,\n PARTICIPANT_CANCELLING_WORD_REQUEST,\n WEBCAST_STARTED,\n WEBCAST_STOPPED,\n ACCOUNT_CHANGED,\n ACCOUNT_DELETED,\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n ENDED,\n SENDING,\n REINVITE,\n REPLACES,\n REFER,\n PROGRESS,\n ACCEPTED,\n CONFIRMED,\n PEER_CONNECTION,\n FAILED,\n MUTED,\n UNMUTED,\n NEW_DTMF,\n NEW_INFO,\n HOLD,\n UNHOLD,\n UPDATE,\n SDP,\n ICE_CANDIDATE,\n GET_USER_MEDIA_FAILED,\n PEER_CONNECTION_CREATE_OFFER_FAILED,\n PEER_CONNECTION_CREATE_ANSWER_FAILED,\n PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED,\n PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED,\n PRESENTATION_START,\n PRESENTATION_STARTED,\n PRESENTATION_END,\n PRESENTATION_ENDED,\n PRESENTATION_FAILED,\n} from './constants';\n\nexport const UA_SYNTHETICS_EVENT_NAMES = [\n INCOMING_CALL,\n DECLINED_INCOMING_CALL,\n TERMINATED_INCOMING_CALL,\n FAILED_INCOMING_CALL,\n PARTICIPANT_CANCELLING_WORD_REQUEST,\n PARTICIPANT_MOVE_REQUEST_TO_STREAM,\n PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE,\n CHANNELS_NOTIFY,\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n ACCOUNT_CHANGED,\n ACCOUNT_DELETED,\n WEBCAST_STARTED,\n WEBCAST_STOPPED,\n PARTICIPANT_ADDED_TO_LIST_MODERATORS,\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n] as const;\n\nexport const UA_JSSIP_EVENT_NAMES = [\n CONNECTING,\n CONNECTED,\n DISCONNECTED,\n NEW_RTC_SESSION,\n REGISTERED,\n UNREGISTERED,\n REGISTRATION_FAILED,\n NEW_MESSAGE,\n SIP_EVENT,\n] as const;\n\nexport const SESSION_SYNTHETICS_EVENT_NAMES = [\n AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n MUST_STOP_PRESENTATION_EVENT,\n SHARE_STATE,\n ENTER_ROOM,\n USE_LICENSE,\n PEER_CONNECTION_CONFIRMED,\n PEER_CONNECTION_ONTRACK,\n CHANNELS,\n ENDED_FROM_SERVER,\n MAIN_CAM_CONTROL,\n ADMIN_START_MAIN_CAM,\n ADMIN_STOP_MAIN_CAM,\n ADMIN_STOP_MIC,\n ADMIN_START_MIC,\n ADMIN_FORCE_SYNC_MEDIA_STATE,\n] as const;\n\nexport const SESSION_JSSIP_EVENT_NAMES = [\n ENDED,\n CONNECTING,\n SENDING,\n REINVITE,\n REPLACES,\n REFER,\n PROGRESS,\n ACCEPTED,\n CONFIRMED,\n PEER_CONNECTION,\n FAILED,\n MUTED,\n UNMUTED,\n NEW_DTMF,\n NEW_INFO,\n HOLD,\n UNHOLD,\n UPDATE,\n SDP,\n ICE_CANDIDATE,\n GET_USER_MEDIA_FAILED,\n PEER_CONNECTION_CREATE_OFFER_FAILED,\n PEER_CONNECTION_CREATE_ANSWER_FAILED,\n PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED,\n PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED,\n PRESENTATION_START,\n PRESENTATION_STARTED,\n PRESENTATION_END,\n PRESENTATION_ENDED,\n PRESENTATION_FAILED,\n] as const;\n\nexport const UA_EVENT_NAMES = [...UA_JSSIP_EVENT_NAMES, ...UA_SYNTHETICS_EVENT_NAMES];\n\nexport const SESSION_EVENT_NAMES = [\n ...SESSION_JSSIP_EVENT_NAMES,\n ...SESSION_SYNTHETICS_EVENT_NAMES,\n] as const;\n\nexport type TEventUA = (typeof UA_EVENT_NAMES)[number];\n\nexport type TEventSession = (typeof SESSION_EVENT_NAMES)[number];\n","// Generic error causes.\nexport const CONNECTION_ERROR = 'Connection Error';\nexport const REQUEST_TIMEOUT = 'Request Timeout';\nexport const SIP_FAILURE_CODE = 'SIP Failure Code';\nexport const INTERNAL_ERROR = 'Internal Error';\n// SIP error causes.\nexport const BUSY = 'Busy';\nexport const REJECTED = 'Rejected';\nexport const REDIRECTED = 'Redirected';\nexport const UNAVAILABLE = 'Unavailable';\nexport const NOT_FOUND = 'Not Found';\nexport const ADDRESS_INCOMPLETE = 'Address Incomplete';\nexport const INCOMPATIBLE_SDP = 'Incompatible SDP';\nexport const MISSING_SDP = 'Missing SDP';\nexport const AUTHENTICATION_ERROR = 'Authentication Error';\n// Session error causes.\nexport const BYE = 'Terminated';\nexport const WEBRTC_ERROR = 'WebRTC Error';\nexport const CANCELED = 'Canceled';\nexport const NO_ANSWER = 'No Answer';\nexport const EXPIRES = 'Expires';\nexport const NO_ACK = 'No ACK';\nexport const DIALOG_ERROR = 'Dialog Error';\nexport const USER_DENIED_MEDIA_ACCESS = 'User Denied Media Access';\nexport const BAD_MEDIA_DESCRIPTION = 'Bad Media Description';\nexport const RTP_TIMEOUT = 'RTP Timeout';\n","export const HEADER_CONTENT_TYPE_NAME = 'content-type';\n\nexport const HEADER_CONTENT_ENTER_ROOM = 'x-webrtc-enter-room';\nexport const CONTENT_TYPE_SHARE_STATE = 'application/vinteo.webrtc.sharedesktop';\nexport const CONTENT_TYPE_ENTER_ROOM = 'application/vinteo.webrtc.roomname';\nexport const CONTENT_TYPE_CHANNELS = 'application/vinteo.webrtc.channels';\nexport const CONTENT_TYPE_MEDIA_STATE = 'application/vinteo.webrtc.mediastate';\nexport const CONTENT_TYPE_MAIN_CAM = 'application/vinteo.webrtc.maincam';\nexport const CONTENT_TYPE_MIC = 'application/vinteo.webrtc.mic';\nexport const CONTENT_TYPE_USE_LICENSE = 'application/vinteo.webrtc.uselic';\nexport const HEADER_CONTENT_USE_LICENSE = 'X-WEBRTC-USE-LICENSE';\nexport const HEADER_INPUT_CHANNELS = 'X-WEBRTC-INPUT-CHANNELS';\nexport const HEADER_OUTPUT_CHANNELS = 'X-WEBRTC-OUTPUT-CHANNELS';\nexport const HEADER_MAIN_CAM = 'X-WEBRTC-MAINCAM';\nexport const HEADER_MIC = 'X-WEBRTC-MIC';\nexport const HEADER_MEDIA_SYNC = 'X-WEBRTC-SYNC';\nexport const HEADER_MAIN_CAM_RESOLUTION = 'X-WEBRTC-MAINCAM-RESOLUTION';\nexport const HEADER_MEDIA_STATE = 'X-WEBRTC-MEDIA-STATE';\nexport const HEADER_MAIN_CAM_STATE = 'X-Vinteo-MainCam-State';\nexport const HEADER_MIC_STATE = 'X-Vinteo-Mic-State';\n\nexport const CONTENT_TYPE_NOTIFY = 'application/vinteo.webrtc.notify';\nexport const HEADER_NOTIFY = 'X-VINTEO-NOTIFY';\n\nexport const HEADER_CONTENT_SHARE_STATE = 'x-webrtc-share-state';\nexport const HEADER_START_PRESENTATION = `${HEADER_CONTENT_SHARE_STATE}: LETMESTARTPRESENTATION`;\nexport const HEADER_STOP_PRESENTATION = `${HEADER_CONTENT_SHARE_STATE}: STOPPRESENTATION`;\nexport const AVAILABLE_SECOND_REMOTE_STREAM = 'YOUCANRECEIVECONTENT';\nexport const NOT_AVAILABLE_SECOND_REMOTE_STREAM = 'CONTENTEND';\nexport const MUST_STOP_PRESENTATION = 'YOUMUSTSTOPSENDCONTENT';\nexport const HEADER_START_PRESENTATION_P2P = `${HEADER_CONTENT_SHARE_STATE}: ${AVAILABLE_SECOND_REMOTE_STREAM}`;\nexport const HEADER_STOP_PRESENTATION_P2P = `${HEADER_CONTENT_SHARE_STATE}: ${NOT_AVAILABLE_SECOND_REMOTE_STREAM}`;\n\nexport const HEADER_CONTENT_ENABLE_MEDIA_DEVICE = 'X-WEBRTC-REQUEST-ENABLE-MEDIA-DEVICE';\nexport const HEADER_ENABLE_MAIN_CAM = `${HEADER_CONTENT_ENABLE_MEDIA_DEVICE}: LETMESTARTMAINCAM`;\n","export function resolveSipUrl(serverUrl: string): (string) => string {\n return (id: string): string => {\n return `sip:${id}@${serverUrl}`;\n };\n}\n\nconst resolveRandomInt = (min: number, max: number) => {\n return () => {\n return Math.floor(Math.random() * (max - min)) + min;\n };\n};\nexport const parseDisplayName = (displayName: string) => {\n return displayName.trim().replace(/ /g, '_');\n};\nexport const generateUserId = resolveRandomInt(100000, 99999999);\n\nexport const prepareMediaStream = (\n mediaStream?: MediaStream,\n {\n videoMode,\n audioMode,\n }: {\n videoMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n audioMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n } = {}\n): MediaStream | undefined => {\n if (!mediaStream || (videoMode === 'recvonly' && audioMode === 'recvonly')) {\n return undefined;\n }\n\n const audioTracks = audioMode === 'recvonly' ? [] : mediaStream.getAudioTracks();\n const videoTracks = videoMode === 'recvonly' ? [] : mediaStream.getVideoTracks();\n const tracks = [...audioTracks, ...videoTracks];\n const newStream = new MediaStream(tracks);\n\n newStream.getTracks = () => {\n return [...newStream.getAudioTracks(), ...newStream.getVideoTracks()]; // for garante audio first order\n };\n\n return newStream;\n};\n\nexport const hasVideoTracks = (remoteTracks: MediaStreamTrack[]): boolean => {\n const isVideoTracksExists = remoteTracks.some((remoteTrack: MediaStreamTrack): boolean => {\n const { kind } = remoteTrack;\n\n return kind === 'video';\n });\n\n return isVideoTracksExists;\n};\n","import type { UA, URI, WebSocketInterface } from '@krivega/jssip';\nimport type { IncomingRequest } from '@krivega/jssip/lib/SIPMessage';\nimport type RTCSession from '@krivega/jssip/lib/RTCSession';\nimport type { IncomingInfoEvent, OutgoingInfoEvent } from '@krivega/jssip/lib/RTCSession';\nimport type {\n IncomingRTCSessionEvent,\n RegisteredEvent,\n UnRegisteredEvent,\n} from '@krivega/jssip/lib/UA';\nimport { CancelableRequest, isCanceledError } from '@krivega/cancelable-promise';\nimport Events from 'events-constructor';\nimport scaleBitrate from './videoSendingBalancer/scaleBitrate';\nimport {\n UA_EVENT_NAMES,\n UA_JSSIP_EVENT_NAMES,\n SESSION_EVENT_NAMES,\n SESSION_JSSIP_EVENT_NAMES,\n} from './eventNames';\nimport type { TEventUA, TEventSession } from './eventNames';\nimport { REQUEST_TIMEOUT, REJECTED, BYE, CANCELED } from './causes';\nimport {\n HEADER_CONTENT_SHARE_STATE,\n HEADER_CONTENT_ENTER_ROOM,\n HEADER_CONTENT_TYPE_NAME,\n CONTENT_TYPE_SHARE_STATE,\n CONTENT_TYPE_ENTER_ROOM,\n CONTENT_TYPE_CHANNELS,\n CONTENT_TYPE_MEDIA_STATE,\n CONTENT_TYPE_MAIN_CAM,\n CONTENT_TYPE_MIC,\n CONTENT_TYPE_USE_LICENSE,\n HEADER_CONTENT_USE_LICENSE,\n HEADER_MEDIA_SYNC,\n HEADER_INPUT_CHANNELS,\n HEADER_OUTPUT_CHANNELS,\n HEADER_MEDIA_STATE,\n HEADER_MAIN_CAM_STATE,\n HEADER_MIC_STATE,\n HEADER_ENABLE_MAIN_CAM,\n HEADER_START_PRESENTATION,\n HEADER_STOP_PRESENTATION,\n HEADER_MAIN_CAM,\n HEADER_MIC,\n HEADER_MAIN_CAM_RESOLUTION,\n CONTENT_TYPE_NOTIFY,\n HEADER_NOTIFY,\n AVAILABLE_SECOND_REMOTE_STREAM,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM,\n MUST_STOP_PRESENTATION,\n HEADER_START_PRESENTATION_P2P,\n HEADER_STOP_PRESENTATION_P2P,\n} from './headers';\nimport getExtraHeadersRemoteAddress from './getExtraHeadersRemoteAddress';\nimport {\n generateUserId,\n hasVideoTracks,\n parseDisplayName,\n prepareMediaStream,\n resolveSipUrl,\n} from './utils';\nimport { hasDeclineResponseFromServer } from './utils/errors';\nimport {\n AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n MUST_STOP_PRESENTATION_EVENT,\n INCOMING_CALL,\n DECLINED_INCOMING_CALL,\n FAILED_INCOMING_CALL,\n TERMINATED_INCOMING_CALL,\n CONNECTING,\n CONNECTED,\n DISCONNECTED,\n NEW_RTC_SESSION,\n REGISTERED,\n UNREGISTERED,\n REGISTRATION_FAILED,\n SIP_EVENT,\n SHARE_STATE,\n ENTER_ROOM,\n USE_LICENSE,\n PEER_CONNECTION_CONFIRMED,\n PEER_CONNECTION_ONTRACK,\n CHANNELS,\n CHANNELS_NOTIFY,\n ENDED_FROM_SERVER,\n MAIN_CAM_CONTROL,\n ADMIN_START_MAIN_CAM,\n ADMIN_STOP_MAIN_CAM,\n ADMIN_STOP_MIC,\n ADMIN_START_MIC,\n ADMIN_FORCE_SYNC_MEDIA_STATE,\n PARTICIPANT_ADDED_TO_LIST_MODERATORS,\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE,\n PARTICIPANT_MOVE_REQUEST_TO_STREAM,\n PARTICIPANT_CANCELLING_WORD_REQUEST,\n WEBCAST_STARTED,\n WEBCAST_STOPPED,\n ACCOUNT_CHANGED,\n ACCOUNT_DELETED,\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n ENDED,\n CONFIRMED,\n PEER_CONNECTION,\n FAILED,\n NEW_DTMF,\n NEW_INFO,\n PRESENTATION_ENDED,\n PRESENTATION_FAILED,\n} from './constants';\n\nconst BUSY_HERE_STATUS_CODE = 486;\nconst REQUEST_TERMINATED_STATUS_CODE = 487;\nconst ORIGINATOR_LOCAL = 'local';\nconst ORIGINATOR_REMOTE = 'remote';\n\nexport enum EEventsMainCAM {\n PAUSE_MAIN_CAM = 'PAUSEMAINCAM',\n RESUME_MAIN_CAM = 'RESUMEMAINCAM',\n MAX_MAIN_CAM_RESOLUTION = 'MAXMAINCAMRESOLUTION',\n ADMIN_STOP_MAIN_CAM = 'ADMINSTOPMAINCAM',\n ADMIN_START_MAIN_CAM = 'ADMINSTARTMAINCAM',\n}\n\nexport enum EEventsMic {\n ADMIN_STOP_MIC = 'ADMINSTOPMIC',\n ADMIN_START_MIC = 'ADMINSTARTMIC',\n}\n\nexport enum EEventsSyncMediaState {\n ADMIN_SYNC_FORCED = '1',\n ADMIN_SYNC_NOT_FORCED = '0',\n}\n\nexport enum EUseLicense {\n AUDIO = 'AUDIO',\n VIDEO = 'VIDEO',\n AUDIOPLUSPRESENTATION = 'AUDIOPLUSPRESENTATION',\n}\n\nexport interface ICustomError extends Error {\n originator?: string;\n cause?: unknown;\n message: any;\n socket?: any;\n url?: string;\n code?: string;\n}\n\nexport const hasCanceledCallError = (error: ICustomError = new Error()): boolean => {\n const { originator, cause } = error;\n\n if (isCanceledError(error)) {\n return true;\n }\n\n if (typeof cause === 'string') {\n return (\n cause === REQUEST_TIMEOUT ||\n cause === REJECTED ||\n (originator === ORIGINATOR_LOCAL && (cause === CANCELED || cause === BYE))\n );\n }\n\n return false;\n};\n\nconst moduleName = 'SipConnector';\n\nexport type TJsSIP = {\n UA: typeof UA;\n WebSocketInterface: typeof WebSocketInterface;\n};\n\ntype TChannels = {\n inputChannels: string;\n outputChannels: string;\n};\n\ntype TMediaState = {\n cam: boolean;\n mic: boolean;\n};\n\ntype TParametersModeratorsList = {\n conference: string;\n};\n\ntype TParametersWebcast = {\n conference: string;\n type: string;\n};\n\ntype TParametersConferenceParticipantTokenIssued = {\n conference: string;\n participant: string;\n jwt: string;\n};\n\ntype TOptionsInfoMediaState = {\n noTerminateWhenError: boolean;\n};\n\nconst CMD_CHANNELS = 'channels' as const;\nconst CMD_WEBCAST_STARTED = 'WebcastStarted' as const;\nconst CMD_WEBCAST_STOPPED = 'WebcastStopped' as const;\nconst CMD_ACCOUNT_CHANGED = 'accountChanged' as const;\nconst CMD_ACCOUNT_DELETED = 'accountDeleted' as const;\nconst CMD_ADDED_TO_LIST_MODERATORS = 'addedToListModerators' as const;\nconst CMD_REMOVED_FROM_LIST_MODERATORS = 'removedFromListModerators' as const;\nconst CMD_MOVE_REQUEST_TO_CONFERENCE = 'WebcastParticipationAccepted' as const;\nconst CMD_CANCELLING_WORD_REQUEST = 'WebcastParticipationRejected' as const;\nconst CMD_MOVE_REQUEST_TO_STREAM = 'ParticipantMovedToWebcast' as const;\nconst CMD_CONFERENCE_PARTICIPANT_TOKEN_ISSUED = 'ConferenceParticipantTokenIssued' as const;\n\ntype TAddedToListModeratorsInfoNotify = {\n cmd: typeof CMD_ADDED_TO_LIST_MODERATORS;\n conference: string;\n};\ntype TRemovedFromListModeratorsInfoNotify = {\n cmd: typeof CMD_REMOVED_FROM_LIST_MODERATORS;\n conference: string;\n};\ntype TMoveRequestToConferenceInfoNotify = {\n cmd: typeof CMD_MOVE_REQUEST_TO_CONFERENCE;\n body: { conference: string };\n};\ntype TCancelingWordRequestInfoNotify = {\n cmd: typeof CMD_CANCELLING_WORD_REQUEST;\n body: { conference: string };\n};\ntype TMoveRequestToStreamInfoNotify = {\n cmd: typeof CMD_MOVE_REQUEST_TO_STREAM;\n body: { conference: string };\n};\n\ntype TConferenceParticipantTokenIssued = {\n cmd: typeof CMD_CONFERENCE_PARTICIPANT_TOKEN_ISSUED;\n body: { conference: string; participant: string; jwt: string };\n};\n\ntype TWebcastInfoNotify = {\n cmd: typeof CMD_WEBCAST_STARTED;\n body: { conference: string; type: string };\n};\ntype TChannelsInfoNotify = { cmd: typeof CMD_CHANNELS; input: string; output: string };\ntype TInfoNotify = Omit<\n TChannelsInfoNotify | TAddedToListModeratorsInfoNotify | TRemovedFromListModeratorsInfoNotify,\n 'cmd'\n> & { cmd: string };\n\ntype TOptionsExtraHeaders = {\n extraHeaders?: string[];\n};\n\ntype TOntrack = (track: RTCTrackEvent) => void;\n\ntype TParametersConnection = {\n displayName?: string;\n user?: string;\n password?: string;\n register?: boolean;\n sipServerUrl: string;\n sipWebSocketServerURL: string;\n remoteAddress?: string;\n sdpSemantics?: 'plan-b' | 'unified-plan';\n sessionTimers?: boolean;\n registerExpires?: number;\n connectionRecoveryMinInterval?: number;\n connectionRecoveryMaxInterval?: number;\n userAgent?: string;\n} & TOptionsExtraHeaders;\n\ntype TConnect = (parameters: TParametersConnection) => Promise<UA>;\ntype TCreateUa = (parameters: TParametersConnection) => Promise<UA>;\ntype TStart = () => Promise<UA>;\ntype TSet = ({\n displayName,\n password,\n}: {\n displayName?: string;\n password?: string;\n}) => Promise<boolean>;\n\ntype TDegradationPreference = 'maintain-framerate' | 'maintain-resolution' | 'balanced';\ntype TCall = ({\n number,\n mediaStream,\n extraHeaders,\n ontrack,\n iceServers,\n videoMode,\n audioMode,\n offerToReceiveAudio,\n offerToReceiveVideo,\n degradationPreference,\n}: {\n number: string;\n mediaStream?: MediaStream;\n extraHeaders?: TOptionsExtraHeaders['extraHeaders'];\n ontrack?: TOntrack;\n iceServers?: RTCIceServer[];\n videoMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n audioMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n offerToReceiveAudio?: boolean;\n offerToReceiveVideo?: boolean;\n degradationPreference?: TDegradationPreference;\n}) => Promise<RTCPeerConnection>;\n\ntype TDisconnect = () => Promise<void>;\n\ntype TParametersAnswerToIncomingCall = {\n mediaStream: MediaStream;\n extraHeaders?: TOptionsExtraHeaders['extraHeaders'];\n ontrack?: TOntrack;\n iceServers?: RTCIceServer[];\n videoMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n audioMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n degradationPreference?: TDegradationPreference;\n};\n\ntype TAnswerToIncomingCall = (\n parameters: TParametersAnswerToIncomingCall\n) => Promise<RTCPeerConnection>;\n\ntype TSendDTMF = (tone: number | string) => Promise<void>;\n\ntype THangUp = () => Promise<void>;\n\nexport default class SipConnector {\n private _isRegisterConfig = false;\n\n private _connectionConfiguration: {\n sipServerUrl?: string;\n displayName?: string;\n register?: boolean;\n user?: string;\n password?: string;\n number?: string;\n answer?: boolean;\n } = {};\n\n private _remoteStreams: { [key: string]: MediaStream } = {};\n\n private JsSIP: TJsSIP;\n\n private _sessionEvents: Events<typeof SESSION_EVENT_NAMES>;\n\n private _uaEvents: Events<typeof UA_EVENT_NAMES>;\n\n private _cancelableConnect: CancelableRequest<Parameters<TConnect>[0], ReturnType<TConnect>>;\n\n private _cancelableCreateUa: CancelableRequest<Parameters<TCreateUa>[0], ReturnType<TCreateUa>>;\n\n private _cancelableDisconnect: CancelableRequest<void, ReturnType<TDisconnect>>;\n\n private _cancelableSet: CancelableRequest<Parameters<TSet>[0], ReturnType<TSet>>;\n\n private _cancelableCall: CancelableRequest<Parameters<TCall>[0], ReturnType<TCall>>;\n\n private _cancelableAnswer: CancelableRequest<\n Parameters<TAnswerToIncomingCall>[0],\n ReturnType<TAnswerToIncomingCall>\n >;\n\n private _cancelableSendDTMF: CancelableRequest<Parameters<TSendDTMF>[0], ReturnType<TSendDTMF>>;\n\n private getSipServerUrl: (id: string) => string = (id: string) => {\n return id;\n };\n\n promisePendingStartPresentation?: Promise<MediaStream>;\n promisePendingStopPresentation?: Promise<void | MediaStream>;\n\n ua?: UA;\n\n session?: RTCSession;\n\n incomingSession?: RTCSession;\n\n _streamPresentationCurrent?: MediaStream;\n\n socket?: WebSocketInterface;\n\n constructor({ JsSIP }: { JsSIP: TJsSIP }) {\n this.JsSIP = JsSIP;\n\n this._sessionEvents = new Events<typeof SESSION_EVENT_NAMES>(SESSION_EVENT_NAMES);\n this._uaEvents = new Events<typeof UA_EVENT_NAMES>(UA_EVENT_NAMES);\n\n this._cancelableConnect = new CancelableRequest<Parameters<TConnect>[0], ReturnType<TConnect>>(\n this._connect,\n {\n moduleName,\n afterCancelRequest: () => {\n this._cancelableCreateUa.cancelRequest();\n this._cancelableDisconnect.cancelRequest();\n },\n }\n );\n\n this._cancelableCreateUa = new CancelableRequest<\n Parameters<TCreateUa>[0],\n ReturnType<TCreateUa>\n >(this._createUa, { moduleName });\n\n this._cancelableDisconnect = new CancelableRequest<void, ReturnType<TDisconnect>>(\n this._disconnect,\n { moduleName }\n );\n\n this._cancelableSet = new CancelableRequest<Parameters<TSet>[0], ReturnType<TSet>>(this._set, {\n moduleName,\n });\n\n this._cancelableCall = new CancelableRequest<Parameters<TCall>[0], ReturnType<TCall>>(\n this._call,\n { moduleName }\n );\n\n this._cancelableAnswer = new CancelableRequest<\n Parameters<TAnswerToIncomingCall>[0],\n ReturnType<TAnswerToIncomingCall>\n >(this._answer, { moduleName });\n\n this._cancelableSendDTMF = new CancelableRequest<\n Parameters<TSendDTMF>[0],\n ReturnType<TSendDTMF>\n >(this._sendDTMF, { moduleName });\n\n this.onSession(SHARE_STATE, this._handleShareState);\n this.onSession(NEW_INFO, this._handleNewInfo);\n this.on(SIP_EVENT, this._handleSipEvent);\n\n this.onSession(FAILED, this._handleEnded);\n this.onSession(ENDED, this._handleEnded);\n }\n\n connect: TConnect = (data) => {\n this._cancelRequests();\n\n return this._cancelableConnect.request(data);\n };\n\n createUa: TCreateUa = (data) => {\n return this._cancelableCreateUa.request(data);\n };\n\n set: TSet = (data) => {\n return this._cancelableSet.request(data);\n };\n\n call: TCall = (data) => {\n return this._cancelableCall.request(data);\n };\n\n disconnect: TDisconnect = () => {\n this._cancelRequests();\n\n return this._disconnectWithoutCancelRequests();\n };\n\n answerToIncomingCall: TAnswerToIncomingCall = (data) => {\n return this._cancelableAnswer.request(data);\n };\n\n sendDTMF: TSendDTMF = (tone) => {\n return this._cancelableSendDTMF.request(tone);\n };\n\n hangUp: THangUp = () => {\n this._cancelRequests();\n\n return this._hangUpWithoutCancelRequests();\n };\n\n register(): Promise<RegisteredEvent> {\n return new Promise((resolve, reject) => {\n if (this.isRegisterConfig) {\n this.ua!.on(REGISTERED, resolve);\n this.ua!.on(REGISTRATION_FAILED, reject);\n this.ua!.register();\n } else {\n reject(new Error('Config is not registered'));\n }\n });\n }\n\n unregister(): Promise<UnRegisteredEvent> {\n return new Promise((resolve, reject) => {\n if (this.isRegistered) {\n this.ua!.on(UNREGISTERED, resolve);\n this.ua!.unregister();\n } else {\n reject(new Error('ua is not registered'));\n }\n });\n }\n\n tryRegister = () => {\n if (!this.isRegisterConfig) {\n return Promise.reject(new Error('Config is not registered'));\n }\n\n this._uaEvents.trigger(CONNECTING, undefined);\n\n return this.unregister()\n .finally(() => {\n return this.register();\n })\n .finally(() => {\n return undefined;\n });\n };\n\n sendOptions(target: string | URI, body?: string, extraHeaders?: string[]): Promise<void> {\n if (!this.ua) {\n return Promise.reject(new Error('is not connected'));\n }\n\n return new Promise((resolve, reject) => {\n try {\n this.ua.sendOptions(target, body, {\n extraHeaders,\n eventHandlers: {\n succeeded: () => {\n resolve();\n },\n failed: (error) => {\n reject(error);\n },\n },\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n ping(body?: string, extraHeaders?: string[]): Promise<void> {\n if (!this.ua || !this.ua.configuration || !this.ua.configuration.uri) {\n return Promise.reject(new Error('is not connected'));\n }\n\n const target = this.ua.configuration.uri;\n\n return this.sendOptions(target, body, extraHeaders);\n }\n\n replaceMediaStream(\n mediaStream: MediaStream,\n options?: {\n deleteExisting: boolean;\n addMissing: boolean;\n forceRenegotiation: boolean;\n degradationPreference?: TDegradationPreference;\n }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n return this.session.replaceMediaStream(mediaStream, options);\n }\n\n declineToIncomingCall = ({ statusCode = REQUEST_TERMINATED_STATUS_CODE } = {}) => {\n return new Promise((resolve, reject) => {\n if (!this.isAvailableIncomingCall) {\n reject(new Error('no incomingSession'));\n\n return undefined;\n }\n\n const incomingSession = this!.incomingSession as RTCSession;\n const callerData = this.remoteCallerData;\n\n this._cancelableCall.cancelRequest();\n this._cancelableAnswer.cancelRequest();\n\n this.removeIncomingSession();\n this._uaEvents.trigger(DECLINED_INCOMING_CALL, callerData);\n resolve(incomingSession.terminate({ status_code: statusCode }));\n\n return undefined;\n });\n };\n\n busyIncomingCall = () => {\n return this.declineToIncomingCall({ statusCode: BUSY_HERE_STATUS_CODE });\n };\n\n removeIncomingSession = () => {\n delete this.incomingSession;\n };\n\n askPermissionToEnableCam(\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const extraHeaders = [HEADER_ENABLE_MAIN_CAM];\n\n return this.session\n .sendInfo(CONTENT_TYPE_MAIN_CAM, undefined, {\n ...options,\n extraHeaders,\n })\n .catch((error) => {\n if (hasDeclineResponseFromServer(error)) {\n throw error;\n }\n\n return;\n });\n }\n\n get isPendingPresentation(): boolean {\n return !!this.promisePendingStartPresentation || !!this.promisePendingStopPresentation;\n }\n\n startPresentation(\n stream: MediaStream,\n {\n isNeedReinvite = true,\n isP2P = false,\n maxBitrate,\n degradationPreference,\n }: {\n isNeedReinvite?: boolean;\n isP2P?: boolean;\n maxBitrate?: number;\n degradationPreference?: TDegradationPreference;\n } = {}\n ): Promise<void | MediaStream> {\n const session = this.establishedSession;\n\n if (!session) {\n return Promise.reject(new Error('No session established'));\n }\n\n if (this._streamPresentationCurrent) {\n return Promise.reject(new Error('Presentation is already started'));\n }\n\n const streamPresentationCurrent = prepareMediaStream(stream) as MediaStream;\n\n this._streamPresentationCurrent = streamPresentationCurrent;\n\n const preparatoryHeaders = isP2P\n ? [HEADER_START_PRESENTATION_P2P]\n : [HEADER_START_PRESENTATION];\n\n const result = session\n .sendInfo(CONTENT_TYPE_SHARE_STATE, undefined, {\n extraHeaders: preparatoryHeaders,\n })\n .then(() => {\n return session.startPresentation(\n streamPresentationCurrent,\n isNeedReinvite,\n degradationPreference\n );\n })\n // @ts-ignore\n .then(() => {\n const { connection } = this;\n\n if (!connection || maxBitrate === undefined) {\n return undefined;\n }\n\n const senders = connection.getSenders();\n\n return scaleBitrate(senders, stream, maxBitrate);\n })\n .then(() => {\n return stream;\n })\n .catch((error) => {\n this._sessionEvents.trigger(PRESENTATION_FAILED, error);\n\n throw error;\n });\n\n this.promisePendingStartPresentation = result;\n\n return result.finally(() => {\n this.promisePendingStartPresentation = undefined;\n });\n }\n\n stopPresentation({\n isP2P = false,\n }: {\n isP2P?: boolean;\n } = {}): Promise<MediaStream | void> {\n const streamPresentationPrev = this._streamPresentationCurrent;\n let result: Promise<MediaStream | void> =\n this.promisePendingStartPresentation || Promise.resolve();\n\n const preparatoryHeaders = isP2P ? [HEADER_STOP_PRESENTATION_P2P] : [HEADER_STOP_PRESENTATION];\n\n const session = this.establishedSession;\n\n if (session && streamPresentationPrev) {\n result = result\n .then(() => {\n return session.sendInfo(CONTENT_TYPE_SHARE_STATE, undefined, {\n extraHeaders: preparatoryHeaders,\n });\n })\n .then(() => {\n return session.stopPresentation(streamPresentationPrev);\n })\n .catch((error) => {\n this._sessionEvents.trigger(PRESENTATION_FAILED, error);\n\n throw error;\n });\n }\n\n if (!session && streamPresentationPrev) {\n this._sessionEvents.trigger(PRESENTATION_ENDED, streamPresentationPrev);\n }\n\n this.promisePendingStopPresentation = result;\n\n return result.finally(() => {\n this._resetPresentation();\n });\n }\n\n _resetPresentation(): void {\n delete this._streamPresentationCurrent;\n\n this.promisePendingStartPresentation = undefined;\n this.promisePendingStopPresentation = undefined;\n }\n\n handleNewRTCSession = ({ originator, session }: IncomingRTCSessionEvent) => {\n if (originator === ORIGINATOR_REMOTE) {\n this.incomingSession = session;\n\n const callerData = this.remoteCallerData;\n\n session.on(FAILED, ({ originator }) => {\n this.removeIncomingSession();\n\n if (originator !== ORIGINATOR_LOCAL) {\n this._uaEvents.trigger(FAILED_INCOMING_CALL, callerData);\n } else {\n this._uaEvents.trigger(TERMINATED_INCOMING_CALL, callerData);\n }\n });\n\n this._uaEvents.trigger(INCOMING_CALL, callerData);\n }\n };\n\n on(eventName: TEventUA, handler) {\n return this._uaEvents.on(eventName, handler);\n }\n\n once(eventName: TEventUA, handler) {\n return this._uaEvents.once(eventName, handler);\n }\n\n onceRace(eventNames: TEventUA[], handler) {\n return this._uaEvents.onceRace(eventNames, handler);\n }\n\n wait(eventName: TEventUA): Promise<any> {\n return this._uaEvents.wait(eventName);\n }\n\n off(eventName: TEventUA, handler) {\n this._uaEvents.off(eventName, handler);\n }\n\n onSession(eventName: TEventSession, handler) {\n return this._sessionEvents.on(eventName, handler);\n }\n\n onceSession(eventName: TEventSession, handler) {\n return this._sessionEvents.once(eventName, handler);\n }\n\n onceRaceSession(eventNames: TEventSession[], handler) {\n return this._sessionEvents.onceRace(eventNames, handler);\n }\n\n waitSession(eventName: TEventSession): Promise<any> {\n return this._sessionEvents.wait(eventName);\n }\n\n offSession(eventName: TEventSession, handler) {\n this._sessionEvents.off(eventName, handler);\n }\n\n isConfigured() {\n return !!this.ua;\n }\n\n getConnectionConfiguration() {\n return { ...this._connectionConfiguration };\n }\n\n getRemoteStreams(): MediaStream[] | undefined {\n if (!this.connection) {\n return undefined;\n }\n\n const receivers = this.connection.getReceivers();\n const remoteTracks = receivers.map(({ track }) => {\n return track;\n });\n\n if (hasVideoTracks(remoteTracks)) {\n return this._generateStreams(remoteTracks);\n }\n\n return this._generateAudioStreams(remoteTracks);\n }\n\n get connection(): RTCPeerConnection | undefined {\n const connection = this?.session?.connection;\n\n return connection;\n }\n\n get remoteCallerData() {\n return {\n // eslint-disable-next-line camelcase\n displayName: this?.incomingSession?.remote_identity?.display_name,\n // eslint-disable-next-line camelcase\n host: this?.incomingSession?.remote_identity?.uri.host,\n // eslint-disable-next-line camelcase\n incomingNumber: this?.incomingSession?.remote_identity?.uri.user,\n session: this?.incomingSession,\n };\n }\n\n get requested() {\n return (\n this._cancelableConnect.requested ||\n this._cancelableCreateUa.requested ||\n this._cancelableCall.requested ||\n this._cancelableAnswer.requested\n );\n }\n\n get establishedSession(): RTCSession | undefined {\n return this.session && this.session.isEstablished() ? this.session : undefined;\n }\n\n get isRegistered() {\n return !!this.ua && this.ua.isRegistered();\n }\n\n get isRegisterConfig() {\n return !!this.ua && this._isRegisterConfig;\n }\n\n get isCallActive() {\n return !!(this.ua && this.session);\n }\n\n get isAvailableIncomingCall() {\n return !!this.incomingSession;\n }\n\n _connect: TConnect = (params) => {\n return this.createUa(params).then(() => {\n return this._start();\n });\n };\n\n _createUa: TCreateUa = async ({\n displayName = '',\n user,\n password,\n register = false,\n sipServerUrl,\n sipWebSocketServerURL,\n remoteAddress,\n extraHeaders = [],\n sdpSemantics = 'plan-b',\n sessionTimers = false,\n registerExpires = 60 * 5, // 5 minutes in sec\n connectionRecoveryMinInterval = 2,\n connectionRecoveryMaxInterval = 6,\n userAgent,\n }) => {\n if (!sipServerUrl) {\n throw new Error('sipServerUrl is required');\n }\n\n if (!sipWebSocketServerURL) {\n throw new Error('sipWebSocketServerURL is required');\n }\n\n if (register && !user) {\n throw new Error('user is required for authorized connection');\n }\n\n if (register && !password) {\n throw new Error('password is required for authorized connection');\n }\n\n this._connectionConfiguration = {\n sipServerUrl,\n displayName,\n register,\n user,\n password,\n };\n\n this._init({ sipServerUrl, sipWebSocketServerURL });\n\n let authorizationUser;\n\n if (register && user) {\n authorizationUser = user.trim();\n } else {\n authorizationUser = generateUserId();\n }\n\n const configuration = {\n password,\n register,\n display_name: parseDisplayName(displayName),\n user_agent: userAgent,\n sdp_semantics: sdpSemantics,\n sockets: [this.socket as WebSocketInterface],\n uri: this.getSipServerUrl(authorizationUser),\n session_timers: sessionTimers,\n register_expires: registerExpires,\n\n connection_recovery_min_interval: connectionRecoveryMinInterval,\n connection_recovery_max_interval: connectionRecoveryMaxInterval,\n };\n\n if (this.ua) {\n await this._disconnectWithoutCancelRequests();\n }\n\n this._isRegisterConfig = !!configuration.register;\n this.ua = new this.JsSIP.UA(configuration);\n\n this._uaEvents.eachTriggers((trigger, eventName) => {\n const uaJsSipEvent = UA_JSSIP_EVENT_NAMES.find((jsSipEvent) => {\n return jsSipEvent === eventName;\n });\n\n if (uaJsSipEvent) {\n this.ua!.on(uaJsSipEvent, trigger);\n }\n });\n\n const extraHeadersRemoteAddress = getExtraHeadersRemoteAddress(remoteAddress);\n const extraHeadersBase = [...extraHeadersRemoteAddress, ...extraHeaders];\n\n this.ua!.registrator().setExtraHeaders(extraHeadersBase);\n\n return this.ua;\n };\n\n _init({ sipServerUrl, sipWebSocketServerURL }) {\n this.getSipServerUrl = resolveSipUrl(sipServerUrl);\n this.socket = new this.JsSIP.WebSocketInterface(sipWebSocketServerURL);\n }\n\n _start: TStart = () => {\n return new Promise((resolve, reject) => {\n const resolveUa = () => {\n removeEventListeners();\n resolve(this.ua as UA);\n };\n const rejectError = (error) => {\n removeEventListeners();\n reject(error);\n };\n const addEventListeners = () => {\n if (this.isRegisterConfig) {\n this.on(REGISTERED, resolveUa);\n this.on(REGISTRATION_FAILED, rejectError);\n } else {\n this.on(CONNECTED, resolveUa);\n }\n\n this.on(DISCONNECTED, rejectError);\n };\n const removeEventListeners = () => {\n this.off(REGISTERED, resolveUa);\n this.off(REGISTRATION_FAILED, rejectError);\n this.off(CONNECTED, resolveUa);\n this.off(DISCONNECTED, rejectError);\n };\n\n addEventListeners();\n this.on(NEW_RTC_SESSION, this.handleNewRTCSession);\n\n this.ua!.start();\n });\n };\n\n _set: TSet = ({ displayName, password }) => {\n return new Promise((resolve, reject) => {\n let changedDisplayName = false;\n let changedPassword = false;\n\n if (displayName !== undefined && displayName !== this._connectionConfiguration.displayName) {\n changedDisplayName = this.ua!.set('display_name', parseDisplayName(displayName));\n this._connectionConfiguration.displayName = displayName;\n }\n\n if (password !== undefined && password !== this._connectionConfiguration.password) {\n changedPassword = this.ua!.set('password', password);\n this._connectionConfiguration.password = password;\n }\n\n const changedSome = changedDisplayName || changedPassword;\n\n if (changedPassword && this.isRegisterConfig) {\n this.register()\n .then(() => {\n return resolve(changedSome);\n })\n .catch(reject);\n } else if (changedSome) {\n resolve(changedSome);\n } else {\n reject(changedSome);\n }\n });\n };\n\n _disconnectWithoutCancelRequests: TDisconnect = () => {\n return this._cancelableDisconnect.request();\n };\n\n _disconnect = async () => {\n this.off(NEW_RTC_SESSION, this.handleNewRTCSession);\n\n const disconnectedPromise = new Promise<void>((resolve) => {\n this.once(DISCONNECTED, () => {\n delete this.ua;\n resolve();\n });\n });\n\n if (this.ua) {\n await this._hangUpWithoutCancelRequests();\n\n if (this.ua) {\n this.ua.stop();\n } else {\n this._uaEvents.trigger(DISCONNECTED, undefined);\n }\n } else {\n this._uaEvents.trigger(DISCONNECTED, undefined);\n }\n\n return disconnectedPromise;\n };\n\n _call: TCall = ({\n number,\n mediaStream,\n extraHeaders = [],\n ontrack,\n iceServers,\n videoMode,\n audioMode,\n degradationPreference,\n offerToReceiveAudio = true,\n offerToReceiveVideo = true,\n }) => {\n return new Promise((resolve, reject) => {\n this._connectionConfiguration.number = number;\n this._connectionConfiguration.answer = false;\n this._handleCall({ ontrack }).then(resolve).catch(reject);\n\n this.session = this.ua!.call(this.getSipServerUrl(number), {\n extraHeaders,\n mediaStream: prepareMediaStream(mediaStream, {\n videoMode,\n audioMode,\n }),\n eventHandlers: this._sessionEvents.triggers,\n videoMode,\n audioMode,\n degradationPreference,\n pcConfig: {\n iceServers,\n },\n rtcOfferConstraints: {\n offerToReceiveAudio,\n offerToReceiveVideo,\n },\n });\n });\n };\n\n _answer: TAnswerToIncomingCall = ({\n mediaStream,\n ontrack,\n extraHeaders = [],\n iceServers,\n videoMode,\n audioMode,\n degradationPreference,\n }): Promise<RTCPeerConnection> => {\n return new Promise((resolve, reject) => {\n if (!this.isAvailableIncomingCall) {\n reject(new Error('no incomingSession'));\n\n return undefined;\n }\n\n this.session = this.incomingSession;\n this.removeIncomingSession();\n\n const session = this.session;\n\n if (!session) {\n reject(new Error('No session established'));\n\n return;\n }\n\n this._sessionEvents.eachTriggers((trigger, eventName) => {\n const sessionJsSipEvent = SESSION_JSSIP_EVENT_NAMES.find((jsSipEvent) => {\n return jsSipEvent === eventName;\n });\n\n if (sessionJsSipEvent) {\n session.on(sessionJsSipEvent, trigger);\n }\n });\n\n this._connectionConfiguration.answer = true;\n this._connectionConfiguration.number = session.remote_identity.uri.user;\n this._handleCall({ ontrack }).then(resolve).catch(reject);\n\n const preparedMediaStream = prepareMediaStream(mediaStream, {\n videoMode,\n audioMode,\n });\n\n session.answer({\n extraHeaders,\n videoMode,\n audioMode,\n degradationPreference,\n mediaStream: preparedMediaStream,\n pcConfig: {\n iceServers,\n },\n });\n\n return undefined;\n });\n };\n\n _handleCall = ({ ontrack }: { ontrack?: TOntrack }): Promise<RTCPeerConnection> => {\n return new Promise((resolve, reject) => {\n const addStartedEventListeners = () => {\n this.onSession(PEER_CONNECTION, handlePeerConnection);\n this.onSession(CONFIRMED, handleConfirmed);\n };\n const removeStartedEventListeners = () => {\n this.offSession(PEER_CONNECTION, handlePeerConnection);\n this.offSession(CONFIRMED, handleConfirmed);\n };\n const addEndedEventListeners = () => {\n this.onSession(FAILED, handleEnded);\n this.onSession(ENDED, handleEnded);\n };\n const removeEndedEventListeners = () => {\n this.offSession(FAILED, handleEnded);\n this.offSession(ENDED, handleEnded);\n };\n const handleEnded = (error: ICustomError) => {\n removeStartedEventListeners();\n removeEndedEventListeners();\n reject(error);\n };\n\n let savedPeerconnection: RTCPeerConnection;\n\n const handlePeerConnection = ({ peerconnection }) => {\n savedPeerconnection = peerconnection;\n\n savedPeerconnection.ontrack = (track) => {\n this._sessionEvents.trigger(PEER_CONNECTION_ONTRACK, savedPeerconnection);\n\n if (ontrack) {\n ontrack(track);\n }\n };\n };\n const handleConfirmed = () => {\n if (savedPeerconnection) {\n this._sessionEvents.trigger(PEER_CONNECTION_CONFIRMED, savedPeerconnection);\n }\n\n removeStartedEventListeners();\n removeEndedEventListeners();\n resolve(savedPeerconnection);\n };\n\n addStartedEventListeners();\n addEndedEventListeners();\n });\n };\n\n _restoreSession: () => void = () => {\n this._resetPresentation();\n\n delete this._connectionConfiguration.number;\n delete this.session;\n this._remoteStreams = {};\n };\n\n _sendDTMF: TSendDTMF = (tone) => {\n return new Promise<void>((resolve, reject) => {\n const session = this.session;\n\n if (!session) {\n reject(new Error('No session established'));\n\n return;\n }\n\n this.onceSession(NEW_DTMF, ({ originator }) => {\n if (originator === ORIGINATOR_LOCAL) {\n resolve();\n }\n });\n\n session.sendDTMF(tone, {\n duration: 120,\n interToneGap: 600,\n });\n });\n };\n\n _generateStream(videoTrack: MediaStreamTrack, audioTrack?: MediaStreamTrack): MediaStream {\n const id = videoTrack.id;\n\n const remoteStream: MediaStream = this._remoteStreams[id] || new MediaStream();\n\n if (audioTrack) {\n remoteStream.addTrack(audioTrack);\n }\n\n remoteStream.addTrack(videoTrack);\n this._remoteStreams[id] = remoteStream;\n\n return remoteStream;\n }\n\n _generateAudioStream(audioTrack: MediaStreamTrack): MediaStream {\n const id = audioTrack.id;\n\n const remoteStream = this._remoteStreams[id] || new MediaStream();\n\n remoteStream.addTrack(audioTrack);\n\n this._remoteStreams[id] = remoteStream;\n\n return remoteStream;\n }\n\n _generateStreams(remoteTracks: MediaStreamTrack[]): MediaStream[] {\n const remoteStreams: MediaStream[] = [];\n\n remoteTracks.forEach((track, index) => {\n if (track.kind === 'audio') {\n return;\n }\n\n const videoTrack = track;\n const prevTrack = remoteTracks[index - 1];\n let audioTrack;\n\n if (prevTrack && prevTrack.kind === 'audio') {\n audioTrack = prevTrack;\n }\n\n const remoteStream = this._generateStream(videoTrack, audioTrack);\n\n remoteStreams.push(remoteStream);\n }, []);\n\n return remoteStreams;\n }\n\n _generateAudioStreams(remoteTracks: MediaStreamTrack[]): MediaStream[] {\n const remoteStreams: MediaStream[] = remoteTracks.map((remoteTrack) => {\n return this._generateAudioStream(remoteTrack);\n });\n\n return remoteStreams;\n }\n\n _hangUpWithoutCancelRequests: THangUp = async () => {\n if (this.ua && this.session) {\n const { session } = this;\n\n if (this._streamPresentationCurrent) {\n await this.stopPresentation();\n }\n\n this._restoreSession();\n\n if (!session.isEnded()) {\n session.terminate();\n }\n }\n };\n\n _cancelRequests() {\n this._cancelActionsRequests();\n this._cancelCallRequests();\n this._cancelConnectRequests();\n }\n\n _cancelConnectRequests() {\n this._cancelableConnect.cancelRequest();\n }\n\n _cancelCallRequests() {\n this._cancelableCall.cancelRequest();\n this._cancelableAnswer.cancelRequest();\n }\n\n _cancelActionsRequests() {\n this._cancelableAnswer.cancelRequest();\n this._cancelableSendDTMF.cancelRequest();\n }\n\n _handleShareState = (eventName) => {\n switch (eventName) {\n case AVAILABLE_SECOND_REMOTE_STREAM:\n this._sessionEvents.trigger(AVAILABLE_SECOND_REMOTE_STREAM_EVENT, undefined);\n break;\n case NOT_AVAILABLE_SECOND_REMOTE_STREAM:\n this._sessionEvents.trigger(NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT, undefined);\n break;\n case MUST_STOP_PRESENTATION:\n this._sessionEvents.trigger(MUST_STOP_PRESENTATION_EVENT, undefined);\n break;\n\n default:\n break;\n }\n };\n\n _maybeTriggerChannels = (request: IncomingRequest) => {\n const inputChannels = request.getHeader(HEADER_INPUT_CHANNELS);\n const outputChannels = request.getHeader(HEADER_OUTPUT_CHANNELS);\n\n if (inputChannels && outputChannels) {\n const headersChannels: TChannels = {\n inputChannels,\n outputChannels,\n };\n\n this._sessionEvents.trigger(CHANNELS, headersChannels);\n }\n };\n\n _handleNotify = (header: TInfoNotify) => {\n if (header.cmd === CMD_CHANNELS) {\n const channelsInfo = header as TChannelsInfoNotify;\n\n this._triggerChannelsNotify(channelsInfo);\n } else if (header.cmd === CMD_WEBCAST_STARTED) {\n const webcastInfo = header as TWebcastInfoNotify;\n\n this._triggerWebcastStartedNotify(webcastInfo);\n } else if (header.cmd === CMD_WEBCAST_STOPPED) {\n const webcastInfo = header as TWebcastInfoNotify;\n\n this._triggerWebcastStoppedNotify(webcastInfo);\n } else if (header.cmd === CMD_ADDED_TO_LIST_MODERATORS) {\n const data = header as TAddedToListModeratorsInfoNotify;\n\n this._triggerAddedToListModeratorsNotify(data);\n } else if (header.cmd === CMD_REMOVED_FROM_LIST_MODERATORS) {\n const data = header as TRemovedFromListModeratorsInfoNotify;\n\n this._triggerRemovedFromListModeratorsNotify(data);\n } else if (header.cmd === CMD_MOVE_REQUEST_TO_CONFERENCE) {\n const data = header as TMoveRequestToConferenceInfoNotify;\n\n this._triggerParticipantMoveRequestToConference(data);\n } else if (header.cmd === CMD_CANCELLING_WORD_REQUEST) {\n const data = header as TCancelingWordRequestInfoNotify;\n\n this._triggerParticipantCancelingWordRequest(data);\n } else if (header.cmd === CMD_MOVE_REQUEST_TO_STREAM) {\n const data = header as TMoveRequestToStreamInfoNotify;\n\n this._triggerParticipantMoveRequestToStream(data);\n } else if (header.cmd === CMD_ACCOUNT_CHANGED) {\n this._triggerAccountChangedNotify();\n } else if (header.cmd === CMD_ACCOUNT_DELETED) {\n this._triggerAccountDeletedNotify();\n } else if (header.cmd === CMD_CONFERENCE_PARTICIPANT_TOKEN_ISSUED) {\n const data = header as TConferenceParticipantTokenIssued;\n\n this._triggerConferenceParticipantTokenIssued(data);\n }\n };\n\n _triggerRemovedFromListModeratorsNotify = ({\n conference,\n }: TRemovedFromListModeratorsInfoNotify) => {\n const headersParametersModeratorsList: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n headersParametersModeratorsList\n );\n };\n\n _triggerAddedToListModeratorsNotify = ({ conference }: TAddedToListModeratorsInfoNotify) => {\n const headersParametersModeratorsList: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_ADDED_TO_LIST_MODERATORS, headersParametersModeratorsList);\n };\n\n _triggerWebcastStartedNotify = ({ body: { conference, type } }: TWebcastInfoNotify) => {\n const headersParametersWebcast: TParametersWebcast = {\n conference,\n type,\n };\n\n this._uaEvents.trigger(WEBCAST_STARTED, headersParametersWebcast);\n };\n\n _triggerWebcastStoppedNotify = ({ body: { conference, type } }: TWebcastInfoNotify) => {\n const headersParametersWebcast: TParametersWebcast = {\n conference,\n type,\n };\n\n this._uaEvents.trigger(WEBCAST_STOPPED, headersParametersWebcast);\n };\n\n _triggerAccountChangedNotify = () => {\n this._uaEvents.trigger(ACCOUNT_CHANGED, undefined);\n };\n\n _triggerAccountDeletedNotify = () => {\n this._uaEvents.trigger(ACCOUNT_DELETED, undefined);\n };\n\n _triggerConferenceParticipantTokenIssued = ({\n body: { conference, participant, jwt },\n }: TConferenceParticipantTokenIssued) => {\n const headersConferenceParticipantTokenIssued: TParametersConferenceParticipantTokenIssued = {\n conference,\n participant,\n jwt,\n };\n\n this._uaEvents.trigger(\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n headersConferenceParticipantTokenIssued\n );\n };\n\n _triggerChannelsNotify = (channelsInfo: TChannelsInfoNotify) => {\n const inputChannels = channelsInfo.input;\n const outputChannels = channelsInfo.output;\n\n const data: TChannels = {\n inputChannels,\n outputChannels,\n };\n\n this._uaEvents.trigger(CHANNELS_NOTIFY, data);\n };\n\n _triggerParticipantMoveRequestToConference = ({\n body: { conference },\n }: TMoveRequestToConferenceInfoNotify) => {\n const data: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE, data);\n };\n\n _triggerParticipantCancelingWordRequest = ({\n body: { conference },\n }: TCancelingWordRequestInfoNotify) => {\n const data: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_CANCELLING_WORD_REQUEST, data);\n };\n\n _triggerParticipantMoveRequestToStream = ({\n body: { conference },\n }: TMoveRequestToStreamInfoNotify) => {\n const data: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_MOVE_REQUEST_TO_STREAM, data);\n };\n\n _triggerEnterRoom = (request: IncomingRequest) => {\n const room = request.getHeader(HEADER_CONTENT_ENTER_ROOM);\n\n this._sessionEvents.trigger(ENTER_ROOM, room);\n };\n\n _triggerShareState = (request: IncomingRequest) => {\n const eventName = request.getHeader(HEADER_CONTENT_SHARE_STATE);\n\n this._sessionEvents.trigger(SHARE_STATE, eventName);\n };\n\n _triggerMainCamControl = (request: IncomingRequest) => {\n const mainCam = request.getHeader(HEADER_MAIN_CAM) as EEventsMainCAM;\n\n const syncState = request.getHeader(HEADER_MEDIA_SYNC);\n const isSyncForced = syncState === EEventsSyncMediaState.ADMIN_SYNC_FORCED ? true : false;\n\n if (mainCam === EEventsMainCAM.ADMIN_START_MAIN_CAM) {\n this._sessionEvents.trigger(ADMIN_START_MAIN_CAM, { isSyncForced });\n } else if (mainCam === EEventsMainCAM.ADMIN_STOP_MAIN_CAM) {\n this._sessionEvents.trigger(ADMIN_STOP_MAIN_CAM, { isSyncForced });\n } else if (\n (mainCam === EEventsMainCAM.RESUME_MAIN_CAM || mainCam === EEventsMainCAM.PAUSE_MAIN_CAM) &&\n !!syncState\n ) {\n this._sessionEvents.trigger(ADMIN_FORCE_SYNC_MEDIA_STATE, { isSyncForced });\n } else {\n const resolutionMainCam = request.getHeader(HEADER_MAIN_CAM_RESOLUTION);\n\n this._sessionEvents.trigger(MAIN_CAM_CONTROL, {\n mainCam,\n resolutionMainCam,\n });\n }\n };\n\n _triggerMicControl = (request: IncomingRequest) => {\n const mic = request.getHeader(HEADER_MIC);\n const syncState = request.getHeader(HEADER_MEDIA_SYNC);\n const isSyncForced = syncState === EEventsSyncMediaState.ADMIN_SYNC_FORCED ? true : false;\n\n if (mic === EEventsMic.ADMIN_START_MIC) {\n this._sessionEvents.trigger(ADMIN_START_MIC, { isSyncForced });\n } else if (mic === EEventsMic.ADMIN_STOP_MIC) {\n this._sessionEvents.trigger(ADMIN_STOP_MIC, { isSyncForced });\n }\n };\n\n _triggerUseLicense = (request: IncomingRequest) => {\n const license: EUseLicense = request.getHeader(HEADER_CONTENT_USE_LICENSE) as EUseLicense;\n\n this._sessionEvents.trigger(USE_LICENSE, license);\n };\n\n _handleNewInfo = (info: IncomingInfoEvent | OutgoingInfoEvent) => {\n const { originator } = info;\n\n if (originator !== 'remote') {\n return;\n }\n\n const request = info.request as IncomingRequest;\n const contentType = request.getHeader(HEADER_CONTENT_TYPE_NAME);\n\n if (contentType) {\n switch (contentType) {\n case CONTENT_TYPE_ENTER_ROOM:\n this._triggerEnterRoom(request);\n this._maybeTriggerChannels(request);\n break;\n case CONTENT_TYPE_NOTIFY:\n this._maybeHandleNotify(request);\n break;\n case CONTENT_TYPE_SHARE_STATE:\n this._triggerShareState(request);\n break;\n case CONTENT_TYPE_MAIN_CAM:\n this._triggerMainCamControl(request);\n break;\n case CONTENT_TYPE_MIC:\n this._triggerMicControl(request);\n break;\n case CONTENT_TYPE_USE_LICENSE:\n this._triggerUseLicense(request);\n break;\n\n default:\n break;\n }\n }\n };\n\n _handleSipEvent = ({ request }: { request: IncomingRequest }) => {\n this._maybeHandleNotify(request);\n };\n\n _maybeHandleNotify = (request: IncomingRequest) => {\n const headerNotify = request.getHeader(HEADER_NOTIFY);\n\n if (headerNotify) {\n const headerNotifyParsed: TInfoNotify = JSON.parse(headerNotify);\n\n this._handleNotify(headerNotifyParsed);\n }\n };\n\n waitChannels(): Promise<TChannels> {\n return this.waitSession(CHANNELS);\n }\n\n waitSyncMediaState(): Promise<{ isSyncForced: boolean }> {\n return this.waitSession(ADMIN_FORCE_SYNC_MEDIA_STATE);\n }\n\n sendChannels({ inputChannels, outputChannels }: TChannels): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const headerInputChannels = `${HEADER_INPUT_CHANNELS}: ${inputChannels}`;\n const headerOutputChannels = `${HEADER_OUTPUT_CHANNELS}: ${outputChannels}`;\n const extraHeaders: TOptionsExtraHeaders['extraHeaders'] = [\n headerInputChannels,\n headerOutputChannels,\n ];\n\n return this.session.sendInfo(CONTENT_TYPE_CHANNELS, undefined, { extraHeaders });\n }\n\n sendMediaState(\n { cam, mic }: TMediaState,\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const headerMediaState = `${HEADER_MEDIA_STATE}: currentstate`;\n const headerCam = `${HEADER_MAIN_CAM_STATE}: ${+cam}`;\n const headerMic = `${HEADER_MIC_STATE}: ${+mic}`;\n const extraHeaders: TOptionsExtraHeaders['extraHeaders'] = [\n headerMediaState,\n headerCam,\n headerMic,\n ];\n\n return this.session.sendInfo(CONTENT_TYPE_MEDIA_STATE, undefined, { ...options, extraHeaders });\n }\n\n _handleEnded = (error: ICustomError) => {\n const { originator } = error;\n\n if (originator === ORIGINATOR_REMOTE) {\n this._sessionEvents.trigger(ENDED_FROM_SERVER, error);\n }\n\n this._restoreSession();\n };\n}\n","const findVideoSender = (senders: RTCRtpSender[]): RTCRtpSender | undefined => {\n return senders.find((sender) => {\n return sender?.track?.kind === 'video';\n });\n};\n\nexport default findVideoSender;\n","const ONE_MEGABIT_IN_BITS = 1e6;\n\nconst megabitsToBits = (mb: number): number => {\n return mb * ONE_MEGABIT_IN_BITS;\n};\n\nexport const MINIMUM_BITRATE = megabitsToBits(0.06);\nexport const MAXIMUM_BITRATE = megabitsToBits(4);\n\nconst getMaxBitrateByWidth = (maxWidth: number): number => {\n if (maxWidth <= 64) {\n return MINIMUM_BITRATE;\n }\n\n if (maxWidth <= 128) {\n return megabitsToBits(0.12);\n }\n\n if (maxWidth <= 256) {\n return megabitsToBits(0.25);\n }\n\n if (maxWidth <= 384) {\n return megabitsToBits(0.32);\n }\n\n if (maxWidth <= 426) {\n return megabitsToBits(0.38);\n }\n\n if (maxWidth <= 640) {\n return megabitsToBits(0.5);\n }\n\n if (maxWidth <= 848) {\n return megabitsToBits(0.7);\n }\n\n if (maxWidth <= 1280) {\n return megabitsToBits(1);\n }\n\n if (maxWidth <= 1920) {\n return megabitsToBits(2);\n }\n\n return MAXIMUM_BITRATE;\n};\n\nexport default getMaxBitrateByWidth;\n","import createStackPromises from 'stack-promises';\nimport { EEventsMainCAM } from '../SipConnector';\nimport getMaxBitrateByWidth, { MINIMUM_BITRATE, MAXIMUM_BITRATE } from './getMaxBitrateByWidth';\nimport setEncodingsToSender from './setEncodingsToSender';\nimport type { TOnSetParameters, TResult } from './setEncodingsToSender';\n\nconst stackPromises = createStackPromises<TResult>();\n\nconst runStackPromises = (): Promise<TResult> => {\n // @ts-ignore\n return stackPromises().catch((error) => {\n // eslint-disable-next-line no-console\n console.debug('videoSendingBalancer: error', error);\n });\n};\n\nconst run = (action: () => Promise<TResult>): Promise<TResult> => {\n stackPromises.add(action);\n\n return runStackPromises();\n};\n\nconst addToStackScaleResolutionDownBySender = ({\n sender,\n scaleResolutionDownBy,\n maxBitrate,\n onSetParameters,\n}: {\n sender: RTCRtpSender;\n scaleResolutionDownBy: number;\n maxBitrate: number;\n onSetParameters?: TOnSetParameters;\n}): Promise<TResult> => {\n return run(() => {\n return setEncodingsToSender(sender, { scaleResolutionDownBy, maxBitrate }, onSetParameters);\n });\n};\n\nconst downgradeResolutionSender = (\n sender: RTCRtpSender,\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const scaleResolutionDownByTarget = 200;\n const maxBitrate = MINIMUM_BITRATE;\n\n return addToStackScaleResolutionDownBySender({\n sender,\n maxBitrate,\n onSetParameters,\n scaleResolutionDownBy: scaleResolutionDownByTarget,\n });\n};\n\nconst resetScaleResolutionSender = (\n sender: RTCRtpSender,\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const scaleResolutionDownByTarget = 1;\n const maxBitrate = MAXIMUM_BITRATE;\n\n return addToStackScaleResolutionDownBySender({\n sender,\n maxBitrate,\n onSetParameters,\n scaleResolutionDownBy: scaleResolutionDownByTarget,\n });\n};\n\nconst setResolutionSender = (\n sender: RTCRtpSender,\n {\n track,\n resolution,\n }: {\n track: MediaStreamTrack;\n resolution: string;\n },\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const settings = track.getSettings();\n const widthCurrent = settings.width!;\n const heightCurrent = settings.height!;\n const [widthTarget, heightTarget] = resolution.split('x');\n\n const scaleByWidth = widthCurrent / +widthTarget;\n const scaleByHeight = heightCurrent / +heightTarget!;\n const SCALE_MIN = 1;\n\n const scaleResolutionDownByTarget = Math.max(scaleByWidth, scaleByHeight, SCALE_MIN);\n\n const maxBitrate = getMaxBitrateByWidth(+widthTarget);\n\n return addToStackScaleResolutionDownBySender({\n sender,\n maxBitrate,\n onSetParameters,\n scaleResolutionDownBy: scaleResolutionDownByTarget,\n });\n};\n\nconst processSender = (\n {\n mainCam,\n resolutionMainCam,\n sender,\n track,\n }: {\n mainCam: EEventsMainCAM;\n resolutionMainCam?: string;\n sender: RTCRtpSender;\n track: MediaStreamTrack;\n },\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n switch (mainCam) {\n case EEventsMainCAM.PAUSE_MAIN_CAM:\n return downgradeResolutionSender(sender, onSetParameters);\n case EEventsMainCAM.RESUME_MAIN_CAM:\n return resetScaleResolutionSender(sender, onSetParameters);\n case EEventsMainCAM.MAX_MAIN_CAM_RESOLUTION:\n if (resolutionMainCam) {\n return setResolutionSender(\n sender,\n { track, resolution: resolutionMainCam },\n onSetParameters\n );\n }\n }\n\n return Promise.resolve({\n isChanged: false,\n parameters: { encodings: [{}], transactionId: '0', codecs: [], headerExtensions: [], rtcp: {} },\n });\n};\n\nexport default processSender;\n","const getExtraHeadersRegistration = (remoteAddress?: string) => {\n const headers: string[] = [];\n\n if (remoteAddress) {\n headers.push(`X-Vinteo-Remote: ${remoteAddress}`);\n }\n\n return headers;\n};\n\nexport default getExtraHeadersRegistration;\n","const DECLINE_ERROR_MESSAGE = 'Error decline with 603';\n\nexport const hasDeclineResponseFromServer = (error: Error): boolean => {\n return error.message === DECLINE_ERROR_MESSAGE;\n};\n","import findSenderByStream from '../utils/findSenderByStream';\nimport setEncodingsToSender from './setEncodingsToSender';\n\nconst scaleMaxBitrateBySender = (\n senders: RTCRtpSender[],\n mediaStream: MediaStream,\n maxBitrate: number\n) => {\n const sender = findSenderByStream(senders, mediaStream);\n\n if (sender) {\n return setEncodingsToSender(sender, { maxBitrate });\n }\n\n return Promise.resolve();\n};\n\nexport default scaleMaxBitrateBySender;\n","import type SipConnector from '../SipConnector';\nimport type { EEventsMainCAM } from '../SipConnector';\nimport balance from './balance';\nimport type { TOnSetParameters } from './setEncodingsToSender';\n\nconst resolveVideoSendingBalancer = (\n sipConnector: SipConnector,\n {\n ignoreForCodec,\n onSetParameters,\n }: {\n ignoreForCodec?: string;\n onSetParameters?: TOnSetParameters;\n } = {}\n) => {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n let reBalance = () => {};\n const handleMainCamControl = (headers: {\n mainCam: EEventsMainCAM;\n resolutionMainCam?: string;\n }) => {\n reBalance = () => {\n const { mainCam, resolutionMainCam } = headers;\n const { connection } = sipConnector;\n\n if (!connection || mainCam === undefined) {\n return;\n }\n\n balance({\n mainCam,\n resolutionMainCam,\n connection,\n onSetParameters,\n ignoreForCodec,\n });\n };\n\n reBalance();\n };\n\n const subscribe = () => {\n sipConnector.onSession('main-cam-control', handleMainCamControl);\n };\n\n const unsubscribe = () => {\n sipConnector.offSession('main-cam-control', handleMainCamControl);\n };\n\n return { subscribe, unsubscribe, reBalance };\n};\n\nexport default resolveVideoSendingBalancer;\n","import type { EEventsMainCAM } from '../SipConnector';\nimport findVideoSender from '../utils/findVideoSender';\nimport getCodecFromSender from '../utils/getCodecFromSender';\nimport processSender from './processSender';\nimport type { TOnSetParameters } from './setEncodingsToSender';\n\nconst hasIncludesString = (source?: string, target?: string): boolean => {\n return !!source && !!target && source.toLowerCase().includes(target.toLowerCase());\n};\n\nconst balance = async ({\n mainCam,\n resolutionMainCam,\n connection,\n onSetParameters,\n ignoreForCodec,\n}: {\n mainCam: EEventsMainCAM;\n resolutionMainCam?: string;\n connection: RTCPeerConnection;\n onSetParameters?: TOnSetParameters;\n ignoreForCodec?: string;\n}) => {\n const senders = connection.getSenders();\n const sender = findVideoSender(senders);\n\n if (!sender || !sender.track) {\n return;\n }\n\n if (ignoreForCodec) {\n const codec = await getCodecFromSender(sender);\n\n if (hasIncludesString(codec, ignoreForCodec)) {\n return;\n }\n }\n\n processSender({ mainCam, resolutionMainCam, sender, track: sender.track }, onSetParameters);\n};\n\nexport default balance;\n"],"names":["getCodecFromSender","sender","getStats","then","stats","codec","type","results","keys","map","key","get","statsReportToArray","find","value","mimeType","resolveHasNeedToUpdateItemEncoding","defaultValue","itemEncodingTarget","itemEncodingCurrent","undefined","hasNeedToUpdateScaleResolutionDownBy","hasNeedToUpdateMaxBitrate","setEncodingsToSender","encodingsTarget","onSetParameters","parameters","getParameters","encodings","length","encoding","scaleResolutionDownByCurrent","scaleResolutionDownBy","scaleResolutionDownByTarget","scaleResolutionDownByTargetParsed","Math","max","performUpdateScaleResolutionDownBy","isChanged","maxBitrateCurrent","maxBitrate","maxBitrateTarget","performUpdateMaxBitrate","setParameters","Promise","resolve","INCOMING_CALL","DECLINED_INCOMING_CALL","FAILED_INCOMING_CALL","TERMINATED_INCOMING_CALL","CONNECTING","CONNECTED","DISCONNECTED","NEW_RTC_SESSION","REGISTERED","UNREGISTERED","REGISTRATION_FAILED","SIP_EVENT","AVAILABLE_SECOND_REMOTE_STREAM_EVENT","NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT","MUST_STOP_PRESENTATION_EVENT","SHARE_STATE","ENTER_ROOM","USE_LICENSE","PEER_CONNECTION_CONFIRMED","PEER_CONNECTION_ONTRACK","CHANNELS","CHANNELS_NOTIFY","ENDED_FROM_SERVER","MAIN_CAM_CONTROL","ADMIN_STOP_MAIN_CAM","ADMIN_START_MAIN_CAM","ADMIN_STOP_MIC","ADMIN_START_MIC","ADMIN_FORCE_SYNC_MEDIA_STATE","PARTICIPANT_ADDED_TO_LIST_MODERATORS","PARTICIPANT_REMOVED_FROM_LIST_MODERATORS","PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE","PARTICIPANT_MOVE_REQUEST_TO_STREAM","PARTICIPANT_CANCELLING_WORD_REQUEST","WEBCAST_STARTED","WEBCAST_STOPPED","ACCOUNT_CHANGED","ACCOUNT_DELETED","CONFERENCE_PARTICIPANT_TOKEN_ISSUED","ENDED","CONFIRMED","PEER_CONNECTION","FAILED","NEW_DTMF","NEW_INFO","PRESENTATION_ENDED","PRESENTATION_FAILED","UA_SYNTHETICS_EVENT_NAMES","UA_JSSIP_EVENT_NAMES","SESSION_SYNTHETICS_EVENT_NAMES","SESSION_JSSIP_EVENT_NAMES","UA_EVENT_NAMES","SESSION_EVENT_NAMES","REQUEST_TIMEOUT","REJECTED","BYE","CANCELED","CONTENT_TYPE_SHARE_STATE","CONTENT_TYPE_MAIN_CAM","HEADER_INPUT_CHANNELS","HEADER_OUTPUT_CHANNELS","HEADER_MEDIA_SYNC","HEADER_CONTENT_SHARE_STATE","AVAILABLE_SECOND_REMOTE_STREAM","NOT_AVAILABLE_SECOND_REMOTE_STREAM","parseDisplayName","displayName","trim","replace","generateUserId","min","floor","random","prepareMediaStream","mediaStream","videoMode","audioMode","tracks","getAudioTracks","getVideoTracks","newStream","MediaStream","getTracks","ORIGINATOR_LOCAL","ORIGINATOR_REMOTE","EEventsMainCAM","EEventsMic","EEventsSyncMediaState","EUseLicense","exports","moduleName","megabitsToBits","mb","MINIMUM_BITRATE","MAXIMUM_BITRATE","stackPromises","createStackPromises","run","action","add","catch","error","console","debug","addToStackScaleResolutionDownBySender","setResolutionSender","track","resolution","settings","getSettings","widthCurrent","width","heightCurrent","height","widthTarget","heightTarget","split","scaleByWidth","scaleByHeight","maxWidth","processSender","mainCam","resolutionMainCam","PAUSE_MAIN_CAM","downgradeResolutionSender","RESUME_MAIN_CAM","resetScaleResolutionSender","MAX_MAIN_CAM_RESOLUTION","transactionId","codecs","headerExtensions","rtcp","constructor","JsSIP","this","_isRegisterConfig","_connectionConfiguration","_remoteStreams","getSipServerUrl","id","connect","data","_cancelRequests","_cancelableConnect","request","createUa","_cancelableCreateUa","set","_cancelableSet","call","_cancelableCall","disconnect","_disconnectWithoutCancelRequests","answerToIncomingCall","_cancelableAnswer","sendDTMF","tone","_cancelableSendDTMF","hangUp","_hangUpWithoutCancelRequests","tryRegister","isRegisterConfig","_uaEvents","trigger","unregister","finally","register","reject","Error","declineToIncomingCall","statusCode","isAvailableIncomingCall","incomingSession","callerData","remoteCallerData","cancelRequest","removeIncomingSession","terminate","status_code","busyIncomingCall","handleNewRTCSession","originator","session","on","_connect","params","_start","_createUa","user","password","sipServerUrl","sipWebSocketServerURL","remoteAddress","extraHeaders","sdpSemantics","sessionTimers","registerExpires","connectionRecoveryMinInterval","connectionRecoveryMaxInterval","userAgent","__awaiter","authorizationUser","_init","configuration","display_name","user_agent","sdp_semantics","sockets","socket","uri","session_timers","register_expires","connection_recovery_min_interval","connection_recovery_max_interval","ua","UA","eachTriggers","eventName","uaJsSipEvent","jsSipEvent","extraHeadersRemoteAddress","headers","push","getExtraHeadersRemoteAddress","extraHeadersBase","registrator","setExtraHeaders","resolveUa","removeEventListeners","rejectError","off","addEventListeners","start","_set","changedDisplayName","changedPassword","changedSome","_cancelableDisconnect","_disconnect","disconnectedPromise","once","stop","_call","number","ontrack","iceServers","degradationPreference","offerToReceiveAudio","offerToReceiveVideo","answer","_handleCall","eventHandlers","_sessionEvents","triggers","pcConfig","rtcOfferConstraints","_answer","sessionJsSipEvent","remote_identity","preparedMediaStream","removeStartedEventListeners","offSession","handlePeerConnection","handleConfirmed","removeEndedEventListeners","handleEnded","savedPeerconnection","peerconnection","onSession","addStartedEventListeners","addEndedEventListeners","_restoreSession","_resetPresentation","_sendDTMF","onceSession","duration","interToneGap","_streamPresentationCurrent","stopPresentation","isEnded","_handleShareState","_maybeTriggerChannels","inputChannels","getHeader","outputChannels","headersChannels","_handleNotify","header","cmd","channelsInfo","_triggerChannelsNotify","webcastInfo","_triggerWebcastStartedNotify","_triggerWebcastStoppedNotify","_triggerAddedToListModeratorsNotify","_triggerRemovedFromListModeratorsNotify","_triggerParticipantMoveRequestToConference","_triggerParticipantCancelingWordRequest","_triggerParticipantMoveRequestToStream","_triggerAccountChangedNotify","_triggerAccountDeletedNotify","_triggerConferenceParticipantTokenIssued","conference","headersParametersModeratorsList","body","headersParametersWebcast","participant","jwt","headersConferenceParticipantTokenIssued","input","output","_triggerEnterRoom","room","_triggerShareState","_triggerMainCamControl","syncState","isSyncForced","ADMIN_SYNC_FORCED","_triggerMicControl","mic","_triggerUseLicense","license","_handleNewInfo","info","contentType","_maybeHandleNotify","_handleSipEvent","headerNotify","headerNotifyParsed","JSON","parse","_handleEnded","Events","CancelableRequest","afterCancelRequest","isRegistered","sendOptions","target","succeeded","failed","ping","replaceMediaStream","options","askPermissionToEnableCam","noTerminateWhenError","sendInfo","message","hasDeclineResponseFromServer","isPendingPresentation","promisePendingStartPresentation","promisePendingStopPresentation","startPresentation","stream","isNeedReinvite","isP2P","establishedSession","streamPresentationCurrent","preparatoryHeaders","result","connection","senders","includes","findSenderByStream","scaleBitrate","getSenders","streamPresentationPrev","handler","onceRace","eventNames","wait","onceRaceSession","waitSession","isConfigured","getConnectionConfiguration","Object","assign","getRemoteStreams","remoteTracks","getReceivers","some","remoteTrack","kind","hasVideoTracks","_generateStreams","_generateAudioStreams","_a","_b","host","_d","_c","incomingNumber","_f","_e","requested","isEstablished","isCallActive","serverUrl","WebSocketInterface","_generateStream","videoTrack","audioTrack","remoteStream","addTrack","_generateAudioStream","remoteStreams","forEach","index","prevTrack","_cancelActionsRequests","_cancelCallRequests","_cancelConnectRequests","waitChannels","waitSyncMediaState","sendChannels","sendMediaState","cam","cause","isCanceledError","sipConnector","ignoreForCodec","reBalance","handleMainCamControl","source","toLowerCase","balance","subscribe","unsubscribe"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.umd.js","sources":["../src/utils/getCodecFromSender.ts","../src/utils/findSenderByStream.ts","../src/videoSendingBalancer/setEncodingsToSender.ts","../src/constants.ts","../src/eventNames.ts","../src/causes.ts","../src/headers.ts","../src/utils.ts","../src/SipConnector.ts","../src/utils/findVideoSender.ts","../src/videoSendingBalancer/getMaxBitrateByWidth.ts","../src/videoSendingBalancer/processSender.ts","../src/getExtraHeadersRemoteAddress.ts","../src/utils/errors.ts","../src/videoSendingBalancer/scaleBitrate.ts","../src/videoSendingBalancer/index.ts","../src/videoSendingBalancer/balance.ts"],"sourcesContent":["const statsReportToArray = (results: RTCStatsReport) => {\n return [...results.keys()].map((key) => {\n return results.get(key);\n });\n};\n\nconst findInResultByType = (results: RTCStatsReport, type: string) => {\n return statsReportToArray(results).find((value) => {\n return value.type === type;\n });\n};\n\nconst getCodecFromSender = (sender: RTCRtpSender): Promise<string | undefined> => {\n return sender.getStats().then((stats: RTCStatsReport) => {\n const codec = findInResultByType(stats, 'codec');\n\n return codec?.mimeType;\n });\n};\n\nexport default getCodecFromSender;\n","const findSenderByStream = (\n senders: RTCRtpSender[],\n stream: MediaStream\n): RTCRtpSender | undefined => {\n return senders.find((sender) => {\n return sender.track && stream.getTracks().includes(sender.track);\n });\n};\n\nexport default findSenderByStream;\n","export type TOnSetParameters = (parameters: RTCRtpSendParameters) => void;\nexport type TResult = { parameters: RTCRtpSendParameters; isChanged: boolean };\n\nconst MIN_SCALE_RESOLUTION_DOWN_BY = 1;\nconst resolveHasNeedToUpdateItemEncoding = (defaultValue: number | undefined) => {\n return (itemEncodingTarget: typeof defaultValue, itemEncodingCurrent?: number): boolean => {\n const isChangedDefaultScale =\n itemEncodingCurrent === undefined && itemEncodingTarget !== defaultValue;\n const isChangedPrevScale =\n itemEncodingCurrent !== undefined && itemEncodingTarget !== itemEncodingCurrent;\n\n const isNeedToChange = isChangedPrevScale || isChangedDefaultScale;\n\n return isNeedToChange;\n };\n};\n\nconst hasNeedToUpdateScaleResolutionDownBy = resolveHasNeedToUpdateItemEncoding(\n MIN_SCALE_RESOLUTION_DOWN_BY\n);\nconst performUpdateScaleResolutionDownBy = (\n scaleResolutionDownByTarget?: number,\n scaleResolutionDownByCurrent?: number\n): number | undefined => {\n const scaleResolutionDownByTargetParsed: number | null =\n scaleResolutionDownByTarget !== undefined\n ? Math.max(scaleResolutionDownByTarget, MIN_SCALE_RESOLUTION_DOWN_BY)\n : null;\n\n if (\n scaleResolutionDownByTargetParsed !== null &&\n hasNeedToUpdateScaleResolutionDownBy(\n scaleResolutionDownByTargetParsed,\n scaleResolutionDownByCurrent\n )\n ) {\n return scaleResolutionDownByTargetParsed;\n }\n\n return undefined;\n};\n\nconst hasNeedToUpdateMaxBitrate = resolveHasNeedToUpdateItemEncoding(undefined);\nconst performUpdateMaxBitrate = (\n maxBitrateTarget?: number,\n maxBitrateCurrent?: number\n): number | undefined => {\n if (hasNeedToUpdateMaxBitrate(maxBitrateTarget, maxBitrateCurrent)) {\n return maxBitrateTarget;\n }\n\n return undefined;\n};\n\nconst setEncodingsToSender = (\n sender: RTCRtpSender,\n encodingsTarget: { scaleResolutionDownBy?: number; maxBitrate?: number },\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const parameters: RTCRtpSendParameters = sender.getParameters();\n\n if (!parameters.encodings || parameters.encodings.length === 0) {\n parameters.encodings = [{}];\n }\n\n const [encoding] = parameters.encodings;\n const scaleResolutionDownByCurrent = encoding.scaleResolutionDownBy;\n const scaleResolutionDownByTarget = performUpdateScaleResolutionDownBy(\n encodingsTarget.scaleResolutionDownBy,\n scaleResolutionDownByCurrent\n );\n\n let isChanged = false;\n\n if (scaleResolutionDownByTarget !== undefined) {\n parameters.encodings[0].scaleResolutionDownBy = scaleResolutionDownByTarget;\n isChanged = true;\n }\n\n const maxBitrateCurrent = encoding.maxBitrate;\n const maxBitrateTarget = performUpdateMaxBitrate(encodingsTarget.maxBitrate, maxBitrateCurrent);\n\n if (maxBitrateTarget !== undefined) {\n parameters.encodings[0].maxBitrate = maxBitrateTarget;\n isChanged = true;\n }\n\n if (isChanged) {\n if (onSetParameters) {\n onSetParameters(parameters);\n }\n\n return sender.setParameters(parameters).then(() => {\n return { parameters, isChanged };\n });\n }\n\n return Promise.resolve({ parameters, isChanged });\n};\n\nexport default setEncodingsToSender;\n","export const INCOMING_CALL = 'incomingCall';\nexport const DECLINED_INCOMING_CALL = 'declinedIncomingCall';\nexport const FAILED_INCOMING_CALL = 'failedIncomingCall';\nexport const TERMINATED_INCOMING_CALL = 'terminatedIncomingCall';\nexport const CONNECTING = 'connecting';\nexport const CONNECTED = 'connected';\nexport const DISCONNECTED = 'disconnected';\nexport const NEW_RTC_SESSION = 'newRTCSession';\nexport const REGISTERED = 'registered';\nexport const UNREGISTERED = 'unregistered';\nexport const REGISTRATION_FAILED = 'registrationFailed';\nexport const NEW_MESSAGE = 'newMessage';\nexport const SIP_EVENT = 'sipEvent';\nexport const AVAILABLE_SECOND_REMOTE_STREAM_EVENT = 'availableSecondRemoteStream';\nexport const NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT = 'notAvailableSecondRemoteStream';\nexport const MUST_STOP_PRESENTATION_EVENT = 'mustStopPresentation';\nexport const SHARE_STATE = 'shareState';\nexport const ENTER_ROOM = 'enterRoom';\nexport const USE_LICENSE = 'useLicense';\nexport const PEER_CONNECTION_CONFIRMED = 'peerconnection:confirmed';\nexport const PEER_CONNECTION_ONTRACK = 'peerconnection:ontrack';\nexport const CHANNELS = 'channels';\nexport const CHANNELS_NOTIFY = 'channels:notify';\nexport const ENDED_FROM_SERVER = 'ended:fromserver';\nexport const MAIN_CAM_CONTROL = 'main-cam-control';\nexport const ADMIN_STOP_MAIN_CAM = 'admin-stop-main-cam';\nexport const ADMIN_START_MAIN_CAM = 'admin-start-main-cam';\nexport const ADMIN_STOP_MIC = 'admin-stop-mic';\nexport const ADMIN_START_MIC = 'admin-start-mic';\nexport const ADMIN_FORCE_SYNC_MEDIA_STATE = 'admin-force-sync-media-state';\nexport const PARTICIPANT_ADDED_TO_LIST_MODERATORS = 'participant:added-to-list-moderators';\nexport const PARTICIPANT_REMOVED_FROM_LIST_MODERATORS = 'participant:removed-from-list-moderators';\nexport const PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE = 'participant:move-request-to-conference';\nexport const PARTICIPANT_MOVE_REQUEST_TO_STREAM = 'participant:move-request-to-stream';\nexport const PARTICIPANT_CANCELLING_WORD_REQUEST = 'participant:canceling-word-request';\nexport const WEBCAST_STARTED = 'webcast:started';\nexport const WEBCAST_STOPPED = 'webcast:stopped';\nexport const ACCOUNT_CHANGED = 'account:changed';\nexport const ACCOUNT_DELETED = 'account:deleted';\nexport const CONFERENCE_PARTICIPANT_TOKEN_ISSUED = 'conference:participant-token-issued';\nexport const ENDED = 'ended';\nexport const SENDING = 'sending';\nexport const REINVITE = 'reinvite';\nexport const REPLACES = 'replaces';\nexport const REFER = 'refer';\nexport const PROGRESS = 'progress';\nexport const ACCEPTED = 'accepted';\nexport const CONFIRMED = 'confirmed';\nexport const PEER_CONNECTION = 'peerconnection';\nexport const FAILED = 'failed';\nexport const MUTED = 'muted';\nexport const UNMUTED = 'unmuted';\nexport const NEW_DTMF = 'newDTMF';\nexport const NEW_INFO = 'newInfo';\nexport const HOLD = 'hold';\nexport const UNHOLD = 'unhold';\nexport const UPDATE = 'update';\nexport const SDP = 'sdp';\nexport const ICE_CANDIDATE = 'icecandidate';\nexport const GET_USER_MEDIA_FAILED = 'getusermediafailed';\nexport const PEER_CONNECTION_CREATE_OFFER_FAILED = 'peerconnection:createofferfailed';\nexport const PEER_CONNECTION_CREATE_ANSWER_FAILED = 'peerconnection:createanswerfailed';\nexport const PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED =\n 'peerconnection:setlocaldescriptionfailed';\nexport const PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED =\n 'peerconnection:setremotedescriptionfailed';\nexport const PRESENTATION_START = 'presentation:start';\nexport const PRESENTATION_STARTED = 'presentation:started';\nexport const PRESENTATION_END = 'presentation:end';\nexport const PRESENTATION_ENDED = 'presentation:ended';\nexport const PRESENTATION_FAILED = 'presentation:failed';\n","import {\n INCOMING_CALL,\n DECLINED_INCOMING_CALL,\n TERMINATED_INCOMING_CALL,\n FAILED_INCOMING_CALL,\n CONNECTING,\n CONNECTED,\n DISCONNECTED,\n NEW_RTC_SESSION,\n REGISTERED,\n UNREGISTERED,\n REGISTRATION_FAILED,\n NEW_MESSAGE,\n SIP_EVENT,\n AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n MUST_STOP_PRESENTATION_EVENT,\n SHARE_STATE,\n ENTER_ROOM,\n USE_LICENSE,\n PEER_CONNECTION_CONFIRMED,\n PEER_CONNECTION_ONTRACK,\n CHANNELS,\n CHANNELS_NOTIFY,\n ENDED_FROM_SERVER,\n MAIN_CAM_CONTROL,\n ADMIN_START_MAIN_CAM,\n ADMIN_STOP_MAIN_CAM,\n ADMIN_STOP_MIC,\n ADMIN_START_MIC,\n ADMIN_FORCE_SYNC_MEDIA_STATE,\n PARTICIPANT_ADDED_TO_LIST_MODERATORS,\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE,\n PARTICIPANT_MOVE_REQUEST_TO_STREAM,\n PARTICIPANT_CANCELLING_WORD_REQUEST,\n WEBCAST_STARTED,\n WEBCAST_STOPPED,\n ACCOUNT_CHANGED,\n ACCOUNT_DELETED,\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n ENDED,\n SENDING,\n REINVITE,\n REPLACES,\n REFER,\n PROGRESS,\n ACCEPTED,\n CONFIRMED,\n PEER_CONNECTION,\n FAILED,\n MUTED,\n UNMUTED,\n NEW_DTMF,\n NEW_INFO,\n HOLD,\n UNHOLD,\n UPDATE,\n SDP,\n ICE_CANDIDATE,\n GET_USER_MEDIA_FAILED,\n PEER_CONNECTION_CREATE_OFFER_FAILED,\n PEER_CONNECTION_CREATE_ANSWER_FAILED,\n PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED,\n PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED,\n PRESENTATION_START,\n PRESENTATION_STARTED,\n PRESENTATION_END,\n PRESENTATION_ENDED,\n PRESENTATION_FAILED,\n} from './constants';\n\nexport const UA_SYNTHETICS_EVENT_NAMES = [\n INCOMING_CALL,\n DECLINED_INCOMING_CALL,\n TERMINATED_INCOMING_CALL,\n FAILED_INCOMING_CALL,\n PARTICIPANT_CANCELLING_WORD_REQUEST,\n PARTICIPANT_MOVE_REQUEST_TO_STREAM,\n PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE,\n CHANNELS_NOTIFY,\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n ACCOUNT_CHANGED,\n ACCOUNT_DELETED,\n WEBCAST_STARTED,\n WEBCAST_STOPPED,\n PARTICIPANT_ADDED_TO_LIST_MODERATORS,\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n] as const;\n\nexport const UA_JSSIP_EVENT_NAMES = [\n CONNECTING,\n CONNECTED,\n DISCONNECTED,\n NEW_RTC_SESSION,\n REGISTERED,\n UNREGISTERED,\n REGISTRATION_FAILED,\n NEW_MESSAGE,\n SIP_EVENT,\n] as const;\n\nexport const SESSION_SYNTHETICS_EVENT_NAMES = [\n AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n MUST_STOP_PRESENTATION_EVENT,\n SHARE_STATE,\n ENTER_ROOM,\n USE_LICENSE,\n PEER_CONNECTION_CONFIRMED,\n PEER_CONNECTION_ONTRACK,\n CHANNELS,\n ENDED_FROM_SERVER,\n MAIN_CAM_CONTROL,\n ADMIN_START_MAIN_CAM,\n ADMIN_STOP_MAIN_CAM,\n ADMIN_STOP_MIC,\n ADMIN_START_MIC,\n ADMIN_FORCE_SYNC_MEDIA_STATE,\n] as const;\n\nexport const SESSION_JSSIP_EVENT_NAMES = [\n ENDED,\n CONNECTING,\n SENDING,\n REINVITE,\n REPLACES,\n REFER,\n PROGRESS,\n ACCEPTED,\n CONFIRMED,\n PEER_CONNECTION,\n FAILED,\n MUTED,\n UNMUTED,\n NEW_DTMF,\n NEW_INFO,\n HOLD,\n UNHOLD,\n UPDATE,\n SDP,\n ICE_CANDIDATE,\n GET_USER_MEDIA_FAILED,\n PEER_CONNECTION_CREATE_OFFER_FAILED,\n PEER_CONNECTION_CREATE_ANSWER_FAILED,\n PEER_CONNECTION_SET_LOCAL_DESCRIPTION_FAILED,\n PEER_CONNECTION_SET_REMOTE_DESCRIPTION_FAILED,\n PRESENTATION_START,\n PRESENTATION_STARTED,\n PRESENTATION_END,\n PRESENTATION_ENDED,\n PRESENTATION_FAILED,\n] as const;\n\nexport const UA_EVENT_NAMES = [...UA_JSSIP_EVENT_NAMES, ...UA_SYNTHETICS_EVENT_NAMES];\n\nexport const SESSION_EVENT_NAMES = [\n ...SESSION_JSSIP_EVENT_NAMES,\n ...SESSION_SYNTHETICS_EVENT_NAMES,\n] as const;\n\nexport type TEventUA = (typeof UA_EVENT_NAMES)[number];\n\nexport type TEventSession = (typeof SESSION_EVENT_NAMES)[number];\n","// Generic error causes.\nexport const CONNECTION_ERROR = 'Connection Error';\nexport const REQUEST_TIMEOUT = 'Request Timeout';\nexport const SIP_FAILURE_CODE = 'SIP Failure Code';\nexport const INTERNAL_ERROR = 'Internal Error';\n// SIP error causes.\nexport const BUSY = 'Busy';\nexport const REJECTED = 'Rejected';\nexport const REDIRECTED = 'Redirected';\nexport const UNAVAILABLE = 'Unavailable';\nexport const NOT_FOUND = 'Not Found';\nexport const ADDRESS_INCOMPLETE = 'Address Incomplete';\nexport const INCOMPATIBLE_SDP = 'Incompatible SDP';\nexport const MISSING_SDP = 'Missing SDP';\nexport const AUTHENTICATION_ERROR = 'Authentication Error';\n// Session error causes.\nexport const BYE = 'Terminated';\nexport const WEBRTC_ERROR = 'WebRTC Error';\nexport const CANCELED = 'Canceled';\nexport const NO_ANSWER = 'No Answer';\nexport const EXPIRES = 'Expires';\nexport const NO_ACK = 'No ACK';\nexport const DIALOG_ERROR = 'Dialog Error';\nexport const USER_DENIED_MEDIA_ACCESS = 'User Denied Media Access';\nexport const BAD_MEDIA_DESCRIPTION = 'Bad Media Description';\nexport const RTP_TIMEOUT = 'RTP Timeout';\n","export const HEADER_CONTENT_TYPE_NAME = 'content-type';\n\nexport const HEADER_CONTENT_ENTER_ROOM = 'x-webrtc-enter-room';\nexport const CONTENT_TYPE_SHARE_STATE = 'application/vinteo.webrtc.sharedesktop';\nexport const CONTENT_TYPE_ENTER_ROOM = 'application/vinteo.webrtc.roomname';\nexport const CONTENT_TYPE_CHANNELS = 'application/vinteo.webrtc.channels';\nexport const CONTENT_TYPE_MEDIA_STATE = 'application/vinteo.webrtc.mediastate';\nexport const CONTENT_TYPE_REFUSAL = 'application/vinteo.webrtc.refusal';\nexport const CONTENT_TYPE_MAIN_CAM = 'application/vinteo.webrtc.maincam';\nexport const CONTENT_TYPE_MIC = 'application/vinteo.webrtc.mic';\nexport const CONTENT_TYPE_USE_LICENSE = 'application/vinteo.webrtc.uselic';\nexport const HEADER_CONTENT_USE_LICENSE = 'X-WEBRTC-USE-LICENSE';\nexport const HEADER_INPUT_CHANNELS = 'X-WEBRTC-INPUT-CHANNELS';\nexport const HEADER_OUTPUT_CHANNELS = 'X-WEBRTC-OUTPUT-CHANNELS';\nexport const HEADER_MAIN_CAM = 'X-WEBRTC-MAINCAM';\nexport const HEADER_MIC = 'X-WEBRTC-MIC';\nexport const HEADER_MEDIA_SYNC = 'X-WEBRTC-SYNC';\nexport const HEADER_MAIN_CAM_RESOLUTION = 'X-WEBRTC-MAINCAM-RESOLUTION';\nexport const HEADER_MEDIA_STATE = 'X-WEBRTC-MEDIA-STATE';\nexport const HEADER_MEDIA_TYPE = 'X-Vinteo-Media-Type';\nexport const HEADER_MAIN_CAM_STATE = 'X-Vinteo-MainCam-State';\nexport const HEADER_MIC_STATE = 'X-Vinteo-Mic-State';\n\nexport const CONTENT_TYPE_NOTIFY = 'application/vinteo.webrtc.notify';\nexport const HEADER_NOTIFY = 'X-VINTEO-NOTIFY';\n\nexport const HEADER_CONTENT_SHARE_STATE = 'x-webrtc-share-state';\nexport const HEADER_START_PRESENTATION = `${HEADER_CONTENT_SHARE_STATE}: LETMESTARTPRESENTATION`;\nexport const HEADER_STOP_PRESENTATION = `${HEADER_CONTENT_SHARE_STATE}: STOPPRESENTATION`;\nexport const AVAILABLE_SECOND_REMOTE_STREAM = 'YOUCANRECEIVECONTENT';\nexport const NOT_AVAILABLE_SECOND_REMOTE_STREAM = 'CONTENTEND';\nexport const MUST_STOP_PRESENTATION = 'YOUMUSTSTOPSENDCONTENT';\nexport const HEADER_START_PRESENTATION_P2P = `${HEADER_CONTENT_SHARE_STATE}: ${AVAILABLE_SECOND_REMOTE_STREAM}`;\nexport const HEADER_STOP_PRESENTATION_P2P = `${HEADER_CONTENT_SHARE_STATE}: ${NOT_AVAILABLE_SECOND_REMOTE_STREAM}`;\n\nexport const HEADER_CONTENT_ENABLE_MEDIA_DEVICE = 'X-WEBRTC-REQUEST-ENABLE-MEDIA-DEVICE';\nexport const HEADER_ENABLE_MAIN_CAM = `${HEADER_CONTENT_ENABLE_MEDIA_DEVICE}: LETMESTARTMAINCAM`;\n","export function resolveSipUrl(serverUrl: string): (string) => string {\n return (id: string): string => {\n return `sip:${id}@${serverUrl}`;\n };\n}\n\nconst resolveRandomInt = (min: number, max: number) => {\n return () => {\n return Math.floor(Math.random() * (max - min)) + min;\n };\n};\nexport const parseDisplayName = (displayName: string) => {\n return displayName.trim().replace(/ /g, '_');\n};\nexport const generateUserId = resolveRandomInt(100000, 99999999);\n\nexport const prepareMediaStream = (\n mediaStream?: MediaStream,\n {\n videoMode,\n audioMode,\n }: {\n videoMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n audioMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n } = {}\n): MediaStream | undefined => {\n if (!mediaStream || (videoMode === 'recvonly' && audioMode === 'recvonly')) {\n return undefined;\n }\n\n const audioTracks = audioMode === 'recvonly' ? [] : mediaStream.getAudioTracks();\n const videoTracks = videoMode === 'recvonly' ? [] : mediaStream.getVideoTracks();\n const tracks = [...audioTracks, ...videoTracks];\n const newStream = new MediaStream(tracks);\n\n newStream.getTracks = () => {\n return [...newStream.getAudioTracks(), ...newStream.getVideoTracks()]; // for garante audio first order\n };\n\n return newStream;\n};\n\nexport const hasVideoTracks = (remoteTracks: MediaStreamTrack[]): boolean => {\n const isVideoTracksExists = remoteTracks.some((remoteTrack: MediaStreamTrack): boolean => {\n const { kind } = remoteTrack;\n\n return kind === 'video';\n });\n\n return isVideoTracksExists;\n};\n","import type { UA, URI, WebSocketInterface } from '@krivega/jssip';\nimport type { IncomingRequest } from '@krivega/jssip/lib/SIPMessage';\nimport type RTCSession from '@krivega/jssip/lib/RTCSession';\nimport type { IncomingInfoEvent, OutgoingInfoEvent } from '@krivega/jssip/lib/RTCSession';\nimport type {\n IncomingRTCSessionEvent,\n RegisteredEvent,\n UnRegisteredEvent,\n} from '@krivega/jssip/lib/UA';\nimport { CancelableRequest, isCanceledError } from '@krivega/cancelable-promise';\nimport Events from 'events-constructor';\nimport scaleBitrate from './videoSendingBalancer/scaleBitrate';\nimport {\n UA_EVENT_NAMES,\n UA_JSSIP_EVENT_NAMES,\n SESSION_EVENT_NAMES,\n SESSION_JSSIP_EVENT_NAMES,\n} from './eventNames';\nimport type { TEventUA, TEventSession } from './eventNames';\nimport { REQUEST_TIMEOUT, REJECTED, BYE, CANCELED } from './causes';\nimport {\n HEADER_CONTENT_SHARE_STATE,\n HEADER_CONTENT_ENTER_ROOM,\n HEADER_CONTENT_TYPE_NAME,\n CONTENT_TYPE_SHARE_STATE,\n CONTENT_TYPE_ENTER_ROOM,\n CONTENT_TYPE_CHANNELS,\n CONTENT_TYPE_MEDIA_STATE,\n CONTENT_TYPE_REFUSAL,\n CONTENT_TYPE_MAIN_CAM,\n CONTENT_TYPE_MIC,\n CONTENT_TYPE_USE_LICENSE,\n HEADER_CONTENT_USE_LICENSE,\n HEADER_MEDIA_SYNC,\n HEADER_INPUT_CHANNELS,\n HEADER_OUTPUT_CHANNELS,\n HEADER_MEDIA_STATE,\n HEADER_MEDIA_TYPE,\n HEADER_MAIN_CAM_STATE,\n HEADER_MIC_STATE,\n HEADER_ENABLE_MAIN_CAM,\n HEADER_START_PRESENTATION,\n HEADER_STOP_PRESENTATION,\n HEADER_MAIN_CAM,\n HEADER_MIC,\n HEADER_MAIN_CAM_RESOLUTION,\n CONTENT_TYPE_NOTIFY,\n HEADER_NOTIFY,\n AVAILABLE_SECOND_REMOTE_STREAM,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM,\n MUST_STOP_PRESENTATION,\n HEADER_START_PRESENTATION_P2P,\n HEADER_STOP_PRESENTATION_P2P,\n} from './headers';\nimport getExtraHeadersRemoteAddress from './getExtraHeadersRemoteAddress';\nimport {\n generateUserId,\n hasVideoTracks,\n parseDisplayName,\n prepareMediaStream,\n resolveSipUrl,\n} from './utils';\nimport { hasDeclineResponseFromServer } from './utils/errors';\nimport {\n AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT,\n MUST_STOP_PRESENTATION_EVENT,\n INCOMING_CALL,\n DECLINED_INCOMING_CALL,\n FAILED_INCOMING_CALL,\n TERMINATED_INCOMING_CALL,\n CONNECTING,\n CONNECTED,\n DISCONNECTED,\n NEW_RTC_SESSION,\n REGISTERED,\n UNREGISTERED,\n REGISTRATION_FAILED,\n SIP_EVENT,\n SHARE_STATE,\n ENTER_ROOM,\n USE_LICENSE,\n PEER_CONNECTION_CONFIRMED,\n PEER_CONNECTION_ONTRACK,\n CHANNELS,\n CHANNELS_NOTIFY,\n ENDED_FROM_SERVER,\n MAIN_CAM_CONTROL,\n ADMIN_START_MAIN_CAM,\n ADMIN_STOP_MAIN_CAM,\n ADMIN_STOP_MIC,\n ADMIN_START_MIC,\n ADMIN_FORCE_SYNC_MEDIA_STATE,\n PARTICIPANT_ADDED_TO_LIST_MODERATORS,\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE,\n PARTICIPANT_MOVE_REQUEST_TO_STREAM,\n PARTICIPANT_CANCELLING_WORD_REQUEST,\n WEBCAST_STARTED,\n WEBCAST_STOPPED,\n ACCOUNT_CHANGED,\n ACCOUNT_DELETED,\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n ENDED,\n CONFIRMED,\n PEER_CONNECTION,\n FAILED,\n NEW_DTMF,\n NEW_INFO,\n PRESENTATION_ENDED,\n PRESENTATION_FAILED,\n} from './constants';\n\nconst BUSY_HERE_STATUS_CODE = 486;\nconst REQUEST_TERMINATED_STATUS_CODE = 487;\nconst ORIGINATOR_LOCAL = 'local';\nconst ORIGINATOR_REMOTE = 'remote';\n\nexport enum EEventsMainCAM {\n PAUSE_MAIN_CAM = 'PAUSEMAINCAM',\n RESUME_MAIN_CAM = 'RESUMEMAINCAM',\n MAX_MAIN_CAM_RESOLUTION = 'MAXMAINCAMRESOLUTION',\n ADMIN_STOP_MAIN_CAM = 'ADMINSTOPMAINCAM',\n ADMIN_START_MAIN_CAM = 'ADMINSTARTMAINCAM',\n}\n\nexport enum EEventsMic {\n ADMIN_STOP_MIC = 'ADMINSTOPMIC',\n ADMIN_START_MIC = 'ADMINSTARTMIC',\n}\n\nexport enum EEventsSyncMediaState {\n ADMIN_SYNC_FORCED = '1',\n ADMIN_SYNC_NOT_FORCED = '0',\n}\n\nexport enum EUseLicense {\n AUDIO = 'AUDIO',\n VIDEO = 'VIDEO',\n AUDIOPLUSPRESENTATION = 'AUDIOPLUSPRESENTATION',\n}\n\nexport interface ICustomError extends Error {\n originator?: string;\n cause?: unknown;\n message: any;\n socket?: any;\n url?: string;\n code?: string;\n}\n\nexport const hasCanceledCallError = (error: ICustomError = new Error()): boolean => {\n const { originator, cause } = error;\n\n if (isCanceledError(error)) {\n return true;\n }\n\n if (typeof cause === 'string') {\n return (\n cause === REQUEST_TIMEOUT ||\n cause === REJECTED ||\n (originator === ORIGINATOR_LOCAL && (cause === CANCELED || cause === BYE))\n );\n }\n\n return false;\n};\n\nconst moduleName = 'SipConnector';\n\nexport type TJsSIP = {\n UA: typeof UA;\n WebSocketInterface: typeof WebSocketInterface;\n};\n\ntype TChannels = {\n inputChannels: string;\n outputChannels: string;\n};\n\ntype TMediaState = {\n cam: boolean;\n mic: boolean;\n};\n\ntype TParametersModeratorsList = {\n conference: string;\n};\n\ntype TParametersWebcast = {\n conference: string;\n type: string;\n};\n\ntype TParametersConferenceParticipantTokenIssued = {\n conference: string;\n participant: string;\n jwt: string;\n};\n\ntype TOptionsInfoMediaState = {\n noTerminateWhenError: boolean;\n};\n\nconst CMD_CHANNELS = 'channels' as const;\nconst CMD_WEBCAST_STARTED = 'WebcastStarted' as const;\nconst CMD_WEBCAST_STOPPED = 'WebcastStopped' as const;\nconst CMD_ACCOUNT_CHANGED = 'accountChanged' as const;\nconst CMD_ACCOUNT_DELETED = 'accountDeleted' as const;\nconst CMD_ADDED_TO_LIST_MODERATORS = 'addedToListModerators' as const;\nconst CMD_REMOVED_FROM_LIST_MODERATORS = 'removedFromListModerators' as const;\nconst CMD_MOVE_REQUEST_TO_CONFERENCE = 'WebcastParticipationAccepted' as const;\nconst CMD_CANCELLING_WORD_REQUEST = 'WebcastParticipationRejected' as const;\nconst CMD_MOVE_REQUEST_TO_STREAM = 'ParticipantMovedToWebcast' as const;\nconst CMD_CONFERENCE_PARTICIPANT_TOKEN_ISSUED = 'ConferenceParticipantTokenIssued' as const;\n\ntype TAddedToListModeratorsInfoNotify = {\n cmd: typeof CMD_ADDED_TO_LIST_MODERATORS;\n conference: string;\n};\ntype TRemovedFromListModeratorsInfoNotify = {\n cmd: typeof CMD_REMOVED_FROM_LIST_MODERATORS;\n conference: string;\n};\ntype TMoveRequestToConferenceInfoNotify = {\n cmd: typeof CMD_MOVE_REQUEST_TO_CONFERENCE;\n body: { conference: string };\n};\ntype TCancelingWordRequestInfoNotify = {\n cmd: typeof CMD_CANCELLING_WORD_REQUEST;\n body: { conference: string };\n};\ntype TMoveRequestToStreamInfoNotify = {\n cmd: typeof CMD_MOVE_REQUEST_TO_STREAM;\n body: { conference: string };\n};\n\ntype TConferenceParticipantTokenIssued = {\n cmd: typeof CMD_CONFERENCE_PARTICIPANT_TOKEN_ISSUED;\n body: { conference: string; participant: string; jwt: string };\n};\n\ntype TWebcastInfoNotify = {\n cmd: typeof CMD_WEBCAST_STARTED;\n body: { conference: string; type: string };\n};\ntype TChannelsInfoNotify = { cmd: typeof CMD_CHANNELS; input: string; output: string };\ntype TInfoNotify = Omit<\n TChannelsInfoNotify | TAddedToListModeratorsInfoNotify | TRemovedFromListModeratorsInfoNotify,\n 'cmd'\n> & { cmd: string };\n\ntype TOptionsExtraHeaders = {\n extraHeaders?: string[];\n};\n\ntype TOntrack = (track: RTCTrackEvent) => void;\n\ntype TParametersConnection = {\n displayName?: string;\n user?: string;\n password?: string;\n register?: boolean;\n sipServerUrl: string;\n sipWebSocketServerURL: string;\n remoteAddress?: string;\n sdpSemantics?: 'plan-b' | 'unified-plan';\n sessionTimers?: boolean;\n registerExpires?: number;\n connectionRecoveryMinInterval?: number;\n connectionRecoveryMaxInterval?: number;\n userAgent?: string;\n} & TOptionsExtraHeaders;\n\ntype TConnect = (parameters: TParametersConnection) => Promise<UA>;\ntype TCreateUa = (parameters: TParametersConnection) => Promise<UA>;\ntype TStart = () => Promise<UA>;\ntype TSet = ({\n displayName,\n password,\n}: {\n displayName?: string;\n password?: string;\n}) => Promise<boolean>;\n\ntype TDegradationPreference = 'maintain-framerate' | 'maintain-resolution' | 'balanced';\ntype TCall = ({\n number,\n mediaStream,\n extraHeaders,\n ontrack,\n iceServers,\n videoMode,\n audioMode,\n offerToReceiveAudio,\n offerToReceiveVideo,\n degradationPreference,\n}: {\n number: string;\n mediaStream?: MediaStream;\n extraHeaders?: TOptionsExtraHeaders['extraHeaders'];\n ontrack?: TOntrack;\n iceServers?: RTCIceServer[];\n videoMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n audioMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n offerToReceiveAudio?: boolean;\n offerToReceiveVideo?: boolean;\n degradationPreference?: TDegradationPreference;\n}) => Promise<RTCPeerConnection>;\n\ntype TDisconnect = () => Promise<void>;\n\ntype TParametersAnswerToIncomingCall = {\n mediaStream: MediaStream;\n extraHeaders?: TOptionsExtraHeaders['extraHeaders'];\n ontrack?: TOntrack;\n iceServers?: RTCIceServer[];\n videoMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n audioMode?: 'sendrecv' | 'sendonly' | 'recvonly';\n degradationPreference?: TDegradationPreference;\n};\n\ntype TAnswerToIncomingCall = (\n parameters: TParametersAnswerToIncomingCall\n) => Promise<RTCPeerConnection>;\n\ntype TSendDTMF = (tone: number | string) => Promise<void>;\n\ntype THangUp = () => Promise<void>;\n\nexport default class SipConnector {\n private _isRegisterConfig = false;\n\n private _connectionConfiguration: {\n sipServerUrl?: string;\n displayName?: string;\n register?: boolean;\n user?: string;\n password?: string;\n number?: string;\n answer?: boolean;\n } = {};\n\n private _remoteStreams: { [key: string]: MediaStream } = {};\n\n private JsSIP: TJsSIP;\n\n private _sessionEvents: Events<typeof SESSION_EVENT_NAMES>;\n\n private _uaEvents: Events<typeof UA_EVENT_NAMES>;\n\n private _cancelableConnect: CancelableRequest<Parameters<TConnect>[0], ReturnType<TConnect>>;\n\n private _cancelableCreateUa: CancelableRequest<Parameters<TCreateUa>[0], ReturnType<TCreateUa>>;\n\n private _cancelableDisconnect: CancelableRequest<void, ReturnType<TDisconnect>>;\n\n private _cancelableSet: CancelableRequest<Parameters<TSet>[0], ReturnType<TSet>>;\n\n private _cancelableCall: CancelableRequest<Parameters<TCall>[0], ReturnType<TCall>>;\n\n private _cancelableAnswer: CancelableRequest<\n Parameters<TAnswerToIncomingCall>[0],\n ReturnType<TAnswerToIncomingCall>\n >;\n\n private _cancelableSendDTMF: CancelableRequest<Parameters<TSendDTMF>[0], ReturnType<TSendDTMF>>;\n\n private getSipServerUrl: (id: string) => string = (id: string) => {\n return id;\n };\n\n promisePendingStartPresentation?: Promise<MediaStream>;\n promisePendingStopPresentation?: Promise<void | MediaStream>;\n\n ua?: UA;\n\n session?: RTCSession;\n\n incomingSession?: RTCSession;\n\n _streamPresentationCurrent?: MediaStream;\n\n socket?: WebSocketInterface;\n\n constructor({ JsSIP }: { JsSIP: TJsSIP }) {\n this.JsSIP = JsSIP;\n\n this._sessionEvents = new Events<typeof SESSION_EVENT_NAMES>(SESSION_EVENT_NAMES);\n this._uaEvents = new Events<typeof UA_EVENT_NAMES>(UA_EVENT_NAMES);\n\n this._cancelableConnect = new CancelableRequest<Parameters<TConnect>[0], ReturnType<TConnect>>(\n this._connect,\n {\n moduleName,\n afterCancelRequest: () => {\n this._cancelableCreateUa.cancelRequest();\n this._cancelableDisconnect.cancelRequest();\n },\n }\n );\n\n this._cancelableCreateUa = new CancelableRequest<\n Parameters<TCreateUa>[0],\n ReturnType<TCreateUa>\n >(this._createUa, { moduleName });\n\n this._cancelableDisconnect = new CancelableRequest<void, ReturnType<TDisconnect>>(\n this._disconnect,\n { moduleName }\n );\n\n this._cancelableSet = new CancelableRequest<Parameters<TSet>[0], ReturnType<TSet>>(this._set, {\n moduleName,\n });\n\n this._cancelableCall = new CancelableRequest<Parameters<TCall>[0], ReturnType<TCall>>(\n this._call,\n { moduleName }\n );\n\n this._cancelableAnswer = new CancelableRequest<\n Parameters<TAnswerToIncomingCall>[0],\n ReturnType<TAnswerToIncomingCall>\n >(this._answer, { moduleName });\n\n this._cancelableSendDTMF = new CancelableRequest<\n Parameters<TSendDTMF>[0],\n ReturnType<TSendDTMF>\n >(this._sendDTMF, { moduleName });\n\n this.onSession(SHARE_STATE, this._handleShareState);\n this.onSession(NEW_INFO, this._handleNewInfo);\n this.on(SIP_EVENT, this._handleSipEvent);\n\n this.onSession(FAILED, this._handleEnded);\n this.onSession(ENDED, this._handleEnded);\n }\n\n connect: TConnect = (data) => {\n this._cancelRequests();\n\n return this._cancelableConnect.request(data);\n };\n\n createUa: TCreateUa = (data) => {\n return this._cancelableCreateUa.request(data);\n };\n\n set: TSet = (data) => {\n return this._cancelableSet.request(data);\n };\n\n call: TCall = (data) => {\n return this._cancelableCall.request(data);\n };\n\n disconnect: TDisconnect = () => {\n this._cancelRequests();\n\n return this._disconnectWithoutCancelRequests();\n };\n\n answerToIncomingCall: TAnswerToIncomingCall = (data) => {\n return this._cancelableAnswer.request(data);\n };\n\n sendDTMF: TSendDTMF = (tone) => {\n return this._cancelableSendDTMF.request(tone);\n };\n\n hangUp: THangUp = () => {\n this._cancelRequests();\n\n return this._hangUpWithoutCancelRequests();\n };\n\n register(): Promise<RegisteredEvent> {\n return new Promise((resolve, reject) => {\n if (this.isRegisterConfig) {\n this.ua!.on(REGISTERED, resolve);\n this.ua!.on(REGISTRATION_FAILED, reject);\n this.ua!.register();\n } else {\n reject(new Error('Config is not registered'));\n }\n });\n }\n\n unregister(): Promise<UnRegisteredEvent> {\n return new Promise((resolve, reject) => {\n if (this.isRegistered) {\n this.ua!.on(UNREGISTERED, resolve);\n this.ua!.unregister();\n } else {\n reject(new Error('ua is not registered'));\n }\n });\n }\n\n tryRegister = () => {\n if (!this.isRegisterConfig) {\n return Promise.reject(new Error('Config is not registered'));\n }\n\n this._uaEvents.trigger(CONNECTING, undefined);\n\n return this.unregister()\n .finally(() => {\n return this.register();\n })\n .finally(() => {\n return undefined;\n });\n };\n\n sendOptions(target: string | URI, body?: string, extraHeaders?: string[]): Promise<void> {\n if (!this.ua) {\n return Promise.reject(new Error('is not connected'));\n }\n\n return new Promise((resolve, reject) => {\n try {\n this.ua.sendOptions(target, body, {\n extraHeaders,\n eventHandlers: {\n succeeded: () => {\n resolve();\n },\n failed: (error) => {\n reject(error);\n },\n },\n });\n } catch (error) {\n reject(error);\n }\n });\n }\n\n ping(body?: string, extraHeaders?: string[]): Promise<void> {\n if (!this.ua || !this.ua.configuration || !this.ua.configuration.uri) {\n return Promise.reject(new Error('is not connected'));\n }\n\n const target = this.ua.configuration.uri;\n\n return this.sendOptions(target, body, extraHeaders);\n }\n\n replaceMediaStream(\n mediaStream: MediaStream,\n options?: {\n deleteExisting: boolean;\n addMissing: boolean;\n forceRenegotiation: boolean;\n degradationPreference?: TDegradationPreference;\n }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n return this.session.replaceMediaStream(mediaStream, options);\n }\n\n declineToIncomingCall = ({ statusCode = REQUEST_TERMINATED_STATUS_CODE } = {}) => {\n return new Promise((resolve, reject) => {\n if (!this.isAvailableIncomingCall) {\n reject(new Error('no incomingSession'));\n\n return undefined;\n }\n\n const incomingSession = this!.incomingSession as RTCSession;\n const callerData = this.remoteCallerData;\n\n this._cancelableCall.cancelRequest();\n this._cancelableAnswer.cancelRequest();\n\n this.removeIncomingSession();\n this._uaEvents.trigger(DECLINED_INCOMING_CALL, callerData);\n resolve(incomingSession.terminate({ status_code: statusCode }));\n\n return undefined;\n });\n };\n\n busyIncomingCall = () => {\n return this.declineToIncomingCall({ statusCode: BUSY_HERE_STATUS_CODE });\n };\n\n removeIncomingSession = () => {\n delete this.incomingSession;\n };\n\n askPermissionToEnableCam(\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const extraHeaders = [HEADER_ENABLE_MAIN_CAM];\n\n return this.session\n .sendInfo(CONTENT_TYPE_MAIN_CAM, undefined, {\n ...options,\n extraHeaders,\n })\n .catch((error) => {\n if (hasDeclineResponseFromServer(error)) {\n throw error;\n }\n\n return;\n });\n }\n\n get isPendingPresentation(): boolean {\n return !!this.promisePendingStartPresentation || !!this.promisePendingStopPresentation;\n }\n\n startPresentation(\n stream: MediaStream,\n {\n isNeedReinvite = true,\n isP2P = false,\n maxBitrate,\n degradationPreference,\n }: {\n isNeedReinvite?: boolean;\n isP2P?: boolean;\n maxBitrate?: number;\n degradationPreference?: TDegradationPreference;\n } = {}\n ): Promise<void | MediaStream> {\n const session = this.establishedSession;\n\n if (!session) {\n return Promise.reject(new Error('No session established'));\n }\n\n if (this._streamPresentationCurrent) {\n return Promise.reject(new Error('Presentation is already started'));\n }\n\n const streamPresentationCurrent = prepareMediaStream(stream) as MediaStream;\n\n this._streamPresentationCurrent = streamPresentationCurrent;\n\n const preparatoryHeaders = isP2P\n ? [HEADER_START_PRESENTATION_P2P]\n : [HEADER_START_PRESENTATION];\n\n const result = session\n .sendInfo(CONTENT_TYPE_SHARE_STATE, undefined, {\n extraHeaders: preparatoryHeaders,\n })\n .then(() => {\n return session.startPresentation(\n streamPresentationCurrent,\n isNeedReinvite,\n degradationPreference\n );\n })\n // @ts-ignore\n .then(() => {\n const { connection } = this;\n\n if (!connection || maxBitrate === undefined) {\n return undefined;\n }\n\n const senders = connection.getSenders();\n\n return scaleBitrate(senders, stream, maxBitrate);\n })\n .then(() => {\n return stream;\n })\n .catch((error) => {\n this._sessionEvents.trigger(PRESENTATION_FAILED, error);\n\n throw error;\n });\n\n this.promisePendingStartPresentation = result;\n\n return result.finally(() => {\n this.promisePendingStartPresentation = undefined;\n });\n }\n\n stopPresentation({\n isP2P = false,\n }: {\n isP2P?: boolean;\n } = {}): Promise<MediaStream | void> {\n const streamPresentationPrev = this._streamPresentationCurrent;\n let result: Promise<MediaStream | void> =\n this.promisePendingStartPresentation || Promise.resolve();\n\n const preparatoryHeaders = isP2P ? [HEADER_STOP_PRESENTATION_P2P] : [HEADER_STOP_PRESENTATION];\n\n const session = this.establishedSession;\n\n if (session && streamPresentationPrev) {\n result = result\n .then(() => {\n return session.sendInfo(CONTENT_TYPE_SHARE_STATE, undefined, {\n extraHeaders: preparatoryHeaders,\n });\n })\n .then(() => {\n return session.stopPresentation(streamPresentationPrev);\n })\n .catch((error) => {\n this._sessionEvents.trigger(PRESENTATION_FAILED, error);\n\n throw error;\n });\n }\n\n if (!session && streamPresentationPrev) {\n this._sessionEvents.trigger(PRESENTATION_ENDED, streamPresentationPrev);\n }\n\n this.promisePendingStopPresentation = result;\n\n return result.finally(() => {\n this._resetPresentation();\n });\n }\n\n _resetPresentation(): void {\n delete this._streamPresentationCurrent;\n\n this.promisePendingStartPresentation = undefined;\n this.promisePendingStopPresentation = undefined;\n }\n\n handleNewRTCSession = ({ originator, session }: IncomingRTCSessionEvent) => {\n if (originator === ORIGINATOR_REMOTE) {\n this.incomingSession = session;\n\n const callerData = this.remoteCallerData;\n\n session.on(FAILED, ({ originator }) => {\n this.removeIncomingSession();\n\n if (originator !== ORIGINATOR_LOCAL) {\n this._uaEvents.trigger(FAILED_INCOMING_CALL, callerData);\n } else {\n this._uaEvents.trigger(TERMINATED_INCOMING_CALL, callerData);\n }\n });\n\n this._uaEvents.trigger(INCOMING_CALL, callerData);\n }\n };\n\n on(eventName: TEventUA, handler) {\n return this._uaEvents.on(eventName, handler);\n }\n\n once(eventName: TEventUA, handler) {\n return this._uaEvents.once(eventName, handler);\n }\n\n onceRace(eventNames: TEventUA[], handler) {\n return this._uaEvents.onceRace(eventNames, handler);\n }\n\n wait(eventName: TEventUA): Promise<any> {\n return this._uaEvents.wait(eventName);\n }\n\n off(eventName: TEventUA, handler) {\n this._uaEvents.off(eventName, handler);\n }\n\n onSession(eventName: TEventSession, handler) {\n return this._sessionEvents.on(eventName, handler);\n }\n\n onceSession(eventName: TEventSession, handler) {\n return this._sessionEvents.once(eventName, handler);\n }\n\n onceRaceSession(eventNames: TEventSession[], handler) {\n return this._sessionEvents.onceRace(eventNames, handler);\n }\n\n waitSession(eventName: TEventSession): Promise<any> {\n return this._sessionEvents.wait(eventName);\n }\n\n offSession(eventName: TEventSession, handler) {\n this._sessionEvents.off(eventName, handler);\n }\n\n isConfigured() {\n return !!this.ua;\n }\n\n getConnectionConfiguration() {\n return { ...this._connectionConfiguration };\n }\n\n getRemoteStreams(): MediaStream[] | undefined {\n if (!this.connection) {\n return undefined;\n }\n\n const receivers = this.connection.getReceivers();\n const remoteTracks = receivers.map(({ track }) => {\n return track;\n });\n\n if (hasVideoTracks(remoteTracks)) {\n return this._generateStreams(remoteTracks);\n }\n\n return this._generateAudioStreams(remoteTracks);\n }\n\n get connection(): RTCPeerConnection | undefined {\n const connection = this?.session?.connection;\n\n return connection;\n }\n\n get remoteCallerData() {\n return {\n // eslint-disable-next-line camelcase\n displayName: this?.incomingSession?.remote_identity?.display_name,\n // eslint-disable-next-line camelcase\n host: this?.incomingSession?.remote_identity?.uri.host,\n // eslint-disable-next-line camelcase\n incomingNumber: this?.incomingSession?.remote_identity?.uri.user,\n session: this?.incomingSession,\n };\n }\n\n get requested() {\n return (\n this._cancelableConnect.requested ||\n this._cancelableCreateUa.requested ||\n this._cancelableCall.requested ||\n this._cancelableAnswer.requested\n );\n }\n\n get establishedSession(): RTCSession | undefined {\n return this.session && this.session.isEstablished() ? this.session : undefined;\n }\n\n get isRegistered() {\n return !!this.ua && this.ua.isRegistered();\n }\n\n get isRegisterConfig() {\n return !!this.ua && this._isRegisterConfig;\n }\n\n get isCallActive() {\n return !!(this.ua && this.session);\n }\n\n get isAvailableIncomingCall() {\n return !!this.incomingSession;\n }\n\n _connect: TConnect = (params) => {\n return this.createUa(params).then(() => {\n return this._start();\n });\n };\n\n _createUa: TCreateUa = async ({\n displayName = '',\n user,\n password,\n register = false,\n sipServerUrl,\n sipWebSocketServerURL,\n remoteAddress,\n extraHeaders = [],\n sdpSemantics = 'plan-b',\n sessionTimers = false,\n registerExpires = 60 * 5, // 5 minutes in sec\n connectionRecoveryMinInterval = 2,\n connectionRecoveryMaxInterval = 6,\n userAgent,\n }) => {\n if (!sipServerUrl) {\n throw new Error('sipServerUrl is required');\n }\n\n if (!sipWebSocketServerURL) {\n throw new Error('sipWebSocketServerURL is required');\n }\n\n if (register && !user) {\n throw new Error('user is required for authorized connection');\n }\n\n if (register && !password) {\n throw new Error('password is required for authorized connection');\n }\n\n this._connectionConfiguration = {\n sipServerUrl,\n displayName,\n register,\n user,\n password,\n };\n\n this._init({ sipServerUrl, sipWebSocketServerURL });\n\n let authorizationUser;\n\n if (register && user) {\n authorizationUser = user.trim();\n } else {\n authorizationUser = generateUserId();\n }\n\n const configuration = {\n password,\n register,\n display_name: parseDisplayName(displayName),\n user_agent: userAgent,\n sdp_semantics: sdpSemantics,\n sockets: [this.socket as WebSocketInterface],\n uri: this.getSipServerUrl(authorizationUser),\n session_timers: sessionTimers,\n register_expires: registerExpires,\n\n connection_recovery_min_interval: connectionRecoveryMinInterval,\n connection_recovery_max_interval: connectionRecoveryMaxInterval,\n };\n\n if (this.ua) {\n await this._disconnectWithoutCancelRequests();\n }\n\n this._isRegisterConfig = !!configuration.register;\n this.ua = new this.JsSIP.UA(configuration);\n\n this._uaEvents.eachTriggers((trigger, eventName) => {\n const uaJsSipEvent = UA_JSSIP_EVENT_NAMES.find((jsSipEvent) => {\n return jsSipEvent === eventName;\n });\n\n if (uaJsSipEvent) {\n this.ua!.on(uaJsSipEvent, trigger);\n }\n });\n\n const extraHeadersRemoteAddress = getExtraHeadersRemoteAddress(remoteAddress);\n const extraHeadersBase = [...extraHeadersRemoteAddress, ...extraHeaders];\n\n this.ua!.registrator().setExtraHeaders(extraHeadersBase);\n\n return this.ua;\n };\n\n _init({ sipServerUrl, sipWebSocketServerURL }) {\n this.getSipServerUrl = resolveSipUrl(sipServerUrl);\n this.socket = new this.JsSIP.WebSocketInterface(sipWebSocketServerURL);\n }\n\n _start: TStart = () => {\n return new Promise((resolve, reject) => {\n const resolveUa = () => {\n removeEventListeners();\n resolve(this.ua as UA);\n };\n const rejectError = (error) => {\n removeEventListeners();\n reject(error);\n };\n const addEventListeners = () => {\n if (this.isRegisterConfig) {\n this.on(REGISTERED, resolveUa);\n this.on(REGISTRATION_FAILED, rejectError);\n } else {\n this.on(CONNECTED, resolveUa);\n }\n\n this.on(DISCONNECTED, rejectError);\n };\n const removeEventListeners = () => {\n this.off(REGISTERED, resolveUa);\n this.off(REGISTRATION_FAILED, rejectError);\n this.off(CONNECTED, resolveUa);\n this.off(DISCONNECTED, rejectError);\n };\n\n addEventListeners();\n this.on(NEW_RTC_SESSION, this.handleNewRTCSession);\n\n this.ua!.start();\n });\n };\n\n _set: TSet = ({ displayName, password }) => {\n return new Promise((resolve, reject) => {\n let changedDisplayName = false;\n let changedPassword = false;\n\n if (displayName !== undefined && displayName !== this._connectionConfiguration.displayName) {\n changedDisplayName = this.ua!.set('display_name', parseDisplayName(displayName));\n this._connectionConfiguration.displayName = displayName;\n }\n\n if (password !== undefined && password !== this._connectionConfiguration.password) {\n changedPassword = this.ua!.set('password', password);\n this._connectionConfiguration.password = password;\n }\n\n const changedSome = changedDisplayName || changedPassword;\n\n if (changedPassword && this.isRegisterConfig) {\n this.register()\n .then(() => {\n return resolve(changedSome);\n })\n .catch(reject);\n } else if (changedSome) {\n resolve(changedSome);\n } else {\n reject(changedSome);\n }\n });\n };\n\n _disconnectWithoutCancelRequests: TDisconnect = () => {\n return this._cancelableDisconnect.request();\n };\n\n _disconnect = async () => {\n this.off(NEW_RTC_SESSION, this.handleNewRTCSession);\n\n const disconnectedPromise = new Promise<void>((resolve) => {\n this.once(DISCONNECTED, () => {\n delete this.ua;\n resolve();\n });\n });\n\n if (this.ua) {\n await this._hangUpWithoutCancelRequests();\n\n if (this.ua) {\n this.ua.stop();\n } else {\n this._uaEvents.trigger(DISCONNECTED, undefined);\n }\n } else {\n this._uaEvents.trigger(DISCONNECTED, undefined);\n }\n\n return disconnectedPromise;\n };\n\n _call: TCall = ({\n number,\n mediaStream,\n extraHeaders = [],\n ontrack,\n iceServers,\n videoMode,\n audioMode,\n degradationPreference,\n offerToReceiveAudio = true,\n offerToReceiveVideo = true,\n }) => {\n return new Promise((resolve, reject) => {\n this._connectionConfiguration.number = number;\n this._connectionConfiguration.answer = false;\n this._handleCall({ ontrack }).then(resolve).catch(reject);\n\n this.session = this.ua!.call(this.getSipServerUrl(number), {\n extraHeaders,\n mediaStream: prepareMediaStream(mediaStream, {\n videoMode,\n audioMode,\n }),\n eventHandlers: this._sessionEvents.triggers,\n videoMode,\n audioMode,\n degradationPreference,\n pcConfig: {\n iceServers,\n },\n rtcOfferConstraints: {\n offerToReceiveAudio,\n offerToReceiveVideo,\n },\n });\n });\n };\n\n _answer: TAnswerToIncomingCall = ({\n mediaStream,\n ontrack,\n extraHeaders = [],\n iceServers,\n videoMode,\n audioMode,\n degradationPreference,\n }): Promise<RTCPeerConnection> => {\n return new Promise((resolve, reject) => {\n if (!this.isAvailableIncomingCall) {\n reject(new Error('no incomingSession'));\n\n return undefined;\n }\n\n this.session = this.incomingSession;\n this.removeIncomingSession();\n\n const session = this.session;\n\n if (!session) {\n reject(new Error('No session established'));\n\n return;\n }\n\n this._sessionEvents.eachTriggers((trigger, eventName) => {\n const sessionJsSipEvent = SESSION_JSSIP_EVENT_NAMES.find((jsSipEvent) => {\n return jsSipEvent === eventName;\n });\n\n if (sessionJsSipEvent) {\n session.on(sessionJsSipEvent, trigger);\n }\n });\n\n this._connectionConfiguration.answer = true;\n this._connectionConfiguration.number = session.remote_identity.uri.user;\n this._handleCall({ ontrack }).then(resolve).catch(reject);\n\n const preparedMediaStream = prepareMediaStream(mediaStream, {\n videoMode,\n audioMode,\n });\n\n session.answer({\n extraHeaders,\n videoMode,\n audioMode,\n degradationPreference,\n mediaStream: preparedMediaStream,\n pcConfig: {\n iceServers,\n },\n });\n\n return undefined;\n });\n };\n\n _handleCall = ({ ontrack }: { ontrack?: TOntrack }): Promise<RTCPeerConnection> => {\n return new Promise((resolve, reject) => {\n const addStartedEventListeners = () => {\n this.onSession(PEER_CONNECTION, handlePeerConnection);\n this.onSession(CONFIRMED, handleConfirmed);\n };\n const removeStartedEventListeners = () => {\n this.offSession(PEER_CONNECTION, handlePeerConnection);\n this.offSession(CONFIRMED, handleConfirmed);\n };\n const addEndedEventListeners = () => {\n this.onSession(FAILED, handleEnded);\n this.onSession(ENDED, handleEnded);\n };\n const removeEndedEventListeners = () => {\n this.offSession(FAILED, handleEnded);\n this.offSession(ENDED, handleEnded);\n };\n const handleEnded = (error: ICustomError) => {\n removeStartedEventListeners();\n removeEndedEventListeners();\n reject(error);\n };\n\n let savedPeerconnection: RTCPeerConnection;\n\n const handlePeerConnection = ({ peerconnection }) => {\n savedPeerconnection = peerconnection;\n\n savedPeerconnection.ontrack = (track) => {\n this._sessionEvents.trigger(PEER_CONNECTION_ONTRACK, savedPeerconnection);\n\n if (ontrack) {\n ontrack(track);\n }\n };\n };\n const handleConfirmed = () => {\n if (savedPeerconnection) {\n this._sessionEvents.trigger(PEER_CONNECTION_CONFIRMED, savedPeerconnection);\n }\n\n removeStartedEventListeners();\n removeEndedEventListeners();\n resolve(savedPeerconnection);\n };\n\n addStartedEventListeners();\n addEndedEventListeners();\n });\n };\n\n _restoreSession: () => void = () => {\n this._resetPresentation();\n\n delete this._connectionConfiguration.number;\n delete this.session;\n this._remoteStreams = {};\n };\n\n _sendDTMF: TSendDTMF = (tone) => {\n return new Promise<void>((resolve, reject) => {\n const session = this.session;\n\n if (!session) {\n reject(new Error('No session established'));\n\n return;\n }\n\n this.onceSession(NEW_DTMF, ({ originator }) => {\n if (originator === ORIGINATOR_LOCAL) {\n resolve();\n }\n });\n\n session.sendDTMF(tone, {\n duration: 120,\n interToneGap: 600,\n });\n });\n };\n\n _generateStream(videoTrack: MediaStreamTrack, audioTrack?: MediaStreamTrack): MediaStream {\n const id = videoTrack.id;\n\n const remoteStream: MediaStream = this._remoteStreams[id] || new MediaStream();\n\n if (audioTrack) {\n remoteStream.addTrack(audioTrack);\n }\n\n remoteStream.addTrack(videoTrack);\n this._remoteStreams[id] = remoteStream;\n\n return remoteStream;\n }\n\n _generateAudioStream(audioTrack: MediaStreamTrack): MediaStream {\n const id = audioTrack.id;\n\n const remoteStream = this._remoteStreams[id] || new MediaStream();\n\n remoteStream.addTrack(audioTrack);\n\n this._remoteStreams[id] = remoteStream;\n\n return remoteStream;\n }\n\n _generateStreams(remoteTracks: MediaStreamTrack[]): MediaStream[] {\n const remoteStreams: MediaStream[] = [];\n\n remoteTracks.forEach((track, index) => {\n if (track.kind === 'audio') {\n return;\n }\n\n const videoTrack = track;\n const prevTrack = remoteTracks[index - 1];\n let audioTrack;\n\n if (prevTrack && prevTrack.kind === 'audio') {\n audioTrack = prevTrack;\n }\n\n const remoteStream = this._generateStream(videoTrack, audioTrack);\n\n remoteStreams.push(remoteStream);\n }, []);\n\n return remoteStreams;\n }\n\n _generateAudioStreams(remoteTracks: MediaStreamTrack[]): MediaStream[] {\n const remoteStreams: MediaStream[] = remoteTracks.map((remoteTrack) => {\n return this._generateAudioStream(remoteTrack);\n });\n\n return remoteStreams;\n }\n\n _hangUpWithoutCancelRequests: THangUp = async () => {\n if (this.ua && this.session) {\n const { session } = this;\n\n if (this._streamPresentationCurrent) {\n await this.stopPresentation();\n }\n\n this._restoreSession();\n\n if (!session.isEnded()) {\n session.terminate();\n }\n }\n };\n\n _cancelRequests() {\n this._cancelActionsRequests();\n this._cancelCallRequests();\n this._cancelConnectRequests();\n }\n\n _cancelConnectRequests() {\n this._cancelableConnect.cancelRequest();\n }\n\n _cancelCallRequests() {\n this._cancelableCall.cancelRequest();\n this._cancelableAnswer.cancelRequest();\n }\n\n _cancelActionsRequests() {\n this._cancelableAnswer.cancelRequest();\n this._cancelableSendDTMF.cancelRequest();\n }\n\n _handleShareState = (eventName) => {\n switch (eventName) {\n case AVAILABLE_SECOND_REMOTE_STREAM:\n this._sessionEvents.trigger(AVAILABLE_SECOND_REMOTE_STREAM_EVENT, undefined);\n break;\n case NOT_AVAILABLE_SECOND_REMOTE_STREAM:\n this._sessionEvents.trigger(NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT, undefined);\n break;\n case MUST_STOP_PRESENTATION:\n this._sessionEvents.trigger(MUST_STOP_PRESENTATION_EVENT, undefined);\n break;\n\n default:\n break;\n }\n };\n\n _maybeTriggerChannels = (request: IncomingRequest) => {\n const inputChannels = request.getHeader(HEADER_INPUT_CHANNELS);\n const outputChannels = request.getHeader(HEADER_OUTPUT_CHANNELS);\n\n if (inputChannels && outputChannels) {\n const headersChannels: TChannels = {\n inputChannels,\n outputChannels,\n };\n\n this._sessionEvents.trigger(CHANNELS, headersChannels);\n }\n };\n\n _handleNotify = (header: TInfoNotify) => {\n if (header.cmd === CMD_CHANNELS) {\n const channelsInfo = header as TChannelsInfoNotify;\n\n this._triggerChannelsNotify(channelsInfo);\n } else if (header.cmd === CMD_WEBCAST_STARTED) {\n const webcastInfo = header as TWebcastInfoNotify;\n\n this._triggerWebcastStartedNotify(webcastInfo);\n } else if (header.cmd === CMD_WEBCAST_STOPPED) {\n const webcastInfo = header as TWebcastInfoNotify;\n\n this._triggerWebcastStoppedNotify(webcastInfo);\n } else if (header.cmd === CMD_ADDED_TO_LIST_MODERATORS) {\n const data = header as TAddedToListModeratorsInfoNotify;\n\n this._triggerAddedToListModeratorsNotify(data);\n } else if (header.cmd === CMD_REMOVED_FROM_LIST_MODERATORS) {\n const data = header as TRemovedFromListModeratorsInfoNotify;\n\n this._triggerRemovedFromListModeratorsNotify(data);\n } else if (header.cmd === CMD_MOVE_REQUEST_TO_CONFERENCE) {\n const data = header as TMoveRequestToConferenceInfoNotify;\n\n this._triggerParticipantMoveRequestToConference(data);\n } else if (header.cmd === CMD_CANCELLING_WORD_REQUEST) {\n const data = header as TCancelingWordRequestInfoNotify;\n\n this._triggerParticipantCancelingWordRequest(data);\n } else if (header.cmd === CMD_MOVE_REQUEST_TO_STREAM) {\n const data = header as TMoveRequestToStreamInfoNotify;\n\n this._triggerParticipantMoveRequestToStream(data);\n } else if (header.cmd === CMD_ACCOUNT_CHANGED) {\n this._triggerAccountChangedNotify();\n } else if (header.cmd === CMD_ACCOUNT_DELETED) {\n this._triggerAccountDeletedNotify();\n } else if (header.cmd === CMD_CONFERENCE_PARTICIPANT_TOKEN_ISSUED) {\n const data = header as TConferenceParticipantTokenIssued;\n\n this._triggerConferenceParticipantTokenIssued(data);\n }\n };\n\n _triggerRemovedFromListModeratorsNotify = ({\n conference,\n }: TRemovedFromListModeratorsInfoNotify) => {\n const headersParametersModeratorsList: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(\n PARTICIPANT_REMOVED_FROM_LIST_MODERATORS,\n headersParametersModeratorsList\n );\n };\n\n _triggerAddedToListModeratorsNotify = ({ conference }: TAddedToListModeratorsInfoNotify) => {\n const headersParametersModeratorsList: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_ADDED_TO_LIST_MODERATORS, headersParametersModeratorsList);\n };\n\n _triggerWebcastStartedNotify = ({ body: { conference, type } }: TWebcastInfoNotify) => {\n const headersParametersWebcast: TParametersWebcast = {\n conference,\n type,\n };\n\n this._uaEvents.trigger(WEBCAST_STARTED, headersParametersWebcast);\n };\n\n _triggerWebcastStoppedNotify = ({ body: { conference, type } }: TWebcastInfoNotify) => {\n const headersParametersWebcast: TParametersWebcast = {\n conference,\n type,\n };\n\n this._uaEvents.trigger(WEBCAST_STOPPED, headersParametersWebcast);\n };\n\n _triggerAccountChangedNotify = () => {\n this._uaEvents.trigger(ACCOUNT_CHANGED, undefined);\n };\n\n _triggerAccountDeletedNotify = () => {\n this._uaEvents.trigger(ACCOUNT_DELETED, undefined);\n };\n\n _triggerConferenceParticipantTokenIssued = ({\n body: { conference, participant, jwt },\n }: TConferenceParticipantTokenIssued) => {\n const headersConferenceParticipantTokenIssued: TParametersConferenceParticipantTokenIssued = {\n conference,\n participant,\n jwt,\n };\n\n this._uaEvents.trigger(\n CONFERENCE_PARTICIPANT_TOKEN_ISSUED,\n headersConferenceParticipantTokenIssued\n );\n };\n\n _triggerChannelsNotify = (channelsInfo: TChannelsInfoNotify) => {\n const inputChannels = channelsInfo.input;\n const outputChannels = channelsInfo.output;\n\n const data: TChannels = {\n inputChannels,\n outputChannels,\n };\n\n this._uaEvents.trigger(CHANNELS_NOTIFY, data);\n };\n\n _triggerParticipantMoveRequestToConference = ({\n body: { conference },\n }: TMoveRequestToConferenceInfoNotify) => {\n const data: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE, data);\n };\n\n _triggerParticipantCancelingWordRequest = ({\n body: { conference },\n }: TCancelingWordRequestInfoNotify) => {\n const data: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_CANCELLING_WORD_REQUEST, data);\n };\n\n _triggerParticipantMoveRequestToStream = ({\n body: { conference },\n }: TMoveRequestToStreamInfoNotify) => {\n const data: TParametersModeratorsList = {\n conference,\n };\n\n this._uaEvents.trigger(PARTICIPANT_MOVE_REQUEST_TO_STREAM, data);\n };\n\n _triggerEnterRoom = (request: IncomingRequest) => {\n const room = request.getHeader(HEADER_CONTENT_ENTER_ROOM);\n\n this._sessionEvents.trigger(ENTER_ROOM, room);\n };\n\n _triggerShareState = (request: IncomingRequest) => {\n const eventName = request.getHeader(HEADER_CONTENT_SHARE_STATE);\n\n this._sessionEvents.trigger(SHARE_STATE, eventName);\n };\n\n _triggerMainCamControl = (request: IncomingRequest) => {\n const mainCam = request.getHeader(HEADER_MAIN_CAM) as EEventsMainCAM;\n\n const syncState = request.getHeader(HEADER_MEDIA_SYNC);\n const isSyncForced = syncState === EEventsSyncMediaState.ADMIN_SYNC_FORCED ? true : false;\n\n if (mainCam === EEventsMainCAM.ADMIN_START_MAIN_CAM) {\n this._sessionEvents.trigger(ADMIN_START_MAIN_CAM, { isSyncForced });\n } else if (mainCam === EEventsMainCAM.ADMIN_STOP_MAIN_CAM) {\n this._sessionEvents.trigger(ADMIN_STOP_MAIN_CAM, { isSyncForced });\n } else if (\n (mainCam === EEventsMainCAM.RESUME_MAIN_CAM || mainCam === EEventsMainCAM.PAUSE_MAIN_CAM) &&\n !!syncState\n ) {\n this._sessionEvents.trigger(ADMIN_FORCE_SYNC_MEDIA_STATE, { isSyncForced });\n } else {\n const resolutionMainCam = request.getHeader(HEADER_MAIN_CAM_RESOLUTION);\n\n this._sessionEvents.trigger(MAIN_CAM_CONTROL, {\n mainCam,\n resolutionMainCam,\n });\n }\n };\n\n _triggerMicControl = (request: IncomingRequest) => {\n const mic = request.getHeader(HEADER_MIC);\n const syncState = request.getHeader(HEADER_MEDIA_SYNC);\n const isSyncForced = syncState === EEventsSyncMediaState.ADMIN_SYNC_FORCED ? true : false;\n\n if (mic === EEventsMic.ADMIN_START_MIC) {\n this._sessionEvents.trigger(ADMIN_START_MIC, { isSyncForced });\n } else if (mic === EEventsMic.ADMIN_STOP_MIC) {\n this._sessionEvents.trigger(ADMIN_STOP_MIC, { isSyncForced });\n }\n };\n\n _triggerUseLicense = (request: IncomingRequest) => {\n const license: EUseLicense = request.getHeader(HEADER_CONTENT_USE_LICENSE) as EUseLicense;\n\n this._sessionEvents.trigger(USE_LICENSE, license);\n };\n\n _handleNewInfo = (info: IncomingInfoEvent | OutgoingInfoEvent) => {\n const { originator } = info;\n\n if (originator !== 'remote') {\n return;\n }\n\n const request = info.request as IncomingRequest;\n const contentType = request.getHeader(HEADER_CONTENT_TYPE_NAME);\n\n if (contentType) {\n switch (contentType) {\n case CONTENT_TYPE_ENTER_ROOM:\n this._triggerEnterRoom(request);\n this._maybeTriggerChannels(request);\n break;\n case CONTENT_TYPE_NOTIFY:\n this._maybeHandleNotify(request);\n break;\n case CONTENT_TYPE_SHARE_STATE:\n this._triggerShareState(request);\n break;\n case CONTENT_TYPE_MAIN_CAM:\n this._triggerMainCamControl(request);\n break;\n case CONTENT_TYPE_MIC:\n this._triggerMicControl(request);\n break;\n case CONTENT_TYPE_USE_LICENSE:\n this._triggerUseLicense(request);\n break;\n\n default:\n break;\n }\n }\n };\n\n _handleSipEvent = ({ request }: { request: IncomingRequest }) => {\n this._maybeHandleNotify(request);\n };\n\n _maybeHandleNotify = (request: IncomingRequest) => {\n const headerNotify = request.getHeader(HEADER_NOTIFY);\n\n if (headerNotify) {\n const headerNotifyParsed: TInfoNotify = JSON.parse(headerNotify);\n\n this._handleNotify(headerNotifyParsed);\n }\n };\n\n waitChannels(): Promise<TChannels> {\n return this.waitSession(CHANNELS);\n }\n\n waitSyncMediaState(): Promise<{ isSyncForced: boolean }> {\n return this.waitSession(ADMIN_FORCE_SYNC_MEDIA_STATE);\n }\n\n sendChannels({ inputChannels, outputChannels }: TChannels): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const headerInputChannels = `${HEADER_INPUT_CHANNELS}: ${inputChannels}`;\n const headerOutputChannels = `${HEADER_OUTPUT_CHANNELS}: ${outputChannels}`;\n const extraHeaders: TOptionsExtraHeaders['extraHeaders'] = [\n headerInputChannels,\n headerOutputChannels,\n ];\n\n return this.session.sendInfo(CONTENT_TYPE_CHANNELS, undefined, { extraHeaders });\n }\n\n sendMediaState(\n { cam, mic }: TMediaState,\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const headerMediaState = `${HEADER_MEDIA_STATE}: currentstate`;\n const headerCam = `${HEADER_MAIN_CAM_STATE}: ${+cam}`;\n const headerMic = `${HEADER_MIC_STATE}: ${+mic}`;\n const extraHeaders: TOptionsExtraHeaders['extraHeaders'] = [\n headerMediaState,\n headerCam,\n headerMic,\n ];\n\n return this.session.sendInfo(CONTENT_TYPE_MEDIA_STATE, undefined, { ...options, extraHeaders });\n }\n\n _sendRefusalToTurnOn(\n type: 'cam' | 'mic',\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n const typeMicOnServer = 0;\n const typeCamOnServer = 1;\n const typeToSend = type == 'mic' ? typeMicOnServer : typeCamOnServer;\n\n const headerMediaType = `${HEADER_MEDIA_TYPE}: ${typeToSend}`;\n const extraHeaders: TOptionsExtraHeaders['extraHeaders'] = [headerMediaType];\n\n return this.session.sendInfo(CONTENT_TYPE_REFUSAL, undefined, { ...options, extraHeaders });\n }\n\n sendRefusalToTurnOnMic(\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n return this._sendRefusalToTurnOn('mic', options);\n }\n\n sendRefusalToTurnOnCam(\n options: TOptionsInfoMediaState = { noTerminateWhenError: true }\n ): Promise<void> {\n if (!this.session) {\n throw new Error('No session established');\n }\n\n return this._sendRefusalToTurnOn('cam', options);\n }\n\n _handleEnded = (error: ICustomError) => {\n const { originator } = error;\n\n if (originator === ORIGINATOR_REMOTE) {\n this._sessionEvents.trigger(ENDED_FROM_SERVER, error);\n }\n\n this._restoreSession();\n };\n}\n","const findVideoSender = (senders: RTCRtpSender[]): RTCRtpSender | undefined => {\n return senders.find((sender) => {\n return sender?.track?.kind === 'video';\n });\n};\n\nexport default findVideoSender;\n","const ONE_MEGABIT_IN_BITS = 1e6;\n\nconst megabitsToBits = (mb: number): number => {\n return mb * ONE_MEGABIT_IN_BITS;\n};\n\nexport const MINIMUM_BITRATE = megabitsToBits(0.06);\nexport const MAXIMUM_BITRATE = megabitsToBits(4);\n\nconst getMaxBitrateByWidth = (maxWidth: number): number => {\n if (maxWidth <= 64) {\n return MINIMUM_BITRATE;\n }\n\n if (maxWidth <= 128) {\n return megabitsToBits(0.12);\n }\n\n if (maxWidth <= 256) {\n return megabitsToBits(0.25);\n }\n\n if (maxWidth <= 384) {\n return megabitsToBits(0.32);\n }\n\n if (maxWidth <= 426) {\n return megabitsToBits(0.38);\n }\n\n if (maxWidth <= 640) {\n return megabitsToBits(0.5);\n }\n\n if (maxWidth <= 848) {\n return megabitsToBits(0.7);\n }\n\n if (maxWidth <= 1280) {\n return megabitsToBits(1);\n }\n\n if (maxWidth <= 1920) {\n return megabitsToBits(2);\n }\n\n return MAXIMUM_BITRATE;\n};\n\nexport default getMaxBitrateByWidth;\n","import createStackPromises from 'stack-promises';\nimport { EEventsMainCAM } from '../SipConnector';\nimport getMaxBitrateByWidth, { MINIMUM_BITRATE, MAXIMUM_BITRATE } from './getMaxBitrateByWidth';\nimport setEncodingsToSender from './setEncodingsToSender';\nimport type { TOnSetParameters, TResult } from './setEncodingsToSender';\n\nconst stackPromises = createStackPromises<TResult>();\n\nconst runStackPromises = (): Promise<TResult> => {\n // @ts-ignore\n return stackPromises().catch((error) => {\n // eslint-disable-next-line no-console\n console.debug('videoSendingBalancer: error', error);\n });\n};\n\nconst run = (action: () => Promise<TResult>): Promise<TResult> => {\n stackPromises.add(action);\n\n return runStackPromises();\n};\n\nconst addToStackScaleResolutionDownBySender = ({\n sender,\n scaleResolutionDownBy,\n maxBitrate,\n onSetParameters,\n}: {\n sender: RTCRtpSender;\n scaleResolutionDownBy: number;\n maxBitrate: number;\n onSetParameters?: TOnSetParameters;\n}): Promise<TResult> => {\n return run(() => {\n return setEncodingsToSender(sender, { scaleResolutionDownBy, maxBitrate }, onSetParameters);\n });\n};\n\nconst downgradeResolutionSender = (\n sender: RTCRtpSender,\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const scaleResolutionDownByTarget = 200;\n const maxBitrate = MINIMUM_BITRATE;\n\n return addToStackScaleResolutionDownBySender({\n sender,\n maxBitrate,\n onSetParameters,\n scaleResolutionDownBy: scaleResolutionDownByTarget,\n });\n};\n\nconst resetScaleResolutionSender = (\n sender: RTCRtpSender,\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const scaleResolutionDownByTarget = 1;\n const maxBitrate = MAXIMUM_BITRATE;\n\n return addToStackScaleResolutionDownBySender({\n sender,\n maxBitrate,\n onSetParameters,\n scaleResolutionDownBy: scaleResolutionDownByTarget,\n });\n};\n\nconst setResolutionSender = (\n sender: RTCRtpSender,\n {\n track,\n resolution,\n }: {\n track: MediaStreamTrack;\n resolution: string;\n },\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n const settings = track.getSettings();\n const widthCurrent = settings.width!;\n const heightCurrent = settings.height!;\n const [widthTarget, heightTarget] = resolution.split('x');\n\n const scaleByWidth = widthCurrent / +widthTarget;\n const scaleByHeight = heightCurrent / +heightTarget!;\n const SCALE_MIN = 1;\n\n const scaleResolutionDownByTarget = Math.max(scaleByWidth, scaleByHeight, SCALE_MIN);\n\n const maxBitrate = getMaxBitrateByWidth(+widthTarget);\n\n return addToStackScaleResolutionDownBySender({\n sender,\n maxBitrate,\n onSetParameters,\n scaleResolutionDownBy: scaleResolutionDownByTarget,\n });\n};\n\nconst processSender = (\n {\n mainCam,\n resolutionMainCam,\n sender,\n track,\n }: {\n mainCam: EEventsMainCAM;\n resolutionMainCam?: string;\n sender: RTCRtpSender;\n track: MediaStreamTrack;\n },\n onSetParameters?: TOnSetParameters\n): Promise<TResult> => {\n switch (mainCam) {\n case EEventsMainCAM.PAUSE_MAIN_CAM:\n return downgradeResolutionSender(sender, onSetParameters);\n case EEventsMainCAM.RESUME_MAIN_CAM:\n return resetScaleResolutionSender(sender, onSetParameters);\n case EEventsMainCAM.MAX_MAIN_CAM_RESOLUTION:\n if (resolutionMainCam) {\n return setResolutionSender(\n sender,\n { track, resolution: resolutionMainCam },\n onSetParameters\n );\n }\n }\n\n return Promise.resolve({\n isChanged: false,\n parameters: { encodings: [{}], transactionId: '0', codecs: [], headerExtensions: [], rtcp: {} },\n });\n};\n\nexport default processSender;\n","const getExtraHeadersRegistration = (remoteAddress?: string) => {\n const headers: string[] = [];\n\n if (remoteAddress) {\n headers.push(`X-Vinteo-Remote: ${remoteAddress}`);\n }\n\n return headers;\n};\n\nexport default getExtraHeadersRegistration;\n","const DECLINE_ERROR_MESSAGE = 'Error decline with 603';\n\nexport const hasDeclineResponseFromServer = (error: Error): boolean => {\n return error.message === DECLINE_ERROR_MESSAGE;\n};\n","import findSenderByStream from '../utils/findSenderByStream';\nimport setEncodingsToSender from './setEncodingsToSender';\n\nconst scaleMaxBitrateBySender = (\n senders: RTCRtpSender[],\n mediaStream: MediaStream,\n maxBitrate: number\n) => {\n const sender = findSenderByStream(senders, mediaStream);\n\n if (sender) {\n return setEncodingsToSender(sender, { maxBitrate });\n }\n\n return Promise.resolve();\n};\n\nexport default scaleMaxBitrateBySender;\n","import type SipConnector from '../SipConnector';\nimport type { EEventsMainCAM } from '../SipConnector';\nimport balance from './balance';\nimport type { TOnSetParameters } from './setEncodingsToSender';\n\nconst resolveVideoSendingBalancer = (\n sipConnector: SipConnector,\n {\n ignoreForCodec,\n onSetParameters,\n }: {\n ignoreForCodec?: string;\n onSetParameters?: TOnSetParameters;\n } = {}\n) => {\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n let reBalance = () => {};\n const handleMainCamControl = (headers: {\n mainCam: EEventsMainCAM;\n resolutionMainCam?: string;\n }) => {\n reBalance = () => {\n const { mainCam, resolutionMainCam } = headers;\n const { connection } = sipConnector;\n\n if (!connection || mainCam === undefined) {\n return;\n }\n\n balance({\n mainCam,\n resolutionMainCam,\n connection,\n onSetParameters,\n ignoreForCodec,\n });\n };\n\n reBalance();\n };\n\n const subscribe = () => {\n sipConnector.onSession('main-cam-control', handleMainCamControl);\n };\n\n const unsubscribe = () => {\n sipConnector.offSession('main-cam-control', handleMainCamControl);\n };\n\n return { subscribe, unsubscribe, reBalance };\n};\n\nexport default resolveVideoSendingBalancer;\n","import type { EEventsMainCAM } from '../SipConnector';\nimport findVideoSender from '../utils/findVideoSender';\nimport getCodecFromSender from '../utils/getCodecFromSender';\nimport processSender from './processSender';\nimport type { TOnSetParameters } from './setEncodingsToSender';\n\nconst hasIncludesString = (source?: string, target?: string): boolean => {\n return !!source && !!target && source.toLowerCase().includes(target.toLowerCase());\n};\n\nconst balance = async ({\n mainCam,\n resolutionMainCam,\n connection,\n onSetParameters,\n ignoreForCodec,\n}: {\n mainCam: EEventsMainCAM;\n resolutionMainCam?: string;\n connection: RTCPeerConnection;\n onSetParameters?: TOnSetParameters;\n ignoreForCodec?: string;\n}) => {\n const senders = connection.getSenders();\n const sender = findVideoSender(senders);\n\n if (!sender || !sender.track) {\n return;\n }\n\n if (ignoreForCodec) {\n const codec = await getCodecFromSender(sender);\n\n if (hasIncludesString(codec, ignoreForCodec)) {\n return;\n }\n }\n\n processSender({ mainCam, resolutionMainCam, sender, track: sender.track }, onSetParameters);\n};\n\nexport default balance;\n"],"names":["getCodecFromSender","sender","getStats","then","stats","codec","type","results","keys","map","key","get","statsReportToArray","find","value","mimeType","resolveHasNeedToUpdateItemEncoding","defaultValue","itemEncodingTarget","itemEncodingCurrent","undefined","hasNeedToUpdateScaleResolutionDownBy","hasNeedToUpdateMaxBitrate","setEncodingsToSender","encodingsTarget","onSetParameters","parameters","getParameters","encodings","length","encoding","scaleResolutionDownByCurrent","scaleResolutionDownBy","scaleResolutionDownByTarget","scaleResolutionDownByTargetParsed","Math","max","performUpdateScaleResolutionDownBy","isChanged","maxBitrateCurrent","maxBitrate","maxBitrateTarget","performUpdateMaxBitrate","setParameters","Promise","resolve","INCOMING_CALL","DECLINED_INCOMING_CALL","FAILED_INCOMING_CALL","TERMINATED_INCOMING_CALL","CONNECTING","CONNECTED","DISCONNECTED","NEW_RTC_SESSION","REGISTERED","UNREGISTERED","REGISTRATION_FAILED","SIP_EVENT","AVAILABLE_SECOND_REMOTE_STREAM_EVENT","NOT_AVAILABLE_SECOND_REMOTE_STREAM_EVENT","MUST_STOP_PRESENTATION_EVENT","SHARE_STATE","ENTER_ROOM","USE_LICENSE","PEER_CONNECTION_CONFIRMED","PEER_CONNECTION_ONTRACK","CHANNELS","CHANNELS_NOTIFY","ENDED_FROM_SERVER","MAIN_CAM_CONTROL","ADMIN_STOP_MAIN_CAM","ADMIN_START_MAIN_CAM","ADMIN_STOP_MIC","ADMIN_START_MIC","ADMIN_FORCE_SYNC_MEDIA_STATE","PARTICIPANT_ADDED_TO_LIST_MODERATORS","PARTICIPANT_REMOVED_FROM_LIST_MODERATORS","PARTICIPANT_MOVE_REQUEST_TO_CONFERENCE","PARTICIPANT_MOVE_REQUEST_TO_STREAM","PARTICIPANT_CANCELLING_WORD_REQUEST","WEBCAST_STARTED","WEBCAST_STOPPED","ACCOUNT_CHANGED","ACCOUNT_DELETED","CONFERENCE_PARTICIPANT_TOKEN_ISSUED","ENDED","CONFIRMED","PEER_CONNECTION","FAILED","NEW_DTMF","NEW_INFO","PRESENTATION_ENDED","PRESENTATION_FAILED","UA_SYNTHETICS_EVENT_NAMES","UA_JSSIP_EVENT_NAMES","SESSION_SYNTHETICS_EVENT_NAMES","SESSION_JSSIP_EVENT_NAMES","UA_EVENT_NAMES","SESSION_EVENT_NAMES","REQUEST_TIMEOUT","REJECTED","BYE","CANCELED","CONTENT_TYPE_SHARE_STATE","CONTENT_TYPE_MAIN_CAM","HEADER_INPUT_CHANNELS","HEADER_OUTPUT_CHANNELS","HEADER_MEDIA_SYNC","HEADER_CONTENT_SHARE_STATE","AVAILABLE_SECOND_REMOTE_STREAM","NOT_AVAILABLE_SECOND_REMOTE_STREAM","parseDisplayName","displayName","trim","replace","generateUserId","min","floor","random","prepareMediaStream","mediaStream","videoMode","audioMode","tracks","getAudioTracks","getVideoTracks","newStream","MediaStream","getTracks","ORIGINATOR_LOCAL","ORIGINATOR_REMOTE","EEventsMainCAM","EEventsMic","EEventsSyncMediaState","EUseLicense","exports","moduleName","megabitsToBits","mb","MINIMUM_BITRATE","MAXIMUM_BITRATE","stackPromises","createStackPromises","run","action","add","catch","error","console","debug","addToStackScaleResolutionDownBySender","setResolutionSender","track","resolution","settings","getSettings","widthCurrent","width","heightCurrent","height","widthTarget","heightTarget","split","scaleByWidth","scaleByHeight","maxWidth","processSender","mainCam","resolutionMainCam","PAUSE_MAIN_CAM","downgradeResolutionSender","RESUME_MAIN_CAM","resetScaleResolutionSender","MAX_MAIN_CAM_RESOLUTION","transactionId","codecs","headerExtensions","rtcp","constructor","JsSIP","this","_isRegisterConfig","_connectionConfiguration","_remoteStreams","getSipServerUrl","id","connect","data","_cancelRequests","_cancelableConnect","request","createUa","_cancelableCreateUa","set","_cancelableSet","call","_cancelableCall","disconnect","_disconnectWithoutCancelRequests","answerToIncomingCall","_cancelableAnswer","sendDTMF","tone","_cancelableSendDTMF","hangUp","_hangUpWithoutCancelRequests","tryRegister","isRegisterConfig","_uaEvents","trigger","unregister","finally","register","reject","Error","declineToIncomingCall","statusCode","isAvailableIncomingCall","incomingSession","callerData","remoteCallerData","cancelRequest","removeIncomingSession","terminate","status_code","busyIncomingCall","handleNewRTCSession","originator","session","on","_connect","params","_start","_createUa","user","password","sipServerUrl","sipWebSocketServerURL","remoteAddress","extraHeaders","sdpSemantics","sessionTimers","registerExpires","connectionRecoveryMinInterval","connectionRecoveryMaxInterval","userAgent","__awaiter","authorizationUser","_init","configuration","display_name","user_agent","sdp_semantics","sockets","socket","uri","session_timers","register_expires","connection_recovery_min_interval","connection_recovery_max_interval","ua","UA","eachTriggers","eventName","uaJsSipEvent","jsSipEvent","extraHeadersRemoteAddress","headers","push","getExtraHeadersRemoteAddress","extraHeadersBase","registrator","setExtraHeaders","resolveUa","removeEventListeners","rejectError","off","addEventListeners","start","_set","changedDisplayName","changedPassword","changedSome","_cancelableDisconnect","_disconnect","disconnectedPromise","once","stop","_call","number","ontrack","iceServers","degradationPreference","offerToReceiveAudio","offerToReceiveVideo","answer","_handleCall","eventHandlers","_sessionEvents","triggers","pcConfig","rtcOfferConstraints","_answer","sessionJsSipEvent","remote_identity","preparedMediaStream","removeStartedEventListeners","offSession","handlePeerConnection","handleConfirmed","removeEndedEventListeners","handleEnded","savedPeerconnection","peerconnection","onSession","addStartedEventListeners","addEndedEventListeners","_restoreSession","_resetPresentation","_sendDTMF","onceSession","duration","interToneGap","_streamPresentationCurrent","stopPresentation","isEnded","_handleShareState","_maybeTriggerChannels","inputChannels","getHeader","outputChannels","headersChannels","_handleNotify","header","cmd","channelsInfo","_triggerChannelsNotify","webcastInfo","_triggerWebcastStartedNotify","_triggerWebcastStoppedNotify","_triggerAddedToListModeratorsNotify","_triggerRemovedFromListModeratorsNotify","_triggerParticipantMoveRequestToConference","_triggerParticipantCancelingWordRequest","_triggerParticipantMoveRequestToStream","_triggerAccountChangedNotify","_triggerAccountDeletedNotify","_triggerConferenceParticipantTokenIssued","conference","headersParametersModeratorsList","body","headersParametersWebcast","participant","jwt","headersConferenceParticipantTokenIssued","input","output","_triggerEnterRoom","room","_triggerShareState","_triggerMainCamControl","syncState","isSyncForced","ADMIN_SYNC_FORCED","_triggerMicControl","mic","_triggerUseLicense","license","_handleNewInfo","info","contentType","_maybeHandleNotify","_handleSipEvent","headerNotify","headerNotifyParsed","JSON","parse","_handleEnded","Events","CancelableRequest","afterCancelRequest","isRegistered","sendOptions","target","succeeded","failed","ping","replaceMediaStream","options","askPermissionToEnableCam","noTerminateWhenError","sendInfo","message","hasDeclineResponseFromServer","isPendingPresentation","promisePendingStartPresentation","promisePendingStopPresentation","startPresentation","stream","isNeedReinvite","isP2P","establishedSession","streamPresentationCurrent","preparatoryHeaders","result","connection","senders","includes","findSenderByStream","scaleBitrate","getSenders","streamPresentationPrev","handler","onceRace","eventNames","wait","onceRaceSession","waitSession","isConfigured","getConnectionConfiguration","Object","assign","getRemoteStreams","remoteTracks","getReceivers","some","remoteTrack","kind","hasVideoTracks","_generateStreams","_generateAudioStreams","_a","_b","host","_d","_c","incomingNumber","_f","_e","requested","isEstablished","isCallActive","serverUrl","WebSocketInterface","_generateStream","videoTrack","audioTrack","remoteStream","addTrack","_generateAudioStream","remoteStreams","forEach","index","prevTrack","_cancelActionsRequests","_cancelCallRequests","_cancelConnectRequests","waitChannels","waitSyncMediaState","sendChannels","sendMediaState","cam","_sendRefusalToTurnOn","sendRefusalToTurnOnMic","sendRefusalToTurnOnCam","cause","isCanceledError","sipConnector","ignoreForCodec","reBalance","handleMainCamControl","source","toLowerCase","balance","subscribe","unsubscribe"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sip-connector",
|
|
3
|
-
"version": "6.
|
|
3
|
+
"version": "6.10.0",
|
|
4
4
|
"description": "Module for connect to Vinteo server",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"webrtc",
|
|
@@ -44,33 +44,33 @@
|
|
|
44
44
|
"events-constructor": "^1.2.0",
|
|
45
45
|
"promise-delay": "^2.1.0",
|
|
46
46
|
"stack-promises": "^0.0.13",
|
|
47
|
-
"webrtc-mock": "^0.0.
|
|
47
|
+
"webrtc-mock": "^0.0.14"
|
|
48
48
|
},
|
|
49
49
|
"devDependencies": {
|
|
50
|
-
"@commitlint/cli": "^17.6.
|
|
51
|
-
"@commitlint/config-conventional": "^17.6.
|
|
50
|
+
"@commitlint/cli": "^17.6.6",
|
|
51
|
+
"@commitlint/config-conventional": "^17.6.6",
|
|
52
52
|
"@rollup/plugin-commonjs": "^22.0.2",
|
|
53
53
|
"@rollup/plugin-node-resolve": "^14.1.0",
|
|
54
54
|
"@types/jest": "^29.5.2",
|
|
55
|
-
"@types/node": "^20.3.
|
|
56
|
-
"@typescript-eslint/eslint-plugin": "^5.60.
|
|
57
|
-
"@typescript-eslint/parser": "^5.60.
|
|
58
|
-
"eslint": "^8.
|
|
55
|
+
"@types/node": "^20.3.3",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^5.60.1",
|
|
57
|
+
"@typescript-eslint/parser": "^5.60.1",
|
|
58
|
+
"eslint": "^8.44.0",
|
|
59
59
|
"eslint-config-prettier": "^8.8.0",
|
|
60
60
|
"eslint-plugin-import": "^2.27.5",
|
|
61
61
|
"eslint-plugin-jest": "^27.2.2",
|
|
62
62
|
"eslint-plugin-prettier": "^4.2.1",
|
|
63
63
|
"husky": "^8.0.3",
|
|
64
64
|
"jest": "29.5.0",
|
|
65
|
-
"lint-staged": "^13.2.
|
|
65
|
+
"lint-staged": "^13.2.3",
|
|
66
66
|
"prettier": "^2.8.8",
|
|
67
67
|
"promise-delay": "^2.1.0",
|
|
68
68
|
"rollup": "^2.79.1",
|
|
69
69
|
"rollup-plugin-terser": "^7.0.2",
|
|
70
|
-
"rollup-plugin-typescript2": "0.
|
|
70
|
+
"rollup-plugin-typescript2": "0.35.0",
|
|
71
71
|
"standard-version": "^9.5.0",
|
|
72
|
-
"ts-jest": "^29.1.
|
|
73
|
-
"typescript": "^5.1.
|
|
72
|
+
"ts-jest": "^29.1.1",
|
|
73
|
+
"typescript": "^5.1.6"
|
|
74
74
|
},
|
|
75
75
|
"peerDependencies": {
|
|
76
76
|
"@krivega/jssip": "^3.16.0"
|