stormcloud-video-player 0.2.30 → 0.2.32
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 +2 -2
- package/lib/index.cjs +387 -102
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +9 -1
- package/lib/index.d.ts +9 -1
- package/lib/index.js +387 -102
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +387 -102
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +9 -1
- package/lib/players/HlsPlayer.cjs +387 -102
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/index.cjs +387 -102
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/ima.cjs +103 -33
- package/lib/sdk/ima.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.cjs +387 -102
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/package.json +2 -2
package/lib/sdk/ima.cjs
CHANGED
|
@@ -177,7 +177,11 @@ function createImaController(video, options) {
|
|
|
177
177
|
}
|
|
178
178
|
function hideContentVideo() {
|
|
179
179
|
if (!contentVideoHidden) {
|
|
180
|
-
video.style.
|
|
180
|
+
video.style.transition = "opacity 0.3s ease-in-out";
|
|
181
|
+
video.style.opacity = "0";
|
|
182
|
+
setTimeout(() => {
|
|
183
|
+
video.style.visibility = "hidden";
|
|
184
|
+
}, 300);
|
|
181
185
|
video.muted = true;
|
|
182
186
|
video.volume = 0;
|
|
183
187
|
contentVideoHidden = true;
|
|
@@ -187,6 +191,9 @@ function createImaController(video, options) {
|
|
|
187
191
|
function showContentVideo() {
|
|
188
192
|
if (contentVideoHidden) {
|
|
189
193
|
video.style.visibility = "visible";
|
|
194
|
+
video.style.transition = "opacity 0.3s ease-in-out";
|
|
195
|
+
video.offsetHeight;
|
|
196
|
+
video.style.opacity = "1";
|
|
190
197
|
video.muted = originalMutedState;
|
|
191
198
|
video.volume = originalVolume;
|
|
192
199
|
contentVideoHidden = false;
|
|
@@ -359,7 +366,9 @@ function createImaController(video, options) {
|
|
|
359
366
|
container.style.justifyContent = "center";
|
|
360
367
|
container.style.pointerEvents = "none";
|
|
361
368
|
container.style.zIndex = "10";
|
|
362
|
-
container.style.backgroundColor = "
|
|
369
|
+
container.style.backgroundColor = "transparent";
|
|
370
|
+
container.style.transition = "opacity 0.3s ease-in-out, background-color 0.3s ease-in-out";
|
|
371
|
+
container.style.opacity = "0";
|
|
363
372
|
(_a = video.parentElement) == null ? void 0 : _a.appendChild(container);
|
|
364
373
|
adContainerEl = container;
|
|
365
374
|
}
|
|
@@ -469,7 +478,9 @@ function createImaController(video, options) {
|
|
|
469
478
|
container.style.justifyContent = "center";
|
|
470
479
|
container.style.pointerEvents = "none";
|
|
471
480
|
container.style.zIndex = "10";
|
|
472
|
-
container.style.backgroundColor = "
|
|
481
|
+
container.style.backgroundColor = "transparent";
|
|
482
|
+
container.style.transition = "opacity 0.3s ease-in-out, background-color 0.3s ease-in-out";
|
|
483
|
+
container.style.opacity = "0";
|
|
473
484
|
if (!video.parentElement) {
|
|
474
485
|
throw new Error("Video element has no parent for ad container");
|
|
475
486
|
}
|
|
@@ -533,13 +544,19 @@ function createImaController(video, options) {
|
|
|
533
544
|
console.error("[IMA] Ad error:", errorEvent.getError());
|
|
534
545
|
destroyAdsManager();
|
|
535
546
|
adPlaying = false;
|
|
536
|
-
showContentVideo();
|
|
537
547
|
setAdPlayingFlag(false);
|
|
538
548
|
if (adContainerEl) {
|
|
539
|
-
adContainerEl.style.
|
|
540
|
-
adContainerEl.style.
|
|
541
|
-
|
|
549
|
+
adContainerEl.style.opacity = "0";
|
|
550
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
551
|
+
setTimeout(() => {
|
|
552
|
+
if (adContainerEl) {
|
|
553
|
+
adContainerEl.style.pointerEvents = "none";
|
|
554
|
+
adContainerEl.style.display = "none";
|
|
555
|
+
console.log("[IMA] Ad container hidden after error");
|
|
556
|
+
}
|
|
557
|
+
}, 300);
|
|
542
558
|
}
|
|
559
|
+
showContentVideo();
|
|
543
560
|
if (adsLoadedReject) {
|
|
544
561
|
adsLoadedReject(new Error("Ad playback error"));
|
|
545
562
|
adsLoadedReject = void 0;
|
|
@@ -585,6 +602,15 @@ function createImaController(video, options) {
|
|
|
585
602
|
"[IMA] Content video continues in background (Live mode)"
|
|
586
603
|
);
|
|
587
604
|
}
|
|
605
|
+
hideContentVideo();
|
|
606
|
+
if (adContainerEl) {
|
|
607
|
+
adContainerEl.style.pointerEvents = "auto";
|
|
608
|
+
adContainerEl.style.display = "flex";
|
|
609
|
+
adContainerEl.style.backgroundColor = "#000";
|
|
610
|
+
adContainerEl.offsetHeight;
|
|
611
|
+
adContainerEl.style.opacity = "1";
|
|
612
|
+
console.log("[IMA] Ad container shown on content pause");
|
|
613
|
+
}
|
|
588
614
|
adPlaying = true;
|
|
589
615
|
setAdPlayingFlag(true);
|
|
590
616
|
emit("content_pause");
|
|
@@ -604,6 +630,9 @@ function createImaController(video, options) {
|
|
|
604
630
|
if (adContainerEl) {
|
|
605
631
|
adContainerEl.style.pointerEvents = "auto";
|
|
606
632
|
adContainerEl.style.display = "flex";
|
|
633
|
+
adContainerEl.style.backgroundColor = "#000";
|
|
634
|
+
adContainerEl.offsetHeight;
|
|
635
|
+
adContainerEl.style.opacity = "1";
|
|
607
636
|
console.log("[IMA] Ad container now visible");
|
|
608
637
|
}
|
|
609
638
|
});
|
|
@@ -620,12 +649,18 @@ function createImaController(video, options) {
|
|
|
620
649
|
console.log("[IMA] All ads completed - restoring content");
|
|
621
650
|
adPlaying = false;
|
|
622
651
|
setAdPlayingFlag(false);
|
|
623
|
-
showContentVideo();
|
|
624
652
|
if (adContainerEl) {
|
|
625
|
-
adContainerEl.style.
|
|
626
|
-
adContainerEl.style.
|
|
627
|
-
|
|
653
|
+
adContainerEl.style.opacity = "0";
|
|
654
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
655
|
+
setTimeout(() => {
|
|
656
|
+
if (adContainerEl) {
|
|
657
|
+
adContainerEl.style.pointerEvents = "none";
|
|
658
|
+
adContainerEl.style.display = "none";
|
|
659
|
+
console.log("[IMA] Ad container hidden");
|
|
660
|
+
}
|
|
661
|
+
}, 300);
|
|
628
662
|
}
|
|
663
|
+
showContentVideo();
|
|
629
664
|
if (!(options == null ? void 0 : options.continueLiveStreamDuringAds) && video.paused) {
|
|
630
665
|
console.log("[IMA] Resuming content video playback");
|
|
631
666
|
video.play().catch((e) => {
|
|
@@ -643,13 +678,21 @@ function createImaController(video, options) {
|
|
|
643
678
|
} catch (e) {
|
|
644
679
|
console.error("[IMA] Error setting up ads manager:", e);
|
|
645
680
|
adPlaying = false;
|
|
646
|
-
showContentVideo();
|
|
647
681
|
setAdPlayingFlag(false);
|
|
648
682
|
if (adContainerEl) {
|
|
649
|
-
adContainerEl.style.
|
|
650
|
-
adContainerEl.style.
|
|
651
|
-
|
|
683
|
+
adContainerEl.style.opacity = "0";
|
|
684
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
685
|
+
setTimeout(() => {
|
|
686
|
+
if (adContainerEl) {
|
|
687
|
+
adContainerEl.style.pointerEvents = "none";
|
|
688
|
+
adContainerEl.style.display = "none";
|
|
689
|
+
console.log(
|
|
690
|
+
"[IMA] Ad container hidden after setup error"
|
|
691
|
+
);
|
|
692
|
+
}
|
|
693
|
+
}, 300);
|
|
652
694
|
}
|
|
695
|
+
showContentVideo();
|
|
653
696
|
if (!(options == null ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
654
697
|
if (video.paused) {
|
|
655
698
|
console.log(
|
|
@@ -674,13 +717,19 @@ function createImaController(video, options) {
|
|
|
674
717
|
(adErrorEvent) => {
|
|
675
718
|
console.error("[IMA] Ads loader error:", adErrorEvent.getError());
|
|
676
719
|
adPlaying = false;
|
|
677
|
-
showContentVideo();
|
|
678
720
|
setAdPlayingFlag(false);
|
|
679
721
|
if (adContainerEl) {
|
|
680
|
-
adContainerEl.style.
|
|
681
|
-
adContainerEl.style.
|
|
682
|
-
|
|
722
|
+
adContainerEl.style.opacity = "0";
|
|
723
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
724
|
+
setTimeout(() => {
|
|
725
|
+
if (adContainerEl) {
|
|
726
|
+
adContainerEl.style.pointerEvents = "none";
|
|
727
|
+
adContainerEl.style.display = "none";
|
|
728
|
+
console.log("[IMA] Ad container hidden after loader error");
|
|
729
|
+
}
|
|
730
|
+
}, 300);
|
|
683
731
|
}
|
|
732
|
+
showContentVideo();
|
|
684
733
|
if (!(options == null ? void 0 : options.continueLiveStreamDuringAds)) {
|
|
685
734
|
if (video.paused) {
|
|
686
735
|
console.log("[IMA] Resuming paused video after loader error");
|
|
@@ -786,12 +835,18 @@ function createImaController(video, options) {
|
|
|
786
835
|
console.log("[IMA] Stopping ad playback");
|
|
787
836
|
adPlaying = false;
|
|
788
837
|
setAdPlayingFlag(false);
|
|
789
|
-
showContentVideo();
|
|
790
838
|
if (adContainerEl) {
|
|
791
|
-
adContainerEl.style.
|
|
792
|
-
adContainerEl.style.
|
|
793
|
-
|
|
839
|
+
adContainerEl.style.opacity = "0";
|
|
840
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
841
|
+
setTimeout(() => {
|
|
842
|
+
if (adContainerEl) {
|
|
843
|
+
adContainerEl.style.pointerEvents = "none";
|
|
844
|
+
adContainerEl.style.display = "none";
|
|
845
|
+
console.log("[IMA] Ad container hidden after stop");
|
|
846
|
+
}
|
|
847
|
+
}, 300);
|
|
794
848
|
}
|
|
849
|
+
showContentVideo();
|
|
795
850
|
try {
|
|
796
851
|
(_a = adsManager == null ? void 0 : adsManager.stop) == null ? void 0 : _a.call(adsManager);
|
|
797
852
|
} catch {
|
|
@@ -802,23 +857,29 @@ function createImaController(video, options) {
|
|
|
802
857
|
var _a;
|
|
803
858
|
destroyAdsManager();
|
|
804
859
|
adPlaying = false;
|
|
805
|
-
showContentVideo();
|
|
806
860
|
setAdPlayingFlag(false);
|
|
807
861
|
if (adContainerEl) {
|
|
808
|
-
adContainerEl.style.
|
|
809
|
-
adContainerEl.style.
|
|
862
|
+
adContainerEl.style.opacity = "0";
|
|
863
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
864
|
+
setTimeout(() => {
|
|
865
|
+
if (adContainerEl) {
|
|
866
|
+
adContainerEl.style.pointerEvents = "none";
|
|
867
|
+
adContainerEl.style.display = "none";
|
|
868
|
+
if (adContainerEl.parentElement) {
|
|
869
|
+
adContainerEl.parentElement.removeChild(adContainerEl);
|
|
870
|
+
}
|
|
871
|
+
adContainerEl = void 0;
|
|
872
|
+
adVideoElement = void 0;
|
|
873
|
+
}
|
|
874
|
+
}, 300);
|
|
810
875
|
}
|
|
876
|
+
showContentVideo();
|
|
811
877
|
try {
|
|
812
878
|
(_a = adsLoader == null ? void 0 : adsLoader.destroy) == null ? void 0 : _a.call(adsLoader);
|
|
813
879
|
} catch {
|
|
814
880
|
}
|
|
815
|
-
if (adContainerEl == null ? void 0 : adContainerEl.parentElement) {
|
|
816
|
-
adContainerEl.parentElement.removeChild(adContainerEl);
|
|
817
|
-
}
|
|
818
|
-
adContainerEl = void 0;
|
|
819
881
|
adDisplayContainer = void 0;
|
|
820
882
|
adsLoader = void 0;
|
|
821
|
-
adVideoElement = void 0;
|
|
822
883
|
contentVideoHidden = false;
|
|
823
884
|
preloadedVast.clear();
|
|
824
885
|
preloadingVast.clear();
|
|
@@ -898,13 +959,22 @@ function createImaController(video, options) {
|
|
|
898
959
|
ensurePlaceholderContainer();
|
|
899
960
|
if (adContainerEl) {
|
|
900
961
|
adContainerEl.style.display = "flex";
|
|
962
|
+
adContainerEl.style.backgroundColor = "#000";
|
|
963
|
+
adContainerEl.offsetHeight;
|
|
964
|
+
adContainerEl.style.opacity = "1";
|
|
901
965
|
adContainerEl.style.pointerEvents = "auto";
|
|
902
966
|
}
|
|
903
967
|
},
|
|
904
968
|
hidePlaceholder() {
|
|
905
969
|
if (adContainerEl) {
|
|
906
|
-
adContainerEl.style.
|
|
907
|
-
adContainerEl.style.
|
|
970
|
+
adContainerEl.style.opacity = "0";
|
|
971
|
+
adContainerEl.style.backgroundColor = "transparent";
|
|
972
|
+
setTimeout(() => {
|
|
973
|
+
if (adContainerEl) {
|
|
974
|
+
adContainerEl.style.display = "none";
|
|
975
|
+
adContainerEl.style.pointerEvents = "none";
|
|
976
|
+
}
|
|
977
|
+
}, 300);
|
|
908
978
|
}
|
|
909
979
|
}
|
|
910
980
|
};
|
package/lib/sdk/ima.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/sdk/ima.ts","../../src/utils/browserCompat.ts"],"sourcesContent":["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 const preloadedVast = new Map<string, string>();\n const preloadingVast = new Map<string, Promise<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.visibility = \"hidden\";\n video.muted = true;\n video.volume = 0;\n contentVideoHidden = true;\n console.log(\"[IMA] Content video hidden and muted\");\n }\n }\n\n function showContentVideo(): void {\n if (contentVideoHidden) {\n video.style.visibility = \"visible\";\n video.muted = originalMutedState;\n video.volume = originalVolume;\n contentVideoHidden = false;\n console.log(\n `[IMA] Content video restored (muted: ${originalMutedState}, volume: ${originalVolume})`\n );\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 adVideo.muted = false;\n adVideo.volume = originalMutedState ? 0 : originalVolume;\n\n adVideo.style.opacity = \"0\";\n adVideo.addEventListener(\n \"canplay\",\n () => {\n adVideo.style.opacity = \"1\";\n console.log(\"[IMA] Ad video ready to play\");\n },\n { once: true }\n );\n\n console.log(\n `[IMA] Created dedicated ad video element with volume: ${adVideo.volume}, muted: ${adVideo.muted}`\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 retryAttempts = 0;\n const maxRetries = 2;\n const backoffBaseMs = 500;\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 const preloadedResponse = preloadedVast.get(vastTagUrl);\n\n if (preloadedResponse) {\n adsRequest.adsResponse = preloadedResponse;\n console.log(\n \"[IMA] Using preloaded VAST response for immediate ad request\"\n );\n } else {\n adsRequest.adTagUrl = vastTagUrl;\n }\n\n const videoWidth = video.offsetWidth || video.clientWidth || 640;\n const videoHeight = video.offsetHeight || video.clientHeight || 360;\n\n adsRequest.linearAdSlotWidth = videoWidth;\n adsRequest.linearAdSlotHeight = videoHeight;\n adsRequest.nonLinearAdSlotWidth = videoWidth;\n adsRequest.nonLinearAdSlotHeight = videoHeight;\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 = 5000;\n\n console.log(`[IMA] Ads request dimensions: ${videoWidth}x${videoHeight}`);\n\n adsLoader.requestAds(adsRequest);\n\n if (preloadedResponse) {\n preloadedVast.delete(vastTagUrl);\n }\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\n video.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n async function fetchVastDocument(vastTagUrl: string): Promise<string> {\n const response = await fetch(vastTagUrl, { mode: \"cors\" });\n if (!response.ok) {\n throw new Error(`Failed to preload VAST: ${response.status}`);\n }\n return response.text();\n }\n\n function destroyAdsManager() {\n if (adsManager) {\n try {\n console.log(\"[IMA] Destroying existing ads manager\");\n adsManager.destroy();\n } catch (error) {\n console.warn(\"[IMA] Error destroying ads manager:\", error);\n }\n adsManager = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.style.opacity = \"0\";\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 console.log(\n \"[IMA] Dedicated ad video element added to container\"\n );\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n adContainerEl,\n adVideoElement\n );\n try {\n adDisplayContainer.initialize?.();\n console.log(\n \"[IMA] AdDisplayContainer initialized with dedicated ad video\"\n );\n } catch {}\n }\n })\n .catch(() => {});\n },\n async requestAds(vastTagUrl: string) {\n console.log(\"[IMA] Requesting ads:\", vastTagUrl);\n\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n const error = new Error(\"VAST tag URL is empty or undefined\");\n console.warn(\"[IMA]\", error.message);\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 console.warn(\"[IMA]\", error.message);\n return Promise.reject(error);\n }\n\n if (adPlaying) {\n console.warn(\n \"[IMA] Cannot request new ads while an ad is playing. Call stop() first.\"\n );\n return Promise.reject(\n new Error(\"Ad already playing - cannot request new ads\")\n );\n }\n\n destroyAdsManager();\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 retryAttempts = 0;\n\n if (!adDisplayContainer) {\n console.log(\"[IMA] Creating ad display container\");\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 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 console.log(\n \"[IMA] Dedicated ad video element created and added to container\"\n );\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n adVideoElement\n );\n\n try {\n adDisplayContainer.initialize();\n console.log(\n \"[IMA] Ad display container initialized with dedicated ad video\"\n );\n } catch (error) {\n console.warn(\n \"[IMA] Failed to initialize ad display container:\",\n error\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 console.warn(\"[IMA]\", error.message);\n currentReject?.(error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n return Promise.reject(error);\n }\n\n if (!adsLoader) {\n console.log(\"[IMA] Creating ads loader\");\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 console.log(\n \"[IMA] Ads manager loaded - enabling preloading for continuous playback\"\n );\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 console.error(\"[IMA] Ad error:\", errorEvent.getError());\n\n destroyAdsManager();\n\n adPlaying = false;\n showContentVideo();\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n console.log(\"[IMA] Ad container hidden after error\");\n }\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ad playback error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n\n if (lastAdTagUrl && retryAttempts < maxRetries) {\n const delay =\n backoffBaseMs * Math.pow(2, retryAttempts++);\n console.log(\n `[IMA] Retrying ad request in ${delay}ms (attempt ${retryAttempts})`\n );\n window.setTimeout(() => {\n try {\n makeAdsRequest(google, lastAdTagUrl!);\n } catch {}\n }, delay);\n } else {\n console.log(\n \"[IMA] Max retries reached, emitting ad_error\"\n );\n emit(\"ad_error\");\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\n \"[IMA] Resuming paused video after ad error\"\n );\n video.play()?.catch(() => {});\n }\n }\n }\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n console.log(\"[IMA] Content pause requested\");\n\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n console.log(\"[IMA] Content video paused (VOD mode)\");\n } else {\n console.log(\n \"[IMA] Content video continues in background (Live mode)\"\n );\n }\n\n adPlaying = true;\n setAdPlayingFlag(true);\n emit(\"content_pause\");\n }\n );\n\n adsManager.addEventListener(AdEvent.STARTED, () => {\n console.log(\"[IMA] Ad started - showing ad video\");\n setAdPlayingFlag(true);\n\n hideContentVideo();\n\n if (adVideoElement) {\n adVideoElement.volume = originalMutedState\n ? 0\n : originalVolume;\n adVideoElement.muted = originalMutedState;\n console.log(\n `[IMA] Ad video volume: ${adVideoElement.volume}, muted: ${adVideoElement.muted}`\n );\n }\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"auto\";\n adContainerEl.style.display = \"flex\";\n console.log(\"[IMA] Ad container now visible\");\n }\n });\n\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n console.log(\"[IMA] Content resume requested\");\n adPlaying = false;\n setAdPlayingFlag(false);\n emit(\"content_resume\");\n }\n );\n\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n console.log(\"[IMA] All ads completed - restoring content\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n showContentVideo();\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n console.log(\"[IMA] Ad container hidden\");\n }\n\n if (!options?.continueLiveStreamDuringAds && video.paused) {\n console.log(\"[IMA] Resuming content video playback\");\n video.play().catch((e) => {\n console.warn(\"[IMA] Failed to resume content video:\", e);\n });\n }\n\n emit(\"all_ads_completed\");\n });\n\n console.log(\"[IMA] Ads manager event listeners attached\");\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 showContentVideo();\n setAdPlayingFlag(false);\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n console.log(\"[IMA] Ad container hidden after setup error\");\n }\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\n \"[IMA] Resuming paused video after setup error\"\n );\n video.play().catch(() => {});\n }\n }\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 console.error(\"[IMA] Ads loader error:\", adErrorEvent.getError());\n\n adPlaying = false;\n showContentVideo();\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n console.log(\"[IMA] Ad container hidden after loader error\");\n }\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\"[IMA] Resuming paused video after loader error\");\n video.play().catch(() => {});\n }\n }\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ads loader error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n },\n false\n );\n }\n\n console.log(\"[IMA] Making ads request\");\n makeAdsRequest(google, vastTagUrl);\n\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 preloadAds(vastTagUrl: string) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n return Promise.resolve();\n }\n\n if (preloadedVast.has(vastTagUrl)) {\n return Promise.resolve();\n }\n\n const inflight = preloadingVast.get(vastTagUrl);\n if (inflight) {\n return inflight;\n }\n\n const preloadPromise = fetchVastDocument(vastTagUrl)\n .then((xml) => {\n preloadedVast.set(vastTagUrl, xml);\n console.log(\"[IMA] Cached VAST response for preloading:\", vastTagUrl);\n })\n .catch((error) => {\n console.warn(\"[IMA] Failed to preload VAST response:\", error);\n preloadedVast.delete(vastTagUrl);\n })\n .finally(() => {\n preloadingVast.delete(vastTagUrl);\n });\n\n preloadingVast.set(vastTagUrl, preloadPromise);\n return preloadPromise;\n },\n hasPreloadedAd(vastTagUrl: string) {\n return preloadedVast.has(vastTagUrl);\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n console.warn(\n \"[IMA] Cannot play ad: IMA SDK or ad container not available\"\n );\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n\n if (!adsManager) {\n console.warn(\"[IMA] Cannot play ad: No ads manager available\");\n return Promise.reject(new Error(\"No ads manager\"));\n }\n\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 360;\n\n console.log(`[IMA] Initializing ads manager (${width}x${height})`);\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n\n adPlaying = true;\n\n const adVolume = originalMutedState ? 0 : originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n console.log(\n `[IMA] Set dedicated ad video volume to ${adVolume}, muted: ${originalMutedState}`\n );\n }\n\n try {\n adsManager.setVolume(adVolume);\n console.log(`[IMA] Set IMA manager volume to ${adVolume}`);\n } catch (error) {\n console.warn(\"[IMA] Failed to set IMA manager volume:\", error);\n }\n\n console.log(\"[IMA] Starting ad playback\");\n adsManager.start();\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[IMA] Error starting ad playback:\", 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 async stop() {\n console.log(\"[IMA] Stopping ad playback\");\n adPlaying = false;\n setAdPlayingFlag(false);\n\n showContentVideo();\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n console.log(\"[IMA] Ad container hidden after stop\");\n }\n\n try {\n adsManager?.stop?.();\n } catch {}\n\n destroyAdsManager();\n },\n destroy() {\n destroyAdsManager();\n\n adPlaying = false;\n showContentVideo();\n setAdPlayingFlag(false);\n\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\n adContainerEl.style.display = \"none\";\n }\n\n try {\n adsLoader?.destroy?.();\n } catch {}\n\n if (adContainerEl?.parentElement) {\n adContainerEl.parentElement.removeChild(adContainerEl);\n }\n\n adContainerEl = undefined;\n adDisplayContainer = undefined;\n adsLoader = undefined;\n adVideoElement = undefined;\n contentVideoHidden = false;\n preloadedVast.clear();\n preloadingVast.clear();\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 console.log(\n `[IMA] 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: 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 console.log(\n `[IMA] Set dedicated ad video volume to ${clampedVolume}, muted: ${\n clampedVolume === 0\n }`\n );\n }\n\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(clampedVolume);\n } catch (error) {\n console.warn(\"[IMA] Failed to set IMA manager volume:\", error);\n }\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 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 };\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}\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\n if (/Web0S|webOS/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\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 }\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 }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n }\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n isLegacyTV = true;\n recommendedAdPlayer = 'hls';\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\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 };\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 userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n adPlayerType?: 'ima' | 'hls';\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: any = {};\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"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../src/sdk/ima.ts","../../src/utils/browserCompat.ts"],"sourcesContent":["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 const preloadedVast = new Map<string, string>();\n const preloadingVast = new Map<string, Promise<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 console.log(\"[IMA] Content video hidden and muted\");\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 console.log(\n `[IMA] Content video restored (muted: ${originalMutedState}, volume: ${originalVolume})`\n );\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 adVideo.muted = false;\n adVideo.volume = originalMutedState ? 0 : originalVolume;\n\n adVideo.style.opacity = \"0\";\n adVideo.addEventListener(\n \"canplay\",\n () => {\n adVideo.style.opacity = \"1\";\n console.log(\"[IMA] Ad video ready to play\");\n },\n { once: true }\n );\n\n console.log(\n `[IMA] Created dedicated ad video element with volume: ${adVideo.volume}, muted: ${adVideo.muted}`\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 retryAttempts = 0;\n const maxRetries = 2;\n const backoffBaseMs = 500;\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 const preloadedResponse = preloadedVast.get(vastTagUrl);\n\n if (preloadedResponse) {\n adsRequest.adsResponse = preloadedResponse;\n console.log(\n \"[IMA] Using preloaded VAST response for immediate ad request\"\n );\n } else {\n adsRequest.adTagUrl = vastTagUrl;\n }\n\n const videoWidth = video.offsetWidth || video.clientWidth || 640;\n const videoHeight = video.offsetHeight || video.clientHeight || 360;\n\n adsRequest.linearAdSlotWidth = videoWidth;\n adsRequest.linearAdSlotHeight = videoHeight;\n adsRequest.nonLinearAdSlotWidth = videoWidth;\n adsRequest.nonLinearAdSlotHeight = videoHeight;\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 = 5000;\n\n console.log(`[IMA] Ads request dimensions: ${videoWidth}x${videoHeight}`);\n\n adsLoader.requestAds(adsRequest);\n\n if (preloadedResponse) {\n preloadedVast.delete(vastTagUrl);\n }\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 = \"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 video.parentElement?.appendChild(container);\n adContainerEl = container;\n }\n\n async function fetchVastDocument(vastTagUrl: string): Promise<string> {\n const response = await fetch(vastTagUrl, { mode: \"cors\" });\n if (!response.ok) {\n throw new Error(`Failed to preload VAST: ${response.status}`);\n }\n return response.text();\n }\n\n function destroyAdsManager() {\n if (adsManager) {\n try {\n console.log(\"[IMA] Destroying existing ads manager\");\n adsManager.destroy();\n } catch (error) {\n console.warn(\"[IMA] Error destroying ads manager:\", error);\n }\n adsManager = undefined;\n }\n\n if (adVideoElement) {\n adVideoElement.style.opacity = \"0\";\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 console.log(\n \"[IMA] Dedicated ad video element added to container\"\n );\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n adContainerEl,\n adVideoElement\n );\n try {\n adDisplayContainer.initialize?.();\n console.log(\n \"[IMA] AdDisplayContainer initialized with dedicated ad video\"\n );\n } catch {}\n }\n })\n .catch(() => {});\n },\n async requestAds(vastTagUrl: string) {\n console.log(\"[IMA] Requesting ads:\", vastTagUrl);\n\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n const error = new Error(\"VAST tag URL is empty or undefined\");\n console.warn(\"[IMA]\", error.message);\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 console.warn(\"[IMA]\", error.message);\n return Promise.reject(error);\n }\n\n if (adPlaying) {\n console.warn(\n \"[IMA] Cannot request new ads while an ad is playing. Call stop() first.\"\n );\n return Promise.reject(\n new Error(\"Ad already playing - cannot request new ads\")\n );\n }\n\n destroyAdsManager();\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 retryAttempts = 0;\n\n if (!adDisplayContainer) {\n console.log(\"[IMA] Creating ad display container\");\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 console.log(\n \"[IMA] Dedicated ad video element created and added to container\"\n );\n }\n\n adDisplayContainer = new google.ima.AdDisplayContainer(\n container,\n adVideoElement\n );\n\n try {\n adDisplayContainer.initialize();\n console.log(\n \"[IMA] Ad display container initialized with dedicated ad video\"\n );\n } catch (error) {\n console.warn(\n \"[IMA] Failed to initialize ad display container:\",\n error\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 console.warn(\"[IMA]\", error.message);\n currentReject?.(error);\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n return Promise.reject(error);\n }\n\n if (!adsLoader) {\n console.log(\"[IMA] Creating ads loader\");\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 console.log(\n \"[IMA] Ads manager loaded - enabling preloading for continuous playback\"\n );\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 console.error(\"[IMA] Ad error:\", errorEvent.getError());\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 console.log(\"[IMA] Ad container hidden after error\");\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 if (lastAdTagUrl && retryAttempts < maxRetries) {\n const delay =\n backoffBaseMs * Math.pow(2, retryAttempts++);\n console.log(\n `[IMA] Retrying ad request in ${delay}ms (attempt ${retryAttempts})`\n );\n window.setTimeout(() => {\n try {\n makeAdsRequest(google, lastAdTagUrl!);\n } catch {}\n }, delay);\n } else {\n console.log(\n \"[IMA] Max retries reached, emitting ad_error\"\n );\n emit(\"ad_error\");\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\n \"[IMA] Resuming paused video after ad error\"\n );\n video.play()?.catch(() => {});\n }\n }\n }\n }\n );\n\n adsManager.addEventListener(\n AdEvent.CONTENT_PAUSE_REQUESTED,\n () => {\n console.log(\"[IMA] Content pause requested\");\n\n if (!options?.continueLiveStreamDuringAds) {\n video.pause();\n console.log(\"[IMA] Content video paused (VOD mode)\");\n } else {\n console.log(\n \"[IMA] Content video continues in background (Live mode)\"\n );\n }\n\n hideContentVideo();\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 console.log(\"[IMA] Ad container shown on content pause\");\n }\n\n adPlaying = true;\n setAdPlayingFlag(true);\n emit(\"content_pause\");\n }\n );\n\n adsManager.addEventListener(AdEvent.STARTED, () => {\n console.log(\"[IMA] Ad started - showing ad video\");\n setAdPlayingFlag(true);\n\n hideContentVideo();\n\n if (adVideoElement) {\n adVideoElement.volume = originalMutedState\n ? 0\n : originalVolume;\n adVideoElement.muted = originalMutedState;\n console.log(\n `[IMA] Ad video volume: ${adVideoElement.volume}, muted: ${adVideoElement.muted}`\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 console.log(\"[IMA] Ad container now visible\");\n }\n });\n\n adsManager.addEventListener(\n AdEvent.CONTENT_RESUME_REQUESTED,\n () => {\n console.log(\"[IMA] Content resume requested\");\n adPlaying = false;\n setAdPlayingFlag(false);\n emit(\"content_resume\");\n }\n );\n\n adsManager.addEventListener(AdEvent.ALL_ADS_COMPLETED, () => {\n console.log(\"[IMA] All ads completed - restoring content\");\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 console.log(\"[IMA] Ad container hidden\");\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (!options?.continueLiveStreamDuringAds && video.paused) {\n console.log(\"[IMA] Resuming content video playback\");\n video.play().catch((e) => {\n console.warn(\"[IMA] Failed to resume content video:\", e);\n });\n }\n\n emit(\"all_ads_completed\");\n });\n\n console.log(\"[IMA] Ads manager event listeners attached\");\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 console.log(\n \"[IMA] Ad container hidden after setup error\"\n );\n }\n }, 300);\n }\n showContentVideo();\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\n \"[IMA] Resuming paused video after setup error\"\n );\n video.play().catch(() => {});\n }\n }\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 console.error(\"[IMA] Ads loader error:\", adErrorEvent.getError());\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 console.log(\"[IMA] Ad container hidden after loader error\");\n }\n }, 300);\n }\n\n showContentVideo();\n\n if (!options?.continueLiveStreamDuringAds) {\n if (video.paused) {\n console.log(\"[IMA] Resuming paused video after loader error\");\n video.play().catch(() => {});\n }\n }\n\n if (adsLoadedReject) {\n adsLoadedReject(new Error(\"Ads loader error\"));\n adsLoadedReject = undefined;\n adsLoadedResolve = undefined;\n }\n emit(\"ad_error\");\n },\n false\n );\n }\n\n console.log(\"[IMA] Making ads request\");\n makeAdsRequest(google, vastTagUrl);\n\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 preloadAds(vastTagUrl: string) {\n if (!vastTagUrl || vastTagUrl.trim() === \"\") {\n return Promise.resolve();\n }\n\n if (preloadedVast.has(vastTagUrl)) {\n return Promise.resolve();\n }\n\n const inflight = preloadingVast.get(vastTagUrl);\n if (inflight) {\n return inflight;\n }\n\n const preloadPromise = fetchVastDocument(vastTagUrl)\n .then((xml) => {\n preloadedVast.set(vastTagUrl, xml);\n console.log(\"[IMA] Cached VAST response for preloading:\", vastTagUrl);\n })\n .catch((error) => {\n console.warn(\"[IMA] Failed to preload VAST response:\", error);\n preloadedVast.delete(vastTagUrl);\n })\n .finally(() => {\n preloadingVast.delete(vastTagUrl);\n });\n\n preloadingVast.set(vastTagUrl, preloadPromise);\n return preloadPromise;\n },\n hasPreloadedAd(vastTagUrl: string) {\n return preloadedVast.has(vastTagUrl);\n },\n async play() {\n if (!window.google?.ima || !adDisplayContainer) {\n console.warn(\n \"[IMA] Cannot play ad: IMA SDK or ad container not available\"\n );\n return Promise.reject(new Error(\"IMA SDK not available\"));\n }\n\n if (!adsManager) {\n console.warn(\"[IMA] Cannot play ad: No ads manager available\");\n return Promise.reject(new Error(\"No ads manager\"));\n }\n\n try {\n const width = video.clientWidth || 640;\n const height = video.clientHeight || 360;\n\n console.log(`[IMA] Initializing ads manager (${width}x${height})`);\n adsManager.init(width, height, window.google.ima.ViewMode.NORMAL);\n\n adPlaying = true;\n\n const adVolume = originalMutedState ? 0 : originalVolume;\n if (adVideoElement) {\n adVideoElement.volume = adVolume;\n adVideoElement.muted = originalMutedState;\n console.log(\n `[IMA] Set dedicated ad video volume to ${adVolume}, muted: ${originalMutedState}`\n );\n }\n\n try {\n adsManager.setVolume(adVolume);\n console.log(`[IMA] Set IMA manager volume to ${adVolume}`);\n } catch (error) {\n console.warn(\"[IMA] Failed to set IMA manager volume:\", error);\n }\n\n console.log(\"[IMA] Starting ad playback\");\n adsManager.start();\n\n return Promise.resolve();\n } catch (error) {\n console.error(\"[IMA] Error starting ad playback:\", 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 async stop() {\n console.log(\"[IMA] Stopping ad playback\");\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 console.log(\"[IMA] Ad container hidden after stop\");\n }\n }, 300);\n }\n\n showContentVideo();\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.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.pointerEvents = \"none\";\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 }, 300);\n }\n\n showContentVideo();\n\n try {\n adsLoader?.destroy?.();\n } catch {}\n\n adDisplayContainer = undefined;\n adsLoader = undefined;\n contentVideoHidden = false;\n preloadedVast.clear();\n preloadingVast.clear();\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 console.log(\n `[IMA] 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: 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 console.log(\n `[IMA] Set dedicated ad video volume to ${clampedVolume}, muted: ${\n clampedVolume === 0\n }`\n );\n }\n\n if (adsManager && adPlaying) {\n try {\n adsManager.setVolume(clampedVolume);\n } catch (error) {\n console.warn(\"[IMA] Failed to set IMA manager volume:\", error);\n }\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 if (adContainerEl) {\n adContainerEl.style.display = \"flex\";\n adContainerEl.style.backgroundColor = \"#000\";\n // Force reflow\n adContainerEl.offsetHeight;\n adContainerEl.style.opacity = \"1\";\n adContainerEl.style.pointerEvents = \"auto\";\n }\n },\n hidePlaceholder() {\n if (adContainerEl) {\n adContainerEl.style.opacity = \"0\";\n adContainerEl.style.backgroundColor = \"transparent\";\n setTimeout(() => {\n if (adContainerEl) {\n adContainerEl.style.display = \"none\";\n adContainerEl.style.pointerEvents = \"none\";\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}\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\n if (/Web0S|webOS/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n const match = ua.match(/Web0S[/\\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 }\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 }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n }\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n\n if (chromeVersion > 0) {\n if (!isSmartTV) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n }\n\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n isLegacyTV = true;\n recommendedAdPlayer = 'hls';\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (isSmartTV) {\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\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 };\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 userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n adPlayerType?: 'ima' | 'hls';\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: any = {};\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"],"mappings":"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","names":[]}
|