stormcloud-video-player 0.8.28 → 0.8.30

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.
Files changed (40) hide show
  1. package/dist/stormcloud-vp.min.js +2 -2
  2. package/lib/index.cjs +80 -1038
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.d.cts +0 -3
  5. package/lib/index.d.ts +0 -3
  6. package/lib/index.js +80 -1039
  7. package/lib/index.js.map +1 -1
  8. package/lib/player/AdBreakOrchestrator.cjs +59 -483
  9. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  10. package/lib/player/AdBreakOrchestrator.d.cts +9 -7
  11. package/lib/player/AdConfigManager.cjs +12 -53
  12. package/lib/player/AdConfigManager.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.d.cts +4 -5
  14. package/lib/player/AdTimingService.d.cts +1 -1
  15. package/lib/player/HlsEngine.d.cts +1 -1
  16. package/lib/player/PlayerControls.d.cts +1 -1
  17. package/lib/player/Scte35CueManager.d.cts +1 -1
  18. package/lib/player/Scte35Parser.d.cts +1 -1
  19. package/lib/player/StormcloudVideoPlayer.cjs +80 -1038
  20. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  21. package/lib/player/StormcloudVideoPlayer.d.cts +1 -3
  22. package/lib/player/playerTypes.d.cts +1 -1
  23. package/lib/players/HlsPlayer.cjs +80 -1038
  24. package/lib/players/HlsPlayer.cjs.map +1 -1
  25. package/lib/players/HlsPlayer.d.cts +1 -1
  26. package/lib/players/index.cjs +80 -1038
  27. package/lib/players/index.cjs.map +1 -1
  28. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  29. package/lib/{types-Xgz2_W1C.d.cts → types-CSHvCbhZ.d.cts} +0 -1
  30. package/lib/ui/StormcloudVideoPlayer.cjs +80 -1038
  31. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  32. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  33. package/lib/utils/tracking.d.cts +1 -1
  34. package/lib/utils/vastMacros.cjs +10 -15
  35. package/lib/utils/vastMacros.cjs.map +1 -1
  36. package/lib/utils/vastMacros.d.cts +0 -1
  37. package/package.json +1 -1
  38. package/lib/player/AdPreloadPool.cjs +0 -673
  39. package/lib/player/AdPreloadPool.cjs.map +0 -1
  40. package/lib/player/AdPreloadPool.d.cts +0 -37
@@ -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/sdk/pal.ts","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.ts","../../src/player/Scte35Parser.ts","../../src/player/Scte35CueManager.ts","../../src/player/AdConfigManager.ts","../../src/player/AdTimingService.ts","../../src/player/AdPreloadPool.ts","../../src/player/PlaceholderLayer.ts","../../src/player/HlsEngine.ts"],"names":["create","__create","Object","__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","exports","import_react","require","import_hls","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","podAds","mainHlsInstance","adVideoElement","adHls","adContainerEl","podIndex","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","generateSessionId","img","Image","error","console","warn","Date","now","random","toString","substr","fireTrackingPixels","urls","length","trackingUrl","url","includes","src","log","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level","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","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","impression","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","scope","trackingUrls","querySelectorAll","forEach","el","textContent","trim","push","getAttribute","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","mediaFileElements","mf","index","parseInt","bitrateAttr","bitrateValue","ad","id","duration","parseAdElement","fetchVastXml","vastTagUrl","response","fetch","mode","credentials","headers","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","adElements","ads","resolved","aSeq","bSeq","aVal","Number","isFinite","MAX_SAFE_INTEGER","bVal","video","document","createElement","style","position","left","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","currentAd","progress","currentTime","addEventListener","advanceToNextPodAd","handleAdComplete","e","handleAdError","setAdPlayingFlag","ended","isPlaying","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","loadCurrentAdMedia","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","play","catch","ERROR","_event","data","fatal","canPlayType","load","total","display","pointerEvents","continueLiveStreamDuringAds","paused","initialize","container","top","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","preloaded","Promise","reject","has","delete","contentVolume","createAdVideoElement","resolve","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","window","goog","pal","existing","timeout","setTimeout","script","async","setAttribute","onload","onerror","head","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_MQTT_CONFIG","enabled","brokerAddress","brokerPort","wsPort","username","password","topicPrefix","qos","mqttConfig","isMQTTEnabled","buildMQTTBrokerUrl","brokerUrl","initMQTTClient","client","channel","import_mqtt","LOG","status","clientId","slice","mqtt","connect","connectTimeout","queueQoSZero","err","info","message","ensureMQTTClient","publishMQTT","topic","publish","JSON","stringify","AIRY_ANDROID_APP_ID","AIRY_WEBOS_APP_ID","AIRY_TIZEN_APP_ID","AIRY_ROKU_APP_ID","CTV_SESSION_STORAGE_KEY","_lgTestDeviceId","createUuid","AIRY_APP_NAME","PLAYER_ID_STORAGE_KEY","LG_TEST_APP_ID","LG_TEST_APP_NAME","LG_TEST_CONTENT_URL","getLgTestDeviceId","isLgWebOS","getDefaultAppId","ua","navigator","userAgent","test","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","platformLat","bridgeSignals","readNativeBridgeSignals","deviceId","deviceIdType","platformDevice","readPlatformNativeDeviceId","readStoredDeviceId","lg","limitAdTracking","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","isCtv","contentUrl","AIRY_DEFAULT_CONTENT_URL","appId","appName","getOrCreateCtvSessionId","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","readPersistentId","writePersistentId","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","parts","cookie","part","entry","decodeURIComponent","bytes","crypto","randomUUID","getRandomValues","seed","floor","performanceNow","i","hex","padStart","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","readBridgeValue","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","webosMatch","match","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","Uint8Array","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","flags","playerId","captureAt","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","publishTracking","body","buildPlayerTopic","sendInitialTracking","metricEvent","buildPlayerMetricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","values","String","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringEndsWith","polyfillStringIncludes","indexOf","initializePolyfills","polyfillPromiseFinally","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","getValue","ctx","correlator","trimmed","buf","Uint32Array","expandInlineMacroPlaceholders","baseUrl","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","val","reconstructed","trimEnd","_match","applyVastMacros","expandedUrl","replaceCorrelatorFallback","streamCorrelator","pod","optimizedPodMode","podMaxAds","podMinDurationMs","podMaxDurationMs","round","adPosition","requestUrl","pageUrl","existingUrl","timeoutMs","adTest","fetchConsentSignals","deviceTypeHint","consent","gdpr","gdprConsent","usPrivacy","staleKeys","correlatorRegex","signals","tasks","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","tcString","uspApi","__uspapi","uspString","getChromeVersion","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","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","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","checksum","section","processedSections","firstKey","size","next","addScte35SectionMarker","markers","hasProcessedTsScte35Section","assemblers","appendScte35Bytes","assembler","expectedLength","collectScte35SectionsFromPayload","previousAssembler","subarray","tableId","totalLength","parseScte35FromTsPackets","packetInfo","sectionAssemblers","tsStart","secondByte","thirdByte","fourthByte","adaptationFieldControl","hasPayload","payloadStart","adaptationLength","payloadEnd","BitReader","bytePos","readBits","numBits","remainingInByte","bitPos","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","markerTypeFromSegmentationTypeId","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","segmentationTypeId","descriptor","parseScte35SegmentationDescriptor","descriptorLoopLength","descriptorDataStart","descriptorOffset","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","segmentationDurationFlag","componentCount","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorTag","descriptorLength","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","entries","getScte35CueKey","getScte35MarkerRaw","toIdentityString","scteValue","daterangeId","ID","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","generateCorrelator","viewCorrelator","consentSignals","podCounter","lastHeartbeatTime","podAssignedByPrefetch","adRequestPositionInBreak","defaultPodMaxAds","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","startTimeMs","parseVmapTimeOffsetToMs","timeOffsetRaw","adTagNode","adTagUrl","breakId","aStart","bStart","timeOffset","hms","hh","mm","ss","ms","hours","minutes","seconds","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","generateVastUrlsWithCorrelators","count","adPlayer","palNonce","envSignals","resolveVastEnvironmentSignals","ctvAdRequest","urlWithMacros","autoplay","finalUrl","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","generatePodVastUrl","podParams","sendHeartbeatIfNeeded","AdTimingService","globalNoFillCooldownUntil","ensureAdStoppedByTimer","scheduleAdStartIn","sampleMs","ptsDriftEmaMs","resolveScteBreakStartWallClockMs","scheduleAdStopAtBreakBoundary","alpha","initializeTracking","heartbeatInterval","setInterval","destroyTracking","clearInterval","adRequestWatchdogToken","adFailsafeToken","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","maxTotalAdRequestsPerBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","globalNoFillThreshold","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","scheduleAdStopCountdown","remainingMs","adStopTimerId","clearAdStopTimer","onAdStopTimerFired","delayMs","cueKey","clearAdStartTimer","onAdStartTimerFired","adStartTimerId","updatePtsDrift","ptsSecondsSample","nowWallClockMs","estimatedCurrentPtsMs","deltaMs","setAdBreakDurationBoundary","expectedAdBreakDurationMs","currentAdBreakStartWallClockMs","scteAdBreakEndWallClockMs","getWallClockRemainingAdMs","endWallClockMs","getAdBreakEndWallClockMs","getLoadedAdDurationMs","adFitsRemainingBudget","getDurationBudgetRemainingMs","adController","logAdDurationDecision","accepted","remainingBudget","recordPlayedAdDuration","ensureLoadedAdFitsBudget","fits","rejectLoadedAdForDuration","markAdStarted","notePodAdStarted","getRemainingAdMs","wallClockRemaining","budgetRemaining","getMinRemainingMsToStartAd","configured","minRemainingMsToStartAd","hasTimeToStartAnotherAd","minRemaining","isTemporaryAdError","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","startAdRequestWatchdog","token","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","clearAdRequestWatchdog","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeTimeoutMs","adFailsafeTimerId","resetForBreakEnd","active","startLoopImmediately","videoPaused","onFailsafeTimeout","extra","showAds","AdPreloadPool","deps","pool","maxPoolSize","poolActive","loopRunning","isLoopRunning","startPreloadPool","baseVastUrl","initialUrls","preloadPoolLoop","preloadAdIntoPool","vastUrl","timing","epoch","loadPromise","some","hasAdError","adErrorPayload","errorListenerCleanup","preloadAd","errorListener","isNoFill","poolEntry","loadedDuration","lateErrorListener","shouldContinueLiveStreamDuringAds","createAdPlayer","code","vastErrorCode","loadedAt","isReady","findIndex","splice","newUrls","newUrl","getPendingAdBreak","getPreloadedAd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","offsetHeight","requestAnimationFrame","hide","HlsEngine","cueManager","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","details","live","onManifestParsed","minSegmentsBeforePlay","LEVEL_LOADED","_evt","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","FRAG_PARSING_METADATA","id3Tags","samples","pts","FRAG_LOADED","processFragmentScte35Payload","FRAG_CHANGED","activatePendingCuesForFragment","prog","ErrorTypes","NETWORK_ERROR","startLoad","MEDIA_ERROR","recoverMediaError","onFatalDestroy","onId3Tag","payloadData"],"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);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\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 licenseKey = options?.licenseKey;\n const mainHlsInstance = options?.mainHlsInstance;\n let adVideoElement;\n let adHls;\n let adContainerEl;\n let currentAd;\n let podAds = [];\n let podIndex = 0;\n let sessionId;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\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 generateSessionId() {\n return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n function fireTrackingPixels(urls) {\n if (!urls || urls.length === 0) return;\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n if (sessionId) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n }\n if (licenseKey) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n }\n const img = new Image(1, 1);\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 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 mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\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 console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: void 0\n };\n if (!url) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\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 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 mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n mediaFileElements.forEach((mf) => {\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 (!url) return;\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 (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n }\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 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) {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\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(vastTagUrl);\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(\"[HlsAdPlayer] Pod VAST XML received\");\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n return [];\n }\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\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 adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!currentAd || !adVideoElement) return;\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 adVideoElement.addEventListener(\"playing\", () => {\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n });\n adVideoElement.addEventListener(\"ended\", () => {\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 adVideoElement.addEventListener(\"error\", (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n });\n adVideoElement.addEventListener(\"volumechange\", () => {\n if (!currentAd) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n });\n adVideoElement.addEventListener(\"pause\", () => {\n if (currentAd && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n });\n adVideoElement.addEventListener(\"play\", () => {\n if (currentAd && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n });\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 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 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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n handleAdError();\n });\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 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 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 handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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(() => {\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 adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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 },\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 sessionId = generateSessionId();\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 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 setupAdEventListeners();\n }\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 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 if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\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(() => {\n });\n }\n }\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n currentAd = void 0;\n podAds = [];\n podIndex = 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\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 if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = void 0;\n }\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n adContainerEl = void 0;\n currentAd = 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) {\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/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 = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\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 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/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n enabled: true,\n brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n brokerPort: 8883,\n wsPort: 8084,\n username: \"for-sonifi\",\n password: \"sonifi-mqtt\",\n topicPrefix: \"adstorm/players\",\n qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n if (client || !isMQTTEnabled()) return;\n const url = buildMQTTBrokerUrl();\n status = \"connecting\";\n const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n try {\n client = import_mqtt.default.connect(url, {\n clientId,\n username: mqttConfig.username,\n password: mqttConfig.password,\n keepalive: 60,\n clean: true,\n reconnectPeriod: 5e3,\n connectTimeout: 1e4,\n queueQoSZero: false\n });\n } catch (err) {\n status = \"error\";\n console.warn(`${LOG} connect() threw:`, err);\n return;\n }\n client.on(\"connect\", () => {\n status = \"connected\";\n console.info(`${LOG} connected to ${url}`);\n });\n client.on(\"reconnect\", () => {\n status = \"connecting\";\n console.info(`${LOG} reconnecting\\u2026`);\n });\n client.on(\"offline\", () => {\n status = \"disconnected\";\n console.warn(`${LOG} offline`);\n });\n client.on(\"error\", (err) => {\n status = \"error\";\n console.warn(`${LOG} error:`, err.message);\n });\n client.on(\"close\", () => {\n if (status === \"connected\") {\n status = \"disconnected\";\n }\n });\n}\nfunction ensureMQTTClient() {\n if (isMQTTEnabled() && !client) {\n initMQTTClient();\n }\n}\nfunction publishMQTT(topic, payload) {\n if (!isMQTTEnabled()) {\n return false;\n }\n ensureMQTTClient();\n if (!client) {\n return false;\n }\n try {\n client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n return true;\n } catch (err) {\n console.warn(`${LOG} publish failed on ${topic}:`, err);\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nvar AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nvar AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nvar AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nvar AIRY_APP_NAME = \"AiryTV Movies & TV\";\nvar AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar LG_TEST_APP_ID = \"com.hulu.plus\";\nvar LG_TEST_APP_NAME = \"Hulu\";\nvar LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\nvar _lgTestDeviceId;\nfunction getLgTestDeviceId() {\n if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n return _lgTestDeviceId;\n}\nfunction isLgWebOS() {\n if (typeof navigator === \"undefined\") return false;\n return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\nfunction getDefaultAppId() {\n if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n const ua = navigator.userAgent;\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n return AIRY_ANDROID_APP_ID;\n}\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 lg = isCtv && isLgWebOS();\n const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);\n const deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? \"lgudid\" : void 0);\n const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n const limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n if (isCtv) {\n return {\n isCtv: true,\n contentUrl: bridgeSignals.contentUrl || readStoredString(\"contentUrl\") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n appId: bridgeSignals.appId || readStoredString(\"appId\") || readStoredString(\"msid\") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n appName: bridgeSignals.appName || readStoredString(\"appName\") || readStoredString(\"an\") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n sessionId: getOrCreateCtvSessionId(),\n ...deviceId ? { deviceId } : {},\n ...deviceIdType ? { deviceIdType } : {},\n ...limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint: 5\n };\n }\n return {\n isCtv: false,\n ...deviceId ? { deviceId } : {},\n ...deviceIdType ? { deviceIdType } : {},\n ...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(isMQTTEnabled() && 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}\nfunction publishTracking(licenseKey, channel, body) {\n ensureMQTTClient();\n publishMQTT(buildPlayerTopic(licenseKey, channel), body);\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 publishTracking(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 publishTracking(licenseKey, \"heartbeat\", metricEvent);\n publishTracking(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 publishTracking(licenseKey, \"heartbeat\", heartbeatData);\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 \"description_url\",\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: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\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.trimStart();\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.trimEnd(), ...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, ctx.appName);\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 const optimizedPodMode = ctx.podMaxAds != null || ctx.podMinDurationMs != null || ctx.podMaxDurationMs != null;\n if (optimizedPodMode) {\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 } else if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n } else {\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 if (ctx.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"an\", ctx.appName);\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 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, ctx.appName);\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/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 getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = 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/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.adRequestPositionInBreak = 0;\n this.lastHeartbeatTime = 0;\n this.defaultPodMaxAds = 6;\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 this.adRequestPositionInBreak = 0;\n }\n generateVastUrlsWithCorrelators(baseUrl, count, adPlayer, palNonce, inAdBreak) {\n const urls = [];\n for (let i = 0; i < count; i++) {\n this.adRequestPositionInBreak++;\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 adPosition: this.adRequestPositionInBreak,\n isCtv: envSignals.isCtv,\n contentUrl: envSignals.contentUrl,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n appId: envSignals.appId,\n appName: envSignals.appName,\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 consent: this.consentSignals\n });\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved ad request URL (pod=${this.podCounter}, pos=${this.adRequestPositionInBreak}):`,\n finalUrl\n );\n urls.push(finalUrl);\n }\n return urls;\n }\n resolvePodParams(breakDurationMs) {\n const maxDurationMs = breakDurationMs != null && breakDurationMs > 0 ? breakDurationMs : this.config.podMaxDurationMs;\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 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 contentUrl: envSignals.contentUrl,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n appId: envSignals.appId,\n appName: envSignals.appName,\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 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 = {}, adPlayer, inAdBreak, showAds) {\n if (!this.debug) {\n return;\n }\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n showAds: showAds ?? false,\n adPlaying: adPlayer?.isAdPlaying() ?? false,\n inAdBreak: inAdBreak ?? false,\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/AdPreloadPool.ts\nvar AdPreloadPool = class {\n constructor(deps) {\n this.pool = [];\n this.maxPoolSize = 2;\n this.poolActive = false;\n this.loopRunning = false;\n this.deps = deps;\n }\n get active() {\n return this.poolActive;\n }\n set active(value) {\n this.poolActive = value;\n }\n get isLoopRunning() {\n return this.loopRunning;\n }\n startPreloadPool(baseVastUrl, initialUrls, startLoopImmediately = true) {\n if (this.poolActive) {\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Already active, skipping duplicate start\");\n }\n return;\n }\n this.poolActive = true;\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Starting preload pool EARLY (target size: ${this.maxPoolSize})`);\n console.log(`[PRELOAD-POOL] Ad break hasn't started yet, but preloading ads in advance`);\n }\n for (const url of initialUrls) {\n if (this.pool.length < this.maxPoolSize) {\n this.preloadAdIntoPool(url);\n }\n }\n if (startLoopImmediately) {\n this.preloadPoolLoop(baseVastUrl);\n } else if (this.deps.debug) {\n console.log(\n \"[PRELOAD-POOL] Pre-break mode: preloaded once, waiting for SCTE start to continue fetching\"\n );\n }\n }\n async preloadAdIntoPool(vastUrl) {\n const timing = this.deps.timing;\n if (timing.isGamInCooldown()) {\n if (this.deps.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping preload\");\n }\n return;\n }\n if (this.pool.some((entry) => entry.vastUrl === vastUrl) || timing.failedVastUrls.has(vastUrl) || timing.isUrlInCooldown(vastUrl)) {\n return;\n }\n if (this.pool.length >= this.maxPoolSize) {\n return;\n }\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Preloading ad into pool: ${vastUrl}`);\n }\n const epoch = timing.adBreakEpoch;\n const loadPromise = (async () => {\n let hasAdError = false;\n let adErrorPayload = null;\n let errorListenerCleanup = null;\n try {\n const continueLiveStreamDuringAds = this.deps.shouldContinueLiveStreamDuringAds();\n const preloadAd = this.deps.createAdPlayer(continueLiveStreamDuringAds);\n preloadAd.initialize();\n const errorListener = (payload) => {\n hasAdError = true;\n adErrorPayload = payload;\n };\n preloadAd.on(\"ad_error\", errorListener);\n errorListenerCleanup = () => preloadAd.off(\"ad_error\", errorListener);\n await timing.enforceGlobalRateLimit();\n await preloadAd.requestAds(vastUrl);\n preloadAd.pause();\n await new Promise((resolve) => setTimeout(resolve, 1500));\n preloadAd.pause();\n if (hasAdError) {\n const isNoFill = adErrorPayload?.isNoFill || adErrorPayload?.code === 303 || adErrorPayload?.vastErrorCode === 303;\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n preloadAd.destroy();\n timing.recordGamNoFill();\n if (isNoFill) {\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Ad preload returned no-fill: ${vastUrl}`);\n }\n timing.temporaryFailureUrls.set(vastUrl, Date.now());\n } else {\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Ad preload failed with error: ${vastUrl}`, adErrorPayload);\n }\n if (adErrorPayload && !timing.isTemporaryAdError(adErrorPayload)) {\n timing.failedVastUrls.add(vastUrl);\n } else {\n timing.temporaryFailureUrls.set(vastUrl, Date.now());\n }\n }\n return;\n }\n if (!this.poolActive || epoch !== timing.adBreakEpoch) {\n if (this.deps.debug) {\n console.log(\n \"[PRELOAD-POOL] Discarding preloaded ad - break ended during fetch\"\n );\n }\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n try {\n preloadAd.destroy();\n } catch {\n }\n return;\n }\n const poolEntry = {\n vastUrl,\n adController: preloadAd,\n loadedAt: Date.now(),\n isReady: true,\n loadPromise: Promise.resolve()\n };\n const loadedDuration = preloadAd.getLoadedAdDuration?.();\n if (loadedDuration != null && loadedDuration > 0) {\n poolEntry.durationSeconds = loadedDuration;\n }\n const lateErrorListener = (payload) => {\n const index = this.pool.findIndex((entry) => entry.vastUrl === vastUrl);\n if (index >= 0) {\n this.pool.splice(index, 1);\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Late error detected, removed from pool: ${vastUrl}`, payload);\n }\n try {\n preloadAd.destroy();\n } catch {\n }\n }\n };\n preloadAd.on(\"ad_error\", lateErrorListener);\n this.pool.push(poolEntry);\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Ad preloaded (no errors detected within timeout) (pool size: ${this.pool.length}/${this.maxPoolSize}, duration=${poolEntry.durationSeconds ?? \"?\"}s)`);\n }\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n } catch (error) {\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n timing.recordGamNoFill();\n if (this.deps.debug) {\n console.warn(`[PRELOAD-POOL] Failed to preload ad: ${vastUrl}`, error);\n }\n if (error instanceof Error && !timing.isTemporaryAdError(error)) {\n timing.failedVastUrls.add(vastUrl);\n } else if (error instanceof Error && timing.isTemporaryAdError(error)) {\n timing.temporaryFailureUrls.set(vastUrl, Date.now());\n }\n }\n })();\n loadPromise.catch(() => {\n });\n }\n async preloadPoolLoop(baseVastUrl) {\n if (this.loopRunning) {\n return;\n }\n this.loopRunning = true;\n const epoch = this.deps.timing.adBreakEpoch;\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Starting continuous preload loop\");\n }\n while (this.poolActive && epoch === this.deps.timing.adBreakEpoch) {\n if (this.deps.timing.isGamInCooldown()) {\n if (this.deps.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping preload pool loop\");\n }\n break;\n }\n if (!this.deps.isInAdBreak() && this.pool.length >= this.maxPoolSize) {\n await new Promise((resolve) => setTimeout(resolve, 2e3));\n continue;\n }\n if (!this.deps.isInAdBreak() && this.deps.getPendingAdBreak() === null) {\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Ad break cancelled, stopping preload pool\");\n }\n break;\n }\n while (this.pool.length < this.maxPoolSize) {\n if (!this.poolActive || epoch !== this.deps.timing.adBreakEpoch || this.deps.timing.isGamInCooldown()) {\n break;\n }\n if (this.deps.isInAdBreak() && !this.deps.timing.hasTimeToStartAnotherAd()) {\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Not enough ad break time left, stopping preload\");\n }\n break;\n }\n const newUrls = this.deps.generateVastUrlsWithCorrelators(baseVastUrl, 1);\n const newUrl = newUrls[0];\n if (newUrl && !this.deps.timing.failedVastUrls.has(newUrl) && !this.deps.timing.isUrlInCooldown(newUrl)) {\n await this.preloadAdIntoPool(newUrl);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n }\n await new Promise((resolve) => setTimeout(resolve, 2e3));\n }\n this.loopRunning = false;\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Preload loop ended\");\n }\n }\n getPreloadedAd() {\n if (this.pool.length === 0) {\n return null;\n }\n const entry = this.pool.shift();\n if (!entry || !entry.isReady) {\n return null;\n }\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Using preloaded ad from pool (${this.pool.length} remaining)`);\n }\n return {\n vastUrl: entry.vastUrl,\n adController: entry.adController\n };\n }\n stop() {\n this.poolActive = false;\n this.loopRunning = false;\n for (const entry of this.pool) {\n try {\n entry.adController.destroy();\n } catch (error) {\n if (this.deps.debug) {\n console.warn(\"[PRELOAD-POOL] Error destroying preloaded controller:\", error);\n }\n }\n }\n this.pool = [];\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Preload pool stopped and cleaned up\");\n }\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.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = 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: this.config.lowLatencyMode ? 1.5 : 1,\n ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\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 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 });\n this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\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 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 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, preloadPool, 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.preloadPool = preloadPool;\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 get optimizedPodsEnabled() {\n return this.host.config.optimizedPods !== false;\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 if (this.optimizedPodsEnabled) {\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (podPlayed) {\n return;\n }\n if (this.debug) {\n console.log(\"[POD] Optimized pod unavailable, falling back to sequential single-ad path\");\n }\n }\n let firstAdUrl;\n let usePreloadedAd = false;\n let preloadedController;\n const preloaded = this.preloadPool.getPreloadedAd();\n if (preloaded) {\n firstAdUrl = preloaded.vastUrl;\n preloadedController = preloaded.adController;\n usePreloadedAd = true;\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: firstAdUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Using preloaded ad from pool (preloaded in advance, ready immediately!)\");\n }\n } else if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n this.adRequestQueue = [...this.pendingAdBreak.vastUrls];\n firstAdUrl = this.adRequestQueue.shift();\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Pool empty, using prefetched URLs (${this.adRequestQueue.length + 1} available)`);\n }\n this.clearPendingAdBreak();\n } else {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Generating new ad URLs...\");\n }\n const firstAdUrlArray = this.host.generateVastUrls(baseVastUrl, 1);\n firstAdUrl = firstAdUrlArray[0];\n this.adRequestQueue = [];\n }\n if (!firstAdUrl) {\n if (this.debug) {\n console.warn(\"[CONTINUOUS-FETCH] Failed to get first ad URL\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] First VAST URL:\", firstAdUrl);\n }\n try {\n if (usePreloadedAd && preloadedController) {\n if (!this.timing.ensureLoadedAdFitsBudget(preloadedController)) {\n this.timing.rejectLoadedAdForDuration(preloadedController);\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n const adPlayer = this.host.getAdPlayer();\n const preservedMuted = adPlayer.getOriginalMutedState();\n const preservedVolume = adPlayer.getOriginalVolume();\n adPlayer.destroy();\n this.host.video.muted = true;\n this.host.setAdPlayer(preloadedController);\n preloadedController.updateOriginalMutedState(preservedMuted, preservedVolume);\n this.attachImaEventListeners();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Using preloaded ad, resuming and starting playback immediately (no request delay!)\");\n }\n preloadedController.resume();\n this.timing.consecutiveFailures = 0;\n this.startContinuousFetching(baseVastUrl);\n if (!this.preloadPool.active) {\n this.preloadPool.active = true;\n }\n if (!this.preloadPool.isLoopRunning) {\n this.preloadPool.preloadPoolLoop(baseVastUrl);\n }\n await preloadedController.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n const adVolume = currentMuted ? 0 : currentVolume;\n preloadedController.setAdVolume(adVolume);\n } else {\n const adPlayer = this.host.getAdPlayer();\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(firstAdUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: firstAdUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] First ad request successful, starting playback\");\n }\n if (!this.timing.ensureLoadedAdFitsBudget(adPlayer)) {\n this.timing.rejectLoadedAdForDuration(adPlayer);\n this.recreateAdController();\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.startContinuousFetching(baseVastUrl);\n if (!this.preloadPool.active) {\n this.preloadPool.startPreloadPool(baseVastUrl, []);\n }\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n const adVolume = currentMuted ? 0 : currentVolume;\n adPlayer.setAdVolume(adVolume);\n }\n } catch (error) {\n if (this.debug) {\n console.warn(\"[CONTINUOUS-FETCH] First ad request failed:\", error);\n }\n if (!usePreloadedAd) {\n const fallbackPreloaded = this.preloadPool.getPreloadedAd();\n if (fallbackPreloaded) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] First ad failed, using preloaded fallback\");\n }\n try {\n if (!this.timing.ensureLoadedAdFitsBudget(fallbackPreloaded.adController)) {\n this.timing.rejectLoadedAdForDuration(fallbackPreloaded.adController);\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n this.swapToPreloadedAdPlayer(fallbackPreloaded.adController);\n this.timing.consecutiveFailures = 0;\n this.startContinuousFetching(baseVastUrl);\n if (!this.preloadPool.active) {\n this.preloadPool.active = true;\n this.preloadPool.preloadPoolLoop(baseVastUrl);\n }\n const ap = this.host.getAdPlayer();\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n const adVolume = currentMuted ? 0 : currentVolume;\n ap.setAdVolume(adVolume);\n return;\n } catch (fallbackError) {\n if (this.debug) {\n console.warn(\"[CONTINUOUS-FETCH] Preloaded fallback also failed:\", fallbackError);\n }\n }\n }\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(firstAdUrl, Date.now());\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] First ad had temporary error (no-fill) - will try alternatives\");\n }\n } else {\n this.timing.failedVastUrls.add(firstAdUrl);\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] First ad had permanent error - URL blacklisted\");\n }\n }\n this.timing.consecutiveFailures++;\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 sequential 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 if (podCount === 1) {\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n if (!this.preloadPool.active) {\n this.preloadPool.startPreloadPool(baseVastUrl, []);\n }\n }\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 swapToPreloadedAdPlayer(preloadedController) {\n const adPlayer = this.host.getAdPlayer();\n const preservedMuted = adPlayer.getOriginalMutedState();\n const preservedVolume = adPlayer.getOriginalVolume();\n adPlayer.destroy();\n this.host.video.muted = true;\n this.host.setAdPlayer(preloadedController);\n this.attachImaEventListeners();\n preloadedController.updateOriginalMutedState(preservedMuted, preservedVolume);\n preloadedController.resume();\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.host.generateVastUrls(baseVastUrl, 1)[0];\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 const preloaded = this.preloadPool.getPreloadedAd();\n if (preloaded) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Using preloaded ad from pool`);\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: preloaded.vastUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n try {\n if (!this.timing.ensureLoadedAdFitsBudget(preloaded.adController)) {\n this.timing.rejectLoadedAdForDuration(preloaded.adController);\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n this.swapToPreloadedAdPlayer(preloaded.adController);\n const ap = this.host.getAdPlayer();\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 return;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[CONTINUOUS-FETCH] Preloaded ad failed to play:\", error);\n }\n }\n }\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 const preloadedFallback = this.preloadPool.getPreloadedAd();\n if (preloadedFallback) {\n if (this.debug) console.log(\"[AD-ERROR] Play failed, trying preloaded fallback ad\");\n try {\n if (!this.timing.ensureLoadedAdFitsBudget(preloadedFallback.adController)) {\n this.timing.rejectLoadedAdForDuration(preloadedFallback.adController);\n throw playError;\n }\n this.timing.clearAdFailsafeTimer();\n this.swapToPreloadedAdPlayer(preloadedFallback.adController);\n this.timing.consecutiveFailures = 0;\n const fbAp = this.host.getAdPlayer();\n await fbAp.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n fbAp.setAdVolume(getAdAudioVolume(fbAp));\n return;\n } catch (fallbackError) {\n if (this.debug) console.warn(\"[AD-ERROR] Preloaded fallback also failed:\", fallbackError);\n }\n }\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 const preloadedFallback = this.preloadPool.getPreloadedAd();\n if (preloadedFallback) {\n if (this.debug) console.log(\"[AD-ERROR] Request failed, trying preloaded fallback ad\");\n try {\n if (!this.timing.ensureLoadedAdFitsBudget(preloadedFallback.adController)) {\n this.timing.rejectLoadedAdForDuration(preloadedFallback.adController);\n throw error;\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n this.swapToPreloadedAdPlayer(preloadedFallback.adController);\n this.timing.consecutiveFailures = 0;\n const fbAp = this.host.getAdPlayer();\n await fbAp.play();\n this.timing.markAdStarted();\n fbAp.setAdVolume(getAdAudioVolume(fbAp));\n return;\n } catch (fallbackError) {\n if (this.debug) console.warn(\"[AD-ERROR] Preloaded fallback also failed:\", fallbackError);\n }\n }\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.preloadPool.stop();\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 if (this.host.shouldContinueLiveStreamDuringAds()) {\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 }\n if (this.host.video.paused) {\n if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video paused in live mode after ads, resuming playback\");\n this.host.video.play()?.catch(() => {\n });\n } else {\n if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video already playing in live mode after ads\");\n }\n } else if (this.host.video.paused) {\n this.host.video.play()?.catch(() => {\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 });\n this.preloadPool = new AdPreloadPool({\n debug: !!this.config.debugAdTiming,\n createAdPlayer: (c) => this.createAdPlayer(c),\n shouldContinueLiveStreamDuringAds: () => this.shouldContinueLiveStreamDuringAds(),\n timing: this.timing,\n generateVastUrlsWithCorrelators: (base, count) => this.generateVastUrls(base, count),\n isInAdBreak: () => this.adBreak.inAdBreak,\n getPendingAdBreak: () => this.adBreak.pendingAdBreak\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 getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\n generateVastUrls: (base, count) => this.generateVastUrls(base, count),\n generatePodVastUrl: (base, breakDurationMs) => this.generatePodVastUrl(base, breakDurationMs)\n },\n this.timing,\n this.preloadPool,\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 generateVastUrls(baseUrl, count) {\n return this.adConfig.generateVastUrlsWithCorrelators(\n baseUrl,\n count,\n this.adPlayer,\n this.palNonce,\n this.adBreak.inAdBreak\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 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 }).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.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.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 optimizedPods = this.config.optimizedPods !== false;\n const breakDurationMs = marker.durationSeconds != null ? marker.durationSeconds * 1e3 : void 0;\n const generatedUrls = optimizedPods ? [this.generatePodVastUrl(baseVastUrl, breakDurationMs)] : this.generateVastUrls(baseVastUrl, 1);\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(\n `[PREFETCH] Pre-generated ${generatedUrls.length} ${optimizedPods ? \"pod\" : \"VAST\"} URL(s)`\n );\n }\n if (optimizedPods) {\n if (this.debug) {\n console.log(\"[PREFETCH] Optimized pods enabled - skipping single-ad preload pool\");\n }\n return;\n }\n this.preloadPool.startPreloadPool(baseVastUrl, generatedUrls.slice(0, 1), false);\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 this.adBreak.adPodQueue = [];\n this.adBreak.inAdBreak = false;\n this.adBreak.showAds = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\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 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.preloadPool.stop();\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\";\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;\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 licenseKey = options?.licenseKey;\n const mainHlsInstance = options?.mainHlsInstance;\n\n let adVideoElement: HTMLVideoElement | undefined;\n let adHls: Hls | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let currentAd: VastAd | undefined;\n let podAds: VastAd[] = [];\n let podIndex = 0;\n let sessionId: string | undefined;\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 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 generateSessionId(): string {\n return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n function fireTrackingPixels(urls: string[]): void {\n if (!urls || urls.length === 0) return;\n\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n\n if (sessionId) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }session_id=${sessionId}`;\n }\n\n if (licenseKey) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }license_key=${licenseKey}`;\n }\n\n const img = new Image(1, 1);\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 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 mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\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\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n\n const mediaFile: VastMediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: undefined,\n };\n\n if (!url) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr\n ? parseInt(bitrateAttr, 10)\n : undefined;\n mediaFile.bitrate =\n bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\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 mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\n mediaFileElements.forEach((mf) => {\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 (!url) return;\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 (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n }\n });\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(vastTagUrl: string): Promise<string> {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\",\n },\n referrerPolicy: \"no-referrer-when-downgrade\",\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(vastTagUrl);\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(\"[HlsAdPlayer] Pod VAST XML received\");\n\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n return [];\n }\n\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\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\n adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!currentAd || !adVideoElement) return;\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 adVideoElement.addEventListener(\"playing\", () => {\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 adVideoElement.addEventListener(\"ended\", () => {\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 adVideoElement.addEventListener(\"error\", (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n });\n\n adVideoElement.addEventListener(\"volumechange\", () => {\n if (!currentAd) return;\n if (adVideoElement!.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n });\n\n adVideoElement.addEventListener(\"pause\", () => {\n if (currentAd && !adVideoElement!.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n });\n\n adVideoElement.addEventListener(\"play\", () => {\n if (currentAd && adVideoElement!.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n });\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 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 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 adVideoElement!.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n handleAdError();\n });\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 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 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 handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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(() => {});\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 adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n\n emit(\"ad_error\");\n }\n\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\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 = \"30\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\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 sessionId = generateSessionId();\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 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 setupAdEventListeners();\n }\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 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 if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\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(() => {});\n }\n }\n\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n\n currentAd = undefined;\n podAds = [];\n podIndex = 0;\n },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\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 if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = undefined;\n }\n\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n\n adContainerEl = undefined;\n currentAd = 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) {\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","declare 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 =\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url =\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\");\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 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 const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n enabled: boolean;\n brokerAddress: string;\n brokerPort: number;\n wsPort: number;\n username: string;\n password: string;\n topicPrefix: string;\n qos: 0 | 1 | 2;\n brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n enabled: true,\n brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n brokerPort: 8883,\n wsPort: 8084,\n username: \"for-sonifi\",\n password: \"sonifi-mqtt\",\n topicPrefix: \"adstorm/players\",\n qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n licenseKey: string,\n channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n applyMQTTConfig,\n buildMQTTBrokerUrl,\n isMQTTEnabled,\n mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n return status;\n}\n\nexport function isMQTTConnected(): boolean {\n return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n applyMQTTConfig(overrides);\n disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n if (client || !isMQTTEnabled()) return;\n\n const url = buildMQTTBrokerUrl();\n status = \"connecting\";\n\n const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n try {\n client = mqtt.connect(url, {\n clientId,\n username: mqttConfig.username,\n password: mqttConfig.password,\n keepalive: 60,\n clean: true,\n reconnectPeriod: 5000,\n connectTimeout: 10_000,\n queueQoSZero: false,\n });\n } catch (err) {\n status = \"error\";\n console.warn(`${LOG} connect() threw:`, err);\n return;\n }\n\n client.on(\"connect\", () => {\n status = \"connected\";\n console.info(`${LOG} connected to ${url}`);\n });\n\n client.on(\"reconnect\", () => {\n status = \"connecting\";\n console.info(`${LOG} reconnecting…`);\n });\n\n client.on(\"offline\", () => {\n status = \"disconnected\";\n console.warn(`${LOG} offline`);\n });\n\n client.on(\"error\", (err) => {\n status = \"error\";\n console.warn(`${LOG} error:`, err.message);\n });\n\n client.on(\"close\", () => {\n if (status === \"connected\") {\n status = \"disconnected\";\n }\n });\n}\n\nexport function ensureMQTTClient(): void {\n if (isMQTTEnabled() && !client) {\n initMQTTClient();\n }\n}\n\nexport function publishMQTT(\n topic: string,\n payload: Record<string, unknown>\n): boolean {\n if (!isMQTTEnabled()) {\n return false;\n }\n\n ensureMQTTClient();\n\n if (!client) {\n return false;\n }\n\n try {\n client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n return true;\n } catch (err) {\n console.warn(`${LOG} publish failed on ${topic}:`, err);\n return false;\n }\n}\n\nexport function disconnectMQTT(): void {\n if (client) {\n client.end(true);\n client = null;\n status = \"disconnected\";\n }\n}\n","export interface VastEnvironmentSignals {\n isCtv: boolean;\n contentUrl?: string;\n appId?: string;\n appName?: string;\n sessionId?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst LG_TEST_APP_ID = \"com.hulu.plus\";\nconst LG_TEST_APP_NAME = \"Hulu\";\nconst LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\n\nlet _lgTestDeviceId: string | undefined;\nfunction getLgTestDeviceId(): string {\n if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n return _lgTestDeviceId;\n}\n\nfunction isLgWebOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\n\nfunction getDefaultAppId(): string {\n if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n const ua = navigator.userAgent;\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n return AIRY_ANDROID_APP_ID;\n}\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 const lg = isCtv && isLgWebOS();\n\n const deviceId =\n bridgeSignals.deviceId ||\n readStoredDeviceId() ||\n platformDevice.deviceId ||\n (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : undefined);\n const deviceIdType =\n bridgeSignals.deviceIdType ||\n readStoredString(\"deviceIdType\") ||\n readStoredString(\"idtype\") ||\n platformDevice.deviceIdType ||\n inferDeviceIdType() ||\n (lg ? \"lgudid\" : undefined);\n const platformLat = bridgeSignals.deviceId\n ? bridgeSignals.limitAdTracking\n : platformDevice.limitAdTracking;\n const limitAdTracking =\n deviceId != null\n ? platformLat ?? readStoredLimitAdTracking() ?? false\n : undefined;\n\n if (isCtv) {\n return {\n isCtv: true,\n contentUrl:\n bridgeSignals.contentUrl ||\n readStoredString(\"contentUrl\") ||\n (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n appId:\n bridgeSignals.appId ||\n readStoredString(\"appId\") ||\n readStoredString(\"msid\") ||\n (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n appName:\n bridgeSignals.appName ||\n readStoredString(\"appName\") ||\n readStoredString(\"an\") ||\n (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n sessionId: getOrCreateCtvSessionId(),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceIdType ? { deviceIdType } : {}),\n ...(limitAdTracking != null ? { limitAdTracking } : {}),\n deviceTypeHint: 5,\n };\n }\n\n return {\n isCtv: false,\n ...(deviceId ? { deviceId } : {}),\n ...(deviceIdType ? { deviceIdType } : {}),\n ...(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 { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\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(isMQTTEnabled() && 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\nfunction publishTracking(\n licenseKey: string,\n channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n body: Record<string, unknown>\n): void {\n ensureMQTTClient();\n publishMQTT(buildPlayerTopic(licenseKey, channel), body);\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 publishTracking(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 publishTracking(licenseKey, \"heartbeat\", metricEvent);\n publishTracking(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 publishTracking(licenseKey, \"heartbeat\", heartbeatData);\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 adPosition?: number | undefined;\n podMaxAds?: number | undefined;\n podMinDurationMs?: number | undefined;\n podMaxDurationMs?: number | undefined;\n isCtv?: boolean | undefined;\n contentUrl?: string | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n appId?: string | undefined;\n appName?: string | 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 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 \"description_url\",\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: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\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.trimStart();\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.trimEnd(), ...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, ctx.appName);\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 const optimizedPodMode =\n ctx.podMaxAds != null ||\n ctx.podMinDurationMs != null ||\n ctx.podMaxDurationMs != null;\n\n if (optimizedPodMode) {\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 } else if (ctx.adPosition != null) {\n params.set(\"ppos\", String(ctx.adPosition));\n }\n\n const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n } else {\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\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.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"an\", ctx.appName);\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 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, ctx.appName);\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","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 getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { allowNativeHls?: boolean } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = 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","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 {\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 adRequestPositionInBreak: number = 0;\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 this.adRequestPositionInBreak = 0;\n }\n\n generateVastUrlsWithCorrelators(\n baseUrl: string,\n count: number,\n adPlayer: AdController,\n palNonce: PalNonceManager,\n inAdBreak: boolean\n ): string[] {\n const urls: string[] = [];\n\n for (let i = 0; i < count; i++) {\n this.adRequestPositionInBreak++;\n\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 adPosition: this.adRequestPositionInBreak,\n isCtv: envSignals.isCtv,\n contentUrl: envSignals.contentUrl,\n pageUrl:\n !envSignals.isCtv && typeof window !== \"undefined\"\n ? window.location.href\n : undefined,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n appId: envSignals.appId,\n appName: envSignals.appName,\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 consent: this.consentSignals,\n });\n\n const finalUrl = palNonce.injectNonce(urlWithMacros);\n console.log(\n `[StormcloudVideoPlayer] Resolved ad request URL (pod=${this.podCounter}, pos=${this.adRequestPositionInBreak}):`,\n finalUrl\n );\n urls.push(finalUrl);\n }\n\n return urls;\n }\n\n private readonly defaultPodMaxAds: number = 6;\n\n resolvePodParams(breakDurationMs?: number): {\n maxAds: number;\n minDurationMs: number;\n maxDurationMs: number | undefined;\n } {\n const maxDurationMs =\n breakDurationMs != null && breakDurationMs > 0\n ? breakDurationMs\n : this.config.podMaxDurationMs;\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 generatePodVastUrl(\n baseUrl: string,\n podParams: { maxAds: number; minDurationMs: number; maxDurationMs: number | undefined },\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 contentUrl: envSignals.contentUrl,\n pageUrl:\n !envSignals.isCtv && typeof window !== \"undefined\"\n ? window.location.href\n : undefined,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n appId: envSignals.appId,\n appName: envSignals.appName,\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 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}\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> = {}, adPlayer?: AdController, inAdBreak?: boolean, showAds?: boolean): void {\n if (!this.debug) {\n return;\n }\n\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: new Date().toISOString(),\n showAds: showAds ?? false,\n adPlaying: adPlayer?.isAdPlaying() ?? false,\n inAdBreak: inAdBreak ?? false,\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","import type { AdController, Scte35Marker } from \"../types\";\nimport type { AdTimingService } from \"./AdTimingService\";\n\nexport interface AdPreloadPoolDeps {\n debug: boolean;\n createAdPlayer(continueLiveStreamDuringAds: boolean): AdController;\n shouldContinueLiveStreamDuringAds(): boolean;\n timing: AdTimingService;\n generateVastUrlsWithCorrelators(baseUrl: string, count: number): string[];\n isInAdBreak(): boolean;\n getPendingAdBreak(): { marker: Scte35Marker; vastUrls: string[]; isFetching: boolean } | null;\n}\n\nexport class AdPreloadPool {\n private pool: Array<{\n vastUrl: string;\n adController: AdController;\n loadedAt: number;\n isReady: boolean;\n loadPromise: Promise<void>;\n durationSeconds?: number;\n }> = [];\n private readonly maxPoolSize: number = 2;\n private poolActive: boolean = false;\n private loopRunning: boolean = false;\n\n private deps: AdPreloadPoolDeps;\n\n constructor(deps: AdPreloadPoolDeps) {\n this.deps = deps;\n }\n\n get active(): boolean {\n return this.poolActive;\n }\n\n set active(value: boolean) {\n this.poolActive = value;\n }\n\n get isLoopRunning(): boolean {\n return this.loopRunning;\n }\n\n startPreloadPool(\n baseVastUrl: string,\n initialUrls: string[],\n startLoopImmediately: boolean = true\n ): void {\n if (this.poolActive) {\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Already active, skipping duplicate start\");\n }\n return;\n }\n\n this.poolActive = true;\n\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Starting preload pool EARLY (target size: ${this.maxPoolSize})`);\n console.log(`[PRELOAD-POOL] Ad break hasn't started yet, but preloading ads in advance`);\n }\n\n for (const url of initialUrls) {\n if (this.pool.length < this.maxPoolSize) {\n this.preloadAdIntoPool(url);\n }\n }\n\n if (startLoopImmediately) {\n this.preloadPoolLoop(baseVastUrl);\n } else if (this.deps.debug) {\n console.log(\n \"[PRELOAD-POOL] Pre-break mode: preloaded once, waiting for SCTE start to continue fetching\"\n );\n }\n }\n\n private async preloadAdIntoPool(vastUrl: string): Promise<void> {\n const timing = this.deps.timing;\n\n if (timing.isGamInCooldown()) {\n if (this.deps.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping preload\");\n }\n return;\n }\n\n if (\n this.pool.some(entry => entry.vastUrl === vastUrl) ||\n timing.failedVastUrls.has(vastUrl) ||\n timing.isUrlInCooldown(vastUrl)\n ) {\n return;\n }\n\n if (this.pool.length >= this.maxPoolSize) {\n return;\n }\n\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Preloading ad into pool: ${vastUrl}`);\n }\n\n const epoch = timing.adBreakEpoch;\n const loadPromise = (async () => {\n let hasAdError = false;\n let adErrorPayload: any = null;\n let errorListenerCleanup: (() => void) | null = null;\n\n try {\n const continueLiveStreamDuringAds = this.deps.shouldContinueLiveStreamDuringAds();\n const preloadAd = this.deps.createAdPlayer(continueLiveStreamDuringAds);\n preloadAd.initialize();\n\n const errorListener = (payload?: any) => {\n hasAdError = true;\n adErrorPayload = payload;\n };\n preloadAd.on(\"ad_error\", errorListener);\n errorListenerCleanup = () => preloadAd.off(\"ad_error\", errorListener);\n\n await timing.enforceGlobalRateLimit();\n await preloadAd.requestAds(vastUrl);\n\n preloadAd.pause();\n\n await new Promise(resolve => setTimeout(resolve, 1500));\n\n preloadAd.pause();\n\n if (hasAdError) {\n const isNoFill = adErrorPayload?.isNoFill ||\n adErrorPayload?.code === 303 ||\n adErrorPayload?.vastErrorCode === 303;\n\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n preloadAd.destroy();\n\n timing.recordGamNoFill();\n\n if (isNoFill) {\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Ad preload returned no-fill: ${vastUrl}`);\n }\n timing.temporaryFailureUrls.set(vastUrl, Date.now());\n } else {\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Ad preload failed with error: ${vastUrl}`, adErrorPayload);\n }\n if (adErrorPayload && !timing.isTemporaryAdError(adErrorPayload as Error)) {\n timing.failedVastUrls.add(vastUrl);\n } else {\n timing.temporaryFailureUrls.set(vastUrl, Date.now());\n }\n }\n return;\n }\n\n if (!this.poolActive || epoch !== timing.adBreakEpoch) {\n if (this.deps.debug) {\n console.log(\n \"[PRELOAD-POOL] Discarding preloaded ad - break ended during fetch\"\n );\n }\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n try {\n preloadAd.destroy();\n } catch {}\n return;\n }\n\n const poolEntry: {\n vastUrl: string;\n adController: AdController;\n loadedAt: number;\n isReady: boolean;\n loadPromise: Promise<void>;\n durationSeconds?: number;\n } = {\n vastUrl,\n adController: preloadAd,\n loadedAt: Date.now(),\n isReady: true,\n loadPromise: Promise.resolve(),\n };\n const loadedDuration = preloadAd.getLoadedAdDuration?.();\n if (loadedDuration != null && loadedDuration > 0) {\n poolEntry.durationSeconds = loadedDuration;\n }\n\n const lateErrorListener = (payload?: any) => {\n const index = this.pool.findIndex(entry => entry.vastUrl === vastUrl);\n if (index >= 0) {\n this.pool.splice(index, 1);\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Late error detected, removed from pool: ${vastUrl}`, payload);\n }\n try {\n preloadAd.destroy();\n } catch {}\n }\n };\n preloadAd.on(\"ad_error\", lateErrorListener);\n\n this.pool.push(poolEntry);\n\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Ad preloaded (no errors detected within timeout) (pool size: ${this.pool.length}/${this.maxPoolSize}, duration=${poolEntry.durationSeconds ?? \"?\"}s)`);\n }\n\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n } catch (error) {\n if (errorListenerCleanup) {\n errorListenerCleanup();\n }\n\n timing.recordGamNoFill();\n\n if (this.deps.debug) {\n console.warn(`[PRELOAD-POOL] Failed to preload ad: ${vastUrl}`, error);\n }\n\n if (error instanceof Error && !timing.isTemporaryAdError(error)) {\n timing.failedVastUrls.add(vastUrl);\n } else if (error instanceof Error && timing.isTemporaryAdError(error)) {\n timing.temporaryFailureUrls.set(vastUrl, Date.now());\n }\n }\n })();\n\n loadPromise.catch(() => {});\n }\n\n async preloadPoolLoop(baseVastUrl: string): Promise<void> {\n if (this.loopRunning) {\n return;\n }\n\n this.loopRunning = true;\n const epoch = this.deps.timing.adBreakEpoch;\n\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Starting continuous preload loop\");\n }\n\n while (this.poolActive && epoch === this.deps.timing.adBreakEpoch) {\n if (this.deps.timing.isGamInCooldown()) {\n if (this.deps.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping preload pool loop\");\n }\n break;\n }\n\n if (!this.deps.isInAdBreak() && this.pool.length >= this.maxPoolSize) {\n await new Promise(resolve => setTimeout(resolve, 2000));\n continue;\n }\n\n if (!this.deps.isInAdBreak() && this.deps.getPendingAdBreak() === null) {\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Ad break cancelled, stopping preload pool\");\n }\n break;\n }\n\n while (this.pool.length < this.maxPoolSize) {\n if (\n !this.poolActive ||\n epoch !== this.deps.timing.adBreakEpoch ||\n this.deps.timing.isGamInCooldown()\n ) {\n break;\n }\n\n if (this.deps.isInAdBreak() && !this.deps.timing.hasTimeToStartAnotherAd()) {\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Not enough ad break time left, stopping preload\");\n }\n break;\n }\n\n const newUrls = this.deps.generateVastUrlsWithCorrelators(baseVastUrl, 1);\n const newUrl = newUrls[0];\n\n if (newUrl && !this.deps.timing.failedVastUrls.has(newUrl) && !this.deps.timing.isUrlInCooldown(newUrl)) {\n await this.preloadAdIntoPool(newUrl);\n }\n\n await new Promise(resolve => setTimeout(resolve, 1000));\n }\n\n await new Promise(resolve => setTimeout(resolve, 2000));\n }\n\n this.loopRunning = false;\n\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Preload loop ended\");\n }\n }\n\n getPreloadedAd(): { vastUrl: string; adController: AdController } | null {\n if (this.pool.length === 0) {\n return null;\n }\n\n const entry = this.pool.shift();\n if (!entry || !entry.isReady) {\n return null;\n }\n\n if (this.deps.debug) {\n console.log(`[PRELOAD-POOL] Using preloaded ad from pool (${this.pool.length} remaining)`);\n }\n\n return {\n vastUrl: entry.vastUrl,\n adController: entry.adController,\n };\n }\n\n stop(): void {\n this.poolActive = false;\n this.loopRunning = false;\n\n for (const entry of this.pool) {\n try {\n entry.adController.destroy();\n } catch (error) {\n if (this.deps.debug) {\n console.warn(\"[PRELOAD-POOL] Error destroying preloaded controller:\", error);\n }\n }\n }\n\n this.pool = [];\n\n if (this.deps.debug) {\n console.log(\"[PRELOAD-POOL] Preload pool stopped and cleaned up\");\n }\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\n private bufferedSegmentsCount: number = 0;\n private shouldAutoplayAfterBuffering: boolean = false;\n private hasInitialBufferCompleted: 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: this.config.lowLatencyMode ? 1.5 : 1.0,\n ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1000 * 1000,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\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\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\n this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\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 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 destroy(): void {\n this.hls?.destroy();\n this.hls = undefined;\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/HlsPlayer.cjs","../../src/players/HlsPlayer.tsx","../../src/sdk/hlsAdPlayer.ts","../../src/sdk/pal.ts","../../src/utils/mqttConfig.ts","../../src/utils/mqttClient.ts","../../src/utils/vastEnvironmentSignals.ts","../../src/utils/tracking.ts","../../src/utils/polyfills.ts","../../src/utils/vastMacros.ts","../../src/utils/browserCompat.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"],"names":["create","__create","Object","__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","exports","import_react","require","import_hls","MAX_VAST_WRAPPER_DEPTH","createHlsAdPlayer","contentVideo","options","adPlaying","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","podAds","mainHlsInstance","adVideoElement","adHls","adContainerEl","podIndex","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","generateSessionId","img","Image","error","console","warn","Date","now","random","toString","substr","fireTrackingPixels","urls","length","trackingUrl","url","includes","src","log","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level","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","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","createEmptyTrackingUrls","impression","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","extractTrackingUrls","scope","trackingUrls","querySelectorAll","forEach","el","textContent","trim","push","getAttribute","eventKey","mergeTrackingUrls","source","keys","concat","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","adElement","adId","title","clickThrough","wrapperUri","vastAdTagUri","isNoAdAvailable","durationText","durationParts","split","mediaFileElements","mf","index","parseInt","bitrateAttr","bitrateValue","ad","id","duration","parseAdElement","fetchVastXml","vastTagUrl","response","fetch","mode","credentials","headers","ok","statusText","text","fetchAndParseVastAd","depth","accumulatedTracking","vastXml","parsed","substring","fetchAndParsePod","adElements","ads","resolved","aSeq","bSeq","aVal","Number","isFinite","MAX_SAFE_INTEGER","bVal","video","document","createElement","style","position","left","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","currentAd","progress","currentTime","addEventListener","advanceToNextPodAd","handleAdComplete","e","handleAdError","setAdPlayingFlag","ended","isPlaying","dataset","stormcloudAdPlaying","resetQuartileTracking","preserveImpression","loadCurrentAdMedia","isHlsAd","Hls","isSupported","destroy","enableWorker","lowLatencyMode","loadSource","attachMedia","on","Events","MANIFEST_PARSED","play","catch","ERROR","_event","data","fatal","canPlayType","load","total","display","pointerEvents","continueLiveStreamDuringAds","paused","initialize","container","top","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","preloaded","Promise","reject","has","delete","contentVolume","createAdVideoElement","resolve","stop","previousMutedState","visibility","opacity","timeoutId","clearTimeout","remove","removeChild","clear","isAdPlaying","resize","listener","Set","add","off","updateOriginalMutedState","nextVolume","isNaN","getOriginalMutedState","getOriginalVolume","setAdVolume","clamped","getAdVolume","showPlaceholder","hidePlaceholder","getLoadedAdDuration","getLoadedAdId","getPodAdCount","getPodTotalDurationMs","reduce","PAL_SDK_URL","_nonceLoader","_palLoadPromise","loadPalSdk","window","goog","pal","existing","timeout","setTimeout","script","async","setAttribute","onload","onerror","head","createPalNonceManager","currentNonce","currentNonceManager","generateNonce","getOrCreateNonceLoader","consentSettings","ConsentSettings","allowStorage","NonceLoader","loader","request","manager","NonceRequest","adWillAutoPlay","adWillPlayMuted","playerVolume","continuousPlayback","descriptionUrl","location","href","iconsSupported","playerType","playerVersion","supportedApiFrameworks","videoWidth","videoHeight","ppid","loadNonceManager","getNonce","getCurrentNonce","injectNonce","URL","searchParams","base","replace","sep","encodeURIComponent","sendPlaybackStart","sendPlaybackEnd","sendAdClick","sendAdTouch","reset","DEFAULT_MQTT_CONFIG","enabled","brokerAddress","brokerPort","wsPort","username","password","topicPrefix","qos","mqttConfig","isMQTTEnabled","buildMQTTBrokerUrl","brokerUrl","initMQTTClient","connectTimeout","queueQoSZero","client","channel","import_mqtt","LOG","status","clientId","slice","mqtt","connect","err","info","message","ensureMQTTClient","publishMQTT","topic","publish","JSON","stringify","AIRY_ANDROID_APP_ID","AIRY_WEBOS_APP_ID","AIRY_TIZEN_APP_ID","AIRY_ROKU_APP_ID","CTV_SESSION_STORAGE_KEY","_lgTestDeviceId","createUuid","AIRY_APP_NAME","PLAYER_ID_STORAGE_KEY","LG_TEST_APP_ID","LG_TEST_APP_NAME","LG_TEST_CONTENT_URL","getLgTestDeviceId","isLgWebOS","getDefaultAppId","ua","navigator","userAgent","test","DEVICE_ID_STORAGE_KEYS","ANDROID_ID_TYPES","platformLat","bridgeSignals","readNativeBridgeSignals","deviceId","platformDevice","readPlatformNativeDeviceId","readStoredDeviceId","lg","limitAdTracking","deviceIdType","readStoredString","inferDeviceIdType","readStoredLimitAdTracking","isCtv","contentUrl","AIRY_DEFAULT_CONTENT_URL","appId","appName","getOrCreateCtvSessionId","isEquivalentDeviceIdType","tagType","runtimeType","tag","runtime","resolveNativeDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","readPersistentId","writePersistentId","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","prefix","parts","cookie","part","entry","decodeURIComponent","bytes","crypto","randomUUID","getRandomValues","seed","floor","performanceNow","i","hex","padStart","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","candidates","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","readBridgeValue","readBridgeBoolean","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","availWidth","availHeight","orientation","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","webosMatch","match","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","domain","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","Uint8Array","TextEncoder","encode","unescape","charCodeAt","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","publishTracking","body","buildPlayerTopic","sendInitialTracking","metricEvent","events","sendAdDetectTracking","adDetectInfo","sendHeartbeat","sendAdLoadedTracking","adLoadedInfo","sendAdImpressionTracking","adImpressionInfo","ad_played_count","ad_url","adUrl","heartbeatData","polyfillURLSearchParams","URLSearchParams","URLSearchParamsPolyfill","init","params","parseQueryString","append","query","cleanQuery","param","decodedKey","safeDecodeURIComponent","decodedValue","str","values","String","getAll","callback","polyfillTextEncoder","TextEncoderPolyfill","encoding","charcode","polyfillPromiseFinally","finally","constructor","then","reason","polyfillObjectAssign","assign","sources","TypeError","nextSource","nextKey","polyfillArrayFrom","arrayLike","mapFn","thisArg","items","len","polyfillStringStartsWith","search","pos","polyfillStringIncludes","polyfillStringEndsWith","indexOf","initializePolyfills","UNEXPANDED_MACRO_PATTERN","INVALID_VAST_PARAM_KEY","EXAMPLE_COM_URL","CTV_UNSUPPORTED_PARAMS","INLINE_DEVICE_MACRO_REPLACEMENTS","pattern","ctx","getValue","correlator","trimmed","generateCorrelator","buf","Uint32Array","baseUrl","applyDeviceIdentityParams","runtimeId","tagRdid","tagLat","latValue","tagRdidValid","tagTypeValid","removeBrokenAppNameOrphans","toDelete","_value","suffix","trimStart","normalizeVastTagUrl","raw","anValue","orphanFragments","reconstructed","trimEnd","_match","val","applyVastMacros","expandedUrl","expandInlineMacroPlaceholders","replaceCorrelatorFallback","streamCorrelator","pod","podMinDurationMs","round","podMaxDurationMs","podMaxAds","requestUrl","pageUrl","existingUrl","timeoutMs","fetchConsentSignals","deviceTypeHint","consent","gdpr","gdprConsent","usPrivacy","adTest","staleKeys","correlatorRegex","signals","tasks","tcfApi","__tcfapi","settled","tcData","success","eventStatus","gdprApplies","tcString","uspApi","__uspapi","uspString","getChromeVersion","getWebKitVersion","getPlatform","userAgentData","detectBrowser","version","majorVersion","isLegacyTV","supportsModernJS","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","getBrowserConfigOverrides","browser","overrides","allowNativeHls","logBrowserInfo","debug","d","parseCueOutDuration","num","parseFloat","dStr","parseCueOutCont","res","elapsedMatch","durationMatch","elapsed","slashMatch","parseAttributeList","attrs","regex","exec","rawVal","toNumber","n","isManifestBasedMarker","marker","decodeId3ValueToText","decoder","TextDecoder","decode","out","fromCharCode","getFragmentStartSeconds","frag","startPTS","candidate","parseScte35FromId3","cueOutMatch","arg","dur","ptsSeconds","durationSeconds","id3","cueOutContMatch","cont","cueInMatch","daterangeMatch","hasScteOut","hasScteIn","klass","bin","parseScte35Binary","normalizeFragmentPayload","ArrayBuffer","isView","view","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","numBits","remainingInByte","toRead","currentByte","shift","mask","bits","skipBits","bytePosition","readSpliceTime","r","ptsAdjustmentTicks","timeSpecifiedFlag","high","low","ptsTicks","markerTypeFromSegmentationTypeId","segmentationTypeId","parseScte35SegmentationDescriptor","descriptor","identifier","segmentationEventId","cancelIndicator","programSegmentationFlag","componentCount","segmentationDurationFlag","durationTicks","segmentationUpidLength","markerType","parseScte35SegmentationDescriptors","descriptorLoopLength","descriptorOffset","descriptorTag","descriptorLength","descriptorDataStart","descriptorDataEnd","descriptorMarker","ptsAdjHigh","ptsAdjLow","spliceCommandLength","spliceEventId","commandBodyStart","cancel","outOfNetwork","programSpliceFlag","durationFlag","spliceImmediateFlag","componentPtsSeconds","spliceCommandType","expectedDescriptorOffset","splice_command_type","splice_event_id","segmentation_event_id","Scte35CueManager","callbacks","pendingScte35Cues","recentScte35CueKeys","recentScte35CueLimit","processedTsScte35Sections","pendingScte35CueKey","pendingScte35CueKeyValue","activeScte35BreakKey","activeScte35BreakKeyValue","scheduledScte35BreakKey","scheduledScte35BreakKeyValue","createScte35CueContext","readiness","sn","fragmentSn","fragmentStartSec","onScte35Cue","pendingKey","getPendingScte35CueKey","cue","trimRecentScte35CueMaps","onEarlyStartCue","shouldAcceptScte35EndCue","inAdBreak","isInAdBreak","hasRecentlyHandledScte35Cue","markScte35CueHandled","onPlaybackCue","activatePendingScte35CuesForFragment","matchingCues","entries","fragmentStartSeconds","createScte35Cue","getScte35CueKey","getScte35MarkerRaw","toIdentityString","daterangeId","ID","scteValue","isStrongScte35CueKey","recentKey","AdConfigManager","vmapBreaks","consumedVmapBreakIds","viewCorrelator","consentSignals","podCounter","podAssignedByPrefetch","defaultPodMaxAds","defaultPodMaxDurationMs","isVmapEnabled","isVmap","vmapUrl","fetchAdConfiguration","fetchAndParseVmap","vastMode","vastEndpoint","apiVastTagUrl","apiUrl","json","imaPayload","ima","decodedPayload","numberAds","vast","cue_tones","number_ads","apiNumberAds","vmapXml","parseVmapToBreaks","breakId","doc","VMAP_NS","adBreakNodes","getElementsByTagNameNS","getElementsByTagName","localName","node","startTimeMs","parseVmapTimeOffsetToMs","timeOffsetRaw","adTagNode","adTagUrl","aStart","bStart","timeOffset","hms","hh","mm","ss","ms","hours","minutes","seconds","millis","percent","ratio","durationSec","getAdBreakKey","adBreak","resolveBreakStartMs","findCurrentOrNextBreak","nowMs","schedule","tol","driftToleranceMs","breakStartMs","findBreakForTime","durationMs","selectVastTagsForBreak","s","beginNewAdPod","resolvePodParams","breakDurationMs","maxDurationMs","maxAds","minDurationMs","podExactDuration","envSignals","generatePodVastUrl","podParams","adPlayer","palNonce","resolveVastEnvironmentSignals","ctvAdRequest","urlWithMacros","autoplay","clearInterval","heartbeatInterval","ptsDriftEmaMs","finalUrl","initializeTracking","setInterval","sendHeartbeatIfNeeded","lastHeartbeatTime","destroyTracking","AdTimingService","adRequestWatchdogToken","adBreakPlayedDurationMs","adBreakEpoch","adRequestTokenCounter","activeAdRequestToken","currentAdIndex","totalAdsInBreak","totalAdRequestsInBreak","lastAdRequestTime","consecutiveFailures","maxConsecutiveFailures","minAdRequestIntervalMs","backoffBaseMs","maxBackoffMs","defaultMinRemainingMsToStartAd","failedVastUrls","temporaryFailureUrls","temporaryFailureCooldownMs","globalConsecutiveNoFills","scheduleAdStopCountdown","globalNoFillThreshold","globalNoFillCooldownUntil","globalNoFillBackoffBaseMs","globalNoFillBackoffMaxMs","globalLastGamRequestTime","globalMinGamIntervalMs","remainingMs","ensureAdStoppedByTimer","adStopTimerId","clearAdStopTimer","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","isUrlInCooldown","failureTime","cleanupTemporaryFailures","isGamInCooldown","recordGamNoFill","exponent","backoff","pow","resetGamNoFillCounter","enforceGlobalRateLimit","waitMs","startAdRequestWatchdog","token","clearAdRequestWatchdog","adFailsafeTimeoutMs","adRequestWatchdogId","logAdState","onWatchdogTimeout","startAdFailsafeTimer","clearAdFailsafeTimer","failsafeMs","adFailsafeToken","adFailsafeTimerId","videoPaused","onFailsafeTimeout","extra","showAds","resetForBreakEnd","PlaceholderLayer","ensureContainer","transition","show","wasHidden","requestAnimationFrame","hide","HlsEngine","cueManager","timing","nativeHlsMode","videoSrcProtection","bufferedSegmentsCount","shouldAutoplayAfterBuffering","hasInitialBufferCompleted","shouldUseNativeHls","getStreamType","canNative","setupNativeHls","adBehavior","isLive","setupHls","hls","import_hls2","backBufferLength","liveDurationInfinity","maxLiveSyncPlaybackRate","liveSyncDuration","maxBufferLength","maxMaxBufferLength","maxBufferSize","maxBufferHole","highBufferWatchdogPeriod","nudgeOffset","nudgeMaxRetry","startPosition","MEDIA_ATTACHED","_","_data","minSegments","some","details","live","onManifestParsed","minSegmentsBeforePlay","LEVEL_LOADED","_evt","hasPendingAdBreak","fragments","fragmentsToScan","tagList","isArray","idx","earlyDetection","FRAG_BUFFERED","FRAG_PARSING_METADATA","id3Tags","samples","pts","onId3Tag","FRAG_LOADED","processFragmentScte35Payload","FRAG_DECRYPTED","FRAG_CHANGED","activatePendingCuesForFragment","prog"],"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);\nvar MAX_VAST_WRAPPER_DEPTH = 5;\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 licenseKey = options?.licenseKey;\n const mainHlsInstance = options?.mainHlsInstance;\n let adVideoElement;\n let adHls;\n let adContainerEl;\n let currentAd;\n let podAds = [];\n let podIndex = 0;\n let sessionId;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\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 generateSessionId() {\n return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n function fireTrackingPixels(urls) {\n if (!urls || urls.length === 0) return;\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n if (sessionId) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n }\n if (licenseKey) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n }\n const img = new Image(1, 1);\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 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 mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\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 console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: void 0\n };\n if (!url) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\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 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 mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n mediaFileElements.forEach((mf) => {\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 (!url) return;\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 (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n }\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 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) {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\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(vastTagUrl);\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(\"[HlsAdPlayer] Pod VAST XML received\");\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n return [];\n }\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\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 adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!currentAd || !adVideoElement) return;\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 adVideoElement.addEventListener(\"playing\", () => {\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n });\n adVideoElement.addEventListener(\"ended\", () => {\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 adVideoElement.addEventListener(\"error\", (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\n }\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n handleAdError();\n });\n adVideoElement.addEventListener(\"volumechange\", () => {\n if (!currentAd) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n });\n adVideoElement.addEventListener(\"pause\", () => {\n if (currentAd && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n });\n adVideoElement.addEventListener(\"play\", () => {\n if (currentAd && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n });\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 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 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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n handleAdError();\n });\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 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 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 handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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(() => {\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 adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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 },\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 sessionId = generateSessionId();\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 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 setupAdEventListeners();\n }\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 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 if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\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(() => {\n });\n }\n }\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n currentAd = void 0;\n podAds = [];\n podIndex = 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\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 if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = void 0;\n }\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n adContainerEl = void 0;\n currentAd = 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) {\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/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 = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\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 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/mqttConfig.ts\nvar DEFAULT_MQTT_CONFIG = {\n enabled: true,\n brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n brokerPort: 8883,\n wsPort: 8084,\n username: \"for-sonifi\",\n password: \"sonifi-mqtt\",\n topicPrefix: \"adstorm/players\",\n qos: 1\n};\nvar mqttConfig = { ...DEFAULT_MQTT_CONFIG };\nfunction isMQTTEnabled() {\n return mqttConfig.enabled;\n}\nfunction buildMQTTBrokerUrl() {\n if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\nfunction buildPlayerTopic(licenseKey, channel) {\n return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n\n// src/utils/mqttClient.ts\nvar import_mqtt = __toESM(require(\"mqtt\"), 1);\nvar LOG = \"[StormcloudVideoPlayer][MQTT]\";\nvar client = null;\nvar status = \"disconnected\";\nfunction initMQTTClient() {\n if (client || !isMQTTEnabled()) return;\n const url = buildMQTTBrokerUrl();\n status = \"connecting\";\n const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n try {\n client = import_mqtt.default.connect(url, {\n clientId,\n username: mqttConfig.username,\n password: mqttConfig.password,\n keepalive: 60,\n clean: true,\n reconnectPeriod: 5e3,\n connectTimeout: 1e4,\n queueQoSZero: false\n });\n } catch (err) {\n status = \"error\";\n console.warn(`${LOG} connect() threw:`, err);\n return;\n }\n client.on(\"connect\", () => {\n status = \"connected\";\n console.info(`${LOG} connected to ${url}`);\n });\n client.on(\"reconnect\", () => {\n status = \"connecting\";\n console.info(`${LOG} reconnecting\\u2026`);\n });\n client.on(\"offline\", () => {\n status = \"disconnected\";\n console.warn(`${LOG} offline`);\n });\n client.on(\"error\", (err) => {\n status = \"error\";\n console.warn(`${LOG} error:`, err.message);\n });\n client.on(\"close\", () => {\n if (status === \"connected\") {\n status = \"disconnected\";\n }\n });\n}\nfunction ensureMQTTClient() {\n if (isMQTTEnabled() && !client) {\n initMQTTClient();\n }\n}\nfunction publishMQTT(topic, payload) {\n if (!isMQTTEnabled()) {\n return false;\n }\n ensureMQTTClient();\n if (!client) {\n return false;\n }\n try {\n client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n return true;\n } catch (err) {\n console.warn(`${LOG} publish failed on ${topic}:`, err);\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nvar AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nvar AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nvar AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nvar AIRY_APP_NAME = \"AiryTV Movies & TV\";\nvar AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nvar CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar LG_TEST_APP_ID = \"com.hulu.plus\";\nvar LG_TEST_APP_NAME = \"Hulu\";\nvar LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\nvar _lgTestDeviceId;\nfunction getLgTestDeviceId() {\n if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n return _lgTestDeviceId;\n}\nfunction isLgWebOS() {\n if (typeof navigator === \"undefined\") return false;\n return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\nfunction getDefaultAppId() {\n if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n const ua = navigator.userAgent;\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n return AIRY_ANDROID_APP_ID;\n}\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 lg = isCtv && isLgWebOS();\n const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId || (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : void 0);\n const deviceIdType = bridgeSignals.deviceIdType || readStoredString(\"deviceIdType\") || readStoredString(\"idtype\") || platformDevice.deviceIdType || inferDeviceIdType() || (lg ? \"lgudid\" : void 0);\n const platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;\n const limitAdTracking = deviceId != null ? platformLat ?? readStoredLimitAdTracking() ?? false : void 0;\n if (isCtv) {\n return {\n isCtv: true,\n contentUrl: bridgeSignals.contentUrl || readStoredString(\"contentUrl\") || (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n appId: bridgeSignals.appId || readStoredString(\"appId\") || readStoredString(\"msid\") || (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n appName: bridgeSignals.appName || readStoredString(\"appName\") || readStoredString(\"an\") || (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n sessionId: getOrCreateCtvSessionId(),\n ...deviceId ? { deviceId } : {},\n ...deviceIdType ? { deviceIdType } : {},\n ...limitAdTracking != null ? { limitAdTracking } : {},\n deviceTypeHint: 5\n };\n }\n return {\n isCtv: false,\n ...deviceId ? { deviceId } : {},\n ...deviceIdType ? { deviceIdType } : {},\n ...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(isMQTTEnabled() && 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}\nfunction publishTracking(licenseKey, channel, body) {\n ensureMQTTClient();\n publishMQTT(buildPlayerTopic(licenseKey, channel), body);\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 publishTracking(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 publishTracking(licenseKey, \"heartbeat\", metricEvent);\n publishTracking(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 publishTracking(licenseKey, \"heartbeat\", heartbeatData);\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 \"description_url\",\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: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\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.trimStart();\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.trimEnd(), ...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, ctx.appName);\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 requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n } else {\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 if (ctx.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"an\", ctx.appName);\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 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, ctx.appName);\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/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 getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = 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/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 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 contentUrl: envSignals.contentUrl,\n pageUrl: !envSignals.isCtv && typeof window !== \"undefined\" ? window.location.href : void 0,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n appId: envSignals.appId,\n appName: envSignals.appName,\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 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 = {}, adPlayer, inAdBreak, showAds) {\n if (!this.debug) {\n return;\n }\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: (/* @__PURE__ */ new Date()).toISOString(),\n showAds: showAds ?? false,\n adPlaying: adPlayer?.isAdPlaying() ?? false,\n inAdBreak: inAdBreak ?? false,\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.bufferedSegmentsCount = 0;\n this.shouldAutoplayAfterBuffering = false;\n this.hasInitialBufferCompleted = 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: this.config.lowLatencyMode ? 1.5 : 1,\n ...this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {},\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1e3 * 1e3,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\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 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 });\n this.hls.on(import_hls2.default.Events.LEVEL_LOADED, (_evt, data) => {\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 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 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 /**\n * Produces the next pod ad-request URL for the current break. Every request\n * (initial and continuous-fetch top-up) carries pod macros (pmad/pmnd/pmxd,\n * no ppos); pmxd tracks the remaining break time so top-up pods only ask for\n * what still fits.\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 if (this.host.shouldContinueLiveStreamDuringAds()) {\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 }\n if (this.host.video.paused) {\n if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video paused in live mode after ads, resuming playback\");\n this.host.video.play()?.catch(() => {\n });\n } else {\n if (this.debug) console.log(\"[StormcloudVideoPlayer] Content video already playing in live mode after ads\");\n }\n } else if (this.host.video.paused) {\n this.host.video.play()?.catch(() => {\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 });\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 getLiveSyncPosition: () => this.hlsEngine.getLiveSyncPosition(),\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 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 }).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.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.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 this.adBreak.adPodQueue = [];\n this.adBreak.inAdBreak = false;\n this.adBreak.showAds = false;\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] VMAP ad request failed:\", error);\n }\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 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\";\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;\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 licenseKey = options?.licenseKey;\n const mainHlsInstance = options?.mainHlsInstance;\n\n let adVideoElement: HTMLVideoElement | undefined;\n let adHls: Hls | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let currentAd: VastAd | undefined;\n let podAds: VastAd[] = [];\n let podIndex = 0;\n let sessionId: string | undefined;\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 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 generateSessionId(): string {\n return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n function fireTrackingPixels(urls: string[]): void {\n if (!urls || urls.length === 0) return;\n\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n\n if (sessionId) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }session_id=${sessionId}`;\n }\n\n if (licenseKey) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }license_key=${licenseKey}`;\n }\n\n const img = new Image(1, 1);\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 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 mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\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\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n\n const mediaFile: VastMediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: undefined,\n };\n\n if (!url) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr\n ? parseInt(bitrateAttr, 10)\n : undefined;\n mediaFile.bitrate =\n bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\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 mediaFileElements = adElement.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\n mediaFileElements.forEach((mf) => {\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 (!url) return;\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 (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n }\n });\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(vastTagUrl: string): Promise<string> {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\",\n },\n referrerPolicy: \"no-referrer-when-downgrade\",\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(vastTagUrl);\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(\"[HlsAdPlayer] Pod VAST XML received\");\n\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(vastXml, \"text/xml\");\n\n if (xmlDoc.querySelector(\"parsererror\")) {\n console.error(\"[HlsAdPlayer] Pod VAST XML parsing error (malformed)\");\n return [];\n }\n\n const adElements = Array.from(xmlDoc.querySelectorAll(\"Ad\"));\n if (adElements.length === 0) {\n console.warn(\"[HlsAdPlayer] No <Ad> elements found in pod VAST response\");\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\n adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!currentAd || !adVideoElement) return;\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 adVideoElement.addEventListener(\"playing\", () => {\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 adVideoElement.addEventListener(\"ended\", () => {\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 adVideoElement.addEventListener(\"error\", (e) => {\n if (!adPlaying) return;\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\n }\n\n if (podIndex < podAds.length - 1 && advanceToNextPodAd()) {\n return;\n }\n\n handleAdError();\n });\n\n adVideoElement.addEventListener(\"volumechange\", () => {\n if (!currentAd) return;\n if (adVideoElement!.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n });\n\n adVideoElement.addEventListener(\"pause\", () => {\n if (currentAd && !adVideoElement!.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n });\n\n adVideoElement.addEventListener(\"play\", () => {\n if (currentAd && adVideoElement!.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n });\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 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 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 adVideoElement!.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\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 adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n handleAdError();\n });\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 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 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 handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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(() => {});\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 adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n\n emit(\"ad_error\");\n }\n\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\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 = \"30\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\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 sessionId = generateSessionId();\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 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 setupAdEventListeners();\n }\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 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 if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\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(() => {});\n }\n }\n\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n\n currentAd = undefined;\n podAds = [];\n podIndex = 0;\n },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\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 if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = undefined;\n }\n\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n\n adContainerEl = undefined;\n currentAd = 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) {\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","declare 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 =\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url =\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\");\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 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 const MQTT_CA_CERT_FILE = \"src/certs/emqxsl-ca.crt\";\n\nexport type MQTTConfig = {\n enabled: boolean;\n brokerAddress: string;\n brokerPort: number;\n wsPort: number;\n username: string;\n password: string;\n topicPrefix: string;\n qos: 0 | 1 | 2;\n brokerUrl?: string;\n};\n\nexport const DEFAULT_MQTT_CONFIG: MQTTConfig = {\n enabled: true,\n brokerAddress: \"vecbae77.ala.us-east-1.emqxsl.com\",\n brokerPort: 8883,\n wsPort: 8084,\n username: \"for-sonifi\",\n password: \"sonifi-mqtt\",\n topicPrefix: \"adstorm/players\",\n qos: 1,\n};\n\nexport const mqttConfig: MQTTConfig = { ...DEFAULT_MQTT_CONFIG };\n\nexport function applyMQTTConfig(overrides: Partial<MQTTConfig>): void {\n Object.assign(mqttConfig, overrides);\n}\n\nexport function isMQTTEnabled(): boolean {\n return mqttConfig.enabled;\n}\n\nexport function buildMQTTBrokerUrl(): string {\n if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;\n return `wss://${mqttConfig.brokerAddress}:${mqttConfig.wsPort}/mqtt`;\n}\n\nexport function buildPlayerTopic(\n licenseKey: string,\n channel: \"metrics\" | \"impressions\" | \"heartbeat\"\n): string {\n return `${mqttConfig.topicPrefix}/${licenseKey}/${channel}`;\n}\n","import mqtt from \"mqtt\";\nimport type { MqttClient } from \"mqtt\";\nimport {\n applyMQTTConfig,\n buildMQTTBrokerUrl,\n isMQTTEnabled,\n mqttConfig,\n} from \"./mqttConfig\";\nimport type { MQTTConfig } from \"./mqttConfig\";\n\nconst LOG = \"[StormcloudVideoPlayer][MQTT]\";\n\nexport type MQTTStatus = \"disconnected\" | \"connecting\" | \"connected\" | \"error\";\n\nlet client: MqttClient | null = null;\nlet status: MQTTStatus = \"disconnected\";\n\nexport function getMQTTStatus(): MQTTStatus {\n return status;\n}\n\nexport function isMQTTConnected(): boolean {\n return status === \"connected\" && client !== null && client.connected;\n}\n\nexport function isMQTTConfigured(): boolean {\n return isMQTTEnabled();\n}\n\nexport function configureMQTT(overrides: Partial<MQTTConfig>): void {\n applyMQTTConfig(overrides);\n disconnectMQTT();\n}\n\nexport function initMQTTClient(): void {\n if (client || !isMQTTEnabled()) return;\n\n const url = buildMQTTBrokerUrl();\n status = \"connecting\";\n\n const clientId = `stormcloud-vp-${Math.random().toString(36).slice(2, 9)}`;\n\n try {\n client = mqtt.connect(url, {\n clientId,\n username: mqttConfig.username,\n password: mqttConfig.password,\n keepalive: 60,\n clean: true,\n reconnectPeriod: 5000,\n connectTimeout: 10_000,\n queueQoSZero: false,\n });\n } catch (err) {\n status = \"error\";\n console.warn(`${LOG} connect() threw:`, err);\n return;\n }\n\n client.on(\"connect\", () => {\n status = \"connected\";\n console.info(`${LOG} connected to ${url}`);\n });\n\n client.on(\"reconnect\", () => {\n status = \"connecting\";\n console.info(`${LOG} reconnecting…`);\n });\n\n client.on(\"offline\", () => {\n status = \"disconnected\";\n console.warn(`${LOG} offline`);\n });\n\n client.on(\"error\", (err) => {\n status = \"error\";\n console.warn(`${LOG} error:`, err.message);\n });\n\n client.on(\"close\", () => {\n if (status === \"connected\") {\n status = \"disconnected\";\n }\n });\n}\n\nexport function ensureMQTTClient(): void {\n if (isMQTTEnabled() && !client) {\n initMQTTClient();\n }\n}\n\nexport function publishMQTT(\n topic: string,\n payload: Record<string, unknown>\n): boolean {\n if (!isMQTTEnabled()) {\n return false;\n }\n\n ensureMQTTClient();\n\n if (!client) {\n return false;\n }\n\n try {\n client.publish(topic, JSON.stringify(payload), { qos: mqttConfig.qos });\n return true;\n } catch (err) {\n console.warn(`${LOG} publish failed on ${topic}:`, err);\n return false;\n }\n}\n\nexport function disconnectMQTT(): void {\n if (client) {\n client.end(true);\n client = null;\n status = \"disconnected\";\n }\n}\n","export interface VastEnvironmentSignals {\n isCtv: boolean;\n contentUrl?: string;\n appId?: string;\n appName?: string;\n sessionId?: string;\n deviceId?: string;\n deviceIdType?: string;\n limitAdTracking?: boolean;\n deviceTypeHint?: number;\n}\n\nconst AIRY_ANDROID_APP_ID = \"com.freeairytv.android\";\nconst AIRY_WEBOS_APP_ID = \"com.freeairytv.webos\";\nconst AIRY_TIZEN_APP_ID = \"com.freeairytv.samsung\";\nconst AIRY_ROKU_APP_ID = \"com.freeairytv.roku\";\nconst AIRY_APP_NAME = \"AiryTV Movies & TV\";\nconst AIRY_DEFAULT_CONTENT_URL = \"https://live.airy.tv\";\nconst CTV_SESSION_STORAGE_KEY = \"stormcloud.ctv.sid\";\nexport const PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\n\nconst LG_TEST_APP_ID = \"com.hulu.plus\";\nconst LG_TEST_APP_NAME = \"Hulu\";\nconst LG_TEST_CONTENT_URL = \"https://www.hulu.com/live-tv\";\n\nlet _lgTestDeviceId: string | undefined;\nfunction getLgTestDeviceId(): string {\n if (!_lgTestDeviceId) _lgTestDeviceId = createUuid();\n return _lgTestDeviceId;\n}\n\nfunction isLgWebOS(): boolean {\n if (typeof navigator === \"undefined\") return false;\n return /Web0S|webOS|LG Browser|LGSTB|LGE/i.test(navigator.userAgent);\n}\n\nfunction getDefaultAppId(): string {\n if (typeof navigator === \"undefined\") return AIRY_ANDROID_APP_ID;\n const ua = navigator.userAgent;\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;\n if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;\n if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;\n return AIRY_ANDROID_APP_ID;\n}\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 const lg = isCtv && isLgWebOS();\n\n const deviceId =\n bridgeSignals.deviceId ||\n readStoredDeviceId() ||\n platformDevice.deviceId ||\n (lg && platformDevice.limitAdTracking !== true ? getLgTestDeviceId() : undefined);\n const deviceIdType =\n bridgeSignals.deviceIdType ||\n readStoredString(\"deviceIdType\") ||\n readStoredString(\"idtype\") ||\n platformDevice.deviceIdType ||\n inferDeviceIdType() ||\n (lg ? \"lgudid\" : undefined);\n const platformLat = bridgeSignals.deviceId\n ? bridgeSignals.limitAdTracking\n : platformDevice.limitAdTracking;\n const limitAdTracking =\n deviceId != null\n ? platformLat ?? readStoredLimitAdTracking() ?? false\n : undefined;\n\n if (isCtv) {\n return {\n isCtv: true,\n contentUrl:\n bridgeSignals.contentUrl ||\n readStoredString(\"contentUrl\") ||\n (lg ? LG_TEST_CONTENT_URL : AIRY_DEFAULT_CONTENT_URL),\n appId:\n bridgeSignals.appId ||\n readStoredString(\"appId\") ||\n readStoredString(\"msid\") ||\n (lg ? LG_TEST_APP_ID : getDefaultAppId()),\n appName:\n bridgeSignals.appName ||\n readStoredString(\"appName\") ||\n readStoredString(\"an\") ||\n (lg ? LG_TEST_APP_NAME : AIRY_APP_NAME),\n sessionId: getOrCreateCtvSessionId(),\n ...(deviceId ? { deviceId } : {}),\n ...(deviceIdType ? { deviceIdType } : {}),\n ...(limitAdTracking != null ? { limitAdTracking } : {}),\n deviceTypeHint: 5,\n };\n }\n\n return {\n isCtv: false,\n ...(deviceId ? { deviceId } : {}),\n ...(deviceIdType ? { deviceIdType } : {}),\n ...(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 { buildPlayerTopic, isMQTTEnabled } from \"./mqttConfig\";\nimport { ensureMQTTClient, publishMQTT } from \"./mqttClient\";\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(isMQTTEnabled() && 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\nfunction publishTracking(\n licenseKey: string,\n channel: \"metrics\" | \"impressions\" | \"heartbeat\",\n body: Record<string, unknown>\n): void {\n ensureMQTTClient();\n publishMQTT(buildPlayerTopic(licenseKey, channel), body);\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 publishTracking(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 publishTracking(licenseKey, \"heartbeat\", metricEvent);\n publishTracking(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 publishTracking(licenseKey, \"heartbeat\", heartbeatData);\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 contentUrl?: string | undefined;\n pageUrl?: string | undefined;\n adWillPlayMuted?: boolean | undefined;\n adWillAutoPlay?: boolean | undefined;\n appId?: string | undefined;\n appName?: string | 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 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 \"description_url\",\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: /%%MSID%%/gi, getValue: (ctx) => ctx.appId },\n { pattern: /%%APP_NAME%%/gi, getValue: (ctx) => ctx.appName },\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.trimStart();\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.trimEnd(), ...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, ctx.appName);\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 const requestUrl = ctx.contentUrl || ctx.pageUrl;\n if (requestUrl) {\n params.set(\"url\", requestUrl);\n if (!ctx.isCtv) {\n params.set(\"description_url\", requestUrl);\n }\n } else {\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\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.appId) {\n params.set(\"msid\", ctx.appId);\n }\n if (ctx.appName) {\n removeBrokenAppNameOrphans(params, ctx.appName);\n params.set(\"an\", ctx.appName);\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 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, ctx.appName);\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","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 getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { allowNativeHls?: boolean } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = 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","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 {\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 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 contentUrl: envSignals.contentUrl,\n pageUrl:\n !envSignals.isCtv && typeof window !== \"undefined\"\n ? window.location.href\n : undefined,\n adWillPlayMuted,\n adWillAutoPlay: !!this.config.autoplay,\n appId: envSignals.appId,\n appName: envSignals.appName,\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 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}\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> = {}, adPlayer?: AdController, inAdBreak?: boolean, showAds?: boolean): void {\n if (!this.debug) {\n return;\n }\n\n console.log(\"[StormcloudVideoPlayer][AdState]\", {\n event,\n timestamp: new Date().toISOString(),\n showAds: showAds ?? false,\n adPlaying: adPlayer?.isAdPlaying() ?? false,\n inAdBreak: inAdBreak ?? false,\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\n private bufferedSegmentsCount: number = 0;\n private shouldAutoplayAfterBuffering: boolean = false;\n private hasInitialBufferCompleted: 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: this.config.lowLatencyMode ? 1.5 : 1.0,\n ...(this.config.lowLatencyMode ? { liveSyncDuration: 2 } : {}),\n maxBufferLength: 30,\n maxMaxBufferLength: 600,\n maxBufferSize: 60 * 1000 * 1000,\n maxBufferHole: 0.5,\n highBufferWatchdogPeriod: 2,\n nudgeOffset: 0.1,\n nudgeMaxRetry: 3,\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\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\n this.hls.on(Hls.Events.LEVEL_LOADED, (_evt, data: any) => {\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 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 destroy(): void {\n this.hls?.destroy();\n this.hls = undefined;\n }\n}\n"]}