boss-web-player-sdk 1.1.11 → 1.1.13

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/dist/index.d.ts CHANGED
@@ -15,6 +15,7 @@ export declare interface AnalyticsEvent {
15
15
  speed?: number;
16
16
  errorMessage?: string;
17
17
  errorCode?: number;
18
+ isRecoverable?: boolean;
18
19
  sessionId?: string;
19
20
  videoId?: string;
20
21
  deviceType?: string;
@@ -35,6 +36,7 @@ export declare interface AnalyticsEvent {
35
36
  audioTrack?: string;
36
37
  subtitleLanguage?: string;
37
38
  subtitleEnabled?: boolean;
39
+ isAutoSwitch?: boolean;
38
40
  }
39
41
 
40
42
  declare class AnalyticsModule {
@@ -100,7 +102,7 @@ declare interface AnalyticsSessionSnapshot {
100
102
  milestonesHit: string[];
101
103
  }
102
104
 
103
- export declare function BossVideoPlayer({ playerKey, src, subtitles, licenseKey, themeColor, firebaseConfig, proxyDomains, apiBaseUrl, adTrackingUrl, overlayAdUrl, title, watermark, autoplay, muted, autoFullscreen, enableControls, enableSkipAd, skipAdAfterSeconds, chaptersDisplayMode, volumeControlType, subtitleStyle, drmConfig, onAnalyticsEvent, onKeyMomentsLoaded, initialTime, onTimeUpdate, }: BossVideoPlayerProps): JSX.Element;
105
+ export declare function BossVideoPlayer({ playerKey, src, subtitles, licenseKey, themeColor, firebaseConfig, proxyDomains, apiBaseUrl, adTrackingUrl, overlayAdUrl, title, watermark, autoplay, muted, autoFullscreen, enableControls, enableSkipAd, skipAdAfterSeconds, chaptersDisplayMode, volumeControlType, subtitleStyle, drmConfig, onAnalyticsEvent, delegate, onKeyMomentsLoaded, initialTime, onTimeUpdate, }: BossVideoPlayerProps): JSX.Element;
104
106
 
105
107
  export declare interface BossVideoPlayerProps {
106
108
  /** Player key from the GoBOSS dashboard — identifies your tenant. */
@@ -154,6 +156,13 @@ export declare interface BossVideoPlayerProps {
154
156
  drmConfig?: DRMConfig;
155
157
  /** Called for every analytics event — lets consumers add custom tracking. */
156
158
  onAnalyticsEvent?: (event: AnalyticsEvent) => void;
159
+ /**
160
+ * Typed per-event callbacks (playerDidStartPlaying, playerDidPause, …) that
161
+ * receive only the arguments relevant to each event. Prefer this over
162
+ * `onAnalyticsEvent` for analytics, logging, and business logic; implement
163
+ * only the methods you need.
164
+ */
165
+ delegate?: PlayerDelegate;
157
166
  /** Called when chapter/key-moment data is parsed from the stream. */
158
167
  onKeyMomentsLoaded?: (keyMoments: Chapter[]) => void;
159
168
  /** Seek to this position (in seconds) when the video is ready. Use for resume-playback. */
@@ -177,6 +186,11 @@ declare class CastingModule {
177
186
  deviceName: string;
178
187
  };
179
188
  getRemoteState(): RemoteCastState | null;
189
+ /**
190
+ * Derives the Cast MediaInfo content type from the stream URL so HLS/DASH manifests
191
+ * aren't sent to the receiver mislabeled as video/mp4, which causes load failures.
192
+ */
193
+ private getContentType;
180
194
  /**
181
195
  * Prompts the native Google Cast device picker overlay, then loads media on the remote device.
182
196
  * The caller is responsible for pausing local playback before/after this resolves.
@@ -362,6 +376,62 @@ declare class KeyMomentsModule {
362
376
  onChapterChange(callback: (chapter: KeyMoment | null, index: number) => void): void;
363
377
  }
364
378
 
379
+ /**
380
+ * Typed per-event callbacks for tenant applications.
381
+ *
382
+ * Unlike `AnalyticsCallback` (which receives the full analytics event for every
383
+ * event type), each delegate method receives only the arguments relevant to that
384
+ * event — clean signatures for logging, custom UI, and business logic.
385
+ *
386
+ * All methods are optional; implement only the ones you need.
387
+ *
388
+ * Conventions:
389
+ * - Arguments named `*Time` / `*At` are playback positions in seconds.
390
+ * - `watchDuration` and `seekDuration` are wall-clock seconds.
391
+ * - `from*` arguments are `undefined` when there was no previous value
392
+ * (e.g. the first quality selection after load).
393
+ */
394
+ export declare interface PlayerDelegate {
395
+ /** Playback started for the first time (or restarted after finishing). */
396
+ playerDidStartPlaying?(startTime: number, autoplay: boolean): void;
397
+ /** Playback resumed after a pause. */
398
+ playerDidResumePlaying?(resumedAt: number): void;
399
+ /** Playback paused by the user (not fired for the implicit pause at end of stream). */
400
+ playerDidPause?(pausedAt: number): void;
401
+ /** Playback reached the end of the stream. */
402
+ playerDidFinishPlaying?(finishedAt: number, watchDuration: number): void;
403
+ /** The player was torn down (unmount / tab close) before playback finished. Fired at most once. */
404
+ playerDidDismiss?(dismissedAt: number, watchDuration: number): void;
405
+ /** A seek started (scrubber, ±10s skip). Fired once per seek gesture. */
406
+ playerDidStartSeeking?(fromTime: number): void;
407
+ /** The seek landed. `fromTime` is where the gesture began, `seekDuration` is wall-clock seconds it took. */
408
+ playerDidFinishSeeking?(fromTime: number, toTime: number, seekDuration: number): void;
409
+ /** Playback position update — fires on every native `timeupdate` (roughly 4×/second). */
410
+ playerDidUpdateCurrentTime?(currentTime: number, duration: number): void;
411
+ playerDidStartBuffering?(startedAt: number): void;
412
+ playerDidFinishBuffering?(endedAt: number): void;
413
+ /** Rendition changed. `isAutoSwitch` is true when ABR picked the level, false for a manual selection. */
414
+ playerDidChangeQuality?(fromQuality: string | undefined, toQuality: string, isAutoSwitch: boolean): void;
415
+ /** Subtitle track changed (languages, e.g. 'en' → 'fr'). */
416
+ playerDidChangeSubtitle?(fromSubtitle: string | undefined, toSubtitle: string): void;
417
+ /** Subtitles were turned off. `disabledSubtitle` is the language that was active. */
418
+ playerDidDisableSubtitle?(disabledSubtitle: string | undefined): void;
419
+ /** Audio track changed (track labels). */
420
+ playerDidChangeAudioTrack?(fromAudioTrack: string | undefined, toAudioTrack: string): void;
421
+ playerDidChangePlaybackSpeed?(fromSpeed: number, toSpeed: number): void;
422
+ /** `orientation` is the current `screen.orientation.type` (e.g. 'landscape-primary') when available. */
423
+ playerDidEnterFullscreen?(orientation?: string): void;
424
+ playerDidExitFullscreen?(orientation?: string): void;
425
+ /** A key moment was selected. `fromTime`/`toTime` are the chapter's start/end. */
426
+ playerDidSelectKeyMoment?(chapterId: string | undefined, chapterTitle: string, fromTime: number, toTime: number): void;
427
+ playerDidEnterPictureInPicture?(enteredAt?: number): void;
428
+ playerDidExitPictureInPicture?(exitedAt?: number): void;
429
+ /** A media/playback error. `isRecoverable` is true when the player will attempt recovery itself. */
430
+ playerDidEncounterPlaybackError?(errorCode: string, message: string, isRecoverable: boolean): void;
431
+ /** A network/CDN error. `statusCode` is the HTTP status when known, 0 otherwise. */
432
+ playerDidEncounterNetworkError?(statusCode: number, message: string, isRecoverable: boolean): void;
433
+ }
434
+
365
435
  /**
366
436
  * In-session telemetry payload for POST /api/player/sdk/events.
367
437
  * `eventType`, `sessionId` and `currentTime` are always required; `videoId` and any
@@ -663,6 +733,22 @@ export declare class VideoPlayerSDK {
663
733
  private parseAdBreaksFromFragments;
664
734
  private parseAdBreaksFromPlaylist;
665
735
  private isTimeInAdBreak;
736
+ /**
737
+ * Syncs isAdBreak/playbackRate/ad-mode UI state against `time` and emits
738
+ * adbreakchange on transitions. Called from timeupdate, but also called
739
+ * eagerly as soon as ad breaks or metadata become known — timeupdate alone
740
+ * doesn't fire until playback actually starts, which left a preroll ad's
741
+ * first frame briefly showing content controls (rewind/forward, etc.)
742
+ * while autoplay was blocked or the source was still buffering.
743
+ */
744
+ private refreshAdBreakState;
745
+ /**
746
+ * Converts raw (stitched) video time to content-only time by subtracting the
747
+ * ad time elapsed before `time`. During an ad break the result is frozen at
748
+ * the content timestamp where the break started. Identity when no ad breaks
749
+ * are known. Mirrors the seekbar mapping in the UI layer.
750
+ */
751
+ private videoTimeToContentTime;
666
752
  getAdBreaks(): Array<{
667
753
  startTime: number;
668
754
  endTime: number;