@dolby-optiview/ads-sdk-core 1.0.0-beta.1
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 +190 -0
- package/dist/OptiViewAds.js +1 -0
- package/dist/config/keys.d.ts +23 -0
- package/dist/config/keys.js +1 -0
- package/dist/diagnostics/DiagnosticBuffer.d.ts +33 -0
- package/dist/diagnostics/DiagnosticBuffer.js +1 -0
- package/dist/diagnostics/DiagnosticEvent.d.ts +71 -0
- package/dist/diagnostics/DiagnosticEvent.js +1 -0
- package/dist/diagnostics/debugLog.d.ts +8 -0
- package/dist/diagnostics/debugLog.js +1 -0
- package/dist/diagnostics/errorCodes.d.ts +45 -0
- package/dist/diagnostics/errorCodes.js +1 -0
- package/dist/diagnostics/index.d.ts +6 -0
- package/dist/diagnostics/index.js +1 -0
- package/dist/diagnostics/playbackErrorContext.d.ts +22 -0
- package/dist/diagnostics/playbackErrorContext.js +1 -0
- package/dist/generated/diagnosticCodes.d.ts +487 -0
- package/dist/generated/diagnosticCodes.js +1 -0
- package/dist/generated/version.d.ts +5 -0
- package/dist/generated/version.js +1 -0
- package/dist/id3/buildId3.d.ts +25 -0
- package/dist/id3/buildId3.js +1 -0
- package/dist/id3/index.d.ts +3 -0
- package/dist/id3/index.js +1 -0
- package/dist/id3/parseId3Geob.d.ts +28 -0
- package/dist/id3/parseId3Geob.js +1 -0
- package/dist/index.d.ts +45 -0
- package/dist/index.js +1 -0
- package/dist/interfaces/PlayerAdapter.d.ts +163 -0
- package/dist/interfaces/PlayerAdapter.js +1 -0
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.js +1 -0
- package/dist/server/index.d.ts +20 -0
- package/dist/server/index.js +1 -0
- package/dist/services/AdBreakSequencer.d.ts +146 -0
- package/dist/services/AdBreakSequencer.js +1 -0
- package/dist/services/AdPlayerController.d.ts +495 -0
- package/dist/services/AdPlayerController.js +1 -0
- package/dist/services/BreakScheduler.d.ts +215 -0
- package/dist/services/BreakScheduler.js +1 -0
- package/dist/services/BreakTransitionTimer.d.ts +48 -0
- package/dist/services/BreakTransitionTimer.js +1 -0
- package/dist/services/CmcdAdReporter.d.ts +81 -0
- package/dist/services/CmcdAdReporter.js +1 -0
- package/dist/services/GamPodAdTracker.d.ts +65 -0
- package/dist/services/GamPodAdTracker.js +1 -0
- package/dist/services/GamPodUrlBuilder.d.ts +30 -0
- package/dist/services/GamPodUrlBuilder.js +1 -0
- package/dist/services/GamStreamManager.d.ts +67 -0
- package/dist/services/GamStreamManager.js +1 -0
- package/dist/services/LensReporter.d.ts +30 -0
- package/dist/services/LensReporter.js +1 -0
- package/dist/services/ManifestService.d.ts +91 -0
- package/dist/services/ManifestService.js +1 -0
- package/dist/services/MetadataCueTracker.d.ts +44 -0
- package/dist/services/MetadataCueTracker.js +1 -0
- package/dist/services/PauseAdController.d.ts +108 -0
- package/dist/services/PauseAdController.js +1 -0
- package/dist/services/RewindRearm.d.ts +109 -0
- package/dist/services/RewindRearm.js +1 -0
- package/dist/services/SsaiController.d.ts +59 -0
- package/dist/services/SsaiController.js +1 -0
- package/dist/services/StitcherUrlBuilder.d.ts +34 -0
- package/dist/services/StitcherUrlBuilder.js +1 -0
- package/dist/services/VastAdManager.d.ts +89 -0
- package/dist/services/VastAdManager.js +1 -0
- package/dist/services/adPlayer/AdPlayerEvents.d.ts +39 -0
- package/dist/services/adPlayer/AdPlayerEvents.js +1 -0
- package/dist/services/adPlayer/AdPlayerState.d.ts +98 -0
- package/dist/services/adPlayer/AdPlayerState.js +1 -0
- package/dist/services/adPlayer/AdPreloader.d.ts +54 -0
- package/dist/services/adPlayer/AdPreloader.js +1 -0
- package/dist/services/adPlayer/AdStage.d.ts +57 -0
- package/dist/services/adPlayer/AdStage.js +1 -0
- package/dist/services/adPlayer/AssetParameterResolver.d.ts +44 -0
- package/dist/services/adPlayer/AssetParameterResolver.js +1 -0
- package/dist/services/adPlayer/AssetPlayback.d.ts +71 -0
- package/dist/services/adPlayer/AssetPlayback.js +1 -0
- package/dist/services/adPlayer/BreakSequenceDriver.d.ts +46 -0
- package/dist/services/adPlayer/BreakSequenceDriver.js +1 -0
- package/dist/services/adPlayer/ContentResumeCoordinator.d.ts +44 -0
- package/dist/services/adPlayer/ContentResumeCoordinator.js +1 -0
- package/dist/services/adPlayer/ContinueContentPlayout.d.ts +26 -0
- package/dist/services/adPlayer/ContinueContentPlayout.js +1 -0
- package/dist/services/adPlayer/GamPodBridge.d.ts +66 -0
- package/dist/services/adPlayer/GamPodBridge.js +1 -0
- package/dist/services/adPlayer/PauseAdPresenter.d.ts +60 -0
- package/dist/services/adPlayer/PauseAdPresenter.js +1 -0
- package/dist/services/adPlayer/PresentationModeTracker.d.ts +66 -0
- package/dist/services/adPlayer/PresentationModeTracker.js +1 -0
- package/dist/services/adPlayer/SharedElementBreakPlayer.d.ts +54 -0
- package/dist/services/adPlayer/SharedElementBreakPlayer.js +1 -0
- package/dist/services/adPlayer/VariantSelector.d.ts +38 -0
- package/dist/services/adPlayer/VariantSelector.js +1 -0
- package/dist/services/adPlayer/connectPauseAd.d.ts +10 -0
- package/dist/services/adPlayer/connectPauseAd.js +1 -0
- package/dist/services/adPlayer/liveEdge.d.ts +6 -0
- package/dist/services/adPlayer/liveEdge.js +1 -0
- package/dist/services/assetParameterMacroTable.d.ts +9 -0
- package/dist/services/assetParameterMacroTable.js +1 -0
- package/dist/services/assetParameterMacros.d.ts +69 -0
- package/dist/services/assetParameterMacros.js +1 -0
- package/dist/services/breakTiming.d.ts +60 -0
- package/dist/services/breakTiming.js +1 -0
- package/dist/services/channelSwitch.d.ts +32 -0
- package/dist/services/channelSwitch.js +1 -0
- package/dist/services/detectDeviceType.d.ts +15 -0
- package/dist/services/detectDeviceType.js +1 -0
- package/dist/services/detectInsertionMode.d.ts +38 -0
- package/dist/services/detectInsertionMode.js +1 -0
- package/dist/services/detectPreloadMode.d.ts +13 -0
- package/dist/services/detectPreloadMode.js +1 -0
- package/dist/services/ed25519.d.ts +19 -0
- package/dist/services/ed25519.js +1 -0
- package/dist/services/fetchWithTimeout.d.ts +35 -0
- package/dist/services/fetchWithTimeout.js +1 -0
- package/dist/services/lensBackend.d.ts +16 -0
- package/dist/services/lensBackend.js +1 -0
- package/dist/services/lensBackendDevelopment.d.ts +1 -0
- package/dist/services/lensBackendDevelopment.js +1 -0
- package/dist/services/lensBackendProduction.d.ts +9 -0
- package/dist/services/lensBackendProduction.js +1 -0
- package/dist/services/manifestSignature.d.ts +43 -0
- package/dist/services/manifestSignature.js +1 -0
- package/dist/services/manifestTrustedKeys.d.ts +9 -0
- package/dist/services/manifestTrustedKeys.js +1 -0
- package/dist/services/parseBreakManifest.d.ts +15 -0
- package/dist/services/parseBreakManifest.js +1 -0
- package/dist/services/parseVastCompanion.d.ts +31 -0
- package/dist/services/parseVastCompanion.js +1 -0
- package/dist/services/parseVastLinear.d.ts +36 -0
- package/dist/services/parseVastLinear.js +1 -0
- package/dist/services/pictureInPicture.d.ts +28 -0
- package/dist/services/pictureInPicture.js +1 -0
- package/dist/services/resolveAssetParameters.d.ts +6 -0
- package/dist/services/resolveAssetParameters.js +1 -0
- package/dist/services/resolveDeliveryMode.d.ts +54 -0
- package/dist/services/resolveDeliveryMode.js +1 -0
- package/dist/services/resolveGamVendorConfiguration.d.ts +55 -0
- package/dist/services/resolveGamVendorConfiguration.js +1 -0
- package/dist/services/resolvePauseResumePoint.d.ts +32 -0
- package/dist/services/resolvePauseResumePoint.js +1 -0
- package/dist/services/resolvePollingDecision.d.ts +24 -0
- package/dist/services/resolvePollingDecision.js +1 -0
- package/dist/services/resolveResumePoint.d.ts +38 -0
- package/dist/services/resolveResumePoint.js +1 -0
- package/dist/services/resolveTargetedUri.d.ts +22 -0
- package/dist/services/resolveTargetedUri.js +1 -0
- package/dist/services/resolveVastAdmission.d.ts +34 -0
- package/dist/services/resolveVastAdmission.js +1 -0
- package/dist/services/selectVariant.d.ts +47 -0
- package/dist/services/selectVariant.js +1 -0
- package/dist/services/urlOrigin.d.ts +23 -0
- package/dist/services/urlOrigin.js +1 -0
- package/dist/session/AdBreakStatusTracker.d.ts +49 -0
- package/dist/session/AdBreakStatusTracker.js +1 -0
- package/dist/session/BreakLifecycle.d.ts +62 -0
- package/dist/session/BreakLifecycle.js +1 -0
- package/dist/session/SessionStarter.d.ts +98 -0
- package/dist/session/SessionStarter.js +1 -0
- package/dist/session/SessionState.d.ts +37 -0
- package/dist/session/SessionState.js +1 -0
- package/dist/types/BreakManifest.d.ts +335 -0
- package/dist/types/BreakManifest.js +1 -0
- package/dist/types/Events.d.ts +245 -0
- package/dist/types/Events.js +1 -0
- package/dist/types/OptiViewAdsConfig.d.ts +425 -0
- package/dist/types/OptiViewAdsConfig.js +1 -0
- package/dist/types/VendorAdError.d.ts +12 -0
- package/dist/types/VendorAdError.js +1 -0
- package/dist/vendor/lens-sdk/THIRD-PARTY-NOTICES.txt +266 -0
- package/dist/vendor/lens-sdk/compat.d.ts +9 -0
- package/dist/vendor/lens-sdk/encoding-cmcd.d.ts +9 -0
- package/dist/vendor/lens-sdk/encoding-json.d.ts +9 -0
- package/dist/vendor/lens-sdk/encoding.d.ts +42 -0
- package/dist/vendor/lens-sdk/environment.d.ts +35 -0
- package/dist/vendor/lens-sdk/index.d.ts +3 -0
- package/dist/vendor/lens-sdk/index.js +1 -0
- package/dist/vendor/lens-sdk/legacy.d.ts +12 -0
- package/dist/vendor/lens-sdk/lens-core-Q5lbQGMC.js +1 -0
- package/dist/vendor/lens-sdk/lens-global.d.ts +23 -0
- package/dist/vendor/lens-sdk/lens.d.ts +21 -0
- package/dist/vendor/lens-sdk/transport.d.ts +46 -0
- package/dist/vendor/lens-sdk/types.d.ts +218 -0
- package/dist/vendor/lens-sdk/user-id.d.ts +5 -0
- package/dist/vendor/lens-sdk/validation.d.ts +30 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function parseId3GeobFrames(e){const n=[];if(e.length<10||73!==e[0]||68!==e[1]||51!==e[2])return n;const r=e[3],f=e[5],c=Math.min(10+u(e,6),e.length);let a=10;for(64&f&&(a+=function(e,n,t){return n+4>e.length?0:t>=4?u(e,n):4+o(e,n)}(e,a,r));a+10<=c&&0!==e[a];){const f=t(e.subarray(a,a+4)),d=r>=4?u(e,a+4):o(e,a+4),l=a+10;if(d<=0||l+d>c)break;if("GEOB"===f){const t=parseId3GeobBody(e.subarray(l,l+d));t&&n.push(t)}a=l+d}return n}export function parseId3GeobBody(r){if(r.length<1)return null;const u=r[0],o=e(r,1,0);if(!o)return null;const f=e(r,o.next,u);if(!f)return null;const c=e(r,f.next,u);return c?{mimeType:t(r.subarray(1,o.end)),fileName:n(r.subarray(o.next,f.end),u),description:n(r.subarray(f.next,c.end),u),data:r.subarray(c.next)}:null}function e(e,n,t){if(!(1===t||2===t)){for(let t=n;t<e.length;t++)if(0===e[t])return{end:t,next:t+1};return null}for(let t=n;t+1<e.length;t+=2)if(0===e[t]&&0===e[t+1])return{end:t,next:t+2};return null}function n(e,n){switch(n){case 0:return t(e);case 1:return r(e,!1);case 2:return r(e,!0);default:return decodeUtf8(e)}}export function decodeUtf8(e){return new TextDecoder("utf-8").decode(e)}function t(e){let n="";for(let t=0;t<e.length;t++)n+=String.fromCharCode(e[t]);return n}function r(e,n){return e.length>=2&&255===e[0]&&254===e[1]?new TextDecoder("utf-16le").decode(e.subarray(2)):e.length>=2&&254===e[0]&&255===e[1]?new TextDecoder("utf-16be").decode(e.subarray(2)):new TextDecoder(n?"utf-16be":"utf-16le").decode(e)}function u(e,n){return(127&e[n])<<21|(127&e[n+1])<<14|(127&e[n+2])<<7|127&e[n+3]}function o(e,n){return(e[n]<<24|e[n+1]<<16|e[n+2]<<8|e[n+3])>>>0}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
export { OptiViewAds } from './OptiViewAds';
|
|
2
|
+
export type { PlayerAdapter, PlayerAdapterEvent, PlayerAdapterEventHandler, TimedMetadataCue, VideoQuality, } from './interfaces/PlayerAdapter';
|
|
3
|
+
export type { BreakManifest, Break, BreakPosition, EventTrigger, BreakVariant, SingleBreakVariant, DoubleBreakVariant, LshapeAdBreakVariant, LshapeContentBreakVariant, OverlayBreakVariant, AssetWithCompanion, OverlayPosition, OverlaySize, Asset, StaticAsset, VastAsset, VendorAsset, Polling, Controls, Targeting, Interaction, AssetUri, DeliveryRule, VendorConfiguration, VendorConfigurationBase, GamVendorConfiguration, GamSgaiConfiguration, GamSsaiConfiguration, } from './types/BreakManifest';
|
|
4
|
+
export { BreakFormat, AssetType, MediaType, Vendor, Timebase, DeviceType, DeliveryMode, BreakEvent, } from './types/BreakManifest';
|
|
5
|
+
export { isStaticAsset, isVastAsset, isVendorAsset, isGamVendorConfiguration, isEventTrigger, isPauseBreak, } from './types/BreakManifest';
|
|
6
|
+
export { resolveDeliveryMode, resolveStitchedStreamVendor, SsaiUnavailableError, } from './services/resolveDeliveryMode';
|
|
7
|
+
export type { DeliveryModeDecision } from './services/resolveDeliveryMode';
|
|
8
|
+
export type { StitchedStreamVendor } from './services/resolveDeliveryMode';
|
|
9
|
+
export type { OptiViewAdsConfig, OptiViewAdsMode, PtsSource, GamConfig, SessionConfig, SsaiSessionConfig, StartSessionConfig, CreateAdAdapter, AdPreloadMode, AdInsertionMode, AdInsertionType, SsaiConfig, DoubleBoxAudio, ChainingConfig, ResolvedChaining, TuneInConfig, ResolvedTuneIn, ManifestResponseInterceptor, ManifestInterceptContext, ManifestRequestInterceptor, ManifestRequestContext, ManifestRequest, ManifestMockResponse, ManifestRequestInterceptorResult, } from './types/OptiViewAdsConfig';
|
|
10
|
+
export { DEFAULT_MODE, DEFAULT_AD_PRELOAD_MODE, DEFAULT_AD_INSERTION_MODE, DEFAULT_CHAINING, resolveChaining, DEFAULT_TUNE_IN, resolveTuneIn, DEFAULT_PDT_GRACE_SECONDS, resolvePdtGraceSeconds, } from './types/OptiViewAdsConfig';
|
|
11
|
+
export type { StitcherMasterUrlParams } from './services/StitcherUrlBuilder';
|
|
12
|
+
export { buildStitcherMasterUrl } from './services/StitcherUrlBuilder';
|
|
13
|
+
export type { GamStreamConfig, GamAdEventCallbacks } from './services/GamStreamManager';
|
|
14
|
+
export { GamStreamManager } from './services/GamStreamManager';
|
|
15
|
+
export type { AssetParameterMacro, AssetParameterMacroValue, AssetParameterMacros, } from './services/assetParameterMacros';
|
|
16
|
+
export { OPTIVIEW_ASSET_PARAMETER_MACROS } from './services/assetParameterMacros';
|
|
17
|
+
export type { VastAdCallbacks } from './services/VastAdManager';
|
|
18
|
+
export { VastAdManager, isImaCsaiSdkAvailable } from './services/VastAdManager';
|
|
19
|
+
export type { SsaiControllerOptions, SsaiControllerCallbacks } from './services/SsaiController';
|
|
20
|
+
export { SsaiController } from './services/SsaiController';
|
|
21
|
+
export type { ResolvedPreloadMode } from './services/detectPreloadMode';
|
|
22
|
+
export { resolvePreloadMode, isSingleDecoderUserAgent } from './services/detectPreloadMode';
|
|
23
|
+
export type { ResolvedInsertionMode, MediaSourceCapabilities, } from './services/detectInsertionMode';
|
|
24
|
+
export { resolveInsertionMode, isSharedElementUserAgent, detectMediaSourceCapabilities, } from './services/detectInsertionMode';
|
|
25
|
+
export type { Clock, TuneInOptions, BreakStartContext } from './services/BreakScheduler';
|
|
26
|
+
export { systemClock } from './services/BreakScheduler';
|
|
27
|
+
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';
|
|
28
|
+
export type { PauseAdResolution, PauseAdShowCallback, PauseAdHideCallback, PauseAdDiagnoseCallback, } from './services/PauseAdController';
|
|
29
|
+
export { PauseAdController } from './services/PauseAdController';
|
|
30
|
+
export type { VastCompanionImage } from './services/parseVastCompanion';
|
|
31
|
+
export { parseVastCompanionImage } from './services/parseVastCompanion';
|
|
32
|
+
export type { EffectiveInsertionMode, AdBreakStep, AdBreakAction, AdBreakOutcome, AdBreakTransition, NoPlayableAssetReason, NoPlayableAssetNotice, ChainResolver, } from './services/AdBreakSequencer';
|
|
33
|
+
export { AdBreakSequencer, selectVariant, extractAssets, assetsOfVariant, resolveBreakFormat, breakPlanEmptyReason, } from './services/AdBreakSequencer';
|
|
34
|
+
export type { VariantSelectionInputs, VariantSelection } from './services/selectVariant';
|
|
35
|
+
export { selectVariantDetailed, playableFormatsFor, variantsOf, RENDERABLE_BREAK_FORMATS, KNOWN_BREAK_FORMATS, } from './services/selectVariant';
|
|
36
|
+
export type { GamPodAdInfo, GamPodAdStep, GamPodCurrentAd } from './services/GamPodAdTracker';
|
|
37
|
+
export { GamPodAdTracker, derivePodAdAsset } from './services/GamPodAdTracker';
|
|
38
|
+
export type { DiagnosticEvent, DiagnosticHandler, DiagnosticReport, ConfigSummary, DiagnosticCategory, DiagnosticLevel, DiagnosticCodeInfo, KnownDiagnosticCode, } from './diagnostics';
|
|
39
|
+
export { DIAGNOSTIC_CODES, getDiagnosticCodeInfo, DiagnosticBuffer, DEFAULT_DIAGNOSTIC_BUFFER_SIZE, SDK_VERSION, } from './diagnostics';
|
|
40
|
+
export type { DiagnosticsConfig, BreakWarningsConfig } from './types/OptiViewAdsConfig';
|
|
41
|
+
export { parseBreakManifest, SUPPORTED_MANIFEST_MAJOR_VERSION, } from './services/parseBreakManifest';
|
|
42
|
+
export { fetchWithTimeout, AUX_FETCH_TIMEOUT_MS } from './services/fetchWithTimeout';
|
|
43
|
+
export type { GamVendorParameters } from './services/GamPodUrlBuilder';
|
|
44
|
+
export { buildGamPodUrl, isGamVendorParameters } from './services/GamPodUrlBuilder';
|
|
45
|
+
export type { OptiViewAdsEventType, OptiViewAdsEventHandler, OptiViewAdsEventMap, OptiViewAdsEvent, AdBreakBeginEvent, AdBreakEndEvent, AdBeginEvent, AdEndEvent, AdErrorEvent, AdFirstQuartileEvent, AdMidpointEvent, AdThirdQuartileEvent, AdTimeupdateEvent, WaitingEvent, PlayingEvent, VolumeChangeEvent, AdClickEvent, PlaybackSource, AdBreakPhase, AdBreakStatus, AdBreakStatusEvent, AdChannelChangeEvent, AdChannelChangeReason, } from './types/Events';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{OptiViewAds}from"./OptiViewAds";export{BreakFormat,AssetType,MediaType,Vendor,Timebase,DeviceType,DeliveryMode,BreakEvent}from"./types/BreakManifest";export{isStaticAsset,isVastAsset,isVendorAsset,isGamVendorConfiguration,isEventTrigger,isPauseBreak}from"./types/BreakManifest";export{resolveDeliveryMode,resolveStitchedStreamVendor,SsaiUnavailableError}from"./services/resolveDeliveryMode";export{DEFAULT_MODE,DEFAULT_AD_PRELOAD_MODE,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{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{fetchWithTimeout,AUX_FETCH_TIMEOUT_MS}from"./services/fetchWithTimeout";export{buildGamPodUrl,isGamVendorParameters}from"./services/GamPodUrlBuilder";
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Events a PlayerAdapter must support. `timedmetadata` is capability-style: adapters that
|
|
3
|
+
* can surface in-stream markers (HLS ID3 / EXT-X-DATERANGE, DASH emsg) emit it per marker.
|
|
4
|
+
* @category Player Integration */
|
|
5
|
+
export type PlayerAdapterEvent = 'timeupdate' | 'ended' | 'error' | 'seeked' | 'volumechange' | 'waiting' | 'playing' | 'pause' | 'timedmetadata';
|
|
6
|
+
/**
|
|
7
|
+
* One in-stream timed-metadata marker (payload of `timedmetadata`). Minimal, player-agnostic:
|
|
8
|
+
* - `id3`: HLS ID3 — parsed text `frames` and/or undecoded `raw` bytes.
|
|
9
|
+
* - `daterange`: HLS `EXT-X-DATERANGE` — `id` / `schemeIdUri` / `messageData`.
|
|
10
|
+
* - `emsg`: DASH/CMAF event message — `schemeIdUri` / `messageData`.
|
|
11
|
+
* @category Player Integration */
|
|
12
|
+
export interface TimedMetadataCue {
|
|
13
|
+
/** Marker source type. */
|
|
14
|
+
type: 'id3' | 'daterange' | 'emsg';
|
|
15
|
+
/** Presentation time of the marker, in seconds. */
|
|
16
|
+
startTime: number;
|
|
17
|
+
/** Optional end/active-until time, in seconds. */
|
|
18
|
+
endTime?: number | undefined;
|
|
19
|
+
/** Parsed ID3 text frames keyed by frame id (e.g. `TXXX`). */
|
|
20
|
+
frames?: Record<string, string> | undefined;
|
|
21
|
+
/** ID3 frame description (e.g. GEOB `Anvatos` for Anvato break-signaling cues), when surfaced. */
|
|
22
|
+
description?: string | undefined;
|
|
23
|
+
/** ID3 GEOB MIME type (e.g. `application/json`), when surfaced. */
|
|
24
|
+
mimeType?: string | undefined;
|
|
25
|
+
/** Undecoded marker bytes (ID3/emsg), when available. */
|
|
26
|
+
raw?: Uint8Array | undefined;
|
|
27
|
+
/** Marker identifier (`EXT-X-DATERANGE` ID / emsg id). */
|
|
28
|
+
id?: string | undefined;
|
|
29
|
+
/** Scheme URI (`EXT-X-DATERANGE` scheme / emsg schemeIdUri). */
|
|
30
|
+
schemeIdUri?: string | undefined;
|
|
31
|
+
/** emsg message data, daterange client attribute, or the decoded (UTF-8) data of an ID3 GEOB frame. */
|
|
32
|
+
messageData?: string | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* When the cue was delivered relative to `startTime`. `parsed` means the segment was
|
|
35
|
+
* parsed before playback reached the cue; `presented` means the playhead reached it.
|
|
36
|
+
* Omit this property when the adapter cannot distinguish the two. Marking an early
|
|
37
|
+
* parsed cue as `presented` can cause an ad break to start before its scheduled time.
|
|
38
|
+
*/
|
|
39
|
+
phase?: 'parsed' | 'presented' | undefined;
|
|
40
|
+
}
|
|
41
|
+
/** For `timedmetadata` the payload is a {@link TimedMetadataCue}; other events are event-specific (often undefined, or a media error for `error`). @category Player Integration */
|
|
42
|
+
export type PlayerAdapterEventHandler = (event?: unknown) => void;
|
|
43
|
+
/** A quality selection understood by the optional adapter operation. @category Player Integration */
|
|
44
|
+
export type VideoQuality = 'lowest';
|
|
45
|
+
/**
|
|
46
|
+
* The abstraction layer between the SDK and any video player. The core only talks to players
|
|
47
|
+
* through this interface; each player gets its own adapter package.
|
|
48
|
+
*
|
|
49
|
+
* @example
|
|
50
|
+
* ```typescript
|
|
51
|
+
* class HlsJsAdapter implements PlayerAdapter {
|
|
52
|
+
* constructor(private hls: Hls, private video: HTMLVideoElement) {}
|
|
53
|
+
* // ... implement all methods
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
* @category Player Integration */
|
|
57
|
+
export interface PlayerAdapter {
|
|
58
|
+
/** Current playback time in seconds. */
|
|
59
|
+
readonly currentTime: number;
|
|
60
|
+
/** Content duration in seconds; may be Infinity for live streams. */
|
|
61
|
+
readonly duration: number;
|
|
62
|
+
/** Whether the player is paused. */
|
|
63
|
+
readonly paused: boolean;
|
|
64
|
+
/** Settable so the SDK can sync mute state between content and ad players. */
|
|
65
|
+
muted: boolean;
|
|
66
|
+
/** Volume in [0, 1]; settable so the SDK can sync it between content and ad players. */
|
|
67
|
+
volume: number;
|
|
68
|
+
/** Program Date Time (HLS EXT-X-PROGRAM-DATE-TIME) for wallclock break matching; null if unavailable. */
|
|
69
|
+
readonly programDateTime: Date | null;
|
|
70
|
+
/** Pause playback (called when an ad break starts). */
|
|
71
|
+
pause(): void;
|
|
72
|
+
/** Resume playback (called when an ad break ends); resolves when playback starts. */
|
|
73
|
+
play(): Promise<void>;
|
|
74
|
+
/** Seek to a time in seconds. Needed for snapback during locked breaks without touching the video element. */
|
|
75
|
+
seek(time: number): void;
|
|
76
|
+
/** Load a media source without playing; resolves when it is ready to play. Used to preload ads. */
|
|
77
|
+
load(url: string): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Current content manifest URL, used to restore content after a shared-element ad.
|
|
80
|
+
* Read it from the player engine, not the element's `src` (which can be a `blob:` URL)
|
|
81
|
+
* or the last `load()` argument, since applications may load sources directly.
|
|
82
|
+
* Return `null` when unavailable; shared-element insertion is then unsupported
|
|
83
|
+
* (`DA-SHARED-ELEMENT-UNSUPPORTED`).
|
|
84
|
+
*/
|
|
85
|
+
readonly sourceUrl?: string | null;
|
|
86
|
+
/**
|
|
87
|
+
* Optional: warm caches (manifest, optionally the first fragment) WITHOUT attaching media or
|
|
88
|
+
* engaging a decoder, for single-decoder Smart TVs that cannot hold two MediaSources. Must not
|
|
89
|
+
* call attachMedia(). Leave undefined if unsupported; the SDK loads on demand at break start.
|
|
90
|
+
*/
|
|
91
|
+
preload?(url: string): Promise<void>;
|
|
92
|
+
/**
|
|
93
|
+
* Release the held media without destroying the adapter; the next `load()` must reattach it.
|
|
94
|
+
* Called on single-decoder TVs at break end, before content resumes, to free the hardware
|
|
95
|
+
* decoder and avoid `MEDIA_ERR_DECODE`. Not called in parallel-preload mode.
|
|
96
|
+
*/
|
|
97
|
+
unload?(): void;
|
|
98
|
+
/**
|
|
99
|
+
* Optional capability hint: can content and ad pipelines buffer in parallel without decoder
|
|
100
|
+
* contention? `false` prevents continued content playout during a break. Undefined counts as capable.
|
|
101
|
+
*/
|
|
102
|
+
readonly supportsParallelBuffering?: boolean;
|
|
103
|
+
/** Subscribe to player events. */
|
|
104
|
+
on(event: PlayerAdapterEvent, handler: PlayerAdapterEventHandler): void;
|
|
105
|
+
/** Unsubscribe from player events. */
|
|
106
|
+
off(event: PlayerAdapterEvent, handler: PlayerAdapterEventHandler): void;
|
|
107
|
+
/**
|
|
108
|
+
* Whether the content is live, as reported by the player engine. Return `null` or omit
|
|
109
|
+
* this property when unknown; the SDK then falls back to checking for an infinite duration.
|
|
110
|
+
* A finite duration does not reliably identify VOD: HLS.js can report a finite live playlist.
|
|
111
|
+
*
|
|
112
|
+
* | Player | Live status |
|
|
113
|
+
* |--------|-------------|
|
|
114
|
+
* | HLS.js | `hls.latestLevelDetails.live` |
|
|
115
|
+
* | Shaka | `player.isLive()` |
|
|
116
|
+
* | THEOplayer | `duration === Infinity` |
|
|
117
|
+
*
|
|
118
|
+
* Do not infer live status from {@link maxLiveSeekPosition}; a seek range can exist for VOD too.
|
|
119
|
+
*/
|
|
120
|
+
readonly isLive?: boolean | null;
|
|
121
|
+
/**
|
|
122
|
+
* Latest live playback position the player can seek to without moving back to maintain
|
|
123
|
+
* its minimum live offset, in seconds. Return `null` when unknown or not live; the SDK
|
|
124
|
+
* then leaves the seek target unclamped. Use the player engine's seek limit rather than
|
|
125
|
+
* guessing an offset: HLS.js exposes `liveSyncPosition`, THEOplayer exposes
|
|
126
|
+
* `latencyManager.currentLatency` / `minimumOffset`, and Shaka exposes
|
|
127
|
+
* `seekRange()` / `safeSeekEndOffset`.
|
|
128
|
+
*/
|
|
129
|
+
readonly maxLiveSeekPosition?: number | null;
|
|
130
|
+
/**
|
|
131
|
+
* End of the available media in seconds, or `null` when unknown. This differs from
|
|
132
|
+
* {@link maxLiveSeekPosition}, which includes the player's minimum live offset.
|
|
133
|
+
* Read the engine's seek range if the video element reports an unbounded sentinel value
|
|
134
|
+
* instead of the actual DVR window. If omitted, the SDK uses `videoElement.seekable`
|
|
135
|
+
* and rejects sentinel values.
|
|
136
|
+
*/
|
|
137
|
+
readonly seekableEnd?: number | null;
|
|
138
|
+
/**
|
|
139
|
+
* Playback rate (`1` = normal). Used to correct drift while content continues behind an
|
|
140
|
+
* ad with `continueContentDuringBreak`. Report the engine's current rate, not just the last
|
|
141
|
+
* assigned value, so the SDK can detect changes made by the player's live-latency controller.
|
|
142
|
+
* If omitted, drift is reported but not corrected.
|
|
143
|
+
*/
|
|
144
|
+
playbackRate?: number;
|
|
145
|
+
/** The underlying HTMLVideoElement, if any. Required for GAM (the IMA SDK needs the element). */
|
|
146
|
+
readonly videoElement?: HTMLVideoElement | null;
|
|
147
|
+
/**
|
|
148
|
+
* Release control of the content video element so a shared-element ad can use it.
|
|
149
|
+
* Resolve only when the element is free; do not destroy the adapter. The SDK restores
|
|
150
|
+
* content with `load()` when the break ends. Omit this method if your player supports
|
|
151
|
+
* sharing the element without an explicit release, as HLS.js does.
|
|
152
|
+
*/
|
|
153
|
+
releaseMediaElement?(): void | Promise<void>;
|
|
154
|
+
/**
|
|
155
|
+
* Optionally select a content quality, or pass `null` to release the SDK's override.
|
|
156
|
+
* A successful `lowest` request snapshots the integrator's current selection and applies the
|
|
157
|
+
* cheapest rendition without flushing buffered media. Returns whether the request was applied;
|
|
158
|
+
* passing `null` restores the exact prior selection.
|
|
159
|
+
*/
|
|
160
|
+
setVideoQuality?(quality: VideoQuality | null): boolean;
|
|
161
|
+
/** Clean up resources when the SDK is destroyed. */
|
|
162
|
+
destroy(): void;
|
|
163
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export{};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Server-safe subset of `@dolby-optiview/ads-sdk-core`.
|
|
3
|
+
*
|
|
4
|
+
* Exposes only the **pure** units needed off the browser — manifest types +
|
|
5
|
+
* validation and the GAM pod-URL builder — without pulling the player/DOM/IMA
|
|
6
|
+
* runtime (`OptiViewAds`, `AdPlayerController`, `GamStreamManager`). Consumed by
|
|
7
|
+
* the SSAI stitcher (`@dolby-optiview/ads-sdk-stitcher`) and any other Node-side tooling.
|
|
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';
|
|
11
|
+
export { parseBreakManifest, SUPPORTED_MANIFEST_MAJOR_VERSION, } from '../services/parseBreakManifest';
|
|
12
|
+
export type { AdPreloadMode, AdInsertionMode, AdInsertionType, OptiViewAdsMode, } from '../types/OptiViewAdsConfig';
|
|
13
|
+
export type { ResolvedPreloadMode } from '../services/detectPreloadMode';
|
|
14
|
+
export { resolvePreloadMode, isSingleDecoderUserAgent } from '../services/detectPreloadMode';
|
|
15
|
+
export type { ResolvedInsertionMode, MediaSourceCapabilities, } from '../services/detectInsertionMode';
|
|
16
|
+
export { resolveInsertionMode, isSharedElementUserAgent, isSingleSurfaceWebDevice, } from '../services/detectInsertionMode';
|
|
17
|
+
export { detectDeviceType } from '../services/detectDeviceType';
|
|
18
|
+
export type { GamVendorParameters } from '../services/GamPodUrlBuilder';
|
|
19
|
+
export { buildGamPodUrl, isGamVendorParameters } from '../services/GamPodUrlBuilder';
|
|
20
|
+
export { SDK_VERSION } from '../generated/version';
|
|
@@ -0,0 +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{resolveInsertionMode,isSharedElementUserAgent,isSingleSurfaceWebDevice}from"../services/detectInsertionMode";export{detectDeviceType}from"../services/detectDeviceType";export{buildGamPodUrl,isGamVendorParameters}from"../services/GamPodUrlBuilder";export{SDK_VERSION}from"../generated/version";
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { Asset, Break, BreakFormat, BreakVariant } from '../types/BreakManifest';
|
|
2
|
+
import { type VariantSelectionInputs } from './selectVariant';
|
|
3
|
+
/**
|
|
4
|
+
* Portable, DOM-free authority on the ORDER of the public ad events for a break (and a chain):
|
|
5
|
+
* `adbreakbegin` → per asset `adbegin`/`adend` (or `aderror` then `adend`, no `adbegin`) →
|
|
6
|
+
* `adbreakend`. It performs no I/O and starts no timers; the render layer drives it and reports
|
|
7
|
+
* outcomes, so the event contract has one source of truth across platforms (`conformance/`).
|
|
8
|
+
* - `lshape_content` shows a backdrop with no ad video: only `adbreakbegin`/`adbreakend`.
|
|
9
|
+
* - Shared-element plays only the first asset as a single fullscreen ad; `lshape_content` is skipped.
|
|
10
|
+
* - Chaining is overlay-only: the finished break `adbreakend`s and the successor `adbreakbegin`s at once.
|
|
11
|
+
*/
|
|
12
|
+
/** The insertion mode the sequencer needs, after `adaptive` has been resolved. */
|
|
13
|
+
export type EffectiveInsertionMode = 'overlay' | 'shared-element';
|
|
14
|
+
/** A single SDK ad event, in emission order. */
|
|
15
|
+
export interface AdBreakStep {
|
|
16
|
+
type: 'adbreakbegin' | 'adbegin' | 'adend' | 'aderror' | 'adbreakend';
|
|
17
|
+
break: Break;
|
|
18
|
+
/** The declared format of the break's selected variant. */
|
|
19
|
+
format?: BreakFormat | undefined;
|
|
20
|
+
asset?: Asset;
|
|
21
|
+
adIndex?: number;
|
|
22
|
+
totalAds?: number;
|
|
23
|
+
}
|
|
24
|
+
/** The side effect the driver must perform next. */
|
|
25
|
+
export type AdBreakAction =
|
|
26
|
+
/** Load + play this asset through the overlay ad player. */
|
|
27
|
+
{
|
|
28
|
+
kind: 'play-asset';
|
|
29
|
+
asset: Asset;
|
|
30
|
+
index: number;
|
|
31
|
+
total: number;
|
|
32
|
+
}
|
|
33
|
+
/** Play a single fullscreen ad through the content element (shared-element). */
|
|
34
|
+
| {
|
|
35
|
+
kind: 'play-shared';
|
|
36
|
+
asset: Asset;
|
|
37
|
+
}
|
|
38
|
+
/** Render the lshape_content backdrop (no ad video); end on the duration timer. */
|
|
39
|
+
| {
|
|
40
|
+
kind: 'render-backdrop';
|
|
41
|
+
}
|
|
42
|
+
/** The break has fully ended (no chain): tear down and resume content. */
|
|
43
|
+
| {
|
|
44
|
+
kind: 'end-break';
|
|
45
|
+
}
|
|
46
|
+
/** Nothing to do; the driver awaits the next outcome (asset end/error/timer). */
|
|
47
|
+
| {
|
|
48
|
+
kind: 'await';
|
|
49
|
+
};
|
|
50
|
+
/** An outcome the driver reports back to advance the sequence. */
|
|
51
|
+
export type AdBreakOutcome =
|
|
52
|
+
/** Overlay/shared asset playback actually started (play() resolved). */
|
|
53
|
+
{
|
|
54
|
+
kind: 'asset-started';
|
|
55
|
+
}
|
|
56
|
+
/** The current asset finished playing. */
|
|
57
|
+
| {
|
|
58
|
+
kind: 'asset-ended';
|
|
59
|
+
}
|
|
60
|
+
/** The current asset failed to load/play. */
|
|
61
|
+
| {
|
|
62
|
+
kind: 'asset-errored';
|
|
63
|
+
}
|
|
64
|
+
/** The lshape_content backdrop duration elapsed. */
|
|
65
|
+
| {
|
|
66
|
+
kind: 'backdrop-elapsed';
|
|
67
|
+
}
|
|
68
|
+
/** The break's max-duration timer elapsed, cutting the break short. */
|
|
69
|
+
| {
|
|
70
|
+
kind: 'break-elapsed';
|
|
71
|
+
};
|
|
72
|
+
/**
|
|
73
|
+
* Why a break produced no ad: `no-variant`, `no-qualifying-variant` (none passed device
|
|
74
|
+
* targeting + format playability, no downgrade), `no-assets` (selected variant had no usable
|
|
75
|
+
* asset), `lshape-content-skipped` (shared-element cannot render a backdrop).
|
|
76
|
+
*/
|
|
77
|
+
export type NoPlayableAssetReason = 'no-variant' | 'no-qualifying-variant' | 'no-assets' | 'lshape-content-skipped';
|
|
78
|
+
/** A break that began and ended without a single ad, and why. */
|
|
79
|
+
export interface NoPlayableAssetNotice {
|
|
80
|
+
breakId: string;
|
|
81
|
+
reason: NoPlayableAssetReason;
|
|
82
|
+
/** The declared format of the selected variant; absent when none was selected. */
|
|
83
|
+
format?: BreakFormat | undefined;
|
|
84
|
+
/** Assets the manifest declared. `no-assets` with a non-zero count means they were all filtered out (targeting, media type), not missing. */
|
|
85
|
+
declaredAssetCount: number;
|
|
86
|
+
}
|
|
87
|
+
/** The steps to emit plus the next action, returned by every transition. */
|
|
88
|
+
export interface AdBreakTransition {
|
|
89
|
+
steps: AdBreakStep[];
|
|
90
|
+
action: AdBreakAction;
|
|
91
|
+
/**
|
|
92
|
+
* Breaks in THIS transition that went `adbreakbegin` → `adbreakend` with no `adbegin`; from
|
|
93
|
+
* outside that is indistinguishable from an ad that failed to start. A list because
|
|
94
|
+
* `finalizeBreak` recurses through chained successors. Absent when every break had something to play.
|
|
95
|
+
*/
|
|
96
|
+
noPlayableAsset?: NoPlayableAssetNotice[];
|
|
97
|
+
}
|
|
98
|
+
/** Resolver returning the break chained immediately after `breakId`, or null. */
|
|
99
|
+
export type ChainResolver = (breakId: string) => Break | null;
|
|
100
|
+
/**
|
|
101
|
+
* Pick the active variant via {@link selectVariantDetailed}. Without `inputs` the walk runs
|
|
102
|
+
* with no device type and every KNOWN format playable ("first variant wins", pause variants resolvable).
|
|
103
|
+
*/
|
|
104
|
+
export declare function selectVariant(breakInfo: Break, inputs?: VariantSelectionInputs): BreakVariant | null;
|
|
105
|
+
/** The selected variant's {@link BreakFormat}, surfaced on public events; `undefined` when the break has no variant. */
|
|
106
|
+
export declare function resolveBreakFormat(breakInfo: Break, inputs?: VariantSelectionInputs): BreakFormat | undefined;
|
|
107
|
+
/** The ordered primary ad assets of one variant, across all five formats. */
|
|
108
|
+
export declare function assetsOfVariant(variant: BreakVariant | null): Asset[];
|
|
109
|
+
/** The ordered primary ad assets of a break, across all five variant formats. */
|
|
110
|
+
export declare function extractAssets(breakInfo: Break, inputs?: VariantSelectionInputs): Asset[];
|
|
111
|
+
/**
|
|
112
|
+
* The host's pre-`adbreakbegin` gate: a non-null reason means the break must not begin (host
|
|
113
|
+
* emits `aderror` + `DA-BREAK-NO-PLAYABLE-ASSET` and completes it in the scheduler).
|
|
114
|
+
*/
|
|
115
|
+
export declare function breakPlanEmptyReason(breakInfo: Break, insertionMode: EffectiveInsertionMode, selection?: VariantSelectionInputs): NoPlayableAssetReason | null;
|
|
116
|
+
/** Drives one break-chain's event sequence: {@link beginBreak}, then feed every {@link AdBreakOutcome} into {@link onOutcome}. */
|
|
117
|
+
export declare class AdBreakSequencer {
|
|
118
|
+
private readonly insertionMode;
|
|
119
|
+
private readonly chainResolver;
|
|
120
|
+
private readonly selection;
|
|
121
|
+
private currentBreak;
|
|
122
|
+
private plan;
|
|
123
|
+
private assetIndex;
|
|
124
|
+
/** True once the current asset emitted `adbegin` and has not yet settled. */
|
|
125
|
+
private assetStarted;
|
|
126
|
+
constructor(insertionMode: EffectiveInsertionMode, chainResolver?: ChainResolver, selection?: VariantSelectionInputs);
|
|
127
|
+
/** The SELECTED (or downgrade-candidate) variant's format, not the first declared variant's. */
|
|
128
|
+
private planFormat;
|
|
129
|
+
/** Emits `adbreakbegin` and returns the first action; a break with nothing to play is retired without beginning. */
|
|
130
|
+
beginBreak(breakInfo: Break): AdBreakTransition;
|
|
131
|
+
/** Built here because the host never sees a CHAINED successor's break object, so it cannot report its format/asset count. */
|
|
132
|
+
private noticeFor;
|
|
133
|
+
/** Emit one asset-less `aderror` step for an empty break, then advance to any chained successor (recursing if that is empty too). */
|
|
134
|
+
private retireEmptyBreak;
|
|
135
|
+
/** The first driver action for a (non-empty) plan. */
|
|
136
|
+
private startAction;
|
|
137
|
+
/** Advance the sequence with a driver outcome. */
|
|
138
|
+
onOutcome(outcome: AdBreakOutcome): AdBreakTransition;
|
|
139
|
+
/** The `adend` owed to an ad that began but has not settled, when a break is cut short. */
|
|
140
|
+
private inFlightAdendPrefix;
|
|
141
|
+
private onAssetStarted;
|
|
142
|
+
/** A failure emits `aderror` then `adend` regardless; then advance or finalize. */
|
|
143
|
+
private onAssetSettled;
|
|
144
|
+
/** Emit `adbreakend`; an overlay chained successor `adbreakbegin`s at once through the held overlay. */
|
|
145
|
+
private finalizeBreak;
|
|
146
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BreakFormat as t}from"../types/BreakManifest";import{KNOWN_BREAK_FORMATS as e,selectVariantDetailed as s,variantsOf as a}from"./selectVariant";export function selectVariant(t,a){return s(t,a??{playableFormats:e}).selected}export function resolveBreakFormat(t,e){return selectVariant(t,e)?.format}export function assetsOfVariant(e){if(!e)return[];switch(e.format){case t.SINGLE:case t.DOUBLE:case t.LSHAPE_AD:case t.LSHAPE_CONTENT:case t.OVERLAY:return e.assets;default:return[]}}export function extractAssets(t,e){return assetsOfVariant(selectVariant(t,e))}export function breakPlanEmptyReason(t,e,s={}){const a=r(t,e,s);return"empty"===a.mode?a.reason??null: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,playableFormats:"shared-element"===n?e: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===t.LSHAPE_CONTENT)return{mode:"empty",reason:"lshape-content-skipped",variant:l};const e=assetsOfVariant(l)[0];return e?{mode:"shared-single",asset:e,variant:l}:{mode:"empty",reason:"no-assets",variant:l}}if(d){if(d.format===t.LSHAPE_CONTENT)return{mode:"overlay-backdrop",variant:d};const e=assetsOfVariant(d);return e.length>0?{mode:"overlay-assets",assets:e,variant:d}:{mode:"empty",reason:"no-assets",variant:d}}if(l.format===t.LSHAPE_CONTENT)return{mode:"overlay-backdrop",variant:l};const h=assetsOfVariant(l)[0];return h?{mode:"overlay-assets",assets:[h],variant:l}:{mode:"empty",reason:"no-assets",variant:l}}export class AdBreakSequencer{constructor(t,e=()=>null,s={}){this.insertionMode=t,this.chainResolver=e,this.selection=s,this.currentBreak=null,this.plan={mode:"empty"},this.assetIndex=0,this.assetStarted=!1}planFormat(){return"variant"in this.plan?this.plan.variant?.format:void 0}beginBreak(t){if(this.currentBreak=t,this.plan=r(t,this.insertionMode,this.selection),this.assetIndex=0,this.assetStarted=!1,"empty"===this.plan.mode)return this.retireEmptyBreak(t,[],this.noticeFor(t));return{steps:[{type:"adbreakbegin",break:t,format:this.planFormat()}],action:this.startAction(this.plan)}}noticeFor(t){return"empty"===this.plan.mode&&this.plan.reason?[{breakId:t.id,reason:this.plan.reason,format:this.plan.variant?.format,declaredAssetCount:a(t).reduce((t,e)=>t+assetsOfVariant(e).length,0)}]:[]}retireEmptyBreak(t,e,s){const a=[...e,{type:"aderror",break:t,format:this.planFormat()}],n="overlay"===this.insertionMode?this.chainResolver(t.id):null;return n?(this.currentBreak=n,this.plan=r(n,this.insertionMode,this.selection),this.assetIndex=0,this.assetStarted=!1,"empty"===this.plan.mode?this.retireEmptyBreak(n,a,[...s,...this.noticeFor(n)]):(a.push({type:"adbreakbegin",break:n,format:this.planFormat()}),{steps:a,action:this.startAction(this.plan),noPlayableAsset:s})):(this.currentBreak=null,{steps:a,action:{kind:"end-break"},noPlayableAsset:s})}startAction(t){switch(t.mode){case"overlay-assets":return{kind:"play-asset",asset:t.assets[0],index:0,total:t.assets.length};case"overlay-backdrop":return{kind:"render-backdrop"};case"shared-single":return{kind:"play-shared",asset:t.asset}}}onOutcome(t){if(!this.currentBreak)return{steps:[],action:{kind:"await"}};const e=this.currentBreak;switch(t.kind){case"asset-started":return this.onAssetStarted(e);case"asset-ended":return this.onAssetSettled(e,!1);case"asset-errored":return this.onAssetSettled(e,!0);case"backdrop-elapsed":case"break-elapsed":return this.finalizeBreak(this.inFlightAdendPrefix(e))}}inFlightAdendPrefix(t){if(!this.assetStarted)return[];const e=this.planFormat();return"overlay-assets"===this.plan.mode?[{type:"adend",break:t,format:e,asset:this.plan.assets[this.assetIndex],adIndex:this.assetIndex,totalAds:this.plan.assets.length}]:"shared-single"===this.plan.mode?[{type:"adend",break:t,format:e,asset:this.plan.asset,adIndex:0,totalAds:1}]:[]}onAssetStarted(t){if("overlay-assets"===this.plan.mode){const e=this.plan.assets.length,s=this.plan.assets[this.assetIndex];return this.assetStarted=!0,{steps:[{type:"adbegin",break:t,format:this.planFormat(),asset:s,adIndex:this.assetIndex,totalAds:e}],action:{kind:"await"}}}return"shared-single"===this.plan.mode?(this.assetStarted=!0,{steps:[{type:"adbegin",break:t,format:this.planFormat(),asset:this.plan.asset,adIndex:0,totalAds:1}],action:{kind:"await"}}):{steps:[],action:{kind:"await"}}}onAssetSettled(t,e){if(this.assetStarted=!1,"shared-single"===this.plan.mode){const s=[],a=this.plan.asset,r=this.planFormat();return e&&s.push({type:"aderror",break:t,format:r,asset:a,adIndex:0,totalAds:1}),s.push({type:"adend",break:t,format:r,asset:a,adIndex:0,totalAds:1}),this.finalizeBreak(s)}if("overlay-assets"!==this.plan.mode)return{steps:[],action:{kind:"await"}};const s=this.plan.assets.length,a=this.plan.assets[this.assetIndex],r=[],n=this.planFormat();return e&&r.push({type:"aderror",break:t,format:n,asset:a,adIndex:this.assetIndex,totalAds:s}),r.push({type:"adend",break:t,format:n,asset:a,adIndex:this.assetIndex,totalAds:s}),this.assetIndex+=1,this.assetIndex<s?{steps:r,action:{kind:"play-asset",asset:this.plan.assets[this.assetIndex],index:this.assetIndex,total:s}}:this.finalizeBreak(r)}finalizeBreak(t,e=[]){const s=t=>e.length>0?{...t,noPlayableAsset:e}:t,a=this.currentBreak;if(!a)return s({steps:t,action:{kind:"end-break"}});const n=[...t,{type:"adbreakend",break:a,format:this.planFormat()}],i="overlay"===this.insertionMode?this.chainResolver(a.id):null;return i?(this.currentBreak=i,this.plan=r(i,this.insertionMode,this.selection),this.assetIndex=0,this.assetStarted=!1,"empty"===this.plan.mode?this.retireEmptyBreak(i,n,[...e,...this.noticeFor(i)]):(n.push({type:"adbreakbegin",break:i,format:this.planFormat()}),s({steps:n,action:this.startAction(this.plan)}))):(this.currentBreak=null,s({steps:n,action:{kind:"end-break"}}))}}
|