@vindral/web-sdk 2.0.12 → 2.0.16

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/README.md CHANGED
@@ -60,10 +60,10 @@ This example attaches a player to an element with the id `#root`. The player wil
60
60
 
61
61
  The example assumes that there is a html page that loads this script that has at least a div with `id="#root"`.
62
62
 
63
- ```typescript
63
+ ```javascript
64
64
  import { Player } from "@vindral/web-sdk"
65
65
 
66
- const root = document.querySelector<HTMLElement>("#root")
66
+ const root = document.querySelector("#root")
67
67
 
68
68
  const player = new Player({
69
69
  url: "https://lb.cdn.vindral.com",
@@ -85,12 +85,12 @@ The Core SDK is the lowest level method to integrate that provides only a video
85
85
 
86
86
  The example assumes that there is a html page that loads this script that has at least a div with `id="#root"`, `id="#playback-state"` and a button with `id="#activate-audio-button"`.
87
87
 
88
- ```typescript
88
+ ```javascript
89
89
  import { Vindral } from "@vindral/web-sdk"
90
90
 
91
- const root = document.querySelector<HTMLElement>("#root")!
92
- const button = document.querySelector<HTMLElement>("#activate-audio-button")!
93
- const playbackState = document.querySelector<HTMLElement>("#playback-state")!
91
+ const root = document.querySelector("#root")!
92
+ const button = document.querySelector("#activate-audio-button")!
93
+ const playbackState = document.querySelector("#playback-state")!
94
94
 
95
95
  button.style.display = "none"
96
96
 
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";
@@ -179,7 +180,9 @@ export interface PlaybackSource {
179
180
  muted: boolean;
180
181
  currentTime: number;
181
182
  playbackRate?: number;
183
+ isActivated: boolean;
182
184
  readonly seekTime: number;
185
+ readonly paused: boolean;
183
186
  readonly isSeeking: boolean;
184
187
  play(initiator: PlayInitiator): Promise<void>;
185
188
  }
@@ -204,6 +207,7 @@ declare class MediaElement extends Emitter<MediaElementEvents> {
204
207
  private seekStartTime?;
205
208
  private _userProvidedMuted;
206
209
  private _userHasProvidedInput;
210
+ isActivated: boolean;
207
211
  constructor({ type, autoplay, muted, logger }: MediaElementOptions);
208
212
  attach: (container: HTMLElement) => void;
209
213
  get seekTime(): number;
@@ -359,12 +363,14 @@ declare class AudioPlayerModule {
359
363
  private clockDelta?;
360
364
  private startTimeIsInvalidated;
361
365
  private lastSampleTimestamp;
366
+ isActivated: boolean;
362
367
  get volume(): number;
363
368
  set volume(volume: number);
364
369
  get seekTime(): number;
365
370
  get isSeeking(): boolean;
366
371
  get muted(): boolean;
367
372
  set muted(muted: boolean);
373
+ get paused(): boolean;
368
374
  get currentTime(): number;
369
375
  set currentTime(currentTime: number);
370
376
  constructor(emitter: Emitter<AudioPlayerModuleListeners, AudioPlayerModuleEvents>, logger: Logger, clockSource: ClockSource, muted: boolean);
@@ -477,6 +483,7 @@ declare class ConnectionModule {
477
483
  private onTransportChange;
478
484
  disconnect: (reason?: string) => void;
479
485
  reconnect: (reason: string) => void;
486
+ private cleanupPingIntervals;
480
487
  private sendPing;
481
488
  }
482
489
  interface Size {
@@ -724,7 +731,6 @@ declare class DocumentStateModule implements DocumentState {
724
731
  private onOffline;
725
732
  private onPageHide;
726
733
  private onVisibilityChanged;
727
- private onFocusChange;
728
734
  private setIsActive;
729
735
  }
730
736
  interface IncomingDataModuleListeners {
@@ -773,19 +779,23 @@ declare class LoggerModule {
773
779
  interface MetadataModuleEvents {
774
780
  ["metadata"]: Readonly<Metadata>;
775
781
  }
776
- interface MetadataModuleListeners {
777
- ["buffer state"]: Readonly<BufferState>;
782
+ interface TimeSource {
783
+ readonly drift: number | undefined;
784
+ readonly serverCurrentTime: number;
778
785
  }
779
786
  declare class MetadataModule {
780
787
  private static METADATA_TIMEOUT;
788
+ private static METADATA_CHECK_INTERVAL;
781
789
  private logger;
782
790
  private emitter;
783
791
  private waitingMetadata;
784
792
  private isTriggered;
785
- constructor(emitter: Emitter<MetadataModuleListeners, MetadataModuleEvents>, logger: Logger);
793
+ private timeSource;
794
+ private timers;
795
+ constructor(emitter: Emitter<unknown, MetadataModuleEvents>, logger: Logger, timeSource: TimeSource);
786
796
  load: () => void;
787
797
  unload: () => void;
788
- static create: (emitter: Emitter<MetadataModuleListeners, MetadataModuleEvents>, logger: Logger) => MetadataModule;
798
+ static create: (emitter: Emitter<unknown, MetadataModuleEvents>, logger: Logger, timeSource: TimeSource) => MetadataModule;
789
799
  addMetadata: (metadata: Metadata) => void;
790
800
  private onBufferedStateChanged;
791
801
  }
@@ -916,12 +926,14 @@ declare class SubscriptionModule {
916
926
  private currentSubscription;
917
927
  private _isSwitchingSubscription;
918
928
  private pendingSubscriptionTimeoutId?;
929
+ private burstMs;
919
930
  private constructor();
920
931
  unload: () => void;
921
932
  static create: (logger: Logger, emitter: Emitter<SubscriptionModuleListeners>, subscription: Subscription) => SubscriptionModule;
922
933
  isSwitchingSubscription: () => boolean;
923
934
  getTargetSubscription: () => Subscription;
924
935
  getCurrentSubscription: () => Subscription;
936
+ enableBurst: (bufferTimeMs: number) => void;
925
937
  setSize: (size: Readonly<Size>) => void;
926
938
  setVideoConstraint: (constraint: VideoConstraint) => void;
927
939
  setAudioConstraint: (constraint: AudioConstraint) => void;
@@ -931,6 +943,7 @@ declare class SubscriptionModule {
931
943
  setLanguage: (language: string | undefined) => void;
932
944
  setVideoCodec: (videoCodec: VideoCodec | undefined) => void;
933
945
  setAudioCodec: (audioCodec: AudioCodec | undefined) => void;
946
+ private setBurst;
934
947
  private onSubscriptionChanged;
935
948
  private scheduleSubscriptionChange;
936
949
  }
@@ -957,8 +970,9 @@ interface BufferSource {
957
970
  interface SyncModuleStatistics {
958
971
  drift: number | undefined;
959
972
  driftAdjustmentCount: number;
960
- playbackRateAdjustmentCount: number;
973
+ timeshiftDriftAdjustmentCount: number;
961
974
  discardedTimeInfoCount: number;
975
+ seekTime: number;
962
976
  }
963
977
  declare class SyncModule {
964
978
  private emitter;
@@ -966,25 +980,29 @@ declare class SyncModule {
966
980
  private playbackSource;
967
981
  private bufferSource;
968
982
  private lastSeekTime;
969
- readonly seekCooldownTime = 5000;
983
+ readonly seekCooldownTime = 1000;
984
+ readonly seekTimeoutTime = 3000;
970
985
  readonly syncMaxBehind: number;
971
986
  readonly syncMaxBehindMultiplierStep = 1;
972
987
  readonly syncMaxBehindIncreaseEvery = 5;
973
988
  readonly syncMaxBehindMaximumAllowed = 1000;
974
989
  syncMaxBehindMultiplier: number;
975
990
  readonly syncMaxAhead = 150;
976
- readonly playbackRateSyncConstants: {
977
- readonly enabled: true;
978
- readonly maxBehind: 1000;
979
- readonly catchupRate: 1.05;
980
- readonly slowdownRate: 0.95;
991
+ timeshiftSync: {
992
+ enabled: boolean;
993
+ maxBehind: number;
994
+ multiplier: number;
995
+ maxBehindAllowed: number;
996
+ overshoot: number;
997
+ minOvershootAllowed: number;
998
+ maxOvershootAllowed: number;
981
999
  };
982
- readonly maxTimeSyncDifferenceTolerance = 20;
1000
+ readonly maxTimeSyncDifferenceTolerance = 150;
983
1001
  private timers;
984
1002
  private rtt;
985
1003
  private channelSyncInfo;
986
1004
  private driftAdjustmentsCount;
987
- private playbackRateAdjustmentCount;
1005
+ private timeshiftDriftAdjustmentCount;
988
1006
  private timestampOffset?;
989
1007
  private currentChannelId?;
990
1008
  private highestSeenTimestamps;
@@ -997,11 +1015,12 @@ declare class SyncModule {
997
1015
  suspend: () => void;
998
1016
  unsuspend: () => void;
999
1017
  activateSyncAdjustments: () => void;
1000
- static create: (emitter: Emitter<SyncModuleListeners, SyncModuleEvents>, logger: Logger, playbackSource: PlaybackSource, bufferSource: BufferSource, syncMaxBehind: number) => SyncModule;
1018
+ static create: (emitter: Emitter<SyncModuleListeners, SyncModuleEvents>, logger: Logger, playbackSource: PlaybackSource, bufferSource: BufferSource, isTimeshiftSyncEnabled: boolean) => SyncModule;
1001
1019
  reset: () => void;
1002
1020
  getTimeshiftOffset: () => number;
1003
1021
  getCurrentChannelId: () => string | undefined;
1004
1022
  updateChannelSyncInfo(channelId: string, syncInfo: SyncInfo): void;
1023
+ private tryApplySyncInfo;
1005
1024
  getLiveEdgeTime: (channelId: string) => number | undefined;
1006
1025
  getLiveEdgeTimeLatencyAdjusted: (channelId: string) => number | undefined;
1007
1026
  getWallclockTime: (channelId: string) => number | undefined;
@@ -1012,19 +1031,21 @@ declare class SyncModule {
1012
1031
  get drift(): number | undefined;
1013
1032
  private updateRtt;
1014
1033
  isPlaybackSourceReadyToSeek: () => boolean;
1034
+ private isSeeking;
1015
1035
  private isAllowedToSync;
1016
1036
  private isSeekCooldownExpired;
1037
+ private isSeekTimeoutExpired;
1038
+ private currentTimeshiftMaxBehind;
1017
1039
  private currentSyncMaxBehind;
1040
+ private currentSyncMaxAhead;
1041
+ private tryTimeshiftSync;
1018
1042
  private onSync;
1019
- playbackRateSync: (drift: number, playbackRate: number) => [
1020
- boolean,
1021
- number
1022
- ];
1023
1043
  }
1024
1044
  declare const defaultOptions: {
1025
1045
  sizeBasedResolutionCapEnabled: boolean;
1026
1046
  pictureInPictureEnabled: boolean;
1027
1047
  abrEnabled: boolean;
1048
+ burstEnabled: boolean;
1028
1049
  mseEnabled: boolean;
1029
1050
  mseOpusEnabled: boolean;
1030
1051
  muted: boolean;
@@ -1299,6 +1320,7 @@ export interface Options {
1299
1320
  maxBufferTime?: number;
1300
1321
  sizeBasedResolutionCapEnabled?: boolean;
1301
1322
  pictureInPictureEnabled?: boolean;
1323
+ burstEnabled?: boolean;
1302
1324
  mseEnabled?: boolean;
1303
1325
  mseOpusEnabled?: boolean;
1304
1326
  abrEnabled?: boolean;
@@ -1389,6 +1411,7 @@ interface Subscription {
1389
1411
  channelId: string;
1390
1412
  video: VideoConstraint;
1391
1413
  audio: AudioConstraint;
1414
+ burstMs?: number;
1392
1415
  meta?: Record<string, string>;
1393
1416
  initiator?: SubscriptionInitiator;
1394
1417
  }
@@ -1524,6 +1547,7 @@ export declare class CastSender extends Emitter<CastSenderEvents> {
1524
1547
  init: () => Promise<void>;
1525
1548
  start: () => Promise<void>;
1526
1549
  stop: () => void;
1550
+ getReceiverName: () => string | undefined;
1527
1551
  private onGCastApiAvailable;
1528
1552
  private send;
1529
1553
  private onMessage;
@@ -1531,7 +1555,6 @@ export declare class CastSender extends Emitter<CastSenderEvents> {
1531
1555
  private onSessionStateChanged;
1532
1556
  private getInstance;
1533
1557
  private getSession;
1534
- private getReceiverName;
1535
1558
  private castLibrariesAdded;
1536
1559
  private verifyCastLibraries;
1537
1560
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vindral/web-sdk",
3
- "version": "2.0.12",
3
+ "version": "2.0.16",
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",