stormcloud-video-player 0.8.18 → 0.8.19

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.
Files changed (34) hide show
  1. package/README.md +67 -83
  2. package/dist/stormcloud-vp.min.js +1 -1
  3. package/lib/index.cjs +635 -346
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +1 -1
  6. package/lib/index.d.ts +1 -1
  7. package/lib/index.js +635 -346
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/AdBreakOrchestrator.cjs +11 -11
  10. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  11. package/lib/player/AdBreakOrchestrator.d.cts +3 -3
  12. package/lib/player/{VmapManager.cjs → AdConfigManager.cjs} +503 -214
  13. package/lib/player/AdConfigManager.cjs.map +1 -0
  14. package/lib/player/{VmapManager.d.cts → AdConfigManager.d.cts} +2 -2
  15. package/lib/player/StormcloudVideoPlayer.cjs +635 -346
  16. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  17. package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
  18. package/lib/players/HlsPlayer.cjs +635 -346
  19. package/lib/players/HlsPlayer.cjs.map +1 -1
  20. package/lib/players/index.cjs +635 -346
  21. package/lib/players/index.cjs.map +1 -1
  22. package/lib/ui/StormcloudVideoPlayer.cjs +635 -346
  23. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  24. package/lib/utils/ctvVastSignals.cjs +92 -33
  25. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  26. package/lib/utils/ctvVastSignals.d.cts +1 -13
  27. package/lib/utils/vastEnvironmentSignals.cjs +439 -0
  28. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -0
  29. package/lib/utils/vastEnvironmentSignals.d.cts +16 -0
  30. package/lib/utils/vastMacros.cjs +299 -25
  31. package/lib/utils/vastMacros.cjs.map +1 -1
  32. package/lib/utils/vastMacros.d.cts +3 -1
  33. package/package.json +1 -1
  34. package/lib/player/VmapManager.cjs.map +0 -1
@@ -306,171 +306,15 @@ var __toCommonJS = function __toCommonJS(mod) {
306
306
  value: true
307
307
  }), mod);
308
308
  };
309
- // src/player/VmapManager.ts
310
- var VmapManager_exports = {};
311
- __export(VmapManager_exports, {
312
- VmapManager: function VmapManager1() {
313
- return VmapManager;
309
+ // src/player/AdConfigManager.ts
310
+ var AdConfigManager_exports = {};
311
+ __export(AdConfigManager_exports, {
312
+ AdConfigManager: function AdConfigManager1() {
313
+ return AdConfigManager;
314
314
  }
315
315
  });
316
- module.exports = __toCommonJS(VmapManager_exports);
317
- // src/utils/vastMacros.ts
318
- function generateCorrelator() {
319
- if (typeof crypto !== "undefined" && crypto.getRandomValues) {
320
- try {
321
- var _buf_, _buf_1;
322
- var buf = new Uint32Array(2);
323
- crypto.getRandomValues(buf);
324
- 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);
325
- if (value > 0) {
326
- return String(value);
327
- }
328
- } catch (unused) {}
329
- }
330
- return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
331
- }
332
- var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
333
- var CTV_UNSUPPORTED_PARAMS = [
334
- "description_url",
335
- "tfcd",
336
- "npa",
337
- "min_ad_duration",
338
- "max_ad_duration",
339
- "unviewed_position_start",
340
- "impl",
341
- "scor",
342
- "vad_type",
343
- "gdpr",
344
- "gdpr_consent",
345
- "us_privacy"
346
- ];
347
- function applyVastMacros(baseUrl, ctx) {
348
- var url;
349
- try {
350
- url = new URL(baseUrl);
351
- } catch (unused) {
352
- return replaceCorrelatorFallback(baseUrl, ctx.correlator);
353
- }
354
- var params = url.searchParams;
355
- params.set("correlator", ctx.correlator);
356
- if (ctx.isCtv) {
357
- var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
358
- try {
359
- for(var _iterator = CTV_UNSUPPORTED_PARAMS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
360
- var key = _step.value;
361
- params.delete(key);
362
- }
363
- } catch (err) {
364
- _didIteratorError = true;
365
- _iteratorError = err;
366
- } finally{
367
- try {
368
- if (!_iteratorNormalCompletion && _iterator.return != null) {
369
- _iterator.return();
370
- }
371
- } finally{
372
- if (_didIteratorError) {
373
- throw _iteratorError;
374
- }
375
- }
376
- }
377
- } else {
378
- params.set("scor", ctx.streamCorrelator);
379
- }
380
- if (ctx.pod != null) {
381
- params.set("pod", String(ctx.pod));
382
- }
383
- if (ctx.adPosition != null) {
384
- params.set("ppos", String(ctx.adPosition));
385
- }
386
- var requestUrl = ctx.contentUrl || ctx.pageUrl;
387
- if (requestUrl) {
388
- params.set("url", requestUrl);
389
- if (!ctx.isCtv) {
390
- params.set("description_url", requestUrl);
391
- }
392
- }
393
- if (ctx.adWillPlayMuted != null) {
394
- params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
395
- }
396
- if (ctx.adWillAutoPlay != null) {
397
- params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
398
- }
399
- if (ctx.appId) {
400
- params.set("msid", ctx.appId);
401
- }
402
- if (ctx.appName) {
403
- params.set("an", ctx.appName);
404
- }
405
- if (ctx.sessionId) {
406
- params.set("sid", ctx.sessionId);
407
- }
408
- if (ctx.deviceTypeHint != null) {
409
- params.set("dth", String(ctx.deviceTypeHint));
410
- } else if (ctx.isCtv) {
411
- params.set("dth", "5");
412
- }
413
- if (ctx.deviceId && ctx.deviceIdType) {
414
- params.set("rdid", ctx.deviceId);
415
- params.set("idtype", ctx.deviceIdType);
416
- params.set("is_lat", ctx.limitAdTracking ? "1" : "0");
417
- } else {
418
- params.delete("rdid");
419
- params.delete("idtype");
420
- params.delete("is_lat");
421
- }
422
- if (!ctx.isCtv) {
423
- var consent = ctx.consent;
424
- if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
425
- params.set("gdpr", consent.gdpr);
426
- }
427
- if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
428
- params.set("gdpr_consent", consent.gdprConsent);
429
- }
430
- if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
431
- params.set("us_privacy", consent.usPrivacy);
432
- }
433
- }
434
- if (ctx.adTest) {
435
- params.set("adtest", "on");
436
- }
437
- var staleKeys = [];
438
- params.forEach(function(value, key) {
439
- if (UNEXPANDED_MACRO_PATTERN.test(value)) {
440
- staleKeys.push(key);
441
- }
442
- });
443
- var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
444
- try {
445
- for(var _iterator1 = staleKeys[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
446
- var key1 = _step1.value;
447
- params.delete(key1);
448
- }
449
- } catch (err) {
450
- _didIteratorError1 = true;
451
- _iteratorError1 = err;
452
- } finally{
453
- try {
454
- if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
455
- _iterator1.return();
456
- }
457
- } finally{
458
- if (_didIteratorError1) {
459
- throw _iteratorError1;
460
- }
461
- }
462
- }
463
- return url.toString();
464
- }
465
- function replaceCorrelatorFallback(baseUrl, correlator) {
466
- var correlatorRegex = /([?&])correlator=([^&]*)/;
467
- if (correlatorRegex.test(baseUrl)) {
468
- return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
469
- }
470
- var sep = baseUrl.includes("?") ? "&" : "?";
471
- return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
472
- }
473
- // src/utils/ctvVastSignals.ts
316
+ module.exports = __toCommonJS(AdConfigManager_exports);
317
+ // src/utils/vastEnvironmentSignals.ts
474
318
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
475
319
  var AIRY_APP_NAME = "AiryTV Movies & TV";
476
320
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
@@ -484,28 +328,66 @@ var DEVICE_ID_STORAGE_KEYS = [
484
328
  "aaid",
485
329
  "adid",
486
330
  "rida",
487
- "tifa"
331
+ "tifa",
332
+ "lgudid"
488
333
  ];
489
- function resolveCtvVastSignals() {
334
+ var ANDROID_ID_TYPES = /* @__PURE__ */ new Set([
335
+ "aaid",
336
+ "adid"
337
+ ]);
338
+ function resolveVastEnvironmentSignals(isCtv) {
490
339
  var _ref, _bridgeSignals_limitAdTracking;
491
340
  var bridgeSignals = readNativeBridgeSignals();
492
341
  var deviceId = bridgeSignals.deviceId || readStoredDeviceId();
493
- var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || inferDeviceIdType();
494
- var contentUrl = bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL;
495
- return _object_spread_props(_object_spread({
496
- contentUrl: contentUrl,
497
- appId: AIRY_ANDROID_APP_ID,
498
- appName: AIRY_APP_NAME,
499
- sessionId: getOrCreateCtvSessionId()
342
+ var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || readStoredString("idtype") || inferDeviceIdType();
343
+ var limitAdTracking = deviceId != null ? (_ref = (_bridgeSignals_limitAdTracking = bridgeSignals.limitAdTracking) !== null && _bridgeSignals_limitAdTracking !== void 0 ? _bridgeSignals_limitAdTracking : readStoredLimitAdTracking()) !== null && _ref !== void 0 ? _ref : false : void 0;
344
+ if (isCtv) {
345
+ return _object_spread_props(_object_spread({
346
+ isCtv: true,
347
+ contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
348
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || AIRY_ANDROID_APP_ID,
349
+ appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
350
+ sessionId: getOrCreateCtvSessionId()
351
+ }, deviceId ? {
352
+ deviceId: deviceId
353
+ } : {}, deviceIdType ? {
354
+ deviceIdType: deviceIdType
355
+ } : {}, limitAdTracking != null ? {
356
+ limitAdTracking: limitAdTracking
357
+ } : {}), {
358
+ deviceTypeHint: 5
359
+ });
360
+ }
361
+ return _object_spread({
362
+ isCtv: false
500
363
  }, deviceId ? {
501
364
  deviceId: deviceId
502
- } : {}, deviceId && deviceIdType ? {
365
+ } : {}, deviceIdType ? {
503
366
  deviceIdType: deviceIdType
504
- } : {}, deviceId ? {
505
- limitAdTracking: (_ref = (_bridgeSignals_limitAdTracking = bridgeSignals.limitAdTracking) !== null && _bridgeSignals_limitAdTracking !== void 0 ? _bridgeSignals_limitAdTracking : readStoredLimitAdTracking()) !== null && _ref !== void 0 ? _ref : false
506
- } : {}), {
507
- deviceTypeHint: 5
508
- });
367
+ } : {}, limitAdTracking != null ? {
368
+ limitAdTracking: limitAdTracking
369
+ } : {});
370
+ }
371
+ function inferDeviceIdType() {
372
+ if (typeof navigator === "undefined") {
373
+ return void 0;
374
+ }
375
+ var ua = navigator.userAgent;
376
+ if (/Roku/i.test(ua)) return "rida";
377
+ if (/Tizen|Samsung/i.test(ua)) return "tifa";
378
+ if (/AppleTV|Apple TV/i.test(ua)) return "tvOS";
379
+ if (/AFT|Fire TV|Amazon/i.test(ua)) return "afai";
380
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return "lgudid";
381
+ if (/Android|Google TV/i.test(ua)) return "aaid";
382
+ if (/iPhone|iPad|iPod/i.test(ua)) return "idfa";
383
+ return void 0;
384
+ }
385
+ function isEquivalentDeviceIdType(tagType, runtimeType) {
386
+ if (!tagType || !runtimeType) return false;
387
+ var tag = tagType.toLowerCase();
388
+ var runtime = runtimeType.toLowerCase();
389
+ if (tag === runtime) return true;
390
+ return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);
509
391
  }
510
392
  function getOrCreateCtvSessionId() {
511
393
  var existing = readStoredString(CTV_SESSION_STORAGE_KEY);
@@ -538,7 +420,10 @@ function readNativeBridgeSignals() {
538
420
  window.__STORMCLOUD_CTV__,
539
421
  window.stormcloudCtv,
540
422
  window.AiryTV,
541
- window.Android
423
+ window.Android,
424
+ window.webOS,
425
+ window.tizen,
426
+ window.amazon
542
427
  ].filter(Boolean);
543
428
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
544
429
  try {
@@ -550,18 +435,36 @@ function readNativeBridgeSignals() {
550
435
  "videoUrl",
551
436
  "canonicalUrl"
552
437
  ]) || void 0;
438
+ var appId = readBridgeValue(source, [
439
+ "appId",
440
+ "msid",
441
+ "applicationId",
442
+ "packageName"
443
+ ]) || void 0;
444
+ var appName = readBridgeValue(source, [
445
+ "appName",
446
+ "an",
447
+ "applicationName"
448
+ ]) || void 0;
553
449
  var deviceId = readBridgeValue(source, [
554
450
  "rdid",
555
451
  "ifa",
556
452
  "advertisingId",
557
453
  "adId",
558
- "deviceId"
454
+ "deviceId",
455
+ "lgudid",
456
+ "LGUDID",
457
+ "tifa",
458
+ "rida",
459
+ "afai",
460
+ "aaid"
559
461
  ]) || void 0;
560
- if (!contentUrl && !deviceId) continue;
462
+ if (!contentUrl && !deviceId && !appId && !appName) continue;
561
463
  var deviceIdType = readBridgeValue(source, [
562
464
  "idtype",
563
465
  "deviceIdType",
564
- "advertisingIdType"
466
+ "advertisingIdType",
467
+ "idType"
565
468
  ]) || inferDeviceIdType();
566
469
  var limitAdTracking = readBridgeBoolean(source, [
567
470
  "is_lat",
@@ -571,6 +474,10 @@ function readNativeBridgeSignals() {
571
474
  ]);
572
475
  return _object_spread({}, contentUrl ? {
573
476
  contentUrl: contentUrl
477
+ } : {}, appId ? {
478
+ appId: appId
479
+ } : {}, appName ? {
480
+ appName: appName
574
481
  } : {}, deviceId ? {
575
482
  deviceId: deviceId
576
483
  } : {}, deviceId && deviceIdType ? {
@@ -723,18 +630,400 @@ function normalizeBoolean(value) {
723
630
  }
724
631
  return void 0;
725
632
  }
726
- function inferDeviceIdType() {
727
- if (typeof navigator === "undefined") {
728
- return void 0;
633
+ // src/utils/vastMacros.ts
634
+ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
635
+ var INVALID_VAST_PARAM_KEY = /^\s|\s$/;
636
+ var EXAMPLE_COM_URL = /example\.com/i;
637
+ var CTV_UNSUPPORTED_PARAMS = [
638
+ "description_url",
639
+ "tfcd",
640
+ "npa",
641
+ "min_ad_duration",
642
+ "max_ad_duration",
643
+ "unviewed_position_start",
644
+ "impl",
645
+ "scor",
646
+ "vad_type",
647
+ "gdpr",
648
+ "gdpr_consent",
649
+ "us_privacy"
650
+ ];
651
+ var INLINE_DEVICE_MACRO_REPLACEMENTS = [
652
+ {
653
+ pattern: /\[RDID\]/gi,
654
+ getValue: function getValue(ctx) {
655
+ return ctx.deviceId;
656
+ }
657
+ },
658
+ {
659
+ pattern: /\[IFA\]/gi,
660
+ getValue: function getValue(ctx) {
661
+ return ctx.deviceId;
662
+ }
663
+ },
664
+ {
665
+ pattern: /\[ADVERTISING[_-]?ID(?:ENTIFIER)?\]/gi,
666
+ getValue: function getValue(ctx) {
667
+ return ctx.deviceId;
668
+ }
669
+ },
670
+ {
671
+ pattern: /\[DEVICE[_-]?ID\]/gi,
672
+ getValue: function getValue(ctx) {
673
+ return ctx.deviceId;
674
+ }
675
+ },
676
+ {
677
+ pattern: /\[IDTYPE\]/gi,
678
+ getValue: function getValue(ctx) {
679
+ return ctx.deviceIdType;
680
+ }
681
+ },
682
+ {
683
+ pattern: /\{rdid\}/gi,
684
+ getValue: function getValue(ctx) {
685
+ return ctx.deviceId;
686
+ }
687
+ },
688
+ {
689
+ pattern: /\{device[_-]?id\}/gi,
690
+ getValue: function getValue(ctx) {
691
+ return ctx.deviceId;
692
+ }
693
+ },
694
+ {
695
+ pattern: /\{idtype\}/gi,
696
+ getValue: function getValue(ctx) {
697
+ return ctx.deviceIdType;
698
+ }
699
+ },
700
+ {
701
+ pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi,
702
+ getValue: function getValue(ctx) {
703
+ return ctx.deviceId;
704
+ }
705
+ },
706
+ {
707
+ pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi,
708
+ getValue: function getValue(ctx) {
709
+ return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
710
+ }
711
+ },
712
+ {
713
+ pattern: /%%ADVERTISING_ID_TYPE%%/gi,
714
+ getValue: function getValue(ctx) {
715
+ return ctx.deviceIdType;
716
+ }
717
+ },
718
+ {
719
+ pattern: /%%ADVERTISING_ID%%/gi,
720
+ getValue: function getValue(ctx) {
721
+ return ctx.deviceId;
722
+ }
723
+ },
724
+ {
725
+ pattern: /%%LIMIT_AD_TRACKING%%/gi,
726
+ getValue: function getValue(ctx) {
727
+ return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
728
+ }
729
+ },
730
+ {
731
+ pattern: /%%MSID%%/gi,
732
+ getValue: function getValue(ctx) {
733
+ return ctx.appId;
734
+ }
735
+ },
736
+ {
737
+ pattern: /%%APP_NAME%%/gi,
738
+ getValue: function getValue(ctx) {
739
+ return ctx.appName;
740
+ }
741
+ },
742
+ {
743
+ pattern: /%%SESSION_ID%%/gi,
744
+ getValue: function getValue(ctx) {
745
+ return ctx.sessionId;
746
+ }
747
+ },
748
+ {
749
+ pattern: /%%CORRELATOR%%/gi,
750
+ getValue: function getValue(ctx) {
751
+ return ctx.correlator;
752
+ }
729
753
  }
730
- var ua = navigator.userAgent;
731
- if (/Roku/i.test(ua)) return "rida";
732
- if (/Tizen|Samsung/i.test(ua)) return "tifa";
733
- if (/AppleTV/i.test(ua)) return "tvOS";
734
- if (/AFT|Fire TV|Amazon/i.test(ua)) return "afai";
735
- if (/Web0S|webOS|LG/i.test(ua)) return "lgudid";
736
- if (/Android|Google TV/i.test(ua)) return "aaid";
737
- return void 0;
754
+ ];
755
+ function isMacroPlaceholder(value) {
756
+ if (value == null) return true;
757
+ var trimmed = value.trim();
758
+ if (!trimmed) return true;
759
+ if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;
760
+ return /^(unknown|null|undefined|none|n\/a|\$\{[^}]+\})$/i.test(trimmed);
761
+ }
762
+ function generateCorrelator() {
763
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
764
+ try {
765
+ var _buf_, _buf_1;
766
+ var buf = new Uint32Array(2);
767
+ crypto.getRandomValues(buf);
768
+ 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);
769
+ if (value > 0) {
770
+ return String(value);
771
+ }
772
+ } catch (unused) {}
773
+ }
774
+ return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
775
+ }
776
+ function expandInlineMacroPlaceholders(baseUrl, ctx) {
777
+ var url = baseUrl;
778
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
779
+ try {
780
+ for(var _iterator = INLINE_DEVICE_MACRO_REPLACEMENTS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
781
+ var _step_value = _step.value, pattern = _step_value.pattern, getValue = _step_value.getValue;
782
+ var value = getValue(ctx);
783
+ if (value != null && value !== "") {
784
+ url = url.replace(pattern, encodeURIComponent(value));
785
+ }
786
+ }
787
+ } catch (err) {
788
+ _didIteratorError = true;
789
+ _iteratorError = err;
790
+ } finally{
791
+ try {
792
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
793
+ _iterator.return();
794
+ }
795
+ } finally{
796
+ if (_didIteratorError) {
797
+ throw _iteratorError;
798
+ }
799
+ }
800
+ }
801
+ return url;
802
+ }
803
+ function applyDeviceIdentityParams(params, ctx) {
804
+ var _ctx_deviceId, _ctx_deviceIdType;
805
+ var runtimeId = (_ctx_deviceId = ctx.deviceId) === null || _ctx_deviceId === void 0 ? void 0 : _ctx_deviceId.trim();
806
+ var runtimeType = ((_ctx_deviceIdType = ctx.deviceIdType) === null || _ctx_deviceIdType === void 0 ? void 0 : _ctx_deviceIdType.trim()) || inferDeviceIdType();
807
+ var tagRdid = params.get("rdid");
808
+ var tagType = params.get("idtype");
809
+ var tagLat = params.get("is_lat");
810
+ var latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
811
+ if (runtimeId) {
812
+ params.set("rdid", runtimeId);
813
+ params.set("idtype", runtimeType || tagType || "aaid");
814
+ params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : isMacroPlaceholder(tagLat) ? "0" : tagLat);
815
+ return;
816
+ }
817
+ var tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));
818
+ var tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));
819
+ if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {
820
+ params.delete("rdid");
821
+ params.delete("idtype");
822
+ params.delete("is_lat");
823
+ return;
824
+ }
825
+ if (tagRdidValid) {
826
+ if (isMacroPlaceholder(tagType) && runtimeType) {
827
+ params.set("idtype", runtimeType);
828
+ }
829
+ if (isMacroPlaceholder(tagLat)) {
830
+ params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : "0");
831
+ }
832
+ return;
833
+ }
834
+ params.delete("rdid");
835
+ params.delete("idtype");
836
+ params.delete("is_lat");
837
+ }
838
+ function removeBrokenAppNameOrphans(params, appName) {
839
+ var toDelete = [];
840
+ params.forEach(function(_value, key) {
841
+ if (!key || INVALID_VAST_PARAM_KEY.test(key)) {
842
+ toDelete.push(key);
843
+ }
844
+ });
845
+ if (appName && appName.includes("&")) {
846
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
847
+ try {
848
+ for(var _iterator = appName.split("&").slice(1)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
849
+ var suffix = _step.value;
850
+ var trimmed = suffix.trimStart();
851
+ if (!trimmed) continue;
852
+ toDelete.push(suffix, " ".concat(trimmed), trimmed);
853
+ }
854
+ } catch (err) {
855
+ _didIteratorError = true;
856
+ _iteratorError = err;
857
+ } finally{
858
+ try {
859
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
860
+ _iterator.return();
861
+ }
862
+ } finally{
863
+ if (_didIteratorError) {
864
+ throw _iteratorError;
865
+ }
866
+ }
867
+ }
868
+ }
869
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
870
+ try {
871
+ for(var _iterator1 = new Set(toDelete)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
872
+ var key = _step1.value;
873
+ if (key) params.delete(key);
874
+ }
875
+ } catch (err) {
876
+ _didIteratorError1 = true;
877
+ _iteratorError1 = err;
878
+ } finally{
879
+ try {
880
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
881
+ _iterator1.return();
882
+ }
883
+ } finally{
884
+ if (_didIteratorError1) {
885
+ throw _iteratorError1;
886
+ }
887
+ }
888
+ }
889
+ }
890
+ function normalizeVastTagUrl(raw) {
891
+ if (!raw) return raw;
892
+ try {
893
+ var url = new URL(raw);
894
+ removeBrokenAppNameOrphans(url.searchParams);
895
+ return url.toString();
896
+ } catch (unused) {
897
+ return raw;
898
+ }
899
+ }
900
+ function applyVastMacros(baseUrl, ctx) {
901
+ var expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);
902
+ var url;
903
+ try {
904
+ url = new URL(normalizeVastTagUrl(expandedUrl));
905
+ } catch (unused) {
906
+ return replaceCorrelatorFallback(expandedUrl, ctx.correlator);
907
+ }
908
+ var params = url.searchParams;
909
+ removeBrokenAppNameOrphans(params, ctx.appName);
910
+ params.set("correlator", ctx.correlator);
911
+ if (ctx.isCtv) {
912
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
913
+ try {
914
+ for(var _iterator = CTV_UNSUPPORTED_PARAMS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
915
+ var key = _step.value;
916
+ params.delete(key);
917
+ }
918
+ } catch (err) {
919
+ _didIteratorError = true;
920
+ _iteratorError = err;
921
+ } finally{
922
+ try {
923
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
924
+ _iterator.return();
925
+ }
926
+ } finally{
927
+ if (_didIteratorError) {
928
+ throw _iteratorError;
929
+ }
930
+ }
931
+ }
932
+ } else {
933
+ params.set("scor", ctx.streamCorrelator);
934
+ }
935
+ if (ctx.pod != null) {
936
+ params.set("pod", String(ctx.pod));
937
+ }
938
+ if (ctx.adPosition != null) {
939
+ params.set("ppos", String(ctx.adPosition));
940
+ }
941
+ var requestUrl = ctx.contentUrl || ctx.pageUrl;
942
+ if (requestUrl) {
943
+ params.set("url", requestUrl);
944
+ if (!ctx.isCtv) {
945
+ params.set("description_url", requestUrl);
946
+ }
947
+ } else {
948
+ var existingUrl = params.get("url") || "";
949
+ if (EXAMPLE_COM_URL.test(existingUrl)) {
950
+ params.delete("url");
951
+ params.delete("description_url");
952
+ }
953
+ }
954
+ if (ctx.adWillPlayMuted != null) {
955
+ params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
956
+ }
957
+ if (ctx.adWillAutoPlay != null) {
958
+ params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
959
+ }
960
+ if (ctx.appId) {
961
+ params.set("msid", ctx.appId);
962
+ }
963
+ if (ctx.appName) {
964
+ removeBrokenAppNameOrphans(params, ctx.appName);
965
+ params.set("an", ctx.appName);
966
+ }
967
+ if (ctx.sessionId) {
968
+ params.set("sid", ctx.sessionId);
969
+ }
970
+ if (ctx.deviceTypeHint != null) {
971
+ params.set("dth", String(ctx.deviceTypeHint));
972
+ } else if (ctx.isCtv) {
973
+ params.set("dth", "5");
974
+ }
975
+ applyDeviceIdentityParams(params, ctx);
976
+ if (!ctx.isCtv) {
977
+ var consent = ctx.consent;
978
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
979
+ params.set("gdpr", consent.gdpr);
980
+ }
981
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
982
+ params.set("gdpr_consent", consent.gdprConsent);
983
+ }
984
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
985
+ params.set("us_privacy", consent.usPrivacy);
986
+ }
987
+ }
988
+ if (ctx.adTest) {
989
+ params.set("adtest", "on");
990
+ }
991
+ var staleKeys = [];
992
+ params.forEach(function(value, key) {
993
+ if (isMacroPlaceholder(value)) {
994
+ staleKeys.push(key);
995
+ }
996
+ });
997
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
998
+ try {
999
+ for(var _iterator1 = staleKeys[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1000
+ var key1 = _step1.value;
1001
+ params.delete(key1);
1002
+ }
1003
+ } catch (err) {
1004
+ _didIteratorError1 = true;
1005
+ _iteratorError1 = err;
1006
+ } finally{
1007
+ try {
1008
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1009
+ _iterator1.return();
1010
+ }
1011
+ } finally{
1012
+ if (_didIteratorError1) {
1013
+ throw _iteratorError1;
1014
+ }
1015
+ }
1016
+ }
1017
+ removeBrokenAppNameOrphans(params, ctx.appName);
1018
+ return url.toString();
1019
+ }
1020
+ function replaceCorrelatorFallback(baseUrl, correlator) {
1021
+ var correlatorRegex = /([?&])correlator=([^&]*)/;
1022
+ if (correlatorRegex.test(baseUrl)) {
1023
+ return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
1024
+ }
1025
+ var sep = baseUrl.includes("?") ? "&" : "?";
1026
+ return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
738
1027
  }
739
1028
  // src/utils/mqttConfig.ts
740
1029
  var DEFAULT_MQTT_CONFIG = {
@@ -1195,10 +1484,10 @@ function sendHeartbeat(_0) {
1195
1484
  });
1196
1485
  }).apply(this, arguments);
1197
1486
  }
1198
- // src/player/VmapManager.ts
1199
- var VmapManager = /*#__PURE__*/ function() {
1200
- function VmapManager(config, video) {
1201
- _class_call_check(this, VmapManager);
1487
+ // src/player/AdConfigManager.ts
1488
+ var AdConfigManager = /*#__PURE__*/ function() {
1489
+ function AdConfigManager(config, video) {
1490
+ _class_call_check(this, AdConfigManager);
1202
1491
  this.vmapBreaks = [];
1203
1492
  this.consumedVmapBreakIds = /* @__PURE__ */ new Set();
1204
1493
  this.streamCorrelator = generateCorrelator();
@@ -1210,7 +1499,7 @@ var VmapManager = /*#__PURE__*/ function() {
1210
1499
  this.config = config;
1211
1500
  this.video = video;
1212
1501
  }
1213
- _create_class(VmapManager, [
1502
+ _create_class(AdConfigManager, [
1214
1503
  {
1215
1504
  key: "debug",
1216
1505
  get: function get() {
@@ -1272,7 +1561,7 @@ var VmapManager = /*#__PURE__*/ function() {
1272
1561
  ];
1273
1562
  }
1274
1563
  if (this.config.vastTagUrl) {
1275
- this.apiVastTagUrl = this.config.vastTagUrl;
1564
+ this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);
1276
1565
  if (this.debug) {
1277
1566
  console.log("[StormcloudVideoPlayer] Using custom VAST tag URL:", this.apiVastTagUrl);
1278
1567
  }
@@ -1312,7 +1601,7 @@ var VmapManager = /*#__PURE__*/ function() {
1312
1601
  data = _state.sent();
1313
1602
  imaPayload = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : (_data_response_ima = _data_response.ima) === null || _data_response_ima === void 0 ? void 0 : (_data_response_ima_publisherdeskima = _data_response_ima["publisherdesk.ima"]) === null || _data_response_ima_publisherdeskima === void 0 ? void 0 : _data_response_ima_publisherdeskima.payload;
1314
1603
  if (imaPayload) {
1315
- this.apiVastTagUrl = decodeURIComponent(imaPayload);
1604
+ this.apiVastTagUrl = normalizeVastTagUrl(imaPayload);
1316
1605
  if (this.debug) {
1317
1606
  console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
1318
1607
  }
@@ -1627,24 +1916,24 @@ var VmapManager = /*#__PURE__*/ function() {
1627
1916
  for(var i = 0; i < count; i++){
1628
1917
  this.adRequestPositionInBreak++;
1629
1918
  var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
1630
- var ctvSignals = this.config.ctvAdRequest ? resolveCtvVastSignals() : void 0;
1919
+ var envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);
1631
1920
  var urlWithMacros = applyVastMacros(baseUrl, {
1632
1921
  correlator: generateCorrelator(),
1633
1922
  streamCorrelator: this.streamCorrelator,
1634
1923
  pod: this.podCounter > 0 ? this.podCounter : void 0,
1635
1924
  adPosition: this.adRequestPositionInBreak,
1636
- isCtv: this.config.ctvAdRequest,
1637
- contentUrl: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.contentUrl,
1638
- pageUrl: !this.config.ctvAdRequest && typeof window !== "undefined" ? window.location.href : void 0,
1925
+ isCtv: envSignals.isCtv,
1926
+ contentUrl: envSignals.contentUrl,
1927
+ pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? window.location.href : void 0,
1639
1928
  adWillPlayMuted: adWillPlayMuted,
1640
1929
  adWillAutoPlay: !!this.config.autoplay,
1641
- appId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.appId,
1642
- appName: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.appName,
1643
- sessionId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.sessionId,
1644
- deviceId: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceId,
1645
- deviceIdType: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceIdType,
1646
- limitAdTracking: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.limitAdTracking,
1647
- deviceTypeHint: ctvSignals === null || ctvSignals === void 0 ? void 0 : ctvSignals.deviceTypeHint,
1930
+ appId: envSignals.appId,
1931
+ appName: envSignals.appName,
1932
+ sessionId: envSignals.sessionId,
1933
+ deviceId: envSignals.deviceId,
1934
+ deviceIdType: envSignals.deviceIdType,
1935
+ limitAdTracking: envSignals.limitAdTracking,
1936
+ deviceTypeHint: envSignals.deviceTypeHint,
1648
1937
  adTest: this.config.adTest,
1649
1938
  consent: this.consentSignals
1650
1939
  });
@@ -1697,10 +1986,10 @@ var VmapManager = /*#__PURE__*/ function() {
1697
1986
  }
1698
1987
  }
1699
1988
  ]);
1700
- return VmapManager;
1989
+ return AdConfigManager;
1701
1990
  }();
1702
1991
  // Annotate the CommonJS export names for ESM import in node:
1703
1992
  0 && (module.exports = {
1704
- VmapManager: VmapManager
1993
+ AdConfigManager: AdConfigManager
1705
1994
  });
1706
- //# sourceMappingURL=VmapManager.cjs.map
1995
+ //# sourceMappingURL=AdConfigManager.cjs.map