stormcloud-video-player 0.8.74 → 0.8.76

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 (40) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/Player.cjs +10 -12
  3. package/lib/Player.cjs.map +1 -1
  4. package/lib/StormcloudPlayer.cjs +165 -79
  5. package/lib/StormcloudPlayer.cjs.map +1 -1
  6. package/lib/index.cjs +176 -134
  7. package/lib/index.cjs.map +1 -1
  8. package/lib/index.d.cts +1 -1
  9. package/lib/index.d.ts +5 -19
  10. package/lib/index.js +170 -132
  11. package/lib/index.js.map +1 -1
  12. package/lib/player/AdBreakOrchestrator.cjs +45 -13
  13. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  14. package/lib/player/AdConfigManager.cjs +19 -4
  15. package/lib/player/AdConfigManager.cjs.map +1 -1
  16. package/lib/player/AdConfigManager.d.cts +3 -0
  17. package/lib/player/EdgePodRequest.cjs +31 -1
  18. package/lib/player/EdgePodRequest.cjs.map +1 -1
  19. package/lib/player/EdgePodRequest.d.cts +21 -3
  20. package/lib/player/FloorLadder.cjs +86 -27
  21. package/lib/player/FloorLadder.cjs.map +1 -1
  22. package/lib/player/FloorLadder.d.cts +8 -7
  23. package/lib/player/StormcloudVideoPlayer.cjs +165 -79
  24. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  25. package/lib/player/StormcloudVideoPlayer.d.cts +3 -9
  26. package/lib/players/HlsPlayer.cjs +165 -79
  27. package/lib/players/HlsPlayer.cjs.map +1 -1
  28. package/lib/players/index.cjs +165 -79
  29. package/lib/players/index.cjs.map +1 -1
  30. package/lib/props.cjs +10 -12
  31. package/lib/props.cjs.map +1 -1
  32. package/lib/types.d.cts +3 -7
  33. package/lib/ui/StormcloudVideoPlayer.cjs +169 -140
  34. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  35. package/lib/utils/tracking.cjs +7 -0
  36. package/lib/utils/tracking.cjs.map +1 -1
  37. package/lib/utils/tracking.d.cts +2 -1
  38. package/lib/utils/vastMacros.cjs +2 -1
  39. package/lib/utils/vastMacros.cjs.map +1 -1
  40. package/package.json +1 -1
package/lib/index.cjs CHANGED
@@ -412,8 +412,8 @@ __export(index_exports, {
412
412
  DEFAULT_TRACKING_INGEST_CONFIG: function DEFAULT_TRACKING_INGEST_CONFIG1() {
413
413
  return DEFAULT_TRACKING_INGEST_CONFIG;
414
414
  },
415
- DEFAULT_WEB_FLOOR_LADDER_CONFIG: function DEFAULT_WEB_FLOOR_LADDER_CONFIG1() {
416
- return DEFAULT_WEB_FLOOR_LADDER_CONFIG;
415
+ DISABLED_FLOOR_LADDER_CONFIG: function DISABLED_FLOOR_LADDER_CONFIG1() {
416
+ return DISABLED_FLOOR_LADDER_CONFIG;
417
417
  },
418
418
  GAM_AD_OPPORTUNITY_DURATION_MS: function GAM_AD_OPPORTUNITY_DURATION_MS1() {
419
419
  return GAM_AD_OPPORTUNITY_DURATION_MS;
@@ -511,6 +511,9 @@ __export(index_exports, {
511
511
  omit: function omit1() {
512
512
  return omit;
513
513
  },
514
+ parseApiFloorLadder: function parseApiFloorLadder1() {
515
+ return parseApiFloorLadder;
516
+ },
514
517
  parseQuery: function parseQuery1() {
515
518
  return parseQuery;
516
519
  },
@@ -1546,9 +1549,10 @@ function resolveScvpMacroValues(ctx) {
1546
1549
  var deviceId = (_ctx_deviceId = ctx.deviceId) === null || _ctx_deviceId === void 0 ? void 0 : _ctx_deviceId.trim();
1547
1550
  var deviceIdType = deviceId ? ((_ctx_deviceIdType = ctx.deviceIdType) === null || _ctx_deviceIdType === void 0 ? void 0 : _ctx_deviceIdType.trim()) || inferDeviceIdType() : void 0;
1548
1551
  if (deviceId && deviceIdType) {
1552
+ var _toFlag;
1549
1553
  set("RDID", deviceId);
1550
1554
  set("IDTYPE", deviceIdType);
1551
- set("IS-LAT", toFlag(ctx.limitAdTracking));
1555
+ set("IS-LAT", (_toFlag = toFlag(ctx.limitAdTracking)) !== null && _toFlag !== void 0 ? _toFlag : "0");
1552
1556
  }
1553
1557
  set("SID", ctx.sessionId);
1554
1558
  set("DTH", ctx.deviceTypeHint);
@@ -1883,21 +1887,19 @@ function fetchConsentSignals() {
1883
1887
  });
1884
1888
  }
1885
1889
  // src/player/FloorLadder.ts
1886
- var DEFAULT_WEB_FLOOR_LADDER_CONFIG = Object.freeze({
1890
+ var DISABLED_FLOOR_LADDER_CONFIG = Object.freeze({
1887
1891
  enabled: false,
1888
- targetingKey: "airytv_web_floor",
1889
- minFloorCents: 25,
1890
- maxFloorCents: 300,
1891
- stepCents: 25,
1892
- selectedFloorCents: 25,
1893
- fallbackFloorCents: 25,
1892
+ targetingKey: "",
1893
+ minFloorCents: 0,
1894
+ maxFloorCents: 0,
1895
+ stepCents: 0,
1896
+ selectedFloorCents: 0,
1897
+ fallbackFloorCents: 0,
1894
1898
  readyFloorCents: [],
1895
1899
  mode: "fixed",
1896
- allowedPositions: [
1897
- "midroll"
1898
- ],
1899
- targetAdUnitPath: "/21821455290/airytvadx/airytv-web",
1900
- configurationVersion: "2026-09-29.1"
1900
+ allowedPositions: [],
1901
+ targetAdUnitPath: "",
1902
+ configurationVersion: ""
1901
1903
  });
1902
1904
  var DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({
1903
1905
  minCents: 25,
@@ -2056,7 +2058,6 @@ function resolveOpportunityFloor(config, context) {
2056
2058
  if (!config.enabled) return skipped("disabled");
2057
2059
  var positions = Array.isArray(config.allowedPositions) ? config.allowedPositions : [];
2058
2060
  if (positions.indexOf(context.position) === -1) return skipped("position_not_allowed");
2059
- if (context.isCtv) return skipped("ctv_excluded");
2060
2061
  if (!config.targetingKey) return skipped("missing_targeting_key");
2061
2062
  if (!config.targetAdUnitPath) return skipped("missing_target_ad_unit");
2062
2063
  var result;
@@ -2210,15 +2211,80 @@ function mergeDefined(target, update) {
2210
2211
  }
2211
2212
  return copyConfig(next);
2212
2213
  }
2214
+ var AD_POSITIONS = [
2215
+ "preroll",
2216
+ "midroll",
2217
+ "postroll"
2218
+ ];
2219
+ function finiteNumber(value) {
2220
+ return typeof value === "number" && isFinite(value) ? value : void 0;
2221
+ }
2222
+ function parseApiFloorLadder(raw) {
2223
+ if (!raw || (typeof raw === "undefined" ? "undefined" : _type_of(raw)) !== "object" || Array.isArray(raw)) return void 0;
2224
+ var src = raw;
2225
+ var out = {};
2226
+ if (typeof src.enabled === "boolean") out.enabled = src.enabled;
2227
+ if (typeof src.targetingKey === "string") out.targetingKey = src.targetingKey;
2228
+ if (typeof src.targetAdUnitPath === "string") out.targetAdUnitPath = src.targetAdUnitPath;
2229
+ if (typeof src.configurationVersion === "string") out.configurationVersion = src.configurationVersion;
2230
+ if (typeof src.mode === "string") out.mode = src.mode;
2231
+ var min = finiteNumber(src.minFloorCents);
2232
+ var max = finiteNumber(src.maxFloorCents);
2233
+ var step = finiteNumber(src.stepCents);
2234
+ var selected = finiteNumber(src.selectedFloorCents);
2235
+ var fallback = finiteNumber(src.fallbackFloorCents);
2236
+ if (min !== void 0) out.minFloorCents = min;
2237
+ if (max !== void 0) out.maxFloorCents = max;
2238
+ if (step !== void 0) out.stepCents = step;
2239
+ if (selected !== void 0) out.selectedFloorCents = selected;
2240
+ if (fallback !== void 0) out.fallbackFloorCents = fallback;
2241
+ if (Array.isArray(src.readyFloorCents)) {
2242
+ out.readyFloorCents = src.readyFloorCents.filter(function(cents) {
2243
+ return finiteNumber(cents) !== void 0;
2244
+ });
2245
+ }
2246
+ if (Array.isArray(src.allowedPositions)) {
2247
+ out.allowedPositions = src.allowedPositions.filter(function(position) {
2248
+ return AD_POSITIONS.indexOf(position) !== -1;
2249
+ });
2250
+ }
2251
+ return out;
2252
+ }
2213
2253
  var FloorLadderController = /*#__PURE__*/ function() {
2214
- function FloorLadderController(initial, bounds) {
2215
- var selector = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : fixedFloorSelector;
2254
+ function FloorLadderController() {
2255
+ var selector = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : fixedFloorSelector;
2216
2256
  _class_call_check(this, FloorLadderController);
2217
- this.config = mergeDefined(copyConfig(DEFAULT_WEB_FLOOR_LADDER_CONFIG), initial);
2218
- this.bounds = Object.freeze(resolveFloorLadderBounds(bounds));
2257
+ this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;
2258
+ this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);
2219
2259
  this.selector = selector;
2220
2260
  }
2221
2261
  _create_class(FloorLadderController, [
2262
+ {
2263
+ key: "isEnabled",
2264
+ value: function isEnabled() {
2265
+ return this.config.enabled === true;
2266
+ }
2267
+ },
2268
+ {
2269
+ key: "applyApiConfig",
2270
+ value: function applyApiConfig(raw) {
2271
+ var parsed = parseApiFloorLadder(raw);
2272
+ this.config = mergeDefined(copyConfig(DISABLED_FLOOR_LADDER_CONFIG), parsed);
2273
+ this.bounds = Object.freeze({
2274
+ minCents: this.config.minFloorCents,
2275
+ maxCents: this.config.maxFloorCents,
2276
+ stepCents: this.config.stepCents
2277
+ });
2278
+ return validateFloorLadderConfig(this.config, this.bounds);
2279
+ }
2280
+ },
2281
+ {
2282
+ key: "reset",
2283
+ value: function reset() {
2284
+ this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);
2285
+ this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;
2286
+ }
2287
+ },
2222
2288
  {
2223
2289
  key: "get",
2224
2290
  value: function get() {
@@ -2231,13 +2297,6 @@ var FloorLadderController = /*#__PURE__*/ function() {
2231
2297
  return _object_spread({}, this.bounds);
2232
2298
  }
2233
2299
  },
2234
- {
2235
- key: "update",
2236
- value: function update(update) {
2237
- this.config = mergeDefined(this.config, update);
2238
- return validateFloorLadderConfig(this.config, this.bounds);
2239
- }
2240
- },
2241
2300
  {
2242
2301
  key: "validate",
2243
2302
  value: function validate() {
@@ -6499,6 +6558,9 @@ function resolvePlayerIdentitySeed(clientInfo) {
6499
6558
  }
6500
6559
  return "fingerprint:".concat(JSON.stringify(clientInfo));
6501
6560
  }
6561
+ function getCachedBrowserId() {
6562
+ return cachedBrowserId !== null && cachedBrowserId !== void 0 ? cachedBrowserId : void 0;
6563
+ }
6502
6564
  function getBrowserID(clientInfo) {
6503
6565
  return _async_to_generator(function() {
6504
6566
  return _ts_generator(this, function(_state) {
@@ -8168,7 +8230,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
8168
8230
  key: "fetchAdConfiguration",
8169
8231
  value: function fetchAdConfiguration() {
8170
8232
  return _async_to_generator(function() {
8171
- 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, apiUrl, headers, response, data, imaPayload, decodedPayload, numberAds;
8233
+ var _data_response, _data_response1, _data_response2, _data_response_ima_publisherdeskima, _data_response_ima, _data_response3, _data_response_options_vast_cue_tones, _data_response_options_vast, _data_response_options, _data_response4, apiUrl, headers, response, data, apiEnableEdge, apiEdgeUrl, imaPayload, decodedPayload, numberAds;
8172
8234
  return _ts_generator(this, function(_state) {
8173
8235
  switch(_state.label){
8174
8236
  case 0:
@@ -8228,7 +8290,21 @@ var AdConfigManager = /*#__PURE__*/ function() {
8228
8290
  ];
8229
8291
  case 4:
8230
8292
  data = _state.sent();
8231
- 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;
8293
+ apiEnableEdge = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : _data_response.enableEdgePodRequest;
8294
+ apiEdgeUrl = (_data_response1 = data.response) === null || _data_response1 === void 0 ? void 0 : _data_response1.edgePodUrl;
8295
+ this.apiEnableEdgePodRequest = typeof apiEnableEdge === "boolean" ? apiEnableEdge : void 0;
8296
+ this.apiEdgePodUrl = typeof apiEdgeUrl === "string" ? apiEdgeUrl : void 0;
8297
+ if (this.debug) {
8298
+ console.log("[StormcloudVideoPlayer] Edge pod settings from API:", {
8299
+ enableEdgePodRequest: this.apiEnableEdgePodRequest,
8300
+ edgePodUrl: this.apiEdgePodUrl
8301
+ });
8302
+ }
8303
+ this.apiFloorLadder = (_data_response2 = data.response) === null || _data_response2 === void 0 ? void 0 : _data_response2.floorLadder;
8304
+ if (this.debug) {
8305
+ console.log(this.apiFloorLadder ? "[StormcloudVideoPlayer] Floor ladder from API:" : "[StormcloudVideoPlayer] No floorLadder block in /ads/web response", this.apiFloorLadder);
8306
+ }
8307
+ imaPayload = (_data_response3 = data.response) === null || _data_response3 === void 0 ? void 0 : (_data_response_ima = _data_response3.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;
8232
8308
  if (imaPayload) {
8233
8309
  decodedPayload = imaPayload;
8234
8310
  try {
@@ -8246,7 +8322,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
8246
8322
  console.warn("[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response");
8247
8323
  }
8248
8324
  }
8249
- numberAds = (_data_response1 = data.response) === null || _data_response1 === void 0 ? void 0 : (_data_response_options = _data_response1.options) === null || _data_response_options === void 0 ? void 0 : (_data_response_options_vast = _data_response_options.vast) === null || _data_response_options_vast === void 0 ? void 0 : (_data_response_options_vast_cue_tones = _data_response_options_vast.cue_tones) === null || _data_response_options_vast_cue_tones === void 0 ? void 0 : _data_response_options_vast_cue_tones.number_ads;
8325
+ numberAds = (_data_response4 = data.response) === null || _data_response4 === void 0 ? void 0 : (_data_response_options = _data_response4.options) === null || _data_response_options === void 0 ? void 0 : (_data_response_options_vast = _data_response_options.vast) === null || _data_response_options_vast === void 0 ? void 0 : (_data_response_options_vast_cue_tones = _data_response_options_vast.cue_tones) === null || _data_response_options_vast_cue_tones === void 0 ? void 0 : _data_response_options_vast_cue_tones.number_ads;
8250
8326
  if (numberAds != null && numberAds > 0) {
8251
8327
  this.apiNumberAds = numberAds;
8252
8328
  if (this.debug) {
@@ -10080,7 +10156,23 @@ function resolveEdgePodBaseUrl(config) {
10080
10156
  return void 0;
10081
10157
  }
10082
10158
  }
10159
+ function resolveEdgePodRequestContext(config) {
10160
+ var extra = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
10161
+ return {
10162
+ width: extra.width,
10163
+ height: extra.height,
10164
+ playerId: extra.playerId,
10165
+ contentNetwork: config.contentNetwork,
10166
+ contentChannel: config.channelName,
10167
+ contentTitle: config.programTitle
10168
+ };
10169
+ }
10170
+ function setOptionalParam(url, key, value) {
10171
+ var trimmed = value === null || value === void 0 ? void 0 : value.trim();
10172
+ if (trimmed) url.searchParams.set(key, trimmed);
10173
+ }
10083
10174
  function buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {
10175
+ var context = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
10084
10176
  var url = new URL(baseUrl);
10085
10177
  var maxMs = Math.max(0, Math.floor(remainingMs));
10086
10178
  var maxAds = Math.max(1, Math.min(EDGE_POD_MAX_ADS, Math.floor(remainingAdLimit)));
@@ -10088,6 +10180,16 @@ function buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {
10088
10180
  url.searchParams.set("pmad", String(maxAds));
10089
10181
  url.searchParams.set("duration", String(Math.floor(maxMs / 1e3)));
10090
10182
  url.searchParams.set("count", String(maxAds));
10183
+ if (context.width != null && Number.isFinite(context.width) && context.width > 0) {
10184
+ url.searchParams.set("width", String(Math.round(context.width)));
10185
+ }
10186
+ if (context.height != null && Number.isFinite(context.height) && context.height > 0) {
10187
+ url.searchParams.set("height", String(Math.round(context.height)));
10188
+ }
10189
+ setOptionalParam(url, "pid", context.playerId);
10190
+ setOptionalParam(url, "cn", context.contentNetwork);
10191
+ setOptionalParam(url, "cc", context.contentChannel);
10192
+ setOptionalParam(url, "ct", context.contentTitle);
10091
10193
  return url.toString();
10092
10194
  }
10093
10195
  function classifyEdgeVastResponse(result) {
@@ -10975,7 +11077,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
10975
11077
  return void 0;
10976
11078
  }
10977
11079
  try {
10978
- return buildEdgePodUrl(baseUrl, remainingMs, remainingAds);
11080
+ var playerId = getCachedBrowserId();
11081
+ return buildEdgePodUrl(baseUrl, remainingMs, remainingAds, resolveEdgePodRequestContext(this.host.config, {
11082
+ width: this.host.video.offsetWidth || this.host.video.clientWidth,
11083
+ height: this.host.video.offsetHeight || this.host.video.clientHeight,
11084
+ playerId: playerId
11085
+ }));
10979
11086
  } catch (unused) {
10980
11087
  this.markEdgeExhausted("invalid_edge_url");
10981
11088
  return void 0;
@@ -12485,14 +12592,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12485
12592
  this.config = _object_spread({}, browserOverrides, config);
12486
12593
  this.video = config.videoElement;
12487
12594
  logBrowserInfo(config.debugAdTiming);
12488
- var floorBounds = {};
12489
- if (this.config.adFloorMinCents != null) floorBounds.minCents = this.config.adFloorMinCents;
12490
- if (this.config.adFloorMaxCents != null) floorBounds.maxCents = this.config.adFloorMaxCents;
12491
- if (this.config.adFloorStepCents != null) floorBounds.stepCents = this.config.adFloorStepCents;
12492
- this.floorLadder = new FloorLadderController(this.config.adFloorLadder, floorBounds);
12493
- this.floorLadderEnabled = this.config.adFloorLadderEnabled === true;
12494
- this.warnOnInvalidFloorLadder(this.floorLadder.validate());
12495
- this.edgePodBaseUrl = resolveEdgePodBaseUrl(this.config);
12595
+ this.floorLadder = new FloorLadderController();
12496
12596
  this.adPlayer = this.createAdPlayer(false);
12497
12597
  this.palNonce = createPalNonceManager();
12498
12598
  this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {
@@ -12599,9 +12699,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12599
12699
  return _this.edgePodBaseUrl;
12600
12700
  },
12601
12701
  getFloorSnapshot: function getFloorSnapshot(position) {
12602
- return _this.floorLadderEnabled ? _this.floorLadder.snapshotFor({
12603
- position: position,
12604
- isCtv: _this.isCtvEnvironment()
12702
+ return _this.floorLadder.isEnabled() ? _this.floorLadder.snapshotFor({
12703
+ position: position
12605
12704
  }) : void 0;
12606
12705
  },
12607
12706
  onAdClick: function onAdClick() {
@@ -12638,45 +12737,42 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12638
12737
  }
12639
12738
  },
12640
12739
  {
12641
- key: "isCtvEnvironment",
12642
- value: function isCtvEnvironment() {
12643
- if (this.config.ctvAdRequest) return true;
12644
- var hint = inferDeviceTypeHint(false);
12645
- return hint === DEVICE_TYPE_HINT.CONNECTED_TV || hint === DEVICE_TYPE_HINT.SET_TOP_BOX;
12646
- }
12647
- },
12648
- {
12649
- key: "setAdFloorLadder",
12650
- value: function setAdFloorLadder(update) {
12651
- var report = this.floorLadder.update(update);
12740
+ key: "applyFloorLadderFromApi",
12741
+ value: function applyFloorLadderFromApi() {
12742
+ var raw = this.adConfig.apiFloorLadder;
12743
+ if (raw == null) {
12744
+ this.floorLadder.reset();
12745
+ return;
12746
+ }
12747
+ var report = this.floorLadder.applyApiConfig(raw);
12652
12748
  this.warnOnInvalidFloorLadder(report);
12653
- return report;
12654
- }
12655
- },
12656
- {
12657
- key: "setAdFloorLadderEnabled",
12658
- value: function setAdFloorLadderEnabled(enabled) {
12659
- this.floorLadderEnabled = enabled;
12660
- if (enabled) this.warnOnInvalidFloorLadder(this.floorLadder.validate());
12749
+ if (this.debug) {
12750
+ console.log("[AdBreak][FLOOR] configuration applied from API", {
12751
+ config: this.floorLadder.get(),
12752
+ bounds: this.floorLadder.getBounds(),
12753
+ validation: report
12754
+ });
12755
+ }
12661
12756
  }
12662
12757
  },
12663
12758
  {
12664
12759
  key: "isAdFloorLadderEnabled",
12665
12760
  value: function isAdFloorLadderEnabled() {
12666
- return this.floorLadderEnabled;
12761
+ return this.floorLadder.isEnabled();
12667
12762
  }
12668
12763
  },
12669
12764
  {
12670
- key: "setEdgePodRequest",
12671
- value: function setEdgePodRequest(update) {
12672
- if (update.enableEdgePodRequest === this.config.enableEdgePodRequest && update.edgePodUrl === this.config.edgePodUrl) {
12673
- return;
12765
+ key: "applyEdgePodFromApi",
12766
+ value: function applyEdgePodFromApi() {
12767
+ this.edgePodBaseUrl = resolveEdgePodBaseUrl({
12768
+ enableEdgePodRequest: this.adConfig.apiEnableEdgePodRequest,
12769
+ edgePodUrl: this.adConfig.apiEdgePodUrl,
12770
+ licenseKey: this.config.licenseKey
12771
+ });
12772
+ if (this.debug) {
12773
+ var _this_edgePodBaseUrl;
12774
+ console.log("[AdBreak][EDGE] edge pod base URL from API:", (_this_edgePodBaseUrl = this.edgePodBaseUrl) !== null && _this_edgePodBaseUrl !== void 0 ? _this_edgePodBaseUrl : "(disabled; GAM only)");
12674
12775
  }
12675
- if (update.enableEdgePodRequest === void 0) delete this.config.enableEdgePodRequest;
12676
- else this.config.enableEdgePodRequest = update.enableEdgePodRequest;
12677
- if (update.edgePodUrl === void 0) delete this.config.edgePodUrl;
12678
- else this.config.edgePodUrl = update.edgePodUrl;
12679
- this.edgePodBaseUrl = resolveEdgePodBaseUrl(this.config);
12680
12776
  }
12681
12777
  },
12682
12778
  {
@@ -12689,7 +12785,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12689
12785
  key: "warnOnInvalidFloorLadder",
12690
12786
  value: function warnOnInvalidFloorLadder(report) {
12691
12787
  var config = this.floorLadder.get();
12692
- if (report.ok || !this.floorLadderEnabled || !config.enabled) return;
12788
+ if (report.ok || !config.enabled) return;
12693
12789
  console.warn("[AdBreak][FLOOR] configuration has issues; invalid floors will not be sent", {
12694
12790
  errors: report.errors,
12695
12791
  configurationVersion: config.configurationVersion,
@@ -12764,6 +12860,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12764
12860
  4
12765
12861
  ];
12766
12862
  case 4:
12863
+ this.applyFloorLadderFromApi();
12864
+ this.applyEdgePodFromApi();
12767
12865
  palDescriptionUrl = this.config.ctvAdRequest ? this.adConfig.getPalDescriptionUrl() : void 0;
12768
12866
  fetchConsentSignals().catch(function() {
12769
12867
  return {};
@@ -13517,15 +13615,12 @@ var CRITICAL_PROPS = [
13517
13615
  "vmapUrl",
13518
13616
  "lowLatencyMode",
13519
13617
  "driftToleranceMs",
13520
- "ctvAdRequest",
13521
- "adFloorMinCents",
13522
- "adFloorMaxCents",
13523
- "adFloorStepCents"
13618
+ "ctvAdRequest"
13524
13619
  ];
13525
13620
  var CONTROLS_HIDE_DELAY = 3e3;
13526
13621
  var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
13527
13622
  var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13528
- var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, isLiveStream = props.isLiveStream, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, vastTagUrl = props.vastTagUrl, isVmap = props.isVmap, vmapUrl = props.vmapUrl, minSegmentsBeforePlay = props.minSegmentsBeforePlay, ctvAdRequest = props.ctvAdRequest, programTitle = props.programTitle, channelName = props.channelName, contentNetwork = props.contentNetwork, minRemainingMsToStartAd = props.minRemainingMsToStartAd, minRemainingMsToRequestAd = props.minRemainingMsToRequestAd, maxNoFillsPerBreak = props.maxNoFillsPerBreak, maxAdBreakExtensionMs = props.maxAdBreakExtensionMs, adFloorLadderEnabled = props.adFloorLadderEnabled, adFloorLadder = props.adFloorLadder, adFloorMinCents = props.adFloorMinCents, adFloorMaxCents = props.adFloorMaxCents, adFloorStepCents = props.adFloorStepCents, enableEdgePodRequest = props.enableEdgePodRequest, edgePodUrl = props.edgePodUrl, restVideoAttrs = _object_without_properties(props, [
13623
+ var src = props.src, autoplay = props.autoplay, muted = props.muted, lowLatencyMode = props.lowLatencyMode, allowNativeHls = props.allowNativeHls, isLiveStream = props.isLiveStream, driftToleranceMs = props.driftToleranceMs, immediateManifestAds = props.immediateManifestAds, debugAdTiming = props.debugAdTiming, showCustomControls = props.showCustomControls, hideLoadingIndicator = props.hideLoadingIndicator, onVolumeToggle = props.onVolumeToggle, onFullscreenToggle = props.onFullscreenToggle, onControlClick = props.onControlClick, onReady = props.onReady, wrapperClassName = props.wrapperClassName, wrapperStyle = props.wrapperStyle, className = props.className, style = props.style, controls = props.controls, playsInline = props.playsInline, preload = props.preload, poster = props.poster, children = props.children, licenseKey = props.licenseKey, vastTagUrl = props.vastTagUrl, isVmap = props.isVmap, vmapUrl = props.vmapUrl, minSegmentsBeforePlay = props.minSegmentsBeforePlay, ctvAdRequest = props.ctvAdRequest, programTitle = props.programTitle, channelName = props.channelName, contentNetwork = props.contentNetwork, minRemainingMsToStartAd = props.minRemainingMsToStartAd, minRemainingMsToRequestAd = props.minRemainingMsToRequestAd, maxNoFillsPerBreak = props.maxNoFillsPerBreak, maxAdBreakExtensionMs = props.maxAdBreakExtensionMs, restVideoAttrs = _object_without_properties(props, [
13529
13624
  "src",
13530
13625
  "autoplay",
13531
13626
  "muted",
@@ -13562,19 +13657,10 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13562
13657
  "minRemainingMsToStartAd",
13563
13658
  "minRemainingMsToRequestAd",
13564
13659
  "maxNoFillsPerBreak",
13565
- "maxAdBreakExtensionMs",
13566
- "adFloorLadderEnabled",
13567
- "adFloorLadder",
13568
- "adFloorMinCents",
13569
- "adFloorMaxCents",
13570
- "adFloorStepCents",
13571
- "enableEdgePodRequest",
13572
- "edgePodUrl"
13660
+ "maxAdBreakExtensionMs"
13573
13661
  ]);
13574
- var adFloorLadderKey = JSON.stringify(adFloorLadder !== null && adFloorLadder !== void 0 ? adFloorLadder : null);
13575
13662
  var videoRef = (0, import_react.useRef)(null);
13576
13663
  var playerRef = (0, import_react.useRef)(null);
13577
- var appliedFloorLadderKeyRef = (0, import_react.useRef)(null);
13578
13664
  var bufferingTimeoutRef = (0, import_react.useRef)(null);
13579
13665
  var controlsTimerRef = (0, import_react.useRef)(null);
13580
13666
  var wrapperRef = (0, import_react.useRef)(null);
@@ -13716,10 +13802,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13716
13802
  isVmap,
13717
13803
  vmapUrl,
13718
13804
  lowLatencyMode,
13719
- driftToleranceMs,
13720
- adFloorMinCents,
13721
- adFloorMaxCents,
13722
- adFloorStepCents
13805
+ driftToleranceMs
13723
13806
  ]);
13724
13807
  (0, import_react.useEffect)(function() {
13725
13808
  if (typeof window === "undefined") return;
@@ -13770,16 +13853,8 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13770
13853
  if (minRemainingMsToRequestAd !== void 0) cfg.minRemainingMsToRequestAd = minRemainingMsToRequestAd;
13771
13854
  if (maxNoFillsPerBreak !== void 0) cfg.maxNoFillsPerBreak = maxNoFillsPerBreak;
13772
13855
  if (maxAdBreakExtensionMs !== void 0) cfg.maxAdBreakExtensionMs = maxAdBreakExtensionMs;
13773
- if (adFloorLadderEnabled !== void 0) cfg.adFloorLadderEnabled = adFloorLadderEnabled;
13774
- if (adFloorLadder !== void 0) cfg.adFloorLadder = adFloorLadder;
13775
- if (adFloorMinCents !== void 0) cfg.adFloorMinCents = adFloorMinCents;
13776
- if (adFloorMaxCents !== void 0) cfg.adFloorMaxCents = adFloorMaxCents;
13777
- if (adFloorStepCents !== void 0) cfg.adFloorStepCents = adFloorStepCents;
13778
- if (enableEdgePodRequest !== void 0) cfg.enableEdgePodRequest = enableEdgePodRequest;
13779
- if (edgePodUrl !== void 0) cfg.edgePodUrl = edgePodUrl;
13780
13856
  var player = new StormcloudVideoPlayer(cfg);
13781
13857
  playerRef.current = player;
13782
- appliedFloorLadderKeyRef.current = adFloorLadderKey;
13783
13858
  player.load().then(function() {
13784
13859
  var showNative = player.shouldShowNativeControls();
13785
13860
  setShouldShowNativeControls(showNative);
@@ -13817,33 +13892,6 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13817
13892
  autoplay,
13818
13893
  muted
13819
13894
  ]);
13820
- (0, import_react.useEffect)(function() {
13821
- if (!playerRef.current || adFloorLadder === void 0) return;
13822
- if (appliedFloorLadderKeyRef.current === adFloorLadderKey) return;
13823
- appliedFloorLadderKeyRef.current = adFloorLadderKey;
13824
- playerRef.current.setAdFloorLadder(adFloorLadder);
13825
- }, [
13826
- adFloorLadderKey
13827
- ]);
13828
- (0, import_react.useEffect)(function() {
13829
- if (!playerRef.current) return;
13830
- var enabled = adFloorLadderEnabled === true;
13831
- if (playerRef.current.isAdFloorLadderEnabled() === enabled) return;
13832
- playerRef.current.setAdFloorLadderEnabled(enabled);
13833
- }, [
13834
- adFloorLadderEnabled
13835
- ]);
13836
- (0, import_react.useEffect)(function() {
13837
- if (!playerRef.current) return;
13838
- playerRef.current.setEdgePodRequest(_object_spread({}, enableEdgePodRequest !== void 0 ? {
13839
- enableEdgePodRequest: enableEdgePodRequest
13840
- } : {}, edgePodUrl !== void 0 ? {
13841
- edgePodUrl: edgePodUrl
13842
- } : {}));
13843
- }, [
13844
- enableEdgePodRequest,
13845
- edgePodUrl
13846
- ]);
13847
13895
  (0, import_react.useEffect)(function() {
13848
13896
  if (!playerRef.current) return;
13849
13897
  var checkAdStatus = function checkAdStatus() {
@@ -14833,7 +14881,6 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
14833
14881
  ]
14834
14882
  });
14835
14883
  }, function(prevProps, nextProps) {
14836
- var _prevProps_adFloorLadder, _nextProps_adFloorLadder;
14837
14884
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
14838
14885
  try {
14839
14886
  for(var _iterator = CRITICAL_PROPS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
@@ -14920,12 +14967,6 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
14920
14967
  }
14921
14968
  }
14922
14969
  }
14923
- if (prevProps.adFloorLadderEnabled !== nextProps.adFloorLadderEnabled || prevProps.enableEdgePodRequest !== nextProps.enableEdgePodRequest || prevProps.edgePodUrl !== nextProps.edgePodUrl) {
14924
- return false;
14925
- }
14926
- if (JSON.stringify((_prevProps_adFloorLadder = prevProps.adFloorLadder) !== null && _prevProps_adFloorLadder !== void 0 ? _prevProps_adFloorLadder : null) !== JSON.stringify((_nextProps_adFloorLadder = nextProps.adFloorLadder) !== null && _nextProps_adFloorLadder !== void 0 ? _nextProps_adFloorLadder : null)) {
14927
- return false;
14928
- }
14929
14970
  return true;
14930
14971
  });
14931
14972
  // src/StormcloudPlayer.tsx
@@ -16100,7 +16141,7 @@ var StormcloudPlayer_default = StormcloudPlayer;
16100
16141
  DEFAULT_FLOOR_LADDER_BOUNDS: DEFAULT_FLOOR_LADDER_BOUNDS,
16101
16142
  DEFAULT_REQUEST_SAFETY_MS: DEFAULT_REQUEST_SAFETY_MS,
16102
16143
  DEFAULT_TRACKING_INGEST_CONFIG: DEFAULT_TRACKING_INGEST_CONFIG,
16103
- DEFAULT_WEB_FLOOR_LADDER_CONFIG: DEFAULT_WEB_FLOOR_LADDER_CONFIG,
16144
+ DISABLED_FLOOR_LADDER_CONFIG: DISABLED_FLOOR_LADDER_CONFIG,
16104
16145
  GAM_AD_OPPORTUNITY_DURATION_MS: GAM_AD_OPPORTUNITY_DURATION_MS,
16105
16146
  IS_BROWSER: IS_BROWSER,
16106
16147
  IS_GLOBAL: IS_GLOBAL,
@@ -16132,6 +16173,7 @@ var StormcloudPlayer_default = StormcloudPlayer;
16132
16173
  logBrowserInfo: logBrowserInfo,
16133
16174
  merge: merge,
16134
16175
  omit: omit,
16176
+ parseApiFloorLadder: parseApiFloorLadder,
16135
16177
  parseQuery: parseQuery,
16136
16178
  players: players,
16137
16179
  randomString: randomString,