stormcloud-video-player 0.7.50 → 0.8.0
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/README.md +269 -228
- package/dist/stormcloud-vp.min.js +1 -1
- package/lib/index.cjs +5197 -6747
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +196 -195
- package/lib/index.d.ts +196 -195
- package/lib/index.js +5321 -6863
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +4802 -3170
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +113 -70
- package/lib/players/FilePlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.cjs +4810 -3179
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +4877 -3246
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +1021 -0
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -0
- package/lib/sdk/hlsAdPlayer.d.cts +10 -0
- package/lib/sdk/pal.cjs +358 -0
- package/lib/sdk/pal.cjs.map +1 -0
- package/lib/sdk/pal.d.cts +28 -0
- package/lib/{types-CIHDHY7A.d.cts → types-DDwAfBLt.d.cts} +11 -10
- package/lib/ui/StormcloudVideoPlayer.cjs +5070 -6609
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -14
- package/lib/utils/browserCompat.cjs +10 -114
- package/lib/utils/browserCompat.cjs.map +1 -1
- package/lib/utils/browserCompat.d.cts +3 -7
- package/lib/utils/polyfills.cjs.map +1 -1
- package/lib/utils/tracking.cjs +179 -150
- package/lib/utils/tracking.cjs.map +1 -1
- package/lib/utils/tracking.d.cts +11 -6
- package/package.json +1 -2
- package/lib/sdk/adstormPlayer.cjs +0 -1567
- package/lib/sdk/adstormPlayer.cjs.map +0 -1
- package/lib/sdk/adstormPlayer.d.cts +0 -23
- package/lib/sdk/vastParser.cjs +0 -517
- package/lib/sdk/vastParser.cjs.map +0 -1
- package/lib/sdk/vastParser.d.cts +0 -45
- package/lib/ui/OverlayRenderer.cjs +0 -2376
- package/lib/ui/OverlayRenderer.cjs.map +0 -1
- package/lib/ui/OverlayRenderer.d.cts +0 -17
- package/lib/utils/adcision.cjs +0 -282
- package/lib/utils/adcision.cjs.map +0 -1
- package/lib/utils/adcision.d.cts +0 -31
- package/lib/utils/overlays.cjs +0 -354
- package/lib/utils/overlays.cjs.map +0 -1
- package/lib/utils/overlays.d.cts +0 -70
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/hlsAdPlayer.cjs","../../src/sdk/hlsAdPlayer.ts"],"names":["__create","Object","__defProp","create","defineProperty","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","from","to","except","desc","key","call","__getOwnPropDesc","hlsAdPlayer_exports","createHlsAdPlayer","mainHlsInstance","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","module","exports","import_hls","require","contentVideo","options","originalMutedState","originalVolume","Math","max","min","volume","listeners","Map","licenseKey","adVideoElement","adHls","currentAd","sessionId","preloadedAds","preloadingAds","destroyed","pendingTimeouts","trackingFired","impression","start","firstQuartile","midpoint","thirdQuartile","complete","emit","event","payload","set","Array","fn","error","console","warn","generateSessionId","Date","now","random","toString","substr","src","fireTrackingPixels","urls","length","forEach","url","trackingUrl","includes","img","Image","log","currentLevel","bitrate","level","levels","autoLevel","loadLevel","width","height","selectBestMediaFile","mediaFiles","firstFile","bitrateDiff","isHlsMediaFile","Error","mainQuality","getMainStreamQuality","scoredFiles","map","file","heightDiff","abs","resolutionDiff","widthDiff","fileBitrate","score","sort","a","b","bestMatch","resolution","mediaFile","type","toLowerCase","isProgressiveMediaFile","startsWith","endsWith","parseVastXml","xmlString","xmlDoc","parser","DOMParser","parseFromString","parserError","querySelector","textContent","adElement","adId","getAttribute","title","isNoAdAvailable","durationText","durationParts","split","duration","parseInt","mediaFileElements","querySelectorAll","mf","index","trim","bitrateAttr","bitrateValue","push","trackingUrls","mute","unmute","pause","el","resume","fullscreen","exitFullscreen","skip","eventKey","clickThrough","response","vastXml","fetch","vastTagUrl","credentials","headers","referrerPolicy","ok","style","left","progress","statusText","text","substring","createAdVideoElement","video","document","createElement","position","top","backgroundColor","playsInline","muted","setupAdEventListeners","addEventListener","currentTime"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/hlsAdPlayer.ts\nvar hlsAdPlayer_exports = {};\n__export(hlsAdPlayer_exports, {\n createHlsAdPlayer: () => createHlsAdPlayer\n});\nmodule.exports = __toCommonJS(hlsAdPlayer_exports);\nvar import_hls = __toESM(require(\"hls.js\"), 1);\nfunction createHlsAdPlayer(contentVideo, options) {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = /* @__PURE__ */ new Map();\n const licenseKey = options?.licenseKey;\n const mainHlsInstance = options?.mainHlsInstance;\n let adVideoElement;\n let adHls;\n let adContainerEl;\n let currentAd;\n let sessionId;\n const preloadedAds = /* @__PURE__ */ new Map();\n const preloadingAds = /* @__PURE__ */ new Map();\n let destroyed = false;\n let pendingTimeouts = [];\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n function emit(event, payload) {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n function generateSessionId() {\n return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n function fireTrackingPixels(urls) {\n if (!urls || urls.length === 0) return;\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n if (sessionId) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}session_id=${sessionId}`;\n }\n if (licenseKey) {\n trackingUrl = `${trackingUrl}${trackingUrl.includes(\"?\") ? \"&\" : \"?\"}license_key=${licenseKey}`;\n }\n const img = new Image(1, 1);\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n function getMainStreamQuality() {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level2 = mainHlsInstance.levels[autoLevel];\n return {\n width: level2.width || 1920,\n height: level2.height || 1080,\n bitrate: level2.bitrate || 5e6\n };\n }\n return null;\n }\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5e6\n };\n }\n function selectBestMediaFile(mediaFiles) {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n const fileBitrate = (file.bitrate || 5e3) * 1e3;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n const score = resolutionDiff * 2 + bitrateDiff / 1e3;\n return { file, score, resolutionDiff, bitrateDiff };\n });\n scoredFiles.sort((a, b) => a.score - b.score);\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff\n });\n return bestMatch.file;\n }\n function isHlsMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type === \"application/x-mpegurl\" || type === \"application/vnd.apple.mpegurl\" || type.includes(\"mpegurl\") || url.includes(\".m3u8\");\n }\n function isProgressiveMediaFile(mediaFile) {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return type.startsWith(\"video/\") || url.endsWith(\".mp4\") || url.includes(\".mp4?\");\n }\n function parseVastXml(xmlString) {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return null;\n }\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return null;\n }\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n const isNoAdAvailable = adId === \"empty\" || title.toLowerCase().includes(\"no ad available\") || title.toLowerCase() === \"no ad available\";\n const durationText = xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration = parseInt(durationParts[0] || \"0\", 10) * 3600 + parseInt(durationParts[1] || \"0\", 10) * 60 + parseInt(durationParts[2] || \"0\", 10);\n const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles = [];\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n const mediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: void 0\n };\n if (!url) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n return;\n }\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr ? parseInt(bitrateAttr, 10) : void 0;\n mediaFile.bitrate = bitrateValue && bitrateValue > 0 ? bitrateValue : void 0;\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n }\n return null;\n }\n const trackingUrls = {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: []\n };\n xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n xmlDoc.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n const clickThrough = xmlDoc.querySelector(\"ClickThrough\")?.textContent?.trim();\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return null;\n }\n }\n async function fetchAndParseVastAd(vastTagUrl) {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\"\n },\n referrerPolicy: \"no-referrer-when-downgrade\"\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n const vastXml = await response.text();\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2e3)\n );\n return parseVastXml(vastXml);\n }\n function createAdVideoElement() {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n video.volume = 1;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n return video;\n }\n function setupAdEventListeners() {\n if (!adVideoElement || !currentAd) return;\n adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!currentAd || !adVideoElement) return;\n const progress = adVideoElement.currentTime / currentAd.duration;\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n });\n adVideoElement.addEventListener(\"playing\", () => {\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n });\n adVideoElement.addEventListener(\"ended\", () => {\n if (!currentAd || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n handleAdComplete();\n });\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\n }\n handleAdError();\n });\n adVideoElement.addEventListener(\"volumechange\", () => {\n if (!currentAd) return;\n if (adVideoElement.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n });\n adVideoElement.addEventListener(\"pause\", () => {\n if (currentAd && !adVideoElement.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n });\n adVideoElement.addEventListener(\"play\", () => {\n if (currentAd && adVideoElement.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n });\n }\n function setAdPlayingFlag(isPlaying) {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n function handleAdComplete() {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n contentVideo.volume = 0;\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch(() => {\n });\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n emit(\"content_resume\");\n }\n function handleAdError() {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = true;\n contentVideo.volume = 0;\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n emit(\"ad_error\");\n }\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n },\n async requestAds(vastTagUrl) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n try {\n sessionId = generateSessionId();\n let ad;\n if (preloadedAds.has(vastTagUrl)) {\n ad = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ad = await fetchAndParseVastAd(vastTagUrl);\n }\n if (!ad) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n currentAd = ad;\n console.log(\n `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n );\n fireTrackingPixels(ad.trackingUrls.impression);\n trackingFired.impression = true;\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n setupAdEventListeners();\n }\n trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false\n };\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n contentVideo.volume = 0;\n adPlaying = true;\n setAdPlayingFlag(true);\n if (adVideoElement) {\n const adVolume = originalMutedState ? 0 : originalVolume;\n adVideoElement.volume = Math.max(0, Math.min(1, adVolume));\n adVideoElement.muted = false;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n emit(\"content_pause\");\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad from: ${mediaFile.url}`\n );\n if (isHlsAd && import_hls.default.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n adHls = new import_hls.default({\n enableWorker: true,\n lowLatencyMode: false\n });\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n adHls.on(import_hls.default.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\n });\n adHls.on(import_hls.default.Events.ERROR, (event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (isHlsAd && adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")) {\n adVideoElement.src = mediaFile.url;\n adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n handleAdError();\n });\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {\n });\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}`\n );\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch(() => {\n });\n }\n }\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n currentAd = void 0;\n },\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n if (adHls) {\n adHls.destroy();\n adHls = void 0;\n }\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = void 0;\n }\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n adContainerEl = void 0;\n currentAd = void 0;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n isAdPlaying() {\n return adPlaying;\n },\n resize(width, height) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n on(event, listener) {\n if (!listeners.has(event)) listeners.set(event, /* @__PURE__ */ new Set());\n listeners.get(event).add(listener);\n },\n off(event, listener) {\n listeners.get(event)?.delete(listener);\n },\n updateOriginalMutedState(muted, volume) {\n const nextVolume = typeof volume === \"number\" && !Number.isNaN(volume) ? Math.max(0, Math.min(1, volume)) : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n setAdVolume(volume) {\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = Math.max(0, Math.min(1, volume));\n }\n },\n getAdVolume() {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createHlsAdPlayer\n});\n","import type { AdController } from \"../types\";\nimport Hls from \"hls.js\";\n\ninterface VastMediaFile {\n url: string;\n type: string;\n width: number;\n height: number;\n bitrate?: number | undefined;\n}\n\ninterface VastTrackingUrls {\n impression: string[];\n start: string[];\n firstQuartile: string[];\n midpoint: string[];\n thirdQuartile: string[];\n complete: string[];\n mute: string[];\n unmute: string[];\n pause: string[];\n resume: string[];\n fullscreen: string[];\n exitFullscreen: string[];\n skip: string[];\n error: string[];\n}\n\ninterface VastAd {\n id: string;\n title: string;\n duration: number;\n mediaFiles: VastMediaFile[];\n trackingUrls: VastTrackingUrls;\n clickThrough?: string | undefined;\n}\n\nexport function createHlsAdPlayer(\n contentVideo: HTMLVideoElement,\n options?: {\n continueLiveStreamDuringAds?: boolean;\n licenseKey?: string;\n mainHlsInstance?: Hls;\n }\n): AdController {\n let adPlaying = false;\n let originalMutedState = false;\n let originalVolume = Math.max(0, Math.min(1, contentVideo.volume || 1));\n const listeners = new Map<string, Set<(payload?: any) => void>>();\n const licenseKey = options?.licenseKey;\n const mainHlsInstance = options?.mainHlsInstance;\n\n let adVideoElement: HTMLVideoElement | undefined;\n let adHls: Hls | undefined;\n let adContainerEl: HTMLDivElement | undefined;\n let currentAd: VastAd | undefined;\n let sessionId: string | undefined;\n const preloadedAds = new Map<string, VastAd>();\n const preloadingAds = new Map<string, Promise<void>>();\n let destroyed = false;\n let pendingTimeouts: number[] = [];\n\n let trackingFired = {\n impression: false,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n\n function emit(event: string, payload?: any): void {\n const set = listeners.get(event);\n if (!set) return;\n for (const fn of Array.from(set)) {\n try {\n fn(payload);\n } catch (error) {\n console.warn(\n `[HlsAdPlayer] Error in event listener for ${event}:`,\n error\n );\n }\n }\n }\n\n function generateSessionId(): string {\n return `session-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;\n }\n\n function fireTrackingPixels(urls: string[]): void {\n if (!urls || urls.length === 0) return;\n\n urls.forEach((url) => {\n try {\n let trackingUrl = url;\n\n if (sessionId) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }session_id=${sessionId}`;\n }\n\n if (licenseKey) {\n trackingUrl = `${trackingUrl}${\n trackingUrl.includes(\"?\") ? \"&\" : \"?\"\n }license_key=${licenseKey}`;\n }\n\n const img = new Image(1, 1);\n img.src = trackingUrl;\n console.log(`[HlsAdPlayer] Fired tracking pixel: ${trackingUrl}`);\n } catch (error) {\n console.warn(`[HlsAdPlayer] Error firing tracking pixel:`, error);\n }\n });\n }\n\n function getMainStreamQuality(): {\n width: number;\n height: number;\n bitrate: number;\n } | null {\n if (!mainHlsInstance || !mainHlsInstance.levels) {\n return null;\n }\n\n const currentLevel = mainHlsInstance.currentLevel;\n if (currentLevel === -1 || !mainHlsInstance.levels[currentLevel]) {\n const autoLevel = mainHlsInstance.loadLevel;\n if (autoLevel !== -1 && mainHlsInstance.levels[autoLevel]) {\n const level = mainHlsInstance.levels[autoLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5000000,\n };\n }\n return null;\n }\n\n const level = mainHlsInstance.levels[currentLevel];\n return {\n width: level.width || 1920,\n height: level.height || 1080,\n bitrate: level.bitrate || 5000000,\n };\n }\n\n function selectBestMediaFile(mediaFiles: VastMediaFile[]): VastMediaFile {\n if (mediaFiles.length === 0) {\n throw new Error(\"No media files available\");\n }\n\n const firstFile = mediaFiles[0];\n if (!firstFile) {\n throw new Error(\"No media files available\");\n }\n\n if (mediaFiles.length === 1) {\n return firstFile;\n }\n\n const mainQuality = getMainStreamQuality();\n if (!mainQuality) {\n console.log(\n \"[HlsAdPlayer] No main stream quality info, using first media file\"\n );\n return firstFile;\n }\n\n console.log(\"[HlsAdPlayer] Main stream quality:\", mainQuality);\n\n const scoredFiles = mediaFiles.map((file) => {\n const widthDiff = Math.abs(file.width - mainQuality.width);\n const heightDiff = Math.abs(file.height - mainQuality.height);\n const resolutionDiff = widthDiff + heightDiff;\n\n const fileBitrate = (file.bitrate || 5000) * 1000;\n const bitrateDiff = Math.abs(fileBitrate - mainQuality.bitrate);\n\n const score = resolutionDiff * 2 + bitrateDiff / 1000;\n\n return { file, score, resolutionDiff, bitrateDiff };\n });\n\n scoredFiles.sort((a, b) => a.score - b.score);\n\n const bestMatch = scoredFiles[0];\n if (!bestMatch) {\n console.log(\"[HlsAdPlayer] No best match found, using first media file\");\n return firstFile;\n }\n\n console.log(\"[HlsAdPlayer] Selected media file:\", {\n url: bestMatch.file.url,\n resolution: `${bestMatch.file.width}x${bestMatch.file.height}`,\n bitrate: bestMatch.file.bitrate,\n score: bestMatch.score,\n resolutionDiff: bestMatch.resolutionDiff,\n bitrateDiff: bestMatch.bitrateDiff,\n });\n\n return bestMatch.file;\n }\n\n function isHlsMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return (\n type === \"application/x-mpegurl\" ||\n type === \"application/vnd.apple.mpegurl\" ||\n type.includes(\"mpegurl\") ||\n url.includes(\".m3u8\")\n );\n }\n\n function isProgressiveMediaFile(mediaFile: VastMediaFile): boolean {\n const type = mediaFile.type.toLowerCase();\n const url = mediaFile.url.toLowerCase();\n return (\n type.startsWith(\"video/\") ||\n url.endsWith(\".mp4\") ||\n url.includes(\".mp4?\")\n );\n }\n\n function parseVastXml(xmlString: string): VastAd | null {\n try {\n const parser = new DOMParser();\n const xmlDoc = parser.parseFromString(xmlString, \"text/xml\");\n\n const parserError = xmlDoc.querySelector(\"parsererror\");\n if (parserError) {\n console.error(\n \"[HlsAdPlayer] XML parsing error (malformed VAST XML):\",\n parserError.textContent\n );\n return null;\n }\n\n const adElement = xmlDoc.querySelector(\"Ad\");\n if (!adElement) {\n console.warn(\"[HlsAdPlayer] No Ad element found in VAST XML\");\n return null;\n }\n\n const adId = adElement.getAttribute(\"id\") || \"unknown\";\n const title = xmlDoc.querySelector(\"AdTitle\")?.textContent || \"Ad\";\n\n const isNoAdAvailable =\n adId === \"empty\" ||\n title.toLowerCase().includes(\"no ad available\") ||\n title.toLowerCase() === \"no ad available\";\n\n const durationText =\n xmlDoc.querySelector(\"Duration\")?.textContent || \"00:00:30\";\n const durationParts = durationText.split(\":\");\n const duration =\n parseInt(durationParts[0] || \"0\", 10) * 3600 +\n parseInt(durationParts[1] || \"0\", 10) * 60 +\n parseInt(durationParts[2] || \"0\", 10);\n\n const mediaFileElements = xmlDoc.querySelectorAll(\"MediaFile\");\n const mediaFiles: VastMediaFile[] = [];\n\n console.log(\n `[HlsAdPlayer] Found ${mediaFileElements.length} MediaFile element(s) in VAST XML`\n );\n\n mediaFileElements.forEach((mf, index) => {\n const type = mf.getAttribute(\"type\") || \"\";\n const url = mf.textContent?.trim() || \"\";\n const width = mf.getAttribute(\"width\") || \"\";\n const height = mf.getAttribute(\"height\") || \"\";\n\n console.log(\n `[HlsAdPlayer] MediaFile ${index}: type=\"${type}\", url=\"${url}\", width=\"${width}\", height=\"${height}\"`\n );\n\n const mediaFile: VastMediaFile = {\n url,\n type,\n width: parseInt(width || \"1920\", 10),\n height: parseInt(height || \"1080\", 10),\n bitrate: undefined,\n };\n\n if (!url) {\n console.warn(`[HlsAdPlayer] MediaFile ${index} has empty URL`);\n return;\n }\n\n const bitrateAttr = mf.getAttribute(\"bitrate\");\n const bitrateValue = bitrateAttr\n ? parseInt(bitrateAttr, 10)\n : undefined;\n mediaFile.bitrate =\n bitrateValue && bitrateValue > 0 ? bitrateValue : undefined;\n\n if (isHlsMediaFile(mediaFile) || isProgressiveMediaFile(mediaFile)) {\n mediaFiles.push(mediaFile);\n console.log(\n `[HlsAdPlayer] Added ${isHlsMediaFile(mediaFile) ? \"HLS\" : \"progressive\"} MediaFile: ${url}`\n );\n } else {\n console.log(\n `[HlsAdPlayer] MediaFile ${index} ignored (type=\"${type}\" is not supported)`\n );\n }\n });\n\n if (mediaFiles.length === 0) {\n if (isNoAdAvailable) {\n console.warn(\n \"[HlsAdPlayer] No ads available (VAST response indicates no ads)\"\n );\n } else {\n console.warn(\"[HlsAdPlayer] No supported media files found in VAST XML\");\n }\n return null;\n }\n\n const trackingUrls: VastTrackingUrls = {\n impression: [],\n start: [],\n firstQuartile: [],\n midpoint: [],\n thirdQuartile: [],\n complete: [],\n mute: [],\n unmute: [],\n pause: [],\n resume: [],\n fullscreen: [],\n exitFullscreen: [],\n skip: [],\n error: [],\n };\n\n xmlDoc.querySelectorAll(\"Impression\").forEach((el) => {\n const url = el.textContent?.trim();\n if (url) trackingUrls.impression.push(url);\n });\n\n xmlDoc.querySelectorAll(\"Tracking\").forEach((el) => {\n const event = el.getAttribute(\"event\");\n const url = el.textContent?.trim();\n if (event && url) {\n const eventKey = event as keyof VastTrackingUrls;\n if (trackingUrls[eventKey]) {\n trackingUrls[eventKey].push(url);\n }\n }\n });\n\n const clickThrough = xmlDoc\n .querySelector(\"ClickThrough\")\n ?.textContent?.trim();\n\n return {\n id: adId,\n title,\n duration,\n mediaFiles,\n trackingUrls,\n clickThrough,\n };\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error parsing VAST XML:\", error);\n return null;\n }\n }\n\n async function fetchAndParseVastAd(\n vastTagUrl: string\n ): Promise<VastAd | null> {\n const response = await fetch(vastTagUrl, {\n mode: \"cors\",\n credentials: \"include\",\n headers: {\n \"Accept\": \"application/xml, text/xml, */*\",\n },\n referrerPolicy: \"no-referrer-when-downgrade\",\n });\n if (!response.ok) {\n throw new Error(`Failed to fetch VAST: ${response.statusText}`);\n }\n\n const vastXml = await response.text();\n console.log(\"[HlsAdPlayer] VAST XML received\");\n console.log(\n \"[HlsAdPlayer] VAST XML content (first 2000 chars):\",\n vastXml.substring(0, 2000)\n );\n\n return parseVastXml(vastXml);\n }\n\n function createAdVideoElement(): HTMLVideoElement {\n const video = document.createElement(\"video\");\n video.style.position = \"absolute\";\n video.style.left = \"0\";\n video.style.top = \"0\";\n video.style.width = \"100%\";\n video.style.height = \"100%\";\n video.style.objectFit = \"contain\";\n video.style.backgroundColor = \"#000\";\n video.playsInline = true;\n video.muted = false;\n\n video.volume = 1.0;\n console.log(\n `[HlsAdPlayer] Created ad video element with volume ${video.volume}`\n );\n\n return video;\n }\n\n function setupAdEventListeners(): void {\n if (!adVideoElement || !currentAd) return;\n\n adVideoElement.addEventListener(\"timeupdate\", () => {\n if (!currentAd || !adVideoElement) return;\n\n const progress = adVideoElement.currentTime / currentAd.duration;\n\n if (progress >= 0.25 && !trackingFired.firstQuartile) {\n trackingFired.firstQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.firstQuartile);\n }\n\n if (progress >= 0.5 && !trackingFired.midpoint) {\n trackingFired.midpoint = true;\n fireTrackingPixels(currentAd.trackingUrls.midpoint);\n }\n\n if (progress >= 0.75 && !trackingFired.thirdQuartile) {\n trackingFired.thirdQuartile = true;\n fireTrackingPixels(currentAd.trackingUrls.thirdQuartile);\n }\n });\n\n adVideoElement.addEventListener(\"playing\", () => {\n if (!currentAd || trackingFired.start) return;\n trackingFired.start = true;\n fireTrackingPixels(currentAd.trackingUrls.start);\n console.log(\"[HlsAdPlayer] Ad started playing\");\n });\n\n adVideoElement.addEventListener(\"ended\", () => {\n if (!currentAd || trackingFired.complete) return;\n trackingFired.complete = true;\n fireTrackingPixels(currentAd.trackingUrls.complete);\n console.log(\"[HlsAdPlayer] Ad completed\");\n\n handleAdComplete();\n });\n\n adVideoElement.addEventListener(\"error\", (e) => {\n console.error(\"[HlsAdPlayer] Ad video error:\", e);\n if (currentAd) {\n fireTrackingPixels(currentAd.trackingUrls.error);\n }\n handleAdError();\n });\n\n adVideoElement.addEventListener(\"volumechange\", () => {\n if (!currentAd) return;\n if (adVideoElement!.muted) {\n fireTrackingPixels(currentAd.trackingUrls.mute);\n } else {\n fireTrackingPixels(currentAd.trackingUrls.unmute);\n }\n });\n\n adVideoElement.addEventListener(\"pause\", () => {\n if (currentAd && !adVideoElement!.ended) {\n fireTrackingPixels(currentAd.trackingUrls.pause);\n }\n });\n\n adVideoElement.addEventListener(\"play\", () => {\n if (currentAd && adVideoElement!.currentTime > 0) {\n fireTrackingPixels(currentAd.trackingUrls.resume);\n }\n });\n }\n\n function setAdPlayingFlag(isPlaying: boolean): void {\n if (isPlaying) {\n contentVideo.dataset.stormcloudAdPlaying = \"true\";\n } else {\n delete contentVideo.dataset.stormcloudAdPlaying;\n }\n }\n\n function handleAdComplete(): void {\n console.log(\"[HlsAdPlayer] Handling ad completion\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n contentVideo.volume = 0;\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n \n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback\");\n contentVideo.play().catch(() => {});\n } else {\n console.log(\"[HlsAdPlayer] Content video already playing in live mode\");\n }\n }\n\n emit(\"content_resume\");\n }\n\n function handleAdError(): void {\n console.log(\"[HlsAdPlayer] Handling ad error\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n contentVideo.muted = true;\n contentVideo.volume = 0;\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n\n emit(\"ad_error\");\n }\n\n return {\n initialize() {\n console.log(\"[HlsAdPlayer] Initializing\");\n\n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"30\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n },\n\n async requestAds(vastTagUrl: string) {\n console.log(\"[HlsAdPlayer] Requesting ads:\", vastTagUrl);\n\n if (adPlaying) {\n console.warn(\n \"[HlsAdPlayer] Cannot request new ads while an ad is playing\"\n );\n return Promise.reject(new Error(\"Ad already playing\"));\n }\n\n try {\n sessionId = generateSessionId();\n let ad: VastAd | null | undefined;\n\n if (preloadedAds.has(vastTagUrl)) {\n ad = preloadedAds.get(vastTagUrl);\n preloadedAds.delete(vastTagUrl);\n console.log(\n \"[HlsAdPlayer] Using preloaded VAST response:\",\n vastTagUrl\n );\n } else {\n ad = await fetchAndParseVastAd(vastTagUrl);\n }\n\n if (!ad) {\n console.warn(\"[HlsAdPlayer] No ads available from VAST response\");\n emit(\"ad_error\");\n return Promise.reject(new Error(\"No ads available from VAST response\"));\n }\n\n currentAd = ad;\n console.log(\n `[HlsAdPlayer] Ad parsed: ${ad.title}, duration: ${ad.duration}s`\n );\n\n fireTrackingPixels(ad.trackingUrls.impression);\n trackingFired.impression = true;\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error requesting ads:\", error);\n emit(\"ad_error\");\n return Promise.reject(error);\n }\n },\n async play() {\n if (!currentAd) {\n console.warn(\n \"[HlsAdPlayer] Cannot play: No ad loaded (no ads available)\"\n );\n return Promise.reject(new Error(\"No ad loaded\"));\n }\n\n console.log(\"[HlsAdPlayer] Starting ad playback\");\n\n try {\n if (!adVideoElement) {\n adVideoElement = createAdVideoElement();\n adContainerEl?.appendChild(adVideoElement);\n setupAdEventListeners();\n }\n\n trackingFired = {\n impression: trackingFired.impression,\n start: false,\n firstQuartile: false,\n midpoint: false,\n thirdQuartile: false,\n complete: false,\n };\n\n const contentVolume = contentVideo.volume;\n originalVolume = Math.max(\n 0,\n Math.min(1, contentVolume || originalVolume)\n );\n\n if (!options?.continueLiveStreamDuringAds) {\n contentVideo.pause();\n console.log(\"[HlsAdPlayer] Content paused (VOD mode)\");\n } else {\n console.log(\"[HlsAdPlayer] Content continues (Live mode)\");\n }\n\n console.log(\"[HlsAdPlayer] FORCE MUTING main video\");\n contentVideo.muted = true;\n contentVideo.volume = 0;\n adPlaying = true;\n setAdPlayingFlag(true);\n\n if (adVideoElement) {\n const adVolume = originalMutedState ? 0 : originalVolume;\n adVideoElement.volume = Math.max(0, Math.min(1, adVolume));\n adVideoElement.muted = false;\n console.log(\n `[HlsAdPlayer] Set ad video volume to ${adVideoElement.volume}, muted: ${adVideoElement.muted}, originalMutedState: ${originalMutedState}, contentVolume: ${contentVolume}`\n );\n }\n\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n\n emit(\"content_pause\");\n\n const mediaFile = selectBestMediaFile(currentAd.mediaFiles);\n if (!mediaFile) {\n throw new Error(\"No media file available for ad\");\n }\n\n const isHlsAd = isHlsMediaFile(mediaFile);\n console.log(\n `[HlsAdPlayer] Loading ${isHlsAd ? \"HLS\" : \"progressive\"} ad from: ${mediaFile.url}`\n );\n\n if (isHlsAd && Hls.isSupported()) {\n if (adHls) {\n adHls.destroy();\n }\n\n adHls = new Hls({\n enableWorker: true,\n lowLatencyMode: false,\n });\n\n adHls.loadSource(mediaFile.url);\n adHls.attachMedia(adVideoElement);\n\n adHls.on(Hls.Events.MANIFEST_PARSED, () => {\n console.log(\"[HlsAdPlayer] HLS manifest parsed, starting playback\");\n adVideoElement!.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\n });\n\n adHls.on(Hls.Events.ERROR, (event, data) => {\n console.error(\"[HlsAdPlayer] HLS error:\", data);\n if (data.fatal) {\n handleAdError();\n }\n });\n } else if (isHlsAd && (\n adVideoElement.canPlayType(\"application/vnd.apple.mpegurl\")\n )) {\n adVideoElement.src = mediaFile.url;\n adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting ad playback:\", error);\n handleAdError();\n });\n } else if (!isHlsAd && isProgressiveMediaFile(mediaFile)) {\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n adVideoElement.src = mediaFile.url;\n adVideoElement.load();\n adVideoElement.play().catch((error) => {\n console.error(\"[HlsAdPlayer] Error starting progressive ad playback:\", error);\n handleAdError();\n });\n } else {\n throw new Error(`Unsupported ad media file type: ${mediaFile.type}`);\n }\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[HlsAdPlayer] Error playing ad:\", error);\n handleAdError();\n return Promise.reject(error);\n }\n },\n pause() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n try {\n if (adVideoElement && !adVideoElement.paused) {\n adVideoElement.pause();\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error pausing ad:\", error);\n }\n },\n resume() {\n if (!adPlaying || !adVideoElement) {\n return;\n }\n\n try {\n if (adVideoElement && adVideoElement.paused) {\n adVideoElement.play().catch(() => {});\n }\n } catch (error) {\n console.warn(\"[HlsAdPlayer] Error resuming ad:\", error);\n }\n },\n async stop() {\n console.log(\"[HlsAdPlayer] Stopping ad\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n const previousMutedState = contentVideo.muted;\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n console.log(\n `[HlsAdPlayer] Restored mute state on stop: ${previousMutedState} -> ${originalMutedState}`\n );\n\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n\n if (options?.continueLiveStreamDuringAds) {\n if (contentVideo.paused) {\n console.log(\"[HlsAdPlayer] Content video paused in live mode, resuming playback on stop\");\n contentVideo.play().catch(() => {});\n }\n }\n\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n }\n\n currentAd = undefined;\n },\n\n destroy() {\n console.log(\"[HlsAdPlayer] Destroying\");\n destroyed = true;\n \n for (const timeoutId of pendingTimeouts) {\n clearTimeout(timeoutId);\n }\n pendingTimeouts = [];\n \n adPlaying = false;\n setAdPlayingFlag(false);\n contentVideo.muted = originalMutedState;\n contentVideo.volume = originalMutedState ? 0 : originalVolume;\n\n if (adHls) {\n adHls.destroy();\n adHls = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.pause();\n adVideoElement.src = \"\";\n adVideoElement.remove();\n adVideoElement = undefined;\n }\n\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n\n adContainerEl = undefined;\n currentAd = undefined;\n listeners.clear();\n preloadedAds.clear();\n preloadingAds.clear();\n },\n\n isAdPlaying() {\n return adPlaying;\n },\n\n resize(width: number, height: number) {\n console.log(`[HlsAdPlayer] Resizing to ${width}x${height}`);\n\n if (adContainerEl) {\n adContainerEl.style.width = `${width}px`;\n adContainerEl.style.height = `${height}px`;\n }\n\n if (adVideoElement) {\n adVideoElement.style.width = `${width}px`;\n adVideoElement.style.height = `${height}px`;\n }\n },\n\n on(event: string, listener: (payload?: any) => void) {\n if (!listeners.has(event)) listeners.set(event, new Set());\n listeners.get(event)!.add(listener);\n },\n\n off(event: string, listener: (payload?: any) => void) {\n listeners.get(event)?.delete(listener);\n },\n\n updateOriginalMutedState(muted: boolean, volume?: number) {\n const nextVolume =\n typeof volume === \"number\" && !Number.isNaN(volume)\n ? Math.max(0, Math.min(1, volume))\n : originalVolume;\n console.log(\n `[HlsAdPlayer] updateOriginalMutedState called: { muted: ${originalMutedState} -> ${muted}, volume: ${originalVolume} -> ${nextVolume} }`\n );\n originalMutedState = muted;\n originalVolume = nextVolume;\n },\n\n getOriginalMutedState() {\n return originalMutedState;\n },\n getOriginalVolume() {\n return originalVolume;\n },\n\n setAdVolume(volume: number) {\n if (adVideoElement && adPlaying) {\n adVideoElement.volume = Math.max(0, Math.min(1, volume));\n }\n },\n\n getAdVolume(): number {\n if (adVideoElement && adPlaying) {\n return adVideoElement.volume;\n }\n return 1;\n },\n showPlaceholder() {\n contentVideo.style.opacity = \"0\";\n contentVideo.style.visibility = \"hidden\";\n \n if (!adContainerEl) {\n const container = document.createElement(\"div\");\n container.style.position = \"absolute\";\n container.style.left = \"0\";\n container.style.top = \"0\";\n container.style.right = \"0\";\n container.style.bottom = \"0\";\n container.style.display = \"none\";\n container.style.alignItems = \"center\";\n container.style.justifyContent = \"center\";\n container.style.pointerEvents = \"none\";\n container.style.zIndex = \"10\";\n container.style.backgroundColor = \"#000\";\n\n contentVideo.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\n }\n \n if (!adPlaying) {\n contentVideo.style.visibility = \"visible\";\n contentVideo.style.opacity = \"1\";\n }\n },\n };\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { A as AdController } from '../types-DDwAfBLt.cjs';
|
|
2
|
+
import Hls from 'hls.js';
|
|
3
|
+
|
|
4
|
+
declare function createHlsAdPlayer(contentVideo: HTMLVideoElement, options?: {
|
|
5
|
+
continueLiveStreamDuringAds?: boolean;
|
|
6
|
+
licenseKey?: string;
|
|
7
|
+
mainHlsInstance?: Hls;
|
|
8
|
+
}): AdController;
|
|
9
|
+
|
|
10
|
+
export { createHlsAdPlayer };
|
package/lib/sdk/pal.cjs
ADDED
|
@@ -0,0 +1,358 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
|
|
3
|
+
try {
|
|
4
|
+
var info = gen[key](arg);
|
|
5
|
+
var value = info.value;
|
|
6
|
+
} catch (error) {
|
|
7
|
+
reject(error);
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
if (info.done) {
|
|
11
|
+
resolve(value);
|
|
12
|
+
} else {
|
|
13
|
+
Promise.resolve(value).then(_next, _throw);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function _async_to_generator(fn) {
|
|
17
|
+
return function() {
|
|
18
|
+
var self = this, args = arguments;
|
|
19
|
+
return new Promise(function(resolve, reject) {
|
|
20
|
+
var gen = fn.apply(self, args);
|
|
21
|
+
function _next(value) {
|
|
22
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value);
|
|
23
|
+
}
|
|
24
|
+
function _throw(err) {
|
|
25
|
+
asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err);
|
|
26
|
+
}
|
|
27
|
+
_next(undefined);
|
|
28
|
+
});
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function _type_of(obj) {
|
|
32
|
+
"@swc/helpers - typeof";
|
|
33
|
+
return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
|
|
34
|
+
}
|
|
35
|
+
function _ts_generator(thisArg, body) {
|
|
36
|
+
var f, y, t, _ = {
|
|
37
|
+
label: 0,
|
|
38
|
+
sent: function() {
|
|
39
|
+
if (t[0] & 1) throw t[1];
|
|
40
|
+
return t[1];
|
|
41
|
+
},
|
|
42
|
+
trys: [],
|
|
43
|
+
ops: []
|
|
44
|
+
}, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype), d = Object.defineProperty;
|
|
45
|
+
return d(g, "next", {
|
|
46
|
+
value: verb(0)
|
|
47
|
+
}), d(g, "throw", {
|
|
48
|
+
value: verb(1)
|
|
49
|
+
}), d(g, "return", {
|
|
50
|
+
value: verb(2)
|
|
51
|
+
}), typeof Symbol === "function" && d(g, Symbol.iterator, {
|
|
52
|
+
value: function() {
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
}), g;
|
|
56
|
+
function verb(n) {
|
|
57
|
+
return function(v) {
|
|
58
|
+
return step([
|
|
59
|
+
n,
|
|
60
|
+
v
|
|
61
|
+
]);
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
function step(op) {
|
|
65
|
+
if (f) throw new TypeError("Generator is already executing.");
|
|
66
|
+
while(g && (g = 0, op[0] && (_ = 0)), _)try {
|
|
67
|
+
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
68
|
+
if (y = 0, t) op = [
|
|
69
|
+
op[0] & 2,
|
|
70
|
+
t.value
|
|
71
|
+
];
|
|
72
|
+
switch(op[0]){
|
|
73
|
+
case 0:
|
|
74
|
+
case 1:
|
|
75
|
+
t = op;
|
|
76
|
+
break;
|
|
77
|
+
case 4:
|
|
78
|
+
_.label++;
|
|
79
|
+
return {
|
|
80
|
+
value: op[1],
|
|
81
|
+
done: false
|
|
82
|
+
};
|
|
83
|
+
case 5:
|
|
84
|
+
_.label++;
|
|
85
|
+
y = op[1];
|
|
86
|
+
op = [
|
|
87
|
+
0
|
|
88
|
+
];
|
|
89
|
+
continue;
|
|
90
|
+
case 7:
|
|
91
|
+
op = _.ops.pop();
|
|
92
|
+
_.trys.pop();
|
|
93
|
+
continue;
|
|
94
|
+
default:
|
|
95
|
+
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
|
|
96
|
+
_ = 0;
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
|
|
100
|
+
_.label = op[1];
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
if (op[0] === 6 && _.label < t[1]) {
|
|
104
|
+
_.label = t[1];
|
|
105
|
+
t = op;
|
|
106
|
+
break;
|
|
107
|
+
}
|
|
108
|
+
if (t && _.label < t[2]) {
|
|
109
|
+
_.label = t[2];
|
|
110
|
+
_.ops.push(op);
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
if (t[2]) _.ops.pop();
|
|
114
|
+
_.trys.pop();
|
|
115
|
+
continue;
|
|
116
|
+
}
|
|
117
|
+
op = body.call(thisArg, _);
|
|
118
|
+
} catch (e) {
|
|
119
|
+
op = [
|
|
120
|
+
6,
|
|
121
|
+
e
|
|
122
|
+
];
|
|
123
|
+
y = 0;
|
|
124
|
+
} finally{
|
|
125
|
+
f = t = 0;
|
|
126
|
+
}
|
|
127
|
+
if (op[0] & 5) throw op[1];
|
|
128
|
+
return {
|
|
129
|
+
value: op[0] ? op[1] : void 0,
|
|
130
|
+
done: true
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
var __defProp = Object.defineProperty;
|
|
135
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
136
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
137
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
138
|
+
var __export = function __export(target, all) {
|
|
139
|
+
for(var name in all)__defProp(target, name, {
|
|
140
|
+
get: all[name],
|
|
141
|
+
enumerable: true
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
var __copyProps = function __copyProps(to, from, except, desc) {
|
|
145
|
+
if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
|
|
146
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
147
|
+
try {
|
|
148
|
+
var _loop = function() {
|
|
149
|
+
var key = _step.value;
|
|
150
|
+
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
151
|
+
get: function get() {
|
|
152
|
+
return from[key];
|
|
153
|
+
},
|
|
154
|
+
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
155
|
+
});
|
|
156
|
+
};
|
|
157
|
+
for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
|
|
158
|
+
} catch (err) {
|
|
159
|
+
_didIteratorError = true;
|
|
160
|
+
_iteratorError = err;
|
|
161
|
+
} finally{
|
|
162
|
+
try {
|
|
163
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
164
|
+
_iterator.return();
|
|
165
|
+
}
|
|
166
|
+
} finally{
|
|
167
|
+
if (_didIteratorError) {
|
|
168
|
+
throw _iteratorError;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return to;
|
|
174
|
+
};
|
|
175
|
+
var __toCommonJS = function __toCommonJS(mod) {
|
|
176
|
+
return __copyProps(__defProp({}, "__esModule", {
|
|
177
|
+
value: true
|
|
178
|
+
}), mod);
|
|
179
|
+
};
|
|
180
|
+
// src/sdk/pal.ts
|
|
181
|
+
var pal_exports = {};
|
|
182
|
+
__export(pal_exports, {
|
|
183
|
+
createPalNonceManager: function createPalNonceManager1() {
|
|
184
|
+
return createPalNonceManager;
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
module.exports = __toCommonJS(pal_exports);
|
|
188
|
+
var PAL_SDK_URL = "https://imasdk.googleapis.com/pal/sdkloader/newpallibrary.js";
|
|
189
|
+
var _nonceLoader;
|
|
190
|
+
var _palLoadPromise;
|
|
191
|
+
function loadPalSdk() {
|
|
192
|
+
var _window_goog;
|
|
193
|
+
if (typeof window !== "undefined" && ((_window_goog = window.goog) === null || _window_goog === void 0 ? void 0 : _window_goog.pal)) {
|
|
194
|
+
return Promise.resolve();
|
|
195
|
+
}
|
|
196
|
+
if (_palLoadPromise) return _palLoadPromise;
|
|
197
|
+
_palLoadPromise = new Promise(function(resolve, reject) {
|
|
198
|
+
var existing = document.querySelector('script[data-pal="true"]');
|
|
199
|
+
if (existing) {
|
|
200
|
+
var _window_goog;
|
|
201
|
+
if ((_window_goog = window.goog) === null || _window_goog === void 0 ? void 0 : _window_goog.pal) {
|
|
202
|
+
resolve();
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
var timeout = setTimeout(function() {
|
|
206
|
+
return reject(new Error("PAL SDK load timeout"));
|
|
207
|
+
}, 1e4);
|
|
208
|
+
existing.addEventListener("load", function() {
|
|
209
|
+
clearTimeout(timeout);
|
|
210
|
+
resolve();
|
|
211
|
+
});
|
|
212
|
+
existing.addEventListener("error", function() {
|
|
213
|
+
clearTimeout(timeout);
|
|
214
|
+
reject(new Error("PAL SDK load failed"));
|
|
215
|
+
});
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
var script = document.createElement("script");
|
|
219
|
+
script.src = PAL_SDK_URL;
|
|
220
|
+
script.async = true;
|
|
221
|
+
script.setAttribute("data-pal", "true");
|
|
222
|
+
script.onload = function() {
|
|
223
|
+
return resolve();
|
|
224
|
+
};
|
|
225
|
+
script.onerror = function() {
|
|
226
|
+
return reject(new Error("PAL SDK load failed"));
|
|
227
|
+
};
|
|
228
|
+
document.head.appendChild(script);
|
|
229
|
+
});
|
|
230
|
+
return _palLoadPromise;
|
|
231
|
+
}
|
|
232
|
+
function getOrCreateNonceLoader() {
|
|
233
|
+
if (_nonceLoader) return _nonceLoader;
|
|
234
|
+
var goog = window.goog;
|
|
235
|
+
var consentSettings = new goog.pal.ConsentSettings();
|
|
236
|
+
consentSettings.allowStorage = true;
|
|
237
|
+
_nonceLoader = new goog.pal.NonceLoader(consentSettings);
|
|
238
|
+
return _nonceLoader;
|
|
239
|
+
}
|
|
240
|
+
function createPalNonceManager() {
|
|
241
|
+
var currentNonce = "";
|
|
242
|
+
var currentNonceManager;
|
|
243
|
+
return {
|
|
244
|
+
generateNonce: function generateNonce() {
|
|
245
|
+
return _async_to_generator(function() {
|
|
246
|
+
var options, _options_adWillAutoPlay, _options_adWillPlayMuted, _options_continuousPlayback, loader, goog, request, manager, error;
|
|
247
|
+
var _arguments = arguments;
|
|
248
|
+
return _ts_generator(this, function(_state) {
|
|
249
|
+
switch(_state.label){
|
|
250
|
+
case 0:
|
|
251
|
+
options = _arguments.length > 0 && _arguments[0] !== void 0 ? _arguments[0] : {};
|
|
252
|
+
_state.label = 1;
|
|
253
|
+
case 1:
|
|
254
|
+
_state.trys.push([
|
|
255
|
+
1,
|
|
256
|
+
4,
|
|
257
|
+
,
|
|
258
|
+
5
|
|
259
|
+
]);
|
|
260
|
+
return [
|
|
261
|
+
4,
|
|
262
|
+
loadPalSdk()
|
|
263
|
+
];
|
|
264
|
+
case 2:
|
|
265
|
+
_state.sent();
|
|
266
|
+
loader = getOrCreateNonceLoader();
|
|
267
|
+
goog = window.goog;
|
|
268
|
+
request = new goog.pal.NonceRequest();
|
|
269
|
+
request.adWillAutoPlay = (_options_adWillAutoPlay = options.adWillAutoPlay) !== null && _options_adWillAutoPlay !== void 0 ? _options_adWillAutoPlay : true;
|
|
270
|
+
request.adWillPlayMuted = (_options_adWillPlayMuted = options.adWillPlayMuted) !== null && _options_adWillPlayMuted !== void 0 ? _options_adWillPlayMuted : false;
|
|
271
|
+
request.continuousPlayback = (_options_continuousPlayback = options.continuousPlayback) !== null && _options_continuousPlayback !== void 0 ? _options_continuousPlayback : true;
|
|
272
|
+
request.descriptionUrl = options.descriptionUrl || (typeof window !== "undefined" ? window.location.href : "");
|
|
273
|
+
request.iconsSupported = true;
|
|
274
|
+
request.playerType = "StormcloudVideoPlayer";
|
|
275
|
+
request.playerVersion = "1.0";
|
|
276
|
+
request.supportedApiFrameworks = "2,7,9";
|
|
277
|
+
request.url = options.descriptionUrl || (typeof window !== "undefined" ? window.location.href : "");
|
|
278
|
+
request.videoWidth = options.videoWidth || 640;
|
|
279
|
+
request.videoHeight = options.videoHeight || 480;
|
|
280
|
+
if (options.ppid) request.ppid = options.ppid;
|
|
281
|
+
if (options.sessionId) request.sessionId = options.sessionId;
|
|
282
|
+
return [
|
|
283
|
+
4,
|
|
284
|
+
loader.loadNonceManager(request)
|
|
285
|
+
];
|
|
286
|
+
case 3:
|
|
287
|
+
manager = _state.sent();
|
|
288
|
+
currentNonceManager = manager;
|
|
289
|
+
currentNonce = manager.getNonce();
|
|
290
|
+
console.log("[PAL] Nonce generated successfully");
|
|
291
|
+
return [
|
|
292
|
+
2,
|
|
293
|
+
currentNonce
|
|
294
|
+
];
|
|
295
|
+
case 4:
|
|
296
|
+
error = _state.sent();
|
|
297
|
+
console.warn("[PAL] Failed to generate nonce:", error);
|
|
298
|
+
currentNonce = "";
|
|
299
|
+
currentNonceManager = void 0;
|
|
300
|
+
return [
|
|
301
|
+
2,
|
|
302
|
+
""
|
|
303
|
+
];
|
|
304
|
+
case 5:
|
|
305
|
+
return [
|
|
306
|
+
2
|
|
307
|
+
];
|
|
308
|
+
}
|
|
309
|
+
});
|
|
310
|
+
}).apply(this, arguments);
|
|
311
|
+
},
|
|
312
|
+
getCurrentNonce: function getCurrentNonce() {
|
|
313
|
+
return currentNonce;
|
|
314
|
+
},
|
|
315
|
+
injectNonce: function injectNonce(vastTagUrl) {
|
|
316
|
+
if (!currentNonce || !vastTagUrl) return vastTagUrl;
|
|
317
|
+
try {
|
|
318
|
+
var url = new URL(vastTagUrl);
|
|
319
|
+
url.searchParams.delete("paln");
|
|
320
|
+
url.searchParams.set("givn", currentNonce);
|
|
321
|
+
return url.toString();
|
|
322
|
+
} catch (unused) {
|
|
323
|
+
var base = vastTagUrl.replace(/([?&])paln=[^&]*/g, "").replace(/[?&]$/, "");
|
|
324
|
+
var sep = base.includes("?") ? "&" : "?";
|
|
325
|
+
return "".concat(base).concat(sep, "givn=").concat(encodeURIComponent(currentNonce));
|
|
326
|
+
}
|
|
327
|
+
},
|
|
328
|
+
sendPlaybackStart: function sendPlaybackStart() {
|
|
329
|
+
try {
|
|
330
|
+
currentNonceManager === null || currentNonceManager === void 0 ? void 0 : currentNonceManager.sendPlaybackStart();
|
|
331
|
+
} catch (unused) {}
|
|
332
|
+
},
|
|
333
|
+
sendPlaybackEnd: function sendPlaybackEnd() {
|
|
334
|
+
try {
|
|
335
|
+
currentNonceManager === null || currentNonceManager === void 0 ? void 0 : currentNonceManager.sendPlaybackEnd();
|
|
336
|
+
} catch (unused) {}
|
|
337
|
+
},
|
|
338
|
+
sendAdClick: function sendAdClick() {
|
|
339
|
+
try {
|
|
340
|
+
currentNonceManager === null || currentNonceManager === void 0 ? void 0 : currentNonceManager.sendAdClick();
|
|
341
|
+
} catch (unused) {}
|
|
342
|
+
},
|
|
343
|
+
sendAdTouch: function sendAdTouch(event) {
|
|
344
|
+
try {
|
|
345
|
+
currentNonceManager === null || currentNonceManager === void 0 ? void 0 : currentNonceManager.sendAdTouch(event);
|
|
346
|
+
} catch (unused) {}
|
|
347
|
+
},
|
|
348
|
+
reset: function reset() {
|
|
349
|
+
currentNonce = "";
|
|
350
|
+
currentNonceManager = void 0;
|
|
351
|
+
}
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
355
|
+
0 && (module.exports = {
|
|
356
|
+
createPalNonceManager: createPalNonceManager
|
|
357
|
+
});
|
|
358
|
+
//# sourceMappingURL=pal.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/pal.cjs"],"names":[],"mappings":"AAAA","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/pal.ts\nvar pal_exports = {};\n__export(pal_exports, {\n createPalNonceManager: () => createPalNonceManager\n});\nmodule.exports = __toCommonJS(pal_exports);\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/newpallibrary.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\");\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createPalNonceManager\n});\n"]}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare global {
|
|
2
|
+
interface Window {
|
|
3
|
+
goog?: any;
|
|
4
|
+
}
|
|
5
|
+
}
|
|
6
|
+
interface PalNonceOptions {
|
|
7
|
+
videoWidth?: number;
|
|
8
|
+
videoHeight?: number;
|
|
9
|
+
descriptionUrl?: string;
|
|
10
|
+
ppid?: string;
|
|
11
|
+
sessionId?: string;
|
|
12
|
+
adWillAutoPlay?: boolean;
|
|
13
|
+
adWillPlayMuted?: boolean;
|
|
14
|
+
continuousPlayback?: boolean;
|
|
15
|
+
}
|
|
16
|
+
interface PalNonceManager {
|
|
17
|
+
generateNonce(options?: PalNonceOptions): Promise<string>;
|
|
18
|
+
getCurrentNonce(): string;
|
|
19
|
+
injectNonce(vastTagUrl: string): string;
|
|
20
|
+
sendPlaybackStart(): void;
|
|
21
|
+
sendPlaybackEnd(): void;
|
|
22
|
+
sendAdClick(): void;
|
|
23
|
+
sendAdTouch(event: MouseEvent | TouchEvent): void;
|
|
24
|
+
reset(): void;
|
|
25
|
+
}
|
|
26
|
+
declare function createPalNonceManager(): PalNonceManager;
|
|
27
|
+
|
|
28
|
+
export { type PalNonceManager, type PalNonceOptions, createPalNonceManager };
|
|
@@ -17,17 +17,14 @@ interface StormcloudVideoPlayerConfig {
|
|
|
17
17
|
onFullscreenToggle?: () => void;
|
|
18
18
|
onControlClick?: () => void;
|
|
19
19
|
licenseKey?: string;
|
|
20
|
+
vastTagUrl?: string;
|
|
21
|
+
vmapUrl?: string;
|
|
22
|
+
vastMode?: 'adstorm' | 'default';
|
|
20
23
|
minSegmentsBeforePlay?: number;
|
|
21
|
-
disableAds?: boolean;
|
|
22
|
-
disableFiller?: boolean;
|
|
23
|
-
adTransitionGapMs?: number;
|
|
24
|
-
singlePipelineMode?: boolean;
|
|
25
|
-
projectId?: string;
|
|
26
|
-
channelId?: number;
|
|
27
24
|
}
|
|
28
25
|
interface AdController {
|
|
29
26
|
initialize: () => void;
|
|
30
|
-
requestAds: () => Promise<void>;
|
|
27
|
+
requestAds: (vastTagUrl: string) => Promise<void>;
|
|
31
28
|
play: () => Promise<void>;
|
|
32
29
|
pause: () => void;
|
|
33
30
|
resume: () => void;
|
|
@@ -78,6 +75,9 @@ interface ClientInfo {
|
|
|
78
75
|
referrer: string;
|
|
79
76
|
visibilityState: string;
|
|
80
77
|
}
|
|
78
|
+
interface PlayerAnalyticsContext {
|
|
79
|
+
inputStreamType?: string;
|
|
80
|
+
}
|
|
81
81
|
interface AdDetectInfo {
|
|
82
82
|
source: "scte35";
|
|
83
83
|
durationSeconds?: number;
|
|
@@ -86,16 +86,17 @@ interface AdDetectInfo {
|
|
|
86
86
|
timestamp: string;
|
|
87
87
|
}
|
|
88
88
|
interface AdLoadedInfo {
|
|
89
|
-
source: "vast" | "
|
|
89
|
+
source: "vast" | "hls";
|
|
90
90
|
vastUrl?: string;
|
|
91
91
|
durationSeconds?: number;
|
|
92
92
|
timestamp: string;
|
|
93
93
|
}
|
|
94
94
|
interface AdImpressionInfo {
|
|
95
|
-
source: "vast" | "
|
|
95
|
+
source: "vast" | "hls";
|
|
96
96
|
adIndex: number;
|
|
97
|
+
adUrl?: string;
|
|
97
98
|
durationSeconds?: number;
|
|
98
99
|
timestamp: string;
|
|
99
100
|
}
|
|
100
101
|
|
|
101
|
-
export type { AdController as A, ClientInfo as C, StormcloudVideoPlayerConfig as S, AdDetectInfo as a, AdImpressionInfo as b, AdLoadedInfo as c };
|
|
102
|
+
export type { AdController as A, ClientInfo as C, PlayerAnalyticsContext as P, StormcloudVideoPlayerConfig as S, AdDetectInfo as a, AdImpressionInfo as b, AdLoadedInfo as c };
|