stormcloud-video-player 0.3.20 → 0.3.22

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.
@@ -698,51 +698,6 @@ function createHlsAdPlayer(contentVideo, options) {
698
698
  });
699
699
  })();
700
700
  },
701
- preloadAds: function preloadAds(vastTagUrl) {
702
- return _async_to_generator(function() {
703
- var inflight, preloadPromise;
704
- return _ts_generator(this, function(_state) {
705
- if (!vastTagUrl || vastTagUrl.trim() === "") {
706
- return [
707
- 2,
708
- Promise.resolve()
709
- ];
710
- }
711
- if (preloadedAds.has(vastTagUrl)) {
712
- return [
713
- 2,
714
- Promise.resolve()
715
- ];
716
- }
717
- inflight = preloadingAds.get(vastTagUrl);
718
- if (inflight) {
719
- return [
720
- 2,
721
- inflight
722
- ];
723
- }
724
- preloadPromise = fetchAndParseVastAd(vastTagUrl).then(function(ad) {
725
- if (ad) {
726
- preloadedAds.set(vastTagUrl, ad);
727
- console.log("[HlsAdPlayer] Cached VAST response for preloading:", vastTagUrl);
728
- }
729
- }).catch(function(error) {
730
- console.warn("[HlsAdPlayer] Failed to preload VAST response:", error);
731
- preloadedAds.delete(vastTagUrl);
732
- }).finally(function() {
733
- preloadingAds.delete(vastTagUrl);
734
- });
735
- preloadingAds.set(vastTagUrl, preloadPromise);
736
- return [
737
- 2,
738
- preloadPromise
739
- ];
740
- });
741
- })();
742
- },
743
- hasPreloadedAd: function hasPreloadedAd(vastTagUrl) {
744
- return preloadedAds.has(vastTagUrl);
745
- },
746
701
  play: function play() {
747
702
  return _async_to_generator(function() {
748
703
  var contentVolume, adVolume, mediaFile;
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/sdk/hlsAdPlayer.cjs","../../src/sdk/hlsAdPlayer.ts"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","value","__toCommonJS","hlsAdPlayer_exports","createHlsAdPlayer","exports","contentVideo","options","originalMutedState","adPlaying","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","mainHlsInstance","adHls","adContainerEl","currentAd","sessionId","preloadingAds","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","warn","generateSessionId","Date","now","random","toString","substr","fireTrackingPixels","urls","length","forEach","url","trackingUrl","includes","img","Image","src","log","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level","width","height","bitrate","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","map","file","widthDiff","abs","heightDiff","resolutionDiff","bitrateDiff","fileBitrate","score","sort","a","b","bestMatch","resolution","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","textContent","adElement","adId","getAttribute","title","isNoAdAvailable","toLowerCase","durationText","durationParts","split","duration","parseInt","mediaFileElements","querySelectorAll","mf","index","type","trim","bitrateAttr","bitrateValue","push","trackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","el","eventKey","clickThrough","fetchAndParseVastAd","id","vastTagUrl","response","vastXml","referrerPolicy","fetch","credentials","headers","ok","statusText","substring","createAdVideoElement","video","document","createElement","style","position","top","adVideoElement","objectFit","backgroundColor","playsInline","muted","setupAdEventListeners","addEventListener","progress","currentTime","handleAdComplete","e","handleAdError","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","timeoutId","window","setTimeout","stillInPod","display","pointerEvents","idx","indexOf","splice","previousMutedState","continueLiveStreamDuringAds","paused","play","catch","initialize","container","left","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","ad","Promise","reject","preloadedAds","has","delete","resolve","preloadAds","inflight","preloadPromise","then","finally","hasPreloadedAd"],"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/sdk/hlsAdPlayer.ts\nvar hlsAdPlayer_exports = {};\n__export(hlsAdPlayer_exports, {\n createHlsAdPlayer: () => createHlsAdPlayer\n});\nmodule.exports = __toCommonJS(hlsAdPlayer_exports);\nvar import_hls = __toESM(require(\"hls.js\"), 1);\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 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 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 null;\n }\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return null;\n }\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\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 if (type === \"application/x-mpegURL\" || type.includes(\"m3u8\")) {\n if (!url) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} has HLS type but empty URL`\n );\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n mediaFiles.push({\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 console.log(`[HlsAdPlayer] Added HLS MediaFile: ${url}`);\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not HLS)`\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 HLS media files found in VAST XML\");\n }\n return null;\n }\n const trackingUrls = {\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 xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n xmlDoc.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 const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return null;\n }\n }\n async function fetchAndParseVastAd(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 const vastXml = await response.text();\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 return parseVastXml(vastXml);\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 handleAdComplete();\n });\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\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 handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n emit(\"content_resume\");\n const timeoutId = window.setTimeout(() => {\n if (destroyed) {\n console.log(\"[HlsAdPlayer] Player destroyed, skipping post-completion check\");\n return;\n }\n const stillInPod = contentVideo.dataset.stormcloudAdPlaying === \"true\";\n if (stillInPod) {\n console.log(\n \"[HlsAdPlayer] Still in ad pod - keeping ad container visible (black screen)\"\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n }\n const idx = pendingTimeouts.indexOf(timeoutId);\n if (idx !== -1) {\n pendingTimeouts.splice(idx, 1);\n }\n }, 50);\n pendingTimeouts.push(timeoutId);\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n console.log(\n `[HlsAdPlayer] Restored mute state: ${previousMutedState} -> ${originalMutedState}`\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n contentVideo.play().catch(() => {\n });\n }\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 = \"10\";\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 ad;\n if (preloadedAds.has(vastTagUrl)) {\n ad = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ad = await fetchAndParseVastAd(vastTagUrl);\n }\n if (!ad) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.resolve();\n }\n currentAd = ad;\n console.log(\n `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n );\n fireTrackingPixels(ad.trackingUrls.impression);\n trackingFired.impression = true;\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 preloadAds(vastTagUrl) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n return Promise.resolve();\n }\n if (preloadedAds.has(vastTagUrl)) {\n return Promise.resolve();\n }\n const inflight = preloadingAds.get(vastTagUrl);\n if (inflight) {\n return inflight;\n }\n const preloadPromise = fetchAndParseVastAd(vastTagUrl).then((ad) => {\n if (ad) {\n preloadedAds.set(vastTagUrl, ad);\n console.log(\n \"[HlsAdPlayer] Cached VAST response for preloading:\",\n vastTagUrl\n );\n }\n }).catch((error) => {\n console.warn(\"[HlsAdPlayer] Failed to preload VAST response:\", error);\n preloadedAds.delete(vastTagUrl);\n }).finally(() => {\n preloadingAds.delete(vastTagUrl);\n });\n preloadingAds.set(vastTagUrl, preloadPromise);\n return preloadPromise;\n },\n hasPreloadedAd(vastTagUrl) {\n return preloadedAds.has(vastTagUrl);\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 trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\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 contentVideo.volume = 0;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n const adVolume = originalMutedState ? 0 : originalVolume;\n adVideoElement.volume = Math.max(0, Math.min(1, adVolume));\n adVideoElement.muted = false;\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 const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n console.log(`[HlsAdPlayer] Loading ad from: ${mediaFile.url}`);\n if (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 (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 {\n throw new Error(\"HLS not supported\");\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 async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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 },\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 = originalMutedState ? 0 : 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 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 adVideoElement.volume = Math.max(0, Math.min(1, volume));\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 };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createHlsAdPlayer\n});\n","import type { ImaController } 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\nexport function createHlsAdPlayer(\n contentVideo: HTMLVideoElement,\n options?: {\n continueLiveStreamDuringAds?: boolean;\n licenseKey?: string;\n mainHlsInstance?: Hls;\n }\n): ImaController {\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 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 parseVastXml(xmlString: string): VastAd | null {\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 null;\n }\n\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return null;\n }\n\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\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 if (type === \"application/x-mpegURL\" || type.includes(\"m3u8\")) {\n if (!url) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} has HLS type but empty URL`\n );\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr\n ? parseInt(bitrateAttr, 10)\n : undefined;\n\n mediaFiles.push({\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate:\n bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n });\n\n console.log(`[HlsAdPlayer] Added HLS MediaFile: ${url}`);\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not HLS)`\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 HLS media files found in VAST XML\");\n }\n return null;\n }\n\n const trackingUrls: VastTrackingUrls = {\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 xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n\n xmlDoc.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 const clickThrough = xmlDoc\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough,\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return null;\n }\n }\n\n async function fetchAndParseVastAd(\n vastTagUrl: string\n ): Promise<VastAd | null> {\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\n const vastXml = await response.text();\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 return parseVastXml(vastXml);\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 handleAdComplete();\n });\n\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\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 handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n emit(\"content_resume\");\n\n const timeoutId = window.setTimeout(() => {\n if (destroyed) {\n console.log(\"[HlsAdPlayer] Player destroyed, skipping post-completion check\");\n return;\n }\n \n const stillInPod = contentVideo.dataset.stormcloudAdPlaying === \"true\";\n if (stillInPod) {\n console.log(\n \"[HlsAdPlayer] Still in ad pod - keeping ad container visible (black screen)\"\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n }\n \n const idx = pendingTimeouts.indexOf(timeoutId);\n if (idx !== -1) {\n pendingTimeouts.splice(idx, 1);\n }\n }, 50);\n \n pendingTimeouts.push(timeoutId);\n }\n\n function handleAdError(): void {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n console.log(\n `[HlsAdPlayer] Restored mute state: ${previousMutedState} -> ${originalMutedState}`\n );\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 contentVideo.play().catch(() => {});\n }\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 = \"10\";\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 ad: VastAd | null | undefined;\n\n if (preloadedAds.has(vastTagUrl)) {\n ad = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ad = await fetchAndParseVastAd(vastTagUrl);\n }\n\n if (!ad) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.resolve();\n }\n\n currentAd = ad;\n console.log(\n `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n );\n\n fireTrackingPixels(ad.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 preloadAds(vastTagUrl: string) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n return Promise.resolve();\n }\n\n if (preloadedAds.has(vastTagUrl)) {\n return Promise.resolve();\n }\n\n const inflight = preloadingAds.get(vastTagUrl);\n if (inflight) {\n return inflight;\n }\n\n const preloadPromise = fetchAndParseVastAd(vastTagUrl)\n .then((ad) => {\n if (ad) {\n preloadedAds.set(vastTagUrl, ad);\n console.log(\n \"[HlsAdPlayer] Cached VAST response for preloading:\",\n vastTagUrl\n );\n }\n })\n .catch((error) => {\n console.warn(\"[HlsAdPlayer] Failed to preload VAST response:\", error);\n preloadedAds.delete(vastTagUrl);\n })\n .finally(() => {\n preloadingAds.delete(vastTagUrl);\n });\n\n preloadingAds.set(vastTagUrl, preloadPromise);\n return preloadPromise;\n },\n hasPreloadedAd(vastTagUrl: string) {\n return preloadedAds.has(vastTagUrl);\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 trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n\n // Capture content volume BEFORE muting\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 contentVideo.volume = 0;\n adPlaying = true;\n setAdPlayingFlag(true);\n\n if (adVideoElement) {\n const adVolume = originalMutedState ? 0 : originalVolume;\n adVideoElement.volume = Math.max(0, Math.min(1, adVolume));\n adVideoElement.muted = false;\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 const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n\n console.log(`[HlsAdPlayer] Loading ad from: ${mediaFile.url}`);\n\n if (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 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 {\n throw new Error(\"HLS not supported\");\n }\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\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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 },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n \n // Clear all pending timeouts\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 = originalMutedState ? 0 : 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 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 adVideoElement.volume = Math.max(0, Math.min(1, volume));\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 };\n}\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24/Dev/stormcloud-vp/lib/sdk/hlsAdPlayer.cjs","../../src/sdk/hlsAdPlayer.ts"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","value","__toCommonJS","hlsAdPlayer_exports","createHlsAdPlayer","exports","contentVideo","options","originalMutedState","adPlaying","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","mainHlsInstance","adHls","adContainerEl","currentAd","sessionId","preloadingAds","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","warn","generateSessionId","Date","now","random","toString","substr","fireTrackingPixels","urls","length","forEach","url","trackingUrl","includes","img","Image","src","log","getMainStreamQuality","levels","currentLevel","autoLevel","loadLevel","level","width","height","bitrate","selectBestMediaFile","mediaFiles","Error","firstFile","mainQuality","scoredFiles","map","file","widthDiff","abs","heightDiff","resolutionDiff","bitrateDiff","fileBitrate","score","sort","a","b","bestMatch","resolution","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","textContent","adElement","adId","getAttribute","title","isNoAdAvailable","toLowerCase","durationText","durationParts","split","duration","parseInt","mediaFileElements","querySelectorAll","mf","index","type","trim","bitrateAttr","bitrateValue","push","trackingUrls","mute","unmute","pause","resume","fullscreen","exitFullscreen","skip","el","eventKey","clickThrough","fetchAndParseVastAd","id","vastTagUrl","response","vastXml","referrerPolicy","fetch","credentials","headers","ok","statusText","substring","createAdVideoElement","video","document","createElement","style","position","top","handleAdComplete","objectFit","backgroundColor","muted","setupAdEventListeners","adVideoElement","addEventListener","progress","currentTime","e","handleAdError","ended","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","timeoutId","window","setTimeout","stillInPod","display","pointerEvents","idx","indexOf","splice","previousMutedState","continueLiveStreamDuringAds","paused","play","catch","initialize","container","left","right","bottom","alignItems","justifyContent","zIndex","parentElement","appendChild","requestAds","ad","Promise","reject","preloadedAds","has","delete","resolve","contentVolume","adVolume","mediaFile"],"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/sdk/hlsAdPlayer.ts\nvar hlsAdPlayer_exports = {};\n__export(hlsAdPlayer_exports, {\n createHlsAdPlayer: () => createHlsAdPlayer\n});\nmodule.exports = __toCommonJS(hlsAdPlayer_exports);\nvar import_hls = __toESM(require(\"hls.js\"), 1);\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 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 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 null;\n }\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return null;\n }\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\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 if (type === \"application/x-mpegURL\" || type.includes(\"m3u8\")) {\n if (!url) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} has HLS type but empty URL`\n );\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n mediaFiles.push({\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 console.log(`[HlsAdPlayer] Added HLS MediaFile: ${url}`);\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not HLS)`\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 HLS media files found in VAST XML\");\n }\n return null;\n }\n const trackingUrls = {\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 xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n xmlDoc.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 const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return null;\n }\n }\n async function fetchAndParseVastAd(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 const vastXml = await response.text();\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 return parseVastXml(vastXml);\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 handleAdComplete();\n });\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\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 handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n emit(\"content_resume\");\n const timeoutId = window.setTimeout(() => {\n if (destroyed) {\n console.log(\"[HlsAdPlayer] Player destroyed, skipping post-completion check\");\n return;\n }\n const stillInPod = contentVideo.dataset.stormcloudAdPlaying === \"true\";\n if (stillInPod) {\n console.log(\n \"[HlsAdPlayer] Still in ad pod - keeping ad container visible (black screen)\"\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n }\n const idx = pendingTimeouts.indexOf(timeoutId);\n if (idx !== -1) {\n pendingTimeouts.splice(idx, 1);\n }\n }, 50);\n pendingTimeouts.push(timeoutId);\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n console.log(\n `[HlsAdPlayer] Restored mute state: ${previousMutedState} -> ${originalMutedState}`\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n contentVideo.play().catch(() => {\n });\n }\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 = \"10\";\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 ad;\n if (preloadedAds.has(vastTagUrl)) {\n ad = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ad = await fetchAndParseVastAd(vastTagUrl);\n }\n if (!ad) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.resolve();\n }\n currentAd = ad;\n console.log(\n `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n );\n fireTrackingPixels(ad.trackingUrls.impression);\n trackingFired.impression = true;\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 trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\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 contentVideo.volume = 0;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n const adVolume = originalMutedState ? 0 : originalVolume;\n adVideoElement.volume = Math.max(0, Math.min(1, adVolume));\n adVideoElement.muted = false;\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 const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n console.log(`[HlsAdPlayer] Loading ad from: ${mediaFile.url}`);\n if (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 (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 {\n throw new Error(\"HLS not supported\");\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 async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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 },\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 = originalMutedState ? 0 : 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 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 adVideoElement.volume = Math.max(0, Math.min(1, volume));\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 };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createHlsAdPlayer\n});\n","import type { ImaController } 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\nexport function createHlsAdPlayer(\n contentVideo: HTMLVideoElement,\n options?: {\n continueLiveStreamDuringAds?: boolean;\n licenseKey?: string;\n mainHlsInstance?: Hls;\n }\n): ImaController {\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 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 parseVastXml(xmlString: string): VastAd | null {\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 null;\n }\n\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return null;\n }\n\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\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 if (type === \"application/x-mpegURL\" || type.includes(\"m3u8\")) {\n if (!url) {\n console.warn(\n `[HlsAdPlayer] MediaFile ${index} has HLS type but empty URL`\n );\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr\n ? parseInt(bitrateAttr, 10)\n : undefined;\n\n mediaFiles.push({\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate:\n bitrateValue && bitrateValue > 0 ? bitrateValue : undefined,\n });\n\n console.log(`[HlsAdPlayer] Added HLS MediaFile: ${url}`);\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not HLS)`\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 HLS media files found in VAST XML\");\n }\n return null;\n }\n\n const trackingUrls: VastTrackingUrls = {\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 xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n\n xmlDoc.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 const clickThrough = xmlDoc\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough,\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return null;\n }\n }\n\n async function fetchAndParseVastAd(\n vastTagUrl: string\n ): Promise<VastAd | null> {\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\n const vastXml = await response.text();\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 return parseVastXml(vastXml);\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 handleAdComplete();\n });\n\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\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 handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n emit(\"content_resume\");\n\n const timeoutId = window.setTimeout(() => {\n if (destroyed) {\n console.log(\"[HlsAdPlayer] Player destroyed, skipping post-completion check\");\n return;\n }\n \n const stillInPod = contentVideo.dataset.stormcloudAdPlaying === \"true\";\n if (stillInPod) {\n console.log(\n \"[HlsAdPlayer] Still in ad pod - keeping ad container visible (black screen)\"\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n }\n \n const idx = pendingTimeouts.indexOf(timeoutId);\n if (idx !== -1) {\n pendingTimeouts.splice(idx, 1);\n }\n }, 50);\n \n pendingTimeouts.push(timeoutId);\n }\n\n function handleAdError(): void {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n console.log(\n `[HlsAdPlayer] Restored mute state: ${previousMutedState} -> ${originalMutedState}`\n );\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 contentVideo.play().catch(() => {});\n }\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 = \"10\";\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 ad: VastAd | null | undefined;\n\n if (preloadedAds.has(vastTagUrl)) {\n ad = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ad = await fetchAndParseVastAd(vastTagUrl);\n }\n\n if (!ad) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.resolve();\n }\n\n currentAd = ad;\n console.log(\n `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n );\n\n fireTrackingPixels(ad.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\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 trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\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 contentVideo.volume = 0;\n adPlaying = true;\n setAdPlayingFlag(true);\n\n if (adVideoElement) {\n const adVolume = originalMutedState ? 0 : originalVolume;\n adVideoElement.volume = Math.max(0, Math.min(1, adVolume));\n adVideoElement.muted = false;\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 const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n\n console.log(`[HlsAdPlayer] Loading ad from: ${mediaFile.url}`);\n\n if (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 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 {\n throw new Error(\"HLS not supported\");\n }\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\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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 },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n \n // Clear all pending timeouts\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 = originalMutedState ? 0 : 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 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 adVideoElement.volume = Math.max(0, Math.min(1, volume));\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 };\n}\n"]}
@@ -1,4 +1,4 @@
1
- import { I as ImaController } from '../types-CryTJVCC.cjs';
1
+ import { I as ImaController } from '../types-Bpq0mkLY.cjs';
2
2
  import Hls from 'hls.js';
3
3
 
4
4
  declare function createHlsAdPlayer(contentVideo: HTMLVideoElement, options?: {
package/lib/sdk/ima.cjs CHANGED
@@ -317,8 +317,6 @@ function createImaController(video, options) {
317
317
  var originalMutedState = false;
318
318
  var originalVolume = typeof video.volume === "number" && !Number.isNaN(video.volume) ? Math.max(0, Math.min(1, video.volume)) : 1;
319
319
  var listeners = /* @__PURE__ */ new Map();
320
- var preloadedVast = /* @__PURE__ */ new Map();
321
- var preloadingVast = /* @__PURE__ */ new Map();
322
320
  var adVideoElement;
323
321
  function setAdPlayingFlag(isPlaying) {
324
322
  if (isPlaying) {
@@ -468,10 +466,10 @@ function createImaController(video, options) {
468
466
  var adsLoadedReject;
469
467
  function makeAdsRequest(google, vastTagUrl) {
470
468
  var adsRequest = new google.ima.AdsRequest();
471
- console.log("[IMA] \uD83D\uDCE1 Requesting VAST from URL (letting IMA fetch fresh)");
469
+ console.log("[IMA] \uD83D\uDCE1 Requesting VAST via IMA SDK:", vastTagUrl.substring(0, 80) + "...");
472
470
  adsRequest.adTagUrl = vastTagUrl;
473
471
  var videoWidth = video.offsetWidth || video.clientWidth || 640;
474
- var videoHeight = video.offsetHeight || video.clientHeight || 360;
472
+ var videoHeight = video.offsetHeight || video.clientHeight || 480;
475
473
  adsRequest.linearAdSlotWidth = videoWidth;
476
474
  adsRequest.linearAdSlotHeight = videoHeight;
477
475
  adsRequest.nonLinearAdSlotWidth = videoWidth;
@@ -517,36 +515,6 @@ function createImaController(video, options) {
517
515
  (_video_parentElement = video.parentElement) === null || _video_parentElement === void 0 ? void 0 : _video_parentElement.appendChild(container);
518
516
  adContainerEl = container;
519
517
  }
520
- function fetchVastDocument(vastTagUrl) {
521
- return _async_to_generator(function() {
522
- var response;
523
- return _ts_generator(this, function(_state) {
524
- switch(_state.label){
525
- case 0:
526
- return [
527
- 4,
528
- fetch(vastTagUrl, {
529
- mode: "cors",
530
- credentials: "include",
531
- headers: {
532
- "Accept": "application/xml, text/xml, */*"
533
- },
534
- referrerPolicy: "no-referrer-when-downgrade"
535
- })
536
- ];
537
- case 1:
538
- response = _state.sent();
539
- if (!response.ok) {
540
- throw new Error("Failed to preload VAST: ".concat(response.status));
541
- }
542
- return [
543
- 2,
544
- response.text()
545
- ];
546
- }
547
- });
548
- })();
549
- }
550
518
  function destroyAdsManager() {
551
519
  if (adsManager) {
552
520
  try {
@@ -861,47 +829,6 @@ function createImaController(video, options) {
861
829
  });
862
830
  })();
863
831
  },
864
- preloadAds: function preloadAds(vastTagUrl) {
865
- return _async_to_generator(function() {
866
- var inflight, preloadPromise;
867
- return _ts_generator(this, function(_state) {
868
- if (!vastTagUrl || vastTagUrl.trim() === "") {
869
- return [
870
- 2,
871
- Promise.resolve()
872
- ];
873
- }
874
- if (preloadedVast.has(vastTagUrl)) {
875
- return [
876
- 2,
877
- Promise.resolve()
878
- ];
879
- }
880
- inflight = preloadingVast.get(vastTagUrl);
881
- if (inflight) {
882
- return [
883
- 2,
884
- inflight
885
- ];
886
- }
887
- preloadPromise = fetchVastDocument(vastTagUrl).then(function(xml) {
888
- preloadedVast.set(vastTagUrl, xml);
889
- }).catch(function() {
890
- preloadedVast.delete(vastTagUrl);
891
- }).finally(function() {
892
- preloadingVast.delete(vastTagUrl);
893
- });
894
- preloadingVast.set(vastTagUrl, preloadPromise);
895
- return [
896
- 2,
897
- preloadPromise
898
- ];
899
- });
900
- })();
901
- },
902
- hasPreloadedAd: function hasPreloadedAd(vastTagUrl) {
903
- return preloadedVast.has(vastTagUrl);
904
- },
905
832
  play: function play() {
906
833
  return _async_to_generator(function() {
907
834
  var _window_google, width, height, adVolume, _video_play;
@@ -920,7 +847,7 @@ function createImaController(video, options) {
920
847
  }
921
848
  try {
922
849
  width = video.clientWidth || 640;
923
- height = video.clientHeight || 360;
850
+ height = video.clientHeight || 480;
924
851
  adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);
925
852
  adPlaying = true;
926
853
  adVolume = originalMutedState ? 0 : originalVolume;
@@ -1010,8 +937,6 @@ function createImaController(video, options) {
1010
937
  adDisplayContainer = void 0;
1011
938
  adsLoader = void 0;
1012
939
  contentVideoHidden = false;
1013
- preloadedVast.clear();
1014
- preloadingVast.clear();
1015
940
  },
1016
941
  isAdPlaying: function isAdPlaying() {
1017
942
  return adPlaying;