@vkontakte/calls-sdk 2.8.12-dev.bcb53bc3.0 → 2.8.12-dev.c58bce06.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.
Files changed (68) hide show
  1. package/CallsSDK.d.ts +28 -3
  2. package/abstract/BaseApi.d.ts +15 -10
  3. package/abstract/BaseSignaling.d.ts +10 -5
  4. package/calls-sdk.cjs.js +7 -13
  5. package/calls-sdk.esm.js +2773 -2006
  6. package/classes/AudioFix.d.ts +2 -2
  7. package/classes/AudioOutput.d.ts +6 -3
  8. package/classes/CallRegistry.d.ts +1 -1
  9. package/classes/ExternalIdCache.d.ts +1 -0
  10. package/classes/MediaSource.d.ts +6 -2
  11. package/classes/SpecListener.d.ts +2 -2
  12. package/classes/codec/LibVPxDecoder.d.ts +2 -2
  13. package/classes/codec/LibVPxEncoder.d.ts +2 -2
  14. package/classes/codec/WebCodecsDecoder.d.ts +2 -2
  15. package/classes/codec/WebCodecsEncoder.d.ts +2 -2
  16. package/classes/codec/WorkerBase.d.ts +3 -3
  17. package/classes/{Conversation.d.ts → conversation/Conversation.d.ts} +51 -37
  18. package/classes/conversation/Conversation.testUtils.d.ts +148 -0
  19. package/classes/{ConversationResponseValidator.d.ts → conversation/ConversationResponseValidator.d.ts} +1 -1
  20. package/classes/{DisplayLayoutRequester.d.ts → conversation/DisplayLayoutRequester.d.ts} +5 -5
  21. package/classes/conversation/index.d.ts +1 -0
  22. package/classes/screenshare/ScreenCaptureReceiver.d.ts +2 -2
  23. package/classes/screenshare/ScreenCaptureSender.d.ts +2 -2
  24. package/classes/screenshare/StreamBuilder.d.ts +2 -2
  25. package/classes/stat/CallLifecycleStats.d.ts +2 -6
  26. package/classes/stat/CodecStatsAggregator.d.ts +2 -2
  27. package/classes/stat/ConversationStats.d.ts +19 -4
  28. package/classes/stat/StatAggregator.d.ts +6 -2
  29. package/classes/stat/StatClock.d.ts +35 -0
  30. package/classes/stat/StatDrainScheduler.d.ts +121 -0
  31. package/classes/stat/StatEventCollector.d.ts +54 -0
  32. package/classes/stat/StatPings.d.ts +2 -2
  33. package/classes/stat/StatQueue.d.ts +92 -0
  34. package/classes/stat/StatSignalingCommands.d.ts +2 -2
  35. package/classes/stat/StatUnloadJournal.d.ts +39 -0
  36. package/classes/transport/DirectTransport.d.ts +3 -2
  37. package/classes/transport/PerfStatReporter.d.ts +2 -0
  38. package/classes/transport/ServerTransport.d.ts +3 -6
  39. package/classes/transport/SimulcastSender.d.ts +31 -0
  40. package/classes/transport/Transport.d.ts +2 -2
  41. package/default/Api.d.ts +28 -3
  42. package/default/ApiExternal.d.ts +2 -1
  43. package/default/Signaling.d.ts +11 -15
  44. package/default/SignalingTransport.d.ts +6 -1
  45. package/enums/ClientHangupReason.d.ts +7 -0
  46. package/enums/SessionError.d.ts +15 -0
  47. package/enums/Stat.d.ts +0 -1
  48. package/package.json +3 -3
  49. package/static/ApiTransport.d.ts +7 -0
  50. package/static/Params.d.ts +28 -0
  51. package/static/ParticipantConnectionStatusUtils.d.ts +1 -0
  52. package/static/Sdp.d.ts +3 -0
  53. package/static/SessionStore.d.ts +38 -0
  54. package/static/SignalingCapabilities.d.ts +1 -1
  55. package/static/SimulcastInfo.d.ts +5 -3
  56. package/static/Utils.d.ts +1 -2
  57. package/static/WebRTCUtils.d.ts +9 -12
  58. package/types/Api.d.ts +9 -0
  59. package/types/Capabilities.d.ts +1 -0
  60. package/types/FastHangup.d.ts +66 -0
  61. package/types/Participant.d.ts +1 -0
  62. package/types/PerfStatReporter.d.ts +0 -4
  63. package/types/SignalingCommand.d.ts +2 -0
  64. package/types/SignalingMessage.d.ts +1 -0
  65. package/utils/IceServers.d.ts +2 -0
  66. package/utils/NavigatorPermissions.d.ts +2 -2
  67. package/utils/SerializeLatest.d.ts +5 -0
  68. package/classes/StatsLogger.d.ts +0 -41
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';
@@ -11,14 +12,38 @@ export default class Api extends BaseApi {
11
12
  private _idCache;
12
13
  private _callUnsafe;
13
14
  protected _call(method: string, data?: any, noSession?: boolean, allowReauthorize?: boolean): Promise<any>;
14
- userId(participantId: ParticipantId): Promise<ExternalParticipantId>;
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
- logClientStats(items: ClientStats[]): void;
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>;
@@ -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
  }
@@ -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 StatsLogger from '../classes/StatsLogger';
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';
@@ -35,13 +35,13 @@ export default class Signaling extends BaseSignaling {
35
35
  private datachannelCommandsQueue;
36
36
  private incomingCache;
37
37
  private responseHandlers;
38
+ private disposed;
38
39
  private connectionType;
39
40
  private conversationResolve;
40
41
  private conversationReject;
41
42
  private connected;
42
43
  private listenersReady;
43
44
  private peerId;
44
- private conversationId;
45
45
  private connectionMessageWaitTimer;
46
46
  private participantIdRegistry;
47
47
  private producerNotificationDataChannel;
@@ -56,26 +56,22 @@ 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?: StatsLogger | null, statAggregator?: StatAggregator | null, statPings?: StatPings | null, statSignalingCommands?: StatSignalingCommands | null);
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;
63
- setConversationId(conversationId: string): void;
64
63
  setParticipantIdRegistry(participantIdRegistry: ParticipantIdRegistry): void;
65
64
  setProducerNotificationDataChannel(dataChannel: RTCDataChannel): void;
66
65
  setProducerCommandDataChannel(dataChannel: RTCDataChannel): void;
67
66
  useCommandDataChannel(status: boolean): void;
68
- /**
69
- * Free used resources
70
- */
71
- cleanup(): void;
67
+ resetProducerConnection(cause?: Error): void;
72
68
  /**
73
69
  * Open a connection with a signaling server
74
70
  */
75
71
  connect(connectionType: SignalingConnectionType): Promise<SignalingMessage.Connection>;
76
72
  getNextCommandSequenceNumber(): number;
77
- hangup(reason: string): Promise<SignalingMessage | void>;
78
- sendCandidate(participantId: ParticipantId, candidate: RTCIceCandidate): Promise<SignalingMessage>;
73
+ hangup(reason: string): Promise<SignalingMessage>;
74
+ sendCandidate(participantId: ParticipantId, candidate: RTCIceCandidateInit): Promise<SignalingMessage>;
79
75
  requestTestMode(consumerCommand: string, producerCommand: string | null): Promise<SignalingMessage>;
80
76
  sendSdp(participantId: ParticipantId, sdp: RTCSessionDescriptionInit, extraPayload?: Record<string, any>): Promise<SignalingMessage>;
81
77
  acceptCall(mediaSettings: MediaSettings): Promise<SignalingMessage>;
@@ -138,10 +134,7 @@ export default class Signaling extends BaseSignaling {
138
134
  acceptPromotion(reject?: boolean): Promise<SignalingMessage>;
139
135
  feedback(key: string): Promise<SignalingMessage>;
140
136
  getHandQueue(): Promise<SignalingMessage>;
141
- /**
142
- * Close a connection with a signaling server
143
- */
144
- close(): void;
137
+ dispose(cause?: Error): void;
145
138
  /**
146
139
  * Этот метод нужен т.к. после получения сообщения "connected" устанавливается транспорт
147
140
  * и подписывается на сигналинг. Данные приходят очень быстро и транспорт пропускает
@@ -173,17 +166,20 @@ export default class Signaling extends BaseSignaling {
173
166
  private _onError;
174
167
  private _serializeErrorEvent;
175
168
  private _onClose;
176
- private _closeSocket;
169
+ private _terminate;
170
+ private _fail;
177
171
  private _isRecordCommand;
178
172
  private _resolvePendingRecordCommands;
179
173
  private _handleCommandResponse;
180
174
  private _handleCommandsQueue;
181
175
  private _startResponseTimer;
176
+ private _resolveCommandWithoutResponse;
182
177
  private _serializeBinary;
183
178
  private _serializeJson;
184
179
  private _convertDisplayLayout;
185
180
  private _waitConnectionMessage;
186
181
  private _stopWaitConnectionMessage;
182
+ private _onTransportConnecting;
187
183
  private _onTransportFailed;
188
184
  private _onTransportReconnectScheduled;
189
185
  private _onTransportConnectionDead;
@@ -16,7 +16,12 @@ export type SignalingTransportReconnectEvent = {
16
16
  count: number;
17
17
  delay: number;
18
18
  };
19
+ export type SignalingTransportConnectingEvent = {
20
+ connectionType: SignalingConnectionType;
21
+ source: SignalingTransportType;
22
+ };
19
23
  export type SignalingTransportHandlers = {
24
+ onConnecting: (event: SignalingTransportConnectingEvent) => void;
20
25
  onOpen: () => void;
21
26
  onMessage: (event: MessageEvent) => void;
22
27
  onError: (event: Event) => void;
@@ -52,7 +57,7 @@ export default class SignalingTransport {
52
57
  resetReconnectCount(): void;
53
58
  connect(connectionType: SignalingConnectionType): void;
54
59
  close(code?: number): void;
55
- send(data: string | ArrayBuffer): void;
60
+ send(data: string | ArrayBuffer): Promise<void>;
56
61
  private _connect;
57
62
  private _connectWebTransport;
58
63
  private _connectWebSocket;
@@ -0,0 +1,7 @@
1
+ import HangupType from './HangupType';
2
+ /**
3
+ * Причины завершения звонка, которые клиент может передать в {@link hangup}/{@link declineCall}
4
+ * и пробросить в сигналинг без маппинга.
5
+ */
6
+ export type ClientHangupReason = HangupType.HUNGUP | HangupType.CANCELED | HangupType.REJECTED | HangupType.BUSY | HangupType.MISSED | HangupType.CALL_TIMEOUT;
7
+ export default ClientHangupReason;
@@ -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/enums/Stat.d.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  declare const enum Stat {
2
2
  CALL_INIT = "call_init",
3
- CALL_WARMUP = "call_warmup",
4
3
  CALL_START = "call_start",
5
4
  CALL_ACCEPTED_OUTGOING = "call_accepted_outgoing",
6
5
  CALL_ACCEPTED_INCOMING = "call_accepted_incoming",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/calls-sdk",
3
- "version": "2.8.12-dev.bcb53bc3.0",
3
+ "version": "2.8.12-dev.c58bce06.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.2.10-dev.7750ad9a.0",
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": "7.7.0"
25
+ "webrtc-adapter": "9.0.5"
26
26
  }
27
27
  }
@@ -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>;
@@ -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 */
@@ -513,6 +525,16 @@ export type ParamsObject = {
513
525
  * _По умолчанию: `false`_
514
526
  */
515
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;
516
538
  /**
517
539
  * Получен локальный стрим с камеры/микрофона
518
540
  */
@@ -918,6 +940,7 @@ export default abstract class Params {
918
940
  static set platform(value: string);
919
941
  static get clientStatsPlatform(): string;
920
942
  static set clientStatsPlatform(value: string);
943
+ static get autoStartStats(): boolean;
921
944
  static get clientType(): string;
922
945
  static set clientType(value: string);
923
946
  static get externalUserType(): string;
@@ -1039,6 +1062,8 @@ export default abstract class Params {
1039
1062
  static get waitForRecordResponse(): boolean;
1040
1063
  static get transparentAudio(): boolean;
1041
1064
  static get enableSessionStateUpdates(): boolean;
1065
+ static get safariAudioElement(): boolean;
1066
+ static get forwardEmptyIceCandidate(): boolean;
1042
1067
  static toJSON(): {
1043
1068
  apiKey: string;
1044
1069
  apiEnv: string;
@@ -1068,6 +1093,7 @@ export default abstract class Params {
1068
1093
  movieShare: boolean;
1069
1094
  clientType: string;
1070
1095
  clientStatsPlatform: string;
1096
+ autoStartStats: boolean;
1071
1097
  consumerScreenDataChannelPacketSize: number;
1072
1098
  switchVideoAtBadNetwork: boolean;
1073
1099
  simulcast: boolean;
@@ -1075,5 +1101,7 @@ export default abstract class Params {
1075
1101
  waitForRecordResponse: boolean;
1076
1102
  transparentAudio: boolean;
1077
1103
  enableSessionStateUpdates: boolean;
1104
+ safariAudioElement: boolean;
1105
+ forwardEmptyIceCandidate: boolean;
1078
1106
  };
1079
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;
@@ -0,0 +1,3 @@
1
+ export declare const SDP_LINE_ENDING = "\r\n";
2
+ export declare function splitSdpLines(sdp: string): string[];
3
+ export declare function joinSdpLines(lines: string[]): string;
@@ -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
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @see https://confluence.vk.team/display/VIDEOOK/Websocket+Capability+Flags
2
+ * @see https://confluence.vk.team/display/CALLS/Websocket+Capability+Flags
3
3
  */
4
4
  declare const PREDICATES: {
5
5
  readonly producerScreenTrack: () => boolean;
@@ -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[]): ISimulcastInfo;
13
- export declare function findScaleResolutionDownBy(rid?: string): number;
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
@@ -9,7 +9,7 @@ export declare const DEVICE_IDX_PARAMETER = "d";
9
9
  /** @hidden */
10
10
  declare namespace Utils {
11
11
  function patchLocalSDP(sdp: string, preferH264: boolean, brokenH264Decoder: boolean, preferVP9: boolean, isAudioNack?: boolean): string;
12
- function patchRemoteSDP(sdp: string, oldDataChannelDescription: boolean, preferH264: boolean, brokenH264: boolean, preferVP9: boolean, brokenVP9Encoder: boolean, brokenVP9Decoder: boolean): string;
12
+ function patchRemoteSDP(sdp: string, preferH264: boolean, brokenH264: boolean, preferVP9: boolean, brokenVP9Encoder: boolean, brokenVP9Decoder: boolean): string;
13
13
  function getPeerIdString(peerId: SignalingMessage.PeerId): string;
14
14
  function comparePeerId(peerId1: SignalingMessage.PeerId, peerId2: SignalingMessage.PeerId): boolean;
15
15
  function getPeerConnectionHostInfo(pc: RTCPeerConnection): Promise<{
@@ -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;
@@ -2,7 +2,7 @@
2
2
  * Вспомогательный плагин для работы с WebRTC
3
3
  */
4
4
  import { IVideoDimentions } from '../types/MediaSettings';
5
- import type StatsLogger from '../classes/StatsLogger';
5
+ import type StatEventCollector from '../classes/stat/StatEventCollector';
6
6
  import { type DebugLogger } from './Debug';
7
7
  /**
8
8
  * Тип камеры мобильного устройства
@@ -20,7 +20,7 @@ export declare enum FacingMode {
20
20
  /**
21
21
  * Известные браузеры
22
22
  */
23
- export type BrowserName = 'IE' | 'Edge' | 'Chrome' | 'Firefox' | 'Yandex' | 'Opera' | 'Sferum';
23
+ export type BrowserName = 'Edge' | 'Chrome' | 'Firefox' | 'Yandex' | 'Opera' | 'Sferum';
24
24
  declare namespace WebRTCUtils {
25
25
  /**
26
26
  * До вызова этого метода бесполезно опрашивать другие публичные методы.
@@ -85,24 +85,24 @@ declare namespace WebRTCUtils {
85
85
  * @param needAudio Нужно ли аудио
86
86
  * @param needEmptyTracks Добавлять ли в стрим пустые треки для отключенного видео/аудио
87
87
  */
88
- function getUserMedia(needVideo?: boolean, needAudio?: boolean, needEmptyTracks?: boolean, debug?: DebugLogger, logger?: StatsLogger | null): Promise<MediaStream>;
88
+ function getUserMedia(needVideo?: boolean, needAudio?: boolean, needEmptyTracks?: boolean, debug?: DebugLogger, logger?: StatEventCollector | null): Promise<MediaStream>;
89
89
  /**
90
90
  * Запрашивает трансляцию экрана пользователя с опциональным захватом звука
91
91
  */
92
- function getScreenMedia(fastScreenShare: boolean, withAudioShare: boolean, debug?: DebugLogger, logger?: StatsLogger | null): Promise<MediaStream>;
92
+ function getScreenMedia(fastScreenShare: boolean, withAudioShare: boolean, debug?: DebugLogger, logger?: StatEventCollector | null): Promise<MediaStream>;
93
93
  /**
94
94
  * Запрашивает камеру пользователя
95
95
  *
96
96
  * @param deviceId ID устройства
97
97
  * @param resolution Размеры видео
98
98
  */
99
- function getUserVideo(deviceId?: string, resolution?: IVideoDimentions, debug?: DebugLogger, logger?: StatsLogger | null): Promise<MediaStream>;
99
+ function getUserVideo(deviceId?: string, resolution?: IVideoDimentions, debug?: DebugLogger, logger?: StatEventCollector | null): Promise<MediaStream>;
100
100
  /**
101
101
  * Запрашивает микрофон пользователя
102
102
  *
103
103
  * @param deviceId ID устройства
104
104
  */
105
- function getUserAudio(deviceId?: string, debug?: DebugLogger, logger?: StatsLogger | null): Promise<MediaStream>;
105
+ function getUserAudio(deviceId?: string, debug?: DebugLogger, logger?: StatEventCollector | null): Promise<MediaStream>;
106
106
  /**
107
107
  * Устанавливает размер видео в стриме
108
108
  *
@@ -143,17 +143,14 @@ declare namespace WebRTCUtils {
143
143
  * В некоторых браузерах VP9 decoder сломан
144
144
  */
145
145
  function isBrokenVP9Decoder(): boolean;
146
- /**
147
- * Изменился формат описания датаканала в SDP
148
- * @link https://blog.mozilla.org/webrtc/how-to-avoid-data-channel-breaking/
149
- */
150
- function isOldDataChannelDescription(): boolean;
151
146
  /**
152
147
  * Может ли браузер делать H264 приоритетным
153
148
  */
154
149
  function canPreferH264(): boolean;
155
150
  /**
156
- * Некоторые браузеры (Firefox, Safari) некорректно поддерживают симулкаст
151
+ * Поддержка simulcast браузером.
152
+ * Safari корректно поддерживает simulcast начиная с версии 18.
153
+ * Firefox поддерживает simulcast с VP8 начиная с версии 134.
157
154
  */
158
155
  function isSimulcastSupportedByBrowser(): boolean;
159
156
  /**
package/types/Api.d.ts ADDED
@@ -0,0 +1,9 @@
1
+ import HangupType from '../enums/HangupType';
2
+ export interface IHangupParams {
3
+ conversationId: string;
4
+ reason: HangupType;
5
+ anonymToken?: string;
6
+ peerId?: string;
7
+ application_key?: string;
8
+ session_key?: string;
9
+ }
@@ -18,6 +18,7 @@ export type TCapabilities = {
18
18
  fastScreenShare: boolean;
19
19
  videoSuspend: boolean;
20
20
  simulcast: boolean;
21
+ simulcastNativeOrder: boolean;
21
22
  consumerFastScreenShare: boolean;
22
23
  consumerFastScreenShareQualityOnDemand: boolean;
23
24
  transparentAudio: boolean;
@@ -0,0 +1,66 @@
1
+ import type ClientHangupReason from '../enums/ClientHangupReason';
2
+ import type HangupType from '../enums/HangupType';
3
+ /**
4
+ * Параметры запроса завершения звонка через внешнего партнёра (fast hangup).
5
+ *
6
+ * SDK генерирует объект и передаёт его в {@link FastHangupHandler}.
7
+ * Хост и backend партнёра пробрасывают `internalParams` как есть, без парсинга.
8
+ */
9
+ export interface FastHangupParams {
10
+ /**
11
+ * ID звонка
12
+ */
13
+ conversationId: string;
14
+ /**
15
+ * Причина завершения звонка
16
+ */
17
+ reason: HangupType;
18
+ /**
19
+ * Внутренние параметры звонка (JSON-строка). Генерируется SDK.
20
+ */
21
+ internalParams?: string | null;
22
+ }
23
+ /**
24
+ * Ответ внешнего партнёра на завершение звонка.
25
+ */
26
+ export interface FastHangupResponse {
27
+ /**
28
+ * true — участие в звонке завершено
29
+ */
30
+ success: boolean;
31
+ }
32
+ /**
33
+ * Параметры публичных методов {@link hangup} / {@link declineCall}.
34
+ *
35
+ * `reason` и `conversationId` идут в signaling hangup.
36
+ * `onFastHangup` заменяет Calls API `vchat.hangupConversation`, если обработчик передан
37
+ * (явный hangup/decline или delayed hangup во время init).
38
+ * Если обработчик не передан, API hangup не вызывается — кроме закрытия вкладки (`pagehide`),
39
+ * где SDK всегда шлёт beacon, и delayed hangup без handler.
40
+ */
41
+ export interface HangupParams {
42
+ /**
43
+ * ID звонка. Если опущен — завершается текущий активный звонок.
44
+ */
45
+ conversationId?: string;
46
+ /**
47
+ * Причина завершения для проброса в сигналинг. См. {@link ClientHangupReason}.
48
+ */
49
+ reason?: ClientHangupReason;
50
+ /**
51
+ * Обработчик fast hangup — завершение звонка через внешнего партнёра.
52
+ */
53
+ onFastHangup?: FastHangupHandler;
54
+ }
55
+ /**
56
+ * Функция-обработчик fast hangup.
57
+ *
58
+ * Если передана в {@link HangupParams.onFastHangup} при `hangup` / `declineCall`,
59
+ * SDK вызывает её вместо API `vchat.hangupConversation`.
60
+ *
61
+ * На `pagehide` не используется — SDK всегда отправляет `sendBeacon`.
62
+ *
63
+ * @param params Параметры запроса
64
+ * @param signal AbortSignal текущего звонка, если он ещё жив на момент вызова
65
+ */
66
+ export type FastHangupHandler = (params: FastHangupParams, signal?: AbortSignal) => Promise<FastHangupResponse>;
@@ -49,6 +49,7 @@ export interface ParticipantSessionState {
49
49
  }
50
50
  export interface ParticipantConnectionStatus {
51
51
  transport: ParticipantStatus;
52
+ stalled: boolean;
52
53
  sessionState?: ParticipantSessionState;
53
54
  sessionStateApplicable: boolean;
54
55
  sessionStateConnectedBySpeaker: boolean;
@@ -24,10 +24,6 @@ export interface CallStatReport {
24
24
  audio_concealment_events: number;
25
25
  inbound_video_count: number;
26
26
  inbound_audio_count: number;
27
- packets_lost_video: number;
28
- packets_sent_video: number;
29
- packets_lost_audio: number;
30
- packets_sent_audio: number;
31
27
  freeze_count: number;
32
28
  total_freezes_duration: number;
33
29
  rtt: number;
@@ -1,8 +1,10 @@
1
1
  import SignalingCommandType from '../enums/SignalingCommandType';
2
2
  import { SignalingResponse, SignalingSuccessResponse } from './SignalingMessage';
3
+ export type SignalingCommandRoute = 'websocket' | 'producer';
3
4
  interface SignalingCommand<T extends SignalingResponse = SignalingSuccessResponse> {
4
5
  sequence: number;
5
6
  name: SignalingCommandType;
7
+ route: SignalingCommandRoute;
6
8
  statMarkName: string;
7
9
  params: object;
8
10
  responseTimer: number;
@@ -188,6 +188,7 @@ declare namespace SignalingMessage {
188
188
  peerId: PeerId;
189
189
  mediaSettings: Partial<MediaSettings>;
190
190
  capabilities?: string;
191
+ externalId?: ExternalId;
191
192
  }
192
193
  export interface Hungup extends Notification {
193
194
  participantId: OkUserId;
@@ -0,0 +1,2 @@
1
+ import IceServer from '../types/IceServer';
2
+ export declare function createIceServers(stunServer?: IceServer, turnServer?: IceServer): IceServer[];
@@ -2,8 +2,8 @@ type Device = 'camera' | 'microphone';
2
2
  type PermissionStatusState = typeof PermissionStatus.prototype.state;
3
3
  type EventListener = (name: Device, state: PermissionStatusState) => void;
4
4
  export declare class NavigatorPermissions {
5
- private _cameraPermissionStatus;
6
- private _microphonePermissionStatus;
5
+ private _cameraPermissionStatus?;
6
+ private _microphonePermissionStatus?;
7
7
  private _listener;
8
8
  static isSupported(): boolean;
9
9
  init(listener: EventListener): Promise<void>;
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Последовательно выполняет операции, оставляя в очереди только последнее запрошенное значение.
3
+ * Возвращает ошибку, только если не удалось применить итоговое состояние.
4
+ */
5
+ export declare function serializeLatest<T>(run: (value: T) => Promise<void> | undefined): (value: T) => Promise<void>;