stormcloud-video-player 0.8.75 → 0.8.77

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/Player.d.cts +9 -1
  5. package/lib/StormcloudPlayer.cjs +173 -78
  6. package/lib/StormcloudPlayer.cjs.map +1 -1
  7. package/lib/index.cjs +184 -133
  8. package/lib/index.cjs.map +1 -1
  9. package/lib/index.d.cts +1 -1
  10. package/lib/index.d.ts +9 -19
  11. package/lib/index.js +178 -131
  12. package/lib/index.js.map +1 -1
  13. package/lib/player/AdBreakOrchestrator.cjs +45 -13
  14. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  15. package/lib/player/AdConfigManager.cjs +17 -3
  16. package/lib/player/AdConfigManager.cjs.map +1 -1
  17. package/lib/player/AdConfigManager.d.cts +3 -0
  18. package/lib/player/EdgePodRequest.cjs +31 -1
  19. package/lib/player/EdgePodRequest.cjs.map +1 -1
  20. package/lib/player/EdgePodRequest.d.cts +21 -3
  21. package/lib/player/FloorLadder.cjs +86 -27
  22. package/lib/player/FloorLadder.cjs.map +1 -1
  23. package/lib/player/FloorLadder.d.cts +8 -7
  24. package/lib/player/StormcloudVideoPlayer.cjs +163 -78
  25. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  26. package/lib/player/StormcloudVideoPlayer.d.cts +3 -9
  27. package/lib/players/HlsPlayer.cjs +169 -78
  28. package/lib/players/HlsPlayer.cjs.map +1 -1
  29. package/lib/players/index.cjs +169 -78
  30. package/lib/players/index.cjs.map +1 -1
  31. package/lib/props.cjs +10 -12
  32. package/lib/props.cjs.map +1 -1
  33. package/lib/props.d.cts +5 -1
  34. package/lib/types.d.cts +3 -7
  35. package/lib/ui/StormcloudVideoPlayer.cjs +167 -139
  36. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  37. package/lib/utils/tracking.cjs +7 -0
  38. package/lib/utils/tracking.cjs.map +1 -1
  39. package/lib/utils/tracking.d.cts +2 -1
  40. package/package.json +1 -1
package/lib/props.cjs CHANGED
@@ -124,21 +124,19 @@ var DEVICE_TYPE_HINT_ALIASES = {
124
124
  };
125
125
  var PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;
126
126
  // src/player/FloorLadder.ts
127
- var DEFAULT_WEB_FLOOR_LADDER_CONFIG = Object.freeze({
127
+ var DISABLED_FLOOR_LADDER_CONFIG = Object.freeze({
128
128
  enabled: false,
129
- targetingKey: "airytv_web_floor",
130
- minFloorCents: 25,
131
- maxFloorCents: 300,
132
- stepCents: 25,
133
- selectedFloorCents: 25,
134
- fallbackFloorCents: 25,
129
+ targetingKey: "",
130
+ minFloorCents: 0,
131
+ maxFloorCents: 0,
132
+ stepCents: 0,
133
+ selectedFloorCents: 0,
134
+ fallbackFloorCents: 0,
135
135
  readyFloorCents: [],
136
136
  mode: "fixed",
137
- allowedPositions: [
138
- "midroll"
139
- ],
140
- targetAdUnitPath: "/21821455290/airytvadx/airytv-web",
141
- configurationVersion: "2026-09-29.1"
137
+ allowedPositions: [],
138
+ targetAdUnitPath: "",
139
+ configurationVersion: ""
142
140
  });
143
141
  var DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({
144
142
  minCents: 25,
package/lib/props.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\props.cjs"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","props_exports","defaultProps","module","exports","DEVICE_TYPE_HINT","FEATURE_PHONE","SMARTPHONE","DESKTOP","TABLET","CONNECTED_TV","GAME_CONSOLE","SET_TOP_BOX","DEVICE_TYPE_HINT_ALIASES","featurephone","smartphone","mobile","phone","desktop","pc","tablet","ctv","tv","connectedtv","smarttv","console","gameconsole","stb","settopbox","PERSISTENT_ID_COOKIE_MAX_AGE","DEFAULT_WEB_FLOOR_LADDER_CONFIG","freeze","enabled","targetingKey","minFloorCents","maxFloorCents","stepCents","selectedFloorCents","fallbackFloorCents","readyFloorCents","mode","allowedPositions","targetAdUnitPath","configurationVersion","DEFAULT_FLOOR_LADDER_BOUNDS","minCents","maxCents","import_hls","require","DEFAULT_TRACKING_INGEST_CONFIG","baseUrl","trackingIngestConfig","import_hls2","noop","playing","loop","controls","volume","muted","playbackRate","width","height","style","progressInterval","playsInline","autoplay","preload","poster","className","wrapperClassName","wrapperStyle","allowNativeHls","lowLatencyMode","driftToleranceMs","immediateManifestAds","debugAdTiming","showCustomControls","hideLoadingIndicator","licenseKey","isVmap","vmapUrl","adFailsafeTimeoutMs","minSegmentsBeforePlay","onStart","onPlay","onPause","onBuffer","onBufferEnd","onEnded","onError","onDuration","onSeek","onProgress","onVolumeToggle","onFullscreenToggle","onControlClick"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/props.ts\nvar props_exports = {};\n__export(props_exports, {\n defaultProps: () => defaultProps\n});\nmodule.exports = __toCommonJS(props_exports);\n\n// src/utils/vastEnvironmentSignals.ts\nvar DEVICE_TYPE_HINT = {\n FEATURE_PHONE: 1,\n SMARTPHONE: 2,\n DESKTOP: 3,\n TABLET: 4,\n CONNECTED_TV: 5,\n GAME_CONSOLE: 6,\n SET_TOP_BOX: 7\n};\nvar DEVICE_TYPE_HINT_ALIASES = {\n featurephone: DEVICE_TYPE_HINT.FEATURE_PHONE,\n smartphone: DEVICE_TYPE_HINT.SMARTPHONE,\n mobile: DEVICE_TYPE_HINT.SMARTPHONE,\n phone: DEVICE_TYPE_HINT.SMARTPHONE,\n desktop: DEVICE_TYPE_HINT.DESKTOP,\n pc: DEVICE_TYPE_HINT.DESKTOP,\n tablet: DEVICE_TYPE_HINT.TABLET,\n ctv: DEVICE_TYPE_HINT.CONNECTED_TV,\n tv: DEVICE_TYPE_HINT.CONNECTED_TV,\n connectedtv: DEVICE_TYPE_HINT.CONNECTED_TV,\n smarttv: DEVICE_TYPE_HINT.CONNECTED_TV,\n console: DEVICE_TYPE_HINT.GAME_CONSOLE,\n gameconsole: DEVICE_TYPE_HINT.GAME_CONSOLE,\n stb: DEVICE_TYPE_HINT.SET_TOP_BOX,\n settopbox: DEVICE_TYPE_HINT.SET_TOP_BOX\n};\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\n\n// src/player/FloorLadder.ts\nvar DEFAULT_WEB_FLOOR_LADDER_CONFIG = Object.freeze({\n enabled: false,\n targetingKey: \"airytv_web_floor\",\n minFloorCents: 25,\n maxFloorCents: 300,\n stepCents: 25,\n selectedFloorCents: 25,\n fallbackFloorCents: 25,\n readyFloorCents: [],\n mode: \"fixed\",\n allowedPositions: [\"midroll\"],\n targetAdUnitPath: \"/21821455290/airytvadx/airytv-web\",\n configurationVersion: \"2026-09-29.1\"\n});\nvar DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({\n minCents: 25,\n maxCents: 300,\n stepCents: 25\n});\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\n\n// src/props.ts\nvar noop = () => {\n};\nvar defaultProps = {\n playing: false,\n loop: false,\n controls: true,\n volume: 1,\n muted: false,\n playbackRate: 1,\n width: \"100%\",\n height: \"auto\",\n style: {},\n progressInterval: 1e3,\n playsInline: false,\n autoplay: false,\n preload: \"metadata\",\n poster: \"\",\n className: \"\",\n wrapperClassName: \"\",\n wrapperStyle: {},\n allowNativeHls: false,\n lowLatencyMode: false,\n driftToleranceMs: 1e3,\n immediateManifestAds: true,\n debugAdTiming: false,\n showCustomControls: false,\n hideLoadingIndicator: false,\n licenseKey: \"\",\n isVmap: false,\n vmapUrl: \"\",\n adFailsafeTimeoutMs: 1e4,\n minSegmentsBeforePlay: 2,\n onStart: noop,\n onPlay: noop,\n onPause: noop,\n onBuffer: noop,\n onBufferEnd: noop,\n onEnded: noop,\n onError: noop,\n onDuration: noop,\n onSeek: noop,\n onProgress: noop,\n onVolumeToggle: noop,\n onFullscreenToggle: noop,\n onControlClick: noop\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n defaultProps\n});\n"]}
1
+ {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\props.cjs"],"names":["__create","Object","create","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__getProtoOf","getPrototypeOf","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toESM","mod","isNodeMode","__esModule","value","__toCommonJS","props_exports","defaultProps","module","exports","DEVICE_TYPE_HINT","FEATURE_PHONE","SMARTPHONE","DESKTOP","TABLET","CONNECTED_TV","GAME_CONSOLE","SET_TOP_BOX","DEVICE_TYPE_HINT_ALIASES","featurephone","smartphone","mobile","phone","desktop","pc","tablet","ctv","tv","connectedtv","smarttv","console","gameconsole","stb","settopbox","PERSISTENT_ID_COOKIE_MAX_AGE","DISABLED_FLOOR_LADDER_CONFIG","freeze","enabled","targetingKey","minFloorCents","maxFloorCents","stepCents","selectedFloorCents","fallbackFloorCents","readyFloorCents","mode","allowedPositions","targetAdUnitPath","configurationVersion","DEFAULT_FLOOR_LADDER_BOUNDS","minCents","maxCents","import_hls","require","DEFAULT_TRACKING_INGEST_CONFIG","baseUrl","trackingIngestConfig","import_hls2","noop","playing","loop","controls","volume","muted","playbackRate","width","height","style","progressInterval","playsInline","autoplay","preload","poster","className","wrapperClassName","wrapperStyle","allowNativeHls","lowLatencyMode","driftToleranceMs","immediateManifestAds","debugAdTiming","showCustomControls","hideLoadingIndicator","licenseKey","isVmap","vmapUrl","adFailsafeTimeoutMs","minSegmentsBeforePlay","onStart","onPlay","onPause","onBuffer","onBufferEnd","onEnded","onError","onDuration","onSeek","onProgress","onVolumeToggle","onFullscreenToggle","onControlClick"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __create = Object.create;\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __getProtoOf = Object.getPrototypeOf;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(\n // If the importer is in node compatibility mode or this is not an ESM\n // file that has been converted to a CommonJS file using a Babel-\n // compatible transform (i.e. \"__esModule\" has not been set), then set\n // \"default\" to the CommonJS \"module.exports\" for node compatibility.\n isNodeMode || !mod || !mod.__esModule ? __defProp(target, \"default\", { value: mod, enumerable: true }) : target,\n mod\n));\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/props.ts\nvar props_exports = {};\n__export(props_exports, {\n defaultProps: () => defaultProps\n});\nmodule.exports = __toCommonJS(props_exports);\n\n// src/utils/vastEnvironmentSignals.ts\nvar DEVICE_TYPE_HINT = {\n FEATURE_PHONE: 1,\n SMARTPHONE: 2,\n DESKTOP: 3,\n TABLET: 4,\n CONNECTED_TV: 5,\n GAME_CONSOLE: 6,\n SET_TOP_BOX: 7\n};\nvar DEVICE_TYPE_HINT_ALIASES = {\n featurephone: DEVICE_TYPE_HINT.FEATURE_PHONE,\n smartphone: DEVICE_TYPE_HINT.SMARTPHONE,\n mobile: DEVICE_TYPE_HINT.SMARTPHONE,\n phone: DEVICE_TYPE_HINT.SMARTPHONE,\n desktop: DEVICE_TYPE_HINT.DESKTOP,\n pc: DEVICE_TYPE_HINT.DESKTOP,\n tablet: DEVICE_TYPE_HINT.TABLET,\n ctv: DEVICE_TYPE_HINT.CONNECTED_TV,\n tv: DEVICE_TYPE_HINT.CONNECTED_TV,\n connectedtv: DEVICE_TYPE_HINT.CONNECTED_TV,\n smarttv: DEVICE_TYPE_HINT.CONNECTED_TV,\n console: DEVICE_TYPE_HINT.GAME_CONSOLE,\n gameconsole: DEVICE_TYPE_HINT.GAME_CONSOLE,\n stb: DEVICE_TYPE_HINT.SET_TOP_BOX,\n settopbox: DEVICE_TYPE_HINT.SET_TOP_BOX\n};\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\n\n// src/player/FloorLadder.ts\nvar DISABLED_FLOOR_LADDER_CONFIG = Object.freeze({\n enabled: false,\n targetingKey: \"\",\n minFloorCents: 0,\n maxFloorCents: 0,\n stepCents: 0,\n selectedFloorCents: 0,\n fallbackFloorCents: 0,\n readyFloorCents: [],\n mode: \"fixed\",\n allowedPositions: [],\n targetAdUnitPath: \"\",\n configurationVersion: \"\"\n});\nvar DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({\n minCents: 25,\n maxCents: 300,\n stepCents: 25\n});\n\n// src/sdk/hlsAdPlayer.ts\nvar import_hls = __toESM(require(\"hls.js\"), 1);\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\n\n// src/player/HlsEngine.ts\nvar import_hls2 = __toESM(require(\"hls.js\"), 1);\n\n// src/props.ts\nvar noop = () => {\n};\nvar defaultProps = {\n playing: false,\n loop: false,\n controls: true,\n volume: 1,\n muted: false,\n playbackRate: 1,\n width: \"100%\",\n height: \"auto\",\n style: {},\n progressInterval: 1e3,\n playsInline: false,\n autoplay: false,\n preload: \"metadata\",\n poster: \"\",\n className: \"\",\n wrapperClassName: \"\",\n wrapperStyle: {},\n allowNativeHls: false,\n lowLatencyMode: false,\n driftToleranceMs: 1e3,\n immediateManifestAds: true,\n debugAdTiming: false,\n showCustomControls: false,\n hideLoadingIndicator: false,\n licenseKey: \"\",\n isVmap: false,\n vmapUrl: \"\",\n adFailsafeTimeoutMs: 1e4,\n minSegmentsBeforePlay: 2,\n onStart: noop,\n onPlay: noop,\n onPause: noop,\n onBuffer: noop,\n onBufferEnd: noop,\n onEnded: noop,\n onError: noop,\n onDuration: noop,\n onSeek: noop,\n onProgress: noop,\n onVolumeToggle: noop,\n onFullscreenToggle: noop,\n onControlClick: noop\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n defaultProps\n});\n"]}
package/lib/props.d.cts CHANGED
@@ -40,9 +40,13 @@ interface BaseStormcloudPlayerProps {
40
40
  licenseKey?: string;
41
41
  isVmap?: boolean;
42
42
  vmapUrl?: string;
43
+ vastTagUrl?: string;
43
44
  adFailsafeTimeoutMs?: number;
44
45
  minSegmentsBeforePlay?: number;
45
46
  ctvAdRequest?: boolean;
47
+ minRemainingMsToRequestAd?: number;
48
+ maxNoFillsPerBreak?: number;
49
+ maxAdBreakExtensionMs?: number;
46
50
  onReady?: (player: StormcloudVideoPlayer) => void;
47
51
  onStart?: () => void;
48
52
  onPlay?: () => void;
@@ -59,6 +63,6 @@ interface BaseStormcloudPlayerProps {
59
63
  onControlClick?: () => void;
60
64
  [otherProps: string]: any;
61
65
  }
62
- declare const defaultProps: Required<Omit<BaseStormcloudPlayerProps, "src" | "onReady" | "children" | "ctvAdRequest" | keyof React.VideoHTMLAttributes<HTMLVideoElement>>>;
66
+ declare const defaultProps: Required<Omit<BaseStormcloudPlayerProps, "src" | "onReady" | "children" | "ctvAdRequest" | "vastTagUrl" | "minRemainingMsToRequestAd" | "maxNoFillsPerBreak" | "maxAdBreakExtensionMs" | keyof React.VideoHTMLAttributes<HTMLVideoElement>>>;
63
67
 
64
68
  export { type BaseStormcloudPlayerProps, type OnProgressProps, defaultProps };
package/lib/types.d.cts CHANGED
@@ -49,13 +49,6 @@ interface StormcloudVideoPlayerConfig {
49
49
  podMaxAds?: number;
50
50
  podMaxDurationMs?: number;
51
51
  podExactDuration?: boolean;
52
- adFloorLadderEnabled?: boolean;
53
- adFloorLadder?: Partial<AdFloorLadderConfig>;
54
- adFloorMinCents?: number;
55
- adFloorMaxCents?: number;
56
- adFloorStepCents?: number;
57
- enableEdgePodRequest?: boolean;
58
- edgePodUrl?: string;
59
52
  }
60
53
  type AdPosition = "preroll" | "midroll" | "postroll";
61
54
  type FloorLadderMode = "fixed";
@@ -144,6 +137,9 @@ interface StormcloudApiResponse {
144
137
  };
145
138
  };
146
139
  };
140
+ floorLadder?: Partial<AdFloorLadderConfig> | null;
141
+ enableEdgePodRequest?: boolean;
142
+ edgePodUrl?: string;
147
143
  };
148
144
  }
149
145
  interface ClientInfo {
@@ -1684,21 +1684,19 @@ function fetchConsentSignals() {
1684
1684
  });
1685
1685
  }
1686
1686
  // src/player/FloorLadder.ts
1687
- var DEFAULT_WEB_FLOOR_LADDER_CONFIG = Object.freeze({
1687
+ var DISABLED_FLOOR_LADDER_CONFIG = Object.freeze({
1688
1688
  enabled: false,
1689
- targetingKey: "airytv_web_floor",
1690
- minFloorCents: 25,
1691
- maxFloorCents: 300,
1692
- stepCents: 25,
1693
- selectedFloorCents: 25,
1694
- fallbackFloorCents: 25,
1689
+ targetingKey: "",
1690
+ minFloorCents: 0,
1691
+ maxFloorCents: 0,
1692
+ stepCents: 0,
1693
+ selectedFloorCents: 0,
1694
+ fallbackFloorCents: 0,
1695
1695
  readyFloorCents: [],
1696
1696
  mode: "fixed",
1697
- allowedPositions: [
1698
- "midroll"
1699
- ],
1700
- targetAdUnitPath: "/21821455290/airytvadx/airytv-web",
1701
- configurationVersion: "2026-09-29.1"
1697
+ allowedPositions: [],
1698
+ targetAdUnitPath: "",
1699
+ configurationVersion: ""
1702
1700
  });
1703
1701
  var DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({
1704
1702
  minCents: 25,
@@ -1717,15 +1715,6 @@ function generateFloorLevels(minCents, maxCents, stepCents) {
1717
1715
  }
1718
1716
  return levels;
1719
1717
  }
1720
- function resolveFloorLadderBounds() {
1721
- var overrides = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
1722
- var _overrides_minCents, _overrides_maxCents, _overrides_stepCents;
1723
- return {
1724
- minCents: (_overrides_minCents = overrides.minCents) !== null && _overrides_minCents !== void 0 ? _overrides_minCents : DEFAULT_FLOOR_LADDER_BOUNDS.minCents,
1725
- maxCents: (_overrides_maxCents = overrides.maxCents) !== null && _overrides_maxCents !== void 0 ? _overrides_maxCents : DEFAULT_FLOOR_LADDER_BOUNDS.maxCents,
1726
- stepCents: (_overrides_stepCents = overrides.stepCents) !== null && _overrides_stepCents !== void 0 ? _overrides_stepCents : DEFAULT_FLOOR_LADDER_BOUNDS.stepCents
1727
- };
1728
- }
1729
1718
  function validateFloorCents(value, config) {
1730
1719
  var bounds = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : DEFAULT_FLOOR_LADDER_BOUNDS;
1731
1720
  if (!isInteger(value)) return {
@@ -1857,7 +1846,6 @@ function resolveOpportunityFloor(config, context) {
1857
1846
  if (!config.enabled) return skipped("disabled");
1858
1847
  var positions = Array.isArray(config.allowedPositions) ? config.allowedPositions : [];
1859
1848
  if (positions.indexOf(context.position) === -1) return skipped("position_not_allowed");
1860
- if (context.isCtv) return skipped("ctv_excluded");
1861
1849
  if (!config.targetingKey) return skipped("missing_targeting_key");
1862
1850
  if (!config.targetAdUnitPath) return skipped("missing_target_ad_unit");
1863
1851
  var result;
@@ -2011,15 +1999,80 @@ function mergeDefined(target, update) {
2011
1999
  }
2012
2000
  return copyConfig(next);
2013
2001
  }
2002
+ var AD_POSITIONS = [
2003
+ "preroll",
2004
+ "midroll",
2005
+ "postroll"
2006
+ ];
2007
+ function finiteNumber(value) {
2008
+ return typeof value === "number" && isFinite(value) ? value : void 0;
2009
+ }
2010
+ function parseApiFloorLadder(raw) {
2011
+ if (!raw || (typeof raw === "undefined" ? "undefined" : _type_of(raw)) !== "object" || Array.isArray(raw)) return void 0;
2012
+ var src = raw;
2013
+ var out = {};
2014
+ if (typeof src.enabled === "boolean") out.enabled = src.enabled;
2015
+ if (typeof src.targetingKey === "string") out.targetingKey = src.targetingKey;
2016
+ if (typeof src.targetAdUnitPath === "string") out.targetAdUnitPath = src.targetAdUnitPath;
2017
+ if (typeof src.configurationVersion === "string") out.configurationVersion = src.configurationVersion;
2018
+ if (typeof src.mode === "string") out.mode = src.mode;
2019
+ var min = finiteNumber(src.minFloorCents);
2020
+ var max = finiteNumber(src.maxFloorCents);
2021
+ var step = finiteNumber(src.stepCents);
2022
+ var selected = finiteNumber(src.selectedFloorCents);
2023
+ var fallback = finiteNumber(src.fallbackFloorCents);
2024
+ if (min !== void 0) out.minFloorCents = min;
2025
+ if (max !== void 0) out.maxFloorCents = max;
2026
+ if (step !== void 0) out.stepCents = step;
2027
+ if (selected !== void 0) out.selectedFloorCents = selected;
2028
+ if (fallback !== void 0) out.fallbackFloorCents = fallback;
2029
+ if (Array.isArray(src.readyFloorCents)) {
2030
+ out.readyFloorCents = src.readyFloorCents.filter(function(cents) {
2031
+ return finiteNumber(cents) !== void 0;
2032
+ });
2033
+ }
2034
+ if (Array.isArray(src.allowedPositions)) {
2035
+ out.allowedPositions = src.allowedPositions.filter(function(position) {
2036
+ return AD_POSITIONS.indexOf(position) !== -1;
2037
+ });
2038
+ }
2039
+ return out;
2040
+ }
2014
2041
  var FloorLadderController = /*#__PURE__*/ function() {
2015
- function FloorLadderController(initial, bounds) {
2016
- var selector = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : fixedFloorSelector;
2042
+ function FloorLadderController() {
2043
+ var selector = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : fixedFloorSelector;
2017
2044
  _class_call_check(this, FloorLadderController);
2018
- this.config = mergeDefined(copyConfig(DEFAULT_WEB_FLOOR_LADDER_CONFIG), initial);
2019
- this.bounds = Object.freeze(resolveFloorLadderBounds(bounds));
2045
+ this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;
2046
+ this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);
2020
2047
  this.selector = selector;
2021
2048
  }
2022
2049
  _create_class(FloorLadderController, [
2050
+ {
2051
+ key: "isEnabled",
2052
+ value: function isEnabled() {
2053
+ return this.config.enabled === true;
2054
+ }
2055
+ },
2056
+ {
2057
+ key: "applyApiConfig",
2058
+ value: function applyApiConfig(raw) {
2059
+ var parsed = parseApiFloorLadder(raw);
2060
+ this.config = mergeDefined(copyConfig(DISABLED_FLOOR_LADDER_CONFIG), parsed);
2061
+ this.bounds = Object.freeze({
2062
+ minCents: this.config.minFloorCents,
2063
+ maxCents: this.config.maxFloorCents,
2064
+ stepCents: this.config.stepCents
2065
+ });
2066
+ return validateFloorLadderConfig(this.config, this.bounds);
2067
+ }
2068
+ },
2069
+ {
2070
+ key: "reset",
2071
+ value: function reset() {
2072
+ this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);
2073
+ this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;
2074
+ }
2075
+ },
2023
2076
  {
2024
2077
  key: "get",
2025
2078
  value: function get() {
@@ -2032,13 +2085,6 @@ var FloorLadderController = /*#__PURE__*/ function() {
2032
2085
  return _object_spread({}, this.bounds);
2033
2086
  }
2034
2087
  },
2035
- {
2036
- key: "update",
2037
- value: function update(update) {
2038
- this.config = mergeDefined(this.config, update);
2039
- return validateFloorLadderConfig(this.config, this.bounds);
2040
- }
2041
- },
2042
2088
  {
2043
2089
  key: "validate",
2044
2090
  value: function validate() {
@@ -6271,6 +6317,9 @@ function resolvePlayerIdentitySeed(clientInfo) {
6271
6317
  }
6272
6318
  return "fingerprint:".concat(JSON.stringify(clientInfo));
6273
6319
  }
6320
+ function getCachedBrowserId() {
6321
+ return cachedBrowserId !== null && cachedBrowserId !== void 0 ? cachedBrowserId : void 0;
6322
+ }
6274
6323
  function getBrowserID(clientInfo) {
6275
6324
  return _async_to_generator(function() {
6276
6325
  return _ts_generator(this, function(_state) {
@@ -7940,7 +7989,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
7940
7989
  key: "fetchAdConfiguration",
7941
7990
  value: function fetchAdConfiguration() {
7942
7991
  return _async_to_generator(function() {
7943
- 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;
7992
+ 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;
7944
7993
  return _ts_generator(this, function(_state) {
7945
7994
  switch(_state.label){
7946
7995
  case 0:
@@ -8000,7 +8049,21 @@ var AdConfigManager = /*#__PURE__*/ function() {
8000
8049
  ];
8001
8050
  case 4:
8002
8051
  data = _state.sent();
8003
- 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;
8052
+ apiEnableEdge = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : _data_response.enableEdgePodRequest;
8053
+ apiEdgeUrl = (_data_response1 = data.response) === null || _data_response1 === void 0 ? void 0 : _data_response1.edgePodUrl;
8054
+ this.apiEnableEdgePodRequest = typeof apiEnableEdge === "boolean" ? apiEnableEdge : void 0;
8055
+ this.apiEdgePodUrl = typeof apiEdgeUrl === "string" ? apiEdgeUrl : void 0;
8056
+ if (this.debug) {
8057
+ console.log("[StormcloudVideoPlayer] Edge pod settings from API:", {
8058
+ enableEdgePodRequest: this.apiEnableEdgePodRequest,
8059
+ edgePodUrl: this.apiEdgePodUrl
8060
+ });
8061
+ }
8062
+ this.apiFloorLadder = (_data_response2 = data.response) === null || _data_response2 === void 0 ? void 0 : _data_response2.floorLadder;
8063
+ if (this.debug) {
8064
+ console.log(this.apiFloorLadder ? "[StormcloudVideoPlayer] Floor ladder from API:" : "[StormcloudVideoPlayer] No floorLadder block in /ads/web response", this.apiFloorLadder);
8065
+ }
8066
+ 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;
8004
8067
  if (imaPayload) {
8005
8068
  decodedPayload = imaPayload;
8006
8069
  try {
@@ -8018,7 +8081,7 @@ var AdConfigManager = /*#__PURE__*/ function() {
8018
8081
  console.warn("[StormcloudVideoPlayer] No VAST tag URL found in /ads/web response");
8019
8082
  }
8020
8083
  }
8021
- 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;
8084
+ 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;
8022
8085
  if (numberAds != null && numberAds > 0) {
8023
8086
  this.apiNumberAds = numberAds;
8024
8087
  if (this.debug) {
@@ -9852,7 +9915,23 @@ function resolveEdgePodBaseUrl(config) {
9852
9915
  return void 0;
9853
9916
  }
9854
9917
  }
9918
+ function resolveEdgePodRequestContext(config) {
9919
+ var extra = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
9920
+ return {
9921
+ width: extra.width,
9922
+ height: extra.height,
9923
+ playerId: extra.playerId,
9924
+ contentNetwork: config.contentNetwork,
9925
+ contentChannel: config.channelName,
9926
+ contentTitle: config.programTitle
9927
+ };
9928
+ }
9929
+ function setOptionalParam(url, key, value) {
9930
+ var trimmed = value === null || value === void 0 ? void 0 : value.trim();
9931
+ if (trimmed) url.searchParams.set(key, trimmed);
9932
+ }
9855
9933
  function buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {
9934
+ var context = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
9856
9935
  var url = new URL(baseUrl);
9857
9936
  var maxMs = Math.max(0, Math.floor(remainingMs));
9858
9937
  var maxAds = Math.max(1, Math.min(EDGE_POD_MAX_ADS, Math.floor(remainingAdLimit)));
@@ -9860,6 +9939,16 @@ function buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {
9860
9939
  url.searchParams.set("pmad", String(maxAds));
9861
9940
  url.searchParams.set("duration", String(Math.floor(maxMs / 1e3)));
9862
9941
  url.searchParams.set("count", String(maxAds));
9942
+ if (context.width != null && Number.isFinite(context.width) && context.width > 0) {
9943
+ url.searchParams.set("width", String(Math.round(context.width)));
9944
+ }
9945
+ if (context.height != null && Number.isFinite(context.height) && context.height > 0) {
9946
+ url.searchParams.set("height", String(Math.round(context.height)));
9947
+ }
9948
+ setOptionalParam(url, "pid", context.playerId);
9949
+ setOptionalParam(url, "cn", context.contentNetwork);
9950
+ setOptionalParam(url, "cc", context.contentChannel);
9951
+ setOptionalParam(url, "ct", context.contentTitle);
9863
9952
  return url.toString();
9864
9953
  }
9865
9954
  function classifyEdgeVastResponse(result) {
@@ -10747,7 +10836,12 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
10747
10836
  return void 0;
10748
10837
  }
10749
10838
  try {
10750
- return buildEdgePodUrl(baseUrl, remainingMs, remainingAds);
10839
+ var playerId = getCachedBrowserId();
10840
+ return buildEdgePodUrl(baseUrl, remainingMs, remainingAds, resolveEdgePodRequestContext(this.host.config, {
10841
+ width: this.host.video.offsetWidth || this.host.video.clientWidth,
10842
+ height: this.host.video.offsetHeight || this.host.video.clientHeight,
10843
+ playerId: playerId
10844
+ }));
10751
10845
  } catch (unused) {
10752
10846
  this.markEdgeExhausted("invalid_edge_url");
10753
10847
  return void 0;
@@ -12257,14 +12351,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12257
12351
  this.config = _object_spread({}, browserOverrides, config);
12258
12352
  this.video = config.videoElement;
12259
12353
  logBrowserInfo(config.debugAdTiming);
12260
- var floorBounds = {};
12261
- if (this.config.adFloorMinCents != null) floorBounds.minCents = this.config.adFloorMinCents;
12262
- if (this.config.adFloorMaxCents != null) floorBounds.maxCents = this.config.adFloorMaxCents;
12263
- if (this.config.adFloorStepCents != null) floorBounds.stepCents = this.config.adFloorStepCents;
12264
- this.floorLadder = new FloorLadderController(this.config.adFloorLadder, floorBounds);
12265
- this.floorLadderEnabled = this.config.adFloorLadderEnabled === true;
12266
- this.warnOnInvalidFloorLadder(this.floorLadder.validate());
12267
- this.edgePodBaseUrl = resolveEdgePodBaseUrl(this.config);
12354
+ this.floorLadder = new FloorLadderController();
12268
12355
  this.adPlayer = this.createAdPlayer(false);
12269
12356
  this.palNonce = createPalNonceManager();
12270
12357
  this.cueManager = new Scte35CueManager(!!this.config.debugAdTiming, {
@@ -12371,9 +12458,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12371
12458
  return _this.edgePodBaseUrl;
12372
12459
  },
12373
12460
  getFloorSnapshot: function getFloorSnapshot(position) {
12374
- return _this.floorLadderEnabled ? _this.floorLadder.snapshotFor({
12375
- position: position,
12376
- isCtv: _this.isCtvEnvironment()
12461
+ return _this.floorLadder.isEnabled() ? _this.floorLadder.snapshotFor({
12462
+ position: position
12377
12463
  }) : void 0;
12378
12464
  },
12379
12465
  onAdClick: function onAdClick() {
@@ -12410,45 +12496,42 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12410
12496
  }
12411
12497
  },
12412
12498
  {
12413
- key: "isCtvEnvironment",
12414
- value: function isCtvEnvironment() {
12415
- if (this.config.ctvAdRequest) return true;
12416
- var hint = inferDeviceTypeHint(false);
12417
- return hint === DEVICE_TYPE_HINT.CONNECTED_TV || hint === DEVICE_TYPE_HINT.SET_TOP_BOX;
12418
- }
12419
- },
12420
- {
12421
- key: "setAdFloorLadder",
12422
- value: function setAdFloorLadder(update) {
12423
- var report = this.floorLadder.update(update);
12499
+ key: "applyFloorLadderFromApi",
12500
+ value: function applyFloorLadderFromApi() {
12501
+ var raw = this.adConfig.apiFloorLadder;
12502
+ if (raw == null) {
12503
+ this.floorLadder.reset();
12504
+ return;
12505
+ }
12506
+ var report = this.floorLadder.applyApiConfig(raw);
12424
12507
  this.warnOnInvalidFloorLadder(report);
12425
- return report;
12426
- }
12427
- },
12428
- {
12429
- key: "setAdFloorLadderEnabled",
12430
- value: function setAdFloorLadderEnabled(enabled) {
12431
- this.floorLadderEnabled = enabled;
12432
- if (enabled) this.warnOnInvalidFloorLadder(this.floorLadder.validate());
12508
+ if (this.debug) {
12509
+ console.log("[AdBreak][FLOOR] configuration applied from API", {
12510
+ config: this.floorLadder.get(),
12511
+ bounds: this.floorLadder.getBounds(),
12512
+ validation: report
12513
+ });
12514
+ }
12433
12515
  }
12434
12516
  },
12435
12517
  {
12436
12518
  key: "isAdFloorLadderEnabled",
12437
12519
  value: function isAdFloorLadderEnabled() {
12438
- return this.floorLadderEnabled;
12520
+ return this.floorLadder.isEnabled();
12439
12521
  }
12440
12522
  },
12441
12523
  {
12442
- key: "setEdgePodRequest",
12443
- value: function setEdgePodRequest(update) {
12444
- if (update.enableEdgePodRequest === this.config.enableEdgePodRequest && update.edgePodUrl === this.config.edgePodUrl) {
12445
- return;
12524
+ key: "applyEdgePodFromApi",
12525
+ value: function applyEdgePodFromApi() {
12526
+ this.edgePodBaseUrl = resolveEdgePodBaseUrl({
12527
+ enableEdgePodRequest: this.adConfig.apiEnableEdgePodRequest,
12528
+ edgePodUrl: this.adConfig.apiEdgePodUrl,
12529
+ licenseKey: this.config.licenseKey
12530
+ });
12531
+ if (this.debug) {
12532
+ var _this_edgePodBaseUrl;
12533
+ console.log("[AdBreak][EDGE] edge pod base URL from API:", (_this_edgePodBaseUrl = this.edgePodBaseUrl) !== null && _this_edgePodBaseUrl !== void 0 ? _this_edgePodBaseUrl : "(disabled; GAM only)");
12446
12534
  }
12447
- if (update.enableEdgePodRequest === void 0) delete this.config.enableEdgePodRequest;
12448
- else this.config.enableEdgePodRequest = update.enableEdgePodRequest;
12449
- if (update.edgePodUrl === void 0) delete this.config.edgePodUrl;
12450
- else this.config.edgePodUrl = update.edgePodUrl;
12451
- this.edgePodBaseUrl = resolveEdgePodBaseUrl(this.config);
12452
12535
  }
12453
12536
  },
12454
12537
  {
@@ -12461,7 +12544,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12461
12544
  key: "warnOnInvalidFloorLadder",
12462
12545
  value: function warnOnInvalidFloorLadder(report) {
12463
12546
  var config = this.floorLadder.get();
12464
- if (report.ok || !this.floorLadderEnabled || !config.enabled) return;
12547
+ if (report.ok || !config.enabled) return;
12465
12548
  console.warn("[AdBreak][FLOOR] configuration has issues; invalid floors will not be sent", {
12466
12549
  errors: report.errors,
12467
12550
  configurationVersion: config.configurationVersion,
@@ -12536,6 +12619,8 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
12536
12619
  4
12537
12620
  ];
12538
12621
  case 4:
12622
+ this.applyFloorLadderFromApi();
12623
+ this.applyEdgePodFromApi();
12539
12624
  palDescriptionUrl = this.config.ctvAdRequest ? this.adConfig.getPalDescriptionUrl() : void 0;
12540
12625
  fetchConsentSignals().catch(function() {
12541
12626
  return {};
@@ -13289,15 +13374,12 @@ var CRITICAL_PROPS = [
13289
13374
  "vmapUrl",
13290
13375
  "lowLatencyMode",
13291
13376
  "driftToleranceMs",
13292
- "ctvAdRequest",
13293
- "adFloorMinCents",
13294
- "adFloorMaxCents",
13295
- "adFloorStepCents"
13377
+ "ctvAdRequest"
13296
13378
  ];
13297
13379
  var CONTROLS_HIDE_DELAY = 3e3;
13298
13380
  var DEFAULT_PLAYER_ASPECT_RATIO = 16 / 9;
13299
13381
  var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13300
- 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, [
13382
+ 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, [
13301
13383
  "src",
13302
13384
  "autoplay",
13303
13385
  "muted",
@@ -13334,19 +13416,10 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13334
13416
  "minRemainingMsToStartAd",
13335
13417
  "minRemainingMsToRequestAd",
13336
13418
  "maxNoFillsPerBreak",
13337
- "maxAdBreakExtensionMs",
13338
- "adFloorLadderEnabled",
13339
- "adFloorLadder",
13340
- "adFloorMinCents",
13341
- "adFloorMaxCents",
13342
- "adFloorStepCents",
13343
- "enableEdgePodRequest",
13344
- "edgePodUrl"
13419
+ "maxAdBreakExtensionMs"
13345
13420
  ]);
13346
- var adFloorLadderKey = JSON.stringify(adFloorLadder !== null && adFloorLadder !== void 0 ? adFloorLadder : null);
13347
13421
  var videoRef = (0, import_react.useRef)(null);
13348
13422
  var playerRef = (0, import_react.useRef)(null);
13349
- var appliedFloorLadderKeyRef = (0, import_react.useRef)(null);
13350
13423
  var bufferingTimeoutRef = (0, import_react.useRef)(null);
13351
13424
  var controlsTimerRef = (0, import_react.useRef)(null);
13352
13425
  var wrapperRef = (0, import_react.useRef)(null);
@@ -13488,10 +13561,7 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13488
13561
  isVmap,
13489
13562
  vmapUrl,
13490
13563
  lowLatencyMode,
13491
- driftToleranceMs,
13492
- adFloorMinCents,
13493
- adFloorMaxCents,
13494
- adFloorStepCents
13564
+ driftToleranceMs
13495
13565
  ]);
13496
13566
  (0, import_react.useEffect)(function() {
13497
13567
  if (typeof window === "undefined") return;
@@ -13542,16 +13612,8 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13542
13612
  if (minRemainingMsToRequestAd !== void 0) cfg.minRemainingMsToRequestAd = minRemainingMsToRequestAd;
13543
13613
  if (maxNoFillsPerBreak !== void 0) cfg.maxNoFillsPerBreak = maxNoFillsPerBreak;
13544
13614
  if (maxAdBreakExtensionMs !== void 0) cfg.maxAdBreakExtensionMs = maxAdBreakExtensionMs;
13545
- if (adFloorLadderEnabled !== void 0) cfg.adFloorLadderEnabled = adFloorLadderEnabled;
13546
- if (adFloorLadder !== void 0) cfg.adFloorLadder = adFloorLadder;
13547
- if (adFloorMinCents !== void 0) cfg.adFloorMinCents = adFloorMinCents;
13548
- if (adFloorMaxCents !== void 0) cfg.adFloorMaxCents = adFloorMaxCents;
13549
- if (adFloorStepCents !== void 0) cfg.adFloorStepCents = adFloorStepCents;
13550
- if (enableEdgePodRequest !== void 0) cfg.enableEdgePodRequest = enableEdgePodRequest;
13551
- if (edgePodUrl !== void 0) cfg.edgePodUrl = edgePodUrl;
13552
13615
  var player = new StormcloudVideoPlayer(cfg);
13553
13616
  playerRef.current = player;
13554
- appliedFloorLadderKeyRef.current = adFloorLadderKey;
13555
13617
  player.load().then(function() {
13556
13618
  var showNative = player.shouldShowNativeControls();
13557
13619
  setShouldShowNativeControls(showNative);
@@ -13589,33 +13651,6 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
13589
13651
  autoplay,
13590
13652
  muted
13591
13653
  ]);
13592
- (0, import_react.useEffect)(function() {
13593
- if (!playerRef.current || adFloorLadder === void 0) return;
13594
- if (appliedFloorLadderKeyRef.current === adFloorLadderKey) return;
13595
- appliedFloorLadderKeyRef.current = adFloorLadderKey;
13596
- playerRef.current.setAdFloorLadder(adFloorLadder);
13597
- }, [
13598
- adFloorLadderKey
13599
- ]);
13600
- (0, import_react.useEffect)(function() {
13601
- if (!playerRef.current) return;
13602
- var enabled = adFloorLadderEnabled === true;
13603
- if (playerRef.current.isAdFloorLadderEnabled() === enabled) return;
13604
- playerRef.current.setAdFloorLadderEnabled(enabled);
13605
- }, [
13606
- adFloorLadderEnabled
13607
- ]);
13608
- (0, import_react.useEffect)(function() {
13609
- if (!playerRef.current) return;
13610
- playerRef.current.setEdgePodRequest(_object_spread({}, enableEdgePodRequest !== void 0 ? {
13611
- enableEdgePodRequest: enableEdgePodRequest
13612
- } : {}, edgePodUrl !== void 0 ? {
13613
- edgePodUrl: edgePodUrl
13614
- } : {}));
13615
- }, [
13616
- enableEdgePodRequest,
13617
- edgePodUrl
13618
- ]);
13619
13654
  (0, import_react.useEffect)(function() {
13620
13655
  if (!playerRef.current) return;
13621
13656
  var checkAdStatus = function checkAdStatus() {
@@ -14605,7 +14640,6 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
14605
14640
  ]
14606
14641
  });
14607
14642
  }, function(prevProps, nextProps) {
14608
- var _prevProps_adFloorLadder, _nextProps_adFloorLadder;
14609
14643
  var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
14610
14644
  try {
14611
14645
  for(var _iterator = CRITICAL_PROPS[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
@@ -14692,12 +14726,6 @@ var StormcloudVideoPlayerComponent = import_react.default.memo(function(props) {
14692
14726
  }
14693
14727
  }
14694
14728
  }
14695
- if (prevProps.adFloorLadderEnabled !== nextProps.adFloorLadderEnabled || prevProps.enableEdgePodRequest !== nextProps.enableEdgePodRequest || prevProps.edgePodUrl !== nextProps.edgePodUrl) {
14696
- return false;
14697
- }
14698
- 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)) {
14699
- return false;
14700
- }
14701
14729
  return true;
14702
14730
  });
14703
14731
  // Annotate the CommonJS export names for ESM import in node: