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/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, _xmlDoc_querySelector_textContent, _xmlDoc_querySelector2;
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 null;
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 null;
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 = ((_xmlDoc_querySelector1 = xmlDoc.querySelector("Duration")) === null || _xmlDoc_querySelector1 === void 0 ? void 0 : _xmlDoc_querySelector1.textContent) || "00:00:30";
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 null;
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
- id: adId,
627
- title: title,
628
- duration: duration,
629
- mediaFiles: mediaFiles,
630
- trackingUrls: trackingUrls,
631
- clickThrough: clickThrough
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 null;
674
+ return {
675
+ type: "empty"
676
+ };
636
677
  }
637
678
  }
638
- function fetchAndParseVastAd(vastTagUrl) {
679
+ function fetchVastXml(vastTagUrl) {
639
680
  return _async_to_generator(function() {
640
- var response, vastXml;
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
- 4,
702
+ 2,
662
703
  response.text()
663
704
  ];
664
- case 2:
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
- parseVastXml(vastXml)
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
- var timestamp = baseTimestamp + i;
4863
- var random = Math.floor(Math.random() * 1e12);
4864
- var uniqueCorrelator = "".concat(timestamp, "_").concat(random, "_").concat(i);
4865
- var urlWithCorrelator = void 0;
4866
- var correlatorRegex = /([?&])correlator=([^&]*)/;
4867
- if (correlatorRegex.test(baseUrl)) {
4868
- urlWithCorrelator = baseUrl.replace(correlatorRegex, "$1correlator=".concat(uniqueCorrelator));
4869
- } else if (baseUrl.includes("?")) {
4870
- urlWithCorrelator = "".concat(baseUrl, "&correlator=").concat(uniqueCorrelator);
4871
- } else {
4872
- urlWithCorrelator = "".concat(baseUrl, "?correlator=").concat(uniqueCorrelator);
4873
- }
4874
- urls.push(this.palNonce.injectNonce(urlWithCorrelator));
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);