stormcloud-video-player 0.8.60 → 0.8.62

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 (54) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/Player.cjs.map +1 -1
  3. package/lib/StormcloudPlayer.cjs +83 -29
  4. package/lib/StormcloudPlayer.cjs.map +1 -1
  5. package/lib/index.cjs +87 -31
  6. package/lib/index.cjs.map +1 -1
  7. package/lib/index.d.ts +4034 -0
  8. package/lib/index.js +13001 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/patterns.cjs.map +1 -1
  11. package/lib/player/AdBreakOrchestrator.cjs +3 -2
  12. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.cjs +53 -11
  14. package/lib/player/AdConfigManager.cjs.map +1 -1
  15. package/lib/player/AdTimingService.cjs.map +1 -1
  16. package/lib/player/HlsEngine.cjs.map +1 -1
  17. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  18. package/lib/player/PlayerControls.cjs.map +1 -1
  19. package/lib/player/Scte35CueManager.cjs.map +1 -1
  20. package/lib/player/Scte35Parser.cjs.map +1 -1
  21. package/lib/player/StormcloudVideoPlayer.cjs +83 -29
  22. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  23. package/lib/player/playerTypes.cjs.map +1 -1
  24. package/lib/players/FilePlayer.cjs.map +1 -1
  25. package/lib/players/HlsPlayer.cjs +83 -29
  26. package/lib/players/HlsPlayer.cjs.map +1 -1
  27. package/lib/players/index.cjs +83 -29
  28. package/lib/players/index.cjs.map +1 -1
  29. package/lib/props.cjs.map +1 -1
  30. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  31. package/lib/sdk/pal.cjs +9 -5
  32. package/lib/sdk/pal.cjs.map +1 -1
  33. package/lib/sdk/pal.d.cts +1 -0
  34. package/lib/types.cjs.map +1 -1
  35. package/lib/types.d.cts +1 -0
  36. package/lib/ui/StormcloudVideoPlayer.cjs +87 -31
  37. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  38. package/lib/utils/browserCompat.cjs.map +1 -1
  39. package/lib/utils/ctvVastSignals.cjs +25 -4
  40. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  41. package/lib/utils/devUrl.cjs.map +1 -1
  42. package/lib/utils/polyfills.cjs.map +1 -1
  43. package/lib/utils/tracking.cjs +3 -2
  44. package/lib/utils/tracking.cjs.map +1 -1
  45. package/lib/utils/trackingIngest.cjs.map +1 -1
  46. package/lib/utils/vastEnvironmentSignals.cjs +27 -5
  47. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  48. package/lib/utils/vastEnvironmentSignals.d.cts +1 -1
  49. package/lib/utils/vastMacros.cjs +24 -4
  50. package/lib/utils/vastMacros.cjs.map +1 -1
  51. package/lib/utils/vastMacros.d.cts +2 -0
  52. package/lib/utils/vastTrackingMacros.cjs.map +1 -1
  53. package/lib/utils.cjs.map +1 -1
  54. package/package.json +5 -3
@@ -2898,6 +2898,7 @@ function toDevSafeUrl(rawUrl) {
2898
2898
  // src/sdk/pal.ts
2899
2899
  var PAL_SDK_URL = "https://imasdk.googleapis.com/pal/sdkloader/pal.js";
2900
2900
  var _nonceLoader;
2901
+ var _nonceLoaderAllowStorage;
2901
2902
  var _palLoadPromise;
2902
2903
  function loadPalSdk() {
2903
2904
  var _window_goog;
@@ -2940,12 +2941,15 @@ function loadPalSdk() {
2940
2941
  });
2941
2942
  return _palLoadPromise;
2942
2943
  }
2943
- function getOrCreateNonceLoader() {
2944
- if (_nonceLoader) return _nonceLoader;
2944
+ function getOrCreateNonceLoader(allowStorage) {
2945
+ if (_nonceLoader && _nonceLoaderAllowStorage === allowStorage) {
2946
+ return _nonceLoader;
2947
+ }
2945
2948
  var goog = window.goog;
2946
2949
  var consentSettings = new goog.pal.ConsentSettings();
2947
- consentSettings.allowStorage = true;
2950
+ consentSettings.allowStorage = allowStorage;
2948
2951
  _nonceLoader = new goog.pal.NonceLoader(consentSettings);
2952
+ _nonceLoaderAllowStorage = allowStorage;
2949
2953
  return _nonceLoader;
2950
2954
  }
2951
2955
  function createPalNonceManager() {
@@ -2954,7 +2958,7 @@ function createPalNonceManager() {
2954
2958
  return {
2955
2959
  generateNonce: function generateNonce() {
2956
2960
  return _async_to_generator(function() {
2957
- var options, _options_adWillAutoPlay, _options_adWillPlayMuted, _options_playerVolume, _options_continuousPlayback, loader, goog, request, manager, error;
2961
+ var options, _options_allowStorage, _options_adWillAutoPlay, _options_adWillPlayMuted, _options_playerVolume, _options_continuousPlayback, loader, goog, request, manager, error;
2958
2962
  var _arguments = arguments;
2959
2963
  return _ts_generator(this, function(_state) {
2960
2964
  switch(_state.label){
@@ -2974,7 +2978,7 @@ function createPalNonceManager() {
2974
2978
  ];
2975
2979
  case 2:
2976
2980
  _state.sent();
2977
- loader = getOrCreateNonceLoader();
2981
+ loader = getOrCreateNonceLoader((_options_allowStorage = options.allowStorage) !== null && _options_allowStorage !== void 0 ? _options_allowStorage : true);
2978
2982
  goog = window.goog;
2979
2983
  request = new goog.pal.NonceRequest();
2980
2984
  request.adWillAutoPlay = (_options_adWillAutoPlay = options.adWillAutoPlay) !== null && _options_adWillAutoPlay !== void 0 ? _options_adWillAutoPlay : true;
@@ -3159,6 +3163,8 @@ function ingestPlayerTracking(licenseKey, channel, body) {
3159
3163
  }
3160
3164
  // src/utils/vastEnvironmentSignals.ts
3161
3165
  var CTV_SESSION_STORAGE_KEY = "stormcloud.ctv.sid";
3166
+ var WEB_SESSION_STORAGE_KEY = "stormcloud.web.sid";
3167
+ var inMemoryWebSessionId;
3162
3168
  var PLAYER_ID_STORAGE_KEY = "stormcloud.player.id";
3163
3169
  var DEVICE_ID_STORAGE_KEYS = [
3164
3170
  "rdid",
@@ -3180,7 +3186,7 @@ function resolveVastEnvironmentSignals(isCtv) {
3180
3186
  var _ref;
3181
3187
  var bridgeSignals = readNativeBridgeSignals();
3182
3188
  var platformDevice = readPlatformNativeDeviceId();
3183
- var realDeviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;
3189
+ var realDeviceId = bridgeSignals.deviceId || (isCtv ? readStoredDeviceId() : void 0) || platformDevice.deviceId;
3184
3190
  var deviceId = realDeviceId;
3185
3191
  var deviceIdType = bridgeSignals.deviceIdType || readStoredString("deviceIdType") || readStoredString("idtype") || platformDevice.deviceIdType || inferDeviceIdType();
3186
3192
  var platformLat = bridgeSignals.deviceId ? bridgeSignals.limitAdTracking : platformDevice.limitAdTracking;
@@ -3209,9 +3215,12 @@ function resolveVastEnvironmentSignals(isCtv) {
3209
3215
  deviceTypeHint: deviceTypeHint
3210
3216
  });
3211
3217
  }
3218
+ var webSessionId = getOrCreateWebSessionId();
3212
3219
  return _object_spread_props(_object_spread({
3213
3220
  isCtv: false
3214
- }, deviceId ? {
3221
+ }, webSessionId ? {
3222
+ sessionId: webSessionId
3223
+ } : {}, deviceId ? {
3215
3224
  deviceId: deviceId
3216
3225
  } : {}, deviceId && deviceIdType ? {
3217
3226
  deviceIdType: deviceIdType
@@ -3252,7 +3261,7 @@ var GAME_CONSOLE_UA = /PlayStation|Xbox|Nintendo/i;
3252
3261
  var CONNECTED_TV_UA = /Web0S|webOS|Tizen|SMART-TV|SmartTV|NetCast|BRAVIA|HbbTV|VIDAA|Hisense|Philips|Viera|AQUOS|Android TV|Google TV|\bTV\b/i;
3253
3262
  var FEATURE_PHONE_UA = /KAIOS|MIDP|J2ME|Series40|Opera Mini/i;
3254
3263
  function resolveDeviceTypeHint(isCtv) {
3255
- var override = readDeviceTypeHintOverride();
3264
+ var override = readDeviceTypeHintOverride(isCtv);
3256
3265
  if (override != null) return override;
3257
3266
  return inferDeviceTypeHint(isCtv);
3258
3267
  }
@@ -3279,7 +3288,7 @@ function inferDeviceTypeHint(isCtv) {
3279
3288
  if (/Mobile|Windows Phone|BlackBerry/i.test(ua)) return DEVICE_TYPE_HINT.SMARTPHONE;
3280
3289
  return fallback;
3281
3290
  }
3282
- function readDeviceTypeHintOverride() {
3291
+ function readDeviceTypeHintOverride(isCtv) {
3283
3292
  if (typeof window === "undefined") return void 0;
3284
3293
  var keys = [
3285
3294
  "dth",
@@ -3328,6 +3337,7 @@ function readDeviceTypeHintOverride() {
3328
3337
  }
3329
3338
  }
3330
3339
  }
3340
+ if (!isCtv) return void 0;
3331
3341
  for(var _i = 0, _iter = [
3332
3342
  "stormcloud.dth",
3333
3343
  "dth"
@@ -3376,9 +3386,10 @@ function isEquivalentDeviceIdType(tagType, runtimeType) {
3376
3386
  return ANDROID_ID_TYPES.has(tag) && ANDROID_ID_TYPES.has(runtime);
3377
3387
  }
3378
3388
  function resolveNativeDeviceId() {
3389
+ var includeStored = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
3379
3390
  var bridgeSignals = readNativeBridgeSignals();
3380
3391
  var platformDevice = readPlatformNativeDeviceId();
3381
- var deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;
3392
+ var deviceId = bridgeSignals.deviceId || (includeStored ? readStoredDeviceId() : void 0) || platformDevice.deviceId;
3382
3393
  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {
3383
3394
  return void 0;
3384
3395
  }
@@ -3407,6 +3418,21 @@ function getOrCreateCtvSessionId() {
3407
3418
  writePersistentId(CTV_SESSION_STORAGE_KEY, sessionId);
3408
3419
  return sessionId;
3409
3420
  }
3421
+ function getOrCreateWebSessionId() {
3422
+ if (typeof window === "undefined") return void 0;
3423
+ try {
3424
+ var _window_sessionStorage;
3425
+ var existing = (_window_sessionStorage = window.sessionStorage) === null || _window_sessionStorage === void 0 ? void 0 : _window_sessionStorage.getItem(WEB_SESSION_STORAGE_KEY);
3426
+ if (existing && !isMacroPlaceholder(existing)) return existing;
3427
+ } catch (unused) {}
3428
+ var sessionId = inMemoryWebSessionId || createUuid();
3429
+ inMemoryWebSessionId = sessionId;
3430
+ try {
3431
+ var _window_sessionStorage1;
3432
+ (_window_sessionStorage1 = window.sessionStorage) === null || _window_sessionStorage1 === void 0 ? void 0 : _window_sessionStorage1.setItem(WEB_SESSION_STORAGE_KEY, sessionId);
3433
+ } catch (unused) {}
3434
+ return sessionId;
3435
+ }
3410
3436
  function readPersistentId(storageKey) {
3411
3437
  return readStoredString(storageKey) || readCookie(storageKey);
3412
3438
  }
@@ -4008,7 +4034,7 @@ function sha256Hex(input) {
4008
4034
  })();
4009
4035
  }
4010
4036
  function resolvePlayerIdentitySeed(clientInfo) {
4011
- var nativeDeviceId = resolveNativeDeviceId();
4037
+ var nativeDeviceId = resolveNativeDeviceId(clientInfo.isSmartTV);
4012
4038
  if (nativeDeviceId) {
4013
4039
  return "device:".concat(nativeDeviceId);
4014
4040
  }
@@ -4777,6 +4803,12 @@ function applyDeviceIdentityParams(params, ctx) {
4777
4803
  params.set("is_lat", latValue !== null && latValue !== void 0 ? latValue : isMacroPlaceholder2(tagLat) ? "0" : tagLat);
4778
4804
  return;
4779
4805
  }
4806
+ if (!ctx.isCtv) {
4807
+ params.delete("rdid");
4808
+ params.delete("idtype");
4809
+ params.delete("is_lat");
4810
+ return;
4811
+ }
4780
4812
  var tagRdidValid = Boolean(tagRdid && !isMacroPlaceholder2(tagRdid));
4781
4813
  var tagTypeValid = Boolean(tagType && !isMacroPlaceholder2(tagType));
4782
4814
  if (tagRdidValid && tagTypeValid && runtimeType && !isEquivalentDeviceIdType(tagType, runtimeType)) {
@@ -4931,15 +4963,24 @@ function applyVastMacros(baseUrl, ctx) {
4931
4963
  if (ctx.podMaxAds != null) {
4932
4964
  params.set("pmad", String(Math.max(1, Math.round(ctx.podMaxAds))));
4933
4965
  }
4934
- if (!ctx.isCtv && ctx.pageUrl) {
4935
- params.set("url", ctx.pageUrl);
4936
- params.set("description_url", ctx.pageUrl);
4937
- }
4938
4966
  var existingUrl = params.get("url") || "";
4939
4967
  if (EXAMPLE_COM_URL.test(existingUrl)) {
4940
4968
  params.delete("url");
4941
4969
  params.delete("description_url");
4942
4970
  }
4971
+ if (!ctx.isCtv && ctx.pageUrl) {
4972
+ if (isMacroPlaceholder2(params.get("url"))) {
4973
+ params.set("url", ctx.pageUrl);
4974
+ }
4975
+ if (isMacroPlaceholder2(params.get("description_url"))) {
4976
+ params.set("description_url", params.get("url") || ctx.pageUrl);
4977
+ }
4978
+ }
4979
+ if (!ctx.isCtv) {
4980
+ params.delete("an");
4981
+ params.delete("msid");
4982
+ params.delete("sid");
4983
+ }
4943
4984
  if (ctx.adWillPlayMuted != null) {
4944
4985
  params.set("vpmute", ctx.adWillPlayMuted ? "1" : "0");
4945
4986
  }
@@ -4973,6 +5014,9 @@ function applyVastMacros(baseUrl, ctx) {
4973
5014
  if (ctx.programTitle) {
4974
5015
  params.set("ct_ti", ctx.programTitle);
4975
5016
  }
5017
+ if (ctx.channelName) {
5018
+ params.set("ct_ch", ctx.channelName);
5019
+ }
4976
5020
  var staleKeys = [];
4977
5021
  params.forEach(function(value, key) {
4978
5022
  if (isMacroPlaceholder2(value)) {
@@ -5025,8 +5069,10 @@ function fetchConsentSignals() {
5025
5069
  tcfApi("addEventListener", 2, function(tcData, success) {
5026
5070
  if (settled) return;
5027
5071
  if (success && tcData && (tcData.eventStatus === "tcloaded" || tcData.eventStatus === "useractioncomplete")) {
5072
+ var _tcData_purpose_consents, _tcData_purpose;
5028
5073
  settled = true;
5029
5074
  signals.gdpr = tcData.gdprApplies ? "1" : "0";
5075
+ signals.storageAllowed = tcData.gdprApplies ? ((_tcData_purpose = tcData.purpose) === null || _tcData_purpose === void 0 ? void 0 : (_tcData_purpose_consents = _tcData_purpose.consents) === null || _tcData_purpose_consents === void 0 ? void 0 : _tcData_purpose_consents[1]) === true : true;
5030
5076
  if (typeof tcData.tcString === "string" && tcData.tcString) {
5031
5077
  signals.gdprConsent = tcData.tcString;
5032
5078
  }
@@ -6559,7 +6605,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
6559
6605
  pageUrl: !envSignals.isCtv && typeof window !== "undefined" ? toDevSafeUrl(window.location.href) : void 0,
6560
6606
  adWillPlayMuted: adWillPlayMuted,
6561
6607
  adWillAutoPlay: !!this.config.autoplay,
6562
- sessionId: envSignals.sessionId,
6608
+ sessionId: envSignals.isCtv || this.consentSignals.storageAllowed !== false ? envSignals.sessionId : void 0,
6563
6609
  deviceId: envSignals.deviceId,
6564
6610
  deviceIdType: envSignals.deviceIdType,
6565
6611
  limitAdTracking: envSignals.limitAdTracking,
@@ -6567,6 +6613,8 @@ var AdConfigManager = /*#__PURE__*/ function() {
6567
6613
  adTest: this.config.adTest
6568
6614
  }, this.config.programTitle ? {
6569
6615
  programTitle: this.config.programTitle
6616
+ } : {}, this.config.channelName ? {
6617
+ channelName: this.config.channelName
6570
6618
  } : {}), {
6571
6619
  consent: this.consentSignals
6572
6620
  }));
@@ -9687,7 +9735,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
9687
9735
  // ───────────────────────────────────────────────────────────────
9688
9736
  function load() {
9689
9737
  return _async_to_generator(function() {
9690
- var _this, _this_config_lowLatencyMode, error, palDescriptionUrl, continueLiveStreamDuringAds;
9738
+ var _this, error, palDescriptionUrl, continueLiveStreamDuringAds;
9691
9739
  return _ts_generator(this, function(_state) {
9692
9740
  switch(_state.label){
9693
9741
  case 0:
@@ -9723,19 +9771,25 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
9723
9771
  4
9724
9772
  ];
9725
9773
  case 4:
9726
- palDescriptionUrl = this.adConfig.getPalDescriptionUrl();
9727
- this.palNonce.generateNonce(_object_spread({
9728
- videoWidth: this.video.offsetWidth || this.video.clientWidth || 640,
9729
- videoHeight: this.video.offsetHeight || this.video.clientHeight || 480,
9730
- adWillAutoPlay: !!this.config.autoplay,
9731
- adWillPlayMuted: true,
9732
- playerVolume: 0,
9733
- continuousPlayback: (_this_config_lowLatencyMode = this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
9734
- }, palDescriptionUrl ? {
9735
- descriptionUrl: palDescriptionUrl
9736
- } : {})).catch(function() {});
9737
- fetchConsentSignals().then(function(signals) {
9774
+ palDescriptionUrl = this.config.ctvAdRequest ? this.adConfig.getPalDescriptionUrl() : void 0;
9775
+ fetchConsentSignals().catch(function() {
9776
+ return {};
9777
+ }).then(function(signals) {
9778
+ var _this_config_lowLatencyMode;
9738
9779
  _this.adConfig.consentSignals = signals;
9780
+ var muted = _this.video.muted;
9781
+ return _this.palNonce.generateNonce(_object_spread({
9782
+ videoWidth: _this.video.offsetWidth || _this.video.clientWidth || 640,
9783
+ videoHeight: _this.video.offsetHeight || _this.video.clientHeight || 480,
9784
+ adWillAutoPlay: !!_this.config.autoplay,
9785
+ adWillPlayMuted: muted,
9786
+ playerVolume: muted ? 0 : _this.video.volume,
9787
+ continuousPlayback: (_this_config_lowLatencyMode = _this.config.lowLatencyMode) !== null && _this_config_lowLatencyMode !== void 0 ? _this_config_lowLatencyMode : false
9788
+ }, palDescriptionUrl ? {
9789
+ descriptionUrl: palDescriptionUrl
9790
+ } : {}, signals.storageAllowed != null ? {
9791
+ allowStorage: signals.storageAllowed
9792
+ } : {}));
9739
9793
  }).catch(function() {});
9740
9794
  this.adConfig.initializeTracking();
9741
9795
  if (!this.hlsEngine.shouldUseNativeHls(function() {