@vkontakte/calls-sdk 2.8.12-dev.dfea6e89.0 → 2.8.12-dev.ec5956ec.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.
@@ -1,4 +1,4 @@
1
- import Conversation from './Conversation';
1
+ import type Conversation from './conversation';
2
2
  import MediaSettings from '../types/MediaSettings';
3
3
  export interface HoldableConversation extends Conversation {
4
4
  id: string;
@@ -1,33 +1,34 @@
1
1
  import type { IEffect } from '@vkontakte/calls-video-effects';
2
2
  import type { RGBTuple } from '@vkontakte/calls-vmoji';
3
- import BaseApi from '../abstract/BaseApi';
4
- import BaseLogger from '../abstract/BaseLogger';
5
- import { AddParticipantParams } from '../abstract/BaseSignaling';
6
- import ConversationFeature from '../enums/ConversationFeature';
7
- import ConversationOption from '../enums/ConversationOption';
8
- import MediaOption from '../enums/MediaOption';
9
- import UpdateDisplayLayoutErrorReason from '../enums/UpdateDisplayLayoutErrorReason';
10
- import UserRole from '../enums/UserRole';
11
- import UserType from '../enums/UserType';
12
- import { DebugMessageType } from '../static/Debug';
13
- import { JSONObject } from '../static/Json';
14
- import { IAsrStartParams, IAsrStopParams } from '../types/Asr';
15
- import { AudienceModeHandsResponse } from '../types/AudienceMode';
16
- import { ConversationData, ConversationOnJoinParams, ConversationOnStartParams } from '../types/Conversation';
17
- import { ExternalId, ExternalParticipant, ExternalParticipantId, ExternalParticipantListChunk } from '../types/ExternalId';
18
- import MediaModifiers from '../types/MediaModifiers';
19
- import MediaSettings, { IVideoDimentions } from '../types/MediaSettings';
20
- import { IAddMovieParams, IUpdateMovieData } from '../types/MovieShare';
21
- import MuteStates from '../types/MuteStates';
22
- import { CompositeUserId, IGetParticipantsParameters, OkUserId, ParticipantId, ParticipantStateData } from '../types/Participant';
23
- import { DisplayLayoutRequest, ParticipantLayout } from '../types/ParticipantLayout';
24
- import { ParticipantListChunkParameters } from '../types/ParticipantListChunk';
25
- import ParticipantPriority from '../types/ParticipantPriority';
26
- import { ParticipantStreamDescription } from '../types/ParticipantStreamDescription';
27
- import { ScreenCaptureSettings } from '../types/ScreenCaptureSettings';
28
- import SignalingMessage from '../types/SignalingMessage';
29
- import { WaitingHallResponse } from '../types/WaitingHall';
30
- import EventEmitter from './EventEmitter';
3
+ import BaseApi from '../../abstract/BaseApi';
4
+ import BaseLogger from '../../abstract/BaseLogger';
5
+ import { AddParticipantParams } from '../../abstract/BaseSignaling';
6
+ import ConversationFeature from '../../enums/ConversationFeature';
7
+ import ConversationOption from '../../enums/ConversationOption';
8
+ import type ClientHangupReason from '../../enums/ClientHangupReason';
9
+ import MediaOption from '../../enums/MediaOption';
10
+ import UpdateDisplayLayoutErrorReason from '../../enums/UpdateDisplayLayoutErrorReason';
11
+ import UserRole from '../../enums/UserRole';
12
+ import UserType from '../../enums/UserType';
13
+ import { DebugMessageType } from '../../static/Debug';
14
+ import { JSONObject } from '../../static/Json';
15
+ import { IAsrStartParams, IAsrStopParams } from '../../types/Asr';
16
+ import { AudienceModeHandsResponse } from '../../types/AudienceMode';
17
+ import { ConversationData, ConversationOnJoinParams, ConversationOnStartParams } from '../../types/Conversation';
18
+ import { ExternalId, ExternalParticipant, ExternalParticipantId, ExternalParticipantListChunk } from '../../types/ExternalId';
19
+ import MediaModifiers from '../../types/MediaModifiers';
20
+ import MediaSettings, { IVideoDimentions } from '../../types/MediaSettings';
21
+ import { IAddMovieParams, IUpdateMovieData } from '../../types/MovieShare';
22
+ import MuteStates from '../../types/MuteStates';
23
+ import { CompositeUserId, IGetParticipantsParameters, OkUserId, ParticipantId, ParticipantStateData } from '../../types/Participant';
24
+ import { DisplayLayoutRequest, ParticipantLayout } from '../../types/ParticipantLayout';
25
+ import { ParticipantListChunkParameters } from '../../types/ParticipantListChunk';
26
+ import ParticipantPriority from '../../types/ParticipantPriority';
27
+ import { ParticipantStreamDescription } from '../../types/ParticipantStreamDescription';
28
+ import { ScreenCaptureSettings } from '../../types/ScreenCaptureSettings';
29
+ import SignalingMessage from '../../types/SignalingMessage';
30
+ import { WaitingHallResponse } from '../../types/WaitingHall';
31
+ import EventEmitter from '../EventEmitter';
31
32
  export default class Conversation extends EventEmitter {
32
33
  private readonly _api;
33
34
  private readonly _signaling;
@@ -42,7 +43,6 @@ export default class Conversation extends EventEmitter {
42
43
  private _waitingHallHoldPending;
43
44
  private _participantState;
44
45
  private _participants;
45
- private _pendingParticipants;
46
46
  private _directTransportIsMaster?;
47
47
  private _transport;
48
48
  private _debugInfo;
@@ -105,8 +105,8 @@ export default class Conversation extends EventEmitter {
105
105
  private _getMainRoomParticipants;
106
106
  private _decodeExternalConversationParams;
107
107
  accept(mediaOptions: MediaOption[]): Promise<ConversationData>;
108
- decline(): Promise<void>;
109
- hangup(): Promise<void>;
108
+ decline(reason?: ClientHangupReason): Promise<void>;
109
+ hangup(reason?: ClientHangupReason): Promise<void>;
110
110
  addParticipant(participantIds: ExternalId[], params?: AddParticipantParams): Promise<void>;
111
111
  addParticipantLegacy(participantIds: CompositeUserId[], params?: AddParticipantParams): Promise<void>;
112
112
  removeParticipant(participantId: CompositeUserId, ban?: boolean): Promise<void>;
@@ -118,6 +118,7 @@ export default class Conversation extends EventEmitter {
118
118
  private _emitHangupOnce;
119
119
  private _close;
120
120
  destroy(): void;
121
+ private _destroy;
121
122
  private _getConversationParams;
122
123
  private _setConversationParams;
123
124
  private _buildSignalingEndpoint;
@@ -439,7 +440,6 @@ export default class Conversation extends EventEmitter {
439
440
  private _setMuteStatesForRoomId;
440
441
  private _forceOpenTransportForAloneInCall;
441
442
  private _registerParticipant;
442
- private _getParticipants;
443
443
  private _getParticipant;
444
444
  }
445
445
  declare function _resetPendingInstance(): void;
@@ -0,0 +1,148 @@
1
+ import { FetchMock } from 'vitest-fetch-mock';
2
+ import { Mock } from 'vitest';
3
+ import { Client, Server } from 'mock-socket';
4
+ import { ISharedMovieInfo, OkUserId } from '../../CallsSDK';
5
+ import Api from '../../default/Api';
6
+ import CallDirection from '../../enums/CallDirection';
7
+ import ConversationOption from '../../enums/ConversationOption';
8
+ import TransportState from '../../enums/TransportState';
9
+ import TransportTopology from '../../enums/TransportTopology';
10
+ import { ParticipantStatus } from '../../static/External';
11
+ import { ExternalParticipantId } from '../../types/ExternalId';
12
+ import { ParticipantListMarkers } from '../../types/Participant';
13
+ import SignalingMessage from '../../types/SignalingMessage';
14
+ import Conversation from './Conversation';
15
+ declare function createParams(): {
16
+ apiKey: string;
17
+ apiEnv: string;
18
+ onLocalStream: Mock<import("@vitest/spy").Procedure>;
19
+ onLocalStatus: Mock<import("@vitest/spy").Procedure>;
20
+ onConversation: Mock<import("@vitest/spy").Procedure>;
21
+ onLocalSharedMovieInfo: Mock<import("@vitest/spy").Procedure>;
22
+ onRemoteSharedMovieInfo: Mock<import("@vitest/spy").Procedure>;
23
+ onRemoteSharedUrl: Mock<import("@vitest/spy").Procedure>;
24
+ onCallState: Mock<import("@vitest/spy").Procedure>;
25
+ onOptionsChanged: Mock<import("@vitest/spy").Procedure>;
26
+ onPinnedParticipant: Mock<import("@vitest/spy").Procedure>;
27
+ onRemoteMediaSettings: Mock<import("@vitest/spy").Procedure>;
28
+ onRemoteParticipantState: Mock<import("@vitest/spy").Procedure>;
29
+ onLocalPin: Mock<import("@vitest/spy").Procedure>;
30
+ onDebugMessage: Mock<import("@vitest/spy").Procedure>;
31
+ onHangup: Mock<import("@vitest/spy").Procedure>;
32
+ onRemoteRemoved: Mock<import("@vitest/spy").Procedure>;
33
+ onConversationParticipantListChunk: Mock<import("@vitest/spy").Procedure>;
34
+ onRoomParticipantsUpdated: Mock<import("@vitest/spy").Procedure>;
35
+ onChatRoomUpdated: Mock<import("@vitest/spy").Procedure>;
36
+ onRemoteStatus: Mock<import("@vitest/spy").Procedure>;
37
+ onSpeakerChanged: Mock<import("@vitest/spy").Procedure>;
38
+ };
39
+ export type ConversationTestParams = ReturnType<typeof createParams>;
40
+ export type ConversationTestTools = {
41
+ readonly endpointURL: string;
42
+ readonly fetchMocker: FetchMock;
43
+ readonly params: ConversationTestParams;
44
+ readonly server: Server;
45
+ readonly wsBaseURL: string;
46
+ createConnectionMessage(data?: Partial<SignalingMessage.Connection>): SignalingMessage.Connection;
47
+ createConversation(options?: {
48
+ api?: Api;
49
+ }): Conversation;
50
+ createExternalIdMock(id: string, data?: Partial<ExternalParticipantId>): ExternalParticipantId;
51
+ createMarkers(data?: Partial<ParticipantListMarkers>): ParticipantListMarkers;
52
+ createMovieShareInfo(initiatorId: string, data?: Partial<ISharedMovieInfo> | null): ISharedMovieInfo;
53
+ createParticipant(id: number, data?: Partial<SignalingMessage.Participant>): SignalingMessage.Participant & Required<Pick<SignalingMessage.Participant, 'markers'>>;
54
+ createParticipantWithMarkers(id: number, data?: Partial<SignalingMessage.Participant>): SignalingMessage.Participant & Required<Pick<SignalingMessage.Participant, 'markers'>>;
55
+ createPromoteParticipantMessage(): SignalingMessage.PromoteParticipant;
56
+ createSignallingConversation(okUserId: OkUserId, peerId: SignalingMessage.PeerId, data?: Partial<SignalingMessage.Conversation>): SignalingMessage.Conversation;
57
+ createWaitingHallConversationData(): ReturnType<typeof createWaitingHallConversationData>;
58
+ emitMessageOnConnection(wsServer: Server, message?: SignalingMessage.Connection): void;
59
+ enableParticipantListChunk(): void;
60
+ expectRemoteStatus(status: ParticipantStatus, participantId?: string): Promise<void>;
61
+ expectRemoteStatusCall(status: ParticipantStatus, participantId?: string): void;
62
+ forgetConversation(conversation: Conversation): void;
63
+ getActiveSocket(wsServer: Server): Client;
64
+ hasRemoteStatusCall(status: ParticipantStatus, participantId?: string): boolean;
65
+ isCapabilityEnabled(predicateIndex: number, wsServer: Server): boolean;
66
+ parseUrlSearch(search: string): Record<string, string>;
67
+ resetRemoteStatusCallbacks(): void;
68
+ respondOnGetParticipantListChunkWith(data: Partial<SignalingMessage.ParticipantListChunk>): void;
69
+ sendAcceptedCall(participant: SignalingMessage.Participant): void;
70
+ sendHungup(participant: SignalingMessage.Participant): void;
71
+ sendSessionState(participant: SignalingMessage.Participant | number, connected: boolean, data?: Partial<SignalingMessage.SessionState>): void;
72
+ setApiAuth(data?: {
73
+ sessionKey?: string;
74
+ sessionSecretKey?: string;
75
+ }): void;
76
+ setTransportState(conversation: Conversation, state: TransportState): void;
77
+ socketRespondWith(socket: Client, command: string, response: SignalingMessage): void;
78
+ socketSendNotification(socket: Client, notification: string, response?: SignalingMessage): void;
79
+ startConversation(message?: SignalingMessage.Connection): Promise<Conversation>;
80
+ startConversationWithParticipants(participants: SignalingMessage.Participant[], peerId?: SignalingMessage.PeerId): Promise<Conversation>;
81
+ startConversationWithRemoteParticipant(remoteParticipantData?: Partial<SignalingMessage.Participant>): Promise<{
82
+ conversation: Conversation;
83
+ meParticipant: SignalingMessage.Participant;
84
+ remoteParticipant: SignalingMessage.Participant;
85
+ }>;
86
+ stubApiRequest(endpoint: string, method: string, data: object): void;
87
+ waitFor(fn: () => Promise<boolean> | boolean, message?: string, timeout?: number): Promise<true>;
88
+ flushSdkCallbacks(): Promise<null>;
89
+ };
90
+ export declare function defineConversationTests(name: string, defineTests: (tools: ConversationTestTools) => void): void;
91
+ export declare function createExternalIdMock(id: string, data?: Partial<ExternalParticipantId>): ExternalParticipantId;
92
+ export declare function enableParticipantListChunk(): void;
93
+ export declare function setApiAuth(data?: {
94
+ sessionKey?: string;
95
+ sessionSecretKey?: string;
96
+ }): void;
97
+ export declare function setTransportState(conversation: Conversation, state: TransportState): void;
98
+ export declare function socketRespondWith(socket: Client, command: string, response: SignalingMessage): void;
99
+ export declare function socketSendNotification(socket: Client, notification: string, response?: SignalingMessage): void;
100
+ export declare function createWaitingHallConversationData(): {
101
+ acceptTime: null;
102
+ asrInfo: null;
103
+ asrInfoByRoom: Map<any, any>;
104
+ audienceMode: boolean;
105
+ chatId: null;
106
+ compositeUserId: string;
107
+ concurrent: boolean;
108
+ direction: CallDirection;
109
+ externalId: ExternalParticipantId;
110
+ features: never[];
111
+ featuresPerRole: null;
112
+ id: string;
113
+ mediaModifiers: {
114
+ denoise: boolean;
115
+ denoiseAnn: boolean;
116
+ };
117
+ muteStates: Map<any, any>;
118
+ muteStatesPersonal: {};
119
+ needRate: boolean;
120
+ networkRating: number;
121
+ observer: boolean;
122
+ options: ConversationOption[];
123
+ participantsLimit: number;
124
+ pinnedParticipantIdByRoom: Map<any, any>;
125
+ recordsInfoByRoom: Map<any, any>;
126
+ restricted: boolean;
127
+ roles: never[];
128
+ roomId: number | null;
129
+ topology: TransportTopology;
130
+ urlSharingInfoByRoom: Map<any, any>;
131
+ userId: number;
132
+ waitForAdmin: boolean;
133
+ waitingHall: boolean;
134
+ };
135
+ export declare function createPromoteParticipantMessage(): SignalingMessage.PromoteParticipant;
136
+ export declare function emitMessageOnConnection(wsServer: Server, message?: SignalingMessage.Connection): void;
137
+ export declare function getActiveSocket(wsServer: Server): Client;
138
+ export declare function isCapabilityEnabled(predicateIndex: number, wsServer: Server): boolean;
139
+ export declare function parseUrlSearch(search: string): Record<string, string>;
140
+ export declare function flushSdkCallbacks(): Promise<null>;
141
+ export declare function waitFor(fn: () => Promise<boolean> | boolean, message?: string, timeout?: number): Promise<true>;
142
+ export declare function createSignallingConversation(okUserId: OkUserId, peerId: SignalingMessage.PeerId, data?: Partial<SignalingMessage.Conversation>): SignalingMessage.Conversation;
143
+ export declare function createConnectionMessage(data?: Partial<SignalingMessage.Connection>): SignalingMessage.Connection;
144
+ export declare function createParticipant(id: number, data?: Partial<SignalingMessage.Participant>): SignalingMessage.Participant & Required<Pick<SignalingMessage.Participant, 'markers'>>;
145
+ export declare function createParticipantWithMarkers(id: number, data?: Partial<SignalingMessage.Participant>): SignalingMessage.Participant & Required<Pick<SignalingMessage.Participant, 'markers'>>;
146
+ export declare function createMarkers(data?: Partial<ParticipantListMarkers>): ParticipantListMarkers;
147
+ export declare function createMovieShareInfo(initiatorId: string, data?: Partial<ISharedMovieInfo> | null): ISharedMovieInfo;
148
+ export {};
@@ -1,3 +1,3 @@
1
- import ConversationResponse from '../types/ConversationResponse';
1
+ import ConversationResponse from '../../types/ConversationResponse';
2
2
  export type ConversationResponseSource = 'startConversation' | 'joinConversation' | 'joinConversationByLink' | 'fastStart' | 'fastJoin';
3
3
  export declare function assertValidConversationResponse(response: ConversationResponse | null | undefined, source: ConversationResponseSource): void;
@@ -1,7 +1,7 @@
1
- import BaseApi from '../abstract/BaseApi';
2
- import type { DebugLogger } from '../static/Debug';
3
- import { DisplayLayoutRequest, ParticipantLayout } from '../types/ParticipantLayout';
4
- import { Participant, ParticipantId } from '../types/Participant';
1
+ import BaseApi from '../../abstract/BaseApi';
2
+ import type { DebugLogger } from '../../static/Debug';
3
+ import { DisplayLayoutRequest, ParticipantLayout } from '../../types/ParticipantLayout';
4
+ import { Participant, ParticipantId } from '../../types/Participant';
5
5
  type DisplayLayoutRequesterParams = {
6
6
  api: BaseApi;
7
7
  debug: DebugLogger;
@@ -0,0 +1 @@
1
+ export { default } from './Conversation';
@@ -14,9 +14,7 @@ export declare class CallLifecycleStats {
14
14
  private _conversationId;
15
15
  private _callStartLabel;
16
16
  private _lifecycleStartedAtMonotonic;
17
- private _warmupStartedAtMonotonic;
18
17
  private _pendingEvents;
19
- private _warmupCompleted;
20
18
  private _callStarted;
21
19
  private _accepted;
22
20
  private _firstMediaSent;
@@ -27,8 +25,6 @@ export declare class CallLifecycleStats {
27
25
  get terminated(): boolean;
28
26
  markInitializationStarted({ source, conversationId }: CallLifecycleInitializationParams): void;
29
27
  bindConversationId(conversationId: string): void;
30
- markWarmupStarted(): void;
31
- markWarmupCompleted(): void;
32
28
  markCallStarted(): void;
33
29
  markOutgoingAccepted(): void;
34
30
  markIncomingAccepted(concurrent: boolean): void;
@@ -57,6 +57,7 @@ export default class DirectTransport extends BaseTransport {
57
57
  private _disposePeerConnection;
58
58
  setAnimojiTransport(receiver: AnimojiReceiver, sender: AnimojiSender): void;
59
59
  close(error?: Error): void;
60
+ private _finishClose;
60
61
  private _setState;
61
62
  private _onSignalingNotification;
62
63
  private _handleTransmittedData;
@@ -43,6 +43,7 @@ export default class ServerTransport extends BaseTransport {
43
43
  private _producerSessionId;
44
44
  private _newAudioShareTrack;
45
45
  private _simulcastInfo;
46
+ private _isSimulcastNegotiated;
46
47
  private readonly _debug;
47
48
  private readonly _logger;
48
49
  private readonly _statAggregator;
@@ -172,11 +172,13 @@ export default class Signaling extends BaseSignaling {
172
172
  private _handleCommandResponse;
173
173
  private _handleCommandsQueue;
174
174
  private _startResponseTimer;
175
+ private _resolveCommandWithoutResponse;
175
176
  private _serializeBinary;
176
177
  private _serializeJson;
177
178
  private _convertDisplayLayout;
178
179
  private _waitConnectionMessage;
179
180
  private _stopWaitConnectionMessage;
181
+ private _onTransportConnecting;
180
182
  private _onTransportFailed;
181
183
  private _onTransportReconnectScheduled;
182
184
  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;
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.dfea6e89.0",
3
+ "version": "2.8.12-dev.ec5956ec.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",
@@ -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[];