@vindral/web-sdk 2.0.14 → 2.0.18

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/index.d.ts CHANGED
@@ -7,6 +7,7 @@ interface BaseCodedSample {
7
7
  timescale: number;
8
8
  duration: number;
9
9
  data: ArrayBuffer;
10
+ compositionTimeOffset?: number;
10
11
  }
11
12
  interface CodedAudioSample extends BaseCodedSample {
12
13
  type: "audio";
@@ -181,6 +182,7 @@ export interface PlaybackSource {
181
182
  playbackRate?: number;
182
183
  isActivated: boolean;
183
184
  readonly seekTime: number;
185
+ readonly paused: boolean;
184
186
  readonly isSeeking: boolean;
185
187
  play(initiator: PlayInitiator): Promise<void>;
186
188
  }
@@ -189,6 +191,7 @@ interface MediaElementOptions {
189
191
  muted: boolean;
190
192
  type: "audio" | "video";
191
193
  logger: Logger;
194
+ poster?: string;
192
195
  }
193
196
  interface NeedsUserInputContext {
194
197
  forAudio: boolean;
@@ -206,7 +209,7 @@ declare class MediaElement extends Emitter<MediaElementEvents> {
206
209
  private _userProvidedMuted;
207
210
  private _userHasProvidedInput;
208
211
  isActivated: boolean;
209
- constructor({ type, autoplay, muted, logger }: MediaElementOptions);
212
+ constructor({ type, autoplay, muted, logger, poster }: MediaElementOptions);
210
213
  attach: (container: HTMLElement) => void;
211
214
  get seekTime(): number;
212
215
  get isSeeking(): boolean;
@@ -281,6 +284,7 @@ declare class PlaybackModule {
281
284
  }
282
285
  declare type Direction = "upgrade" | "downgrade" | "double downgrade" | "reconnect";
283
286
  interface QualityOfServiceConfig {
287
+ cooldownTime: number;
284
288
  maxBufferingEvents: {
285
289
  last10Seconds: number;
286
290
  last30Seconds: number;
@@ -300,6 +304,9 @@ interface QualityOfServiceConfig {
300
304
  interface AdaptivityEvents {
301
305
  ["adapt level"]: Readonly<Direction>;
302
306
  }
307
+ interface AdaptivityStatistics {
308
+ isAbrEnabled: boolean;
309
+ }
303
310
  interface QualityOfServiceSource {
304
311
  getMetrics(): Metrics;
305
312
  getLevelStats(level: RenditionLevel): PerLevelStats | undefined;
@@ -317,7 +324,6 @@ declare class AdaptivityModule {
317
324
  private logger;
318
325
  private isSuspended;
319
326
  private lastAdaptTime;
320
- private cooldownTime;
321
327
  isEnabled: boolean;
322
328
  constructor(emitter: Emitter<AdaptivityEvents>, logger: Logger, qualityOfServiceSource: QualityOfServiceSource, config: Partial<QualityOfServiceConfig>);
323
329
  static create: (emitter: Emitter<AdaptivityEvents>, logger: Logger, qualityOfServiceSource: QualityOfServiceSource, config?: Partial<QualityOfServiceConfig>) => AdaptivityModule;
@@ -326,6 +332,7 @@ declare class AdaptivityModule {
326
332
  suspend: () => void;
327
333
  unsuspend: () => void;
328
334
  reset: () => void;
335
+ getStatistics: () => AdaptivityStatistics;
329
336
  isQoSOk: (renditionLevel: RenditionLevel) => boolean;
330
337
  private onBufferState;
331
338
  private onAdaptedLevel;
@@ -368,6 +375,7 @@ declare class AudioPlayerModule {
368
375
  get isSeeking(): boolean;
369
376
  get muted(): boolean;
370
377
  set muted(muted: boolean);
378
+ get paused(): boolean;
371
379
  get currentTime(): number;
372
380
  set currentTime(currentTime: number);
373
381
  constructor(emitter: Emitter<AudioPlayerModuleListeners, AudioPlayerModuleEvents>, logger: Logger, clockSource: ClockSource, muted: boolean);
@@ -441,6 +449,7 @@ interface ConnectionStatistics {
441
449
  estimatedBandwidth: number;
442
450
  edgeUrl?: string;
443
451
  connectCount: number;
452
+ connectionAttemptCount: number;
444
453
  }
445
454
  declare class ConnectionModule {
446
455
  private static PING_INTERVAL;
@@ -480,7 +489,7 @@ declare class ConnectionModule {
480
489
  private onTransportChange;
481
490
  disconnect: (reason?: string) => void;
482
491
  reconnect: (reason: string) => void;
483
- private cleanupOnDisconnect;
492
+ private cleanupPingIntervals;
484
493
  private sendPing;
485
494
  }
486
495
  interface Size {
@@ -803,6 +812,9 @@ interface MseModuleListeners {
803
812
  ["init segment"]: Readonly<InitSegment>;
804
813
  ["coded sample"]: Readonly<CodedSample>;
805
814
  }
815
+ interface MseModuleStatistics {
816
+ quotaErrorCount: number;
817
+ }
806
818
  declare class MseModule {
807
819
  private logger;
808
820
  private timers;
@@ -814,9 +826,11 @@ declare class MseModule {
814
826
  private autoRecoverFromMediaErrors;
815
827
  private pendingSamples;
816
828
  private isWorkingOnPendingSamples;
829
+ private quotaErrorCount;
817
830
  constructor(logger: Logger, emitter: Emitter<MseModuleListeners, MseModuleEvents>, mediaElement: HTMLMediaElement, tracks: Track[]);
818
831
  static create: (logger: Logger, emitter: Emitter<MseModuleListeners, MseModuleEvents>, mediaElement: HTMLMediaElement, tracks: Track[]) => Promise<MseModule>;
819
832
  unload: () => void;
833
+ getStatistics: () => MseModuleStatistics;
820
834
  private open;
821
835
  getBuffer: (type: Type) => TimeRange[];
822
836
  init: (initSegment: Readonly<InitSegment>) => void;
@@ -868,6 +882,7 @@ interface QualityOfServiceModuleStatistics {
868
882
  };
869
883
  }
870
884
  declare class QualityOfServiceModule {
885
+ private readonly minBufferFullnessLengthForRegression;
871
886
  private logger;
872
887
  private emitter;
873
888
  private timers;
@@ -923,12 +938,14 @@ declare class SubscriptionModule {
923
938
  private currentSubscription;
924
939
  private _isSwitchingSubscription;
925
940
  private pendingSubscriptionTimeoutId?;
941
+ private burstMs;
926
942
  private constructor();
927
943
  unload: () => void;
928
944
  static create: (logger: Logger, emitter: Emitter<SubscriptionModuleListeners>, subscription: Subscription) => SubscriptionModule;
929
945
  isSwitchingSubscription: () => boolean;
930
946
  getTargetSubscription: () => Subscription;
931
947
  getCurrentSubscription: () => Subscription;
948
+ enableBurst: (bufferTimeMs: number) => void;
932
949
  setSize: (size: Readonly<Size>) => void;
933
950
  setVideoConstraint: (constraint: VideoConstraint) => void;
934
951
  setAudioConstraint: (constraint: AudioConstraint) => void;
@@ -938,6 +955,7 @@ declare class SubscriptionModule {
938
955
  setLanguage: (language: string | undefined) => void;
939
956
  setVideoCodec: (videoCodec: VideoCodec | undefined) => void;
940
957
  setAudioCodec: (audioCodec: AudioCodec | undefined) => void;
958
+ private setBurst;
941
959
  private onSubscriptionChanged;
942
960
  private scheduleSubscriptionChange;
943
961
  }
@@ -964,8 +982,9 @@ interface BufferSource {
964
982
  interface SyncModuleStatistics {
965
983
  drift: number | undefined;
966
984
  driftAdjustmentCount: number;
967
- playbackRateAdjustmentCount: number;
985
+ timeshiftDriftAdjustmentCount: number;
968
986
  discardedTimeInfoCount: number;
987
+ seekTime: number;
969
988
  }
970
989
  declare class SyncModule {
971
990
  private emitter;
@@ -973,25 +992,29 @@ declare class SyncModule {
973
992
  private playbackSource;
974
993
  private bufferSource;
975
994
  private lastSeekTime;
976
- readonly seekCooldownTime = 5000;
995
+ readonly seekCooldownTime = 1000;
996
+ readonly seekTimeoutTime = 5000;
977
997
  readonly syncMaxBehind: number;
978
998
  readonly syncMaxBehindMultiplierStep = 1;
979
- readonly syncMaxBehindIncreaseEvery = 5;
980
- readonly syncMaxBehindMaximumAllowed = 1000;
999
+ readonly syncMaxBehindIncreaseEvery = 3;
1000
+ readonly syncMaxBehindMaximumAllowed = 2000;
981
1001
  syncMaxBehindMultiplier: number;
982
1002
  readonly syncMaxAhead = 150;
983
- readonly playbackRateSyncConstants: {
984
- readonly enabled: true;
985
- readonly maxBehind: 1000;
986
- readonly catchupRate: 1.05;
987
- readonly slowdownRate: 0.95;
1003
+ timeshiftSync: {
1004
+ enabled: boolean;
1005
+ maxBehind: number;
1006
+ multiplier: number;
1007
+ maxBehindAllowed: number;
1008
+ overshoot: number;
1009
+ minOvershootAllowed: number;
1010
+ maxOvershootAllowed: number;
988
1011
  };
989
- readonly maxTimeSyncDifferenceTolerance = 20;
1012
+ readonly maxTimeSyncDifferenceTolerance = 150;
990
1013
  private timers;
991
1014
  private rtt;
992
1015
  private channelSyncInfo;
993
1016
  private driftAdjustmentsCount;
994
- private playbackRateAdjustmentCount;
1017
+ private timeshiftDriftAdjustmentCount;
995
1018
  private timestampOffset?;
996
1019
  private currentChannelId?;
997
1020
  private highestSeenTimestamps;
@@ -1004,34 +1027,38 @@ declare class SyncModule {
1004
1027
  suspend: () => void;
1005
1028
  unsuspend: () => void;
1006
1029
  activateSyncAdjustments: () => void;
1007
- static create: (emitter: Emitter<SyncModuleListeners, SyncModuleEvents>, logger: Logger, playbackSource: PlaybackSource, bufferSource: BufferSource, syncMaxBehind: number) => SyncModule;
1030
+ static create: (emitter: Emitter<SyncModuleListeners, SyncModuleEvents>, logger: Logger, playbackSource: PlaybackSource, bufferSource: BufferSource, isTimeshiftSyncEnabled: boolean) => SyncModule;
1008
1031
  reset: () => void;
1009
1032
  getTimeshiftOffset: () => number;
1010
1033
  getCurrentChannelId: () => string | undefined;
1011
1034
  updateChannelSyncInfo(channelId: string, syncInfo: SyncInfo): void;
1035
+ private tryApplySyncInfo;
1012
1036
  getLiveEdgeTime: (channelId: string) => number | undefined;
1013
1037
  getLiveEdgeTimeLatencyAdjusted: (channelId: string) => number | undefined;
1014
1038
  getWallclockTime: (channelId: string) => number | undefined;
1015
1039
  getWallclockTimeLatencyAdjusted: (channelId: string) => number | undefined;
1016
1040
  get serverCurrentTime(): number;
1041
+ get channelCurrentTime(): number;
1017
1042
  processSample: <T extends SyncSample>(sample: T) => T;
1018
1043
  getStatistics: () => SyncModuleStatistics;
1019
1044
  get drift(): number | undefined;
1020
1045
  private updateRtt;
1021
1046
  isPlaybackSourceReadyToSeek: () => boolean;
1047
+ private isSeeking;
1022
1048
  private isAllowedToSync;
1023
1049
  private isSeekCooldownExpired;
1050
+ private isSeekTimeoutExpired;
1051
+ private currentTimeshiftMaxBehind;
1024
1052
  private currentSyncMaxBehind;
1053
+ private currentSyncMaxAhead;
1054
+ private tryTimeshiftSync;
1025
1055
  private onSync;
1026
- playbackRateSync: (drift: number, playbackRate: number) => [
1027
- boolean,
1028
- number
1029
- ];
1030
1056
  }
1031
1057
  declare const defaultOptions: {
1032
1058
  sizeBasedResolutionCapEnabled: boolean;
1033
1059
  pictureInPictureEnabled: boolean;
1034
1060
  abrEnabled: boolean;
1061
+ burstEnabled: boolean;
1035
1062
  mseEnabled: boolean;
1036
1063
  mseOpusEnabled: boolean;
1037
1064
  muted: boolean;
@@ -1043,6 +1070,7 @@ declare const defaultOptions: {
1043
1070
  maxAudioBitRate: number;
1044
1071
  tags: string[];
1045
1072
  media: Media;
1073
+ posterEnabled: boolean;
1046
1074
  reconnectHandler: (state: ReconnectState) => Promise<boolean> | boolean;
1047
1075
  advanced: {
1048
1076
  wasmDecodingConstraint: Partial<VideoConstraint>;
@@ -1117,6 +1145,7 @@ export declare class Vindral extends Emitter<PublicVindralEvents> {
1117
1145
  get serverEdgeTime(): number | undefined;
1118
1146
  get serverWallclockTime(): number | undefined;
1119
1147
  get currentTime(): number;
1148
+ get channelCurrentTime(): number;
1120
1149
  get targetBufferTime(): number;
1121
1150
  set targetBufferTime(bufferTimeMs: number);
1122
1151
  get playbackLatency(): number | undefined;
@@ -1145,6 +1174,7 @@ export declare class Vindral extends Emitter<PublicVindralEvents> {
1145
1174
  get timeSpentBuffering(): number;
1146
1175
  get timeActive(): number;
1147
1176
  getOptions: () => Options & typeof defaultOptions;
1177
+ getThumbnailUrl: () => string;
1148
1178
  updateAuthenticationToken: (token: string) => void;
1149
1179
  connect: () => void;
1150
1180
  getCastOptions: () => Options;
@@ -1203,6 +1233,7 @@ declare class TelemetryModule {
1203
1233
  private unsentLines;
1204
1234
  private retries;
1205
1235
  private errorCount;
1236
+ private statsCount;
1206
1237
  private constructor();
1207
1238
  unload: () => void;
1208
1239
  static create: (logger: Logger, emitter: Emitter<TelemetryModuleListeners, unknown>, options: TelemetryModuleOptions, statisticsSource: TelemetryStatisticsSource) => TelemetryModule;
@@ -1306,12 +1337,14 @@ export interface Options {
1306
1337
  maxBufferTime?: number;
1307
1338
  sizeBasedResolutionCapEnabled?: boolean;
1308
1339
  pictureInPictureEnabled?: boolean;
1340
+ burstEnabled?: boolean;
1309
1341
  mseEnabled?: boolean;
1310
1342
  mseOpusEnabled?: boolean;
1311
1343
  abrEnabled?: boolean;
1312
1344
  maxSize?: Size;
1313
1345
  maxAudioBitRate?: number;
1314
1346
  maxVideoBitRate?: number;
1347
+ posterEnabled?: boolean;
1315
1348
  muted?: boolean;
1316
1349
  reconnectHandler?: (state: ReconnectState) => Promise<boolean> | boolean;
1317
1350
  tags?: string[];
@@ -1372,12 +1405,16 @@ interface AudioRenditionProps {
1372
1405
  channels: number;
1373
1406
  sampleRate: number;
1374
1407
  }
1408
+ interface CodecProps {
1409
+ codec: Codec;
1410
+ codecString?: string;
1411
+ }
1375
1412
  export declare type VideoRendition = VideoRenditionProps & RenditionProps;
1376
1413
  export declare type AudioRendition = AudioRenditionProps & RenditionProps;
1377
1414
  export declare type Rendition = VideoRendition | AudioRendition;
1378
1415
  export declare const isVideoRendition: (rendition: Readonly<Rendition>) => rendition is VideoRendition;
1379
1416
  export declare const isAudioRendition: (rendition: Readonly<Rendition>) => rendition is AudioRendition;
1380
- export declare const getMimeType: (rendition: Readonly<Rendition>) => string;
1417
+ export declare const getMimeType: (rendition: Readonly<CodecProps>) => string;
1381
1418
  interface AudioConstraint {
1382
1419
  bitRate: number;
1383
1420
  codec?: AudioCodec;
@@ -1396,6 +1433,7 @@ interface Subscription {
1396
1433
  channelId: string;
1397
1434
  video: VideoConstraint;
1398
1435
  audio: AudioConstraint;
1436
+ burstMs?: number;
1399
1437
  meta?: Record<string, string>;
1400
1438
  initiator?: SubscriptionInitiator;
1401
1439
  }
@@ -1531,6 +1569,7 @@ export declare class CastSender extends Emitter<CastSenderEvents> {
1531
1569
  init: () => Promise<void>;
1532
1570
  start: () => Promise<void>;
1533
1571
  stop: () => void;
1572
+ getReceiverName: () => string | undefined;
1534
1573
  private onGCastApiAvailable;
1535
1574
  private send;
1536
1575
  private onMessage;
@@ -1538,7 +1577,6 @@ export declare class CastSender extends Emitter<CastSenderEvents> {
1538
1577
  private onSessionStateChanged;
1539
1578
  private getInstance;
1540
1579
  private getSession;
1541
- private getReceiverName;
1542
1580
  private castLibrariesAdded;
1543
1581
  private verifyCastLibraries;
1544
1582
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vindral/web-sdk",
3
- "version": "2.0.14",
3
+ "version": "2.0.18",
4
4
  "homepage": "https://vindral.com",
5
5
  "description": "Web SDK for viewing Vindral streams",
6
6
  "license": "SEE LICENSE IN https://www.vindral.com/terms-conditions",