@vkontakte/calls-sdk 2.8.12-dev.dbe4e248.0 → 2.8.12-dev.dd833275.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/CallsSDK.d.ts +33 -14
- package/abstract/BaseApi.d.ts +14 -9
- package/abstract/BaseSignaling.d.ts +5 -1
- package/calls-sdk.cjs.js +7 -13
- package/calls-sdk.esm.js +2634 -1860
- package/classes/AudioFix.d.ts +2 -2
- package/classes/AudioOutput.d.ts +2 -2
- package/classes/MediaSource.d.ts +6 -2
- package/classes/SpecListener.d.ts +2 -2
- package/classes/codec/LibVPxDecoder.d.ts +2 -2
- package/classes/codec/LibVPxEncoder.d.ts +2 -2
- package/classes/codec/WebCodecsDecoder.d.ts +2 -2
- package/classes/codec/WebCodecsEncoder.d.ts +2 -2
- package/classes/codec/WorkerBase.d.ts +3 -3
- package/classes/conversation/Conversation.d.ts +14 -4
- package/classes/screenshare/ScreenCaptureReceiver.d.ts +2 -2
- package/classes/screenshare/ScreenCaptureSender.d.ts +2 -2
- package/classes/screenshare/StreamBuilder.d.ts +2 -2
- package/classes/stat/CallLifecycleStats.d.ts +2 -2
- package/classes/stat/CodecStatsAggregator.d.ts +2 -2
- package/classes/stat/ConversationStats.d.ts +19 -4
- package/classes/stat/StatAggregator.d.ts +6 -2
- package/classes/stat/StatClock.d.ts +34 -0
- package/classes/stat/StatDrainScheduler.d.ts +121 -0
- package/classes/stat/StatEventCollector.d.ts +54 -0
- package/classes/stat/StatPings.d.ts +2 -2
- package/classes/stat/StatQueue.d.ts +82 -0
- package/classes/stat/StatSignalingCommands.d.ts +2 -2
- package/classes/stat/StatUnloadJournal.d.ts +39 -0
- package/classes/transport/DirectTransport.d.ts +2 -2
- package/classes/transport/PerfStatReporter.d.ts +2 -0
- package/classes/transport/ServerTransport.d.ts +3 -7
- package/classes/transport/SimulcastSender.d.ts +31 -0
- package/classes/transport/Transport.d.ts +5 -2
- package/default/Api.d.ts +27 -2
- package/default/ApiExternal.d.ts +2 -1
- package/default/Signaling.d.ts +4 -3
- package/enums/SessionError.d.ts +15 -0
- package/package.json +3 -3
- package/static/ApiTransport.d.ts +7 -0
- package/static/Params.d.ts +41 -1
- package/static/ParticipantConnectionStatusUtils.d.ts +1 -0
- package/static/Sdp.d.ts +3 -0
- package/static/SessionStore.d.ts +38 -0
- package/static/SignalingCapabilities.d.ts +1 -1
- package/static/SimulcastInfo.d.ts +5 -3
- package/static/Utils.d.ts +0 -1
- package/static/WebRTCUtils.d.ts +8 -6
- package/types/Api.d.ts +9 -0
- package/types/Capabilities.d.ts +1 -0
- package/types/FastHangup.d.ts +66 -0
- package/types/Participant.d.ts +1 -0
- package/types/PerfStatReporter.d.ts +0 -4
- package/types/SignalingCommand.d.ts +2 -0
- package/types/SignalingMessage.d.ts +1 -0
- package/utils/SerializeLatest.d.ts +5 -0
- package/classes/StatsLogger.d.ts +0 -41
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Потолок хранения событий: и очереди на диске, и буфера событий без владельца
|
|
3
|
+
* в памяти вкладки. Буфер — сени этой же очереди: всё, что в нём накопилось,
|
|
4
|
+
* уедет сюда, как только станет известен uid, и попадёт под этот же потолок.
|
|
5
|
+
*/
|
|
6
|
+
export declare const RECORD_LIMIT = 5000;
|
|
7
|
+
/** Произвольный набор скалярных полей события. */
|
|
8
|
+
export type StatPayload = Record<string, string | number | boolean | null>;
|
|
9
|
+
/** Запись очереди без сгенерированного ключа. */
|
|
10
|
+
export type StatQueueEntry = {
|
|
11
|
+
/** userId владельца события. Не может быть неизвестным. */
|
|
12
|
+
uid: number;
|
|
13
|
+
/** conversationId. null — событие залогировано до старта звонка. */
|
|
14
|
+
vcid: string | null;
|
|
15
|
+
/** Время записи в device-time, без коррекции по серверу. */
|
|
16
|
+
ts: number;
|
|
17
|
+
/** Поправка к серверному времени на момент записи. null — ещё не знали. */
|
|
18
|
+
delta?: number | null;
|
|
19
|
+
ev: StatPayload;
|
|
20
|
+
};
|
|
21
|
+
/** Запись очереди, прочитанная из хранилища. */
|
|
22
|
+
export type StatQueueRecord = StatQueueEntry & {
|
|
23
|
+
/** Автоинкремент. Единственный источник истины для порядка событий. */
|
|
24
|
+
id: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Персистентная очередь событий статистики поверх IndexedDB.
|
|
28
|
+
*
|
|
29
|
+
* База одна на origin, её делят все звонки и все вкладки, поэтому класс
|
|
30
|
+
* статический: второго экземпляра быть не может. Любая ошибка хранилища
|
|
31
|
+
* только логируется — статистика никогда не влияет на звонок.
|
|
32
|
+
*/
|
|
33
|
+
export default abstract class StatQueue {
|
|
34
|
+
private static _db;
|
|
35
|
+
private static _dbPromise;
|
|
36
|
+
private static _supported;
|
|
37
|
+
private static _appendsSinceEvictCheck;
|
|
38
|
+
/** Момент последней неудачи открытия; до конца кулдауна не пробуем снова. */
|
|
39
|
+
private static _lastOpenFailureAt;
|
|
40
|
+
static isSupported(): boolean;
|
|
41
|
+
/** @returns ключ записи или null, если хранилище не приняло её. */
|
|
42
|
+
static append(entry: StatQueueEntry): Promise<number | null>;
|
|
43
|
+
/**
|
|
44
|
+
* Проставляет delta перечисленным записям, у которых её ещё нет.
|
|
45
|
+
*
|
|
46
|
+
* Ключи перечисляются явно, а не диапазоном: между своими записями в
|
|
47
|
+
* очередь могут лечь чужие — хвост из журнала умершей вкладки, — а они
|
|
48
|
+
* писались другими часами, и наша поправка к ним не относится.
|
|
49
|
+
*/
|
|
50
|
+
static fillDelta(ids: number[], delta: number): Promise<void>;
|
|
51
|
+
static count(): Promise<number>;
|
|
52
|
+
/**
|
|
53
|
+
* Читает самые старые события пользователя.
|
|
54
|
+
*
|
|
55
|
+
* Записи индекса с одинаковым ключом упорядочены по первичному ключу, а
|
|
56
|
+
* первичный ключ здесь — автоинкрементный id, поэтому выборка по индексу
|
|
57
|
+
* by_uid возвращает события в порядке записи без дополнительной сортировки.
|
|
58
|
+
*/
|
|
59
|
+
static readOldest(uid: number, limit: number): Promise<StatQueueRecord[]>;
|
|
60
|
+
static remove(ids: number[]): Promise<void>;
|
|
61
|
+
/** Уникальные uid, у которых есть записи. Курсор по индексу by_uid с nextunique. */
|
|
62
|
+
static listUids(): Promise<number[]>;
|
|
63
|
+
/**
|
|
64
|
+
* Приводит размер хранилища к лимиту, удаляя самые старые звонки целиком.
|
|
65
|
+
*
|
|
66
|
+
* Частично удалённый звонок — это ровно та неполная цепочка событий, ради
|
|
67
|
+
* устранения которой заведена задача, поэтому звонок выносится по vcid
|
|
68
|
+
* одной транзакцией. Записи без vcid (события до старта звонка) нельзя
|
|
69
|
+
* трактовать как одну группу: иначе один эвикшн вынес бы pre-call события
|
|
70
|
+
* сразу всех звонков.
|
|
71
|
+
*/
|
|
72
|
+
static evictToLimit(limit: number): Promise<void>;
|
|
73
|
+
private static _checkSupport;
|
|
74
|
+
private static _open;
|
|
75
|
+
private static _close;
|
|
76
|
+
private static _createSchema;
|
|
77
|
+
/** Обёртка над транзакцией: резолвится после успешного коммита. */
|
|
78
|
+
private static _runTransaction;
|
|
79
|
+
/** Читает запись с минимальным id, то есть самую старую в хранилище. */
|
|
80
|
+
private static _readOldestRecord;
|
|
81
|
+
private static _readIdsByConversation;
|
|
82
|
+
}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { SignalingTransportType } from '../../enums/SignalingTransportStat';
|
|
2
|
-
import
|
|
2
|
+
import StatEventCollector from './StatEventCollector';
|
|
3
3
|
export declare class StatSignalingCommands {
|
|
4
4
|
private readonly _logger;
|
|
5
5
|
private trackerByCommand;
|
|
6
|
-
constructor(logger:
|
|
6
|
+
constructor(logger: StatEventCollector);
|
|
7
7
|
mark(command: string, time: number, transport: SignalingTransportType): void;
|
|
8
8
|
/** Отправляем данные в стату */
|
|
9
9
|
logMetrics(): void;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { StatQueueEntry } from './StatQueue';
|
|
2
|
+
/**
|
|
3
|
+
* Синхронный журнал умирающей вкладки.
|
|
4
|
+
*
|
|
5
|
+
* Транзакция IndexedDB, начатая в pagehide-обработчике, не успевает
|
|
6
|
+
* закоммититься при перезагрузке или навигации: браузер сносит документ,
|
|
7
|
+
* не дав движку базы завершить запись. Из синхронных хранилищ на этот момент
|
|
8
|
+
* доступен только localStorage, поэтому события финиша складываются сюда,
|
|
9
|
+
* а при следующем старте SDK переносятся в очередь drainToQueue().
|
|
10
|
+
*
|
|
11
|
+
* Ключ уникален на вкладку: две вкладки, умирающие одновременно, не затирают
|
|
12
|
+
* журналы друг друга.
|
|
13
|
+
*/
|
|
14
|
+
export default abstract class StatUnloadJournal {
|
|
15
|
+
private static _tabKey;
|
|
16
|
+
private static _entries;
|
|
17
|
+
/**
|
|
18
|
+
* Открывает новый журнал для этой вкладки.
|
|
19
|
+
*
|
|
20
|
+
* Вызывается на каждом входе в unload-режим. Вкладка может пережить
|
|
21
|
+
* pagehide (bfcache, отменённая навигация, сворачивание на мобильном) и
|
|
22
|
+
* умереть повторно; без сброса второй журнал содержал бы события первого,
|
|
23
|
+
* уже перенесённые в очередь, и они уехали бы в статистику дважды.
|
|
24
|
+
*/
|
|
25
|
+
static beginTabSession(): void;
|
|
26
|
+
static writeSync(entry: StatQueueEntry): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Переносит журналы всех закрытых вкладок в очередь IndexedDB.
|
|
29
|
+
*
|
|
30
|
+
* Журнал стирается независимо от исхода переноса: это best-effort страховка,
|
|
31
|
+
* повторные попытки при неработающем IndexedDB дали бы дубли без шанса на
|
|
32
|
+
* успех. Статистика никогда не влияет на звонок.
|
|
33
|
+
*
|
|
34
|
+
* @returns число перенесённых событий.
|
|
35
|
+
*/
|
|
36
|
+
static drainToQueue(): Promise<number>;
|
|
37
|
+
private static _storage;
|
|
38
|
+
private static _isValidEntry;
|
|
39
|
+
}
|
|
@@ -3,7 +3,7 @@ import BaseSignaling from '../../abstract/BaseSignaling';
|
|
|
3
3
|
import { type DebugLogger } from '../../static/Debug';
|
|
4
4
|
import { ParticipantId } from '../../types/Participant';
|
|
5
5
|
import ServerSettings from '../../types/ServerSettings';
|
|
6
|
-
import
|
|
6
|
+
import StatEventCollector from '../stat/StatEventCollector';
|
|
7
7
|
import { MediaSource } from '../MediaSource';
|
|
8
8
|
import { CodecStatsAggregator } from '../stat/CodecStatsAggregator';
|
|
9
9
|
import { StatAggregator } from '../stat/StatAggregator';
|
|
@@ -43,7 +43,7 @@ export default class DirectTransport extends BaseTransport {
|
|
|
43
43
|
private readonly _logger;
|
|
44
44
|
private readonly _statAggregator;
|
|
45
45
|
private readonly _codecStatsAggregator;
|
|
46
|
-
constructor(participantId: ParticipantId, isMaster: boolean, signaling: BaseSignaling, mediaSource: MediaSource, serverSettings: ServerSettings, debug?: DebugLogger, logger?:
|
|
46
|
+
constructor(participantId: ParticipantId, isMaster: boolean, signaling: BaseSignaling, mediaSource: MediaSource, serverSettings: ServerSettings, debug?: DebugLogger, logger?: StatEventCollector | null, statAggregator?: StatAggregator | null, codecStatsAggregator?: CodecStatsAggregator | null, onFirstMediaSent?: (() => void) | null);
|
|
47
47
|
get participantId(): ParticipantId;
|
|
48
48
|
updateStatisticsInterval(): void;
|
|
49
49
|
private _isDeadConnection;
|
|
@@ -9,6 +9,7 @@ export default class PerfStatReporter extends EventEmitter {
|
|
|
9
9
|
private _previousNetworkStatReportTimestamp;
|
|
10
10
|
private _previousCallStatReportTimestamp;
|
|
11
11
|
private _previousCallStatReport;
|
|
12
|
+
private _previousRemoteInboundRtps;
|
|
12
13
|
private _screenShareStats;
|
|
13
14
|
private _signaling;
|
|
14
15
|
private readonly _directTopology;
|
|
@@ -21,6 +22,7 @@ export default class PerfStatReporter extends EventEmitter {
|
|
|
21
22
|
private reportPerfStats;
|
|
22
23
|
private reportNetworkStats;
|
|
23
24
|
private _reportCallStats;
|
|
25
|
+
private _calculatePacketLoss;
|
|
24
26
|
private _handleScreenSharingStat;
|
|
25
27
|
private _handleTransportStateChanged;
|
|
26
28
|
}
|
|
@@ -3,7 +3,7 @@ import BaseSignaling from '../../abstract/BaseSignaling';
|
|
|
3
3
|
import { type DebugLogger } from '../../static/Debug';
|
|
4
4
|
import { ParticipantId } from '../../types/Participant';
|
|
5
5
|
import ServerSettings from '../../types/ServerSettings';
|
|
6
|
-
import
|
|
6
|
+
import StatEventCollector from '../stat/StatEventCollector';
|
|
7
7
|
import { MediaSource } from '../MediaSource';
|
|
8
8
|
import { CodecStatsAggregator } from '../stat/CodecStatsAggregator';
|
|
9
9
|
import { StatAggregator } from '../stat/StatAggregator';
|
|
@@ -42,13 +42,12 @@ export default class ServerTransport extends BaseTransport {
|
|
|
42
42
|
private _rtpReceiversByStreamId;
|
|
43
43
|
private _producerSessionId;
|
|
44
44
|
private _newAudioShareTrack;
|
|
45
|
-
private _simulcastInfo;
|
|
46
|
-
private _isSimulcastNegotiated;
|
|
47
45
|
private readonly _debug;
|
|
48
46
|
private readonly _logger;
|
|
49
47
|
private readonly _statAggregator;
|
|
50
48
|
private readonly _codecStatsAggregator;
|
|
51
|
-
|
|
49
|
+
private readonly _simulcast;
|
|
50
|
+
constructor(signaling: BaseSignaling, mediaSource: MediaSource, serverSettings: ServerSettings, debug?: DebugLogger, logger?: StatEventCollector | null, statAggregator?: StatAggregator | null, codecStatsAggregator?: CodecStatsAggregator | null, onFirstMediaSent?: (() => void) | null);
|
|
52
51
|
updateStatisticsInterval(): void;
|
|
53
52
|
open(observer?: boolean): void;
|
|
54
53
|
close(error?: Error): void;
|
|
@@ -86,8 +85,6 @@ export default class ServerTransport extends BaseTransport {
|
|
|
86
85
|
private _detectStaleTracks;
|
|
87
86
|
private _allocateConsumer;
|
|
88
87
|
private _processOffer;
|
|
89
|
-
private _findFirstSimTransceiver;
|
|
90
|
-
private _setupSimulcastTransceiver;
|
|
91
88
|
private _acceptProducer;
|
|
92
89
|
private _replaceScreenShareTrack;
|
|
93
90
|
private _handleTracks;
|
|
@@ -102,7 +99,6 @@ export default class ServerTransport extends BaseTransport {
|
|
|
102
99
|
private _onReplacedTrack;
|
|
103
100
|
private _onSourcesChanged;
|
|
104
101
|
getStreamWaitingTimeMs(streamId: string, targetRtpTimestamp: number): number;
|
|
105
|
-
private _changeSimulcastInfo;
|
|
106
102
|
private _monitorRtpShare;
|
|
107
103
|
private _startMonitorRtpShareInterval;
|
|
108
104
|
private _stopMonitorRtpShareInterval;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import BaseSignaling from '../../abstract/BaseSignaling';
|
|
2
|
+
import { type DebugLogger } from '../../static/Debug';
|
|
3
|
+
import type VideoSettings from '../../types/VideoSettings';
|
|
4
|
+
import { MediaSource } from '../MediaSource';
|
|
5
|
+
import StatEventCollector from '../stat/StatEventCollector';
|
|
6
|
+
export default class SimulcastSender {
|
|
7
|
+
private _pc;
|
|
8
|
+
private _transceiver;
|
|
9
|
+
private _currentSimulcastInfo;
|
|
10
|
+
private readonly _signaling;
|
|
11
|
+
private readonly _mediaSource;
|
|
12
|
+
private readonly _getCameraSettings;
|
|
13
|
+
private readonly _debug;
|
|
14
|
+
private readonly _logger;
|
|
15
|
+
constructor(signaling: BaseSignaling, mediaSource: MediaSource, getCameraSettings: () => VideoSettings | null, debug?: DebugLogger, logger?: StatEventCollector | null);
|
|
16
|
+
configureFromRemoteOffer(pc: RTCPeerConnection): Promise<void>;
|
|
17
|
+
finalizeAnswer(sdp: string): string;
|
|
18
|
+
sync({ force }?: {
|
|
19
|
+
force?: boolean;
|
|
20
|
+
}): Promise<void>;
|
|
21
|
+
replaceTrack(track: MediaStreamTrack): boolean;
|
|
22
|
+
reset(): void;
|
|
23
|
+
private _findTransceiver;
|
|
24
|
+
private _findMediaSection;
|
|
25
|
+
private _getConfig;
|
|
26
|
+
private _getTrackConfig;
|
|
27
|
+
private _applyConfig;
|
|
28
|
+
private _applyCurrentMediaState;
|
|
29
|
+
private _syncReplacedTrack;
|
|
30
|
+
private _changeSimulcast;
|
|
31
|
+
}
|
|
@@ -6,7 +6,7 @@ import { type DebugLogger } from '../../static/Debug';
|
|
|
6
6
|
import { ParticipantId } from '../../types/Participant';
|
|
7
7
|
import ServerSettings from '../../types/ServerSettings';
|
|
8
8
|
import EventEmitter from '../EventEmitter';
|
|
9
|
-
import
|
|
9
|
+
import StatEventCollector from '../stat/StatEventCollector';
|
|
10
10
|
import { MediaSource } from '../MediaSource';
|
|
11
11
|
import { CodecStatsAggregator } from '../stat/CodecStatsAggregator';
|
|
12
12
|
import { StatAggregator } from '../stat/StatAggregator';
|
|
@@ -50,7 +50,8 @@ export declare class Transport extends EventEmitter {
|
|
|
50
50
|
private readonly _codecStatsAggregator;
|
|
51
51
|
private readonly _onFirstMediaSent;
|
|
52
52
|
private _firstMediaSentProbeStopped;
|
|
53
|
-
|
|
53
|
+
private _vadController;
|
|
54
|
+
constructor(topology: TransportTopology, signaling: BaseSignaling, mediaSource: MediaSource, serverSettings: ServerSettings, debug?: DebugLogger, logger?: StatEventCollector | null, statAggregator?: StatAggregator | null, codecStatsAggregator?: CodecStatsAggregator | null, onFirstMediaSent?: (() => void) | null);
|
|
54
55
|
updateSettings(settings: ServerSettings): void;
|
|
55
56
|
updateStatisticsInterval(): void;
|
|
56
57
|
allocate(participantId: ParticipantId, isMaster?: boolean): void;
|
|
@@ -96,6 +97,8 @@ export declare class Transport extends EventEmitter {
|
|
|
96
97
|
private _onAnimojiStream;
|
|
97
98
|
/** Обработчик, досылающий MediaSourceEvent.SOURCE_CHANGED событие до аллокации транспортов */
|
|
98
99
|
private _onAnimojiStatus;
|
|
100
|
+
private _createVad;
|
|
101
|
+
private _updateVadTrack;
|
|
99
102
|
private _createAnimojiTransport;
|
|
100
103
|
private _removeAnimojiTransport;
|
|
101
104
|
getStreamWaitingTimeMs(streamId: string, targetRtpTimestamp: number): number;
|
package/default/Api.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import BaseApi, { ClientStats } from '../abstract/BaseApi';
|
|
2
2
|
import CallType from '../enums/CallType';
|
|
3
3
|
import HangupType from '../enums/HangupType';
|
|
4
|
+
import { IHangupParams } from '../types/Api';
|
|
4
5
|
import ConversationParams from '../types/ConversationParams';
|
|
5
6
|
import ConversationResponse from '../types/ConversationResponse';
|
|
6
7
|
import { ExternalId, ExternalParticipantId, ExternalUserId } from '../types/ExternalId';
|
|
@@ -13,12 +14,36 @@ export default class Api extends BaseApi {
|
|
|
13
14
|
protected _call(method: string, data?: any, noSession?: boolean, allowReauthorize?: boolean): Promise<any>;
|
|
14
15
|
userId(participantId: ParticipantId): ExternalParticipantId;
|
|
15
16
|
authorize(): Promise<void>;
|
|
17
|
+
/**
|
|
18
|
+
* Запрос auth.anonymLogin без побочных эффектов: ничего не пишет в
|
|
19
|
+
* AuthData и кэш. Пустой токен — анонимный логин версии 2.
|
|
20
|
+
*/
|
|
21
|
+
private _anonymLogin;
|
|
16
22
|
private _getAnonymLoginCacheKey;
|
|
17
23
|
private _getCachedAnonymLogin;
|
|
18
24
|
private _setCachedAnonymLogin;
|
|
19
25
|
private _removeCachedAnonymLogin;
|
|
26
|
+
private _reauthorize;
|
|
20
27
|
private _applyAnonymLogin;
|
|
21
|
-
|
|
28
|
+
private _buildClientStatsData;
|
|
29
|
+
/**
|
|
30
|
+
* Ошибки по отдельным событиям логируются, но не влияют на результат:
|
|
31
|
+
* батч трактуется целиком, иначе одно всегда отвергаемое событие
|
|
32
|
+
* залипило бы очередь навсегда.
|
|
33
|
+
*/
|
|
34
|
+
private _reportClientStatsItemErrors;
|
|
35
|
+
/**
|
|
36
|
+
* noSession = true: _prepareQuery не подставит session_key из AuthData,
|
|
37
|
+
* наш явный ключ останется; application_key добавится как обычно.
|
|
38
|
+
*/
|
|
39
|
+
private _sendClientStatsWith;
|
|
40
|
+
/**
|
|
41
|
+
* Бекенд присылает 200 в любой ситуации, нужно читать тело.
|
|
42
|
+
* В теле есть ошибки если есть проблемы со статой.
|
|
43
|
+
*/
|
|
44
|
+
private _sendClientStats;
|
|
45
|
+
logClientStats(items: ClientStats[]): Promise<void>;
|
|
46
|
+
logClientStatsWith(sessionKey: string, items: ClientStats[]): Promise<void>;
|
|
22
47
|
uploadDebugLogs(conversationId: string, startTime: number, endTime: number, log: string): Promise<void>;
|
|
23
48
|
joinConversation(conversationId: string, isVideo?: boolean, chatId?: string): Promise<ConversationResponse>;
|
|
24
49
|
createConversation(conversationId: string, payload?: string, requireAuthToJoin?: boolean, { onlyAdminCanShareMovie, audienceMode, audioOnly, waitForAdmin, closedConversation, }?: {
|
|
@@ -55,7 +80,7 @@ export default class Api extends BaseApi {
|
|
|
55
80
|
getConversationParams(conversationId?: string): Promise<ConversationParams>;
|
|
56
81
|
getUserId(): OkUserId | null;
|
|
57
82
|
setUserId(userId: OkUserId): void;
|
|
58
|
-
hangupConversation(conversationId: string, reason?: HangupType): void;
|
|
83
|
+
hangupConversation(conversationId: string, reason?: HangupType, params?: Partial<IHangupParams>): void;
|
|
59
84
|
removeHistoryRecords(recordIds: number[]): Promise<void>;
|
|
60
85
|
cleanup(): void;
|
|
61
86
|
getServerTime(): Promise<number>;
|
package/default/ApiExternal.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { IHangupParams } from '../types/Api';
|
|
1
2
|
import { IAPIBaseUrl, IApiEnv } from '../types/Params';
|
|
2
3
|
export declare class ApiExternal {
|
|
3
4
|
private readonly _uuid;
|
|
@@ -8,5 +9,5 @@ export declare class ApiExternal {
|
|
|
8
9
|
private _sessionKey;
|
|
9
10
|
constructor(apiEvn: IApiEnv, apiKey: string, callToken: string, baseApiUrl?: IAPIBaseUrl);
|
|
10
11
|
authorize(): Promise<boolean>;
|
|
11
|
-
hangupConversation(conversationId: string): Promise<void>;
|
|
12
|
+
hangupConversation(conversationId: string, params?: Partial<IHangupParams>): Promise<void>;
|
|
12
13
|
}
|
package/default/Signaling.d.ts
CHANGED
|
@@ -4,7 +4,7 @@ import { SharingStatReport } from '../classes/screenshare/SharingStatReport';
|
|
|
4
4
|
import { StatAggregator } from '../classes/stat/StatAggregator';
|
|
5
5
|
import { StatPings } from '../classes/stat/StatPings';
|
|
6
6
|
import { StatSignalingCommands } from '../classes/stat/StatSignalingCommands';
|
|
7
|
-
import
|
|
7
|
+
import StatEventCollector from '../classes/stat/StatEventCollector';
|
|
8
8
|
import ConversationFeature from '../enums/ConversationFeature';
|
|
9
9
|
import ConversationOption from '../enums/ConversationOption';
|
|
10
10
|
import MediaOption from '../enums/MediaOption';
|
|
@@ -56,7 +56,7 @@ export default class Signaling extends BaseSignaling {
|
|
|
56
56
|
private static get WAIT_CONNECTION_DELAY();
|
|
57
57
|
private static get WAIT_RESPONSE_DELAY();
|
|
58
58
|
get ready(): boolean;
|
|
59
|
-
constructor(debug?: DebugLogger, logger?:
|
|
59
|
+
constructor(debug?: DebugLogger, logger?: StatEventCollector | null, statAggregator?: StatAggregator | null, statPings?: StatPings | null, statSignalingCommands?: StatSignalingCommands | null);
|
|
60
60
|
setAbortSignal(signal: AbortSignal | undefined): void;
|
|
61
61
|
setEndpoint(endpoint: string): void;
|
|
62
62
|
setWebTransportEndpoint(endpoint: string | null): void;
|
|
@@ -64,13 +64,14 @@ export default class Signaling extends BaseSignaling {
|
|
|
64
64
|
setProducerNotificationDataChannel(dataChannel: RTCDataChannel): void;
|
|
65
65
|
setProducerCommandDataChannel(dataChannel: RTCDataChannel): void;
|
|
66
66
|
useCommandDataChannel(status: boolean): void;
|
|
67
|
+
resetProducerConnection(cause?: Error): void;
|
|
67
68
|
/**
|
|
68
69
|
* Open a connection with a signaling server
|
|
69
70
|
*/
|
|
70
71
|
connect(connectionType: SignalingConnectionType): Promise<SignalingMessage.Connection>;
|
|
71
72
|
getNextCommandSequenceNumber(): number;
|
|
72
73
|
hangup(reason: string): Promise<SignalingMessage>;
|
|
73
|
-
sendCandidate(participantId: ParticipantId, candidate:
|
|
74
|
+
sendCandidate(participantId: ParticipantId, candidate: RTCIceCandidateInit): Promise<SignalingMessage>;
|
|
74
75
|
requestTestMode(consumerCommand: string, producerCommand: string | null): Promise<SignalingMessage>;
|
|
75
76
|
sendSdp(participantId: ParticipantId, sdp: RTCSessionDescriptionInit, extraPayload?: Record<string, any>): Promise<SignalingMessage>;
|
|
76
77
|
acceptCall(mediaSettings: MediaSettings): Promise<SignalingMessage>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Коды ошибок сессии API
|
|
3
|
+
*/
|
|
4
|
+
declare enum SessionError {
|
|
5
|
+
PARAM_SESSION_EXPIRED = 102,
|
|
6
|
+
PARAM_SESSION_KEY = 103,
|
|
7
|
+
PARAM_SIGNATURE = 104,
|
|
8
|
+
AUTH_LOGIN = 401
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Ошибки, после которых имеет смысл переавторизоваться: сессия протухла или
|
|
12
|
+
* подпись не сошлась. 401 сюда не входит — там протух токен хоста.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isSessionErrorCode(code: unknown): boolean;
|
|
15
|
+
export default SessionError;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vkontakte/calls-sdk",
|
|
3
|
-
"version": "2.8.12-dev.
|
|
3
|
+
"version": "2.8.12-dev.dd833275.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",
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
"**/*.d.ts"
|
|
15
15
|
],
|
|
16
16
|
"dependencies": {
|
|
17
|
-
"@vkontakte/calls-audio-effects": "1.
|
|
17
|
+
"@vkontakte/calls-audio-effects": "1.4.1",
|
|
18
18
|
"@vkontakte/calls-video-effects": "2.2.3-beta.7",
|
|
19
19
|
"@vkontakte/calls-vmoji": "1.0.10-beta.17",
|
|
20
20
|
"@vkontakte/libvpx": "2.0.9",
|
|
@@ -22,6 +22,6 @@
|
|
|
22
22
|
"fflate": "^0.8.2",
|
|
23
23
|
"messagepack": "1.1.12",
|
|
24
24
|
"simple-ebml-builder": "0.2.2",
|
|
25
|
-
"webrtc-adapter": "
|
|
25
|
+
"webrtc-adapter": "9.0.5"
|
|
26
26
|
}
|
|
27
27
|
}
|
package/static/ApiTransport.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { IAPIBaseUrl, IApiEnv } from '../types/Params';
|
|
2
2
|
export declare function resetApiEndpoint(): void;
|
|
3
|
+
/**
|
|
4
|
+
* Убираем слэш на конце
|
|
5
|
+
*/
|
|
6
|
+
export declare function sanitizeApiBaseUrl(url: IAPIBaseUrl): IAPIBaseUrl;
|
|
3
7
|
export declare function _resolveApiEndpoint(apiBaseUrl?: IAPIBaseUrl, apiEnv?: IApiEnv): Promise<string>;
|
|
4
8
|
export declare function sendBeakon(method: string, params?: {
|
|
5
9
|
[key: string]: any;
|
|
@@ -7,4 +11,7 @@ export declare function sendBeakon(method: string, params?: {
|
|
|
7
11
|
export declare function request(method: string, params?: {
|
|
8
12
|
[key: string]: any;
|
|
9
13
|
}, noSession?: boolean, customEndpoint?: string): Promise<any>;
|
|
14
|
+
export declare function requestKeepalive(method: string, params?: {
|
|
15
|
+
[key: string]: any;
|
|
16
|
+
}, noSession?: boolean): Promise<any>;
|
|
10
17
|
export declare function sendFormData(url: string, data: FormData): Promise<void>;
|
package/static/Params.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { VideoEffects } from '@vkontakte/calls-video-effects';
|
|
2
|
-
import type { EffectVoiceChange } from '@vkontakte/calls-audio-effects';
|
|
2
|
+
import type { EffectVoiceChange, VadControllerOptions, VadLib } from '@vkontakte/calls-audio-effects';
|
|
3
3
|
import type * as Vmoji from '@vkontakte/calls-vmoji';
|
|
4
4
|
import { IAsrData } from '../types/Asr';
|
|
5
5
|
import { ConversationData } from '../types/Conversation';
|
|
@@ -37,6 +37,18 @@ export type ParamsObject = {
|
|
|
37
37
|
platform: string;
|
|
38
38
|
/** @hidden */
|
|
39
39
|
clientStatsPlatform: string;
|
|
40
|
+
/**
|
|
41
|
+
* Автоматически запускать отправку клиентской статистики при `init()`.
|
|
42
|
+
*
|
|
43
|
+
* Если `false`, события звонков продолжают копиться в IndexedDB, но в сеть
|
|
44
|
+
* не уходят, пока хост не вызовет `startStats()`. Так хост может прогреть
|
|
45
|
+
* приложение, не нагружая сеть. До старта неактивен и fallback прямой
|
|
46
|
+
* отправки при недоступном хранилище. Если `startStats()` не вызвать
|
|
47
|
+
* никогда, очередь дорастёт до лимита и начнёт вытеснять старые звонки.
|
|
48
|
+
*
|
|
49
|
+
* _По умолчанию: `true`_
|
|
50
|
+
*/
|
|
51
|
+
autoStartStats: boolean;
|
|
40
52
|
/** @hidden */
|
|
41
53
|
clientType: string;
|
|
42
54
|
/** @hidden */
|
|
@@ -193,6 +205,14 @@ export type ParamsObject = {
|
|
|
193
205
|
* Можно установить позднее методом `setAudioEffects`
|
|
194
206
|
*/
|
|
195
207
|
audioEffects: EffectVoiceChange | null;
|
|
208
|
+
/**
|
|
209
|
+
* Namespace библиотеки VAD из `@vkontakte/calls-audio-effects`.
|
|
210
|
+
*
|
|
211
|
+
* Можно установить методом `setVad`
|
|
212
|
+
*/
|
|
213
|
+
vad: VadLib | null;
|
|
214
|
+
/** Настройки VAD (threshold, hangoverMs, enabled) */
|
|
215
|
+
vadOptions: VadControllerOptions;
|
|
196
216
|
/**
|
|
197
217
|
* Максимальная ширина видео в пикселях для видео эффекта
|
|
198
218
|
*
|
|
@@ -505,6 +525,16 @@ export type ParamsObject = {
|
|
|
505
525
|
* _По умолчанию: `false`_
|
|
506
526
|
*/
|
|
507
527
|
enableSessionStateUpdates: boolean;
|
|
528
|
+
/**
|
|
529
|
+
* Использовать `<audio>` вместо `<video>` для воспроизведения звука в desktop Safari
|
|
530
|
+
* @hidden
|
|
531
|
+
*/
|
|
532
|
+
safariAudioElement: boolean;
|
|
533
|
+
/**
|
|
534
|
+
* Отправлять пустой ICE candidate (end-of-candidates) удалённому пиру
|
|
535
|
+
* @hidden
|
|
536
|
+
*/
|
|
537
|
+
forwardEmptyIceCandidate: boolean;
|
|
508
538
|
/**
|
|
509
539
|
* Получен локальный стрим с камеры/микрофона
|
|
510
540
|
*/
|
|
@@ -910,6 +940,7 @@ export default abstract class Params {
|
|
|
910
940
|
static set platform(value: string);
|
|
911
941
|
static get clientStatsPlatform(): string;
|
|
912
942
|
static set clientStatsPlatform(value: string);
|
|
943
|
+
static get autoStartStats(): boolean;
|
|
913
944
|
static get clientType(): string;
|
|
914
945
|
static set clientType(value: string);
|
|
915
946
|
static get externalUserType(): string;
|
|
@@ -960,6 +991,10 @@ export default abstract class Params {
|
|
|
960
991
|
static get displaySurface(): DisplayCaptureSurfaceType;
|
|
961
992
|
static get audioEffects(): EffectVoiceChange | null;
|
|
962
993
|
static set audioEffects(value: EffectVoiceChange | null);
|
|
994
|
+
static get vad(): VadLib | null;
|
|
995
|
+
static set vad(value: VadLib | null);
|
|
996
|
+
static get vadOptions(): VadControllerOptions;
|
|
997
|
+
static set vadOptions(value: VadControllerOptions);
|
|
963
998
|
static get videoEffects(): VideoEffects | null;
|
|
964
999
|
static set videoEffects(value: VideoEffects | null);
|
|
965
1000
|
static get videoEffectMaxWidth(): number;
|
|
@@ -1027,6 +1062,8 @@ export default abstract class Params {
|
|
|
1027
1062
|
static get waitForRecordResponse(): boolean;
|
|
1028
1063
|
static get transparentAudio(): boolean;
|
|
1029
1064
|
static get enableSessionStateUpdates(): boolean;
|
|
1065
|
+
static get safariAudioElement(): boolean;
|
|
1066
|
+
static get forwardEmptyIceCandidate(): boolean;
|
|
1030
1067
|
static toJSON(): {
|
|
1031
1068
|
apiKey: string;
|
|
1032
1069
|
apiEnv: string;
|
|
@@ -1056,6 +1093,7 @@ export default abstract class Params {
|
|
|
1056
1093
|
movieShare: boolean;
|
|
1057
1094
|
clientType: string;
|
|
1058
1095
|
clientStatsPlatform: string;
|
|
1096
|
+
autoStartStats: boolean;
|
|
1059
1097
|
consumerScreenDataChannelPacketSize: number;
|
|
1060
1098
|
switchVideoAtBadNetwork: boolean;
|
|
1061
1099
|
simulcast: boolean;
|
|
@@ -1063,5 +1101,7 @@ export default abstract class Params {
|
|
|
1063
1101
|
waitForRecordResponse: boolean;
|
|
1064
1102
|
transparentAudio: boolean;
|
|
1065
1103
|
enableSessionStateUpdates: boolean;
|
|
1104
|
+
safariAudioElement: boolean;
|
|
1105
|
+
forwardEmptyIceCandidate: boolean;
|
|
1066
1106
|
};
|
|
1067
1107
|
}
|
|
@@ -11,6 +11,7 @@ declare namespace ParticipantConnectionStatusUtils {
|
|
|
11
11
|
function computeEffective(status: ParticipantConnectionStatus): ParticipantStatus;
|
|
12
12
|
function setSessionState(status: ParticipantConnectionStatus, sessionState?: ParticipantSessionState, sessionStateConnectedBySpeaker?: boolean): StatusTransition;
|
|
13
13
|
function setTransport(status: ParticipantConnectionStatus, transport: ParticipantStatus): StatusTransition;
|
|
14
|
+
function setStalled(status: ParticipantConnectionStatus, stalled: boolean): StatusTransition;
|
|
14
15
|
function setSessionStateApplicable(status: ParticipantConnectionStatus, applicable: boolean): StatusTransition;
|
|
15
16
|
}
|
|
16
17
|
export default ParticipantConnectionStatusUtils;
|
package/static/Sdp.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export type StoredSession = {
|
|
2
|
+
sessionKey: string;
|
|
3
|
+
/** Ключ окружения на момент сохранения, см. currentEndpoint(). */
|
|
4
|
+
endpoint: string;
|
|
5
|
+
savedAt: number;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Снимки сессий по uid на диске. В памяти сессия текущего пользователя —
|
|
9
|
+
* AuthData; здесь — то, что SDK видел раньше.
|
|
10
|
+
*
|
|
11
|
+
* Это снимок: он может быть протухшим, переавторизовать его извне нельзя.
|
|
12
|
+
* Годится только для отложенных best-effort задач (например, досылка
|
|
13
|
+
* статистики). Живые запросы звонка им подписывать нельзя.
|
|
14
|
+
*
|
|
15
|
+
* Хранится только session_key: секрет сессии транспорту не нужен, а токен
|
|
16
|
+
* хоста незачем — протухший снимок не переавторизуется, а выбрасывается.
|
|
17
|
+
*/
|
|
18
|
+
export default abstract class SessionStore {
|
|
19
|
+
static remember(uid: number, session: {
|
|
20
|
+
sessionKey: string;
|
|
21
|
+
endpoint: string;
|
|
22
|
+
}): void;
|
|
23
|
+
static get(uid: number): StoredSession | null;
|
|
24
|
+
static forget(uid: number): void;
|
|
25
|
+
/** Удаляет записи старше MAX_AGE_MS. */
|
|
26
|
+
static prune(now?: number): void;
|
|
27
|
+
/**
|
|
28
|
+
* Ключ окружения: сессия прода не должна улететь на тестовый кластер.
|
|
29
|
+
* Синхронный, в отличие от резолва endpoint в транспорте.
|
|
30
|
+
*
|
|
31
|
+
* Адрес нормализуется так же, как в транспорте: иначе снимок, сделанный
|
|
32
|
+
* при apiBaseUrl со слэшем на конце, не совпал бы сам с собой.
|
|
33
|
+
*/
|
|
34
|
+
static currentEndpoint(): string;
|
|
35
|
+
private static _read;
|
|
36
|
+
private static _write;
|
|
37
|
+
private static _isValid;
|
|
38
|
+
}
|
|
@@ -6,8 +6,10 @@ export declare const SIMULCAST_DEFAULT: {
|
|
|
6
6
|
BITRATE: number;
|
|
7
7
|
};
|
|
8
8
|
export declare const SIMULCAST_SCALABILITY_MODE = "L1T2";
|
|
9
|
-
export declare const MAP_RID_TO_SCALE_RESOLUTION_DOWN_BY: Record<string, number>;
|
|
10
9
|
export declare function isEqualSimulcastInfo(si1: ISimulcastInfo | null, si2: ISimulcastInfo | null): boolean;
|
|
11
10
|
export declare function findBitrateAsc(maxDimension: number, bitrates: VideoBitrateSettings[]): number;
|
|
12
|
-
export declare function calculateSimulcastInfo(width?: number, height?: number, bitrates?: VideoBitrateSettings[]):
|
|
13
|
-
|
|
11
|
+
export declare function calculateSimulcastInfo(width?: number, height?: number, bitrates?: VideoBitrateSettings[], fps?: number): {
|
|
12
|
+
streams: import("../types/SimulcastInfo").SimulcastStreamInfo[];
|
|
13
|
+
};
|
|
14
|
+
export declare function findScaleResolutionDownBy(rid: string | undefined, simulcastInfo: ISimulcastInfo): number;
|
|
15
|
+
export declare function applySimulcastInfoToEncodings(encodings: RTCRtpEncodingParameters[], simulcastInfo: ISimulcastInfo, maxDimension?: number, maxBitrate?: number): void;
|
package/static/Utils.d.ts
CHANGED
|
@@ -77,6 +77,5 @@ declare namespace Utils {
|
|
|
77
77
|
function objectReduce<R, T extends object>(obj: T, callback: (acc: R, value: T[keyof T], key: keyof T) => R, initialValue: R): R;
|
|
78
78
|
const setImmediate: (fn: VoidFunction) => VoidFunction;
|
|
79
79
|
function isObject(obj: unknown): obj is object;
|
|
80
|
-
function patchSimulcastAnswerSdp(sdp: string, trans: RTCRtpTransceiver, width: number, height: number): string;
|
|
81
80
|
}
|
|
82
81
|
export default Utils;
|