stormcloud-video-player 0.8.4 → 0.8.6
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 +330 -65
- package/lib/index.cjs.map +1 -1
- package/lib/index.d.cts +10 -0
- package/lib/index.d.ts +10 -0
- package/lib/index.js +330 -65
- package/lib/index.js.map +1 -1
- package/lib/player/StormcloudVideoPlayer.cjs +331 -66
- package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/player/StormcloudVideoPlayer.d.cts +7 -1
- package/lib/players/HlsPlayer.cjs +330 -65
- package/lib/players/HlsPlayer.cjs.map +1 -1
- package/lib/players/HlsPlayer.d.cts +1 -1
- package/lib/players/index.cjs +330 -65
- package/lib/players/index.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.cjs +131 -52
- package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
- package/lib/sdk/hlsAdPlayer.d.cts +1 -1
- package/lib/{types-BmF_60m2.d.cts → types-CUKMIqHL.d.cts} +4 -0
- package/lib/ui/StormcloudVideoPlayer.cjs +331 -66
- package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
- package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
- package/lib/utils/tracking.d.cts +1 -1
- package/lib/utils/vastMacros.cjs +231 -0
- package/lib/utils/vastMacros.cjs.map +1 -0
- package/lib/utils/vastMacros.d.cts +24 -0
- package/package.json +1 -1
package/lib/index.d.cts
CHANGED
|
@@ -38,6 +38,10 @@ interface StormcloudVideoPlayerConfig {
|
|
|
38
38
|
vmapUrl?: string;
|
|
39
39
|
vastMode?: 'adstorm' | 'default';
|
|
40
40
|
minSegmentsBeforePlay?: number;
|
|
41
|
+
deviceId?: string;
|
|
42
|
+
deviceIdType?: string;
|
|
43
|
+
limitAdTracking?: boolean;
|
|
44
|
+
adTest?: boolean;
|
|
41
45
|
}
|
|
42
46
|
interface AdController {
|
|
43
47
|
initialize: () => void;
|
|
@@ -215,6 +219,11 @@ declare class StormcloudVideoPlayer {
|
|
|
215
219
|
private adDetectSentForCurrentBreak;
|
|
216
220
|
private palNonce;
|
|
217
221
|
private palPlaybackStarted;
|
|
222
|
+
private readonly streamCorrelator;
|
|
223
|
+
private consentSignals;
|
|
224
|
+
private podCounter;
|
|
225
|
+
private podAssignedByPrefetch;
|
|
226
|
+
private adRequestPositionInBreak;
|
|
218
227
|
constructor(config: StormcloudVideoPlayerConfig);
|
|
219
228
|
private createAdPlayer;
|
|
220
229
|
load(): Promise<void>;
|
|
@@ -278,6 +287,7 @@ declare class StormcloudVideoPlayer {
|
|
|
278
287
|
getCurrentAdIndex(): number;
|
|
279
288
|
getTotalAdsInBreak(): number;
|
|
280
289
|
getAdRemainingMs(): number;
|
|
290
|
+
private beginNewAdPod;
|
|
281
291
|
private generateVastUrlsWithCorrelators;
|
|
282
292
|
isAdPlaying(): boolean;
|
|
283
293
|
isShowingAds(): boolean;
|
package/lib/index.d.ts
CHANGED
|
@@ -38,6 +38,10 @@ interface StormcloudVideoPlayerConfig {
|
|
|
38
38
|
vmapUrl?: string;
|
|
39
39
|
vastMode?: 'adstorm' | 'default';
|
|
40
40
|
minSegmentsBeforePlay?: number;
|
|
41
|
+
deviceId?: string;
|
|
42
|
+
deviceIdType?: string;
|
|
43
|
+
limitAdTracking?: boolean;
|
|
44
|
+
adTest?: boolean;
|
|
41
45
|
}
|
|
42
46
|
interface AdController {
|
|
43
47
|
initialize: () => void;
|
|
@@ -215,6 +219,11 @@ declare class StormcloudVideoPlayer {
|
|
|
215
219
|
private adDetectSentForCurrentBreak;
|
|
216
220
|
private palNonce;
|
|
217
221
|
private palPlaybackStarted;
|
|
222
|
+
private readonly streamCorrelator;
|
|
223
|
+
private consentSignals;
|
|
224
|
+
private podCounter;
|
|
225
|
+
private podAssignedByPrefetch;
|
|
226
|
+
private adRequestPositionInBreak;
|
|
218
227
|
constructor(config: StormcloudVideoPlayerConfig);
|
|
219
228
|
private createAdPlayer;
|
|
220
229
|
load(): Promise<void>;
|
|
@@ -278,6 +287,7 @@ declare class StormcloudVideoPlayer {
|
|
|
278
287
|
getCurrentAdIndex(): number;
|
|
279
288
|
getTotalAdsInBreak(): number;
|
|
280
289
|
getAdRemainingMs(): number;
|
|
290
|
+
private beginNewAdPod;
|
|
281
291
|
private generateVastUrlsWithCorrelators;
|
|
282
292
|
isAdPlaying(): boolean;
|
|
283
293
|
isShowingAds(): boolean;
|
package/lib/index.js
CHANGED
|
@@ -372,6 +372,7 @@ import React, { useEffect, useRef, useMemo, useCallback } from "react";
|
|
|
372
372
|
import Hls2 from "hls.js";
|
|
373
373
|
// src/sdk/hlsAdPlayer.ts
|
|
374
374
|
import Hls from "hls.js";
|
|
375
|
+
var MAX_VAST_WRAPPER_DEPTH = 5;
|
|
375
376
|
function createHlsAdPlayer(contentVideo, options) {
|
|
376
377
|
var adPlaying = false;
|
|
377
378
|
var originalMutedState = false;
|
|
@@ -529,25 +530,91 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
529
530
|
var url = mediaFile.url.toLowerCase();
|
|
530
531
|
return type.startsWith("video/") || url.endsWith(".mp4") || url.includes(".mp4?");
|
|
531
532
|
}
|
|
533
|
+
function createEmptyTrackingUrls() {
|
|
534
|
+
return {
|
|
535
|
+
impression: [],
|
|
536
|
+
start: [],
|
|
537
|
+
firstQuartile: [],
|
|
538
|
+
midpoint: [],
|
|
539
|
+
thirdQuartile: [],
|
|
540
|
+
complete: [],
|
|
541
|
+
mute: [],
|
|
542
|
+
unmute: [],
|
|
543
|
+
pause: [],
|
|
544
|
+
resume: [],
|
|
545
|
+
fullscreen: [],
|
|
546
|
+
exitFullscreen: [],
|
|
547
|
+
skip: [],
|
|
548
|
+
error: []
|
|
549
|
+
};
|
|
550
|
+
}
|
|
551
|
+
function extractTrackingUrls(xmlDoc) {
|
|
552
|
+
var trackingUrls = createEmptyTrackingUrls();
|
|
553
|
+
xmlDoc.querySelectorAll("Impression").forEach(function(el) {
|
|
554
|
+
var _el_textContent;
|
|
555
|
+
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
556
|
+
if (url) trackingUrls.impression.push(url);
|
|
557
|
+
});
|
|
558
|
+
xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
|
|
559
|
+
var _el_textContent;
|
|
560
|
+
var event = el.getAttribute("event");
|
|
561
|
+
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
562
|
+
if (event && url) {
|
|
563
|
+
var eventKey = event;
|
|
564
|
+
if (trackingUrls[eventKey]) {
|
|
565
|
+
trackingUrls[eventKey].push(url);
|
|
566
|
+
}
|
|
567
|
+
}
|
|
568
|
+
});
|
|
569
|
+
xmlDoc.querySelectorAll("Error").forEach(function(el) {
|
|
570
|
+
var _el_textContent;
|
|
571
|
+
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
572
|
+
if (url) trackingUrls.error.push(url);
|
|
573
|
+
});
|
|
574
|
+
return trackingUrls;
|
|
575
|
+
}
|
|
576
|
+
function mergeTrackingUrls(target, source) {
|
|
577
|
+
Object.keys(target).forEach(function(key) {
|
|
578
|
+
if (source[key] && source[key].length > 0) {
|
|
579
|
+
target[key] = target[key].concat(source[key]);
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
return target;
|
|
583
|
+
}
|
|
532
584
|
function parseVastXml(xmlString) {
|
|
533
585
|
try {
|
|
534
|
-
var _xmlDoc_querySelector, _xmlDoc_querySelector1,
|
|
586
|
+
var _xmlDoc_querySelector, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector1, _xmlDoc_querySelector_textContent1, _xmlDoc_querySelector2, _xmlDoc_querySelector3;
|
|
535
587
|
var parser = new DOMParser();
|
|
536
588
|
var xmlDoc = parser.parseFromString(xmlString, "text/xml");
|
|
537
589
|
var parserError = xmlDoc.querySelector("parsererror");
|
|
538
590
|
if (parserError) {
|
|
539
591
|
console.error("[HlsAdPlayer] XML parsing error (malformed VAST XML):", parserError.textContent);
|
|
540
|
-
return
|
|
592
|
+
return {
|
|
593
|
+
type: "empty"
|
|
594
|
+
};
|
|
541
595
|
}
|
|
542
596
|
var adElement = xmlDoc.querySelector("Ad");
|
|
543
597
|
if (!adElement) {
|
|
544
598
|
console.warn("[HlsAdPlayer] No Ad element found in VAST XML");
|
|
545
|
-
return
|
|
599
|
+
return {
|
|
600
|
+
type: "empty"
|
|
601
|
+
};
|
|
546
602
|
}
|
|
547
603
|
var adId = adElement.getAttribute("id") || "unknown";
|
|
548
604
|
var title = ((_xmlDoc_querySelector = xmlDoc.querySelector("AdTitle")) === null || _xmlDoc_querySelector === void 0 ? void 0 : _xmlDoc_querySelector.textContent) || "Ad";
|
|
605
|
+
var clickThrough = (_xmlDoc_querySelector1 = xmlDoc.querySelector("ClickThrough")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent = _xmlDoc_querySelector1.textContent) === null || _xmlDoc_querySelector_textContent === void 0 ? void 0 : _xmlDoc_querySelector_textContent.trim();
|
|
606
|
+
var wrapperUri = (_xmlDoc_querySelector2 = xmlDoc.querySelector("VASTAdTagURI")) === null || _xmlDoc_querySelector2 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent1 = _xmlDoc_querySelector2.textContent) === null || _xmlDoc_querySelector_textContent1 === void 0 ? void 0 : _xmlDoc_querySelector_textContent1.trim();
|
|
607
|
+
if (wrapperUri) {
|
|
608
|
+
console.log("[HlsAdPlayer] VAST wrapper detected, following VASTAdTagURI: ".concat(wrapperUri));
|
|
609
|
+
return {
|
|
610
|
+
type: "wrapper",
|
|
611
|
+
vastAdTagUri: wrapperUri,
|
|
612
|
+
trackingUrls: extractTrackingUrls(xmlDoc),
|
|
613
|
+
clickThrough: clickThrough
|
|
614
|
+
};
|
|
615
|
+
}
|
|
549
616
|
var isNoAdAvailable = adId === "empty" || title.toLowerCase().includes("no ad available") || title.toLowerCase() === "no ad available";
|
|
550
|
-
var durationText = ((
|
|
617
|
+
var durationText = ((_xmlDoc_querySelector3 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector3 === void 0 ? void 0 : _xmlDoc_querySelector3.textContent) || "00:00:30";
|
|
551
618
|
var durationParts = durationText.split(":");
|
|
552
619
|
var duration = parseInt(durationParts[0] || "0", 10) * 3600 + parseInt(durationParts[1] || "0", 10) * 60 + parseInt(durationParts[2] || "0", 10);
|
|
553
620
|
var mediaFileElements = xmlDoc.querySelectorAll("MediaFile");
|
|
@@ -587,57 +654,31 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
587
654
|
} else {
|
|
588
655
|
console.warn("[HlsAdPlayer] No supported media files found in VAST XML");
|
|
589
656
|
}
|
|
590
|
-
return
|
|
657
|
+
return {
|
|
658
|
+
type: "empty"
|
|
659
|
+
};
|
|
591
660
|
}
|
|
592
|
-
var trackingUrls = {
|
|
593
|
-
impression: [],
|
|
594
|
-
start: [],
|
|
595
|
-
firstQuartile: [],
|
|
596
|
-
midpoint: [],
|
|
597
|
-
thirdQuartile: [],
|
|
598
|
-
complete: [],
|
|
599
|
-
mute: [],
|
|
600
|
-
unmute: [],
|
|
601
|
-
pause: [],
|
|
602
|
-
resume: [],
|
|
603
|
-
fullscreen: [],
|
|
604
|
-
exitFullscreen: [],
|
|
605
|
-
skip: [],
|
|
606
|
-
error: []
|
|
607
|
-
};
|
|
608
|
-
xmlDoc.querySelectorAll("Impression").forEach(function(el) {
|
|
609
|
-
var _el_textContent;
|
|
610
|
-
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
611
|
-
if (url) trackingUrls.impression.push(url);
|
|
612
|
-
});
|
|
613
|
-
xmlDoc.querySelectorAll("Tracking").forEach(function(el) {
|
|
614
|
-
var _el_textContent;
|
|
615
|
-
var event = el.getAttribute("event");
|
|
616
|
-
var url = (_el_textContent = el.textContent) === null || _el_textContent === void 0 ? void 0 : _el_textContent.trim();
|
|
617
|
-
if (event && url) {
|
|
618
|
-
var eventKey = event;
|
|
619
|
-
if (trackingUrls[eventKey]) {
|
|
620
|
-
trackingUrls[eventKey].push(url);
|
|
621
|
-
}
|
|
622
|
-
}
|
|
623
|
-
});
|
|
624
|
-
var clickThrough = (_xmlDoc_querySelector2 = xmlDoc.querySelector("ClickThrough")) === null || _xmlDoc_querySelector2 === void 0 ? void 0 : (_xmlDoc_querySelector_textContent = _xmlDoc_querySelector2.textContent) === null || _xmlDoc_querySelector_textContent === void 0 ? void 0 : _xmlDoc_querySelector_textContent.trim();
|
|
625
661
|
return {
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
662
|
+
type: "inline",
|
|
663
|
+
ad: {
|
|
664
|
+
id: adId,
|
|
665
|
+
title: title,
|
|
666
|
+
duration: duration,
|
|
667
|
+
mediaFiles: mediaFiles,
|
|
668
|
+
trackingUrls: extractTrackingUrls(xmlDoc),
|
|
669
|
+
clickThrough: clickThrough
|
|
670
|
+
}
|
|
632
671
|
};
|
|
633
672
|
} catch (error) {
|
|
634
673
|
console.error("[HlsAdPlayer] Error parsing VAST XML:", error);
|
|
635
|
-
return
|
|
674
|
+
return {
|
|
675
|
+
type: "empty"
|
|
676
|
+
};
|
|
636
677
|
}
|
|
637
678
|
}
|
|
638
|
-
function
|
|
679
|
+
function fetchVastXml(vastTagUrl) {
|
|
639
680
|
return _async_to_generator(function() {
|
|
640
|
-
var response
|
|
681
|
+
var response;
|
|
641
682
|
return _ts_generator(this, function(_state) {
|
|
642
683
|
switch(_state.label){
|
|
643
684
|
case 0:
|
|
@@ -658,20 +699,58 @@ function createHlsAdPlayer(contentVideo, options) {
|
|
|
658
699
|
throw new Error("Failed to fetch VAST: ".concat(response.statusText));
|
|
659
700
|
}
|
|
660
701
|
return [
|
|
661
|
-
|
|
702
|
+
2,
|
|
662
703
|
response.text()
|
|
663
704
|
];
|
|
664
|
-
|
|
705
|
+
}
|
|
706
|
+
});
|
|
707
|
+
})();
|
|
708
|
+
}
|
|
709
|
+
function fetchAndParseVastAd(_0) {
|
|
710
|
+
return _async_to_generator(function(vastTagUrl) {
|
|
711
|
+
var depth, accumulatedTracking, vastXml, parsed;
|
|
712
|
+
var _arguments = arguments;
|
|
713
|
+
return _ts_generator(this, function(_state) {
|
|
714
|
+
switch(_state.label){
|
|
715
|
+
case 0:
|
|
716
|
+
depth = _arguments.length > 1 && _arguments[1] !== void 0 ? _arguments[1] : 0, accumulatedTracking = _arguments.length > 2 && _arguments[2] !== void 0 ? _arguments[2] : createEmptyTrackingUrls();
|
|
717
|
+
return [
|
|
718
|
+
4,
|
|
719
|
+
fetchVastXml(vastTagUrl)
|
|
720
|
+
];
|
|
721
|
+
case 1:
|
|
665
722
|
vastXml = _state.sent();
|
|
666
723
|
console.log("[HlsAdPlayer] VAST XML received");
|
|
667
724
|
console.log("[HlsAdPlayer] VAST XML content (first 2000 chars):", vastXml.substring(0, 2e3));
|
|
725
|
+
parsed = parseVastXml(vastXml);
|
|
726
|
+
if (parsed.type === "empty") {
|
|
727
|
+
return [
|
|
728
|
+
2,
|
|
729
|
+
null
|
|
730
|
+
];
|
|
731
|
+
}
|
|
732
|
+
if (parsed.type === "wrapper") {
|
|
733
|
+
if (depth >= MAX_VAST_WRAPPER_DEPTH) {
|
|
734
|
+
console.warn("[HlsAdPlayer] VAST wrapper depth limit (".concat(MAX_VAST_WRAPPER_DEPTH, ") reached, aborting redirect chain"));
|
|
735
|
+
return [
|
|
736
|
+
2,
|
|
737
|
+
null
|
|
738
|
+
];
|
|
739
|
+
}
|
|
740
|
+
mergeTrackingUrls(accumulatedTracking, parsed.trackingUrls);
|
|
741
|
+
return [
|
|
742
|
+
2,
|
|
743
|
+
fetchAndParseVastAd(parsed.vastAdTagUri, depth + 1, accumulatedTracking)
|
|
744
|
+
];
|
|
745
|
+
}
|
|
746
|
+
mergeTrackingUrls(parsed.ad.trackingUrls, accumulatedTracking);
|
|
668
747
|
return [
|
|
669
748
|
2,
|
|
670
|
-
|
|
749
|
+
parsed.ad
|
|
671
750
|
];
|
|
672
751
|
}
|
|
673
752
|
});
|
|
674
|
-
})();
|
|
753
|
+
}).apply(this, arguments);
|
|
675
754
|
}
|
|
676
755
|
function createAdVideoElement() {
|
|
677
756
|
var video = document.createElement("video");
|
|
@@ -2236,6 +2315,166 @@ function initializePolyfills() {
|
|
|
2236
2315
|
polyfillTextEncoder();
|
|
2237
2316
|
polyfillPromiseFinally();
|
|
2238
2317
|
}
|
|
2318
|
+
// src/utils/vastMacros.ts
|
|
2319
|
+
function generateCorrelator() {
|
|
2320
|
+
if (typeof crypto !== "undefined" && crypto.getRandomValues) {
|
|
2321
|
+
try {
|
|
2322
|
+
var _buf_, _buf_1;
|
|
2323
|
+
var buf = new Uint32Array(2);
|
|
2324
|
+
crypto.getRandomValues(buf);
|
|
2325
|
+
var value = ((_buf_ = buf[0]) !== null && _buf_ !== void 0 ? _buf_ : 0) * 2097152 + (((_buf_1 = buf[1]) !== null && _buf_1 !== void 0 ? _buf_1 : 0) & 2097151);
|
|
2326
|
+
if (value > 0) {
|
|
2327
|
+
return String(value);
|
|
2328
|
+
}
|
|
2329
|
+
} catch (unused) {}
|
|
2330
|
+
}
|
|
2331
|
+
return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
|
|
2332
|
+
}
|
|
2333
|
+
var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
|
|
2334
|
+
function applyVastMacros(baseUrl, ctx) {
|
|
2335
|
+
var url;
|
|
2336
|
+
try {
|
|
2337
|
+
url = new URL(baseUrl);
|
|
2338
|
+
} catch (unused) {
|
|
2339
|
+
return replaceCorrelatorFallback(baseUrl, ctx.correlator);
|
|
2340
|
+
}
|
|
2341
|
+
var params = url.searchParams;
|
|
2342
|
+
params.set("correlator", ctx.correlator);
|
|
2343
|
+
params.set("scor", ctx.streamCorrelator);
|
|
2344
|
+
if (ctx.pod != null) {
|
|
2345
|
+
params.set("pod", String(ctx.pod));
|
|
2346
|
+
}
|
|
2347
|
+
if (ctx.adPosition != null) {
|
|
2348
|
+
params.set("ppos", String(ctx.adPosition));
|
|
2349
|
+
}
|
|
2350
|
+
if (ctx.pageUrl) {
|
|
2351
|
+
params.set("url", ctx.pageUrl);
|
|
2352
|
+
params.set("description_url", ctx.pageUrl);
|
|
2353
|
+
}
|
|
2354
|
+
if (ctx.adWillPlayMuted != null) {
|
|
2355
|
+
params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
|
|
2356
|
+
}
|
|
2357
|
+
if (ctx.adWillAutoPlay != null) {
|
|
2358
|
+
params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
|
|
2359
|
+
}
|
|
2360
|
+
if (ctx.deviceId && ctx.deviceIdType) {
|
|
2361
|
+
params.set("rdid", ctx.deviceId);
|
|
2362
|
+
params.set("idtype", ctx.deviceIdType);
|
|
2363
|
+
params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
|
|
2364
|
+
} else {
|
|
2365
|
+
params.delete("rdid");
|
|
2366
|
+
params.delete("idtype");
|
|
2367
|
+
params.delete("is_lat");
|
|
2368
|
+
}
|
|
2369
|
+
var consent = ctx.consent;
|
|
2370
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
|
|
2371
|
+
params.set("gdpr", consent.gdpr);
|
|
2372
|
+
}
|
|
2373
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
|
|
2374
|
+
params.set("gdpr_consent", consent.gdprConsent);
|
|
2375
|
+
}
|
|
2376
|
+
if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
|
|
2377
|
+
params.set("us_privacy", consent.usPrivacy);
|
|
2378
|
+
}
|
|
2379
|
+
if (ctx.adTest) {
|
|
2380
|
+
params.set("adtest", "on");
|
|
2381
|
+
}
|
|
2382
|
+
var staleKeys = [];
|
|
2383
|
+
params.forEach(function(value, key) {
|
|
2384
|
+
if (UNEXPANDED_MACRO_PATTERN.test(value)) {
|
|
2385
|
+
staleKeys.push(key);
|
|
2386
|
+
}
|
|
2387
|
+
});
|
|
2388
|
+
var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
|
|
2389
|
+
try {
|
|
2390
|
+
for(var _iterator = staleKeys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
|
|
2391
|
+
var key = _step.value;
|
|
2392
|
+
params.delete(key);
|
|
2393
|
+
}
|
|
2394
|
+
} catch (err) {
|
|
2395
|
+
_didIteratorError = true;
|
|
2396
|
+
_iteratorError = err;
|
|
2397
|
+
} finally{
|
|
2398
|
+
try {
|
|
2399
|
+
if (!_iteratorNormalCompletion && _iterator.return != null) {
|
|
2400
|
+
_iterator.return();
|
|
2401
|
+
}
|
|
2402
|
+
} finally{
|
|
2403
|
+
if (_didIteratorError) {
|
|
2404
|
+
throw _iteratorError;
|
|
2405
|
+
}
|
|
2406
|
+
}
|
|
2407
|
+
}
|
|
2408
|
+
return url.toString();
|
|
2409
|
+
}
|
|
2410
|
+
function replaceCorrelatorFallback(baseUrl, correlator) {
|
|
2411
|
+
var correlatorRegex = /([?&])correlator=([^&]*)/;
|
|
2412
|
+
if (correlatorRegex.test(baseUrl)) {
|
|
2413
|
+
return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
|
|
2414
|
+
}
|
|
2415
|
+
var sep = baseUrl.includes("?") ? "&" : "?";
|
|
2416
|
+
return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
|
|
2417
|
+
}
|
|
2418
|
+
function fetchConsentSignals() {
|
|
2419
|
+
var timeoutMs = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : 1500;
|
|
2420
|
+
var signals = {};
|
|
2421
|
+
if (typeof window === "undefined") {
|
|
2422
|
+
return Promise.resolve(signals);
|
|
2423
|
+
}
|
|
2424
|
+
var tasks = [];
|
|
2425
|
+
var tcfApi = window.__tcfapi;
|
|
2426
|
+
if (typeof tcfApi === "function") {
|
|
2427
|
+
tasks.push(new Promise(function(resolve) {
|
|
2428
|
+
var settled = false;
|
|
2429
|
+
try {
|
|
2430
|
+
tcfApi("addEventListener", 2, function(tcData, success) {
|
|
2431
|
+
if (settled) return;
|
|
2432
|
+
if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
|
|
2433
|
+
settled = true;
|
|
2434
|
+
signals.gdpr = tcData.gdprApplies ? "1" : "0";
|
|
2435
|
+
if (typeof tcData.tcString === "string" && tcData.tcString) {
|
|
2436
|
+
signals.gdprConsent = tcData.tcString;
|
|
2437
|
+
}
|
|
2438
|
+
try {
|
|
2439
|
+
tcfApi("removeEventListener", 2, function() {}, tcData.listenerId);
|
|
2440
|
+
} catch (unused) {}
|
|
2441
|
+
resolve();
|
|
2442
|
+
}
|
|
2443
|
+
});
|
|
2444
|
+
} catch (unused) {
|
|
2445
|
+
resolve();
|
|
2446
|
+
}
|
|
2447
|
+
setTimeout(function() {
|
|
2448
|
+
if (!settled) {
|
|
2449
|
+
settled = true;
|
|
2450
|
+
resolve();
|
|
2451
|
+
}
|
|
2452
|
+
}, timeoutMs);
|
|
2453
|
+
}));
|
|
2454
|
+
}
|
|
2455
|
+
var uspApi = window.__uspapi;
|
|
2456
|
+
if (typeof uspApi === "function") {
|
|
2457
|
+
tasks.push(new Promise(function(resolve) {
|
|
2458
|
+
try {
|
|
2459
|
+
uspApi("getUSPData", 1, function(data, success) {
|
|
2460
|
+
if (success && typeof (data === null || data === void 0 ? void 0 : data.uspString) === "string" && data.uspString) {
|
|
2461
|
+
signals.usPrivacy = data.uspString;
|
|
2462
|
+
}
|
|
2463
|
+
resolve();
|
|
2464
|
+
});
|
|
2465
|
+
} catch (unused) {
|
|
2466
|
+
resolve();
|
|
2467
|
+
}
|
|
2468
|
+
setTimeout(resolve, timeoutMs);
|
|
2469
|
+
}));
|
|
2470
|
+
}
|
|
2471
|
+
if (tasks.length === 0) {
|
|
2472
|
+
return Promise.resolve(signals);
|
|
2473
|
+
}
|
|
2474
|
+
return Promise.all(tasks).then(function() {
|
|
2475
|
+
return signals;
|
|
2476
|
+
});
|
|
2477
|
+
}
|
|
2239
2478
|
// src/utils/browserCompat.ts
|
|
2240
2479
|
function getChromeVersion(ua) {
|
|
2241
2480
|
var match = ua.match(/Chrome\/(\d+)/);
|
|
@@ -2485,6 +2724,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
2485
2724
|
this.preloadPoolLoopRunning = false;
|
|
2486
2725
|
this.adDetectSentForCurrentBreak = false;
|
|
2487
2726
|
this.palPlaybackStarted = false;
|
|
2727
|
+
this.streamCorrelator = generateCorrelator();
|
|
2728
|
+
this.consentSignals = {};
|
|
2729
|
+
this.podCounter = 0;
|
|
2730
|
+
this.podAssignedByPrefetch = false;
|
|
2731
|
+
this.adRequestPositionInBreak = 0;
|
|
2488
2732
|
this.continuousFetchLoopRunning = false;
|
|
2489
2733
|
initializePolyfills();
|
|
2490
2734
|
var browserOverrides = getBrowserConfigOverrides();
|
|
@@ -2557,6 +2801,9 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
2557
2801
|
adWillPlayMuted: !!this.config.muted,
|
|
2558
2802
|
continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
|
|
2559
2803
|
}).catch(function() {});
|
|
2804
|
+
fetchConsentSignals().then(function(signals) {
|
|
2805
|
+
_this.consentSignals = signals;
|
|
2806
|
+
}).catch(function() {});
|
|
2560
2807
|
this.initializeTracking();
|
|
2561
2808
|
if (!this.shouldUseNativeHls()) return [
|
|
2562
2809
|
3,
|
|
@@ -4853,25 +5100,35 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4853
5100
|
return this.getRemainingAdMs();
|
|
4854
5101
|
}
|
|
4855
5102
|
},
|
|
5103
|
+
{
|
|
5104
|
+
key: "beginNewAdPod",
|
|
5105
|
+
value: function beginNewAdPod() {
|
|
5106
|
+
this.podCounter++;
|
|
5107
|
+
this.adRequestPositionInBreak = 0;
|
|
5108
|
+
}
|
|
5109
|
+
},
|
|
4856
5110
|
{
|
|
4857
5111
|
key: "generateVastUrlsWithCorrelators",
|
|
4858
5112
|
value: function generateVastUrlsWithCorrelators(baseUrl, count) {
|
|
4859
5113
|
var urls = [];
|
|
4860
|
-
var baseTimestamp = Date.now();
|
|
4861
5114
|
for(var i = 0; i < count; i++){
|
|
4862
|
-
|
|
4863
|
-
var
|
|
4864
|
-
var
|
|
4865
|
-
|
|
4866
|
-
|
|
4867
|
-
|
|
4868
|
-
|
|
4869
|
-
|
|
4870
|
-
|
|
4871
|
-
|
|
4872
|
-
|
|
4873
|
-
|
|
4874
|
-
|
|
5115
|
+
this.adRequestPositionInBreak++;
|
|
5116
|
+
var adWillPlayMuted = this.inAdBreak ? this.adPlayer.getOriginalMutedState() : this.video.muted;
|
|
5117
|
+
var urlWithMacros = applyVastMacros(baseUrl, {
|
|
5118
|
+
correlator: generateCorrelator(),
|
|
5119
|
+
streamCorrelator: this.streamCorrelator,
|
|
5120
|
+
pod: this.podCounter > 0 ? this.podCounter : void 0,
|
|
5121
|
+
adPosition: this.adRequestPositionInBreak,
|
|
5122
|
+
pageUrl: typeof window !== "undefined" ? window.location.href : void 0,
|
|
5123
|
+
adWillPlayMuted: adWillPlayMuted,
|
|
5124
|
+
adWillAutoPlay: !!this.config.autoplay,
|
|
5125
|
+
deviceId: this.config.deviceId,
|
|
5126
|
+
deviceIdType: this.config.deviceIdType,
|
|
5127
|
+
limitAdTracking: this.config.limitAdTracking,
|
|
5128
|
+
adTest: this.config.adTest,
|
|
5129
|
+
consent: this.consentSignals
|
|
5130
|
+
});
|
|
5131
|
+
urls.push(this.palNonce.injectNonce(urlWithMacros));
|
|
4875
5132
|
}
|
|
4876
5133
|
return urls;
|
|
4877
5134
|
}
|
|
@@ -4941,6 +5198,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4941
5198
|
}
|
|
4942
5199
|
return;
|
|
4943
5200
|
}
|
|
5201
|
+
this.beginNewAdPod();
|
|
5202
|
+
this.podAssignedByPrefetch = true;
|
|
4944
5203
|
var urlsToPregenerate = 5;
|
|
4945
5204
|
var generatedUrls = this.generateVastUrlsWithCorrelators(baseVastUrl, urlsToPregenerate);
|
|
4946
5205
|
this.pendingAdBreak = _object_spread_props(_object_spread({
|
|
@@ -4978,6 +5237,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
4978
5237
|
}
|
|
4979
5238
|
this.pendingAdBreak = null;
|
|
4980
5239
|
this.pendingScte35CueKey = void 0;
|
|
5240
|
+
this.podAssignedByPrefetch = false;
|
|
4981
5241
|
}
|
|
4982
5242
|
},
|
|
4983
5243
|
{
|
|
@@ -5414,6 +5674,11 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
|
|
|
5414
5674
|
this.continuousFetchingActive = true;
|
|
5415
5675
|
this.isShowingPlaceholder = false;
|
|
5416
5676
|
this.totalAdRequestsInBreak = 0;
|
|
5677
|
+
if (this.podAssignedByPrefetch) {
|
|
5678
|
+
this.podAssignedByPrefetch = false;
|
|
5679
|
+
} else {
|
|
5680
|
+
this.beginNewAdPod();
|
|
5681
|
+
}
|
|
5417
5682
|
currentMuted = this.video.muted;
|
|
5418
5683
|
currentVolume = this.video.volume;
|
|
5419
5684
|
this.adPlayer.updateOriginalMutedState(currentMuted, currentVolume);
|