@livedigital/client 3.62.1 → 3.63.0-lk-7808-network-quality.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Client.d.ts +12 -0
- package/dist/constants/events.d.ts +1 -0
- package/dist/constants/events.ts +1 -0
- package/dist/engine/WebRTCStats/NetworkQualityMonitor.d.ts +61 -0
- package/dist/engine/WebRTCStats/StatsHandler.d.ts +2 -0
- package/dist/engine/WebRTCStats/TransportsStatsProvider.d.ts +13 -2
- package/dist/engine/WebRTCStats/types.d.ts +2 -0
- package/dist/engine/index.d.ts +2 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.es.js +2 -2
- package/dist/index.es.js.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/inversify.tokens.d.ts +3 -0
- package/dist/qoe/DevicePressureMonitor.d.ts +8 -0
- package/dist/qoe/NetworkQualityCalculator.d.ts +21 -0
- package/dist/qoe/networkQuality.types.d.ts +75 -0
- package/dist/qoe/networkQualitySamples.d.ts +36 -0
- package/dist/qoe/networkQualityThresholds.d.ts +60 -0
- package/dist/types/engine.d.ts +7 -0
- package/package.json +1 -1
package/dist/Client.d.ts
CHANGED
|
@@ -2,6 +2,7 @@ import 'reflect-metadata';
|
|
|
2
2
|
import type { ClientMetaPayload } from './ClientMetaProvider';
|
|
3
3
|
import type Peer from './engine/Peer';
|
|
4
4
|
import type { TransportsWebRTCStats } from './engine/WebRTCStats/types';
|
|
5
|
+
import type { NetworkQuality } from './qoe/networkQuality.types';
|
|
5
6
|
import EnhancedEventEmitter from './EnhancedEventEmitter';
|
|
6
7
|
import type { ClientParams } from './types/client';
|
|
7
8
|
import type { AvailableMediaDevices, CreateCameraVideoTrackOptions, CreateCustomAudioOptions, CreateCustomVideoOptions, CreateMicrophoneAudioTrackOptions, CreateScreenMediaOptions, JoinChannelParams, TransportsStateInfo } from './types/common';
|
|
@@ -250,6 +251,17 @@ declare class Client {
|
|
|
250
251
|
* @group Диагностика
|
|
251
252
|
*/
|
|
252
253
|
restartIce(): Promise<void>;
|
|
254
|
+
/**
|
|
255
|
+
* Состояние своей сети и устройства по отдельности: приём, отдача, ресурсы
|
|
256
|
+
* устройства. В отличие от MOS-оценок отвечает на вопрос «на чьей стороне
|
|
257
|
+
* проблема», а не «насколько плохо выглядит поток».
|
|
258
|
+
*
|
|
259
|
+
* Снимок на момент вызова; об изменениях уровня сообщает событие
|
|
260
|
+
* `network-quality-updated` через `client.observer`. При `disableWid: true`
|
|
261
|
+
* статистика не собирается, и сетевые направления остаются в `unknown`.
|
|
262
|
+
* @group Диагностика
|
|
263
|
+
*/
|
|
264
|
+
networkQuality(): NetworkQuality;
|
|
253
265
|
/**
|
|
254
266
|
* Возвращает агрегированную транспортную статистику WebRTC для мониторинга качества соединения.
|
|
255
267
|
* @group Диагностика
|
|
@@ -48,6 +48,7 @@ export declare const CLIENT_EVENTS: {
|
|
|
48
48
|
readonly effectsDisabled: "effects-disabled";
|
|
49
49
|
readonly effectsFailed: "effects-failed";
|
|
50
50
|
readonly networkScoresUpdated: "network-scores-updated";
|
|
51
|
+
readonly networkQualityUpdated: "network-quality-updated";
|
|
51
52
|
};
|
|
52
53
|
export declare const TRACK_EVENTS: {
|
|
53
54
|
readonly volumeChanged: "volume-changed";
|
package/dist/constants/events.ts
CHANGED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { StatsReportItem } from 'webrtc-issue-detector';
|
|
2
|
+
import { DevicePressureMonitor } from '../../qoe/DevicePressureMonitor';
|
|
3
|
+
import { NetworkQualityCalculator } from '../../qoe/NetworkQualityCalculator';
|
|
4
|
+
import { NetworkQuality } from '../../qoe/networkQuality.types';
|
|
5
|
+
export interface NetworkQualityMonitorParams {
|
|
6
|
+
/** Идентификаторы транспортов: по ним отчёты разводятся по направлениям. */
|
|
7
|
+
sendTransportId: string;
|
|
8
|
+
receiveTransportId: string;
|
|
9
|
+
/** Интервал сбора статистики: от него считается порог протухания трафика. */
|
|
10
|
+
statsIntervalMs: number;
|
|
11
|
+
/** Вызывается после гистерезиса, а не на каждый тик статистики. */
|
|
12
|
+
onLevelChange?: (quality: NetworkQuality) => void;
|
|
13
|
+
/** Единый источник времени: тесты управляют им целиком. */
|
|
14
|
+
now?: () => number;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Считает состояние своей сети и устройства по потоку WebRTC-статистики.
|
|
18
|
+
*
|
|
19
|
+
* Отвечает за всё, что зависит от времени: приращения счётчиков, гистерезис
|
|
20
|
+
* и уход в `unknown` при отсутствии трафика. Формула «метрики → уровень»
|
|
21
|
+
* живёт в {@link NetworkQualityCalculator} и состояния не имеет.
|
|
22
|
+
*
|
|
23
|
+
* Отчёты приходят по одному на каждый `RTCPeerConnection`, а у mediasoup их два:
|
|
24
|
+
* отправляющий и принимающий. Складывать их нельзя — получится ровно та же
|
|
25
|
+
* смесь своего и чужого, ради ухода от которой всё и затевалось.
|
|
26
|
+
*/
|
|
27
|
+
export default class NetworkQualityMonitor {
|
|
28
|
+
#private;
|
|
29
|
+
private readonly calculator;
|
|
30
|
+
private readonly devicePressure;
|
|
31
|
+
constructor(calculator: NetworkQualityCalculator, devicePressure: DevicePressureMonitor);
|
|
32
|
+
init({ sendTransportId, receiveTransportId, statsIntervalMs, onLevelChange, now, }: NetworkQualityMonitorParams): void;
|
|
33
|
+
clear(): void;
|
|
34
|
+
get quality(): NetworkQuality;
|
|
35
|
+
/** Вызывается из {@link StatsHandler} на каждый отчёт. */
|
|
36
|
+
handleReport({ id, stats }: StatsReportItem): void;
|
|
37
|
+
private resolveReportDirection;
|
|
38
|
+
private applySample;
|
|
39
|
+
/**
|
|
40
|
+
* Асимметричный гистерезис: ухудшение подтверждается быстро, улучшение —
|
|
41
|
+
* долго. Так значок не мигает на одном плохом тике и не возвращается
|
|
42
|
+
* в зелёное от случайной паузы в потерях.
|
|
43
|
+
*/
|
|
44
|
+
private updateShownLevel;
|
|
45
|
+
/**
|
|
46
|
+
* Единственная точка оповещения: событие уходит только на реальную смену
|
|
47
|
+
* уровней. Отчёт приходит на каждый транспорт отдельно, так что за один тик
|
|
48
|
+
* статистики событий может быть два.
|
|
49
|
+
*
|
|
50
|
+
* Если поток отчётов встанет совсем, протухание заметит только геттер:
|
|
51
|
+
* таймеров ради событий без входящих данных мы не заводим.
|
|
52
|
+
*/
|
|
53
|
+
private notifyIfChanged;
|
|
54
|
+
private resolveDirection;
|
|
55
|
+
/**
|
|
56
|
+
* Устройство: показание Compute Pressure API, а где его нет — догадка по
|
|
57
|
+
* метрикам отдачи. Потребитель эти два случая не различает; если разница
|
|
58
|
+
* понадобится, её придётся вынести в отдельное поле.
|
|
59
|
+
*/
|
|
60
|
+
private resolveDevice;
|
|
61
|
+
}
|
|
@@ -3,6 +3,8 @@ import type { ParsedInboundAudioStreamCompositeStats, ParsedInboundVideoStreamCo
|
|
|
3
3
|
export default class StatsHandler {
|
|
4
4
|
#private;
|
|
5
5
|
handle(payload: StatsReportItem[]): void;
|
|
6
|
+
addAggregateHandler(handler: (report: StatsReportItem) => void): void;
|
|
7
|
+
removeAggregateHandler(handler: (report: StatsReportItem) => void): void;
|
|
6
8
|
addConnectionHandler(id: string, handler: (stats: ParsedConnectionStats) => void): void;
|
|
7
9
|
addInboundVideoHandler(id: string, handler: (stats: ParsedInboundVideoStreamCompositeStats) => void): void;
|
|
8
10
|
addInboundAudioHandler(id: string, handler: (stats: ParsedInboundAudioStreamCompositeStats) => void): void;
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import { TransportsStatsProviderParams, TransportsWebRTCStats } from './types';
|
|
2
|
+
import type ConfigService from '../../config/ConfigService';
|
|
2
3
|
import type { LoggerFactory } from '../../types/container';
|
|
3
4
|
import type { ScoresCalculator } from '../../qoe/ScoresCalculator';
|
|
5
|
+
import NetworkQualityMonitor from './NetworkQualityMonitor';
|
|
6
|
+
import StatsHandler from './StatsHandler';
|
|
7
|
+
import EnhancedEventEmitter from '../../EnhancedEventEmitter';
|
|
8
|
+
import type { ClientObserverEvents } from '../../types/engine';
|
|
9
|
+
import type { NetworkQuality } from '../../qoe/networkQuality.types';
|
|
4
10
|
export default class TransportsStatsProvider {
|
|
5
11
|
#private;
|
|
6
|
-
|
|
7
|
-
|
|
12
|
+
private readonly networkQualityMonitor;
|
|
13
|
+
private readonly statsHandler;
|
|
14
|
+
private readonly clientEventEmitter;
|
|
15
|
+
private readonly config;
|
|
16
|
+
constructor(loggerFactory: LoggerFactory, scoresCalculator: ScoresCalculator, networkQualityMonitor: NetworkQualityMonitor, statsHandler: StatsHandler, clientEventEmitter: EnhancedEventEmitter<ClientObserverEvents>, config: ConfigService);
|
|
17
|
+
init({ sendTransportConnectionManager, receiveTransportConnectionManager, sendTransportId, receiveTransportId, media, peers, }: TransportsStatsProviderParams): void;
|
|
18
|
+
get networkQuality(): NetworkQuality;
|
|
8
19
|
getStats(): TransportsWebRTCStats;
|
|
9
20
|
clear(): void;
|
|
10
21
|
private doGetStats;
|
|
@@ -5,6 +5,8 @@ import type ConnectionStatManager from './ConnectionStatsManager';
|
|
|
5
5
|
export interface TransportsStatsProviderParams {
|
|
6
6
|
sendTransportConnectionManager: ConnectionStatManager;
|
|
7
7
|
receiveTransportConnectionManager: ConnectionStatManager;
|
|
8
|
+
sendTransportId: string;
|
|
9
|
+
receiveTransportId: string;
|
|
8
10
|
media: Media;
|
|
9
11
|
peers: IPeersService;
|
|
10
12
|
}
|
package/dist/engine/index.d.ts
CHANGED
|
@@ -25,6 +25,7 @@ import SignalingApiClient from './signalingApiClient/SignalingApiClient';
|
|
|
25
25
|
import System from './system';
|
|
26
26
|
import StatsHandler from './WebRTCStats/StatsHandler';
|
|
27
27
|
import TransportsStatsProvider from './WebRTCStats/TransportsStatsProvider';
|
|
28
|
+
import type { NetworkQuality } from '../qoe/networkQuality.types';
|
|
28
29
|
import { TransportsWebRTCStats } from './WebRTCStats/types';
|
|
29
30
|
import PeersStorage from './PeersStorage';
|
|
30
31
|
import { ScoresCalculator } from '../qoe/ScoresCalculator';
|
|
@@ -76,6 +77,7 @@ declare class Engine {
|
|
|
76
77
|
createCustomVideoTrack(options: CreateCustomVideoOptions): Promise<Track>;
|
|
77
78
|
deleteTrack(tracks: BaseTrack): Promise<void>;
|
|
78
79
|
transportsStats(): TransportsWebRTCStats | undefined;
|
|
80
|
+
networkQuality(): NetworkQuality;
|
|
79
81
|
setSignalingServerUrl(url: string): void;
|
|
80
82
|
private cleanup;
|
|
81
83
|
private watchInternalEvents;
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,8 @@ export { default as EnhancedEventEmitter } from './EnhancedEventEmitter';
|
|
|
3
3
|
export { default as Peer } from './engine/Peer';
|
|
4
4
|
export { default as PeerProducer } from './engine/PeerProducer';
|
|
5
5
|
export { ScoresCalculator } from './qoe/ScoresCalculator';
|
|
6
|
+
export { NetworkQualityDirection, NetworkQualityLevel, NetworkQualityReason, } from './qoe/networkQuality.types';
|
|
7
|
+
export type { DirectionQuality, NetworkQuality, } from './qoe/networkQuality.types';
|
|
6
8
|
export type { ClientMetaPayload } from './ClientMetaProvider';
|
|
7
9
|
export type { PeerObserverEvents } from './engine/Peer';
|
|
8
10
|
export type { TransportsWebRTCStats, LDTransportWebRTCStats } from './engine/WebRTCStats/types';
|