stormcloud-video-player 0.3.55 → 0.3.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +418 -84
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +10 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +419 -85
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +303 -60
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +9 -1
- package/lib/players/HlsPlayer.cjs +303 -60
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +303 -60
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +1 -1
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/sdk/ima.cjs +3 -3
- package/lib/sdk/ima.cjs.map +1 -1
- package/lib/sdk/ima.d.cts +1 -1
- package/lib/{types-C23mJ_hh.d.cts → types-Vj55FghO.d.cts} +1 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +416 -84
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/package.json +1 -1
package/lib/sdk/ima.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/ima.cjs","../../src/sdk/ima.ts","../../src/utils/browserCompat.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","ima_exports","createImaController","module","exports","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsIMA","supportsModernJS","recommendedAdPlayer","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","supportsGoogleIMA","browser","document","createElement","video","e","options","adPlaying","contentVideoHidden","originalMutedState","originalVolume","volume","Number","isNaN","Math","max","min","listeners","adVideoElement","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","hideContentVideo","style","transition","opacity","setTimeout","visibility","muted","showContentVideo","offsetHeight","createAdVideoElement","adVideo","position","top","left","width","height","objectFit","backgroundColor","zIndex","playsInline","addEventListener","once","emit","event","payload","set","Array","fn","ensureImaLoaded","window","console","warn","reject","Error","frameEl","frameElement","sandboxAttr","getAttribute","tokens","map","t","trim","filter","length","allowsScripts","has","error","google","ima","resolve","existing","querySelector","timeout","clearTimeout","script","src","async","defer","setAttribute","onload","onerror","head","appendChild","adsManager","adDisplayContainer","adContainerEl","lastAdTagUrl","adsLoadedPromise","adsLoadedResolve","adsLoadedReject","makeAdsRequest","vastTagUrl","adsRequest","AdsRequest","companionSizes","url","searchParams","container","pointerEvents","ciuSzsValue","size","join","currentLocation","location","topLocation","currentUrl","href","topUrl","currentDomain","hostname","modifiedVastTagUrl","URL","baseUrl","paramsToRemove","forEach","param","includes","replace","RegExp","params","separator","adTagUrl","videoWidth","offsetWidth","clientWidth","videoHeight","clientHeight","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","setCompanionSlots","companionSlots","slot","CompanionAdSlot","push","setAdWillAutoPlay","willAutoPlay","paused","autoplay","setAdWillPlayMuted","willPlayMuted","vastLoadTimeout","requestAds","ensurePlaceholderContainer","right","bottom","display","alignItems","justifyContent","parentElement","destroyAdsManager","destroy","destroyAdsLoader","adsLoader","initialize","then","AdDisplayContainer","currentReject","adsLoaderCls","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","evt","adsRenderingSettings","AdsRenderingSettings","enablePreloading","getAdsManager","AdEvent","AdErrorEvent","AD_ERROR","errorEvent","getError","errorCode","getErrorCode","vastErrorCode","getVastErrorCode","errorMessage","getMessage","innerError","getInnerError","inner","message","String","cause","isNoFill","code","continueLiveStreamDuringAds","play","catch","CONTENT_PAUSE_REQUESTED","pause","adVolume","setVolume","STARTED","CONTENT_RESUME_REQUESTED","ALL_ADS_COMPLETED","adErrorEvent"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\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 __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/ima.ts\nvar ima_exports = {};\n__export(ima_exports, {\n createImaController: () => createImaController\n});\nmodule.exports = __toCommonJS(ima_exports);\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS = true;\n let recommendedAdPlayer = \"ima\";\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n if (webOSVersion !== void 0 && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (webOSVersion !== void 0 && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n if (tizenVersion !== void 0 && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (tizenVersion !== void 0 && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction supportsGoogleIMA() {\n const browser = detectBrowser();\n if (browser.isLegacyTV) {\n return false;\n }\n if (typeof document === \"undefined\" || typeof document.createElement !== \"function\") {\n return false;\n }\n try {\n const video = document.createElement(\"video\");\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n if (typeof Promise === \"undefined\") {\n return false;\n }\n return browser.supportsIMA;\n}\n\n// src/sdk/ima.ts\nfunction createImaController(video, options) {\n let adPlaying = false;\n let contentVideoHidden = false;\n let originalMutedState = false;\n let originalVolume = typeof video.volume === \"number\" && !Number.isNaN(video.volume) ? Math.max(0, Math.min(1, video.volume)) : 1;\n const listeners = /* @__PURE__ */ new Map();\n let adVideoElement;\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n video.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete video.dataset.stormcloudAdPlaying;\n }\n }\n function hideContentVideo() {\n if (!contentVideoHidden) {\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.style.opacity = \"0\";\n setTimeout(() => {\n video.style.visibility = \"hidden\";\n }, 300);\n video.muted = true;\n video.volume = 0;\n contentVideoHidden = true;\n }\n }\n function showContentVideo() {\n if (contentVideoHidden) {\n video.style.visibility = \"visible\";\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.offsetHeight;\n video.style.opacity = \"1\";\n video.muted = originalMutedState;\n video.volume = originalVolume;\n contentVideoHidden = false;\n }\n }\n function createAdVideoElement() {\n const adVideo = document.createElement(\"video\");\n adVideo.style.position = \"absolute\";\n adVideo.style.top = \"0\";\n adVideo.style.left = \"0\";\n adVideo.style.width = \"100%\";\n adVideo.style.height = \"100%\";\n adVideo.style.objectFit = \"contain\";\n adVideo.style.backgroundColor = \"transparent\";\n adVideo.style.zIndex = \"15\";\n adVideo.playsInline = true;\n adVideo.volume = originalVolume;\n adVideo.muted = originalMutedState;\n adVideo.style.opacity = \"0\";\n adVideo.addEventListener(\n \"canplay\",\n () => {\n adVideo.style.opacity = \"1\";\n },\n { once: true }\n );\n return adVideo;\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 {\n }\n }\n }\n function ensureImaLoaded() {\n if (!supportsGoogleIMA()) {\n console.warn(\n \"[IMA] Google IMA SDK is not supported on this browser. Please use HLS ad player instead.\"\n );\n return Promise.reject(\n new Error(\"Google IMA SDK not supported on this browser\")\n );\n }\n try {\n const frameEl = window.frameElement;\n const sandboxAttr = frameEl?.getAttribute?.(\"sandbox\") || \"\";\n if (sandboxAttr) {\n const tokens = new Set(\n sandboxAttr.split(/\\s+/).map((t) => t.trim()).filter((t) => t.length > 0)\n );\n const allowsScripts = tokens.has(\"allow-scripts\");\n if (!allowsScripts) {\n console.error(\n \"StormcloudVideoPlayer: The host page is inside a sandboxed iframe without 'allow-scripts'. Google IMA cannot run ads within sandboxed frames. Remove the sandbox attribute or include 'allow-scripts allow-same-origin'.\"\n );\n }\n }\n } catch {\n }\n if (typeof window !== \"undefined\" && window.google?.ima)\n return Promise.resolve();\n const existing = document.querySelector(\n 'script[data-ima=\"true\"]'\n );\n if (existing) {\n if (window.google?.ima) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"IMA SDK load timeout\"));\n }, 1e4);\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"IMA SDK load failed\"));\n });\n });\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://imasdk.googleapis.com/js/sdkloader/ima3.js\";\n script.async = true;\n script.defer = true;\n script.setAttribute(\"data-ima\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"IMA SDK load failed\"));\n document.head.appendChild(script);\n });\n }\n let adsManager;\n let adsLoader;\n let adDisplayContainer;\n let adContainerEl;\n let lastAdTagUrl;\n let adsLoadedPromise;\n let adsLoadedResolve;\n let adsLoadedReject;\n function makeAdsRequest(google, vastTagUrl) {\n const adsRequest = new google.ima.AdsRequest();\n const companionSizes = [\n { width: 728, height: 90 },\n { width: 300, height: 250 },\n { width: 180, height: 150 },\n { width: 120, height: 60 },\n { width: 88, height: 31 },\n { width: 300, height: 60 },\n { width: 300, height: 100 },\n { width: 320, height: 50 },\n { width: 468, height: 60 },\n { width: 300, height: 600 },\n { width: 160, height: 600 }\n ];\n const ciuSzsValue = companionSizes.map((size) => `fluid|${size.width}x${size.height}`).join(\",\");\n const currentLocation = typeof window !== \"undefined\" ? window.location : null;\n const topLocation = typeof window !== \"undefined\" && window.top ? window.top.location : currentLocation;\n const currentUrl = currentLocation?.href || \"\";\n const topUrl = topLocation?.href || currentUrl;\n const currentDomain = currentLocation?.hostname || \"\";\n let modifiedVastTagUrl = vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.set(\"ciu_szs\", ciuSzsValue);\n if (!url.searchParams.has(\"mpt\")) {\n url.searchParams.set(\"mpt\", \"h5_vsi\");\n }\n if (!url.searchParams.has(\"ctv\")) {\n url.searchParams.set(\"ctv\", \"0\");\n }\n if (!url.searchParams.has(\"gdpr\")) {\n url.searchParams.set(\"gdpr\", \"0\");\n }\n if (!url.searchParams.has(\"top\") && topUrl) {\n url.searchParams.set(\"top\", topUrl);\n }\n if (!url.searchParams.has(\"loc\") && currentUrl) {\n url.searchParams.set(\"loc\", currentUrl);\n }\n if (!url.searchParams.has(\"cdm\") && currentDomain) {\n url.searchParams.set(\"cdm\", currentDomain);\n }\n if (!url.searchParams.has(\"eoidce\")) {\n url.searchParams.set(\"eoidce\", \"1\");\n }\n if (!url.searchParams.has(\"fbidx\")) {\n url.searchParams.set(\"fbidx\", \"0\");\n }\n modifiedVastTagUrl = url.toString();\n } catch (e) {\n let baseUrl = vastTagUrl;\n const paramsToRemove = [\"ciu_szs\", \"mpt\", \"ctv\", \"gdpr\", \"top\", \"loc\", \"cdm\", \"eoidce\", \"fbidx\"];\n paramsToRemove.forEach((param) => {\n if (baseUrl.includes(`${param}=`)) {\n baseUrl = baseUrl.replace(new RegExp(`[?&]${param}=[^&]*`, \"g\"), \"\");\n }\n });\n baseUrl = baseUrl.replace(/[?&]$/, \"\");\n const params = new URLSearchParams();\n params.set(\"ciu_szs\", ciuSzsValue);\n params.set(\"mpt\", \"h5_vsi\");\n params.set(\"ctv\", \"0\");\n params.set(\"gdpr\", \"0\");\n if (topUrl) params.set(\"top\", topUrl);\n if (currentUrl) params.set(\"loc\", currentUrl);\n if (currentDomain) params.set(\"cdm\", currentDomain);\n params.set(\"eoidce\", \"1\");\n params.set(\"fbidx\", \"0\");\n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n modifiedVastTagUrl = `${baseUrl}${separator}${params.toString()}`;\n }\n adsRequest.adTagUrl = modifiedVastTagUrl;\n const videoWidth = video.offsetWidth || video.clientWidth || 640;\n const videoHeight = video.offsetHeight || video.clientHeight || 480;\n adsRequest.linearAdSlotWidth = videoWidth;\n adsRequest.linearAdSlotHeight = videoHeight;\n adsRequest.nonLinearAdSlotWidth = videoWidth;\n adsRequest.nonLinearAdSlotHeight = videoHeight;\n if (typeof adsRequest.setCompanionSlots === \"function\") {\n try {\n const companionSlots = [];\n for (const size of companionSizes) {\n const slot = new google.ima.CompanionAdSlot();\n slot.width = size.width;\n slot.height = size.height;\n companionSlots.push(slot);\n }\n adsRequest.setCompanionSlots(companionSlots);\n } catch (error) {\n console.warn(\"[IMA] Failed to set companion slots:\", error);\n }\n }\n if (typeof adsRequest.setAdWillAutoPlay === \"function\") {\n try {\n const willAutoPlay = !video.paused || video.autoplay;\n adsRequest.setAdWillAutoPlay(willAutoPlay);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillAutoPlay:\", error);\n }\n }\n if (typeof adsRequest.setAdWillPlayMuted === \"function\") {\n try {\n const willPlayMuted = video.muted || video.volume === 0;\n adsRequest.setAdWillPlayMuted(willPlayMuted);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillPlayMuted:\", error);\n }\n }\n adsRequest.vastLoadTimeout = 1e4;\n adsLoader.requestAds(adsRequest);\n }\n function ensurePlaceholderContainer() {\n if (adContainerEl) {\n return;\n }\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 container.style.transition = \"opacity 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n function destroyAdsManager() {\n if (adsManager) {\n try {\n adsManager.destroy();\n } catch {\n }\n adsManager = void 0;\n }\n if (adVideoElement) {\n adVideoElement.style.opacity = \"0\";\n }\n }\n function destroyAdsLoader() {\n if (adsLoader) {\n try {\n adsLoader.destroy();\n } catch {\n }\n adsLoader = void 0;\n }\n }\n return {\n initialize() {\n ensureImaLoaded().then(() => {\n const google = window.google;\n ensurePlaceholderContainer();\n if (!adDisplayContainer && adContainerEl) {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n adDisplayContainer = new google.ima.AdDisplayContainer(\n adContainerEl,\n adVideoElement\n );\n try {\n adDisplayContainer.initialize?.();\n } catch {\n }\n }\n }).catch(() => {\n });\n },\n async requestAds(vastTagUrl) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n const error = new Error(\"VAST tag URL is empty or undefined\");\n return Promise.reject(error);\n }\n try {\n new URL(vastTagUrl);\n } catch (e) {\n const error = new Error(`Invalid VAST tag URL format: ${vastTagUrl}`);\n return Promise.reject(error);\n }\n if (adPlaying) {\n return Promise.reject(\n new Error(\"Ad already playing - cannot request new ads\")\n );\n }\n destroyAdsManager();\n destroyAdsLoader();\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n let currentReject;\n adsLoadedPromise = new Promise((resolve, reject) => {\n adsLoadedResolve = resolve;\n adsLoadedReject = reject;\n currentReject = reject;\n setTimeout(() => {\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad request timeout\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n }, 1e4);\n });\n try {\n await ensureImaLoaded();\n const google = window.google;\n lastAdTagUrl = vastTagUrl;\n if (!adDisplayContainer) {\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 = \"transparent\";\n container.style.transition = \"opacity 0.3s ease-in-out, background-color 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n if (!video.parentElement) {\n throw new Error(\"Video element has no parent for ad container\");\n }\n video.parentElement.appendChild(container);\n adContainerEl = container;\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n adVideoElement\n );\n }\n const videoWidth = video.offsetWidth || video.clientWidth;\n const videoHeight = video.offsetHeight || video.clientHeight;\n if (!videoWidth || !videoHeight || videoWidth === 0 || videoHeight === 0) {\n const error = new Error(\n `Invalid video dimensions: ${videoWidth}x${videoHeight}. Cannot initialize ads.`\n );\n currentReject?.(error);\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n return Promise.reject(error);\n }\n if (!adsLoader) {\n const adsLoaderCls = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader = adsLoaderCls;\n adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (evt) => {\n try {\n const adsRenderingSettings = new google.ima.AdsRenderingSettings();\n adsRenderingSettings.enablePreloading = true;\n adsManager = evt.getAdsManager(video, adsRenderingSettings);\n const AdEvent = google.ima.AdEvent.Type;\n const AdErrorEvent = google.ima.AdErrorEvent.Type;\n adsManager.addEventListener(\n AdErrorEvent.AD_ERROR,\n (errorEvent) => {\n const error = errorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n let innerError;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : inner.message || String(inner);\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : error.cause.message || String(error.cause);\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : error.innerError.message || String(error.innerError);\n }\n } catch (e) {\n }\n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n destroyAdsManager();\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n emit(\"ad_error\", {\n code: errorCode,\n vastErrorCode,\n message: errorMessage,\n cause: innerError,\n isNoFill\n });\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n }\n );\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n }\n adPlaying = true;\n setAdPlayingFlag(true);\n const adVolume = originalMutedState ? 0 : originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = originalVolume;\n adVideoElement.muted = originalMutedState;\n }\n if (adsManager) {\n try {\n adsManager.setVolume(adVolume);\n } catch {\n }\n }\n emit(\"content_pause\");\n }\n );\n adsManager.addEventListener(AdEvent.STARTED, () => {\n setAdPlayingFlag(true);\n hideContentVideo();\n if (adVideoElement) {\n const adVolume = originalVolume;\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n if (adsManager) {\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {\n }\n }\n }\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n }\n });\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n showContentVideo();\n emit(\"content_resume\");\n }\n );\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n emit(\"all_ads_completed\");\n });\n if (adsLoadedResolve) {\n adsLoadedResolve();\n adsLoadedResolve = void 0;\n adsLoadedReject = void 0;\n }\n } catch (e) {\n console.error(\"[IMA] Error setting up ads manager:\", e);\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Failed to setup ads manager\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n emit(\"ad_error\");\n }\n },\n false\n );\n adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (adErrorEvent) => {\n const error = adErrorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n let innerError;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : inner.message || String(inner);\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : error.cause.message || String(error.cause);\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : error.innerError.message || String(error.innerError);\n }\n } catch (e) {\n }\n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (adsLoadedReject) {\n adsLoadedReject(new Error(isNoFill ? \"No ads available\" : \"Ads loader error\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n emit(\"ad_error\", {\n code: errorCode,\n vastErrorCode,\n message: errorMessage,\n isNoFill,\n cause: innerError\n });\n },\n false\n );\n }\n makeAdsRequest(google, vastTagUrl);\n return adsLoadedPromise;\n } catch (error) {\n console.error(\"[IMA] Failed to request ads:\", error);\n currentReject?.(error);\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n return Promise.reject(error);\n }\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n if (!adsManager) {\n return Promise.reject(new Error(\"No ads manager\"));\n }\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n adPlaying = true;\n const adVolume = originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n }\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {\n }\n adsManager.start();\n return Promise.resolve();\n } catch (error) {\n adPlaying = false;\n setAdPlayingFlag(false);\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {\n });\n }\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adsManager || !adPlaying) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n if (adsManager && typeof adsManager.pause === \"function\") {\n adsManager.pause();\n }\n } catch (error) {\n console.warn(\"[IMA] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adsManager || !adPlaying) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n if (adsManager && typeof adsManager.resume === \"function\") {\n adsManager.resume();\n }\n } catch (error) {\n console.warn(\"[IMA] Error resuming ad:\", error);\n }\n },\n async stop() {\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\"[IMA] Content video paused in live mode on stop, resuming playback\");\n video.play().catch(() => {\n });\n }\n } else if (video.paused) {\n video.play().catch(() => {\n });\n }\n try {\n adsManager?.stop?.();\n } catch {\n }\n destroyAdsManager();\n },\n destroy() {\n destroyAdsManager();\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"none\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n if (adContainerEl.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n adContainerEl = void 0;\n adVideoElement = void 0;\n }\n }, 500);\n }\n showContentVideo();\n try {\n adsLoader?.destroy?.();\n } catch {\n }\n adDisplayContainer = void 0;\n adsLoader = void 0;\n contentVideoHidden = false;\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n if (!adsManager || !window.google?.ima) {\n console.warn(\n \"[IMA] Cannot resize: No ads manager or IMA SDK available\"\n );\n return;\n }\n try {\n console.log(`[IMA] Resizing ads manager to ${width}x${height}`);\n adsManager.resize(width, height, window.google.ima.ViewMode.NORMAL);\n } catch (error) {\n console.warn(\"[IMA] Error resizing ads manager:\", error);\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 originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = clampedVolume;\n adVideoElement.muted = clampedVolume === 0;\n }\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(clampedVolume);\n } catch {\n }\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n if (adsManager && adPlaying) {\n try {\n return adsManager.getVolume();\n } catch (error) {\n console.warn(\"[IMA] Failed to get ad volume:\", error);\n return 1;\n }\n }\n return 1;\n },\n showPlaceholder() {\n ensurePlaceholderContainer();\n hideContentVideo();\n if (adContainerEl) {\n const wasHidden = adContainerEl.style.display === \"none\" || adContainerEl.style.opacity === \"0\";\n if (wasHidden) {\n adContainerEl.style.transition = \"none\";\n } else {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (adContainerEl) {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.backgroundColor = \"#000\";\n }\n }, 300);\n }\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createImaController\n});\n","import type { ImaController } from \"../types\";\nimport { supportsGoogleIMA } from \"../utils/browserCompat\";\n\ndeclare global {\n interface Window {\n google?: any;\n }\n}\n\nexport function createImaController(\n video: HTMLVideoElement,\n options?: { continueLiveStreamDuringAds?: boolean }\n): ImaController {\n let adPlaying = false;\n let contentVideoHidden = false;\n let originalMutedState = false;\n let originalVolume =\n typeof video.volume === \"number\" && !Number.isNaN(video.volume)\n ? Math.max(0, Math.min(1, video.volume))\n : 1;\n const listeners = new Map<string, Set<(payload?: any) => void>>();\n let adVideoElement: HTMLVideoElement | undefined;\n\n function setAdPlayingFlag(isPlaying: boolean): void {\n if (isPlaying) {\n video.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete video.dataset.stormcloudAdPlaying;\n }\n }\n\n function hideContentVideo(): void {\n if (!contentVideoHidden) {\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.style.opacity = \"0\";\n setTimeout(() => {\n video.style.visibility = \"hidden\";\n }, 300);\n video.muted = true;\n video.volume = 0;\n contentVideoHidden = true;\n }\n }\n\n function showContentVideo(): void {\n if (contentVideoHidden) {\n video.style.visibility = \"visible\";\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.offsetHeight;\n video.style.opacity = \"1\";\n video.muted = originalMutedState;\n video.volume = originalVolume;\n contentVideoHidden = false;\n }\n }\n\n function createAdVideoElement(): HTMLVideoElement {\n const adVideo = document.createElement(\"video\");\n adVideo.style.position = \"absolute\";\n adVideo.style.top = \"0\";\n adVideo.style.left = \"0\";\n adVideo.style.width = \"100%\";\n adVideo.style.height = \"100%\";\n adVideo.style.objectFit = \"contain\";\n adVideo.style.backgroundColor = \"transparent\";\n adVideo.style.zIndex = \"15\";\n adVideo.playsInline = true;\n\n adVideo.volume = originalVolume;\n adVideo.muted = originalMutedState;\n\n adVideo.style.opacity = \"0\";\n adVideo.addEventListener(\n \"canplay\",\n () => {\n adVideo.style.opacity = \"1\";\n },\n { once: true }\n );\n\n return adVideo;\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 {}\n }\n }\n\n function ensureImaLoaded(): Promise<void> {\n if (!supportsGoogleIMA()) {\n console.warn(\n \"[IMA] Google IMA SDK is not supported on this browser. Please use HLS ad player instead.\"\n );\n return Promise.reject(\n new Error(\"Google IMA SDK not supported on this browser\")\n );\n }\n\n try {\n const frameEl = window.frameElement as HTMLIFrameElement | null;\n const sandboxAttr = frameEl?.getAttribute?.(\"sandbox\") || \"\";\n if (sandboxAttr) {\n const tokens = new Set(\n sandboxAttr\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n );\n const allowsScripts = tokens.has(\"allow-scripts\");\n if (!allowsScripts) {\n // eslint-disable-next-line no-console\n console.error(\n \"StormcloudVideoPlayer: The host page is inside a sandboxed iframe without 'allow-scripts'. Google IMA cannot run ads within sandboxed frames. Remove the sandbox attribute or include 'allow-scripts allow-same-origin'.\"\n );\n }\n }\n } catch {}\n\n if (typeof window !== \"undefined\" && window.google?.ima)\n return Promise.resolve();\n const existing = document.querySelector(\n 'script[data-ima=\"true\"]'\n ) as HTMLScriptElement | null;\n if (existing) {\n if (window.google?.ima) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"IMA SDK load timeout\"));\n }, 10000);\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"IMA SDK load failed\"));\n });\n });\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://imasdk.googleapis.com/js/sdkloader/ima3.js\";\n script.async = true;\n script.defer = true;\n script.setAttribute(\"data-ima\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"IMA SDK load failed\"));\n document.head.appendChild(script);\n });\n }\n\n let adsManager: any | undefined;\n let adsLoader: any | undefined;\n let adDisplayContainer: any | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let lastAdTagUrl: string | undefined;\n let adsLoadedPromise: Promise<void> | undefined;\n let adsLoadedResolve: (() => void) | undefined;\n let adsLoadedReject: ((error: Error) => void) | undefined;\n\n function makeAdsRequest(google: any, vastTagUrl: string) {\n const adsRequest = new google.ima.AdsRequest();\n \n const companionSizes = [\n { width: 728, height: 90 },\n { width: 300, height: 250 },\n { width: 180, height: 150 },\n { width: 120, height: 60 },\n { width: 88, height: 31 },\n { width: 300, height: 60 },\n { width: 300, height: 100 },\n { width: 320, height: 50 },\n { width: 468, height: 60 },\n { width: 300, height: 600 },\n { width: 160, height: 600 },\n ];\n\n const ciuSzsValue = companionSizes\n .map((size) => `fluid|${size.width}x${size.height}`)\n .join(\",\");\n\n const currentLocation = typeof window !== \"undefined\" ? window.location : null;\n const topLocation = typeof window !== \"undefined\" && window.top ? window.top.location : currentLocation;\n const currentUrl = currentLocation?.href || \"\";\n const topUrl = topLocation?.href || currentUrl;\n const currentDomain = currentLocation?.hostname || \"\";\n\n let modifiedVastTagUrl = vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n \n url.searchParams.set(\"ciu_szs\", ciuSzsValue);\n \n if (!url.searchParams.has(\"mpt\")) {\n url.searchParams.set(\"mpt\", \"h5_vsi\");\n }\n \n if (!url.searchParams.has(\"ctv\")) {\n url.searchParams.set(\"ctv\", \"0\");\n }\n \n if (!url.searchParams.has(\"gdpr\")) {\n url.searchParams.set(\"gdpr\", \"0\");\n }\n \n if (!url.searchParams.has(\"top\") && topUrl) {\n url.searchParams.set(\"top\", topUrl);\n }\n \n if (!url.searchParams.has(\"loc\") && currentUrl) {\n url.searchParams.set(\"loc\", currentUrl);\n }\n \n if (!url.searchParams.has(\"cdm\") && currentDomain) {\n url.searchParams.set(\"cdm\", currentDomain);\n }\n \n if (!url.searchParams.has(\"eoidce\")) {\n url.searchParams.set(\"eoidce\", \"1\");\n }\n \n if (!url.searchParams.has(\"fbidx\")) {\n url.searchParams.set(\"fbidx\", \"0\");\n }\n \n modifiedVastTagUrl = url.toString();\n } catch (e) {\n let baseUrl = vastTagUrl;\n \n const paramsToRemove = [\"ciu_szs\", \"mpt\", \"ctv\", \"gdpr\", \"top\", \"loc\", \"cdm\", \"eoidce\", \"fbidx\"];\n paramsToRemove.forEach((param) => {\n if (baseUrl.includes(`${param}=`)) {\n baseUrl = baseUrl.replace(new RegExp(`[?&]${param}=[^&]*`, \"g\"), \"\");\n }\n });\n baseUrl = baseUrl.replace(/[?&]$/, \"\");\n \n const params = new URLSearchParams();\n params.set(\"ciu_szs\", ciuSzsValue);\n params.set(\"mpt\", \"h5_vsi\");\n params.set(\"ctv\", \"0\");\n params.set(\"gdpr\", \"0\");\n if (topUrl) params.set(\"top\", topUrl);\n if (currentUrl) params.set(\"loc\", currentUrl);\n if (currentDomain) params.set(\"cdm\", currentDomain);\n params.set(\"eoidce\", \"1\");\n params.set(\"fbidx\", \"0\");\n \n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n modifiedVastTagUrl = `${baseUrl}${separator}${params.toString()}`;\n }\n \n adsRequest.adTagUrl = modifiedVastTagUrl;\n\n const videoWidth = video.offsetWidth || video.clientWidth || 640;\n const videoHeight = video.offsetHeight || video.clientHeight || 480;\n\n adsRequest.linearAdSlotWidth = videoWidth;\n adsRequest.linearAdSlotHeight = videoHeight;\n adsRequest.nonLinearAdSlotWidth = videoWidth;\n adsRequest.nonLinearAdSlotHeight = videoHeight;\n\n if (typeof adsRequest.setCompanionSlots === \"function\") {\n try {\n const companionSlots: any[] = [];\n\n for (const size of companionSizes) {\n const slot = new google.ima.CompanionAdSlot();\n slot.width = size.width;\n slot.height = size.height;\n companionSlots.push(slot);\n }\n\n adsRequest.setCompanionSlots(companionSlots);\n } catch (error) {\n console.warn(\"[IMA] Failed to set companion slots:\", error);\n }\n }\n\n if (typeof adsRequest.setAdWillAutoPlay === \"function\") {\n try {\n const willAutoPlay = !video.paused || video.autoplay;\n adsRequest.setAdWillAutoPlay(willAutoPlay);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillAutoPlay:\", error);\n }\n }\n\n if (typeof adsRequest.setAdWillPlayMuted === \"function\") {\n try {\n const willPlayMuted = video.muted || video.volume === 0;\n adsRequest.setAdWillPlayMuted(willPlayMuted);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillPlayMuted:\", error);\n }\n }\n\n adsRequest.vastLoadTimeout = 10000;\n\n adsLoader.requestAds(adsRequest);\n }\n\n function ensurePlaceholderContainer(): void {\n if (adContainerEl) {\n return;\n }\n\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 container.style.transition = \"opacity 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n function destroyAdsManager() {\n if (adsManager) {\n try {\n adsManager.destroy();\n } catch {}\n adsManager = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.style.opacity = \"0\";\n }\n }\n\n function destroyAdsLoader() {\n if (adsLoader) {\n try {\n adsLoader.destroy();\n } catch {}\n adsLoader = undefined;\n }\n }\n\n return {\n initialize() {\n ensureImaLoaded()\n .then(() => {\n const google = window.google;\n ensurePlaceholderContainer();\n\n if (!adDisplayContainer && adContainerEl) {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n adContainerEl,\n adVideoElement\n );\n try {\n adDisplayContainer.initialize?.();\n } catch {}\n }\n })\n .catch(() => {});\n },\n async requestAds(vastTagUrl: string) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n const error = new Error(\"VAST tag URL is empty or undefined\");\n return Promise.reject(error);\n }\n\n try {\n new URL(vastTagUrl);\n } catch (e) {\n const error = new Error(`Invalid VAST tag URL format: ${vastTagUrl}`);\n return Promise.reject(error);\n }\n\n if (adPlaying) {\n return Promise.reject(\n new Error(\"Ad already playing - cannot request new ads\")\n );\n }\n\n destroyAdsManager();\n destroyAdsLoader();\n\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n\n let currentReject: ((error: Error) => void) | undefined;\n adsLoadedPromise = new Promise<void>((resolve, reject) => {\n adsLoadedResolve = resolve;\n adsLoadedReject = reject;\n currentReject = reject;\n\n setTimeout(() => {\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad request timeout\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n }, 10000);\n });\n\n try {\n await ensureImaLoaded();\n const google = window.google;\n lastAdTagUrl = vastTagUrl;\n\n if (!adDisplayContainer) {\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 = \"transparent\";\n container.style.transition =\n \"opacity 0.3s ease-in-out, background-color 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n\n if (!video.parentElement) {\n throw new Error(\"Video element has no parent for ad container\");\n }\n\n video.parentElement.appendChild(container);\n adContainerEl = container;\n\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n adVideoElement\n );\n\n }\n\n const videoWidth = video.offsetWidth || video.clientWidth;\n const videoHeight = video.offsetHeight || video.clientHeight;\n\n if (\n !videoWidth ||\n !videoHeight ||\n videoWidth === 0 ||\n videoHeight === 0\n ) {\n const error = new Error(\n `Invalid video dimensions: ${videoWidth}x${videoHeight}. Cannot initialize ads.`\n );\n currentReject?.(error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n return Promise.reject(error);\n }\n\n if (!adsLoader) {\n const adsLoaderCls = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader = adsLoaderCls;\n\n adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (evt: any) => {\n try {\n const adsRenderingSettings =\n new google.ima.AdsRenderingSettings();\n adsRenderingSettings.enablePreloading = true;\n adsManager = evt.getAdsManager(video, adsRenderingSettings);\n const AdEvent = google.ima.AdEvent.Type;\n const AdErrorEvent = google.ima.AdErrorEvent.Type;\n\n adsManager.addEventListener(\n AdErrorEvent.AD_ERROR,\n (errorEvent: any) => {\n const error = errorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n \n let innerError: string | undefined;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : (inner.message || String(inner));\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : (error.cause.message || String(error.cause));\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : (error.innerError.message || String(error.innerError));\n }\n } catch (e) {\n }\n \n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n \n\n destroyAdsManager();\n\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n\n emit(\"ad_error\", { \n code: errorCode, \n vastErrorCode, \n message: errorMessage,\n cause: innerError,\n isNoFill \n });\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n video.play()?.catch(() => {});\n }\n }\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n }\n\n adPlaying = true;\n setAdPlayingFlag(true);\n \n const adVolume = originalMutedState ? 0 : originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = originalVolume;\n adVideoElement.muted = originalMutedState;\n }\n if (adsManager) {\n try {\n adsManager.setVolume(adVolume);\n } catch {}\n }\n \n emit(\"content_pause\");\n }\n );\n\n adsManager.addEventListener(AdEvent.STARTED, () => {\n setAdPlayingFlag(true);\n\n hideContentVideo();\n\n if (adVideoElement) {\n const adVolume = originalVolume;\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n \n if (adsManager) {\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {}\n }\n }\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n }\n });\n\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n \n showContentVideo();\n \n emit(\"content_resume\");\n }\n );\n\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n emit(\"all_ads_completed\");\n });\n\n if (adsLoadedResolve) {\n adsLoadedResolve();\n adsLoadedResolve = undefined;\n adsLoadedReject = undefined;\n }\n } catch (e) {\n console.error(\"[IMA] Error setting up ads manager:\", e);\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Failed to setup ads manager\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n }\n },\n false\n );\n\n adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (adErrorEvent: any) => {\n const error = adErrorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n \n let innerError: string | undefined;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : (inner.message || String(inner));\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : (error.cause.message || String(error.cause));\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : (error.innerError.message || String(error.innerError));\n }\n } catch (e) {\n }\n \n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(isNoFill ? \"No ads available\" : \"Ads loader error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\", { \n code: errorCode, \n vastErrorCode, \n message: errorMessage,\n isNoFill,\n cause: innerError\n });\n },\n false\n );\n }\n\n makeAdsRequest(google, vastTagUrl);\n return adsLoadedPromise;\n } catch (error) {\n console.error(\"[IMA] Failed to request ads:\", error);\n\n currentReject?.(error as Error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n return Promise.reject(error);\n }\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n\n if (!adsManager) {\n return Promise.reject(new Error(\"No ads manager\"));\n }\n\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n\n adPlaying = true;\n\n const adVolume = originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n }\n\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {}\n\n adsManager.start();\n\n return Promise.resolve();\n } catch (error) {\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {});\n }\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adsManager || !adPlaying) {\n return;\n }\n\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n\n if (adsManager && typeof adsManager.pause === \"function\") {\n adsManager.pause();\n }\n } catch (error) {\n console.warn(\"[IMA] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adsManager || !adPlaying) {\n return;\n }\n\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {});\n }\n\n if (adsManager && typeof adsManager.resume === \"function\") {\n adsManager.resume();\n }\n } catch (error) {\n console.warn(\"[IMA] Error resuming ad:\", error);\n }\n },\n async stop() {\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\"[IMA] Content video paused in live mode on stop, resuming playback\");\n video.play().catch(() => {});\n }\n } else if (video.paused) {\n video.play().catch(() => {});\n }\n\n try {\n adsManager?.stop?.();\n } catch {}\n\n destroyAdsManager();\n },\n destroy() {\n destroyAdsManager();\n\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"none\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n\n if (adContainerEl.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n\n adContainerEl = undefined;\n adVideoElement = undefined;\n }\n }, 500);\n }\n\n showContentVideo();\n\n try {\n adsLoader?.destroy?.();\n } catch {}\n\n adDisplayContainer = undefined;\n adsLoader = undefined;\n contentVideoHidden = false;\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width: number, height: number) {\n if (!adsManager || !window.google?.ima) {\n console.warn(\n \"[IMA] Cannot resize: No ads manager or IMA SDK available\"\n );\n return;\n }\n\n try {\n console.log(`[IMA] Resizing ads manager to ${width}x${height}`);\n adsManager.resize(width, height, window.google.ima.ViewMode.NORMAL);\n } catch (error) {\n console.warn(\"[IMA] Error resizing ads manager:\", error);\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 off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\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 originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume: number) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = clampedVolume;\n adVideoElement.muted = clampedVolume === 0;\n }\n\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(clampedVolume);\n } catch {}\n }\n },\n getAdVolume(): number {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n\n if (adsManager && adPlaying) {\n try {\n return adsManager.getVolume();\n } catch (error) {\n console.warn(\"[IMA] Failed to get ad volume:\", error);\n return 1;\n }\n }\n return 1;\n },\n showPlaceholder() {\n ensurePlaceholderContainer();\n \n hideContentVideo();\n \n if (adContainerEl) {\n const wasHidden = adContainerEl.style.display === \"none\" || adContainerEl.style.opacity === \"0\";\n if (wasHidden) {\n adContainerEl.style.transition = \"none\";\n } else {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (adContainerEl) {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.backgroundColor = \"#000\";\n }\n }, 300);\n }\n },\n };\n}\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsIMA: boolean;\n supportsModernJS: boolean;\n recommendedAdPlayer: 'ima' | 'hls';\n webOSVersion?: number | undefined;\n tizenVersion?: number | undefined;\n chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS = true;\n let recommendedAdPlayer: 'ima' | 'hls' = 'ima';\n let webOSVersion: number | undefined;\n let tizenVersion: number | undefined;\n let chromeVersionNum: number | undefined;\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n \n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n \n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n \n if (match && match[1]) {\n version = match[1];\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = '6.0';\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = '5.0';\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = '4.0';\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = '3.0';\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = '2.0';\n majorVersion = 2;\n }\n } else {\n version = 'Unknown';\n webOSVersion = undefined;\n }\n\n if (webOSVersion !== undefined && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (webOSVersion !== undefined && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n \n if (tizenVersion !== undefined && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (tizenVersion !== undefined && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n recommendedAdPlayer = 'hls';\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum,\n };\n}\n\nexport function supportsGoogleIMA(): boolean {\n const browser = detectBrowser();\n\n if (browser.isLegacyTV) {\n return false;\n }\n\n if (typeof document === 'undefined' ||\n typeof document.createElement !== 'function') {\n return false;\n }\n\n try {\n const video = document.createElement('video');\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n\n if (typeof Promise === 'undefined') {\n return false;\n }\n\n return browser.supportsIMA;\n}\n\nexport function getRecommendedAdPlayer(): 'ima' | 'hls' {\n const browser = detectBrowser();\n return browser.recommendedAdPlayer;\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n const imaSupport = supportsGoogleIMA();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsIMA: imaSupport,\n supportsModernJS: browser.supportsModernJS,\n recommendedAdPlayer: browser.recommendedAdPlayer,\n ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n adPlayerType?: 'ima' | 'hls';\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { adPlayerType?: 'ima' | 'hls'; allowNativeHls?: boolean } = {};\n\n if (browser.isLegacyTV || !browser.supportsIMA) {\n overrides.adPlayerType = 'hls';\n }\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n\n return overrides;\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'ima':\n return supportsGoogleIMA();\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/ima.cjs","../../src/sdk/ima.ts","../../src/utils/browserCompat.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","ima_exports","createImaController","module","exports","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","detectBrowser","version","majorVersion","isSmartTV","isLegacyTV","supportsIMA","supportsModernJS","recommendedAdPlayer","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams","supportsGoogleIMA","browser","document","createElement","video","e","options","adPlaying","contentVideoHidden","originalMutedState","originalVolume","volume","Number","isNaN","Math","max","min","listeners","adVideoElement","setAdPlayingFlag","isPlaying","dataset","stormcloudAdPlaying","hideContentVideo","style","transition","opacity","setTimeout","visibility","muted","showContentVideo","offsetHeight","createAdVideoElement","adVideo","position","top","left","width","height","objectFit","backgroundColor","zIndex","playsInline","addEventListener","once","emit","event","payload","set","Array","fn","ensureImaLoaded","window","console","warn","reject","Error","frameEl","frameElement","sandboxAttr","getAttribute","tokens","map","t","trim","filter","length","allowsScripts","has","error","google","ima","resolve","existing","querySelector","timeout","clearTimeout","script","src","async","defer","setAttribute","onload","onerror","head","appendChild","adsManager","adDisplayContainer","adContainerEl","lastAdTagUrl","adsLoadedPromise","adsLoadedResolve","adsLoadedReject","makeAdsRequest","vastTagUrl","adsRequest","AdsRequest","companionSizes","url","searchParams","container","pointerEvents","ciuSzsValue","size","join","currentLocation","location","topLocation","currentUrl","href","topUrl","currentDomain","hostname","modifiedVastTagUrl","URL","baseUrl","paramsToRemove","forEach","param","includes","replace","RegExp","params","separator","adTagUrl","videoWidth","offsetWidth","clientWidth","videoHeight","clientHeight","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","setCompanionSlots","companionSlots","slot","CompanionAdSlot","push","setAdWillAutoPlay","willAutoPlay","paused","autoplay","setAdWillPlayMuted","willPlayMuted","vastLoadTimeout","requestAds","ensurePlaceholderContainer","right","bottom","display","alignItems","justifyContent","parentElement","destroyAdsManager","destroy","destroyAdsLoader","adsLoader","initialize","then","AdDisplayContainer","currentReject","adsLoaderCls","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","evt","adsRenderingSettings","AdsRenderingSettings","enablePreloading","getAdsManager","AdEvent","AdErrorEvent","AD_ERROR","errorEvent","getError","errorCode","getErrorCode","vastErrorCode","getVastErrorCode","errorMessage","getMessage","innerError","getInnerError","inner","message","String","cause","isNoFill","code","continueLiveStreamDuringAds","play","catch","CONTENT_PAUSE_REQUESTED","pause","adVolume","setVolume","STARTED","CONTENT_RESUME_REQUESTED","ALL_ADS_COMPLETED","adErrorEvent"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\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 __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/ima.ts\nvar ima_exports = {};\n__export(ima_exports, {\n createImaController: () => createImaController\n});\nmodule.exports = __toCommonJS(ima_exports);\n\n// src/utils/browserCompat.ts\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS = true;\n let recommendedAdPlayer = \"ima\";\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n if (webOSVersion !== void 0 && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (webOSVersion !== void 0 && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n if (tizenVersion !== void 0 && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (tizenVersion !== void 0 && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS = false;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction supportsGoogleIMA() {\n const browser = detectBrowser();\n if (browser.isLegacyTV) {\n return false;\n }\n if (typeof document === \"undefined\" || typeof document.createElement !== \"function\") {\n return false;\n }\n try {\n const video = document.createElement(\"video\");\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n if (typeof Promise === \"undefined\") {\n return false;\n }\n return browser.supportsIMA;\n}\n\n// src/sdk/ima.ts\nfunction createImaController(video, options) {\n let adPlaying = false;\n let contentVideoHidden = false;\n let originalMutedState = false;\n let originalVolume = typeof video.volume === \"number\" && !Number.isNaN(video.volume) ? Math.max(0, Math.min(1, video.volume)) : 1;\n const listeners = /* @__PURE__ */ new Map();\n let adVideoElement;\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n video.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete video.dataset.stormcloudAdPlaying;\n }\n }\n function hideContentVideo() {\n if (!contentVideoHidden) {\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.style.opacity = \"0\";\n setTimeout(() => {\n video.style.visibility = \"hidden\";\n }, 300);\n video.muted = true;\n video.volume = 0;\n contentVideoHidden = true;\n }\n }\n function showContentVideo() {\n if (contentVideoHidden) {\n video.style.visibility = \"visible\";\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.offsetHeight;\n video.style.opacity = \"1\";\n video.muted = originalMutedState;\n video.volume = originalVolume;\n contentVideoHidden = false;\n }\n }\n function createAdVideoElement() {\n const adVideo = document.createElement(\"video\");\n adVideo.style.position = \"absolute\";\n adVideo.style.top = \"0\";\n adVideo.style.left = \"0\";\n adVideo.style.width = \"100%\";\n adVideo.style.height = \"100%\";\n adVideo.style.objectFit = \"contain\";\n adVideo.style.backgroundColor = \"transparent\";\n adVideo.style.zIndex = \"2\";\n adVideo.playsInline = true;\n adVideo.volume = originalVolume;\n adVideo.muted = originalMutedState;\n adVideo.style.opacity = \"0\";\n adVideo.addEventListener(\n \"canplay\",\n () => {\n adVideo.style.opacity = \"1\";\n },\n { once: true }\n );\n return adVideo;\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 {\n }\n }\n }\n function ensureImaLoaded() {\n if (!supportsGoogleIMA()) {\n console.warn(\n \"[IMA] Google IMA SDK is not supported on this browser. Please use HLS ad player instead.\"\n );\n return Promise.reject(\n new Error(\"Google IMA SDK not supported on this browser\")\n );\n }\n try {\n const frameEl = window.frameElement;\n const sandboxAttr = frameEl?.getAttribute?.(\"sandbox\") || \"\";\n if (sandboxAttr) {\n const tokens = new Set(\n sandboxAttr.split(/\\s+/).map((t) => t.trim()).filter((t) => t.length > 0)\n );\n const allowsScripts = tokens.has(\"allow-scripts\");\n if (!allowsScripts) {\n console.error(\n \"StormcloudVideoPlayer: The host page is inside a sandboxed iframe without 'allow-scripts'. Google IMA cannot run ads within sandboxed frames. Remove the sandbox attribute or include 'allow-scripts allow-same-origin'.\"\n );\n }\n }\n } catch {\n }\n if (typeof window !== \"undefined\" && window.google?.ima)\n return Promise.resolve();\n const existing = document.querySelector(\n 'script[data-ima=\"true\"]'\n );\n if (existing) {\n if (window.google?.ima) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"IMA SDK load timeout\"));\n }, 1e4);\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"IMA SDK load failed\"));\n });\n });\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://imasdk.googleapis.com/js/sdkloader/ima3.js\";\n script.async = true;\n script.defer = true;\n script.setAttribute(\"data-ima\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"IMA SDK load failed\"));\n document.head.appendChild(script);\n });\n }\n let adsManager;\n let adsLoader;\n let adDisplayContainer;\n let adContainerEl;\n let lastAdTagUrl;\n let adsLoadedPromise;\n let adsLoadedResolve;\n let adsLoadedReject;\n function makeAdsRequest(google, vastTagUrl) {\n const adsRequest = new google.ima.AdsRequest();\n const companionSizes = [\n { width: 728, height: 90 },\n { width: 300, height: 250 },\n { width: 180, height: 150 },\n { width: 120, height: 60 },\n { width: 88, height: 31 },\n { width: 300, height: 60 },\n { width: 300, height: 100 },\n { width: 320, height: 50 },\n { width: 468, height: 60 },\n { width: 300, height: 600 },\n { width: 160, height: 600 }\n ];\n const ciuSzsValue = companionSizes.map((size) => `fluid|${size.width}x${size.height}`).join(\",\");\n const currentLocation = typeof window !== \"undefined\" ? window.location : null;\n const topLocation = typeof window !== \"undefined\" && window.top ? window.top.location : currentLocation;\n const currentUrl = currentLocation?.href || \"\";\n const topUrl = topLocation?.href || currentUrl;\n const currentDomain = currentLocation?.hostname || \"\";\n let modifiedVastTagUrl = vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.set(\"ciu_szs\", ciuSzsValue);\n if (!url.searchParams.has(\"mpt\")) {\n url.searchParams.set(\"mpt\", \"h5_vsi\");\n }\n if (!url.searchParams.has(\"ctv\")) {\n url.searchParams.set(\"ctv\", \"0\");\n }\n if (!url.searchParams.has(\"gdpr\")) {\n url.searchParams.set(\"gdpr\", \"0\");\n }\n if (!url.searchParams.has(\"top\") && topUrl) {\n url.searchParams.set(\"top\", topUrl);\n }\n if (!url.searchParams.has(\"loc\") && currentUrl) {\n url.searchParams.set(\"loc\", currentUrl);\n }\n if (!url.searchParams.has(\"cdm\") && currentDomain) {\n url.searchParams.set(\"cdm\", currentDomain);\n }\n if (!url.searchParams.has(\"eoidce\")) {\n url.searchParams.set(\"eoidce\", \"1\");\n }\n if (!url.searchParams.has(\"fbidx\")) {\n url.searchParams.set(\"fbidx\", \"0\");\n }\n modifiedVastTagUrl = url.toString();\n } catch (e) {\n let baseUrl = vastTagUrl;\n const paramsToRemove = [\"ciu_szs\", \"mpt\", \"ctv\", \"gdpr\", \"top\", \"loc\", \"cdm\", \"eoidce\", \"fbidx\"];\n paramsToRemove.forEach((param) => {\n if (baseUrl.includes(`${param}=`)) {\n baseUrl = baseUrl.replace(new RegExp(`[?&]${param}=[^&]*`, \"g\"), \"\");\n }\n });\n baseUrl = baseUrl.replace(/[?&]$/, \"\");\n const params = new URLSearchParams();\n params.set(\"ciu_szs\", ciuSzsValue);\n params.set(\"mpt\", \"h5_vsi\");\n params.set(\"ctv\", \"0\");\n params.set(\"gdpr\", \"0\");\n if (topUrl) params.set(\"top\", topUrl);\n if (currentUrl) params.set(\"loc\", currentUrl);\n if (currentDomain) params.set(\"cdm\", currentDomain);\n params.set(\"eoidce\", \"1\");\n params.set(\"fbidx\", \"0\");\n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n modifiedVastTagUrl = `${baseUrl}${separator}${params.toString()}`;\n }\n adsRequest.adTagUrl = modifiedVastTagUrl;\n const videoWidth = video.offsetWidth || video.clientWidth || 640;\n const videoHeight = video.offsetHeight || video.clientHeight || 480;\n adsRequest.linearAdSlotWidth = videoWidth;\n adsRequest.linearAdSlotHeight = videoHeight;\n adsRequest.nonLinearAdSlotWidth = videoWidth;\n adsRequest.nonLinearAdSlotHeight = videoHeight;\n if (typeof adsRequest.setCompanionSlots === \"function\") {\n try {\n const companionSlots = [];\n for (const size of companionSizes) {\n const slot = new google.ima.CompanionAdSlot();\n slot.width = size.width;\n slot.height = size.height;\n companionSlots.push(slot);\n }\n adsRequest.setCompanionSlots(companionSlots);\n } catch (error) {\n console.warn(\"[IMA] Failed to set companion slots:\", error);\n }\n }\n if (typeof adsRequest.setAdWillAutoPlay === \"function\") {\n try {\n const willAutoPlay = !video.paused || video.autoplay;\n adsRequest.setAdWillAutoPlay(willAutoPlay);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillAutoPlay:\", error);\n }\n }\n if (typeof adsRequest.setAdWillPlayMuted === \"function\") {\n try {\n const willPlayMuted = video.muted || video.volume === 0;\n adsRequest.setAdWillPlayMuted(willPlayMuted);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillPlayMuted:\", error);\n }\n }\n adsRequest.vastLoadTimeout = 1e4;\n adsLoader.requestAds(adsRequest);\n }\n function ensurePlaceholderContainer() {\n if (adContainerEl) {\n return;\n }\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n container.style.transition = \"opacity 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n function destroyAdsManager() {\n if (adsManager) {\n try {\n adsManager.destroy();\n } catch {\n }\n adsManager = void 0;\n }\n if (adVideoElement) {\n adVideoElement.style.opacity = \"0\";\n }\n }\n function destroyAdsLoader() {\n if (adsLoader) {\n try {\n adsLoader.destroy();\n } catch {\n }\n adsLoader = void 0;\n }\n }\n return {\n initialize() {\n ensureImaLoaded().then(() => {\n const google = window.google;\n ensurePlaceholderContainer();\n if (!adDisplayContainer && adContainerEl) {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n adDisplayContainer = new google.ima.AdDisplayContainer(\n adContainerEl,\n adVideoElement\n );\n try {\n adDisplayContainer.initialize?.();\n } catch {\n }\n }\n }).catch(() => {\n });\n },\n async requestAds(vastTagUrl) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n const error = new Error(\"VAST tag URL is empty or undefined\");\n return Promise.reject(error);\n }\n try {\n new URL(vastTagUrl);\n } catch (e) {\n const error = new Error(`Invalid VAST tag URL format: ${vastTagUrl}`);\n return Promise.reject(error);\n }\n if (adPlaying) {\n return Promise.reject(\n new Error(\"Ad already playing - cannot request new ads\")\n );\n }\n destroyAdsManager();\n destroyAdsLoader();\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n let currentReject;\n adsLoadedPromise = new Promise((resolve, reject) => {\n adsLoadedResolve = resolve;\n adsLoadedReject = reject;\n currentReject = reject;\n setTimeout(() => {\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad request timeout\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n }, 1e4);\n });\n try {\n await ensureImaLoaded();\n const google = window.google;\n lastAdTagUrl = vastTagUrl;\n if (!adDisplayContainer) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"transparent\";\n container.style.transition = \"opacity 0.3s ease-in-out, background-color 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n if (!video.parentElement) {\n throw new Error(\"Video element has no parent for ad container\");\n }\n video.parentElement.appendChild(container);\n adContainerEl = container;\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n adVideoElement\n );\n }\n const videoWidth = video.offsetWidth || video.clientWidth;\n const videoHeight = video.offsetHeight || video.clientHeight;\n if (!videoWidth || !videoHeight || videoWidth === 0 || videoHeight === 0) {\n const error = new Error(\n `Invalid video dimensions: ${videoWidth}x${videoHeight}. Cannot initialize ads.`\n );\n currentReject?.(error);\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n return Promise.reject(error);\n }\n if (!adsLoader) {\n const adsLoaderCls = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader = adsLoaderCls;\n adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (evt) => {\n try {\n const adsRenderingSettings = new google.ima.AdsRenderingSettings();\n adsRenderingSettings.enablePreloading = true;\n adsManager = evt.getAdsManager(video, adsRenderingSettings);\n const AdEvent = google.ima.AdEvent.Type;\n const AdErrorEvent = google.ima.AdErrorEvent.Type;\n adsManager.addEventListener(\n AdErrorEvent.AD_ERROR,\n (errorEvent) => {\n const error = errorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n let innerError;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : inner.message || String(inner);\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : error.cause.message || String(error.cause);\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : error.innerError.message || String(error.innerError);\n }\n } catch (e) {\n }\n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n destroyAdsManager();\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n emit(\"ad_error\", {\n code: errorCode,\n vastErrorCode,\n message: errorMessage,\n cause: innerError,\n isNoFill\n });\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n }\n );\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n }\n adPlaying = true;\n setAdPlayingFlag(true);\n const adVolume = originalMutedState ? 0 : originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = originalVolume;\n adVideoElement.muted = originalMutedState;\n }\n if (adsManager) {\n try {\n adsManager.setVolume(adVolume);\n } catch {\n }\n }\n emit(\"content_pause\");\n }\n );\n adsManager.addEventListener(AdEvent.STARTED, () => {\n setAdPlayingFlag(true);\n hideContentVideo();\n if (adVideoElement) {\n const adVolume = originalVolume;\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n if (adsManager) {\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {\n }\n }\n }\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n }\n });\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n showContentVideo();\n emit(\"content_resume\");\n }\n );\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n emit(\"all_ads_completed\");\n });\n if (adsLoadedResolve) {\n adsLoadedResolve();\n adsLoadedResolve = void 0;\n adsLoadedReject = void 0;\n }\n } catch (e) {\n console.error(\"[IMA] Error setting up ads manager:\", e);\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Failed to setup ads manager\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n emit(\"ad_error\");\n }\n },\n false\n );\n adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (adErrorEvent) => {\n const error = adErrorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n let innerError;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : inner.message || String(inner);\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : error.cause.message || String(error.cause);\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : error.innerError.message || String(error.innerError);\n }\n } catch (e) {\n }\n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (adsLoadedReject) {\n adsLoadedReject(new Error(isNoFill ? \"No ads available\" : \"Ads loader error\"));\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n }\n emit(\"ad_error\", {\n code: errorCode,\n vastErrorCode,\n message: errorMessage,\n isNoFill,\n cause: innerError\n });\n },\n false\n );\n }\n makeAdsRequest(google, vastTagUrl);\n return adsLoadedPromise;\n } catch (error) {\n console.error(\"[IMA] Failed to request ads:\", error);\n currentReject?.(error);\n adsLoadedReject = void 0;\n adsLoadedResolve = void 0;\n return Promise.reject(error);\n }\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n if (!adsManager) {\n return Promise.reject(new Error(\"No ads manager\"));\n }\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n adPlaying = true;\n const adVolume = originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n }\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {\n }\n adsManager.start();\n return Promise.resolve();\n } catch (error) {\n adPlaying = false;\n setAdPlayingFlag(false);\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {\n });\n }\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adsManager || !adPlaying) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n if (adsManager && typeof adsManager.pause === \"function\") {\n adsManager.pause();\n }\n } catch (error) {\n console.warn(\"[IMA] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adsManager || !adPlaying) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n if (adsManager && typeof adsManager.resume === \"function\") {\n adsManager.resume();\n }\n } catch (error) {\n console.warn(\"[IMA] Error resuming ad:\", error);\n }\n },\n async stop() {\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n showContentVideo();\n if (options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\"[IMA] Content video paused in live mode on stop, resuming playback\");\n video.play().catch(() => {\n });\n }\n } else if (video.paused) {\n video.play().catch(() => {\n });\n }\n try {\n adsManager?.stop?.();\n } catch {\n }\n destroyAdsManager();\n },\n destroy() {\n destroyAdsManager();\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"none\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n if (adContainerEl.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n adContainerEl = void 0;\n adVideoElement = void 0;\n }\n }, 500);\n }\n showContentVideo();\n try {\n adsLoader?.destroy?.();\n } catch {\n }\n adDisplayContainer = void 0;\n adsLoader = void 0;\n contentVideoHidden = false;\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n if (!adsManager || !window.google?.ima) {\n console.warn(\n \"[IMA] Cannot resize: No ads manager or IMA SDK available\"\n );\n return;\n }\n try {\n console.log(`[IMA] Resizing ads manager to ${width}x${height}`);\n adsManager.resize(width, height, window.google.ima.ViewMode.NORMAL);\n } catch (error) {\n console.warn(\"[IMA] Error resizing ads manager:\", error);\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 originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = clampedVolume;\n adVideoElement.muted = clampedVolume === 0;\n }\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(clampedVolume);\n } catch {\n }\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n if (adsManager && adPlaying) {\n try {\n return adsManager.getVolume();\n } catch (error) {\n console.warn(\"[IMA] Failed to get ad volume:\", error);\n return 1;\n }\n }\n return 1;\n },\n showPlaceholder() {\n ensurePlaceholderContainer();\n hideContentVideo();\n if (adContainerEl) {\n const wasHidden = adContainerEl.style.display === \"none\" || adContainerEl.style.opacity === \"0\";\n if (wasHidden) {\n adContainerEl.style.transition = \"none\";\n } else {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (adContainerEl) {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.backgroundColor = \"#000\";\n }\n }, 300);\n }\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createImaController\n});\n","import type { ImaController } from \"../types\";\nimport { supportsGoogleIMA } from \"../utils/browserCompat\";\n\ndeclare global {\n interface Window {\n google?: any;\n }\n}\n\nexport function createImaController(\n video: HTMLVideoElement,\n options?: { continueLiveStreamDuringAds?: boolean }\n): ImaController {\n let adPlaying = false;\n let contentVideoHidden = false;\n let originalMutedState = false;\n let originalVolume =\n typeof video.volume === \"number\" && !Number.isNaN(video.volume)\n ? Math.max(0, Math.min(1, video.volume))\n : 1;\n const listeners = new Map<string, Set<(payload?: any) => void>>();\n let adVideoElement: HTMLVideoElement | undefined;\n\n function setAdPlayingFlag(isPlaying: boolean): void {\n if (isPlaying) {\n video.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete video.dataset.stormcloudAdPlaying;\n }\n }\n\n function hideContentVideo(): void {\n if (!contentVideoHidden) {\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.style.opacity = \"0\";\n setTimeout(() => {\n video.style.visibility = \"hidden\";\n }, 300);\n video.muted = true;\n video.volume = 0;\n contentVideoHidden = true;\n }\n }\n\n function showContentVideo(): void {\n if (contentVideoHidden) {\n video.style.visibility = \"visible\";\n video.style.transition = \"opacity 0.3s ease-in-out\";\n video.offsetHeight;\n video.style.opacity = \"1\";\n video.muted = originalMutedState;\n video.volume = originalVolume;\n contentVideoHidden = false;\n }\n }\n\n function createAdVideoElement(): HTMLVideoElement {\n const adVideo = document.createElement(\"video\");\n adVideo.style.position = \"absolute\";\n adVideo.style.top = \"0\";\n adVideo.style.left = \"0\";\n adVideo.style.width = \"100%\";\n adVideo.style.height = \"100%\";\n adVideo.style.objectFit = \"contain\";\n adVideo.style.backgroundColor = \"transparent\";\n adVideo.style.zIndex = \"2\";\n adVideo.playsInline = true;\n\n adVideo.volume = originalVolume;\n adVideo.muted = originalMutedState;\n\n adVideo.style.opacity = \"0\";\n adVideo.addEventListener(\n \"canplay\",\n () => {\n adVideo.style.opacity = \"1\";\n },\n { once: true }\n );\n\n return adVideo;\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 {}\n }\n }\n\n function ensureImaLoaded(): Promise<void> {\n if (!supportsGoogleIMA()) {\n console.warn(\n \"[IMA] Google IMA SDK is not supported on this browser. Please use HLS ad player instead.\"\n );\n return Promise.reject(\n new Error(\"Google IMA SDK not supported on this browser\")\n );\n }\n\n try {\n const frameEl = window.frameElement as HTMLIFrameElement | null;\n const sandboxAttr = frameEl?.getAttribute?.(\"sandbox\") || \"\";\n if (sandboxAttr) {\n const tokens = new Set(\n sandboxAttr\n .split(/\\s+/)\n .map((t) => t.trim())\n .filter((t) => t.length > 0)\n );\n const allowsScripts = tokens.has(\"allow-scripts\");\n if (!allowsScripts) {\n // eslint-disable-next-line no-console\n console.error(\n \"StormcloudVideoPlayer: The host page is inside a sandboxed iframe without 'allow-scripts'. Google IMA cannot run ads within sandboxed frames. Remove the sandbox attribute or include 'allow-scripts allow-same-origin'.\"\n );\n }\n }\n } catch {}\n\n if (typeof window !== \"undefined\" && window.google?.ima)\n return Promise.resolve();\n const existing = document.querySelector(\n 'script[data-ima=\"true\"]'\n ) as HTMLScriptElement | null;\n if (existing) {\n if (window.google?.ima) {\n return Promise.resolve();\n }\n return new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n reject(new Error(\"IMA SDK load timeout\"));\n }, 10000);\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"IMA SDK load failed\"));\n });\n });\n }\n return new Promise((resolve, reject) => {\n const script = document.createElement(\"script\");\n script.src = \"https://imasdk.googleapis.com/js/sdkloader/ima3.js\";\n script.async = true;\n script.defer = true;\n script.setAttribute(\"data-ima\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"IMA SDK load failed\"));\n document.head.appendChild(script);\n });\n }\n\n let adsManager: any | undefined;\n let adsLoader: any | undefined;\n let adDisplayContainer: any | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let lastAdTagUrl: string | undefined;\n let adsLoadedPromise: Promise<void> | undefined;\n let adsLoadedResolve: (() => void) | undefined;\n let adsLoadedReject: ((error: Error) => void) | undefined;\n\n function makeAdsRequest(google: any, vastTagUrl: string) {\n const adsRequest = new google.ima.AdsRequest();\n \n const companionSizes = [\n { width: 728, height: 90 },\n { width: 300, height: 250 },\n { width: 180, height: 150 },\n { width: 120, height: 60 },\n { width: 88, height: 31 },\n { width: 300, height: 60 },\n { width: 300, height: 100 },\n { width: 320, height: 50 },\n { width: 468, height: 60 },\n { width: 300, height: 600 },\n { width: 160, height: 600 },\n ];\n\n const ciuSzsValue = companionSizes\n .map((size) => `fluid|${size.width}x${size.height}`)\n .join(\",\");\n\n const currentLocation = typeof window !== \"undefined\" ? window.location : null;\n const topLocation = typeof window !== \"undefined\" && window.top ? window.top.location : currentLocation;\n const currentUrl = currentLocation?.href || \"\";\n const topUrl = topLocation?.href || currentUrl;\n const currentDomain = currentLocation?.hostname || \"\";\n\n let modifiedVastTagUrl = vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n \n url.searchParams.set(\"ciu_szs\", ciuSzsValue);\n \n if (!url.searchParams.has(\"mpt\")) {\n url.searchParams.set(\"mpt\", \"h5_vsi\");\n }\n \n if (!url.searchParams.has(\"ctv\")) {\n url.searchParams.set(\"ctv\", \"0\");\n }\n \n if (!url.searchParams.has(\"gdpr\")) {\n url.searchParams.set(\"gdpr\", \"0\");\n }\n \n if (!url.searchParams.has(\"top\") && topUrl) {\n url.searchParams.set(\"top\", topUrl);\n }\n \n if (!url.searchParams.has(\"loc\") && currentUrl) {\n url.searchParams.set(\"loc\", currentUrl);\n }\n \n if (!url.searchParams.has(\"cdm\") && currentDomain) {\n url.searchParams.set(\"cdm\", currentDomain);\n }\n \n if (!url.searchParams.has(\"eoidce\")) {\n url.searchParams.set(\"eoidce\", \"1\");\n }\n \n if (!url.searchParams.has(\"fbidx\")) {\n url.searchParams.set(\"fbidx\", \"0\");\n }\n \n modifiedVastTagUrl = url.toString();\n } catch (e) {\n let baseUrl = vastTagUrl;\n \n const paramsToRemove = [\"ciu_szs\", \"mpt\", \"ctv\", \"gdpr\", \"top\", \"loc\", \"cdm\", \"eoidce\", \"fbidx\"];\n paramsToRemove.forEach((param) => {\n if (baseUrl.includes(`${param}=`)) {\n baseUrl = baseUrl.replace(new RegExp(`[?&]${param}=[^&]*`, \"g\"), \"\");\n }\n });\n baseUrl = baseUrl.replace(/[?&]$/, \"\");\n \n const params = new URLSearchParams();\n params.set(\"ciu_szs\", ciuSzsValue);\n params.set(\"mpt\", \"h5_vsi\");\n params.set(\"ctv\", \"0\");\n params.set(\"gdpr\", \"0\");\n if (topUrl) params.set(\"top\", topUrl);\n if (currentUrl) params.set(\"loc\", currentUrl);\n if (currentDomain) params.set(\"cdm\", currentDomain);\n params.set(\"eoidce\", \"1\");\n params.set(\"fbidx\", \"0\");\n \n const separator = baseUrl.includes(\"?\") ? \"&\" : \"?\";\n modifiedVastTagUrl = `${baseUrl}${separator}${params.toString()}`;\n }\n \n adsRequest.adTagUrl = modifiedVastTagUrl;\n\n const videoWidth = video.offsetWidth || video.clientWidth || 640;\n const videoHeight = video.offsetHeight || video.clientHeight || 480;\n\n adsRequest.linearAdSlotWidth = videoWidth;\n adsRequest.linearAdSlotHeight = videoHeight;\n adsRequest.nonLinearAdSlotWidth = videoWidth;\n adsRequest.nonLinearAdSlotHeight = videoHeight;\n\n if (typeof adsRequest.setCompanionSlots === \"function\") {\n try {\n const companionSlots: any[] = [];\n\n for (const size of companionSizes) {\n const slot = new google.ima.CompanionAdSlot();\n slot.width = size.width;\n slot.height = size.height;\n companionSlots.push(slot);\n }\n\n adsRequest.setCompanionSlots(companionSlots);\n } catch (error) {\n console.warn(\"[IMA] Failed to set companion slots:\", error);\n }\n }\n\n if (typeof adsRequest.setAdWillAutoPlay === \"function\") {\n try {\n const willAutoPlay = !video.paused || video.autoplay;\n adsRequest.setAdWillAutoPlay(willAutoPlay);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillAutoPlay:\", error);\n }\n }\n\n if (typeof adsRequest.setAdWillPlayMuted === \"function\") {\n try {\n const willPlayMuted = video.muted || video.volume === 0;\n adsRequest.setAdWillPlayMuted(willPlayMuted);\n } catch (error) {\n console.warn(\"[IMA] Failed to call setAdWillPlayMuted:\", error);\n }\n }\n\n adsRequest.vastLoadTimeout = 10000;\n\n adsLoader.requestAds(adsRequest);\n }\n\n function ensurePlaceholderContainer(): void {\n if (adContainerEl) {\n return;\n }\n\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n container.style.transition = \"opacity 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n function destroyAdsManager() {\n if (adsManager) {\n try {\n adsManager.destroy();\n } catch {}\n adsManager = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.style.opacity = \"0\";\n }\n }\n\n function destroyAdsLoader() {\n if (adsLoader) {\n try {\n adsLoader.destroy();\n } catch {}\n adsLoader = undefined;\n }\n }\n\n return {\n initialize() {\n ensureImaLoaded()\n .then(() => {\n const google = window.google;\n ensurePlaceholderContainer();\n\n if (!adDisplayContainer && adContainerEl) {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n adContainerEl,\n adVideoElement\n );\n try {\n adDisplayContainer.initialize?.();\n } catch {}\n }\n })\n .catch(() => {});\n },\n async requestAds(vastTagUrl: string) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n const error = new Error(\"VAST tag URL is empty or undefined\");\n return Promise.reject(error);\n }\n\n try {\n new URL(vastTagUrl);\n } catch (e) {\n const error = new Error(`Invalid VAST tag URL format: ${vastTagUrl}`);\n return Promise.reject(error);\n }\n\n if (adPlaying) {\n return Promise.reject(\n new Error(\"Ad already playing - cannot request new ads\")\n );\n }\n\n destroyAdsManager();\n destroyAdsLoader();\n\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n\n let currentReject: ((error: Error) => void) | undefined;\n adsLoadedPromise = new Promise<void>((resolve, reject) => {\n adsLoadedResolve = resolve;\n adsLoadedReject = reject;\n currentReject = reject;\n\n setTimeout(() => {\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad request timeout\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n }, 10000);\n });\n\n try {\n await ensureImaLoaded();\n const google = window.google;\n lastAdTagUrl = vastTagUrl;\n\n if (!adDisplayContainer) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"transparent\";\n container.style.transition =\n \"opacity 0.3s ease-in-out, background-color 0.3s ease-in-out\";\n container.style.opacity = \"0\";\n\n if (!video.parentElement) {\n throw new Error(\"Video element has no parent for ad container\");\n }\n\n video.parentElement.appendChild(container);\n adContainerEl = container;\n\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl.appendChild(adVideoElement);\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n adVideoElement\n );\n\n }\n\n const videoWidth = video.offsetWidth || video.clientWidth;\n const videoHeight = video.offsetHeight || video.clientHeight;\n\n if (\n !videoWidth ||\n !videoHeight ||\n videoWidth === 0 ||\n videoHeight === 0\n ) {\n const error = new Error(\n `Invalid video dimensions: ${videoWidth}x${videoHeight}. Cannot initialize ads.`\n );\n currentReject?.(error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n return Promise.reject(error);\n }\n\n if (!adsLoader) {\n const adsLoaderCls = new google.ima.AdsLoader(adDisplayContainer);\n adsLoader = adsLoaderCls;\n\n adsLoader.addEventListener(\n google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,\n (evt: any) => {\n try {\n const adsRenderingSettings =\n new google.ima.AdsRenderingSettings();\n adsRenderingSettings.enablePreloading = true;\n adsManager = evt.getAdsManager(video, adsRenderingSettings);\n const AdEvent = google.ima.AdEvent.Type;\n const AdErrorEvent = google.ima.AdErrorEvent.Type;\n\n adsManager.addEventListener(\n AdErrorEvent.AD_ERROR,\n (errorEvent: any) => {\n const error = errorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n \n let innerError: string | undefined;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : (inner.message || String(inner));\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : (error.cause.message || String(error.cause));\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : (error.innerError.message || String(error.innerError));\n }\n } catch (e) {\n }\n \n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n \n\n destroyAdsManager();\n\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n\n emit(\"ad_error\", { \n code: errorCode, \n vastErrorCode, \n message: errorMessage,\n cause: innerError,\n isNoFill \n });\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n video.play()?.catch(() => {});\n }\n }\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n }\n\n adPlaying = true;\n setAdPlayingFlag(true);\n \n const adVolume = originalMutedState ? 0 : originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = originalVolume;\n adVideoElement.muted = originalMutedState;\n }\n if (adsManager) {\n try {\n adsManager.setVolume(adVolume);\n } catch {}\n }\n \n emit(\"content_pause\");\n }\n );\n\n adsManager.addEventListener(AdEvent.STARTED, () => {\n setAdPlayingFlag(true);\n\n hideContentVideo();\n\n if (adVideoElement) {\n const adVolume = originalVolume;\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n \n if (adsManager) {\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {}\n }\n }\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n }\n });\n\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n \n showContentVideo();\n \n emit(\"content_resume\");\n }\n );\n\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n emit(\"all_ads_completed\");\n });\n\n if (adsLoadedResolve) {\n adsLoadedResolve();\n adsLoadedResolve = undefined;\n adsLoadedReject = undefined;\n }\n } catch (e) {\n console.error(\"[IMA] Error setting up ads manager:\", e);\n adPlaying = false;\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Failed to setup ads manager\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n }\n },\n false\n );\n\n adsLoader.addEventListener(\n google.ima.AdErrorEvent.Type.AD_ERROR,\n (adErrorEvent: any) => {\n const error = adErrorEvent.getError();\n const errorCode = error.getErrorCode?.() || \"unknown\";\n const vastErrorCode = error.getVastErrorCode?.() || \"N/A\";\n const errorMessage = error.getMessage?.() || \"Unknown error\";\n \n let innerError: string | undefined;\n try {\n if (typeof error.getInnerError === \"function\") {\n const inner = error.getInnerError();\n if (inner) {\n innerError = typeof inner === \"string\" ? inner : (inner.message || String(inner));\n }\n }\n if (!innerError && error.cause) {\n innerError = typeof error.cause === \"string\" ? error.cause : (error.cause.message || String(error.cause));\n }\n if (!innerError && error.innerError) {\n innerError = typeof error.innerError === \"string\" ? error.innerError : (error.innerError.message || String(error.innerError));\n }\n } catch (e) {\n }\n \n const isNoFill = errorCode === 303 || vastErrorCode === 303;\n\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(isNoFill ? \"No ads available\" : \"Ads loader error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\", { \n code: errorCode, \n vastErrorCode, \n message: errorMessage,\n isNoFill,\n cause: innerError\n });\n },\n false\n );\n }\n\n makeAdsRequest(google, vastTagUrl);\n return adsLoadedPromise;\n } catch (error) {\n console.error(\"[IMA] Failed to request ads:\", error);\n\n currentReject?.(error as Error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n return Promise.reject(error);\n }\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n\n if (!adsManager) {\n return Promise.reject(new Error(\"No ads manager\"));\n }\n\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 480;\n\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n\n adPlaying = true;\n\n const adVolume = originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n }\n\n try {\n adsManager.setVolume(originalMutedState ? 0 : adVolume);\n } catch {}\n\n adsManager.start();\n\n return Promise.resolve();\n } catch (error) {\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (!options?.continueLiveStreamDuringAds) {\n video.play()?.catch(() => {});\n }\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adsManager || !adPlaying) {\n return;\n }\n\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n\n if (adsManager && typeof adsManager.pause === \"function\") {\n adsManager.pause();\n }\n } catch (error) {\n console.warn(\"[IMA] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adsManager || !adPlaying) {\n return;\n }\n\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {});\n }\n\n if (adsManager && typeof adsManager.resume === \"function\") {\n adsManager.resume();\n }\n } catch (error) {\n console.warn(\"[IMA] Error resuming ad:\", error);\n }\n },\n async stop() {\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\"[IMA] Content video paused in live mode on stop, resuming playback\");\n video.play().catch(() => {});\n }\n } else if (video.paused) {\n video.play().catch(() => {});\n }\n\n try {\n adsManager?.stop?.();\n } catch {}\n\n destroyAdsManager();\n },\n destroy() {\n destroyAdsManager();\n\n adPlaying = false;\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"none\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n\n if (adContainerEl.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n\n adContainerEl = undefined;\n adVideoElement = undefined;\n }\n }, 500);\n }\n\n showContentVideo();\n\n try {\n adsLoader?.destroy?.();\n } catch {}\n\n adDisplayContainer = undefined;\n adsLoader = undefined;\n contentVideoHidden = false;\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width: number, height: number) {\n if (!adsManager || !window.google?.ima) {\n console.warn(\n \"[IMA] Cannot resize: No ads manager or IMA SDK available\"\n );\n return;\n }\n\n try {\n console.log(`[IMA] Resizing ads manager to ${width}x${height}`);\n adsManager.resize(width, height, window.google.ima.ViewMode.NORMAL);\n } catch (error) {\n console.warn(\"[IMA] Error resizing ads manager:\", error);\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 off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\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 originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume: number) {\n const clampedVolume = Math.max(0, Math.min(1, volume));\n\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = clampedVolume;\n adVideoElement.muted = clampedVolume === 0;\n }\n\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(clampedVolume);\n } catch {}\n }\n },\n getAdVolume(): number {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n\n if (adsManager && adPlaying) {\n try {\n return adsManager.getVolume();\n } catch (error) {\n console.warn(\"[IMA] Failed to get ad volume:\", error);\n return 1;\n }\n }\n return 1;\n },\n showPlaceholder() {\n ensurePlaceholderContainer();\n \n hideContentVideo();\n \n if (adContainerEl) {\n const wasHidden = adContainerEl.style.display === \"none\" || adContainerEl.style.opacity === \"0\";\n if (wasHidden) {\n adContainerEl.style.transition = \"none\";\n } else {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n adContainerEl.style.backgroundColor = \"#000\";\n adContainerEl.style.display = \"flex\";\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n if (wasHidden) {\n requestAnimationFrame(() => {\n if (adContainerEl) {\n adContainerEl.style.transition = \"opacity 0.3s ease-in-out\";\n }\n });\n }\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.backgroundColor = \"#000\";\n }\n }, 300);\n }\n },\n };\n}\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsIMA: boolean;\n supportsModernJS: boolean;\n recommendedAdPlayer: 'ima' | 'hls';\n webOSVersion?: number | undefined;\n tizenVersion?: number | undefined;\n chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS = true;\n let recommendedAdPlayer: 'ima' | 'hls' = 'ima';\n let webOSVersion: number | undefined;\n let tizenVersion: number | undefined;\n let chromeVersionNum: number | undefined;\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n \n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n \n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n \n if (match && match[1]) {\n version = match[1];\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = '6.0';\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = '5.0';\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = '4.0';\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = '3.0';\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = '2.0';\n majorVersion = 2;\n }\n } else {\n version = 'Unknown';\n webOSVersion = undefined;\n }\n\n if (webOSVersion !== undefined && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (webOSVersion !== undefined && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n \n if (tizenVersion !== undefined && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (tizenVersion !== undefined && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n recommendedAdPlayer = 'hls';\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum,\n };\n}\n\nexport function supportsGoogleIMA(): boolean {\n const browser = detectBrowser();\n\n if (browser.isLegacyTV) {\n return false;\n }\n\n if (typeof document === 'undefined' ||\n typeof document.createElement !== 'function') {\n return false;\n }\n\n try {\n const video = document.createElement('video');\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n\n if (typeof Promise === 'undefined') {\n return false;\n }\n\n return browser.supportsIMA;\n}\n\nexport function getRecommendedAdPlayer(): 'ima' | 'hls' {\n const browser = detectBrowser();\n return browser.recommendedAdPlayer;\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n const imaSupport = supportsGoogleIMA();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsIMA: imaSupport,\n supportsModernJS: browser.supportsModernJS,\n recommendedAdPlayer: browser.recommendedAdPlayer,\n ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n adPlayerType?: 'ima' | 'hls';\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { adPlayerType?: 'ima' | 'hls'; allowNativeHls?: boolean } = {};\n\n if (browser.isLegacyTV || !browser.supportsIMA) {\n overrides.adPlayerType = 'hls';\n }\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n\n return overrides;\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'ima':\n return supportsGoogleIMA();\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n\n"]}
|
package/lib/sdk/ima.d.cts
CHANGED