sip-connector 15.0.0 → 15.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +160 -11
- package/dist/{@SipConnector-DbvV1Leg.js → @SipConnector-BEZk1hmx.js} +511 -229
- package/dist/@SipConnector-hpySQIBa.cjs +1 -0
- package/dist/ApiManager/__tests-utils__/helpers.d.ts +9 -0
- package/dist/ApiManager/constants.d.ts +2 -1
- package/dist/ApiManager/eventNames.d.ts +2 -1
- package/dist/CallManager/MCUCallStrategy.d.ts +1 -1
- package/dist/ConnectionManager/@ConnectionManager.d.ts +3 -3
- package/dist/ConnectionManager/getExtraHeadersRemoteAddress.d.ts +2 -2
- package/dist/IncomingCallManager/@IncomingCallManager.d.ts +2 -2
- package/dist/SipConnector/@SipConnector.d.ts +4 -2
- package/dist/SipConnector/eventNames.d.ts +1 -1
- package/dist/SipConnectorFacade/SipConnectorFacade.d.ts +15 -1
- package/dist/StatsManager/@StatsManager.d.ts +19 -0
- package/dist/StatsManager/eventNames.d.ts +2 -0
- package/dist/StatsManager/index.d.ts +2 -0
- package/dist/StatsPeerConnection/StatsPeerConnection.d.ts +20 -0
- package/dist/StatsPeerConnection/__fixtures__/callStaticsState.d.ts +3923 -0
- package/dist/StatsPeerConnection/constants.d.ts +14 -0
- package/dist/StatsPeerConnection/eventNames.d.ts +10 -0
- package/dist/StatsPeerConnection/index.d.ts +4 -0
- package/dist/StatsPeerConnection/parseStatsReports.d.ts +14 -0
- package/dist/StatsPeerConnection/requestAllStatistics.d.ts +11 -0
- package/dist/StatsPeerConnection/typings.d.ts +194 -0
- package/dist/StatsPeerConnection/utils/hasAvailableStats.d.ts +2 -0
- package/dist/StatsPeerConnection/utils/index.d.ts +3 -0
- package/dist/StatsPeerConnection/utils/now.d.ts +2 -0
- package/dist/StatsPeerConnection/utils/statsReportToObject.d.ts +4 -0
- package/dist/VideoSendingBalancer/CodecProvider.d.ts +7 -0
- package/dist/VideoSendingBalancer/ParametersSetterWithQueue.d.ts +12 -0
- package/dist/VideoSendingBalancer/SenderBalancer.d.ts +52 -0
- package/dist/VideoSendingBalancer/SenderFinder.d.ts +7 -0
- package/dist/VideoSendingBalancer/TaskQueue.d.ts +20 -0
- package/dist/VideoSendingBalancer/VideoSendingBalancer.d.ts +44 -0
- package/dist/VideoSendingBalancer/VideoSendingEventHandler.d.ts +25 -0
- package/dist/VideoSendingBalancer/calcBitrate/calcMaxBitrateByWidth.d.ts +4 -0
- package/dist/VideoSendingBalancer/calcBitrate/calcMaxBitrateByWidthAndCodec.d.ts +4 -0
- package/dist/VideoSendingBalancer/calcBitrate/index.d.ts +1 -0
- package/dist/VideoSendingBalancer/calcResolution/calcScaleResolutionDownBy.d.ts +6 -0
- package/dist/VideoSendingBalancer/calcResolution/index.d.ts +1 -0
- package/dist/VideoSendingBalancer/index.d.ts +3 -0
- package/dist/VideoSendingBalancer/types.d.ts +36 -0
- package/dist/__fixtures__/BaseSession.mock.d.ts +1 -1
- package/dist/__fixtures__/RTCPeerConnectionMock.d.ts +2 -2
- package/dist/__fixtures__/RTCRtpSenderMock.d.ts +1 -0
- package/dist/__fixtures__/RTCSessionMock.d.ts +2 -2
- package/dist/__fixtures__/UA.mock.d.ts +2 -2
- package/dist/__fixtures__/eventNames.d.ts +1 -1
- package/dist/__fixtures__/jssip.mock.d.ts +1 -1
- package/dist/doMock.cjs +1 -1
- package/dist/doMock.js +21 -22
- package/dist/index.cjs +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.js +697 -562
- package/dist/tools/createUaParser/createUaParser.d.ts +4 -0
- package/dist/tools/createUaParser/index.d.ts +1 -0
- package/dist/tools/createUaParser/isElectronEnvironment.d.ts +2 -0
- package/dist/tools/error/index.d.ts +1 -1
- package/dist/tools/index.d.ts +5 -1
- package/dist/{setParametersToSender → tools/setParametersToSender}/configureDegradationPreference.d.ts +1 -1
- package/dist/{setParametersToSender → tools/setParametersToSender}/configureEncodings.d.ts +1 -1
- package/dist/tools/setParametersToSender/index.d.ts +3 -0
- package/dist/tools/setParametersToSender/setEncodingsToSender.d.ts +6 -0
- package/dist/tools/setParametersToSender/setMaxBitrateToSender.d.ts +2 -0
- package/dist/tools/setParametersToSender/setParametersToSender.d.ts +4 -0
- package/dist/tools/setParametersToSender/types.d.ts +5 -0
- package/dist/tools/syncMediaState/createSyncMediaState.d.ts +18 -0
- package/dist/tools/syncMediaState/index.d.ts +1 -18
- package/dist/utils/utils.d.ts +4 -0
- package/package.json +12 -18
- package/dist/@SipConnector-CZo7A8_q.cjs +0 -1
- package/dist/setParametersToSender/index.d.ts +0 -1
- package/dist/setParametersToSender/setParametersToSender.d.ts +0 -7
- package/dist/videoSendingBalancer/balance.d.ts +0 -10
- package/dist/videoSendingBalancer/getMaxBitrateByWidth.d.ts +0 -4
- package/dist/videoSendingBalancer/getMaxBitrateByWidthAndCodec.d.ts +0 -4
- package/dist/videoSendingBalancer/index.d.ts +0 -13
- package/dist/videoSendingBalancer/processSender.d.ts +0 -10
- package/dist/videoSendingBalancer/scaleBitrate.d.ts +0 -2
- package/dist/videoSendingBalancer/setEncodingsToSender.d.ts +0 -10
- /package/dist/{videoSendingBalancer → VideoSendingBalancer/calcBitrate}/hasAv1Codec.d.ts +0 -0
- /package/dist/{videoSendingBalancer → VideoSendingBalancer/calcBitrate}/scaleBitrateByCodec.d.ts +0 -0
- /package/dist/{videoSendingBalancer → tools}/scaleResolutionAndBitrate.d.ts +0 -0
- /package/dist/{setParametersToSender → tools/setParametersToSender}/configureEmptyEncodings.d.ts +0 -0
- /package/dist/{setParametersToSender → tools/setParametersToSender}/configureMaxBitrate.d.ts +0 -0
- /package/dist/{setParametersToSender → tools/setParametersToSender}/configureScaleResolutionDownBy.d.ts +0 -0
- /package/dist/{setParametersToSender → tools/setParametersToSender}/hasChangedRTCRtpSendParameters.d.ts +0 -0
- /package/dist/{setParametersToSender → tools/setParametersToSender}/resolveHasNeedToUpdateItemEncoding.d.ts +0 -0
- /package/dist/{videoSendingBalancer → utils}/hasIncludesString.d.ts +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const INTERVAL_COLLECT_STATISTICS = 1000;
|
|
2
|
+
export declare enum EStatsTypes {
|
|
3
|
+
INBOUND_RTP = "inbound-rtp",
|
|
4
|
+
REMOTE_OUTBOUND_RTP = "remote-outbound-rtp",
|
|
5
|
+
MEDIA_SOURCE = "media-source",
|
|
6
|
+
OUTBOUND_RTP = "outbound-rtp",
|
|
7
|
+
REMOTE_INBOUND_RTP = "remote-inbound-rtp",
|
|
8
|
+
CODEC = "codec",
|
|
9
|
+
CANDIDATE_PAIR = "candidate-pair",
|
|
10
|
+
CERTIFICATE = "certificate",
|
|
11
|
+
TRANSPORT = "transport",
|
|
12
|
+
LOCAL_CANDIDATE = "local-candidate",
|
|
13
|
+
REMOTE_CANDIDATE = "remote-candidate"
|
|
14
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { TypedEvents } from 'events-constructor';
|
|
2
|
+
import { TInbound, TOutbound } from './typings';
|
|
3
|
+
export type TEventMap = {
|
|
4
|
+
collected: {
|
|
5
|
+
outbound: TOutbound;
|
|
6
|
+
inbound: TInbound;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
export declare const EVENT_NAMES: readonly ["collected"];
|
|
10
|
+
export type TEvents = TypedEvents<TEventMap>;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TInbound, TOutbound, TSynchronizationSources } from './typings';
|
|
2
|
+
declare const parseStatsReports: ({ audioSenderStats, videoSenderFirstStats, videoSenderSecondStats, audioReceiverStats, videoReceiverFirstStats, videoReceiverSecondStats, synchronizationSources, }: {
|
|
3
|
+
audioSenderStats?: RTCStatsReport;
|
|
4
|
+
videoSenderFirstStats?: RTCStatsReport;
|
|
5
|
+
videoSenderSecondStats?: RTCStatsReport;
|
|
6
|
+
audioReceiverStats?: RTCStatsReport;
|
|
7
|
+
videoReceiverFirstStats?: RTCStatsReport;
|
|
8
|
+
videoReceiverSecondStats?: RTCStatsReport;
|
|
9
|
+
synchronizationSources: TSynchronizationSources;
|
|
10
|
+
}) => {
|
|
11
|
+
inbound: TInbound;
|
|
12
|
+
outbound: TOutbound;
|
|
13
|
+
};
|
|
14
|
+
export default parseStatsReports;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { TSynchronizationSources } from './typings';
|
|
2
|
+
declare const requestAllStatistics: (peerConnection: RTCPeerConnection) => Promise<{
|
|
3
|
+
synchronizationSources: TSynchronizationSources;
|
|
4
|
+
audioSenderStats: RTCStatsReport | undefined;
|
|
5
|
+
videoSenderFirstStats: RTCStatsReport | undefined;
|
|
6
|
+
videoSenderSecondStats: RTCStatsReport | undefined;
|
|
7
|
+
audioReceiverStats: RTCStatsReport | undefined;
|
|
8
|
+
videoReceiverFirstStats: RTCStatsReport | undefined;
|
|
9
|
+
videoReceiverSecondStats: RTCStatsReport | undefined;
|
|
10
|
+
}>;
|
|
11
|
+
export default requestAllStatistics;
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
import { EStatsTypes } from './constants';
|
|
2
|
+
export type TMedia = {
|
|
3
|
+
trackIdentifier?: string;
|
|
4
|
+
item?: RTCRtpSynchronizationSource;
|
|
5
|
+
};
|
|
6
|
+
export type TSynchronizationSources = {
|
|
7
|
+
audio: TMedia;
|
|
8
|
+
video: TMedia;
|
|
9
|
+
};
|
|
10
|
+
export type TCandidatePair = RTCIceCandidatePairStats & {
|
|
11
|
+
consentRequestsSent?: number;
|
|
12
|
+
nominated?: boolean;
|
|
13
|
+
packetsDiscardedOnSend?: number;
|
|
14
|
+
packetsSent?: number;
|
|
15
|
+
priority?: number;
|
|
16
|
+
writable?: boolean;
|
|
17
|
+
};
|
|
18
|
+
export type TCandidate = {
|
|
19
|
+
candidateType?: string;
|
|
20
|
+
ip?: string;
|
|
21
|
+
networkType?: string;
|
|
22
|
+
isRemote?: boolean;
|
|
23
|
+
address?: string;
|
|
24
|
+
component?: RTCIceComponent;
|
|
25
|
+
foundation?: string;
|
|
26
|
+
port?: number;
|
|
27
|
+
priority?: number;
|
|
28
|
+
protocol?: RTCIceProtocol;
|
|
29
|
+
relatedAddress?: string;
|
|
30
|
+
relatedPort?: number;
|
|
31
|
+
sdpMLineIndex?: number;
|
|
32
|
+
sdpMid?: string;
|
|
33
|
+
tcpType?: string;
|
|
34
|
+
usernameFragment?: string;
|
|
35
|
+
};
|
|
36
|
+
export type TOutboundRtp = RTCOutboundRtpStreamStats & {
|
|
37
|
+
active?: boolean;
|
|
38
|
+
encoderImplementation?: string;
|
|
39
|
+
frameHeight?: number;
|
|
40
|
+
contentType?: string;
|
|
41
|
+
frameWidth?: number;
|
|
42
|
+
framesPerSecond?: number;
|
|
43
|
+
framesSent?: number;
|
|
44
|
+
hugeFramesSent?: number;
|
|
45
|
+
keyFramesEncoded?: number;
|
|
46
|
+
headerBytesSent?: number;
|
|
47
|
+
qualityLimitationDurations?: {
|
|
48
|
+
bandwidth?: number;
|
|
49
|
+
cpu?: number;
|
|
50
|
+
none?: number;
|
|
51
|
+
other?: number;
|
|
52
|
+
};
|
|
53
|
+
qualityLimitationReason?: string;
|
|
54
|
+
qualityLimitationResolutionChanges?: number;
|
|
55
|
+
mediaSourceId?: string;
|
|
56
|
+
mediaType?: string;
|
|
57
|
+
mid?: string;
|
|
58
|
+
retransmittedBytesSent?: number;
|
|
59
|
+
retransmittedPacketsSent?: number;
|
|
60
|
+
totalEncodeTime?: number;
|
|
61
|
+
totalEncodedBytesTarget?: number;
|
|
62
|
+
totalPacketSendDelay?: number;
|
|
63
|
+
targetBitrate?: number;
|
|
64
|
+
trackId?: string;
|
|
65
|
+
};
|
|
66
|
+
export type TTransport = RTCTransportStats & {
|
|
67
|
+
dtlsRole?: string;
|
|
68
|
+
iceLocalUsernameFragment?: string;
|
|
69
|
+
iceRole?: string;
|
|
70
|
+
iceState?: string;
|
|
71
|
+
packetsSent?: number;
|
|
72
|
+
remoteCertificateId?: string;
|
|
73
|
+
selectedCandidatePairChanges?: number;
|
|
74
|
+
};
|
|
75
|
+
export type TInboundRtp = RTCInboundRtpStreamStats & {
|
|
76
|
+
audioLevel?: number;
|
|
77
|
+
bytesReceived?: number;
|
|
78
|
+
decoderImplementation?: string;
|
|
79
|
+
framesDropped?: number;
|
|
80
|
+
framesReceived?: number;
|
|
81
|
+
headerBytesReceived?: number;
|
|
82
|
+
jitterBufferDelay?: number;
|
|
83
|
+
jitterBufferEmittedCount?: number;
|
|
84
|
+
keyFramesDecoded?: number;
|
|
85
|
+
fecPacketsDiscarded?: number;
|
|
86
|
+
fecPacketsReceived?: number;
|
|
87
|
+
jitterBufferMinimumDelay?: number;
|
|
88
|
+
jitterBufferTargetDelay?: number;
|
|
89
|
+
lastPacketReceivedTimestamp?: number;
|
|
90
|
+
totalSamplesReceived?: number;
|
|
91
|
+
};
|
|
92
|
+
export type TMediaSource = {
|
|
93
|
+
audioLevel?: number;
|
|
94
|
+
frames?: number;
|
|
95
|
+
framesPerSecond?: number;
|
|
96
|
+
height?: number;
|
|
97
|
+
width?: number;
|
|
98
|
+
totalAudioEnergy?: number;
|
|
99
|
+
totalSamplesDuration?: number;
|
|
100
|
+
trackIdentifier?: string;
|
|
101
|
+
};
|
|
102
|
+
export type TCertificate = {
|
|
103
|
+
base64Certificate?: string;
|
|
104
|
+
fingerprint?: string;
|
|
105
|
+
fingerprintAlgorithm?: string;
|
|
106
|
+
};
|
|
107
|
+
export type TRemoteInboundRtp = {
|
|
108
|
+
codecId?: string;
|
|
109
|
+
fractionLost?: number;
|
|
110
|
+
jitter?: number;
|
|
111
|
+
localId?: string;
|
|
112
|
+
packetsLost?: number;
|
|
113
|
+
roundTripTime?: number;
|
|
114
|
+
roundTripTimeMeasurements?: number;
|
|
115
|
+
ssrc?: number;
|
|
116
|
+
totalRoundTripTime?: number;
|
|
117
|
+
transportId?: string;
|
|
118
|
+
};
|
|
119
|
+
export type TRemoteOutboundRtp = {
|
|
120
|
+
bytesSent?: number;
|
|
121
|
+
codecId?: string;
|
|
122
|
+
localId?: string;
|
|
123
|
+
packetsSent?: number;
|
|
124
|
+
remoteTimestamp?: number;
|
|
125
|
+
reportsSent?: number;
|
|
126
|
+
roundTripTimeMeasurements?: number;
|
|
127
|
+
ssrc?: number;
|
|
128
|
+
totalRoundTripTime?: number;
|
|
129
|
+
transportId?: string;
|
|
130
|
+
};
|
|
131
|
+
export type TOutboundVideo = {
|
|
132
|
+
outboundRtp?: TOutboundRtp;
|
|
133
|
+
mediaSource?: TMediaSource;
|
|
134
|
+
codec?: RTCRtpCodecParameters;
|
|
135
|
+
remoteInboundRtp?: TRemoteInboundRtp;
|
|
136
|
+
};
|
|
137
|
+
export type TOutboundAudio = {
|
|
138
|
+
outboundRtp?: TOutboundRtp;
|
|
139
|
+
mediaSource?: TMediaSource;
|
|
140
|
+
codec?: RTCRtpCodecParameters;
|
|
141
|
+
remoteInboundRtp?: TRemoteInboundRtp;
|
|
142
|
+
};
|
|
143
|
+
export type TAdditional = {
|
|
144
|
+
candidatePair?: TCandidatePair;
|
|
145
|
+
certificate?: TCertificate;
|
|
146
|
+
localCandidate?: TCandidate;
|
|
147
|
+
remoteCandidate?: TCandidate;
|
|
148
|
+
transport?: TTransport;
|
|
149
|
+
};
|
|
150
|
+
export type TInboundVideo = {
|
|
151
|
+
inboundRtp?: TInboundRtp;
|
|
152
|
+
codec?: RTCRtpCodecParameters;
|
|
153
|
+
synchronizationSources?: TMedia;
|
|
154
|
+
};
|
|
155
|
+
export type TInboundAudio = {
|
|
156
|
+
inboundRtp?: TInboundRtp;
|
|
157
|
+
codec?: RTCRtpCodecParameters;
|
|
158
|
+
remoteOutboundRtp?: TRemoteOutboundRtp;
|
|
159
|
+
synchronizationSources?: TMedia;
|
|
160
|
+
};
|
|
161
|
+
export type TInbound = {
|
|
162
|
+
video: TInboundVideo;
|
|
163
|
+
secondVideo: TInboundVideo;
|
|
164
|
+
audio: TInboundAudio;
|
|
165
|
+
additional: TAdditional;
|
|
166
|
+
};
|
|
167
|
+
export type TOutbound = {
|
|
168
|
+
video: TOutboundVideo;
|
|
169
|
+
secondVideo: TOutboundVideo;
|
|
170
|
+
audio: TOutboundAudio;
|
|
171
|
+
additional: TAdditional;
|
|
172
|
+
};
|
|
173
|
+
export type TAudioStatistics = {
|
|
174
|
+
[EStatsTypes.OUTBOUND_RTP]?: TOutboundRtp;
|
|
175
|
+
[EStatsTypes.CODEC]?: RTCRtpCodecParameters;
|
|
176
|
+
[EStatsTypes.MEDIA_SOURCE]?: TMediaSource;
|
|
177
|
+
[EStatsTypes.REMOTE_INBOUND_RTP]?: TRemoteInboundRtp;
|
|
178
|
+
[EStatsTypes.INBOUND_RTP]?: TInboundRtp;
|
|
179
|
+
[EStatsTypes.REMOTE_OUTBOUND_RTP]?: TRemoteOutboundRtp;
|
|
180
|
+
};
|
|
181
|
+
export type TVideoStatistics = {
|
|
182
|
+
[EStatsTypes.OUTBOUND_RTP]?: TOutboundRtp;
|
|
183
|
+
[EStatsTypes.CODEC]?: RTCRtpCodecParameters;
|
|
184
|
+
[EStatsTypes.MEDIA_SOURCE]?: TMediaSource;
|
|
185
|
+
[EStatsTypes.REMOTE_INBOUND_RTP]?: TRemoteInboundRtp;
|
|
186
|
+
[EStatsTypes.INBOUND_RTP]?: TInboundRtp;
|
|
187
|
+
};
|
|
188
|
+
export type TParsedStatistics = {
|
|
189
|
+
[EStatsTypes.CANDIDATE_PAIR]?: TCandidatePair;
|
|
190
|
+
[EStatsTypes.CERTIFICATE]?: TCertificate;
|
|
191
|
+
[EStatsTypes.LOCAL_CANDIDATE]?: TCandidate;
|
|
192
|
+
[EStatsTypes.REMOTE_CANDIDATE]?: TCandidate;
|
|
193
|
+
[EStatsTypes.TRANSPORT]?: TTransport;
|
|
194
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TOnSetParameters, TResultSetParametersToSender } from '../tools';
|
|
2
|
+
import { IEncodingParameters, IParametersSetter } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Обёртка для ParametersSetter с использованием TaskQueue
|
|
5
|
+
*/
|
|
6
|
+
export declare class ParametersSetterWithQueue implements IParametersSetter {
|
|
7
|
+
private readonly taskQueue;
|
|
8
|
+
private readonly onSetParameters?;
|
|
9
|
+
constructor(onSetParameters?: TOnSetParameters);
|
|
10
|
+
setEncodingsToSender(sender: RTCRtpSender, parameters: IEncodingParameters): Promise<TResultSetParametersToSender>;
|
|
11
|
+
stop(): void;
|
|
12
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { TResultSetParametersToSender } from '../tools';
|
|
2
|
+
import { ICodecProvider, IMainCamHeaders, IParametersSetter, ISenderFinder } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Бизнес-логика балансировки отправителей
|
|
5
|
+
* Отвечает за определение стратегии и применение параметров к отправителю
|
|
6
|
+
*/
|
|
7
|
+
export declare class SenderBalancer {
|
|
8
|
+
private readonly ignoreForCodec?;
|
|
9
|
+
private readonly senderFinder;
|
|
10
|
+
private readonly codecProvider;
|
|
11
|
+
private readonly parametersSetter;
|
|
12
|
+
private readonly resultNoChanged;
|
|
13
|
+
constructor({ senderFinder, codecProvider, parametersSetter, }: {
|
|
14
|
+
senderFinder: ISenderFinder;
|
|
15
|
+
codecProvider: ICodecProvider;
|
|
16
|
+
parametersSetter: IParametersSetter;
|
|
17
|
+
}, options: {
|
|
18
|
+
ignoreForCodec?: string;
|
|
19
|
+
});
|
|
20
|
+
/**
|
|
21
|
+
* Выполняет балансировку на основе заголовков от сервера
|
|
22
|
+
* @param connection - RTCPeerConnection для получения отправителей
|
|
23
|
+
* @param headers - Заголовки от сервера с командами управления
|
|
24
|
+
* @returns Promise с результатом балансировки
|
|
25
|
+
*/
|
|
26
|
+
balance(connection: RTCPeerConnection, headers?: IMainCamHeaders): Promise<TResultSetParametersToSender>;
|
|
27
|
+
/**
|
|
28
|
+
* Обрабатывает отправитель в зависимости от команды управления
|
|
29
|
+
* @param context - Контекст балансировки
|
|
30
|
+
* @returns Promise с результатом обработки
|
|
31
|
+
*/
|
|
32
|
+
private processSender;
|
|
33
|
+
/**
|
|
34
|
+
* Понижает разрешение отправителя (пауза камеры)
|
|
35
|
+
* @param context - Контекст балансировки
|
|
36
|
+
* @returns Promise с результатом
|
|
37
|
+
*/
|
|
38
|
+
private downgradeResolutionSender;
|
|
39
|
+
/**
|
|
40
|
+
* Устанавливает битрейт на основе разрешения трека
|
|
41
|
+
* @param context - Контекст балансировки
|
|
42
|
+
* @returns Promise с результатом
|
|
43
|
+
*/
|
|
44
|
+
private setBitrateByTrackResolution;
|
|
45
|
+
/**
|
|
46
|
+
* Устанавливает разрешение отправителя на основе заголовка
|
|
47
|
+
* @param resolutionMainCam - Разрешение главной камеры
|
|
48
|
+
* @param context - Контекст балансировки
|
|
49
|
+
* @returns Promise с результатом
|
|
50
|
+
*/
|
|
51
|
+
private setResolutionSender;
|
|
52
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ITaskQueue } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Очередь задач с правильной обработкой ошибок
|
|
4
|
+
* Обеспечивает последовательное выполнение задач и логирование ошибок
|
|
5
|
+
*/
|
|
6
|
+
export declare class TaskQueue<T> implements ITaskQueue<T> {
|
|
7
|
+
private readonly stackPromises;
|
|
8
|
+
/**
|
|
9
|
+
* Добавляет задачу в очередь и возвращает Promise с результатом
|
|
10
|
+
* @param task - Функция для выполнения
|
|
11
|
+
* @returns Promise с результатом выполнения задачи
|
|
12
|
+
*/
|
|
13
|
+
add(task: () => Promise<T>): Promise<T>;
|
|
14
|
+
stop(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Выполняет задачи из очереди с обработкой ошибок
|
|
17
|
+
* @returns Promise с результатом выполнения
|
|
18
|
+
*/
|
|
19
|
+
private run;
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { SipConnector } from '../SipConnector';
|
|
2
|
+
import { TResultSetParametersToSender } from '../tools';
|
|
3
|
+
import { IBalancerOptions } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Контроллер/фасад для балансировки видеопотоков
|
|
6
|
+
* Координирует работу обработчика событий, балансировщика и очереди задач
|
|
7
|
+
*/
|
|
8
|
+
declare class VideoSendingBalancer {
|
|
9
|
+
private readonly eventHandler;
|
|
10
|
+
private readonly senderBalancer;
|
|
11
|
+
private readonly parametersSetterWithQueue;
|
|
12
|
+
private serverHeaders?;
|
|
13
|
+
constructor(sipConnector: SipConnector, { ignoreForCodec, onSetParameters }?: IBalancerOptions);
|
|
14
|
+
/**
|
|
15
|
+
* Подписывается на события управления главной камерой
|
|
16
|
+
*/
|
|
17
|
+
subscribe(): void;
|
|
18
|
+
/**
|
|
19
|
+
* Отписывается от событий и сбрасывает состояние
|
|
20
|
+
*/
|
|
21
|
+
unsubscribe(): void;
|
|
22
|
+
/**
|
|
23
|
+
* Сбрасывает состояние балансировщика
|
|
24
|
+
*/
|
|
25
|
+
reset(): void;
|
|
26
|
+
/**
|
|
27
|
+
* Перебалансирует текущее состояние
|
|
28
|
+
* @returns Promise с результатом балансировки
|
|
29
|
+
*/
|
|
30
|
+
reBalance(): Promise<TResultSetParametersToSender>;
|
|
31
|
+
/**
|
|
32
|
+
* Выполняет балансировку на основе текущего состояния
|
|
33
|
+
* @returns Promise с результатом балансировки
|
|
34
|
+
*/
|
|
35
|
+
private balanceByTrack;
|
|
36
|
+
/**
|
|
37
|
+
* Обработчик событий управления главной камерой
|
|
38
|
+
* @param headers - Заголовки от сервера
|
|
39
|
+
*/
|
|
40
|
+
private readonly handleMainCamControl;
|
|
41
|
+
}
|
|
42
|
+
declare const resolveVideoSendingBalancer: (sipConnector: SipConnector, options?: IBalancerOptions) => VideoSendingBalancer;
|
|
43
|
+
export default VideoSendingBalancer;
|
|
44
|
+
export { resolveVideoSendingBalancer };
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { SipConnector } from '../SipConnector';
|
|
2
|
+
import { IEventHandler, IMainCamHeaders } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Обработчик событий управления главной камерой
|
|
5
|
+
* Отвечает за подписку и отписку от событий SipConnector
|
|
6
|
+
*/
|
|
7
|
+
export declare class VideoSendingEventHandler implements IEventHandler {
|
|
8
|
+
private readonly sipConnector;
|
|
9
|
+
private currentHandler?;
|
|
10
|
+
constructor(sipConnector: SipConnector);
|
|
11
|
+
/**
|
|
12
|
+
* Подписывается на события управления главной камерой
|
|
13
|
+
* @param handler - Обработчик события
|
|
14
|
+
*/
|
|
15
|
+
subscribe(handler: (headers: IMainCamHeaders) => void): void;
|
|
16
|
+
/**
|
|
17
|
+
* Отписывается от событий управления главной камерой
|
|
18
|
+
*/
|
|
19
|
+
unsubscribe(): void;
|
|
20
|
+
/**
|
|
21
|
+
* Получает соединение из SipConnector
|
|
22
|
+
* @returns RTCPeerConnection или undefined
|
|
23
|
+
*/
|
|
24
|
+
getConnection(): RTCPeerConnection | undefined;
|
|
25
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare const getMinimumBitrate: (codec?: string) => number;
|
|
2
|
+
export declare const getMaximumBitrate: (codec?: string) => number;
|
|
3
|
+
declare const calcMaxBitrateByWidthAndCodec: (maxWidth: number, codec?: string) => number;
|
|
4
|
+
export default calcMaxBitrateByWidthAndCodec;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as calcMaxBitrateByWidthAndCodec, getMaximumBitrate, getMinimumBitrate, } from './calcMaxBitrateByWidthAndCodec';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { default as calcScaleResolutionDownBy } from './calcScaleResolutionDownBy';
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { EEventsMainCAM } from '../ApiManager';
|
|
2
|
+
import { TOnSetParameters, TResultSetParametersToSender } from '../tools';
|
|
3
|
+
export interface IBalancerOptions {
|
|
4
|
+
ignoreForCodec?: string;
|
|
5
|
+
onSetParameters?: TOnSetParameters;
|
|
6
|
+
}
|
|
7
|
+
export interface IMainCamHeaders {
|
|
8
|
+
mainCam?: EEventsMainCAM;
|
|
9
|
+
resolutionMainCam?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface IBalancingContext {
|
|
12
|
+
sender: RTCRtpSender;
|
|
13
|
+
videoTrack: MediaStreamVideoTrack;
|
|
14
|
+
codec?: string;
|
|
15
|
+
}
|
|
16
|
+
export interface ISenderFinder {
|
|
17
|
+
findVideoSender: (senders: RTCRtpSender[]) => RTCRtpSender | undefined;
|
|
18
|
+
}
|
|
19
|
+
export interface ICodecProvider {
|
|
20
|
+
getCodecFromSender: (sender: RTCRtpSender) => Promise<string>;
|
|
21
|
+
}
|
|
22
|
+
export interface IEncodingParameters {
|
|
23
|
+
scaleResolutionDownBy: number;
|
|
24
|
+
maxBitrate: number;
|
|
25
|
+
}
|
|
26
|
+
export interface IParametersSetter {
|
|
27
|
+
setEncodingsToSender: (sender: RTCRtpSender, parameters: IEncodingParameters, onSetParameters?: TOnSetParameters) => Promise<TResultSetParametersToSender>;
|
|
28
|
+
}
|
|
29
|
+
export interface IEventHandler {
|
|
30
|
+
subscribe: (handler: (headers: IMainCamHeaders) => void) => void;
|
|
31
|
+
unsubscribe: () => void;
|
|
32
|
+
getConnection: () => RTCPeerConnection | undefined;
|
|
33
|
+
}
|
|
34
|
+
export interface ITaskQueue<T> {
|
|
35
|
+
add: (task: () => Promise<T>) => Promise<T>;
|
|
36
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { AnswerOptions, ExtraHeaders, HoldOptions, MediaStreamTypes, NameAddrHeader, OnHoldResult, RTCPeerConnectionDeprecated, RTCSession, ReferOptions, RenegotiateOptions, SessionDirection, SessionStatus, TerminateOptions, URI, C as constants } from '@krivega/jssip';
|
|
2
1
|
import { Events } from 'events-constructor';
|
|
3
2
|
import { SESSION_JSSIP_EVENT_NAMES } from './eventNames';
|
|
3
|
+
import { AnswerOptions, ExtraHeaders, HoldOptions, MediaStreamTypes, NameAddrHeader, OnHoldResult, RTCPeerConnectionDeprecated, RTCSession, ReferOptions, RenegotiateOptions, SessionDirection, SessionStatus, TerminateOptions, URI, C as constants } from '@krivega/jssip';
|
|
4
4
|
export type TEventHandlers = Record<string, (data: unknown) => void>;
|
|
5
5
|
declare class BaseSession implements RTCSession {
|
|
6
6
|
originator: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { RTCPeerConnectionDeprecated } from '@krivega/jssip';
|
|
2
1
|
import { Events } from 'events-constructor';
|
|
3
|
-
import { MediaStreamTrackMock } from 'webrtc-mock';
|
|
4
2
|
import { default as RTCRtpSenderMock } from './RTCRtpSenderMock';
|
|
3
|
+
import { RTCPeerConnectionDeprecated } from '@krivega/jssip';
|
|
4
|
+
import { MediaStreamTrackMock } from 'webrtc-mock';
|
|
5
5
|
export declare enum EEvent {
|
|
6
6
|
TRACK = "track"
|
|
7
7
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { NameAddrHeader, IncomingInfoEvent } from '@krivega/jssip';
|
|
2
|
+
import { default as BaseSession, TEventHandlers } from './BaseSession.mock';
|
|
3
3
|
export declare const FAILED_CONFERENCE_NUMBER = "777";
|
|
4
4
|
export declare const createDeclineStartPresentationError: () => Error;
|
|
5
5
|
declare class RTCSessionMock extends BaseSession {
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { DisconnectEvent, UA as IUA, IncomingRequest, UAConfiguration, UAConfigurationParams, UAEventMap } from '@krivega/jssip';
|
|
2
1
|
import { Events } from 'events-constructor';
|
|
3
|
-
import { TEventHandlers } from './BaseSession.mock';
|
|
4
2
|
import { default as Registrator } from './Registrator.mock';
|
|
5
3
|
import { default as RTCSessionMock } from './RTCSessionMock';
|
|
4
|
+
import { DisconnectEvent, UA as IUA, IncomingRequest, UAConfiguration, UAConfigurationParams, UAEventMap } from '@krivega/jssip';
|
|
5
|
+
import { TEventHandlers } from './BaseSession.mock';
|
|
6
6
|
export declare const PASSWORD_CORRECT = "PASSWORD_CORRECT";
|
|
7
7
|
export declare const PASSWORD_CORRECT_2 = "PASSWORD_CORRECT_2";
|
|
8
8
|
export declare const NAME_INCORRECT = "NAME_INCORRECT";
|
|
@@ -2,7 +2,7 @@ export declare const UA_SYNTHETICS_EVENT_NAMES: readonly ["incomingCall", "decli
|
|
|
2
2
|
export declare const UA_JSSIP_EVENT_NAMES: readonly ["connecting", "connected", "disconnected", "newRTCSession", "registered", "unregistered", "registrationFailed", "newMessage", "sipEvent"];
|
|
3
3
|
export declare const SESSION_SYNTHETICS_EVENT_NAMES: readonly ["availableSecondRemoteStream", "notAvailableSecondRemoteStream", "mustStopPresentation", "shareState", "enterRoom", "useLicense", "peerconnection:confirmed", "peerconnection:ontrack", "channels", "ended:fromserver", "main-cam-control", "admin-start-main-cam", "admin-stop-main-cam", "admin-stop-mic", "admin-start-mic", "admin-force-sync-media-state", "participant:move-request-to-spectators", "participant:move-request-to-participants"];
|
|
4
4
|
export declare const SESSION_JSSIP_EVENT_NAMES: readonly ["ended", "connecting", "sending", "reinvite", "replaces", "refer", "progress", "accepted", "confirmed", "peerconnection", "failed", "muted", "unmuted", "newDTMF", "newInfo", "hold", "unhold", "update", "sdp", "icecandidate", "getusermediafailed", "peerconnection:createofferfailed", "peerconnection:createanswerfailed", "peerconnection:setlocaldescriptionfailed", "peerconnection:setremotedescriptionfailed", "presentation:start", "presentation:started", "presentation:end", "presentation:ended", "presentation:failed"];
|
|
5
|
-
export declare const UA_EVENT_NAMES: ("connecting" | "
|
|
5
|
+
export declare const UA_EVENT_NAMES: ("connecting" | "channels:notify" | "participant:added-to-list-moderators" | "participant:removed-from-list-moderators" | "participant:move-request-to-stream" | "participation:accepting-word-request" | "participation:cancelling-word-request" | "webcast:started" | "webcast:stopped" | "account:changed" | "account:deleted" | "conference:participant-token-issued" | "connected" | "disconnected" | "newRTCSession" | "registered" | "unregistered" | "registrationFailed" | "newMessage" | "sipEvent" | "incomingCall" | "declinedIncomingCall" | "terminatedIncomingCall" | "failedIncomingCall")[];
|
|
6
6
|
export declare const SESSION_EVENT_NAMES: readonly ["ended", "connecting", "sending", "reinvite", "replaces", "refer", "progress", "accepted", "confirmed", "peerconnection", "failed", "muted", "unmuted", "newDTMF", "newInfo", "hold", "unhold", "update", "sdp", "icecandidate", "getusermediafailed", "peerconnection:createofferfailed", "peerconnection:createanswerfailed", "peerconnection:setlocaldescriptionfailed", "peerconnection:setremotedescriptionfailed", "presentation:start", "presentation:started", "presentation:end", "presentation:ended", "presentation:failed", "availableSecondRemoteStream", "notAvailableSecondRemoteStream", "mustStopPresentation", "shareState", "enterRoom", "useLicense", "peerconnection:confirmed", "peerconnection:ontrack", "channels", "ended:fromserver", "main-cam-control", "admin-start-main-cam", "admin-stop-main-cam", "admin-stop-mic", "admin-start-mic", "admin-force-sync-media-state", "participant:move-request-to-spectators", "participant:move-request-to-participants"];
|
|
7
7
|
export type TEventUA = (typeof UA_EVENT_NAMES)[number];
|
|
8
8
|
export type TEventSession = (typeof SESSION_EVENT_NAMES)[number];
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { RTCSession, UA } from '@krivega/jssip';
|
|
2
1
|
import { default as UAMock } from './UA.mock';
|
|
3
2
|
import { default as WebSocketInterfaceMock } from './WebSocketInterface.mock';
|
|
3
|
+
import { RTCSession, UA } from '@krivega/jssip';
|
|
4
4
|
declare const jssip: {
|
|
5
5
|
triggerNewInfo: (rtcSession: RTCSession, extraHeaders: [string, string][]) => void;
|
|
6
6
|
triggerNewSipEvent: (ua: UA, extraHeaders: [string, string][]) => void;
|