@dolby-optiview/ads-sdk-core 1.2.1 → 1.4.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 -4
- package/dist/OptiViewAds.js +1 -1
- package/dist/OptiViewAdsExternalVendors.d.ts +32 -0
- package/dist/external-playback/index.d.ts +4 -0
- package/dist/external-playback/index.js +1 -0
- package/dist/external-playback/observeExternalPlayback.d.ts +19 -0
- package/dist/external-playback/observeExternalPlayback.js +1 -0
- package/dist/external-playback/reconnectHold.d.ts +19 -0
- package/dist/external-playback/reconnectHold.js +1 -0
- package/dist/generated/diagnosticCodes.d.ts +46 -6
- 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 +7 -5
- package/dist/index.js +1 -1
- package/dist/interfaces/AdSourceQueue.d.ts +19 -0
- package/dist/interfaces/AdSourceQueue.js +1 -0
- package/dist/interfaces/PlayerAdapter.d.ts +31 -1
- package/dist/internal/index.d.ts +2 -0
- package/dist/internal/index.js +1 -1
- package/dist/services/AdBreakSequencer.d.ts +33 -4
- package/dist/services/AdBreakSequencer.js +1 -1
- package/dist/services/AdPlayerController.d.ts +12 -73
- package/dist/services/AdPlayerController.js +1 -1
- package/dist/services/BreakChain.d.ts +43 -0
- package/dist/services/BreakChain.js +1 -0
- package/dist/services/BreakChainRecorder.d.ts +63 -0
- package/dist/services/BreakChainRecorder.js +1 -0
- package/dist/services/BreakPreloadLedger.d.ts +13 -0
- package/dist/services/BreakPreloadLedger.js +1 -0
- package/dist/services/BreakScheduler.d.ts +20 -6
- package/dist/services/BreakScheduler.js +1 -1
- package/dist/services/BreakTransitionTimer.d.ts +27 -2
- package/dist/services/BreakTransitionTimer.js +1 -1
- package/dist/services/CmcdAdReporter.d.ts +1 -0
- package/dist/services/CmcdAdReporter.js +1 -1
- package/dist/services/ExternalPlaybackGate.d.ts +40 -0
- package/dist/services/ExternalPlaybackGate.js +1 -0
- package/dist/services/LiveStartPushbackController.d.ts +5 -10
- package/dist/services/LiveStartPushbackController.js +1 -1
- package/dist/services/ManifestService.d.ts +2 -1
- package/dist/services/ManifestService.js +1 -1
- package/dist/services/ReloadGuard.d.ts +11 -0
- package/dist/services/ReloadGuard.js +1 -0
- package/dist/services/RewindRearm.d.ts +3 -1
- package/dist/services/RewindRearm.js +1 -1
- package/dist/services/SsaiController.js +1 -1
- package/dist/services/adPlayer/AdPlayerCallbacks.d.ts +63 -0
- package/dist/services/adPlayer/AdPlayerCallbacks.js +1 -0
- package/dist/services/adPlayer/AdPlayerEvents.d.ts +3 -7
- package/dist/services/adPlayer/AdPlayerEvents.js +1 -1
- package/dist/services/adPlayer/AdPlayerState.d.ts +0 -1
- package/dist/services/adPlayer/AdPlayerState.js +1 -1
- package/dist/services/adPlayer/AdPreloader.d.ts +2 -2
- package/dist/services/adPlayer/AdPreloader.js +1 -1
- package/dist/services/adPlayer/AdStage.d.ts +7 -4
- package/dist/services/adPlayer/AdStage.js +1 -1
- package/dist/services/adPlayer/AssetParameterResolver.d.ts +10 -2
- package/dist/services/adPlayer/AssetParameterResolver.js +1 -1
- package/dist/services/adPlayer/AssetPlayback.d.ts +9 -2
- package/dist/services/adPlayer/AssetPlayback.js +1 -1
- package/dist/services/adPlayer/AudioController.d.ts +58 -0
- package/dist/services/adPlayer/AudioController.js +1 -0
- package/dist/services/adPlayer/BreakSequenceDriver.d.ts +9 -3
- package/dist/services/adPlayer/BreakSequenceDriver.js +1 -1
- package/dist/services/adPlayer/ContentResumeCoordinator.d.ts +2 -0
- package/dist/services/adPlayer/ContentResumeCoordinator.js +1 -1
- package/dist/services/adPlayer/GamPodBridge.d.ts +11 -1
- package/dist/services/adPlayer/GamPodBridge.js +1 -1
- package/dist/services/adPlayer/PauseAdPresenter.d.ts +3 -1
- package/dist/services/adPlayer/PauseAdPresenter.js +1 -1
- package/dist/services/adPlayer/PreparedPresentation.js +1 -1
- package/dist/services/adPlayer/PresentationModeTracker.d.ts +1 -1
- package/dist/services/adPlayer/PresentationModeTracker.js +1 -1
- package/dist/services/adPlayer/SharedElementBreakPlayer.d.ts +3 -0
- package/dist/services/adPlayer/SharedElementBreakPlayer.js +1 -1
- package/dist/services/adPlayer/SuccessorQueue.d.ts +36 -0
- package/dist/services/adPlayer/SuccessorQueue.js +1 -0
- package/dist/services/adPlayer/SurfaceRevealReporter.d.ts +28 -0
- package/dist/services/adPlayer/SurfaceRevealReporter.js +1 -0
- package/dist/services/adPlayer/presentation/DomPresentationHost.d.ts +22 -0
- package/dist/services/adPlayer/presentation/DomPresentationHost.js +1 -0
- package/dist/services/adPlayer/presentation/LayoutTransform.d.ts +28 -0
- package/dist/services/adPlayer/presentation/LayoutTransform.js +1 -0
- package/dist/services/adPlayer/presentation/PresentationLayout.d.ts +19 -0
- package/dist/services/adPlayer/presentation/PresentationLayout.js +1 -0
- package/dist/services/assetParameterMacroTable.js +1 -1
- package/dist/services/assetParameterMacros.d.ts +9 -9
- package/dist/services/assetParameterMacros.js +1 -1
- package/dist/services/channelSwitch.d.ts +2 -2
- package/dist/services/externalPlaybackDiagnostic.d.ts +3 -0
- package/dist/services/externalPlaybackDiagnostic.js +1 -0
- package/dist/services/externalPlaybackGuard.d.ts +24 -0
- package/dist/services/externalPlaybackGuard.js +1 -0
- package/dist/services/parseBreakManifest.d.ts +2 -1
- package/dist/services/parseBreakManifest.js +1 -1
- package/dist/services/resolveChannelEvents.d.ts +17 -0
- package/dist/services/resolveChannelEvents.js +1 -0
- package/dist/services/resolveExternalVendorConfigurations.js +1 -1
- package/dist/services/resolveGamVendorConfiguration.d.ts +6 -1
- package/dist/services/resolveGamVendorConfiguration.js +1 -1
- package/dist/services/ssbStream.d.ts +39 -0
- package/dist/services/ssbStream.js +1 -0
- package/dist/services/ssbSwitchSignals.d.ts +15 -0
- package/dist/services/ssbSwitchSignals.js +1 -0
- package/dist/services/staticAssetUrl.d.ts +28 -0
- package/dist/services/staticAssetUrl.js +1 -0
- package/dist/session/AdBreakStatusTracker.d.ts +18 -0
- package/dist/session/AdBreakStatusTracker.js +1 -1
- package/dist/session/BreakLifecycle.d.ts +6 -0
- package/dist/session/BreakLifecycle.js +1 -1
- package/dist/session/SessionStarter.d.ts +6 -43
- package/dist/session/SessionStarter.js +1 -1
- package/dist/session/SessionStarterDeps.d.ts +39 -0
- package/dist/session/SessionStarterDeps.js +1 -0
- package/dist/session/SessionStarterHelpers.d.ts +36 -0
- package/dist/session/SessionStarterHelpers.js +1 -0
- package/dist/session/SessionState.d.ts +22 -2
- package/dist/session/SessionState.js +1 -1
- package/dist/session/SsbSwitch.d.ts +55 -0
- package/dist/session/SsbSwitch.js +1 -0
- package/dist/session/breakMeasurement.d.ts +16 -0
- package/dist/session/breakMeasurement.js +1 -0
- package/dist/session/contentSnapback.d.ts +13 -0
- package/dist/session/contentSnapback.js +1 -0
- package/dist/session/createExternalPlaybackGate.d.ts +19 -0
- package/dist/session/createExternalPlaybackGate.js +1 -0
- package/dist/session/sessionTick.d.ts +7 -0
- package/dist/session/sessionTick.js +1 -0
- package/dist/types/BreakManifest.d.ts +58 -5
- package/dist/types/Events.d.ts +21 -10
- package/dist/types/ExternalVendorConfiguration.d.ts +3 -1
- package/dist/types/OptiViewAdsConfig.d.ts +24 -8
- package/package.json +5 -1
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { ExternalPlaybackAllowedTrigger } from '../services/ExternalPlaybackGate';
|
|
2
|
+
import type { BreakManifest } from '../types/BreakManifest';
|
|
3
|
+
import type { SessionConfig } from '../types/OptiViewAdsConfig';
|
|
4
|
+
import type { SessionStarterDeps } from './SessionStarterDeps';
|
|
5
|
+
import type { SessionState } from './SessionState';
|
|
6
|
+
/** How long the receiver gets to take the stream once it is ready to play. */
|
|
7
|
+
export declare const SSB_ACTIVE_TIMEOUT_MS = 1500;
|
|
8
|
+
/** Cap on loading the SSB stream (a cold DAI session needs a couple of seconds). */
|
|
9
|
+
export declare const SSB_LOAD_TIMEOUT_MS = 15000;
|
|
10
|
+
export declare const SSB_RECEIVER_PAUSE_WINDOW_MS = 3000;
|
|
11
|
+
export declare const SSB_RESTORE_PLAYING_BACKSTOP_MS = 10000;
|
|
12
|
+
export declare const SSB_RESTORE_ATTEMPTS = 2;
|
|
13
|
+
/** The session re-entry points the restore reuses from the channel-switch code. */
|
|
14
|
+
export interface SsbSessionStarter {
|
|
15
|
+
switchToSgai(manifest: BreakManifest, config: SessionConfig, generation: number, preserveSchedulerLedgers: boolean): Promise<void>;
|
|
16
|
+
switchToSteeredSsai(manifest: BreakManifest, config: SessionConfig, preserveSchedulerLedgers: boolean): Promise<boolean>;
|
|
17
|
+
applyPendingChannelSwitch(): void;
|
|
18
|
+
}
|
|
19
|
+
type SwitchTrigger = ExternalPlaybackAllowedTrigger;
|
|
20
|
+
/**
|
|
21
|
+
* Plays the channel's SSB stream on the AirPlay receiver and brings the original content back
|
|
22
|
+
* when AirPlay ends: switch behind the closed gate, open it, verify the receiver took the
|
|
23
|
+
* stream, restore the previous source and delivery mode afterwards.
|
|
24
|
+
*/
|
|
25
|
+
export declare class SsbSwitchController {
|
|
26
|
+
private readonly state;
|
|
27
|
+
private readonly starter;
|
|
28
|
+
private readonly deps;
|
|
29
|
+
private timers;
|
|
30
|
+
private runtimeParams;
|
|
31
|
+
private sessionMacros;
|
|
32
|
+
private previousPaused;
|
|
33
|
+
private streamReady;
|
|
34
|
+
constructor(state: SessionState, starter: SsbSessionStarter, deps: SessionStarterDeps);
|
|
35
|
+
/** True from the switch until the restore completes; the session's other content handlers stand down. */
|
|
36
|
+
get isActive(): boolean;
|
|
37
|
+
/** The `ExternalPlaybackGate` allowed hook. */
|
|
38
|
+
onAllowed: (trigger: SwitchTrigger) => void;
|
|
39
|
+
dispose(): void;
|
|
40
|
+
/** The session ended: forget the switch without touching the player. */
|
|
41
|
+
reset(): void;
|
|
42
|
+
private readonly onExternalPlaybackChange;
|
|
43
|
+
private readonly onPause;
|
|
44
|
+
private markActive;
|
|
45
|
+
private fail;
|
|
46
|
+
private restoreFromSsb;
|
|
47
|
+
private restoreSgai;
|
|
48
|
+
private reloadPrevious;
|
|
49
|
+
private waitForPlaying;
|
|
50
|
+
private rollSession;
|
|
51
|
+
private emitChange;
|
|
52
|
+
private later;
|
|
53
|
+
private clearTimers;
|
|
54
|
+
}
|
|
55
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{buildAssetParameterMacroTable as e}from"../services/assetParameterMacroTable";import{resolveSsbStream as s}from"../services/resolveGamVendorConfiguration";import{resolveSsbRestoreChange as t}from"../services/ssbSwitchSignals";import{buildSsbStreamUrl as i,resolveSsbRestorePosition as r}from"../services/ssbStream";export const SSB_ACTIVE_TIMEOUT_MS=1500;export const SSB_LOAD_TIMEOUT_MS=15e3;export const SSB_RECEIVER_PAUSE_WINDOW_MS=3e3;export const SSB_RESTORE_PLAYING_BACKSTOP_MS=1e4;export const SSB_RESTORE_ATTEMPTS=2;export class SsbSwitchController{constructor(t,r,a){this.state=t,this.starter=r,this.deps=a,this.timers=new Set,this.previousPaused=!1,this.streamReady=!1,this.onAllowed=t=>{const{state:r}=this,{player:a}=this.deps,o=r.effectiveSessionManifest??r.sessionManifest,n=o?s(o.vendorConfiguration):null,l=r.sessionConfig;if(!r.sessionActive||r.ssb||!o||!n||!l)return;const c=a.sourceUrl;if("string"!=typeof c||""===c.trim())return void this.deps.diagnose("DA-SSB-SWITCH-FAILED","The content adapter reports no source to restore; AirPlay stays on the device.",{reason:"no-restore-source",trigger:t});const h=this.deps.adPlayerController;this.runtimeParams=h?.updatedAssetParameters,this.sessionMacros=h?.sessionAssetParameterMacros,this.previousPaused=a.paused;const d=r.sessionDeliveryMode??"sgai";r.ssb={previousMode:d,previousSource:c,previousPosition:a.currentTime,previousLive:a.isLive??!Number.isFinite(a.duration),switchedAt:Date.now(),trigger:t,phase:"switching",activeAt:null,announced:!1},h?.stopActiveBreak(),h?.releaseContentHold(),h?.endGamSession(),r.steeredSsaiActive&&(r.ssaiController?.stop(),delete r.ssaiController,r.steeredSsaiActive=!1),this.deps.breakScheduler?.suspend(),this.deps.pauseAdController?.reset(),r.sessionDeliveryMode="ssb",this.deps.diagnose("DA-DELIVERY-MODE-RESOLVED","AirPlay started: playing the SSB stream",{mode:"ssb",source:"external-playback",previousMode:d,trigger:t}),this.rollSession(o);const p=i(n,{manifest:n.assetParameters,session:l.assetParameters,runtime:this.runtimeParams},e({customerMacros:h?.sessionAssetParameterMacros??{},element:null,breakDurationSec:void 0})),u=r.ssb;this.streamReady=!1;const m=()=>r.ssb===u&&"switching"===u.phase,S=()=>{this.streamReady=!0,m()&&("active"!==a.externalPlaybackState?this.later(()=>{m()&&("active"===a.externalPlaybackState?this.markActive(u):this.fail("external-not-active",t,p))},1500):this.markActive(u))};a.load(p).then(()=>(S(),this.previousPaused||r.ssb!==u||"restoring"===u.phase?void 0:a.play())).catch(e=>this.fail("load-error",t,p,e)),a.setExternalPlaybackAllowed?.(!0),this.later(()=>{m()&&!this.streamReady&&this.fail("load-timeout",t,p)},15e3)},this.onExternalPlaybackChange=e=>{const{state:s}=this,t=s.ssb,i=e;t&&("active"===i?.state&&"switching"===t.phase&&this.streamReady?this.markActive(t):"inactive"===i?.state&&"restoring"!==t.phase&&this.restoreFromSsb("external-playback-ended"))},this.onPause=()=>{const e=this.state.ssb;"active"===e?.phase&&null!==e.activeAt&&Date.now()-e.activeAt<=3e3&&this.fail("receiver-paused",e.trigger)},a.player.on("externalplaybackchange",this.onExternalPlaybackChange),a.player.on("pause",this.onPause)}get isActive(){return null!==this.state.ssb}dispose(){this.clearTimers(),this.state.ssb=null,this.deps.player.off("externalplaybackchange",this.onExternalPlaybackChange),this.deps.player.off("pause",this.onPause)}reset(){this.clearTimers(),this.streamReady=!1,this.state.ssb=null}markActive(e){this.clearTimers(),e.phase="active",e.activeAt=Date.now(),this.later(()=>{this.state.ssb===e&&"active"===e.phase&&(e.announced=!0,this.emitChange(e.previousMode,"ssb"),this.deps.adBreakStatusTracker.refreshDeliveryMode())},3e3)}fail(e,s,t,i){this.state.ssb&&"restoring"!==this.state.ssb.phase&&(this.deps.diagnose("DA-SSB-SWITCH-FAILED",`The SSB stream switch failed: ${e}`,{reason:e,uri:t,trigger:s,...void 0===i?{}:{message:i instanceof Error?i.message:String(i)}}),this.restoreFromSsb("switch-failed"))}async restoreFromSsb(e){const{state:s}=this,{player:i}=this.deps,r=s.ssb,a=s.effectiveSessionManifest??s.sessionManifest,o=s.sessionConfig,{starter:n}=this;if(!(r&&"restoring"!==r.phase&&a&&o&&n))return;r.phase="restoring",this.clearTimers(),i.setExternalPlaybackAllowed?.(!1);const l=s.sessionGeneration,c=this.deps.breakScheduler;c?.setContentReloading(!0);let h=!1;if("ssai"===r.previousMode&&(h=await n.switchToSteeredSsai(a,o,!0)),h||(h=await this.restoreSgai(r,a,o,n,l)),s.ssb!==r)return;if(!h)return r.phase="failed",void c?.setContentReloading(!1);if(await this.waitForPlaying(),s.ssb!==r)return;c?.setContentReloading(!1),c?.skipPendingBreaksDueBy("played-by-ssb"),c?.resume();const d="ssai"===r.previousMode&&s.steeredSsaiActive?"ssai":"sgai";s.sessionDeliveryMode=d,s.ssb=null,this.deps.diagnose("DA-DELIVERY-MODE-RESOLVED","AirPlay ended: content restored",{mode:d,source:"external-playback-ended",cause:e}),this.rollSession(a);const p=t(r.announced,d);p&&this.emitChange(p.previousDeliveryMode,p.deliveryMode),this.deps.adBreakStatusTracker.refreshDeliveryMode(),n.applyPendingChannelSwitch()}async restoreSgai(e,s,t,i,a){const{player:o}=this.deps,{state:n}=this;if(!await this.reloadPrevious(e.previousSource))return!1;if(n.ssb!==e)return!0;const l=Number.isFinite(o.duration)?o.duration:null,c=r({live:e.previousLive,recordedPosition:e.previousPosition,duration:l});null!==c&&o.seek(c),this.previousPaused||await o.play().catch(()=>{}),await i.switchToSgai(s,t,a,!0);const h=this.deps.adPlayerController;return this.sessionMacros&&h?.setSessionAssetParameterMacros(this.sessionMacros),this.runtimeParams&&h?.updateAssetParameters(this.runtimeParams),!0}async reloadPrevious(e){let s;for(let t=1;t<=2;t++)try{return await this.deps.player.load(e),!0}catch(e){s=e}return this.deps.diagnose("DA-SSB-RESTORE-FAILED","The previous content source could not be reloaded.",{attempt:2,reason:"load-error",source:e,message:s instanceof Error?s.message:String(s)}),!1}waitForPlaying(){return new Promise(e=>{const s=()=>{this.deps.player.off("playing",s),e()};this.deps.player.on("playing",s),this.later(s,1e4)})}rollSession(e){this.deps.cmcdAdReporter.onSessionEnd(),this.deps.cmcdAdReporter.onSessionStart(e),this.deps.lensReporter.endSession(),this.deps.lensReporter.startSession()}emitChange(e,s){const{state:t}=this,i=t.effectiveSessionManifest??t.sessionManifest,r=i?.channelId??null;this.deps.emit("adchannelchange",{type:"adchannelchange",timestamp:Date.now(),previousChannelId:r,channelId:r,eventId:t.activeEventId,reason:"external-playback",manifestUrl:t.sessionConfig?.manifestUrl??"",previousDeliveryMode:e,deliveryMode:s})}later(e,s){const t=setTimeout(()=>{this.timers.delete(t),e()},s);this.timers.add(t)}clearTimers(){for(const e of this.timers)clearTimeout(e);this.timers.clear()}}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { BreakTransitionTimer } from '../services/BreakTransitionTimer';
|
|
2
|
+
import { BreakChainRecorder } from '../services/BreakChainRecorder';
|
|
3
|
+
import type { KnownDiagnosticCode } from '../diagnostics/errorCodes';
|
|
4
|
+
type Diagnose = (code: KnownDiagnosticCode, message: string, context?: Record<string, unknown>) => void;
|
|
5
|
+
/**
|
|
6
|
+
* The transition timer (each transition a `DA-BREAK-TRANSITION`) and the chain recorder (each
|
|
7
|
+
* chain a `DA-BREAK-CHAIN`) it feeds, so transition cost is comparable across preload modes and devices.
|
|
8
|
+
*/
|
|
9
|
+
export declare function createBreakMeasurement(diagnose: Diagnose, modes: {
|
|
10
|
+
adPreload: string;
|
|
11
|
+
adInsertion: string;
|
|
12
|
+
}): {
|
|
13
|
+
timer: BreakTransitionTimer;
|
|
14
|
+
recorder: BreakChainRecorder;
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{BreakTransitionTimer as e}from"../services/BreakTransitionTimer";import{BreakChainRecorder as a}from"../services/BreakChainRecorder";export function createBreakMeasurement(r,n){const s=new a(e=>{r("DA-BREAK-CHAIN",`Chain ${e.chainId}: ${e.breaks.length} break(s) in ${e.totalMs}ms`,{breakId:e.chainId,...e})});return{timer:new e(e=>{r("DA-BREAK-TRANSITION",`Transition ${e.kind} took ${e.durationMs}ms`,{transition:e.kind,durationMs:e.durationMs,breakId:e.breakId,adPreload:n.adPreload,adInsertion:n.adInsertion,...e.phases?{phases:e.phases}:{},...e.path?{path:e.path}:{},...void 0!==e.leadMs?{leadMs:e.leadMs}:{}}),s.transitionMeasured(e)}),recorder:s}}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { PlayerAdapter } from '../interfaces/PlayerAdapter';
|
|
2
|
+
import type { Break } from '../types/BreakManifest';
|
|
3
|
+
import type { SessionState } from './SessionState';
|
|
4
|
+
export interface SnapbackDeps {
|
|
5
|
+
player: PlayerAdapter;
|
|
6
|
+
state: Pick<SessionState, 'snapbackSeekInFlight'>;
|
|
7
|
+
activeBreak(): Break | null | undefined;
|
|
8
|
+
/** A viewer seek (not our own corrective one) landed. */
|
|
9
|
+
onViewerSeek(): void;
|
|
10
|
+
log(...args: unknown[]): void;
|
|
11
|
+
}
|
|
12
|
+
/** The content `seeked` handler: snaps a viewer seek back to the break start while the break locks it. */
|
|
13
|
+
export declare function createSnapbackHandler(deps: SnapbackDeps): () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function createSnapbackHandler(e){return()=>{if(e.state.snapbackSeekInFlight)return void(e.state.snapbackSeekInFlight=!1);e.onViewerSeek();const t=e.activeBreak();if(!t?.controls?.snapback)return;const a="number"==typeof t.start?t.start:e.player.currentTime;Math.abs(e.player.currentTime-a)<=.5||(e.log("Snapback: seek detected during locked break, snapping back to break start"),e.state.snapbackSeekInFlight=!0,e.player.seek(a))}}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { PlayerAdapter } from '../interfaces/PlayerAdapter';
|
|
2
|
+
import type { KnownDiagnosticCode } from '../diagnostics/errorCodes';
|
|
3
|
+
import type { BreakScheduler } from '../services/BreakScheduler';
|
|
4
|
+
import { ExternalPlaybackGate, type ExternalPlaybackAllowedTrigger } from '../services/ExternalPlaybackGate';
|
|
5
|
+
import type { SsbSwitchPhase } from '../services/ssbSwitchSignals';
|
|
6
|
+
import type { ExternalPlaybackConfig } from '../types/OptiViewAdsConfig';
|
|
7
|
+
export declare const DEFAULT_EXTERNAL_PLAYBACK_BLOCK_BEFORE_BREAK_SEC = 5;
|
|
8
|
+
/** Non-finite values fall back to the default; a negative window means "only during a break". */
|
|
9
|
+
export declare function resolveBlockBeforeBreakSec(config: ExternalPlaybackConfig | undefined): number;
|
|
10
|
+
export interface ExternalPlaybackGateWiring {
|
|
11
|
+
scheduler(): BreakScheduler | undefined;
|
|
12
|
+
diagnose(code: KnownDiagnosticCode, message: string, context?: Record<string, unknown>): void;
|
|
13
|
+
/** Runs after the allowed diagnostic; the SSB switch. */
|
|
14
|
+
onAllowed?(trigger: ExternalPlaybackAllowedTrigger): void;
|
|
15
|
+
/** The phase of the SSB switch in progress; defaults to none. */
|
|
16
|
+
ssbSwitchPhase?(): SsbSwitchPhase | null;
|
|
17
|
+
}
|
|
18
|
+
/** The session's AirPlay gate, fed by the break scheduler; the allowed hook only reports for now. */
|
|
19
|
+
export declare function createExternalPlaybackGate(player: PlayerAdapter, config: ExternalPlaybackConfig | undefined, wiring: ExternalPlaybackGateWiring): ExternalPlaybackGate;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{ExternalPlaybackGate as e}from"../services/ExternalPlaybackGate";export const DEFAULT_EXTERNAL_PLAYBACK_BLOCK_BEFORE_BREAK_SEC=5;export function resolveBlockBeforeBreakSec(e){const r=e?.blockBeforeBreakSec;return"number"==typeof r&&Number.isFinite(r)?Math.max(0,r):5}export function createExternalPlaybackGate(r,n,t){return new e({player:r,blockBeforeBreakSec:resolveBlockBeforeBreakSec(n),diagnose:t.diagnose,guardInput:()=>{const e=t.scheduler(),r=e?.getNextPendingBreak()??null;return{activeBreakId:e?.getActiveBreak()?.id??null,nextBreakId:r?.id??null,secondsUntilNextBreak:r?.secondsUntil??null}},ssbSwitchPhase:()=>t.ssbSwitchPhase?.()??null,onAllowed:e=>{t.diagnose("DA-EXTERNAL-PLAYBACK-ALLOWED",`AirPlay allowed (${e})`,{trigger:e}),t.onAllowed?.(e)}})}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AdBreakStatusTracker } from './AdBreakStatusTracker';
|
|
2
|
+
import type { PauseAdController } from '../services/PauseAdController';
|
|
3
|
+
/** The 250 ms session tick: advances the pause-ad timer and the AirPlay guard's `adbreakstatus`. */
|
|
4
|
+
export declare function sessionTick(deps: {
|
|
5
|
+
pauseAdController?: PauseAdController | undefined;
|
|
6
|
+
adBreakStatusTracker: AdBreakStatusTracker;
|
|
7
|
+
}): () => void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export function sessionTick(r){return()=>{r.pauseAdController?.tick(),r.adBreakStatusTracker.refreshExternalPlayback()}}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
/** Break Manifest types, per https://github.com/Dolby-OptiView/optiview-ads-manifest-spec/blob/v1.
|
|
1
|
+
/** Break Manifest types, per https://github.com/Dolby-OptiView/optiview-ads-manifest-spec/blob/v1.9.0/spec.md. */
|
|
2
2
|
/** Which 'time' reference break start times use. @category Break Manifests & Ad Formats */
|
|
3
3
|
export declare enum Timebase {
|
|
4
4
|
/** An absolute ISO-8601 timestamp */
|
|
@@ -25,13 +25,33 @@ export interface VendorConfigurationBase {
|
|
|
25
25
|
}
|
|
26
26
|
/** Session-level GAM configuration for pod-serving SGAI. @category Break Manifests & Ad Formats */
|
|
27
27
|
export interface GamSgaiConfiguration {
|
|
28
|
+
/** The custom asset key of the channel's pod-serving stream. */
|
|
28
29
|
customAssetKey: string;
|
|
30
|
+
/** Session-level ad tag parameters for pod requests. */
|
|
29
31
|
assetParameters?: Record<string, string>;
|
|
30
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Server-side beaconing (SSB) stream the channel offers next to the DAI livestream (manifest spec
|
|
35
|
+
* 1.9.0 draft). While present, the SDK keeps the content player off AirPlay around ad breaks.
|
|
36
|
+
* @category Break Manifests & Ad Formats */
|
|
37
|
+
export interface GamSsbConfiguration {
|
|
38
|
+
/** The SSB stream URL. */
|
|
39
|
+
uri: string;
|
|
40
|
+
/** The stream format, e.g. `hls`. */
|
|
41
|
+
format?: string;
|
|
42
|
+
/** Stream request parameters. */
|
|
43
|
+
assetParameters?: Record<string, string>;
|
|
44
|
+
/** DRM configuration, passed through untouched. */
|
|
45
|
+
drm?: Record<string, unknown>;
|
|
46
|
+
}
|
|
31
47
|
/** Session-level GAM configuration for full-service DAI SSAI. @category Break Manifests & Ad Formats */
|
|
32
48
|
export interface GamSsaiConfiguration {
|
|
49
|
+
/** The asset key of the full-service DAI livestream. */
|
|
33
50
|
assetKey: string;
|
|
51
|
+
/** Session-level ad tag parameters for the stitched stream request. */
|
|
34
52
|
assetParameters?: Record<string, string>;
|
|
53
|
+
/** The channel's server-side beaconing stream, when it has one. */
|
|
54
|
+
ssb?: GamSsbConfiguration;
|
|
35
55
|
}
|
|
36
56
|
/**
|
|
37
57
|
* The GAM identity needed to create the IMA/DAI stream session. Must agree with the per-asset
|
|
@@ -54,9 +74,15 @@ export interface GamVendorConfiguration extends VendorConfigurationBase {
|
|
|
54
74
|
sgai?: GamSgaiConfiguration[];
|
|
55
75
|
ssai?: GamSsaiConfiguration[];
|
|
56
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* Ad parameters for a provider outside the SDK, read by the application with
|
|
79
|
+
* `getExternalVendorConfiguration()` or {@link OptiViewAdsExternalVendors}.
|
|
80
|
+
* @category Break Manifests & Ad Formats */
|
|
57
81
|
export interface ExternalVendorConfigurationEntry extends VendorConfigurationBase {
|
|
58
82
|
type: 'external';
|
|
83
|
+
/** The provider the parameters are for; the first valid entry per provider is used. */
|
|
59
84
|
provider: string;
|
|
85
|
+
/** The provider's parameter template; values may contain `$NAME$` macros. */
|
|
60
86
|
assetParameters: Record<string, string>;
|
|
61
87
|
}
|
|
62
88
|
/** Known vendor configuration entries, kept open to unrecognized vendors from newer manifests. @category Break Manifests & Ad Formats */
|
|
@@ -74,7 +100,7 @@ export interface BreakManifest {
|
|
|
74
100
|
/** Identifier of the channel the stream belongs to. */
|
|
75
101
|
channelId?: string;
|
|
76
102
|
/** Identifier of the event being streamed. */
|
|
77
|
-
eventId?: string;
|
|
103
|
+
eventId?: string | null;
|
|
78
104
|
/** Determines how often the manifest should be refreshed */
|
|
79
105
|
polling?: Polling;
|
|
80
106
|
/** Ordered delivery-steering rules (first match wins), evaluated once on the first fetch; absent means sgai. */
|
|
@@ -83,9 +109,29 @@ export interface BreakManifest {
|
|
|
83
109
|
adStartDelay?: number;
|
|
84
110
|
/** Session-level configuration per vendor integration (spec 1.1.0). */
|
|
85
111
|
vendorConfiguration?: VendorConfiguration[];
|
|
112
|
+
/** Event-specific configuration windows on a wallclock live stream. */
|
|
113
|
+
events?: ChannelEvent[];
|
|
86
114
|
/** The available breaks */
|
|
87
115
|
breaks: Break[];
|
|
88
116
|
}
|
|
117
|
+
/**
|
|
118
|
+
* An event window on a wallclock live stream and the session configuration in effect while it
|
|
119
|
+
* runs. Crossing its start or end emits `adchannelchange` with reason `event-boundary`.
|
|
120
|
+
* @category Break Manifests & Ad Formats */
|
|
121
|
+
export interface ChannelEvent {
|
|
122
|
+
/** Identifier of the event, reported as the manifest's `eventId` while it runs. */
|
|
123
|
+
id: string;
|
|
124
|
+
/** Start of the event window (ISO-8601 wallclock). */
|
|
125
|
+
start: string;
|
|
126
|
+
/** End of the event window (ISO-8601 wallclock). */
|
|
127
|
+
end: string;
|
|
128
|
+
/** When set, replaces the manifest's {@link BreakManifest.adStartDelay} during the event. */
|
|
129
|
+
adStartDelay?: number;
|
|
130
|
+
/** When set, replaces the manifest's {@link BreakManifest.delivery} rules during the event. */
|
|
131
|
+
delivery?: DeliveryRule[];
|
|
132
|
+
/** When set, replaces the manifest's {@link BreakManifest.vendorConfiguration} during the event. */
|
|
133
|
+
vendorConfiguration?: VendorConfiguration[];
|
|
134
|
+
}
|
|
89
135
|
/** Delivery architecture selected by a {@link DeliveryRule}. @category Break Manifests & Ad Formats */
|
|
90
136
|
export declare enum DeliveryMode {
|
|
91
137
|
/** Server-Guided Ad Insertion — the SDK schedules and renders breaks client-side. */
|
|
@@ -178,7 +224,7 @@ export declare enum DeviceType {
|
|
|
178
224
|
TABLET = "tablet",
|
|
179
225
|
TV = "tv"
|
|
180
226
|
}
|
|
181
|
-
/** Platforms supported by manifest targeting (manifest spec v1.7.0). */
|
|
227
|
+
/** Platforms supported by manifest targeting (manifest spec v1.7.0). @category Break Manifests & Ad Formats */
|
|
182
228
|
export declare enum Platform {
|
|
183
229
|
WEB = "web",
|
|
184
230
|
ANDROID = "android",
|
|
@@ -186,7 +232,7 @@ export declare enum Platform {
|
|
|
186
232
|
TVOS = "tvos",
|
|
187
233
|
ROKU = "roku"
|
|
188
234
|
}
|
|
189
|
-
/** Operating systems supported by manifest targeting (manifest spec v1.8.0). */
|
|
235
|
+
/** Operating systems supported by manifest targeting (manifest spec v1.8.0). @category Break Manifests & Ad Formats */
|
|
190
236
|
export declare enum Os {
|
|
191
237
|
ANDROID = "android",
|
|
192
238
|
CHROMEOS = "chromeos",
|
|
@@ -202,9 +248,11 @@ export declare enum Os {
|
|
|
202
248
|
WINDOWS = "windows",
|
|
203
249
|
XBOX = "xbox"
|
|
204
250
|
}
|
|
205
|
-
/** Inclusive operating-system version bounds; each bound is dot-separated decimal integers. */
|
|
251
|
+
/** Inclusive operating-system version bounds; each bound is dot-separated decimal integers. @category Break Manifests & Ad Formats */
|
|
206
252
|
export interface OsVersionRange {
|
|
253
|
+
/** Lowest matching version, e.g. `"14"` or `"17.2"`. */
|
|
207
254
|
min?: string;
|
|
255
|
+
/** Highest matching version, e.g. `"18.1"`. */
|
|
208
256
|
max?: string;
|
|
209
257
|
}
|
|
210
258
|
/** Targeting criteria for break variants. @category Break Manifests & Ad Formats */
|
|
@@ -324,6 +372,11 @@ export interface StaticAsset extends BaseAsset {
|
|
|
324
372
|
type: AssetType.STATIC;
|
|
325
373
|
/** The resource URL or array of URLs with targeting */
|
|
326
374
|
uri: string | AssetUri[];
|
|
375
|
+
/**
|
|
376
|
+
* Query parameters the player appends to the resource URL (for HLS or DASH, only the
|
|
377
|
+
* master playlist or MPD request). Values may be `$NAME$` macros.
|
|
378
|
+
*/
|
|
379
|
+
assetParameters?: Record<string, string>;
|
|
327
380
|
}
|
|
328
381
|
/** VAST asset, played by Google IMA as CSAI. SGAI only, linear formats only (single, double, lshape_ad). @category Break Manifests & Ad Formats */
|
|
329
382
|
export interface VastAsset extends BaseAsset {
|
package/dist/types/Events.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Break, Asset, BreakFormat } from './BreakManifest';
|
|
2
|
-
import type {
|
|
2
|
+
import type { SessionDeliveryMode } from './OptiViewAdsConfig';
|
|
3
3
|
/**
|
|
4
4
|
* Lifecycle phase reported by {@link AdBreakStatus}.
|
|
5
5
|
* - `idle`: no break is upcoming or active.
|
|
@@ -8,7 +8,7 @@ import type { OptiViewAdsMode } from './OptiViewAdsConfig';
|
|
|
8
8
|
* @category Events */
|
|
9
9
|
export type AdBreakPhase = 'idle' | 'upcoming' | 'active' | 'complete';
|
|
10
10
|
/** Why a scheduled ad break was refused before it began (`adbreakskipped` event). @category Events */
|
|
11
|
-
export type AdBreakSkipReason = 'late' | 'not-ready' | 'preparation-failed' | 'unsupported' | 'overlap' | 'start-delay' | 'removed' | 'insufficient-remaining' | 'resource-limit';
|
|
11
|
+
export type AdBreakSkipReason = 'late' | 'not-ready' | 'preparation-failed' | 'unsupported' | 'overlap' | 'start-delay' | 'removed' | 'insufficient-remaining' | 'resource-limit' | 'played-by-ssb';
|
|
12
12
|
export interface AdBreakSkippedEvent extends OptiViewAdsEvent {
|
|
13
13
|
type: 'adbreakskipped';
|
|
14
14
|
break: Break;
|
|
@@ -37,6 +37,14 @@ export interface AdBreakStatus {
|
|
|
37
37
|
ticking: boolean;
|
|
38
38
|
/** The configured warning second that was crossed, when a pre-break warning triggered this status. */
|
|
39
39
|
warningSec?: number | undefined;
|
|
40
|
+
/**
|
|
41
|
+
* Whether the content player may start AirPlay right now: `false` during a break and in the
|
|
42
|
+
* seconds before one. Present only when the SDK manages the AirPlay gate (the manifest carries a
|
|
43
|
+
* server-side beaconing stream and the adapter can gate external playback).
|
|
44
|
+
*/
|
|
45
|
+
externalPlaybackAllowed?: boolean | undefined;
|
|
46
|
+
/** Delivery mode of the active session; `ssb` while AirPlay plays the server-side beaconing stream. Absent between sessions. */
|
|
47
|
+
deliveryMode?: SessionDeliveryMode | undefined;
|
|
40
48
|
}
|
|
41
49
|
/** Event types emitted by the OptiViewAds SDK. @category Events */
|
|
42
50
|
export type OptiViewAdsEventType = 'adbreakbegin' | 'adbreakend' | 'adbreakskipped' | 'adbegin' | 'adend' | 'aderror' | 'adfirstquartile' | 'admidpoint' | 'adthirdquartile' | 'adtimeupdate' | 'adbreakstatus' | 'adclick' | 'waiting' | 'playing' | 'volumechange' | 'adchannelchange' | 'externalvendorconfigurationchange';
|
|
@@ -209,13 +217,13 @@ export interface AdClickEvent extends OptiViewAdsEvent {
|
|
|
209
217
|
asset: Asset;
|
|
210
218
|
clickThrough?: string | undefined;
|
|
211
219
|
}
|
|
212
|
-
/** Why the SDK
|
|
213
|
-
export type AdChannelChangeReason = 'channel-id-changed' | 'channel-id-added' | 'channel-id-removed' | 'vendor-configuration-changed' | 'timebase-changed';
|
|
220
|
+
/** Why the SDK re-aligned ad configuration after a polled channel or event change; see {@link AdChannelChangeEvent}. @category Events */
|
|
221
|
+
export type AdChannelChangeReason = 'channel-id-changed' | 'channel-id-added' | 'channel-id-removed' | 'vendor-configuration-changed' | 'timebase-changed' | 'event-boundary' | 'external-playback';
|
|
214
222
|
/**
|
|
215
|
-
* Emitted when a polled manifest
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
223
|
+
* Emitted when a polled manifest changes the ads channel or playback crosses a channel-event
|
|
224
|
+
* boundary. Event-boundary changes use reason `event-boundary` and identify the active event
|
|
225
|
+
* with `eventId` (or `null` when no event is active). During an active break, the event is
|
|
226
|
+
* emitted after that break finishes and the latest manifest is applied.
|
|
219
227
|
* @category Events */
|
|
220
228
|
export interface AdChannelChangeEvent extends OptiViewAdsEvent {
|
|
221
229
|
type: 'adchannelchange';
|
|
@@ -223,17 +231,20 @@ export interface AdChannelChangeEvent extends OptiViewAdsEvent {
|
|
|
223
231
|
previousChannelId: string | null;
|
|
224
232
|
/** `channelId` of the manifest the session is aligned to now; `null` when it has none. */
|
|
225
233
|
channelId: string | null;
|
|
234
|
+
/** Event id in effect after the boundary, or null when no event is active. */
|
|
235
|
+
eventId: string | null;
|
|
226
236
|
reason: AdChannelChangeReason;
|
|
227
237
|
/** The polled manifest URL (unchanged by the switch). */
|
|
228
238
|
manifestUrl: string;
|
|
229
239
|
/** Delivery mode in effect before the switch. */
|
|
230
|
-
previousDeliveryMode:
|
|
240
|
+
previousDeliveryMode: SessionDeliveryMode;
|
|
231
241
|
/** Delivery mode in effect after the switch. */
|
|
232
|
-
deliveryMode:
|
|
242
|
+
deliveryMode: SessionDeliveryMode;
|
|
233
243
|
}
|
|
234
244
|
/** An external provider's manifest parameter template was added, changed, or removed. @category Events */
|
|
235
245
|
export interface ExternalVendorConfigurationChangeEvent extends OptiViewAdsEvent {
|
|
236
246
|
type: 'externalvendorconfigurationchange';
|
|
247
|
+
/** The provider whose template changed; read its new configuration with `getExternalVendorConfiguration(provider)`. */
|
|
237
248
|
provider: string;
|
|
238
249
|
}
|
|
239
250
|
/** Union type of all SDK events. @category Events */
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
/** Resolved parameters for an external provider declared in the break manifest. */
|
|
1
|
+
/** Resolved parameters for an external provider declared in the break manifest. @category Manifest Customization */
|
|
2
2
|
export interface ExternalVendorConfiguration {
|
|
3
|
+
/** The provider, as declared by the manifest's `external` vendor configuration entry. */
|
|
3
4
|
provider: string;
|
|
5
|
+
/** The provider's parameters after merging application parameters and resolving macros. */
|
|
4
6
|
assetParameters: Record<string, string>;
|
|
5
7
|
}
|
|
@@ -112,8 +112,8 @@ export type AdInsertionType = 'replacement' | 'insertion';
|
|
|
112
112
|
/** Initial live-playback distance from the reported edge. @category Configuration */
|
|
113
113
|
export interface LiveStartPushbackConfig {
|
|
114
114
|
/**
|
|
115
|
-
* Apply once per session/channel.
|
|
116
|
-
*
|
|
115
|
+
* Apply once per session/channel. Off unless set to `true`, for every `ptsSource`.
|
|
116
|
+
* @default false
|
|
117
117
|
*/
|
|
118
118
|
enabled?: boolean;
|
|
119
119
|
/** Minimum total distance in target durations, not an additional rewind. @default 5 */
|
|
@@ -127,6 +127,8 @@ export interface LiveStartPushbackConfig {
|
|
|
127
127
|
* stream, loads the stitched master, forwards timed metadata to IMA and re-emits ad events.
|
|
128
128
|
* @category Configuration */
|
|
129
129
|
export type OptiViewAdsMode = 'sgai' | 'ssai';
|
|
130
|
+
/** The delivery mode a session runs in: `ssb` while AirPlay plays the channel's server-side beaconing stream. @category SDK & Sessions */
|
|
131
|
+
export type SessionDeliveryMode = OptiViewAdsMode | 'ssb';
|
|
130
132
|
/** How a PTS-timebase break's `start` value is resolved. @category Configuration */
|
|
131
133
|
export type PtsSource = 'mediaTime' | 'anvatoCue';
|
|
132
134
|
/** Default ad insertion architecture. */
|
|
@@ -245,6 +247,14 @@ export interface DiagnosticsConfig {
|
|
|
245
247
|
*/
|
|
246
248
|
bufferSize?: number;
|
|
247
249
|
}
|
|
250
|
+
/** AirPlay guard settings. @category Configuration */
|
|
251
|
+
export interface ExternalPlaybackConfig {
|
|
252
|
+
/**
|
|
253
|
+
* Seconds before a scheduled break during which AirPlay may not start; `0` blocks only during a break.
|
|
254
|
+
* @default 5
|
|
255
|
+
*/
|
|
256
|
+
blockBeforeBreakSec?: number;
|
|
257
|
+
}
|
|
248
258
|
/** SDK instance configuration, fixed for its lifetime (org-level). @category Configuration */
|
|
249
259
|
export interface OptiViewAdsConfig {
|
|
250
260
|
/**
|
|
@@ -348,7 +358,12 @@ export interface OptiViewAdsConfig {
|
|
|
348
358
|
*/
|
|
349
359
|
continueContentDuringBreak?: boolean;
|
|
350
360
|
/**
|
|
351
|
-
*
|
|
361
|
+
* AirPlay (external playback) guard, active only when the manifest carries a server-side
|
|
362
|
+
* beaconing (`ssb`) stream and the content adapter can gate external playback.
|
|
363
|
+
*/
|
|
364
|
+
externalPlayback?: ExternalPlaybackConfig;
|
|
365
|
+
/**
|
|
366
|
+
* Live startup adjustment, off unless `liveStartPushback.enabled` is `true`; does not change later
|
|
352
367
|
* break-resume policy.
|
|
353
368
|
*/
|
|
354
369
|
liveStartPushback?: LiveStartPushbackConfig;
|
|
@@ -418,11 +433,12 @@ export interface SessionConfig {
|
|
|
418
433
|
* manifest / session / update value is replaced when the ad request is built,
|
|
419
434
|
* so `"$OPTIVIEW_PLAYER_WIDTH$x$OPTIVIEW_PLAYER_HEIGHT$"` becomes `"1920x1080"`.
|
|
420
435
|
* Customer macros are consulted before the built-in `$OPTIVIEW_*` set, so a built-in can be
|
|
421
|
-
* overridden. A string replaces the token. `null
|
|
422
|
-
*
|
|
423
|
-
*
|
|
424
|
-
*
|
|
425
|
-
* unresolved built-in
|
|
436
|
+
* overridden. A string replaces the token. `""`, `null`, or a registered callback's `undefined`
|
|
437
|
+
* result omits the parameter, or only the containing pair when its value has a literal `&`;
|
|
438
|
+
* `DA-ASSET-PARAMETER-OMITTED` reports the omission. An `undefined` map entry is not registered.
|
|
439
|
+
* `updateAssetParameterMacros` uses `undefined` to unregister a name. A throwing callback warns
|
|
440
|
+
* and is unresolved, falling back to a built-in when one exists. `DA-ASSET-MACRO-UNKNOWN` reports
|
|
441
|
+
* unresolved built-in or registered macros.
|
|
426
442
|
* Other unresolved `$NAME$` tokens stay literal without a diagnostic. `$` without a closing `$`
|
|
427
443
|
* is unchanged.
|
|
428
444
|
* Callbacks are evaluated per ad request and cleared when the session ends.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dolby-optiview/ads-sdk-core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "OptiView Ads SDK Core - Player-agnostic ad insertion",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -17,6 +17,10 @@
|
|
|
17
17
|
"types": "./dist/id3/index.d.ts",
|
|
18
18
|
"default": "./dist/id3/index.js"
|
|
19
19
|
},
|
|
20
|
+
"./external-playback": {
|
|
21
|
+
"types": "./dist/external-playback/index.d.ts",
|
|
22
|
+
"default": "./dist/external-playback/index.js"
|
|
23
|
+
},
|
|
20
24
|
"./server": {
|
|
21
25
|
"types": "./dist/server/index.d.ts",
|
|
22
26
|
"default": "./dist/server/index.js"
|