stormcloud-video-player 0.8.75 → 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 (39) 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 +1 -1
  5. package/lib/StormcloudPlayer.cjs +163 -78
  6. package/lib/StormcloudPlayer.cjs.map +1 -1
  7. package/lib/index.cjs +174 -133
  8. package/lib/index.cjs.map +1 -1
  9. package/lib/index.d.cts +1 -1
  10. package/lib/index.d.ts +5 -19
  11. package/lib/index.js +168 -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 +163 -78
  28. package/lib/players/HlsPlayer.cjs.map +1 -1
  29. package/lib/players/index.cjs +163 -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/types.d.cts +3 -7
  34. package/lib/ui/StormcloudVideoPlayer.cjs +167 -139
  35. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  36. package/lib/utils/tracking.cjs +7 -0
  37. package/lib/utils/tracking.cjs.map +1 -1
  38. package/lib/utils/tracking.d.cts +2 -1
  39. package/package.json +1 -1
@@ -69,6 +69,9 @@ __export(EdgePodRequest_exports, {
69
69
  },
70
70
  resolveEdgePodBaseUrl: function resolveEdgePodBaseUrl1() {
71
71
  return resolveEdgePodBaseUrl;
72
+ },
73
+ resolveEdgePodRequestContext: function resolveEdgePodRequestContext1() {
74
+ return resolveEdgePodRequestContext;
72
75
  }
73
76
  });
74
77
  module.exports = __toCommonJS(EdgePodRequest_exports);
@@ -105,7 +108,23 @@ function resolveEdgePodBaseUrl(config) {
105
108
  return void 0;
106
109
  }
107
110
  }
111
+ function resolveEdgePodRequestContext(config) {
112
+ var extra = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {};
113
+ return {
114
+ width: extra.width,
115
+ height: extra.height,
116
+ playerId: extra.playerId,
117
+ contentNetwork: config.contentNetwork,
118
+ contentChannel: config.channelName,
119
+ contentTitle: config.programTitle
120
+ };
121
+ }
122
+ function setOptionalParam(url, key, value) {
123
+ var trimmed = value === null || value === void 0 ? void 0 : value.trim();
124
+ if (trimmed) url.searchParams.set(key, trimmed);
125
+ }
108
126
  function buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {
127
+ var context = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : {};
109
128
  var url = new URL(baseUrl);
110
129
  var maxMs = Math.max(0, Math.floor(remainingMs));
111
130
  var maxAds = Math.max(1, Math.min(EDGE_POD_MAX_ADS, Math.floor(remainingAdLimit)));
@@ -113,6 +132,16 @@ function buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {
113
132
  url.searchParams.set("pmad", String(maxAds));
114
133
  url.searchParams.set("duration", String(Math.floor(maxMs / 1e3)));
115
134
  url.searchParams.set("count", String(maxAds));
135
+ if (context.width != null && Number.isFinite(context.width) && context.width > 0) {
136
+ url.searchParams.set("width", String(Math.round(context.width)));
137
+ }
138
+ if (context.height != null && Number.isFinite(context.height) && context.height > 0) {
139
+ url.searchParams.set("height", String(Math.round(context.height)));
140
+ }
141
+ setOptionalParam(url, "pid", context.playerId);
142
+ setOptionalParam(url, "cn", context.contentNetwork);
143
+ setOptionalParam(url, "cc", context.contentChannel);
144
+ setOptionalParam(url, "ct", context.contentTitle);
116
145
  return url.toString();
117
146
  }
118
147
  function classifyEdgeVastResponse(result) {
@@ -143,6 +172,7 @@ function describeEdgeUrl(url) {
143
172
  buildEdgePodUrl: buildEdgePodUrl,
144
173
  classifyEdgeVastResponse: classifyEdgeVastResponse,
145
174
  describeEdgeUrl: describeEdgeUrl,
146
- resolveEdgePodBaseUrl: resolveEdgePodBaseUrl
175
+ resolveEdgePodBaseUrl: resolveEdgePodBaseUrl,
176
+ resolveEdgePodRequestContext: resolveEdgePodRequestContext
147
177
  });
148
178
  //# sourceMappingURL=EdgePodRequest.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\EdgePodRequest.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","EdgePodRequest_exports","EDGE_POD_EXCEEDS_BUDGET","EDGE_POD_MAX_ADS","buildEdgePodUrl","classifyEdgeVastResponse","describeEdgeUrl","resolveEdgePodBaseUrl","module","exports","LICENSE_KEY_PLACEHOLDER","config","enableEdgePodRequest","raw","edgePodUrl","trim","console","warn","licenseKey","encodedKey","encodeURIComponent","hasPlaceholder","search","url","URL","replace","protocol","Error","path","pathname","test","toString","baseUrl","remainingMs","remainingAdLimit","maxMs","Math","max","floor","maxAds","min","searchParams","set","String","result","error","podAdCount","message","includes","parsed","origin","split"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\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 __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/player/EdgePodRequest.ts\nvar EdgePodRequest_exports = {};\n__export(EdgePodRequest_exports, {\n EDGE_POD_EXCEEDS_BUDGET: () => EDGE_POD_EXCEEDS_BUDGET,\n EDGE_POD_MAX_ADS: () => EDGE_POD_MAX_ADS,\n buildEdgePodUrl: () => buildEdgePodUrl,\n classifyEdgeVastResponse: () => classifyEdgeVastResponse,\n describeEdgeUrl: () => describeEdgeUrl,\n resolveEdgePodBaseUrl: () => resolveEdgePodBaseUrl\n});\nmodule.exports = __toCommonJS(EdgePodRequest_exports);\nvar EDGE_POD_MAX_ADS = 10;\nvar EDGE_POD_EXCEEDS_BUDGET = \"edge_pod_exceeds_budget\";\nvar LICENSE_KEY_PLACEHOLDER = /\\{licenseKey\\}|%7BlicenseKey%7D/gi;\nfunction resolveEdgePodBaseUrl(config) {\n if (config.enableEdgePodRequest !== true) return void 0;\n const raw = config.edgePodUrl?.trim();\n if (!raw) {\n console.warn(\n \"[AdBreak][EDGE] enableEdgePodRequest is true but edgePodUrl is missing; using GAM only\"\n );\n return void 0;\n }\n const licenseKey = config.licenseKey?.trim();\n if (!licenseKey) {\n console.warn(\n \"[AdBreak][EDGE] enableEdgePodRequest is true but licenseKey is missing; using GAM only\"\n );\n return void 0;\n }\n const encodedKey = encodeURIComponent(licenseKey);\n try {\n const hasPlaceholder = raw.search(LICENSE_KEY_PLACEHOLDER) !== -1;\n const url = new URL(hasPlaceholder ? raw.replace(LICENSE_KEY_PLACEHOLDER, encodedKey) : raw);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(`unsupported protocol ${url.protocol}`);\n }\n if (!hasPlaceholder) {\n const path = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = /\\/[^/]+\\/pod$/.test(path) ? path.replace(/\\/[^/]+\\/pod$/, `/${encodedKey}/pod`) : `${path}/${encodedKey}/pod`;\n }\n return url.toString();\n } catch {\n console.warn(\"[AdBreak][EDGE] edgePodUrl is not a valid http(s) URL; using GAM only\");\n return void 0;\n }\n}\nfunction buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit) {\n const url = new URL(baseUrl);\n const maxMs = Math.max(0, Math.floor(remainingMs));\n const maxAds = Math.max(1, Math.min(EDGE_POD_MAX_ADS, Math.floor(remainingAdLimit)));\n url.searchParams.set(\"pmxd\", String(maxMs));\n url.searchParams.set(\"pmad\", String(maxAds));\n url.searchParams.set(\"duration\", String(Math.floor(maxMs / 1e3)));\n url.searchParams.set(\"count\", String(maxAds));\n return url.toString();\n}\nfunction classifyEdgeVastResponse(result) {\n if (result.error == null) {\n return result.podAdCount > 0 ? \"fill\" : \"no_fill\";\n }\n const message = result.error?.message ?? String(result.error);\n if (/no ads available|fill rejected|no media file|no ad loaded/i.test(message) || message.includes(EDGE_POD_EXCEEDS_BUDGET)) {\n return \"no_fill\";\n }\n return \"invalid\";\n}\nfunction describeEdgeUrl(url) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return url.split(\"?\")[0] ?? \"\";\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n EDGE_POD_EXCEEDS_BUDGET,\n EDGE_POD_MAX_ADS,\n buildEdgePodUrl,\n classifyEdgeVastResponse,\n describeEdgeUrl,\n resolveEdgePodBaseUrl\n});\n"]}
1
+ {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\EdgePodRequest.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","EdgePodRequest_exports","EDGE_POD_EXCEEDS_BUDGET","EDGE_POD_MAX_ADS","buildEdgePodUrl","classifyEdgeVastResponse","describeEdgeUrl","resolveEdgePodBaseUrl","resolveEdgePodRequestContext","module","exports","LICENSE_KEY_PLACEHOLDER","config","enableEdgePodRequest","raw","edgePodUrl","trim","console","warn","licenseKey","encodedKey","encodeURIComponent","hasPlaceholder","search","url","URL","replace","protocol","Error","path","pathname","test","toString","extra","width","height","playerId","contentNetwork","contentChannel","channelName","contentTitle","programTitle","setOptionalParam","trimmed","searchParams","set","baseUrl","remainingMs","remainingAdLimit","context","maxMs","Math","max","floor","maxAds","min","String","Number","isFinite","round","result","error","podAdCount","message","includes","parsed","origin","split"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\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 __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/player/EdgePodRequest.ts\nvar EdgePodRequest_exports = {};\n__export(EdgePodRequest_exports, {\n EDGE_POD_EXCEEDS_BUDGET: () => EDGE_POD_EXCEEDS_BUDGET,\n EDGE_POD_MAX_ADS: () => EDGE_POD_MAX_ADS,\n buildEdgePodUrl: () => buildEdgePodUrl,\n classifyEdgeVastResponse: () => classifyEdgeVastResponse,\n describeEdgeUrl: () => describeEdgeUrl,\n resolveEdgePodBaseUrl: () => resolveEdgePodBaseUrl,\n resolveEdgePodRequestContext: () => resolveEdgePodRequestContext\n});\nmodule.exports = __toCommonJS(EdgePodRequest_exports);\nvar EDGE_POD_MAX_ADS = 10;\nvar EDGE_POD_EXCEEDS_BUDGET = \"edge_pod_exceeds_budget\";\nvar LICENSE_KEY_PLACEHOLDER = /\\{licenseKey\\}|%7BlicenseKey%7D/gi;\nfunction resolveEdgePodBaseUrl(config) {\n if (config.enableEdgePodRequest !== true) return void 0;\n const raw = config.edgePodUrl?.trim();\n if (!raw) {\n console.warn(\n \"[AdBreak][EDGE] enableEdgePodRequest is true but edgePodUrl is missing; using GAM only\"\n );\n return void 0;\n }\n const licenseKey = config.licenseKey?.trim();\n if (!licenseKey) {\n console.warn(\n \"[AdBreak][EDGE] enableEdgePodRequest is true but licenseKey is missing; using GAM only\"\n );\n return void 0;\n }\n const encodedKey = encodeURIComponent(licenseKey);\n try {\n const hasPlaceholder = raw.search(LICENSE_KEY_PLACEHOLDER) !== -1;\n const url = new URL(hasPlaceholder ? raw.replace(LICENSE_KEY_PLACEHOLDER, encodedKey) : raw);\n if (url.protocol !== \"https:\" && url.protocol !== \"http:\") {\n throw new Error(`unsupported protocol ${url.protocol}`);\n }\n if (!hasPlaceholder) {\n const path = url.pathname.replace(/\\/+$/, \"\");\n url.pathname = /\\/[^/]+\\/pod$/.test(path) ? path.replace(/\\/[^/]+\\/pod$/, `/${encodedKey}/pod`) : `${path}/${encodedKey}/pod`;\n }\n return url.toString();\n } catch {\n console.warn(\"[AdBreak][EDGE] edgePodUrl is not a valid http(s) URL; using GAM only\");\n return void 0;\n }\n}\nfunction resolveEdgePodRequestContext(config, extra = {}) {\n return {\n width: extra.width,\n height: extra.height,\n playerId: extra.playerId,\n contentNetwork: config.contentNetwork,\n contentChannel: config.channelName,\n contentTitle: config.programTitle\n };\n}\nfunction setOptionalParam(url, key, value) {\n const trimmed = value?.trim();\n if (trimmed) url.searchParams.set(key, trimmed);\n}\nfunction buildEdgePodUrl(baseUrl, remainingMs, remainingAdLimit, context = {}) {\n const url = new URL(baseUrl);\n const maxMs = Math.max(0, Math.floor(remainingMs));\n const maxAds = Math.max(1, Math.min(EDGE_POD_MAX_ADS, Math.floor(remainingAdLimit)));\n url.searchParams.set(\"pmxd\", String(maxMs));\n url.searchParams.set(\"pmad\", String(maxAds));\n url.searchParams.set(\"duration\", String(Math.floor(maxMs / 1e3)));\n url.searchParams.set(\"count\", String(maxAds));\n if (context.width != null && Number.isFinite(context.width) && context.width > 0) {\n url.searchParams.set(\"width\", String(Math.round(context.width)));\n }\n if (context.height != null && Number.isFinite(context.height) && context.height > 0) {\n url.searchParams.set(\"height\", String(Math.round(context.height)));\n }\n setOptionalParam(url, \"pid\", context.playerId);\n setOptionalParam(url, \"cn\", context.contentNetwork);\n setOptionalParam(url, \"cc\", context.contentChannel);\n setOptionalParam(url, \"ct\", context.contentTitle);\n return url.toString();\n}\nfunction classifyEdgeVastResponse(result) {\n if (result.error == null) {\n return result.podAdCount > 0 ? \"fill\" : \"no_fill\";\n }\n const message = result.error?.message ?? String(result.error);\n if (/no ads available|fill rejected|no media file|no ad loaded/i.test(message) || message.includes(EDGE_POD_EXCEEDS_BUDGET)) {\n return \"no_fill\";\n }\n return \"invalid\";\n}\nfunction describeEdgeUrl(url) {\n try {\n const parsed = new URL(url);\n return `${parsed.origin}${parsed.pathname}`;\n } catch {\n return url.split(\"?\")[0] ?? \"\";\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n EDGE_POD_EXCEEDS_BUDGET,\n EDGE_POD_MAX_ADS,\n buildEdgePodUrl,\n classifyEdgeVastResponse,\n describeEdgeUrl,\n resolveEdgePodBaseUrl,\n resolveEdgePodRequestContext\n});\n"]}
@@ -4,12 +4,30 @@ import './OptimizedPodRequest.cjs';
4
4
  declare const EDGE_POD_MAX_ADS = 10;
5
5
  type EdgePodClassification = "fill" | "no_fill" | "invalid";
6
6
  declare const EDGE_POD_EXCEEDS_BUDGET = "edge_pod_exceeds_budget";
7
- declare function resolveEdgePodBaseUrl(config: Pick<StormcloudVideoPlayerConfig, "enableEdgePodRequest" | "edgePodUrl" | "licenseKey">): string | undefined;
8
- declare function buildEdgePodUrl(baseUrl: string, remainingMs: number, remainingAdLimit: number): string;
7
+ interface EdgePodSettings {
8
+ enableEdgePodRequest?: boolean | undefined;
9
+ edgePodUrl?: string | undefined;
10
+ licenseKey?: string | undefined;
11
+ }
12
+ declare function resolveEdgePodBaseUrl(config: EdgePodSettings): string | undefined;
13
+ interface EdgePodRequestContext {
14
+ width?: number | undefined;
15
+ height?: number | undefined;
16
+ playerId?: string | undefined;
17
+ contentNetwork?: string | undefined;
18
+ contentChannel?: string | undefined;
19
+ contentTitle?: string | undefined;
20
+ }
21
+ declare function resolveEdgePodRequestContext(config: Pick<StormcloudVideoPlayerConfig, "contentNetwork" | "channelName" | "programTitle">, extra?: {
22
+ width?: number | undefined;
23
+ height?: number | undefined;
24
+ playerId?: string | undefined;
25
+ }): EdgePodRequestContext;
26
+ declare function buildEdgePodUrl(baseUrl: string, remainingMs: number, remainingAdLimit: number, context?: EdgePodRequestContext): string;
9
27
  declare function classifyEdgeVastResponse(result: {
10
28
  podAdCount: number;
11
29
  error?: unknown;
12
30
  }): EdgePodClassification;
13
31
  declare function describeEdgeUrl(url: string): string;
14
32
 
15
- export { EDGE_POD_EXCEEDS_BUDGET, EDGE_POD_MAX_ADS, type EdgePodClassification, buildEdgePodUrl, classifyEdgeVastResponse, describeEdgeUrl, resolveEdgePodBaseUrl };
33
+ export { EDGE_POD_EXCEEDS_BUDGET, EDGE_POD_MAX_ADS, type EdgePodClassification, type EdgePodRequestContext, type EdgePodSettings, buildEdgePodUrl, classifyEdgeVastResponse, describeEdgeUrl, resolveEdgePodBaseUrl, resolveEdgePodRequestContext };
@@ -121,8 +121,8 @@ __export(FloorLadder_exports, {
121
121
  DEFAULT_FLOOR_LADDER_BOUNDS: function DEFAULT_FLOOR_LADDER_BOUNDS1() {
122
122
  return DEFAULT_FLOOR_LADDER_BOUNDS;
123
123
  },
124
- DEFAULT_WEB_FLOOR_LADDER_CONFIG: function DEFAULT_WEB_FLOOR_LADDER_CONFIG1() {
125
- return DEFAULT_WEB_FLOOR_LADDER_CONFIG;
124
+ DISABLED_FLOOR_LADDER_CONFIG: function DISABLED_FLOOR_LADDER_CONFIG1() {
125
+ return DISABLED_FLOOR_LADDER_CONFIG;
126
126
  },
127
127
  FloorLadderController: function FloorLadderController1() {
128
128
  return FloorLadderController;
@@ -136,6 +136,9 @@ __export(FloorLadder_exports, {
136
136
  generateFloorLevels: function generateFloorLevels1() {
137
137
  return generateFloorLevels;
138
138
  },
139
+ parseApiFloorLadder: function parseApiFloorLadder1() {
140
+ return parseApiFloorLadder;
141
+ },
139
142
  resolveFloorLadderBounds: function resolveFloorLadderBounds1() {
140
143
  return resolveFloorLadderBounds;
141
144
  },
@@ -184,21 +187,19 @@ var GAM_AD_HOSTS = /* @__PURE__ */ new Set([
184
187
  "securepubads.g.doubleclick.net"
185
188
  ]);
186
189
  // src/player/FloorLadder.ts
187
- var DEFAULT_WEB_FLOOR_LADDER_CONFIG = Object.freeze({
190
+ var DISABLED_FLOOR_LADDER_CONFIG = Object.freeze({
188
191
  enabled: false,
189
- targetingKey: "airytv_web_floor",
190
- minFloorCents: 25,
191
- maxFloorCents: 300,
192
- stepCents: 25,
193
- selectedFloorCents: 25,
194
- fallbackFloorCents: 25,
192
+ targetingKey: "",
193
+ minFloorCents: 0,
194
+ maxFloorCents: 0,
195
+ stepCents: 0,
196
+ selectedFloorCents: 0,
197
+ fallbackFloorCents: 0,
195
198
  readyFloorCents: [],
196
199
  mode: "fixed",
197
- allowedPositions: [
198
- "midroll"
199
- ],
200
- targetAdUnitPath: "/21821455290/airytvadx/airytv-web",
201
- configurationVersion: "2026-09-29.1"
200
+ allowedPositions: [],
201
+ targetAdUnitPath: "",
202
+ configurationVersion: ""
202
203
  });
203
204
  var DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({
204
205
  minCents: 25,
@@ -357,7 +358,6 @@ function resolveOpportunityFloor(config, context) {
357
358
  if (!config.enabled) return skipped("disabled");
358
359
  var positions = Array.isArray(config.allowedPositions) ? config.allowedPositions : [];
359
360
  if (positions.indexOf(context.position) === -1) return skipped("position_not_allowed");
360
- if (context.isCtv) return skipped("ctv_excluded");
361
361
  if (!config.targetingKey) return skipped("missing_targeting_key");
362
362
  if (!config.targetAdUnitPath) return skipped("missing_target_ad_unit");
363
363
  var result;
@@ -511,15 +511,80 @@ function mergeDefined(target, update) {
511
511
  }
512
512
  return copyConfig(next);
513
513
  }
514
+ var AD_POSITIONS = [
515
+ "preroll",
516
+ "midroll",
517
+ "postroll"
518
+ ];
519
+ function finiteNumber(value) {
520
+ return typeof value === "number" && isFinite(value) ? value : void 0;
521
+ }
522
+ function parseApiFloorLadder(raw) {
523
+ if (!raw || (typeof raw === "undefined" ? "undefined" : _type_of(raw)) !== "object" || Array.isArray(raw)) return void 0;
524
+ var src = raw;
525
+ var out = {};
526
+ if (typeof src.enabled === "boolean") out.enabled = src.enabled;
527
+ if (typeof src.targetingKey === "string") out.targetingKey = src.targetingKey;
528
+ if (typeof src.targetAdUnitPath === "string") out.targetAdUnitPath = src.targetAdUnitPath;
529
+ if (typeof src.configurationVersion === "string") out.configurationVersion = src.configurationVersion;
530
+ if (typeof src.mode === "string") out.mode = src.mode;
531
+ var min = finiteNumber(src.minFloorCents);
532
+ var max = finiteNumber(src.maxFloorCents);
533
+ var step = finiteNumber(src.stepCents);
534
+ var selected = finiteNumber(src.selectedFloorCents);
535
+ var fallback = finiteNumber(src.fallbackFloorCents);
536
+ if (min !== void 0) out.minFloorCents = min;
537
+ if (max !== void 0) out.maxFloorCents = max;
538
+ if (step !== void 0) out.stepCents = step;
539
+ if (selected !== void 0) out.selectedFloorCents = selected;
540
+ if (fallback !== void 0) out.fallbackFloorCents = fallback;
541
+ if (Array.isArray(src.readyFloorCents)) {
542
+ out.readyFloorCents = src.readyFloorCents.filter(function(cents) {
543
+ return finiteNumber(cents) !== void 0;
544
+ });
545
+ }
546
+ if (Array.isArray(src.allowedPositions)) {
547
+ out.allowedPositions = src.allowedPositions.filter(function(position) {
548
+ return AD_POSITIONS.indexOf(position) !== -1;
549
+ });
550
+ }
551
+ return out;
552
+ }
514
553
  var FloorLadderController = /*#__PURE__*/ function() {
515
- function FloorLadderController(initial, bounds) {
516
- var selector = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : fixedFloorSelector;
554
+ function FloorLadderController() {
555
+ var selector = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : fixedFloorSelector;
517
556
  _class_call_check(this, FloorLadderController);
518
- this.config = mergeDefined(copyConfig(DEFAULT_WEB_FLOOR_LADDER_CONFIG), initial);
519
- this.bounds = Object.freeze(resolveFloorLadderBounds(bounds));
557
+ this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;
558
+ this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);
520
559
  this.selector = selector;
521
560
  }
522
561
  _create_class(FloorLadderController, [
562
+ {
563
+ key: "isEnabled",
564
+ value: function isEnabled() {
565
+ return this.config.enabled === true;
566
+ }
567
+ },
568
+ {
569
+ key: "applyApiConfig",
570
+ value: function applyApiConfig(raw) {
571
+ var parsed = parseApiFloorLadder(raw);
572
+ this.config = mergeDefined(copyConfig(DISABLED_FLOOR_LADDER_CONFIG), parsed);
573
+ this.bounds = Object.freeze({
574
+ minCents: this.config.minFloorCents,
575
+ maxCents: this.config.maxFloorCents,
576
+ stepCents: this.config.stepCents
577
+ });
578
+ return validateFloorLadderConfig(this.config, this.bounds);
579
+ }
580
+ },
581
+ {
582
+ key: "reset",
583
+ value: function reset() {
584
+ this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);
585
+ this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;
586
+ }
587
+ },
523
588
  {
524
589
  key: "get",
525
590
  value: function get() {
@@ -532,13 +597,6 @@ var FloorLadderController = /*#__PURE__*/ function() {
532
597
  return _object_spread({}, this.bounds);
533
598
  }
534
599
  },
535
- {
536
- key: "update",
537
- value: function update(update) {
538
- this.config = mergeDefined(this.config, update);
539
- return validateFloorLadderConfig(this.config, this.bounds);
540
- }
541
- },
542
600
  {
543
601
  key: "validate",
544
602
  value: function validate() {
@@ -565,11 +623,12 @@ var FloorLadderController = /*#__PURE__*/ function() {
565
623
  // Annotate the CommonJS export names for ESM import in node:
566
624
  0 && (module.exports = {
567
625
  DEFAULT_FLOOR_LADDER_BOUNDS: DEFAULT_FLOOR_LADDER_BOUNDS,
568
- DEFAULT_WEB_FLOOR_LADDER_CONFIG: DEFAULT_WEB_FLOOR_LADDER_CONFIG,
626
+ DISABLED_FLOOR_LADDER_CONFIG: DISABLED_FLOOR_LADDER_CONFIG,
569
627
  FloorLadderController: FloorLadderController,
570
628
  applyFloorToVastUrl: applyFloorToVastUrl,
571
629
  fixedFloorSelector: fixedFloorSelector,
572
630
  generateFloorLevels: generateFloorLevels,
631
+ parseApiFloorLadder: parseApiFloorLadder,
573
632
  resolveFloorLadderBounds: resolveFloorLadderBounds,
574
633
  resolveOpportunityFloor: resolveOpportunityFloor,
575
634
  validateFloorCents: validateFloorCents,
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\FloorLadder.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","FloorLadder_exports","DEFAULT_FLOOR_LADDER_BOUNDS","DEFAULT_WEB_FLOOR_LADDER_CONFIG","FloorLadderController","applyFloorToVastUrl","fixedFloorSelector","generateFloorLevels","resolveFloorLadderBounds","resolveOpportunityFloor","validateFloorCents","validateFloorLadderConfig","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","GAM_AD_HOSTS","Set","freeze","enabled","targetingKey","minFloorCents","maxFloorCents","stepCents","selectedFloorCents","fallbackFloorCents","readyFloorCents","mode","allowedPositions","targetAdUnitPath","configurationVersion","minCents","maxCents","isInteger","Number","levels","cents","push","overrides","config","bounds","ok","reason","gamLevels","configLevels","indexOf","ready","Array","isArray","errors","length","filter","String","check","selected","fallback","select","context","source","floorCents","selector","result","base","position","skipped","status","positions","isCtv","decodeQueryComponent","decodeURIComponent","replace","mergeCustParams","decoded","prefix","kept","split","pair","join","url","floor","applied","parsed","URL","has","hostname","searchParams","hashIndex","beforeHash","slice","hash","queryIndex","segments","existing","insertAt","rest","segment","eq","rawKey","merged","splice","encodeURIComponent","query","copyConfig","mergeDefined","update","next","keys","initial","getBounds","validate","setSelector","snapshotFor"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\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 __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/player/FloorLadder.ts\nvar FloorLadder_exports = {};\n__export(FloorLadder_exports, {\n DEFAULT_FLOOR_LADDER_BOUNDS: () => DEFAULT_FLOOR_LADDER_BOUNDS,\n DEFAULT_WEB_FLOOR_LADDER_CONFIG: () => DEFAULT_WEB_FLOOR_LADDER_CONFIG,\n FloorLadderController: () => FloorLadderController,\n applyFloorToVastUrl: () => applyFloorToVastUrl,\n fixedFloorSelector: () => fixedFloorSelector,\n generateFloorLevels: () => generateFloorLevels,\n resolveFloorLadderBounds: () => resolveFloorLadderBounds,\n resolveOpportunityFloor: () => resolveOpportunityFloor,\n validateFloorCents: () => validateFloorCents,\n validateFloorLadderConfig: () => validateFloorLadderConfig\n});\nmodule.exports = __toCommonJS(FloorLadder_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/utils/vastMacros.ts\nvar GAM_AD_HOSTS = /* @__PURE__ */ new Set([\n \"pubads.g.doubleclick.net\",\n \"securepubads.g.doubleclick.net\"\n]);\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});\nfunction isInteger(value) {\n return typeof value === \"number\" && Number.isInteger(value);\n}\nfunction generateFloorLevels(minCents, maxCents, stepCents) {\n if (!isInteger(minCents) || !isInteger(maxCents) || !isInteger(stepCents)) return [];\n if (stepCents <= 0 || minCents <= 0 || maxCents < minCents) return [];\n const levels = [];\n for (let cents = minCents; cents <= maxCents; cents += stepCents) {\n levels.push(cents);\n }\n return levels;\n}\nfunction resolveFloorLadderBounds(overrides = {}) {\n return {\n minCents: overrides.minCents ?? DEFAULT_FLOOR_LADDER_BOUNDS.minCents,\n maxCents: overrides.maxCents ?? DEFAULT_FLOOR_LADDER_BOUNDS.maxCents,\n stepCents: overrides.stepCents ?? DEFAULT_FLOOR_LADDER_BOUNDS.stepCents\n };\n}\nfunction validateFloorCents(value, config, bounds = DEFAULT_FLOOR_LADDER_BOUNDS) {\n if (!isInteger(value)) return { ok: false, reason: \"not_integer\" };\n if (!(value >= bounds.minCents && value <= bounds.maxCents) || !(value >= config.minFloorCents && value <= config.maxFloorCents)) {\n return { ok: false, reason: \"out_of_range\" };\n }\n const gamLevels = generateFloorLevels(bounds.minCents, bounds.maxCents, bounds.stepCents);\n const configLevels = generateFloorLevels(config.minFloorCents, config.maxFloorCents, config.stepCents);\n if (gamLevels.indexOf(value) === -1 || configLevels.indexOf(value) === -1) {\n return { ok: false, reason: \"not_step_multiple\" };\n }\n const ready = Array.isArray(config.readyFloorCents) ? config.readyFloorCents : [];\n if (ready.indexOf(value) === -1) return { ok: false, reason: \"not_ready\" };\n return { ok: true };\n}\nfunction validateFloorLadderConfig(config, bounds = DEFAULT_FLOOR_LADDER_BOUNDS) {\n const errors = [];\n if (generateFloorLevels(bounds.minCents, bounds.maxCents, bounds.stepCents).length === 0) {\n errors.push(\"invalid_gam_bounds\");\n }\n const levels = generateFloorLevels(config.minFloorCents, config.maxFloorCents, config.stepCents).filter((cents) => validateFloorCents(cents, { ...config, readyFloorCents: [cents] }, bounds).ok);\n if (levels.length === 0) errors.push(\"invalid_level_bounds\");\n if (config.minFloorCents < bounds.minCents || config.maxFloorCents > bounds.maxCents) {\n errors.push(\"level_bounds_outside_gam_ladder\");\n }\n if (!config.targetingKey) errors.push(\"missing_targeting_key\");\n if (config.mode !== \"fixed\") errors.push(`unsupported_mode:${String(config.mode)}`);\n if (!Array.isArray(config.readyFloorCents)) {\n errors.push(\"ready_floor_cents_not_array\");\n } else {\n for (const cents of config.readyFloorCents) {\n const check = validateFloorCents(cents, config, bounds);\n if (!check.ok) errors.push(`ready_floor_invalid:${String(cents)}:${check.reason}`);\n }\n }\n const selected = validateFloorCents(config.selectedFloorCents, config, bounds);\n if (!selected.ok) errors.push(`selected_floor_invalid:${selected.reason}`);\n const fallback = validateFloorCents(config.fallbackFloorCents, config, bounds);\n if (!fallback.ok) errors.push(`fallback_floor_invalid:${fallback.reason}`);\n return { ok: errors.length === 0, levels, errors };\n}\nvar fixedFloorSelector = {\n name: \"fixed\",\n select(config, context) {\n if (config.mode !== \"fixed\") return { source: \"none\", reason: \"unsupported_mode\" };\n const selected = validateFloorCents(config.selectedFloorCents, config, context.bounds);\n if (selected.ok) return { floorCents: config.selectedFloorCents, source: \"selected\" };\n const fallback = validateFloorCents(config.fallbackFloorCents, config, context.bounds);\n if (fallback.ok) {\n return {\n floorCents: config.fallbackFloorCents,\n source: \"fallback\",\n reason: `selected_${selected.reason}`\n };\n }\n return {\n source: \"none\",\n reason: `no_valid_floor:selected_${selected.reason}:fallback_${fallback.reason}`\n };\n }\n};\nfunction resolveOpportunityFloor(config, context, selector = fixedFloorSelector) {\n const base = {\n selector: selector.name,\n position: context.position,\n configurationVersion: String(config.configurationVersion ?? \"\"),\n targetingKey: config.targetingKey,\n targetAdUnitPath: config.targetAdUnitPath\n };\n const skipped = (reason, source = \"none\") => Object.freeze({ ...base, status: \"skipped\", floorCents: void 0, source, reason });\n if (!config.enabled) return skipped(\"disabled\");\n const positions = Array.isArray(config.allowedPositions) ? config.allowedPositions : [];\n if (positions.indexOf(context.position) === -1) return skipped(\"position_not_allowed\");\n if (context.isCtv) return skipped(\"ctv_excluded\");\n if (!config.targetingKey) return skipped(\"missing_targeting_key\");\n if (!config.targetAdUnitPath) return skipped(\"missing_target_ad_unit\");\n let result;\n try {\n result = selector.select(config, context);\n } catch {\n return skipped(\"selector_error\");\n }\n if (result.floorCents == null) return skipped(result.reason ?? \"no_valid_floor\", result.source);\n const check = validateFloorCents(result.floorCents, config, context.bounds);\n if (!check.ok) return skipped(`selector_floor_${check.reason}`);\n return Object.freeze({\n ...base,\n status: \"armed\",\n floorCents: result.floorCents,\n source: result.source,\n reason: result.reason\n });\n}\nfunction decodeQueryComponent(value) {\n try {\n return decodeURIComponent(value.replace(/\\+/g, \" \"));\n } catch {\n return void 0;\n }\n}\nfunction mergeCustParams(decoded, key, cents) {\n const prefix = `${key}=`;\n const kept = decoded.split(\"&\").filter((pair) => pair !== \"\" && pair !== key && pair.indexOf(prefix) !== 0);\n kept.push(`${prefix}${cents}`);\n return kept.join(\"&\");\n}\nfunction applyFloorToVastUrl(url, floor) {\n if (floor.status !== \"armed\" || floor.floorCents == null) {\n return { url, applied: false, reason: floor.reason };\n }\n let parsed;\n try {\n parsed = new URL(url);\n } catch {\n return { url, applied: false, reason: \"invalid_url\" };\n }\n if (!GAM_AD_HOSTS.has(parsed.hostname)) {\n return { url, applied: false, reason: \"not_gam_host\" };\n }\n if (parsed.searchParams.get(\"iu\") !== floor.targetAdUnitPath) {\n return { url, applied: false, reason: \"ad_unit_mismatch\" };\n }\n const hashIndex = url.indexOf(\"#\");\n const beforeHash = hashIndex === -1 ? url : url.slice(0, hashIndex);\n const hash = hashIndex === -1 ? \"\" : url.slice(hashIndex);\n const queryIndex = beforeHash.indexOf(\"?\");\n const base = beforeHash.slice(0, queryIndex);\n const segments = beforeHash.slice(queryIndex + 1).split(\"&\");\n const existing = [];\n let insertAt = -1;\n const rest = [];\n for (const segment of segments) {\n const eq = segment.indexOf(\"=\");\n const rawKey = eq === -1 ? segment : segment.slice(0, eq);\n if (decodeQueryComponent(rawKey) === \"cust_params\") {\n if (insertAt === -1) insertAt = rest.length;\n const value = eq === -1 ? \"\" : decodeQueryComponent(segment.slice(eq + 1));\n if (value === void 0) {\n return { url, applied: false, reason: \"malformed_cust_params\" };\n }\n if (value) existing.push(value);\n continue;\n }\n rest.push(segment);\n }\n if (insertAt === -1) insertAt = rest.length;\n const merged = mergeCustParams(existing.join(\"&\"), floor.targetingKey, floor.floorCents);\n rest.splice(insertAt, 0, `cust_params=${encodeURIComponent(merged)}`);\n const query = rest.filter((segment) => segment !== \"\").join(\"&\");\n return { url: `${base}?${query}${hash}`, applied: true, reason: void 0 };\n}\nfunction copyConfig(config) {\n return {\n ...config,\n readyFloorCents: Array.isArray(config.readyFloorCents) ? config.readyFloorCents.slice() : [],\n allowedPositions: Array.isArray(config.allowedPositions) ? config.allowedPositions.slice() : []\n };\n}\nfunction mergeDefined(target, update) {\n const next = copyConfig(target);\n if (!update) return next;\n for (const key of Object.keys(update)) {\n const value = update[key];\n if (value !== void 0) next[key] = value;\n }\n return copyConfig(next);\n}\nvar FloorLadderController = class {\n constructor(initial, bounds, selector = fixedFloorSelector) {\n this.config = mergeDefined(copyConfig(DEFAULT_WEB_FLOOR_LADDER_CONFIG), initial);\n this.bounds = Object.freeze(resolveFloorLadderBounds(bounds));\n this.selector = selector;\n }\n get() {\n return copyConfig(this.config);\n }\n getBounds() {\n return { ...this.bounds };\n }\n update(update) {\n this.config = mergeDefined(this.config, update);\n return validateFloorLadderConfig(this.config, this.bounds);\n }\n validate() {\n return validateFloorLadderConfig(this.config, this.bounds);\n }\n setSelector(selector) {\n this.selector = selector;\n }\n snapshotFor(context) {\n return resolveOpportunityFloor(\n copyConfig(this.config),\n { ...context, bounds: this.bounds },\n this.selector\n );\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n DEFAULT_FLOOR_LADDER_BOUNDS,\n DEFAULT_WEB_FLOOR_LADDER_CONFIG,\n FloorLadderController,\n applyFloorToVastUrl,\n fixedFloorSelector,\n generateFloorLevels,\n resolveFloorLadderBounds,\n resolveOpportunityFloor,\n validateFloorCents,\n validateFloorLadderConfig\n});\n"]}
1
+ {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\FloorLadder.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","call","__toCommonJS","mod","value","FloorLadder_exports","DEFAULT_FLOOR_LADDER_BOUNDS","DISABLED_FLOOR_LADDER_CONFIG","FloorLadderController","applyFloorToVastUrl","fixedFloorSelector","generateFloorLevels","parseApiFloorLadder","resolveFloorLadderBounds","resolveOpportunityFloor","validateFloorCents","validateFloorLadderConfig","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","GAM_AD_HOSTS","Set","freeze","enabled","targetingKey","minFloorCents","maxFloorCents","stepCents","selectedFloorCents","fallbackFloorCents","readyFloorCents","mode","allowedPositions","targetAdUnitPath","configurationVersion","minCents","maxCents","isInteger","Number","levels","cents","push","overrides","config","bounds","ok","reason","gamLevels","configLevels","indexOf","ready","Array","isArray","errors","length","filter","String","check","selected","fallback","select","context","source","floorCents","selector","result","base","position","skipped","status","positions","decodeQueryComponent","decodeURIComponent","replace","mergeCustParams","decoded","prefix","kept","split","pair","join","url","floor","applied","parsed","URL","has","hostname","searchParams","hashIndex","beforeHash","slice","hash","queryIndex","segments","existing","insertAt","rest","segment","eq","rawKey","merged","splice","encodeURIComponent","query","copyConfig","mergeDefined","update","next","keys","AD_POSITIONS","finiteNumber","isFinite","raw","src","out","min","max","step","isEnabled","applyApiConfig","reset","getBounds","validate","setSelector","snapshotFor"],"mappings":"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","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\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 __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/player/FloorLadder.ts\nvar FloorLadder_exports = {};\n__export(FloorLadder_exports, {\n DEFAULT_FLOOR_LADDER_BOUNDS: () => DEFAULT_FLOOR_LADDER_BOUNDS,\n DISABLED_FLOOR_LADDER_CONFIG: () => DISABLED_FLOOR_LADDER_CONFIG,\n FloorLadderController: () => FloorLadderController,\n applyFloorToVastUrl: () => applyFloorToVastUrl,\n fixedFloorSelector: () => fixedFloorSelector,\n generateFloorLevels: () => generateFloorLevels,\n parseApiFloorLadder: () => parseApiFloorLadder,\n resolveFloorLadderBounds: () => resolveFloorLadderBounds,\n resolveOpportunityFloor: () => resolveOpportunityFloor,\n validateFloorCents: () => validateFloorCents,\n validateFloorLadderConfig: () => validateFloorLadderConfig\n});\nmodule.exports = __toCommonJS(FloorLadder_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/utils/vastMacros.ts\nvar GAM_AD_HOSTS = /* @__PURE__ */ new Set([\n \"pubads.g.doubleclick.net\",\n \"securepubads.g.doubleclick.net\"\n]);\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});\nfunction isInteger(value) {\n return typeof value === \"number\" && Number.isInteger(value);\n}\nfunction generateFloorLevels(minCents, maxCents, stepCents) {\n if (!isInteger(minCents) || !isInteger(maxCents) || !isInteger(stepCents)) return [];\n if (stepCents <= 0 || minCents <= 0 || maxCents < minCents) return [];\n const levels = [];\n for (let cents = minCents; cents <= maxCents; cents += stepCents) {\n levels.push(cents);\n }\n return levels;\n}\nfunction resolveFloorLadderBounds(overrides = {}) {\n return {\n minCents: overrides.minCents ?? DEFAULT_FLOOR_LADDER_BOUNDS.minCents,\n maxCents: overrides.maxCents ?? DEFAULT_FLOOR_LADDER_BOUNDS.maxCents,\n stepCents: overrides.stepCents ?? DEFAULT_FLOOR_LADDER_BOUNDS.stepCents\n };\n}\nfunction validateFloorCents(value, config, bounds = DEFAULT_FLOOR_LADDER_BOUNDS) {\n if (!isInteger(value)) return { ok: false, reason: \"not_integer\" };\n if (!(value >= bounds.minCents && value <= bounds.maxCents) || !(value >= config.minFloorCents && value <= config.maxFloorCents)) {\n return { ok: false, reason: \"out_of_range\" };\n }\n const gamLevels = generateFloorLevels(bounds.minCents, bounds.maxCents, bounds.stepCents);\n const configLevels = generateFloorLevels(config.minFloorCents, config.maxFloorCents, config.stepCents);\n if (gamLevels.indexOf(value) === -1 || configLevels.indexOf(value) === -1) {\n return { ok: false, reason: \"not_step_multiple\" };\n }\n const ready = Array.isArray(config.readyFloorCents) ? config.readyFloorCents : [];\n if (ready.indexOf(value) === -1) return { ok: false, reason: \"not_ready\" };\n return { ok: true };\n}\nfunction validateFloorLadderConfig(config, bounds = DEFAULT_FLOOR_LADDER_BOUNDS) {\n const errors = [];\n if (generateFloorLevels(bounds.minCents, bounds.maxCents, bounds.stepCents).length === 0) {\n errors.push(\"invalid_gam_bounds\");\n }\n const levels = generateFloorLevels(config.minFloorCents, config.maxFloorCents, config.stepCents).filter((cents) => validateFloorCents(cents, { ...config, readyFloorCents: [cents] }, bounds).ok);\n if (levels.length === 0) errors.push(\"invalid_level_bounds\");\n if (config.minFloorCents < bounds.minCents || config.maxFloorCents > bounds.maxCents) {\n errors.push(\"level_bounds_outside_gam_ladder\");\n }\n if (!config.targetingKey) errors.push(\"missing_targeting_key\");\n if (config.mode !== \"fixed\") errors.push(`unsupported_mode:${String(config.mode)}`);\n if (!Array.isArray(config.readyFloorCents)) {\n errors.push(\"ready_floor_cents_not_array\");\n } else {\n for (const cents of config.readyFloorCents) {\n const check = validateFloorCents(cents, config, bounds);\n if (!check.ok) errors.push(`ready_floor_invalid:${String(cents)}:${check.reason}`);\n }\n }\n const selected = validateFloorCents(config.selectedFloorCents, config, bounds);\n if (!selected.ok) errors.push(`selected_floor_invalid:${selected.reason}`);\n const fallback = validateFloorCents(config.fallbackFloorCents, config, bounds);\n if (!fallback.ok) errors.push(`fallback_floor_invalid:${fallback.reason}`);\n return { ok: errors.length === 0, levels, errors };\n}\nvar fixedFloorSelector = {\n name: \"fixed\",\n select(config, context) {\n if (config.mode !== \"fixed\") return { source: \"none\", reason: \"unsupported_mode\" };\n const selected = validateFloorCents(config.selectedFloorCents, config, context.bounds);\n if (selected.ok) return { floorCents: config.selectedFloorCents, source: \"selected\" };\n const fallback = validateFloorCents(config.fallbackFloorCents, config, context.bounds);\n if (fallback.ok) {\n return {\n floorCents: config.fallbackFloorCents,\n source: \"fallback\",\n reason: `selected_${selected.reason}`\n };\n }\n return {\n source: \"none\",\n reason: `no_valid_floor:selected_${selected.reason}:fallback_${fallback.reason}`\n };\n }\n};\nfunction resolveOpportunityFloor(config, context, selector = fixedFloorSelector) {\n const base = {\n selector: selector.name,\n position: context.position,\n configurationVersion: String(config.configurationVersion ?? \"\"),\n targetingKey: config.targetingKey,\n targetAdUnitPath: config.targetAdUnitPath\n };\n const skipped = (reason, source = \"none\") => Object.freeze({ ...base, status: \"skipped\", floorCents: void 0, source, reason });\n if (!config.enabled) return skipped(\"disabled\");\n const positions = Array.isArray(config.allowedPositions) ? config.allowedPositions : [];\n if (positions.indexOf(context.position) === -1) return skipped(\"position_not_allowed\");\n if (!config.targetingKey) return skipped(\"missing_targeting_key\");\n if (!config.targetAdUnitPath) return skipped(\"missing_target_ad_unit\");\n let result;\n try {\n result = selector.select(config, context);\n } catch {\n return skipped(\"selector_error\");\n }\n if (result.floorCents == null) return skipped(result.reason ?? \"no_valid_floor\", result.source);\n const check = validateFloorCents(result.floorCents, config, context.bounds);\n if (!check.ok) return skipped(`selector_floor_${check.reason}`);\n return Object.freeze({\n ...base,\n status: \"armed\",\n floorCents: result.floorCents,\n source: result.source,\n reason: result.reason\n });\n}\nfunction decodeQueryComponent(value) {\n try {\n return decodeURIComponent(value.replace(/\\+/g, \" \"));\n } catch {\n return void 0;\n }\n}\nfunction mergeCustParams(decoded, key, cents) {\n const prefix = `${key}=`;\n const kept = decoded.split(\"&\").filter((pair) => pair !== \"\" && pair !== key && pair.indexOf(prefix) !== 0);\n kept.push(`${prefix}${cents}`);\n return kept.join(\"&\");\n}\nfunction applyFloorToVastUrl(url, floor) {\n if (floor.status !== \"armed\" || floor.floorCents == null) {\n return { url, applied: false, reason: floor.reason };\n }\n let parsed;\n try {\n parsed = new URL(url);\n } catch {\n return { url, applied: false, reason: \"invalid_url\" };\n }\n if (!GAM_AD_HOSTS.has(parsed.hostname)) {\n return { url, applied: false, reason: \"not_gam_host\" };\n }\n if (parsed.searchParams.get(\"iu\") !== floor.targetAdUnitPath) {\n return { url, applied: false, reason: \"ad_unit_mismatch\" };\n }\n const hashIndex = url.indexOf(\"#\");\n const beforeHash = hashIndex === -1 ? url : url.slice(0, hashIndex);\n const hash = hashIndex === -1 ? \"\" : url.slice(hashIndex);\n const queryIndex = beforeHash.indexOf(\"?\");\n const base = beforeHash.slice(0, queryIndex);\n const segments = beforeHash.slice(queryIndex + 1).split(\"&\");\n const existing = [];\n let insertAt = -1;\n const rest = [];\n for (const segment of segments) {\n const eq = segment.indexOf(\"=\");\n const rawKey = eq === -1 ? segment : segment.slice(0, eq);\n if (decodeQueryComponent(rawKey) === \"cust_params\") {\n if (insertAt === -1) insertAt = rest.length;\n const value = eq === -1 ? \"\" : decodeQueryComponent(segment.slice(eq + 1));\n if (value === void 0) {\n return { url, applied: false, reason: \"malformed_cust_params\" };\n }\n if (value) existing.push(value);\n continue;\n }\n rest.push(segment);\n }\n if (insertAt === -1) insertAt = rest.length;\n const merged = mergeCustParams(existing.join(\"&\"), floor.targetingKey, floor.floorCents);\n rest.splice(insertAt, 0, `cust_params=${encodeURIComponent(merged)}`);\n const query = rest.filter((segment) => segment !== \"\").join(\"&\");\n return { url: `${base}?${query}${hash}`, applied: true, reason: void 0 };\n}\nfunction copyConfig(config) {\n return {\n ...config,\n readyFloorCents: Array.isArray(config.readyFloorCents) ? config.readyFloorCents.slice() : [],\n allowedPositions: Array.isArray(config.allowedPositions) ? config.allowedPositions.slice() : []\n };\n}\nfunction mergeDefined(target, update) {\n const next = copyConfig(target);\n if (!update) return next;\n for (const key of Object.keys(update)) {\n const value = update[key];\n if (value !== void 0) next[key] = value;\n }\n return copyConfig(next);\n}\nvar AD_POSITIONS = [\"preroll\", \"midroll\", \"postroll\"];\nfunction finiteNumber(value) {\n return typeof value === \"number\" && isFinite(value) ? value : void 0;\n}\nfunction parseApiFloorLadder(raw) {\n if (!raw || typeof raw !== \"object\" || Array.isArray(raw)) return void 0;\n const src = raw;\n const out = {};\n if (typeof src.enabled === \"boolean\") out.enabled = src.enabled;\n if (typeof src.targetingKey === \"string\") out.targetingKey = src.targetingKey;\n if (typeof src.targetAdUnitPath === \"string\") out.targetAdUnitPath = src.targetAdUnitPath;\n if (typeof src.configurationVersion === \"string\") out.configurationVersion = src.configurationVersion;\n if (typeof src.mode === \"string\") out.mode = src.mode;\n const min = finiteNumber(src.minFloorCents);\n const max = finiteNumber(src.maxFloorCents);\n const step = finiteNumber(src.stepCents);\n const selected = finiteNumber(src.selectedFloorCents);\n const fallback = finiteNumber(src.fallbackFloorCents);\n if (min !== void 0) out.minFloorCents = min;\n if (max !== void 0) out.maxFloorCents = max;\n if (step !== void 0) out.stepCents = step;\n if (selected !== void 0) out.selectedFloorCents = selected;\n if (fallback !== void 0) out.fallbackFloorCents = fallback;\n if (Array.isArray(src.readyFloorCents)) {\n out.readyFloorCents = src.readyFloorCents.filter(\n (cents) => finiteNumber(cents) !== void 0\n );\n }\n if (Array.isArray(src.allowedPositions)) {\n out.allowedPositions = src.allowedPositions.filter(\n (position) => AD_POSITIONS.indexOf(position) !== -1\n );\n }\n return out;\n}\nvar FloorLadderController = class {\n constructor(selector = fixedFloorSelector) {\n this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;\n this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);\n this.selector = selector;\n }\n isEnabled() {\n return this.config.enabled === true;\n }\n applyApiConfig(raw) {\n const parsed = parseApiFloorLadder(raw);\n this.config = mergeDefined(copyConfig(DISABLED_FLOOR_LADDER_CONFIG), parsed);\n this.bounds = Object.freeze({\n minCents: this.config.minFloorCents,\n maxCents: this.config.maxFloorCents,\n stepCents: this.config.stepCents\n });\n return validateFloorLadderConfig(this.config, this.bounds);\n }\n reset() {\n this.config = copyConfig(DISABLED_FLOOR_LADDER_CONFIG);\n this.bounds = DEFAULT_FLOOR_LADDER_BOUNDS;\n }\n get() {\n return copyConfig(this.config);\n }\n getBounds() {\n return { ...this.bounds };\n }\n validate() {\n return validateFloorLadderConfig(this.config, this.bounds);\n }\n setSelector(selector) {\n this.selector = selector;\n }\n snapshotFor(context) {\n return resolveOpportunityFloor(\n copyConfig(this.config),\n { ...context, bounds: this.bounds },\n this.selector\n );\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n DEFAULT_FLOOR_LADDER_BOUNDS,\n DISABLED_FLOOR_LADDER_CONFIG,\n FloorLadderController,\n applyFloorToVastUrl,\n fixedFloorSelector,\n generateFloorLevels,\n parseApiFloorLadder,\n resolveFloorLadderBounds,\n resolveOpportunityFloor,\n validateFloorCents,\n validateFloorLadderConfig\n});\n"]}
@@ -1,7 +1,7 @@
1
1
  import { AdFloorLadderConfig, AdPosition } from '../types.cjs';
2
2
  import './OptimizedPodRequest.cjs';
3
3
 
4
- declare const DEFAULT_WEB_FLOOR_LADDER_CONFIG: Readonly<AdFloorLadderConfig>;
4
+ declare const DISABLED_FLOOR_LADDER_CONFIG: Readonly<AdFloorLadderConfig>;
5
5
  type FloorValidationReason = "not_integer" | "out_of_range" | "not_step_multiple" | "not_ready";
6
6
  type FloorValidation = {
7
7
  ok: true;
@@ -10,7 +10,6 @@ type FloorValidation = {
10
10
  reason: FloorValidationReason;
11
11
  };
12
12
  type FloorSource = "selected" | "fallback" | "none";
13
- /** Levels that have targeting values in GAM; the ladder config can narrow these but never widen them. */
14
13
  interface FloorLadderBounds {
15
14
  minCents: number;
16
15
  maxCents: number;
@@ -19,7 +18,6 @@ interface FloorLadderBounds {
19
18
  declare const DEFAULT_FLOOR_LADDER_BOUNDS: Readonly<FloorLadderBounds>;
20
19
  interface FloorSelectionContext {
21
20
  position: AdPosition;
22
- isCtv: boolean;
23
21
  bounds: Readonly<FloorLadderBounds>;
24
22
  }
25
23
  interface FloorSelectorResult {
@@ -59,17 +57,20 @@ declare function validateFloorLadderConfig(config: Readonly<AdFloorLadderConfig>
59
57
  declare const fixedFloorSelector: FloorSelector;
60
58
  declare function resolveOpportunityFloor(config: Readonly<AdFloorLadderConfig>, context: FloorSelectionContext, selector?: FloorSelector): OpportunityFloor;
61
59
  declare function applyFloorToVastUrl(url: string, floor: OpportunityFloor): FloorUrlResult;
60
+ declare function parseApiFloorLadder(raw: unknown): Partial<AdFloorLadderConfig> | undefined;
62
61
  declare class FloorLadderController {
63
62
  private config;
64
63
  private selector;
65
- private readonly bounds;
66
- constructor(initial?: Partial<AdFloorLadderConfig>, bounds?: Partial<FloorLadderBounds>, selector?: FloorSelector);
64
+ private bounds;
65
+ constructor(selector?: FloorSelector);
66
+ isEnabled(): boolean;
67
+ applyApiConfig(raw: unknown): FloorLadderValidationReport;
68
+ reset(): void;
67
69
  get(): AdFloorLadderConfig;
68
70
  getBounds(): FloorLadderBounds;
69
- update(update: Partial<AdFloorLadderConfig>): FloorLadderValidationReport;
70
71
  validate(): FloorLadderValidationReport;
71
72
  setSelector(selector: FloorSelector): void;
72
73
  snapshotFor(context: Omit<FloorSelectionContext, "bounds">): OpportunityFloor;
73
74
  }
74
75
 
75
- export { DEFAULT_FLOOR_LADDER_BOUNDS, DEFAULT_WEB_FLOOR_LADDER_CONFIG, type FloorLadderBounds, FloorLadderController, type FloorLadderValidationReport, type FloorSelectionContext, type FloorSelector, type FloorSelectorResult, type FloorSource, type FloorUrlResult, type FloorValidation, type FloorValidationReason, type OpportunityFloor, applyFloorToVastUrl, fixedFloorSelector, generateFloorLevels, resolveFloorLadderBounds, resolveOpportunityFloor, validateFloorCents, validateFloorLadderConfig };
76
+ export { DEFAULT_FLOOR_LADDER_BOUNDS, DISABLED_FLOOR_LADDER_CONFIG, type FloorLadderBounds, FloorLadderController, type FloorLadderValidationReport, type FloorSelectionContext, type FloorSelector, type FloorSelectorResult, type FloorSource, type FloorUrlResult, type FloorValidation, type FloorValidationReason, type OpportunityFloor, applyFloorToVastUrl, fixedFloorSelector, generateFloorLevels, parseApiFloorLadder, resolveFloorLadderBounds, resolveOpportunityFloor, validateFloorCents, validateFloorLadderConfig };