stormcloud-video-player 0.8.59 → 0.8.61
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/LICENSE +21 -21
- package/README.md +1369 -1369
- package/dist/stormcloud-vp.min.js +3 -1
- package/lib/Player.cjs +548 -0
- package/lib/Player.cjs.map +1 -0
- package/lib/Player.d.cts +146 -0
- package/lib/{index.js → StormcloudPlayer.cjs} +1193 -1908
- package/lib/StormcloudPlayer.cjs.map +1 -0
- package/lib/{index.d.ts → StormcloudPlayer.d.cts} +7 -400
- package/lib/index.cjs +1064 -280
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +18 -4032
- package/lib/patterns.cjs +111 -0
- package/lib/patterns.cjs.map +1 -0
- package/lib/patterns.d.cts +14 -0
- package/lib/player/AdBreakOrchestrator.cjs +51 -16
- package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
- package/lib/player/AdBreakOrchestrator.d.cts +3 -1
- package/lib/player/AdConfigManager.cjs +206 -26
- package/lib/player/AdConfigManager.cjs.map +1 -1
- package/lib/player/AdConfigManager.d.cts +1 -1
- package/lib/player/AdTimingService.cjs.map +1 -1
- package/lib/player/AdTimingService.d.cts +1 -1
- package/lib/player/HlsEngine.cjs.map +1 -1
- package/lib/player/HlsEngine.d.cts +1 -1
- package/lib/player/PlaceholderLayer.cjs.map +1 -1
- package/lib/player/PlayerControls.cjs.map +1 -1
- package/lib/player/PlayerControls.d.cts +1 -1
- package/lib/player/Scte35CueManager.cjs.map +1 -1
- package/lib/player/Scte35CueManager.d.cts +1 -1
- package/lib/player/Scte35Parser.cjs.map +1 -1
- package/lib/player/Scte35Parser.d.cts +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +1060 -278
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/player/playerTypes.cjs.map +1 -1
- package/lib/player/playerTypes.d.cts +1 -1
- package/lib/players/FilePlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +1060 -278
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +1060 -278
- package/lib/players/index.cjs.map +1 -1
- package/lib/props.cjs +186 -0
- package/lib/props.cjs.map +1 -0
- package/lib/props.d.cts +62 -0
- package/lib/sdk/hlsAdPlayer.cjs +884 -234
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/sdk/pal.cjs +9 -5
- package/lib/sdk/pal.cjs.map +1 -1
- package/lib/sdk/pal.d.cts +1 -0
- package/lib/types.cjs +49 -0
- package/lib/types.cjs.map +1 -0
- package/lib/{types-52ASml2N.d.cts → types.d.cts} +48 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +1064 -280
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/ctvVastSignals.cjs +178 -19
- package/lib/utils/ctvVastSignals.cjs.map +1 -1
- package/lib/utils/devUrl.cjs.map +1 -1
- package/lib/utils/polyfills.cjs.map +1 -1
- package/lib/utils/tracking.cjs +45 -16
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/trackingIngest.cjs.map +1 -1
- package/lib/utils/vastEnvironmentSignals.cjs +192 -20
- package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
- package/lib/utils/vastEnvironmentSignals.d.cts +13 -2
- package/lib/utils/vastMacros.cjs +50 -4
- package/lib/utils/vastMacros.cjs.map +1 -1
- package/lib/utils/vastMacros.d.cts +2 -0
- package/lib/utils/vastTrackingMacros.cjs +5 -0
- package/lib/utils/vastTrackingMacros.cjs.map +1 -1
- package/lib/utils/vastTrackingMacros.d.cts +2 -0
- package/lib/utils.cjs +292 -0
- package/lib/utils.cjs.map +1 -0
- package/lib/utils.d.cts +17 -0
- package/package.json +91 -91
- package/rollup.config.js +90 -90
- package/lib/index.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/HlsPlayer.cjs","../../src/players/HlsPlayer.tsx","../../src/sdk/hlsAdPlayer.ts","../../src/utils/browserCompat.ts","../../src/utils/vastTrackingMacros.ts","../../src/utils/devUrl.ts","../../src/sdk/pal.ts","../../src/utils/trackingIngest.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/player/Scte35Parser.ts","../../src/player/Scte35CueManager.ts","../../src/player/AdConfigManager.ts","../../src/player/AdTimingService.ts","../../src/player/PlaceholderLayer.ts","../../src/player/HlsEngine.ts","../../src/player/PlayerControls.ts"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","HlsPlayer_exports","HlsPlayer","module","exports","import_react","require","import_hls","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","requiresMediaPipelineResetAfterAds","browser","overrides","allowNativeHls","pauseContentDuringAds","logBrowserInfo","debug","console","log","VAST_MACRO_PATTERN","CACHEBUSTING_ALIASES","KNOWN_VAST_MACROS","generateCachebuster","String","Math","floor","random","formatPlayhead","seconds","Number","isFinite","total","hh","padStart","mm","ss","ms","resolveMacroValues","ctx","values","set","adPlayhead","contentPlayheadSeconds","assetUri","mediaMime","Date","toISOString","errorCode","playerWidth","playerHeight","round","deviceId","limitAdTracking","pageUrl","URL","hostname","clientUa","podSequence","url","replace","encodeURIComponent","has","MAX_VAST_WRAPPER_DEPTH","BEACON_TIMEOUT_MS","inFlightBeacons","VAST_ERROR_MEDIA_DISPLAY","toVastMediaErrorCode","error","code","AD_CONTAINER_PROP","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","max","min","volume","listeners","mainHlsInstance","AD_VIDEO_PROP","FRAME_COUNTER_RELIABLE_PROP","RVFC_RELIABLE_PROP","adVideoElement","adHls","adContainerEl","adEventHandlers","currentAdMediaFile","podAds","podIndex","preloadedAds","preloadingAds","destroyed","pendingTimeouts","STALL_TIMEOUT_MS","STALL_CHECK_INTERVAL_MS","BLACKFRAME_MIN_PLAYBACK_S","stallWatchdogId","lastAdProgressTime","lastAdProgressPosition","sawDecodedVideoFrame","videoFrameCallbackHandle","pendingPlayPromise","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","fn","emit","event","payload","Array","warn","buildTrackingMacroContext","adPlayheadSeconds","currentTime","type","clientHeight","context","location","href","length","urls","macroContext","forEach","trackingUrl","substituteVastTrackingMacros","timeoutId","img","level","Image","add","clearTimeout","onload","onerror","delete","release","setTimeout","src","getMainStreamQuality","levels","currentLevel","autoLevel","width","height","bitrate","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","map","file","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","toLowerCase","includes","isProgressiveMediaFile","startsWith","endsWith","isAudioMediaFile","collectVideoMediaFiles","scope","verbose","mediaFileElements","querySelectorAll","mf","index","getAttribute","textContent","trim","bitrateAttr","bitrateValue","hasExplicitDimensions","push","createEmptyTrackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","trackingUrls","el","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","duration","ad","id","parseAdElement","fetchVastXml","vastTagUrl","credentials","requestVast","response","creds","fetch","mode","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","trimmedXml","adElements","ads","resolved","aSeq","bSeq","aVal","MAX_SAFE_INTEGER","bVal","style","createAdVideoElement","video","document","createElement","position","left","top","objectFit","backgroundColor","muted","currentAd","onTimeUpdate","noteAdProgress","progress","fireTrackingPixels","onLoadedMetadata","videoWidth","videoHeight","handleVideoDecodeFailure","onPlaying","startStallWatchdog","onEnded","advanceToNextPodAd","handleAdComplete","onError","e","handleAdError","onVolumeChange","onPause","ended","onPlay","handler","addEventListener","teardownAdEventListeners","removeEventListener","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","isRvfcSupported","requestVideoFrameCallback","settlePendingPlay","startAdPlayback","playPromise","play","catch","finally","prepareVideoElementForNewSource","destroy","removeAttribute","load","recreateAdVideoElement","appendChild","loadCurrentAdMedia","isHlsAd","Hls","isSupported","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","ERROR","_event","data","canPlayType","clearStallWatchdog","setupAdEventListeners","clearInterval","handleAdStall","markRvfcReliable","now","getDecodedVideoFrameCount","getVideoPlaybackQuality","quality","totalVideoFrames","legacyCount","webkitDecodedFrameCount","isFrameCounterReliable","isRvfcReliable","cancelVideoFrameProbe","cancelVideoFrameCallback","startVideoFrameProbe","rvfc","onPresentedFrame","blackFrameDetectionEnabled","window","setInterval","paused","decodedFrames","markFrameCounterReliable","timeAdvancing","releaseAdDecoder","display","pointerEvents","continueLiveStreamDuringAds","opacity","visibility","initialize","container","right","bottom","alignItems","justifyContent","zIndex","requestAds","reject","preloaded","resolve","contentVolume","stop","previousMutedState","clear","isAdPlaying","resize","listener","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","parentElement","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","PRIVATE_HOST_PATTERNS","getPodAdCount","getPodTotalDurationMs","reduce","isLocalDevHost","host","some","pattern","toDevSafeUrl","rawUrl","protocol","cleanPath","pathname","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","goog","pal","existing","timeout","script","async","setAttribute","head","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","iconsSupported","playerType","playerVersion","supportedApiFrameworks","ppid","sessionId","getNonce","getCurrentNonce","injectNonce","searchParams","base","sep","sendPlaybackStart","sendPlaybackEnd","sendAdTouch","sendAdClick","reset","enabled","baseUrl","normalizeIngestBaseUrl","trackingIngestConfig","DEFAULT_TRACKING_INGEST_CONFIG","isTrackingIngestEnabled","buildTrackingIngestUrl","channel","ingestPlayerTracking","licenseKey","body","method","Authorization","JSON","stringify","CTV_SESSION_STORAGE_KEY","PLAYER_ID_STORAGE_KEY","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","resolveVastEnvironmentSignals","isCtv","platformLat","bridgeSignals","readNativeBridgeSignals","platformDevice","readPlatformNativeDeviceId","realDeviceId","readStoredDeviceId","deviceIdType","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","dpid","getOrCreateStoredUuid","getOrCreateCtvSessionId","deviceTypeHint","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","isMacroPlaceholder","isZeroedAdId","storageKey","readPersistentId","writePersistentId","createUuid","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","cookie","part","entry","decodeURIComponent","slice","bytes","crypto","randomUUID","Uint8Array","getRandomValues","seed","performanceNow","i","hex","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","contentUrl","readBridgeValue","appId","appName","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","debugAdTiming","isLiveStream","inputStreamType","screen","vendor","maxTouchPoints","memory","deviceMemory","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isAndroid","isWebView","isWebApp","webosMatch","tizenMatch","tvMatch","androidModelMatch","matchMedia","matches","standalone","angle","domain","origin","path","hardwareConcurrency","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","TextEncoder","encode","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","getClientInfo","ad_loaded","player_id","device_type","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","append","str","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","pos","search","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","getValue","applyDeviceIdentityParams","correlator","trimmed","generateCorrelator","buf","Uint32Array","expandInlineMacroPlaceholders","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","_match","val","applyVastMacros","expandedUrl","streamCorrelator","pod","podMinDurationMs","podMaxDurationMs","podMaxAds","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","programTitle","staleKeys","replaceCorrelatorFallback","correlatorRegex","fetchConsentSignals","timeoutMs","signals","tasks","tcfApi","__tcfapi","tcData","success","settled","eventStatus","gdprApplies","tcString","listenerId","uspApi","__uspapi","uspString","parseCueOutDuration","num","parseFloat","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","fatal","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","offset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","toRead","numBits","remainingInByte","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","segmentationTypeId","high","low","ptsTicks","markerTypeFromSegmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","descriptorLength","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorDataStart","descriptorDataEnd","descriptorMarker","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","getScte35CueKey","toIdentityString","splice_event_id","daterangeId","ID","scteValue","getScte35MarkerRaw","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","status","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hours","hms","minutes","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","getPalDescriptionUrl","generatePodVastUrl","podParams","adPlayer","palNonce","urlWithMacros","envSignals","finalUrl","initializeTracking","heartbeatInterval","sendHeartbeatIfNeeded","lastHeartbeatTime","destroyTracking","minAdRequestIntervalMs","clearAdStopTimer","AdTimingService","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","scheduleAdStopCountdown","remainingMs","ensureAdStoppedByTimer","adStopTimerId","nowWallClockMs","expectedAdBreakDurationMs","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","budgetRemaining","wallClockRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","message","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","globalMinGamIntervalMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimeoutMs","adFailsafeTimerId","videoPaused","extra","getAdState","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","hide","requestAnimationFrame","removeChild","videoSrcProtection","HlsEngine","cueManager","timing","nativeHlsMode","reloadingLiveStream","bufferedSegmentsCount","shouldAutoplayAfterBuffering","latencyProfileApplied","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","autoplay","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","hasInitialBufferCompleted","minSegmentsBeforePlay","applyStreamLatencyProfile","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","_evt","err","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","isLowLatencyStream","detectedLowLatencyStream","isLowLatencyManifest","useLowLatency","cfg","liveSyncDuration","liveSyncDurationCount","lowLatencyModeRequested","canBlockReload","partTarget","partHoldBack","partListLength","partList","targetDuration","targetduration","hasParts","hasPartTarget","hasPartHoldBack","payloadData","getLiveSyncPosition","liveSyncPosition","restartLoadAt","stopLoad","reloadLiveStream","detachMedia","recreateDelayMs","getAdAudioVolume","toggleMute","newMutedState","restoreVolume","toggleFullscreen","fullscreenElement","requestFullscreen"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer_exports = {};\n__export(HlsPlayer_exports, {\n default: () => HlsPlayer\n});\nmodule.exports = __toCommonJS(HlsPlayer_exports);\nvar import_react = require(\"react\");\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsModernJS = false;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction requiresMediaPipelineResetAfterAds() {\n const browser = detectBrowser();\n return browser.name === \"Samsung Tizen\" && (browser.tizenVersion ?? 0) >= 5;\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n overrides.pauseContentDuringAds = true;\n }\n return overrides;\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n userAgent: navigator.userAgent\n });\n}\n\n// src/utils/vastTrackingMacros.ts\nvar VAST_MACRO_PATTERN = /\\[([A-Z][A-Z0-9_]*)\\]/g;\nvar CACHEBUSTING_ALIASES = /\\[CACHEBUSTER\\]|\\[cachebuster\\]|\\[timestamp\\]|\\[random\\]|\\[INSERT_RANDOM_NUMBER\\]|%%CACHEBUSTER%%|%%CACHEBUST%%|\\$\\{CACHEBUSTER\\}|\\$\\{CACHEBUSTING\\}|\\{cachebuster\\}|\\{random\\}/g;\nvar KNOWN_VAST_MACROS = /* @__PURE__ */ new Set([\n \"ADCATEGORIES\",\n \"ADCOUNT\",\n \"ADPLAYHEAD\",\n \"ADSERVINGID\",\n \"ADTYPE\",\n \"APIFRAMEWORKS\",\n \"APPBUNDLE\",\n \"ASSETURI\",\n \"BLOCKEDADCATEGORIES\",\n \"BREAKMAXADLENGTH\",\n \"BREAKMAXADS\",\n \"BREAKMAXDURATION\",\n \"BREAKMINADLENGTH\",\n \"BREAKPOSITION\",\n \"CACHEBUSTING\",\n \"CLICKPOS\",\n \"CLICKTYPE\",\n \"CLIENTUA\",\n \"CONTENTID\",\n \"CONTENTPLAYHEAD\",\n \"CONTENTURI\",\n \"DEVICEIP\",\n \"DEVICEUA\",\n \"DOMAIN\",\n \"ERRORCODE\",\n \"EXTENSIONS\",\n \"GDPRCONSENT\",\n \"IFA\",\n \"IFATYPE\",\n \"INVENTORYSTATE\",\n \"LATLONG\",\n \"LIMITADTRACKING\",\n \"MEDIAMIME\",\n \"MEDIAPLAYHEAD\",\n \"OMIDPARTNER\",\n \"PAGEURL\",\n \"PLACEMENTTYPE\",\n \"PLAYERCAPABILITIES\",\n \"PLAYERSIZE\",\n \"PLAYERSTATE\",\n \"PODSEQUENCE\",\n \"REGULATIONS\",\n \"SERVERSIDE\",\n \"SERVERUA\",\n \"TIMESTAMP\",\n \"TRANSACTIONID\",\n \"UNIVERSALADID\",\n \"VASTVERSIONS\",\n \"VERIFICATIONVENDORS\"\n]);\nfunction generateCachebuster() {\n return String(Math.floor(Math.random() * 9e7) + 1e7);\n}\nfunction formatPlayhead(seconds) {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0) {\n return void 0;\n }\n const total = Math.floor(seconds);\n const hh = String(Math.floor(total / 3600)).padStart(2, \"0\");\n const mm = String(Math.floor(total % 3600 / 60)).padStart(2, \"0\");\n const ss = String(total % 60).padStart(2, \"0\");\n const ms = String(Math.floor((seconds - total) * 1e3)).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\nfunction resolveMacroValues(ctx) {\n const values = /* @__PURE__ */ new Map();\n const set = (key, value) => {\n if (value != null && value !== \"\") values.set(key, value);\n };\n const adPlayhead = formatPlayhead(ctx.adPlayheadSeconds);\n set(\"ADPLAYHEAD\", adPlayhead);\n set(\"MEDIAPLAYHEAD\", adPlayhead);\n set(\"CONTENTPLAYHEAD\", formatPlayhead(ctx.contentPlayheadSeconds));\n set(\"ASSETURI\", ctx.assetUri);\n set(\"MEDIAMIME\", ctx.mediaMime);\n set(\"TIMESTAMP\", (/* @__PURE__ */ new Date()).toISOString());\n set(\"SERVERSIDE\", \"0\");\n if (ctx.errorCode != null && ctx.errorCode !== \"\") {\n set(\"ERRORCODE\", String(ctx.errorCode));\n }\n if (ctx.playerWidth != null && ctx.playerHeight != null) {\n set(\"PLAYERSIZE\", `${Math.round(ctx.playerWidth)},${Math.round(ctx.playerHeight)}`);\n }\n set(\"IFA\", ctx.deviceId);\n set(\"IFATYPE\", ctx.deviceIdType);\n if (ctx.limitAdTracking != null) {\n set(\"LIMITADTRACKING\", ctx.limitAdTracking ? \"1\" : \"0\");\n }\n set(\"PAGEURL\", ctx.pageUrl);\n if (ctx.pageUrl) {\n try {\n set(\"DOMAIN\", new URL(ctx.pageUrl).hostname);\n } catch {\n }\n }\n set(\"CLIENTUA\", ctx.clientUa);\n set(\"DEVICEUA\", ctx.clientUa);\n if (ctx.podSequence != null) {\n set(\"PODSEQUENCE\", String(ctx.podSequence));\n }\n return values;\n}\nfunction substituteVastTrackingMacros(url, ctx = {}) {\n if (!url) return url;\n const values = resolveMacroValues(ctx);\n return url.replace(CACHEBUSTING_ALIASES, () => generateCachebuster()).replace(VAST_MACRO_PATTERN, (match, name) => {\n if (name === \"CACHEBUSTING\") return generateCachebuster();\n const value = values.get(name);\n if (value != null) return encodeURIComponent(value);\n return KNOWN_VAST_MACROS.has(name) ? \"\" : match;\n });\n}\n\n// src/sdk/hlsAdPlayer.ts\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nvar BEACON_TIMEOUT_MS = 3e4;\nvar inFlightBeacons = /* @__PURE__ */ new Set();\nvar VAST_ERROR_MEDIA_DISPLAY = 405;\nfunction toVastMediaErrorCode(error) {\n switch (error?.code) {\n case 1:\n return 400;\n case 2:\n return 401;\n case 4:\n return 403;\n default:\n return VAST_ERROR_MEDIA_DISPLAY;\n }\n}\nfunction createHlsAdPlayer(contentVideo, options) {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = /* @__PURE__ */ new Map();\n const mainHlsInstance = options?.mainHlsInstance;\n const AD_CONTAINER_PROP = \"__stormcloudAdContainer\";\n const AD_VIDEO_PROP = \"__stormcloudAdVideo\";\n const FRAME_COUNTER_RELIABLE_PROP = \"__stormcloudFrameCounterReliable\";\n const RVFC_RELIABLE_PROP = \"__stormcloudRvfcReliable\";\n let adVideoElement = contentVideo[AD_VIDEO_PROP] ?? void 0;\n let adHls;\n let adContainerEl = contentVideo[AD_CONTAINER_PROP] ?? void 0;\n let adEventHandlers = [];\n let currentAd;\n let currentAdMediaFile;\n let podAds = [];\n let podIndex = 0;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\n const STALL_TIMEOUT_MS = 4e3;\n const STALL_CHECK_INTERVAL_MS = 1e3;\n const BLACKFRAME_MIN_PLAYBACK_S = 1.5;\n let stallWatchdogId;\n let lastAdProgressTime = 0;\n let lastAdProgressPosition = 0;\n let sawDecodedVideoFrame = false;\n let videoFrameCallbackHandle;\n let pendingPlayPromise;\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n function emit(event, payload) {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n function buildTrackingMacroContext(errorCode) {\n const context = {\n adPlayheadSeconds: adVideoElement?.currentTime,\n contentPlayheadSeconds: contentVideo.currentTime,\n assetUri: currentAdMediaFile?.url,\n mediaMime: currentAdMediaFile?.type,\n playerWidth: adVideoElement?.clientWidth || adContainerEl?.clientWidth,\n playerHeight: adVideoElement?.clientHeight || adContainerEl?.clientHeight\n };\n if (errorCode != null) {\n context.errorCode = errorCode;\n }\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n context.clientUa = navigator.userAgent;\n }\n if (typeof location !== \"undefined\" && location.href) {\n context.pageUrl = location.href;\n }\n if (podAds.length > 0) {\n context.podSequence = podIndex + 1;\n }\n return context;\n }\n function fireTrackingPixels(urls, options2) {\n if (!urls || urls.length === 0) return;\n const macroContext = buildTrackingMacroContext(options2?.errorCode);\n urls.forEach((url) => {\n try {\n const trackingUrl = substituteVastTrackingMacros(url, macroContext);\n const img = new Image(1, 1);\n inFlightBeacons.add(img);\n let timeoutId;\n const release = () => {\n if (timeoutId !== void 0) clearTimeout(timeoutId);\n img.onload = null;\n img.onerror = null;\n inFlightBeacons.delete(img);\n };\n img.onload = release;\n img.onerror = release;\n timeoutId = setTimeout(release, BEACON_TIMEOUT_MS);\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n function getMainStreamQuality() {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level2 = mainHlsInstance.levels[autoLevel];\n return {\n width: level2.width || 1920,\n height: level2.height || 1080,\n bitrate: level2.bitrate || 5e6\n };\n }\n return null;\n }\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5e6\n };\n }\n function selectBestMediaFile(mediaFiles) {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n const fileBitrate = (file.bitrate || 5e3) * 1e3;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n return { file, score, resolutionDiff, bitrateDiff };\n });\n scoredFiles.sort((a, b) => a.score - b.score);\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff\n });\n return bestMatch.file;\n }\n function isHlsMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n }\n function isProgressiveMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n }\n function isAudioMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = (mediaFile.url.toLowerCase().split(\"?\")[0] || \"\").trim();\n return type.startsWith(\"audio/\") || url.endsWith(\".mp3\") || url.endsWith(\".aac\") || url.endsWith(\".m4a\") || url.endsWith(\".ogg\") || url.endsWith(\".oga\") || url.endsWith(\".opus\") || url.endsWith(\".wav\") || url.endsWith(\".weba\");\n }\n function collectVideoMediaFiles(scope, verbose) {\n const mediaFileElements = scope.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n }\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n }\n if (!url) {\n if (verbose) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n }\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n };\n if (isAudioMediaFile(mediaFile)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (audio-only, type=\"${type}\") \\u2014 audio ads are not played to avoid a black screen`\n );\n return;\n }\n const hasExplicitDimensions = mf.getAttribute(\"width\") != null && mf.getAttribute(\"height\") != null;\n if (!isHlsMediaFile(mediaFile) && hasExplicitDimensions && (mediaFile.width <= 1 || mediaFile.height <= 1)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (degenerate dimensions ${mediaFile.width}x${mediaFile.height}, type=\"${type}\") \\u2014 likely an audio-only placeholder rendition`\n );\n return;\n }\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n }\n } else if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n return mediaFiles;\n }\n function createEmptyTrackingUrls() {\n return {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: []\n };\n }\n function extractTrackingUrls(scope) {\n const trackingUrls = createEmptyTrackingUrls();\n scope.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n scope.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n scope.querySelectorAll(\"Error\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.error.push(url);\n });\n return trackingUrls;\n }\n function mergeTrackingUrls(target, source) {\n Object.keys(target).forEach((key) => {\n if (source[key] && source[key].length > 0) {\n target[key] = target[key].concat(source[key]);\n }\n });\n return target;\n }\n function parseVastXml(xmlString) {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return { type: \"empty\" };\n }\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return { type: \"empty\" };\n }\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n const wrapperUri = xmlDoc.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n if (wrapperUri) {\n console.log(\n `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n );\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough\n };\n }\n const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n const mediaFiles = collectVideoMediaFiles(xmlDoc, true);\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n }\n return { type: \"empty\" };\n }\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough\n }\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return { type: \"empty\" };\n }\n }\n function parseAdElement(adElement) {\n try {\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const clickThrough = adElement.querySelector(\"ClickThrough\")?.textContent?.trim();\n const wrapperUri = adElement.querySelector(\"VASTAdTagURI\")?.textContent?.trim();\n if (wrapperUri) {\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough\n };\n }\n const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n const durationText = adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n const mediaFiles = collectVideoMediaFiles(adElement, false);\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n }\n return { type: \"empty\" };\n }\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough\n }\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n return { type: \"empty\" };\n }\n }\n async function fetchVastXml(vastTagUrl, credentials = \"include\") {\n const requestVast = (creds) => fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: creds,\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\n });\n let response;\n try {\n response = await requestVast(credentials);\n } catch (error) {\n if (credentials !== \"omit\") {\n console.warn(\n `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n error\n );\n response = await requestVast(\"omit\");\n } else {\n throw error;\n }\n }\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n return response.text();\n }\n async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls()) {\n const vastXml = await fetchVastXml(\n vastTagUrl,\n depth === 0 ? \"include\" : \"omit\"\n );\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n const parsed = parseVastXml(vastXml);\n if (parsed.type === \"empty\") {\n return null;\n }\n if (parsed.type === \"wrapper\") {\n if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n console.warn(\n `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n );\n return null;\n }\n mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n depth + 1,\n accumulatedTracking\n );\n }\n mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n return parsed.ad;\n }\n async function fetchAndParsePod(vastTagUrl) {\n const vastXml = await fetchVastXml(vastTagUrl);\n console.log(\n `[HlsAdPlayer] Pod VAST XML received (length=${vastXml.length})`\n );\n const trimmedXml = vastXml.trim();\n if (trimmedXml.length === 0) {\n console.warn(\n \"[HlsAdPlayer] Pod VAST response body is empty (no fill)\"\n );\n return [];\n }\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\n \"[HlsAdPlayer] Pod VAST XML parsing error (malformed). Content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return [];\n }\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\n \"[HlsAdPlayer] No <Ad> elements found in pod VAST response (no fill). Content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return [];\n }\n adElements.sort((a, b) => {\n const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n return aVal - bVal;\n });\n const ads = [];\n for (const adElement of adElements) {\n const parsed = parseAdElement(adElement);\n if (parsed.type === \"inline\") {\n ads.push(parsed.ad);\n } else if (parsed.type === \"wrapper\") {\n try {\n const resolved = await fetchAndParseVastAd(\n parsed.vastAdTagUri,\n 1,\n parsed.trackingUrls\n );\n if (resolved) {\n ads.push(resolved);\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n error\n );\n }\n }\n }\n console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n return ads;\n }\n function createAdVideoElement() {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n video.volume = 1;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n return video;\n }\n function setupAdEventListeners() {\n if (!adVideoElement || !currentAd) return;\n if (adEventHandlers.length > 0) return;\n const onTimeUpdate = () => {\n if (!currentAd || !adVideoElement) return;\n noteAdProgress();\n const progress = adVideoElement.currentTime / currentAd.duration;\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n };\n const onLoadedMetadata = () => {\n if (!adPlaying || !adVideoElement) return;\n const { videoWidth, videoHeight } = adVideoElement;\n if (videoWidth <= 1 || videoHeight <= 1) {\n console.warn(\n `[HlsAdPlayer] Ad creative has no usable video dimensions (${videoWidth}x${videoHeight}) - skipping this creative`\n );\n handleVideoDecodeFailure();\n }\n };\n const onPlaying = () => {\n startStallWatchdog();\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n };\n const onEnded = () => {\n if (!currentAd || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdComplete();\n };\n const onError = (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: toVastMediaErrorCode(adVideoElement?.error)\n });\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n };\n const onVolumeChange = () => {\n if (!currentAd || !adVideoElement) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n };\n const onPause = () => {\n if (currentAd && adVideoElement && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n };\n const onPlay = () => {\n if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n };\n adEventHandlers = [\n { type: \"timeupdate\", handler: onTimeUpdate },\n { type: \"loadedmetadata\", handler: onLoadedMetadata },\n { type: \"playing\", handler: onPlaying },\n { type: \"ended\", handler: onEnded },\n { type: \"error\", handler: onError },\n { type: \"volumechange\", handler: onVolumeChange },\n { type: \"pause\", handler: onPause },\n { type: \"play\", handler: onPlay }\n ];\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.addEventListener(type, handler);\n }\n }\n function teardownAdEventListeners() {\n if (adVideoElement) {\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.removeEventListener(type, handler);\n }\n }\n adEventHandlers = [];\n }\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n function resetQuartileTracking(preserveImpression) {\n trackingFired = {\n impression: preserveImpression ? trackingFired.impression : false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n }\n function isRvfcSupported(video) {\n return typeof video.requestVideoFrameCallback === \"function\";\n }\n function settlePendingPlay() {\n pendingPlayPromise = void 0;\n }\n function startAdPlayback(context) {\n if (!adVideoElement) return;\n const playPromise = adVideoElement.play();\n pendingPlayPromise = playPromise;\n playPromise.catch((error) => {\n if (pendingPlayPromise !== playPromise) {\n return;\n }\n console.error(`[HlsAdPlayer] Error starting ${context}:`, error);\n handleAdError();\n }).finally(() => {\n if (pendingPlayPromise === playPromise) {\n pendingPlayPromise = void 0;\n }\n });\n }\n function prepareVideoElementForNewSource() {\n settlePendingPlay();\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (!adVideoElement) return;\n try {\n adVideoElement.pause();\n adVideoElement.removeAttribute(\"src\");\n adVideoElement.load();\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error preparing ad video for new source:\",\n error\n );\n }\n }\n function recreateAdVideoElement() {\n console.log(\n \"[HlsAdPlayer] Recreating ad video element (single-decoder platform)\"\n );\n teardownAdEventListeners();\n prepareVideoElementForNewSource();\n if (adVideoElement) {\n try {\n adVideoElement.remove();\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error removing ad video element:\", error);\n }\n }\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n }\n function loadCurrentAdMedia() {\n if (!adVideoElement || !currentAd) {\n throw new Error(\"No ad video element or ad to load\");\n }\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n currentAdMediaFile = mediaFile;\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n );\n if (isHlsAd && import_hls.default.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n adHls = new import_hls.default({\n enableWorker: true,\n lowLatencyMode: false\n });\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n startAdPlayback(\"HLS ad playback\");\n });\n adHls.on(import_hls.default.Events.ERROR, (_event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n adVideoElement.src = mediaFile.url;\n startAdPlayback(\"native HLS ad playback\");\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n startAdPlayback(\"progressive ad playback\");\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n }\n function advanceToNextPodAd() {\n if (podIndex >= podAds.length - 1) {\n return false;\n }\n podIndex++;\n currentAd = podAds[podIndex];\n currentAdMediaFile = void 0;\n resetQuartileTracking(false);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n console.log(\n `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n );\n }\n clearStallWatchdog();\n if (requiresMediaPipelineResetAfterAds()) {\n recreateAdVideoElement();\n setupAdEventListeners();\n } else {\n prepareVideoElementForNewSource();\n }\n try {\n loadCurrentAdMedia();\n emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n return true;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n return false;\n }\n }\n function clearStallWatchdog() {\n if (stallWatchdogId != null) {\n clearInterval(stallWatchdogId);\n stallWatchdogId = void 0;\n }\n cancelVideoFrameProbe();\n }\n function noteAdProgress() {\n lastAdProgressTime = Date.now();\n if (adVideoElement) {\n lastAdProgressPosition = adVideoElement.currentTime;\n }\n }\n function handleAdStall() {\n console.warn(\n \"[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame\"\n );\n clearStallWatchdog();\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY\n });\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function getDecodedVideoFrameCount(video) {\n try {\n if (typeof video.getVideoPlaybackQuality === \"function\") {\n const quality = video.getVideoPlaybackQuality();\n if (quality && typeof quality.totalVideoFrames === \"number\") {\n return quality.totalVideoFrames;\n }\n }\n const legacyCount = video.webkitDecodedFrameCount;\n if (typeof legacyCount === \"number\") {\n return legacyCount;\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Unable to read decoded video frame count:\",\n error\n );\n }\n return void 0;\n }\n function isFrameCounterReliable() {\n return contentVideo[FRAME_COUNTER_RELIABLE_PROP] === true;\n }\n function markFrameCounterReliable() {\n contentVideo[FRAME_COUNTER_RELIABLE_PROP] = true;\n }\n function isRvfcReliable() {\n return contentVideo[RVFC_RELIABLE_PROP] === true;\n }\n function markRvfcReliable() {\n contentVideo[RVFC_RELIABLE_PROP] = true;\n }\n function cancelVideoFrameProbe() {\n if (videoFrameCallbackHandle != null && adVideoElement && typeof adVideoElement.cancelVideoFrameCallback === \"function\") {\n try {\n adVideoElement.cancelVideoFrameCallback(\n videoFrameCallbackHandle\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error cancelling video frame callback:\",\n error\n );\n }\n }\n videoFrameCallbackHandle = void 0;\n }\n function startVideoFrameProbe() {\n cancelVideoFrameProbe();\n if (!adVideoElement) return;\n const rvfc = adVideoElement.requestVideoFrameCallback;\n if (typeof rvfc !== \"function\") return;\n const onPresentedFrame = () => {\n videoFrameCallbackHandle = void 0;\n if (!adPlaying) return;\n sawDecodedVideoFrame = true;\n markRvfcReliable();\n };\n try {\n videoFrameCallbackHandle = rvfc.call(\n adVideoElement,\n onPresentedFrame\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error requesting video frame callback:\",\n error\n );\n videoFrameCallbackHandle = void 0;\n }\n }\n function handleVideoDecodeFailure() {\n console.warn(\n \"[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative\"\n );\n clearStallWatchdog();\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY\n });\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function startStallWatchdog() {\n clearStallWatchdog();\n noteAdProgress();\n sawDecodedVideoFrame = false;\n startVideoFrameProbe();\n const blackFrameDetectionEnabled = !requiresMediaPipelineResetAfterAds();\n stallWatchdogId = window.setInterval(() => {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n if (blackFrameDetectionEnabled && !sawDecodedVideoFrame && !adVideoElement.paused) {\n const decodedFrames = getDecodedVideoFrameCount(adVideoElement);\n if (decodedFrames !== void 0 && decodedFrames > 0) {\n sawDecodedVideoFrame = true;\n markFrameCounterReliable();\n } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {\n const timeAdvancing = adVideoElement.currentTime > lastAdProgressPosition + 0.05;\n if (isRvfcSupported(adVideoElement) && timeAdvancing && isRvfcReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n if (decodedFrames === 0 && timeAdvancing && isFrameCounterReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n }\n }\n if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {\n noteAdProgress();\n return;\n }\n if (adVideoElement.paused) {\n noteAdProgress();\n return;\n }\n if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {\n handleAdStall();\n }\n }, STALL_CHECK_INTERVAL_MS);\n }\n function releaseAdDecoder() {\n prepareVideoElementForNewSource();\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }\n function handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode:\", error);\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n emit(\"content_resume\");\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n emit(\"ad_error\");\n }\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n contentVideo[AD_CONTAINER_PROP] = adContainerEl;\n },\n async requestAds(vastTagUrl) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n try {\n let ads = [];\n if (preloadedAds.has(vastTagUrl)) {\n const preloaded = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n if (preloaded) {\n ads = [preloaded];\n }\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ads = await fetchAndParsePod(vastTagUrl);\n }\n if (!ads.length) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n podAds = ads;\n podIndex = 0;\n currentAd = ads[0];\n currentAdMediaFile = void 0;\n console.log(\n `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n );\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n }\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n }\n setupAdEventListeners();\n resetQuartileTracking(true);\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n emit(\"content_pause\");\n loadCurrentAdMedia();\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n );\n releaseAdDecoder();\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode on stop:\", error);\n });\n }\n }\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n clearStallWatchdog();\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n teardownAdEventListeners();\n releaseAdDecoder();\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n on(event, listener) {\n if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n listeners.get(event).add(listener);\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted, volume) {\n const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n if (adVideoElement && adPlaying) {\n const clamped = Math.max(0, Math.min(1, volume));\n adVideoElement.volume = clamped;\n adVideoElement.muted = clamped === 0;\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl && !adPlaying) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n getLoadedAdDuration() {\n return currentAd?.duration;\n },\n getLoadedAdId() {\n return currentAd?.id;\n },\n getPodAdCount() {\n return podAds.length;\n },\n getPodTotalDurationMs() {\n return podAds.reduce(\n (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n 0\n );\n }\n };\n}\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\nfunction isTrackingIngestEnabled() {\n return trackingIngestConfig.enabled === true;\n}\nfunction normalizeIngestBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildTrackingIngestUrl(channel) {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\nasync function ingestPlayerTracking(licenseKey, channel, body) {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`\n },\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const realDeviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n let deviceId = realDeviceId;\n let deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType();\n const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n let limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n if (!deviceId && isCtv) {\n const dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (dpid) {\n deviceId = dpid;\n deviceIdType = \"dpid\";\n limitAdTracking = platformLat ?? readStoredLimitAdTracking() ?? false;\n }\n }\n if (isCtv) {\n return {\n isCtv: true,\n sessionId: getOrCreateCtvSessionId(),\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint: 5\n };\n }\n return {\n isCtv: false,\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n}\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId() {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return void 0;\n }\n return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\nfunction getOrCreateCtvSessionId() {\n const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n return existing;\n }\n const sessionId = createUuid();\n writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n return sessionId;\n}\nfunction readPersistentId(storageKey) {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {\n }\n writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n if (typeof document === \"undefined\") {\n return void 0;\n }\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n }\n }\n } catch {\n }\n return void 0;\n}\nfunction writeCookie(name, value) {\n if (typeof document === \"undefined\") {\n return;\n }\n try {\n document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n } catch {\n }\n}\nfunction createUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = seed * 1103515245 + 12345 & 2147483647;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n }\n }\n bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n }\n return 0;\n}\nfunction readPlatformNativeDeviceId() {\n if (typeof window === \"undefined\") return {};\n try {\n const adinfo = window.webapis?.adinfo;\n if (adinfo) {\n const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n };\n }\n }\n } catch {\n }\n try {\n const webOSDev = window.webOSDev;\n if (webOSDev) {\n const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {\n }\n try {\n const roku = window.Roku;\n if (roku) {\n const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {\n }\n return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n const t = value.trim();\n return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n if (typeof window === \"undefined\") {\n return {};\n }\n const candidates = [\n window.__STORMCLOUD_CTV_AD_INFO__,\n window.__STORMCLOUD_CTV__,\n window.stormcloudCtv,\n window.AiryTV,\n window.Android,\n window.webOS,\n window.tizen,\n window.amazon\n ].filter(Boolean);\n for (const source of candidates) {\n const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n const deviceId = readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\"\n ]) || void 0;\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n const deviceIdType = readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\"\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\"\n ]);\n return {\n ...contentUrl ? { contentUrl } : {},\n ...appId ? { appId } : {},\n ...appName ? { appName } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n }\n return {};\n}\nfunction readBridgeValue(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readStoredDeviceId() {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return void 0;\n}\nfunction readStoredString(key) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n try {\n const value = window.localStorage?.getItem(key);\n return value || void 0;\n } catch {\n return void 0;\n }\n}\nfunction readStoredLimitAdTracking() {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n );\n}\nfunction normalizeBoolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n const context = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== void 0) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function sha256Hex(input) {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n const nativeDeviceId = resolveNativeDeviceId();\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n const playerId = await getBrowserID(clientInfo);\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData]\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n return;\n }\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n if (tagRdidValid) {\n if (isMacroPlaceholder2(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder2(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n const toDelete = [];\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.replace(/^\\s+/, \"\");\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\nfunction normalizeVastTagUrl(raw) {\n if (!raw) return raw;\n try {\n const url = new URL(raw);\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.replace(/\\s+$/, \"\"), ...orphanFragments].filter(Boolean).join(\" & \");\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n const params = url.searchParams;\n removeBrokenAppNameOrphans(params);\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n }\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n params.delete(\"ppos\");\n params.delete(\"lip\");\n if (ctx.podMinDurationMs != null) {\n params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n }\n if (ctx.podMaxDurationMs != null) {\n params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n }\n if (ctx.podMaxAds != null) {\n params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n }\n if (!ctx.isCtv && ctx.pageUrl) {\n params.set(\"url\", ctx.pageUrl);\n params.set(\"description_url\", ctx.pageUrl);\n }\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n applyDeviceIdentityParams(params, ctx);\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n if (ctx.programTitle) {\n params.set(\"ct_ti\", ctx.programTitle);\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder2(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n removeBrokenAppNameOrphans(params);\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const dStr = match[1];\n const d = parseFloat(dStr);\n return Number.isNaN(d) ? void 0 : d;\n }\n return void 0;\n}\nfunction parseCueOutCont(value) {\n const res = {};\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n if (slashMatch && slashMatch[1] && slashMatch[2]) {\n const elapsed = parseFloat(slashMatch[1]);\n const duration = parseFloat(slashMatch[2]);\n if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n }\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return void 0;\n}\nfunction parseAttributeList(value) {\n const attrs = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match;\n while ((match = regex.exec(value)) !== null) {\n const key = match[1] ?? \"\";\n let rawVal = match[3] ?? match[4] ?? \"\";\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n}\nfunction toNumber(val) {\n if (val == null) return void 0;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n const raw = marker.raw;\n if (!raw) return false;\n if (raw.tag) {\n const tag = String(raw.tag);\n return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n }\n if (raw.id3) return false;\n if (raw.splice_command_type) return false;\n return false;\n}\nfunction decodeId3ValueToText(value) {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++)\n out += String.fromCharCode(value[i]);\n return out;\n } catch {\n return void 0;\n }\n}\nfunction getFragmentStartSeconds(frag) {\n const candidates = [frag?.start, frag?.startPTS];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return void 0;\n}\nfunction parseScte35FromId3(tag) {\n const text = decodeId3ValueToText(tag.value);\n if (!text) return void 0;\n const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = parseCueOutDuration(arg);\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...dur !== void 0 ? { durationSeconds: dur } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = parseCueOutCont(arg);\n const marker = {\n type: \"progress\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n if (daterangeMatch) {\n const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n if (hasScteIn) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n }\n if (/SCTE35-OUT/i.test(text)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (/SCTE35-IN/i.test(text)) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (tag.value instanceof Uint8Array) {\n const bin = parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n if (payload instanceof Uint8Array) {\n return payload;\n }\n if (payload instanceof ArrayBuffer) {\n return new Uint8Array(payload);\n }\n if (ArrayBuffer.isView(payload)) {\n const view = payload;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n return void 0;\n}\nfunction detectTsPacketFormat(data) {\n const packetSizes = [188, 192, 204];\n for (const packetSize of packetSizes) {\n const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n for (let offset = 0; offset < packetSize; offset++) {\n let matchedPackets = 0;\n for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n if (data[packetStart + tsPayloadOffset] !== 71) {\n break;\n }\n matchedPackets++;\n }\n if (matchedPackets >= 2) {\n return { offset, packetSize, tsPayloadOffset };\n }\n }\n }\n return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n if (!payloadUnitStart) {\n return void 0;\n }\n const pointerField = payload[0];\n if (pointerField == null) {\n return void 0;\n }\n const sectionStart = 1 + pointerField;\n return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 8 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n if (programNumber !== 0) {\n pmtPids.add(pid);\n }\n }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n let offset = start;\n while (offset + 2 <= end) {\n const tag = data[offset] ?? 0;\n const length = data[offset + 1] ?? 0;\n const descriptorStart = offset + 2;\n const descriptorEnd = descriptorStart + length;\n if (descriptorEnd > end) {\n return false;\n }\n const registration = length >= 4 ? String.fromCharCode(\n data[descriptorStart] ?? 0,\n data[descriptorStart + 1] ?? 0,\n data[descriptorStart + 2] ?? 0,\n data[descriptorStart + 3] ?? 0\n ) : \"\";\n if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n return true;\n }\n offset = descriptorEnd;\n }\n return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 12 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 2) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n let offset = sectionStart + 12 + programInfoLength;\n while (offset + 5 <= sectionEnd - 4) {\n const streamType = payload[offset] ?? 0;\n const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n const descriptorStart = offset + 5;\n const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n tsScte35Pids.add(elementaryPid);\n }\n offset = descriptorStart + esInfoLength;\n }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n let checksum = 0;\n for (let i = 0; i < section.length; i++) {\n checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n }\n const key = `${section.length}:${checksum}`;\n if (processedSections.has(key)) {\n return true;\n }\n processedSections.add(key);\n if (processedSections.size > 200) {\n const firstKey = processedSections.values().next().value;\n if (firstKey) {\n processedSections.delete(firstKey);\n }\n }\n return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n return;\n }\n const marker = parseScte35Binary(section);\n if (!marker) {\n return;\n }\n marker.raw = {\n ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n source: \"ts-packet\"\n };\n markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n const assembler = assemblers.get(pid);\n if (!assembler) {\n return;\n }\n for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n assembler.bytes.push(bytes[i] ?? 0);\n }\n if (assembler.bytes.length >= assembler.expectedLength) {\n assemblers.delete(pid);\n addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n if (payload.length === 0) {\n return;\n }\n let offset = 0;\n if (payloadUnitStart) {\n const pointerField = payload[0] ?? 0;\n const previousAssembler = assemblers.get(pid);\n if (previousAssembler && pointerField > 0) {\n appendScte35Bytes(\n pid,\n payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n assemblers,\n markers,\n processedSections\n );\n }\n assemblers.delete(pid);\n offset = 1 + pointerField;\n } else {\n appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n return;\n }\n while (offset + 3 <= payload.length) {\n const tableId = payload[offset];\n if (tableId == null || tableId === 255) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, offset);\n const totalLength = 3 + sectionLength;\n if (sectionLength <= 0 || totalLength <= 3) {\n return;\n }\n if (offset + totalLength <= payload.length) {\n addScte35SectionMarker(\n payload.subarray(offset, offset + totalLength),\n markers,\n processedSections\n );\n offset += totalLength;\n } else {\n assemblers.set(pid, {\n bytes: Array.from(payload.subarray(offset)),\n expectedLength: totalLength\n });\n return;\n }\n }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n const packetInfo = detectTsPacketFormat(data);\n if (!packetInfo) {\n return [];\n }\n const markers = [];\n const sectionAssemblers = /* @__PURE__ */ new Map();\n for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n const tsStart = packetStart + packetInfo.tsPayloadOffset;\n if (data[tsStart] !== 71) {\n continue;\n }\n const secondByte = data[tsStart + 1];\n const thirdByte = data[tsStart + 2];\n const fourthByte = data[tsStart + 3];\n if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n continue;\n }\n const payloadUnitStart = (secondByte & 64) !== 0;\n const pid = (secondByte & 31) << 8 | thirdByte;\n const adaptationFieldControl = fourthByte >> 4 & 3;\n const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n if (!hasPayload) {\n continue;\n }\n let payloadStart = tsStart + 4;\n if (adaptationFieldControl === 3) {\n const adaptationLength = data[payloadStart];\n if (adaptationLength == null) {\n continue;\n }\n payloadStart += 1 + adaptationLength;\n }\n const payloadEnd = Math.min(tsStart + 188, data.length);\n if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n continue;\n }\n const payload = data.subarray(payloadStart, payloadEnd);\n if (pid === 0) {\n parsePatSection(payload, payloadUnitStart, pmtPids);\n } else if (pmtPids.has(pid)) {\n parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n } else if (tsScte35Pids.has(pid)) {\n collectScte35SectionsFromPayload(\n pid,\n payload,\n payloadUnitStart,\n sectionAssemblers,\n markers,\n processedSections\n );\n }\n }\n return markers;\n}\nvar BitReader = class {\n constructor(buf) {\n this.buf = buf;\n this.bytePos = 0;\n this.bitPos = 0;\n }\n readBits(numBits) {\n let result = 0;\n while (numBits > 0) {\n if (this.bytePos >= this.buf.length) return result;\n const remainingInByte = 8 - this.bitPos;\n const toRead = Math.min(numBits, remainingInByte);\n const currentByte = this.buf[this.bytePos];\n const shift = remainingInByte - toRead;\n const mask = (1 << toRead) - 1 & 255;\n const bits = currentByte >> shift & mask;\n result = result << toRead | bits;\n this.bitPos += toRead;\n if (this.bitPos >= 8) {\n this.bitPos = 0;\n this.bytePos += 1;\n }\n numBits -= toRead;\n }\n return result >>> 0;\n }\n skipBits(n) {\n this.readBits(n);\n }\n get bytePosition() {\n return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (!timeSpecifiedFlag) {\n r.readBits(7);\n return void 0;\n }\n r.readBits(6);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n switch (segmentationTypeId) {\n case 16:\n case 34:\n case 48:\n case 50:\n case 52:\n case 54:\n return \"start\";\n case 17:\n case 35:\n case 49:\n case 51:\n case 53:\n case 55:\n return \"end\";\n default:\n return void 0;\n }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n if (descriptor.length < 11) {\n return void 0;\n }\n const identifier = String.fromCharCode(\n descriptor[0] ?? 0,\n descriptor[1] ?? 0,\n descriptor[2] ?? 0,\n descriptor[3] ?? 0\n );\n if (identifier !== \"CUEI\") {\n return void 0;\n }\n const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n if (cancelIndicator) {\n return void 0;\n }\n const flags = descriptor[9] ?? 0;\n const programSegmentationFlag = (flags & 128) !== 0;\n const segmentationDurationFlag = (flags & 64) !== 0;\n let offset = 10;\n if (!programSegmentationFlag) {\n const componentCount = descriptor[offset] ?? 0;\n offset += 1 + componentCount * 6;\n if (offset > descriptor.length) {\n return void 0;\n }\n }\n let durationSeconds = void 0;\n if (segmentationDurationFlag) {\n if (offset + 5 > descriptor.length) {\n return void 0;\n }\n const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n durationSeconds = durationTicks / 9e4;\n offset += 5;\n }\n if (offset + 2 > descriptor.length) {\n return void 0;\n }\n offset += 1;\n const segmentationUpidLength = descriptor[offset] ?? 0;\n offset += 1 + segmentationUpidLength;\n if (offset >= descriptor.length) {\n return void 0;\n }\n const segmentationTypeId = descriptor[offset] ?? 0;\n const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n if (!markerType) {\n return void 0;\n }\n return {\n type: markerType,\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n segmentationEventId\n };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n if (offset + 2 > data.length) {\n return void 0;\n }\n const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n let descriptorOffset = offset + 2;\n const descriptorEnd = Math.min(\n data.length,\n descriptorOffset + descriptorLoopLength\n );\n while (descriptorOffset + 2 <= descriptorEnd) {\n const descriptorTag = data[descriptorOffset] ?? 0;\n const descriptorLength = data[descriptorOffset + 1] ?? 0;\n const descriptorDataStart = descriptorOffset + 2;\n const descriptorDataEnd = descriptorDataStart + descriptorLength;\n if (descriptorDataEnd > descriptorEnd) {\n return void 0;\n }\n if (descriptorTag === 2) {\n const descriptorMarker = parseScte35SegmentationDescriptor(\n data.subarray(descriptorDataStart, descriptorDataEnd)\n );\n if (descriptorMarker) {\n return descriptorMarker;\n }\n }\n descriptorOffset = descriptorDataEnd;\n }\n return void 0;\n}\nfunction parseScte35Binary(data) {\n const r = new BitReader(data);\n const tableId = r.readBits(8);\n if (tableId !== 252) return void 0;\n r.readBits(1);\n r.readBits(1);\n r.readBits(2);\n const sectionLength = r.readBits(12);\n if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n return void 0;\n }\n r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n let markerType;\n let durationSeconds = void 0;\n let ptsSeconds = void 0;\n let spliceEventId = void 0;\n const commandBodyStart = r.bytePosition;\n if (spliceCommandType === 5) {\n spliceEventId = r.readBits(32);\n const cancel = r.readBits(1) === 1;\n r.readBits(7);\n if (cancel) return void 0;\n const outOfNetwork = r.readBits(1) === 1;\n const programSpliceFlag = r.readBits(1) === 1;\n const durationFlag = r.readBits(1) === 1;\n const spliceImmediateFlag = r.readBits(1) === 1;\n r.readBits(4);\n markerType = outOfNetwork ? \"start\" : \"end\";\n if (programSpliceFlag && !spliceImmediateFlag) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else if (!programSpliceFlag) {\n const componentCount = r.readBits(8);\n for (let i = 0; i < componentCount; i++) {\n r.readBits(8);\n if (!spliceImmediateFlag) {\n const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n if (ptsSeconds === void 0) {\n ptsSeconds = componentPtsSeconds;\n }\n }\n }\n }\n if (durationFlag) {\n r.readBits(6);\n r.readBits(1);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const durationTicks = high * 4294967296 + low;\n durationSeconds = durationTicks / 9e4;\n }\n r.readBits(16);\n r.readBits(8);\n r.readBits(8);\n } else if (spliceCommandType === 6) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else {\n return void 0;\n }\n const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n const descriptorMarker = parseScte35SegmentationDescriptors(\n data,\n expectedDescriptorOffset\n );\n if (descriptorMarker) {\n markerType = descriptorMarker.type;\n if (durationSeconds === void 0) {\n durationSeconds = descriptorMarker.durationSeconds;\n }\n }\n if (!markerType) {\n return void 0;\n }\n const marker = {\n type: markerType,\n ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: {\n splice_command_type: spliceCommandType,\n ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n }\n };\n return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n constructor(debug, callbacks) {\n this.pendingScte35Cues = /* @__PURE__ */ new Map();\n this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n this.recentScte35CueLimit = 200;\n this.tsScte35Pids = /* @__PURE__ */ new Set();\n this.pmtPids = /* @__PURE__ */ new Set();\n this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n this.debug = debug;\n this.callbacks = callbacks;\n }\n get pendingScte35CueKey() {\n return this.pendingScte35CueKeyValue;\n }\n set pendingScte35CueKey(value) {\n this.pendingScte35CueKeyValue = value;\n }\n get activeScte35BreakKey() {\n return this.activeScte35BreakKeyValue;\n }\n set activeScte35BreakKey(value) {\n this.activeScte35BreakKeyValue = value;\n }\n get scheduledScte35BreakKey() {\n return this.scheduledScte35BreakKeyValue;\n }\n set scheduledScte35BreakKey(value) {\n this.scheduledScte35BreakKeyValue = value;\n }\n createScte35CueContext(source, readiness, frag) {\n const context = { source, readiness };\n if (typeof frag?.sn === \"number\") {\n context.fragmentSn = frag.sn;\n }\n const fragmentStartSec = getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n return context;\n }\n onScte35Cue(marker, context) {\n const cue = this.createScte35Cue(marker, context);\n const pendingKey = this.getPendingScte35CueKey(cue);\n if (context.readiness === \"early\") {\n this.pendingScte35Cues.set(pendingKey, cue);\n this.trimRecentScte35CueMaps();\n if (marker.type === \"start\") {\n this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n }\n return;\n }\n if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n key: cue.key,\n activeScte35BreakKey: this.activeScte35BreakKeyValue,\n inAdBreak: this.callbacks.isInAdBreak(),\n source: cue.source\n });\n }\n return;\n }\n if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n key: cue.key,\n source: cue.source\n });\n }\n return;\n }\n this.pendingScte35Cues.delete(pendingKey);\n this.markScte35CueHandled(cue);\n this.callbacks.onPlaybackCue(marker, cue.key);\n }\n activatePendingScte35CuesForFragment(frag) {\n const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n if (fragmentSn === void 0) {\n return;\n }\n const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n ([, cue]) => cue.fragmentSn === fragmentSn\n );\n matchingCues.forEach(([pendingKey, cue]) => {\n this.pendingScte35Cues.delete(pendingKey);\n const context = {\n source: cue.source,\n readiness: \"playback\"\n };\n context.fragmentSn = fragmentSn;\n const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n this.onScte35Cue(cue.marker, context);\n });\n }\n createScte35Cue(marker, context) {\n const cue = {\n marker,\n source: context.source,\n readiness: context.readiness,\n key: this.getScte35CueKey(marker, context)\n };\n if (context.fragmentSn !== void 0) {\n cue.fragmentSn = context.fragmentSn;\n }\n if (context.fragmentStartSeconds !== void 0) {\n cue.fragmentStartSeconds = context.fragmentStartSeconds;\n }\n return cue;\n }\n getScte35CueKey(marker, context) {\n const raw = this.getScte35MarkerRaw(marker);\n const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n if (spliceEventId) {\n return `splice:${spliceEventId}`;\n }\n const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n if (segmentationEventId) {\n return `segmentation:${segmentationEventId}`;\n }\n const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n if (daterangeId) {\n return `daterange:${daterangeId}`;\n }\n const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n if (scteValue) {\n return `daterange-scte:${scteValue}`;\n }\n if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n }\n if (context.fragmentSn !== void 0) {\n return `fragment:${context.fragmentSn}`;\n }\n return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n }\n getPendingScte35CueKey(cue) {\n return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n }\n getScte35MarkerRaw(marker) {\n return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n }\n toIdentityString(value) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return void 0;\n }\n isStrongScte35CueKey(key) {\n return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n }\n hasRecentlyHandledScte35Cue(cue) {\n if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n return true;\n }\n const recentKey = `${cue.marker.type}:${cue.key}`;\n return this.recentScte35CueKeys.has(recentKey);\n }\n markScte35CueHandled(cue) {\n this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n this.trimRecentScte35CueMaps();\n }\n trimRecentScte35CueMaps() {\n while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n const firstKey = this.recentScte35CueKeys.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.recentScte35CueKeys.delete(firstKey);\n }\n while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n const firstKey = this.pendingScte35Cues.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.pendingScte35Cues.delete(firstKey);\n }\n }\n shouldAcceptScte35EndCue(cue) {\n if (!this.callbacks.isInAdBreak()) {\n return false;\n }\n if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n return false;\n }\n return true;\n }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n constructor(config, video) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n this.streamCorrelator = generateCorrelator();\n this.viewCorrelator = generateCorrelator();\n this.consentSignals = {};\n this.podCounter = 0;\n this.podAssignedByPrefetch = false;\n this.lastHeartbeatTime = 0;\n this.defaultPodMaxAds = 6;\n this.defaultPodMaxDurationMs = 12e4;\n this.config = config;\n this.video = video;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n isVmapEnabled() {\n return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n }\n async fetchAdConfiguration() {\n if (this.isVmapEnabled()) {\n await this.fetchAndParseVmap(this.config.vmapUrl);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n }\n return;\n }\n const vastMode = this.config.vastMode || \"default\";\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n }\n if (vastMode === \"adstorm\") {\n if (!this.config.licenseKey) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n );\n }\n return;\n }\n const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n this.apiVastTagUrl = vastEndpoint;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n vastEndpoint\n );\n }\n return;\n }\n if (this.config.vastTagUrl) {\n this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n return;\n }\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n apiUrl\n );\n }\n const headers = {};\n if (this.config.licenseKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n }\n const response = await fetch(apiUrl, { headers });\n if (!response.ok) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n );\n }\n return;\n }\n const data = await response.json();\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n let decodedPayload = imaPayload;\n try {\n decodedPayload = decodeURIComponent(imaPayload);\n } catch {\n console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n }\n console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n } else {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n );\n }\n }\n const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n if (numberAds != null && numberAds > 0) {\n this.apiNumberAds = numberAds;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n this.apiNumberAds\n );\n }\n }\n }\n async fetchAndParseVmap(vmapUrl) {\n if (!vmapUrl.trim()) {\n return;\n }\n try {\n const response = await fetch(vmapUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch VMAP (${response.status})`);\n }\n const vmapXml = await response.text();\n this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n vmapUrl\n );\n }\n } catch (error) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n }\n }\n }\n parseVmapToBreaks(vmapXml) {\n if (typeof DOMParser === \"undefined\") {\n return [];\n }\n const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n }\n return [];\n }\n const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(\n doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n );\n }\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n (el) => el.localName === \"AdBreak\"\n );\n }\n const parsed = [];\n adBreakNodes.forEach((node, index) => {\n const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n if (startTimeMs == null) {\n return;\n }\n let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n if (!adTagNode) {\n adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n }\n const adTagUrl = (adTagNode?.textContent || \"\").trim();\n if (!adTagUrl) {\n return;\n }\n const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n parsed.push({\n id: breakId,\n startTimeMs,\n vastTagUrl: adTagUrl\n });\n });\n parsed.sort((a, b) => {\n const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n return aStart - bStart;\n });\n return parsed;\n }\n parseVmapTimeOffsetToMs(timeOffset) {\n if (!timeOffset) {\n return void 0;\n }\n const normalized = timeOffset.trim().toLowerCase();\n if (normalized === \"start\") {\n return 0;\n }\n if (normalized === \"end\") {\n return -1;\n }\n const hms = timeOffset.match(\n /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n );\n if (hms) {\n const [, hh, mm, ss, ms = \"0\"] = hms;\n const hours = Number(hh);\n const minutes = Number(mm);\n const seconds = Number(ss);\n const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n }\n const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percent) {\n const ratio = Number(percent[1]) / 100;\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3 * ratio);\n }\n return void 0;\n }\n return void 0;\n }\n getAdBreakKey(adBreak) {\n if (adBreak.id) {\n return adBreak.id;\n }\n return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n }\n resolveBreakStartMs(adBreak) {\n if (adBreak.startTimeMs >= 0) {\n return adBreak.startTimeMs;\n }\n if (adBreak.startTimeMs === -1) {\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3);\n }\n }\n return void 0;\n }\n findCurrentOrNextBreak(nowMs) {\n const schedule = this.vmapBreaks;\n let candidate;\n const tol = this.config.driftToleranceMs ?? 1e3;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n candidate = b;\n }\n }\n return candidate;\n }\n findBreakForTime(nowMs) {\n const schedule = this.vmapBreaks;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (b.durationMs) {\n const end = breakStartMs + b.durationMs;\n if (nowMs >= breakStartMs && nowMs < end) {\n return b;\n }\n continue;\n }\n if (nowMs >= breakStartMs) {\n return b;\n }\n }\n return void 0;\n }\n selectVastTagsForBreak(b) {\n if (!b || !b.vastTagUrl) return void 0;\n if (b.vastTagUrl.includes(\",\")) {\n return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n }\n return [b.vastTagUrl];\n }\n beginNewAdPod() {\n this.podCounter++;\n }\n resolvePodParams(breakDurationMs) {\n const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0 ? this.config.podMaxDurationMs : this.defaultPodMaxDurationMs;\n const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n return { maxAds, minDurationMs, maxDurationMs };\n }\n getPalDescriptionUrl() {\n if (!this.apiVastTagUrl) return void 0;\n try {\n const params = new URL(this.apiVastTagUrl).searchParams;\n return params.get(\"description_url\") || params.get(\"url\") || void 0;\n } catch {\n return void 0;\n }\n }\n generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\n const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n const urlWithMacros = applyVastMacros(baseUrl, {\n correlator: this.viewCorrelator,\n streamCorrelator: this.streamCorrelator,\n pod: this.podCounter > 0 ? this.podCounter : void 0,\n podMaxAds: podParams.maxAds,\n podMinDurationMs: podParams.minDurationMs,\n podMaxDurationMs: podParams.maxDurationMs,\n isCtv: envSignals.isCtv,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? toDevSafeUrl(window.location.href) : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n sessionId: envSignals.sessionId,\n deviceId: envSignals.deviceId,\n deviceIdType: envSignals.deviceIdType,\n limitAdTracking: envSignals.limitAdTracking,\n deviceTypeHint: envSignals.deviceTypeHint,\n adTest: this.config.adTest,\n ...this.config.programTitle ? { programTitle: this.config.programTitle } : {},\n consent: this.consentSignals\n });\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n finalUrl\n );\n return finalUrl;\n }\n // --- Tracking ---\n initializeTracking() {\n sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(() => {\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n }).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n });\n }\n sendHeartbeatIfNeeded() {\n const now = Date.now();\n if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n this.lastHeartbeatTime = now;\n sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n destroyTracking() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = void 0;\n }\n }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n constructor(config, video, callbacks) {\n this.adRequestWatchdogToken = null;\n this.adFailsafeToken = null;\n this.ptsDriftEmaMs = 0;\n this.adBreakPlayedDurationMs = 0;\n this.adBreakEpoch = 0;\n this.adRequestTokenCounter = 0;\n this.activeAdRequestToken = null;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.totalAdRequestsInBreak = 0;\n this.maxTotalAdRequestsPerBreak = 10;\n this.lastAdRequestTime = 0;\n this.consecutiveFailures = 0;\n this.maxConsecutiveFailures = 5;\n this.minAdRequestIntervalMs = 3e3;\n this.backoffBaseMs = 1e3;\n this.maxBackoffMs = 15e3;\n this.defaultMinRemainingMsToStartAd = 4e3;\n this.failedVastUrls = /* @__PURE__ */ new Set();\n this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n this.temporaryFailureCooldownMs = 3e4;\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillThreshold = 3;\n this.globalNoFillCooldownUntil = 0;\n this.globalNoFillBackoffBaseMs = 5e3;\n this.globalNoFillBackoffMaxMs = 6e4;\n this.globalLastGamRequestTime = 0;\n this.globalMinGamIntervalMs = 3e3;\n this.config = config;\n this.video = video;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n // --- Ad stop timer ---\n scheduleAdStopCountdown(remainingMs) {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.ensureAdStoppedByTimer();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.ensureAdStoppedByTimer();\n }, ms);\n }\n clearAdStopTimer() {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = void 0;\n }\n }\n ensureAdStoppedByTimer() {\n this.adStopTimerId = void 0;\n this.callbacks.onAdStopTimerFired();\n }\n // --- Ad start timer ---\n scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n }, ms);\n }\n clearAdStartTimer() {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = void 0;\n }\n }\n // --- PTS drift ---\n updatePtsDrift(ptsSecondsSample) {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n resolveScteBreakStartWallClockMs(marker) {\n const nowWallClockMs = Date.now();\n if (typeof marker.ptsSeconds !== \"number\") {\n return nowWallClockMs;\n }\n const nowMs = this.video.currentTime * 1e3;\n const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n if (!Number.isFinite(deltaMs)) {\n return nowWallClockMs;\n }\n return nowWallClockMs + Math.floor(deltaMs);\n }\n // --- Duration boundary ---\n setAdBreakDurationBoundary(durationMs) {\n this.expectedAdBreakDurationMs = durationMs;\n if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n } else {\n this.scteAdBreakEndWallClockMs = void 0;\n }\n }\n scheduleAdStopAtBreakBoundary() {\n if (this.expectedAdBreakDurationMs == null) {\n return;\n }\n this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n }\n // --- Duration budget ---\n getWallClockRemainingAdMs() {\n const endWallClockMs = this.getAdBreakEndWallClockMs();\n if (endWallClockMs != null) {\n return Math.max(0, endWallClockMs - Date.now());\n }\n return 0;\n }\n getAdBreakEndWallClockMs() {\n if (this.scteAdBreakEndWallClockMs != null) {\n return this.scteAdBreakEndWallClockMs;\n }\n if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n return void 0;\n }\n return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n }\n getDurationBudgetRemainingMs() {\n if (this.expectedAdBreakDurationMs == null) {\n return 0;\n }\n return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n }\n getLoadedAdDurationMs(adController) {\n const durationSec = adController.getLoadedAdDuration?.();\n if (durationSec == null || durationSec <= 0) {\n return 0;\n }\n return Math.round(durationSec * 1e3);\n }\n adFitsRemainingBudget(durationMs) {\n if (durationMs <= 0) {\n return true;\n }\n return durationMs <= this.getDurationBudgetRemainingMs();\n }\n logAdDurationDecision(accepted, durationMs, adController) {\n if (!this.debug) {\n return;\n }\n const remainingBudget = this.getDurationBudgetRemainingMs();\n const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n if (accepted) {\n console.log(\n `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n );\n } else {\n console.log(\n `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n );\n }\n }\n recordPlayedAdDuration(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n if (durationMs <= 0) {\n return;\n }\n this.adBreakPlayedDurationMs += durationMs;\n if (this.debug) {\n console.log(\n `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n );\n }\n }\n ensureLoadedAdFitsBudget(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n const fits = this.adFitsRemainingBudget(durationMs);\n this.logAdDurationDecision(fits, durationMs, adController);\n return fits;\n }\n rejectLoadedAdForDuration(adController) {\n try {\n adController.destroy();\n } catch {\n }\n }\n markAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n this.totalAdRequestsInBreak++;\n this.lastAdRequestTime = Date.now();\n }\n notePodAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n }\n getRemainingAdMs() {\n const wallClockRemaining = this.getWallClockRemainingAdMs();\n const budgetRemaining = this.getDurationBudgetRemainingMs();\n if (this.expectedAdBreakDurationMs == null) {\n return wallClockRemaining;\n }\n return Math.min(wallClockRemaining, budgetRemaining);\n }\n getMinRemainingMsToStartAd() {\n const configured = this.config.minRemainingMsToStartAd;\n if (typeof configured === \"number\" && configured >= 0) {\n return configured;\n }\n return this.defaultMinRemainingMsToStartAd;\n }\n hasTimeToStartAnotherAd() {\n const minRemaining = this.getMinRemainingMsToStartAd();\n return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n }\n // --- Circuit breaker ---\n isTemporaryAdError(error) {\n const message = error?.message?.toLowerCase() || \"\";\n if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n return true;\n }\n if (message.includes(\"timeout\")) {\n return true;\n }\n if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n return true;\n }\n if (message.includes(\"ad playback error\")) {\n return true;\n }\n return false;\n }\n isUrlInCooldown(vastTagUrl) {\n const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n if (failureTime == null) {\n return false;\n }\n const elapsed = Date.now() - failureTime;\n if (elapsed >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(vastTagUrl);\n return false;\n }\n return true;\n }\n cleanupTemporaryFailures() {\n const now = Date.now();\n for (const [url, timestamp] of this.temporaryFailureUrls) {\n if (now - timestamp >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(url);\n }\n }\n }\n isGamInCooldown() {\n return Date.now() < this.globalNoFillCooldownUntil;\n }\n recordGamNoFill() {\n this.globalConsecutiveNoFills++;\n if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n const backoff = Math.min(\n this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n this.globalNoFillBackoffMaxMs\n );\n this.globalNoFillCooldownUntil = Date.now() + backoff;\n if (this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n );\n }\n }\n }\n resetGamNoFillCounter() {\n if (this.globalConsecutiveNoFills > 0 && this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n );\n }\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillCooldownUntil = 0;\n }\n async enforceGlobalRateLimit() {\n const now = Date.now();\n const elapsed = now - this.globalLastGamRequestTime;\n if (elapsed < this.globalMinGamIntervalMs) {\n const waitMs = this.globalMinGamIntervalMs - elapsed;\n if (this.debug) {\n console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n this.globalLastGamRequestTime = Date.now();\n }\n // --- Watchdog ---\n startAdRequestWatchdog(token) {\n this.clearAdRequestWatchdog();\n const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adRequestWatchdogToken = token;\n this.adRequestWatchdogId = window.setTimeout(() => {\n if (this.adRequestWatchdogToken !== token) {\n return;\n }\n this.adRequestWatchdogId = void 0;\n this.adRequestWatchdogToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n this.callbacks.onWatchdogTimeout();\n }, timeoutMs);\n this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n }\n clearAdRequestWatchdog() {\n if (this.adRequestWatchdogId != null) {\n clearTimeout(this.adRequestWatchdogId);\n this.adRequestWatchdogId = void 0;\n }\n if (this.adRequestWatchdogToken != null) {\n this.logAdState(\"ad_request_watchdog_cleared\", {\n token: this.adRequestWatchdogToken\n });\n this.adRequestWatchdogToken = null;\n }\n }\n // --- Failsafe ---\n startAdFailsafeTimer(token) {\n this.clearAdFailsafeTimer();\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adFailsafeToken = token;\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.adFailsafeToken !== token) {\n return;\n }\n this.adFailsafeTimerId = void 0;\n this.adFailsafeToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_failsafe_triggered\", {\n token,\n failsafeMs,\n videoPaused: this.video.paused\n });\n this.callbacks.onFailsafeTimeout();\n }, failsafeMs);\n this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n }\n clearAdFailsafeTimer() {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n this.adFailsafeTimerId = void 0;\n }\n this.adFailsafeToken = null;\n }\n logAdState(event, extra = {}) {\n if (!this.debug) {\n return;\n }\n const { inAdBreak, showAds, adPlaying } = this.callbacks.getAdState();\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n showAds,\n adPlaying,\n inAdBreak,\n activeAdRequestToken: this.activeAdRequestToken,\n ...extra\n });\n }\n // --- Reset for ad break end ---\n resetForBreakEnd() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdRequestWatchdog();\n this.clearAdFailsafeTimer();\n this.activeAdRequestToken = null;\n this.expectedAdBreakDurationMs = void 0;\n this.currentAdBreakStartWallClockMs = void 0;\n this.scteAdBreakEndWallClockMs = void 0;\n this.adBreakPlayedDurationMs = 0;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.consecutiveFailures = 0;\n this.globalConsecutiveNoFills = 0;\n this.adBreakEpoch++;\n }\n destroy() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdFailsafeTimer();\n this.clearAdRequestWatchdog();\n }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n constructor(video, debug) {\n this.video = video;\n this.debug = debug;\n }\n ensureContainer() {\n if (this.container) {\n return;\n }\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.right = \"0\";\n el.style.bottom = \"0\";\n el.style.display = \"none\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"5\";\n el.style.backgroundColor = \"#000\";\n el.style.transition = \"opacity 0.3s ease-in-out\";\n el.style.opacity = \"0\";\n if (!this.video.parentElement) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n }\n return;\n }\n this.video.parentElement.appendChild(el);\n this.container = el;\n }\n show() {\n this.ensureContainer();\n if (!this.container) {\n return;\n }\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n }\n }\n const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n if (wasHidden) {\n this.container.style.transition = \"none\";\n } else {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n this.container.style.backgroundColor = \"#000\";\n this.container.style.display = \"flex\";\n this.container.offsetHeight;\n this.container.style.opacity = \"1\";\n this.container.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n }\n }\n hide() {\n if (!this.container) {\n return;\n }\n this.container.style.opacity = \"0\";\n setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.backgroundColor = \"#000\";\n }\n }, 300);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n }\n }\n destroy() {\n if (this.container) {\n if (this.container.parentElement) {\n this.container.parentElement.removeChild(this.container);\n }\n this.container = void 0;\n }\n }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n constructor(config, video, cueManager, timing, callbacks) {\n this.isLiveStream = false;\n this.nativeHlsMode = false;\n this.videoSrcProtection = null;\n this.reloadingLiveStream = false;\n this.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = false;\n this.latencyProfileApplied = false;\n this.config = config;\n this.video = video;\n this.cueManager = cueManager;\n this.timing = timing;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n shouldUseNativeHls(getStreamType) {\n const streamType = getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n async setupNativeHls() {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n if (this.debug) {\n const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\n \"[StormcloudVideoPlayer] Using native HLS playback:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n }\n );\n }\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n setupHls() {\n this.hls = new import_hls2.default({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: 1.1,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 1,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 5,\n startPosition: -1\n });\n this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false);\n await this.callbacks.onManifestParsed(this.isLiveStream);\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n this.latencyProfileApplied = false;\n this.detectedLowLatencyStream = void 0;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n this.reloadingLiveStream = false;\n });\n this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n this.applyStreamLatencyProfile(data?.details);\n if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n return;\n }\n const details = data?.details;\n if (!details || !details.fragments || details.fragments.length === 0) {\n return;\n }\n const fragmentsToScan = Math.min(5, details.fragments.length);\n for (let i = 0; i < fragmentsToScan; i++) {\n const frag = details.fragments[i];\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) continue;\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n if (hasScteOut) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value, earlyDetection: true }\n };\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n }\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n });\n return;\n }\n }\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n if (this.shouldAutoplayAfterBuffering) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n const id3Tags = (data?.samples || []).map((s) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n const frag = data?.frag;\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) {\n this.callbacks.activatePendingCuesForFragment(frag);\n return;\n }\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = parseCueOutCont(value);\n const marker = {\n type: \"progress\",\n ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { tag, value, attrs }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n }\n if (hasScteIn) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value, attrs } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n }\n }\n }\n this.callbacks.activatePendingCuesForFragment(frag);\n });\n this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.callbacks.onFatalDestroy();\n break;\n }\n }\n });\n this.hls.attachMedia(this.video);\n }\n isLowLatencyStream() {\n return this.detectedLowLatencyStream;\n }\n applyStreamLatencyProfile(details) {\n if (this.latencyProfileApplied || !this.hls) {\n return;\n }\n if (!details) {\n return;\n }\n if (details.live !== true) {\n this.latencyProfileApplied = true;\n this.detectedLowLatencyStream = false;\n return;\n }\n const isLowLatencyManifest = this.isLowLatencyManifest(details);\n const useLowLatency = isLowLatencyManifest && !!this.config.lowLatencyMode;\n this.detectedLowLatencyStream = useLowLatency;\n this.latencyProfileApplied = true;\n const cfg = this.hls.config;\n if (useLowLatency) {\n cfg.maxLiveSyncPlaybackRate = 1.5;\n cfg.maxBufferHole = 0.5;\n delete cfg.liveSyncDuration;\n } else {\n cfg.maxLiveSyncPlaybackRate = 1.1;\n cfg.maxBufferHole = 1;\n delete cfg.liveSyncDuration;\n cfg.liveSyncDurationCount = 3;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live latency profile: ${useLowLatency ? \"LL-HLS (low latency)\" : \"standard live (stability)\"}`,\n {\n isLowLatencyManifest,\n lowLatencyModeRequested: !!this.config.lowLatencyMode,\n canBlockReload: details.canBlockReload,\n partTarget: details.partTarget,\n partHoldBack: details.partHoldBack,\n partListLength: Array.isArray(details.partList) ? details.partList.length : 0,\n targetDuration: details.targetduration ?? details.targetDuration,\n maxLiveSyncPlaybackRate: cfg.maxLiveSyncPlaybackRate,\n maxBufferHole: cfg.maxBufferHole\n }\n );\n }\n }\n isLowLatencyManifest(details) {\n if (!details) {\n return false;\n }\n const hasParts = Array.isArray(details.partList) && details.partList.length > 0;\n const hasPartTarget = typeof details.partTarget === \"number\" && details.partTarget > 0;\n const hasPartHoldBack = typeof details.partHoldBack === \"number\" && details.partHoldBack > 0;\n const canBlockReload = details.canBlockReload === true;\n return hasParts || hasPartTarget || hasPartHoldBack || canBlockReload;\n }\n onId3Tag(tag) {\n if (typeof tag.ptsSeconds === \"number\") {\n this.timing.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = parseScte35FromId3(tag);\n if (marker) {\n this.callbacks.onScte35Cue(marker, {\n source: \"id3\",\n readiness: \"playback\"\n });\n }\n }\n processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n const payload = normalizeFragmentPayload(payloadData);\n if (!payload) {\n return;\n }\n const markers = parseScte35FromTsPackets(\n payload,\n this.cueManager.tsScte35Pids,\n this.cueManager.pmtPids,\n this.cueManager.processedTsScte35Sections\n );\n markers.forEach((marker) => {\n const context = {\n source: \"ts\",\n readiness: \"early\"\n };\n if (fragmentSn !== void 0) {\n context.fragmentSn = fragmentSn;\n }\n if (fragmentStartSeconds !== void 0) {\n context.fragmentStartSeconds = fragmentStartSeconds;\n }\n this.callbacks.onScte35Cue(marker, context);\n });\n }\n getLiveSyncPosition() {\n const pos = this.hls?.liveSyncPosition;\n return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n }\n restartLoadAt(position) {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.stopLoad();\n this.hls.startLoad(position);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to restart HLS load at live edge:\", error);\n }\n }\n }\n recoverMediaError() {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.recoverMediaError();\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] recoverMediaError() failed:\", error);\n }\n }\n }\n reloadLiveStream() {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \\u2192 reset video \\u2192 fresh setupHls)\"\n );\n }\n try {\n this.reloadingLiveStream = true;\n hls.stopLoad();\n hls.detachMedia();\n hls.destroy();\n this.hls = void 0;\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch (error) {\n console.warn(\"[StormcloudVideoPlayer] video.load() threw after src removal:\", error);\n }\n } catch (error) {\n this.reloadingLiveStream = false;\n this.hls = void 0;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to tear down during hard-reload:\", error);\n }\n return;\n }\n const recreateDelayMs = 600;\n window.setTimeout(() => {\n if (this.hls) {\n this.reloadingLiveStream = false;\n return;\n }\n try {\n this.setupHls();\n } catch (error) {\n this.reloadingLiveStream = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:\", error);\n }\n }\n }, recreateDelayMs);\n }\n destroy() {\n this.hls?.destroy();\n this.hls = void 0;\n }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n if (adPlayer.isAdPlaying()) {\n const newMutedState = !adPlayer.getOriginalMutedState();\n const restoreVolume = adPlayer.getOriginalVolume() || 1;\n adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n video.muted = !video.muted;\n adPlayer.updateOriginalMutedState(video.muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n }\n }\n}\nfunction toggleFullscreen(video, debug) {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container.requestFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document.exitFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n}\nfunction isMuted(video, adPlayer) {\n if (adPlayer.isAdPlaying()) {\n return adPlayer.getOriginalMutedState();\n }\n return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying && muted === video.muted) {\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n { muted }\n );\n }\n return;\n }\n video.muted = muted;\n if (adPlaying) {\n adPlayer.updateOriginalMutedState(muted, video.volume);\n adPlayer.setAdVolume(muted ? 0 : 1);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n muted\n });\n }\n return;\n }\n adPlayer.updateOriginalMutedState(muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n adPlayer.setAdVolume(clampedVolume);\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n volume: clampedVolume\n });\n }\n } else {\n video.volume = clampedVolume;\n video.muted = clampedVolume === 0;\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n }\n }\n}\nfunction getVolume(video, adPlayer) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n return adPlayer.getAdVolume();\n }\n return video.volume;\n}\nfunction isFullscreen() {\n return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n if (adPlayer && adPlayer.isAdPlaying()) {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n if (debug) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n adPlayer.resize(width, height);\n }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n constructor(host, timing, adConfig, cueManager, placeholder) {\n this.inAdBreak = false;\n this.showAds = false;\n this.isShowingPlaceholder = false;\n this.adDetectSentForCurrentBreak = false;\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.adRequestQueue = [];\n this.adPodQueue = [];\n this.maxPlaceholderDurationMs = 5e3;\n this.pendingAdBreak = null;\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n get debug() {\n return !!this.host.config.debugAdTiming;\n }\n get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n nextAdRequestUrl(baseVastUrl) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : void 0;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n attachImaEventListeners() {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n this.timing.consecutiveFailures = 0;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload) => {\n let errorMessage = \"Ad playback failed\";\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n if (!this.inAdBreak) {\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n recreateAdController() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n clearPendingAdBreak() {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = void 0;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = void 0;\n this.adConfig.podAssignedByPrefetch = false;\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n async handleAdStart(_marker) {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1e3\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n let podUrl;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n if (!podUrl) {\n return false;\n }\n this.continuousFetchingActive = false;\n this.recreateAdController();\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n if (this.debug) {\n console.log(\n podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n startContinuousFetching(baseVastUrl) {\n if (!this.continuousFetchingActive) {\n return;\n }\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n async continuousFetchLoop(baseVastUrl) {\n const epoch = this.timing.adBreakEpoch;\n while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n continue;\n }\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n continue;\n }\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n this.adRequestQueue.push(newAdUrl);\n const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n await new Promise((resolve) => setTimeout(resolve, generationDelay));\n }\n this.continuousFetchLoopRunning = false;\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n stopContinuousFetching() {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.placeholder.hide();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n async tryNextAvailableAdWithRateLimit() {\n if (!this.inAdBreak) {\n return;\n }\n const epoch = this.timing.adBreakEpoch;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n return this.tryNextAvailableAd(0);\n }\n async tryNextAvailableAd(retryCount = 0) {\n if (!this.inAdBreak) {\n return;\n }\n const remaining = this.timing.getRemainingAdMs();\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n this.timing.cleanupTemporaryFailures();\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n if (!this.isShowingPlaceholder && remaining > 1e3) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n async playSingleAd(vastTagUrl) {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n this.recreateAdController();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) return;\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n if (this.timing.isTemporaryAdError(playError)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = error?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n async showPlaceholderAndWaitForAds() {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n if (waitTime < 1e3) {\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n for (let i = 0; i < maxChecks; i++) {\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n if (!this.inAdBreak) return;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n handleAdPodComplete() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n this.timing.resetForBreakEnd();\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n this.adRequestQueue = [];\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = void 0;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.adPodQueue = [];\n this.showAds = false;\n this.host.getAdPlayer().stop().catch(() => {\n });\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end \\u2014 hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n this.resumeContentPlayback();\n }\n getBufferedAhead() {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n describeVideoState() {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\"\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}` : \"none\";\n const ranges = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}\\u2013${v.buffered.end(i).toFixed(2)}]`);\n }\n return `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} readyState=${ready} networkState=${net} error=${err} buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`;\n }\n monitorLiveResumeStall(resumeBaseline) {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1e3;\n const graceMs = needsReset ? 8e3 : 5e3;\n const recoveryCooldownMs = needsReset ? 7e3 : 5e3;\n const maxRecoveries = 3;\n const maxMonitorMs = 45e3;\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\"\n ];\n if (this.debug) {\n onMediaEvent = (e) => {\n const dt = ((Date.now() - startTime) / 1e3).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} \\u2014 ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start \\u2014 ${this.describeVideoState()}`\n );\n }\n const cleanup = () => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n const poll = () => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1e3).toFixed(0)}s \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n const canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n window.setTimeout(poll, pollIntervalMs);\n };\n window.setTimeout(poll, pollIntervalMs);\n }\n resumeContentPlayback(attempt = 0) {\n const maxAttempts = 5;\n const video = this.host.video;\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {\n });\n return;\n }\n const onReady = () => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n handleAdFailure() {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n constructor(config) {\n this.attached = false;\n this.palPlaybackStarted = false;\n initializePolyfills();\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...browserOverrides, ...config };\n this.video = config.videoElement;\n logBrowserInfo(config.debugAdTiming);\n this.adPlayer = this.createAdPlayer(false);\n this.palNonce = createPalNonceManager();\n this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n this.startAdPrefetch(marker, fragmentSn, cueKey);\n },\n onPlaybackCue: (marker, cueKey) => {\n this.onScte35Marker(marker, cueKey);\n },\n isInAdBreak: () => this.adBreak.inAdBreak\n });\n this.adConfig = new AdConfigManager(this.config, this.video);\n this.timing = new AdTimingService(this.config, this.video, {\n onAdStopTimerFired: () => this.onAdStopTimerFired(),\n onAdStartTimerFired: (marker, cueKey) => {\n this.startScte35AdBreak(\n marker,\n cueKey,\n marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n );\n },\n onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n getAdState: () => ({\n inAdBreak: this.adBreak.inAdBreak,\n showAds: this.adBreak.showAds,\n adPlaying: this.adPlayer.isAdPlaying()\n })\n });\n this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n onFatalDestroy: () => this.destroy(),\n isInAdBreak: () => this.adBreak.inAdBreak,\n hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n });\n this.adBreak = new AdBreakOrchestrator(\n {\n config: this.config,\n video: this.video,\n getAdPlayer: () => this.adPlayer,\n setAdPlayer: (p) => {\n this.adPlayer = p;\n },\n createAdPlayer: (c) => this.createAdPlayer(c),\n shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n isLiveStream: () => this.hlsEngine.isLiveStream,\n getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n restartHlsLoad: (position) => this.hlsEngine.restartLoadAt(position),\n reloadLiveStream: () => this.hlsEngine.reloadLiveStream(),\n recoverMediaError: () => this.hlsEngine.recoverMediaError(),\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds(),\n generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs)\n },\n this.timing,\n this.adConfig,\n this.cueManager,\n this.placeholder\n );\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n createAdPlayer(continueLiveStreamDuringAds) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n }\n return createHlsAdPlayer(this.video, {\n continueLiveStreamDuringAds,\n ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n });\n }\n generatePodVastUrl(baseUrl, breakDurationMs) {\n const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n return this.adConfig.generatePodVastUrl(\n baseUrl,\n podParams,\n this.adPlayer,\n this.palNonce,\n this.adBreak.inAdBreak\n );\n }\n // ───────────────────────────────────────────────────────────────\n // Lifecycle\n // ───────────────────────────────────────────────────────────────\n async load() {\n if (!this.attached) {\n this.attach();\n }\n try {\n await this.adConfig.fetchAdConfiguration();\n } catch (error) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n const palDescriptionUrl = this.adConfig.getPalDescriptionUrl();\n this.palNonce.generateNonce({\n videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n adWillAutoPlay: !!this.config.autoplay,\n adWillPlayMuted: true,\n playerVolume: 0,\n continuousPlayback: this.config.lowLatencyMode ?? false,\n ...palDescriptionUrl ? { descriptionUrl: palDescriptionUrl } : {}\n }).catch(() => {\n });\n fetchConsentSignals().then((signals) => {\n this.adConfig.consentSignals = signals;\n }).catch(() => {\n });\n this.adConfig.initializeTracking();\n if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n await this.hlsEngine.setupNativeHls();\n const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n isLive: this.hlsEngine.isLiveStream,\n continueLiveStreamDuringAds\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n this.adPlayer.initialize();\n return;\n }\n this.hlsEngine.setupHls();\n }\n async onManifestParsed(isLive) {\n if (this.hlsEngine.reloadingLiveStream) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Manifest re-parsed after hard reload \\u2014 skipping ad-player setup\");\n }\n return;\n }\n if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n const prerollKey = \"synthetic-vod-preroll\";\n if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n this.adConfig.vmapBreaks = [\n { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n ];\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n );\n }\n }\n }\n if (this.debug) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n this.adPlayer.initialize();\n }\n attach() {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.attachImaEventListeners();\n this.video.addEventListener(\"play\", () => {\n if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n this.palPlaybackStarted = true;\n this.palNonce.sendPlaybackStart();\n }\n });\n this.endedHandler = () => {\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.onVideoEnded();\n };\n this.video.addEventListener(\"ended\", this.endedHandler);\n this.video.addEventListener(\"mousedown\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.video.addEventListener(\"touchstart\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.timeUpdateHandler = () => {\n this.onTimeUpdate(this.video.currentTime);\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n this.emptiedHandler = () => {\n if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n this.hlsEngine.videoSrcProtection\n );\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.hlsEngine.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {\n });\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n shouldContinueLiveStreamDuringAds() {\n if (this.config.pauseContentDuringAds) {\n return false;\n }\n if (this.hlsEngine.isLiveStream) {\n return true;\n }\n const duration = this.video.duration;\n if (!Number.isFinite(duration) || duration === Infinity) {\n return true;\n }\n return false;\n }\n // ───────────────────────────────────────────────────────────────\n // SCTE-35 marker orchestration\n // ───────────────────────────────────────────────────────────────\n onScte35Marker(marker, cueKey) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n raw: marker.raw,\n hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n });\n }\n if (marker.type === \"start\") {\n if (this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n const newDurationMs = marker.durationSeconds * 1e3;\n if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n this.timing.setAdBreakDurationBoundary(newDurationMs);\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n );\n }\n }\n }\n return;\n }\n if (!this.adBreak.adDetectSentForCurrentBreak) {\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n }\n const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n const isManifest = isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker: isManifest,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n hasPrefetchedAds\n });\n }\n if (isManifest && forceImmediate) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n );\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1e3;\n const nowMs = this.video.currentTime * 1e3;\n const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1e3,\n deltaMs,\n tolerance: tol\n });\n }\n if (deltaMs > tol) {\n if (this.debug) {\n console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n }\n this.timing.expectedAdBreakDurationMs = durationMs;\n this.cueManager.scheduledScte35BreakKey = cueKey;\n this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n }\n this.timing.scheduleAdStopAtBreakBoundary();\n if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n this.adBreak.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n }\n }\n const remaining = this.timing.getRemainingAdMs();\n const adPlaying = this.adPlayer.isAdPlaying();\n const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n remaining,\n adPlaying,\n hasQueuedAds,\n activeAdRequest: this.timing.activeAdRequestToken !== null\n });\n }\n this.timing.scteAdBreakEndWallClockMs = Date.now();\n this.timing.clearAdStartTimer();\n this.timing.clearAdStopTimer();\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n return;\n }\n }\n startScte35AdBreak(marker, cueKey, durationMs) {\n this.adBreak.inAdBreak = true;\n this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n this.timing.setAdBreakDurationBoundary(durationMs);\n this.adBreak.handleAdStart(marker);\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n onAdStopTimerFired() {\n if (!this.adBreak.inAdBreak) return;\n const adPlaying = this.adPlayer.isAdPlaying();\n const checkIntervalMs = Math.max(\n 250,\n Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n );\n const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n if (shouldExtendAdBreak) {\n this.timing.scheduleAdStopCountdown(checkIntervalMs);\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n );\n }\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad prefetch\n // ───────────────────────────────────────────────────────────────\n startAdPrefetch(marker, fragmentSn, cueKey) {\n if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n return;\n }\n this.adConfig.beginNewAdPod();\n this.adConfig.podAssignedByPrefetch = true;\n const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n this.adBreak.pendingAdBreak = {\n marker,\n ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n vastUrls: generatedUrls,\n isFetching: false,\n fetchStartTime: Date.now()\n };\n this.cueManager.pendingScte35CueKey = cueKey;\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n if (this.debug) {\n console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n console.log(`[PREFETCH] Pre-generated pod request URL`);\n }\n }\n // ───────────────────────────────────────────────────────────────\n // VMAP time-based ad breaks\n // ───────────────────────────────────────────────────────────────\n onTimeUpdate(currentTimeSec) {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const nowMs = currentTimeSec * 1e3;\n const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n if (breakToPlay) {\n void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n }\n });\n }\n }\n onVideoEnded() {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n const postroll = this.adConfig.vmapBreaks.find(\n (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n );\n if (postroll) {\n void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n }\n });\n }\n }\n async handleVmapAdBreak(adBreak, nowMs) {\n const key = this.adConfig.getAdBreakKey(adBreak);\n if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n if (breakStartMs == null) return;\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = breakStartMs + durationMs;\n const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n if (inWindow) {\n this.adConfig.consumedVmapBreakIds.add(key);\n const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n if (!tags || tags.length === 0) return;\n const first = tags[0];\n const rest = tags.slice(1);\n this.adBreak.adPodQueue = rest;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.showAds = true;\n this.adBreak.inAdBreak = true;\n this.timing.currentAdBreakStartWallClockMs = Date.now();\n try {\n await this.adBreak.playSingleAd(first);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\n this.adBreak.handleAdPodComplete();\n }\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────\n getCurrentAdIndex() {\n return this.timing.currentAdIndex;\n }\n getTotalAdsInBreak() {\n return this.timing.totalAdsInBreak;\n }\n getAdRemainingMs() {\n return this.timing.getRemainingAdMs();\n }\n isAdPlaying() {\n return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n }\n isShowingAds() {\n return this.adBreak.showAds;\n }\n getStreamType() {\n const url = this.config.src.toLowerCase();\n if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n return \"hls\";\n }\n return \"other\";\n }\n shouldShowNativeControls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n }\n isLive() {\n return this.hlsEngine.isLiveStream;\n }\n isLowLatencyStream() {\n return this.hlsEngine.isLowLatencyStream();\n }\n get videoElement() {\n return this.video;\n }\n toggleMute() {\n toggleMute(this.video, this.adPlayer, this.debug);\n }\n toggleFullscreen() {\n return toggleFullscreen(this.video, this.debug);\n }\n isMuted() {\n return isMuted(this.video, this.adPlayer);\n }\n setMuted(muted) {\n setMuted(this.video, this.adPlayer, muted, this.debug);\n }\n setVolume(volume) {\n setVolume(this.video, this.adPlayer, volume, this.debug);\n }\n getVolume() {\n return getVolume(this.video, this.adPlayer);\n }\n isFullscreen() {\n return isFullscreen();\n }\n resize() {\n resizePlayer(this.video, this.adPlayer, this.debug);\n }\n // ───────────────────────────────────────────────────────────────\n // Destroy\n // ───────────────────────────────────────────────────────────────\n destroy() {\n this.adBreak.stopContinuousFetching();\n this.timing.destroy();\n this.adBreak.clearPendingAdBreak();\n this.placeholder.destroy();\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.endedHandler) {\n this.video.removeEventListener(\"ended\", this.endedHandler);\n delete this.endedHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n this.adConfig.destroyTracking();\n this.hlsEngine.destroy();\n this.adPlayer?.destroy();\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.palNonce.reset();\n this.adBreak.adRequestQueue = [];\n this.timing.consecutiveFailures = 0;\n }\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n hls: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n dash: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n video: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n audio: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n file: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n }\n};\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer = class extends import_react.Component {\n constructor() {\n super(...arguments);\n this.player = null;\n this.mounted = false;\n this.load = async () => {\n if (!this.props.videoElement || !this.props.src) return;\n try {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n const config = {\n src: this.props.src,\n videoElement: this.props.videoElement\n };\n if (this.props.autoplay !== void 0)\n config.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) config.muted = this.props.muted;\n if (this.props.lowLatencyMode !== void 0)\n config.lowLatencyMode = this.props.lowLatencyMode;\n if (this.props.allowNativeHls !== void 0)\n config.allowNativeHls = this.props.allowNativeHls;\n if (this.props.isLiveStream !== void 0)\n config.isLiveStream = this.props.isLiveStream;\n if (this.props.driftToleranceMs !== void 0)\n config.driftToleranceMs = this.props.driftToleranceMs;\n if (this.props.immediateManifestAds !== void 0)\n config.immediateManifestAds = this.props.immediateManifestAds;\n if (this.props.debugAdTiming !== void 0)\n config.debugAdTiming = this.props.debugAdTiming;\n if (this.props.showCustomControls !== void 0)\n config.showCustomControls = this.props.showCustomControls;\n if (this.props.onVolumeToggle !== void 0)\n config.onVolumeToggle = this.props.onVolumeToggle;\n if (this.props.onFullscreenToggle !== void 0)\n config.onFullscreenToggle = this.props.onFullscreenToggle;\n if (this.props.onControlClick !== void 0)\n config.onControlClick = this.props.onControlClick;\n if (this.props.licenseKey !== void 0)\n config.licenseKey = this.props.licenseKey;\n if (this.props.adFailsafeTimeoutMs !== void 0)\n config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n if (this.props.minSegmentsBeforePlay !== void 0)\n config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n if (this.props.ctvAdRequest !== void 0)\n config.ctvAdRequest = this.props.ctvAdRequest;\n this.player = new StormcloudVideoPlayer(config);\n this.props.onMount?.(this);\n await this.player.load();\n if (this.mounted) {\n this.props.onReady?.();\n }\n } catch (error) {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n }\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[HlsPlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n this.props.onPlay?.();\n } else {\n console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n this.props.onPause?.();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"player\") return this.player;\n if (key === \"video\") return this.props.videoElement;\n if (key === \"hls\" && this.player) return this.player.hls;\n return null;\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n","import { Component } from \"react\";\nimport { StormcloudVideoPlayer } from \"../player/StormcloudVideoPlayer\";\nimport type { StormcloudVideoPlayerConfig } from \"../types\";\nimport { canPlay } from \"../patterns\";\n\nexport interface HlsPlayerProps extends StormcloudVideoPlayerConfig {\n onMount?: (player: any) => void;\n onReady?: () => void;\n onPlay?: () => void;\n onPause?: () => void;\n onEnded?: () => void;\n onLoaded?: () => void;\n onError?: (error: any) => void;\n}\n\nexport default class HlsPlayer extends Component<HlsPlayerProps> {\n static displayName = \"HlsPlayer\";\n\n static canPlay = canPlay.hls;\n\n private player: StormcloudVideoPlayer | null = null;\n private mounted = false;\n\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n\n componentWillUnmount() {\n this.mounted = false;\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n\n componentDidUpdate(prevProps: HlsPlayerProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n\n load = async () => {\n if (!this.props.videoElement || !this.props.src) return;\n\n try {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n\n const config: StormcloudVideoPlayerConfig = {\n src: this.props.src,\n videoElement: this.props.videoElement,\n };\n\n if (this.props.autoplay !== undefined)\n config.autoplay = this.props.autoplay;\n if (this.props.muted !== undefined) config.muted = this.props.muted;\n if (this.props.lowLatencyMode !== undefined)\n config.lowLatencyMode = this.props.lowLatencyMode;\n if (this.props.allowNativeHls !== undefined)\n config.allowNativeHls = this.props.allowNativeHls;\n if (this.props.isLiveStream !== undefined)\n config.isLiveStream = this.props.isLiveStream;\n if (this.props.driftToleranceMs !== undefined)\n config.driftToleranceMs = this.props.driftToleranceMs;\n if (this.props.immediateManifestAds !== undefined)\n config.immediateManifestAds = this.props.immediateManifestAds;\n if (this.props.debugAdTiming !== undefined)\n config.debugAdTiming = this.props.debugAdTiming;\n if (this.props.showCustomControls !== undefined)\n config.showCustomControls = this.props.showCustomControls;\n if (this.props.onVolumeToggle !== undefined)\n config.onVolumeToggle = this.props.onVolumeToggle;\n if (this.props.onFullscreenToggle !== undefined)\n config.onFullscreenToggle = this.props.onFullscreenToggle;\n if (this.props.onControlClick !== undefined)\n config.onControlClick = this.props.onControlClick;\n if (this.props.licenseKey !== undefined)\n config.licenseKey = this.props.licenseKey;\n if (this.props.adFailsafeTimeoutMs !== undefined)\n config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n if (this.props.minSegmentsBeforePlay !== undefined)\n config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n if (this.props.ctvAdRequest !== undefined)\n config.ctvAdRequest = this.props.ctvAdRequest;\n\n this.player = new StormcloudVideoPlayer(config);\n\n this.props.onMount?.(this);\n\n await this.player.load();\n\n if (this.mounted) {\n this.props.onReady?.();\n }\n } catch (error) {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n }\n };\n\n play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource =\n video.src ||\n (video.currentSrc && video.currentSrc !== \"\") ||\n video.readyState >= 1;\n\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[HlsPlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n this.props.onPlay?.();\n } else {\n console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n }\n }\n };\n\n pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n this.props.onPause?.();\n }\n };\n\n stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n\n seekTo = (seconds: number, keepPlaying?: boolean) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n\n setVolume = (volume: number) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n\n mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n\n unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n\n setPlaybackRate = (rate: number) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n\n getDuration = (): number | null => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n\n getCurrentTime = (): number | null => {\n if (\n this.props.videoElement &&\n isFinite(this.props.videoElement.currentTime)\n ) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n\n getSecondsLoaded = (): number | null => {\n if (\n this.props.videoElement &&\n this.props.videoElement.buffered.length > 0\n ) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n\n getInternalPlayer = (key = \"player\") => {\n if (key === \"player\") return this.player;\n if (key === \"video\") return this.props.videoElement;\n if (key === \"hls\" && this.player) return (this.player as any).hls;\n return null;\n };\n\n render() {\n return null;\n }\n}\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\nimport { requiresMediaPipelineResetAfterAds } from \"../utils/browserCompat\";\nimport type { VastTrackingMacroContext } from \"../utils/vastTrackingMacros\";\nimport { substituteVastTrackingMacros } from \"../utils/vastTrackingMacros\";\n\ninterface VastMediaFile {\n url: string;\n type: string;\n width: number;\n height: number;\n bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n impression: string[];\n start: string[];\n firstQuartile: string[];\n midpoint: string[];\n thirdQuartile: string[];\n complete: string[];\n mute: string[];\n unmute: string[];\n pause: string[];\n resume: string[];\n fullscreen: string[];\n exitFullscreen: string[];\n skip: string[];\n error: string[];\n}\n\ninterface VastAd {\n id: string;\n title: string;\n duration: number;\n mediaFiles: VastMediaFile[];\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n}\n\ntype VastParseResult =\n | { type: \"inline\"; ad: VastAd }\n | {\n type: \"wrapper\";\n vastAdTagUri: string;\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n }\n | { type: \"empty\" };\n\nconst MAX_VAST_WRAPPER_DEPTH = 5;\nconst BEACON_TIMEOUT_MS = 30000;\n\nconst inFlightBeacons = new Set<HTMLImageElement>();\n\nconst VAST_ERROR_MEDIA_DISPLAY = 405;\n\nfunction toVastMediaErrorCode(error: MediaError | null | undefined): number {\n switch (error?.code) {\n case 1:\n return 400;\n case 2:\n return 401;\n case 4:\n return 403;\n default:\n return VAST_ERROR_MEDIA_DISPLAY;\n }\n}\n\nexport function createHlsAdPlayer(\n contentVideo: HTMLVideoElement,\n options?: {\n continueLiveStreamDuringAds?: boolean;\n licenseKey?: string;\n mainHlsInstance?: Hls;\n }\n): AdController {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = new Map<string, Set<(payload?: any) => void>>();\n const mainHlsInstance = options?.mainHlsInstance;\n\n const AD_CONTAINER_PROP = \"__stormcloudAdContainer\";\n const AD_VIDEO_PROP = \"__stormcloudAdVideo\";\n const FRAME_COUNTER_RELIABLE_PROP = \"__stormcloudFrameCounterReliable\";\n const RVFC_RELIABLE_PROP = \"__stormcloudRvfcReliable\";\n\n let adVideoElement: HTMLVideoElement | undefined =\n (contentVideo as any)[AD_VIDEO_PROP] ?? undefined;\n let adHls: Hls | undefined;\n let adContainerEl: HTMLDivElement | undefined =\n (contentVideo as any)[AD_CONTAINER_PROP] ?? undefined;\n let adEventHandlers: Array<{ type: string; handler: EventListener }> = [];\n let currentAd: VastAd | undefined;\n let currentAdMediaFile: VastMediaFile | undefined;\n let podAds: VastAd[] = [];\n let podIndex = 0;\n const preloadedAds = new Map<string, VastAd>();\n const preloadingAds = new Map<string, Promise<void>>();\n let destroyed = false;\n let pendingTimeouts: number[] = [];\n\n const STALL_TIMEOUT_MS = 4000;\n const STALL_CHECK_INTERVAL_MS = 1000;\n const BLACKFRAME_MIN_PLAYBACK_S = 1.5;\n\n let stallWatchdogId: number | undefined;\n let lastAdProgressTime = 0;\n let lastAdProgressPosition = 0;\n let sawDecodedVideoFrame = false;\n let videoFrameCallbackHandle: number | undefined;\n let pendingPlayPromise: Promise<void> | undefined;\n\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n\n function emit(event: string, payload?: any): void {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n\n function buildTrackingMacroContext(\n errorCode?: number | string\n ): VastTrackingMacroContext {\n const context: VastTrackingMacroContext = {\n adPlayheadSeconds: adVideoElement?.currentTime,\n contentPlayheadSeconds: contentVideo.currentTime,\n assetUri: currentAdMediaFile?.url,\n mediaMime: currentAdMediaFile?.type,\n playerWidth: adVideoElement?.clientWidth || adContainerEl?.clientWidth,\n playerHeight: adVideoElement?.clientHeight || adContainerEl?.clientHeight,\n };\n\n if (errorCode != null) {\n context.errorCode = errorCode;\n }\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n context.clientUa = navigator.userAgent;\n }\n if (typeof location !== \"undefined\" && location.href) {\n context.pageUrl = location.href;\n }\n if (podAds.length > 0) {\n context.podSequence = podIndex + 1;\n }\n\n return context;\n }\n\n function fireTrackingPixels(\n urls: string[],\n options?: { errorCode?: number | string }\n ): void {\n if (!urls || urls.length === 0) return;\n\n const macroContext = buildTrackingMacroContext(options?.errorCode);\n\n urls.forEach((url) => {\n try {\n const trackingUrl = substituteVastTrackingMacros(url, macroContext);\n\n const img = new Image(1, 1);\n inFlightBeacons.add(img);\n\n let timeoutId: number | undefined;\n const release = () => {\n if (timeoutId !== undefined) clearTimeout(timeoutId);\n img.onload = null;\n img.onerror = null;\n inFlightBeacons.delete(img);\n };\n img.onload = release;\n img.onerror = release;\n timeoutId = setTimeout(release, BEACON_TIMEOUT_MS) as unknown as number;\n\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n\n function getMainStreamQuality(): {\n width: number;\n height: number;\n bitrate: number;\n } | null {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level = mainHlsInstance.levels[autoLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5000000,\n };\n }\n return null;\n }\n\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5000000,\n };\n }\n\n function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n\n const fileBitrate = (file.bitrate || 5000) * 1000;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n\n const score = resolutionDiff * 2 + bitrateDiff / 1000;\n\n return { file, score, resolutionDiff, bitrateDiff };\n });\n\n scoredFiles.sort((a, b) => a.score - b.score);\n\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff,\n });\n\n return bestMatch.file;\n }\n\n function isHlsMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return (\n type === \"application/x-mpegurl\" ||\n type === \"application/vnd.apple.mpegurl\" ||\n type.includes(\"mpegurl\") ||\n url.includes(\".m3u8\")\n );\n }\n\n function isProgressiveMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return (\n type.startsWith(\"video/\") ||\n url.endsWith(\".mp4\") ||\n url.includes(\".mp4?\")\n );\n }\n\n function isAudioMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = (mediaFile.url.toLowerCase().split(\"?\")[0] || \"\").trim();\n return (\n type.startsWith(\"audio/\") ||\n url.endsWith(\".mp3\") ||\n url.endsWith(\".aac\") ||\n url.endsWith(\".m4a\") ||\n url.endsWith(\".ogg\") ||\n url.endsWith(\".oga\") ||\n url.endsWith(\".opus\") ||\n url.endsWith(\".wav\") ||\n url.endsWith(\".weba\")\n );\n }\n\n function collectVideoMediaFiles(\n scope: Document | Element,\n verbose: boolean\n ): VastMediaFile[] {\n const mediaFileElements = scope.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n }\n\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n }\n\n if (!url) {\n if (verbose) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n }\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : undefined;\n\n const mediaFile: VastMediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n };\n\n if (isAudioMediaFile(mediaFile)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (audio-only, type=\"${type}\") — audio ads are not played to avoid a black screen`\n );\n return;\n }\n\n const hasExplicitDimensions =\n mf.getAttribute(\"width\") != null && mf.getAttribute(\"height\") != null;\n if (\n !isHlsMediaFile(mediaFile) &&\n hasExplicitDimensions &&\n (mediaFile.width <= 1 || mediaFile.height <= 1)\n ) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (degenerate dimensions ${mediaFile.width}x${mediaFile.height}, type=\"${type}\") — likely an audio-only placeholder rendition`\n );\n return;\n }\n\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n }\n } else if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n\n return mediaFiles;\n }\n\n function createEmptyTrackingUrls(): VastTrackingUrls {\n return {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: [],\n };\n }\n\n function extractTrackingUrls(scope: Document | Element): VastTrackingUrls {\n const trackingUrls = createEmptyTrackingUrls();\n\n scope.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n\n scope.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event as keyof VastTrackingUrls;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n\n scope.querySelectorAll(\"Error\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.error.push(url);\n });\n\n return trackingUrls;\n }\n\n function mergeTrackingUrls(\n target: VastTrackingUrls,\n source: VastTrackingUrls\n ): VastTrackingUrls {\n (Object.keys(target) as Array<keyof VastTrackingUrls>).forEach((key) => {\n if (source[key] && source[key].length > 0) {\n target[key] = target[key].concat(source[key]);\n }\n });\n return target;\n }\n\n function parseVastXml(xmlString: string): VastParseResult {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return { type: \"empty\" };\n }\n\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return { type: \"empty\" };\n }\n\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n const clickThrough = xmlDoc\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n const wrapperUri = xmlDoc\n .querySelector(\"VASTAdTagURI\")\n ?.textContent?.trim();\n if (wrapperUri) {\n console.log(\n `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${wrapperUri}`\n );\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough,\n };\n }\n\n const isNoAdAvailable =\n adId === \"empty\" ||\n title.toLowerCase().includes(\"no ad available\") ||\n title.toLowerCase() === \"no ad available\";\n\n const durationText =\n xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n parseInt(durationParts[2] || \"0\", 10);\n\n const mediaFiles = collectVideoMediaFiles(xmlDoc, true);\n\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n }\n return { type: \"empty\" };\n }\n\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(xmlDoc),\n clickThrough,\n },\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return { type: \"empty\" };\n }\n }\n\n function parseAdElement(adElement: Element): VastParseResult {\n try {\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = adElement.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n const clickThrough = adElement\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n const wrapperUri = adElement\n .querySelector(\"VASTAdTagURI\")\n ?.textContent?.trim();\n if (wrapperUri) {\n return {\n type: \"wrapper\",\n vastAdTagUri: wrapperUri,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough,\n };\n }\n\n const isNoAdAvailable =\n adId === \"empty\" ||\n title.toLowerCase().includes(\"no ad available\") ||\n title.toLowerCase() === \"no ad available\";\n\n const durationText =\n adElement.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n parseInt(durationParts[2] || \"0\", 10);\n\n const mediaFiles = collectVideoMediaFiles(adElement, false);\n\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] Pod <Ad> indicates no ad available\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files in pod <Ad>\");\n }\n return { type: \"empty\" };\n }\n\n return {\n type: \"inline\",\n ad: {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls: extractTrackingUrls(adElement),\n clickThrough,\n },\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing pod <Ad> element:\", error);\n return { type: \"empty\" };\n }\n }\n\n async function fetchVastXml(\n vastTagUrl: string,\n credentials: RequestCredentials = \"include\"\n ): Promise<string> {\n const requestVast = (creds: RequestCredentials) =>\n fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: creds,\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\",\n },\n referrerPolicy: \"no-referrer-when-downgrade\",\n });\n\n let response: Response;\n try {\n response = await requestVast(credentials);\n } catch (error) {\n if (credentials !== \"omit\") {\n console.warn(\n `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n error\n );\n response = await requestVast(\"omit\");\n } else {\n throw error;\n }\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n return response.text();\n }\n\n async function fetchAndParseVastAd(\n vastTagUrl: string,\n depth = 0,\n accumulatedTracking: VastTrackingUrls = createEmptyTrackingUrls()\n ): Promise<VastAd | null> {\n const vastXml = await fetchVastXml(\n vastTagUrl,\n depth === 0 ? \"include\" : \"omit\"\n );\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n\n const parsed = parseVastXml(vastXml);\n\n if (parsed.type === \"empty\") {\n return null;\n }\n\n if (parsed.type === \"wrapper\") {\n if (depth >= MAX_VAST_WRAPPER_DEPTH) {\n console.warn(\n `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain`\n );\n return null;\n }\n\n mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n depth + 1,\n accumulatedTracking\n );\n }\n\n mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n return parsed.ad;\n }\n\n async function fetchAndParsePod(vastTagUrl: string): Promise<VastAd[]> {\n const vastXml = await fetchVastXml(vastTagUrl);\n console.log(\n `[HlsAdPlayer] Pod VAST XML received (length=${vastXml.length})`\n );\n\n const trimmedXml = vastXml.trim();\n if (trimmedXml.length === 0) {\n console.warn(\n \"[HlsAdPlayer] Pod VAST response body is empty (no fill)\"\n );\n return [];\n }\n\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\n \"[HlsAdPlayer] Pod VAST XML parsing error (malformed). Content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n return [];\n }\n\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\n \"[HlsAdPlayer] No <Ad> elements found in pod VAST response (no fill). Content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n return [];\n }\n\n adElements.sort((a, b) => {\n const aSeq = parseInt(a.getAttribute(\"sequence\") || \"\", 10);\n const bSeq = parseInt(b.getAttribute(\"sequence\") || \"\", 10);\n const aVal = Number.isFinite(aSeq) ? aSeq : Number.MAX_SAFE_INTEGER;\n const bVal = Number.isFinite(bSeq) ? bSeq : Number.MAX_SAFE_INTEGER;\n return aVal - bVal;\n });\n\n const ads: VastAd[] = [];\n for (const adElement of adElements) {\n const parsed = parseAdElement(adElement);\n\n if (parsed.type === \"inline\") {\n ads.push(parsed.ad);\n } else if (parsed.type === \"wrapper\") {\n try {\n const resolved = await fetchAndParseVastAd(\n parsed.vastAdTagUri,\n 1,\n parsed.trackingUrls\n );\n if (resolved) {\n ads.push(resolved);\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Failed to resolve wrapper <Ad> in pod:\",\n error\n );\n }\n }\n }\n\n console.log(`[HlsAdPlayer] Parsed ${ads.length} ad(s) from pod VAST response`);\n return ads;\n }\n\n function createAdVideoElement(): HTMLVideoElement {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n\n video.volume = 1.0;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n\n return video;\n }\n\n function setupAdEventListeners(): void {\n if (!adVideoElement || !currentAd) return;\n if (adEventHandlers.length > 0) return;\n\n const onTimeUpdate: EventListener = () => {\n if (!currentAd || !adVideoElement) return;\n\n noteAdProgress();\n\n const progress = adVideoElement.currentTime / currentAd.duration;\n\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n };\n\n const onLoadedMetadata: EventListener = () => {\n if (!adPlaying || !adVideoElement) return;\n const { videoWidth, videoHeight } = adVideoElement;\n if (videoWidth <= 1 || videoHeight <= 1) {\n console.warn(\n `[HlsAdPlayer] Ad creative has no usable video dimensions (${videoWidth}x${videoHeight}) - skipping this creative`\n );\n handleVideoDecodeFailure();\n }\n };\n\n const onPlaying: EventListener = () => {\n startStallWatchdog();\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n };\n\n const onEnded: EventListener = () => {\n if (!currentAd || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdComplete();\n };\n\n const onError: EventListener = (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: toVastMediaErrorCode(adVideoElement?.error),\n });\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n };\n\n const onVolumeChange: EventListener = () => {\n if (!currentAd || !adVideoElement) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n };\n\n const onPause: EventListener = () => {\n if (currentAd && adVideoElement && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n };\n\n const onPlay: EventListener = () => {\n if (currentAd && adVideoElement && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n };\n\n adEventHandlers = [\n { type: \"timeupdate\", handler: onTimeUpdate },\n { type: \"loadedmetadata\", handler: onLoadedMetadata },\n { type: \"playing\", handler: onPlaying },\n { type: \"ended\", handler: onEnded },\n { type: \"error\", handler: onError },\n { type: \"volumechange\", handler: onVolumeChange },\n { type: \"pause\", handler: onPause },\n { type: \"play\", handler: onPlay },\n ];\n\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.addEventListener(type, handler);\n }\n }\n\n function teardownAdEventListeners(): void {\n if (adVideoElement) {\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.removeEventListener(type, handler);\n }\n }\n adEventHandlers = [];\n }\n\n function setAdPlayingFlag(isPlaying: boolean): void {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n\n function resetQuartileTracking(preserveImpression: boolean): void {\n trackingFired = {\n impression: preserveImpression ? trackingFired.impression : false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n }\n\n function isRvfcSupported(video: HTMLVideoElement): boolean {\n return typeof (video as any).requestVideoFrameCallback === \"function\";\n }\n\n function settlePendingPlay(): void {\n pendingPlayPromise = undefined;\n }\n\n function startAdPlayback(context: string): void {\n if (!adVideoElement) return;\n\n const playPromise = adVideoElement.play();\n pendingPlayPromise = playPromise;\n playPromise\n .catch((error) => {\n if (pendingPlayPromise !== playPromise) {\n return;\n }\n console.error(`[HlsAdPlayer] Error starting ${context}:`, error);\n handleAdError();\n })\n .finally(() => {\n if (pendingPlayPromise === playPromise) {\n pendingPlayPromise = undefined;\n }\n });\n }\n\n function prepareVideoElementForNewSource(): void {\n settlePendingPlay();\n\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (!adVideoElement) return;\n\n try {\n adVideoElement.pause();\n adVideoElement.removeAttribute(\"src\");\n adVideoElement.load();\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error preparing ad video for new source:\",\n error\n );\n }\n }\n\n function recreateAdVideoElement(): void {\n console.log(\n \"[HlsAdPlayer] Recreating ad video element (single-decoder platform)\"\n );\n teardownAdEventListeners();\n prepareVideoElementForNewSource();\n\n if (adVideoElement) {\n try {\n adVideoElement.remove();\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error removing ad video element:\", error);\n }\n }\n\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n (contentVideo as any)[AD_VIDEO_PROP] = adVideoElement;\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n }\n\n function loadCurrentAdMedia(): void {\n if (!adVideoElement || !currentAd) {\n throw new Error(\"No ad video element or ad to load\");\n }\n\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n\n currentAdMediaFile = mediaFile;\n\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n );\n\n if (isHlsAd && Hls.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n\n adHls = new Hls({\n enableWorker: true,\n lowLatencyMode: false,\n });\n\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n\n adHls.on(Hls.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n startAdPlayback(\"HLS ad playback\");\n });\n\n adHls.on(Hls.Events.ERROR, (_event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (\n isHlsAd &&\n adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")\n ) {\n adVideoElement.src = mediaFile.url;\n startAdPlayback(\"native HLS ad playback\");\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n startAdPlayback(\"progressive ad playback\");\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n }\n\n function advanceToNextPodAd(): boolean {\n if (podIndex >= podAds.length - 1) {\n return false;\n }\n\n podIndex++;\n currentAd = podAds[podIndex];\n currentAdMediaFile = undefined;\n resetQuartileTracking(false);\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n console.log(\n `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n );\n }\n\n clearStallWatchdog();\n if (requiresMediaPipelineResetAfterAds()) {\n recreateAdVideoElement();\n setupAdEventListeners();\n } else {\n prepareVideoElementForNewSource();\n }\n\n try {\n loadCurrentAdMedia();\n emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n return true;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n return false;\n }\n }\n\n function clearStallWatchdog(): void {\n if (stallWatchdogId != null) {\n clearInterval(stallWatchdogId);\n stallWatchdogId = undefined;\n }\n cancelVideoFrameProbe();\n }\n\n function noteAdProgress(): void {\n lastAdProgressTime = Date.now();\n if (adVideoElement) {\n lastAdProgressPosition = adVideoElement.currentTime;\n }\n }\n\n function handleAdStall(): void {\n console.warn(\n \"[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame\"\n );\n clearStallWatchdog();\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY,\n });\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n }\n\n function getDecodedVideoFrameCount(\n video: HTMLVideoElement\n ): number | undefined {\n try {\n if (typeof video.getVideoPlaybackQuality === \"function\") {\n const quality = video.getVideoPlaybackQuality();\n if (quality && typeof quality.totalVideoFrames === \"number\") {\n return quality.totalVideoFrames;\n }\n }\n const legacyCount = (video as any).webkitDecodedFrameCount;\n if (typeof legacyCount === \"number\") {\n return legacyCount;\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Unable to read decoded video frame count:\",\n error\n );\n }\n return undefined;\n }\n\n function isFrameCounterReliable(): boolean {\n return (contentVideo as any)[FRAME_COUNTER_RELIABLE_PROP] === true;\n }\n\n function markFrameCounterReliable(): void {\n (contentVideo as any)[FRAME_COUNTER_RELIABLE_PROP] = true;\n }\n\n function isRvfcReliable(): boolean {\n return (contentVideo as any)[RVFC_RELIABLE_PROP] === true;\n }\n\n function markRvfcReliable(): void {\n (contentVideo as any)[RVFC_RELIABLE_PROP] = true;\n }\n\n function cancelVideoFrameProbe(): void {\n if (\n videoFrameCallbackHandle != null &&\n adVideoElement &&\n typeof (adVideoElement as any).cancelVideoFrameCallback === \"function\"\n ) {\n try {\n (adVideoElement as any).cancelVideoFrameCallback(\n videoFrameCallbackHandle\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error cancelling video frame callback:\",\n error\n );\n }\n }\n videoFrameCallbackHandle = undefined;\n }\n\n function startVideoFrameProbe(): void {\n cancelVideoFrameProbe();\n if (!adVideoElement) return;\n\n const rvfc = (adVideoElement as any).requestVideoFrameCallback;\n if (typeof rvfc !== \"function\") return;\n\n const onPresentedFrame = () => {\n videoFrameCallbackHandle = undefined;\n if (!adPlaying) return;\n sawDecodedVideoFrame = true;\n markRvfcReliable();\n };\n\n try {\n videoFrameCallbackHandle = rvfc.call(\n adVideoElement,\n onPresentedFrame\n ) as number;\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error requesting video frame callback:\",\n error\n );\n videoFrameCallbackHandle = undefined;\n }\n }\n\n function handleVideoDecodeFailure(): void {\n console.warn(\n \"[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative\"\n );\n clearStallWatchdog();\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error, {\n errorCode: VAST_ERROR_MEDIA_DISPLAY,\n });\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n }\n\n function startStallWatchdog(): void {\n clearStallWatchdog();\n noteAdProgress();\n sawDecodedVideoFrame = false;\n startVideoFrameProbe();\n\n const blackFrameDetectionEnabled = !requiresMediaPipelineResetAfterAds();\n\n stallWatchdogId = window.setInterval(() => {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n if (\n blackFrameDetectionEnabled &&\n !sawDecodedVideoFrame &&\n !adVideoElement.paused\n ) {\n const decodedFrames = getDecodedVideoFrameCount(adVideoElement);\n if (decodedFrames !== undefined && decodedFrames > 0) {\n sawDecodedVideoFrame = true;\n markFrameCounterReliable();\n } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {\n const timeAdvancing =\n adVideoElement.currentTime > lastAdProgressPosition + 0.05;\n\n if (\n isRvfcSupported(adVideoElement) &&\n timeAdvancing &&\n isRvfcReliable()\n ) {\n handleVideoDecodeFailure();\n return;\n }\n\n if (\n decodedFrames === 0 &&\n timeAdvancing &&\n isFrameCounterReliable()\n ) {\n handleVideoDecodeFailure();\n return;\n }\n }\n }\n\n if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {\n noteAdProgress();\n return;\n }\n\n if (adVideoElement.paused) {\n noteAdProgress();\n return;\n }\n\n if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {\n handleAdStall();\n }\n }, STALL_CHECK_INTERVAL_MS) as unknown as number;\n }\n\n function releaseAdDecoder(): void {\n prepareVideoElementForNewSource();\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }\n\n function handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n releaseAdDecoder();\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n \n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode:\", error);\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n\n emit(\"content_resume\");\n }\n\n function handleAdError(): void {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n releaseAdDecoder();\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n\n emit(\"ad_error\");\n }\n\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n\n // Reuse the persistent container across ad-player instances if present.\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n (contentVideo as any)[AD_CONTAINER_PROP] = adContainerEl;\n },\n\n async requestAds(vastTagUrl: string) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n\n try {\n let ads: VastAd[] = [];\n\n if (preloadedAds.has(vastTagUrl)) {\n const preloaded = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n if (preloaded) {\n ads = [preloaded];\n }\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ads = await fetchAndParsePod(vastTagUrl);\n }\n\n if (!ads.length) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n\n podAds = ads;\n podIndex = 0;\n currentAd = ads[0];\n currentAdMediaFile = undefined;\n console.log(\n `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n );\n\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.impression);\n trackingFired.impression = true;\n }\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n (contentVideo as any)[AD_VIDEO_PROP] = adVideoElement;\n }\n setupAdEventListeners();\n\n resetQuartileTracking(true);\n\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n adPlaying = true;\n setAdPlayingFlag(true);\n\n if (adVideoElement) {\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n\n emit(\"content_pause\");\n\n loadCurrentAdMedia();\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {});\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n );\n\n releaseAdDecoder();\n\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode on stop:\", error);\n });\n }\n }\n\n currentAd = undefined;\n currentAdMediaFile = undefined;\n podAds = [];\n podIndex = 0;\n },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n clearStallWatchdog();\n\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n \n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n\n teardownAdEventListeners();\n releaseAdDecoder();\n\n currentAd = undefined;\n currentAdMediaFile = undefined;\n podAds = [];\n podIndex = 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n\n isAdPlaying() {\n return adPlaying;\n },\n\n resize(width: number, height: number) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n\n on(event: string, listener: (payload?: any) => void) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(listener);\n },\n\n off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\n },\n\n updateOriginalMutedState(muted: boolean, volume?: number) {\n const nextVolume =\n typeof volume === \"number\" && !Number.isNaN(volume)\n ? Math.max(0, Math.min(1, volume))\n : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n\n setAdVolume(volume: number) {\n if (adVideoElement && adPlaying) {\n const clamped = Math.max(0, Math.min(1, volume));\n adVideoElement.volume = clamped;\n adVideoElement.muted = clamped === 0;\n }\n },\n\n getAdVolume(): number {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n \n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl && !adPlaying) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n getLoadedAdDuration() {\n return currentAd?.duration;\n },\n getLoadedAdId() {\n return currentAd?.id;\n },\n getPodAdCount() {\n return podAds.length;\n },\n getPodTotalDurationMs() {\n return podAds.reduce(\n (total, ad) => total + (ad.duration > 0 ? ad.duration * 1000 : 0),\n 0\n );\n },\n };\n}\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsModernJS: boolean;\n webOSVersion?: number | undefined;\n tizenVersion?: number | undefined;\n chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n let webOSVersion: number | undefined;\n let tizenVersion: number | undefined;\n let chromeVersionNum: number | undefined;\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n\n if (match && match[1]) {\n version = match[1];\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = '6.0';\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = '5.0';\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = '4.0';\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = '3.0';\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = '2.0';\n majorVersion = 2;\n }\n } else {\n version = 'Unknown';\n webOSVersion = undefined;\n }\n\n isLegacyTV = webOSVersion !== undefined && webOSVersion < 3;\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n\n isLegacyTV = tizenVersion !== undefined && tizenVersion < 3;\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else {\n if (chromeVersion > 0) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n\n if (chromeVersion < 50) {\n supportsModernJS = false;\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum,\n };\n}\n\nexport function requiresMediaPipelineResetAfterAds(): boolean {\n const browser = detectBrowser();\n return browser.name === 'Samsung Tizen' && (browser.tizenVersion ?? 0) >= 5;\n}\n\nexport function getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n pauseContentDuringAds?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: {\n allowNativeHls?: boolean;\n pauseContentDuringAds?: boolean;\n } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n overrides.pauseContentDuringAds = true;\n }\n\n return overrides;\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n userAgent: navigator.userAgent,\n });\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n","export interface VastTrackingMacroContext {\n adPlayheadSeconds?: number | undefined;\n contentPlayheadSeconds?: number | undefined;\n assetUri?: string | undefined;\n mediaMime?: string | undefined;\n playerWidth?: number | undefined;\n playerHeight?: number | undefined;\n errorCode?: number | string | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n pageUrl?: string | undefined;\n clientUa?: string | undefined;\n podSequence?: number | undefined;\n}\n\nconst VAST_MACRO_PATTERN = /\\[([A-Z][A-Z0-9_]*)\\]/g;\n\nconst CACHEBUSTING_ALIASES =\n /\\[CACHEBUSTER\\]|\\[cachebuster\\]|\\[timestamp\\]|\\[random\\]|\\[INSERT_RANDOM_NUMBER\\]|%%CACHEBUSTER%%|%%CACHEBUST%%|\\$\\{CACHEBUSTER\\}|\\$\\{CACHEBUSTING\\}|\\{cachebuster\\}|\\{random\\}/g;\n\nconst KNOWN_VAST_MACROS = new Set([\n \"ADCATEGORIES\",\n \"ADCOUNT\",\n \"ADPLAYHEAD\",\n \"ADSERVINGID\",\n \"ADTYPE\",\n \"APIFRAMEWORKS\",\n \"APPBUNDLE\",\n \"ASSETURI\",\n \"BLOCKEDADCATEGORIES\",\n \"BREAKMAXADLENGTH\",\n \"BREAKMAXADS\",\n \"BREAKMAXDURATION\",\n \"BREAKMINADLENGTH\",\n \"BREAKPOSITION\",\n \"CACHEBUSTING\",\n \"CLICKPOS\",\n \"CLICKTYPE\",\n \"CLIENTUA\",\n \"CONTENTID\",\n \"CONTENTPLAYHEAD\",\n \"CONTENTURI\",\n \"DEVICEIP\",\n \"DEVICEUA\",\n \"DOMAIN\",\n \"ERRORCODE\",\n \"EXTENSIONS\",\n \"GDPRCONSENT\",\n \"IFA\",\n \"IFATYPE\",\n \"INVENTORYSTATE\",\n \"LATLONG\",\n \"LIMITADTRACKING\",\n \"MEDIAMIME\",\n \"MEDIAPLAYHEAD\",\n \"OMIDPARTNER\",\n \"PAGEURL\",\n \"PLACEMENTTYPE\",\n \"PLAYERCAPABILITIES\",\n \"PLAYERSIZE\",\n \"PLAYERSTATE\",\n \"PODSEQUENCE\",\n \"REGULATIONS\",\n \"SERVERSIDE\",\n \"SERVERUA\",\n \"TIMESTAMP\",\n \"TRANSACTIONID\",\n \"UNIVERSALADID\",\n \"VASTVERSIONS\",\n \"VERIFICATIONVENDORS\",\n]);\n\nexport function generateCachebuster(): string {\n return String(Math.floor(Math.random() * 90000000) + 10000000);\n}\n\nfunction formatPlayhead(seconds: number | undefined): string | undefined {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0) {\n return undefined;\n }\n const total = Math.floor(seconds);\n const hh = String(Math.floor(total / 3600)).padStart(2, \"0\");\n const mm = String(Math.floor((total % 3600) / 60)).padStart(2, \"0\");\n const ss = String(total % 60).padStart(2, \"0\");\n const ms = String(Math.floor((seconds - total) * 1000)).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\n\nfunction resolveMacroValues(\n ctx: VastTrackingMacroContext\n): Map<string, string> {\n const values = new Map<string, string>();\n const set = (key: string, value: string | undefined) => {\n if (value != null && value !== \"\") values.set(key, value);\n };\n\n const adPlayhead = formatPlayhead(ctx.adPlayheadSeconds);\n set(\"ADPLAYHEAD\", adPlayhead);\n set(\"MEDIAPLAYHEAD\", adPlayhead);\n set(\"CONTENTPLAYHEAD\", formatPlayhead(ctx.contentPlayheadSeconds));\n\n set(\"ASSETURI\", ctx.assetUri);\n set(\"MEDIAMIME\", ctx.mediaMime);\n set(\"TIMESTAMP\", new Date().toISOString());\n set(\"SERVERSIDE\", \"0\");\n\n if (ctx.errorCode != null && ctx.errorCode !== \"\") {\n set(\"ERRORCODE\", String(ctx.errorCode));\n }\n\n if (ctx.playerWidth != null && ctx.playerHeight != null) {\n set(\"PLAYERSIZE\", `${Math.round(ctx.playerWidth)},${Math.round(ctx.playerHeight)}`);\n }\n\n set(\"IFA\", ctx.deviceId);\n set(\"IFATYPE\", ctx.deviceIdType);\n if (ctx.limitAdTracking != null) {\n set(\"LIMITADTRACKING\", ctx.limitAdTracking ? \"1\" : \"0\");\n }\n\n set(\"PAGEURL\", ctx.pageUrl);\n if (ctx.pageUrl) {\n try {\n set(\"DOMAIN\", new URL(ctx.pageUrl).hostname);\n } catch {}\n }\n\n set(\"CLIENTUA\", ctx.clientUa);\n set(\"DEVICEUA\", ctx.clientUa);\n\n if (ctx.podSequence != null) {\n set(\"PODSEQUENCE\", String(ctx.podSequence));\n }\n\n return values;\n}\n\nexport function substituteVastTrackingMacros(\n url: string,\n ctx: VastTrackingMacroContext = {}\n): string {\n if (!url) return url;\n\n const values = resolveMacroValues(ctx);\n\n return url\n .replace(CACHEBUSTING_ALIASES, () => generateCachebuster())\n .replace(VAST_MACRO_PATTERN, (match, name: string) => {\n if (name === \"CACHEBUSTING\") return generateCachebuster();\n\n const value = values.get(name);\n if (value != null) return encodeURIComponent(value);\n\n return KNOWN_VAST_MACROS.has(name) ? \"\" : match;\n });\n}\n","const PRIVATE_HOST_PATTERNS: RegExp[] = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/,\n];\n\nexport function isLocalDevHost(hostname: string): boolean {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\n\nexport function toDevSafeUrl(rawUrl: string | undefined): string {\n if (!rawUrl) return rawUrl ?? \"\";\n\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n","import { toDevSafeUrl } from \"../utils/devUrl\";\n\ndeclare global {\n interface Window {\n goog?: any;\n }\n}\n\nconst PAL_SDK_URL =\n \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n\n if (_palLoadPromise) return _palLoadPromise;\n\n _palLoadPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n ) as HTMLScriptElement | null;\n\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 10000\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n\n return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n videoWidth?: number;\n videoHeight?: number;\n descriptionUrl?: string;\n ppid?: string;\n sessionId?: string;\n adWillAutoPlay?: boolean;\n adWillPlayMuted?: boolean;\n playerVolume?: number;\n continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n generateNonce(options?: PalNonceOptions): Promise<string>;\n\n getCurrentNonce(): string;\n\n injectNonce(vastTagUrl: string): string;\n\n sendPlaybackStart(): void;\n\n sendPlaybackEnd(): void;\n\n sendAdClick(): void;\n\n sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n let currentNonce = \"\";\n let currentNonceManager: any | undefined;\n\n return {\n async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n try {\n await loadPalSdk();\n\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume =\n options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId,\n }, null, 2)\n );\n\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce() as string;\n\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = undefined;\n return \"\";\n }\n },\n\n getCurrentNonce(): string {\n return currentNonce;\n },\n\n injectNonce(vastTagUrl: string): string {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl\n .replace(/([?&])paln=[^&]*/g, \"\")\n .replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n\n sendPlaybackStart(): void {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {}\n },\n\n sendPlaybackEnd(): void {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {}\n },\n\n sendAdClick(): void {\n try {\n currentNonceManager?.sendAdClick();\n } catch {}\n },\n\n sendAdTouch(event: MouseEvent | TouchEvent): void {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {}\n },\n\n reset(): void {\n currentNonce = \"\";\n currentNonceManager = undefined;\n },\n };\n}\n","export type TrackingIngestChannel = \"metrics\" | \"impressions\" | \"heartbeat\";\n\nexport type TrackingIngestConfig = {\n enabled: boolean;\n baseUrl: string;\n};\n\nexport const DEFAULT_TRACKING_INGEST_CONFIG: TrackingIngestConfig = {\n enabled: true,\n baseUrl:\n \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\",\n};\n\nexport const trackingIngestConfig: TrackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG,\n};\n\nexport function applyTrackingIngestConfig(\n overrides: Partial<TrackingIngestConfig>\n): void {\n Object.assign(trackingIngestConfig, overrides);\n}\n\nexport function configureTrackingIngest(\n overrides: Partial<TrackingIngestConfig>\n): void {\n applyTrackingIngestConfig(overrides);\n}\n\nexport function isTrackingIngestEnabled(): boolean {\n return trackingIngestConfig.enabled === true;\n}\n\nfunction normalizeIngestBaseUrl(baseUrl: string): string {\n return baseUrl.replace(/\\/+$/, \"\");\n}\n\nexport function buildTrackingIngestUrl(channel: TrackingIngestChannel): string {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\n\nexport async function ingestPlayerTracking(\n licenseKey: string,\n channel: TrackingIngestChannel,\n body: Record<string, unknown>\n): Promise<boolean> {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n","export interface VastEnvironmentSignals {\n isCtv: boolean;\n sessionId?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n deviceTypeHint?: number;\n}\n\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\",\n];\n\nconst ANDROID_ID_TYPES = new Set([\"aaid\", \"adid\"]);\n\nexport function resolveVastEnvironmentSignals(isCtv: boolean): VastEnvironmentSignals {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n\n const realDeviceId =\n bridgeSignals.deviceId ||\n readStoredDeviceId() ||\n platformDevice.deviceId;\n\n let deviceId = realDeviceId;\n let deviceIdType =\n bridgeSignals.deviceIdType ||\n readStoredString(\"deviceIdType\") ||\n readStoredString(\"idtype\") ||\n platformDevice.deviceIdType ||\n inferDeviceIdType();\n\n const platformLat = bridgeSignals.deviceId\n ? bridgeSignals.limitAdTracking\n : platformDevice.limitAdTracking;\n let limitAdTracking =\n deviceId != null\n ? platformLat ?? readStoredLimitAdTracking() ?? false\n : undefined;\n\n if (!deviceId && isCtv) {\n const dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (dpid) {\n deviceId = dpid;\n deviceIdType = \"dpid\";\n limitAdTracking = platformLat ?? readStoredLimitAdTracking() ?? false;\n }\n }\n\n if (isCtv) {\n return {\n isCtv: true,\n sessionId: getOrCreateCtvSessionId(),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n deviceTypeHint: 5,\n };\n }\n\n return {\n isCtv: false,\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n };\n}\n\nexport function inferDeviceIdType(): string | undefined {\n if (typeof navigator === \"undefined\") {\n return undefined;\n }\n\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return undefined;\n}\n\nexport function isEquivalentDeviceIdType(\n tagType: string | undefined,\n runtimeType: string | undefined\n): boolean {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\n\nexport function resolveNativeDeviceId(): string | undefined {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId =\n bridgeSignals.deviceId ||\n readStoredDeviceId() ||\n platformDevice.deviceId;\n\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return undefined;\n }\n\n return deviceId;\n}\n\nexport function getOrCreateStoredUuid(storageKey: string): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\n\nfunction getOrCreateCtvSessionId(): string {\n const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n return existing;\n }\n\n const sessionId = createUuid();\n writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n return sessionId;\n}\n\nfunction readPersistentId(storageKey: string): string | undefined {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\n\nfunction writePersistentId(storageKey: string, value: string): void {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {}\n writeCookie(storageKey, value);\n}\n\nconst PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5; // ~5 years\n\nfunction readCookie(name: string): string | undefined {\n if (typeof document === \"undefined\") {\n return undefined;\n }\n\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || undefined;\n }\n }\n } catch {}\n\n return undefined;\n}\n\nfunction writeCookie(name: string, value: string): void {\n if (typeof document === \"undefined\") {\n return;\n }\n\n try {\n document.cookie =\n encodeURIComponent(name) +\n \"=\" +\n encodeURIComponent(value) +\n \";path=/;max-age=\" +\n PERSISTENT_ID_COOKIE_MAX_AGE +\n \";SameSite=Lax\";\n } catch {}\n}\n\nfunction createUuid(): string {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = (seed * 1103515245 + 12345) & 0x7fffffff;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 0xff;\n }\n }\n\n bytes[6] = ((bytes[6] ?? 0) & 0x0f) | 0x40;\n bytes[8] = ((bytes[8] ?? 0) & 0x3f) | 0x80;\n\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n\n return (\n hex.slice(0, 8) +\n \"-\" +\n hex.slice(8, 12) +\n \"-\" +\n hex.slice(12, 16) +\n \"-\" +\n hex.slice(16, 20) +\n \"-\" +\n hex.slice(20, 32)\n );\n}\n\nfunction performanceNow(): number {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {}\n return 0;\n}\n\nfunction readPlatformNativeDeviceId(): {\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n} {\n if (typeof window === \"undefined\") return {};\n\n try {\n const adinfo = (window as any).webapis?.adinfo;\n if (adinfo) {\n const tifa: unknown =\n typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat: unknown =\n typeof adinfo.isLATEnabled === \"function\"\n ? adinfo.isLATEnabled()\n : undefined;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...(typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}),\n };\n }\n }\n } catch {}\n\n try {\n const webOSDev = (window as any).webOSDev;\n if (webOSDev) {\n const lgudid: unknown =\n typeof webOSDev.LGUDID === \"function\"\n ? webOSDev.LGUDID()\n : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {}\n\n try {\n const roku = (window as any).Roku;\n if (roku) {\n const rida: unknown =\n typeof roku.getPublisherUniqueId === \"function\"\n ? roku.getPublisherUniqueId()\n : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {}\n\n return {};\n}\n\nconst ZEROED_AD_ID_PATTERNS: ReadonlySet<string> = new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\",\n]);\n\nfunction isMacroPlaceholder(value: string): boolean {\n const t = value.trim();\n return !t ||\n /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) ||\n /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) ||\n ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\n\nfunction isZeroedAdId(value: string): boolean {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\n\nfunction readNativeBridgeSignals(): {\n contentUrl?: string;\n appId?: string;\n appName?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n} {\n if (typeof window === \"undefined\") {\n return {};\n }\n\n const candidates = [\n (window as any).__STORMCLOUD_CTV_AD_INFO__,\n (window as any).__STORMCLOUD_CTV__,\n (window as any).stormcloudCtv,\n (window as any).AiryTV,\n (window as any).Android,\n (window as any).webOS,\n (window as any).tizen,\n (window as any).amazon,\n ].filter(Boolean);\n\n for (const source of candidates) {\n const contentUrl =\n readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) ||\n undefined;\n const appId =\n readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) ||\n undefined;\n const appName =\n readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || undefined;\n const deviceId =\n readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\",\n ]) || undefined;\n\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n\n const deviceIdType =\n readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\",\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\",\n ]);\n\n return {\n ...(contentUrl ? { contentUrl } : {}),\n ...(appId ? { appId } : {}),\n ...(appName ? { appName } : {}),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceId && deviceIdType ? { deviceIdType } : {}),\n ...(deviceId && limitAdTracking != null ? { limitAdTracking } : {}),\n };\n }\n\n return {};\n}\n\nfunction readBridgeValue(source: any, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction readBridgeBoolean(source: any, keys: string[]): boolean | undefined {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {}\n }\n }\n return undefined;\n}\n\nfunction readStoredDeviceId(): string | undefined {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction readStoredString(key: string): string | undefined {\n if (typeof window === \"undefined\") {\n return undefined;\n }\n\n try {\n const value = window.localStorage?.getItem(key);\n return value || undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction readStoredLimitAdTracking(): boolean | undefined {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") ||\n readStoredString(\"limitedAdTracking\") ||\n readStoredString(\"is_lat\")\n );\n}\n\nfunction normalizeBoolean(value: unknown): boolean | undefined {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return undefined;\n}\n","import type {\n ClientInfo,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n PlayerAnalyticsContext,\n StormcloudVideoPlayerConfig,\n} from \"../types\";\n\nimport {\n ingestPlayerTracking,\n isTrackingIngestEnabled,\n} from \"./trackingIngest\";\nimport {\n getOrCreateStoredUuid,\n PLAYER_ID_STORAGE_KEY,\n resolveNativeDeviceId,\n} from \"./vastEnvironmentSignals\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function buildAnalyticsContext(\n config: Pick<StormcloudVideoPlayerConfig, \"debugAdTiming\" | \"isLiveStream\">\n): PlayerAnalyticsContext {\n const context: PlayerAnalyticsContext = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== undefined) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\n\nexport function getClientInfo(): ClientInfo {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = (navigator as any).deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: (screen?.orientation as any)?.type || \"\",\n pixelDepth: screen?.pixelDepth,\n };\n\n let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch\n ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n ) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n ) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n if (\n ua.includes(\"Android\") &&\n (maxTouchPoints === 0 ||\n ua.includes(\"Google TV\") ||\n ua.includes(\"XiaoMi\"))\n ) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n\n isWebApp =\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n (window.navigator as any).standalone === true ||\n window.screen?.orientation?.angle !== undefined;\n\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState,\n };\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n let encodedData: BufferSource;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer))\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\n\nfunction resolvePlayerIdentitySeed(clientInfo: ClientInfo): string {\n const nativeDeviceId = resolveNativeDeviceId();\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\n\ntype PlayerMetricFlags = {\n adLoaded?: boolean;\n adDetect?: boolean;\n captureAt?: string;\n};\n\nfunction canPublish(licenseKey: string | undefined): licenseKey is string {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\n\nasync function buildPlayerMetricEvent(\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<Record<string, unknown>> {\n const clientInfo = getClientInfo();\n\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n\n const playerId = await getBrowserID(clientInfo);\n\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n\n const captureAt = flags.captureAt ?? new Date().toISOString();\n\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...(context.inputStreamType\n ? { input_stream_type: context.inputStreamType }\n : {}),\n };\n}\n\nexport async function sendInitialTracking(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false,\n });\n\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent],\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendAdDetectTracking(\n licenseKey: string | undefined,\n adDetectInfo: AdDetectInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n adLoadedInfo: AdLoadedInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n adImpressionInfo: AdImpressionInfo,\n context: PlayerAnalyticsContext = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp,\n });\n\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent],\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp,\n },\n ],\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(\n licenseKey?: string,\n context: PlayerAnalyticsContext = {},\n flags: PlayerMetricFlags = {}\n): Promise<void> {\n if (!canPublish(licenseKey)) return;\n\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData],\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n","export function polyfillURLSearchParams(): void {\n if (typeof URLSearchParams !== 'undefined') {\n return;\n }\n\n class URLSearchParamsPolyfill {\n private params: Map<string, string[]>;\n\n constructor(init?: string | URLSearchParamsPolyfill) {\n this.params = new Map();\n\n if (typeof init === 'string') {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n\n private parseQueryString(query: string): void {\n const cleanQuery = query.startsWith('?') ? query.slice(1) : query;\n if (!cleanQuery) return;\n\n cleanQuery.split('&').forEach((param) => {\n const [key, value] = param.split('=');\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : '';\n this.append(decodedKey, decodedValue);\n }\n });\n }\n\n private safeDecodeURIComponent(str: string): string {\n try {\n return decodeURIComponent(str.replace(/\\+/g, ' '));\n } catch (e) {\n return str;\n }\n }\n\n append(name: string, value: string): void {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n\n delete(name: string): void {\n this.params.delete(name);\n }\n\n get(name: string): string | null {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== undefined ? values[0] : null;\n }\n\n getAll(name: string): string[] {\n return this.params.get(name) || [];\n }\n\n has(name: string): boolean {\n return this.params.has(name);\n }\n\n set(name: string, value: string): void {\n this.params.set(name, [String(value)]);\n }\n\n forEach(callback: (value: string, key: string, parent: URLSearchParamsPolyfill) => void): void {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n\n toString(): string {\n const parts: string[] = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join('&');\n }\n }\n\n // @ts-ignore\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\n\nexport function polyfillTextEncoder(): void {\n if (typeof TextEncoder !== 'undefined') {\n return;\n }\n\n class TextEncoderPolyfill {\n encoding = 'utf-8';\n\n encode(str: string): Uint8Array {\n const utf8: number[] = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 0x80) {\n utf8.push(charcode);\n } else if (charcode < 0x800) {\n utf8.push(0xc0 | (charcode >> 6), 0x80 | (charcode & 0x3f));\n } else if (charcode < 0xd800 || charcode >= 0xe000) {\n utf8.push(\n 0xe0 | (charcode >> 12),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n } else {\n i++;\n charcode = 0x10000 + (((charcode & 0x3ff) << 10) | (str.charCodeAt(i) & 0x3ff));\n utf8.push(\n 0xf0 | (charcode >> 18),\n 0x80 | ((charcode >> 12) & 0x3f),\n 0x80 | ((charcode >> 6) & 0x3f),\n 0x80 | (charcode & 0x3f)\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n\n // @ts-ignore\n window.TextEncoder = TextEncoderPolyfill;\n}\n\nexport function polyfillPromiseFinally(): void {\n if (typeof Promise !== 'undefined' && !Promise.prototype.finally) {\n Promise.prototype.finally = function (callback: () => void) {\n const constructor = this.constructor as PromiseConstructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) =>\n constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\n\nexport function polyfillObjectAssign(): void {\n if (typeof Object.assign !== 'function') {\n Object.assign = function (target: any, ...sources: any[]) {\n if (target == null) {\n throw new TypeError('Cannot convert undefined or null to object');\n }\n\n const to = Object(target);\n\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n\n return to;\n };\n }\n}\n\nexport function polyfillArrayFrom(): void {\n if (!Array.from) {\n Array.from = function (arrayLike: any, mapFn?: any, thisArg?: any) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError('Array.from requires an array-like object');\n }\n\n const len = items.length >>> 0;\n const result = new Array(len);\n\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n\n return result;\n };\n }\n}\n\nexport function polyfillStringStartsWith(): void {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function (search: string, pos?: number) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\n\nexport function polyfillStringEndsWith(): void {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function (search: string, length?: number) {\n if (length === undefined || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\n\nexport function polyfillStringIncludes(): void {\n if (!String.prototype.includes) {\n String.prototype.includes = function (search: string, start?: number) {\n if (typeof start !== 'number') {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\n\nexport function initializePolyfills(): void {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n","import {\n inferDeviceIdType,\n isEquivalentDeviceIdType,\n} from \"./vastEnvironmentSignals\";\n\nexport interface VastConsentSignals {\n gdpr?: string | undefined;\n gdprConsent?: string | undefined;\n usPrivacy?: string | undefined;\n}\n\nexport interface VastMacroContext {\n correlator: string;\n streamCorrelator: string;\n pod?: number | undefined;\n podMaxAds?: number | undefined;\n podMinDurationMs?: number | undefined;\n podMaxDurationMs?: number | undefined;\n isCtv?: boolean | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n sessionId?: string | undefined;\n deviceId?: string | undefined;\n deviceIdType?: string | undefined;\n limitAdTracking?: boolean | undefined;\n deviceTypeHint?: number | undefined;\n adTest?: boolean | undefined;\n programTitle?: string | undefined;\n consent?: VastConsentSignals | undefined;\n}\n\nconst UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nconst INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nconst EXAMPLE_COM_URL = /example\\.com/i;\nconst CTV_UNSUPPORTED_PARAMS = [\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\",\n];\n\nconst INLINE_DEVICE_MACRO_REPLACEMENTS: Array<{\n pattern: RegExp;\n getValue: (ctx: VastMacroContext) => string | undefined;\n}> = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) =>\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) =>\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator },\n];\n\nexport function isMacroPlaceholder(value: string | null | undefined): boolean {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\n\nexport function generateCorrelator(): string {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 0x200000 + ((buf[1] ?? 0) & 0x1fffff);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\n\nfunction expandInlineMacroPlaceholders(baseUrl: string, ctx: VastMacroContext): string {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\n\nfunction applyDeviceIdentityParams(\n params: URLSearchParams,\n ctx: VastMacroContext\n): void {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue =\n ctx.limitAdTracking != null ? (ctx.limitAdTracking ? \"1\" : \"0\") : undefined;\n\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder(tagLat) ? \"0\" : tagLat!));\n return;\n }\n\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));\n\n if (\n tagRdidValid &&\n tagTypeValid &&\n runtimeType &&\n !isEquivalentDeviceIdType(tagType!, runtimeType)\n ) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n\n if (tagRdidValid) {\n if (isMacroPlaceholder(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\n\nfunction removeBrokenAppNameOrphans(\n params: URLSearchParams,\n appName?: string\n): void {\n const toDelete: string[] = [];\n\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.replace(/^\\s+/, \"\");\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\n\nexport function normalizeVastTagUrl(raw: string): string {\n if (!raw) return raw;\n\n try {\n const url = new URL(raw);\n\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments: string[] = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.replace(/\\s+$/, \"\"), ...orphanFragments]\n .filter(Boolean)\n .join(\" & \");\n\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\n\nexport function applyVastMacros(\n baseUrl: string,\n ctx: VastMacroContext\n): string {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url: URL;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n\n const params = url.searchParams;\n\n removeBrokenAppNameOrphans(params);\n\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n }\n\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n\n params.delete(\"ppos\");\n params.delete(\"lip\");\n if (ctx.podMinDurationMs != null) {\n params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n }\n if (ctx.podMaxDurationMs != null) {\n params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n }\n if (ctx.podMaxAds != null) {\n params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n }\n\n if (!ctx.isCtv && ctx.pageUrl) {\n params.set(\"url\", ctx.pageUrl);\n params.set(\"description_url\", ctx.pageUrl);\n }\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n\n applyDeviceIdentityParams(params, ctx);\n\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n\n if (ctx.programTitle) {\n params.set(\"ct_ti\", ctx.programTitle);\n }\n\n const staleKeys: string[] = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n\n removeBrokenAppNameOrphans(params);\n\n return url.toString();\n}\n\nfunction replaceCorrelatorFallback(baseUrl: string, correlator: string): string {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\n\nexport function fetchConsentSignals(\n timeoutMs: number = 1500\n): Promise<VastConsentSignals> {\n const signals: VastConsentSignals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n\n const tasks: Promise<void>[] = [];\n\n const tcfApi = (window as any).__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData: any, success: boolean) => {\n if (settled) return;\n if (\n success &&\n tcData &&\n (tcData.eventStatus === \"tcloaded\" ||\n tcData.eventStatus === \"useractioncomplete\")\n ) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {}, tcData.listenerId);\n } catch {}\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n\n const uspApi = (window as any).__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise<void>((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data: any, success: boolean) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n\n return Promise.all(tasks).then(() => signals);\n}\n","import type { Scte35Marker, Id3TagInfo } from \"../types\";\n\nexport function parseCueOutDuration(value: string): number | undefined {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match =\n value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) ||\n value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const dStr = match[1];\n const d = parseFloat(dStr);\n return Number.isNaN(d) ? undefined : d;\n }\n return undefined;\n}\n\nexport function parseCueOutCont(\n value: string\n): { elapsed?: number; duration?: number } | undefined {\n const res: { elapsed?: number; duration?: number } = {};\n\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n\n if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n if (slashMatch && slashMatch[1] && slashMatch[2]) {\n const elapsed = parseFloat(slashMatch[1]);\n const duration = parseFloat(slashMatch[2]);\n if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n }\n }\n\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return undefined;\n}\n\nexport function parseAttributeList(value: string): Record<string, string> {\n const attrs: Record<string, string> = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(value)) !== null) {\n const key: string = (match[1] ?? \"\") as string;\n let rawVal: string = (match[3] ?? match[4] ?? \"\") as string;\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n}\n\nexport function toNumber(val: unknown): number | undefined {\n if (val == null) return undefined;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? undefined : n;\n}\n\nexport function isManifestBasedMarker(marker: Scte35Marker): boolean {\n const raw = marker.raw as any;\n if (!raw) return false;\n\n if (raw.tag) {\n const tag = String(raw.tag);\n return (\n tag.includes(\"EXT-X-CUE-OUT\") ||\n tag.includes(\"EXT-X-CUE-IN\") ||\n tag.includes(\"EXT-X-DATERANGE\")\n );\n }\n\n if (raw.id3) return false;\n\n if (raw.splice_command_type) return false;\n\n return false;\n}\n\nexport function decodeId3ValueToText(value: string | Uint8Array): string | undefined {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++)\n out += String.fromCharCode(value[i]!);\n return out;\n } catch {\n return undefined;\n }\n}\n\nexport function getFragmentStartSeconds(frag: any): number | undefined {\n const candidates = [frag?.start, frag?.startPTS];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return undefined;\n}\n\nexport function parseScte35FromId3(tag: Id3TagInfo): Scte35Marker | undefined {\n const text = decodeId3ValueToText(tag.value);\n if (!text) return undefined;\n\n const cueOutMatch =\n text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) ||\n text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = parseCueOutDuration(arg);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(dur !== undefined ? { durationSeconds: dur } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = parseCueOutCont(arg);\n const marker: Scte35Marker = {\n type: \"progress\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n ...(cont?.duration !== undefined\n ? { durationSeconds: cont.duration }\n : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n const marker: Scte35Marker = {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n if (daterangeMatch) {\n const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n const hasScteOut =\n \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n const hasScteIn =\n \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined\n ? { ptsSeconds: tag.ptsSeconds }\n : {}),\n ...(duration !== undefined ? { durationSeconds: duration } : {}),\n raw: { id3: text, attrs },\n } as Scte35Marker;\n return marker;\n }\n if (hasScteIn) {\n const marker: Scte35Marker = {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined\n ? { ptsSeconds: tag.ptsSeconds }\n : {}),\n raw: { id3: text, attrs },\n } as Scte35Marker;\n return marker;\n }\n }\n\n if (/SCTE35-OUT/i.test(text)) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n if (/SCTE35-IN/i.test(text)) {\n const marker: Scte35Marker = {\n type: \"end\",\n ...(tag.ptsSeconds !== undefined ? { ptsSeconds: tag.ptsSeconds } : {}),\n raw: { id3: text },\n } as Scte35Marker;\n return marker;\n }\n\n if (tag.value instanceof Uint8Array) {\n const bin = parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n\n return undefined;\n}\n\nexport function normalizeFragmentPayload(payload: unknown): Uint8Array | undefined {\n if (payload instanceof Uint8Array) {\n return payload;\n }\n if (payload instanceof ArrayBuffer) {\n return new Uint8Array(payload);\n }\n if (ArrayBuffer.isView(payload)) {\n const view = payload as ArrayBufferView;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n return undefined;\n}\n\n// --- Transport Stream SCTE-35 parsing ---\n\nexport function detectTsPacketFormat(\n data: Uint8Array\n): { offset: number; packetSize: number; tsPayloadOffset: number } | undefined {\n const packetSizes = [188, 192, 204];\n for (const packetSize of packetSizes) {\n const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n for (let offset = 0; offset < packetSize; offset++) {\n let matchedPackets = 0;\n for (\n let packetStart = offset;\n packetStart + tsPayloadOffset < data.length &&\n matchedPackets < 5;\n packetStart += packetSize\n ) {\n if (data[packetStart + tsPayloadOffset] !== 0x47) {\n break;\n }\n matchedPackets++;\n }\n if (matchedPackets >= 2) {\n return { offset, packetSize, tsPayloadOffset };\n }\n }\n }\n return undefined;\n}\n\nfunction getPsiSectionStart(\n payload: Uint8Array,\n payloadUnitStart: boolean\n): number | undefined {\n if (!payloadUnitStart) {\n return undefined;\n }\n const pointerField = payload[0];\n if (pointerField == null) {\n return undefined;\n }\n const sectionStart = 1 + pointerField;\n return sectionStart < payload.length ? sectionStart : undefined;\n}\n\nfunction getPsiSectionLength(data: Uint8Array, offset: number): number {\n return (((data[offset + 1] ?? 0) & 0x0f) << 8) | (data[offset + 2] ?? 0);\n}\n\nfunction parsePatSection(\n payload: Uint8Array,\n payloadUnitStart: boolean,\n pmtPids: Set<number>\n): void {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 8 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0x00) {\n return;\n }\n\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n\n for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n const programNumber =\n ((payload[offset] ?? 0) << 8) | (payload[offset + 1] ?? 0);\n const pid =\n (((payload[offset + 2] ?? 0) & 0x1f) << 8) |\n (payload[offset + 3] ?? 0);\n if (programNumber !== 0) {\n pmtPids.add(pid);\n }\n }\n}\n\nfunction descriptorsIdentifyScte35(\n data: Uint8Array,\n start: number,\n end: number\n): boolean {\n let offset = start;\n while (offset + 2 <= end) {\n const tag = data[offset] ?? 0;\n const length = data[offset + 1] ?? 0;\n const descriptorStart = offset + 2;\n const descriptorEnd = descriptorStart + length;\n if (descriptorEnd > end) {\n return false;\n }\n\n const registration =\n length >= 4\n ? String.fromCharCode(\n data[descriptorStart] ?? 0,\n data[descriptorStart + 1] ?? 0,\n data[descriptorStart + 2] ?? 0,\n data[descriptorStart + 3] ?? 0\n )\n : \"\";\n if (tag === 0x8a || registration === \"CUEI\" || registration === \"SCTE\") {\n return true;\n }\n\n offset = descriptorEnd;\n }\n return false;\n}\n\nfunction parsePmtSection(\n payload: Uint8Array,\n payloadUnitStart: boolean,\n tsScte35Pids: Set<number>\n): void {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 12 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0x02) {\n return;\n }\n\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n const programInfoLength =\n (((payload[sectionStart + 10] ?? 0) & 0x0f) << 8) |\n (payload[sectionStart + 11] ?? 0);\n\n let offset = sectionStart + 12 + programInfoLength;\n while (offset + 5 <= sectionEnd - 4) {\n const streamType = payload[offset] ?? 0;\n const elementaryPid =\n (((payload[offset + 1] ?? 0) & 0x1f) << 8) |\n (payload[offset + 2] ?? 0);\n const esInfoLength =\n (((payload[offset + 3] ?? 0) & 0x0f) << 8) |\n (payload[offset + 4] ?? 0);\n const descriptorStart = offset + 5;\n const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n\n if (\n streamType === 0x86 ||\n (streamType === 0x06 &&\n descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd))\n ) {\n tsScte35Pids.add(elementaryPid);\n }\n\n offset = descriptorStart + esInfoLength;\n }\n}\n\nfunction hasProcessedTsScte35Section(\n section: Uint8Array,\n processedSections: Set<string>\n): boolean {\n let checksum = 0;\n for (let i = 0; i < section.length; i++) {\n checksum = (checksum * 31 + (section[i] ?? 0)) >>> 0;\n }\n\n const key = `${section.length}:${checksum}`;\n if (processedSections.has(key)) {\n return true;\n }\n\n processedSections.add(key);\n if (processedSections.size > 200) {\n const firstKey = processedSections.values().next().value;\n if (firstKey) {\n processedSections.delete(firstKey);\n }\n }\n return false;\n}\n\nfunction addScte35SectionMarker(\n section: Uint8Array,\n markers: Scte35Marker[],\n processedSections: Set<string>\n): void {\n if (section[0] !== 0xfc || hasProcessedTsScte35Section(section, processedSections)) {\n return;\n }\n\n const marker = parseScte35Binary(section);\n if (!marker) {\n return;\n }\n\n marker.raw = {\n ...(typeof marker.raw === \"object\" && marker.raw ? marker.raw : {}),\n source: \"ts-packet\",\n };\n markers.push(marker);\n}\n\nfunction appendScte35Bytes(\n pid: number,\n bytes: Uint8Array,\n assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n markers: Scte35Marker[],\n processedSections: Set<string>\n): void {\n const assembler = assemblers.get(pid);\n if (!assembler) {\n return;\n }\n\n for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n assembler.bytes.push(bytes[i] ?? 0);\n }\n\n if (assembler.bytes.length >= assembler.expectedLength) {\n assemblers.delete(pid);\n addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n }\n}\n\nfunction collectScte35SectionsFromPayload(\n pid: number,\n payload: Uint8Array,\n payloadUnitStart: boolean,\n assemblers: Map<number, { bytes: number[]; expectedLength: number }>,\n markers: Scte35Marker[],\n processedSections: Set<string>\n): void {\n if (payload.length === 0) {\n return;\n }\n\n let offset = 0;\n if (payloadUnitStart) {\n const pointerField = payload[0] ?? 0;\n const previousAssembler = assemblers.get(pid);\n if (previousAssembler && pointerField > 0) {\n appendScte35Bytes(\n pid,\n payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n assemblers,\n markers,\n processedSections\n );\n }\n assemblers.delete(pid);\n offset = 1 + pointerField;\n } else {\n appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n return;\n }\n\n while (offset + 3 <= payload.length) {\n const tableId = payload[offset];\n if (tableId == null || tableId === 0xff) {\n return;\n }\n\n const sectionLength = getPsiSectionLength(payload, offset);\n const totalLength = 3 + sectionLength;\n if (sectionLength <= 0 || totalLength <= 3) {\n return;\n }\n\n if (offset + totalLength <= payload.length) {\n addScte35SectionMarker(\n payload.subarray(offset, offset + totalLength),\n markers,\n processedSections\n );\n offset += totalLength;\n } else {\n assemblers.set(pid, {\n bytes: Array.from(payload.subarray(offset)),\n expectedLength: totalLength,\n });\n return;\n }\n }\n}\n\nexport function parseScte35FromTsPackets(\n data: Uint8Array,\n tsScte35Pids: Set<number>,\n pmtPids: Set<number>,\n processedSections: Set<string>\n): Scte35Marker[] {\n const packetInfo = detectTsPacketFormat(data);\n if (!packetInfo) {\n return [];\n }\n\n const markers: Scte35Marker[] = [];\n const sectionAssemblers = new Map<\n number,\n { bytes: number[]; expectedLength: number }\n >();\n\n for (\n let packetStart = packetInfo.offset;\n packetStart + packetInfo.packetSize <= data.length;\n packetStart += packetInfo.packetSize\n ) {\n const tsStart = packetStart + packetInfo.tsPayloadOffset;\n if (data[tsStart] !== 0x47) {\n continue;\n }\n\n const secondByte = data[tsStart + 1];\n const thirdByte = data[tsStart + 2];\n const fourthByte = data[tsStart + 3];\n if (\n secondByte == null ||\n thirdByte == null ||\n fourthByte == null ||\n (secondByte & 0x80) !== 0\n ) {\n continue;\n }\n\n const payloadUnitStart = (secondByte & 0x40) !== 0;\n const pid = ((secondByte & 0x1f) << 8) | thirdByte;\n const adaptationFieldControl = (fourthByte >> 4) & 0x03;\n const hasPayload =\n adaptationFieldControl === 1 || adaptationFieldControl === 3;\n if (!hasPayload) {\n continue;\n }\n\n let payloadStart = tsStart + 4;\n if (adaptationFieldControl === 3) {\n const adaptationLength = data[payloadStart];\n if (adaptationLength == null) {\n continue;\n }\n payloadStart += 1 + adaptationLength;\n }\n\n const payloadEnd = Math.min(tsStart + 188, data.length);\n if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n continue;\n }\n\n const payload = data.subarray(payloadStart, payloadEnd);\n if (pid === 0) {\n parsePatSection(payload, payloadUnitStart, pmtPids);\n } else if (pmtPids.has(pid)) {\n parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n } else if (tsScte35Pids.has(pid)) {\n collectScte35SectionsFromPayload(\n pid,\n payload,\n payloadUnitStart,\n sectionAssemblers,\n markers,\n processedSections\n );\n }\n }\n\n return markers;\n}\n\n// --- Binary SCTE-35 parsing ---\n\nclass BitReader {\n private bytePos = 0;\n private bitPos = 0;\n constructor(private readonly buf: Uint8Array) {}\n readBits(numBits: number): number {\n let result = 0;\n while (numBits > 0) {\n if (this.bytePos >= this.buf.length) return result;\n const remainingInByte = 8 - this.bitPos;\n const toRead = Math.min(numBits, remainingInByte);\n const currentByte = this.buf[this.bytePos]!;\n const shift = remainingInByte - toRead;\n const mask = ((1 << toRead) - 1) & 0xff;\n const bits = (currentByte >> shift) & mask;\n result = (result << toRead) | bits;\n this.bitPos += toRead;\n if (this.bitPos >= 8) {\n this.bitPos = 0;\n this.bytePos += 1;\n }\n numBits -= toRead;\n }\n return result >>> 0;\n }\n skipBits(n: number): void {\n this.readBits(n);\n }\n get bytePosition(): number {\n return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n }\n}\n\nfunction readSpliceTime(\n r: BitReader,\n ptsAdjustmentTicks: number\n): number | undefined {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (!timeSpecifiedFlag) {\n r.readBits(7);\n return undefined;\n }\n r.readBits(6);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const ptsTicks =\n (high * 0x100000000 + low + ptsAdjustmentTicks) % 0x200000000;\n return ptsTicks / 90000;\n}\n\nfunction markerTypeFromSegmentationTypeId(\n segmentationTypeId: number\n): Scte35Marker[\"type\"] | undefined {\n switch (segmentationTypeId) {\n case 0x10:\n case 0x22:\n case 0x30:\n case 0x32:\n case 0x34:\n case 0x36:\n return \"start\";\n case 0x11:\n case 0x23:\n case 0x31:\n case 0x33:\n case 0x35:\n case 0x37:\n return \"end\";\n default:\n return undefined;\n }\n}\n\nfunction parseScte35SegmentationDescriptor(\n descriptor: Uint8Array\n):\n | {\n type: Scte35Marker[\"type\"];\n durationSeconds?: number;\n segmentationEventId?: number;\n }\n | undefined {\n if (descriptor.length < 11) {\n return undefined;\n }\n\n const identifier = String.fromCharCode(\n descriptor[0] ?? 0,\n descriptor[1] ?? 0,\n descriptor[2] ?? 0,\n descriptor[3] ?? 0\n );\n if (identifier !== \"CUEI\") {\n return undefined;\n }\n\n const segmentationEventId =\n ((descriptor[4] ?? 0) * 0x1000000) +\n ((descriptor[5] ?? 0) << 16) +\n ((descriptor[6] ?? 0) << 8) +\n (descriptor[7] ?? 0);\n const cancelIndicator = ((descriptor[8] ?? 0) & 0x80) !== 0;\n if (cancelIndicator) {\n return undefined;\n }\n\n const flags = descriptor[9] ?? 0;\n const programSegmentationFlag = (flags & 0x80) !== 0;\n const segmentationDurationFlag = (flags & 0x40) !== 0;\n let offset = 10;\n\n if (!programSegmentationFlag) {\n const componentCount = descriptor[offset] ?? 0;\n offset += 1 + componentCount * 6;\n if (offset > descriptor.length) {\n return undefined;\n }\n }\n\n let durationSeconds: number | undefined = undefined;\n if (segmentationDurationFlag) {\n if (offset + 5 > descriptor.length) {\n return undefined;\n }\n const durationTicks =\n ((descriptor[offset] ?? 0) * 0x100000000) +\n ((descriptor[offset + 1] ?? 0) * 0x1000000) +\n ((descriptor[offset + 2] ?? 0) << 16) +\n ((descriptor[offset + 3] ?? 0) << 8) +\n (descriptor[offset + 4] ?? 0);\n durationSeconds = durationTicks / 90000;\n offset += 5;\n }\n\n if (offset + 2 > descriptor.length) {\n return undefined;\n }\n offset += 1;\n const segmentationUpidLength = descriptor[offset] ?? 0;\n offset += 1 + segmentationUpidLength;\n if (offset >= descriptor.length) {\n return undefined;\n }\n\n const segmentationTypeId = descriptor[offset] ?? 0;\n const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n if (!markerType) {\n return undefined;\n }\n\n return {\n type: markerType,\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n segmentationEventId,\n };\n}\n\nfunction parseScte35SegmentationDescriptors(\n data: Uint8Array,\n offset: number\n):\n | {\n type: Scte35Marker[\"type\"];\n durationSeconds?: number;\n segmentationEventId?: number;\n }\n | undefined {\n if (offset + 2 > data.length) {\n return undefined;\n }\n\n const descriptorLoopLength =\n ((data[offset] ?? 0) << 8) | (data[offset + 1] ?? 0);\n let descriptorOffset = offset + 2;\n const descriptorEnd = Math.min(\n data.length,\n descriptorOffset + descriptorLoopLength\n );\n\n while (descriptorOffset + 2 <= descriptorEnd) {\n const descriptorTag = data[descriptorOffset] ?? 0;\n const descriptorLength = data[descriptorOffset + 1] ?? 0;\n const descriptorDataStart = descriptorOffset + 2;\n const descriptorDataEnd = descriptorDataStart + descriptorLength;\n if (descriptorDataEnd > descriptorEnd) {\n return undefined;\n }\n\n if (descriptorTag === 0x02) {\n const descriptorMarker = parseScte35SegmentationDescriptor(\n data.subarray(descriptorDataStart, descriptorDataEnd)\n );\n if (descriptorMarker) {\n return descriptorMarker;\n }\n }\n\n descriptorOffset = descriptorDataEnd;\n }\n\n return undefined;\n}\n\nexport function parseScte35Binary(data: Uint8Array): Scte35Marker | undefined {\n const r = new BitReader(data);\n const tableId = r.readBits(8);\n if (tableId !== 0xfc) return undefined;\n r.readBits(1);\n r.readBits(1);\n r.readBits(2);\n const sectionLength = r.readBits(12);\n if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n return undefined;\n }\n r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n const ptsAdjustmentTicks = ptsAdjHigh * 0x100000000 + ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n\n let markerType: Scte35Marker[\"type\"] | undefined;\n let durationSeconds: number | undefined = undefined;\n let ptsSeconds: number | undefined = undefined;\n let spliceEventId: number | undefined = undefined;\n const commandBodyStart = r.bytePosition;\n\n if (spliceCommandType === 5) {\n spliceEventId = r.readBits(32);\n const cancel = r.readBits(1) === 1;\n r.readBits(7);\n if (cancel) return undefined;\n const outOfNetwork = r.readBits(1) === 1;\n const programSpliceFlag = r.readBits(1) === 1;\n const durationFlag = r.readBits(1) === 1;\n const spliceImmediateFlag = r.readBits(1) === 1;\n r.readBits(4);\n markerType = outOfNetwork ? \"start\" : \"end\";\n\n if (programSpliceFlag && !spliceImmediateFlag) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else if (!programSpliceFlag) {\n const componentCount = r.readBits(8);\n for (let i = 0; i < componentCount; i++) {\n r.readBits(8);\n if (!spliceImmediateFlag) {\n const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n if (ptsSeconds === undefined) {\n ptsSeconds = componentPtsSeconds;\n }\n }\n }\n }\n\n if (durationFlag) {\n r.readBits(6);\n r.readBits(1);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const durationTicks = high * 0x100000000 + low;\n durationSeconds = durationTicks / 90000;\n }\n r.readBits(16);\n r.readBits(8);\n r.readBits(8);\n } else if (spliceCommandType === 6) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else {\n return undefined;\n }\n\n const expectedDescriptorOffset =\n spliceCommandLength === 0x0fff\n ? r.bytePosition\n : commandBodyStart + spliceCommandLength;\n const descriptorMarker = parseScte35SegmentationDescriptors(\n data,\n expectedDescriptorOffset\n );\n\n if (descriptorMarker) {\n markerType = descriptorMarker.type;\n if (durationSeconds === undefined) {\n durationSeconds = descriptorMarker.durationSeconds;\n }\n }\n\n if (!markerType) {\n return undefined;\n }\n\n const marker: Scte35Marker = {\n type: markerType,\n ...(ptsSeconds !== undefined ? { ptsSeconds } : {}),\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: {\n splice_command_type: spliceCommandType,\n ...(spliceEventId !== undefined ? { splice_event_id: spliceEventId } : {}),\n ...(descriptorMarker?.segmentationEventId !== undefined\n ? { segmentation_event_id: descriptorMarker.segmentationEventId }\n : {}),\n },\n } as Scte35Marker;\n return marker;\n}\n","import type { Scte35Marker } from \"../types\";\nimport type {\n NormalizedScte35Cue,\n Scte35CueContext,\n Scte35CueSource,\n Scte35CueReadiness,\n} from \"./playerTypes\";\nimport { getFragmentStartSeconds } from \"./Scte35Parser\";\n\nexport interface Scte35CueManagerCallbacks {\n onEarlyStartCue(marker: Scte35Marker, fragmentSn: number | undefined, cueKey: string): void;\n onPlaybackCue(marker: Scte35Marker, cueKey?: string): void;\n isInAdBreak(): boolean;\n}\n\nexport class Scte35CueManager {\n private readonly pendingScte35Cues: Map<string, NormalizedScte35Cue> = new Map();\n private readonly recentScte35CueKeys: Map<string, number> = new Map();\n private readonly recentScte35CueLimit: number = 200;\n private pendingScte35CueKeyValue: string | undefined;\n private activeScte35BreakKeyValue: string | undefined;\n private scheduledScte35BreakKeyValue: string | undefined;\n\n readonly tsScte35Pids: Set<number> = new Set();\n readonly pmtPids: Set<number> = new Set();\n readonly processedTsScte35Sections: Set<string> = new Set();\n\n private debug: boolean;\n private callbacks: Scte35CueManagerCallbacks;\n\n constructor(debug: boolean, callbacks: Scte35CueManagerCallbacks) {\n this.debug = debug;\n this.callbacks = callbacks;\n }\n\n get pendingScte35CueKey(): string | undefined {\n return this.pendingScte35CueKeyValue;\n }\n set pendingScte35CueKey(value: string | undefined) {\n this.pendingScte35CueKeyValue = value;\n }\n\n get activeScte35BreakKey(): string | undefined {\n return this.activeScte35BreakKeyValue;\n }\n set activeScte35BreakKey(value: string | undefined) {\n this.activeScte35BreakKeyValue = value;\n }\n\n get scheduledScte35BreakKey(): string | undefined {\n return this.scheduledScte35BreakKeyValue;\n }\n set scheduledScte35BreakKey(value: string | undefined) {\n this.scheduledScte35BreakKeyValue = value;\n }\n\n createScte35CueContext(\n source: Scte35CueSource,\n readiness: Scte35CueReadiness,\n frag?: any\n ): Scte35CueContext {\n const context: Scte35CueContext = { source, readiness };\n if (typeof frag?.sn === \"number\") {\n context.fragmentSn = frag.sn;\n }\n const fragmentStartSec = getFragmentStartSeconds(frag);\n if (fragmentStartSec !== undefined) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n return context;\n }\n\n onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void {\n const cue = this.createScte35Cue(marker, context);\n const pendingKey = this.getPendingScte35CueKey(cue);\n\n if (context.readiness === \"early\") {\n this.pendingScte35Cues.set(pendingKey, cue);\n this.trimRecentScte35CueMaps();\n\n if (marker.type === \"start\") {\n this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n }\n return;\n }\n\n if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n key: cue.key,\n activeScte35BreakKey: this.activeScte35BreakKeyValue,\n inAdBreak: this.callbacks.isInAdBreak(),\n source: cue.source,\n });\n }\n return;\n }\n\n if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n key: cue.key,\n source: cue.source,\n });\n }\n return;\n }\n\n this.pendingScte35Cues.delete(pendingKey);\n this.markScte35CueHandled(cue);\n this.callbacks.onPlaybackCue(marker, cue.key);\n }\n\n activatePendingScte35CuesForFragment(frag: any): void {\n const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : undefined;\n if (fragmentSn === undefined) {\n return;\n }\n\n const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n ([, cue]) => cue.fragmentSn === fragmentSn\n );\n\n matchingCues.forEach(([pendingKey, cue]) => {\n this.pendingScte35Cues.delete(pendingKey);\n const context: Scte35CueContext = {\n source: cue.source,\n readiness: \"playback\",\n };\n context.fragmentSn = fragmentSn;\n const fragmentStartSec =\n cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n if (fragmentStartSec !== undefined) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n this.onScte35Cue(cue.marker, context);\n });\n }\n\n private createScte35Cue(\n marker: Scte35Marker,\n context: Scte35CueContext\n ): NormalizedScte35Cue {\n const cue: NormalizedScte35Cue = {\n marker,\n source: context.source,\n readiness: context.readiness,\n key: this.getScte35CueKey(marker, context),\n };\n if (context.fragmentSn !== undefined) {\n cue.fragmentSn = context.fragmentSn;\n }\n if (context.fragmentStartSeconds !== undefined) {\n cue.fragmentStartSeconds = context.fragmentStartSeconds;\n }\n return cue;\n }\n\n private getScte35CueKey(\n marker: Scte35Marker,\n context: Scte35CueContext\n ): string {\n const raw = this.getScte35MarkerRaw(marker);\n const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n if (spliceEventId) {\n return `splice:${spliceEventId}`;\n }\n\n const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n if (segmentationEventId) {\n return `segmentation:${segmentationEventId}`;\n }\n\n const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n if (daterangeId) {\n return `daterange:${daterangeId}`;\n }\n\n const scteValue =\n this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) ||\n this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n if (scteValue) {\n return `daterange-scte:${scteValue}`;\n }\n\n if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n }\n\n if (context.fragmentSn !== undefined) {\n return `fragment:${context.fragmentSn}`;\n }\n\n return `${context.source}:wallclock:${Math.floor(Date.now() / 1000)}`;\n }\n\n private getPendingScte35CueKey(cue: NormalizedScte35Cue): string {\n return `${cue.marker.type}:${cue.key}:${\n cue.fragmentSn !== undefined ? cue.fragmentSn : \"unknown\"\n }`;\n }\n\n private getScte35MarkerRaw(marker: Scte35Marker): any {\n return typeof marker.raw === \"object\" && marker.raw !== null\n ? (marker.raw as any)\n : {};\n }\n\n private toIdentityString(value: unknown): string | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return undefined;\n }\n\n isStrongScte35CueKey(key: string | undefined): boolean {\n return !!(\n key &&\n (key.startsWith(\"splice:\") ||\n key.startsWith(\"segmentation:\") ||\n key.startsWith(\"daterange:\") ||\n key.startsWith(\"daterange-scte:\"))\n );\n }\n\n private hasRecentlyHandledScte35Cue(cue: NormalizedScte35Cue): boolean {\n if (\n this.activeScte35BreakKeyValue === cue.key ||\n this.scheduledScte35BreakKeyValue === cue.key\n ) {\n return true;\n }\n\n const recentKey = `${cue.marker.type}:${cue.key}`;\n return this.recentScte35CueKeys.has(recentKey);\n }\n\n private markScte35CueHandled(cue: NormalizedScte35Cue): void {\n this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n this.trimRecentScte35CueMaps();\n }\n\n private trimRecentScte35CueMaps(): void {\n while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n const firstKey = this.recentScte35CueKeys.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.recentScte35CueKeys.delete(firstKey);\n }\n\n while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n const firstKey = this.pendingScte35Cues.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.pendingScte35Cues.delete(firstKey);\n }\n }\n\n private shouldAcceptScte35EndCue(cue: NormalizedScte35Cue): boolean {\n if (!this.callbacks.isInAdBreak()) {\n return false;\n }\n\n if (\n this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) &&\n this.isStrongScte35CueKey(cue.key) &&\n this.activeScte35BreakKeyValue !== cue.key\n ) {\n return false;\n }\n\n return true;\n }\n}\n","import type {\n StormcloudVideoPlayerConfig,\n AdBreak,\n StormcloudApiResponse,\n AdController,\n} from \"../types\";\nimport type { PalNonceManager } from \"../sdk/pal\";\nimport { applyVastMacros, generateCorrelator, normalizeVastTagUrl } from \"../utils/vastMacros\";\nimport type { VastConsentSignals } from \"../utils/vastMacros\";\nimport { resolveVastEnvironmentSignals } from \"../utils/vastEnvironmentSignals\";\nimport { toDevSafeUrl } from \"../utils/devUrl\";\nimport {\n buildAnalyticsContext,\n sendHeartbeat,\n sendInitialTracking,\n} from \"../utils/tracking\";\n\nexport class AdConfigManager {\n vmapBreaks: AdBreak[] = [];\n consumedVmapBreakIds: Set<string> = new Set();\n apiVastTagUrl: string | undefined;\n apiNumberAds: number | undefined;\n readonly streamCorrelator: string = generateCorrelator();\n readonly viewCorrelator: string = generateCorrelator();\n consentSignals: VastConsentSignals = {};\n podCounter: number = 0;\n podAssignedByPrefetch: boolean = false;\n\n private lastHeartbeatTime: number = 0;\n private heartbeatInterval: number | undefined;\n\n private config: StormcloudVideoPlayerConfig;\n private video: HTMLVideoElement;\n\n constructor(config: StormcloudVideoPlayerConfig, video: HTMLVideoElement) {\n this.config = config;\n this.video = video;\n }\n\n get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n isVmapEnabled(): boolean {\n return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n }\n\n async fetchAdConfiguration(): Promise<void> {\n if (this.isVmapEnabled()) {\n await this.fetchAndParseVmap(this.config.vmapUrl!);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n }\n return;\n }\n\n const vastMode = this.config.vastMode || \"default\";\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n }\n\n if (vastMode === \"adstorm\") {\n if (!this.config.licenseKey) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n );\n }\n return;\n }\n\n const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n this.apiVastTagUrl = vastEndpoint;\n\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n vastEndpoint\n );\n }\n return;\n }\n\n if (this.config.vastTagUrl) {\n this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n return;\n }\n\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n apiUrl\n );\n }\n\n const headers: Record<string, string> = {};\n if (this.config.licenseKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n }\n\n const response = await fetch(apiUrl, { headers });\n if (!response.ok) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n );\n }\n return;\n }\n\n const data: StormcloudApiResponse = await response.json();\n\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n let decodedPayload = imaPayload;\n try {\n decodedPayload = decodeURIComponent(imaPayload);\n } catch {\n console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n }\n console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n } else {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n );\n }\n }\n\n const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n if (numberAds != null && numberAds > 0) {\n this.apiNumberAds = numberAds;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n this.apiNumberAds\n );\n }\n }\n }\n\n private async fetchAndParseVmap(vmapUrl: string): Promise<void> {\n if (!vmapUrl.trim()) {\n return;\n }\n\n try {\n const response = await fetch(vmapUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch VMAP (${response.status})`);\n }\n\n const vmapXml = await response.text();\n this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n this.consumedVmapBreakIds.clear();\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n vmapUrl\n );\n }\n } catch (error) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n }\n }\n }\n\n private parseVmapToBreaks(vmapXml: string): AdBreak[] {\n if (typeof DOMParser === \"undefined\") {\n return [];\n }\n\n const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n }\n return [];\n }\n\n const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(\n doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n );\n }\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n (el) => el.localName === \"AdBreak\"\n );\n }\n const parsed: AdBreak[] = [];\n\n adBreakNodes.forEach((node, index) => {\n const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n if (startTimeMs == null) {\n return;\n }\n\n let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n if (!adTagNode) {\n adTagNode =\n (node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") as Element | null) ??\n undefined;\n }\n const adTagUrl = (adTagNode?.textContent || \"\").trim();\n if (!adTagUrl) {\n return;\n }\n\n const breakId =\n node.getAttribute(\"breakId\") ||\n `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n parsed.push({\n id: breakId,\n startTimeMs,\n vastTagUrl: adTagUrl,\n });\n });\n\n parsed.sort((a, b) => {\n const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n return aStart - bStart;\n });\n\n return parsed;\n }\n\n private parseVmapTimeOffsetToMs(timeOffset: string): number | undefined {\n if (!timeOffset) {\n return undefined;\n }\n\n const normalized = timeOffset.trim().toLowerCase();\n if (normalized === \"start\") {\n return 0;\n }\n\n if (normalized === \"end\") {\n return -1;\n }\n\n const hms = timeOffset.match(\n /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n );\n if (hms) {\n const [, hh, mm, ss, ms = \"0\"] = hms;\n const hours = Number(hh);\n const minutes = Number(mm);\n const seconds = Number(ss);\n const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n return ((hours * 3600 + minutes * 60 + seconds) * 1000) + millis;\n }\n\n const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percent) {\n const ratio = Number(percent[1]) / 100;\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1000 * ratio);\n }\n return undefined;\n }\n\n return undefined;\n }\n\n getAdBreakKey(adBreak: AdBreak): string {\n if (adBreak.id) {\n return adBreak.id;\n }\n return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n }\n\n resolveBreakStartMs(adBreak: AdBreak): number | undefined {\n if (adBreak.startTimeMs >= 0) {\n return adBreak.startTimeMs;\n }\n\n if (adBreak.startTimeMs === -1) {\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1000);\n }\n }\n\n return undefined;\n }\n\n findCurrentOrNextBreak(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = this.vmapBreaks;\n let candidate: AdBreak | undefined;\n const tol = this.config.driftToleranceMs ?? 1000;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (\n breakStartMs <= nowMs + tol &&\n (candidate == null ||\n breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))\n ) {\n candidate = b;\n }\n }\n return candidate;\n }\n\n findBreakForTime(nowMs: number): AdBreak | undefined {\n const schedule: AdBreak[] = this.vmapBreaks;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n\n if (b.durationMs) {\n const end = breakStartMs + b.durationMs;\n if (nowMs >= breakStartMs && nowMs < end) {\n return b;\n }\n continue;\n }\n\n if (nowMs >= breakStartMs) {\n return b;\n }\n }\n return undefined;\n }\n\n selectVastTagsForBreak(b?: AdBreak): string[] | undefined {\n if (!b || !b.vastTagUrl) return undefined;\n if (b.vastTagUrl.includes(\",\")) {\n return b.vastTagUrl\n .split(\",\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n }\n return [b.vastTagUrl];\n }\n\n beginNewAdPod(): void {\n this.podCounter++;\n }\n\n private readonly defaultPodMaxAds: number = 6;\n private readonly defaultPodMaxDurationMs: number = 120000;\n\n resolvePodParams(breakDurationMs?: number): {\n maxAds: number;\n minDurationMs: number;\n maxDurationMs: number;\n } {\n const maxDurationMs =\n breakDurationMs != null && breakDurationMs > 0\n ? breakDurationMs\n : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0\n ? this.config.podMaxDurationMs\n : this.defaultPodMaxDurationMs;\n\n const maxAds =\n this.config.podMaxAds && this.config.podMaxAds > 0\n ? this.config.podMaxAds\n : this.apiNumberAds && this.apiNumberAds > 0\n ? this.apiNumberAds\n : this.defaultPodMaxAds;\n\n const minDurationMs =\n this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n\n return { maxAds, minDurationMs, maxDurationMs };\n }\n\n getPalDescriptionUrl(): string | undefined {\n if (!this.apiVastTagUrl) return undefined;\n try {\n const params = new URL(this.apiVastTagUrl).searchParams;\n return params.get(\"description_url\") || params.get(\"url\") || undefined;\n } catch {\n return undefined;\n }\n }\n\n generatePodVastUrl(\n baseUrl: string,\n podParams: { maxAds: number; minDurationMs: number; maxDurationMs: number },\n adPlayer: AdController,\n palNonce: PalNonceManager,\n inAdBreak: boolean\n ): string {\n const adWillPlayMuted = inAdBreak\n ? adPlayer.getOriginalMutedState()\n : this.video.muted;\n const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n\n const urlWithMacros = applyVastMacros(baseUrl, {\n correlator: this.viewCorrelator,\n streamCorrelator: this.streamCorrelator,\n pod: this.podCounter > 0 ? this.podCounter : undefined,\n podMaxAds: podParams.maxAds,\n podMinDurationMs: podParams.minDurationMs,\n podMaxDurationMs: podParams.maxDurationMs,\n isCtv: envSignals.isCtv,\n pageUrl:\n !envSignals.isCtv && typeof window !== \"undefined\"\n ? toDevSafeUrl(window.location.href)\n : undefined,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n sessionId: envSignals.sessionId,\n deviceId: envSignals.deviceId,\n deviceIdType: envSignals.deviceIdType,\n limitAdTracking: envSignals.limitAdTracking,\n deviceTypeHint: envSignals.deviceTypeHint,\n adTest: this.config.adTest,\n ...(this.config.programTitle\n ? { programTitle: this.config.programTitle }\n : {}),\n consent: this.consentSignals,\n });\n\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n finalUrl\n );\n return finalUrl;\n }\n\n // --- Tracking ---\n\n initializeTracking(): void {\n sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config))\n .then(() => {\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5000);\n })\n .catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5000);\n });\n }\n\n private sendHeartbeatIfNeeded(): void {\n const now = Date.now();\n if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 30000) {\n this.lastHeartbeatTime = now;\n sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n\n destroyTracking(): void {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = undefined;\n }\n }\n}\n","import type { AdController, StormcloudVideoPlayerConfig, Scte35Marker } from \"../types\";\n\nexport interface AdTimingCallbacks {\n onAdStopTimerFired(): void;\n onAdStartTimerFired(marker: Scte35Marker, cueKey: string | undefined): void;\n onWatchdogTimeout(): void;\n onFailsafeTimeout(): void;\n getAdState(): { inAdBreak: boolean; showAds: boolean; adPlaying: boolean };\n}\n\nexport class AdTimingService {\n private adStopTimerId: number | undefined;\n private adStartTimerId: number | undefined;\n private adFailsafeTimerId: number | undefined;\n private adRequestWatchdogId: number | undefined;\n private adRequestWatchdogToken: number | null = null;\n private adFailsafeToken: number | null = null;\n\n ptsDriftEmaMs = 0;\n expectedAdBreakDurationMs: number | undefined;\n currentAdBreakStartWallClockMs: number | undefined;\n scteAdBreakEndWallClockMs: number | undefined;\n adBreakPlayedDurationMs: number = 0;\n adBreakEpoch: number = 0;\n\n adRequestTokenCounter = 0;\n activeAdRequestToken: number | null = null;\n currentAdIndex: number = 0;\n totalAdsInBreak: number = 0;\n totalAdRequestsInBreak: number = 0;\n readonly maxTotalAdRequestsPerBreak: number = 10;\n lastAdRequestTime: number = 0;\n consecutiveFailures: number = 0;\n readonly maxConsecutiveFailures: number = 5;\n readonly minAdRequestIntervalMs: number = 3000;\n readonly backoffBaseMs: number = 1000;\n readonly maxBackoffMs: number = 15000;\n private readonly defaultMinRemainingMsToStartAd: number = 4000;\n\n failedVastUrls: Set<string> = new Set();\n temporaryFailureUrls: Map<string, number> = new Map();\n private readonly temporaryFailureCooldownMs: number = 30000;\n\n private globalConsecutiveNoFills: number = 0;\n private readonly globalNoFillThreshold: number = 3;\n private globalNoFillCooldownUntil: number = 0;\n private readonly globalNoFillBackoffBaseMs: number = 5000;\n private readonly globalNoFillBackoffMaxMs: number = 60000;\n private globalLastGamRequestTime: number = 0;\n private readonly globalMinGamIntervalMs: number = 3000;\n\n private config: StormcloudVideoPlayerConfig;\n private video: HTMLVideoElement;\n private callbacks: AdTimingCallbacks;\n\n constructor(\n config: StormcloudVideoPlayerConfig,\n video: HTMLVideoElement,\n callbacks: AdTimingCallbacks\n ) {\n this.config = config;\n this.video = video;\n this.callbacks = callbacks;\n }\n\n get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n // --- Ad stop timer ---\n\n scheduleAdStopCountdown(remainingMs: number): void {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.ensureAdStoppedByTimer();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.ensureAdStoppedByTimer();\n }, ms) as unknown as number;\n }\n\n clearAdStopTimer(): void {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = undefined;\n }\n }\n\n private ensureAdStoppedByTimer(): void {\n this.adStopTimerId = undefined;\n this.callbacks.onAdStopTimerFired();\n }\n\n // --- Ad start timer ---\n\n scheduleAdStartIn(\n delayMs: number,\n marker: Scte35Marker = { type: \"start\" } as Scte35Marker,\n cueKey?: string\n ): void {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n }, ms) as unknown as number;\n }\n\n clearAdStartTimer(): void {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = undefined;\n }\n }\n\n // --- PTS drift ---\n\n updatePtsDrift(ptsSecondsSample: number): void {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1000;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 60000) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n\n resolveScteBreakStartWallClockMs(marker: Scte35Marker): number {\n const nowWallClockMs = Date.now();\n if (typeof marker.ptsSeconds !== \"number\") {\n return nowWallClockMs;\n }\n\n const nowMs = this.video.currentTime * 1000;\n const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = marker.ptsSeconds * 1000 - estimatedCurrentPtsMs;\n if (!Number.isFinite(deltaMs)) {\n return nowWallClockMs;\n }\n\n return nowWallClockMs + Math.floor(deltaMs);\n }\n\n // --- Duration boundary ---\n\n setAdBreakDurationBoundary(durationMs: number | undefined): void {\n this.expectedAdBreakDurationMs = durationMs;\n if (\n durationMs != null &&\n this.currentAdBreakStartWallClockMs != null\n ) {\n this.scteAdBreakEndWallClockMs =\n this.currentAdBreakStartWallClockMs + durationMs;\n } else {\n this.scteAdBreakEndWallClockMs = undefined;\n }\n }\n\n scheduleAdStopAtBreakBoundary(): void {\n if (this.expectedAdBreakDurationMs == null) {\n return;\n }\n this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n }\n\n // --- Duration budget ---\n\n getWallClockRemainingAdMs(): number {\n const endWallClockMs = this.getAdBreakEndWallClockMs();\n if (endWallClockMs != null) {\n return Math.max(0, endWallClockMs - Date.now());\n }\n return 0;\n }\n\n getAdBreakEndWallClockMs(): number | undefined {\n if (this.scteAdBreakEndWallClockMs != null) {\n return this.scteAdBreakEndWallClockMs;\n }\n if (\n this.expectedAdBreakDurationMs == null ||\n this.currentAdBreakStartWallClockMs == null\n ) {\n return undefined;\n }\n return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n }\n\n getDurationBudgetRemainingMs(): number {\n if (this.expectedAdBreakDurationMs == null) {\n return 0;\n }\n return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n }\n\n getLoadedAdDurationMs(adController: AdController): number {\n const durationSec = adController.getLoadedAdDuration?.();\n if (durationSec == null || durationSec <= 0) {\n return 0;\n }\n return Math.round(durationSec * 1000);\n }\n\n adFitsRemainingBudget(durationMs: number): boolean {\n if (durationMs <= 0) {\n return true;\n }\n return durationMs <= this.getDurationBudgetRemainingMs();\n }\n\n logAdDurationDecision(\n accepted: boolean,\n durationMs: number,\n adController: AdController\n ): void {\n if (!this.debug) {\n return;\n }\n const remainingBudget = this.getDurationBudgetRemainingMs();\n const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n if (accepted) {\n console.log(\n `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n );\n } else {\n console.log(\n `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms — requesting another ad`\n );\n }\n }\n\n recordPlayedAdDuration(adController: AdController): void {\n const durationMs = this.getLoadedAdDurationMs(adController);\n if (durationMs <= 0) {\n return;\n }\n this.adBreakPlayedDurationMs += durationMs;\n if (this.debug) {\n console.log(\n `[AD-DURATION] Played ${durationMs}ms — total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n );\n }\n }\n\n ensureLoadedAdFitsBudget(adController: AdController): boolean {\n const durationMs = this.getLoadedAdDurationMs(adController);\n const fits = this.adFitsRemainingBudget(durationMs);\n this.logAdDurationDecision(fits, durationMs, adController);\n return fits;\n }\n\n rejectLoadedAdForDuration(adController: AdController): void {\n try {\n adController.destroy();\n } catch {}\n }\n\n markAdStarted(): void {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n this.totalAdRequestsInBreak++;\n this.lastAdRequestTime = Date.now();\n }\n\n notePodAdStarted(): void {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n }\n\n getRemainingAdMs(): number {\n const wallClockRemaining = this.getWallClockRemainingAdMs();\n const budgetRemaining = this.getDurationBudgetRemainingMs();\n if (this.expectedAdBreakDurationMs == null) {\n return wallClockRemaining;\n }\n return Math.min(wallClockRemaining, budgetRemaining);\n }\n\n getMinRemainingMsToStartAd(): number {\n const configured = this.config.minRemainingMsToStartAd;\n if (typeof configured === \"number\" && configured >= 0) {\n return configured;\n }\n return this.defaultMinRemainingMsToStartAd;\n }\n\n hasTimeToStartAnotherAd(): boolean {\n const minRemaining = this.getMinRemainingMsToStartAd();\n return (\n this.getWallClockRemainingAdMs() > minRemaining &&\n this.getDurationBudgetRemainingMs() > minRemaining\n );\n }\n\n // --- Circuit breaker ---\n\n isTemporaryAdError(error: Error): boolean {\n const message = error?.message?.toLowerCase() || \"\";\n\n if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n return true;\n }\n if (message.includes(\"timeout\")) {\n return true;\n }\n if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n return true;\n }\n if (message.includes(\"ad playback error\")) {\n return true;\n }\n return false;\n }\n\n isUrlInCooldown(vastTagUrl: string): boolean {\n const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n if (failureTime == null) {\n return false;\n }\n\n const elapsed = Date.now() - failureTime;\n if (elapsed >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(vastTagUrl);\n return false;\n }\n\n return true;\n }\n\n cleanupTemporaryFailures(): void {\n const now = Date.now();\n for (const [url, timestamp] of this.temporaryFailureUrls) {\n if (now - timestamp >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(url);\n }\n }\n }\n\n isGamInCooldown(): boolean {\n return Date.now() < this.globalNoFillCooldownUntil;\n }\n\n recordGamNoFill(): void {\n this.globalConsecutiveNoFills++;\n\n if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n const backoff = Math.min(\n this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n this.globalNoFillBackoffMaxMs\n );\n this.globalNoFillCooldownUntil = Date.now() + backoff;\n\n if (this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n );\n }\n }\n }\n\n resetGamNoFillCounter(): void {\n if (this.globalConsecutiveNoFills > 0 && this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n );\n }\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillCooldownUntil = 0;\n }\n\n async enforceGlobalRateLimit(): Promise<void> {\n const now = Date.now();\n const elapsed = now - this.globalLastGamRequestTime;\n if (elapsed < this.globalMinGamIntervalMs) {\n const waitMs = this.globalMinGamIntervalMs - elapsed;\n if (this.debug) {\n console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n }\n await new Promise(resolve => setTimeout(resolve, waitMs));\n }\n this.globalLastGamRequestTime = Date.now();\n }\n\n // --- Watchdog ---\n\n startAdRequestWatchdog(token: number): void {\n this.clearAdRequestWatchdog();\n\n const timeoutMs = this.config.adFailsafeTimeoutMs ?? 10000;\n this.adRequestWatchdogToken = token;\n this.adRequestWatchdogId = window.setTimeout(() => {\n if (this.adRequestWatchdogToken !== token) {\n return;\n }\n\n this.adRequestWatchdogId = undefined;\n this.adRequestWatchdogToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n\n this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n this.callbacks.onWatchdogTimeout();\n }, timeoutMs) as unknown as number;\n\n this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n }\n\n clearAdRequestWatchdog(): void {\n if (this.adRequestWatchdogId != null) {\n clearTimeout(this.adRequestWatchdogId);\n this.adRequestWatchdogId = undefined;\n }\n\n if (this.adRequestWatchdogToken != null) {\n this.logAdState(\"ad_request_watchdog_cleared\", {\n token: this.adRequestWatchdogToken,\n });\n this.adRequestWatchdogToken = null;\n }\n }\n\n // --- Failsafe ---\n\n startAdFailsafeTimer(token: number): void {\n this.clearAdFailsafeTimer();\n\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 10000;\n this.adFailsafeToken = token;\n\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.adFailsafeToken !== token) {\n return;\n }\n\n this.adFailsafeTimerId = undefined;\n this.adFailsafeToken = null;\n\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n\n this.logAdState(\"ad_failsafe_triggered\", {\n token,\n failsafeMs,\n videoPaused: this.video.paused,\n });\n\n this.callbacks.onFailsafeTimeout();\n }, failsafeMs) as unknown as number;\n\n this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n }\n\n clearAdFailsafeTimer(): void {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n this.adFailsafeTimerId = undefined;\n }\n\n this.adFailsafeToken = null;\n }\n\n logAdState(event: string, extra: Record<string, unknown> = {}): void {\n if (!this.debug) {\n return;\n }\n\n const { inAdBreak, showAds, adPlaying } = this.callbacks.getAdState();\n\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: new Date().toISOString(),\n showAds,\n adPlaying,\n inAdBreak,\n activeAdRequestToken: this.activeAdRequestToken,\n ...extra,\n });\n }\n\n // --- Reset for ad break end ---\n\n resetForBreakEnd(): void {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdRequestWatchdog();\n this.clearAdFailsafeTimer();\n this.activeAdRequestToken = null;\n this.expectedAdBreakDurationMs = undefined;\n this.currentAdBreakStartWallClockMs = undefined;\n this.scteAdBreakEndWallClockMs = undefined;\n this.adBreakPlayedDurationMs = 0;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.consecutiveFailures = 0;\n this.globalConsecutiveNoFills = 0;\n this.adBreakEpoch++;\n }\n\n destroy(): void {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdFailsafeTimer();\n this.clearAdRequestWatchdog();\n }\n}\n","export class PlaceholderLayer {\n private container: HTMLDivElement | undefined;\n private debug: boolean;\n private video: HTMLVideoElement;\n\n constructor(video: HTMLVideoElement, debug: boolean) {\n this.video = video;\n this.debug = debug;\n }\n\n private ensureContainer(): void {\n if (this.container) {\n return;\n }\n\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.right = \"0\";\n el.style.bottom = \"0\";\n el.style.display = \"none\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"5\";\n el.style.backgroundColor = \"#000\";\n el.style.transition = \"opacity 0.3s ease-in-out\";\n el.style.opacity = \"0\";\n\n if (!this.video.parentElement) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n }\n return;\n }\n\n this.video.parentElement.appendChild(el);\n this.container = el;\n }\n\n show(): void {\n this.ensureContainer();\n\n if (!this.container) {\n return;\n }\n\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n }\n }\n\n const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n if (wasHidden) {\n this.container.style.transition = \"none\";\n } else {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n\n this.container.style.backgroundColor = \"#000\";\n this.container.style.display = \"flex\";\n this.container.offsetHeight;\n this.container.style.opacity = \"1\";\n this.container.style.pointerEvents = \"auto\";\n\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n }\n }\n\n hide(): void {\n if (!this.container) {\n return;\n }\n\n this.container.style.opacity = \"0\";\n setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.backgroundColor = \"#000\";\n }\n }, 300);\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n }\n }\n\n destroy(): void {\n if (this.container) {\n if (this.container.parentElement) {\n this.container.parentElement.removeChild(this.container);\n }\n this.container = undefined;\n }\n }\n}\n","import Hls from \"hls.js\";\nimport type {\n StormcloudVideoPlayerConfig,\n Scte35Marker,\n Id3TagInfo,\n} from \"../types\";\nimport type { Scte35CueContext } from \"./playerTypes\";\nimport {\n parseScte35FromId3,\n parseScte35FromTsPackets,\n normalizeFragmentPayload,\n getFragmentStartSeconds,\n parseCueOutDuration,\n parseCueOutCont,\n parseAttributeList,\n toNumber,\n} from \"./Scte35Parser\";\nimport type { Scte35CueManager } from \"./Scte35CueManager\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface HlsEngineCallbacks {\n onManifestParsed(isLive: boolean): Promise<void>;\n onScte35Cue(marker: Scte35Marker, context: Scte35CueContext): void;\n activatePendingCuesForFragment(frag: any): void;\n onFatalDestroy(): void;\n isInAdBreak(): boolean;\n hasPendingAdBreak(): boolean;\n}\n\nexport class HlsEngine {\n hls: Hls | undefined;\n isLiveStream: boolean = false;\n nativeHlsMode: boolean = false;\n videoSrcProtection: string | null = null;\n reloadingLiveStream: boolean = false;\n\n private bufferedSegmentsCount: number = 0;\n private shouldAutoplayAfterBuffering: boolean = false;\n private hasInitialBufferCompleted: boolean = false;\n\n private detectedLowLatencyStream: boolean | undefined;\n private latencyProfileApplied: boolean = false;\n\n private readonly config: StormcloudVideoPlayerConfig;\n private readonly video: HTMLVideoElement;\n private readonly cueManager: Scte35CueManager;\n private readonly timing: AdTimingService;\n private readonly callbacks: HlsEngineCallbacks;\n\n constructor(\n config: StormcloudVideoPlayerConfig,\n video: HTMLVideoElement,\n cueManager: Scte35CueManager,\n timing: AdTimingService,\n callbacks: HlsEngineCallbacks\n ) {\n this.config = config;\n this.video = video;\n this.cueManager = cueManager;\n this.timing = timing;\n this.callbacks = callbacks;\n }\n\n private get debug(): boolean {\n return !!this.config.debugAdTiming;\n }\n\n shouldUseNativeHls(getStreamType: () => \"hls\" | \"other\"): boolean {\n const streamType = getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n\n async setupNativeHls(): Promise<void> {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n\n this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n\n if (this.debug) {\n const adBehavior = this.isLiveStream\n ? \"live (main video continues muted during ads)\"\n : \"vod (main video pauses during ads)\";\n console.log(\n \"[StormcloudVideoPlayer] Using native HLS playback:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior,\n }\n );\n }\n\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n }\n\n setupHls(): void {\n this.hls = new Hls({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: 1.1,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1000 * 1000,\n maxBufferHole: 1,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 5,\n startPosition: -1,\n });\n\n this.hls.on(Hls.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n\n this.hls.on(Hls.Events.MANIFEST_PARSED, async (_, _data: any) => {\n this.isLiveStream =\n this.config.isLiveStream ??\n (this.hls?.levels?.some(\n (level) =>\n level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false);\n\n await this.callbacks.onManifestParsed(this.isLiveStream);\n\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n this.latencyProfileApplied = false;\n this.detectedLowLatencyStream = undefined;\n\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {});\n }\n }\n\n this.reloadingLiveStream = false;\n });\n\n this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\n this.applyStreamLatencyProfile(data?.details);\n\n if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n return;\n }\n\n const details = data?.details;\n if (!details || !details.fragments || details.fragments.length === 0) {\n return;\n }\n\n const fragmentsToScan = Math.min(5, details.fragments.length);\n\n for (let i = 0; i < fragmentsToScan; i++) {\n const frag = details.fragments[i];\n const tagList: any[] | undefined = frag?.tagList;\n\n if (!Array.isArray(tagList)) continue;\n\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n }\n }\n\n if (!tag) continue;\n\n if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = tag.includes(\"EXT-X-DATERANGE\")\n ? parseAttributeList(value)\n : {};\n const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") ||\n \"SCTE35-OUT\" in attrs ||\n attrs[\"SCTE35-OUT\"] !== undefined;\n\n if (hasScteOut) {\n const durationSeconds = parseCueOutDuration(value);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value, earlyDetection: true },\n } as Scte35Marker;\n\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n }\n\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag),\n });\n return;\n }\n }\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_BUFFERED, async (_evt, _data: any) => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n\n if (this.shouldAutoplayAfterBuffering) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n\n this.hls.on(Hls.Events.FRAG_PARSING_METADATA, (_evt, data: any) => {\n const id3Tags: Id3TagInfo[] = (data?.samples || []).map((s: any) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts,\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n\n this.hls.on(Hls.Events.FRAG_LOADED, (_evt, data: any) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n getFragmentStartSeconds(data?.frag)\n );\n });\n\n this.hls.on(Hls.Events.FRAG_DECRYPTED, (_evt, data: any) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : undefined,\n getFragmentStartSeconds(data?.frag)\n );\n });\n\n this.hls.on(Hls.Events.FRAG_CHANGED, (_evt, data: any) => {\n const frag = data?.frag;\n const tagList: any[] | undefined = frag?.tagList;\n if (!Array.isArray(tagList)) {\n this.callbacks.activatePendingCuesForFragment(frag);\n return;\n }\n\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = parseCueOutCont(value);\n const marker: Scte35Marker = {\n type: \"progress\",\n ...(prog?.duration !== undefined\n ? { durationSeconds: prog.duration }\n : {}),\n ...(prog?.elapsed !== undefined\n ? { ptsSeconds: prog.elapsed }\n : {}),\n raw: { tag, value },\n } as Scte35Marker;\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = parseCueOutDuration(value);\n const marker: Scte35Marker = {\n type: \"start\",\n ...(durationSeconds !== undefined ? { durationSeconds } : {}),\n raw: { tag, value },\n } as Scte35Marker;\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n }\n );\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = parseAttributeList(value);\n const hasScteOut =\n \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== undefined;\n const hasScteIn =\n \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== undefined;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker: Scte35Marker = {\n type: \"start\",\n ...(duration !== undefined ? { durationSeconds: duration } : {}),\n raw: { tag, value, attrs },\n } as Scte35Marker;\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n });\n }\n if (hasScteIn) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value, attrs } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag),\n }\n );\n }\n }\n }\n this.callbacks.activatePendingCuesForFragment(frag);\n });\n\n this.hls.on(Hls.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case Hls.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case Hls.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.callbacks.onFatalDestroy();\n break;\n }\n }\n });\n\n this.hls.attachMedia(this.video);\n }\n\n isLowLatencyStream(): boolean | undefined {\n return this.detectedLowLatencyStream;\n }\n\n private applyStreamLatencyProfile(details: any): void {\n if (this.latencyProfileApplied || !this.hls) {\n return;\n }\n if (!details) {\n return;\n }\n\n if (details.live !== true) {\n this.latencyProfileApplied = true;\n this.detectedLowLatencyStream = false;\n return;\n }\n\n const isLowLatencyManifest = this.isLowLatencyManifest(details);\n const useLowLatency = isLowLatencyManifest && !!this.config.lowLatencyMode;\n\n this.detectedLowLatencyStream = useLowLatency;\n this.latencyProfileApplied = true;\n\n const cfg = this.hls.config as any;\n if (useLowLatency) {\n cfg.maxLiveSyncPlaybackRate = 1.5;\n cfg.maxBufferHole = 0.5;\n delete cfg.liveSyncDuration;\n } else {\n cfg.maxLiveSyncPlaybackRate = 1.1;\n cfg.maxBufferHole = 1;\n delete cfg.liveSyncDuration;\n cfg.liveSyncDurationCount = 3;\n }\n\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live latency profile: ${\n useLowLatency ? \"LL-HLS (low latency)\" : \"standard live (stability)\"\n }`,\n {\n isLowLatencyManifest,\n lowLatencyModeRequested: !!this.config.lowLatencyMode,\n canBlockReload: details.canBlockReload,\n partTarget: details.partTarget,\n partHoldBack: details.partHoldBack,\n partListLength: Array.isArray(details.partList)\n ? details.partList.length\n : 0,\n targetDuration: details.targetduration ?? details.targetDuration,\n maxLiveSyncPlaybackRate: cfg.maxLiveSyncPlaybackRate,\n maxBufferHole: cfg.maxBufferHole,\n }\n );\n }\n }\n\n private isLowLatencyManifest(details: any): boolean {\n if (!details) {\n return false;\n }\n const hasParts =\n Array.isArray(details.partList) && details.partList.length > 0;\n const hasPartTarget =\n typeof details.partTarget === \"number\" && details.partTarget > 0;\n const hasPartHoldBack =\n typeof details.partHoldBack === \"number\" && details.partHoldBack > 0;\n const canBlockReload = details.canBlockReload === true;\n return hasParts || hasPartTarget || hasPartHoldBack || canBlockReload;\n }\n\n private onId3Tag(tag: Id3TagInfo): void {\n if (typeof tag.ptsSeconds === \"number\") {\n this.timing.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = parseScte35FromId3(tag);\n if (marker) {\n this.callbacks.onScte35Cue(marker, {\n source: \"id3\",\n readiness: \"playback\",\n });\n }\n }\n\n private processFragmentScte35Payload(\n payloadData: unknown,\n fragmentSn?: number,\n fragmentStartSeconds?: number\n ): void {\n const payload = normalizeFragmentPayload(payloadData);\n if (!payload) {\n return;\n }\n\n const markers = parseScte35FromTsPackets(\n payload,\n this.cueManager.tsScte35Pids,\n this.cueManager.pmtPids,\n this.cueManager.processedTsScte35Sections\n );\n markers.forEach((marker) => {\n const context: Scte35CueContext = {\n source: \"ts\",\n readiness: \"early\",\n };\n if (fragmentSn !== undefined) {\n context.fragmentSn = fragmentSn;\n }\n if (fragmentStartSeconds !== undefined) {\n context.fragmentStartSeconds = fragmentStartSeconds;\n }\n this.callbacks.onScte35Cue(marker, context);\n });\n }\n\n getLiveSyncPosition(): number | undefined {\n const pos = this.hls?.liveSyncPosition;\n return typeof pos === \"number\" && Number.isFinite(pos) ? pos : undefined;\n }\n\n restartLoadAt(position: number): void {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.stopLoad();\n this.hls.startLoad(position);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to restart HLS load at live edge:\", error);\n }\n }\n }\n\n recoverMediaError(): void {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.recoverMediaError();\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] recoverMediaError() failed:\", error);\n }\n }\n }\n\n reloadLiveStream(): void {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls → reset video → fresh setupHls)\"\n );\n }\n\n try {\n this.reloadingLiveStream = true;\n hls.stopLoad();\n hls.detachMedia();\n hls.destroy();\n this.hls = undefined;\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch (error) {\n console.warn(\"[StormcloudVideoPlayer] video.load() threw after src removal:\", error);\n }\n } catch (error) {\n this.reloadingLiveStream = false;\n this.hls = undefined;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to tear down during hard-reload:\", error);\n }\n return;\n }\n\n const recreateDelayMs = 600;\n window.setTimeout(() => {\n if (this.hls) {\n this.reloadingLiveStream = false;\n return;\n }\n try {\n this.setupHls();\n } catch (error) {\n this.reloadingLiveStream = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:\", error);\n }\n }\n }, recreateDelayMs);\n }\n\n destroy(): void {\n this.hls?.destroy();\n this.hls = undefined;\n }\n}\n","import type { AdController } from \"../types\";\n\nexport function getAdAudioVolume(adPlayer: AdController): number {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\n\nexport function toggleMute(\n video: HTMLVideoElement,\n adPlayer: AdController,\n debug: boolean\n): void {\n if (adPlayer.isAdPlaying()) {\n const newMutedState = !adPlayer.getOriginalMutedState();\n const restoreVolume = adPlayer.getOriginalVolume() || 1;\n\n adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n video.muted = !video.muted;\n adPlayer.updateOriginalMutedState(video.muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n }\n }\n}\n\nexport function toggleFullscreen(\n video: HTMLVideoElement,\n debug: boolean\n): Promise<void> {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container\n .requestFullscreen()\n .then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (debug) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document\n .exitFullscreen()\n .then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n })\n .catch((err) => {\n if (debug) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n}\n\nexport function isMuted(\n video: HTMLVideoElement,\n adPlayer: AdController\n): boolean {\n if (adPlayer.isAdPlaying()) {\n return adPlayer.getOriginalMutedState();\n }\n return video.muted;\n}\n\nexport function setMuted(\n video: HTMLVideoElement,\n adPlayer: AdController,\n muted: boolean,\n debug: boolean\n): void {\n const adPlaying = adPlayer.isAdPlaying();\n\n if (adPlaying && muted === video.muted) {\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n { muted }\n );\n }\n return;\n }\n\n video.muted = muted;\n\n if (adPlaying) {\n adPlayer.updateOriginalMutedState(muted, video.volume);\n adPlayer.setAdVolume(muted ? 0 : 1);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n muted,\n });\n }\n return;\n }\n\n adPlayer.updateOriginalMutedState(muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n }\n}\n\nexport function setVolume(\n video: HTMLVideoElement,\n adPlayer: AdController,\n volume: number,\n debug: boolean\n): void {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n const adPlaying = adPlayer.isAdPlaying();\n\n if (adPlaying) {\n adPlayer.setAdVolume(clampedVolume);\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n volume: clampedVolume,\n });\n }\n } else {\n video.volume = clampedVolume;\n video.muted = clampedVolume === 0;\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n }\n }\n}\n\nexport function getVolume(\n video: HTMLVideoElement,\n adPlayer: AdController\n): number {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n return adPlayer.getAdVolume();\n }\n return video.volume;\n}\n\nexport function isFullscreen(): boolean {\n return !!document.fullscreenElement;\n}\n\nexport function resizePlayer(\n video: HTMLVideoElement,\n adPlayer: AdController,\n debug: boolean\n): void {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n\n if (adPlayer && adPlayer.isAdPlaying()) {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n\n if (debug) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n\n adPlayer.resize(width, height);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\players\\HlsPlayer.cjs"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","HlsPlayer_exports","default","HlsPlayer","module","exports","import_react","require","import_hls","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","requiresMediaPipelineResetAfterAds","browser","getBrowserConfigOverrides","overrides","allowNativeHls","pauseContentDuringAds","logBrowserInfo","debug","console","log","VAST_MACRO_PATTERN","CACHEBUSTING_ALIASES","KNOWN_VAST_MACROS","generateCachebuster","String","Math","floor","random","formatPlayhead","seconds","Number","isFinite","total","hh","padStart","mm","ss","ms","resolveMacroValues","ctx","values","set","adPlayhead","adPlayheadSeconds","contentPlayheadSeconds","assetUri","mediaMime","Date","toISOString","errorCode","playerWidth","playerHeight","round","deviceId","deviceIdType","limitAdTracking","pageUrl","URL","hostname","clientUa","podSequence","adServingId","reason","substituteVastTrackingMacros","url","replace","encodeURIComponent","has","LINEAR_TRACKING_EVENTS","textOf","el","textContent","trim","parseVastTime","length","map","p","parseFloat","h","m","s","every","n","parseProgressOffset","offset","trimmed","endsWith","percent","offsetPercent","offsetSeconds","MAX_VAST_WRAPPER_DEPTH","BEACON_TIMEOUT_MS","inFlightBeacons","VAST_ERROR_MEDIA_DISPLAY","VAST_ERROR_WRAPPER_TIMEOUT","VAST_ERROR_WRAPPER_LIMIT","VAST_ERROR_WRAPPER_NO_ADS","VAST_ERROR_NO_SUPPORTED_MEDIA","VERIFICATION_NOT_SUPPORTED_REASON","VIEWABLE_MIN_VISIBLE_RATIO","VIEWABLE_MIN_CONTINUOUS_S","toVastMediaErrorCode","error","code","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","max","min","volume","listeners","mainHlsInstance","AD_CONTAINER_PROP","AD_VIDEO_PROP","FRAME_COUNTER_RELIABLE_PROP","RVFC_RELIABLE_PROP","adVideoElement","adHls","adContainerEl","adEventHandlers","containerHandlers","currentAd","currentAdMediaFile","podAds","podIndex","preloadedAds","preloadingAds","destroyed","pendingTimeouts","STALL_TIMEOUT_MS","STALL_CHECK_INTERVAL_MS","BLACKFRAME_MIN_PLAYBACK_S","stallWatchdogId","lastAdProgressTime","lastAdProgressPosition","sawDecodedVideoFrame","videoFrameCallbackHandle","pendingPlayPromise","createTrackingState","impression","loaded","start","firstQuartile","midpoint","thirdQuartile","complete","viewabilitySettled","lastMuted","progressFired","trackingFired","resolvedAds","viewObserver","visibleRatio","continuousVisibleS","lastViewSampleTime","lastPlayerExpanded","documentHandlers","emit","event","payload","Array","fn","warn","buildTrackingMacroContext","options2","ad","context","currentTime","type","clientWidth","clientHeight","location","href","fireTrackingPixels","urls","macroContext","forEach","trackingUrl","img","Image","add","timeoutId","release","clearTimeout","onload","onerror","delete","setTimeout","src","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level2","width","height","bitrate","level","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","file","widthDiff","abs","heightDiff","resolutionDiff","fileBitrate","bitrateDiff","score","sort","a","b","bestMatch","resolution","isHlsMediaFile","mediaFile","toLowerCase","includes","isProgressiveMediaFile","startsWith","isAudioMediaFile","collectVideoMediaFiles","linear","verbose","mediaFileElements","querySelectorAll","mf","index","getAttribute","apiFramework","toUpperCase","bitrateAttr","bitrateValue","hasExplicitDimensions","push","createEmptyTrackingUrls","clickTracking","viewable","notViewable","viewUndetermined","verificationNotExecuted","progress","pushUrls","elements","collectLinearTracking","into","indexOf","collectAdLevelTracking","adBody","verification","mergeTrackingUrls","source","targetLists","sourceLists","keys","incoming","concat","parseXml","xmlString","xmlDoc","DOMParser","parseFromString","parserError","querySelector","getAdSequence","adElement","sequence","emptyVastResult","root","errorUrls","parseVastXml","adElements","documentElement","find","parsed","parseAdElement","vastAdTagUri","wrapper","trackingUrls2","linear2","trackingUrls","rules","followAdditionalWrappers","inLine","candidate","files","id","title","duration","clickThrough","fetchVastXml","vastTagUrl","credentials","requestVast","response","creds","fetch","mode","headers","referrerPolicy","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","substring","fetchAndParsePod","trimmedXml","empty","resolveAd","podElements","buffet","ads","filter","shift","createAdVideoElement","video","document","createElement","style","position","left","top","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","onTimeUpdate","noteAdProgress","sampleViewability","threshold","onLoadedMetadata","videoWidth","videoHeight","handleVideoDecodeFailure","onCanPlay","onPlaying","startStallWatchdog","creativeView","adId","onEnded","settleViewability","advanceToNextPodAd","handleAdComplete","onError","e","reportCurrentAdError","handleAdError","onVolumeChange","mute","unmute","isTrackablePlayback","ended","onPause","pause","onPlay","resume","handler","addEventListener","teardownAdEventListeners","removeEventListener","handleAdClick","window","open","fireNotUsedForUnplayedAds","notUsed","now","inView","visibilityState","paused","handleFullscreenChange","fullscreenEl","fullscreenElement","webkitFullscreenElement","expanded","contains","fullscreen","playerExpand","exitFullscreen","playerCollapse","attachContainerHandlers","onClick","onInteraction","onFullscreenChange","IntersectionObserver","entries","entry","isIntersecting","intersectionRatio","observe","detachContainerHandlers","disconnect","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","resetAdTracking","isRvfcSupported","requestVideoFrameCallback","settlePendingPlay","startAdPlayback","playPromise","play","catch","finally","prepareVideoElementForNewSource","destroy","removeAttribute","load","recreateAdVideoElement","remove","appendChild","loadCurrentAdMedia","isHlsAd","isSupported","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","ERROR","_event","data","fatal","canPlayType","clearStallWatchdog","clearInterval","cancelVideoFrameProbe","handleAdStall","getDecodedVideoFrameCount","getVideoPlaybackQuality","quality","totalVideoFrames","legacyCount","webkitDecodedFrameCount","isFrameCounterReliable","markFrameCounterReliable","isRvfcReliable","markRvfcReliable","cancelVideoFrameCallback","startVideoFrameProbe","rvfc","onPresentedFrame","blackFrameDetectionEnabled","setInterval","decodedFrames","timeAdvancing","releaseAdDecoder","display","pointerEvents","continueLiveStreamDuringAds","visibility","opacity","initialize","container","right","bottom","alignItems","justifyContent","zIndex","parentElement","requestAds","preloaded","reject","resolve","contentVolume","stop","previousMutedState","clear","isAdPlaying","resize","listener","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PRIVATE_HOST_PATTERNS","isLocalDevHost","host","some","pattern","toDevSafeUrl","rawUrl","protocol","cleanPath","pathname","PAL_SDK_URL","_nonceLoader","_nonceLoaderAllowStorage","_palLoadPromise","loadPalSdk","goog","pal","existing","timeout","script","async","setAttribute","head","getOrCreateNonceLoader","allowStorage","consentSettings","ConsentSettings","NonceLoader","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","iconsSupported","playerType","playerVersion","supportedApiFrameworks","ppid","sessionId","JSON","stringify","loadNonceManager","getNonce","getCurrentNonce","injectNonce","searchParams","base","sep","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_TRACKING_INGEST_CONFIG","enabled","baseUrl","trackingIngestConfig","isTrackingIngestEnabled","normalizeIngestBaseUrl","buildTrackingIngestUrl","channel","ingestPlayerTracking","licenseKey","body","method","Authorization","status","CTV_SESSION_STORAGE_KEY","WEB_SESSION_STORAGE_KEY","inMemoryWebSessionId","PLAYER_ID_STORAGE_KEY","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","resolveVastEnvironmentSignals","isCtv","platformLat","bridgeSignals","readNativeBridgeSignals","platformDevice","readPlatformNativeDeviceId","realDeviceId","readStoredDeviceId","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","dpid","getOrCreateStoredUuid","deviceTypeHint","resolveDeviceTypeHint","getOrCreateCtvSessionId","webSessionId","getOrCreateWebSessionId","DEVICE_TYPE_HINT","FEATURE_PHONE","SMARTPHONE","DESKTOP","TABLET","CONNECTED_TV","GAME_CONSOLE","SET_TOP_BOX","DEVICE_TYPE_HINT_ALIASES","featurephone","smartphone","mobile","phone","desktop","pc","tablet","ctv","tv","connectedtv","smarttv","gameconsole","stb","settopbox","SET_TOP_BOX_UA","GAME_CONSOLE_UA","CONNECTED_TV_UA","FEATURE_PHONE_UA","override","readDeviceTypeHintOverride","inferDeviceTypeHint","fallback","maxTouchPoints","fromGlobal","normalizeDeviceTypeHint","__STORMCLOUD_DTH__","getNativeBridgeSources","normalized","safeCall","isInteger","thisArg","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","includeStored","isMacroPlaceholder","isZeroedAdId","storageKey","readPersistentId","writePersistentId","createUuid","sessionStorage","getItem","setItem","readCookie","localStorage","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","cookie","part","decodeURIComponent","slice","bytes","crypto","randomUUID","Uint8Array","getRandomValues","seed","performanceNow","i","hex","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","contentUrl","readBridgeValue","appId","appName","readBridgeBoolean","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","Boolean","result","normalizeBoolean","cachedBrowserId","buildAnalyticsContext","config","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","vendor","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isAndroid","isWebView","isWebApp","webosMatch","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","origin","path","language","languages","join","cookieEnabled","doNotTrack","referrer","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","constructor","then","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","initializePolyfills","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","getValue","correlator","isMacroPlaceholder2","generateCorrelator","buf","Uint32Array","MAX_SAFE_INTEGER","expandInlineMacroPlaceholders","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","_match","val","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","podMinDurationMs","podMaxDurationMs","podMaxAds","existingUrl","consent","gdpr","gdprConsent","usPrivacy","adTest","programTitle","channelName","staleKeys","correlatorRegex","fetchConsentSignals","timeoutMs","signals","tasks","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","storageAllowed","purpose","consents","tcString","listenerId","uspApi","__uspapi","uspString","parseCueOutDuration","num","dStr","d","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","isManifestBasedMarker","marker","id3","splice_command_type","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","candidates","startPTS","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","byteOffset","byteLength","detectTsPacketFormat","packetSizes","packetSize","tsPayloadOffset","matchedPackets","packetStart","getPsiSectionStart","payloadUnitStart","pointerField","sectionStart","getPsiSectionLength","parsePatSection","pmtPids","sectionLength","sectionEnd","programNumber","pid","descriptorsIdentifyScte35","end","descriptorStart","descriptorEnd","registration","parsePmtSection","tsScte35Pids","programInfoLength","streamType","elementaryPid","esInfoLength","hasProcessedTsScte35Section","section","processedSections","checksum","size","firstKey","next","addScte35SectionMarker","markers","appendScte35Bytes","assemblers","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","bitPos","readBits","numBits","remainingInByte","toRead","currentByte","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceCommandType","spliceEventId","commandBodyStart","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","expectedDescriptorOffset","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","fragmentStartSeconds","onScte35Cue","cue","createScte35Cue","pendingKey","getPendingScte35CueKey","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","lastHeartbeatTime","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","vastMode","vastEndpoint","apiUrl","imaPayload","decodedPayload","numberAds","fetchAndParseVmap","apiVastTagUrl","json","ima","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","timeOffsetRaw","startTimeMs","parseVmapTimeOffsetToMs","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hours","minutes","millis","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","beginNewAdPod","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","getPalDescriptionUrl","generatePodVastUrl","podParams","adPlayer","palNonce","envSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","initializeTracking","heartbeatInterval","sendHeartbeatIfNeeded","destroyTracking","AdTimingService","adRequestWatchdogToken","adFailsafeToken","ptsDriftEmaMs","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","clearAdStopTimer","ensureAdStoppedByTimer","adStopTimerId","onAdStopTimerFired","scheduleAdStartIn","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","sampleMs","alpha","resolveScteBreakStartWallClockMs","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getDurationBudgetRemainingMs","getLoadedAdDurationMs","adController","adFitsRemainingBudget","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","message","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","getAdState","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","removeChild","import_hls2","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","reloadingLiveStream","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","latencyProfileApplied","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","detectedLowLatencyStream","minSegmentsBeforePlay","LEVEL_LOADED","_evt","applyStreamLatencyProfile","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","err","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","isLowLatencyStream","isLowLatencyManifest","useLowLatency","cfg","liveSyncDuration","liveSyncDurationCount","lowLatencyModeRequested","canBlockReload","partTarget","partHoldBack","partListLength","partList","targetDuration","targetduration","hasParts","hasPartTarget","hasPartHoldBack","payloadData","getLiveSyncPosition","liveSyncPosition","restartLoadAt","stopLoad","reloadLiveStream","detachMedia","recreateDelayMs","getAdAudioVolume","toggleMute","newMutedState","restoreVolume","toggleFullscreen","requestFullscreen","isMuted","setMuted","setVolume","clampedVolume","getVolume","isFullscreen","resizePlayer","AdBreakOrchestrator","adConfig","placeholder","isShowingPlaceholder","adDetectSentForCurrentBreak","continuousFetchingActive","continuousFetchLoopRunning","adRequestQueue","adPodQueue","maxPlaceholderDurationMs","pendingAdBreak","analyticsContext","nextAdRequestUrl","baseVastUrl","remaining","attachImaEventListeners","getAdPlayer","onAdClick","onAdInteraction","adIndex","queuedUrls","tryNextAvailableAdWithRateLimit","handleAdPodComplete","errorPayload","errorMessage","vastErrorCode","cause","innerError","causeMessage","handleAdFailure","recreateAdController","shouldShowPlaceholder","preservedMutedState","preservedVolumeState","shouldContinueLiveStreamDuringAds","newAdPlayer","createAdPlayer","setAdPlayer","clearPendingAdBreak","prefetchTimerId","handleAdStart","_marker","scheduled","tags","adBreakDurationMs","currentMuted","currentVolume","podPlayed","startOptimizedPod","startContinuousFetching","podUrl","requestToken","podCount","vastUrls","vastUrl","continuousFetchLoop","epoch","maxQueueSize","newAdUrl","queuedUrlsPreview","generationDelay","stopContinuousFetching","backoffMultiplier","backoffDelay","effectiveMinInterval","timeSinceLastRequest","waitTime","tryNextAvailableAd","retryCount","nextAdUrl","maxRetries","playSingleAd","showPlaceholderAndWaitForAds","ap","playError","checkInterval","maxChecks","restoredMuted","restoredVolume","monitorLiveResumeStall","liveSyncPos","toFixed","restartHlsLoad","resumeContentPlayback","getBufferedAhead","ranges","buffered","describeVideoState","networkStates","readyStates","v","net","networkState","ready","readyState","seeking","resumeBaseline","needsReset","pollIntervalMs","graceMs","recoveryCooldownMs","maxRecoveries","maxMonitorMs","startTime","baseline","recoveries","lastRecoveryAt","listenersAttached","onMediaEvent","diagEvents","dt","cleanup","poll","advanced","playing","bufferedAhead","wedged","canRecover","reloadPos","attempt","maxAttempts","onReady","backoffMs","playResult","StormcloudVideoPlayer","attached","palPlaybackStarted","browserOverrides","videoElement","startAdPrefetch","onScte35Marker","startScte35AdBreak","hlsEngine","c","palDescriptionUrl","attach","offsetWidth","prerollKey","endedHandler","onVideoEnded","timeUpdateHandler","emptiedHandler","wasPaused","Infinity","newDurationMs","detectPayload","hasPrefetchedAds","isManifest","forceImmediate","immediateManifestAds","isManifestMarker","hasPts","estCurrentPtsMs","markerPtsMs","tolerance","hasQueuedAds","activeAdRequest","checkIntervalMs","adBreakCheckIntervalMs","maxExtensionMsConfig","maxAdBreakExtensionMs","maxExtensionMs","overrunMs","shouldExtendAdBreak","generatedUrls","detectedAtFragmentSn","isFetching","fetchStartTime","currentTimeSec","breakToPlay","handleVmapAdBreak","postroll","endMs","inWindow","first","rest","getCurrentAdIndex","getTotalAdsInBreak","getAdRemainingMs","isShowingAds","shouldShowNativeControls","showCustomControls","HLS_EXTENSIONS","HLS_PATHS","DASH_EXTENSIONS","VIDEO_EXTENSIONS","AUDIO_EXTENSIONS","canPlay","dash","audio","arguments","player","mounted","props","onVolumeToggle","onFullscreenToggle","onControlClick","onMount","hasValidSource","currentSrc","seekTo","keepPlaying","setPlaybackRate","rate","playbackRate","getDuration","getCurrentTime","getSecondsLoaded","getInternalPlayer","componentDidMount","componentWillUnmount","componentDidUpdate","prevProps","render","Component","displayName"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer_exports = {};\n__export(HlsPlayer_exports, {\n default: () => HlsPlayer\n});\nmodule.exports = __toCommonJS(HlsPlayer_exports);\nvar import_react = require(\"react\");\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsModernJS = true;\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n isLegacyTV = webOSVersion !== void 0 && webOSVersion < 3;\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n isLegacyTV = tizenVersion !== void 0 && tizenVersion < 3;\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n isLegacyTV = chromeVersion > 0 && chromeVersion < 53;\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsModernJS = false;\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsModernJS,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction requiresMediaPipelineResetAfterAds() {\n const browser = detectBrowser();\n return browser.name === \"Samsung Tizen\" && (browser.tizenVersion ?? 0) >= 5;\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n overrides.pauseContentDuringAds = true;\n }\n return overrides;\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsModernJS: browser.supportsModernJS,\n ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n userAgent: navigator.userAgent\n });\n}\n\n// src/utils/vastTrackingMacros.ts\nvar VAST_MACRO_PATTERN = /\\[([A-Z][A-Z0-9_]*)\\]/g;\nvar CACHEBUSTING_ALIASES = /\\[CACHEBUSTER\\]|\\[cachebuster\\]|\\[timestamp\\]|\\[random\\]|\\[INSERT_RANDOM_NUMBER\\]|%%CACHEBUSTER%%|%%CACHEBUST%%|\\$\\{CACHEBUSTER\\}|\\$\\{CACHEBUSTING\\}|\\{cachebuster\\}|\\{random\\}/g;\nvar KNOWN_VAST_MACROS = /* @__PURE__ */ new Set([\n \"ADCATEGORIES\",\n \"ADCOUNT\",\n \"ADPLAYHEAD\",\n \"ADSERVINGID\",\n \"ADTYPE\",\n \"APIFRAMEWORKS\",\n \"APPBUNDLE\",\n \"ASSETURI\",\n \"BLOCKEDADCATEGORIES\",\n \"BREAKMAXADLENGTH\",\n \"BREAKMAXADS\",\n \"BREAKMAXDURATION\",\n \"BREAKMINADLENGTH\",\n \"BREAKPOSITION\",\n \"CACHEBUSTING\",\n \"CLICKPOS\",\n \"CLICKTYPE\",\n \"CLIENTUA\",\n \"CONTENTID\",\n \"CONTENTPLAYHEAD\",\n \"CONTENTURI\",\n \"DEVICEIP\",\n \"DEVICEUA\",\n \"DOMAIN\",\n \"ERRORCODE\",\n \"EXTENSIONS\",\n \"GDPRCONSENT\",\n \"IFA\",\n \"IFATYPE\",\n \"INVENTORYSTATE\",\n \"LATLONG\",\n \"LIMITADTRACKING\",\n \"MEDIAMIME\",\n \"MEDIAPLAYHEAD\",\n \"OMIDPARTNER\",\n \"PAGEURL\",\n \"PLACEMENTTYPE\",\n \"PLAYERCAPABILITIES\",\n \"PLAYERSIZE\",\n \"PLAYERSTATE\",\n \"PODSEQUENCE\",\n \"REASON\",\n \"REGULATIONS\",\n \"SERVERSIDE\",\n \"SERVERUA\",\n \"TIMESTAMP\",\n \"TRANSACTIONID\",\n \"UNIVERSALADID\",\n \"VASTVERSIONS\",\n \"VERIFICATIONVENDORS\"\n]);\nfunction generateCachebuster() {\n return String(Math.floor(Math.random() * 9e7) + 1e7);\n}\nfunction formatPlayhead(seconds) {\n if (seconds == null || !Number.isFinite(seconds) || seconds < 0) {\n return void 0;\n }\n const total = Math.floor(seconds);\n const hh = String(Math.floor(total / 3600)).padStart(2, \"0\");\n const mm = String(Math.floor(total % 3600 / 60)).padStart(2, \"0\");\n const ss = String(total % 60).padStart(2, \"0\");\n const ms = String(Math.floor((seconds - total) * 1e3)).padStart(3, \"0\");\n return `${hh}:${mm}:${ss}.${ms}`;\n}\nfunction resolveMacroValues(ctx) {\n const values = /* @__PURE__ */ new Map();\n const set = (key, value) => {\n if (value != null && value !== \"\") values.set(key, value);\n };\n const adPlayhead = formatPlayhead(ctx.adPlayheadSeconds);\n set(\"ADPLAYHEAD\", adPlayhead);\n set(\"MEDIAPLAYHEAD\", adPlayhead);\n set(\"CONTENTPLAYHEAD\", formatPlayhead(ctx.contentPlayheadSeconds));\n set(\"ASSETURI\", ctx.assetUri);\n set(\"MEDIAMIME\", ctx.mediaMime);\n set(\"TIMESTAMP\", (/* @__PURE__ */ new Date()).toISOString());\n set(\"SERVERSIDE\", \"0\");\n if (ctx.errorCode != null && ctx.errorCode !== \"\") {\n set(\"ERRORCODE\", String(ctx.errorCode));\n }\n if (ctx.playerWidth != null && ctx.playerHeight != null) {\n set(\"PLAYERSIZE\", `${Math.round(ctx.playerWidth)},${Math.round(ctx.playerHeight)}`);\n }\n set(\"IFA\", ctx.deviceId);\n set(\"IFATYPE\", ctx.deviceIdType);\n if (ctx.limitAdTracking != null) {\n set(\"LIMITADTRACKING\", ctx.limitAdTracking ? \"1\" : \"0\");\n }\n set(\"PAGEURL\", ctx.pageUrl);\n if (ctx.pageUrl) {\n try {\n set(\"DOMAIN\", new URL(ctx.pageUrl).hostname);\n } catch {\n }\n }\n set(\"CLIENTUA\", ctx.clientUa);\n set(\"DEVICEUA\", ctx.clientUa);\n if (ctx.podSequence != null) {\n set(\"PODSEQUENCE\", String(ctx.podSequence));\n }\n set(\"ADSERVINGID\", ctx.adServingId);\n if (ctx.reason != null && ctx.reason !== \"\") {\n set(\"REASON\", String(ctx.reason));\n }\n return values;\n}\nfunction substituteVastTrackingMacros(url, ctx = {}) {\n if (!url) return url;\n const values = resolveMacroValues(ctx);\n return url.replace(CACHEBUSTING_ALIASES, () => generateCachebuster()).replace(VAST_MACRO_PATTERN, (match, name) => {\n if (name === \"CACHEBUSTING\") return generateCachebuster();\n const value = values.get(name);\n if (value != null) return encodeURIComponent(value);\n return KNOWN_VAST_MACROS.has(name) ? \"\" : match;\n });\n}\n\n// src/sdk/hlsAdPlayer.ts\nvar LINEAR_TRACKING_EVENTS = [\n \"creativeView\",\n \"loaded\",\n \"start\",\n \"firstQuartile\",\n \"midpoint\",\n \"thirdQuartile\",\n \"complete\",\n \"mute\",\n \"unmute\",\n \"pause\",\n \"resume\",\n \"fullscreen\",\n \"exitFullscreen\",\n \"playerExpand\",\n \"playerCollapse\",\n \"notUsed\"\n];\nfunction textOf(el) {\n const value = el?.textContent?.trim();\n return value ? value : void 0;\n}\nfunction parseVastTime(value) {\n if (!value) return void 0;\n const parts = value.trim().split(\":\");\n if (parts.length !== 3) return void 0;\n const [h, m, s] = parts.map((p) => parseFloat(p));\n if (![h, m, s].every((n) => n !== void 0 && Number.isFinite(n))) {\n return void 0;\n }\n return h * 3600 + m * 60 + s;\n}\nfunction parseProgressOffset(offset) {\n if (!offset) return void 0;\n const trimmed = offset.trim();\n if (trimmed.endsWith(\"%\")) {\n const percent = parseFloat(trimmed);\n return Number.isFinite(percent) ? { offsetPercent: percent } : void 0;\n }\n const seconds = parseVastTime(trimmed);\n return seconds !== void 0 ? { offsetSeconds: seconds } : void 0;\n}\nvar MAX_VAST_WRAPPER_DEPTH = 5;\nvar BEACON_TIMEOUT_MS = 3e4;\nvar inFlightBeacons = /* @__PURE__ */ new Set();\nvar VAST_ERROR_MEDIA_DISPLAY = 405;\nvar VAST_ERROR_WRAPPER_TIMEOUT = 301;\nvar VAST_ERROR_WRAPPER_LIMIT = 302;\nvar VAST_ERROR_WRAPPER_NO_ADS = 303;\nvar VAST_ERROR_NO_SUPPORTED_MEDIA = 403;\nvar VERIFICATION_NOT_SUPPORTED_REASON = 2;\nvar VIEWABLE_MIN_VISIBLE_RATIO = 0.5;\nvar VIEWABLE_MIN_CONTINUOUS_S = 2;\nfunction toVastMediaErrorCode(error) {\n switch (error?.code) {\n case 1:\n return 400;\n case 2:\n return 401;\n case 4:\n return 403;\n default:\n return VAST_ERROR_MEDIA_DISPLAY;\n }\n}\nfunction createHlsAdPlayer(contentVideo, options) {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = /* @__PURE__ */ new Map();\n const mainHlsInstance = options?.mainHlsInstance;\n const AD_CONTAINER_PROP = \"__stormcloudAdContainer\";\n const AD_VIDEO_PROP = \"__stormcloudAdVideo\";\n const FRAME_COUNTER_RELIABLE_PROP = \"__stormcloudFrameCounterReliable\";\n const RVFC_RELIABLE_PROP = \"__stormcloudRvfcReliable\";\n let adVideoElement = contentVideo[AD_VIDEO_PROP] ?? void 0;\n let adHls;\n let adContainerEl = contentVideo[AD_CONTAINER_PROP] ?? void 0;\n let adEventHandlers = [];\n let containerHandlers = [];\n let currentAd;\n let currentAdMediaFile;\n let podAds = [];\n let podIndex = 0;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\n const STALL_TIMEOUT_MS = 4e3;\n const STALL_CHECK_INTERVAL_MS = 1e3;\n const BLACKFRAME_MIN_PLAYBACK_S = 1.5;\n let stallWatchdogId;\n let lastAdProgressTime = 0;\n let lastAdProgressPosition = 0;\n let sawDecodedVideoFrame = false;\n let videoFrameCallbackHandle;\n let pendingPlayPromise;\n function createTrackingState() {\n return {\n impression: false,\n loaded: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n viewabilitySettled: false,\n lastMuted: void 0,\n progressFired: /* @__PURE__ */ new Set()\n };\n }\n let trackingFired = createTrackingState();\n const resolvedAds = /* @__PURE__ */ new Set();\n let viewObserver;\n let visibleRatio = 0;\n let continuousVisibleS = 0;\n let lastViewSampleTime;\n let lastPlayerExpanded = false;\n let documentHandlers = [];\n function emit(event, payload) {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n function buildTrackingMacroContext(options2 = {}) {\n const { errorCode, reason } = options2;\n const ad = options2.ad ?? currentAd;\n const context = {\n adPlayheadSeconds: adVideoElement?.currentTime,\n contentPlayheadSeconds: contentVideo.currentTime,\n assetUri: currentAdMediaFile?.url,\n mediaMime: currentAdMediaFile?.type,\n playerWidth: adVideoElement?.clientWidth || adContainerEl?.clientWidth,\n playerHeight: adVideoElement?.clientHeight || adContainerEl?.clientHeight\n };\n if (errorCode != null) {\n context.errorCode = errorCode;\n }\n if (typeof navigator !== \"undefined\" && navigator.userAgent) {\n context.clientUa = navigator.userAgent;\n }\n if (typeof location !== \"undefined\" && location.href) {\n context.pageUrl = location.href;\n }\n if (podAds.length > 0) {\n context.podSequence = podIndex + 1;\n }\n if (ad?.adServingId) {\n context.adServingId = ad.adServingId;\n }\n if (reason != null) {\n context.reason = reason;\n }\n return context;\n }\n function fireTrackingPixels(urls, options2) {\n if (!urls || urls.length === 0) return;\n const macroContext = buildTrackingMacroContext(options2);\n urls.forEach((url) => {\n try {\n const trackingUrl = substituteVastTrackingMacros(url, macroContext);\n const img = new Image(1, 1);\n inFlightBeacons.add(img);\n let timeoutId;\n const release = () => {\n if (timeoutId !== void 0) clearTimeout(timeoutId);\n img.onload = null;\n img.onerror = null;\n inFlightBeacons.delete(img);\n };\n img.onload = release;\n img.onerror = release;\n timeoutId = setTimeout(release, BEACON_TIMEOUT_MS);\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n function getMainStreamQuality() {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level2 = mainHlsInstance.levels[autoLevel];\n return {\n width: level2.width || 1920,\n height: level2.height || 1080,\n bitrate: level2.bitrate || 5e6\n };\n }\n return null;\n }\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5e6\n };\n }\n function selectBestMediaFile(mediaFiles) {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n const fileBitrate = (file.bitrate || 5e3) * 1e3;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n return { file, score, resolutionDiff, bitrateDiff };\n });\n scoredFiles.sort((a, b) => a.score - b.score);\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff\n });\n return bestMatch.file;\n }\n function isHlsMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n }\n function isProgressiveMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n }\n function isAudioMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = (mediaFile.url.toLowerCase().split(\"?\")[0] || \"\").trim();\n return type.startsWith(\"audio/\") || url.endsWith(\".mp3\") || url.endsWith(\".aac\") || url.endsWith(\".m4a\") || url.endsWith(\".ogg\") || url.endsWith(\".oga\") || url.endsWith(\".opus\") || url.endsWith(\".wav\") || url.endsWith(\".weba\");\n }\n function collectVideoMediaFiles(linear, verbose) {\n const mediaFileElements = linear.querySelectorAll(\n \":scope > MediaFiles > MediaFile\"\n );\n const mediaFiles = [];\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n }\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n }\n if (!url) {\n if (verbose) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n }\n return;\n }\n const apiFramework = (mf.getAttribute(\"apiFramework\") || \"\").toUpperCase();\n if (apiFramework === \"VPAID\") {\n if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (VPAID creatives are not supported)`\n );\n }\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: bitrateValue && bitrateValue > 0 ? bitrateValue : void 0\n };\n if (isAudioMediaFile(mediaFile)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (audio-only, type=\"${type}\") \\u2014 audio ads are not played to avoid a black screen`\n );\n return;\n }\n const hasExplicitDimensions = mf.getAttribute(\"width\") != null && mf.getAttribute(\"height\") != null;\n if (!isHlsMediaFile(mediaFile) && hasExplicitDimensions && (mediaFile.width <= 1 || mediaFile.height <= 1)) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} skipped (degenerate dimensions ${mediaFile.width}x${mediaFile.height}, type=\"${type}\") \\u2014 likely an audio-only placeholder rendition`\n );\n return;\n }\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n if (verbose) {\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n }\n } else if (verbose) {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n return mediaFiles;\n }\n function createEmptyTrackingUrls() {\n const urls = {\n impression: [],\n clickTracking: [],\n error: [],\n viewable: [],\n notViewable: [],\n viewUndetermined: [],\n verificationNotExecuted: [],\n progress: []\n };\n for (const event of LINEAR_TRACKING_EVENTS) {\n urls[event] = [];\n }\n return urls;\n }\n function pushUrls(target, elements) {\n elements.forEach((el) => {\n const url = textOf(el);\n if (url) target.push(url);\n });\n }\n function collectLinearTracking(linear, into) {\n linear.querySelectorAll(\":scope > TrackingEvents > Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = textOf(el);\n if (!event || !url) return;\n if (event === \"progress\") {\n const offset = parseProgressOffset(el.getAttribute(\"offset\"));\n if (offset) into.progress.push({ url, ...offset });\n return;\n }\n if (LINEAR_TRACKING_EVENTS.indexOf(event) !== -1) {\n into[event].push(url);\n }\n });\n pushUrls(\n into.clickTracking,\n linear.querySelectorAll(\":scope > VideoClicks > ClickTracking\")\n );\n }\n function collectAdLevelTracking(adBody, into) {\n pushUrls(into.impression, adBody.querySelectorAll(\":scope > Impression\"));\n pushUrls(into.error, adBody.querySelectorAll(\":scope > Error\"));\n pushUrls(\n into.viewable,\n adBody.querySelectorAll(\":scope > ViewableImpression > Viewable\")\n );\n pushUrls(\n into.notViewable,\n adBody.querySelectorAll(\":scope > ViewableImpression > NotViewable\")\n );\n pushUrls(\n into.viewUndetermined,\n adBody.querySelectorAll(\":scope > ViewableImpression > ViewUndetermined\")\n );\n adBody.querySelectorAll(\n ':scope > AdVerifications > Verification, :scope > Extensions > Extension[type=\"AdVerifications\"] > AdVerifications > Verification'\n ).forEach((verification) => {\n pushUrls(\n into.verificationNotExecuted,\n verification.querySelectorAll(\n ':scope > TrackingEvents > Tracking[event=\"verificationNotExecuted\"]'\n )\n );\n });\n }\n function mergeTrackingUrls(target, source) {\n const targetLists = target;\n const sourceLists = source;\n for (const key of Object.keys(targetLists)) {\n const incoming = sourceLists[key];\n if (incoming && incoming.length > 0) {\n targetLists[key] = targetLists[key].concat(incoming);\n }\n }\n return target;\n }\n function parseXml(xmlString) {\n const xmlDoc = new DOMParser().parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return null;\n }\n return xmlDoc;\n }\n function getAdSequence(adElement) {\n const sequence = parseInt(adElement.getAttribute(\"sequence\") || \"\", 10);\n return Number.isFinite(sequence) ? sequence : void 0;\n }\n function emptyVastResult(root) {\n const errorUrls = [];\n pushUrls(errorUrls, root.querySelectorAll(\":scope > Error\"));\n return { type: \"empty\", errorUrls, errorCode: VAST_ERROR_WRAPPER_NO_ADS };\n }\n function parseVastXml(xmlString) {\n try {\n const xmlDoc = parseXml(xmlString);\n if (!xmlDoc) return { type: \"empty\" };\n const root = xmlDoc.documentElement;\n const adElements = Array.from(root.querySelectorAll(\":scope > Ad\"));\n const adElement = adElements.find((el) => getAdSequence(el) === void 0) ?? adElements[0];\n if (!adElement) {\n console.warn(\n `[HlsAdPlayer] No Ad element found in VAST ${root.getAttribute(\"version\") ?? \"\"} response`\n );\n return emptyVastResult(root);\n }\n const parsed = parseAdElement(adElement, true);\n if (parsed.type === \"wrapper\") {\n console.log(\n `[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ${parsed.vastAdTagUri}`\n );\n }\n return parsed;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return { type: \"empty\" };\n }\n }\n function parseAdElement(adElement, verbose = false) {\n try {\n const wrapper = adElement.querySelector(\":scope > Wrapper\");\n if (wrapper) {\n const vastAdTagUri = textOf(\n wrapper.querySelector(\":scope > VASTAdTagURI\")\n );\n if (!vastAdTagUri) {\n console.warn(\"[HlsAdPlayer] <Wrapper> has no VASTAdTagURI\");\n return { type: \"empty\" };\n }\n const trackingUrls2 = createEmptyTrackingUrls();\n collectAdLevelTracking(wrapper, trackingUrls2);\n wrapper.querySelectorAll(\":scope > Creatives > Creative > Linear\").forEach((linear2) => collectLinearTracking(linear2, trackingUrls2));\n return {\n type: \"wrapper\",\n vastAdTagUri,\n trackingUrls: trackingUrls2,\n rules: {\n followAdditionalWrappers: wrapper.getAttribute(\"followAdditionalWrappers\") !== \"false\"\n }\n };\n }\n const inLine = adElement.querySelector(\":scope > InLine\");\n if (!inLine) {\n console.warn(\"[HlsAdPlayer] <Ad> has neither <InLine> nor <Wrapper>\");\n return { type: \"empty\" };\n }\n const errorUrls = [];\n pushUrls(errorUrls, inLine.querySelectorAll(\":scope > Error\"));\n if (adElement.getAttribute(\"conditionalAd\") === \"true\") {\n console.warn(\"[HlsAdPlayer] Skipping conditional <Ad> (VPAID-only)\");\n return { type: \"empty\", errorUrls, errorCode: VAST_ERROR_NO_SUPPORTED_MEDIA };\n }\n let linear;\n let mediaFiles = [];\n for (const candidate of Array.from(\n inLine.querySelectorAll(\":scope > Creatives > Creative > Linear\")\n )) {\n const files = collectVideoMediaFiles(candidate, verbose);\n if (files.length > 0) {\n linear = candidate;\n mediaFiles = files;\n break;\n }\n }\n if (!linear) {\n console.warn(\"[HlsAdPlayer] No supported linear media files in <Ad>\");\n return { type: \"empty\", errorUrls, errorCode: VAST_ERROR_NO_SUPPORTED_MEDIA };\n }\n const trackingUrls = createEmptyTrackingUrls();\n collectAdLevelTracking(inLine, trackingUrls);\n collectLinearTracking(linear, trackingUrls);\n return {\n type: \"inline\",\n ad: {\n id: adElement.getAttribute(\"id\") || \"unknown\",\n title: textOf(inLine.querySelector(\":scope > AdTitle\")) || \"Ad\",\n duration: parseVastTime(textOf(linear.querySelector(\":scope > Duration\"))) ?? 30,\n mediaFiles,\n trackingUrls,\n clickThrough: textOf(\n linear.querySelector(\":scope > VideoClicks > ClickThrough\")\n ),\n adServingId: textOf(inLine.querySelector(\":scope > AdServingId\"))\n }\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing <Ad> element:\", error);\n return { type: \"empty\" };\n }\n }\n async function fetchVastXml(vastTagUrl, credentials = \"include\") {\n const requestVast = (creds) => fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: creds,\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\n });\n let response;\n try {\n response = await requestVast(credentials);\n } catch (error) {\n if (credentials !== \"omit\") {\n console.warn(\n `[HlsAdPlayer] VAST fetch failed with credentials=\"${credentials}\", retrying without credentials:`,\n error\n );\n response = await requestVast(\"omit\");\n } else {\n throw error;\n }\n }\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n return response.text();\n }\n async function fetchAndParseVastAd(vastTagUrl, depth = 0, accumulatedTracking = createEmptyTrackingUrls(), rules = { followAdditionalWrappers: true }) {\n let vastXml;\n try {\n vastXml = await fetchVastXml(\n vastTagUrl,\n depth === 0 ? \"include\" : \"omit\"\n );\n } catch (error) {\n if (depth === 0) throw error;\n console.warn(\"[HlsAdPlayer] Wrapped VAST request failed:\", error);\n fireTrackingPixels(accumulatedTracking.error, {\n errorCode: VAST_ERROR_WRAPPER_TIMEOUT\n });\n return null;\n }\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n const parsed = parseVastXml(vastXml);\n if (parsed.type === \"empty\") {\n fireTrackingPixels(\n (parsed.errorUrls ?? []).concat(accumulatedTracking.error),\n { errorCode: parsed.errorCode ?? VAST_ERROR_WRAPPER_NO_ADS }\n );\n return null;\n }\n if (parsed.type === \"wrapper\") {\n if (depth >= MAX_VAST_WRAPPER_DEPTH || !rules.followAdditionalWrappers) {\n console.warn(\n rules.followAdditionalWrappers ? `[HlsAdPlayer] VAST wrapper depth limit (${MAX_VAST_WRAPPER_DEPTH}) reached, aborting redirect chain` : '[HlsAdPlayer] Parent wrapper set followAdditionalWrappers=\"false\"; rejecting nested wrapper'\n );\n fireTrackingPixels(\n accumulatedTracking.error.concat(parsed.trackingUrls.error),\n { errorCode: VAST_ERROR_WRAPPER_LIMIT }\n );\n return null;\n }\n mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n depth + 1,\n accumulatedTracking,\n parsed.rules\n );\n }\n mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);\n return parsed.ad;\n }\n async function fetchAndParsePod(vastTagUrl) {\n const vastXml = await fetchVastXml(vastTagUrl);\n console.log(\n `[HlsAdPlayer] Pod VAST XML received (length=${vastXml.length})`\n );\n const trimmedXml = vastXml.trim();\n if (trimmedXml.length === 0) {\n console.warn(\n \"[HlsAdPlayer] Pod VAST response body is empty (no fill)\"\n );\n return [];\n }\n const xmlDoc = parseXml(vastXml);\n if (!xmlDoc) {\n console.error(\n \"[HlsAdPlayer] Pod VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return [];\n }\n const root = xmlDoc.documentElement;\n const adElements = Array.from(root.querySelectorAll(\":scope > Ad\"));\n if (adElements.length === 0) {\n console.warn(\n `[HlsAdPlayer] No <Ad> elements in VAST ${root.getAttribute(\"version\") ?? \"\"} pod response (no fill)`\n );\n const empty = emptyVastResult(root);\n if (empty.type === \"empty\" && empty.errorUrls?.length) {\n fireTrackingPixels(empty.errorUrls, {\n errorCode: empty.errorCode ?? VAST_ERROR_WRAPPER_NO_ADS\n });\n }\n return [];\n }\n const resolveAd = async (adElement) => {\n const parsed = parseAdElement(adElement);\n if (parsed.type === \"inline\") return parsed.ad;\n if (parsed.type === \"wrapper\") {\n return fetchAndParseVastAd(\n parsed.vastAdTagUri,\n 1,\n parsed.trackingUrls,\n parsed.rules\n );\n }\n if (parsed.errorUrls?.length) {\n fireTrackingPixels(parsed.errorUrls, {\n errorCode: parsed.errorCode ?? VAST_ERROR_NO_SUPPORTED_MEDIA\n });\n }\n return null;\n };\n const podElements = adElements.filter((el) => getAdSequence(el) !== void 0).sort((a, b) => getAdSequence(a) - getAdSequence(b));\n const buffet = adElements.filter((el) => getAdSequence(el) === void 0);\n const ads = [];\n if (podElements.length === 0) {\n for (const adElement of buffet) {\n const ad = await resolveAd(adElement);\n if (ad) ads.push(ad);\n }\n } else {\n for (const adElement of podElements) {\n let ad = await resolveAd(adElement);\n while (!ad && buffet.length > 0) {\n ad = await resolveAd(buffet.shift());\n }\n if (ad) ads.push(ad);\n }\n }\n console.log(\n `[HlsAdPlayer] Parsed ${ads.length} ad(s) from VAST ${root.getAttribute(\"version\") ?? \"\"} pod response`\n );\n return ads;\n }\n function createAdVideoElement() {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n video.volume = 1;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n return video;\n }\n function setupAdEventListeners() {\n if (!adVideoElement || !currentAd) return;\n if (adEventHandlers.length > 0) return;\n const onTimeUpdate = () => {\n if (!currentAd || !adVideoElement) return;\n noteAdProgress();\n sampleViewability();\n const currentTime = adVideoElement.currentTime;\n if (trackingFired.start) {\n for (const event of currentAd.trackingUrls.progress) {\n if (trackingFired.progressFired.has(event)) continue;\n const threshold = event.offsetSeconds ?? (event.offsetPercent ?? 0) / 100 * currentAd.duration;\n if (currentTime >= threshold) {\n trackingFired.progressFired.add(event);\n fireTrackingPixels([event.url]);\n }\n }\n }\n if (!(currentAd.duration > 0)) return;\n const progress = currentTime / currentAd.duration;\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n };\n const onLoadedMetadata = () => {\n if (!adPlaying || !adVideoElement) return;\n const { videoWidth, videoHeight } = adVideoElement;\n if (videoWidth <= 1 || videoHeight <= 1) {\n console.warn(\n `[HlsAdPlayer] Ad creative has no usable video dimensions (${videoWidth}x${videoHeight}) - skipping this creative`\n );\n handleVideoDecodeFailure();\n }\n };\n const onCanPlay = () => {\n if (!currentAd || trackingFired.loaded) return;\n trackingFired.loaded = true;\n fireTrackingPixels(currentAd.trackingUrls.loaded);\n };\n const onPlaying = () => {\n startStallWatchdog();\n if (!currentAd || !adVideoElement) return;\n if (!trackingFired.impression) {\n trackingFired.impression = true;\n resolvedAds.add(currentAd);\n fireTrackingPixels(currentAd.trackingUrls.impression);\n fireTrackingPixels(currentAd.trackingUrls.creativeView);\n fireTrackingPixels(currentAd.trackingUrls.verificationNotExecuted, {\n reason: VERIFICATION_NOT_SUPPORTED_REASON\n });\n emit(\"ad_impression\", {\n adId: currentAd.id,\n index: podIndex,\n total: podAds.length || 1\n });\n }\n if (trackingFired.start) return;\n trackingFired.start = true;\n trackingFired.lastMuted = adVideoElement.muted || adVideoElement.volume === 0;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n };\n const onEnded = () => {\n if (!currentAd || trackingFired.complete) return;\n sampleViewability();\n settleViewability();\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdComplete();\n };\n const onError = (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n reportCurrentAdError(toVastMediaErrorCode(adVideoElement?.error));\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n };\n const onVolumeChange = () => {\n if (!currentAd || !adVideoElement) return;\n const muted = adVideoElement.muted || adVideoElement.volume === 0;\n if (!trackingFired.start) {\n trackingFired.lastMuted = muted;\n return;\n }\n if (muted === trackingFired.lastMuted) return;\n trackingFired.lastMuted = muted;\n fireTrackingPixels(\n muted ? currentAd.trackingUrls.mute : currentAd.trackingUrls.unmute\n );\n };\n const isTrackablePlayback = () => adPlaying && !!currentAd && !!adVideoElement && trackingFired.start && !trackingFired.complete && !adVideoElement.ended;\n const onPause = () => {\n continuousVisibleS = 0;\n if (isTrackablePlayback()) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n };\n const onPlay = () => {\n if (isTrackablePlayback()) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n };\n adEventHandlers = [\n { type: \"timeupdate\", handler: onTimeUpdate },\n { type: \"loadedmetadata\", handler: onLoadedMetadata },\n { type: \"canplay\", handler: onCanPlay },\n { type: \"playing\", handler: onPlaying },\n { type: \"ended\", handler: onEnded },\n { type: \"error\", handler: onError },\n { type: \"volumechange\", handler: onVolumeChange },\n { type: \"pause\", handler: onPause },\n { type: \"play\", handler: onPlay }\n ];\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.addEventListener(type, handler);\n }\n }\n function teardownAdEventListeners() {\n if (adVideoElement) {\n for (const { type, handler } of adEventHandlers) {\n adVideoElement.removeEventListener(type, handler);\n }\n }\n adEventHandlers = [];\n }\n function handleAdClick() {\n if (!adPlaying || !currentAd) return;\n fireTrackingPixels(currentAd.trackingUrls.clickTracking);\n emit(\"ad_click\", { adId: currentAd.id, clickThrough: currentAd.clickThrough });\n if (currentAd.clickThrough) {\n try {\n window.open(currentAd.clickThrough, \"_blank\", \"noopener\");\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Failed to open ClickThrough URL:\", error);\n }\n }\n }\n function reportCurrentAdError(errorCode) {\n if (!currentAd) return;\n resolvedAds.add(currentAd);\n fireTrackingPixels(currentAd.trackingUrls.error, { errorCode });\n }\n function fireNotUsedForUnplayedAds() {\n for (const ad of podAds) {\n if (resolvedAds.has(ad)) continue;\n resolvedAds.add(ad);\n fireTrackingPixels(ad.trackingUrls.notUsed, { ad });\n }\n }\n function sampleViewability() {\n if (!currentAd || !adVideoElement || !viewObserver || !trackingFired.impression || trackingFired.viewabilitySettled) {\n return;\n }\n const now = adVideoElement.currentTime;\n const inView = visibleRatio >= VIEWABLE_MIN_VISIBLE_RATIO && document.visibilityState === \"visible\" && !adVideoElement.paused;\n if (!inView) {\n continuousVisibleS = 0;\n } else if (lastViewSampleTime !== void 0 && now >= lastViewSampleTime) {\n continuousVisibleS += now - lastViewSampleTime;\n }\n lastViewSampleTime = now;\n if (continuousVisibleS >= VIEWABLE_MIN_CONTINUOUS_S) {\n trackingFired.viewabilitySettled = true;\n fireTrackingPixels(currentAd.trackingUrls.viewable);\n }\n }\n function settleViewability() {\n if (!currentAd || !trackingFired.impression || trackingFired.viewabilitySettled) {\n return;\n }\n trackingFired.viewabilitySettled = true;\n fireTrackingPixels(\n viewObserver ? currentAd.trackingUrls.notViewable : currentAd.trackingUrls.viewUndetermined\n );\n }\n function handleFullscreenChange() {\n if (!adPlaying || !currentAd || !adContainerEl || !trackingFired.start) return;\n const fullscreenEl = document.fullscreenElement ?? document.webkitFullscreenElement;\n const expanded = !!fullscreenEl && fullscreenEl.contains(adContainerEl);\n if (expanded === lastPlayerExpanded) return;\n lastPlayerExpanded = expanded;\n const urls = currentAd.trackingUrls;\n fireTrackingPixels(\n expanded ? urls.fullscreen.concat(urls.playerExpand) : urls.exitFullscreen.concat(urls.playerCollapse)\n );\n }\n function attachContainerHandlers() {\n if (!adContainerEl || containerHandlers.length > 0) return;\n const onClick = () => handleAdClick();\n const onInteraction = (event) => {\n if (adPlaying) emit(\"ad_interaction\", event);\n };\n containerHandlers = [\n { type: \"click\", handler: onClick },\n { type: \"mousedown\", handler: onInteraction },\n { type: \"touchstart\", handler: onInteraction }\n ];\n for (const { type, handler } of containerHandlers) {\n adContainerEl.addEventListener(type, handler);\n }\n const onFullscreenChange = () => handleFullscreenChange();\n documentHandlers = [\n { type: \"fullscreenchange\", handler: onFullscreenChange },\n { type: \"webkitfullscreenchange\", handler: onFullscreenChange }\n ];\n for (const { type, handler } of documentHandlers) {\n document.addEventListener(type, handler);\n }\n if (typeof IntersectionObserver !== \"undefined\") {\n viewObserver = new IntersectionObserver(\n (entries) => {\n const entry = entries[entries.length - 1];\n if (entry) {\n visibleRatio = entry.isIntersecting ? entry.intersectionRatio : 0;\n }\n },\n { threshold: [0, 0.25, 0.5, 0.75, 1] }\n );\n viewObserver.observe(adContainerEl);\n }\n }\n function detachContainerHandlers() {\n if (adContainerEl) {\n for (const { type, handler } of containerHandlers) {\n adContainerEl.removeEventListener(type, handler);\n }\n }\n containerHandlers = [];\n for (const { type, handler } of documentHandlers) {\n document.removeEventListener(type, handler);\n }\n documentHandlers = [];\n viewObserver?.disconnect();\n viewObserver = void 0;\n }\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n function resetAdTracking() {\n trackingFired = createTrackingState();\n continuousVisibleS = 0;\n lastViewSampleTime = void 0;\n }\n function isRvfcSupported(video) {\n return typeof video.requestVideoFrameCallback === \"function\";\n }\n function settlePendingPlay() {\n pendingPlayPromise = void 0;\n }\n function startAdPlayback(context) {\n if (!adVideoElement) return;\n const playPromise = adVideoElement.play();\n pendingPlayPromise = playPromise;\n playPromise.catch((error) => {\n if (pendingPlayPromise !== playPromise) {\n return;\n }\n console.error(`[HlsAdPlayer] Error starting ${context}:`, error);\n handleAdError();\n }).finally(() => {\n if (pendingPlayPromise === playPromise) {\n pendingPlayPromise = void 0;\n }\n });\n }\n function prepareVideoElementForNewSource() {\n settlePendingPlay();\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (!adVideoElement) return;\n try {\n adVideoElement.pause();\n adVideoElement.removeAttribute(\"src\");\n adVideoElement.load();\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error preparing ad video for new source:\",\n error\n );\n }\n }\n function recreateAdVideoElement() {\n console.log(\n \"[HlsAdPlayer] Recreating ad video element (single-decoder platform)\"\n );\n teardownAdEventListeners();\n prepareVideoElementForNewSource();\n if (adVideoElement) {\n try {\n adVideoElement.remove();\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error removing ad video element:\", error);\n }\n }\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n }\n function loadCurrentAdMedia() {\n if (!adVideoElement || !currentAd) {\n throw new Error(\"No ad video element or ad to load\");\n }\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n currentAdMediaFile = mediaFile;\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad (pod ${podIndex + 1}/${podAds.length || 1}) from: ${mediaFile.url}`\n );\n if (isHlsAd && import_hls.default.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n adHls = new import_hls.default({\n enableWorker: true,\n lowLatencyMode: false\n });\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n startAdPlayback(\"HLS ad playback\");\n });\n adHls.on(import_hls.default.Events.ERROR, (_event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n adVideoElement.src = mediaFile.url;\n startAdPlayback(\"native HLS ad playback\");\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n startAdPlayback(\"progressive ad playback\");\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n }\n function advanceToNextPodAd() {\n if (podIndex >= podAds.length - 1) {\n return false;\n }\n settleViewability();\n podIndex++;\n currentAd = podAds[podIndex];\n currentAdMediaFile = void 0;\n resetAdTracking();\n if (currentAd) {\n console.log(\n `[HlsAdPlayer] Advancing to next pod ad (${podIndex + 1}/${podAds.length}): ${currentAd.title}, duration: ${currentAd.duration}s`\n );\n }\n clearStallWatchdog();\n if (requiresMediaPipelineResetAfterAds()) {\n recreateAdVideoElement();\n setupAdEventListeners();\n } else {\n prepareVideoElementForNewSource();\n }\n try {\n loadCurrentAdMedia();\n emit(\"pod_ad_started\", { index: podIndex, total: podAds.length });\n return true;\n } catch (error) {\n console.error(\"[HlsAdPlayer] Failed to load next pod ad:\", error);\n return false;\n }\n }\n function clearStallWatchdog() {\n if (stallWatchdogId != null) {\n clearInterval(stallWatchdogId);\n stallWatchdogId = void 0;\n }\n cancelVideoFrameProbe();\n }\n function noteAdProgress() {\n lastAdProgressTime = Date.now();\n if (adVideoElement) {\n lastAdProgressPosition = adVideoElement.currentTime;\n }\n }\n function handleAdStall() {\n console.warn(\n \"[HlsAdPlayer] Ad playback stalled (no progress) - recovering to avoid a blank frame\"\n );\n clearStallWatchdog();\n reportCurrentAdError(VAST_ERROR_MEDIA_DISPLAY);\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function getDecodedVideoFrameCount(video) {\n try {\n if (typeof video.getVideoPlaybackQuality === \"function\") {\n const quality = video.getVideoPlaybackQuality();\n if (quality && typeof quality.totalVideoFrames === \"number\") {\n return quality.totalVideoFrames;\n }\n }\n const legacyCount = video.webkitDecodedFrameCount;\n if (typeof legacyCount === \"number\") {\n return legacyCount;\n }\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Unable to read decoded video frame count:\",\n error\n );\n }\n return void 0;\n }\n function isFrameCounterReliable() {\n return contentVideo[FRAME_COUNTER_RELIABLE_PROP] === true;\n }\n function markFrameCounterReliable() {\n contentVideo[FRAME_COUNTER_RELIABLE_PROP] = true;\n }\n function isRvfcReliable() {\n return contentVideo[RVFC_RELIABLE_PROP] === true;\n }\n function markRvfcReliable() {\n contentVideo[RVFC_RELIABLE_PROP] = true;\n }\n function cancelVideoFrameProbe() {\n if (videoFrameCallbackHandle != null && adVideoElement && typeof adVideoElement.cancelVideoFrameCallback === \"function\") {\n try {\n adVideoElement.cancelVideoFrameCallback(\n videoFrameCallbackHandle\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error cancelling video frame callback:\",\n error\n );\n }\n }\n videoFrameCallbackHandle = void 0;\n }\n function startVideoFrameProbe() {\n cancelVideoFrameProbe();\n if (!adVideoElement) return;\n const rvfc = adVideoElement.requestVideoFrameCallback;\n if (typeof rvfc !== \"function\") return;\n const onPresentedFrame = () => {\n videoFrameCallbackHandle = void 0;\n if (!adPlaying) return;\n sawDecodedVideoFrame = true;\n markRvfcReliable();\n };\n try {\n videoFrameCallbackHandle = rvfc.call(\n adVideoElement,\n onPresentedFrame\n );\n } catch (error) {\n console.warn(\n \"[HlsAdPlayer] Error requesting video frame callback:\",\n error\n );\n videoFrameCallbackHandle = void 0;\n }\n }\n function handleVideoDecodeFailure() {\n console.warn(\n \"[HlsAdPlayer] Ad audio is advancing but no video frames decoded (black screen) - skipping this creative\"\n );\n clearStallWatchdog();\n reportCurrentAdError(VAST_ERROR_MEDIA_DISPLAY);\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n }\n function startStallWatchdog() {\n clearStallWatchdog();\n noteAdProgress();\n sawDecodedVideoFrame = false;\n startVideoFrameProbe();\n const blackFrameDetectionEnabled = !requiresMediaPipelineResetAfterAds();\n stallWatchdogId = window.setInterval(() => {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n if (blackFrameDetectionEnabled && !sawDecodedVideoFrame && !adVideoElement.paused) {\n const decodedFrames = getDecodedVideoFrameCount(adVideoElement);\n if (decodedFrames !== void 0 && decodedFrames > 0) {\n sawDecodedVideoFrame = true;\n markFrameCounterReliable();\n } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {\n const timeAdvancing = adVideoElement.currentTime > lastAdProgressPosition + 0.05;\n if (isRvfcSupported(adVideoElement) && timeAdvancing && isRvfcReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n if (decodedFrames === 0 && timeAdvancing && isFrameCounterReliable()) {\n handleVideoDecodeFailure();\n return;\n }\n }\n }\n if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {\n noteAdProgress();\n return;\n }\n if (adVideoElement.paused) {\n noteAdProgress();\n return;\n }\n if (Date.now() - lastAdProgressTime >= STALL_TIMEOUT_MS) {\n handleAdStall();\n }\n }, STALL_CHECK_INTERVAL_MS);\n }\n function releaseAdDecoder() {\n prepareVideoElementForNewSource();\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n }\n function handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n settleViewability();\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode:\", error);\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n emit(\"content_resume\");\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n settleViewability();\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n releaseAdDecoder();\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n emit(\"ad_error\");\n }\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n contentVideo[AD_CONTAINER_PROP] = adContainerEl;\n attachContainerHandlers();\n },\n async requestAds(vastTagUrl) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n try {\n let ads = [];\n if (preloadedAds.has(vastTagUrl)) {\n const preloaded = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n if (preloaded) {\n ads = [preloaded];\n }\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ads = await fetchAndParsePod(vastTagUrl);\n }\n if (!ads.length) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n podAds = ads;\n podIndex = 0;\n currentAd = ads[0];\n currentAdMediaFile = void 0;\n console.log(\n `[HlsAdPlayer] Pod parsed: ${ads.length} ad(s), first=\"${currentAd?.title}\", duration=${currentAd?.duration}s`\n );\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n contentVideo[AD_VIDEO_PROP] = adVideoElement;\n }\n setupAdEventListeners();\n resetAdTracking();\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n adVideoElement.volume = Math.max(0, Math.min(1, originalVolume));\n adVideoElement.muted = originalMutedState;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n emit(\"content_pause\");\n loadCurrentAdMedia();\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n settleViewability();\n fireNotUsedForUnplayedAds();\n clearStallWatchdog();\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}, volume: ${contentVideo.volume}`\n );\n releaseAdDecoder();\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error resuming content playback in live mode on stop:\", error);\n });\n }\n }\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n settleViewability();\n fireNotUsedForUnplayedAds();\n destroyed = true;\n clearStallWatchdog();\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = Math.max(0, Math.min(1, originalVolume));\n teardownAdEventListeners();\n detachContainerHandlers();\n releaseAdDecoder();\n currentAd = void 0;\n currentAdMediaFile = void 0;\n podAds = [];\n podIndex = 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n on(event, listener) {\n if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n listeners.get(event).add(listener);\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted, volume) {\n const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n if (adVideoElement && adPlaying) {\n const clamped = Math.max(0, Math.min(1, volume));\n adVideoElement.volume = clamped;\n adVideoElement.muted = clamped === 0;\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl && !adPlaying) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n getLoadedAdDuration() {\n return currentAd?.duration;\n },\n getLoadedAdId() {\n return currentAd?.id;\n },\n getPodAdCount() {\n return podAds.length;\n },\n getPodTotalDurationMs() {\n return podAds.reduce(\n (total, ad) => total + (ad.duration > 0 ? ad.duration * 1e3 : 0),\n 0\n );\n }\n };\n}\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _nonceLoaderAllowStorage;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader(allowStorage) {\n if (_nonceLoader && _nonceLoaderAllowStorage === allowStorage) {\n return _nonceLoader;\n }\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = allowStorage;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n _nonceLoaderAllowStorage = allowStorage;\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader(options.allowStorage ?? true);\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\nfunction isTrackingIngestEnabled() {\n return trackingIngestConfig.enabled === true;\n}\nfunction normalizeIngestBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildTrackingIngestUrl(channel) {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\nasync function ingestPlayerTracking(licenseKey, channel, body) {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`\n },\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar WEB_SESSION_STORAGE_KEY = \"stormcloud.web.sid\";\nvar inMemoryWebSessionId;\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\"\n];\nvar ANDROID_ID_TYPES = /* @__PURE__ */ new Set([\"aaid\", \"adid\"]);\nfunction resolveVastEnvironmentSignals(isCtv) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const realDeviceId = bridgeSignals.deviceId || (isCtv ? readStoredDeviceId() : void 0) || platformDevice.deviceId;\n let deviceId = realDeviceId;\n let deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType();\n const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n let limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n if (!deviceId && isCtv) {\n const dpid = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (dpid) {\n deviceId = dpid;\n deviceIdType = \"dpid\";\n limitAdTracking = platformLat ?? readStoredLimitAdTracking() ?? false;\n }\n }\n const deviceTypeHint = resolveDeviceTypeHint(isCtv);\n if (isCtv) {\n return {\n isCtv: true,\n sessionId: getOrCreateCtvSessionId(),\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint\n };\n }\n const webSessionId = getOrCreateWebSessionId();\n return {\n isCtv: false,\n ...webSessionId ? { sessionId: webSessionId } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint\n };\n}\nvar DEVICE_TYPE_HINT = {\n FEATURE_PHONE: 1,\n SMARTPHONE: 2,\n DESKTOP: 3,\n TABLET: 4,\n CONNECTED_TV: 5,\n GAME_CONSOLE: 6,\n SET_TOP_BOX: 7\n};\nvar DEVICE_TYPE_HINT_ALIASES = {\n featurephone: DEVICE_TYPE_HINT.FEATURE_PHONE,\n smartphone: DEVICE_TYPE_HINT.SMARTPHONE,\n mobile: DEVICE_TYPE_HINT.SMARTPHONE,\n phone: DEVICE_TYPE_HINT.SMARTPHONE,\n desktop: DEVICE_TYPE_HINT.DESKTOP,\n pc: DEVICE_TYPE_HINT.DESKTOP,\n tablet: DEVICE_TYPE_HINT.TABLET,\n ctv: DEVICE_TYPE_HINT.CONNECTED_TV,\n tv: DEVICE_TYPE_HINT.CONNECTED_TV,\n connectedtv: DEVICE_TYPE_HINT.CONNECTED_TV,\n smarttv: DEVICE_TYPE_HINT.CONNECTED_TV,\n console: DEVICE_TYPE_HINT.GAME_CONSOLE,\n gameconsole: DEVICE_TYPE_HINT.GAME_CONSOLE,\n stb: DEVICE_TYPE_HINT.SET_TOP_BOX,\n settopbox: DEVICE_TYPE_HINT.SET_TOP_BOX\n};\nvar SET_TOP_BOX_UA = /LGSTB|\\bSTB\\b|STB\\d|Set-?Top|SetTopBox|TV ?Box|Kaon|Humax|Arris|Technicolor|Sagemcom|Infomir|MAG\\d{3}|KreaTV|Amino|Formuler|Dune ?HD|TiVo|MiBOX|Mi Box|SHIELD Android TV|\\bAFT[A-Z]|Roku|AppleTV|Apple TV|CrKey/i;\nvar GAME_CONSOLE_UA = /PlayStation|Xbox|Nintendo/i;\nvar CONNECTED_TV_UA = /Web0S|webOS|Tizen|SMART-TV|SmartTV|NetCast|BRAVIA|HbbTV|VIDAA|Hisense|Philips|Viera|AQUOS|Android TV|Google TV|\\bTV\\b/i;\nvar FEATURE_PHONE_UA = /KAIOS|MIDP|J2ME|Series40|Opera Mini/i;\nfunction resolveDeviceTypeHint(isCtv) {\n const override = readDeviceTypeHintOverride(isCtv);\n if (override != null) return override;\n return inferDeviceTypeHint(isCtv);\n}\nfunction inferDeviceTypeHint(isCtv) {\n const fallback = isCtv ? DEVICE_TYPE_HINT.CONNECTED_TV : DEVICE_TYPE_HINT.DESKTOP;\n if (typeof navigator === \"undefined\") return fallback;\n const ua = navigator.userAgent || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n if (SET_TOP_BOX_UA.test(ua)) return DEVICE_TYPE_HINT.SET_TOP_BOX;\n if (GAME_CONSOLE_UA.test(ua)) return DEVICE_TYPE_HINT.GAME_CONSOLE;\n if (CONNECTED_TV_UA.test(ua) && !/Mobile/i.test(ua)) {\n return DEVICE_TYPE_HINT.CONNECTED_TV;\n }\n if (FEATURE_PHONE_UA.test(ua)) return DEVICE_TYPE_HINT.FEATURE_PHONE;\n if (/iPad/i.test(ua) || /Macintosh/i.test(ua) && maxTouchPoints > 1) {\n return DEVICE_TYPE_HINT.TABLET;\n }\n if (/iPhone|iPod/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;\n if (/Android/i.test(ua)) {\n if (/Mobile/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;\n if (maxTouchPoints === 0) return DEVICE_TYPE_HINT.SET_TOP_BOX;\n return DEVICE_TYPE_HINT.TABLET;\n }\n if (/Mobile|Windows Phone|BlackBerry/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;\n return fallback;\n}\nfunction readDeviceTypeHintOverride(isCtv) {\n if (typeof window === \"undefined\") return void 0;\n const keys = [\"dth\", \"deviceTypeHint\"];\n const fromGlobal = normalizeDeviceTypeHint(window.__STORMCLOUD_DTH__);\n if (fromGlobal != null) return fromGlobal;\n for (const source of getNativeBridgeSources()) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeDeviceTypeHint(\n typeof value === \"function\" ? safeCall(value, source) : value\n );\n if (normalized != null) return normalized;\n }\n }\n if (!isCtv) return void 0;\n for (const key of [\"stormcloud.dth\", \"dth\"]) {\n const normalized = normalizeDeviceTypeHint(readStoredString(key));\n if (normalized != null) return normalized;\n }\n return void 0;\n}\nfunction normalizeDeviceTypeHint(value) {\n if (typeof value === \"number\") {\n return Number.isInteger(value) && value >= 1 && value <= 7 ? value : void 0;\n }\n if (typeof value !== \"string\") return void 0;\n const trimmed = value.trim();\n if (/^[1-7]$/.test(trimmed)) return parseInt(trimmed, 10);\n return DEVICE_TYPE_HINT_ALIASES[trimmed.toLowerCase().replace(/[\\s_-]/g, \"\")];\n}\nfunction safeCall(fn, thisArg) {\n try {\n return fn.call(thisArg);\n } catch {\n return void 0;\n }\n}\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction isEquivalentDeviceIdType(tagType, runtimeType) {\n if (!tagType || !runtimeType) return false;\n const tag = tagType.toLowerCase();\n const runtime = runtimeType.toLowerCase();\n if (tag === runtime) return true;\n return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);\n}\nfunction resolveNativeDeviceId(includeStored = true) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId = bridgeSignals.deviceId || (includeStored ? readStoredDeviceId() : void 0) || platformDevice.deviceId;\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return void 0;\n }\n return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\nfunction getOrCreateCtvSessionId() {\n const existing = readPersistentId(CTV_SESSION_STORAGE_KEY);\n if (existing) {\n writePersistentId(CTV_SESSION_STORAGE_KEY, existing);\n return existing;\n }\n const sessionId = createUuid();\n writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);\n return sessionId;\n}\nfunction getOrCreateWebSessionId() {\n if (typeof window === \"undefined\") return void 0;\n try {\n const existing = window.sessionStorage?.getItem(WEB_SESSION_STORAGE_KEY);\n if (existing && !isMacroPlaceholder(existing)) return existing;\n } catch {\n }\n const sessionId = inMemoryWebSessionId || createUuid();\n inMemoryWebSessionId = sessionId;\n try {\n window.sessionStorage?.setItem(WEB_SESSION_STORAGE_KEY, sessionId);\n } catch {\n }\n return sessionId;\n}\nfunction readPersistentId(storageKey) {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {\n }\n writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n if (typeof document === \"undefined\") {\n return void 0;\n }\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n }\n }\n } catch {\n }\n return void 0;\n}\nfunction writeCookie(name, value) {\n if (typeof document === \"undefined\") {\n return;\n }\n try {\n document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n } catch {\n }\n}\nfunction createUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = seed * 1103515245 + 12345 & 2147483647;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n }\n }\n bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n }\n return 0;\n}\nfunction readPlatformNativeDeviceId() {\n if (typeof window === \"undefined\") return {};\n try {\n const adinfo = window.webapis?.adinfo;\n if (adinfo) {\n const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n };\n }\n }\n } catch {\n }\n try {\n const webOSDev = window.webOSDev;\n if (webOSDev) {\n const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {\n }\n try {\n const roku = window.Roku;\n if (roku) {\n const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {\n }\n return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n const t = value.trim();\n return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n for (const source of getNativeBridgeSources()) {\n const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n const deviceId = readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\"\n ]) || void 0;\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n const deviceIdType = readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\"\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\"\n ]);\n return {\n ...contentUrl ? { contentUrl } : {},\n ...appId ? { appId } : {},\n ...appName ? { appName } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n }\n return {};\n}\nfunction getNativeBridgeSources() {\n if (typeof window === \"undefined\") {\n return [];\n }\n return [\n window.__STORMCLOUD_CTV_AD_INFO__,\n window.__STORMCLOUD_CTV__,\n window.stormcloudCtv,\n window.AiryTV,\n window.Android,\n window.webOS,\n window.tizen,\n window.amazon\n ].filter(Boolean);\n}\nfunction readBridgeValue(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readStoredDeviceId() {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return void 0;\n}\nfunction readStoredString(key) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n try {\n const value = window.localStorage?.getItem(key);\n return value || void 0;\n } catch {\n return void 0;\n }\n}\nfunction readStoredLimitAdTracking() {\n return normalizeBoolean(\n readStoredString(\"limitAdTracking\") || readStoredString(\"limitedAdTracking\") || readStoredString(\"is_lat\")\n );\n}\nfunction normalizeBoolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n const context = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== void 0) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function sha256Hex(input) {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n const nativeDeviceId = resolveNativeDeviceId(clientInfo.isSmartTV);\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n const playerId = await getBrowserID(clientInfo);\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nasync function sendInitialTracking(licenseKey, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n adLoaded: false,\n adDetect: false\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adDetect: true,\n captureAt: adDetectInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData]\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\n// src/utils/polyfills.ts\nfunction polyfillURLSearchParams() {\n if (typeof URLSearchParams !== \"undefined\") {\n return;\n }\n class URLSearchParamsPolyfill {\n constructor(init) {\n this.params = /* @__PURE__ */ new Map();\n if (typeof init === \"string\") {\n this.parseQueryString(init);\n } else if (init instanceof URLSearchParamsPolyfill) {\n init.forEach((value, key) => {\n this.append(key, value);\n });\n }\n }\n parseQueryString(query) {\n const cleanQuery = query.startsWith(\"?\") ? query.slice(1) : query;\n if (!cleanQuery) return;\n cleanQuery.split(\"&\").forEach((param) => {\n const [key, value] = param.split(\"=\");\n if (key) {\n const decodedKey = this.safeDecodeURIComponent(key);\n const decodedValue = value ? this.safeDecodeURIComponent(value) : \"\";\n this.append(decodedKey, decodedValue);\n }\n });\n }\n safeDecodeURIComponent(str) {\n try {\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\n } catch (e) {\n return str;\n }\n }\n append(name, value) {\n const values = this.params.get(name) || [];\n values.push(String(value));\n this.params.set(name, values);\n }\n delete(name) {\n this.params.delete(name);\n }\n get(name) {\n const values = this.params.get(name);\n return values && values.length > 0 && values[0] !== void 0 ? values[0] : null;\n }\n getAll(name) {\n return this.params.get(name) || [];\n }\n has(name) {\n return this.params.has(name);\n }\n set(name, value) {\n this.params.set(name, [String(value)]);\n }\n forEach(callback) {\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n callback(value, key, this);\n });\n });\n }\n toString() {\n const parts = [];\n this.params.forEach((values, key) => {\n values.forEach((value) => {\n parts.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);\n });\n });\n return parts.join(\"&\");\n }\n }\n window.URLSearchParams = URLSearchParamsPolyfill;\n}\nfunction polyfillTextEncoder() {\n if (typeof TextEncoder !== \"undefined\") {\n return;\n }\n class TextEncoderPolyfill {\n constructor() {\n this.encoding = \"utf-8\";\n }\n encode(str) {\n const utf8 = [];\n for (let i = 0; i < str.length; i++) {\n let charcode = str.charCodeAt(i);\n if (charcode < 128) {\n utf8.push(charcode);\n } else if (charcode < 2048) {\n utf8.push(192 | charcode >> 6, 128 | charcode & 63);\n } else if (charcode < 55296 || charcode >= 57344) {\n utf8.push(\n 224 | charcode >> 12,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n } else {\n i++;\n charcode = 65536 + ((charcode & 1023) << 10 | str.charCodeAt(i) & 1023);\n utf8.push(\n 240 | charcode >> 18,\n 128 | charcode >> 12 & 63,\n 128 | charcode >> 6 & 63,\n 128 | charcode & 63\n );\n }\n }\n return new Uint8Array(utf8);\n }\n }\n window.TextEncoder = TextEncoderPolyfill;\n}\nfunction polyfillPromiseFinally() {\n if (typeof Promise !== \"undefined\" && !Promise.prototype.finally) {\n Promise.prototype.finally = function(callback) {\n const constructor = this.constructor;\n return this.then(\n (value) => constructor.resolve(callback()).then(() => value),\n (reason) => constructor.resolve(callback()).then(() => {\n throw reason;\n })\n );\n };\n }\n}\nfunction polyfillObjectAssign() {\n if (typeof Object.assign !== \"function\") {\n Object.assign = function(target, ...sources) {\n if (target == null) {\n throw new TypeError(\"Cannot convert undefined or null to object\");\n }\n const to = Object(target);\n for (let i = 0; i < sources.length; i++) {\n const nextSource = sources[i];\n if (nextSource != null) {\n for (const nextKey in nextSource) {\n if (Object.prototype.hasOwnProperty.call(nextSource, nextKey)) {\n to[nextKey] = nextSource[nextKey];\n }\n }\n }\n }\n return to;\n };\n }\n}\nfunction polyfillArrayFrom() {\n if (!Array.from) {\n Array.from = function(arrayLike, mapFn, thisArg) {\n const items = Object(arrayLike);\n if (arrayLike == null) {\n throw new TypeError(\"Array.from requires an array-like object\");\n }\n const len = items.length >>> 0;\n const result = new Array(len);\n for (let i = 0; i < len; i++) {\n if (mapFn) {\n result[i] = mapFn.call(thisArg, items[i], i);\n } else {\n result[i] = items[i];\n }\n }\n return result;\n };\n }\n}\nfunction polyfillStringStartsWith() {\n if (!String.prototype.startsWith) {\n String.prototype.startsWith = function(search, pos) {\n pos = !pos || pos < 0 ? 0 : +pos;\n return this.substring(pos, pos + search.length) === search;\n };\n }\n}\nfunction polyfillStringEndsWith() {\n if (!String.prototype.endsWith) {\n String.prototype.endsWith = function(search, length) {\n if (length === void 0 || length > this.length) {\n length = this.length;\n }\n return this.substring(length - search.length, length) === search;\n };\n }\n}\nfunction polyfillStringIncludes() {\n if (!String.prototype.includes) {\n String.prototype.includes = function(search, start) {\n if (typeof start !== \"number\") {\n start = 0;\n }\n if (start + search.length > this.length) {\n return false;\n }\n return this.indexOf(search, start) !== -1;\n };\n }\n}\nfunction initializePolyfills() {\n polyfillObjectAssign();\n polyfillArrayFrom();\n polyfillStringStartsWith();\n polyfillStringEndsWith();\n polyfillStringIncludes();\n polyfillURLSearchParams();\n polyfillTextEncoder();\n polyfillPromiseFinally();\n}\n\n// src/utils/vastMacros.ts\nvar UNEXPANDED_MACRO_PATTERN = /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/;\nvar INVALID_VAST_PARAM_KEY = /^\\s|\\s$/;\nvar EXAMPLE_COM_URL = /example\\.com/i;\nvar CTV_UNSUPPORTED_PARAMS = [\n \"tfcd\",\n \"npa\",\n \"min_ad_duration\",\n \"max_ad_duration\",\n \"unviewed_position_start\",\n \"impl\",\n \"vad_type\",\n \"gdpr\",\n \"gdpr_consent\",\n \"us_privacy\"\n];\nvar INLINE_DEVICE_MACRO_REPLACEMENTS = [\n { pattern: /\\[RDID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IFA\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[ADVERTISING[_-]?ID(?:ENTIFIER)?\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[DEVICE[_-]?ID\\]/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\[IDTYPE\\]/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /\\{rdid\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{device[_-]?id\\}/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /\\{idtype\\}/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%ADVERTISING_ID_TYPE%%/gi, getValue: (ctx) => ctx.deviceIdType },\n { pattern: /%%ADVERTISING_ID%%/gi, getValue: (ctx) => ctx.deviceId },\n { pattern: /%%LIMIT_AD_TRACKING%%/gi, getValue: (ctx) => ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0 },\n { pattern: /%%SESSION_ID%%/gi, getValue: (ctx) => ctx.sessionId },\n { pattern: /%%CORRELATOR%%/gi, getValue: (ctx) => ctx.correlator }\n];\nfunction isMacroPlaceholder2(value) {\n if (value == null) return true;\n const trimmed = value.trim();\n if (!trimmed) return true;\n if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;\n return /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(trimmed);\n}\nfunction generateCorrelator() {\n if (typeof crypto !== \"undefined\" && crypto.getRandomValues) {\n try {\n const buf = new Uint32Array(2);\n crypto.getRandomValues(buf);\n const value = (buf[0] ?? 0) * 2097152 + ((buf[1] ?? 0) & 2097151);\n if (value > 0) {\n return String(value);\n }\n } catch {\n }\n }\n return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);\n}\nfunction expandInlineMacroPlaceholders(baseUrl, ctx) {\n let url = baseUrl;\n for (const { pattern, getValue } of INLINE_DEVICE_MACRO_REPLACEMENTS) {\n const value = getValue(ctx);\n if (value != null && value !== \"\") {\n url = url.replace(pattern, encodeURIComponent(value));\n }\n }\n return url;\n}\nfunction applyDeviceIdentityParams(params, ctx) {\n const runtimeId = ctx.deviceId?.trim();\n const runtimeType = ctx.deviceIdType?.trim() || inferDeviceIdType();\n const tagRdid = params.get(\"rdid\");\n const tagType = params.get(\"idtype\");\n const tagLat = params.get(\"is_lat\");\n const latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? \"1\" : \"0\" : void 0;\n if (runtimeId) {\n params.set(\"rdid\", runtimeId);\n params.set(\"idtype\", runtimeType || tagType || \"aaid\");\n params.set(\"is_lat\", latValue ?? (isMacroPlaceholder2(tagLat) ? \"0\" : tagLat));\n return;\n }\n if (!ctx.isCtv) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n const tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));\n const tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));\n if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n return;\n }\n if (tagRdidValid) {\n if (isMacroPlaceholder2(tagType) && runtimeType) {\n params.set(\"idtype\", runtimeType);\n }\n if (isMacroPlaceholder2(tagLat)) {\n params.set(\"is_lat\", latValue ?? \"0\");\n }\n return;\n }\n params.delete(\"rdid\");\n params.delete(\"idtype\");\n params.delete(\"is_lat\");\n}\nfunction removeBrokenAppNameOrphans(params, appName) {\n const toDelete = [];\n params.forEach((_value, key) => {\n if (!key || INVALID_VAST_PARAM_KEY.test(key)) {\n toDelete.push(key);\n }\n });\n if (appName && appName.includes(\"&\")) {\n for (const suffix of appName.split(\"&\").slice(1)) {\n const trimmed = suffix.replace(/^\\s+/, \"\");\n if (!trimmed) continue;\n toDelete.push(suffix, ` ${trimmed}`, trimmed);\n }\n }\n for (const key of new Set(toDelete)) {\n if (key) params.delete(key);\n }\n}\nfunction normalizeVastTagUrl(raw) {\n if (!raw) return raw;\n try {\n const url = new URL(raw);\n const anValue = url.searchParams.get(\"an\");\n if (anValue !== null) {\n const orphanFragments = [];\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n orphanFragments.push(key.trim());\n }\n });\n if (orphanFragments.length > 0) {\n const reconstructed = [anValue.replace(/\\s+$/, \"\"), ...orphanFragments].filter(Boolean).join(\" & \");\n url.searchParams.forEach((_value, key) => {\n if (key && INVALID_VAST_PARAM_KEY.test(key)) {\n url.searchParams.delete(key);\n }\n });\n url.searchParams.set(\"an\", reconstructed);\n return url.toString().replace(\n /([?&]an=)([^&]*)/,\n (_match, prefix, val) => prefix + val.replace(/\\+/g, \"%20\")\n );\n }\n }\n removeBrokenAppNameOrphans(url.searchParams);\n return url.toString();\n } catch {\n return raw;\n }\n}\nfunction applyVastMacros(baseUrl, ctx) {\n const expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);\n let url;\n try {\n url = new URL(normalizeVastTagUrl(expandedUrl));\n } catch {\n return replaceCorrelatorFallback(expandedUrl, ctx.correlator);\n }\n const params = url.searchParams;\n removeBrokenAppNameOrphans(params);\n params.set(\"correlator\", ctx.correlator);\n params.set(\"scor\", ctx.streamCorrelator);\n if (ctx.isCtv) {\n for (const key of CTV_UNSUPPORTED_PARAMS) {\n params.delete(key);\n }\n }\n if (ctx.pod != null) {\n params.set(\"pod\", String(ctx.pod));\n }\n params.delete(\"ppos\");\n params.delete(\"lip\");\n if (ctx.podMinDurationMs != null) {\n params.set(\"pmnd\", String(Math.max(0, Math.round(ctx.podMinDurationMs))));\n }\n if (ctx.podMaxDurationMs != null) {\n params.set(\"pmxd\", String(Math.max(0, Math.round(ctx.podMaxDurationMs))));\n }\n if (ctx.podMaxAds != null) {\n params.set(\"pmad\", String(Math.max(1, Math.round(ctx.podMaxAds))));\n }\n const existingUrl = params.get(\"url\") || \"\";\n if (EXAMPLE_COM_URL.test(existingUrl)) {\n params.delete(\"url\");\n params.delete(\"description_url\");\n }\n if (!ctx.isCtv && ctx.pageUrl) {\n if (isMacroPlaceholder2(params.get(\"url\"))) {\n params.set(\"url\", ctx.pageUrl);\n }\n if (isMacroPlaceholder2(params.get(\"description_url\"))) {\n params.set(\"description_url\", params.get(\"url\") || ctx.pageUrl);\n }\n }\n if (!ctx.isCtv) {\n params.delete(\"an\");\n params.delete(\"msid\");\n params.delete(\"sid\");\n }\n if (ctx.adWillPlayMuted != null) {\n params.set(\"vpmute\", ctx.adWillPlayMuted ? \"1\" : \"0\");\n }\n if (ctx.adWillAutoPlay != null) {\n params.set(\"vpa\", ctx.adWillAutoPlay ? \"auto\" : \"click\");\n }\n if (ctx.sessionId) {\n params.set(\"sid\", ctx.sessionId);\n }\n if (ctx.deviceTypeHint != null) {\n params.set(\"dth\", String(ctx.deviceTypeHint));\n } else if (ctx.isCtv) {\n params.set(\"dth\", \"5\");\n }\n applyDeviceIdentityParams(params, ctx);\n if (!ctx.isCtv) {\n const consent = ctx.consent;\n if (consent?.gdpr != null) {\n params.set(\"gdpr\", consent.gdpr);\n }\n if (consent?.gdprConsent != null) {\n params.set(\"gdpr_consent\", consent.gdprConsent);\n }\n if (consent?.usPrivacy != null) {\n params.set(\"us_privacy\", consent.usPrivacy);\n }\n }\n if (ctx.adTest) {\n params.set(\"adtest\", \"on\");\n }\n if (ctx.programTitle) {\n params.set(\"ct_ti\", ctx.programTitle);\n }\n if (ctx.channelName) {\n params.set(\"ct_ch\", ctx.channelName);\n }\n const staleKeys = [];\n params.forEach((value, key) => {\n if (isMacroPlaceholder2(value)) {\n staleKeys.push(key);\n }\n });\n for (const key of staleKeys) {\n params.delete(key);\n }\n removeBrokenAppNameOrphans(params);\n return url.toString();\n}\nfunction replaceCorrelatorFallback(baseUrl, correlator) {\n const correlatorRegex = /([?&])correlator=([^&]*)/;\n if (correlatorRegex.test(baseUrl)) {\n return baseUrl.replace(correlatorRegex, `$1correlator=${correlator}`);\n }\n const sep = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n return `${baseUrl}${sep}correlator=${correlator}`;\n}\nfunction fetchConsentSignals(timeoutMs = 1500) {\n const signals = {};\n if (typeof window === \"undefined\") {\n return Promise.resolve(signals);\n }\n const tasks = [];\n const tcfApi = window.__tcfapi;\n if (typeof tcfApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n let settled = false;\n try {\n tcfApi(\"addEventListener\", 2, (tcData, success) => {\n if (settled) return;\n if (success && tcData && (tcData.eventStatus === \"tcloaded\" || tcData.eventStatus === \"useractioncomplete\")) {\n settled = true;\n signals.gdpr = tcData.gdprApplies ? \"1\" : \"0\";\n signals.storageAllowed = tcData.gdprApplies ? tcData.purpose?.consents?.[1] === true : true;\n if (typeof tcData.tcString === \"string\" && tcData.tcString) {\n signals.gdprConsent = tcData.tcString;\n }\n try {\n tcfApi(\"removeEventListener\", 2, () => {\n }, tcData.listenerId);\n } catch {\n }\n resolve();\n }\n });\n } catch {\n resolve();\n }\n setTimeout(() => {\n if (!settled) {\n settled = true;\n resolve();\n }\n }, timeoutMs);\n })\n );\n }\n const uspApi = window.__uspapi;\n if (typeof uspApi === \"function\") {\n tasks.push(\n new Promise((resolve) => {\n try {\n uspApi(\"getUSPData\", 1, (data, success) => {\n if (success && typeof data?.uspString === \"string\" && data.uspString) {\n signals.usPrivacy = data.uspString;\n }\n resolve();\n });\n } catch {\n resolve();\n }\n setTimeout(resolve, timeoutMs);\n })\n );\n }\n if (tasks.length === 0) {\n return Promise.resolve(signals);\n }\n return Promise.all(tasks).then(() => signals);\n}\n\n// src/player/Scte35Parser.ts\nfunction parseCueOutDuration(value) {\n const num = parseFloat(value.trim());\n if (!Number.isNaN(num)) return num;\n const match = value.match(/(?:^|[,\\s])DURATION\\s*=\\s*([0-9.]+)/i) || value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (match && match[1] != null) {\n const dStr = match[1];\n const d = parseFloat(dStr);\n return Number.isNaN(d) ? void 0 : d;\n }\n return void 0;\n}\nfunction parseCueOutCont(value) {\n const res = {};\n const elapsedMatch = value.match(/Elapsed\\s*=\\s*([0-9.]+)/i);\n const durationMatch = value.match(/Duration\\s*=\\s*([0-9.]+)/i);\n if (elapsedMatch && elapsedMatch[1] != null) {\n const e = parseFloat(elapsedMatch[1]);\n if (!Number.isNaN(e)) res.elapsed = e;\n }\n if (durationMatch && durationMatch[1] != null) {\n const d = parseFloat(durationMatch[1]);\n if (!Number.isNaN(d)) res.duration = d;\n }\n if (!(\"elapsed\" in res) || !(\"duration\" in res)) {\n const slashMatch = value.match(/([0-9.]+)\\s*\\/\\s*([0-9.]+)/);\n if (slashMatch && slashMatch[1] && slashMatch[2]) {\n const elapsed = parseFloat(slashMatch[1]);\n const duration = parseFloat(slashMatch[2]);\n if (!Number.isNaN(elapsed) && !(\"elapsed\" in res)) res.elapsed = elapsed;\n if (!Number.isNaN(duration) && !(\"duration\" in res)) res.duration = duration;\n }\n }\n if (\"elapsed\" in res || \"duration\" in res) return res;\n return void 0;\n}\nfunction parseAttributeList(value) {\n const attrs = {};\n const regex = /([A-Z0-9-]+)=((\"[^\"]*\")|([^\",]*))(?:,|$)/gi;\n let match;\n while ((match = regex.exec(value)) !== null) {\n const key = match[1] ?? \"\";\n let rawVal = match[3] ?? match[4] ?? \"\";\n if (rawVal.startsWith('\"') && rawVal.endsWith('\"')) {\n rawVal = rawVal.slice(1, -1);\n }\n if (key) {\n attrs[key] = rawVal;\n }\n }\n return attrs;\n}\nfunction toNumber(val) {\n if (val == null) return void 0;\n const n = typeof val === \"string\" ? parseFloat(val) : Number(val);\n return Number.isNaN(n) ? void 0 : n;\n}\nfunction isManifestBasedMarker(marker) {\n const raw = marker.raw;\n if (!raw) return false;\n if (raw.tag) {\n const tag = String(raw.tag);\n return tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-CUE-IN\") || tag.includes(\"EXT-X-DATERANGE\");\n }\n if (raw.id3) return false;\n if (raw.splice_command_type) return false;\n return false;\n}\nfunction decodeId3ValueToText(value) {\n try {\n if (typeof value === \"string\") return value;\n const decoder = new TextDecoder(\"utf-8\", { fatal: false });\n const text = decoder.decode(value);\n if (text && /[\\x20-\\x7E]/.test(text)) return text;\n let out = \"\";\n for (let i = 0; i < value.length; i++)\n out += String.fromCharCode(value[i]);\n return out;\n } catch {\n return void 0;\n }\n}\nfunction getFragmentStartSeconds(frag) {\n const candidates = [frag?.start, frag?.startPTS];\n for (const candidate of candidates) {\n if (typeof candidate === \"number\" && Number.isFinite(candidate)) {\n return candidate;\n }\n }\n return void 0;\n}\nfunction parseScte35FromId3(tag) {\n const text = decodeId3ValueToText(tag.value);\n if (!text) return void 0;\n const cueOutMatch = text.match(/EXT-X-CUE-OUT(?::([^\\r\\n]*))?/i) || text.match(/CUE-OUT(?::([^\\r\\n]*))?/i);\n if (cueOutMatch) {\n const arg = (cueOutMatch[1] ?? \"\").trim();\n const dur = parseCueOutDuration(arg);\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...dur !== void 0 ? { durationSeconds: dur } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueOutContMatch = text.match(/EXT-X-CUE-OUT-CONT:([^\\r\\n]*)/i);\n if (cueOutContMatch) {\n const arg = (cueOutContMatch[1] ?? \"\").trim();\n const cont = parseCueOutCont(arg);\n const marker = {\n type: \"progress\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...cont?.duration !== void 0 ? { durationSeconds: cont.duration } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const cueInMatch = text.match(/EXT-X-CUE-IN\\b/i) || text.match(/CUE-IN\\b/i);\n if (cueInMatch) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n const daterangeMatch = text.match(/EXT-X-DATERANGE:([^\\r\\n]*)/i);\n if (daterangeMatch) {\n const attrs = parseAttributeList(daterangeMatch[1] ?? \"\");\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n if (hasScteIn) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text, attrs }\n };\n return marker;\n }\n }\n if (/SCTE35-OUT/i.test(text)) {\n const marker = {\n type: \"start\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (/SCTE35-IN/i.test(text)) {\n const marker = {\n type: \"end\",\n ...tag.ptsSeconds !== void 0 ? { ptsSeconds: tag.ptsSeconds } : {},\n raw: { id3: text }\n };\n return marker;\n }\n if (tag.value instanceof Uint8Array) {\n const bin = parseScte35Binary(tag.value);\n if (bin) return bin;\n }\n return void 0;\n}\nfunction normalizeFragmentPayload(payload) {\n if (payload instanceof Uint8Array) {\n return payload;\n }\n if (payload instanceof ArrayBuffer) {\n return new Uint8Array(payload);\n }\n if (ArrayBuffer.isView(payload)) {\n const view = payload;\n return new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n }\n return void 0;\n}\nfunction detectTsPacketFormat(data) {\n const packetSizes = [188, 192, 204];\n for (const packetSize of packetSizes) {\n const tsPayloadOffset = packetSize === 192 ? 4 : 0;\n for (let offset = 0; offset < packetSize; offset++) {\n let matchedPackets = 0;\n for (let packetStart = offset; packetStart + tsPayloadOffset < data.length && matchedPackets < 5; packetStart += packetSize) {\n if (data[packetStart + tsPayloadOffset] !== 71) {\n break;\n }\n matchedPackets++;\n }\n if (matchedPackets >= 2) {\n return { offset, packetSize, tsPayloadOffset };\n }\n }\n }\n return void 0;\n}\nfunction getPsiSectionStart(payload, payloadUnitStart) {\n if (!payloadUnitStart) {\n return void 0;\n }\n const pointerField = payload[0];\n if (pointerField == null) {\n return void 0;\n }\n const sectionStart = 1 + pointerField;\n return sectionStart < payload.length ? sectionStart : void 0;\n}\nfunction getPsiSectionLength(data, offset) {\n return ((data[offset + 1] ?? 0) & 15) << 8 | (data[offset + 2] ?? 0);\n}\nfunction parsePatSection(payload, payloadUnitStart, pmtPids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 8 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 0) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n for (let offset = sectionStart + 8; offset + 4 <= sectionEnd - 4; offset += 4) {\n const programNumber = (payload[offset] ?? 0) << 8 | (payload[offset + 1] ?? 0);\n const pid = ((payload[offset + 2] ?? 0) & 31) << 8 | (payload[offset + 3] ?? 0);\n if (programNumber !== 0) {\n pmtPids.add(pid);\n }\n }\n}\nfunction descriptorsIdentifyScte35(data, start, end) {\n let offset = start;\n while (offset + 2 <= end) {\n const tag = data[offset] ?? 0;\n const length = data[offset + 1] ?? 0;\n const descriptorStart = offset + 2;\n const descriptorEnd = descriptorStart + length;\n if (descriptorEnd > end) {\n return false;\n }\n const registration = length >= 4 ? String.fromCharCode(\n data[descriptorStart] ?? 0,\n data[descriptorStart + 1] ?? 0,\n data[descriptorStart + 2] ?? 0,\n data[descriptorStart + 3] ?? 0\n ) : \"\";\n if (tag === 138 || registration === \"CUEI\" || registration === \"SCTE\") {\n return true;\n }\n offset = descriptorEnd;\n }\n return false;\n}\nfunction parsePmtSection(payload, payloadUnitStart, tsScte35Pids) {\n const sectionStart = getPsiSectionStart(payload, payloadUnitStart);\n if (sectionStart == null || sectionStart + 12 >= payload.length) {\n return;\n }\n if (payload[sectionStart] !== 2) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, sectionStart);\n const sectionEnd = Math.min(\n payload.length,\n sectionStart + 3 + sectionLength\n );\n const programInfoLength = ((payload[sectionStart + 10] ?? 0) & 15) << 8 | (payload[sectionStart + 11] ?? 0);\n let offset = sectionStart + 12 + programInfoLength;\n while (offset + 5 <= sectionEnd - 4) {\n const streamType = payload[offset] ?? 0;\n const elementaryPid = ((payload[offset + 1] ?? 0) & 31) << 8 | (payload[offset + 2] ?? 0);\n const esInfoLength = ((payload[offset + 3] ?? 0) & 15) << 8 | (payload[offset + 4] ?? 0);\n const descriptorStart = offset + 5;\n const descriptorEnd = Math.min(descriptorStart + esInfoLength, sectionEnd - 4);\n if (streamType === 134 || streamType === 6 && descriptorsIdentifyScte35(payload, descriptorStart, descriptorEnd)) {\n tsScte35Pids.add(elementaryPid);\n }\n offset = descriptorStart + esInfoLength;\n }\n}\nfunction hasProcessedTsScte35Section(section, processedSections) {\n let checksum = 0;\n for (let i = 0; i < section.length; i++) {\n checksum = checksum * 31 + (section[i] ?? 0) >>> 0;\n }\n const key = `${section.length}:${checksum}`;\n if (processedSections.has(key)) {\n return true;\n }\n processedSections.add(key);\n if (processedSections.size > 200) {\n const firstKey = processedSections.values().next().value;\n if (firstKey) {\n processedSections.delete(firstKey);\n }\n }\n return false;\n}\nfunction addScte35SectionMarker(section, markers, processedSections) {\n if (section[0] !== 252 || hasProcessedTsScte35Section(section, processedSections)) {\n return;\n }\n const marker = parseScte35Binary(section);\n if (!marker) {\n return;\n }\n marker.raw = {\n ...typeof marker.raw === \"object\" && marker.raw ? marker.raw : {},\n source: \"ts-packet\"\n };\n markers.push(marker);\n}\nfunction appendScte35Bytes(pid, bytes, assemblers, markers, processedSections) {\n const assembler = assemblers.get(pid);\n if (!assembler) {\n return;\n }\n for (let i = 0; i < bytes.length && assembler.bytes.length < assembler.expectedLength; i++) {\n assembler.bytes.push(bytes[i] ?? 0);\n }\n if (assembler.bytes.length >= assembler.expectedLength) {\n assemblers.delete(pid);\n addScte35SectionMarker(new Uint8Array(assembler.bytes), markers, processedSections);\n }\n}\nfunction collectScte35SectionsFromPayload(pid, payload, payloadUnitStart, assemblers, markers, processedSections) {\n if (payload.length === 0) {\n return;\n }\n let offset = 0;\n if (payloadUnitStart) {\n const pointerField = payload[0] ?? 0;\n const previousAssembler = assemblers.get(pid);\n if (previousAssembler && pointerField > 0) {\n appendScte35Bytes(\n pid,\n payload.subarray(1, Math.min(1 + pointerField, payload.length)),\n assemblers,\n markers,\n processedSections\n );\n }\n assemblers.delete(pid);\n offset = 1 + pointerField;\n } else {\n appendScte35Bytes(pid, payload, assemblers, markers, processedSections);\n return;\n }\n while (offset + 3 <= payload.length) {\n const tableId = payload[offset];\n if (tableId == null || tableId === 255) {\n return;\n }\n const sectionLength = getPsiSectionLength(payload, offset);\n const totalLength = 3 + sectionLength;\n if (sectionLength <= 0 || totalLength <= 3) {\n return;\n }\n if (offset + totalLength <= payload.length) {\n addScte35SectionMarker(\n payload.subarray(offset, offset + totalLength),\n markers,\n processedSections\n );\n offset += totalLength;\n } else {\n assemblers.set(pid, {\n bytes: Array.from(payload.subarray(offset)),\n expectedLength: totalLength\n });\n return;\n }\n }\n}\nfunction parseScte35FromTsPackets(data, tsScte35Pids, pmtPids, processedSections) {\n const packetInfo = detectTsPacketFormat(data);\n if (!packetInfo) {\n return [];\n }\n const markers = [];\n const sectionAssemblers = /* @__PURE__ */ new Map();\n for (let packetStart = packetInfo.offset; packetStart + packetInfo.packetSize <= data.length; packetStart += packetInfo.packetSize) {\n const tsStart = packetStart + packetInfo.tsPayloadOffset;\n if (data[tsStart] !== 71) {\n continue;\n }\n const secondByte = data[tsStart + 1];\n const thirdByte = data[tsStart + 2];\n const fourthByte = data[tsStart + 3];\n if (secondByte == null || thirdByte == null || fourthByte == null || (secondByte & 128) !== 0) {\n continue;\n }\n const payloadUnitStart = (secondByte & 64) !== 0;\n const pid = (secondByte & 31) << 8 | thirdByte;\n const adaptationFieldControl = fourthByte >> 4 & 3;\n const hasPayload = adaptationFieldControl === 1 || adaptationFieldControl === 3;\n if (!hasPayload) {\n continue;\n }\n let payloadStart = tsStart + 4;\n if (adaptationFieldControl === 3) {\n const adaptationLength = data[payloadStart];\n if (adaptationLength == null) {\n continue;\n }\n payloadStart += 1 + adaptationLength;\n }\n const payloadEnd = Math.min(tsStart + 188, data.length);\n if (payloadStart >= payloadEnd || payloadStart >= data.length) {\n continue;\n }\n const payload = data.subarray(payloadStart, payloadEnd);\n if (pid === 0) {\n parsePatSection(payload, payloadUnitStart, pmtPids);\n } else if (pmtPids.has(pid)) {\n parsePmtSection(payload, payloadUnitStart, tsScte35Pids);\n } else if (tsScte35Pids.has(pid)) {\n collectScte35SectionsFromPayload(\n pid,\n payload,\n payloadUnitStart,\n sectionAssemblers,\n markers,\n processedSections\n );\n }\n }\n return markers;\n}\nvar BitReader = class {\n constructor(buf) {\n this.buf = buf;\n this.bytePos = 0;\n this.bitPos = 0;\n }\n readBits(numBits) {\n let result = 0;\n while (numBits > 0) {\n if (this.bytePos >= this.buf.length) return result;\n const remainingInByte = 8 - this.bitPos;\n const toRead = Math.min(numBits, remainingInByte);\n const currentByte = this.buf[this.bytePos];\n const shift = remainingInByte - toRead;\n const mask = (1 << toRead) - 1 & 255;\n const bits = currentByte >> shift & mask;\n result = result << toRead | bits;\n this.bitPos += toRead;\n if (this.bitPos >= 8) {\n this.bitPos = 0;\n this.bytePos += 1;\n }\n numBits -= toRead;\n }\n return result >>> 0;\n }\n skipBits(n) {\n this.readBits(n);\n }\n get bytePosition() {\n return this.bitPos === 0 ? this.bytePos : this.bytePos + 1;\n }\n};\nfunction readSpliceTime(r, ptsAdjustmentTicks) {\n const timeSpecifiedFlag = r.readBits(1) === 1;\n if (!timeSpecifiedFlag) {\n r.readBits(7);\n return void 0;\n }\n r.readBits(6);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const ptsTicks = (high * 4294967296 + low + ptsAdjustmentTicks) % 8589934592;\n return ptsTicks / 9e4;\n}\nfunction markerTypeFromSegmentationTypeId(segmentationTypeId) {\n switch (segmentationTypeId) {\n case 16:\n case 34:\n case 48:\n case 50:\n case 52:\n case 54:\n return \"start\";\n case 17:\n case 35:\n case 49:\n case 51:\n case 53:\n case 55:\n return \"end\";\n default:\n return void 0;\n }\n}\nfunction parseScte35SegmentationDescriptor(descriptor) {\n if (descriptor.length < 11) {\n return void 0;\n }\n const identifier = String.fromCharCode(\n descriptor[0] ?? 0,\n descriptor[1] ?? 0,\n descriptor[2] ?? 0,\n descriptor[3] ?? 0\n );\n if (identifier !== \"CUEI\") {\n return void 0;\n }\n const segmentationEventId = (descriptor[4] ?? 0) * 16777216 + ((descriptor[5] ?? 0) << 16) + ((descriptor[6] ?? 0) << 8) + (descriptor[7] ?? 0);\n const cancelIndicator = ((descriptor[8] ?? 0) & 128) !== 0;\n if (cancelIndicator) {\n return void 0;\n }\n const flags = descriptor[9] ?? 0;\n const programSegmentationFlag = (flags & 128) !== 0;\n const segmentationDurationFlag = (flags & 64) !== 0;\n let offset = 10;\n if (!programSegmentationFlag) {\n const componentCount = descriptor[offset] ?? 0;\n offset += 1 + componentCount * 6;\n if (offset > descriptor.length) {\n return void 0;\n }\n }\n let durationSeconds = void 0;\n if (segmentationDurationFlag) {\n if (offset + 5 > descriptor.length) {\n return void 0;\n }\n const durationTicks = (descriptor[offset] ?? 0) * 4294967296 + (descriptor[offset + 1] ?? 0) * 16777216 + ((descriptor[offset + 2] ?? 0) << 16) + ((descriptor[offset + 3] ?? 0) << 8) + (descriptor[offset + 4] ?? 0);\n durationSeconds = durationTicks / 9e4;\n offset += 5;\n }\n if (offset + 2 > descriptor.length) {\n return void 0;\n }\n offset += 1;\n const segmentationUpidLength = descriptor[offset] ?? 0;\n offset += 1 + segmentationUpidLength;\n if (offset >= descriptor.length) {\n return void 0;\n }\n const segmentationTypeId = descriptor[offset] ?? 0;\n const markerType = markerTypeFromSegmentationTypeId(segmentationTypeId);\n if (!markerType) {\n return void 0;\n }\n return {\n type: markerType,\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n segmentationEventId\n };\n}\nfunction parseScte35SegmentationDescriptors(data, offset) {\n if (offset + 2 > data.length) {\n return void 0;\n }\n const descriptorLoopLength = (data[offset] ?? 0) << 8 | (data[offset + 1] ?? 0);\n let descriptorOffset = offset + 2;\n const descriptorEnd = Math.min(\n data.length,\n descriptorOffset + descriptorLoopLength\n );\n while (descriptorOffset + 2 <= descriptorEnd) {\n const descriptorTag = data[descriptorOffset] ?? 0;\n const descriptorLength = data[descriptorOffset + 1] ?? 0;\n const descriptorDataStart = descriptorOffset + 2;\n const descriptorDataEnd = descriptorDataStart + descriptorLength;\n if (descriptorDataEnd > descriptorEnd) {\n return void 0;\n }\n if (descriptorTag === 2) {\n const descriptorMarker = parseScte35SegmentationDescriptor(\n data.subarray(descriptorDataStart, descriptorDataEnd)\n );\n if (descriptorMarker) {\n return descriptorMarker;\n }\n }\n descriptorOffset = descriptorDataEnd;\n }\n return void 0;\n}\nfunction parseScte35Binary(data) {\n const r = new BitReader(data);\n const tableId = r.readBits(8);\n if (tableId !== 252) return void 0;\n r.readBits(1);\n r.readBits(1);\n r.readBits(2);\n const sectionLength = r.readBits(12);\n if (sectionLength <= 0 || data.length < 3 + sectionLength) {\n return void 0;\n }\n r.readBits(8);\n r.readBits(1);\n r.readBits(6);\n const ptsAdjHigh = r.readBits(1);\n const ptsAdjLow = r.readBits(32);\n const ptsAdjustmentTicks = ptsAdjHigh * 4294967296 + ptsAdjLow;\n r.readBits(8);\n r.readBits(12);\n const spliceCommandLength = r.readBits(12);\n const spliceCommandType = r.readBits(8);\n let markerType;\n let durationSeconds = void 0;\n let ptsSeconds = void 0;\n let spliceEventId = void 0;\n const commandBodyStart = r.bytePosition;\n if (spliceCommandType === 5) {\n spliceEventId = r.readBits(32);\n const cancel = r.readBits(1) === 1;\n r.readBits(7);\n if (cancel) return void 0;\n const outOfNetwork = r.readBits(1) === 1;\n const programSpliceFlag = r.readBits(1) === 1;\n const durationFlag = r.readBits(1) === 1;\n const spliceImmediateFlag = r.readBits(1) === 1;\n r.readBits(4);\n markerType = outOfNetwork ? \"start\" : \"end\";\n if (programSpliceFlag && !spliceImmediateFlag) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else if (!programSpliceFlag) {\n const componentCount = r.readBits(8);\n for (let i = 0; i < componentCount; i++) {\n r.readBits(8);\n if (!spliceImmediateFlag) {\n const componentPtsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n if (ptsSeconds === void 0) {\n ptsSeconds = componentPtsSeconds;\n }\n }\n }\n }\n if (durationFlag) {\n r.readBits(6);\n r.readBits(1);\n const high = r.readBits(1);\n const low = r.readBits(32);\n const durationTicks = high * 4294967296 + low;\n durationSeconds = durationTicks / 9e4;\n }\n r.readBits(16);\n r.readBits(8);\n r.readBits(8);\n } else if (spliceCommandType === 6) {\n ptsSeconds = readSpliceTime(r, ptsAdjustmentTicks);\n } else {\n return void 0;\n }\n const expectedDescriptorOffset = spliceCommandLength === 4095 ? r.bytePosition : commandBodyStart + spliceCommandLength;\n const descriptorMarker = parseScte35SegmentationDescriptors(\n data,\n expectedDescriptorOffset\n );\n if (descriptorMarker) {\n markerType = descriptorMarker.type;\n if (durationSeconds === void 0) {\n durationSeconds = descriptorMarker.durationSeconds;\n }\n }\n if (!markerType) {\n return void 0;\n }\n const marker = {\n type: markerType,\n ...ptsSeconds !== void 0 ? { ptsSeconds } : {},\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: {\n splice_command_type: spliceCommandType,\n ...spliceEventId !== void 0 ? { splice_event_id: spliceEventId } : {},\n ...descriptorMarker?.segmentationEventId !== void 0 ? { segmentation_event_id: descriptorMarker.segmentationEventId } : {}\n }\n };\n return marker;\n}\n\n// src/player/Scte35CueManager.ts\nvar Scte35CueManager = class {\n constructor(debug, callbacks) {\n this.pendingScte35Cues = /* @__PURE__ */ new Map();\n this.recentScte35CueKeys = /* @__PURE__ */ new Map();\n this.recentScte35CueLimit = 200;\n this.tsScte35Pids = /* @__PURE__ */ new Set();\n this.pmtPids = /* @__PURE__ */ new Set();\n this.processedTsScte35Sections = /* @__PURE__ */ new Set();\n this.debug = debug;\n this.callbacks = callbacks;\n }\n get pendingScte35CueKey() {\n return this.pendingScte35CueKeyValue;\n }\n set pendingScte35CueKey(value) {\n this.pendingScte35CueKeyValue = value;\n }\n get activeScte35BreakKey() {\n return this.activeScte35BreakKeyValue;\n }\n set activeScte35BreakKey(value) {\n this.activeScte35BreakKeyValue = value;\n }\n get scheduledScte35BreakKey() {\n return this.scheduledScte35BreakKeyValue;\n }\n set scheduledScte35BreakKey(value) {\n this.scheduledScte35BreakKeyValue = value;\n }\n createScte35CueContext(source, readiness, frag) {\n const context = { source, readiness };\n if (typeof frag?.sn === \"number\") {\n context.fragmentSn = frag.sn;\n }\n const fragmentStartSec = getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n return context;\n }\n onScte35Cue(marker, context) {\n const cue = this.createScte35Cue(marker, context);\n const pendingKey = this.getPendingScte35CueKey(cue);\n if (context.readiness === \"early\") {\n this.pendingScte35Cues.set(pendingKey, cue);\n this.trimRecentScte35CueMaps();\n if (marker.type === \"start\") {\n this.callbacks.onEarlyStartCue(marker, context.fragmentSn, cue.key);\n }\n return;\n }\n if (marker.type === \"end\" && !this.shouldAcceptScte35EndCue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring SCTE-35 end cue\", {\n key: cue.key,\n activeScte35BreakKey: this.activeScte35BreakKeyValue,\n inAdBreak: this.callbacks.isInAdBreak(),\n source: cue.source\n });\n }\n return;\n }\n if (marker.type === \"start\" && this.hasRecentlyHandledScte35Cue(cue)) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ignoring duplicate SCTE-35 start cue\", {\n key: cue.key,\n source: cue.source\n });\n }\n return;\n }\n this.pendingScte35Cues.delete(pendingKey);\n this.markScte35CueHandled(cue);\n this.callbacks.onPlaybackCue(marker, cue.key);\n }\n activatePendingScte35CuesForFragment(frag) {\n const fragmentSn = typeof frag?.sn === \"number\" ? frag.sn : void 0;\n if (fragmentSn === void 0) {\n return;\n }\n const matchingCues = Array.from(this.pendingScte35Cues.entries()).filter(\n ([, cue]) => cue.fragmentSn === fragmentSn\n );\n matchingCues.forEach(([pendingKey, cue]) => {\n this.pendingScte35Cues.delete(pendingKey);\n const context = {\n source: cue.source,\n readiness: \"playback\"\n };\n context.fragmentSn = fragmentSn;\n const fragmentStartSec = cue.fragmentStartSeconds ?? getFragmentStartSeconds(frag);\n if (fragmentStartSec !== void 0) {\n context.fragmentStartSeconds = fragmentStartSec;\n }\n this.onScte35Cue(cue.marker, context);\n });\n }\n createScte35Cue(marker, context) {\n const cue = {\n marker,\n source: context.source,\n readiness: context.readiness,\n key: this.getScte35CueKey(marker, context)\n };\n if (context.fragmentSn !== void 0) {\n cue.fragmentSn = context.fragmentSn;\n }\n if (context.fragmentStartSeconds !== void 0) {\n cue.fragmentStartSeconds = context.fragmentStartSeconds;\n }\n return cue;\n }\n getScte35CueKey(marker, context) {\n const raw = this.getScte35MarkerRaw(marker);\n const spliceEventId = this.toIdentityString(raw?.splice_event_id);\n if (spliceEventId) {\n return `splice:${spliceEventId}`;\n }\n const segmentationEventId = this.toIdentityString(raw?.segmentation_event_id);\n if (segmentationEventId) {\n return `segmentation:${segmentationEventId}`;\n }\n const daterangeId = this.toIdentityString(raw?.attrs?.ID);\n if (daterangeId) {\n return `daterange:${daterangeId}`;\n }\n const scteValue = this.toIdentityString(raw?.attrs?.[\"SCTE35-OUT\"]) || this.toIdentityString(raw?.attrs?.[\"SCTE35-IN\"]);\n if (scteValue) {\n return `daterange-scte:${scteValue}`;\n }\n if (typeof marker.ptsSeconds === \"number\" && Number.isFinite(marker.ptsSeconds)) {\n return `pts:${Math.round(marker.ptsSeconds * 2) / 2}`;\n }\n if (context.fragmentSn !== void 0) {\n return `fragment:${context.fragmentSn}`;\n }\n return `${context.source}:wallclock:${Math.floor(Date.now() / 1e3)}`;\n }\n getPendingScte35CueKey(cue) {\n return `${cue.marker.type}:${cue.key}:${cue.fragmentSn !== void 0 ? cue.fragmentSn : \"unknown\"}`;\n }\n getScte35MarkerRaw(marker) {\n return typeof marker.raw === \"object\" && marker.raw !== null ? marker.raw : {};\n }\n toIdentityString(value) {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return String(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n return value.trim();\n }\n return void 0;\n }\n isStrongScte35CueKey(key) {\n return !!(key && (key.startsWith(\"splice:\") || key.startsWith(\"segmentation:\") || key.startsWith(\"daterange:\") || key.startsWith(\"daterange-scte:\")));\n }\n hasRecentlyHandledScte35Cue(cue) {\n if (this.activeScte35BreakKeyValue === cue.key || this.scheduledScte35BreakKeyValue === cue.key) {\n return true;\n }\n const recentKey = `${cue.marker.type}:${cue.key}`;\n return this.recentScte35CueKeys.has(recentKey);\n }\n markScte35CueHandled(cue) {\n this.recentScte35CueKeys.set(`${cue.marker.type}:${cue.key}`, Date.now());\n this.trimRecentScte35CueMaps();\n }\n trimRecentScte35CueMaps() {\n while (this.recentScte35CueKeys.size > this.recentScte35CueLimit) {\n const firstKey = this.recentScte35CueKeys.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.recentScte35CueKeys.delete(firstKey);\n }\n while (this.pendingScte35Cues.size > this.recentScte35CueLimit) {\n const firstKey = this.pendingScte35Cues.keys().next().value;\n if (!firstKey) {\n break;\n }\n this.pendingScte35Cues.delete(firstKey);\n }\n }\n shouldAcceptScte35EndCue(cue) {\n if (!this.callbacks.isInAdBreak()) {\n return false;\n }\n if (this.isStrongScte35CueKey(this.activeScte35BreakKeyValue) && this.isStrongScte35CueKey(cue.key) && this.activeScte35BreakKeyValue !== cue.key) {\n return false;\n }\n return true;\n }\n};\n\n// src/player/AdConfigManager.ts\nvar AdConfigManager = class {\n constructor(config, video) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds = /* @__PURE__ */ new Set();\n this.streamCorrelator = generateCorrelator();\n this.viewCorrelator = generateCorrelator();\n this.consentSignals = {};\n this.podCounter = 0;\n this.podAssignedByPrefetch = false;\n this.lastHeartbeatTime = 0;\n this.defaultPodMaxAds = 6;\n this.defaultPodMaxDurationMs = 12e4;\n this.config = config;\n this.video = video;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n isVmapEnabled() {\n return !!(this.config.isVmap && this.config.vmapUrl?.trim());\n }\n async fetchAdConfiguration() {\n if (this.isVmapEnabled()) {\n await this.fetchAndParseVmap(this.config.vmapUrl);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VMAP mode enabled\");\n }\n return;\n }\n const vastMode = this.config.vastMode || \"default\";\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] VAST mode:\", vastMode);\n }\n if (vastMode === \"adstorm\") {\n if (!this.config.licenseKey) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] AdStorm mode requires a license key\"\n );\n }\n return;\n }\n const vastEndpoint = `https://adstorm.co/api-adstorm-dev/adstorm/vast/${this.config.licenseKey}`;\n this.apiVastTagUrl = vastEndpoint;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using AdStorm VAST endpoint (adstorm mode):\",\n vastEndpoint\n );\n }\n return;\n }\n if (this.config.vastTagUrl) {\n this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Using custom VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n return;\n }\n const apiUrl = \"https://adstorm.co/api-adstorm-dev/adstorm/ads/web\";\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Fetching ad configuration from:\",\n apiUrl\n );\n }\n const headers = {};\n if (this.config.licenseKey) {\n headers[\"Authorization\"] = `Bearer ${this.config.licenseKey}`;\n }\n const response = await fetch(apiUrl, { headers });\n if (!response.ok) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Failed to fetch ad configuration: ${response.status}`\n );\n }\n return;\n }\n const data = await response.json();\n const imaPayload = data.response?.ima?.[\"publisherdesk.ima\"]?.payload;\n if (imaPayload) {\n let decodedPayload = imaPayload;\n try {\n decodedPayload = decodeURIComponent(imaPayload);\n } catch {\n console.warn(\"[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:\", imaPayload);\n }\n console.log(\"[StormcloudVideoPlayer] Raw VAST tag URL (from API):\", decodedPayload);\n this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Normalized VAST tag URL:\",\n this.apiVastTagUrl\n );\n }\n } else {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response\"\n );\n }\n }\n const numberAds = data.response?.options?.vast?.cue_tones?.number_ads;\n if (numberAds != null && numberAds > 0) {\n this.apiNumberAds = numberAds;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Number of ads per break from API:\",\n this.apiNumberAds\n );\n }\n }\n }\n async fetchAndParseVmap(vmapUrl) {\n if (!vmapUrl.trim()) {\n return;\n }\n try {\n const response = await fetch(vmapUrl);\n if (!response.ok) {\n throw new Error(`Failed to fetch VMAP (${response.status})`);\n }\n const vmapXml = await response.text();\n this.vmapBreaks = this.parseVmapToBreaks(vmapXml);\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Loaded ${this.vmapBreaks.length} VMAP ad break(s) from:`,\n vmapUrl\n );\n }\n } catch (error) {\n this.vmapBreaks = [];\n this.consumedVmapBreakIds.clear();\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to load VMAP:\", error);\n }\n }\n }\n parseVmapToBreaks(vmapXml) {\n if (typeof DOMParser === \"undefined\") {\n return [];\n }\n const doc = new DOMParser().parseFromString(vmapXml, \"application/xml\");\n if (doc.querySelector(\"parsererror\")) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Invalid VMAP XML received\");\n }\n return [];\n }\n const VMAP_NS = \"http://www.iab.net/videosuite/vmap\";\n let adBreakNodes = Array.from(doc.getElementsByTagNameNS(VMAP_NS, \"AdBreak\"));\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(\n doc.querySelectorAll(\"AdBreak, vmap\\\\:AdBreak\")\n );\n }\n if (adBreakNodes.length === 0) {\n adBreakNodes = Array.from(doc.getElementsByTagName(\"*\")).filter(\n (el) => el.localName === \"AdBreak\"\n );\n }\n const parsed = [];\n adBreakNodes.forEach((node, index) => {\n const timeOffsetRaw = (node.getAttribute(\"timeOffset\") || \"\").trim();\n const startTimeMs = this.parseVmapTimeOffsetToMs(timeOffsetRaw);\n if (startTimeMs == null) {\n return;\n }\n let adTagNode = node.getElementsByTagNameNS(VMAP_NS, \"AdTagURI\")[0];\n if (!adTagNode) {\n adTagNode = node.querySelector(\"AdTagURI, vmap\\\\:AdTagURI\") ?? void 0;\n }\n const adTagUrl = (adTagNode?.textContent || \"\").trim();\n if (!adTagUrl) {\n return;\n }\n const breakId = node.getAttribute(\"breakId\") || `vmap-break-${index}-${timeOffsetRaw || \"unknown\"}`;\n parsed.push({\n id: breakId,\n startTimeMs,\n vastTagUrl: adTagUrl\n });\n });\n parsed.sort((a, b) => {\n const aStart = a.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : a.startTimeMs;\n const bStart = b.startTimeMs < 0 ? Number.MAX_SAFE_INTEGER : b.startTimeMs;\n return aStart - bStart;\n });\n return parsed;\n }\n parseVmapTimeOffsetToMs(timeOffset) {\n if (!timeOffset) {\n return void 0;\n }\n const normalized = timeOffset.trim().toLowerCase();\n if (normalized === \"start\") {\n return 0;\n }\n if (normalized === \"end\") {\n return -1;\n }\n const hms = timeOffset.match(\n /^(\\d{1,2}):(\\d{2}):(\\d{2})(?:\\.(\\d{1,3}))?$/\n );\n if (hms) {\n const [, hh, mm, ss, ms = \"0\"] = hms;\n const hours = Number(hh);\n const minutes = Number(mm);\n const seconds = Number(ss);\n const millis = Number(ms.padEnd(3, \"0\").slice(0, 3));\n return (hours * 3600 + minutes * 60 + seconds) * 1e3 + millis;\n }\n const percent = timeOffset.match(/^(\\d+(?:\\.\\d+)?)%$/);\n if (percent) {\n const ratio = Number(percent[1]) / 100;\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3 * ratio);\n }\n return void 0;\n }\n return void 0;\n }\n getAdBreakKey(adBreak) {\n if (adBreak.id) {\n return adBreak.id;\n }\n return `${adBreak.startTimeMs}-${adBreak.vastTagUrl || \"\"}`;\n }\n resolveBreakStartMs(adBreak) {\n if (adBreak.startTimeMs >= 0) {\n return adBreak.startTimeMs;\n }\n if (adBreak.startTimeMs === -1) {\n const durationSec = this.video.duration;\n if (Number.isFinite(durationSec) && durationSec > 0) {\n return Math.floor(durationSec * 1e3);\n }\n }\n return void 0;\n }\n findCurrentOrNextBreak(nowMs) {\n const schedule = this.vmapBreaks;\n let candidate;\n const tol = this.config.driftToleranceMs ?? 1e3;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (breakStartMs <= nowMs + tol && (candidate == null || breakStartMs > (this.resolveBreakStartMs(candidate) ?? 0))) {\n candidate = b;\n }\n }\n return candidate;\n }\n findBreakForTime(nowMs) {\n const schedule = this.vmapBreaks;\n for (const b of schedule) {\n if (this.consumedVmapBreakIds.has(this.getAdBreakKey(b))) {\n continue;\n }\n const breakStartMs = this.resolveBreakStartMs(b);\n if (breakStartMs == null) {\n continue;\n }\n if (b.durationMs) {\n const end = breakStartMs + b.durationMs;\n if (nowMs >= breakStartMs && nowMs < end) {\n return b;\n }\n continue;\n }\n if (nowMs >= breakStartMs) {\n return b;\n }\n }\n return void 0;\n }\n selectVastTagsForBreak(b) {\n if (!b || !b.vastTagUrl) return void 0;\n if (b.vastTagUrl.includes(\",\")) {\n return b.vastTagUrl.split(\",\").map((s) => s.trim()).filter((s) => s.length > 0);\n }\n return [b.vastTagUrl];\n }\n beginNewAdPod() {\n this.podCounter++;\n }\n resolvePodParams(breakDurationMs) {\n const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs != null && this.config.podMaxDurationMs > 0 ? this.config.podMaxDurationMs : this.defaultPodMaxDurationMs;\n const maxAds = this.config.podMaxAds && this.config.podMaxAds > 0 ? this.config.podMaxAds : this.apiNumberAds && this.apiNumberAds > 0 ? this.apiNumberAds : this.defaultPodMaxAds;\n const minDurationMs = this.config.podExactDuration && maxDurationMs != null ? maxDurationMs : 0;\n return { maxAds, minDurationMs, maxDurationMs };\n }\n getPalDescriptionUrl() {\n if (!this.apiVastTagUrl) return void 0;\n try {\n const params = new URL(this.apiVastTagUrl).searchParams;\n return params.get(\"description_url\") || params.get(\"url\") || void 0;\n } catch {\n return void 0;\n }\n }\n generatePodVastUrl(baseUrl, podParams, adPlayer, palNonce, inAdBreak) {\n const adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;\n const envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);\n const urlWithMacros = applyVastMacros(baseUrl, {\n correlator: this.viewCorrelator,\n streamCorrelator: this.streamCorrelator,\n pod: this.podCounter > 0 ? this.podCounter : void 0,\n podMaxAds: podParams.maxAds,\n podMinDurationMs: podParams.minDurationMs,\n podMaxDurationMs: podParams.maxDurationMs,\n isCtv: envSignals.isCtv,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? toDevSafeUrl(window.location.href) : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n sessionId: envSignals.isCtv || this.consentSignals.storageAllowed !== false ? envSignals.sessionId : void 0,\n deviceId: envSignals.deviceId,\n deviceIdType: envSignals.deviceIdType,\n limitAdTracking: envSignals.limitAdTracking,\n deviceTypeHint: envSignals.deviceTypeHint,\n adTest: this.config.adTest,\n ...this.config.programTitle ? { programTitle: this.config.programTitle } : {},\n ...this.config.channelName ? { channelName: this.config.channelName } : {},\n consent: this.consentSignals\n });\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved optimized-pod request URL (pod=${this.podCounter}, pmad=${podParams.maxAds}, pmnd=${podParams.minDurationMs}, pmxd=${podParams.maxDurationMs ?? \"?\"}):`,\n finalUrl\n );\n return finalUrl;\n }\n // --- Tracking ---\n initializeTracking() {\n sendInitialTracking(this.config.licenseKey, buildAnalyticsContext(this.config)).then(() => {\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n }).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send initial tracking:\",\n error\n );\n }\n this.heartbeatInterval = window.setInterval(() => {\n this.sendHeartbeatIfNeeded();\n }, 5e3);\n });\n }\n sendHeartbeatIfNeeded() {\n const now = Date.now();\n if (!this.lastHeartbeatTime || now - this.lastHeartbeatTime > 3e4) {\n this.lastHeartbeatTime = now;\n sendHeartbeat(this.config.licenseKey, buildAnalyticsContext(this.config)).catch((error) => {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to send heartbeat:\",\n error\n );\n }\n });\n }\n }\n destroyTracking() {\n if (this.heartbeatInterval) {\n clearInterval(this.heartbeatInterval);\n this.heartbeatInterval = void 0;\n }\n }\n};\n\n// src/player/AdTimingService.ts\nvar AdTimingService = class {\n constructor(config, video, callbacks) {\n this.adRequestWatchdogToken = null;\n this.adFailsafeToken = null;\n this.ptsDriftEmaMs = 0;\n this.adBreakPlayedDurationMs = 0;\n this.adBreakEpoch = 0;\n this.adRequestTokenCounter = 0;\n this.activeAdRequestToken = null;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.totalAdRequestsInBreak = 0;\n this.maxTotalAdRequestsPerBreak = 10;\n this.lastAdRequestTime = 0;\n this.consecutiveFailures = 0;\n this.maxConsecutiveFailures = 5;\n this.minAdRequestIntervalMs = 3e3;\n this.backoffBaseMs = 1e3;\n this.maxBackoffMs = 15e3;\n this.defaultMinRemainingMsToStartAd = 4e3;\n this.failedVastUrls = /* @__PURE__ */ new Set();\n this.temporaryFailureUrls = /* @__PURE__ */ new Map();\n this.temporaryFailureCooldownMs = 3e4;\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillThreshold = 3;\n this.globalNoFillCooldownUntil = 0;\n this.globalNoFillBackoffBaseMs = 5e3;\n this.globalNoFillBackoffMaxMs = 6e4;\n this.globalLastGamRequestTime = 0;\n this.globalMinGamIntervalMs = 3e3;\n this.config = config;\n this.video = video;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n // --- Ad stop timer ---\n scheduleAdStopCountdown(remainingMs) {\n this.clearAdStopTimer();\n const ms = Math.max(0, Math.floor(remainingMs));\n if (ms === 0) {\n this.ensureAdStoppedByTimer();\n return;\n }\n this.adStopTimerId = window.setTimeout(() => {\n this.ensureAdStoppedByTimer();\n }, ms);\n }\n clearAdStopTimer() {\n if (this.adStopTimerId != null) {\n clearTimeout(this.adStopTimerId);\n this.adStopTimerId = void 0;\n }\n }\n ensureAdStoppedByTimer() {\n this.adStopTimerId = void 0;\n this.callbacks.onAdStopTimerFired();\n }\n // --- Ad start timer ---\n scheduleAdStartIn(delayMs, marker = { type: \"start\" }, cueKey) {\n this.clearAdStartTimer();\n const ms = Math.max(0, Math.floor(delayMs));\n if (ms === 0) {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n return;\n }\n this.adStartTimerId = window.setTimeout(() => {\n this.callbacks.onAdStartTimerFired(marker, cueKey);\n }, ms);\n }\n clearAdStartTimer() {\n if (this.adStartTimerId != null) {\n clearTimeout(this.adStartTimerId);\n this.adStartTimerId = void 0;\n }\n }\n // --- PTS drift ---\n updatePtsDrift(ptsSecondsSample) {\n const sampleMs = (this.video.currentTime - ptsSecondsSample) * 1e3;\n if (!Number.isFinite(sampleMs) || Math.abs(sampleMs) > 6e4) return;\n const alpha = 0.1;\n this.ptsDriftEmaMs = this.ptsDriftEmaMs * (1 - alpha) + sampleMs * alpha;\n }\n resolveScteBreakStartWallClockMs(marker) {\n const nowWallClockMs = Date.now();\n if (typeof marker.ptsSeconds !== \"number\") {\n return nowWallClockMs;\n }\n const nowMs = this.video.currentTime * 1e3;\n const estimatedCurrentPtsMs = nowMs - this.ptsDriftEmaMs;\n const deltaMs = marker.ptsSeconds * 1e3 - estimatedCurrentPtsMs;\n if (!Number.isFinite(deltaMs)) {\n return nowWallClockMs;\n }\n return nowWallClockMs + Math.floor(deltaMs);\n }\n // --- Duration boundary ---\n setAdBreakDurationBoundary(durationMs) {\n this.expectedAdBreakDurationMs = durationMs;\n if (durationMs != null && this.currentAdBreakStartWallClockMs != null) {\n this.scteAdBreakEndWallClockMs = this.currentAdBreakStartWallClockMs + durationMs;\n } else {\n this.scteAdBreakEndWallClockMs = void 0;\n }\n }\n scheduleAdStopAtBreakBoundary() {\n if (this.expectedAdBreakDurationMs == null) {\n return;\n }\n this.scheduleAdStopCountdown(this.getWallClockRemainingAdMs());\n }\n // --- Duration budget ---\n getWallClockRemainingAdMs() {\n const endWallClockMs = this.getAdBreakEndWallClockMs();\n if (endWallClockMs != null) {\n return Math.max(0, endWallClockMs - Date.now());\n }\n return 0;\n }\n getAdBreakEndWallClockMs() {\n if (this.scteAdBreakEndWallClockMs != null) {\n return this.scteAdBreakEndWallClockMs;\n }\n if (this.expectedAdBreakDurationMs == null || this.currentAdBreakStartWallClockMs == null) {\n return void 0;\n }\n return this.currentAdBreakStartWallClockMs + this.expectedAdBreakDurationMs;\n }\n getDurationBudgetRemainingMs() {\n if (this.expectedAdBreakDurationMs == null) {\n return 0;\n }\n return Math.max(0, this.expectedAdBreakDurationMs - this.adBreakPlayedDurationMs);\n }\n getLoadedAdDurationMs(adController) {\n const durationSec = adController.getLoadedAdDuration?.();\n if (durationSec == null || durationSec <= 0) {\n return 0;\n }\n return Math.round(durationSec * 1e3);\n }\n adFitsRemainingBudget(durationMs) {\n if (durationMs <= 0) {\n return true;\n }\n return durationMs <= this.getDurationBudgetRemainingMs();\n }\n logAdDurationDecision(accepted, durationMs, adController) {\n if (!this.debug) {\n return;\n }\n const remainingBudget = this.getDurationBudgetRemainingMs();\n const adId = adController.getLoadedAdId?.() ?? \"unknown\";\n if (accepted) {\n console.log(\n `[AD-DURATION] Accepted ad id=${adId}, duration=${durationMs}ms, budget remaining after play=${Math.max(0, remainingBudget - durationMs)}ms`\n );\n } else {\n console.log(\n `[AD-DURATION] Rejected ad id=${adId}, duration=${durationMs}ms exceeds remaining budget=${remainingBudget}ms \\u2014 requesting another ad`\n );\n }\n }\n recordPlayedAdDuration(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n if (durationMs <= 0) {\n return;\n }\n this.adBreakPlayedDurationMs += durationMs;\n if (this.debug) {\n console.log(\n `[AD-DURATION] Played ${durationMs}ms \\u2014 total played=${this.adBreakPlayedDurationMs}ms / ${this.expectedAdBreakDurationMs ?? \"?\"}ms`\n );\n }\n }\n ensureLoadedAdFitsBudget(adController) {\n const durationMs = this.getLoadedAdDurationMs(adController);\n const fits = this.adFitsRemainingBudget(durationMs);\n this.logAdDurationDecision(fits, durationMs, adController);\n return fits;\n }\n rejectLoadedAdForDuration(adController) {\n try {\n adController.destroy();\n } catch {\n }\n }\n markAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n this.totalAdRequestsInBreak++;\n this.lastAdRequestTime = Date.now();\n }\n notePodAdStarted() {\n this.currentAdIndex++;\n this.totalAdsInBreak = this.currentAdIndex;\n }\n getRemainingAdMs() {\n const wallClockRemaining = this.getWallClockRemainingAdMs();\n const budgetRemaining = this.getDurationBudgetRemainingMs();\n if (this.expectedAdBreakDurationMs == null) {\n return wallClockRemaining;\n }\n return Math.min(wallClockRemaining, budgetRemaining);\n }\n getMinRemainingMsToStartAd() {\n const configured = this.config.minRemainingMsToStartAd;\n if (typeof configured === \"number\" && configured >= 0) {\n return configured;\n }\n return this.defaultMinRemainingMsToStartAd;\n }\n hasTimeToStartAnotherAd() {\n const minRemaining = this.getMinRemainingMsToStartAd();\n return this.getWallClockRemainingAdMs() > minRemaining && this.getDurationBudgetRemainingMs() > minRemaining;\n }\n // --- Circuit breaker ---\n isTemporaryAdError(error) {\n const message = error?.message?.toLowerCase() || \"\";\n if (message.includes(\"no ads available\") || message.includes(\"no fill\") || message.includes(\"nofill\")) {\n return true;\n }\n if (message.includes(\"timeout\")) {\n return true;\n }\n if (message.includes(\"rate limit\") || message.includes(\"too many requests\")) {\n return true;\n }\n if (message.includes(\"ad playback error\")) {\n return true;\n }\n return false;\n }\n isUrlInCooldown(vastTagUrl) {\n const failureTime = this.temporaryFailureUrls.get(vastTagUrl);\n if (failureTime == null) {\n return false;\n }\n const elapsed = Date.now() - failureTime;\n if (elapsed >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(vastTagUrl);\n return false;\n }\n return true;\n }\n cleanupTemporaryFailures() {\n const now = Date.now();\n for (const [url, timestamp] of this.temporaryFailureUrls) {\n if (now - timestamp >= this.temporaryFailureCooldownMs) {\n this.temporaryFailureUrls.delete(url);\n }\n }\n }\n isGamInCooldown() {\n return Date.now() < this.globalNoFillCooldownUntil;\n }\n recordGamNoFill() {\n this.globalConsecutiveNoFills++;\n if (this.globalConsecutiveNoFills >= this.globalNoFillThreshold) {\n const exponent = this.globalConsecutiveNoFills - this.globalNoFillThreshold;\n const backoff = Math.min(\n this.globalNoFillBackoffBaseMs * Math.pow(2, exponent),\n this.globalNoFillBackoffMaxMs\n );\n this.globalNoFillCooldownUntil = Date.now() + backoff;\n if (this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] GAM cooldown activated: ${backoff}ms (${this.globalConsecutiveNoFills} consecutive no-fills)`\n );\n }\n }\n }\n resetGamNoFillCounter() {\n if (this.globalConsecutiveNoFills > 0 && this.debug) {\n console.log(\n `[CIRCUIT-BREAKER] Resetting no-fill counter (was ${this.globalConsecutiveNoFills})`\n );\n }\n this.globalConsecutiveNoFills = 0;\n this.globalNoFillCooldownUntil = 0;\n }\n async enforceGlobalRateLimit() {\n const now = Date.now();\n const elapsed = now - this.globalLastGamRequestTime;\n if (elapsed < this.globalMinGamIntervalMs) {\n const waitMs = this.globalMinGamIntervalMs - elapsed;\n if (this.debug) {\n console.log(`[RATE-LIMIT] Waiting ${waitMs}ms before next GAM request`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitMs));\n }\n this.globalLastGamRequestTime = Date.now();\n }\n // --- Watchdog ---\n startAdRequestWatchdog(token) {\n this.clearAdRequestWatchdog();\n const timeoutMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adRequestWatchdogToken = token;\n this.adRequestWatchdogId = window.setTimeout(() => {\n if (this.adRequestWatchdogToken !== token) {\n return;\n }\n this.adRequestWatchdogId = void 0;\n this.adRequestWatchdogToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_request_timeout\", { token, timeoutMs });\n this.callbacks.onWatchdogTimeout();\n }, timeoutMs);\n this.logAdState(\"ad_request_watchdog_started\", { token, timeoutMs });\n }\n clearAdRequestWatchdog() {\n if (this.adRequestWatchdogId != null) {\n clearTimeout(this.adRequestWatchdogId);\n this.adRequestWatchdogId = void 0;\n }\n if (this.adRequestWatchdogToken != null) {\n this.logAdState(\"ad_request_watchdog_cleared\", {\n token: this.adRequestWatchdogToken\n });\n this.adRequestWatchdogToken = null;\n }\n }\n // --- Failsafe ---\n startAdFailsafeTimer(token) {\n this.clearAdFailsafeTimer();\n const failsafeMs = this.config.adFailsafeTimeoutMs ?? 1e4;\n this.adFailsafeToken = token;\n this.adFailsafeTimerId = window.setTimeout(() => {\n if (this.adFailsafeToken !== token) {\n return;\n }\n this.adFailsafeTimerId = void 0;\n this.adFailsafeToken = null;\n if (this.activeAdRequestToken === token) {\n this.activeAdRequestToken = null;\n }\n this.logAdState(\"ad_failsafe_triggered\", {\n token,\n failsafeMs,\n videoPaused: this.video.paused\n });\n this.callbacks.onFailsafeTimeout();\n }, failsafeMs);\n this.logAdState(\"ad_failsafe_started\", { token, failsafeMs });\n }\n clearAdFailsafeTimer() {\n if (this.adFailsafeTimerId != null) {\n clearTimeout(this.adFailsafeTimerId);\n this.logAdState(\"ad_failsafe_cleared\", { token: this.adFailsafeToken });\n this.adFailsafeTimerId = void 0;\n }\n this.adFailsafeToken = null;\n }\n logAdState(event, extra = {}) {\n if (!this.debug) {\n return;\n }\n const { inAdBreak, showAds, adPlaying } = this.callbacks.getAdState();\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n showAds,\n adPlaying,\n inAdBreak,\n activeAdRequestToken: this.activeAdRequestToken,\n ...extra\n });\n }\n // --- Reset for ad break end ---\n resetForBreakEnd() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdRequestWatchdog();\n this.clearAdFailsafeTimer();\n this.activeAdRequestToken = null;\n this.expectedAdBreakDurationMs = void 0;\n this.currentAdBreakStartWallClockMs = void 0;\n this.scteAdBreakEndWallClockMs = void 0;\n this.adBreakPlayedDurationMs = 0;\n this.currentAdIndex = 0;\n this.totalAdsInBreak = 0;\n this.consecutiveFailures = 0;\n this.globalConsecutiveNoFills = 0;\n this.adBreakEpoch++;\n }\n destroy() {\n this.clearAdStopTimer();\n this.clearAdStartTimer();\n this.clearAdFailsafeTimer();\n this.clearAdRequestWatchdog();\n }\n};\n\n// src/player/PlaceholderLayer.ts\nvar PlaceholderLayer = class {\n constructor(video, debug) {\n this.video = video;\n this.debug = debug;\n }\n ensureContainer() {\n if (this.container) {\n return;\n }\n const el = document.createElement(\"div\");\n el.style.position = \"absolute\";\n el.style.left = \"0\";\n el.style.top = \"0\";\n el.style.right = \"0\";\n el.style.bottom = \"0\";\n el.style.display = \"none\";\n el.style.alignItems = \"center\";\n el.style.justifyContent = \"center\";\n el.style.pointerEvents = \"none\";\n el.style.zIndex = \"5\";\n el.style.backgroundColor = \"#000\";\n el.style.transition = \"opacity 0.3s ease-in-out\";\n el.style.opacity = \"0\";\n if (!this.video.parentElement) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Video element has no parent for placeholder container\");\n }\n return;\n }\n this.video.parentElement.appendChild(el);\n this.container = el;\n }\n show() {\n this.ensureContainer();\n if (!this.container) {\n return;\n }\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video when showing placeholder\");\n }\n }\n const wasHidden = this.container.style.display === \"none\" || this.container.style.opacity === \"0\";\n if (wasHidden) {\n this.container.style.transition = \"none\";\n } else {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n this.container.style.backgroundColor = \"#000\";\n this.container.style.display = \"flex\";\n this.container.offsetHeight;\n this.container.style.opacity = \"1\";\n this.container.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (this.container) {\n this.container.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder layer (between content and ad layer)\");\n }\n }\n hide() {\n if (!this.container) {\n return;\n }\n this.container.style.opacity = \"0\";\n setTimeout(() => {\n if (this.container) {\n this.container.style.display = \"none\";\n this.container.style.pointerEvents = \"none\";\n this.container.style.backgroundColor = \"#000\";\n }\n }, 300);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder layer\");\n }\n }\n destroy() {\n if (this.container) {\n if (this.container.parentElement) {\n this.container.parentElement.removeChild(this.container);\n }\n this.container = void 0;\n }\n }\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\nvar HlsEngine = class {\n constructor(config, video, cueManager, timing, callbacks) {\n this.isLiveStream = false;\n this.nativeHlsMode = false;\n this.videoSrcProtection = null;\n this.reloadingLiveStream = false;\n this.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = false;\n this.latencyProfileApplied = false;\n this.config = config;\n this.video = video;\n this.cueManager = cueManager;\n this.timing = timing;\n this.callbacks = callbacks;\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n shouldUseNativeHls(getStreamType) {\n const streamType = getStreamType();\n if (streamType === \"other\") {\n return true;\n }\n const canNative = this.video.canPlayType(\"application/vnd.apple.mpegurl\");\n return !!(this.config.allowNativeHls && canNative);\n }\n async setupNativeHls() {\n this.nativeHlsMode = true;\n this.videoSrcProtection = this.config.src;\n this.video.src = this.config.src;\n this.isLiveStream = this.config.isLiveStream ?? (this.config.lowLatencyMode ?? false);\n if (this.debug) {\n const adBehavior = this.isLiveStream ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\n \"[StormcloudVideoPlayer] Using native HLS playback:\",\n {\n isLive: this.isLiveStream,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n }\n );\n }\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n setupHls() {\n this.hls = new import_hls2.default({\n enableWorker: true,\n backBufferLength: 30,\n liveDurationInfinity: true,\n lowLatencyMode: !!this.config.lowLatencyMode,\n maxLiveSyncPlaybackRate: 1.1,\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 1,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.2,\n nudgeMaxRetry: 5,\n startPosition: -1\n });\n this.hls.on(import_hls2.default.Events.MEDIA_ATTACHED, () => {\n this.hls?.loadSource(this.config.src);\n });\n this.hls.on(import_hls2.default.Events.MANIFEST_PARSED, async (_, _data) => {\n this.isLiveStream = this.config.isLiveStream ?? (this.hls?.levels?.some(\n (level) => level?.details?.live === true || level?.details?.type === \"LIVE\"\n ) ?? false);\n await this.callbacks.onManifestParsed(this.isLiveStream);\n this.bufferedSegmentsCount = 0;\n this.hasInitialBufferCompleted = false;\n this.shouldAutoplayAfterBuffering = !!this.config.autoplay;\n this.latencyProfileApplied = false;\n this.detectedLowLatencyStream = void 0;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Waiting for\",\n minSegments,\n \"segments to buffer before playback\"\n );\n }\n if (minSegments === 0 || !this.config.autoplay) {\n this.hasInitialBufferCompleted = true;\n if (this.config.autoplay) {\n await this.video.play()?.catch(() => {\n });\n }\n }\n this.reloadingLiveStream = false;\n });\n this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\n this.applyStreamLatencyProfile(data?.details);\n if (this.callbacks.isInAdBreak() || this.callbacks.hasPendingAdBreak()) {\n return;\n }\n const details = data?.details;\n if (!details || !details.fragments || details.fragments.length === 0) {\n return;\n }\n const fragmentsToScan = Math.min(5, details.fragments.length);\n for (let i = 0; i < fragmentsToScan; i++) {\n const frag = details.fragments[i];\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) continue;\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT\") || tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = tag.includes(\"EXT-X-DATERANGE\") ? parseAttributeList(value) : {};\n const hasScteOut = tag.includes(\"EXT-X-CUE-OUT\") || \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n if (hasScteOut) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value, earlyDetection: true }\n };\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] EARLY SCTE-35 DETECTION: Ad break marker found in fragment\", i, \"- starting pre-fetch (NOT playing yet)\");\n }\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"early\", frag)\n });\n return;\n }\n }\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_BUFFERED, async (_evt, _data) => {\n if (this.hasInitialBufferCompleted) {\n return;\n }\n this.bufferedSegmentsCount++;\n const minSegments = this.config.minSegmentsBeforePlay ?? 2;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Buffered segment ${this.bufferedSegmentsCount}/${minSegments}`\n );\n }\n if (this.bufferedSegmentsCount >= minSegments) {\n this.hasInitialBufferCompleted = true;\n if (this.shouldAutoplayAfterBuffering) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Initial buffer complete (${this.bufferedSegmentsCount} segments). Starting playback.`\n );\n }\n await this.video.play()?.catch((err) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Autoplay failed:\", err);\n }\n });\n }\n }\n });\n this.hls.on(import_hls2.default.Events.FRAG_PARSING_METADATA, (_evt, data) => {\n const id3Tags = (data?.samples || []).map((s) => ({\n key: \"ID3\",\n value: s?.data,\n ptsSeconds: s?.pts\n }));\n id3Tags.forEach((tag) => this.onId3Tag(tag));\n });\n this.hls.on(import_hls2.default.Events.FRAG_LOADED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_DECRYPTED, (_evt, data) => {\n this.processFragmentScte35Payload(\n data?.payload,\n typeof data?.frag?.sn === \"number\" ? data.frag.sn : void 0,\n getFragmentStartSeconds(data?.frag)\n );\n });\n this.hls.on(import_hls2.default.Events.FRAG_CHANGED, (_evt, data) => {\n const frag = data?.frag;\n const tagList = frag?.tagList;\n if (!Array.isArray(tagList)) {\n this.callbacks.activatePendingCuesForFragment(frag);\n return;\n }\n for (const entry of tagList) {\n let tag = \"\";\n let value = \"\";\n if (Array.isArray(entry)) {\n tag = String(entry[0] ?? \"\");\n value = String(entry[1] ?? \"\");\n } else if (typeof entry === \"string\") {\n const idx = entry.indexOf(\":\");\n if (idx >= 0) {\n tag = entry.substring(0, idx);\n value = entry.substring(idx + 1);\n } else {\n tag = entry;\n value = \"\";\n }\n }\n if (!tag) continue;\n if (tag.includes(\"EXT-X-CUE-OUT-CONT\")) {\n const prog = parseCueOutCont(value);\n const marker = {\n type: \"progress\",\n ...prog?.duration !== void 0 ? { durationSeconds: prog.duration } : {},\n ...prog?.elapsed !== void 0 ? { ptsSeconds: prog.elapsed } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-OUT\")) {\n const durationSeconds = parseCueOutDuration(value);\n const marker = {\n type: \"start\",\n ...durationSeconds !== void 0 ? { durationSeconds } : {},\n raw: { tag, value }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n } else if (tag.includes(\"EXT-X-CUE-IN\")) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n } else if (tag.includes(\"EXT-X-DATERANGE\")) {\n const attrs = parseAttributeList(value);\n const hasScteOut = \"SCTE35-OUT\" in attrs || attrs[\"SCTE35-OUT\"] !== void 0;\n const hasScteIn = \"SCTE35-IN\" in attrs || attrs[\"SCTE35-IN\"] !== void 0;\n const klass = String(attrs[\"CLASS\"] ?? \"\");\n const duration = toNumber(attrs[\"DURATION\"]);\n if (hasScteOut || /com\\.apple\\.hls\\.cue/i.test(klass)) {\n const marker = {\n type: \"start\",\n ...duration !== void 0 ? { durationSeconds: duration } : {},\n raw: { tag, value, attrs }\n };\n this.callbacks.onScte35Cue(marker, {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n });\n }\n if (hasScteIn) {\n this.callbacks.onScte35Cue(\n { type: \"end\", raw: { tag, value, attrs } },\n {\n ...this.cueManager.createScte35CueContext(\"manifest\", \"playback\", frag)\n }\n );\n }\n }\n }\n this.callbacks.activatePendingCuesForFragment(frag);\n });\n this.hls.on(import_hls2.default.Events.ERROR, (_evt, data) => {\n if (data?.fatal) {\n switch (data.type) {\n case import_hls2.default.ErrorTypes.NETWORK_ERROR:\n this.hls?.startLoad();\n break;\n case import_hls2.default.ErrorTypes.MEDIA_ERROR:\n this.hls?.recoverMediaError();\n break;\n default:\n this.callbacks.onFatalDestroy();\n break;\n }\n }\n });\n this.hls.attachMedia(this.video);\n }\n isLowLatencyStream() {\n return this.detectedLowLatencyStream;\n }\n applyStreamLatencyProfile(details) {\n if (this.latencyProfileApplied || !this.hls) {\n return;\n }\n if (!details) {\n return;\n }\n if (details.live !== true) {\n this.latencyProfileApplied = true;\n this.detectedLowLatencyStream = false;\n return;\n }\n const isLowLatencyManifest = this.isLowLatencyManifest(details);\n const useLowLatency = isLowLatencyManifest && !!this.config.lowLatencyMode;\n this.detectedLowLatencyStream = useLowLatency;\n this.latencyProfileApplied = true;\n const cfg = this.hls.config;\n if (useLowLatency) {\n cfg.maxLiveSyncPlaybackRate = 1.5;\n cfg.maxBufferHole = 0.5;\n delete cfg.liveSyncDuration;\n } else {\n cfg.maxLiveSyncPlaybackRate = 1.1;\n cfg.maxBufferHole = 1;\n delete cfg.liveSyncDuration;\n cfg.liveSyncDurationCount = 3;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live latency profile: ${useLowLatency ? \"LL-HLS (low latency)\" : \"standard live (stability)\"}`,\n {\n isLowLatencyManifest,\n lowLatencyModeRequested: !!this.config.lowLatencyMode,\n canBlockReload: details.canBlockReload,\n partTarget: details.partTarget,\n partHoldBack: details.partHoldBack,\n partListLength: Array.isArray(details.partList) ? details.partList.length : 0,\n targetDuration: details.targetduration ?? details.targetDuration,\n maxLiveSyncPlaybackRate: cfg.maxLiveSyncPlaybackRate,\n maxBufferHole: cfg.maxBufferHole\n }\n );\n }\n }\n isLowLatencyManifest(details) {\n if (!details) {\n return false;\n }\n const hasParts = Array.isArray(details.partList) && details.partList.length > 0;\n const hasPartTarget = typeof details.partTarget === \"number\" && details.partTarget > 0;\n const hasPartHoldBack = typeof details.partHoldBack === \"number\" && details.partHoldBack > 0;\n const canBlockReload = details.canBlockReload === true;\n return hasParts || hasPartTarget || hasPartHoldBack || canBlockReload;\n }\n onId3Tag(tag) {\n if (typeof tag.ptsSeconds === \"number\") {\n this.timing.updatePtsDrift(tag.ptsSeconds);\n }\n const marker = parseScte35FromId3(tag);\n if (marker) {\n this.callbacks.onScte35Cue(marker, {\n source: \"id3\",\n readiness: \"playback\"\n });\n }\n }\n processFragmentScte35Payload(payloadData, fragmentSn, fragmentStartSeconds) {\n const payload = normalizeFragmentPayload(payloadData);\n if (!payload) {\n return;\n }\n const markers = parseScte35FromTsPackets(\n payload,\n this.cueManager.tsScte35Pids,\n this.cueManager.pmtPids,\n this.cueManager.processedTsScte35Sections\n );\n markers.forEach((marker) => {\n const context = {\n source: \"ts\",\n readiness: \"early\"\n };\n if (fragmentSn !== void 0) {\n context.fragmentSn = fragmentSn;\n }\n if (fragmentStartSeconds !== void 0) {\n context.fragmentStartSeconds = fragmentStartSeconds;\n }\n this.callbacks.onScte35Cue(marker, context);\n });\n }\n getLiveSyncPosition() {\n const pos = this.hls?.liveSyncPosition;\n return typeof pos === \"number\" && Number.isFinite(pos) ? pos : void 0;\n }\n restartLoadAt(position) {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.stopLoad();\n this.hls.startLoad(position);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to restart HLS load at live edge:\", error);\n }\n }\n }\n recoverMediaError() {\n if (!this.hls) {\n return;\n }\n try {\n this.hls.recoverMediaError();\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] recoverMediaError() failed:\", error);\n }\n }\n }\n reloadLiveStream() {\n const hls = this.hls;\n if (!hls) {\n return;\n }\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Hard-reloading live stream (destroy hls \\u2192 reset video \\u2192 fresh setupHls)\"\n );\n }\n try {\n this.reloadingLiveStream = true;\n hls.stopLoad();\n hls.detachMedia();\n hls.destroy();\n this.hls = void 0;\n try {\n this.video.removeAttribute(\"src\");\n this.video.load();\n } catch (error) {\n console.warn(\"[StormcloudVideoPlayer] video.load() threw after src removal:\", error);\n }\n } catch (error) {\n this.reloadingLiveStream = false;\n this.hls = void 0;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to tear down during hard-reload:\", error);\n }\n return;\n }\n const recreateDelayMs = 600;\n window.setTimeout(() => {\n if (this.hls) {\n this.reloadingLiveStream = false;\n return;\n }\n try {\n this.setupHls();\n } catch (error) {\n this.reloadingLiveStream = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Failed to rebuild pipeline during hard-reload:\", error);\n }\n }\n }, recreateDelayMs);\n }\n destroy() {\n this.hls?.destroy();\n this.hls = void 0;\n }\n};\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\nfunction toggleMute(video, adPlayer, debug) {\n if (adPlayer.isAdPlaying()) {\n const newMutedState = !adPlayer.getOriginalMutedState();\n const restoreVolume = adPlayer.getOriginalVolume() || 1;\n adPlayer.updateOriginalMutedState(newMutedState, video.volume);\n adPlayer.setAdVolume(newMutedState ? 0 : restoreVolume);\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] Mute toggle during ad - immediately applied:\",\n newMutedState\n );\n }\n } else {\n video.muted = !video.muted;\n adPlayer.updateOriginalMutedState(video.muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Muted:\", video.muted);\n }\n }\n}\nfunction toggleFullscreen(video, debug) {\n return new Promise((resolve, reject) => {\n if (!document.fullscreenElement) {\n const container = video.parentElement;\n if (!container) {\n reject(new Error(\"No parent container found for fullscreen\"));\n return;\n }\n container.requestFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Entered fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\"[StormcloudVideoPlayer] Fullscreen error:\", err);\n }\n reject(err);\n });\n } else {\n document.exitFullscreen().then(() => {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Exited fullscreen\");\n }\n resolve();\n }).catch((err) => {\n if (debug) {\n console.error(\n \"[StormcloudVideoPlayer] Exit fullscreen error:\",\n err\n );\n }\n reject(err);\n });\n }\n });\n}\nfunction isMuted(video, adPlayer) {\n if (adPlayer.isAdPlaying()) {\n return adPlayer.getOriginalMutedState();\n }\n return video.muted;\n}\nfunction setMuted(video, adPlayer, muted, debug) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying && muted === video.muted) {\n if (debug) {\n console.log(\n \"[StormcloudVideoPlayer] setMuted reflective update during ad ignored\",\n { muted }\n );\n }\n return;\n }\n video.muted = muted;\n if (adPlaying) {\n adPlayer.updateOriginalMutedState(muted, video.volume);\n adPlayer.setAdVolume(muted ? 0 : 1);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted applied during ad\", {\n muted\n });\n }\n return;\n }\n adPlayer.updateOriginalMutedState(muted, video.volume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setMuted called:\", muted);\n }\n}\nfunction setVolume(video, adPlayer, volume, debug) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n adPlayer.setAdVolume(clampedVolume);\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume applied during ad\", {\n volume: clampedVolume\n });\n }\n } else {\n video.volume = clampedVolume;\n video.muted = clampedVolume === 0;\n adPlayer.updateOriginalMutedState(clampedVolume === 0, clampedVolume);\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] setVolume called:\", clampedVolume);\n }\n }\n}\nfunction getVolume(video, adPlayer) {\n const adPlaying = adPlayer.isAdPlaying();\n if (adPlaying) {\n return adPlayer.getAdVolume();\n }\n return video.volume;\n}\nfunction isFullscreen() {\n return !!document.fullscreenElement;\n}\nfunction resizePlayer(video, adPlayer, debug) {\n if (debug) {\n console.log(\"[StormcloudVideoPlayer] Resizing player\");\n }\n if (adPlayer && adPlayer.isAdPlaying()) {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n if (debug) {\n console.log(\n `[StormcloudVideoPlayer] Resizing ads manager to ${width}x${height}`\n );\n }\n adPlayer.resize(width, height);\n }\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n constructor(host, timing, adConfig, cueManager, placeholder) {\n this.inAdBreak = false;\n this.showAds = false;\n this.isShowingPlaceholder = false;\n this.adDetectSentForCurrentBreak = false;\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.adRequestQueue = [];\n this.adPodQueue = [];\n this.maxPlaceholderDurationMs = 5e3;\n this.pendingAdBreak = null;\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n get debug() {\n return !!this.host.config.debugAdTiming;\n }\n get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n nextAdRequestUrl(baseVastUrl) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : void 0;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n attachImaEventListeners() {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"ad_click\", () => {\n this.host.onAdClick();\n });\n adPlayer.on(\"ad_interaction\", (event) => {\n if (event) this.host.onAdInteraction(event);\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n this.timing.consecutiveFailures = 0;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload) => {\n let errorMessage = \"Ad playback failed\";\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n if (!this.inAdBreak) {\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n recreateAdController() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n clearPendingAdBreak() {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = void 0;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = void 0;\n this.adConfig.podAssignedByPrefetch = false;\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n async handleAdStart(_marker) {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1e3\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n let podUrl;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n if (!podUrl) {\n return false;\n }\n this.continuousFetchingActive = false;\n this.recreateAdController();\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n if (this.debug) {\n console.log(\n podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n startContinuousFetching(baseVastUrl) {\n if (!this.continuousFetchingActive) {\n return;\n }\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n async continuousFetchLoop(baseVastUrl) {\n const epoch = this.timing.adBreakEpoch;\n while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n continue;\n }\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n continue;\n }\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n this.adRequestQueue.push(newAdUrl);\n const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n await new Promise((resolve) => setTimeout(resolve, generationDelay));\n }\n this.continuousFetchLoopRunning = false;\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n stopContinuousFetching() {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.placeholder.hide();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n async tryNextAvailableAdWithRateLimit() {\n if (!this.inAdBreak) {\n return;\n }\n const epoch = this.timing.adBreakEpoch;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n return this.tryNextAvailableAd(0);\n }\n async tryNextAvailableAd(retryCount = 0) {\n if (!this.inAdBreak) {\n return;\n }\n const remaining = this.timing.getRemainingAdMs();\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n this.timing.cleanupTemporaryFailures();\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n if (!this.isShowingPlaceholder && remaining > 1e3) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n async playSingleAd(vastTagUrl) {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n this.recreateAdController();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) return;\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n if (this.timing.isTemporaryAdError(playError)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = error?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n async showPlaceholderAndWaitForAds() {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n if (waitTime < 1e3) {\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n for (let i = 0; i < maxChecks; i++) {\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n if (!this.inAdBreak) return;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n handleAdPodComplete() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n this.timing.resetForBreakEnd();\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n this.adRequestQueue = [];\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = void 0;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.adPodQueue = [];\n this.showAds = false;\n this.host.getAdPlayer().stop().catch(() => {\n });\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end \\u2014 hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n this.resumeContentPlayback();\n }\n getBufferedAhead() {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n describeVideoState() {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\"\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}` : \"none\";\n const ranges = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}\\u2013${v.buffered.end(i).toFixed(2)}]`);\n }\n return `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} readyState=${ready} networkState=${net} error=${err} buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`;\n }\n monitorLiveResumeStall(resumeBaseline) {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1e3;\n const graceMs = needsReset ? 8e3 : 5e3;\n const recoveryCooldownMs = needsReset ? 7e3 : 5e3;\n const maxRecoveries = 3;\n const maxMonitorMs = 45e3;\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\"\n ];\n if (this.debug) {\n onMediaEvent = (e) => {\n const dt = ((Date.now() - startTime) / 1e3).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} \\u2014 ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start \\u2014 ${this.describeVideoState()}`\n );\n }\n const cleanup = () => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n const poll = () => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1e3).toFixed(0)}s \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n const canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n window.setTimeout(poll, pollIntervalMs);\n };\n window.setTimeout(poll, pollIntervalMs);\n }\n resumeContentPlayback(attempt = 0) {\n const maxAttempts = 5;\n const video = this.host.video;\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {\n });\n return;\n }\n const onReady = () => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n handleAdFailure() {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n};\n\n// src/player/StormcloudVideoPlayer.ts\nvar StormcloudVideoPlayer = class {\n constructor(config) {\n this.attached = false;\n this.palPlaybackStarted = false;\n initializePolyfills();\n const browserOverrides = getBrowserConfigOverrides();\n this.config = { ...browserOverrides, ...config };\n this.video = config.videoElement;\n logBrowserInfo(config.debugAdTiming);\n this.adPlayer = this.createAdPlayer(false);\n this.palNonce = createPalNonceManager();\n this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {\n onEarlyStartCue: (marker, fragmentSn, cueKey) => {\n this.startAdPrefetch(marker, fragmentSn, cueKey);\n },\n onPlaybackCue: (marker, cueKey) => {\n this.onScte35Marker(marker, cueKey);\n },\n isInAdBreak: () => this.adBreak.inAdBreak\n });\n this.adConfig = new AdConfigManager(this.config, this.video);\n this.timing = new AdTimingService(this.config, this.video, {\n onAdStopTimerFired: () => this.onAdStopTimerFired(),\n onAdStartTimerFired: (marker, cueKey) => {\n this.startScte35AdBreak(\n marker,\n cueKey,\n marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.timing.expectedAdBreakDurationMs\n );\n },\n onWatchdogTimeout: () => this.adBreak.handleAdFailure(),\n onFailsafeTimeout: () => this.adBreak.handleAdFailure(),\n getAdState: () => ({\n inAdBreak: this.adBreak.inAdBreak,\n showAds: this.adBreak.showAds,\n adPlaying: this.adPlayer.isAdPlaying()\n })\n });\n this.placeholder = new PlaceholderLayer(this.video, !!this.config.debugAdTiming);\n this.hlsEngine = new HlsEngine(this.config, this.video, this.cueManager, this.timing, {\n onManifestParsed: async (isLive) => this.onManifestParsed(isLive),\n onScte35Cue: (marker, context) => this.cueManager.onScte35Cue(marker, context),\n activatePendingCuesForFragment: (frag) => this.cueManager.activatePendingScte35CuesForFragment(frag),\n onFatalDestroy: () => this.destroy(),\n isInAdBreak: () => this.adBreak.inAdBreak,\n hasPendingAdBreak: () => this.adBreak.pendingAdBreak !== null\n });\n this.adBreak = new AdBreakOrchestrator(\n {\n config: this.config,\n video: this.video,\n getAdPlayer: () => this.adPlayer,\n setAdPlayer: (p) => {\n this.adPlayer = p;\n },\n createAdPlayer: (c) => this.createAdPlayer(c),\n shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n isLiveStream: () => this.hlsEngine.isLiveStream,\n getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n restartHlsLoad: (position) => this.hlsEngine.restartLoadAt(position),\n reloadLiveStream: () => this.hlsEngine.reloadLiveStream(),\n recoverMediaError: () => this.hlsEngine.recoverMediaError(),\n requiresMediaPipelineResetAfterAds: () => requiresMediaPipelineResetAfterAds(),\n generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs),\n onAdClick: () => this.palNonce.sendAdClick(),\n onAdInteraction: (event) => this.palNonce.sendAdTouch(event)\n },\n this.timing,\n this.adConfig,\n this.cueManager,\n this.placeholder\n );\n }\n get debug() {\n return !!this.config.debugAdTiming;\n }\n createAdPlayer(continueLiveStreamDuringAds) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Creating HLS ad player\");\n }\n return createHlsAdPlayer(this.video, {\n continueLiveStreamDuringAds,\n ...this.config.licenseKey ? { licenseKey: this.config.licenseKey } : {},\n ...this.hlsEngine?.hls ? { mainHlsInstance: this.hlsEngine.hls } : {}\n });\n }\n generatePodVastUrl(baseUrl, breakDurationMs) {\n const podParams = this.adConfig.resolvePodParams(breakDurationMs);\n return this.adConfig.generatePodVastUrl(\n baseUrl,\n podParams,\n this.adPlayer,\n this.palNonce,\n this.adBreak.inAdBreak\n );\n }\n // ───────────────────────────────────────────────────────────────\n // Lifecycle\n // ───────────────────────────────────────────────────────────────\n async load() {\n if (!this.attached) {\n this.attach();\n }\n try {\n await this.adConfig.fetchAdConfiguration();\n } catch (error) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to fetch ad configuration:\",\n error\n );\n }\n }\n const palDescriptionUrl = this.config.ctvAdRequest ? this.adConfig.getPalDescriptionUrl() : void 0;\n fetchConsentSignals().catch(() => ({})).then((signals) => {\n this.adConfig.consentSignals = signals;\n const muted = this.video.muted;\n return this.palNonce.generateNonce({\n videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,\n videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,\n adWillAutoPlay: !!this.config.autoplay,\n adWillPlayMuted: muted,\n playerVolume: muted ? 0 : this.video.volume,\n continuousPlayback: this.config.lowLatencyMode ?? false,\n ...palDescriptionUrl ? { descriptionUrl: palDescriptionUrl } : {},\n ...signals.storageAllowed != null ? { allowStorage: signals.storageAllowed } : {}\n });\n }).catch(() => {\n });\n this.adConfig.initializeTracking();\n if (this.hlsEngine.shouldUseNativeHls(() => this.getStreamType())) {\n await this.hlsEngine.setupNativeHls();\n const continueLiveStreamDuringAds = this.shouldContinueLiveStreamDuringAds();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Native HLS ad behavior:\", {\n isLive: this.hlsEngine.isLiveStream,\n continueLiveStreamDuringAds\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(continueLiveStreamDuringAds);\n this.adPlayer.initialize();\n return;\n }\n this.hlsEngine.setupHls();\n }\n async onManifestParsed(isLive) {\n if (this.hlsEngine.reloadingLiveStream) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Manifest re-parsed after hard reload \\u2014 skipping ad-player setup\");\n }\n return;\n }\n if (!this.adConfig.isVmapEnabled() && !isLive && this.adConfig.vmapBreaks.length === 0 && this.adConfig.apiVastTagUrl) {\n const prerollKey = \"synthetic-vod-preroll\";\n if (!this.adConfig.consumedVmapBreakIds.has(prerollKey)) {\n this.adConfig.vmapBreaks = [\n { id: prerollKey, startTimeMs: 0, vastTagUrl: this.adConfig.apiVastTagUrl }\n ];\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Injected synthetic VOD preroll from apiVastTagUrl\"\n );\n }\n }\n }\n if (this.debug) {\n const adBehavior = this.shouldContinueLiveStreamDuringAds() ? \"live (main video continues muted during ads)\" : \"vod (main video pauses during ads)\";\n console.log(\"[StormcloudVideoPlayer] Stream type detected:\", {\n isLive,\n allowNativeHls: this.config.allowNativeHls,\n adBehavior\n });\n }\n this.adPlayer.destroy();\n this.adPlayer = this.createAdPlayer(this.shouldContinueLiveStreamDuringAds());\n this.adPlayer.initialize();\n }\n attach() {\n if (this.attached) return;\n this.attached = true;\n this.video.autoplay = !!this.config.autoplay;\n this.video.muted = !!this.config.muted;\n this.adPlayer.initialize();\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.attachImaEventListeners();\n this.video.addEventListener(\"play\", () => {\n if (!this.palPlaybackStarted && !this.adPlayer.isAdPlaying()) {\n this.palPlaybackStarted = true;\n this.palNonce.sendPlaybackStart();\n }\n });\n this.endedHandler = () => {\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.onVideoEnded();\n };\n this.video.addEventListener(\"ended\", this.endedHandler);\n this.video.addEventListener(\"mousedown\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.video.addEventListener(\"touchstart\", (e) => {\n this.palNonce.sendAdTouch(e);\n });\n this.timeUpdateHandler = () => {\n this.onTimeUpdate(this.video.currentTime);\n };\n this.video.addEventListener(\"timeupdate\", this.timeUpdateHandler);\n this.emptiedHandler = () => {\n if (this.hlsEngine.nativeHlsMode && this.hlsEngine.videoSrcProtection && !this.adPlayer.isAdPlaying()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Video src was cleared, restoring:\",\n this.hlsEngine.videoSrcProtection\n );\n }\n const currentTime = this.video.currentTime;\n const wasPaused = this.video.paused;\n this.video.src = this.hlsEngine.videoSrcProtection;\n this.video.currentTime = currentTime;\n if (!wasPaused) {\n this.video.play().catch(() => {\n });\n }\n }\n };\n this.video.addEventListener(\"emptied\", this.emptiedHandler);\n }\n shouldContinueLiveStreamDuringAds() {\n if (this.config.pauseContentDuringAds) {\n return false;\n }\n if (this.hlsEngine.isLiveStream) {\n return true;\n }\n const duration = this.video.duration;\n if (!Number.isFinite(duration) || duration === Infinity) {\n return true;\n }\n return false;\n }\n // ───────────────────────────────────────────────────────────────\n // SCTE-35 marker orchestration\n // ───────────────────────────────────────────────────────────────\n onScte35Marker(marker, cueKey) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 marker detected:\", {\n type: marker.type,\n ptsSeconds: marker.ptsSeconds,\n durationSeconds: marker.durationSeconds,\n currentTime: this.video.currentTime,\n raw: marker.raw,\n hasPendingAdBreak: !!this.adBreak.pendingAdBreak\n });\n }\n if (marker.type === \"start\") {\n if (this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n const newDurationMs = marker.durationSeconds * 1e3;\n if (this.timing.expectedAdBreakDurationMs == null || newDurationMs > this.timing.expectedAdBreakDurationMs) {\n this.timing.setAdBreakDurationBoundary(newDurationMs);\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Updated ad break duration from subsequent marker: ${newDurationMs}ms, remaining: ${this.timing.getWallClockRemainingAdMs()}ms`\n );\n }\n }\n }\n return;\n }\n if (!this.adBreak.adDetectSentForCurrentBreak) {\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n }\n const hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;\n const durationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : this.adBreak.pendingAdBreak?.marker.durationSeconds != null ? this.adBreak.pendingAdBreak.marker.durationSeconds * 1e3 : void 0;\n const isManifest = isManifestBasedMarker(marker);\n const forceImmediate = this.config.immediateManifestAds ?? true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad start decision:\", {\n isManifestMarker: isManifest,\n forceImmediate,\n hasPts: typeof marker.ptsSeconds === \"number\",\n hasPrefetchedAds\n });\n }\n if (isManifest && forceImmediate) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Starting ad immediately (manifest-based)${hasPrefetchedAds ? \" with prefetched ads\" : \"\"}`\n );\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n } else if (typeof marker.ptsSeconds === \"number\") {\n const tol = this.config.driftToleranceMs ?? 1e3;\n const nowMs = this.video.currentTime * 1e3;\n const estCurrentPtsMs = nowMs - this.timing.ptsDriftEmaMs;\n const deltaMs = Math.floor(marker.ptsSeconds * 1e3 - estCurrentPtsMs);\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] PTS-based timing calculation:\", {\n nowMs,\n estCurrentPtsMs,\n markerPtsMs: marker.ptsSeconds * 1e3,\n deltaMs,\n tolerance: tol\n });\n }\n if (deltaMs > tol) {\n if (this.debug) {\n console.log(`[StormcloudVideoPlayer] Scheduling ad start in ${deltaMs}ms`);\n }\n this.timing.expectedAdBreakDurationMs = durationMs;\n this.cueManager.scheduledScte35BreakKey = cueKey;\n this.timing.scheduleAdStartIn(deltaMs, marker, cueKey);\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (within tolerance)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n } else {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad immediately (fallback)\");\n }\n this.timing.clearAdStartTimer();\n this.startScte35AdBreak(marker, cueKey, durationMs);\n }\n return;\n }\n if (marker.type === \"progress\" && this.adBreak.inAdBreak) {\n if (marker.durationSeconds != null) {\n this.timing.setAdBreakDurationBoundary(marker.durationSeconds * 1e3);\n }\n this.timing.scheduleAdStopAtBreakBoundary();\n if (!this.adPlayer.isAdPlaying() && this.timing.activeAdRequestToken === null && this.adBreak.adRequestQueue.length > 0 && this.timing.hasTimeToStartAnotherAd()) {\n this.adBreak.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n if (marker.type === \"end\") {\n if (!this.video.muted) {\n this.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on SCTE end marker\");\n }\n }\n const remaining = this.timing.getRemainingAdMs();\n const adPlaying = this.adPlayer.isAdPlaying();\n const hasQueuedAds = this.adBreak.adRequestQueue.length > 0;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] SCTE-35 end marker received:\", {\n remaining,\n adPlaying,\n hasQueuedAds,\n activeAdRequest: this.timing.activeAdRequestToken !== null\n });\n }\n this.timing.scteAdBreakEndWallClockMs = Date.now();\n this.timing.clearAdStartTimer();\n this.timing.clearAdStopTimer();\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n return;\n }\n }\n startScte35AdBreak(marker, cueKey, durationMs) {\n this.adBreak.inAdBreak = true;\n this.cueManager.activeScte35BreakKey = cueKey ?? this.cueManager.pendingScte35CueKey;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.timing.currentAdBreakStartWallClockMs = this.timing.resolveScteBreakStartWallClockMs(marker);\n this.timing.setAdBreakDurationBoundary(durationMs);\n this.adBreak.handleAdStart(marker);\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n onAdStopTimerFired() {\n if (!this.adBreak.inAdBreak) return;\n const adPlaying = this.adPlayer.isAdPlaying();\n const checkIntervalMs = Math.max(\n 250,\n Math.floor(this.config.adBreakCheckIntervalMs ?? 1e3)\n );\n const maxExtensionMsConfig = this.config.maxAdBreakExtensionMs;\n const maxExtensionMs = typeof maxExtensionMsConfig === \"number\" && maxExtensionMsConfig > 0 ? maxExtensionMsConfig : 0;\n const endWallClockMs = this.timing.getAdBreakEndWallClockMs() ?? Date.now();\n const overrunMs = Math.max(0, Date.now() - endWallClockMs);\n const shouldExtendAdBreak = adPlaying && overrunMs < maxExtensionMs;\n if (shouldExtendAdBreak) {\n this.timing.scheduleAdStopCountdown(checkIntervalMs);\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Ad break boundary reached (overrun=${overrunMs}ms) - hard-stopping ads and resuming stream`\n );\n }\n if (adPlaying) {\n this.adPlayer.stop().catch(() => {\n });\n }\n this.adBreak.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad prefetch\n // ───────────────────────────────────────────────────────────────\n startAdPrefetch(marker, fragmentSn, cueKey) {\n if (this.adBreak.pendingAdBreak || this.adBreak.inAdBreak) return;\n const scheduled = this.adConfig.findCurrentOrNextBreak(this.video.currentTime * 1e3);\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n if (this.debug) console.warn(\"[StormcloudVideoPlayer] No VAST URL available for prefetch\");\n return;\n }\n this.adConfig.beginNewAdPod();\n this.adConfig.podAssignedByPrefetch = true;\n const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n const generatedUrls = [this.generatePodVastUrl(baseVastUrl, breakDurationMs)];\n this.adBreak.pendingAdBreak = {\n marker,\n ...fragmentSn !== void 0 ? { detectedAtFragmentSn: fragmentSn } : {},\n vastUrls: generatedUrls,\n isFetching: false,\n fetchStartTime: Date.now()\n };\n this.cueManager.pendingScte35CueKey = cueKey;\n this.adBreak.adDetectSentForCurrentBreak = true;\n const detectPayload = {};\n if (marker.durationSeconds != null) detectPayload.durationSeconds = marker.durationSeconds;\n if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;\n if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;\n sendAdDetectTracking(this.config.licenseKey, { source: \"scte35\", timestamp: (/* @__PURE__ */ new Date()).toISOString(), ...detectPayload }, buildAnalyticsContext(this.config)).catch(() => {\n });\n if (this.debug) {\n console.log(\"[PREFETCH] Starting ad prefetch for upcoming ad break\");\n console.log(`[PREFETCH] Pre-generated pod request URL`);\n }\n }\n // ───────────────────────────────────────────────────────────────\n // VMAP time-based ad breaks\n // ───────────────────────────────────────────────────────────────\n onTimeUpdate(currentTimeSec) {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const nowMs = currentTimeSec * 1e3;\n const breakToPlay = this.adConfig.findBreakForTime(nowMs);\n if (breakToPlay) {\n void this.handleVmapAdBreak(breakToPlay, nowMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad break failed gracefully:\", error);\n }\n });\n }\n }\n onVideoEnded() {\n if (!this.adConfig.isVmapEnabled() || this.adConfig.vmapBreaks.length === 0) return;\n if (this.adPlayer.isAdPlaying() || this.adBreak.inAdBreak) return;\n const durationMs = Number.isFinite(this.video.duration) ? Math.floor(this.video.duration * 1e3) : 0;\n const postroll = this.adConfig.vmapBreaks.find(\n (b) => b.startTimeMs === -1 && !this.adConfig.consumedVmapBreakIds.has(this.adConfig.getAdBreakKey(b))\n );\n if (postroll) {\n void this.handleVmapAdBreak(postroll, durationMs).catch((error) => {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP post-roll failed gracefully:\", error);\n }\n });\n }\n }\n async handleVmapAdBreak(adBreak, nowMs) {\n const key = this.adConfig.getAdBreakKey(adBreak);\n if (this.adConfig.consumedVmapBreakIds.has(key)) return;\n const breakStartMs = this.adConfig.resolveBreakStartMs(adBreak);\n if (breakStartMs == null) return;\n const durationMs = adBreak.durationMs ?? 0;\n const endMs = breakStartMs + durationMs;\n const inWindow = durationMs > 0 ? nowMs >= breakStartMs && nowMs < endMs : nowMs >= breakStartMs;\n if (inWindow) {\n this.adConfig.consumedVmapBreakIds.add(key);\n const tags = this.adConfig.selectVastTagsForBreak(adBreak);\n if (!tags || tags.length === 0) return;\n const first = tags[0];\n const rest = tags.slice(1);\n this.adBreak.adPodQueue = rest;\n this.adPlayer.updateOriginalMutedState(this.video.muted, this.video.volume);\n this.adBreak.showAds = true;\n this.adBreak.inAdBreak = true;\n this.timing.currentAdBreakStartWallClockMs = Date.now();\n try {\n await this.adBreak.playSingleAd(first);\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\n this.adBreak.handleAdPodComplete();\n }\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Public API\n // ───────────────────────────────────────────────────────────────\n getCurrentAdIndex() {\n return this.timing.currentAdIndex;\n }\n getTotalAdsInBreak() {\n return this.timing.totalAdsInBreak;\n }\n getAdRemainingMs() {\n return this.timing.getRemainingAdMs();\n }\n isAdPlaying() {\n return this.adBreak.inAdBreak && this.adPlayer.isAdPlaying();\n }\n isShowingAds() {\n return this.adBreak.showAds;\n }\n getStreamType() {\n const url = this.config.src.toLowerCase();\n if (url.includes(\".m3u8\") || url.includes(\"/hls/\") || url.includes(\"application/vnd.apple.mpegurl\")) {\n return \"hls\";\n }\n return \"other\";\n }\n shouldShowNativeControls() {\n const streamType = this.getStreamType();\n if (streamType === \"other\") {\n return !(this.config.showCustomControls ?? false);\n }\n return !!(this.config.allowNativeHls && !(this.config.showCustomControls ?? false));\n }\n isLive() {\n return this.hlsEngine.isLiveStream;\n }\n isLowLatencyStream() {\n return this.hlsEngine.isLowLatencyStream();\n }\n get videoElement() {\n return this.video;\n }\n toggleMute() {\n toggleMute(this.video, this.adPlayer, this.debug);\n }\n toggleFullscreen() {\n return toggleFullscreen(this.video, this.debug);\n }\n isMuted() {\n return isMuted(this.video, this.adPlayer);\n }\n setMuted(muted) {\n setMuted(this.video, this.adPlayer, muted, this.debug);\n }\n setVolume(volume) {\n setVolume(this.video, this.adPlayer, volume, this.debug);\n }\n getVolume() {\n return getVolume(this.video, this.adPlayer);\n }\n isFullscreen() {\n return isFullscreen();\n }\n resize() {\n resizePlayer(this.video, this.adPlayer, this.debug);\n }\n // ───────────────────────────────────────────────────────────────\n // Destroy\n // ───────────────────────────────────────────────────────────────\n destroy() {\n this.adBreak.stopContinuousFetching();\n this.timing.destroy();\n this.adBreak.clearPendingAdBreak();\n this.placeholder.destroy();\n if (this.timeUpdateHandler) {\n this.video.removeEventListener(\"timeupdate\", this.timeUpdateHandler);\n delete this.timeUpdateHandler;\n }\n if (this.endedHandler) {\n this.video.removeEventListener(\"ended\", this.endedHandler);\n delete this.endedHandler;\n }\n if (this.emptiedHandler) {\n this.video.removeEventListener(\"emptied\", this.emptiedHandler);\n delete this.emptiedHandler;\n }\n this.adConfig.destroyTracking();\n this.hlsEngine.destroy();\n this.adPlayer?.destroy();\n if (this.palPlaybackStarted) {\n this.palPlaybackStarted = false;\n this.palNonce.sendPlaybackEnd();\n }\n this.palNonce.reset();\n this.adBreak.adRequestQueue = [];\n this.timing.consecutiveFailures = 0;\n }\n};\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n hls: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n dash: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n video: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n audio: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n file: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n }\n};\n\n// src/players/HlsPlayer.tsx\nvar HlsPlayer = class extends import_react.Component {\n constructor() {\n super(...arguments);\n this.player = null;\n this.mounted = false;\n this.load = async () => {\n if (!this.props.videoElement || !this.props.src) return;\n try {\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n const config = {\n src: this.props.src,\n videoElement: this.props.videoElement\n };\n if (this.props.autoplay !== void 0)\n config.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) config.muted = this.props.muted;\n if (this.props.lowLatencyMode !== void 0)\n config.lowLatencyMode = this.props.lowLatencyMode;\n if (this.props.allowNativeHls !== void 0)\n config.allowNativeHls = this.props.allowNativeHls;\n if (this.props.isLiveStream !== void 0)\n config.isLiveStream = this.props.isLiveStream;\n if (this.props.driftToleranceMs !== void 0)\n config.driftToleranceMs = this.props.driftToleranceMs;\n if (this.props.immediateManifestAds !== void 0)\n config.immediateManifestAds = this.props.immediateManifestAds;\n if (this.props.debugAdTiming !== void 0)\n config.debugAdTiming = this.props.debugAdTiming;\n if (this.props.showCustomControls !== void 0)\n config.showCustomControls = this.props.showCustomControls;\n if (this.props.onVolumeToggle !== void 0)\n config.onVolumeToggle = this.props.onVolumeToggle;\n if (this.props.onFullscreenToggle !== void 0)\n config.onFullscreenToggle = this.props.onFullscreenToggle;\n if (this.props.onControlClick !== void 0)\n config.onControlClick = this.props.onControlClick;\n if (this.props.licenseKey !== void 0)\n config.licenseKey = this.props.licenseKey;\n if (this.props.adFailsafeTimeoutMs !== void 0)\n config.adFailsafeTimeoutMs = this.props.adFailsafeTimeoutMs;\n if (this.props.minSegmentsBeforePlay !== void 0)\n config.minSegmentsBeforePlay = this.props.minSegmentsBeforePlay;\n if (this.props.ctvAdRequest !== void 0)\n config.ctvAdRequest = this.props.ctvAdRequest;\n this.player = new StormcloudVideoPlayer(config);\n this.props.onMount?.(this);\n await this.player.load();\n if (this.mounted) {\n this.props.onReady?.();\n }\n } catch (error) {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n }\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[HlsPlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n this.props.onPlay?.();\n } else {\n console.warn(\"[HlsPlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n this.props.onPause?.();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"player\") return this.player;\n if (key === \"video\") return this.props.videoElement;\n if (key === \"hls\" && this.player) return this.player.hls;\n return null;\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n if (this.player) {\n this.player.destroy();\n this.player = null;\n }\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nHlsPlayer.displayName = \"HlsPlayer\";\nHlsPlayer.canPlay = canPlay.hls;\n"]}
|