@livedigital/client 3.58.0 → 3.59.0-release-june-fixes.2

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 CHANGED
@@ -91,13 +91,14 @@ declare class Client {
91
91
  get scoresCalculator(): ScoresCalculator;
92
92
  /**
93
93
  * Обнаруживает доступные устройства ввода и обновляет внутренний список камер и микрофонов.
94
- *
94
+ * Возвращает раздельные ошибки по определению устройств.
95
95
  * @param force Принудительно запрашивает повторное определение устройств, даже если список уже известен.
96
96
  * @group Устройства
97
97
  * @example
98
98
  * ```ts
99
- * const { video, audio } = await client.detectDevices();
99
+ * const { video, audio, availability } = await client.detectDevices();
100
100
  * // video и audio — массивы MediaDeviceInfo
101
+ * // availability — статус доступности video и audio
101
102
  * const camera = video[0];
102
103
  * const mic = audio.find(d => d.label.includes('встроенный'));
103
104
  * ```
@@ -238,6 +239,12 @@ declare class Client {
238
239
  * @group Диагностика
239
240
  */
240
241
  getPreferRelay(): boolean;
242
+ /**
243
+ * Показывает, действует ли сейчас принудительный relay-режим,
244
+ * включённый SDK после неуспешного подключения receive-транспорта.
245
+ * @group Диагностика
246
+ */
247
+ isRelayEnforced(): boolean;
241
248
  /**
242
249
  * Меняет ICE transport policy для активных транспортов клиента.
243
250
  *
@@ -55,3 +55,4 @@ export declare enum HttpStatusCode {
55
55
  GatewayTimeout = 504
56
56
  }
57
57
  export declare const CHANNEL_MESSAGES_DATA_PRODUCER = "channel-messages-data-producer";
58
+ export declare const sdkVersion: string;
@@ -83,3 +83,4 @@ export enum HttpStatusCode {
83
83
  }
84
84
 
85
85
  export const CHANNEL_MESSAGES_DATA_PRODUCER = 'channel-messages-data-producer';
86
+ export const sdkVersion = String(process.env.SDK_VERSION);
@@ -47,6 +47,7 @@ export declare const CLIENT_EVENTS: {
47
47
  readonly effectsEnabled: "effects-enabled";
48
48
  readonly effectsDisabled: "effects-disabled";
49
49
  readonly effectsFailed: "effects-failed";
50
+ readonly networkScoresUpdated: "network-scores-updated";
50
51
  };
51
52
  export declare const TRACK_EVENTS: {
52
53
  readonly volumeChanged: "volume-changed";
@@ -48,6 +48,7 @@ export const CLIENT_EVENTS = {
48
48
  effectsEnabled: 'effects-enabled',
49
49
  effectsDisabled: 'effects-disabled',
50
50
  effectsFailed: 'effects-failed',
51
+ networkScoresUpdated: 'network-scores-updated',
51
52
  } as const;
52
53
 
53
54
  export const TRACK_EVENTS = {
@@ -5,6 +5,7 @@ export interface RecordMeta {
5
5
  error?: unknown;
6
6
  clientTimestamp: string;
7
7
  from_sdk: boolean;
8
+ sdkVersion: string;
8
9
  case?: string;
9
10
  channelId?: string;
10
11
  applicationId?: string;
@@ -0,0 +1,12 @@
1
+ import type { NetworkScores } from 'webrtc-issue-detector';
2
+ import type EnhancedEventEmitter from '../../EnhancedEventEmitter';
3
+ import type ConfigService from '../../config/ConfigService';
4
+ import type WIDHandler from '../WIDHandler';
5
+ declare class NetworkScoresUpdatedEventHandler {
6
+ private readonly widHandler;
7
+ private readonly clientEventEmitter;
8
+ private readonly config;
9
+ constructor(widHandler: WIDHandler, clientEventEmitter: EnhancedEventEmitter, config: ConfigService);
10
+ handle(networkScores: NetworkScores): void;
11
+ }
12
+ export default NetworkScoresUpdatedEventHandler;
@@ -84,6 +84,8 @@ declare class Engine {
84
84
  private triggerRejoinEventIfAppropriate;
85
85
  private watchNetworkState;
86
86
  private watchDocumentUnload;
87
+ private initTransports;
88
+ private registerNewTransports;
87
89
  private createSendRecvTransports;
88
90
  }
89
91
  export default Engine;
@@ -0,0 +1,15 @@
1
+ import type Logger from '../../../../Logger';
2
+ import type { Metrics } from './tsvb';
3
+ export interface EffectsMetricsReporterParams {
4
+ logger: Logger;
5
+ getMetrics: () => Metrics | undefined;
6
+ pollIntervalMs?: number;
7
+ minLogIntervalMs?: number;
8
+ }
9
+ export default class EffectsMetricsReporter {
10
+ #private;
11
+ constructor(params: EffectsMetricsReporterParams);
12
+ start(): void;
13
+ stop(): void;
14
+ tick(): void;
15
+ }
@@ -0,0 +1,16 @@
1
+ import type { LoggerFactory } from '../../types/container';
2
+ import type SignalingApiClient from '../signalingApiClient/SignalingApiClient';
3
+ import type { IceParameters } from 'mediasoup-client/lib/Transport';
4
+ import type { LDTransport } from '../../types/mediasoup';
5
+ import type TransportStateMonitor from './TransportStateMonitor';
6
+ declare class IceRecoveryService {
7
+ private readonly signalingApiClient;
8
+ private readonly transportStateMonitor;
9
+ private readonly logger;
10
+ constructor(signalingApiClient: SignalingApiClient, loggerFactory: LoggerFactory, transportStateMonitor: TransportStateMonitor);
11
+ getIceParameters(transport: LDTransport): Promise<IceParameters>;
12
+ restartIce(transport: LDTransport): Promise<void>;
13
+ handleConnectionStateChange(transport: LDTransport, state: RTCPeerConnectionState): void;
14
+ cancelAll(): void;
15
+ }
16
+ export default IceRecoveryService;
@@ -1,15 +1,18 @@
1
1
  import type { TransportDirection } from '../../types/network';
2
2
  import Network from './index';
3
3
  import { Logger } from '../../types/common';
4
+ export type RelayEscalationHandler = () => Promise<void> | void;
4
5
  declare class NetworkTransportPolicyManager {
5
6
  #private;
6
7
  private readonly network;
7
8
  private readonly loggerFactory;
8
9
  constructor(network: Network, loggerFactory: (namespace: string) => Logger);
10
+ setRelayEscalationHandler(handler: RelayEscalationHandler): void;
9
11
  startMonitoring(): void;
10
12
  stopMonitoring(): void;
11
13
  changeIceTransportPolicy(policy: RTCIceTransportPolicy): Promise<void>;
12
14
  private readonly handleTransportState;
15
+ private triggerRelayEscalation;
13
16
  private recordDisconnectAndGetCount;
14
17
  private applyRelayPolicy;
15
18
  escalateDirectionToRelay(direction: TransportDirection): Promise<void>;
@@ -0,0 +1,20 @@
1
+ import type { LoggerFactory } from '../../types/container';
2
+ import type { LDTransport } from '../../types/mediasoup';
3
+ interface TransportStateMonitorScheduleOptions {
4
+ immediate?: boolean;
5
+ intervalMs?: number;
6
+ }
7
+ interface SchedulePayload {
8
+ transport: LDTransport;
9
+ options: TransportStateMonitorScheduleOptions;
10
+ restartIce: (transport: LDTransport) => Promise<void>;
11
+ }
12
+ declare class TransportStateMonitor {
13
+ private readonly logger;
14
+ private readonly handles;
15
+ constructor(loggerFactory: LoggerFactory);
16
+ schedule(payload: SchedulePayload): void;
17
+ cancel(transportId: string): void;
18
+ cancelAll(): void;
19
+ }
20
+ export default TransportStateMonitor;
@@ -0,0 +1 @@
1
+ export declare const RESTART_ICE_INTERVAL_MS = 1500;
@@ -1,5 +1,5 @@
1
1
  import { Device, type types } from 'mediasoup-client';
2
- import { IceParameters } from 'mediasoup-client/lib/Transport';
2
+ import { ConnectionState } from 'mediasoup-client/lib/Transport';
3
3
  import EnhancedEventEmitter from '../../EnhancedEventEmitter';
4
4
  import { CreateConsumerPayload, CreateConsumerResponse, PeerResponse, Role, TransportsStateInfo, UpdatePeerAppDataPayload } from '../../types/common';
5
5
  import { ClientObserverEvents } from '../../types/engine';
@@ -8,10 +8,11 @@ import { NetworkObserverEvents } from '../../types/network';
8
8
  import { CallState } from '../CallState';
9
9
  import Logger from '../Logger';
10
10
  import { MyPeer } from '../MyPeer';
11
- import SignalingApiClient from '../signalingApiClient/SignalingApiClient';
12
- import DatachannelHeartbeater from './DatachannelHeartbeater';
13
- import DataChannelsManager from './DataChannelsManager';
14
- import SignalingHeartbeater from './SignalingHeartbeater';
11
+ import type IceRecoveryService from './IceRecoveryService';
12
+ import type SignalingApiClient from '../signalingApiClient/SignalingApiClient';
13
+ import type DatachannelHeartbeater from './DatachannelHeartbeater';
14
+ import type DataChannelsManager from './DataChannelsManager';
15
+ import type SignalingHeartbeater from './SignalingHeartbeater';
15
16
  declare class Network {
16
17
  #private;
17
18
  private readonly state;
@@ -21,13 +22,14 @@ declare class Network {
21
22
  private readonly signalingApiClient;
22
23
  private readonly datachannelHeartbeater;
23
24
  private readonly signalingHeartbeater;
25
+ private readonly iceRecoveryService;
24
26
  sendTransport?: LDTransport;
25
27
  receiveTransport?: LDTransport;
26
28
  heartbeatDataProducer?: types.DataProducer;
27
29
  signalingTransport?: LDTransport;
28
30
  private preferRelay?;
29
31
  peersLoaded: boolean;
30
- constructor(state: CallState, myPeer: MyPeer, loggerFactory: (namespace: string) => Logger, clientEventEmitter: EnhancedEventEmitter<ClientObserverEvents>, dataChannelsManager: DataChannelsManager, signalingApiClient: SignalingApiClient, datachannelHeartbeater: DatachannelHeartbeater, signalingHeartbeater: SignalingHeartbeater);
32
+ constructor(state: CallState, myPeer: MyPeer, loggerFactory: (namespace: string) => Logger, clientEventEmitter: EnhancedEventEmitter<ClientObserverEvents>, dataChannelsManager: DataChannelsManager, signalingApiClient: SignalingApiClient, datachannelHeartbeater: DatachannelHeartbeater, signalingHeartbeater: SignalingHeartbeater, iceRecoveryService: IceRecoveryService);
31
33
  get isNetworkActive(): boolean;
32
34
  get observer(): EnhancedEventEmitter<NetworkObserverEvents>;
33
35
  private removeEventListeners;
@@ -40,7 +42,6 @@ declare class Network {
40
42
  createSendTransport(mediasoupDevice: Device): Promise<LDTransport>;
41
43
  createRecvTransport(mediasoupDevice: Device): Promise<LDTransport>;
42
44
  createSignalingTransport(mediasoupDevice: Device): Promise<LDTransport>;
43
- getIceParameters(transport: LDTransport): Promise<IceParameters>;
44
45
  restartIce(transport: LDTransport): Promise<void>;
45
46
  createConsumer({ producerId, rtpCapabilities, producerPeerId, }: CreateConsumerPayload): Promise<CreateConsumerResponse>;
46
47
  initializeHeartbeats(): Promise<void>;
@@ -63,6 +64,8 @@ declare class Network {
63
64
  getTransportsStateInfo(): Promise<TransportsStateInfo>;
64
65
  setPreferRelay(value: boolean): void;
65
66
  getPreferRelay(): boolean;
67
+ isRelayEnforced(): boolean;
68
+ enforceRelay(durationMs: number): void;
66
69
  getChannelPeers(role?: Role): Promise<{
67
70
  peers: PeerResponse[];
68
71
  }>;
@@ -74,7 +77,7 @@ declare class Network {
74
77
  triggerChannelStateEvent(peersRole?: Role): Promise<number>;
75
78
  waitForChannelMessagesDataConsumerConnected(): Promise<void>;
76
79
  private waitForIceRestartStateTransition;
77
- private waitForTransportTerminalState;
80
+ waitForTransportTerminalState(transport: LDTransport, timeoutAfter?: number): Promise<ConnectionState>;
78
81
  private waitForDataConsumerConnected;
79
82
  private getParsedTransportStats;
80
83
  private logTransportDetails;
@@ -85,5 +88,6 @@ declare class Network {
85
88
  private connectTransport;
86
89
  private subscribeCommonTransportEvents;
87
90
  private checkTransportState;
91
+ private isStaleTransport;
88
92
  }
89
93
  export default Network;
@@ -1,4 +1,5 @@
1
1
  import EnhancedEventEmitter from '../../EnhancedEventEmitter';
2
+ import { AvailableMediaDevices, MediaDeviceAvailability } from '../../types/common';
2
3
  import Logger from '../Logger';
3
4
  declare class System {
4
5
  #private;
@@ -8,18 +9,26 @@ declare class System {
8
9
  isDevicesDetected: boolean;
9
10
  availableVideoDevices: MediaDeviceInfo[];
10
11
  availableAudioDevices: MediaDeviceInfo[];
12
+ availableAudioOutputDevices: MediaDeviceInfo[];
13
+ audioDeviceAvailability?: MediaDeviceAvailability;
14
+ videoDeviceAvailability?: MediaDeviceAvailability;
15
+ audioOutputDeviceAvailability?: MediaDeviceAvailability;
11
16
  constructor(clientEventEmitter: EnhancedEventEmitter, loggerFactory: (namespace: string) => Logger);
12
17
  setIsEnableVideoDevicesLock(value: boolean): void;
13
18
  setIsEnableAudioDevicesLock(value: boolean): void;
14
19
  setAvailableVideoDevices(availableVideoDevices: MediaDeviceInfo[]): void;
15
20
  setAvailableAudioDevices(availableAudioDevices: MediaDeviceInfo[]): void;
21
+ setAvailableAudioOutputDevices(availableAudioOutputDevices: MediaDeviceInfo[]): void;
16
22
  requestMediaDevicesAccess(constraints?: MediaStreamConstraints): Promise<MediaStreamTrack[]>;
17
23
  hasAvailableMediaDevicesList(): Promise<boolean>;
18
24
  refreshAvailableMediaDevicesList(): Promise<MediaDeviceInfo[]>;
19
- detectDevices(force?: boolean): Promise<void>;
25
+ detectDevices(force?: boolean): Promise<AvailableMediaDevices>;
20
26
  deviceChangeHandler(): Promise<void>;
27
+ private resetDeviceAvailability;
28
+ private getAvailableMediaDevices;
29
+ private getDeviceAvailability;
21
30
  listenDevices(): void;
22
- private assertHasAccessToMediaDevices;
31
+ private requestMediaDeviceAccessAvailability;
23
32
  private tryToAccessDevices;
24
33
  }
25
34
  export default System;
@@ -0,0 +1,15 @@
1
+ import OperationError from './OperationError';
2
+ interface ConstraintErrorOptions {
3
+ errorCode: string;
4
+ actual?: string;
5
+ }
6
+ export declare const isOverconstrainedError: (error: unknown) => error is OverconstrainedError;
7
+ export declare const getRequestedConstraintValue: (constraints: MediaStreamConstraints, kind: "audio" | "video", constraint: string) => string;
8
+ export declare const getActualConstraintValue: (track: MediaStreamTrack, constraint: string) => string;
9
+ declare class ConstraintError extends OperationError {
10
+ readonly constraint: string;
11
+ readonly requested: string;
12
+ readonly actual?: string;
13
+ constructor(error: OverconstrainedError, constraints: MediaStreamConstraints, { errorCode, actual }: ConstraintErrorOptions);
14
+ }
15
+ export default ConstraintError;
@@ -0,0 +1,6 @@
1
+ import type { DeviceErrors } from '../types/common';
2
+ declare class MediaDeviceAccessError extends Error {
3
+ readonly code: DeviceErrors;
4
+ constructor(code: DeviceErrors);
5
+ }
6
+ export default MediaDeviceAccessError;
@@ -0,0 +1,10 @@
1
+ interface AsyncIntervalHandle {
2
+ stop: () => void;
3
+ }
4
+ interface CreateAsyncIntervalPayload {
5
+ callback: () => Promise<void>;
6
+ intervalMs: number;
7
+ immediate?: boolean;
8
+ }
9
+ export declare const createAsyncInterval: (payload: CreateAsyncIntervalPayload) => AsyncIntervalHandle;
10
+ export {};
package/dist/index.d.ts CHANGED
@@ -10,9 +10,10 @@ export type { Effects, LayoutTypes } from './engine/media/streamEffects/video/es
10
10
  export type { AudioStreamStats, MOSScores, VideoStreamStats, } from './qoe/types';
11
11
  export type { ClientParams } from './types/client';
12
12
  export { DeviceErrors, TrackLabel, } from './types/common';
13
- export type { ConsumerData, ActivityConfirmationRequiredPayload, AudioEncoderConfig, AvailableMediaDevices, BaseTrackInfo, ChannelEvent, CreateCameraVideoTrackOptions, CreateCustomAudioOptions, CreateCustomVideoOptions, CreateMicrophoneAudioTrackOptions, CreateScreenMediaOptions, EncoderConfig, JoinChannelParams, PayloadOfPublishedMedia, PayloadOfUnpublishedMedia, ProducerData, PeerGroup, PeerInfo, PeerTrackInfo, Role, SubscribeOptions, TransformParams, TrackTransformParams, TrackForceClosedPayload, TrackInboundStats, TrackLabelString, TrackOutboundStats, TransportsStateInfo, VideoEncoderConfig, VideoCodec, PreferredLayersParams, SpatialLayerParams, } from './types/common';
13
+ export type { ConsumerData, ActivityConfirmationRequiredPayload, AudioEncoderConfig, AvailableMediaDevices, BaseTrackInfo, MediaDeviceAvailability, MediaDeviceAvailabilityReason, ChannelEvent, CreateCameraVideoTrackOptions, CreateCustomAudioOptions, CreateCustomVideoOptions, CreateMicrophoneAudioTrackOptions, CreateScreenMediaOptions, EncoderConfig, InputKind, JoinChannelParams, PayloadOfPublishedMedia, PayloadOfUnpublishedMedia, ProducerData, PeerGroup, PeerInfo, PeerTrackInfo, Role, SubscribeOptions, TransformParams, TrackTransformParams, TrackForceClosedPayload, TrackInboundStats, TrackLabelString, TrackOutboundStats, TransportsStateInfo, VideoEncoderConfig, VideoCodec, PreferredLayersParams, SpatialLayerParams, } from './types/common';
14
14
  export type { ChannelStateInconsistentPayload, ClientObserverEvents, IssuesHandler, NetworkScoresUpdatedHandler, ProducePermissionsChangedPayload, } from './types/engine';
15
15
  export type { AudioTrack, BaseTrack, InitEffectsSDKParams, Track, VideoTrack, VideoTrackPublishParams, } from './types/media';
16
16
  export type { IceTransportPolicy } from './types/network';
17
17
  export type { PeerConsumer } from './types/peerConsumer';
18
18
  export type { PeerTrack, PeerTrackObserverEvents } from './types/peerTrack';
19
+ export type { NetworkScores } from 'webrtc-issue-detector';