stormcloud-video-player 0.8.18 → 0.8.20

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 (48) hide show
  1. package/README.md +67 -83
  2. package/dist/stormcloud-vp.min.js +1 -1
  3. package/lib/index.cjs +686 -353
  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 +686 -353
  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 +4 -4
  12. package/lib/player/{VmapManager.cjs → AdConfigManager.cjs} +561 -217
  13. package/lib/player/AdConfigManager.cjs.map +1 -0
  14. package/lib/player/{VmapManager.d.cts → AdConfigManager.d.cts} +3 -3
  15. package/lib/player/AdPreloadPool.d.cts +1 -1
  16. package/lib/player/AdTimingService.d.cts +1 -1
  17. package/lib/player/HlsEngine.d.cts +1 -1
  18. package/lib/player/PlayerControls.d.cts +1 -1
  19. package/lib/player/Scte35CueManager.d.cts +1 -1
  20. package/lib/player/Scte35Parser.d.cts +1 -1
  21. package/lib/player/StormcloudVideoPlayer.cjs +686 -353
  22. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  23. package/lib/player/StormcloudVideoPlayer.d.cts +2 -2
  24. package/lib/player/playerTypes.d.cts +1 -1
  25. package/lib/players/HlsPlayer.cjs +686 -353
  26. package/lib/players/HlsPlayer.cjs.map +1 -1
  27. package/lib/players/HlsPlayer.d.cts +1 -1
  28. package/lib/players/index.cjs +686 -353
  29. package/lib/players/index.cjs.map +1 -1
  30. package/lib/sdk/hlsAdPlayer.cjs +5 -4
  31. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  32. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  33. package/lib/types-BAP8n5mE.d.cts +126 -0
  34. package/lib/ui/StormcloudVideoPlayer.cjs +686 -353
  35. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  36. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  37. package/lib/utils/ctvVastSignals.cjs +103 -33
  38. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  39. package/lib/utils/ctvVastSignals.d.cts +1 -13
  40. package/lib/utils/tracking.d.cts +1 -1
  41. package/lib/utils/vastEnvironmentSignals.cjs +450 -0
  42. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -0
  43. package/lib/utils/vastEnvironmentSignals.d.cts +16 -0
  44. package/lib/utils/vastMacros.cjs +347 -25
  45. package/lib/utils/vastMacros.cjs.map +1 -1
  46. package/lib/utils/vastMacros.d.cts +3 -1
  47. package/package.json +1 -1
  48. package/lib/player/VmapManager.cjs.map +0 -1
@@ -7,6 +7,9 @@ function _array_like_to_array(arr, len) {
7
7
  function _array_with_holes(arr) {
8
8
  if (Array.isArray(arr)) return arr;
9
9
  }
10
+ function _array_without_holes(arr) {
11
+ if (Array.isArray(arr)) return _array_like_to_array(arr);
12
+ }
10
13
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
11
14
  try {
12
15
  var info = gen[key](arg);
@@ -68,6 +71,9 @@ function _define_property(obj, key, value) {
68
71
  }
69
72
  return obj;
70
73
  }
74
+ function _iterable_to_array(iter) {
75
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
76
+ }
71
77
  function _iterable_to_array_limit(arr, i) {
72
78
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
73
79
  if (_i == null) return;
@@ -95,6 +101,9 @@ function _iterable_to_array_limit(arr, i) {
95
101
  function _non_iterable_rest() {
96
102
  throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
97
103
  }
104
+ function _non_iterable_spread() {
105
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
106
+ }
98
107
  function _object_spread(target) {
99
108
  for(var i = 1; i < arguments.length; i++){
100
109
  var source = arguments[i] != null ? arguments[i] : {};
@@ -137,6 +146,9 @@ function _object_spread_props(target, source) {
137
146
  function _sliced_to_array(arr, i) {
138
147
  return _array_with_holes(arr) || _iterable_to_array_limit(arr, i) || _unsupported_iterable_to_array(arr, i) || _non_iterable_rest();
139
148
  }
149
+ function _to_consumable_array(arr) {
150
+ return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
151
+ }
140
152
  function _type_of(obj) {
141
153
  "@swc/helpers - typeof";
142
154
  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
@@ -306,175 +318,30 @@ var __toCommonJS = function __toCommonJS(mod) {
306
318
  value: true
307
319
  }), mod);
308
320
  };
309
- // src/player/VmapManager.ts
310
- var VmapManager_exports = {};
311
- __export(VmapManager_exports, {
312
- VmapManager: function VmapManager1() {
313
- return VmapManager;
321
+ // src/player/AdConfigManager.ts
322
+ var AdConfigManager_exports = {};
323
+ __export(AdConfigManager_exports, {
324
+ AdConfigManager: function AdConfigManager1() {
325
+ return AdConfigManager;
314
326
  }
315
327
  });
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
328
+ module.exports = __toCommonJS(AdConfigManager_exports);
329
+ // src/utils/vastEnvironmentSignals.ts
474
330
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
331
+ var AIRY_WEBOS_APP_ID = "com.freeairytv.webos";
332
+ var AIRY_TIZEN_APP_ID = "com.freeairytv.samsung";
333
+ var AIRY_ROKU_APP_ID = "com.freeairytv.roku";
475
334
  var AIRY_APP_NAME = "AiryTV Movies & TV";
476
335
  var AIRY_DEFAULT_CONTENT_URL = "https://live.airy.tv";
477
336
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
337
+ function getDefaultAppId() {
338
+ if (typeof navigator === "undefined") return AIRY_ANDROID_APP_ID;
339
+ var ua = navigator.userAgent;
340
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return AIRY_WEBOS_APP_ID;
341
+ if (/Tizen|Samsung/i.test(ua)) return AIRY_TIZEN_APP_ID;
342
+ if (/Roku/i.test(ua)) return AIRY_ROKU_APP_ID;
343
+ return AIRY_ANDROID_APP_ID;
344
+ }
478
345
  var DEVICE_ID_STORAGE_KEYS = [
479
346
  "rdid",
480
347
  "ifa",
@@ -484,28 +351,66 @@ var DEVICE_ID_STORAGE_KEYS = [
484
351
  "aaid",
485
352
  "adid",
486
353
  "rida",
487
- "tifa"
354
+ "tifa",
355
+ "lgudid"
488
356
  ];
489
- function resolveCtvVastSignals() {
357
+ var ANDROID_ID_TYPES = /* @__PURE__ */ new Set([
358
+ "aaid",
359
+ "adid"
360
+ ]);
361
+ function resolveVastEnvironmentSignals(isCtv) {
490
362
  var _ref, _bridgeSignals_limitAdTracking;
491
363
  var bridgeSignals = readNativeBridgeSignals();
492
364
  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()
365
+ var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || readStoredString("idtype") || inferDeviceIdType();
366
+ 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;
367
+ if (isCtv) {
368
+ return _object_spread_props(_object_spread({
369
+ isCtv: true,
370
+ contentUrl: bridgeSignals.contentUrl || readStoredString("contentUrl") || AIRY_DEFAULT_CONTENT_URL,
371
+ appId: bridgeSignals.appId || readStoredString("appId") || readStoredString("msid") || getDefaultAppId(),
372
+ appName: bridgeSignals.appName || readStoredString("appName") || readStoredString("an") || AIRY_APP_NAME,
373
+ sessionId: getOrCreateCtvSessionId()
374
+ }, deviceId ? {
375
+ deviceId: deviceId
376
+ } : {}, deviceIdType ? {
377
+ deviceIdType: deviceIdType
378
+ } : {}, limitAdTracking != null ? {
379
+ limitAdTracking: limitAdTracking
380
+ } : {}), {
381
+ deviceTypeHint: 5
382
+ });
383
+ }
384
+ return _object_spread({
385
+ isCtv: false
500
386
  }, deviceId ? {
501
387
  deviceId: deviceId
502
- } : {}, deviceId && deviceIdType ? {
388
+ } : {}, deviceIdType ? {
503
389
  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
- });
390
+ } : {}, limitAdTracking != null ? {
391
+ limitAdTracking: limitAdTracking
392
+ } : {});
393
+ }
394
+ function inferDeviceIdType() {
395
+ if (typeof navigator === "undefined") {
396
+ return void 0;
397
+ }
398
+ var ua = navigator.userAgent;
399
+ if (/Roku/i.test(ua)) return "rida";
400
+ if (/Tizen|Samsung/i.test(ua)) return "tifa";
401
+ if (/AppleTV|Apple TV/i.test(ua)) return "tvOS";
402
+ if (/AFT|Fire TV|Amazon/i.test(ua)) return "afai";
403
+ if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return "lgudid";
404
+ if (/Android|Google TV/i.test(ua)) return "aaid";
405
+ if (/iPhone|iPad|iPod/i.test(ua)) return "idfa";
406
+ return void 0;
407
+ }
408
+ function isEquivalentDeviceIdType(tagType, runtimeType) {
409
+ if (!tagType || !runtimeType) return false;
410
+ var tag = tagType.toLowerCase();
411
+ var runtime = runtimeType.toLowerCase();
412
+ if (tag === runtime) return true;
413
+ return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);
509
414
  }
510
415
  function getOrCreateCtvSessionId() {
511
416
  var existing = readStoredString(CTV_SESSION_STORAGE_KEY);
@@ -538,7 +443,10 @@ function readNativeBridgeSignals() {
538
443
  window.__STORMCLOUD_CTV__,
539
444
  window.stormcloudCtv,
540
445
  window.AiryTV,
541
- window.Android
446
+ window.Android,
447
+ window.webOS,
448
+ window.tizen,
449
+ window.amazon
542
450
  ].filter(Boolean);
543
451
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
544
452
  try {
@@ -550,18 +458,36 @@ function readNativeBridgeSignals() {
550
458
  "videoUrl",
551
459
  "canonicalUrl"
552
460
  ]) || void 0;
461
+ var appId = readBridgeValue(source, [
462
+ "appId",
463
+ "msid",
464
+ "applicationId",
465
+ "packageName"
466
+ ]) || void 0;
467
+ var appName = readBridgeValue(source, [
468
+ "appName",
469
+ "an",
470
+ "applicationName"
471
+ ]) || void 0;
553
472
  var deviceId = readBridgeValue(source, [
554
473
  "rdid",
555
474
  "ifa",
556
475
  "advertisingId",
557
476
  "adId",
558
- "deviceId"
477
+ "deviceId",
478
+ "lgudid",
479
+ "LGUDID",
480
+ "tifa",
481
+ "rida",
482
+ "afai",
483
+ "aaid"
559
484
  ]) || void 0;
560
- if (!contentUrl && !deviceId) continue;
485
+ if (!contentUrl && !deviceId && !appId && !appName) continue;
561
486
  var deviceIdType = readBridgeValue(source, [
562
487
  "idtype",
563
488
  "deviceIdType",
564
- "advertisingIdType"
489
+ "advertisingIdType",
490
+ "idType"
565
491
  ]) || inferDeviceIdType();
566
492
  var limitAdTracking = readBridgeBoolean(source, [
567
493
  "is_lat",
@@ -571,6 +497,10 @@ function readNativeBridgeSignals() {
571
497
  ]);
572
498
  return _object_spread({}, contentUrl ? {
573
499
  contentUrl: contentUrl
500
+ } : {}, appId ? {
501
+ appId: appId
502
+ } : {}, appName ? {
503
+ appName: appName
574
504
  } : {}, deviceId ? {
575
505
  deviceId: deviceId
576
506
  } : {}, deviceId && deviceIdType ? {
@@ -723,18 +653,423 @@ function normalizeBoolean(value) {
723
653
  }
724
654
  return void 0;
725
655
  }
726
- function inferDeviceIdType() {
727
- if (typeof navigator === "undefined") {
728
- return void 0;
656
+ // src/utils/vastMacros.ts
657
+ var UNEXPANDED_MACRO_PATTERN = /^(\[[^\]]*\]|\{[^}]*\}|%%[^%]*%%)$/;
658
+ var INVALID_VAST_PARAM_KEY = /^\s|\s$/;
659
+ var EXAMPLE_COM_URL = /example\.com/i;
660
+ var CTV_UNSUPPORTED_PARAMS = [
661
+ "description_url",
662
+ "tfcd",
663
+ "npa",
664
+ "min_ad_duration",
665
+ "max_ad_duration",
666
+ "unviewed_position_start",
667
+ "impl",
668
+ "scor",
669
+ "vad_type",
670
+ "gdpr",
671
+ "gdpr_consent",
672
+ "us_privacy"
673
+ ];
674
+ var INLINE_DEVICE_MACRO_REPLACEMENTS = [
675
+ {
676
+ pattern: /\[RDID\]/gi,
677
+ getValue: function getValue(ctx) {
678
+ return ctx.deviceId;
679
+ }
680
+ },
681
+ {
682
+ pattern: /\[IFA\]/gi,
683
+ getValue: function getValue(ctx) {
684
+ return ctx.deviceId;
685
+ }
686
+ },
687
+ {
688
+ pattern: /\[ADVERTISING[_-]?ID(?:ENTIFIER)?\]/gi,
689
+ getValue: function getValue(ctx) {
690
+ return ctx.deviceId;
691
+ }
692
+ },
693
+ {
694
+ pattern: /\[DEVICE[_-]?ID\]/gi,
695
+ getValue: function getValue(ctx) {
696
+ return ctx.deviceId;
697
+ }
698
+ },
699
+ {
700
+ pattern: /\[IDTYPE\]/gi,
701
+ getValue: function getValue(ctx) {
702
+ return ctx.deviceIdType;
703
+ }
704
+ },
705
+ {
706
+ pattern: /\{rdid\}/gi,
707
+ getValue: function getValue(ctx) {
708
+ return ctx.deviceId;
709
+ }
710
+ },
711
+ {
712
+ pattern: /\{device[_-]?id\}/gi,
713
+ getValue: function getValue(ctx) {
714
+ return ctx.deviceId;
715
+ }
716
+ },
717
+ {
718
+ pattern: /\{idtype\}/gi,
719
+ getValue: function getValue(ctx) {
720
+ return ctx.deviceIdType;
721
+ }
722
+ },
723
+ {
724
+ pattern: /%%ADVERTISING_IDENTIFIER_PLAIN%%/gi,
725
+ getValue: function getValue(ctx) {
726
+ return ctx.deviceId;
727
+ }
728
+ },
729
+ {
730
+ pattern: /%%ADVERTISING_ID_OPT_OUT%%/gi,
731
+ getValue: function getValue(ctx) {
732
+ return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
733
+ }
734
+ },
735
+ {
736
+ pattern: /%%ADVERTISING_ID_TYPE%%/gi,
737
+ getValue: function getValue(ctx) {
738
+ return ctx.deviceIdType;
739
+ }
740
+ },
741
+ {
742
+ pattern: /%%ADVERTISING_ID%%/gi,
743
+ getValue: function getValue(ctx) {
744
+ return ctx.deviceId;
745
+ }
746
+ },
747
+ {
748
+ pattern: /%%LIMIT_AD_TRACKING%%/gi,
749
+ getValue: function getValue(ctx) {
750
+ return ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
751
+ }
752
+ },
753
+ {
754
+ pattern: /%%MSID%%/gi,
755
+ getValue: function getValue(ctx) {
756
+ return ctx.appId;
757
+ }
758
+ },
759
+ {
760
+ pattern: /%%APP_NAME%%/gi,
761
+ getValue: function getValue(ctx) {
762
+ return ctx.appName;
763
+ }
764
+ },
765
+ {
766
+ pattern: /%%SESSION_ID%%/gi,
767
+ getValue: function getValue(ctx) {
768
+ return ctx.sessionId;
769
+ }
770
+ },
771
+ {
772
+ pattern: /%%CORRELATOR%%/gi,
773
+ getValue: function getValue(ctx) {
774
+ return ctx.correlator;
775
+ }
729
776
  }
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;
777
+ ];
778
+ function isMacroPlaceholder(value) {
779
+ if (value == null) return true;
780
+ var trimmed = value.trim();
781
+ if (!trimmed) return true;
782
+ if (UNEXPANDED_MACRO_PATTERN.test(trimmed)) return true;
783
+ return /^(unknown|null|undefined|none|n\/a|\$\{[^}]+\})$/i.test(trimmed);
784
+ }
785
+ function generateCorrelator() {
786
+ if (typeof crypto !== "undefined" && crypto.getRandomValues) {
787
+ try {
788
+ var _buf_, _buf_1;
789
+ var buf = new Uint32Array(2);
790
+ crypto.getRandomValues(buf);
791
+ 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);
792
+ if (value > 0) {
793
+ return String(value);
794
+ }
795
+ } catch (unused) {}
796
+ }
797
+ return String(Math.floor(Math.random() * Number.MAX_SAFE_INTEGER) + 1);
798
+ }
799
+ function expandInlineMacroPlaceholders(baseUrl, ctx) {
800
+ var url = baseUrl;
801
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
802
+ try {
803
+ for(var _iterator = INLINE_DEVICE_MACRO_REPLACEMENTS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
804
+ var _step_value = _step.value, pattern = _step_value.pattern, getValue = _step_value.getValue;
805
+ var value = getValue(ctx);
806
+ if (value != null && value !== "") {
807
+ url = url.replace(pattern, encodeURIComponent(value));
808
+ }
809
+ }
810
+ } catch (err) {
811
+ _didIteratorError = true;
812
+ _iteratorError = err;
813
+ } finally{
814
+ try {
815
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
816
+ _iterator.return();
817
+ }
818
+ } finally{
819
+ if (_didIteratorError) {
820
+ throw _iteratorError;
821
+ }
822
+ }
823
+ }
824
+ return url;
825
+ }
826
+ function applyDeviceIdentityParams(params, ctx) {
827
+ var _ctx_deviceId, _ctx_deviceIdType;
828
+ var runtimeId = (_ctx_deviceId = ctx.deviceId) === null || _ctx_deviceId === void 0 ? void 0 : _ctx_deviceId.trim();
829
+ var runtimeType = ((_ctx_deviceIdType = ctx.deviceIdType) === null || _ctx_deviceIdType === void 0 ? void 0 : _ctx_deviceIdType.trim()) || inferDeviceIdType();
830
+ var tagRdid = params.get("rdid");
831
+ var tagType = params.get("idtype");
832
+ var tagLat = params.get("is_lat");
833
+ var latValue = ctx.limitAdTracking != null ? ctx.limitAdTracking ? "1" : "0" : void 0;
834
+ if (runtimeId) {
835
+ params.set("rdid", runtimeId);
836
+ params.set("idtype", runtimeType || tagType || "aaid");
837
+ params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : isMacroPlaceholder(tagLat) ? "0" : tagLat);
838
+ return;
839
+ }
840
+ var tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder(tagRdid));
841
+ var tagTypeValid = Boolean(tagType && !isMacroPlaceholder(tagType));
842
+ if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {
843
+ params.delete("rdid");
844
+ params.delete("idtype");
845
+ params.delete("is_lat");
846
+ return;
847
+ }
848
+ if (tagRdidValid) {
849
+ if (isMacroPlaceholder(tagType) && runtimeType) {
850
+ params.set("idtype", runtimeType);
851
+ }
852
+ if (isMacroPlaceholder(tagLat)) {
853
+ params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : "0");
854
+ }
855
+ return;
856
+ }
857
+ params.delete("rdid");
858
+ params.delete("idtype");
859
+ params.delete("is_lat");
860
+ }
861
+ function removeBrokenAppNameOrphans(params, appName) {
862
+ var toDelete = [];
863
+ params.forEach(function(_value, key) {
864
+ if (!key || INVALID_VAST_PARAM_KEY.test(key)) {
865
+ toDelete.push(key);
866
+ }
867
+ });
868
+ if (appName && appName.includes("&")) {
869
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
870
+ try {
871
+ for(var _iterator = appName.split("&").slice(1)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
872
+ var suffix = _step.value;
873
+ var trimmed = suffix.trimStart();
874
+ if (!trimmed) continue;
875
+ toDelete.push(suffix, " ".concat(trimmed), trimmed);
876
+ }
877
+ } catch (err) {
878
+ _didIteratorError = true;
879
+ _iteratorError = err;
880
+ } finally{
881
+ try {
882
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
883
+ _iterator.return();
884
+ }
885
+ } finally{
886
+ if (_didIteratorError) {
887
+ throw _iteratorError;
888
+ }
889
+ }
890
+ }
891
+ }
892
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
893
+ try {
894
+ for(var _iterator1 = new Set(toDelete)[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
895
+ var key = _step1.value;
896
+ if (key) params.delete(key);
897
+ }
898
+ } catch (err) {
899
+ _didIteratorError1 = true;
900
+ _iteratorError1 = err;
901
+ } finally{
902
+ try {
903
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
904
+ _iterator1.return();
905
+ }
906
+ } finally{
907
+ if (_didIteratorError1) {
908
+ throw _iteratorError1;
909
+ }
910
+ }
911
+ }
912
+ }
913
+ function normalizeVastTagUrl(raw) {
914
+ if (!raw) return raw;
915
+ try {
916
+ var url = new URL(raw);
917
+ var anValue = url.searchParams.get("an");
918
+ if (anValue !== null) {
919
+ var orphanFragments = [];
920
+ url.searchParams.forEach(function(_value, key) {
921
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
922
+ orphanFragments.push(key.trim());
923
+ }
924
+ });
925
+ if (orphanFragments.length > 0) {
926
+ var reconstructed = [
927
+ anValue.trimEnd()
928
+ ].concat(_to_consumable_array(orphanFragments)).filter(Boolean).join(" & ");
929
+ url.searchParams.forEach(function(_value, key) {
930
+ if (key && INVALID_VAST_PARAM_KEY.test(key)) {
931
+ url.searchParams.delete(key);
932
+ }
933
+ });
934
+ url.searchParams.set("an", reconstructed);
935
+ return url.toString().replace(/([?&]an=)([^&]*)/, function(_match, prefix, val) {
936
+ return prefix + val.replace(/\+/g, "%20");
937
+ });
938
+ }
939
+ }
940
+ removeBrokenAppNameOrphans(url.searchParams);
941
+ return url.toString();
942
+ } catch (unused) {
943
+ return raw;
944
+ }
945
+ }
946
+ function applyVastMacros(baseUrl, ctx) {
947
+ var expandedUrl = expandInlineMacroPlaceholders(baseUrl, ctx);
948
+ var url;
949
+ try {
950
+ url = new URL(normalizeVastTagUrl(expandedUrl));
951
+ } catch (unused) {
952
+ return replaceCorrelatorFallback(expandedUrl, ctx.correlator);
953
+ }
954
+ var params = url.searchParams;
955
+ removeBrokenAppNameOrphans(params, ctx.appName);
956
+ params.set("correlator", ctx.correlator);
957
+ if (ctx.isCtv) {
958
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
959
+ try {
960
+ for(var _iterator = CTV_UNSUPPORTED_PARAMS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
961
+ var key = _step.value;
962
+ params.delete(key);
963
+ }
964
+ } catch (err) {
965
+ _didIteratorError = true;
966
+ _iteratorError = err;
967
+ } finally{
968
+ try {
969
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
970
+ _iterator.return();
971
+ }
972
+ } finally{
973
+ if (_didIteratorError) {
974
+ throw _iteratorError;
975
+ }
976
+ }
977
+ }
978
+ } else {
979
+ params.set("scor", ctx.streamCorrelator);
980
+ }
981
+ if (ctx.pod != null) {
982
+ params.set("pod", String(ctx.pod));
983
+ }
984
+ if (ctx.adPosition != null) {
985
+ params.set("ppos", String(ctx.adPosition));
986
+ }
987
+ var requestUrl = ctx.contentUrl || ctx.pageUrl;
988
+ if (requestUrl) {
989
+ params.set("url", requestUrl);
990
+ if (!ctx.isCtv) {
991
+ params.set("description_url", requestUrl);
992
+ }
993
+ } else {
994
+ var existingUrl = params.get("url") || "";
995
+ if (EXAMPLE_COM_URL.test(existingUrl)) {
996
+ params.delete("url");
997
+ params.delete("description_url");
998
+ }
999
+ }
1000
+ if (ctx.adWillPlayMuted != null) {
1001
+ params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
1002
+ }
1003
+ if (ctx.adWillAutoPlay != null) {
1004
+ params.set("vpa", ctx.adWillAutoPlay ? "auto" : "click");
1005
+ }
1006
+ if (ctx.appId) {
1007
+ params.set("msid", ctx.appId);
1008
+ }
1009
+ if (ctx.appName) {
1010
+ removeBrokenAppNameOrphans(params, ctx.appName);
1011
+ params.set("an", ctx.appName);
1012
+ }
1013
+ if (ctx.sessionId) {
1014
+ params.set("sid", ctx.sessionId);
1015
+ }
1016
+ if (ctx.deviceTypeHint != null) {
1017
+ params.set("dth", String(ctx.deviceTypeHint));
1018
+ } else if (ctx.isCtv) {
1019
+ params.set("dth", "5");
1020
+ }
1021
+ applyDeviceIdentityParams(params, ctx);
1022
+ if (!ctx.isCtv) {
1023
+ var consent = ctx.consent;
1024
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdpr) != null) {
1025
+ params.set("gdpr", consent.gdpr);
1026
+ }
1027
+ if ((consent === null || consent === void 0 ? void 0 : consent.gdprConsent) != null) {
1028
+ params.set("gdpr_consent", consent.gdprConsent);
1029
+ }
1030
+ if ((consent === null || consent === void 0 ? void 0 : consent.usPrivacy) != null) {
1031
+ params.set("us_privacy", consent.usPrivacy);
1032
+ }
1033
+ }
1034
+ if (ctx.adTest) {
1035
+ params.set("adtest", "on");
1036
+ }
1037
+ var staleKeys = [];
1038
+ params.forEach(function(value, key) {
1039
+ if (isMacroPlaceholder(value)) {
1040
+ staleKeys.push(key);
1041
+ }
1042
+ });
1043
+ var _iteratorNormalCompletion1 = true, _didIteratorError1 = false, _iteratorError1 = undefined;
1044
+ try {
1045
+ for(var _iterator1 = staleKeys[Symbol.iterator](), _step1; !(_iteratorNormalCompletion1 = (_step1 = _iterator1.next()).done); _iteratorNormalCompletion1 = true){
1046
+ var key1 = _step1.value;
1047
+ params.delete(key1);
1048
+ }
1049
+ } catch (err) {
1050
+ _didIteratorError1 = true;
1051
+ _iteratorError1 = err;
1052
+ } finally{
1053
+ try {
1054
+ if (!_iteratorNormalCompletion1 && _iterator1.return != null) {
1055
+ _iterator1.return();
1056
+ }
1057
+ } finally{
1058
+ if (_didIteratorError1) {
1059
+ throw _iteratorError1;
1060
+ }
1061
+ }
1062
+ }
1063
+ removeBrokenAppNameOrphans(params, ctx.appName);
1064
+ return url.toString();
1065
+ }
1066
+ function replaceCorrelatorFallback(baseUrl, correlator) {
1067
+ var correlatorRegex = /([?&])correlator=([^&]*)/;
1068
+ if (correlatorRegex.test(baseUrl)) {
1069
+ return baseUrl.replace(correlatorRegex, "$1correlator=".concat(correlator));
1070
+ }
1071
+ var sep = baseUrl.includes("?") ? "&" : "?";
1072
+ return "".concat(baseUrl).concat(sep, "correlator=").concat(correlator);
738
1073
  }
739
1074
  // src/utils/mqttConfig.ts
740
1075
  var DEFAULT_MQTT_CONFIG = {
@@ -1195,10 +1530,10 @@ function sendHeartbeat(_0) {
1195
1530
  });
1196
1531
  }).apply(this, arguments);
1197
1532
  }
1198
- // src/player/VmapManager.ts
1199
- var VmapManager = /*#__PURE__*/ function() {
1200
- function VmapManager(config, video) {
1201
- _class_call_check(this, VmapManager);
1533
+ // src/player/AdConfigManager.ts
1534
+ var AdConfigManager = /*#__PURE__*/ function() {
1535
+ function AdConfigManager(config, video) {
1536
+ _class_call_check(this, AdConfigManager);
1202
1537
  this.vmapBreaks = [];
1203
1538
  this.consumedVmapBreakIds = /* @__PURE__ */ new Set();
1204
1539
  this.streamCorrelator = generateCorrelator();
@@ -1210,7 +1545,7 @@ var VmapManager = /*#__PURE__*/ function() {
1210
1545
  this.config = config;
1211
1546
  this.video = video;
1212
1547
  }
1213
- _create_class(VmapManager, [
1548
+ _create_class(AdConfigManager, [
1214
1549
  {
1215
1550
  key: "debug",
1216
1551
  get: function get() {
@@ -1228,7 +1563,7 @@ var VmapManager = /*#__PURE__*/ function() {
1228
1563
  key: "fetchAdConfiguration",
1229
1564
  value: function fetchAdConfiguration() {
1230
1565
  return _async_to_generator(function() {
1231
- var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, numberAds;
1566
+ var _data_response_ima_publisherdeskima, _data_response_ima, _data_response, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response1, vastMode, vastEndpoint, apiUrl, headers, response, data, imaPayload, decodedPayload, numberAds;
1232
1567
  return _ts_generator(this, function(_state) {
1233
1568
  switch(_state.label){
1234
1569
  case 0:
@@ -1272,7 +1607,7 @@ var VmapManager = /*#__PURE__*/ function() {
1272
1607
  ];
1273
1608
  }
1274
1609
  if (this.config.vastTagUrl) {
1275
- this.apiVastTagUrl = this.config.vastTagUrl;
1610
+ this.apiVastTagUrl = normalizeVastTagUrl(this.config.vastTagUrl);
1276
1611
  if (this.debug) {
1277
1612
  console.log("[StormcloudVideoPlayer] Using custom VAST tag URL:", this.apiVastTagUrl);
1278
1613
  }
@@ -1312,9 +1647,16 @@ var VmapManager = /*#__PURE__*/ function() {
1312
1647
  data = _state.sent();
1313
1648
  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
1649
  if (imaPayload) {
1315
- this.apiVastTagUrl = decodeURIComponent(imaPayload);
1650
+ decodedPayload = imaPayload;
1651
+ try {
1652
+ decodedPayload = decodeURIComponent(imaPayload);
1653
+ } catch (unused) {
1654
+ console.warn("[StormcloudVideoPlayer] imaPayload was not URI-encoded; using as-is:", imaPayload);
1655
+ }
1656
+ console.log("[StormcloudVideoPlayer] Raw VAST tag URL (from API):", decodedPayload);
1657
+ this.apiVastTagUrl = normalizeVastTagUrl(decodedPayload);
1316
1658
  if (this.debug) {
1317
- console.log("[StormcloudVideoPlayer] Extracted VAST tag URL from /ads/web:", this.apiVastTagUrl);
1659
+ console.log("[StormcloudVideoPlayer] Normalized VAST tag URL:", this.apiVastTagUrl);
1318
1660
  }
1319
1661
  } else {
1320
1662
  if (this.debug) {
@@ -1627,28 +1969,30 @@ var VmapManager = /*#__PURE__*/ function() {
1627
1969
  for(var i = 0; i < count; i++){
1628
1970
  this.adRequestPositionInBreak++;
1629
1971
  var adWillPlayMuted = inAdBreak ? adPlayer.getOriginalMutedState() : this.video.muted;
1630
- var ctvSignals = this.config.ctvAdRequest ? resolveCtvVastSignals() : void 0;
1972
+ var envSignals = resolveVastEnvironmentSignals(!!this.config.ctvAdRequest);
1631
1973
  var urlWithMacros = applyVastMacros(baseUrl, {
1632
1974
  correlator: generateCorrelator(),
1633
1975
  streamCorrelator: this.streamCorrelator,
1634
1976
  pod: this.podCounter > 0 ? this.podCounter : void 0,
1635
1977
  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,
1978
+ isCtv: envSignals.isCtv,
1979
+ contentUrl: envSignals.contentUrl,
1980
+ pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? window.location.href : void 0,
1639
1981
  adWillPlayMuted: adWillPlayMuted,
1640
1982
  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,
1983
+ appId: envSignals.appId,
1984
+ appName: envSignals.appName,
1985
+ sessionId: envSignals.sessionId,
1986
+ deviceId: envSignals.deviceId,
1987
+ deviceIdType: envSignals.deviceIdType,
1988
+ limitAdTracking: envSignals.limitAdTracking,
1989
+ deviceTypeHint: envSignals.deviceTypeHint,
1648
1990
  adTest: this.config.adTest,
1649
1991
  consent: this.consentSignals
1650
1992
  });
1651
- urls.push(palNonce.injectNonce(urlWithMacros));
1993
+ var finalUrl = palNonce.injectNonce(urlWithMacros);
1994
+ console.log("[StormcloudVideoPlayer] Resolved ad request URL (pod=".concat(this.podCounter, ", pos=").concat(this.adRequestPositionInBreak, "):"), finalUrl);
1995
+ urls.push(finalUrl);
1652
1996
  }
1653
1997
  return urls;
1654
1998
  }
@@ -1697,10 +2041,10 @@ var VmapManager = /*#__PURE__*/ function() {
1697
2041
  }
1698
2042
  }
1699
2043
  ]);
1700
- return VmapManager;
2044
+ return AdConfigManager;
1701
2045
  }();
1702
2046
  // Annotate the CommonJS export names for ESM import in node:
1703
2047
  0 && (module.exports = {
1704
- VmapManager: VmapManager
2048
+ AdConfigManager: AdConfigManager
1705
2049
  });
1706
- //# sourceMappingURL=VmapManager.cjs.map
2050
+ //# sourceMappingURL=AdConfigManager.cjs.map