@dolby-optiview/ads-sdk-core 1.4.0 → 1.6.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.
- package/dist/OptiViewAds.d.ts +5 -0
- package/dist/OptiViewAds.js +1 -1
- package/dist/diagnostics/dispatchDiagnostic.d.ts +4 -0
- package/dist/diagnostics/dispatchDiagnostic.js +1 -0
- package/dist/generated/diagnosticCodes.d.ts +118 -3
- package/dist/generated/diagnosticCodes.js +1 -1
- package/dist/generated/version.d.ts +1 -1
- package/dist/generated/version.js +1 -1
- package/dist/index.d.ts +11 -4
- package/dist/index.js +1 -1
- package/dist/interfaces/PlayerAdapter.d.ts +27 -0
- package/dist/server/index.d.ts +2 -2
- package/dist/server/index.js +1 -1
- package/dist/services/AdBreakSequencer.d.ts +67 -3
- package/dist/services/AdBreakSequencer.js +1 -1
- package/dist/services/AdPlayerController.d.ts +9 -4
- package/dist/services/AdPlayerController.js +1 -1
- package/dist/services/BookmarkStart.d.ts +12 -0
- package/dist/services/BookmarkStart.js +1 -0
- package/dist/services/BreakScheduler.d.ts +15 -50
- package/dist/services/BreakScheduler.js +1 -1
- package/dist/services/BreakSchedulerTypes.d.ts +11 -1
- package/dist/services/BreakWarningTracker.d.ts +6 -0
- package/dist/services/BreakWarningTracker.js +1 -0
- package/dist/services/ContentEndTracker.d.ts +17 -0
- package/dist/services/ContentEndTracker.js +1 -0
- package/dist/services/ExternalPlaybackGate.d.ts +2 -2
- package/dist/services/ManifestService.d.ts +1 -1
- package/dist/services/ManifestService.js +1 -1
- package/dist/services/PauseAdController.d.ts +9 -5
- package/dist/services/PauseAdController.js +1 -1
- package/dist/services/PlaybackCrossing.d.ts +4 -0
- package/dist/services/PlaybackCrossing.js +1 -0
- package/dist/services/RewindRearm.js +1 -1
- package/dist/services/SchedulerSnapback.d.ts +33 -0
- package/dist/services/SchedulerSnapback.js +1 -0
- package/dist/services/SlateClock.d.ts +22 -0
- package/dist/services/SlateClock.js +1 -0
- package/dist/services/SnapbackGuard.d.ts +70 -0
- package/dist/services/SnapbackGuard.js +1 -0
- package/dist/services/VastAdManager.d.ts +2 -0
- package/dist/services/VastAdManager.js +1 -1
- package/dist/services/adPlayer/AdPlayerCallbacks.d.ts +11 -1
- package/dist/services/adPlayer/AdPlayerEvents.d.ts +21 -1
- package/dist/services/adPlayer/AdPlayerEvents.js +1 -1
- package/dist/services/adPlayer/AdPlayerState.d.ts +14 -0
- package/dist/services/adPlayer/AdPlayerState.js +1 -1
- package/dist/services/adPlayer/AdPreloader.d.ts +8 -1
- package/dist/services/adPlayer/AdPreloader.js +1 -1
- package/dist/services/adPlayer/AdStage.js +1 -1
- package/dist/services/adPlayer/AssetPlayback.d.ts +1 -0
- package/dist/services/adPlayer/AssetPlayback.js +1 -1
- package/dist/services/adPlayer/BreakSequenceDriver.d.ts +7 -1
- package/dist/services/adPlayer/BreakSequenceDriver.js +1 -1
- package/dist/services/adPlayer/ContentResumeCoordinator.d.ts +6 -0
- package/dist/services/adPlayer/ContentResumeCoordinator.js +1 -1
- package/dist/services/adPlayer/PauseAdPresenter.d.ts +10 -9
- package/dist/services/adPlayer/PauseAdPresenter.js +1 -1
- package/dist/services/adPlayer/PauseAdTracking.d.ts +13 -0
- package/dist/services/adPlayer/PauseAdTracking.js +1 -0
- package/dist/services/adPlayer/SharedElementBreakPlayer.d.ts +31 -2
- package/dist/services/adPlayer/SharedElementBreakPlayer.js +1 -1
- package/dist/services/adPlayer/SlateCoordinator.d.ts +58 -0
- package/dist/services/adPlayer/SlateCoordinator.js +1 -0
- package/dist/services/adPlayer/SlatePlayback.d.ts +89 -0
- package/dist/services/adPlayer/SlatePlayback.js +1 -0
- package/dist/services/adPlayer/VariantSelector.d.ts +10 -1
- package/dist/services/adPlayer/VariantSelector.js +1 -1
- package/dist/services/adPlayer/connectPauseAd.js +1 -1
- package/dist/services/adPlayer/presentation/PresentationLayout.d.ts +5 -2
- package/dist/services/adPlayer/presentation/PresentationLayout.js +1 -1
- package/dist/services/breakTiming.d.ts +1 -0
- package/dist/services/breakTiming.js +1 -1
- package/dist/services/checkEventBreak.d.ts +5 -0
- package/dist/services/checkEventBreak.js +1 -0
- package/dist/services/parseBreakManifest.d.ts +2 -1
- package/dist/services/parseBreakManifest.js +1 -1
- package/dist/services/parseVastPause.d.ts +18 -0
- package/dist/services/parseVastPause.js +1 -0
- package/dist/services/resolveLshapeAnchor.d.ts +25 -0
- package/dist/services/resolveLshapeAnchor.js +1 -0
- package/dist/services/resolveResumePoint.d.ts +3 -1
- package/dist/services/resolveResumePoint.js +1 -1
- package/dist/services/resolveSlate.d.ts +25 -0
- package/dist/services/resolveSlate.js +1 -0
- package/dist/services/resolveSlateFill.d.ts +39 -0
- package/dist/services/resolveSlateFill.js +1 -0
- package/dist/services/ssbSwitchSignals.d.ts +3 -0
- package/dist/services/ssbSwitchSignals.js +1 -1
- package/dist/session/AdBreakStatusTracker.d.ts +22 -2
- package/dist/session/AdBreakStatusTracker.js +1 -1
- package/dist/session/BreakLifecycle.js +1 -1
- package/dist/session/ContentPlaybackStart.d.ts +23 -0
- package/dist/session/ContentPlaybackStart.js +1 -0
- package/dist/session/DiscoveredManifestUrl.d.ts +44 -0
- package/dist/session/DiscoveredManifestUrl.js +1 -0
- package/dist/session/ScheduledBreaksTracker.d.ts +22 -0
- package/dist/session/ScheduledBreaksTracker.js +1 -0
- package/dist/session/SessionStarter.d.ts +3 -9
- package/dist/session/SessionStarter.js +1 -1
- package/dist/session/SessionStarterDeps.d.ts +3 -0
- package/dist/session/SessionStarterHelpers.d.ts +22 -1
- package/dist/session/SessionStarterHelpers.js +1 -1
- package/dist/session/SessionState.d.ts +16 -0
- package/dist/session/SessionState.js +1 -1
- package/dist/session/SsbSwitch.js +1 -1
- package/dist/session/buildScheduledBreaks.d.ts +9 -0
- package/dist/session/buildScheduledBreaks.js +1 -0
- package/dist/session/contentSnapback.d.ts +5 -1
- package/dist/session/contentSnapback.js +1 -1
- package/dist/session/scheduledBreaksSession.d.ts +6 -0
- package/dist/session/scheduledBreaksSession.js +1 -0
- package/dist/types/BreakManifest.d.ts +40 -2
- package/dist/types/BreakManifest.js +1 -1
- package/dist/types/Events.d.ts +13 -4
- package/dist/types/OptiViewAdsConfig.d.ts +15 -2
- package/dist/types/ScheduledBreak.d.ts +17 -0
- package/dist/types/ScheduledBreak.js +1 -0
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
export type { ScheduledBreak, ScheduledBreakPosition } from './types/ScheduledBreak';
|
|
2
|
+
export type { ScheduledBreaksChangeEvent } from './types/Events';
|
|
1
3
|
export { OptiViewAds } from './OptiViewAds';
|
|
2
4
|
export { OptiViewAdsExternalVendors, type OptiViewAdsExternalVendorsConfig, } from './OptiViewAdsExternalVendors';
|
|
3
|
-
export type { ExternalPlaybackChange, ExternalPlaybackState, ExternalPlaybackTarget, PlayerAdapter, PlayerAdapterEvent, PlayerAdapterEventHandler, TimedMetadataCue, VideoQuality, } from './interfaces/PlayerAdapter';
|
|
4
|
-
export type { BreakManifest, Break, BreakPosition, EventTrigger, BreakVariant, SingleBreakVariant, DoubleBreakVariant, LshapeAdBreakVariant, LshapeContentBreakVariant, OverlayBreakVariant, AssetWithCompanion, OverlayPosition, OverlaySize, Asset, StaticAsset, VastAsset, VendorAsset, Polling, Controls, Targeting, OsVersionRange, Interaction, AssetUri, DeliveryRule, ChannelEvent, VendorConfiguration, VendorConfigurationBase, GamVendorConfiguration, GamSgaiConfiguration, GamSsaiConfiguration, GamSsbConfiguration, ExternalVendorConfigurationEntry, } from './types/BreakManifest';
|
|
5
|
+
export type { DiscoveredAdsManifestUrl, ExternalPlaybackChange, ExternalPlaybackState, ExternalPlaybackTarget, PlayerAdapter, PlayerAdapterEvent, PlayerAdapterEventHandler, TimedMetadataCue, VideoQuality, } from './interfaces/PlayerAdapter';
|
|
6
|
+
export type { BreakManifest, Break, BreakPosition, EventTrigger, BreakVariant, SingleBreakVariant, DoubleBreakVariant, LshapeAdBreakVariant, LshapeContentBreakVariant, OverlayBreakVariant, AssetWithCompanion, OverlayPosition, OverlaySize, Asset, StaticAsset, VastAsset, VendorAsset, Polling, Controls, Targeting, OsVersionRange, Interaction, AssetUri, DeliveryRule, ChannelEvent, Slate, VendorConfiguration, VendorConfigurationBase, GamVendorConfiguration, GamSgaiConfiguration, GamSsaiConfiguration, GamSsbConfiguration, ExternalVendorConfigurationEntry, } from './types/BreakManifest';
|
|
5
7
|
export type { ExternalVendorConfiguration } from './types/ExternalVendorConfiguration';
|
|
6
|
-
export { BreakFormat, AssetType, MediaType, Vendor, Timebase, DeviceType, Platform, Os, DeliveryMode, BreakEvent, } from './types/BreakManifest';
|
|
8
|
+
export { BreakFormat, LshapeAnchor, AssetType, MediaType, Vendor, Timebase, DeviceType, Platform, Os, DeliveryMode, BreakEvent, } from './types/BreakManifest';
|
|
7
9
|
export { isStaticAsset, isVastAsset, isVendorAsset, isGamVendorConfiguration, isEventTrigger, isPauseBreak, } from './types/BreakManifest';
|
|
8
10
|
export { resolveDeliveryMode, resolveStitchedStreamVendor, SsaiUnavailableError, } from './services/resolveDeliveryMode';
|
|
9
11
|
export type { DeliveryModeDecision } from './services/resolveDeliveryMode';
|
|
@@ -37,7 +39,7 @@ export type { PauseAdResolution, PauseAdShowCallback, PauseAdHideCallback, Pause
|
|
|
37
39
|
export { PauseAdController } from './services/PauseAdController';
|
|
38
40
|
export type { VastCompanionImage } from './services/parseVastCompanion';
|
|
39
41
|
export { parseVastCompanionImage } from './services/parseVastCompanion';
|
|
40
|
-
export type { EffectiveInsertionMode, AdBreakStep, AdBreakAction, AdBreakOutcome, AdBreakTransition, NoPlayableAssetReason, NoPlayableAssetNotice, ChainResolver, } from './services/AdBreakSequencer';
|
|
42
|
+
export type { EffectiveInsertionMode, AdBreakStep, AdBreakAction, AdBreakOutcome, AdBreakTransition, NoPlayableAssetReason, NoPlayableAssetNotice, ChainResolver, SlateStartReason, SlatePhase, SlateResolver, SlateNotStartedNotice, } from './services/AdBreakSequencer';
|
|
41
43
|
export { AdBreakSequencer, selectVariant, extractAssets, assetsOfVariant, resolveBreakFormat, breakPlanEmptyReason, } from './services/AdBreakSequencer';
|
|
42
44
|
export type { VariantSelectionInputs, VariantSelection } from './services/selectVariant';
|
|
43
45
|
export { selectVariantDetailed, playableFormatsFor, variantsOf, RENDERABLE_BREAK_FORMATS, KNOWN_BREAK_FORMATS, } from './services/selectVariant';
|
|
@@ -49,6 +51,11 @@ export type { DiagnosticsConfig, BreakWarningsConfig, ExternalPlaybackConfig, }
|
|
|
49
51
|
export { parseBreakManifest, SUPPORTED_MANIFEST_MAJOR_VERSION, } from './services/parseBreakManifest';
|
|
50
52
|
export { resolveActiveEvent, resolveEventManifest, nextEventBoundaryMs, } from './services/resolveChannelEvents';
|
|
51
53
|
export type { ChannelEventIssue } from './services/resolveChannelEvents';
|
|
54
|
+
export type { ResolvedSlate, SlateIssue, SlateIssueReason } from './services/resolveSlate';
|
|
55
|
+
export { resolveSlate, DEFAULT_SLATE_MIN_DURATION_SEC } from './services/resolveSlate';
|
|
56
|
+
export type { SlateFillInput, SlateFillDecision, SlateSkipReason } from './services/resolveSlateFill';
|
|
57
|
+
export { resolveSlateFill } from './services/resolveSlateFill';
|
|
58
|
+
export { SlateClock } from './services/SlateClock';
|
|
52
59
|
export { fetchWithTimeout, AUX_FETCH_TIMEOUT_MS } from './services/fetchWithTimeout';
|
|
53
60
|
export type { GamVendorParameters } from './services/GamPodUrlBuilder';
|
|
54
61
|
export { buildGamPodUrl, isGamVendorParameters } from './services/GamPodUrlBuilder';
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{OptiViewAds}from"./OptiViewAds";export{OptiViewAdsExternalVendors}from"./OptiViewAdsExternalVendors";export{BreakFormat,AssetType,MediaType,Vendor,Timebase,DeviceType,Platform,Os,DeliveryMode,BreakEvent}from"./types/BreakManifest";export{isStaticAsset,isVastAsset,isVendorAsset,isGamVendorConfiguration,isEventTrigger,isPauseBreak}from"./types/BreakManifest";export{resolveDeliveryMode,resolveStitchedStreamVendor,SsaiUnavailableError}from"./services/resolveDeliveryMode";export{matchTargeting}from"./services/matchTargeting";export{DEFAULT_MODE,DEFAULT_AD_PRELOAD_MODE,DEFAULT_AD_BREAK_CONTENT_RECOVERY,DEFAULT_AD_INSERTION_MODE,DEFAULT_CHAINING,resolveChaining,DEFAULT_TUNE_IN,resolveTuneIn,DEFAULT_PDT_GRACE_SECONDS,resolvePdtGraceSeconds}from"./types/OptiViewAdsConfig";export{buildStitcherMasterUrl}from"./services/StitcherUrlBuilder";export{GamStreamManager}from"./services/GamStreamManager";export{OPTIVIEW_ASSET_PARAMETER_MACROS}from"./services/assetParameterMacros";export{VastAdManager,isImaCsaiSdkAvailable}from"./services/VastAdManager";export{SsaiController}from"./services/SsaiController";export{resolvePreloadMode,isSingleDecoderUserAgent}from"./services/detectPreloadMode";export{detectDeviceProfile}from"./services/detectDeviceType";export{resolveContentRecovery,isRecreateAfterBreakUserAgent}from"./services/detectContentRecovery";export{resolveInsertionMode,isSharedElementUserAgent,detectMediaSourceCapabilities}from"./services/detectInsertionMode";export{systemClock}from"./services/BreakScheduler";export{MetadataCueTracker,isAnvatoCue,isId3InEmsgScheme,anvatoPayloadFromCue,parseAnvatoPayload,ANVATO_ID3_DESCRIPTION,ANVATO_ID3_MIME_TYPE,ANVATO_EMSG_SCHEME_ID_URI,ID3_IN_EMSG_SCHEME_ID_URIS,PTS_MATCH_TOLERANCE_SECONDS}from"./services/MetadataCueTracker";export{PauseAdController}from"./services/PauseAdController";export{parseVastCompanionImage}from"./services/parseVastCompanion";export{AdBreakSequencer,selectVariant,extractAssets,assetsOfVariant,resolveBreakFormat,breakPlanEmptyReason}from"./services/AdBreakSequencer";export{selectVariantDetailed,playableFormatsFor,variantsOf,RENDERABLE_BREAK_FORMATS,KNOWN_BREAK_FORMATS}from"./services/selectVariant";export{GamPodAdTracker,derivePodAdAsset}from"./services/GamPodAdTracker";export{DIAGNOSTIC_CODES,getDiagnosticCodeInfo,DiagnosticBuffer,DEFAULT_DIAGNOSTIC_BUFFER_SIZE,SDK_VERSION}from"./diagnostics";export{parseBreakManifest,SUPPORTED_MANIFEST_MAJOR_VERSION}from"./services/parseBreakManifest";export{resolveActiveEvent,resolveEventManifest,nextEventBoundaryMs}from"./services/resolveChannelEvents";export{fetchWithTimeout,AUX_FETCH_TIMEOUT_MS}from"./services/fetchWithTimeout";export{buildGamPodUrl,isGamVendorParameters}from"./services/GamPodUrlBuilder";
|
|
1
|
+
export{OptiViewAds}from"./OptiViewAds";export{OptiViewAdsExternalVendors}from"./OptiViewAdsExternalVendors";export{BreakFormat,LshapeAnchor,AssetType,MediaType,Vendor,Timebase,DeviceType,Platform,Os,DeliveryMode,BreakEvent}from"./types/BreakManifest";export{isStaticAsset,isVastAsset,isVendorAsset,isGamVendorConfiguration,isEventTrigger,isPauseBreak}from"./types/BreakManifest";export{resolveDeliveryMode,resolveStitchedStreamVendor,SsaiUnavailableError}from"./services/resolveDeliveryMode";export{matchTargeting}from"./services/matchTargeting";export{DEFAULT_MODE,DEFAULT_AD_PRELOAD_MODE,DEFAULT_AD_BREAK_CONTENT_RECOVERY,DEFAULT_AD_INSERTION_MODE,DEFAULT_CHAINING,resolveChaining,DEFAULT_TUNE_IN,resolveTuneIn,DEFAULT_PDT_GRACE_SECONDS,resolvePdtGraceSeconds}from"./types/OptiViewAdsConfig";export{buildStitcherMasterUrl}from"./services/StitcherUrlBuilder";export{GamStreamManager}from"./services/GamStreamManager";export{OPTIVIEW_ASSET_PARAMETER_MACROS}from"./services/assetParameterMacros";export{VastAdManager,isImaCsaiSdkAvailable}from"./services/VastAdManager";export{SsaiController}from"./services/SsaiController";export{resolvePreloadMode,isSingleDecoderUserAgent}from"./services/detectPreloadMode";export{detectDeviceProfile}from"./services/detectDeviceType";export{resolveContentRecovery,isRecreateAfterBreakUserAgent}from"./services/detectContentRecovery";export{resolveInsertionMode,isSharedElementUserAgent,detectMediaSourceCapabilities}from"./services/detectInsertionMode";export{systemClock}from"./services/BreakScheduler";export{MetadataCueTracker,isAnvatoCue,isId3InEmsgScheme,anvatoPayloadFromCue,parseAnvatoPayload,ANVATO_ID3_DESCRIPTION,ANVATO_ID3_MIME_TYPE,ANVATO_EMSG_SCHEME_ID_URI,ID3_IN_EMSG_SCHEME_ID_URIS,PTS_MATCH_TOLERANCE_SECONDS}from"./services/MetadataCueTracker";export{PauseAdController}from"./services/PauseAdController";export{parseVastCompanionImage}from"./services/parseVastCompanion";export{AdBreakSequencer,selectVariant,extractAssets,assetsOfVariant,resolveBreakFormat,breakPlanEmptyReason}from"./services/AdBreakSequencer";export{selectVariantDetailed,playableFormatsFor,variantsOf,RENDERABLE_BREAK_FORMATS,KNOWN_BREAK_FORMATS}from"./services/selectVariant";export{GamPodAdTracker,derivePodAdAsset}from"./services/GamPodAdTracker";export{DIAGNOSTIC_CODES,getDiagnosticCodeInfo,DiagnosticBuffer,DEFAULT_DIAGNOSTIC_BUFFER_SIZE,SDK_VERSION}from"./diagnostics";export{parseBreakManifest,SUPPORTED_MANIFEST_MAJOR_VERSION}from"./services/parseBreakManifest";export{resolveActiveEvent,resolveEventManifest,nextEventBoundaryMs}from"./services/resolveChannelEvents";export{resolveSlate,DEFAULT_SLATE_MIN_DURATION_SEC}from"./services/resolveSlate";export{resolveSlateFill}from"./services/resolveSlateFill";export{SlateClock}from"./services/SlateClock";export{fetchWithTimeout,AUX_FETCH_TIMEOUT_MS}from"./services/fetchWithTimeout";export{buildGamPodUrl,isGamVendorParameters}from"./services/GamPodUrlBuilder";
|
|
@@ -67,6 +67,20 @@ export interface TimedMetadataCue {
|
|
|
67
67
|
export type PlayerAdapterEventHandler = (event?: unknown) => void;
|
|
68
68
|
/** A quality selection understood by the optional adapter operation. @category Player Integration */
|
|
69
69
|
export type VideoQuality = 'lowest';
|
|
70
|
+
/**
|
|
71
|
+
* The ads manifest URL a content player discovered for the current source, when the player
|
|
72
|
+
* exposes one (e.g. THEOplayer's `ads.adsManifestUrl` in the THEOlive discovery response).
|
|
73
|
+
* `pending` means the player may still report one (discovery in flight); `unavailable` means
|
|
74
|
+
* the current source has none or discovery is not possible for it.
|
|
75
|
+
* @category Player Integration */
|
|
76
|
+
export type DiscoveredAdsManifestUrl = {
|
|
77
|
+
status: 'pending';
|
|
78
|
+
} | {
|
|
79
|
+
status: 'available';
|
|
80
|
+
url: string;
|
|
81
|
+
} | {
|
|
82
|
+
status: 'unavailable';
|
|
83
|
+
};
|
|
70
84
|
/**
|
|
71
85
|
* The abstraction layer between the SDK and any video player. The core only talks to players
|
|
72
86
|
* through this interface; each player gets its own adapter package.
|
|
@@ -149,6 +163,7 @@ export interface PlayerAdapter {
|
|
|
149
163
|
* Whether the content is live, as reported by the player engine. Return `null` or omit
|
|
150
164
|
* this property when unknown; the SDK then falls back to checking for an infinite duration.
|
|
151
165
|
* A finite duration does not reliably identify VOD: HLS.js can report a finite live playlist.
|
|
166
|
+
* Playhead end inference requires an explicit `false`; unknown status relies on `ended`.
|
|
152
167
|
*
|
|
153
168
|
* | Player | Live status |
|
|
154
169
|
* |--------|-------------|
|
|
@@ -237,6 +252,18 @@ export interface PlayerAdapter {
|
|
|
237
252
|
* can never take the content's AirPlay route. Omit when unsupported.
|
|
238
253
|
*/
|
|
239
254
|
setExternalPlaybackAllowed?(allowed: boolean): void;
|
|
255
|
+
/**
|
|
256
|
+
* Ads manifest URL the player discovered for the current content source, if the adapter can
|
|
257
|
+
* observe it. Lets `startSession()` run without an explicit `manifestUrl`. Omit when the
|
|
258
|
+
* player cannot discover one — `startSession()` then still requires `manifestUrl`.
|
|
259
|
+
*/
|
|
260
|
+
readonly discoveredAdsManifestUrl?: DiscoveredAdsManifestUrl;
|
|
261
|
+
/**
|
|
262
|
+
* Subscribe to changes of {@link discoveredAdsManifestUrl}; returns an unsubscribe function.
|
|
263
|
+
* Listeners fire only on actual changes. Omit together with `discoveredAdsManifestUrl` when
|
|
264
|
+
* the player cannot discover an ads manifest URL.
|
|
265
|
+
*/
|
|
266
|
+
onDiscoveredAdsManifestUrlChange?(listener: (state: DiscoveredAdsManifestUrl) => void): () => void;
|
|
240
267
|
/** Clean up resources when the SDK is destroyed. */
|
|
241
268
|
destroy(): void;
|
|
242
269
|
}
|
package/dist/server/index.d.ts
CHANGED
|
@@ -6,8 +6,8 @@
|
|
|
6
6
|
* runtime (`OptiViewAds`, `AdPlayerController`, `GamStreamManager`). Consumed by
|
|
7
7
|
* the SSAI stitcher (`@dolby-optiview/ads-sdk-stitcher`) and any other Node-side tooling.
|
|
8
8
|
*/
|
|
9
|
-
export type { BreakManifest, Break, BreakVariant, SingleBreakVariant, DoubleBreakVariant, LshapeAdBreakVariant, LshapeContentBreakVariant, OverlayBreakVariant, AssetWithCompanion, OverlayPosition, OverlaySize, Asset, StaticAsset, VendorAsset, Polling, Controls, Targeting, Interaction, AssetUri, EventTrigger, BreakPosition, } from '../types/BreakManifest';
|
|
10
|
-
export { BreakFormat, AssetType, MediaType, Vendor, Timebase, DeviceType, BreakEvent, isEventTrigger, isPauseBreak, } from '../types/BreakManifest';
|
|
9
|
+
export type { BreakManifest, Break, BreakVariant, SingleBreakVariant, DoubleBreakVariant, LshapeAdBreakVariant, LshapeContentBreakVariant, OverlayBreakVariant, AssetWithCompanion, OverlayPosition, OverlaySize, Asset, StaticAsset, Slate, VendorAsset, Polling, Controls, Targeting, Interaction, AssetUri, EventTrigger, BreakPosition, } from '../types/BreakManifest';
|
|
10
|
+
export { BreakFormat, LshapeAnchor, AssetType, MediaType, Vendor, Timebase, DeviceType, BreakEvent, isEventTrigger, isPauseBreak, } from '../types/BreakManifest';
|
|
11
11
|
export { parseBreakManifest, SUPPORTED_MANIFEST_MAJOR_VERSION, } from '../services/parseBreakManifest';
|
|
12
12
|
export type { AdPreloadMode, AdBreakContentRecovery, AdInsertionMode, AdInsertionType, OptiViewAdsMode, } from '../types/OptiViewAdsConfig';
|
|
13
13
|
export type { ResolvedPreloadMode } from '../services/detectPreloadMode';
|
package/dist/server/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{BreakFormat,AssetType,MediaType,Vendor,Timebase,DeviceType,BreakEvent,isEventTrigger,isPauseBreak}from"../types/BreakManifest";export{parseBreakManifest,SUPPORTED_MANIFEST_MAJOR_VERSION}from"../services/parseBreakManifest";export{resolvePreloadMode,isSingleDecoderUserAgent}from"../services/detectPreloadMode";export{resolveContentRecovery,isRecreateAfterBreakUserAgent}from"../services/detectContentRecovery";export{resolveInsertionMode,isSharedElementUserAgent,isSingleSurfaceWebDevice}from"../services/detectInsertionMode";export{detectDeviceType}from"../services/detectDeviceType";export{buildGamPodUrl,isGamVendorParameters}from"../services/GamPodUrlBuilder";export{SDK_VERSION}from"../generated/version";
|
|
1
|
+
export{BreakFormat,LshapeAnchor,AssetType,MediaType,Vendor,Timebase,DeviceType,BreakEvent,isEventTrigger,isPauseBreak}from"../types/BreakManifest";export{parseBreakManifest,SUPPORTED_MANIFEST_MAJOR_VERSION}from"../services/parseBreakManifest";export{resolvePreloadMode,isSingleDecoderUserAgent}from"../services/detectPreloadMode";export{resolveContentRecovery,isRecreateAfterBreakUserAgent}from"../services/detectContentRecovery";export{resolveInsertionMode,isSharedElementUserAgent,isSingleSurfaceWebDevice}from"../services/detectInsertionMode";export{detectDeviceType}from"../services/detectDeviceType";export{buildGamPodUrl,isGamVendorParameters}from"../services/GamPodUrlBuilder";export{SDK_VERSION}from"../generated/version";
|
|
@@ -1,14 +1,18 @@
|
|
|
1
1
|
import { Asset, Break, BreakFormat, BreakVariant } from '../types/BreakManifest';
|
|
2
|
+
import type { SlateFillDecision } from './resolveSlateFill';
|
|
2
3
|
import { type VariantSelectionInputs } from './selectVariant';
|
|
3
4
|
/**
|
|
4
5
|
* Portable, DOM-free authority on the ORDER of the public ad events for a break (and a chain):
|
|
5
|
-
* `adbreakbegin` → per asset `adbegin`/`adend` (
|
|
6
|
+
* `adbreakbegin` → per asset `adbegin`/`adend` (`aderror` on failure, `adend` only if started) →
|
|
6
7
|
* `adbreakend`. It performs no I/O and starts no timers; the render layer drives it and reports
|
|
7
8
|
* outcomes, so the event contract has one source of truth across platforms (`conformance/`).
|
|
8
9
|
* - `lshape_content` shows a backdrop with no ad video: only `adbreakbegin`/`adbreakend`.
|
|
9
10
|
* - Shared-element plays only the first asset as a single fullscreen ad; `lshape_content` is skipped.
|
|
10
11
|
* - Chaining: the finished break `adbreakend`s and the successor `adbreakbegin`s at once. While the
|
|
11
12
|
* last ad plays, `prepare-successor` names the successor's first ad so a renderer can buffer it.
|
|
13
|
+
* - Slate: when the host's {@link SlateResolver} says a slate fills the part of a break no ad covers,
|
|
14
|
+
* `play-slate` follows the last `adend` (or the begin of a break with nothing to play), and
|
|
15
|
+
* `slate-elapsed` / `slate-errored` / `break-elapsed` end the break. The slate emits no ad events.
|
|
12
16
|
*/
|
|
13
17
|
/** The insertion mode the sequencer needs, after `adaptive` has been resolved. */
|
|
14
18
|
export type EffectiveInsertionMode = 'overlay' | 'shared-element';
|
|
@@ -61,7 +65,33 @@ export type AdBreakAction =
|
|
|
61
65
|
| {
|
|
62
66
|
kind: 'drop-successor';
|
|
63
67
|
breakId: string;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Play the manifest slate in the break's layout for `durationSec`, the part of the break no ad
|
|
71
|
+
* covers, then report `slate-elapsed` (or `slate-errored`). `dropSuccessorId` names a successor
|
|
72
|
+
* buffered behind the last ad, which the slate in between invalidates.
|
|
73
|
+
*/
|
|
74
|
+
| {
|
|
75
|
+
kind: 'play-slate';
|
|
76
|
+
durationSec: number;
|
|
77
|
+
reason: SlateStartReason;
|
|
78
|
+
dropSuccessorId?: string;
|
|
64
79
|
};
|
|
80
|
+
/** Why a slate starts: the ads ended before the break end, or no ad could play at all. */
|
|
81
|
+
export type SlateStartReason = 'ads-ended' | 'no-ad';
|
|
82
|
+
/** Where in a break the host is asked whether a slate fills the time no ad covers. */
|
|
83
|
+
export type SlatePhase = 'begin' | 'ads-ended';
|
|
84
|
+
/**
|
|
85
|
+
* The host's answer, from {@link resolveSlateFill} over its own clocks (the sequencer plays no media):
|
|
86
|
+
* at `begin` a break has played nothing; at `ads-ended` the last ad has settled and counted.
|
|
87
|
+
*/
|
|
88
|
+
export type SlateResolver = (breakInfo: Break, phase: SlatePhase) => SlateFillDecision;
|
|
89
|
+
/** A slate that exists but did not start although part of the break was uncovered. */
|
|
90
|
+
export interface SlateNotStartedNotice {
|
|
91
|
+
breakId: string;
|
|
92
|
+
reason: 'below-min-duration' | 'not-rendered';
|
|
93
|
+
remainingSec: number;
|
|
94
|
+
}
|
|
65
95
|
/** An outcome the driver reports back to advance the sequence. */
|
|
66
96
|
export type AdBreakOutcome =
|
|
67
97
|
/** Overlay/shared asset playback actually started (play() resolved). */
|
|
@@ -87,6 +117,14 @@ export type AdBreakOutcome =
|
|
|
87
117
|
/** The chained successor of the current break appeared, changed or disappeared. */
|
|
88
118
|
| {
|
|
89
119
|
kind: 'successor-changed';
|
|
120
|
+
}
|
|
121
|
+
/** The slate played until the break end. */
|
|
122
|
+
| {
|
|
123
|
+
kind: 'slate-elapsed';
|
|
124
|
+
}
|
|
125
|
+
/** The slate could not load or play: the break ends as without a slate. */
|
|
126
|
+
| {
|
|
127
|
+
kind: 'slate-errored';
|
|
90
128
|
};
|
|
91
129
|
/**
|
|
92
130
|
* Why a break produced no ad: `no-variant`, `no-qualifying-variant` (none passed device
|
|
@@ -113,6 +151,8 @@ export interface AdBreakTransition {
|
|
|
113
151
|
* `finalizeBreak` recurses through chained successors. Absent when every break had something to play.
|
|
114
152
|
*/
|
|
115
153
|
noPlayableAsset?: NoPlayableAssetNotice[];
|
|
154
|
+
/** Breaks in THIS transition whose slate did not start though part of the break was uncovered. */
|
|
155
|
+
slateNotStarted?: SlateNotStartedNotice[];
|
|
116
156
|
}
|
|
117
157
|
/** Resolver returning the break chained immediately after `breakId`, or null. */
|
|
118
158
|
export type ChainResolver = (breakId: string) => Break | null;
|
|
@@ -130,14 +170,16 @@ export declare function extractAssets(breakInfo: Break, inputs?: VariantSelectio
|
|
|
130
170
|
/**
|
|
131
171
|
* The host's pre-`adbreakbegin` gate: a non-null reason means the break must not begin (host
|
|
132
172
|
* emits `aderror` + `DA-BREAK-NO-PLAYABLE-ASSET` and completes it in the scheduler).
|
|
173
|
+
* `slateFillsBreak`: the manifest slate covers a variant without assets, so that break begins.
|
|
133
174
|
*/
|
|
134
|
-
export declare function breakPlanEmptyReason(breakInfo: Break, insertionMode: EffectiveInsertionMode, selection?: VariantSelectionInputs): NoPlayableAssetReason | null;
|
|
175
|
+
export declare function breakPlanEmptyReason(breakInfo: Break, insertionMode: EffectiveInsertionMode, selection?: VariantSelectionInputs, slateFillsBreak?: boolean): NoPlayableAssetReason | null;
|
|
135
176
|
/** Drives one break-chain's event sequence: {@link beginBreak}, then feed every {@link AdBreakOutcome} into {@link onOutcome}. */
|
|
136
177
|
export declare class AdBreakSequencer {
|
|
137
178
|
private readonly insertionMode;
|
|
138
179
|
private readonly chainResolver;
|
|
139
180
|
private readonly selection;
|
|
140
181
|
private readonly successorResolver;
|
|
182
|
+
private readonly slateResolver?;
|
|
141
183
|
private currentBreak;
|
|
142
184
|
private plan;
|
|
143
185
|
private assetIndex;
|
|
@@ -145,10 +187,27 @@ export declare class AdBreakSequencer {
|
|
|
145
187
|
private assetStarted;
|
|
146
188
|
/** Break id named by the last `prepare-successor` of the current break, until it is dropped or the break ends. */
|
|
147
189
|
private preparedSuccessorId;
|
|
190
|
+
/** True from `play-slate` until the break ends: the slate owns the break and late ad outcomes are stale. */
|
|
191
|
+
private slateActive;
|
|
192
|
+
/** Refusals noted while planning, attached to the transition being returned. */
|
|
193
|
+
private slateNotices;
|
|
148
194
|
/** The SELECTED (or downgrade-candidate) variant's format, not the first declared variant's. */
|
|
149
195
|
private planFormat;
|
|
150
196
|
/** Emits `adbreakbegin` and returns the first action; a break with nothing to play is retired without beginning. */
|
|
151
197
|
beginBreak(breakInfo: Break): AdBreakTransition;
|
|
198
|
+
private resetForBreak;
|
|
199
|
+
/**
|
|
200
|
+
* {@link computePlan}, except that a break with no ad to play (a variant without assets, or an
|
|
201
|
+
* `lshape_content` without a backdrop) becomes slate-only when the slate covers it.
|
|
202
|
+
*/
|
|
203
|
+
private planBreak;
|
|
204
|
+
/** The slate's length when the host says it covers the break now; a refusal the host should report is noted. */
|
|
205
|
+
private askSlate;
|
|
206
|
+
private seal;
|
|
207
|
+
/** `adbreakbegin` for the current plan; a slate-only break also reports the ad it never had. */
|
|
208
|
+
private beginSteps;
|
|
209
|
+
/** Begins a break whose plan is not empty: `prefix` is what the transition already carries. */
|
|
210
|
+
private beginPlanned;
|
|
152
211
|
/** Built here because the host never sees a CHAINED successor's break object, so it cannot report its format/asset count. */
|
|
153
212
|
private noticeFor;
|
|
154
213
|
/** Emit one asset-less `aderror` step for an empty break, then advance to any chained successor (recursing if that is empty too). */
|
|
@@ -157,6 +216,9 @@ export declare class AdBreakSequencer {
|
|
|
157
216
|
private startAction;
|
|
158
217
|
/** Advance the sequence with a driver outcome. */
|
|
159
218
|
onOutcome(outcome: AdBreakOutcome): AdBreakTransition;
|
|
219
|
+
private advance;
|
|
220
|
+
/** The slate owns the break: it ends on the slate's own outcome or a cut; the last ad's late outcomes are stale. */
|
|
221
|
+
private advanceDuringSlate;
|
|
160
222
|
/**
|
|
161
223
|
* Only while the break's last ad plays: an earlier queued item would play before the break's
|
|
162
224
|
* own next ad. Drops a prepared successor that the chain no longer plays next.
|
|
@@ -168,8 +230,10 @@ export declare class AdBreakSequencer {
|
|
|
168
230
|
/** The `adend` owed to an ad that began but has not settled, when a break is cut short. */
|
|
169
231
|
private inFlightAdendPrefix;
|
|
170
232
|
private onAssetStarted;
|
|
171
|
-
/**
|
|
233
|
+
/** Emit `aderror` on failure and `adend` only for a started asset; then advance or finalize. */
|
|
172
234
|
private onAssetSettled;
|
|
173
235
|
/** Emit `adbreakend`; a chained successor `adbreakbegin`s at once through the held ad surface. */
|
|
174
236
|
private finalizeBreak;
|
|
237
|
+
/** The last ad settled: a slate covers what is left of the break, else the break ends. */
|
|
238
|
+
private afterLastAsset;
|
|
175
239
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BreakFormat as e}from"../types/BreakManifest";import{KNOWN_BREAK_FORMATS as t,selectVariantDetailed as s,variantsOf as a}from"./selectVariant";export function selectVariant(e,a){return s(e,a??{playableFormats:t}).selected}export function resolveBreakFormat(e,t){return selectVariant(e,t)?.format}export function assetsOfVariant(t){if(!t)return[];switch(t.format){case e.SINGLE:case e.DOUBLE:case e.LSHAPE_AD:case e.LSHAPE_CONTENT:case e.OVERLAY:return t.assets;default:return[]}}export function extractAssets(e,t){return assetsOfVariant(selectVariant(e,t))}export function breakPlanEmptyReason(e,t,s={}){const
|
|
1
|
+
import{BreakFormat as e}from"../types/BreakManifest";import{KNOWN_BREAK_FORMATS as t,selectVariantDetailed as s,variantsOf as a}from"./selectVariant";export function selectVariant(e,a){return s(e,a??{playableFormats:t}).selected}export function resolveBreakFormat(e,t){return selectVariant(e,t)?.format}export function assetsOfVariant(t){if(!t)return[];switch(t.format){case e.SINGLE:case e.DOUBLE:case e.LSHAPE_AD:case e.LSHAPE_CONTENT:case e.OVERLAY:return t.assets;default:return[]}}export function extractAssets(e,t){return assetsOfVariant(selectVariant(e,t))}export function breakPlanEmptyReason(e,t,s={},a=!1){const n=r(e,t,s);return"empty"!==n.mode||a&&"no-assets"===n.reason?null:n.reason??null}function r(r,n,i={}){if(0===a(r).length)return{mode:"empty",reason:"no-variant",variant:null};const o=s(r,{deviceType:i.deviceType,deviceProfile:i.deviceProfile,playableFormats:"shared-element"===n?t:i.playableFormats}),d=o.selected,l=d??o.deviceQualified;if(!l)return{mode:"empty",reason:"no-qualifying-variant",variant:null};if("shared-element"===n){if(l.format===e.LSHAPE_CONTENT)return{mode:"empty",reason:"lshape-content-skipped",variant:l};const t=assetsOfVariant(l)[0];return t?{mode:"shared-single",asset:t,variant:l}:{mode:"empty",reason:"no-assets",variant:l}}if(d){if(d.format===e.LSHAPE_CONTENT)return{mode:"overlay-backdrop",variant:d};const t=assetsOfVariant(d);return t.length>0?{mode:"overlay-assets",assets:t,variant:d}:{mode:"empty",reason:"no-assets",variant:d}}if(l.format===e.LSHAPE_CONTENT)return{mode:"overlay-backdrop",variant:l};const c=assetsOfVariant(l)[0];return c?{mode:"overlay-assets",assets:[c],variant:l}:{mode:"empty",reason:"no-assets",variant:l}}export class AdBreakSequencer{constructor(e,t=()=>null,s={},a=t,r){this.insertionMode=e,this.chainResolver=t,this.selection=s,this.successorResolver=a,this.slateResolver=r,this.currentBreak=null,this.plan={mode:"empty"},this.assetIndex=0,this.assetStarted=!1,this.preparedSuccessorId=null,this.slateActive=!1,this.slateNotices=[]}planFormat(){return"variant"in this.plan?this.plan.variant?.format:void 0}beginBreak(e){return this.currentBreak=e,this.resetForBreak(),this.plan=this.planBreak(e),"empty"===this.plan.mode?this.seal(this.retireEmptyBreak(e,[],this.noticeFor(e))):this.seal(this.beginPlanned(e,this.plan,[],[]))}resetForBreak(){this.assetIndex=0,this.assetStarted=!1,this.preparedSuccessorId=null,this.slateActive=!1}planBreak(e){const t=r(e,this.insertionMode,this.selection),s="empty"===t.mode&&"no-assets"===t.reason||"overlay-backdrop"===t.mode&&0===assetsOfVariant(t.variant).length?t.variant:null;if(!s)return t;const a=this.askSlate(e,"begin");return a?{mode:"slate-only",variant:s,durationSec:a.durationSec}:t}askSlate(e,t){const s=this.slateResolver?.(e,t);return s?s.fill?{durationSec:s.durationSec}:("below-min-duration"!==s.reason&&"not-rendered"!==s.reason||this.slateNotices.push({breakId:e.id,reason:s.reason,remainingSec:s.remainingSec}),null):null}seal(e){if(0===this.slateNotices.length)return e;const t=this.slateNotices;return this.slateNotices=[],{...e,slateNotStarted:t}}beginSteps(e){const t=this.planFormat(),s=[{type:"adbreakbegin",break:e,format:t}];return"slate-only"===this.plan.mode&&s.push({type:"aderror",break:e,format:t}),s}beginPlanned(e,t,s,a){const r=[...s,...this.beginSteps(e)],n=[...a,...this.noticeFor(e)],i=this.startAction(t);return n.length>0?{steps:r,action:i,noPlayableAsset:n}:{steps:r,action:i}}noticeFor(e){const t="empty"===this.plan.mode?this.plan.reason:"slate-only"===this.plan.mode?"no-assets":void 0;return t?[{breakId:e.id,reason:t,format:this.planFormat(),declaredAssetCount:a(e).reduce((e,t)=>e+assetsOfVariant(t).length,0)}]:[]}retireEmptyBreak(e,t,s){const a=[...t,{type:"aderror",break:e,format:this.planFormat()}],r=this.chainResolver(e.id);return r?(this.currentBreak=r,this.resetForBreak(),this.plan=this.planBreak(r),"empty"===this.plan.mode?this.retireEmptyBreak(r,a,[...s,...this.noticeFor(r)]):this.beginPlanned(r,this.plan,a,s)):(this.currentBreak=null,{steps:a,action:{kind:"end-break"},noPlayableAsset:s})}startAction(e){switch(e.mode){case"overlay-assets":return{kind:"play-asset",asset:e.assets[0],index:0,total:e.assets.length};case"overlay-backdrop":return{kind:"render-backdrop"};case"shared-single":return{kind:"play-shared",asset:e.asset};case"slate-only":return this.slateActive=!0,{kind:"play-slate",durationSec:e.durationSec,reason:"no-ad"}}}onOutcome(e){return this.seal(this.advance(e))}advance(e){if(!this.currentBreak)return{steps:[],action:{kind:"await"}};const t=this.currentBreak;if(this.slateActive)return this.advanceDuringSlate(e);switch(e.kind){case"asset-started":return this.onAssetStarted(t);case"asset-ended":return this.onAssetSettled(t,!1);case"asset-errored":return this.onAssetSettled(t,!0);case"backdrop-elapsed":case"break-elapsed":return this.finalizeBreak(this.inFlightAdendPrefix(t));case"successor-changed":return{steps:[],action:this.successorAction(t)};case"slate-elapsed":case"slate-errored":return{steps:[],action:{kind:"await"}}}}advanceDuringSlate(e){switch(e.kind){case"slate-elapsed":case"slate-errored":case"break-elapsed":return this.finalizeBreak([]);default:return{steps:[],action:{kind:"await"}}}}successorAction(e){if(!this.playingLastAsset())return{kind:"await"};const t=this.firstSuccessorAd(e);if(t)return this.preparedSuccessorId=t.break.id,{kind:"prepare-successor",break:t.break,asset:t.asset};const s=this.preparedSuccessorId;return null===s?{kind:"await"}:(this.preparedSuccessorId=null,{kind:"drop-successor",breakId:s})}upcomingAsset(){return this.currentBreak&&"overlay-assets"===this.plan.mode?this.plan.assets[this.assetIndex+1]??null:null}playingLastAsset(){return!!this.assetStarted&&("shared-single"===this.plan.mode||"overlay-assets"===this.plan.mode&&this.assetIndex===this.plan.assets.length-1)}firstSuccessorAd(e){const t=new Set([e.id]);let s=this.successorResolver(e.id);for(;s&&!t.has(s.id);){t.add(s.id);const e=r(s,this.insertionMode,this.selection);if("overlay-assets"===e.mode)return{break:s,asset:e.assets[0]};if("shared-single"===e.mode)return{break:s,asset:e.asset};if("empty"!==e.mode)return null;s=this.successorResolver(s.id)}return null}inFlightAdendPrefix(e){if(!this.assetStarted)return[];const t=this.planFormat();return"overlay-assets"===this.plan.mode?[{type:"adend",break:e,format:t,asset:this.plan.assets[this.assetIndex],adIndex:this.assetIndex,totalAds:this.plan.assets.length}]:"shared-single"===this.plan.mode?[{type:"adend",break:e,format:t,asset:this.plan.asset,adIndex:0,totalAds:1}]:[]}onAssetStarted(e){if("overlay-assets"===this.plan.mode){const t=this.plan.assets.length,s=this.plan.assets[this.assetIndex];return this.assetStarted=!0,{steps:[{type:"adbegin",break:e,format:this.planFormat(),asset:s,adIndex:this.assetIndex,totalAds:t}],action:this.successorAction(e)}}return"shared-single"===this.plan.mode?(this.assetStarted=!0,{steps:[{type:"adbegin",break:e,format:this.planFormat(),asset:this.plan.asset,adIndex:0,totalAds:1}],action:this.successorAction(e)}):{steps:[],action:{kind:"await"}}}onAssetSettled(e,t){const s=this.assetStarted;if(this.assetStarted=!1,"shared-single"===this.plan.mode){const a=[],r=this.plan.asset,n=this.planFormat();return t&&a.push({type:"aderror",break:e,format:n,asset:r,adIndex:0,totalAds:1}),s&&a.push({type:"adend",break:e,format:n,asset:r,adIndex:0,totalAds:1}),this.afterLastAsset(e,a)}if("overlay-assets"!==this.plan.mode)return{steps:[],action:{kind:"await"}};const a=this.plan.assets.length,r=this.plan.assets[this.assetIndex],n=[],i=this.planFormat();return t&&n.push({type:"aderror",break:e,format:i,asset:r,adIndex:this.assetIndex,totalAds:a}),s&&n.push({type:"adend",break:e,format:i,asset:r,adIndex:this.assetIndex,totalAds:a}),this.assetIndex+=1,this.assetIndex<a?{steps:n,action:{kind:"play-asset",asset:this.plan.assets[this.assetIndex],index:this.assetIndex,total:a}}:this.afterLastAsset(e,n)}finalizeBreak(e,t=[]){const s=e=>t.length>0?{...e,noPlayableAsset:t}:e,a=this.currentBreak;if(!a)return s({steps:e,action:{kind:"end-break"}});const r=[...e,{type:"adbreakend",break:a,format:this.planFormat()}];this.preparedSuccessorId=null,this.slateActive=!1;const n=this.chainResolver(a.id);return n?(this.currentBreak=n,this.resetForBreak(),this.plan=this.planBreak(n),"empty"===this.plan.mode?this.retireEmptyBreak(n,r,[...t,...this.noticeFor(n)]):this.beginPlanned(n,this.plan,r,t)):(this.currentBreak=null,s({steps:r,action:{kind:"end-break"}}))}afterLastAsset(e,t){const s=this.askSlate(e,"ads-ended");if(!s)return this.finalizeBreak(t);const a=this.preparedSuccessorId;return this.preparedSuccessorId=null,this.slateActive=!0,{steps:t,action:{kind:"play-slate",durationSec:s.durationSec,reason:"ads-ended",...null===a?{}:{dropSuccessorId:a}}}}}
|
|
@@ -14,6 +14,7 @@ import { PauseAdPresenter } from './adPlayer/PauseAdPresenter';
|
|
|
14
14
|
import { AssetParameterResolver } from './adPlayer/AssetParameterResolver';
|
|
15
15
|
import { GamPodBridge } from './adPlayer/GamPodBridge';
|
|
16
16
|
import type { BreakEndOnStreamClock } from './adPlayer/streamClockResume';
|
|
17
|
+
import type { ResolvedSlate } from './resolveSlate';
|
|
17
18
|
import type { AdCreativeIdentity, AdPlayerCallbacks, GamEventCallbacks, PlayBreakOptions } from './adPlayer/AdPlayerCallbacks';
|
|
18
19
|
export type { AdCreativeIdentity, AdPlayerCallbacks, GamEventCallbacks, PlayBreakOptions };
|
|
19
20
|
export declare class AdPlayerController {
|
|
@@ -57,6 +58,7 @@ export declare class AdPlayerController {
|
|
|
57
58
|
private readonly successorQueue;
|
|
58
59
|
private readonly variantSelector;
|
|
59
60
|
private readonly adPlayerEvents;
|
|
61
|
+
private readonly slates;
|
|
60
62
|
private get gamEventCallbacks();
|
|
61
63
|
/** Post-restore progress check — see armSharedRestoreWatchdog(). Mirrors the iOS runtime. */
|
|
62
64
|
private debug;
|
|
@@ -164,6 +166,8 @@ export declare class AdPlayerController {
|
|
|
164
166
|
constructor(contentPlayer: PlayerAdapter, container: HTMLElement, playerContainer: HTMLElement | undefined, createAdAdapter: CreateAdAdapter, debug?: boolean, gamConfig?: GamConfig, preloadMode?: ResolvedPreloadMode, insertionMode?: ResolvedInsertionMode, adBreakCutSafetyMarginSec?: number, doubleBoxAudio?: DoubleBoxAudio, singleSurfaceDevice?: boolean,
|
|
165
167
|
/** Injected so drift correction is deterministic under fake timers; reuses the scheduler's `Clock`. */
|
|
166
168
|
clock?: Clock, contentRecovery?: ResolvedContentRecovery);
|
|
169
|
+
/** The manifest's slate for the breaks that follow; null when the channel has none. */
|
|
170
|
+
setSlate(slate: ResolvedSlate | null): void;
|
|
167
171
|
setGamEventCallbacks(callbacks: GamEventCallbacks): void;
|
|
168
172
|
setDiagnoseHandler(fn: (code: string, message: string, context?: Record<string, unknown>) => void): void;
|
|
169
173
|
private diagnose;
|
|
@@ -351,16 +355,17 @@ export declare class AdPlayerController {
|
|
|
351
355
|
* The SDK's pre-`adbreakbegin` gate: a non-null reason means no adbreakbegin/adbreakend,
|
|
352
356
|
* aderror + DA-BREAK-NO-PLAYABLE-ASSET instead, and content keeps playing.
|
|
353
357
|
*/
|
|
354
|
-
breakNothingToPlayReason(breakInfo: Break): NoPlayableAssetReason | null;
|
|
358
|
+
breakNothingToPlayReason(breakInfo: Break, effectiveDurationSec?: number): NoPlayableAssetReason | null;
|
|
355
359
|
/**
|
|
356
360
|
* Raw `format` strings of variants skipped as unrecognised; `''` means absent. Read at the
|
|
357
361
|
* break-start gates only, because selection runs several times per break.
|
|
358
362
|
*/
|
|
359
363
|
unknownVariantFormatsOf(breakInfo: Break): string[];
|
|
360
364
|
/** Called from the break-start gates; a break with nothing unknown emits nothing. */
|
|
361
|
-
|
|
365
|
+
diagnoseVariantAnomalies(breakInfo: Break): void;
|
|
362
366
|
/** What the public events report as "declared" before any PiP mapping. */
|
|
363
367
|
declaredFormatOf(breakInfo: Break): BreakFormat | undefined;
|
|
368
|
+
snapbackFormatOf(breakInfo: Break): BreakFormat | undefined;
|
|
364
369
|
private getVariant;
|
|
365
370
|
private applyLayout;
|
|
366
371
|
private restoreLayout;
|
|
@@ -379,8 +384,6 @@ export declare class AdPlayerController {
|
|
|
379
384
|
private resolveAssetUri;
|
|
380
385
|
/** Null (with a warning) if GAM is not configured. */
|
|
381
386
|
private buildGamUrl;
|
|
382
|
-
private resolveUri;
|
|
383
|
-
private adPlayerStreamRemainingSec;
|
|
384
387
|
private onAdEnded;
|
|
385
388
|
private toAdError;
|
|
386
389
|
private onAdError;
|
|
@@ -407,6 +410,8 @@ export declare class AdPlayerController {
|
|
|
407
410
|
* caller owns the content lifecycle once the session is ending. Cancels pending restores even when idle.
|
|
408
411
|
*/
|
|
409
412
|
stopActiveBreak(): void;
|
|
413
|
+
/** The session took the content player (SSB switch at break end): drop the pending hand-back so no resume seek, landing probe or stall nudge reaches the new source. */
|
|
414
|
+
abandonContentResume(): void;
|
|
410
415
|
private resolveChainedSuccessor;
|
|
411
416
|
private advanceToChainedBreak;
|
|
412
417
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{BreakFormat as e,Timebase as t,isPostRollBreak as r}from"../types/BreakManifest";import{DEFAULT_AD_BREAK_CUT_SAFETY_MARGIN_SEC as s,DEFAULT_DOUBLE_BOX_AUDIO as a}from"../types/OptiViewAdsConfig";import{pipOverridesFormat as i,pipSuppressesBackdrop as n}from"./pictureInPicture";import{AdBreakSequencer as o,assetsOfVariant as d,resolveBreakFormat as h}from"./AdBreakSequencer";import{selectVariantDetailed as l}from"./selectVariant";import{debugLog as u}from"../diagnostics/debugLog";import{systemClock as c}from"./BreakScheduler";import{createAdPlayerState as m,invalidateMediaPreload as g}from"./adPlayer/AdPlayerState";import{PauseAdPresenter as P}from"./adPlayer/PauseAdPresenter";import{AssetParameterResolver as p}from"./adPlayer/AssetParameterResolver";import{GamPodBridge as y}from"./adPlayer/GamPodBridge";import{AdStage as A}from"./adPlayer/AdStage";import{createDomPresentationHost as C,toPresentationSurfaces as v}from"./adPlayer/presentation/DomPresentationHost";import{AdPreloader as k}from"./adPlayer/AdPreloader";import{PresentationModeTracker as f}from"./adPlayer/PresentationModeTracker";import{SharedElementBreakPlayer as S}from"./adPlayer/SharedElementBreakPlayer";import{ContentResumeCoordinator as B}from"./adPlayer/ContentResumeCoordinator";import{resumeContentAfterBreak as b}from"./adPlayer/ContentRecovery";import{AssetPlayback as E}from"./adPlayer/AssetPlayback";import{SurfaceRevealReporter as T}from"./adPlayer/SurfaceRevealReporter";import{BreakSequenceDriver as M}from"./adPlayer/BreakSequenceDriver";import{VariantSelector as R}from"./adPlayer/VariantSelector";import{AdPlayerEvents as F}from"./adPlayer/AdPlayerEvents";import{AudioController as I}from"./adPlayer/AudioController";import{armPlaybackCutoff as G,clearPlaybackCutoff as w}from"./adPlayer/PlaybackCutoff";import{AdError as D}from"../types/AdError";import{SuccessorQueue as V}from"./adPlayer/SuccessorQueue";export class AdPlayerController{get contentPaused(){return this.state.contentPaused}set contentPaused(e){this.state.contentPaused=e}get firstFrameGateActive(){return this.state.firstFrameGateActive}set firstFrameGateActive(e){this.state.firstFrameGateActive=e}get firstFrameGateShown(){return this.state.firstFrameGateShown}set firstFrameGateShown(e){this.state.firstFrameGateShown=e}get firstFrameRejector(){return this.state.firstFrameRejector}set firstFrameRejector(e){this.state.firstFrameRejector=e}get gamEventCallbacks(){return this.gamPodBridge.eventCallbacks}get vastAdManager(){return this.state.vastAdManager}set vastAdManager(e){this.state.vastAdManager=e}get currentBreak(){return this.state.currentBreak}set currentBreak(e){this.state.currentBreak=e}get currentAsset(){return this.state.currentAsset}set currentAsset(e){this.state.currentAsset=e}get callbacks(){return this.state.callbacks}set callbacks(e){this.state.callbacks=e}get isPlaying(){return this.state.isPlaying}set isPlaying(e){this.state.isPlaying=e}get effectiveBreakDurationSec(){return this.state.effectiveBreakDurationSec}set effectiveBreakDurationSec(e){this.state.effectiveBreakDurationSec=e}get adBreakCutSafetyMarginSec(){return this.state.adBreakCutSafetyMarginSec}set adBreakCutSafetyMarginSec(e){this.state.adBreakCutSafetyMarginSec=e}get durationTimer(){return this.state.durationTimer}set durationTimer(e){this.state.durationTimer=e}get adInsertionType(){return this.state.adInsertionType}set adInsertionType(e){this.state.adInsertionType=e}get breakTimebase(){return this.state.breakTimebase}set breakTimebase(e){this.state.breakTimebase=e}constructor(e,t,r,i,n=!1,o,d="parallel",h="overlay",l=s,u=a,b=!1,G=c,w="none"){this.playerContainerCreatedBySDK=!1,this.adMediaContainer=null,this.adPlayer=null,this.surfaceReveal=new T((e,t,r)=>this.diagnose(e,t,r)),this.adContainer=null,this.companionElement=null,this.staticQuartilesFired=new Set,this.sequencer=null,this.pendingAdError=null,this.preRollHoldActive=!1,this.preRollHoldHandler=null,this.breakContentGateHandler=null,this.destroyed=!1,this.abortingBreak=!1,this.overlayImageEl=null,this.imageAssetTimer=null,this.chainResolver=null,this.transitionPhaseReporter=null,this.chaining=!1,this.diagnoseHandler=null,this.playerContainerOriginalStyle="",this.companionRemoveTimer=null,this.adFadeTimer=null,this.volumeChangeCallback=null,this.stage=null,this.resizeObserver=null,this.contentVideoElement=null,this.contentVideoGeometryHandler=null,this.contentVideoMutationObserver=null,this.resumeGeneration=0,this.singleSurfaceDevice=!1,this.currentSelectedFormat=void 0,this.state=m(),this.state.playerContainer=r??null,this.clock=G,this.singleSurfaceDevice=b,this.contentPlayer=e,this.audio=new I({contentPlayer:e,isAdPlaying:()=>this.isPlaying,getVastAdManager:()=>this.vastAdManager,onVolumeChange:(e,t)=>this.volumeChangeCallback?.(e,t),log:(...e)=>this.log(...e)}),this.adBreakCutSafetyMarginSec=l,this.doubleBoxAudio=u,this.container=t,r&&(this.playerContainer=r),this.createAdAdapter=i,this.debug=n,this.state.gamConfig=o,this.preloadMode=d,this.insertionMode=h,this.pauseAdPresenter=new P({contentPlayer:this.contentPlayer,getStage:()=>this.stage,resolveUri:e=>this.resolveUri(e),buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.assetParameters=new p(this.state,{contentPlayer:this.contentPlayer,container:this.container,getGamStreamManager:()=>this.state.gamStreamManager,getCurrentBreak:()=>this.currentBreak,getEffectiveBreakDuration:()=>this.effectiveBreakDurationSec,diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.gamPodBridge=new y(this.state,{contentPlayer:this.contentPlayer,debug:this.debug,getAdPlayer:()=>this.adPlayer,getAdContainer:()=>this.adContainer,isSharedElement:()=>"shared-element"===this.effectiveInsertionMode(),getCurrentBreak:()=>this.currentBreak,getCurrentAsset:()=>this.currentAsset,getEffectiveBreakDuration:()=>this.effectiveBreakDurationSec,getAdPlayerStreamRemainingSec:()=>this.adPlayerStreamRemainingSec(),emitStep:e=>this.emitStep(e),emitAdStart:(e,t,r,s,a)=>this.callbacks?.onAdStart(e,t,r,s,a),emitAdEnd:(e,t,r,s,a)=>this.callbacks?.onAdEnd(e,t,r,s,a),onAdEnded:()=>this.onAdEnded(),pushAssetParameters:(e,t)=>this.pushAssetParameters(e,t),assetParameterResolver:this.assetParameters,diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.adStage=new A({contentPlayer:this.contentPlayer,container:this.container,getPlayerContainer:()=>this.playerContainer,setPlayerContainer:e=>{this.playerContainer=e},setPlayerContainerOriginalStyle:e=>{this.playerContainerOriginalStyle=e},onPlayerContainerCreated:()=>{this.playerContainerCreatedBySDK=!0},getStage:()=>this.stage,setStage:e=>{this.stage=e},getContentVideo:()=>this.contentVideoElement,setContentVideo:e=>{this.contentVideoElement=e},getAdContainer:()=>this.adContainer,setAdContainer:e=>{this.adContainer=e},getAdMediaContainer:()=>this.adMediaContainer,setAdMediaContainer:e=>{this.adMediaContainer=e},setAdPlayer:e=>{g(this.state),this.adPlayer=e,e&&this.audio.attachAdPlayer(e)},createAdAdapter:e=>this.createAdAdapter(e),setupEventListeners:()=>this.setupEventListeners(),resizeVast:()=>this.vastAdManager?.resize(),getVariant:e=>this.getVariant(e),getCurrentBreak:()=>this.currentBreak,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),getCompanion:()=>this.companionElement,setCompanion:e=>{this.companionElement=e},getOverlayImage:()=>this.overlayImageEl,setOverlayImage:e=>{this.overlayImageEl=e},getImageAssetTimer:()=>this.imageAssetTimer,setImageAssetTimer:e=>{this.imageAssetTimer=e},isChaining:()=>this.chaining,log:(...e)=>this.log(...e),presentationHost:C(()=>v(this.playerContainer,this.adContainer,this.stage))}),this.preloader=new k({state:this.state,clock:this.clock,adStartBudgetMs:AdPlayerController.AD_START_BUDGET_MS,gamPodAdStartBudgetMs:AdPlayerController.GAM_POD_AD_START_BUDGET_MS,minAdStartBudgetMs:AdPlayerController.MIN_AD_START_BUDGET_MS,debug:this.debug,isPlaying:()=>this.isPlaying,preloadMode:this.preloadMode,effectiveInsertionMode:()=>this.effectiveInsertionMode(),getVariant:e=>this.getVariant(e),getAssets:e=>this.getAssets(e),buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),resolveAssetUri:(e,t,r)=>this.resolveAssetUri(e,t,r),getCompanionVariant:e=>this.getVariant(e),getAdPlayer:()=>this.adPlayer,getAdContainer:()=>this.adContainer,buildVastTagUrl:(e,t)=>this.buildVastTagUrl(e,t),resolveChainedSuccessor:e=>this.resolveChainedSuccessor(e),show:()=>this.show(),reapplyAdContainerLayout:e=>this.reapplyAdContainerLayout(e),getCurrentBreak:()=>this.currentBreak,onBreakVisible:e=>this.callbacks?.onBreakVisible?.(e),onAdError:e=>this.onAdError(e),diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.presentationModes=new f(this.state,{contentPlayer:this.contentPlayer,getAdPlayer:()=>this.adPlayer,insertionMode:this.insertionMode,getCurrentBreak:()=>this.currentBreak,getCurrentFormat:()=>this.currentSelectedFormat,isSharedElementActive:()=>this.state.sharedAdClaimActive,getVariant:e=>this.getVariant(e),isAdPlaying:()=>this.isAdPlaying(),hasCurrentAsset:()=>null!==this.currentAsset,contentSourceIsReloadable:()=>null!==this.sharedElementPlayer.restorableContentSource(),adoptPictureInPictureMidBreak:()=>this.adoptPictureInPictureMidBreak(),restoreLayout:()=>this.restoreLayout(),applyLayout:e=>this.applyLayout(e),show:()=>this.show(),playAdThroughContentElement:()=>this.sharedElementPlayer.playAdThroughContentElement(),getContentPositionAtBreakStart:()=>this.state.contentPositionAtBreakStart,setContentPositionAtBreakStart:e=>this.resumeCoordinator.reanchorMidBreak(e),gateContentForBreak:()=>this.gateContentForBreak(),diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.resumeCoordinator=new B(this.state,{contentPlayer:this.contentPlayer,clock:this.clock,getInsertionMode:()=>this.effectiveInsertionMode(),gateContentForBreak:()=>this.gateContentForBreak(),clearContentGate:e=>this.clearContentGate(e),muteContent:()=>this.audio.mute("content"),diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.recoveryDeps={contentPlayer:e,getCallbacks:()=>this.callbacks,preloadMode:d,contentRecovery:w,resumeCoordinator:this.resumeCoordinator,diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)},this.sharedElementPlayer=new S(this.state,{contentPlayer:this.contentPlayer,getAdPlayer:()=>this.adPlayer,surfaceReveal:this.surfaceReveal,resolveAssetUri:(e,t)=>this.resolveAssetUri(e,t),liveEdgeDistanceSec:()=>this.resumeCoordinator.liveEdgeDistanceSec(),rebindContentElementIfSwapped:()=>this.rebindContentElementIfSwapped(),createAdAdapter:(e,t)=>this.createAdAdapter(e,t),reportAdProgress:e=>this.reportAdProgress(e),processTimedMetadata:e=>this.gamPodBridge.processTimedMetadata(e),diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e),clearContentGate:()=>this.clearContentGate(),hide:()=>this.hide(),waitForLiveEdge:e=>this.resumeCoordinator.waitForLiveEdge(e),getVariant:e=>this.getVariant(e),getAssets:e=>this.getAssets(e)}),this.variantSelector=new R(this.state,{getEffectiveInsertionMode:()=>this.effectiveInsertionMode(),singleSurfaceDevice:this.singleSurfaceDevice,preloadMode:this.preloadMode,getIsContentPictureInPicture:()=>this.isContentPictureInPicture(),getIsGamReady:()=>this.isGamReady(),getSupportsParallelBuffering:()=>this.contentPlayer.supportsParallelBuffering,diagnose:(e,t,r)=>this.diagnose(e,t,r)}),this.successorQueue=new V({getAdPlayer:()=>this.adPlayer,isEnabled:()=>"parallel"===this.preloadMode&&"overlay"===this.effectiveInsertionMode()&&!this.state.sharedAdClaimActive,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),getCallbacks:()=>this.state.callbacks,log:(...e)=>this.log(...e)}),this.assetPlayback=new E(this.state,{getAdPlayer:()=>this.adPlayer,getAdContainer:()=>this.adContainer,getAdMediaContainer:()=>this.adMediaContainer,clearStaticQuartiles:()=>this.staticQuartilesFired.clear(),getVariant:e=>this.getVariant(e),getGamEventCallbacks:()=>this.gamEventCallbacks,getSequencer:()=>this.sequencer,debug:this.debug,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),buildGamUrl:(e,t)=>this.buildGamUrl(e,t),buildVastTagUrl:(e,t)=>this.buildVastTagUrl(e,t),onAdError:e=>this.onAdError(e),onAdEnded:()=>this.onAdEnded(),drive:e=>this.drive(e),clearOverlayImage:()=>this.clearOverlayImage(),revealFirstFrame:()=>this.preloader.revealFirstFrame(),surfaceReveal:this.surfaceReveal,transferPictureInPictureToAd:()=>this.presentationModes.transferPictureInPictureToAd(),isGamPodAsset:e=>this.isGamPodAsset(e),hasGamIdentityMismatch:e=>this.gamPodBridge.hasIdentityMismatch(e),beginGamPodTracking:e=>this.gamPodBridge.beginGamPodTracking(e),recordAdProgress:e=>this.adPlayerEvents.recordAdProgress(e),reportPhase:e=>this.reportPhase(e),armAdStartBudget:e=>this.armAdStartBudget(e),takeQueuedSuccessor:(e,t,r)=>this.successorQueue.take(e,t,r),queueUpcomingAd:()=>{const e=this.sequencer?.upcomingAsset();e&&this.currentBreak&&this.successorQueue.prepare(this.currentBreak,e,!1)},remainingAdStartBudgetMs:()=>this.remainingAdStartBudgetMs(),loadWithinBudget:(e,t)=>this.loadWithinBudget(e,t),waitForFirstFrame:()=>this.waitForFirstFrame(),getOverlayImage:()=>this.overlayImageEl,setOverlayImage:e=>{this.overlayImageEl=e},getImageAssetTimer:()=>this.imageAssetTimer,setImageAssetTimer:e=>{this.imageAssetTimer=e},getVastPodPosition:()=>this.vastPodPosition,setVastPodPosition:e=>{this.vastPodPosition=e},diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.breakSequenceDriver=new M(this.state,{successorQueue:this.successorQueue,getAssets:e=>this.getAssets(e),getChainResolver:()=>this.chainResolver,getEffectiveInsertionMode:()=>this.effectiveInsertionMode(),getVastPodPosition:()=>this.vastPodPosition,setVastPodPosition:e=>{this.vastPodPosition=e},getPendingAdError:()=>this.pendingAdError,setPendingAdError:e=>{this.pendingAdError=e},getChaining:()=>this.chaining,setChaining:e=>{this.chaining=e},isExpandingPodAsset:e=>this.isExpandingPodAsset(e),fallBackToPodLevelReporting:()=>this.fallBackToPodLevelReporting(),resetGamPodTracking:()=>this.resetGamPodTracking(),emitGamPodSteps:e=>this.gamPodBridge.emitGamPodSteps(e),playAsset:(e,t,r)=>this.playAsset(e,t,r),endBreak:()=>this.endBreak(),playBreak:(e,t,r)=>this.playBreak(e,t,r),diagnose:(e,t,r)=>this.diagnose(e,t,r),log:(...e)=>this.log(...e)}),this.adPlayerEvents=new F(this.state,{getAdPlayer:()=>this.adPlayer,getContentPlayer:()=>this.contentPlayer,getGamEventCallbacks:()=>this.gamEventCallbacks,getSequencer:()=>this.sequencer,onAdEnded:()=>this.onAdEnded(),processTimedMetadata:e=>this.gamPodBridge.processTimedMetadata(e),toAdError:e=>this.toAdError(e),revealFirstFrame:()=>this.revealFirstFrame(),clearFirstFrameResolver:()=>this.preloader.clearFirstFrameResolver(),drive:e=>this.drive(e),setPendingAdError:e=>{this.pendingAdError=e},dropQueuedAd:()=>this.successorQueue.drop(),log:(...e)=>this.log(...e),maybePrepositionContentForResume:()=>"single-decoder"!==this.preloadMode&&this.resumeCoordinator.maybePrepositionContentForResume(),maybeCatchUpContentForResume:e=>"single-decoder"!==this.preloadMode&&this.resumeCoordinator.maybeCatchUpContentForResume(e),getStaticQuartilesFired:()=>this.staticQuartilesFired,onGamPodAdProgress:e=>this.gamPodBridge.onGamPodAdProgress(e)})}setGamEventCallbacks(e){this.gamPodBridge.setEventCallbacks(e)}setDiagnoseHandler(e){this.diagnoseHandler=e}diagnose(e,t,r){this.diagnoseHandler?.(e,t,r)}holdContentForPreRoll(e){if(this.preRollHoldActive)return;const t=this.getVariant(e);t&&this.shouldPauseContent(t.format)&&(this.preRollHoldActive=!0,this.contentPlayer.pause(),this.preRollHoldHandler=()=>{this.preRollHoldActive&&this.contentPlayer.pause()},this.contentPlayer.on("playing",this.preRollHoldHandler),this.diagnose("DA-PREROLL-CONTENT-HELD","Content held at session start until the pending pre-roll begins.",{breakId:e.id}))}releaseContentHold(){this.preRollHoldActive&&(this.preRollHoldActive=!1,this.preRollHoldHandler&&(this.contentPlayer.off("playing",this.preRollHoldHandler),this.preRollHoldHandler=null))}gateContentForBreak(){this.contentPlayer.pause(),this.breakContentGateHandler||(this.breakContentGateHandler=()=>{this.contentPaused&&!this.state.resumeCatchupActive&&this.contentPlayer.pause()},this.contentPlayer.on("playing",this.breakContentGateHandler))}clearContentGate(e=!1){this.resumeCoordinator.endResumeCatchup(e),this.breakContentGateHandler&&(this.contentPlayer.off("playing",this.breakContentGateHandler),this.breakContentGateHandler=null)}setChainResolver(e){this.chainResolver=e}onChainSuccessorChanged(){this.sequencer&&this.currentBreak&&this.isPlaying&&this.drive(this.sequencer.onOutcome({kind:"successor-changed"}),!0)}setResumeCueAnchorResolver(e){this.resumeCoordinator.setCueAnchorResolver(e)}setResumeCueEndResolver(e){this.resumeCoordinator.setCueEndResolver(e)}ingestStreamClockCue(e){this.resumeCoordinator.ingestStreamClockCue(e)}setTransitionPhaseReporter(e){this.transitionPhaseReporter=e}reportPhase(e){this.transitionPhaseReporter?.(e)}setBreakResumePolicy(e,t,r=!1){this.adInsertionType=e,this.breakTimebase=t,this.state.continueContentDuringBreak=r,this.state.continueRefusalReported=!1}initialize(){this.adContainer||(this.setupOverlay(),this.presentationModes.setupPictureInPictureTracking(),"adaptive"===this.insertionMode&&this.presentationModes.setupFullscreenTracking())}async startGamSession(e,t){await this.gamPodBridge.startGamSession(e,t)}endGamSession(){this.gamPodBridge.endGamSession()}setSessionAssetParameters(e){this.assetParameters.setSessionAssetParameters(e)}setManifestAssetParameters(e){this.assetParameters.setManifestAssetParameters(e)}updateAssetParameters(e){this.assetParameters.updateAssetParameters(e)}resolveExternalVendorConfiguration(e){return this.assetParameters.resolveExternalVendorConfiguration(e)}updateAssetParameterMacros(e){this.assetParameters.updateAssetParameterMacros(e)}get updatedAssetParameters(){return this.state.updatedAssetParameters}setSessionAssetParameterMacros(e){this.assetParameters.setSessionAssetParameterMacros(e)}get sessionAssetParameterMacros(){return this.assetParameters.getSessionAssetParameterMacros()}buildVastTagUrl(e,t){return this.assetParameters.buildVastTagUrl(e,t)}buildStaticAssetUrl(e,t){return this.assetParameters.buildStaticAssetUrl(e,t)}pushAssetParameters(e,t){this.assetParameters.pushAssetParameters(e,t)}setupOverlay(){this.adStage.setupOverlay()}isGamPodAsset(e){return this.gamPodBridge.isGamPodAsset(e)}isExpandingPodAsset(e){return this.gamPodBridge.isExpandingPodAsset(e)}fallBackToPodLevelReporting(){this.gamPodBridge.fallBackToPodLevelReporting()}resetGamPodTracking(){this.gamPodBridge.resetGamPodTracking()}emitGamPodSteps(e){this.gamPodBridge.emitGamPodSteps(e)}isGamEnabled(){return this.gamPodBridge.isGamEnabled()}isGamReady(){return this.gamPodBridge.isGamReady()}isOverlayInsertion(){return"overlay"===this.effectiveInsertionMode()}settleAssetProgress(){this.adPlayerEvents.settleAssetProgress()}reportAdProgress(e){this.adPlayerEvents.reportAdProgress(e)}setupEventListeners(){this.adPlayerEvents.setupEventListeners()}async preload(e){return this.preloader.preload(e)}renderLshapeContentBackdrop(e){this.adStage.renderLshapeContentBackdrop(e)}currentInsertionMode(){return this.presentationModes.currentInsertionMode()}effectiveInsertionMode(){return this.presentationModes.effectiveInsertionMode()}isContentPictureInPicture(){return this.presentationModes.isPictureInPicture()}rebindContentElementIfSwapped(){this.presentationModes.rebindContentElementIfSwapped()}teardownFullscreenTracking(){this.presentationModes.teardownFullscreenTracking()}teardownPictureInPictureTracking(){this.presentationModes.teardownPictureInPictureTracking()}isPictureInPicture(){return this.presentationModes.isPictureInPicture()}pictureInPictureOwner(){return this.presentationModes.pictureInPictureOwner()}isShowingAd(){if(!this.isAdPlaying())return!1;const e=this.currentDeclaredFormat();return!n(e,this.isContentPictureInPicture())}currentDeclaredFormat(){return this.currentSelectedFormat??(this.currentBreak?h(this.currentBreak):void 0)}async playBreak(t,s,a){if(this.state.preloadGeneration++,this.resumeGeneration++,!this.sharedElementPlayer.beginSharedActivity())return;this.releaseContentHold(),this.rebindContentElementIfSwapped();const n=a?.effectiveDurationSec??null;this.effectiveBreakDurationSec=null!==n&&n>0?n:null;const d=this.effectiveBreakDurationSec??t.duration;if("shared-element"===this.effectiveInsertionMode())return g(this.state),void await this.sharedElementPlayer.playSharedElementBreak(t,s);if(!this.adPlayer)return void this.log("playBreak called before initialize()");const h=this.getVariant(t);if(!h)return void this.log("No valid variant found for break:",t.id);this.currentBreak=t,this.callbacks=s,this.isPlaying=!0,this.firstFrameGateActive=a?.firstFrameGate??!1,this.firstFrameGateShown=!1;const l=this.continueContentDuringBreakReason(h.format),u=r(t),c=this.shouldPauseContent(h.format)&&"ok"===l&&!u;c||u||this.state.continueRefusalReported||!this.shouldPauseContent(h.format)||(this.state.continueRefusalReported=!0,this.diagnose("DA-CONTINUE-PLAYOUT-REFUSED",`Content will be paused for breaks this session: ${l}`,{reason:l,format:h.format})),h.format===e.DOUBLE?this.audio.mute("ad"===this.doubleBoxAudio?"content":"ad"):c?this.audio.mute("content"):this.shouldPauseContent(h.format)&&this.audio.unmute("ad");const m=this.declaredFormatOf(t);if(this.currentSelectedFormat=m,this.state.pipAdoptedForBreak=i(m,this.isContentPictureInPicture()),this.state.pipAdoptedForBreak&&this.diagnose("DA-PIP-FORMAT-OVERRIDE",`Picture-in-picture: ${m} break plays as single`,{declared:m,effective:e.SINGLE,reason:"picture-in-picture",midBreak:!1}),this.shouldPauseContent(h.format)?(this.resumeCoordinator.captureBreakAnchor(t),c?(this.contentPaused=!1,this.resumeCoordinator.beginContinueContentPlayout()):(this.contentPaused=!0,this.gateContentForBreak())):this.contentPaused=!1,this.applyLayout(h),h.format===e.LSHAPE_CONTENT)return this.renderLshapeContentBackdrop(h),void(d&&d>0?(this.log("Starting duration timer:",d,"seconds"),this.durationTimer=setTimeout(()=>{this.log("Duration timer expired, ending break"),this.endBreak()},1e3*d)):this.endBreak());this.firstFrameGateActive||(this.show(),this.reapplyAdContainerLayout(h));if(0===this.getAssets(t).length)return this.log("No assets in break, ending immediately"),void this.endBreak();{const e=Math.max(0,d||0)+this.adBreakCutSafetyMarginSec;G(this.state,e,()=>{this.log("Break-cut timer expired, ending break"),this.firstFrameRejector?this.onAdError(new D("Break cut before first frame rendered","DA-AD-START-TIMEOUT")):this.sequencer&&this.currentBreak&&this.isPlaying?(this.callbacks?.onBreakCut?.(this.currentBreak),this.drive(this.sequencer.onOutcome({kind:"break-elapsed"}))):this.endBreak()},()=>this.onAdError(new D("Ad playback startup timed out","DA-AD-START-TIMEOUT")))}this.sequencer=new o("overlay",()=>null,this.selectionInputs(),e=>this.resolveChainedSuccessor(e)),await this.drive(this.sequencer.beginBreak(t)),this.preloadChainedSuccessor(t.id)}get resumeHandoverInMotion(){return this.state.resumeCatchupActive}reapplyAdContainerLayout(e){this.adStage.reapplyAdContainerLayout(e)}adoptPictureInPictureMidBreak(){this.presentationModes.adoptPictureInPictureMidBreak()}async restorePictureInPictureToContent(){await this.presentationModes.restorePictureInPictureToContent()}continueContentDuringBreakReason(e){return this.variantSelector.continueContentDuringBreakReason(e)}shouldPauseContent(t){return t===e.SINGLE||t===e.LSHAPE_AD}selectionInputs(){return this.variantSelector.selectionInputs()}breakNothingToPlayReason(e){return this.variantSelector.breakNothingToPlayReason(e)}unknownVariantFormatsOf(e){return this.variantSelector.unknownVariantFormatsOf(e)}diagnoseUnknownVariantFormats(e){this.variantSelector.diagnoseUnknownVariantFormats(e)}declaredFormatOf(e){const{selected:t,deviceQualified:r}=l(e,this.selectionInputs());return(t??r)?.format??h(e)}getVariant(e){return this.variantSelector.getVariant(e)}applyLayout(e){this.adStage.applyLayout(e)}restoreLayout(){this.adStage.restoreLayout()}getAssets(e){return d(this.getVariant(e))}async playAsset(e,t,r){return this.assetPlayback.playAsset(e,t,r)}clearOverlayImage(){this.adStage.clearOverlayImage()}async showPauseImage(e){return this.pauseAdPresenter.showPauseImage(e)}hidePauseImage(){this.pauseAdPresenter.hidePauseImage()}async drive(e,t=!1){return this.breakSequenceDriver.drive(e,t)}emitStep(e){this.breakSequenceDriver.emitStep(e)}async resolveAssetUri(e,t,r){return this.assetPlayback.resolveAssetUri(e,t,r)}async buildGamUrl(e,t){return this.gamPodBridge.buildGamUrl(e,t)}resolveUri(e){return this.assetParameters.resolveUri(e)}adPlayerStreamRemainingSec(){return this.assetPlayback.adPlayerStreamRemainingSec()}onAdEnded(){this.currentBreak&&this.isPlaying&&this.sequencer&&(this.settleAssetProgress(),this.drive(this.sequencer.onOutcome({kind:"asset-ended"})))}toAdError(e){return this.assetPlayback.toAdError(e)}onAdError(e){this.adPlayerEvents.onAdError(e)}endBreak(){if(!this.currentBreak)return;this.log("Break ended:",this.currentBreak.id),w(this.state),this.state.gamPodTracker&&this.emitGamPodSteps(this.state.gamPodTracker.finish()),this.resetGamPodTracking(),this.pushAssetParameters(void 0);const e=this.currentBreak;let s=this.abortingBreak?null:this.resolveChainedSuccessor(e.id);if(s){const e=this.breakNothingToPlayReason(s);this.diagnoseUnknownVariantFormats(s),e&&(this.diagnose("DA-BREAK-NO-PLAYABLE-ASSET",`chained break ${s.id} has no playable variant (${e}); it will not begin.`,{breakId:s.id,reason:e}),this.callbacks?.onAdError(s,void 0,new D(`Break ${s.id} has no playable variant (${e})`,"DA-BREAK-NO-PLAYABLE-ASSET")),this.callbacks?.onChainedBreakSkipped?.(s),s=null)}if(s)return void this.advanceToChainedBreak(e,s);if(this.currentSelectedFormat=void 0,this.resumeCoordinator.endContinueContentPlayout(),this.restorePictureInPictureToContent(),this.isPlaying=!1,this.currentBreak=null,this.resumeGeneration++,this.effectiveBreakDurationSec=null,g(this.state),this.preloader.clearWarmedBreaks(),this.successorQueue.reset(),this.firstFrameGateActive=!1,this.firstFrameGateShown=!1,this.clearFirstFrame("Break ended before first frame"),this.audio.unmuteAll(),this.clearOverlayImage(),this.vastAdManager?.reset(),this.hide(),this.restoreLayout(),this.adPlayer?.pause(),this.state.sharedAdClaimActive){const t=this.callbacks;return this.sharedElementPlayer.detachSharedAdListeners(),this.abortingBreak=!1,this.state.earlyReturnResumeOffsetSec=null,this.sharedElementPlayer.restoreSharedElementContent(e),void t?.onBreakEnd(e)}const a="recreate"===this.recoveryDeps.contentRecovery&&"function"==typeof this.contentPlayer.recreateMediaPipeline,i="single-decoder"===this.preloadMode||a?this.adPlayer?.unload?.():void 0;if(this.contentPaused&&r(e))this.contentPaused=!1,this.clearContentGate();else if(this.contentPaused){this.contentPaused=!1,this.clearContentGate(this.resumeHandoverInMotion);const r=this.resumeGeneration;b(this.recoveryDeps,{breakInfo:e,earlyReturnOffsetSec:this.state.earlyReturnResumeOffsetSec,isLiveResume:this.breakTimebase===t.WALLCLOCK,released:i,isCurrent:()=>r===this.resumeGeneration})}this.abortingBreak=!1,this.state.earlyReturnResumeOffsetSec=null,this.callbacks?.onBreakEnd(e)}currentAdAsset(){return this.isPlaying?this.currentAsset:null}skipBreak(){this.isPlaying&&(this.log("Skipping break:",this.currentBreak?.id),w(this.state),this.sequencer&&this.currentBreak?this.drive(this.sequencer.onOutcome({kind:"break-elapsed"})):this.endBreak())}abortBreak(e){this.isPlaying&&(this.log("Early return — break removed from manifest:",this.currentBreak?.id),this.state.earlyReturnResumeOffsetSec=Math.max(0,e),this.abortingBreak=!0,w(this.state),this.sequencer&&this.currentBreak?this.drive(this.sequencer.onOutcome({kind:"break-elapsed"})):this.endBreak())}stopActiveBreak(){g(this.state),this.successorQueue.reset(),this.sharedElementPlayer.cancelSharedRestore()&&this.isPlaying&&(this.log("Aborting active break on session end:",this.currentBreak?.id),w(this.state),this.sharedElementPlayer.detachSharedAdListeners(),this.sharedElementPlayer.releaseContentElementAdPlayer(),this.adPlayer?.pause(),this.clearOverlayImage(),this.vastAdManager?.reset(),this.hide(),this.restoreLayout(),this.isPlaying=!1,this.currentBreak=null,this.currentAsset=null,this.contentPaused=!1,this.clearContentGate(),this.resumeCoordinator.endContinueContentPlayout(),this.effectiveBreakDurationSec=null,this.firstFrameGateActive=!1,this.firstFrameGateShown=!1,this.clearFirstFrame("Break aborted before first frame"),this.audio.unmuteAll())}resolveChainedSuccessor(e){return this.breakSequenceDriver.resolveChainedSuccessor(e)}advanceToChainedBreak(e,t){this.breakSequenceDriver.advanceToChainedBreak(e,t)}preloadChainedSuccessor(e){this.preloader.preloadChainedSuccessor(e)}revealFirstFrame(){this.assetPlayback.revealFirstFrame()}armAdStartBudget(e){this.preloader.armAdStartBudget(e)}remainingAdStartBudgetMs(){return this.preloader.remainingAdStartBudgetMs()}loadWithinBudget(e,t){return this.preloader.loadWithinBudget(e,t)}async waitForFirstFrame(){return this.preloader.waitForFirstFrame()}clearFirstFrame(e="Break ended before first frame"){this.preloader.clearFirstFrame(e)}show(){this.adStage.show(),this.surfaceReveal.surfaceShown()}hide(){this.adStage.hide(),this.surfaceReveal.surfaceHidden()}isAdPlaying(){return this.isPlaying}get muted(){return this.audio.muted}set muted(e){this.audio.muted=e}get volume(){return this.audio.volume}set volume(e){this.audio.volume=e}setVolumeChangeCallback(e){this.volumeChangeCallback=e}destroy(){if(this.destroyed)return;if(this.resumeGeneration++,g(this.state),this.successorQueue.reset(),!this.sharedElementPlayer.beginSharedActivity())return;this.destroyed=!0,this.adStage.destroy(),this.resumeCoordinator.cancelResumeLandedProbe(),this.resumeCoordinator.dispose(),this.resumeCoordinator.endResumeCatchup(),this.resumeCoordinator.endContinueContentPlayout(),this.state.resumePrepositionSettle&&(clearTimeout(this.state.resumePrepositionSettle),this.state.resumePrepositionSettle=null),this.releaseContentHold(),this.clearContentGate(),this.clearFirstFrame("Controller destroyed before first frame"),this.firstFrameGateActive=!1,this.firstFrameGateShown=!1,this.resetGamPodTracking(),w(this.state),this.companionRemoveTimer&&(clearTimeout(this.companionRemoveTimer),this.companionRemoveTimer=null),this.adFadeTimer&&(clearTimeout(this.adFadeTimer),this.adFadeTimer=null),this.adPlayer?.pause(),this.clearOverlayImage(),this.pauseAdPresenter.destroy(),this.audio.destroy(),this.sharedElementPlayer.detachSharedAdListeners(),this.sharedElementPlayer.releaseContentElementAdPlayer(),this.state.pipTransferredToAd=!1,this.teardownFullscreenTracking(),this.teardownPictureInPictureTracking(),this.hide(),this.adStage.destroy(),this.resizeObserver?.disconnect(),this.resizeObserver=null,this.contentVideoMutationObserver?.disconnect(),this.contentVideoMutationObserver=null,this.contentVideoElement&&this.contentVideoGeometryHandler&&(this.contentVideoElement.removeEventListener("loadedmetadata",this.contentVideoGeometryHandler),this.contentVideoElement.removeEventListener("resize",this.contentVideoGeometryHandler)),this.contentVideoElement=null,this.contentVideoGeometryHandler=null;const e=this.adStage.restoreContent(this.playerContainerCreatedBySDK,this.playerContainerOriginalStyle);this.companionElement&&this.companionElement.parentElement&&(this.companionElement.parentElement.removeChild(this.companionElement),this.companionElement=null),this.isPlaying=!1,this.currentBreak=null,this.adContainer&&this.adContainer.parentElement&&this.adContainer.parentElement.removeChild(this.adContainer),!e&&this.stage&&this.stage.parentElement&&this.stage.parentElement.removeChild(this.stage),this.stage=null,this.adContainer=null,this.adMediaContainer=null;try{this.adPlayer?.destroy()}catch(e){this.log("Ad player adapter destroy failed (ignored):",e)}this.adPlayer=null,this.callbacks=null,this.gamPodBridge.destroy(),this.vastAdManager?.destroy(),this.vastAdManager=null,this.log("Ad player destroyed")}log(...e){this.debug&&u("[OptiViewAds:AdPlayerController]",...e)}}AdPlayerController.AD_START_BUDGET_MS=5e3,AdPlayerController.GAM_POD_AD_START_BUDGET_MS=1e4,AdPlayerController.MIN_AD_START_BUDGET_MS=3e3;
|
|
1
|
+
import{BreakFormat as e,MediaType as t,Timebase as s,isPostRollBreak as r}from"../types/BreakManifest";import{DEFAULT_AD_BREAK_CUT_SAFETY_MARGIN_SEC as a,DEFAULT_DOUBLE_BOX_AUDIO as i}from"../types/OptiViewAdsConfig";import{pipOverridesFormat as n,pipSuppressesBackdrop as o}from"./pictureInPicture";import{AdBreakSequencer as d,assetsOfVariant as l,resolveBreakFormat as h}from"./AdBreakSequencer";import{selectVariantDetailed as c}from"./selectVariant";import{debugLog as u}from"../diagnostics/debugLog";import{systemClock as m}from"./BreakScheduler";import{createAdPlayerState as g,invalidateMediaPreload as P}from"./adPlayer/AdPlayerState";import{beginBreakTally as p,gateBreakClock as y}from"./adPlayer/AdPlayerState";import{PauseAdPresenter as A}from"./adPlayer/PauseAdPresenter";import{AssetParameterResolver as v}from"./adPlayer/AssetParameterResolver";import{GamPodBridge as k}from"./adPlayer/GamPodBridge";import{AdStage as C}from"./adPlayer/AdStage";import{createDomPresentationHost as f,toPresentationSurfaces as S}from"./adPlayer/presentation/DomPresentationHost";import{AdPreloader as B}from"./adPlayer/AdPreloader";import{PresentationModeTracker as E}from"./adPlayer/PresentationModeTracker";import{SharedElementBreakPlayer as b}from"./adPlayer/SharedElementBreakPlayer";import{ContentResumeCoordinator as M}from"./adPlayer/ContentResumeCoordinator";import{resumeContentAfterBreak as T}from"./adPlayer/ContentRecovery";import{AssetPlayback as R}from"./adPlayer/AssetPlayback";import{SurfaceRevealReporter as I}from"./adPlayer/SurfaceRevealReporter";import{BreakSequenceDriver as F}from"./adPlayer/BreakSequenceDriver";import{VariantSelector as G}from"./adPlayer/VariantSelector";import{AdPlayerEvents as w}from"./adPlayer/AdPlayerEvents";import{SlateCoordinator as D}from"./adPlayer/SlateCoordinator";import{AudioController as O}from"./adPlayer/AudioController";import{armPlaybackCutoff as V,clearPlaybackCutoff as L}from"./adPlayer/PlaybackCutoff";import{AdError as U}from"../types/AdError";import{SuccessorQueue as H}from"./adPlayer/SuccessorQueue";export class AdPlayerController{get contentPaused(){return this.state.contentPaused}set contentPaused(e){this.state.contentPaused=e}get firstFrameGateActive(){return this.state.firstFrameGateActive}set firstFrameGateActive(e){this.state.firstFrameGateActive=e}get firstFrameGateShown(){return this.state.firstFrameGateShown}set firstFrameGateShown(e){this.state.firstFrameGateShown=e}get firstFrameRejector(){return this.state.firstFrameRejector}set firstFrameRejector(e){this.state.firstFrameRejector=e}get gamEventCallbacks(){return this.gamPodBridge.eventCallbacks}get vastAdManager(){return this.state.vastAdManager}set vastAdManager(e){this.state.vastAdManager=e}get currentBreak(){return this.state.currentBreak}set currentBreak(e){this.state.currentBreak=e}get currentAsset(){return this.state.currentAsset}set currentAsset(e){this.state.currentAsset=e}get callbacks(){return this.state.callbacks}set callbacks(e){this.state.callbacks=e}get isPlaying(){return this.state.isPlaying}set isPlaying(e){this.state.isPlaying=e}get effectiveBreakDurationSec(){return this.state.effectiveBreakDurationSec}set effectiveBreakDurationSec(e){this.state.effectiveBreakDurationSec=e}get adBreakCutSafetyMarginSec(){return this.state.adBreakCutSafetyMarginSec}set adBreakCutSafetyMarginSec(e){this.state.adBreakCutSafetyMarginSec=e}get durationTimer(){return this.state.durationTimer}set durationTimer(e){this.state.durationTimer=e}get adInsertionType(){return this.state.adInsertionType}set adInsertionType(e){this.state.adInsertionType=e}get breakTimebase(){return this.state.breakTimebase}set breakTimebase(e){this.state.breakTimebase=e}constructor(e,s,r,n,o=!1,d,l="parallel",h="overlay",c=a,u=i,p=!1,y=m,T="none"){this.playerContainerCreatedBySDK=!1,this.adMediaContainer=null,this.adPlayer=null,this.surfaceReveal=new I((e,t,s)=>this.diagnose(e,t,s)),this.adContainer=null,this.companionElement=null,this.staticQuartilesFired=new Set,this.sequencer=null,this.pendingAdError=null,this.preRollHoldActive=!1,this.preRollHoldHandler=null,this.breakContentGateHandler=null,this.destroyed=!1,this.abortingBreak=!1,this.overlayImageEl=null,this.imageAssetTimer=null,this.chainResolver=null,this.transitionPhaseReporter=null,this.chaining=!1,this.diagnoseHandler=null,this.playerContainerOriginalStyle="",this.companionRemoveTimer=null,this.adFadeTimer=null,this.volumeChangeCallback=null,this.stage=null,this.resizeObserver=null,this.contentVideoElement=null,this.contentVideoGeometryHandler=null,this.contentVideoMutationObserver=null,this.resumeGeneration=0,this.singleSurfaceDevice=!1,this.currentSelectedFormat=void 0,this.state=g(),this.state.playerContainer=r??null,this.clock=y,this.singleSurfaceDevice=p,this.contentPlayer=e,this.audio=new O({contentPlayer:e,isAdPlaying:()=>this.isPlaying,getVastAdManager:()=>this.vastAdManager,onVolumeChange:(e,t)=>this.volumeChangeCallback?.(e,t),log:(...e)=>this.log(...e)}),this.adBreakCutSafetyMarginSec=c,this.doubleBoxAudio=u,this.container=s,r&&(this.playerContainer=r),this.createAdAdapter=n,this.debug=o,this.state.gamConfig=d,this.preloadMode=l,this.insertionMode=h,this.pauseAdPresenter=new A({contentPlayer:this.contentPlayer,getStage:()=>this.stage,resolveUri:e=>this.assetParameters.resolveUri(e),buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.assetParameters=new v(this.state,{contentPlayer:this.contentPlayer,container:this.container,getGamStreamManager:()=>this.state.gamStreamManager,getCurrentBreak:()=>this.currentBreak,getEffectiveBreakDuration:()=>this.effectiveBreakDurationSec,diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.gamPodBridge=new k(this.state,{contentPlayer:this.contentPlayer,debug:this.debug,getAdPlayer:()=>this.adPlayer,getAdContainer:()=>this.adContainer,isSharedElement:()=>"shared-element"===this.effectiveInsertionMode(),getCurrentBreak:()=>this.currentBreak,getCurrentAsset:()=>this.currentAsset,getEffectiveBreakDuration:()=>this.effectiveBreakDurationSec,getAdPlayerStreamRemainingSec:()=>this.assetPlayback.adPlayerStreamRemainingSec(),emitStep:e=>this.emitStep(e),emitAdStart:(e,t,s,r,a)=>this.callbacks?.onAdStart(e,t,s,r,a),emitAdEnd:(e,t,s,r,a)=>this.callbacks?.onAdEnd(e,t,s,r,a),onAdEnded:()=>this.onAdEnded(),pushAssetParameters:(e,t)=>this.pushAssetParameters(e,t),assetParameterResolver:this.assetParameters,diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.adStage=new C({contentPlayer:this.contentPlayer,container:this.container,getPlayerContainer:()=>this.playerContainer,setPlayerContainer:e=>{this.playerContainer=e},setPlayerContainerOriginalStyle:e=>{this.playerContainerOriginalStyle=e},onPlayerContainerCreated:()=>{this.playerContainerCreatedBySDK=!0},getStage:()=>this.stage,setStage:e=>{this.stage=e},getContentVideo:()=>this.contentVideoElement,setContentVideo:e=>{this.contentVideoElement=e},getAdContainer:()=>this.adContainer,setAdContainer:e=>{this.adContainer=e},getAdMediaContainer:()=>this.adMediaContainer,setAdMediaContainer:e=>{this.adMediaContainer=e},setAdPlayer:e=>{P(this.state),this.adPlayer=e,e&&this.audio.attachAdPlayer(e)},createAdAdapter:e=>this.createAdAdapter(e),setupEventListeners:()=>this.setupEventListeners(),resizeVast:()=>this.vastAdManager?.resize(),getVariant:e=>this.getVariant(e),getCurrentBreak:()=>this.currentBreak,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),getCompanion:()=>this.companionElement,setCompanion:e=>{this.companionElement=e},getOverlayImage:()=>this.overlayImageEl,setOverlayImage:e=>{this.overlayImageEl=e},getImageAssetTimer:()=>this.imageAssetTimer,setImageAssetTimer:e=>{this.imageAssetTimer=e},isChaining:()=>this.chaining,log:(...e)=>this.log(...e),presentationHost:f(()=>S(this.playerContainer,this.adContainer,this.stage))}),this.preloader=new B({state:this.state,clock:this.clock,adStartBudgetMs:AdPlayerController.AD_START_BUDGET_MS,gamPodAdStartBudgetMs:AdPlayerController.GAM_POD_AD_START_BUDGET_MS,minAdStartBudgetMs:AdPlayerController.MIN_AD_START_BUDGET_MS,debug:this.debug,isPlaying:()=>this.isPlaying,preloadMode:this.preloadMode,effectiveInsertionMode:()=>this.effectiveInsertionMode(),getVariant:e=>this.getVariant(e),getAssets:e=>this.getAssets(e),buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),resolveAssetUri:(e,t,s)=>this.resolveAssetUri(e,t,s),getCompanionVariant:e=>this.getVariant(e),getAdPlayer:()=>this.adPlayer,getAdContainer:()=>this.adContainer,buildVastTagUrl:(e,t)=>this.buildVastTagUrl(e,t),resolveChainedSuccessor:e=>this.resolveChainedSuccessor(e),show:()=>this.show(),reapplyAdContainerLayout:e=>this.reapplyAdContainerLayout(e),getCurrentBreak:()=>this.currentBreak,onBreakVisible:e=>this.callbacks?.onBreakVisible?.(e),onAdError:e=>this.onAdError(e),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.presentationModes=new E(this.state,{contentPlayer:this.contentPlayer,getAdPlayer:()=>this.adPlayer,insertionMode:this.insertionMode,getCurrentBreak:()=>this.currentBreak,getCurrentFormat:()=>this.currentSelectedFormat,isSharedElementActive:()=>this.state.sharedAdClaimActive,getVariant:e=>this.getVariant(e),isAdPlaying:()=>this.isAdPlaying(),hasCurrentAsset:()=>null!==this.currentAsset,contentSourceIsReloadable:()=>null!==this.sharedElementPlayer.restorableContentSource(),adoptPictureInPictureMidBreak:()=>this.adoptPictureInPictureMidBreak(),restoreLayout:()=>this.restoreLayout(),applyLayout:e=>this.applyLayout(e),show:()=>this.show(),playAdThroughContentElement:()=>this.sharedElementPlayer.playAdThroughContentElement(),getContentPositionAtBreakStart:()=>this.state.contentPositionAtBreakStart,setContentPositionAtBreakStart:e=>this.resumeCoordinator.reanchorMidBreak(e),gateContentForBreak:()=>this.gateContentForBreak(),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.resumeCoordinator=new M(this.state,{contentPlayer:this.contentPlayer,clock:this.clock,getInsertionMode:()=>this.effectiveInsertionMode(),gateContentForBreak:()=>this.gateContentForBreak(),clearContentGate:e=>this.clearContentGate(e),muteContent:()=>this.audio.mute("content"),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.recoveryDeps={contentPlayer:e,getCallbacks:()=>this.callbacks,preloadMode:l,contentRecovery:T,resumeCoordinator:this.resumeCoordinator,diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)},this.sharedElementPlayer=new b(this.state,{contentPlayer:this.contentPlayer,clock:this.clock,getAdPlayer:()=>this.adPlayer,surfaceReveal:this.surfaceReveal,resolveAssetUri:(e,t)=>this.resolveAssetUri(e,t),liveEdgeDistanceSec:()=>this.resumeCoordinator.liveEdgeDistanceSec(),rebindContentElementIfSwapped:()=>this.rebindContentElementIfSwapped(),createAdAdapter:(e,t)=>this.createAdAdapter(e,t),reportAdProgress:e=>this.reportAdProgress(e),processTimedMetadata:e=>this.gamPodBridge.processTimedMetadata(e),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e),clearContentGate:()=>this.clearContentGate(),hide:()=>this.hide(),waitForLiveEdge:e=>this.resumeCoordinator.waitForLiveEdge(e),getVariant:e=>this.getVariant(e),getAssets:e=>this.getAssets(e),onSlateMediaEvent:(e,t)=>this.slates.playback.handleMediaEvent(e,t),settleAssetProgress:e=>e?this.adPlayerEvents.settleErroredAssetProgress():this.adPlayerEvents.settleAssetProgress(this.sharedElementPlayer.currentSharedAdSource()?.duration),planSlateAfterAds:e=>this.slates.planAfterAds(e),startSlate:(e,t)=>this.slates.start(e,t)}),this.variantSelector=new G(this.state,{getEffectiveInsertionMode:()=>this.effectiveInsertionMode(),singleSurfaceDevice:this.singleSurfaceDevice,preloadMode:this.preloadMode,getIsContentPictureInPicture:()=>this.isContentPictureInPicture(),getIsGamReady:()=>this.isGamReady(),getSupportsParallelBuffering:()=>this.contentPlayer.supportsParallelBuffering,diagnose:(e,t,s)=>this.diagnose(e,t,s)}),this.successorQueue=new H({getAdPlayer:()=>this.adPlayer,isEnabled:()=>"parallel"===this.preloadMode&&"overlay"===this.effectiveInsertionMode()&&!this.state.sharedAdClaimActive,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),getCallbacks:()=>this.state.callbacks,log:(...e)=>this.log(...e)}),this.assetPlayback=new R(this.state,{getAdPlayer:()=>this.adPlayer,getAdContainer:()=>this.adContainer,getAdMediaContainer:()=>this.adMediaContainer,clearStaticQuartiles:()=>this.staticQuartilesFired.clear(),getVariant:e=>this.getVariant(e),getGamEventCallbacks:()=>this.gamEventCallbacks,getSequencer:()=>this.sequencer,debug:this.debug,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),buildGamUrl:(e,t)=>this.buildGamUrl(e,t),buildVastTagUrl:(e,t)=>this.buildVastTagUrl(e,t),onAdError:e=>this.onAdError(e),onAdEnded:()=>this.onAdEnded(),drive:e=>this.drive(e),clearOverlayImage:()=>this.clearOverlayImage(),revealFirstFrame:()=>this.preloader.revealFirstFrame(),surfaceReveal:this.surfaceReveal,transferPictureInPictureToAd:()=>this.presentationModes.transferPictureInPictureToAd(),isGamPodAsset:e=>this.isGamPodAsset(e),hasGamIdentityMismatch:e=>this.gamPodBridge.hasIdentityMismatch(e),beginGamPodTracking:e=>this.gamPodBridge.beginGamPodTracking(e),recordAdProgress:e=>this.adPlayerEvents.recordAdProgress(e),completeCreative:e=>this.adPlayerEvents.completeCreative(e),reportPhase:e=>this.reportPhase(e),armAdStartBudget:e=>this.armAdStartBudget(e),takeQueuedSuccessor:(e,t,s)=>this.successorQueue.take(e,t,s),queueUpcomingAd:()=>{const e=this.sequencer?.upcomingAsset();e&&this.currentBreak&&this.successorQueue.prepare(this.currentBreak,e,!1)},remainingAdStartBudgetMs:()=>this.remainingAdStartBudgetMs(),loadWithinBudget:(e,t)=>this.loadWithinBudget(e,t),waitForFirstFrame:()=>this.waitForFirstFrame(),getOverlayImage:()=>this.overlayImageEl,setOverlayImage:e=>{this.overlayImageEl=e},getImageAssetTimer:()=>this.imageAssetTimer,setImageAssetTimer:e=>{this.imageAssetTimer=e},getVastPodPosition:()=>this.vastPodPosition,setVastPodPosition:e=>{this.vastPodPosition=e},diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.breakSequenceDriver=new F(this.state,{successorQueue:this.successorQueue,getAssets:e=>this.getAssets(e),getChainResolver:()=>this.chainResolver,getEffectiveInsertionMode:()=>this.effectiveInsertionMode(),getVastPodPosition:()=>this.vastPodPosition,setVastPodPosition:e=>{this.vastPodPosition=e},getPendingAdError:()=>this.pendingAdError,setPendingAdError:e=>{this.pendingAdError=e},getChaining:()=>this.chaining,setChaining:e=>{this.chaining=e},isExpandingPodAsset:e=>this.isExpandingPodAsset(e),fallBackToPodLevelReporting:()=>this.fallBackToPodLevelReporting(),resetGamPodTracking:()=>this.resetGamPodTracking(),emitGamPodSteps:e=>this.gamPodBridge.emitGamPodSteps(e),playAsset:(e,t,s)=>this.playAsset(e,t,s),playSlate:(e,t)=>this.slates.start(e,t),diagnoseSlateNotStarted:e=>this.slates.diagnoseNotStarted(e),endBreak:()=>this.endBreak(),playBreak:(e,t,s)=>this.playBreak(e,t,s),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e)}),this.adPlayerEvents=new w(this.state,{getAdPlayer:()=>this.adPlayer,getContentPlayer:()=>this.contentPlayer,getGamEventCallbacks:()=>this.gamEventCallbacks,getSequencer:()=>this.sequencer,onAdEnded:()=>this.onAdEnded(),processTimedMetadata:e=>this.gamPodBridge.processTimedMetadata(e),toAdError:e=>this.toAdError(e),revealFirstFrame:()=>this.revealFirstFrame(),clearFirstFrameResolver:()=>this.preloader.clearFirstFrameResolver(),drive:e=>this.drive(e),setPendingAdError:e=>{this.pendingAdError=e},dropQueuedAd:()=>this.successorQueue.drop(),log:(...e)=>this.log(...e),maybePrepositionContentForResume:()=>"single-decoder"!==this.preloadMode&&this.resumeCoordinator.maybePrepositionContentForResume(),maybeCatchUpContentForResume:e=>"single-decoder"!==this.preloadMode&&this.resumeCoordinator.maybeCatchUpContentForResume(e),getStaticQuartilesFired:()=>this.staticQuartilesFired,onGamPodAdProgress:e=>this.gamPodBridge.onGamPodAdProgress(e),onSlateMediaEvent:(e,t)=>this.slates.playback.handleMediaEvent(e,t)}),this.slates=new D(this.state,{getAdPlayer:()=>"shared-element"===this.currentInsertionMode()?this.sharedElementPlayer.currentSharedAdSource()??this.adPlayer:this.adPlayer,getAdMediaContainer:()=>this.adMediaContainer,buildStaticAssetUrl:(e,t)=>this.buildStaticAssetUrl(e,t),setOverlayImage:e=>{this.overlayImageEl=e},getOverlayImage:()=>this.overlayImageEl,clearOverlayImage:()=>this.clearOverlayImage(),revealFirstFrame:()=>this.revealFirstFrame(),onProgress:e=>this.adPlayerEvents.reportSlateProgress(e),emitAdError:(e,t,s)=>this.callbacks?.onAdError(e,t,s),diagnose:(e,t,s)=>this.diagnose(e,t,s),log:(...e)=>this.log(...e),cancelSurfaceReveal:()=>this.surfaceReveal.cancel(),getSequencer:()=>this.sequencer,drive:e=>this.drive(e),clock:this.clock,rendersSlate:e=>"shared-element"===this.effectiveInsertionMode()?e.asset.mediaType!==t.IMAGE:!this.state.sharedAdClaimActive,isSharedBreak:()=>"shared-element"===this.currentInsertionMode(),finishSharedSlate:()=>this.sharedElementPlayer.finishSlatedBreak()})}setSlate(e){this.slates.set(e)&&e&&this.preloader.sideloadSlate(e)}setGamEventCallbacks(e){this.gamPodBridge.setEventCallbacks(e)}setDiagnoseHandler(e){this.diagnoseHandler=e}diagnose(e,t,s){this.diagnoseHandler?.(e,t,s)}holdContentForPreRoll(e){if(this.preRollHoldActive)return;const t=this.getVariant(e);t&&this.shouldPauseContent(t.format)&&(this.preRollHoldActive=!0,this.contentPlayer.pause(),this.preRollHoldHandler=()=>{this.preRollHoldActive&&this.contentPlayer.pause()},this.contentPlayer.on("playing",this.preRollHoldHandler),this.diagnose("DA-PREROLL-CONTENT-HELD","Content held at session start until the pending pre-roll begins.",{breakId:e.id}))}releaseContentHold(){this.preRollHoldActive&&(this.preRollHoldActive=!1,this.preRollHoldHandler&&(this.contentPlayer.off("playing",this.preRollHoldHandler),this.preRollHoldHandler=null))}gateContentForBreak(){this.contentPlayer.pause(),this.breakContentGateHandler||(this.breakContentGateHandler=()=>{this.contentPaused&&!this.state.resumeCatchupActive&&this.contentPlayer.pause()},this.contentPlayer.on("playing",this.breakContentGateHandler))}clearContentGate(e=!1){this.resumeCoordinator.endResumeCatchup(e),this.breakContentGateHandler&&(this.contentPlayer.off("playing",this.breakContentGateHandler),this.breakContentGateHandler=null)}setChainResolver(e){this.chainResolver=e}onChainSuccessorChanged(){this.sequencer&&this.currentBreak&&this.isPlaying&&this.drive(this.sequencer.onOutcome({kind:"successor-changed"}),!0)}setResumeCueAnchorResolver(e){this.resumeCoordinator.setCueAnchorResolver(e)}setResumeCueEndResolver(e){this.resumeCoordinator.setCueEndResolver(e)}ingestStreamClockCue(e){this.resumeCoordinator.ingestStreamClockCue(e)}setTransitionPhaseReporter(e){this.transitionPhaseReporter=e}reportPhase(e){this.transitionPhaseReporter?.(e)}setBreakResumePolicy(e,t,s=!1){this.adInsertionType=e,this.breakTimebase=t,this.state.continueContentDuringBreak=s,this.state.continueRefusalReported=!1}initialize(){this.adContainer||(this.setupOverlay(),this.presentationModes.setupPictureInPictureTracking(),"adaptive"===this.insertionMode&&this.presentationModes.setupFullscreenTracking())}async startGamSession(e,t){await this.gamPodBridge.startGamSession(e,t)}endGamSession(){this.gamPodBridge.endGamSession()}setSessionAssetParameters(e){this.assetParameters.setSessionAssetParameters(e)}setManifestAssetParameters(e){this.assetParameters.setManifestAssetParameters(e)}updateAssetParameters(e){this.assetParameters.updateAssetParameters(e)}resolveExternalVendorConfiguration(e){return this.assetParameters.resolveExternalVendorConfiguration(e)}updateAssetParameterMacros(e){this.assetParameters.updateAssetParameterMacros(e)}get updatedAssetParameters(){return this.state.updatedAssetParameters}setSessionAssetParameterMacros(e){this.assetParameters.setSessionAssetParameterMacros(e)}get sessionAssetParameterMacros(){return this.assetParameters.getSessionAssetParameterMacros()}buildVastTagUrl(e,t){return this.assetParameters.buildVastTagUrl(e,t)}buildStaticAssetUrl(e,t){return this.assetParameters.buildStaticAssetUrl(e,t)}pushAssetParameters(e,t){this.assetParameters.pushAssetParameters(e,t)}setupOverlay(){this.adStage.setupOverlay()}isGamPodAsset(e){return this.gamPodBridge.isGamPodAsset(e)}isExpandingPodAsset(e){return this.gamPodBridge.isExpandingPodAsset(e)}fallBackToPodLevelReporting(){this.gamPodBridge.fallBackToPodLevelReporting()}resetGamPodTracking(){this.gamPodBridge.resetGamPodTracking()}emitGamPodSteps(e){this.gamPodBridge.emitGamPodSteps(e)}isGamEnabled(){return this.gamPodBridge.isGamEnabled()}isGamReady(){return this.gamPodBridge.isGamReady()}isOverlayInsertion(){return"overlay"===this.effectiveInsertionMode()}settleAssetProgress(){this.adPlayerEvents.settleEndedAsset()}reportAdProgress(e){this.adPlayerEvents.reportAdProgress(e)}setupEventListeners(){this.adPlayerEvents.setupEventListeners()}async preload(e){return this.preloader.preload(e)}renderLshapeContentBackdrop(e){this.adStage.renderLshapeContentBackdrop(e)}currentInsertionMode(){return this.presentationModes.currentInsertionMode()}effectiveInsertionMode(){return this.presentationModes.effectiveInsertionMode()}isContentPictureInPicture(){return this.presentationModes.isPictureInPicture()}rebindContentElementIfSwapped(){this.presentationModes.rebindContentElementIfSwapped()}teardownFullscreenTracking(){this.presentationModes.teardownFullscreenTracking()}teardownPictureInPictureTracking(){this.presentationModes.teardownPictureInPictureTracking()}isPictureInPicture(){return this.presentationModes.isPictureInPicture()}pictureInPictureOwner(){return this.presentationModes.pictureInPictureOwner()}isShowingAd(){if(!this.isAdPlaying())return!1;const e=this.currentDeclaredFormat();return!o(e,this.isContentPictureInPicture())}currentDeclaredFormat(){return this.currentSelectedFormat??(this.currentBreak?h(this.currentBreak):void 0)}async playBreak(t,s,a){if(this.state.preloadGeneration++,this.resumeGeneration++,!this.sharedElementPlayer.beginSharedActivity())return;this.state.snapbackResumePosition=a?.snapbackResumePosition,this.releaseContentHold(),this.rebindContentElementIfSwapped();const i=a?.effectiveDurationSec??null;this.effectiveBreakDurationSec=null!==i&&i>0?i:null;const o=this.effectiveBreakDurationSec??t.duration;if("shared-element"===this.effectiveInsertionMode())return P(this.state),void await this.sharedElementPlayer.playSharedElementBreak(t,s);if(!this.adPlayer)return void this.log("playBreak called before initialize()");const l=this.getVariant(t);if(!l)return void this.log("No valid variant found for break:",t.id);this.currentBreak=t,this.callbacks=a?.firstFrameGate?y(this.state,s,this.clock):s,this.isPlaying=!0,p(this.state,this.clock.now()),this.firstFrameGateActive=a?.firstFrameGate??!1,this.firstFrameGateShown=!1;const h=this.continueContentDuringBreakReason(l.format),c=r(t),u=this.shouldPauseContent(l.format)&&"ok"===h&&!c;u||c||this.state.continueRefusalReported||!this.shouldPauseContent(l.format)||(this.state.continueRefusalReported=!0,this.diagnose("DA-CONTINUE-PLAYOUT-REFUSED",`Content will be paused for breaks this session: ${h}`,{reason:h,format:l.format})),l.format===e.DOUBLE?this.audio.mute("ad"===this.doubleBoxAudio?"content":"ad"):u?this.audio.mute("content"):this.shouldPauseContent(l.format)&&this.audio.unmute("ad");const m=this.declaredFormatOf(t);this.currentSelectedFormat=m,this.state.pipAdoptedForBreak=n(m,this.isContentPictureInPicture()),this.state.pipAdoptedForBreak&&this.diagnose("DA-PIP-FORMAT-OVERRIDE",`Picture-in-picture: ${m} break plays as single`,{declared:m,effective:e.SINGLE,reason:"picture-in-picture",midBreak:!1}),this.shouldPauseContent(l.format)?(this.resumeCoordinator.captureBreakAnchor(t),u?(this.contentPaused=!1,this.resumeCoordinator.beginContinueContentPlayout()):(this.contentPaused=!0,this.gateContentForBreak())):this.contentPaused=!1,this.applyLayout(l);const g=l.format===e.LSHAPE_CONTENT&&0===this.getAssets(t).length&&this.slates.coversEmptyBreak(t,o);if(l.format===e.LSHAPE_CONTENT&&!g)return this.renderLshapeContentBackdrop(l),void(o&&o>0?(this.log("Starting duration timer:",o,"seconds"),this.durationTimer=setTimeout(()=>{this.log("Duration timer expired, ending break"),this.endBreak()},1e3*o)):this.endBreak());this.firstFrameGateActive||(this.show(),this.reapplyAdContainerLayout(l));if(0===this.getAssets(t).length&&!this.slates.coversEmptyBreak(t,o))return this.log("No assets in break, ending immediately"),void this.endBreak();{const e=Math.max(0,o||0)+this.adBreakCutSafetyMarginSec;V(this.state,e,()=>{this.log("Break-cut timer expired, ending break"),this.firstFrameRejector?this.onAdError(new U("Break cut before first frame rendered","DA-AD-START-TIMEOUT")):this.sequencer&&this.currentBreak&&this.isPlaying?(this.callbacks?.onBreakCut?.(this.currentBreak),this.drive(this.sequencer.onOutcome({kind:"break-elapsed"}))):this.endBreak()},()=>this.onAdError(new U("Ad playback startup timed out","DA-AD-START-TIMEOUT")))}this.sequencer=new d("overlay",()=>null,this.selectionInputs(),e=>this.resolveChainedSuccessor(e),this.slates.resolver),await this.drive(this.sequencer.beginBreak(t)),this.preloadChainedSuccessor(t.id)}get resumeHandoverInMotion(){return this.state.resumeCatchupActive}reapplyAdContainerLayout(e){this.adStage.reapplyAdContainerLayout(e)}adoptPictureInPictureMidBreak(){this.presentationModes.adoptPictureInPictureMidBreak()}async restorePictureInPictureToContent(){await this.presentationModes.restorePictureInPictureToContent()}continueContentDuringBreakReason(e){return this.variantSelector.continueContentDuringBreakReason(e)}shouldPauseContent(t){return t===e.SINGLE||t===e.LSHAPE_AD}selectionInputs(){return this.variantSelector.selectionInputs()}breakNothingToPlayReason(e,t){const s="overlay"===this.effectiveInsertionMode()&&this.slates.coversEmptyBreak(e,t);return this.variantSelector.breakNothingToPlayReason(e,s)}unknownVariantFormatsOf(e){return this.variantSelector.unknownVariantFormatsOf(e)}diagnoseVariantAnomalies(e){this.variantSelector.diagnoseVariantAnomalies(e)}declaredFormatOf(e){const{selected:t,deviceQualified:s}=c(e,this.selectionInputs());return(t??s)?.format??h(e)}snapbackFormatOf(t){const{selected:s,deviceQualified:r}=c(t,this.selectionInputs()),a=s?.format??(r?e.SINGLE:void 0);return"shared-element"!==this.effectiveInsertionMode()||a!==e.DOUBLE&&a!==e.OVERLAY?a:e.SINGLE}getVariant(e){return this.variantSelector.getVariant(e)}applyLayout(e){this.adStage.applyLayout(e)}restoreLayout(){this.adStage.restoreLayout()}getAssets(e){return l(this.getVariant(e))}async playAsset(e,t,s){return this.assetPlayback.playAsset(e,t,s)}clearOverlayImage(){this.adStage.clearOverlayImage()}async showPauseImage(e){return this.pauseAdPresenter.showPauseImage(e)}hidePauseImage(){this.pauseAdPresenter.hidePauseImage()}async drive(e,t=!1){return this.breakSequenceDriver.drive(e,t)}emitStep(e){this.breakSequenceDriver.emitStep(e)}async resolveAssetUri(e,t,s){return this.assetPlayback.resolveAssetUri(e,t,s)}async buildGamUrl(e,t){return this.gamPodBridge.buildGamUrl(e,t)}onAdEnded(){this.currentBreak&&this.isPlaying&&this.sequencer&&(this.settleAssetProgress(),this.drive(this.sequencer.onOutcome({kind:"asset-ended"})))}toAdError(e){return this.assetPlayback.toAdError(e)}onAdError(e){this.adPlayerEvents.onAdError(e)}endBreak(){if(!this.currentBreak)return;this.log("Break ended:",this.currentBreak.id),L(this.state),this.state.gamPodTracker&&this.emitGamPodSteps(this.state.gamPodTracker.finish()),this.resetGamPodTracking(),this.pushAssetParameters(void 0);const e=this.currentBreak;let t=this.abortingBreak?null:this.resolveChainedSuccessor(e.id);if(t){const e=this.breakNothingToPlayReason(t);this.diagnoseVariantAnomalies(t),e&&(this.diagnose("DA-BREAK-NO-PLAYABLE-ASSET",`chained break ${t.id} has no playable variant (${e}); it will not begin.`,{breakId:t.id,reason:e}),this.callbacks?.onAdError(t,void 0,new U(`Break ${t.id} has no playable variant (${e})`,"DA-BREAK-NO-PLAYABLE-ASSET")),this.callbacks?.onChainedBreakSkipped?.(t),t=null)}if(t)return void this.advanceToChainedBreak(e,t);if(this.currentSelectedFormat=void 0,this.resumeCoordinator.endContinueContentPlayout(),this.restorePictureInPictureToContent(),this.isPlaying=!1,this.currentBreak=null,this.resumeGeneration++,this.effectiveBreakDurationSec=null,P(this.state),this.preloader.clearWarmedBreaks(),this.successorQueue.reset(),this.firstFrameGateActive=!1,this.firstFrameGateShown=!1,this.clearFirstFrame("Break ended before first frame"),this.audio.unmuteAll(),this.clearOverlayImage(),this.vastAdManager?.reset(),this.hide(),this.restoreLayout(),this.adPlayer?.pause(),this.state.sharedAdClaimActive){const t=this.callbacks;return this.sharedElementPlayer.detachSharedAdListeners(),this.abortingBreak=!1,this.state.earlyReturnResumeOffsetSec=null,this.sharedElementPlayer.restoreSharedElementContent(e),void t?.onBreakEnd(e)}const a="recreate"===this.recoveryDeps.contentRecovery&&"function"==typeof this.contentPlayer.recreateMediaPipeline,i="single-decoder"===this.preloadMode||a?this.adPlayer?.unload?.():void 0,n=!this.contentPaused&&void 0!==this.state.snapbackResumePosition;if(this.contentPaused&&r(e))this.contentPaused=!1,this.clearContentGate();else if(this.contentPaused){this.contentPaused=!1,this.clearContentGate(this.resumeHandoverInMotion);const t=this.resumeGeneration;T(this.recoveryDeps,{breakInfo:e,earlyReturnOffsetSec:this.state.earlyReturnResumeOffsetSec,isLiveResume:this.breakTimebase===s.WALLCLOCK,released:i,isCurrent:()=>t===this.resumeGeneration})}this.abortingBreak=!1,this.state.earlyReturnResumeOffsetSec=null;const o=this.resumeGeneration;this.callbacks?.onBreakEnd(e),n&&o===this.resumeGeneration&&!r(e)&&this.resumeCoordinator.applyResumeSeek(e)}currentAdAsset(){return this.isPlaying?this.currentAsset:null}skipBreak(){this.isPlaying&&(this.log("Skipping break:",this.currentBreak?.id),L(this.state),this.slates.playback.stop("skipped"),this.sequencer&&this.currentBreak?this.drive(this.sequencer.onOutcome({kind:"break-elapsed"})):this.endBreak())}abortBreak(e){this.isPlaying&&(this.log("Early return — break removed from manifest:",this.currentBreak?.id),this.state.earlyReturnResumeOffsetSec=Math.max(0,e),this.abortingBreak=!0,L(this.state),this.slates.playback.stop("removed"),this.sequencer&&this.currentBreak?this.drive(this.sequencer.onOutcome({kind:"break-elapsed"})):this.endBreak())}stopActiveBreak(){P(this.state),this.successorQueue.reset(),this.sharedElementPlayer.cancelSharedRestore()&&this.isPlaying&&(this.log("Aborting active break on session end:",this.currentBreak?.id),L(this.state),this.slates.playback.stop("removed"),this.sharedElementPlayer.detachSharedAdListeners(),this.sharedElementPlayer.releaseContentElementAdPlayer(),this.adPlayer?.pause(),this.clearOverlayImage(),this.vastAdManager?.reset(),this.hide(),this.restoreLayout(),this.isPlaying=!1,this.currentBreak=null,this.currentAsset=null,this.contentPaused=!1,this.clearContentGate(),this.resumeCoordinator.endContinueContentPlayout(),this.effectiveBreakDurationSec=null,this.firstFrameGateActive=!1,this.firstFrameGateShown=!1,this.clearFirstFrame("Break aborted before first frame"),this.audio.unmuteAll())}abandonContentResume(){this.resumeGeneration++,this.clearContentGate(),this.sharedElementPlayer.cancelSharedRestore(),this.resumeCoordinator.cancelResumeLandedProbe()}resolveChainedSuccessor(e){return this.breakSequenceDriver.resolveChainedSuccessor(e)}advanceToChainedBreak(e,t){this.breakSequenceDriver.advanceToChainedBreak(e,t)}preloadChainedSuccessor(e){this.preloader.preloadChainedSuccessor(e)}revealFirstFrame(){this.assetPlayback.revealFirstFrame()}armAdStartBudget(e){this.preloader.armAdStartBudget(e)}remainingAdStartBudgetMs(){return this.preloader.remainingAdStartBudgetMs()}loadWithinBudget(e,t){return this.preloader.loadWithinBudget(e,t)}async waitForFirstFrame(){return this.preloader.waitForFirstFrame()}clearFirstFrame(e="Break ended before first frame"){this.preloader.clearFirstFrame(e)}show(){this.adStage.show(),this.surfaceReveal.surfaceShown()}hide(){this.adStage.hide(),this.surfaceReveal.surfaceHidden()}isAdPlaying(){return this.isPlaying}get muted(){return this.audio.muted}set muted(e){this.audio.muted=e}get volume(){return this.audio.volume}set volume(e){this.audio.volume=e}setVolumeChangeCallback(e){this.volumeChangeCallback=e}destroy(){if(this.destroyed)return;if(this.resumeGeneration++,P(this.state),this.successorQueue.reset(),!this.sharedElementPlayer.beginSharedActivity())return;this.destroyed=!0,this.adStage.destroy(),this.resumeCoordinator.cancelResumeLandedProbe(),this.resumeCoordinator.dispose(),this.resumeCoordinator.endResumeCatchup(),this.resumeCoordinator.endContinueContentPlayout(),this.state.resumePrepositionSettle&&(clearTimeout(this.state.resumePrepositionSettle),this.state.resumePrepositionSettle=null),this.releaseContentHold(),this.clearContentGate(),this.clearFirstFrame("Controller destroyed before first frame"),this.firstFrameGateActive=!1,this.firstFrameGateShown=!1,this.resetGamPodTracking(),L(this.state),this.slates.playback.stop("removed"),this.companionRemoveTimer&&(clearTimeout(this.companionRemoveTimer),this.companionRemoveTimer=null),this.adFadeTimer&&(clearTimeout(this.adFadeTimer),this.adFadeTimer=null),this.adPlayer?.pause(),this.clearOverlayImage(),this.pauseAdPresenter.destroy(),this.audio.destroy(),this.sharedElementPlayer.detachSharedAdListeners(),this.sharedElementPlayer.releaseContentElementAdPlayer(),this.state.pipTransferredToAd=!1,this.teardownFullscreenTracking(),this.teardownPictureInPictureTracking(),this.hide(),this.adStage.destroy(),this.resizeObserver?.disconnect(),this.resizeObserver=null,this.contentVideoMutationObserver?.disconnect(),this.contentVideoMutationObserver=null,this.contentVideoElement&&this.contentVideoGeometryHandler&&(this.contentVideoElement.removeEventListener("loadedmetadata",this.contentVideoGeometryHandler),this.contentVideoElement.removeEventListener("resize",this.contentVideoGeometryHandler)),this.contentVideoElement=null,this.contentVideoGeometryHandler=null;const e=this.adStage.restoreContent(this.playerContainerCreatedBySDK,this.playerContainerOriginalStyle);this.companionElement&&this.companionElement.parentElement&&(this.companionElement.parentElement.removeChild(this.companionElement),this.companionElement=null),this.isPlaying=!1,this.currentBreak=null,this.adContainer&&this.adContainer.parentElement&&this.adContainer.parentElement.removeChild(this.adContainer),!e&&this.stage&&this.stage.parentElement&&this.stage.parentElement.removeChild(this.stage),this.stage=null,this.adContainer=null,this.adMediaContainer=null;try{this.adPlayer?.destroy()}catch(e){this.log("Ad player adapter destroy failed (ignored):",e)}this.adPlayer=null,this.callbacks=null,this.gamPodBridge.destroy(),this.vastAdManager?.destroy(),this.vastAdManager=null,this.log("Ad player destroyed")}log(...e){this.debug&&u("[OptiViewAds:AdPlayerController]",...e)}}AdPlayerController.AD_START_BUDGET_MS=5e3,AdPlayerController.GAM_POD_AD_START_BUDGET_MS=1e4,AdPlayerController.MIN_AD_START_BUDGET_MS=3e3;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Timebase, type Break } from '../types/BreakManifest';
|
|
2
|
+
import { type BreakStartCallback, type SchedulerDiagnose } from './BreakSchedulerTypes';
|
|
3
|
+
import type { TrackedBreak } from './RewindRearm';
|
|
4
|
+
export declare class BookmarkStart {
|
|
5
|
+
private position;
|
|
6
|
+
private considered;
|
|
7
|
+
private excluded;
|
|
8
|
+
capture(position: number, timebase: Timebase): boolean;
|
|
9
|
+
reset(): void;
|
|
10
|
+
eligible(brk: Break, from: number): boolean;
|
|
11
|
+
check(tracked: Iterable<TrackedBreak>, retiredBreaks: Map<string, Break>, position: number, held: boolean, skip: (item: TrackedBreak) => void, start: BreakStartCallback, diagnose: SchedulerDiagnose | null): boolean;
|
|
12
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{getBreakEvent as t,getPreRollDelay as e,Timebase as i}from"../types/BreakManifest";import{BreakState as s}from"./BreakSchedulerTypes";const r=.5;export class BookmarkStart{constructor(){this.position=null,this.considered=new Set,this.excluded=new Set}capture(t,e){return!(null!==this.position||e!==i.MEDIATIME||!Number.isFinite(t))&&(this.position=t,!0)}reset(){this.position=null,this.considered.clear(),this.excluded.clear()}eligible(t,e){return!(!this.considered.has(t.id)&&null!==this.position&&this.position>r&&"number"==typeof t.start&&t.start<this.position-r)&&(!this.excluded.has(t.id)||"number"==typeof t.start&&null!==this.position&&e<this.position-r&&e<t.start&&(this.excluded.delete(t.id),!0))}check(i,o,n,d,a,l,h){const u=this.position;if(null===u||u<=r)return!1;const c=[];let p;for(const l of[...i]){if(l.state!==s.PENDING)continue;const i=l.break;if(this.considered.has(i.id))continue;null!==e(i)||"number"==typeof i.start&&i.start<u-r?(this.considered.add(i.id),this.excluded.add(i.id),c.push(i.id),a(l),null===t(i)&&o.set(i.id,i)):!d&&void 0===p&&"number"==typeof i.start&&Math.abs(i.start-u)<=r&&Math.abs(n-u)<=r&&(p=l)}return c.length>0&&h?.("DA-BOOKMARK-START","VOD bookmark start skipped earlier breaks",{position:u,skippedBreakIds:c}),!!p&&(this.considered.add(p.break.id),p.state=s.ACTIVE,l(p.break,{tuneIn:!1,elapsedSec:0,remainingSec:p.break.duration}),!0)}}
|