@vkontakte/calls-sdk 2.8.6-dev.77dd3c9d.0 → 2.8.6-dev.7a7707c0.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.
@@ -19,7 +19,7 @@ import MediaModifiers from '../types/MediaModifiers';
19
19
  import { IVideoDimentions } from '../types/MediaSettings';
20
20
  import { IAddMovieParams, IUpdateMovieData } from '../types/MovieShare';
21
21
  import MuteStates from '../types/MuteStates';
22
- import { CompositeUserId, IGetParticipantsParameters, OkUserId, ParticipantId } from '../types/Participant';
22
+ import { CompositeUserId, IGetParticipantsParameters, OkUserId, ParticipantId, ParticipantStateData } from '../types/Participant';
23
23
  import { ParticipantLayout } from '../types/ParticipantLayout';
24
24
  import { ParticipantListChunkParameters } from '../types/ParticipantListChunk';
25
25
  import ParticipantPriority from '../types/ParticipantPriority';
@@ -189,7 +189,7 @@ export default class Conversation extends EventEmitter {
189
189
  * @deprecated Use updateDisplayLayout instead
190
190
  */
191
191
  changePriorities(priorities: ParticipantPriority[]): Promise<void>;
192
- changeParticipantState(state: Record<string, string>, compositeUserId?: CompositeUserId): Promise<void>;
192
+ changeParticipantState(state: ParticipantStateData, compositeUserId?: CompositeUserId): Promise<void>;
193
193
  putHandsDown(): Promise<void>;
194
194
  requestKeyFrame(participantStreamDescription: ParticipantStreamDescription): Promise<void | SignalingMessage>;
195
195
  requestTestMode(consumerCommand: string, producerCommand: string): Promise<void>;
@@ -249,7 +249,7 @@ export default class Conversation extends EventEmitter {
249
249
  customData(data: JSONObject, participantId?: ParticipantId | null): Promise<void>;
250
250
  createJoinLink(): Promise<string>;
251
251
  removeJoinLink(): Promise<undefined>;
252
- addMovie({ movieId, gain, metadata }: IAddMovieParams): Promise<{
252
+ addMovie({ movieId, gain, metadata, lang }: IAddMovieParams): Promise<{
253
253
  movieId: number;
254
254
  streamType: string;
255
255
  }>;
@@ -272,7 +272,7 @@ export default class Conversation extends EventEmitter {
272
272
  setLocalResolution({ video, effect }: {
273
273
  video: IVideoDimentions;
274
274
  effect?: IVideoDimentions;
275
- }): Promise<void | undefined>;
275
+ }): Promise<void>;
276
276
  videoEffect(effect: IEffect | null): Promise<void | undefined>;
277
277
  audioEffect(effects: string[] | null, isPreset?: boolean): Promise<void | undefined>;
278
278
  _convertExternalIdsToServerExternalIds(externalIds: ExternalId[]): SignalingMessage.ExternalId[];
@@ -5,6 +5,7 @@ import MediaSettings, { IVideoDimentions } from '../types/MediaSettings';
5
5
  import { ScreenCaptureSettings } from '../types/ScreenCaptureSettings';
6
6
  export declare const enum MediaSourceEvent {
7
7
  SOURCE_CHANGED = "SOURCE_CHANGED",
8
+ SOURCE_READY = "SOURCE_READY",
8
9
  TRACK_REPLACED = "TRACK_REPLACED",
9
10
  SCREEN_STATUS = "SCREEN_STATUS",
10
11
  ANIMOJI_STATUS = "ANIMOJI_STATUS"
@@ -22,6 +23,13 @@ interface AudioEffectParams {
22
23
  effects: string[];
23
24
  isPreset?: boolean;
24
25
  }
26
+ /**
27
+ * тип источника (для сервера)
28
+ */
29
+ export declare enum MediaSourceType {
30
+ CAMERA = 1,
31
+ SCREEN = 2
32
+ }
25
33
  export declare class MediaSource extends EventEmitter {
26
34
  /** Стрим с камеры и микрофона пользователя */
27
35
  protected _stream: MediaStream | null;
@@ -90,6 +98,7 @@ export declare class MediaSource extends EventEmitter {
90
98
  video: IVideoDimentions;
91
99
  effect?: IVideoDimentions;
92
100
  }): Promise<void>;
101
+ getCameraVideoTrack(): MediaStreamTrack | null;
93
102
  updateNoiseSuppression(): Promise<void>;
94
103
  videoEffect(effect: IEffect | null): Promise<void>;
95
104
  audioEffect(audioEffectParams: AudioEffectParams | null): Promise<void>;
@@ -5,6 +5,7 @@ import { EnableVideoSuspend } from '../types/EnableVideoSuspend';
5
5
  import { EnableVideoSuspendSuggest } from '../types/EnableVideoSuspendSuggest';
6
6
  import SignalingMessage from '../types/SignalingMessage';
7
7
  import { PerfStatReport } from '../types/PerfStatReporter';
8
+ import { ChangeSimulcast } from '../types/ChangeSimulcast';
8
9
  import { SharingStatReport } from './screenshare/SharingStatReport';
9
10
  import { ParticipantIdRegistry } from './ParticipantIdRegistry';
10
11
  export declare class ProducerCommandSerializationService {
@@ -21,6 +22,7 @@ export declare class ProducerCommandSerializationService {
21
22
  serializeNetworkStatReport(sequenceNumber: number, report: NetworkStatReport): ArrayBuffer;
22
23
  serializeEnableVideoSuspend(sequenceNumber: number, params: EnableVideoSuspend): ArrayBuffer;
23
24
  serializeEnableVideoSuspendSuggest(sequenceNumber: number, params: EnableVideoSuspendSuggest): ArrayBuffer;
25
+ serializeChangeSimulcast(sequenceNumber: number, params: ChangeSimulcast): ArrayBuffer;
24
26
  deserializeCommandResponse(data: BufferSource | Blob): Promise<SignalingMessage | undefined>;
25
27
  private deserializeUpdateDisplayLayoutResponse;
26
28
  private deserializeReportPerfStatResponse;
@@ -35,6 +35,7 @@ export default class ServerTransport extends BaseTransport {
35
35
  private _rtpReceiversByStreamId;
36
36
  private _producerSessionId;
37
37
  private _newAudioShareTrack;
38
+ private _simulcastInfo;
38
39
  constructor(signaling: BaseSignaling, mediaSource: MediaSource, serverSettings: ServerSettings);
39
40
  updateStatisticsInterval(): void;
40
41
  open(observer?: boolean): void;
@@ -44,6 +45,7 @@ export default class ServerTransport extends BaseTransport {
44
45
  allowRestart(): void;
45
46
  updateSettings(settings: ServerSettings): void;
46
47
  setAnimojiTransport(receiver: AnimojiReceiver, sender: AnimojiSender): void;
48
+ onCameraResolutionChanged(): Promise<void>;
47
49
  private _createPerfStatsReporter;
48
50
  private _closeConnection;
49
51
  private static _closeDataChannel;
@@ -72,6 +74,8 @@ export default class ServerTransport extends BaseTransport {
72
74
  private _detectStaleTracks;
73
75
  private _allocateConsumer;
74
76
  private _processOffer;
77
+ private _findFirstSimTransceiver;
78
+ private _setupSimulcastTransceiver;
75
79
  private _acceptProducer;
76
80
  private _handleTracks;
77
81
  private _onSignalingNotification;
@@ -82,4 +86,5 @@ export default class ServerTransport extends BaseTransport {
82
86
  private _onConnectionStateChange;
83
87
  private _onReplacedTrack;
84
88
  getStreamWaitingTimeMs(streamId: string, targetRtpTimestamp: number): number;
89
+ private _changeSimulcastInfo;
85
90
  }
@@ -66,6 +66,7 @@ export declare class Transport extends EventEmitter {
66
66
  getStates(): Record<string, TransportState>;
67
67
  setAnimojiSvg(participantId: ParticipantId, svgData: AnimojiSvgData): void;
68
68
  setAnimojiFill(fill: RGBTuple | string): void;
69
+ onCameraResolutionChanged(): Promise<void>;
69
70
  private _setStates;
70
71
  private _setLocalState;
71
72
  private _onSignalingNotification;
@@ -15,11 +15,12 @@ import MediaModifiers from '../types/MediaModifiers';
15
15
  import MediaSettings from '../types/MediaSettings';
16
16
  import { IAddMovieParams, IUpdateMovieData } from '../types/MovieShare';
17
17
  import MuteStates from '../types/MuteStates';
18
- import { CompositeUserId, ParticipantId } from '../types/Participant';
18
+ import { CompositeUserId, ParticipantId, ParticipantStateData } from '../types/Participant';
19
19
  import ParticipantLayout, { RequestKeyFrame, StopStream } from '../types/ParticipantLayout';
20
20
  import { ParticipantListChunkParameters } from '../types/ParticipantListChunk';
21
21
  import { StreamDescriptionString } from '../types/ParticipantStreamDescription';
22
22
  import { PerfStatReport } from '../types/PerfStatReporter';
23
+ import { ChangeSimulcast } from '../types/ChangeSimulcast';
23
24
  import SignalingMessage, { GetParticipantsSignalingResponse, GetRoomsSignalingResponse, SignalingSuccessResponse } from '../types/SignalingMessage';
24
25
  import { IPublishStreamData, IRecordConfData, IStartStreamData, IStopStreamData } from '../types/Streams';
25
26
  export default class Signaling extends BaseSignaling {
@@ -85,7 +86,7 @@ export default class Signaling extends BaseSignaling {
85
86
  sendSdp(participantId: ParticipantId, sdp: RTCSessionDescriptionInit, extraPayload?: Record<string, any>): Promise<SignalingMessage>;
86
87
  acceptCall(mediaSettings: MediaSettings): Promise<SignalingMessage>;
87
88
  changeMediaSettings(mediaSettings: MediaSettings): Promise<SignalingMessage>;
88
- changeParticipantState(state: Record<string, string>, compositeUserId?: CompositeUserId): Promise<SignalingMessage>;
89
+ changeParticipantState(state: ParticipantStateData, compositeUserId?: CompositeUserId): Promise<SignalingMessage>;
89
90
  putHandsDown(): Promise<SignalingMessage>;
90
91
  addParticipant(participantIds: CompositeUserId[], params?: AddParticipantParams): Promise<SignalingMessage>;
91
92
  removeParticipant(participantId: CompositeUserId, ban?: boolean): Promise<SignalingMessage>;
@@ -132,6 +133,7 @@ export default class Signaling extends BaseSignaling {
132
133
  updateMediaModifiers(mediaModifiers: MediaModifiers): Promise<SignalingMessage>;
133
134
  enableVideoSuspend(enabled: boolean): Promise<SignalingMessage>;
134
135
  enableVideoSuspendSuggest(enabled: boolean): Promise<SignalingMessage>;
136
+ changeSimulcast(changeSimulcast: ChangeSimulcast): Promise<SignalingMessage>;
135
137
  changeOptions(changes: {
136
138
  [key in ConversationOption]?: boolean;
137
139
  }): Promise<SignalingMessage>;
@@ -55,6 +55,7 @@ declare enum SignalingCommandType {
55
55
  GET_HAND_QUEUE = "get-hand-queue",
56
56
  ENABLE_VIDEO_SUSPEND = "enable-video-suspend",
57
57
  ENABLE_VIDEO_SUSPEND_SUGGEST = "enable-video-suspend-suggest",
58
- PUT_HANDS_DOWN = "put-hands-down"
58
+ PUT_HANDS_DOWN = "put-hands-down",
59
+ CHANGE_SIMULCAST = "change-simulcast"
59
60
  }
60
61
  export default SignalingCommandType;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vkontakte/calls-sdk",
3
- "version": "2.8.6-dev.77dd3c9d.0",
3
+ "version": "2.8.6-dev.7a7707c0.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",
@@ -16,7 +16,7 @@
16
16
  "dependencies": {
17
17
  "@vkontakte/calls-audio-effects": "1.2.8",
18
18
  "@vkontakte/calls-video-effects": "2.2.3-beta.5",
19
- "@vkontakte/calls-vmoji": "1.0.10-beta.16",
19
+ "@vkontakte/calls-vmoji": "1.0.10-beta.17",
20
20
  "@vkontakte/libvpx": "2.0.9",
21
21
  "bit-buffer": "0.2.5",
22
22
  "messagepack": "1.1.12",
@@ -843,6 +843,12 @@ export type ParamsObject = {
843
843
  switchVideoAtBadNetwork: boolean;
844
844
  /** включает деградацию фпс для видео с камеры при низком фпс с включенными вирт фонами */
845
845
  enableVideoEffectsFpsDegradation: boolean;
846
+ /**
847
+ * Включить поддержку simulcast на отправке
848
+ *
849
+ * _По умолчанию: `false`_
850
+ */
851
+ simulcast: boolean;
846
852
  };
847
853
  export default abstract class Params {
848
854
  private static _params;
@@ -970,6 +976,8 @@ export default abstract class Params {
970
976
  static getScreenFrameRate(fastScreenShare: boolean): number;
971
977
  static get switchVideoAtBadNetwork(): boolean;
972
978
  static get enableVideoEffectsFpsDegradation(): boolean;
979
+ static get simulcast(): boolean;
980
+ static set simulcast(value: boolean);
973
981
  static toJSON(): {
974
982
  apiKey: string;
975
983
  apiEnv: string;
@@ -0,0 +1,13 @@
1
+ import { type SimulcastInfo as ISimulcastInfo } from '../types/SimulcastInfo';
2
+ import type { VideoBitrateSettings } from '../types/VideoSettings';
3
+ export declare const SIMULCAST_DEFAULT: {
4
+ HEIGHT: number;
5
+ WIDTH: number;
6
+ BITRATE: number;
7
+ };
8
+ export declare const SIMULCAST_SCALABILITY_MODE = "L1T2";
9
+ export declare const MAP_RID_TO_SCALE_RESOLUTION_DOWN_BY: Record<string, number>;
10
+ export declare function isEqualSimulcastInfo(si1: ISimulcastInfo | null, si2: ISimulcastInfo | null): boolean;
11
+ 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;
package/static/Utils.d.ts CHANGED
@@ -61,7 +61,7 @@ declare namespace Utils {
61
61
  [key in T]?: K;
62
62
  }, obj2: {
63
63
  [key in T]?: K;
64
- }): boolean;
64
+ }, deep?: boolean): boolean;
65
65
  function isArraysEquals<T>(arr1: T[], arr2: T[]): boolean;
66
66
  function isEmptyObject(obj: object): boolean;
67
67
  /**
@@ -74,5 +74,6 @@ declare namespace Utils {
74
74
  function objectReduce<R, T extends Object>(obj: T, callback: (acc: R, value: T[keyof T], key: keyof T) => R, initialValue: R): R;
75
75
  const setImmediate: (fn: VoidFunction) => VoidFunction;
76
76
  function isObject(obj: unknown): obj is object;
77
+ function patchSimulcastAnswerSdp(sdp: string, trans: RTCRtpTransceiver, width: number, height: number): string;
77
78
  }
78
79
  export default Utils;
@@ -127,6 +127,7 @@ declare namespace WebRTCUtils {
127
127
  function isBrokenH264Decoder(): boolean;
128
128
  /**
129
129
  * В некоторых браузерах VP9 encoder сломан
130
+ * В симулкасте вп9 енкодер ведет себя некорректно
130
131
  */
131
132
  function isBrokenVP9Encoder(): boolean;
132
133
  /**
@@ -142,6 +143,10 @@ declare namespace WebRTCUtils {
142
143
  * Может ли браузер делать H264 приоритетным
143
144
  */
144
145
  function canPreferH264(): boolean;
146
+ /**
147
+ * Некоторые браузеры (Firefox, Safari) некорректно поддерживают симулкаст
148
+ */
149
+ function isSimulcastSupportedByBrowser(): boolean;
145
150
  /**
146
151
  * Имя операционной системы
147
152
  */
@@ -0,0 +1,6 @@
1
+ import { MediaSourceType } from '../classes/MediaSource';
2
+ import { SimulcastInfo } from './SimulcastInfo';
3
+ export type ChangeSimulcast = {
4
+ mediaSource: MediaSourceType;
5
+ simulcastInfo: SimulcastInfo;
6
+ };
@@ -86,3 +86,12 @@ export interface Participant {
86
86
  export interface IGetParticipantsParameters {
87
87
  externalIds: ExternalId[];
88
88
  }
89
+ export type ParticipantStateDataKey = 'hand' | 'drat';
90
+ export declare enum ParticipantStateDataValue {
91
+ OFF = "0",
92
+ ON = "1"
93
+ }
94
+ /**
95
+ * Список состояний в виде ключ-значение. Максимальная длина ключей и значений - 5 символов. Пустые значения будут пропущены
96
+ */
97
+ export type ParticipantStateData = Record<ParticipantStateDataKey, ParticipantStateDataValue>;
@@ -45,5 +45,6 @@ export interface ICallStatLog extends Pick<CallStatReport, 'call_topology' | 'na
45
45
  concealment_audio_avg_size?: number;
46
46
  video_loss?: number;
47
47
  audio_loss?: number;
48
+ hardware_concurrency?: number;
48
49
  [k: string]: string | number | undefined;
49
50
  }
@@ -0,0 +1,10 @@
1
+ export type SimulcastStreamInfo = {
2
+ rid: string;
3
+ width: number;
4
+ height: number;
5
+ fps: number;
6
+ bitrate: number;
7
+ };
8
+ export type SimulcastInfo = {
9
+ streams: SimulcastStreamInfo[];
10
+ };
@@ -24,7 +24,15 @@ export interface ILocalIceCandidateStat extends IRemoteIceCandidateStat {
24
24
  relayProtocol: string;
25
25
  networkType: RTCNetworkType;
26
26
  }
27
- export type StatRtp = {
27
+ interface StatRtpOutboundVideo {
28
+ frameHeight?: number;
29
+ frameWidth?: number;
30
+ rid?: string;
31
+ framesSent?: number;
32
+ framesPerSecond?: number;
33
+ targetBitrate?: number;
34
+ }
35
+ export interface StatRtp extends StatRtpOutboundVideo {
28
36
  ssrc: number;
29
37
  type: string;
30
38
  kind: string;
@@ -45,8 +53,6 @@ export type StatRtp = {
45
53
  packetLoss?: number;
46
54
  clockRate?: number;
47
55
  mimeType?: string;
48
- frameHeight?: number;
49
- frameWidth?: number;
50
56
  framesDecoded?: number;
51
57
  framesReceived?: number;
52
58
  framesDropped?: number;
@@ -63,7 +69,7 @@ export type StatRtp = {
63
69
  totalFreezesDurationDelta?: number;
64
70
  freezeCount: number;
65
71
  freezeCountDelta?: number;
66
- };
72
+ }
67
73
  export type StatItem = {
68
74
  timestamp: number;
69
75
  transport: StatTransport;
@@ -87,3 +93,4 @@ export type StatResult = {
87
93
  rtps: StatRtp[];
88
94
  };
89
95
  };
96
+ export {};
@@ -25,6 +25,10 @@ export type VideoSettings = {
25
25
  * https://www.w3.org/TR/webrtc-svc/
26
26
  */
27
27
  scalabilityMode: string;
28
+ /**
29
+ * Таблица с битрейтами в зависимости от разрешения
30
+ */
31
+ bitrates?: Record<'generic' | string, VideoBitrateSettings[]>;
28
32
  };
29
33
  export default VideoSettings;
30
34
  export declare function compareVideoSettings(vs1: VideoSettings | null, vs2: VideoSettings | null): boolean;
@@ -38,3 +42,11 @@ export declare enum VideoScalability {
38
42
  L1T2 = "L1T2",
39
43
  L1T3 = "L1T3"
40
44
  }
45
+ /**
46
+ * Настройка битрейта под конкретное разрешение
47
+ * @hidden
48
+ */
49
+ export type VideoBitrateSettings = {
50
+ dimension: number;
51
+ bitrate: number;
52
+ };