@vkontakte/calls-sdk 2.8.13-dev.5a31cf44.0 → 2.8.13-dev.5a8cc658.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.
@@ -15,6 +15,7 @@ export default class AudioOutput {
15
15
  private readonly _features;
16
16
  private readonly _statFirstMediaReceived;
17
17
  private readonly _logger;
18
+ private _autoplayRecoveryController;
18
19
  constructor(statFirstMediaReceived: StatFirstMediaReceived, allowMultipleTracks?: boolean, debug?: DebugLogger, logger?: StatEventCollector | null);
19
20
  add(participantId: ParticipantId, track: MediaStreamTrack): void;
20
21
  remove(participantId: ParticipantId, track: MediaStreamTrack): void;
@@ -26,6 +27,7 @@ export default class AudioOutput {
26
27
  protected _getTracks(): MediaStreamTrack[];
27
28
  protected _initAudioElement(): void;
28
29
  protected _stopAudioElement(): void;
30
+ private _stopAutoplayRecovery;
29
31
  private _createAudioElement;
30
32
  private _prepareAudioElement;
31
33
  private _addTrackToAudioElement;
@@ -117,7 +117,7 @@ export default class Conversation extends EventEmitter {
117
117
  accept(mediaOptions: MediaOption[]): Promise<ConversationData>;
118
118
  decline(params?: HangupParams): Promise<void>;
119
119
  hangup(params?: HangupParams): Promise<void>;
120
- addParticipant(participantIds: ExternalId[], params?: AddParticipantParams): Promise<void>;
120
+ addParticipant(participantIds: ExternalId[], params?: AddParticipantParams): Promise<ExternalParticipant[] | undefined>;
121
121
  addParticipantLegacy(participantIds: CompositeUserId[], params?: AddParticipantParams): Promise<void>;
122
122
  removeParticipant(participantId: CompositeUserId, ban?: boolean): Promise<void>;
123
123
  setVolume(volume: number): void;
@@ -159,6 +159,7 @@ export default class Conversation extends EventEmitter {
159
159
  private _onConversationParticipantListChunk;
160
160
  private _createParticipantListChunk;
161
161
  private _participantListChunkToExternalChunk;
162
+ private _participantsToExternal;
162
163
  private _registerConnectionParticipants;
163
164
  private _registerParticipants;
164
165
  /** Установим состояние локальных мьютов */
@@ -0,0 +1,25 @@
1
+ import StatEventCollector from './StatEventCollector';
2
+ export interface BatteryClock {
3
+ monotonicNow(): number;
4
+ }
5
+ /**
6
+ * Метрика battery_level_change: на каждое изменение уровня заряда отправляется
7
+ * само изменение в процентных пунктах и время, за которое оно произошло.
8
+ * Пока устройство на зарядке, замеры не ведутся: зарядка сбрасывает точку отсчёта,
9
+ * и первое изменение после неё только задаёт новую.
10
+ *
11
+ * Battery Status API есть только в Chromium, в Safari и Firefox его нет —
12
+ * там класс молча ничего не делает.
13
+ */
14
+ export declare class BatteryStats {
15
+ private readonly _logger;
16
+ private readonly _clock;
17
+ private _battery;
18
+ private _previous;
19
+ private _destroyed;
20
+ constructor(logger: StatEventCollector, clock?: BatteryClock);
21
+ destroy(): void;
22
+ private _subscribe;
23
+ private _handleChargingChange;
24
+ private _handleLevelChange;
25
+ }
@@ -1,4 +1,5 @@
1
1
  import StatEventCollector from './StatEventCollector';
2
+ import { ProvisionalFinish } from './ProvisionalFinish';
2
3
  export type CallLifecycleSource = 'outgoing' | 'incoming' | 'join' | 'anonym_join';
3
4
  export interface CallLifecycleInitializationParams {
4
5
  source: CallLifecycleSource;
@@ -11,6 +12,8 @@ export interface CallLifecycleClock {
11
12
  export declare class CallLifecycleStats {
12
13
  private readonly _logger;
13
14
  private readonly _clock;
15
+ /** Предварительный финиш звонка; null — выключен */
16
+ private readonly _provisional;
14
17
  private _conversationId;
15
18
  private _callStartLabel;
16
19
  private _lifecycleStartedAtMonotonic;
@@ -20,7 +23,7 @@ export declare class CallLifecycleStats {
20
23
  private _firstMediaSent;
21
24
  private _finished;
22
25
  private _destroyed;
23
- constructor(logger: StatEventCollector, clock?: CallLifecycleClock);
26
+ constructor(logger: StatEventCollector, clock?: CallLifecycleClock, provisional?: ProvisionalFinish | null);
24
27
  get firstMediaSentReported(): boolean;
25
28
  get terminated(): boolean;
26
29
  markInitializationStarted({ source, conversationId }: CallLifecycleInitializationParams): void;
@@ -31,9 +34,15 @@ export declare class CallLifecycleStats {
31
34
  markFirstMediaSent(): void;
32
35
  markFinished(reason: unknown): void;
33
36
  markTerminated(): void;
37
+ /** Вкладка скрыта: обновляет время в предварительном финише. */
38
+ markHidden(): void;
39
+ /** Вкладка снова видна: обновляет время в предварительном финише. */
40
+ markVisible(): void;
34
41
  destroy(): void;
35
42
  private _canRecord;
36
43
  private _durationSince;
44
+ /** Ведёт предварительный финиш, когда известен conversationId. */
45
+ private _startProvisional;
37
46
  private _finish;
38
47
  private _ensureConversationId;
39
48
  private _record;
@@ -4,6 +4,7 @@ import TransportTopology from '../../enums/TransportTopology';
4
4
  import HangupReason from '../HangupReason';
5
5
  import StatEventCollector from './StatEventCollector';
6
6
  import { ApiCallStats } from './ApiCallStats';
7
+ import { BatteryStats } from './BatteryStats';
7
8
  import { CallLifecycleStats } from './CallLifecycleStats';
8
9
  import { ClientResourceSources, ClientResourceStats } from './ClientResourceStats';
9
10
  import { CodecStatsAggregator } from './CodecStatsAggregator';
@@ -19,6 +20,7 @@ export declare class ConversationStats {
19
20
  readonly signalingCommands: StatSignalingCommands;
20
21
  readonly apiCalls: ApiCallStats;
21
22
  readonly resources: ClientResourceStats;
23
+ readonly battery: BatteryStats;
22
24
  private readonly _api;
23
25
  private _unloading;
24
26
  constructor(api: BaseApi, externalLogger: BaseLogger | null, getConversationId: () => string | null, getTopology: () => TransportTopology | undefined, resourceSources: ClientResourceSources);
@@ -31,6 +33,8 @@ export declare class ConversationStats {
31
33
  /** Вкладка пережила pagehide: возвращаем запись в очередь. */
32
34
  restoreAfterUnload(): void;
33
35
  resetPingBaseline(): void;
36
+ markHidden(): void;
37
+ markVisible(): void;
34
38
  logHangup(reason: HangupReason): void;
35
39
  flushCallMetrics(): void;
36
40
  destroy(): void;
@@ -0,0 +1,37 @@
1
+ import { ProvisionalFinishStore } from './ProvisionalFinishStore';
2
+ import StatEventCollector from './StatEventCollector';
3
+ export interface ProvisionalFinishClock {
4
+ wallNow(): number;
5
+ }
6
+ /**
7
+ * Предварительный финиш одного звонка: call_finish с причиной terminated,
8
+ * который лежит в localStorage, пока звонок идёт. Время в нём — последний
9
+ * момент, когда вкладка была жива. Если вкладка умрёт без финиша, запись
10
+ * перенесёт в очередь другая вкладка или следующий старт SDK.
11
+ */
12
+ export declare class ProvisionalFinish {
13
+ private readonly _logger;
14
+ private readonly _store;
15
+ private readonly _clock;
16
+ private _status;
17
+ /** conversationId звонка */
18
+ private _vcid;
19
+ /** Вызывается, когда финиш звонка отправила другая вкладка */
20
+ private _onAdopted;
21
+ private _timer;
22
+ constructor(logger: StatEventCollector, store?: ProvisionalFinishStore, clock?: ProvisionalFinishClock);
23
+ /** Начинает вести запись звонка. */
24
+ start(vcid: string, onAdopted: () => void): void;
25
+ /** Перезаписывает запись с текущим временем. */
26
+ update(): void;
27
+ /**
28
+ * Звонок закончился: снимает запись и вызывает write, который пишет
29
+ * настоящий финиш. При своём замке всё идёт синхронно, в том же тике.
30
+ * Финиш, уже отправленный другой вкладкой, не пишется.
31
+ */
32
+ complete(write: () => void): void;
33
+ /** Снимает запись без финиша. */
34
+ stop(): void;
35
+ private _adopt;
36
+ private _clearTimer;
37
+ }
@@ -0,0 +1,104 @@
1
+ import { StatQueueEntry } from './StatQueue';
2
+ /** Запись старше не переносим: до предела очереди нужен запас на отправку. */
3
+ export declare const MAX_RECORD_AGE_MS: number;
4
+ /** Предварительный финиш: запись очереди и id вкладки-владельца. */
5
+ export type ProvisionalFinishRecord = StatQueueEntry & {
6
+ /** conversationId звонка */
7
+ vcid: string;
8
+ /** id вкладки, которая ведёт звонок */
9
+ tab: string;
10
+ };
11
+ export type ProvisionalFinishStoreOptions = {
12
+ /** Префикс ключей в localStorage */
13
+ keyPrefix?: string;
14
+ /** Префикс имени замка вкладки */
15
+ lockPrefix?: string;
16
+ };
17
+ /**
18
+ * Предварительные финиши звонков вкладки в localStorage. Пока у вкладки есть
19
+ * звонки, она держит Web Lock со своим id и пишет свои записи только под ним.
20
+ * Записи вкладок, чей замок свободен, переносит в очередь adoptOrphans().
21
+ */
22
+ export declare class ProvisionalFinishStore {
23
+ private readonly _keyPrefix;
24
+ private readonly _lockPrefix;
25
+ /** id документа, создаётся при первом обращении */
26
+ private _tabId;
27
+ /** Число звонков вкладки с предварительным финишем */
28
+ private _holders;
29
+ private _lockState;
30
+ /** Номер текущего запроса замка */
31
+ private _generation;
32
+ /** Отпускает выданный замок */
33
+ private _releaseLock;
34
+ /** Записи, которые ждут первой выдачи замка, по vcid */
35
+ private _waiting;
36
+ /** vcid своих записей, лежащих в localStorage */
37
+ private _written;
38
+ /** vcid, чьи записи забрала другая вкладка */
39
+ private _adopted;
40
+ /** Ждут возврата замка */
41
+ private _whenOwned;
42
+ constructor({ keyPrefix, lockPrefix }?: ProvisionalFinishStoreOptions);
43
+ /** id документа */
44
+ get tabId(): string;
45
+ isSupported(): boolean;
46
+ /** Звонок начал держать запись: при первом звонке вкладка просит замок. */
47
+ hold(): void;
48
+ /** Звонок больше не держит запись: после последнего замок отпускается. */
49
+ unhold(): void;
50
+ /** Пишет запись звонка. Пока замок не выдан или не возвращён, запись ждёт в памяти. */
51
+ save(record: ProvisionalFinishRecord): void;
52
+ remove(vcid: string): void;
53
+ /** Запись звонка забрала другая вкладка, пока у этой не было замка. */
54
+ isAdopted(vcid: string): boolean;
55
+ /** Вызывает callback, когда записи вкладки снова под её замком; если замок не отнимали — сразу. */
56
+ whenOwned(callback: () => void): void;
57
+ /**
58
+ * Переносит в очередь записи вкладок, чей замок свободен. Вызывается под
59
+ * замком отправки. Не бросает.
60
+ *
61
+ * @returns число добавленных финишей.
62
+ */
63
+ adoptOrphans(now?: number): Promise<number>;
64
+ private _requestLock;
65
+ /** Колбэк выдачи замка. Замок держится, пока не разрешён возвращённый промис. */
66
+ private _onGranted;
67
+ /** Промис запроса замка завершился: замок отпустили мы, его отняли или не выдали. */
68
+ private _onLockGone;
69
+ private _fail;
70
+ private _release;
71
+ /** Сверяет все свои записи после возврата замка. */
72
+ private _markAdopted;
73
+ /**
74
+ * Чужие вкладки трогают наши ключи только под нашим замком. Поэтому
75
+ * пропавший свой ключ значит, что запись забрала другая вкладка: замок
76
+ * у нас отнимали, даже если уведомление об этом ещё не пришло. Ошибку
77
+ * чтения переносом не считаем: лишний финиш лучше потерянного.
78
+ *
79
+ * @returns true, если запись звонка забрали.
80
+ */
81
+ private _detectAdopted;
82
+ private _writeWaiting;
83
+ private _flushWhenOwned;
84
+ private _run;
85
+ private _write;
86
+ /** Ключи записей других вкладок, сгруппированные по вкладке. Битые и протухшие записи удаляет. */
87
+ private _findOrphans;
88
+ /**
89
+ * Переносит одну запись под замком её вкладки. Порядок «добавить, потом
90
+ * удалить ключ»: при обрыве между шагами следующий перенос получит exists.
91
+ *
92
+ * @returns true, если финиш добавлен в очередь.
93
+ */
94
+ private _adoptOne;
95
+ /** Разбирает запись. null — битый JSON или не та форма. */
96
+ private _parse;
97
+ private _key;
98
+ private _getItem;
99
+ private _removeKey;
100
+ private _storage;
101
+ private _locks;
102
+ }
103
+ declare const _default: ProvisionalFinishStore;
104
+ export default _default;
@@ -32,8 +32,9 @@ export declare class SdpStats {
32
32
  /** Не смогли применить SDP собеседника */
33
33
  logSetRemoteFailed(sdp: SdpDescription, error: unknown): void;
34
34
  destroy(): void;
35
- private _intervalSince;
36
35
  private _logFailure;
37
36
  private _log;
38
37
  }
38
+ /** Браузер может спрятать локальный адрес за именем вида <uuid>.local, такой кандидат в стату не шлём */
39
+ export declare function isIpAddress(address: string): boolean;
39
40
  export {};
@@ -18,6 +18,14 @@ export default abstract class StatDrainScheduler {
18
18
  static setApi(value: BaseApi): void;
19
19
  /** Первый дрейн подбирает хвосты прошлых сессий и закрытых вкладок. */
20
20
  static start(value: BaseApi): void;
21
+ /**
22
+ * Переносит журналы закрытых вкладок в очередь под замком отправки:
23
+ * перенос предварительных финишей сверяется с очередью и не должен
24
+ * застать журнал забранным, но ещё не записанным.
25
+ *
26
+ * @returns число перенесённых событий.
27
+ */
28
+ static importUnloadJournal(): Promise<number>;
21
29
  /** Вызывается коллектором после записи события в очередь. */
22
30
  static notifyAppended(): void;
23
31
  /**
@@ -41,6 +49,8 @@ export default abstract class StatDrainScheduler {
41
49
  */
42
50
  static sendDirect(entry: StatQueueEntry): void;
43
51
  private static _currentUserId;
52
+ /** Переносит в очередь предварительные финиши закрытых вкладок. */
53
+ private static _adoptProvisionalFinishes;
44
54
  /** @returns число записей в батче. */
45
55
  private static _drainCurrent;
46
56
  /**
@@ -2,6 +2,7 @@ import BaseApi from '../../abstract/BaseApi';
2
2
  import BaseLogger from '../../abstract/BaseLogger';
3
3
  import StatLog from '../../enums/StatLog';
4
4
  import TransportTopology from '../../enums/TransportTopology';
5
+ import { StatQueueEntry } from './StatQueue';
5
6
  type ClientStatsPayload = Record<string, string | string[] | number | boolean | undefined | null>;
6
7
  export type LogClientStatsOptions = {
7
8
  /** Время наступления события. По умолчанию — момент записи. */
@@ -42,7 +43,14 @@ export default class StatEventCollector extends BaseLogger {
42
43
  */
43
44
  exitUnloadMode(): void;
44
45
  logClientStats(data: ClientStatsPayload, options?: LogClientStatsOptions): void;
46
+ /**
47
+ * Запись очереди для события без записи в очередь и без External.onClientStats.
48
+ * null — старая схема, uid неизвестен или в памяти ждут события без uid.
49
+ */
50
+ buildEntry(data: ClientStatsPayload, options?: LogClientStatsOptions): StatQueueEntry | null;
45
51
  destroy(): void;
52
+ /** Собирает запись очереди без владельца: conversationId, время, поправку и данные события. */
53
+ private _makeEntry;
46
54
  private _store;
47
55
  private _getConversationId;
48
56
  private _getCallTopology;
@@ -39,6 +39,15 @@ export default abstract class StatQueue {
39
39
  static isSupported(): boolean;
40
40
  /** @returns ключ записи или null, если хранилище не приняло её. */
41
41
  static append(entry: StatQueueEntry): Promise<number | null>;
42
+ /**
43
+ * Добавляет call_finish, если у звонка этого пользователя его ещё нет.
44
+ * Проверка и запись идут одной транзакцией.
45
+ *
46
+ * @returns 'added' — добавлен, 'exists' — уже был, 'failed' — хранилище недоступно.
47
+ */
48
+ static appendFinishOnce(entry: StatQueueEntry & {
49
+ vcid: string;
50
+ }): Promise<'added' | 'exists' | 'failed'>;
42
51
  /**
43
52
  * Проставляет delta перечисленным записям, у которых её ещё нет.
44
53
  *
@@ -66,6 +75,8 @@ export default abstract class StatQueue {
66
75
  static evictOlderThan(maxAgeMs: number, now?: number): Promise<void>;
67
76
  private static _checkSupport;
68
77
  private static _open;
78
+ /** Раз в EVICT_CHECK_EVERY записей подрезает хранилище до лимита. */
79
+ private static _countAppend;
69
80
  private static _close;
70
81
  private static _createSchema;
71
82
  /** Обёртка над транзакцией: резолвится после успешного коммита. */
@@ -8,8 +8,10 @@ export default class PerfStatReporter extends EventEmitter {
8
8
  private _previousPerfStatReportTimestamp;
9
9
  private _previousNetworkStatReportTimestamp;
10
10
  private _previousCallStatReportTimestamp;
11
- private _previousCallStatReport;
11
+ private _previousCounters;
12
12
  private _previousRemoteInboundRtps;
13
+ private _previousInboundRtps;
14
+ private _previousOutboundRtps;
13
15
  private _previousCandidatePair;
14
16
  private _screenShareStats;
15
17
  private _signaling;
@@ -24,7 +26,9 @@ export default class PerfStatReporter extends EventEmitter {
24
26
  private reportNetworkStats;
25
27
  private _reportCallStats;
26
28
  private _reportCandidatePair;
29
+ private _calculateRemotePacketLoss;
27
30
  private _calculatePacketLoss;
31
+ private _calculateOutboundDeltas;
28
32
  private _handleScreenSharingStat;
29
33
  private _handleTransportStateChanged;
30
34
  }
@@ -83,6 +83,8 @@ export default class ServerTransport extends BaseTransport {
83
83
  private _startSettingsInterval;
84
84
  private _stopSettingsInterval;
85
85
  private _collectStat;
86
+ /** mid потока быстрой шары, чтобы отделить его от камеры в статистике */
87
+ private _getScreenShareMid;
86
88
  private _reportStats;
87
89
  private _detectStaleTracks;
88
90
  private _allocateConsumer;
package/default/Api.d.ts CHANGED
@@ -10,6 +10,7 @@ import PushData from '../types/PushData';
10
10
  export default class Api extends BaseApi {
11
11
  private _uuid;
12
12
  private _idCache;
13
+ constructor();
13
14
  private _callUnsafe;
14
15
  protected _call(method: string, data?: any, noSession?: boolean, allowReauthorize?: boolean): Promise<any>;
15
16
  userId(participantId: ParticipantId): ExternalParticipantId | null;
@@ -22,6 +23,8 @@ export default class Api extends BaseApi {
22
23
  private _removeCachedAnonymLogin;
23
24
  private _reauthorize;
24
25
  private _applyAnonymLogin;
26
+ /** Кладёт в кеш id соответствие своего участника из auth.anonymLogin */
27
+ private _cacheSelfExternalId;
25
28
  private _buildClientStatsData;
26
29
  /** Ошибки по отдельным событиям логируются, но батч трактуется целиком. */
27
30
  private _reportClientStatsItemErrors;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/calls-sdk",
3
- "version": "2.8.13-dev.5a31cf44.0",
3
+ "version": "2.8.13-dev.5a8cc658.0",
4
4
  "author": "vk.com",
5
5
  "description": "Library for video calls based on the vk.com platform",
6
6
  "homepage": "https://vk.com",
@@ -1,9 +1,16 @@
1
- import type { OkUserId } from '../types/Participant';
1
+ import type { ExternalParticipantId } from '../types/ExternalId';
2
+ import type { OkUserId, ParticipantId } from '../types/Participant';
3
+ /** Свой участник и его внешний id */
4
+ export type SelfExternalId = {
5
+ participantId: ParticipantId;
6
+ externalId: ExternalParticipantId;
7
+ };
2
8
  export default abstract class AuthData {
3
9
  private static _sessionKey;
4
10
  private static _sessionSecretKey;
5
11
  private static _accessToken;
6
12
  private static _userId;
13
+ private static _selfExternalId;
7
14
  private static _reauthorizePromise;
8
15
  static get sessionKey(): string | undefined;
9
16
  static set sessionKey(value: string | undefined);
@@ -13,6 +20,9 @@ export default abstract class AuthData {
13
20
  static set accessToken(value: string | undefined);
14
21
  static get userId(): OkUserId | null;
15
22
  static set userId(value: OkUserId | null);
23
+ /** Свой участник и его внешний id из ответа auth.anonymLogin */
24
+ static get selfExternalId(): SelfExternalId | null;
25
+ static set selfExternalId(value: SelfExternalId | null);
16
26
  static isEmpty(): boolean;
17
27
  /**
18
28
  * Дедуплицирует одновременные попытки реавторизации из разных инстансов Api.
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Определение браузера, операционной системы и доступных возможностей.
3
+ */
4
+ /**
5
+ * Известные браузеры
6
+ */
7
+ export type BrowserName = 'Edge' | 'Chrome' | 'Firefox' | 'Yandex' | 'Opera' | 'Sferum';
8
+ declare namespace BrowserEnvironment {
9
+ /**
10
+ * Получение и кэширование версии операционной системы
11
+ */
12
+ function initOsVersion(warn: (...args: any[]) => void): Promise<void>;
13
+ /**
14
+ * Проверяет поддержку WebRTC браузером
15
+ */
16
+ function isBrowserSupported(): boolean;
17
+ /**
18
+ * Возвращает первую отсутствующую capability в стабильном порядке.
19
+ */
20
+ function getBrowserSupportFailure(): BrowserSupportFailure | null;
21
+ /**
22
+ * Проверяет поддержку шаринга экрана браузером
23
+ */
24
+ function isScreenCapturingSupported(): boolean;
25
+ /**
26
+ * Проверяет поддержку выбора микрофона браузером, независимо от списка устройств и разрешений.
27
+ * Доступен до init, не запрашивает разрешения и не захватывает медиа.
28
+ */
29
+ function canSelectAudioInput(): boolean;
30
+ /**
31
+ * Проверяет поддержку выбора аудиовыхода браузером, независимо от списка устройств и разрешений.
32
+ * Доступен до init, не запрашивает разрешения и не меняет аудиовыход.
33
+ */
34
+ function canSelectAudioOutput(): boolean;
35
+ /**
36
+ * В некоторых браузерах H264 decoder сломан
37
+ */
38
+ function isBrokenH264Decoder(): boolean;
39
+ /**
40
+ * В некоторых браузерах VP9 encoder сломан
41
+ */
42
+ function isBrokenVP9Encoder(): boolean;
43
+ /**
44
+ * В некоторых браузерах VP9 decoder сломан
45
+ */
46
+ function isBrokenVP9Decoder(): boolean;
47
+ /**
48
+ * Может ли браузер делать H264 приоритетным
49
+ */
50
+ function canPreferH264(): boolean;
51
+ /**
52
+ * Поддержка simulcast браузером.
53
+ * Safari корректно поддерживает simulcast начиная с версии 18.
54
+ * Firefox поддерживает simulcast с VP8 начиная с версии 134.
55
+ */
56
+ function isSimulcastSupportedByBrowser(): boolean;
57
+ /**
58
+ * Имя операционной системы
59
+ */
60
+ function os(): string;
61
+ /**
62
+ * Версия операционной системы
63
+ */
64
+ function osVersion(): number | null | undefined;
65
+ /**
66
+ * Мобильный браузер или нет
67
+ */
68
+ function isMobile(): boolean;
69
+ /**
70
+ * Имя браузера
71
+ */
72
+ function browserName(): BrowserName | string;
73
+ /**
74
+ * Версия браузера
75
+ */
76
+ function browserVersion(): string;
77
+ /**
78
+ * Если браузер основан на хроме - возвращает версию
79
+ */
80
+ function baseChromeVersion(): number;
81
+ /**
82
+ * Возвращает подверсию браузера (если она есть)
83
+ */
84
+ function browserSubVersion(): string;
85
+ /**
86
+ * Браузер поддерживает захват звука при трансляции экрана
87
+ */
88
+ function isAudioShareSupported(): boolean;
89
+ }
90
+ export default BrowserEnvironment;
@@ -17,10 +17,6 @@ export declare enum FacingMode {
17
17
  */
18
18
  ENVIRONMENT = "environment"
19
19
  }
20
- /**
21
- * Известные браузеры
22
- */
23
- export type BrowserName = 'Edge' | 'Chrome' | 'Firefox' | 'Yandex' | 'Opera' | 'Sferum';
24
20
  declare namespace WebRTCUtils {
25
21
  /**
26
22
  * До вызова этого метода бесполезно опрашивать другие публичные методы.
@@ -118,76 +114,9 @@ declare namespace WebRTCUtils {
118
114
  * Возвращает фейковый видео mediaTrack
119
115
  */
120
116
  function getBlackMediaTrack(width?: number, height?: number): MediaStreamTrack;
121
- /**
122
- * Проверяет поддержку WebRTC браузером
123
- */
124
- function isBrowserSupported(): boolean;
125
- /**
126
- * Возвращает первую отсутствующую capability в стабильном порядке.
127
- */
128
- function getBrowserSupportFailure(): BrowserSupportFailure | null;
129
- /**
130
- * Проверяет поддержку шаринга экрана браузером
131
- */
132
- function isScreenCapturingSupported(): boolean;
133
- /**
134
- * В некоторых браузерах H264 decoder сломан
135
- */
136
- function isBrokenH264Decoder(): boolean;
137
- /**
138
- * В некоторых браузерах VP9 encoder сломан
139
- * В симулкасте вп9 енкодер ведет себя некорректно
140
- */
141
- function isBrokenVP9Encoder(): boolean;
142
- /**
143
- * В некоторых браузерах VP9 decoder сломан
144
- */
145
- function isBrokenVP9Decoder(): boolean;
146
- /**
147
- * Может ли браузер делать H264 приоритетным
148
- */
149
- function canPreferH264(): boolean;
150
- /**
151
- * Поддержка simulcast браузером.
152
- * Safari корректно поддерживает simulcast начиная с версии 18.
153
- * Firefox поддерживает simulcast с VP8 начиная с версии 134.
154
- */
155
- function isSimulcastSupportedByBrowser(): boolean;
156
- /**
157
- * Имя операционной системы
158
- */
159
- function os(): string;
160
- /**
161
- * Версия операционной системы
162
- */
163
- function osVersion(): number | null | undefined;
164
- /**
165
- * Мобильный браузер или нет
166
- */
167
- function isMobile(): boolean;
168
- /**
169
- * Имя браузера
170
- */
171
- function browserName(): BrowserName | string;
172
- /**
173
- * Версия браузера
174
- */
175
- function browserVersion(): string;
176
- /**
177
- * Если браузер основан на хроме - возвращает версию
178
- */
179
- function baseChromeVersion(): number;
180
117
  /**
181
118
  * Возвращает AudioContext
182
119
  */
183
120
  function getAudioContext(): AudioContext;
184
- /**
185
- * Возвращает подверсию браузера (если она есть)
186
- */
187
- function browserSubVersion(): string;
188
- /**
189
- * Браузер поддерживает захват звука при трансляции экрана
190
- */
191
- function isAudioShareSupported(): boolean;
192
121
  }
193
122
  export default WebRTCUtils;
@@ -1,7 +1,8 @@
1
+ import { StatPayload } from '../classes/stat/StatQueue';
1
2
  /**
2
3
  * Событие статистики SDK, которое получает `onClientStats`
3
4
  */
4
- export type ClientStatsEvent = Record<string, string | number | boolean | null> & {
5
+ export type ClientStatsEvent = StatPayload & {
5
6
  /** Имя события из `Stat`. У периодической статистики звонка его нет */
6
7
  name?: string;
7
8
  /** ID звонка, `null` — пока он неизвестен */