stormcloud-video-player 0.8.68 → 0.8.69

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 (37) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/Player.cjs +30 -8
  3. package/lib/Player.cjs.map +1 -1
  4. package/lib/Player.d.cts +2 -1
  5. package/lib/StormcloudPlayer.cjs +5615 -5101
  6. package/lib/StormcloudPlayer.cjs.map +1 -1
  7. package/lib/StormcloudPlayer.d.cts +1 -0
  8. package/lib/index.cjs +5688 -5117
  9. package/lib/index.cjs.map +1 -1
  10. package/lib/index.d.cts +2 -1
  11. package/lib/index.d.ts +81 -1
  12. package/lib/index.js +5663 -5119
  13. package/lib/index.js.map +1 -1
  14. package/lib/player/AdBreakOrchestrator.cjs +314 -113
  15. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  16. package/lib/player/AdBreakOrchestrator.d.cts +9 -3
  17. package/lib/player/FloorLadder.cjs +578 -0
  18. package/lib/player/FloorLadder.cjs.map +1 -0
  19. package/lib/player/FloorLadder.d.cts +74 -0
  20. package/lib/player/StormcloudVideoPlayer.cjs +5615 -5101
  21. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  22. package/lib/player/StormcloudVideoPlayer.d.cts +9 -1
  23. package/lib/players/HlsPlayer.cjs +5615 -5101
  24. package/lib/players/HlsPlayer.cjs.map +1 -1
  25. package/lib/players/index.cjs +5615 -5101
  26. package/lib/players/index.cjs.map +1 -1
  27. package/lib/props.cjs +30 -8
  28. package/lib/props.cjs.map +1 -1
  29. package/lib/props.d.cts +1 -0
  30. package/lib/types.d.cts +22 -1
  31. package/lib/ui/StormcloudVideoPlayer.cjs +5634 -5091
  32. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  33. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -0
  34. package/lib/utils/vastMacros.cjs +4 -0
  35. package/lib/utils/vastMacros.cjs.map +1 -1
  36. package/lib/utils/vastMacros.d.cts +2 -1
  37. package/package.json +1 -1
@@ -1,4 +1,5 @@
1
- import { Scte35Marker, StormcloudVideoPlayerConfig, AdController } from '../types.cjs';
1
+ import { Scte35Marker, StormcloudVideoPlayerConfig, AdController, AdPosition } from '../types.cjs';
2
+ import { OpportunityFloor } from './FloorLadder.cjs';
2
3
  import { AdTimingService } from './AdTimingService.cjs';
3
4
  import { AdConfigManager } from './AdConfigManager.cjs';
4
5
  import { Scte35CueManager } from './Scte35CueManager.cjs';
@@ -21,6 +22,7 @@ interface AdBreakOrchestratorHost {
21
22
  recoverMediaError(): void;
22
23
  requiresMediaPipelineResetAfterAds(): boolean;
23
24
  generatePodVastUrl(baseUrl: string, breakDurationMs?: number): string;
25
+ getFloorSnapshot(position: AdPosition): OpportunityFloor | undefined;
24
26
  onAdClick(): void;
25
27
  onAdInteraction(event: MouseEvent | TouchEvent): void;
26
28
  }
@@ -45,6 +47,7 @@ declare class AdBreakOrchestrator {
45
47
  private requestStartedAt;
46
48
  private opportunityBreakKey;
47
49
  private opportunityEpoch;
50
+ private opportunityFloor;
48
51
  adPodQueue: string[];
49
52
  private readonly defaultMinRemainingMsToRequestAd;
50
53
  private readonly defaultMaxNoFillsPerBreak;
@@ -72,7 +75,7 @@ declare class AdBreakOrchestrator {
72
75
  clearPendingAdBreak(): void;
73
76
  isBreakActive(): boolean;
74
77
  getSlotState(): AdSlotState;
75
- beginVmapBreak(breakKey: string): void;
78
+ beginVmapBreak(breakKey: string, position: AdPosition): void;
76
79
  handleAdStart(marker: Scte35Marker): Promise<void>;
77
80
  private waitForBreakDuration;
78
81
  private startOptimizedPod;
@@ -92,9 +95,12 @@ declare class AdBreakOrchestrator {
92
95
  private recordRequestDiagnostic;
93
96
  private finalizeRequestDiagnostics;
94
97
  private withCurrentPodBudget;
98
+ private opportunityFloorFields;
99
+ private requestFloorFields;
100
+ private applyOpportunityFloor;
95
101
  private countFunnelStage;
96
102
  private logOrchestratorFunnel;
97
- noteOpportunity(source: "scte35" | "vmap", breakKey: string | undefined): void;
103
+ noteOpportunity(source: "scte35" | "vmap", breakKey: string | undefined, position: AdPosition): void;
98
104
  private beginFunnelRequest;
99
105
  isAdLoadingWithoutPlayback(): boolean;
100
106
  noteStopBeforeStart(reason: string): void;
@@ -0,0 +1,578 @@
1
+ "use strict";
2
+ function _class_call_check(instance, Constructor) {
3
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
4
+ }
5
+ function _defineProperties(target, props) {
6
+ for(var i = 0; i < props.length; i++){
7
+ var descriptor = props[i];
8
+ descriptor.enumerable = descriptor.enumerable || false;
9
+ descriptor.configurable = true;
10
+ if ("value" in descriptor) descriptor.writable = true;
11
+ Object.defineProperty(target, descriptor.key, descriptor);
12
+ }
13
+ }
14
+ function _create_class(Constructor, protoProps, staticProps) {
15
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
16
+ if (staticProps) _defineProperties(Constructor, staticProps);
17
+ return Constructor;
18
+ }
19
+ function _define_property(obj, key, value) {
20
+ if (key in obj) {
21
+ Object.defineProperty(obj, key, {
22
+ value: value,
23
+ enumerable: true,
24
+ configurable: true,
25
+ writable: true
26
+ });
27
+ } else obj[key] = value;
28
+ return obj;
29
+ }
30
+ function _object_spread(target) {
31
+ for(var i = 1; i < arguments.length; i++){
32
+ var source = arguments[i] != null ? arguments[i] : {};
33
+ var ownKeys = Object.keys(source);
34
+ if (typeof Object.getOwnPropertySymbols === "function") {
35
+ ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function(sym) {
36
+ return Object.getOwnPropertyDescriptor(source, sym).enumerable;
37
+ }));
38
+ }
39
+ ownKeys.forEach(function(key) {
40
+ _define_property(target, key, source[key]);
41
+ });
42
+ }
43
+ return target;
44
+ }
45
+ function ownKeys(object, enumerableOnly) {
46
+ var keys = Object.keys(object);
47
+ if (Object.getOwnPropertySymbols) {
48
+ var symbols = Object.getOwnPropertySymbols(object);
49
+ if (enumerableOnly) {
50
+ symbols = symbols.filter(function(sym) {
51
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
52
+ });
53
+ }
54
+ keys.push.apply(keys, symbols);
55
+ }
56
+ return keys;
57
+ }
58
+ function _object_spread_props(target, source) {
59
+ source = source != null ? source : {};
60
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
61
+ else {
62
+ ownKeys(Object(source)).forEach(function(key) {
63
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
64
+ });
65
+ }
66
+ return target;
67
+ }
68
+ function _type_of(obj) {
69
+ "@swc/helpers - typeof";
70
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
71
+ }
72
+ var __defProp = Object.defineProperty;
73
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
74
+ var __getOwnPropNames = Object.getOwnPropertyNames;
75
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
76
+ var __export = function __export(target, all) {
77
+ for(var name in all)__defProp(target, name, {
78
+ get: all[name],
79
+ enumerable: true
80
+ });
81
+ };
82
+ var __copyProps = function __copyProps(to, from, except, desc) {
83
+ if (from && (typeof from === "undefined" ? "undefined" : _type_of(from)) === "object" || typeof from === "function") {
84
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
85
+ try {
86
+ var _loop = function() {
87
+ var key = _step.value;
88
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
89
+ get: function get() {
90
+ return from[key];
91
+ },
92
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
93
+ });
94
+ };
95
+ for(var _iterator = __getOwnPropNames(from)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true)_loop();
96
+ } catch (err) {
97
+ _didIteratorError = true;
98
+ _iteratorError = err;
99
+ } finally{
100
+ try {
101
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
102
+ _iterator.return();
103
+ }
104
+ } finally{
105
+ if (_didIteratorError) {
106
+ throw _iteratorError;
107
+ }
108
+ }
109
+ }
110
+ }
111
+ return to;
112
+ };
113
+ var __toCommonJS = function __toCommonJS(mod) {
114
+ return __copyProps(__defProp({}, "__esModule", {
115
+ value: true
116
+ }), mod);
117
+ };
118
+ // src/player/FloorLadder.ts
119
+ var FloorLadder_exports = {};
120
+ __export(FloorLadder_exports, {
121
+ DEFAULT_FLOOR_LADDER_BOUNDS: function DEFAULT_FLOOR_LADDER_BOUNDS1() {
122
+ return DEFAULT_FLOOR_LADDER_BOUNDS;
123
+ },
124
+ DEFAULT_WEB_FLOOR_LADDER_CONFIG: function DEFAULT_WEB_FLOOR_LADDER_CONFIG1() {
125
+ return DEFAULT_WEB_FLOOR_LADDER_CONFIG;
126
+ },
127
+ FloorLadderController: function FloorLadderController1() {
128
+ return FloorLadderController;
129
+ },
130
+ applyFloorToVastUrl: function applyFloorToVastUrl1() {
131
+ return applyFloorToVastUrl;
132
+ },
133
+ fixedFloorSelector: function fixedFloorSelector1() {
134
+ return fixedFloorSelector;
135
+ },
136
+ generateFloorLevels: function generateFloorLevels1() {
137
+ return generateFloorLevels;
138
+ },
139
+ resolveFloorLadderBounds: function resolveFloorLadderBounds1() {
140
+ return resolveFloorLadderBounds;
141
+ },
142
+ resolveOpportunityFloor: function resolveOpportunityFloor1() {
143
+ return resolveOpportunityFloor;
144
+ },
145
+ validateFloorCents: function validateFloorCents1() {
146
+ return validateFloorCents;
147
+ },
148
+ validateFloorLadderConfig: function validateFloorLadderConfig1() {
149
+ return validateFloorLadderConfig;
150
+ }
151
+ });
152
+ module.exports = __toCommonJS(FloorLadder_exports);
153
+ // src/utils/vastEnvironmentSignals.ts
154
+ var DEVICE_TYPE_HINT = {
155
+ FEATURE_PHONE: 1,
156
+ SMARTPHONE: 2,
157
+ DESKTOP: 3,
158
+ TABLET: 4,
159
+ CONNECTED_TV: 5,
160
+ GAME_CONSOLE: 6,
161
+ SET_TOP_BOX: 7
162
+ };
163
+ var DEVICE_TYPE_HINT_ALIASES = {
164
+ featurephone: DEVICE_TYPE_HINT.FEATURE_PHONE,
165
+ smartphone: DEVICE_TYPE_HINT.SMARTPHONE,
166
+ mobile: DEVICE_TYPE_HINT.SMARTPHONE,
167
+ phone: DEVICE_TYPE_HINT.SMARTPHONE,
168
+ desktop: DEVICE_TYPE_HINT.DESKTOP,
169
+ pc: DEVICE_TYPE_HINT.DESKTOP,
170
+ tablet: DEVICE_TYPE_HINT.TABLET,
171
+ ctv: DEVICE_TYPE_HINT.CONNECTED_TV,
172
+ tv: DEVICE_TYPE_HINT.CONNECTED_TV,
173
+ connectedtv: DEVICE_TYPE_HINT.CONNECTED_TV,
174
+ smarttv: DEVICE_TYPE_HINT.CONNECTED_TV,
175
+ console: DEVICE_TYPE_HINT.GAME_CONSOLE,
176
+ gameconsole: DEVICE_TYPE_HINT.GAME_CONSOLE,
177
+ stb: DEVICE_TYPE_HINT.SET_TOP_BOX,
178
+ settopbox: DEVICE_TYPE_HINT.SET_TOP_BOX
179
+ };
180
+ var PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;
181
+ // src/utils/vastMacros.ts
182
+ var GAM_AD_HOSTS = /* @__PURE__ */ new Set([
183
+ "pubads.g.doubleclick.net",
184
+ "securepubads.g.doubleclick.net"
185
+ ]);
186
+ // src/player/FloorLadder.ts
187
+ var DEFAULT_WEB_FLOOR_LADDER_CONFIG = Object.freeze({
188
+ enabled: false,
189
+ targetingKey: "airytv_web_floor",
190
+ minFloorCents: 25,
191
+ maxFloorCents: 300,
192
+ stepCents: 25,
193
+ selectedFloorCents: 25,
194
+ fallbackFloorCents: 25,
195
+ readyFloorCents: [],
196
+ mode: "fixed",
197
+ allowedPositions: [
198
+ "midroll"
199
+ ],
200
+ targetAdUnitPath: "/21821455290/airytvadx/airytv-web",
201
+ configurationVersion: "2026-09-29.1"
202
+ });
203
+ var DEFAULT_FLOOR_LADDER_BOUNDS = Object.freeze({
204
+ minCents: 25,
205
+ maxCents: 300,
206
+ stepCents: 25
207
+ });
208
+ function isInteger(value) {
209
+ return typeof value === "number" && Number.isInteger(value);
210
+ }
211
+ function generateFloorLevels(minCents, maxCents, stepCents) {
212
+ if (!isInteger(minCents) || !isInteger(maxCents) || !isInteger(stepCents)) return [];
213
+ if (stepCents <= 0 || minCents <= 0 || maxCents < minCents) return [];
214
+ var levels = [];
215
+ for(var cents = minCents; cents <= maxCents; cents += stepCents){
216
+ levels.push(cents);
217
+ }
218
+ return levels;
219
+ }
220
+ function resolveFloorLadderBounds() {
221
+ var overrides = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {};
222
+ var _overrides_minCents, _overrides_maxCents, _overrides_stepCents;
223
+ return {
224
+ minCents: (_overrides_minCents = overrides.minCents) !== null && _overrides_minCents !== void 0 ? _overrides_minCents : DEFAULT_FLOOR_LADDER_BOUNDS.minCents,
225
+ maxCents: (_overrides_maxCents = overrides.maxCents) !== null && _overrides_maxCents !== void 0 ? _overrides_maxCents : DEFAULT_FLOOR_LADDER_BOUNDS.maxCents,
226
+ stepCents: (_overrides_stepCents = overrides.stepCents) !== null && _overrides_stepCents !== void 0 ? _overrides_stepCents : DEFAULT_FLOOR_LADDER_BOUNDS.stepCents
227
+ };
228
+ }
229
+ function validateFloorCents(value, config) {
230
+ var bounds = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : DEFAULT_FLOOR_LADDER_BOUNDS;
231
+ if (!isInteger(value)) return {
232
+ ok: false,
233
+ reason: "not_integer"
234
+ };
235
+ if (!(value >= bounds.minCents && value <= bounds.maxCents) || !(value >= config.minFloorCents && value <= config.maxFloorCents)) {
236
+ return {
237
+ ok: false,
238
+ reason: "out_of_range"
239
+ };
240
+ }
241
+ var gamLevels = generateFloorLevels(bounds.minCents, bounds.maxCents, bounds.stepCents);
242
+ var configLevels = generateFloorLevels(config.minFloorCents, config.maxFloorCents, config.stepCents);
243
+ if (gamLevels.indexOf(value) === -1 || configLevels.indexOf(value) === -1) {
244
+ return {
245
+ ok: false,
246
+ reason: "not_step_multiple"
247
+ };
248
+ }
249
+ var ready = Array.isArray(config.readyFloorCents) ? config.readyFloorCents : [];
250
+ if (ready.indexOf(value) === -1) return {
251
+ ok: false,
252
+ reason: "not_ready"
253
+ };
254
+ return {
255
+ ok: true
256
+ };
257
+ }
258
+ function validateFloorLadderConfig(config) {
259
+ var bounds = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : DEFAULT_FLOOR_LADDER_BOUNDS;
260
+ var errors = [];
261
+ if (generateFloorLevels(bounds.minCents, bounds.maxCents, bounds.stepCents).length === 0) {
262
+ errors.push("invalid_gam_bounds");
263
+ }
264
+ var levels = generateFloorLevels(config.minFloorCents, config.maxFloorCents, config.stepCents).filter(function(cents) {
265
+ return validateFloorCents(cents, _object_spread_props(_object_spread({}, config), {
266
+ readyFloorCents: [
267
+ cents
268
+ ]
269
+ }), bounds).ok;
270
+ });
271
+ if (levels.length === 0) errors.push("invalid_level_bounds");
272
+ if (config.minFloorCents < bounds.minCents || config.maxFloorCents > bounds.maxCents) {
273
+ errors.push("level_bounds_outside_gam_ladder");
274
+ }
275
+ if (!config.targetingKey) errors.push("missing_targeting_key");
276
+ if (config.mode !== "fixed") errors.push("unsupported_mode:".concat(String(config.mode)));
277
+ if (!Array.isArray(config.readyFloorCents)) {
278
+ errors.push("ready_floor_cents_not_array");
279
+ } else {
280
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
281
+ try {
282
+ for(var _iterator = config.readyFloorCents[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
283
+ var cents = _step.value;
284
+ var check = validateFloorCents(cents, config, bounds);
285
+ if (!check.ok) errors.push("ready_floor_invalid:".concat(String(cents), ":").concat(check.reason));
286
+ }
287
+ } catch (err) {
288
+ _didIteratorError = true;
289
+ _iteratorError = err;
290
+ } finally{
291
+ try {
292
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
293
+ _iterator.return();
294
+ }
295
+ } finally{
296
+ if (_didIteratorError) {
297
+ throw _iteratorError;
298
+ }
299
+ }
300
+ }
301
+ }
302
+ var selected = validateFloorCents(config.selectedFloorCents, config, bounds);
303
+ if (!selected.ok) errors.push("selected_floor_invalid:".concat(selected.reason));
304
+ var fallback = validateFloorCents(config.fallbackFloorCents, config, bounds);
305
+ if (!fallback.ok) errors.push("fallback_floor_invalid:".concat(fallback.reason));
306
+ return {
307
+ ok: errors.length === 0,
308
+ levels: levels,
309
+ errors: errors
310
+ };
311
+ }
312
+ var fixedFloorSelector = {
313
+ name: "fixed",
314
+ select: function select(config, context) {
315
+ if (config.mode !== "fixed") return {
316
+ source: "none",
317
+ reason: "unsupported_mode"
318
+ };
319
+ var selected = validateFloorCents(config.selectedFloorCents, config, context.bounds);
320
+ if (selected.ok) return {
321
+ floorCents: config.selectedFloorCents,
322
+ source: "selected"
323
+ };
324
+ var fallback = validateFloorCents(config.fallbackFloorCents, config, context.bounds);
325
+ if (fallback.ok) {
326
+ return {
327
+ floorCents: config.fallbackFloorCents,
328
+ source: "fallback",
329
+ reason: "selected_".concat(selected.reason)
330
+ };
331
+ }
332
+ return {
333
+ source: "none",
334
+ reason: "no_valid_floor:selected_".concat(selected.reason, ":fallback_").concat(fallback.reason)
335
+ };
336
+ }
337
+ };
338
+ function resolveOpportunityFloor(config, context) {
339
+ var selector = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : fixedFloorSelector;
340
+ var _config_configurationVersion, _result_reason;
341
+ var base = {
342
+ selector: selector.name,
343
+ position: context.position,
344
+ configurationVersion: String((_config_configurationVersion = config.configurationVersion) !== null && _config_configurationVersion !== void 0 ? _config_configurationVersion : ""),
345
+ targetingKey: config.targetingKey,
346
+ targetAdUnitPath: config.targetAdUnitPath
347
+ };
348
+ var skipped = function skipped(reason) {
349
+ var source = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "none";
350
+ return Object.freeze(_object_spread_props(_object_spread({}, base), {
351
+ status: "skipped",
352
+ floorCents: void 0,
353
+ source: source,
354
+ reason: reason
355
+ }));
356
+ };
357
+ if (!config.enabled) return skipped("disabled");
358
+ var positions = Array.isArray(config.allowedPositions) ? config.allowedPositions : [];
359
+ if (positions.indexOf(context.position) === -1) return skipped("position_not_allowed");
360
+ if (context.isCtv) return skipped("ctv_excluded");
361
+ if (!config.targetingKey) return skipped("missing_targeting_key");
362
+ if (!config.targetAdUnitPath) return skipped("missing_target_ad_unit");
363
+ var result;
364
+ try {
365
+ result = selector.select(config, context);
366
+ } catch (unused) {
367
+ return skipped("selector_error");
368
+ }
369
+ if (result.floorCents == null) return skipped((_result_reason = result.reason) !== null && _result_reason !== void 0 ? _result_reason : "no_valid_floor", result.source);
370
+ var check = validateFloorCents(result.floorCents, config, context.bounds);
371
+ if (!check.ok) return skipped("selector_floor_".concat(check.reason));
372
+ return Object.freeze(_object_spread_props(_object_spread({}, base), {
373
+ status: "armed",
374
+ floorCents: result.floorCents,
375
+ source: result.source,
376
+ reason: result.reason
377
+ }));
378
+ }
379
+ function decodeQueryComponent(value) {
380
+ try {
381
+ return decodeURIComponent(value.replace(/\+/g, " "));
382
+ } catch (unused) {
383
+ return void 0;
384
+ }
385
+ }
386
+ function mergeCustParams(decoded, key, cents) {
387
+ var prefix = "".concat(key, "=");
388
+ var kept = decoded.split("&").filter(function(pair) {
389
+ return pair !== "" && pair !== key && pair.indexOf(prefix) !== 0;
390
+ });
391
+ kept.push("".concat(prefix).concat(cents));
392
+ return kept.join("&");
393
+ }
394
+ function applyFloorToVastUrl(url, floor) {
395
+ if (floor.status !== "armed" || floor.floorCents == null) {
396
+ return {
397
+ url: url,
398
+ applied: false,
399
+ reason: floor.reason
400
+ };
401
+ }
402
+ var parsed;
403
+ try {
404
+ parsed = new URL(url);
405
+ } catch (unused) {
406
+ return {
407
+ url: url,
408
+ applied: false,
409
+ reason: "invalid_url"
410
+ };
411
+ }
412
+ if (!GAM_AD_HOSTS.has(parsed.hostname)) {
413
+ return {
414
+ url: url,
415
+ applied: false,
416
+ reason: "not_gam_host"
417
+ };
418
+ }
419
+ if (parsed.searchParams.get("iu") !== floor.targetAdUnitPath) {
420
+ return {
421
+ url: url,
422
+ applied: false,
423
+ reason: "ad_unit_mismatch"
424
+ };
425
+ }
426
+ var hashIndex = url.indexOf("#");
427
+ var beforeHash = hashIndex === -1 ? url : url.slice(0, hashIndex);
428
+ var hash = hashIndex === -1 ? "" : url.slice(hashIndex);
429
+ var queryIndex = beforeHash.indexOf("?");
430
+ var base = beforeHash.slice(0, queryIndex);
431
+ var segments = beforeHash.slice(queryIndex + 1).split("&");
432
+ var existing = [];
433
+ var insertAt = -1;
434
+ var rest = [];
435
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
436
+ try {
437
+ for(var _iterator = segments[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
438
+ var segment = _step.value;
439
+ var eq = segment.indexOf("=");
440
+ var rawKey = eq === -1 ? segment : segment.slice(0, eq);
441
+ if (decodeQueryComponent(rawKey) === "cust_params") {
442
+ if (insertAt === -1) insertAt = rest.length;
443
+ var value = eq === -1 ? "" : decodeQueryComponent(segment.slice(eq + 1));
444
+ if (value === void 0) {
445
+ return {
446
+ url: url,
447
+ applied: false,
448
+ reason: "malformed_cust_params"
449
+ };
450
+ }
451
+ if (value) existing.push(value);
452
+ continue;
453
+ }
454
+ rest.push(segment);
455
+ }
456
+ } catch (err) {
457
+ _didIteratorError = true;
458
+ _iteratorError = err;
459
+ } finally{
460
+ try {
461
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
462
+ _iterator.return();
463
+ }
464
+ } finally{
465
+ if (_didIteratorError) {
466
+ throw _iteratorError;
467
+ }
468
+ }
469
+ }
470
+ if (insertAt === -1) insertAt = rest.length;
471
+ var merged = mergeCustParams(existing.join("&"), floor.targetingKey, floor.floorCents);
472
+ rest.splice(insertAt, 0, "cust_params=".concat(encodeURIComponent(merged)));
473
+ var query = rest.filter(function(segment) {
474
+ return segment !== "";
475
+ }).join("&");
476
+ return {
477
+ url: "".concat(base, "?").concat(query).concat(hash),
478
+ applied: true,
479
+ reason: void 0
480
+ };
481
+ }
482
+ function copyConfig(config) {
483
+ return _object_spread_props(_object_spread({}, config), {
484
+ readyFloorCents: Array.isArray(config.readyFloorCents) ? config.readyFloorCents.slice() : [],
485
+ allowedPositions: Array.isArray(config.allowedPositions) ? config.allowedPositions.slice() : []
486
+ });
487
+ }
488
+ function mergeDefined(target, update) {
489
+ var next = copyConfig(target);
490
+ if (!update) return next;
491
+ var _iteratorNormalCompletion = true, _didIteratorError = false, _iteratorError = undefined;
492
+ try {
493
+ for(var _iterator = Object.keys(update)[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true){
494
+ var key = _step.value;
495
+ var value = update[key];
496
+ if (value !== void 0) next[key] = value;
497
+ }
498
+ } catch (err) {
499
+ _didIteratorError = true;
500
+ _iteratorError = err;
501
+ } finally{
502
+ try {
503
+ if (!_iteratorNormalCompletion && _iterator.return != null) {
504
+ _iterator.return();
505
+ }
506
+ } finally{
507
+ if (_didIteratorError) {
508
+ throw _iteratorError;
509
+ }
510
+ }
511
+ }
512
+ return copyConfig(next);
513
+ }
514
+ var FloorLadderController = /*#__PURE__*/ function() {
515
+ function FloorLadderController(initial, bounds) {
516
+ var selector = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : fixedFloorSelector;
517
+ _class_call_check(this, FloorLadderController);
518
+ this.config = mergeDefined(copyConfig(DEFAULT_WEB_FLOOR_LADDER_CONFIG), initial);
519
+ this.bounds = Object.freeze(resolveFloorLadderBounds(bounds));
520
+ this.selector = selector;
521
+ }
522
+ _create_class(FloorLadderController, [
523
+ {
524
+ key: "get",
525
+ value: function get() {
526
+ return copyConfig(this.config);
527
+ }
528
+ },
529
+ {
530
+ key: "getBounds",
531
+ value: function getBounds() {
532
+ return _object_spread({}, this.bounds);
533
+ }
534
+ },
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
+ {
543
+ key: "validate",
544
+ value: function validate() {
545
+ return validateFloorLadderConfig(this.config, this.bounds);
546
+ }
547
+ },
548
+ {
549
+ key: "setSelector",
550
+ value: function setSelector(selector) {
551
+ this.selector = selector;
552
+ }
553
+ },
554
+ {
555
+ key: "snapshotFor",
556
+ value: function snapshotFor(context) {
557
+ return resolveOpportunityFloor(copyConfig(this.config), _object_spread_props(_object_spread({}, context), {
558
+ bounds: this.bounds
559
+ }), this.selector);
560
+ }
561
+ }
562
+ ]);
563
+ return FloorLadderController;
564
+ }();
565
+ // Annotate the CommonJS export names for ESM import in node:
566
+ 0 && (module.exports = {
567
+ DEFAULT_FLOOR_LADDER_BOUNDS: DEFAULT_FLOOR_LADDER_BOUNDS,
568
+ DEFAULT_WEB_FLOOR_LADDER_CONFIG: DEFAULT_WEB_FLOOR_LADDER_CONFIG,
569
+ FloorLadderController: FloorLadderController,
570
+ applyFloorToVastUrl: applyFloorToVastUrl,
571
+ fixedFloorSelector: fixedFloorSelector,
572
+ generateFloorLevels: generateFloorLevels,
573
+ resolveFloorLadderBounds: resolveFloorLadderBounds,
574
+ resolveOpportunityFloor: resolveOpportunityFloor,
575
+ validateFloorCents: validateFloorCents,
576
+ validateFloorLadderConfig: validateFloorLadderConfig
577
+ });
578
+ //# sourceMappingURL=FloorLadder.cjs.map
@@ -0,0 +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"]}