import type { PluginContext } from '@openplayerjs/core'; import { AdDomManager } from '../ad-dom'; import { CaptionManager } from '../caption-manager'; import { AdScheduler } from '../schedule'; import type { AdDeliveryMode, AdSessionStrategy, AdsBreakConfig, AdsEvent, AdsPluginConfig, AdsSource, AdsSourceType, ScteSource, VastInput } from '../types'; import { PluginBus } from '../types'; export type NormalizedCsaiConfig = { sources: AdsSource[]; breaks: AdsBreakConfig[]; interceptPlayForPreroll: boolean; autoPlayOnReady: boolean; allowNativeControls: boolean; resumeContent: boolean; preferredMediaTypes: string[]; debug: boolean; breakTolerance: number; adSourcesMode: 'waterfall' | 'playlist'; omid: { accessMode?: 'domain' | 'limited'; }; labels: { skip?: string; advertisement?: string; adEnded?: string; }; adDelivery: AdDeliveryMode; mountEl?: HTMLElement; mountSelector?: string; nonLinearContainer?: HTMLElement; nonLinearSelector?: string; companionContainer?: HTMLElement; companionSelector?: string; requestInterceptor?: AdsPluginConfig['requestInterceptor']; eventSink?: AdsPluginConfig['eventSink']; scteSource?: ScteSource; resolveScteUrl?: AdsPluginConfig['resolveScteUrl']; }; /** * Client-side ad insertion strategy. * * Owns all CSAI-specific logic: scheduling, VAST fetching, ad video rendering, * tracking, OMID/SIMID sessions, and break lifecycle management. * * `HybridAdStrategy` extends this class and adds SCTE-35 cue bridging on top. */ export declare class CsaiAdStrategy implements AdSessionStrategy { readonly mode: AdDeliveryMode; /** @internal */ ctx: PluginContext; /** @internal */ bus: PluginBus; /** @internal */ cfg: NormalizedCsaiConfig; /** @internal */ scheduler: AdScheduler; /** @internal */ captionMgr: CaptionManager; /** @internal */ _dom?: AdDomManager; private overlayId; /** @internal */ overlay: HTMLDivElement; /** @internal */ adVideo?: HTMLVideoElement; private adEndPromise; private adEngineDetach?; private currentBreakMeta?; /** @internal */ vastClient: any; /** @internal */ tracker?: any; private _lastCreative; /** @internal */ globalUnsubs: (() => void)[]; /** @internal */ sessionUnsubs: (() => void)[]; /** @internal */ active: boolean; /** @internal */ resumeAfter: boolean; private contentMedia?; private contentHadControls; private startingBreak; private userPlayIntent; /** @internal */ forcedMuteUntilInteraction: boolean; private syncingVolume; /** * @internal * Dispatch proxies — AdsPlugin replaces these after init() so that * `jest.spyOn(plugin, 'startBreak')` etc. can intercept scheduler calls. */ _dispatchStartBreak: (b: AdsBreakConfig, kind: 'preroll' | 'midroll' | 'postroll' | 'auto', opts?: { suppressResume?: boolean; }) => Promise; _dispatchStartBreakGroup: (breaks: AdsBreakConfig[], kind: 'preroll' | 'midroll' | 'postroll' | 'auto') => Promise; _dispatchPlayBreakFromVast: (input: VastInput, meta: { kind: 'preroll' | 'midroll' | 'postroll' | 'auto' | 'manual'; id: string; sourceType?: AdsSourceType; }, opts?: { suppressResumeOnError?: boolean; suppressResumeOnSuccess?: boolean; }) => Promise; _dispatchGetVastXmlText: (input: VastInput) => Promise; _dispatchBuildParsedForNonLinear: (xmlText: string) => XMLDocument | null; _dispatchMountAdVideo: (contentMedia: HTMLMediaElement, mediaFile: { fileURL: string; raw: any; }, creative?: any) => void; _dispatchStartAdPlayback: () => void; private simidSession?; private omidSession?; init(ctx: PluginContext, config: AdsPluginConfig): void; destroy(): void; playAds(vastUrl: string): Promise; playAdsFromXml(vastXml: string): Promise; getDueMidrollBreaks(currentTime: number): AdsBreakConfig[]; getDueMidrollBreak(currentTime: number): AdsBreakConfig | undefined; requestSkip(reason?: 'button' | 'close' | 'api'): void; /** @internal */ get dom(): AdDomManager; /** @internal */ set dom(v: AdDomManager); private bindPrerollInterceptors; /** @internal */ shouldInterceptPreroll(): boolean; private bindBreakScheduler; /** @internal */ startBreak(b: AdsBreakConfig, kind: 'preroll' | 'midroll' | 'postroll' | 'auto', opts?: { suppressResume?: boolean; }): Promise; /** @internal */ startBreakGroup(breaks: AdsBreakConfig[], kind: 'preroll' | 'midroll' | 'postroll' | 'auto'): Promise; /** @internal */ playBreakFromVast(input: VastInput, meta: { kind: 'preroll' | 'midroll' | 'postroll' | 'auto' | 'manual'; id: string; sourceType?: AdsSourceType; }, opts?: { suppressResumeOnError?: boolean; suppressResumeOnSuccess?: boolean; }): Promise; private playNonLinearOnlyBreak; private playNonLinearOnlyBreakFromXml; private dismissNonLinear; private mountAdVideo; private bindAdSurfaceCommands; private bindTrackerAndTelemetry; /** @internal */ startAdPlayback(): void; private waitForAdEnd; /** @internal */ clearSession(): void; private finish; protected log(...args: any[]): void; protected warn(...args: any[]): void; /** @internal */ getVastXmlText(input: any): Promise; /** @internal */ buildParsedForNonLinearFromXml(xmlText: string): XMLDocument; /** @internal */ computeSkipAtSecondsDelegate(skipOffset: string | undefined, duration: number): number | undefined; /** @internal */ collectPodAdsDelegate(parsed: any): import("../types").PodAd[]; /** @internal */ getPrerollBreak(): AdsBreakConfig | undefined; /** @internal */ getBreakId(b: AdsBreakConfig): string; /** @internal */ loadVmapAndMerge(existing: AdsBreakConfig[], src?: string): Promise; /** @internal */ get resolvedBreaks(): AdsBreakConfig[]; /** @internal */ set resolvedBreaks(v: AdsBreakConfig[]); /** @internal */ get pendingPercentBreaks(): any[]; /** @internal */ set pendingPercentBreaks(v: any[]); /** @internal */ get playedBreaks(): Set; /** @internal */ get vmapPending(): boolean; /** @internal */ get vmapLoadPromise(): Promise | null; /** @internal */ get pendingVmapSrc(): string | undefined; /** @internal */ isXmlString(src: string): boolean; /** @internal */ ensureOverlayMounted(): void; /** @internal */ mountCompanions(creative: any): void; /** @internal */ renderCompanion(companion: any): HTMLElement | null; /** @internal */ renderNonLinear(nl: any): HTMLElement | null; /** @internal */ ensureRawCaptions(mediaFileRaw: any, creative?: any): import("../types").CaptionResource[]; /** @internal */ attachAdCaptionTracks(adVideo: HTMLVideoElement, raw: any, creative?: any): HTMLTrackElement[]; } //# sourceMappingURL=csai.d.ts.map