stormcloud-video-player 0.8.54 → 0.8.55

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 (70) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/index.cjs +124 -101
  3. package/lib/index.cjs.map +1 -1
  4. package/lib/index.d.cts +1 -0
  5. package/lib/index.d.ts +1 -0
  6. package/lib/index.js +124 -101
  7. package/lib/index.js.map +1 -1
  8. package/lib/player/AdBreakOrchestrator.cjs +69 -66
  9. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  10. package/lib/player/AdBreakOrchestrator.d.cts +1 -1
  11. package/lib/player/AdConfigManager.cjs +38 -33
  12. package/lib/player/AdConfigManager.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.d.cts +1 -1
  14. package/lib/player/AdTimingService.cjs +18 -25
  15. package/lib/player/AdTimingService.cjs.map +1 -1
  16. package/lib/player/AdTimingService.d.cts +1 -1
  17. package/lib/player/HlsEngine.cjs +12 -21
  18. package/lib/player/HlsEngine.cjs.map +1 -1
  19. package/lib/player/HlsEngine.d.cts +1 -1
  20. package/lib/player/PlaceholderLayer.cjs +1 -3
  21. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  22. package/lib/player/PlayerControls.cjs.map +1 -1
  23. package/lib/player/PlayerControls.d.cts +1 -1
  24. package/lib/player/Scte35CueManager.cjs +2 -4
  25. package/lib/player/Scte35CueManager.cjs.map +1 -1
  26. package/lib/player/Scte35CueManager.d.cts +1 -1
  27. package/lib/player/Scte35Parser.cjs +6 -12
  28. package/lib/player/Scte35Parser.cjs.map +1 -1
  29. package/lib/player/Scte35Parser.d.cts +1 -1
  30. package/lib/player/StormcloudVideoPlayer.cjs +114 -87
  31. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  32. package/lib/player/StormcloudVideoPlayer.d.cts +1 -1
  33. package/lib/player/playerTypes.cjs.map +1 -1
  34. package/lib/player/playerTypes.d.cts +1 -1
  35. package/lib/players/FilePlayer.cjs +17 -26
  36. package/lib/players/FilePlayer.cjs.map +1 -1
  37. package/lib/players/HlsPlayer.cjs +124 -101
  38. package/lib/players/HlsPlayer.cjs.map +1 -1
  39. package/lib/players/HlsPlayer.d.cts +1 -1
  40. package/lib/players/index.cjs +124 -101
  41. package/lib/players/index.cjs.map +1 -1
  42. package/lib/sdk/hlsAdPlayer.cjs +42 -19
  43. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  44. package/lib/sdk/hlsAdPlayer.d.cts +1 -1
  45. package/lib/sdk/pal.cjs +6 -9
  46. package/lib/sdk/pal.cjs.map +1 -1
  47. package/lib/{types-cTqIKw_D.d.cts → types-DpbgEvSH.d.cts} +1 -0
  48. package/lib/ui/StormcloudVideoPlayer.cjs +114 -87
  49. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  50. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  51. package/lib/utils/browserCompat.cjs +3 -6
  52. package/lib/utils/browserCompat.cjs.map +1 -1
  53. package/lib/utils/ctvVastSignals.cjs +3 -6
  54. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  55. package/lib/utils/devUrl.cjs.map +1 -1
  56. package/lib/utils/mqttClient.cjs +1 -3
  57. package/lib/utils/mqttClient.cjs.map +1 -1
  58. package/lib/utils/mqttConfig.cjs +1 -3
  59. package/lib/utils/mqttConfig.cjs.map +1 -1
  60. package/lib/utils/polyfills.cjs +4 -7
  61. package/lib/utils/polyfills.cjs.map +1 -1
  62. package/lib/utils/tracking.cjs +27 -20
  63. package/lib/utils/tracking.cjs.map +1 -1
  64. package/lib/utils/tracking.d.cts +1 -1
  65. package/lib/utils/vastEnvironmentSignals.cjs +7 -6
  66. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  67. package/lib/utils/vastEnvironmentSignals.d.cts +2 -1
  68. package/lib/utils/vastMacros.cjs +4 -2
  69. package/lib/utils/vastMacros.cjs.map +1 -1
  70. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { a as StormcloudVideoPlayerConfig } from '../types-cTqIKw_D.cjs';
1
+ import { a as StormcloudVideoPlayerConfig } from '../types-DpbgEvSH.cjs';
2
2
 
3
3
  declare class StormcloudVideoPlayer {
4
4
  private readonly video;
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/player/playerTypes.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","__hasOwnProp","prototype","hasOwnProperty","__copyProps","to","from","except","desc","getOwnPropertyNames","call","key","get"],"mappings":"AAAA;;;;;;;;;AACA,IAAIA,YAAYC,EAAAA,qBAAAA,IAAOC,MAAAA,QAAc;IACrC,EAAIC,EAAAA,QAAAA,CAAAA,OAAAA,qCAAAA,SAAAA,EAAmBF,GAAAA,MAAOG,YAAAA,OAAAA,KAAwB,IAAA,YAAA;YAClDC,kCAAAA,2BAAAA;;;gBAAAA,IAAAA,MAAAA;gBACAC,IAAAA,CAAAA,QAAeL,KAAAA,EAAOM,EAAAA,CAAAA,IAAAA,EAAS,CAACC,KAAAA,QAAAA,CAAc,OAC9CC,UAAc,IAAA,KAAA;oBAAA,KAAA,KAACC,IAAD;+BAACA,GAAIC,CAAAA,CAAAA,IAAMC;;oBAAAA,MAAQC,MAAAA,CAAAA,CAAAA,OAAAA,iBAAAA,MAAAA,IAAAA,KAAAA,KAAAA,UAAAA;gBAAAA;;YAFjCR,QAAAA,YAAAA,IAAoBJ,OAAOa,OAAAA,YAAmB,cAA9CT,SAAAA,6BAAAA,QAAAA,yBAAAA;;YAAAA;YAAAA;;;qBAAAA,6BAAAA;oBAAAA;;;oBAAAA;0BAAAA;;;;MAGF,IAAIM,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;cAC7D,kCAAA,2BAAA;;;;;;;gBACH,IAAI,CAACL,OAAAA,MAAaS,IAAI,CAACL,IAAIM,QAAQA,QAAQJ,QACzCZ,UAAUU,IAAIM,KAAK;oBAAEC,KAAK,CAAA,CAAA,OAALA;+BAAWN,IAAI,CAACK,IAAI","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\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/playerTypes.ts\nvar playerTypes_exports = {};\nmodule.exports = __toCommonJS(playerTypes_exports);\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/player/playerTypes.cjs"],"names":["__defProp","Object","defineProperty"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mEACIA,QAAYC,EAAAA,IAAAA,KAAAA;oBAAAA,KAAAA,CAAAA,CAAAA,GAAAA,IAAAA;+BAAAA,GAAOC,CAAAA,CAAAA,IAAAA","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\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/playerTypes.ts\nvar playerTypes_exports = {};\nmodule.exports = __toCommonJS(playerTypes_exports);\n"]}
@@ -1,4 +1,4 @@
1
- import { S as Scte35Marker } from '../types-cTqIKw_D.cjs';
1
+ import { S as Scte35Marker } from '../types-DpbgEvSH.cjs';
2
2
 
3
3
  type Scte35CueSource = "manifest" | "id3" | "ts";
4
4
  type Scte35CueReadiness = "early" | "playback";
@@ -1,8 +1,6 @@
1
1
  "use strict";
2
2
  function _assert_this_initialized(self) {
3
- if (self === void 0) {
4
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
5
- }
3
+ if (self === void 0) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
6
4
  return self;
7
5
  }
8
6
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
@@ -13,11 +11,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
13
11
  reject(error);
14
12
  return;
15
13
  }
16
- if (info.done) {
17
- resolve(value);
18
- } else {
19
- Promise.resolve(value).then(_next, _throw);
20
- }
14
+ if (info.done) resolve(value);
15
+ else Promise.resolve(value).then(_next, _throw);
21
16
  }
22
17
  function _async_to_generator(fn) {
23
18
  return function() {
@@ -39,9 +34,7 @@ function _call_super(_this, derived, args) {
39
34
  return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
40
35
  }
41
36
  function _class_call_check(instance, Constructor) {
42
- if (!(instance instanceof Constructor)) {
43
- throw new TypeError("Cannot call a class as a function");
44
- }
37
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
45
38
  }
46
39
  function _defineProperties(target, props) {
47
40
  for(var i = 0; i < props.length; i++){
@@ -76,10 +69,16 @@ function _inherits(subClass, superClass) {
76
69
  });
77
70
  if (superClass) _set_prototype_of(subClass, superClass);
78
71
  }
72
+ function _is_native_reflect_construct() {
73
+ try {
74
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
75
+ } catch (_) {}
76
+ return (_is_native_reflect_construct = function() {
77
+ return !!result;
78
+ })();
79
+ }
79
80
  function _possible_constructor_return(self, call) {
80
- if (call && (_type_of(call) === "object" || typeof call === "function")) {
81
- return call;
82
- }
81
+ if (call && (_type_of(call) === "object" || typeof call === "function")) return call;
83
82
  return _assert_this_initialized(self);
84
83
  }
85
84
  function _set_prototype_of(o, p) {
@@ -89,18 +88,6 @@ function _set_prototype_of(o, p) {
89
88
  };
90
89
  return _set_prototype_of(o, p);
91
90
  }
92
- function _type_of(obj) {
93
- "@swc/helpers - typeof";
94
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
95
- }
96
- function _is_native_reflect_construct() {
97
- try {
98
- var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
99
- } catch (_) {}
100
- return (_is_native_reflect_construct = function() {
101
- return !!result;
102
- })();
103
- }
104
91
  function _ts_generator(thisArg, body) {
105
92
  var f, y, t, _ = {
106
93
  label: 0,
@@ -200,6 +187,10 @@ function _ts_generator(thisArg, body) {
200
187
  };
201
188
  }
202
189
  }
190
+ function _type_of(obj) {
191
+ "@swc/helpers - typeof";
192
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
193
+ }
203
194
  var __defProp = Object.defineProperty;
204
195
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
205
196
  var __getOwnPropNames = Object.getOwnPropertyNames;
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/FilePlayer.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","name","all","target","enumerable","__copyProps","to","from","except","desc","key","call"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;YACIA,OAAAA,GAAYC,OAAOC,cAAc;QACjCC,mBAAmBF,OAAOG,wBAAwB;QAClDC,MAAAA,SAAAA,GAAAA,GAAoBJ,OAAOK,mBAAmB;;;;;;iCAC9CC,CAAAA,OAAAA,IAAeN,CAAAA,CAAAA,KAAOO,OAAAA,EAAS,CAACC,CAAAA,aAAc,gBAAA,OAAA,KAAA,CAAA,YAAA,GAA9CF;;;;;;;;;;;;4BAEG;;gCAAIG,IAAQC,GAAAA,GACfX,EAAAA,CAAAA,OAAUY,KAAAA,CAAAA,EAAQF,MAAM,eAAA;;;4BADrB,EAAIA;;;;;;4BAC4BA,KAAK;4BAAEG,QAAAA,EAAY,EAAA,CAAA,8BAAA;;;;;;;;;;;YAEtDC,cAAc,qBAACC,IAAIC,MAAMC,QAAQC;;QACnC,IAAIF,EAAAA,OAAQ,CAAA,EAAA,GAAA,EAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;;oBAC7D;;;;0CAAA,uBAAA,IAAA,2BAAA;;;;;;;;;;;;;;;;;;;;;;;4BAAA,GAAIG,MAAJ;kCACH,EAAA,EAAI,CAACZ,CAAAA,CAAAA,WAAaa,IAAI,CAACL,IAAII,QAAQA,OAAAA,CAAQF,QACzCjB,UAAUe,IAAII,KAAK;;;;;;;;;;;;;;;;;;0CAA6F;;wBAFpH,CAAA,OAAK,YAAWd,kBAAkBW,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;;;;sCAAA;wBAAA,IAAA,GAAA;;;;;;iCAAA,KAAA,IAAA,CAAA,KAAA,CAAA,GAAA,EAAA,QAAA;kCAAA;;;;;mCAAA;;sCAAA;;;;;;;IAGP,OAAA,OAAA,GAAA,QAAA,IAAA","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/players/FilePlayer.tsx\nvar FilePlayer_exports = {};\n__export(FilePlayer_exports, {\n default: () => FilePlayer\n});\nmodule.exports = __toCommonJS(FilePlayer_exports);\nvar import_react = require(\"react\");\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n hls: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n dash: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n video: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n audio: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n file: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n }\n};\n\n// src/players/FilePlayer.tsx\nvar FilePlayer = class extends import_react.Component {\n constructor() {\n super(...arguments);\n this.mounted = false;\n this.ready = false;\n this.load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n const video = this.props.videoElement;\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n const handleError = (error) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.src = this.props.src;\n if (this.props.autoplay !== void 0) video.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) video.muted = this.props.muted;\n if (this.props.loop !== void 0) video.loop = this.props.loop;\n if (this.props.controls !== void 0) video.controls = this.props.controls;\n if (this.props.playsInline !== void 0)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== void 0)\n video.preload = this.props.preload;\n if (this.props.poster !== void 0) video.poster = this.props.poster;\n this.props.onMount?.(this);\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[FilePlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n } else {\n console.warn(\"[FilePlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.setLoop = (loop) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n this.enablePIP = async () => {\n if (this.props.videoElement && \"requestPictureInPicture\" in this.props.videoElement) {\n try {\n await this.props.videoElement.requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n this.disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nFilePlayer.displayName = \"FilePlayer\";\nFilePlayer.canPlay = canPlay.file;\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/players/FilePlayer.cjs"],"names":[],"mappings":"AAAA","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/players/FilePlayer.tsx\nvar FilePlayer_exports = {};\n__export(FilePlayer_exports, {\n default: () => FilePlayer\n});\nmodule.exports = __toCommonJS(FilePlayer_exports);\nvar import_react = require(\"react\");\n\n// src/patterns.ts\nvar HLS_EXTENSIONS = /\\.(m3u8)($|\\?)/i;\nvar HLS_PATHS = /\\/hls\\//i;\nvar DASH_EXTENSIONS = /\\.(mpd)($|\\?)/i;\nvar VIDEO_EXTENSIONS = /\\.(mp4|webm|ogg|avi|mov|wmv|flv|mkv)($|\\?)/i;\nvar AUDIO_EXTENSIONS = /\\.(mp3|wav|ogg|aac|wma|flac|m4a)($|\\?)/i;\nvar canPlay = {\n hls: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return HLS_EXTENSIONS.test(url) || HLS_PATHS.test(url);\n },\n dash: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return DASH_EXTENSIONS.test(url);\n },\n video: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url);\n },\n audio: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return AUDIO_EXTENSIONS.test(url);\n },\n file: (url) => {\n if (!url || typeof url !== \"string\") return false;\n return VIDEO_EXTENSIONS.test(url) || AUDIO_EXTENSIONS.test(url);\n }\n};\n\n// src/players/FilePlayer.tsx\nvar FilePlayer = class extends import_react.Component {\n constructor() {\n super(...arguments);\n this.mounted = false;\n this.ready = false;\n this.load = () => {\n if (!this.props.videoElement || !this.props.src) return;\n const video = this.props.videoElement;\n const handleLoadedMetadata = () => {\n if (this.mounted && !this.ready) {\n this.ready = true;\n this.props.onReady?.();\n }\n };\n const handlePlay = () => {\n if (this.mounted) {\n this.props.onPlay?.();\n }\n };\n const handlePause = () => {\n if (this.mounted) {\n this.props.onPause?.();\n }\n };\n const handleEnded = () => {\n if (this.mounted) {\n this.props.onEnded?.();\n }\n };\n const handleError = (error) => {\n if (this.mounted) {\n this.props.onError?.(error);\n }\n };\n const handleLoadedData = () => {\n if (this.mounted) {\n this.props.onLoaded?.();\n }\n };\n video.addEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.addEventListener(\"play\", handlePlay);\n video.addEventListener(\"pause\", handlePause);\n video.addEventListener(\"ended\", handleEnded);\n video.addEventListener(\"error\", handleError);\n video.addEventListener(\"loadeddata\", handleLoadedData);\n video.src = this.props.src;\n if (this.props.autoplay !== void 0) video.autoplay = this.props.autoplay;\n if (this.props.muted !== void 0) video.muted = this.props.muted;\n if (this.props.loop !== void 0) video.loop = this.props.loop;\n if (this.props.controls !== void 0) video.controls = this.props.controls;\n if (this.props.playsInline !== void 0)\n video.playsInline = this.props.playsInline;\n if (this.props.preload !== void 0)\n video.preload = this.props.preload;\n if (this.props.poster !== void 0) video.poster = this.props.poster;\n this.props.onMount?.(this);\n return () => {\n video.removeEventListener(\"loadedmetadata\", handleLoadedMetadata);\n video.removeEventListener(\"play\", handlePlay);\n video.removeEventListener(\"pause\", handlePause);\n video.removeEventListener(\"ended\", handleEnded);\n video.removeEventListener(\"error\", handleError);\n video.removeEventListener(\"loadeddata\", handleLoadedData);\n };\n };\n this.play = () => {\n if (this.props.videoElement) {\n const video = this.props.videoElement;\n const hasValidSource = video.src || video.currentSrc && video.currentSrc !== \"\" || video.readyState >= 1;\n if (hasValidSource) {\n video.play()?.catch((error) => {\n console.error(\"[FilePlayer] Failed to play:\", error);\n this.props.onError?.(error);\n });\n } else {\n console.warn(\"[FilePlayer] Cannot play: video has no valid source\");\n }\n }\n };\n this.pause = () => {\n if (this.props.videoElement) {\n this.props.videoElement.pause();\n }\n };\n this.stop = () => {\n this.pause();\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = 0;\n }\n };\n this.seekTo = (seconds, keepPlaying) => {\n if (this.props.videoElement) {\n this.props.videoElement.currentTime = seconds;\n if (!keepPlaying) {\n this.pause();\n }\n }\n };\n this.setVolume = (volume) => {\n if (this.props.videoElement) {\n this.props.videoElement.volume = Math.max(0, Math.min(1, volume));\n }\n };\n this.mute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = true;\n }\n };\n this.unmute = () => {\n if (this.props.videoElement) {\n this.props.videoElement.muted = false;\n }\n };\n this.setPlaybackRate = (rate) => {\n if (this.props.videoElement && rate > 0) {\n this.props.videoElement.playbackRate = rate;\n }\n };\n this.setLoop = (loop) => {\n if (this.props.videoElement) {\n this.props.videoElement.loop = loop;\n }\n };\n this.getDuration = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.duration)) {\n return this.props.videoElement.duration;\n }\n return null;\n };\n this.getCurrentTime = () => {\n if (this.props.videoElement && isFinite(this.props.videoElement.currentTime)) {\n return this.props.videoElement.currentTime;\n }\n return null;\n };\n this.getSecondsLoaded = () => {\n if (this.props.videoElement && this.props.videoElement.buffered.length > 0) {\n return this.props.videoElement.buffered.end(\n this.props.videoElement.buffered.length - 1\n );\n }\n return null;\n };\n this.getInternalPlayer = (key = \"player\") => {\n if (key === \"video\") return this.props.videoElement;\n return null;\n };\n this.enablePIP = async () => {\n if (this.props.videoElement && \"requestPictureInPicture\" in this.props.videoElement) {\n try {\n await this.props.videoElement.requestPictureInPicture();\n } catch (error) {\n console.warn(\"Picture-in-Picture failed:\", error);\n }\n }\n };\n this.disablePIP = async () => {\n if (document.pictureInPictureElement) {\n try {\n await document.exitPictureInPicture();\n } catch (error) {\n console.warn(\"Exit Picture-in-Picture failed:\", error);\n }\n }\n };\n }\n componentDidMount() {\n this.mounted = true;\n this.load();\n }\n componentWillUnmount() {\n this.mounted = false;\n }\n componentDidUpdate(prevProps) {\n if (prevProps.src !== this.props.src) {\n this.load();\n }\n }\n render() {\n return null;\n }\n};\nFilePlayer.displayName = \"FilePlayer\";\nFilePlayer.canPlay = canPlay.file;\n"]}
@@ -11,9 +11,7 @@ function _array_without_holes(arr) {
11
11
  if (Array.isArray(arr)) return _array_like_to_array(arr);
12
12
  }
13
13
  function _assert_this_initialized(self) {
14
- if (self === void 0) {
15
- throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
16
- }
14
+ if (self === void 0) throw new ReferenceError("this hasn't been initialised - super() hasn't been called");
17
15
  return self;
18
16
  }
19
17
  function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
@@ -24,11 +22,8 @@ function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {
24
22
  reject(error);
25
23
  return;
26
24
  }
27
- if (info.done) {
28
- resolve(value);
29
- } else {
30
- Promise.resolve(value).then(_next, _throw);
31
- }
25
+ if (info.done) resolve(value);
26
+ else Promise.resolve(value).then(_next, _throw);
32
27
  }
33
28
  function _async_to_generator(fn) {
34
29
  return function() {
@@ -50,9 +45,7 @@ function _call_super(_this, derived, args) {
50
45
  return _possible_constructor_return(_this, _is_native_reflect_construct() ? Reflect.construct(derived, args || [], _get_prototype_of(_this).constructor) : derived.apply(_this, args));
51
46
  }
52
47
  function _class_call_check(instance, Constructor) {
53
- if (!(instance instanceof Constructor)) {
54
- throw new TypeError("Cannot call a class as a function");
55
- }
48
+ if (!(instance instanceof Constructor)) throw new TypeError("Cannot call a class as a function");
56
49
  }
57
50
  function _defineProperties(target, props) {
58
51
  for(var i = 0; i < props.length; i++){
@@ -76,9 +69,7 @@ function _define_property(obj, key, value) {
76
69
  configurable: true,
77
70
  writable: true
78
71
  });
79
- } else {
80
- obj[key] = value;
81
- }
72
+ } else obj[key] = value;
82
73
  return obj;
83
74
  }
84
75
  function _get_prototype_of(o) {
@@ -101,14 +92,23 @@ function _inherits(subClass, superClass) {
101
92
  if (superClass) _set_prototype_of(subClass, superClass);
102
93
  }
103
94
  function _instanceof(left, right) {
95
+ "@swc/helpers - instanceof";
104
96
  if (right != null && typeof Symbol !== "undefined" && right[Symbol.hasInstance]) {
105
97
  return !!right[Symbol.hasInstance](left);
106
- } else {
107
- return left instanceof right;
108
- }
98
+ } else return left instanceof right;
99
+ }
100
+ function _is_native_reflect_construct() {
101
+ try {
102
+ var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
103
+ } catch (_) {}
104
+ return (_is_native_reflect_construct = function() {
105
+ return !!result;
106
+ })();
109
107
  }
110
108
  function _iterable_to_array(iter) {
111
- if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter);
109
+ if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) {
110
+ return Array.from(iter);
111
+ }
112
112
  }
113
113
  function _iterable_to_array_limit(arr, i) {
114
114
  var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"];
@@ -135,10 +135,10 @@ function _iterable_to_array_limit(arr, i) {
135
135
  return _arr;
136
136
  }
137
137
  function _non_iterable_rest() {
138
- throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
138
+ throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
139
139
  }
140
140
  function _non_iterable_spread() {
141
- throw new TypeError("Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
141
+ throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.");
142
142
  }
143
143
  function _object_spread(target) {
144
144
  for(var i = 1; i < arguments.length; i++){
@@ -170,9 +170,8 @@ function ownKeys(object, enumerableOnly) {
170
170
  }
171
171
  function _object_spread_props(target, source) {
172
172
  source = source != null ? source : {};
173
- if (Object.getOwnPropertyDescriptors) {
174
- Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
175
- } else {
173
+ if (Object.getOwnPropertyDescriptors) Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
174
+ else {
176
175
  ownKeys(Object(source)).forEach(function(key) {
177
176
  Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
178
177
  });
@@ -180,9 +179,7 @@ function _object_spread_props(target, source) {
180
179
  return target;
181
180
  }
182
181
  function _possible_constructor_return(self, call) {
183
- if (call && (_type_of(call) === "object" || typeof call === "function")) {
184
- return call;
185
- }
182
+ if (call && (_type_of(call) === "object" || typeof call === "function")) return call;
186
183
  return _assert_this_initialized(self);
187
184
  }
188
185
  function _set_prototype_of(o, p) {
@@ -198,26 +195,6 @@ function _sliced_to_array(arr, i) {
198
195
  function _to_consumable_array(arr) {
199
196
  return _array_without_holes(arr) || _iterable_to_array(arr) || _unsupported_iterable_to_array(arr) || _non_iterable_spread();
200
197
  }
201
- function _type_of(obj) {
202
- "@swc/helpers - typeof";
203
- return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
204
- }
205
- function _unsupported_iterable_to_array(o, minLen) {
206
- if (!o) return;
207
- if (typeof o === "string") return _array_like_to_array(o, minLen);
208
- var n = Object.prototype.toString.call(o).slice(8, -1);
209
- if (n === "Object" && o.constructor) n = o.constructor.name;
210
- if (n === "Map" || n === "Set") return Array.from(n);
211
- if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
212
- }
213
- function _is_native_reflect_construct() {
214
- try {
215
- var result = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function() {}));
216
- } catch (_) {}
217
- return (_is_native_reflect_construct = function() {
218
- return !!result;
219
- })();
220
- }
221
198
  function _ts_generator(thisArg, body) {
222
199
  var f, y, t, _ = {
223
200
  label: 0,
@@ -319,18 +296,36 @@ function _ts_generator(thisArg, body) {
319
296
  }
320
297
  function _ts_values(o) {
321
298
  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
322
- if (m) return m.call(o);
323
- if (o && typeof o.length === "number") return {
324
- next: function() {
325
- if (o && i >= o.length) o = void 0;
326
- return {
327
- value: o && o[i++],
328
- done: !o
329
- };
330
- }
331
- };
299
+ if (m) {
300
+ return m.call(o);
301
+ }
302
+ if (o && typeof o.length === "number") {
303
+ return {
304
+ next: function() {
305
+ if (o && i >= o.length) {
306
+ o = void 0;
307
+ }
308
+ return {
309
+ value: o && o[i++],
310
+ done: !o
311
+ };
312
+ }
313
+ };
314
+ }
332
315
  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
333
316
  }
317
+ function _type_of(obj) {
318
+ "@swc/helpers - typeof";
319
+ return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
320
+ }
321
+ function _unsupported_iterable_to_array(o, minLen) {
322
+ if (!o) return;
323
+ if (typeof o === "string") return _array_like_to_array(o, minLen);
324
+ var n = Object.prototype.toString.call(o).slice(8, -1);
325
+ if (n === "Object" && o.constructor) n = o.constructor.name;
326
+ if (n === "Map" || n === "Set") return Array.from(n);
327
+ if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _array_like_to_array(o, minLen);
328
+ }
334
329
  var __create = Object.create;
335
330
  var __defProp = Object.defineProperty;
336
331
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
@@ -591,6 +586,7 @@ function createHlsAdPlayer(contentVideo, options) {
591
586
  var adContainerEl = (_contentVideo_AD_CONTAINER_PROP = contentVideo[AD_CONTAINER_PROP]) !== null && _contentVideo_AD_CONTAINER_PROP !== void 0 ? _contentVideo_AD_CONTAINER_PROP : void 0;
592
587
  var adEventHandlers = [];
593
588
  var currentAd;
589
+ var currentAdMediaUrl;
594
590
  var podAds = [];
595
591
  var podIndex = 0;
596
592
  var sessionId;
@@ -1408,9 +1404,9 @@ function createHlsAdPlayer(contentVideo, options) {
1408
1404
  delete contentVideo.dataset.stormcloudAdPlaying;
1409
1405
  }
1410
1406
  }
1411
- function resetQuartileTracking(preserveImpression) {
1407
+ function resetQuartileTracking() {
1412
1408
  trackingFired = {
1413
- impression: preserveImpression ? trackingFired.impression : false,
1409
+ impression: false,
1414
1410
  start: false,
1415
1411
  firstQuartile: false,
1416
1412
  midpoint: false,
@@ -1418,6 +1414,27 @@ function createHlsAdPlayer(contentVideo, options) {
1418
1414
  complete: false
1419
1415
  };
1420
1416
  }
1417
+ function markCreativeRendered(reason) {
1418
+ if (!currentAd || trackingFired.impression) return;
1419
+ trackingFired.impression = true;
1420
+ fireTrackingPixels(currentAd.trackingUrls.impression);
1421
+ console.log("[HlsAdPlayer] Impression (pod ".concat(podIndex + 1, "/").concat(podAds.length || 1, ", reason: ").concat(reason, "): ").concat(currentAd.title));
1422
+ emit("ad_impression", {
1423
+ adId: currentAd.id,
1424
+ title: currentAd.title,
1425
+ durationSeconds: currentAd.duration,
1426
+ mediaUrl: currentAdMediaUrl,
1427
+ podIndex: podIndex,
1428
+ podSize: podAds.length || 1,
1429
+ reason: reason
1430
+ });
1431
+ }
1432
+ function canDetectBlackFrames() {
1433
+ if (!adVideoElement) return false;
1434
+ if (requiresMediaPipelineResetAfterAds()) return false;
1435
+ if (isRvfcSupported(adVideoElement)) return true;
1436
+ return getDecodedVideoFrameCount(adVideoElement) !== void 0;
1437
+ }
1421
1438
  function isRvfcSupported(video) {
1422
1439
  return typeof video.requestVideoFrameCallback === "function";
1423
1440
  }
@@ -1480,6 +1497,7 @@ function createHlsAdPlayer(contentVideo, options) {
1480
1497
  if (!mediaFile) {
1481
1498
  throw new Error("No media file available for ad");
1482
1499
  }
1500
+ currentAdMediaUrl = mediaFile.url;
1483
1501
  var isHlsAd = isHlsMediaFile(mediaFile);
1484
1502
  console.log("[HlsAdPlayer] Loading ".concat(isHlsAd ? "HLS" : "progressive", " ad (pod ").concat(podIndex + 1, "/").concat(podAds.length || 1, ") from: ").concat(mediaFile.url));
1485
1503
  if (isHlsAd && import_hls.default.isSupported()) {
@@ -1523,10 +1541,9 @@ function createHlsAdPlayer(contentVideo, options) {
1523
1541
  }
1524
1542
  podIndex++;
1525
1543
  currentAd = podAds[podIndex];
1526
- resetQuartileTracking(false);
1544
+ currentAdMediaUrl = void 0;
1545
+ resetQuartileTracking();
1527
1546
  if (currentAd) {
1528
- fireTrackingPixels(currentAd.trackingUrls.impression);
1529
- trackingFired.impression = true;
1530
1547
  console.log("[HlsAdPlayer] Advancing to next pod ad (".concat(podIndex + 1, "/").concat(podAds.length, "): ").concat(currentAd.title, ", duration: ").concat(currentAd.duration, "s"));
1531
1548
  }
1532
1549
  clearStallWatchdog();
@@ -1621,6 +1638,7 @@ function createHlsAdPlayer(contentVideo, options) {
1621
1638
  if (!adPlaying) return;
1622
1639
  sawDecodedVideoFrame = true;
1623
1640
  markRvfcReliable();
1641
+ markCreativeRendered("first_presented_frame");
1624
1642
  };
1625
1643
  try {
1626
1644
  videoFrameCallbackHandle = rvfc.call(adVideoElement, onPresentedFrame);
@@ -1655,6 +1673,7 @@ function createHlsAdPlayer(contentVideo, options) {
1655
1673
  if (decodedFrames !== void 0 && decodedFrames > 0) {
1656
1674
  sawDecodedVideoFrame = true;
1657
1675
  markFrameCounterReliable();
1676
+ markCreativeRendered("decoded_frames");
1658
1677
  } else if (adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S) {
1659
1678
  var timeAdvancing = adVideoElement.currentTime > lastAdProgressPosition + 0.05;
1660
1679
  if (isRvfcSupported(adVideoElement) && timeAdvancing && isRvfcReliable()) {
@@ -1667,6 +1686,9 @@ function createHlsAdPlayer(contentVideo, options) {
1667
1686
  }
1668
1687
  }
1669
1688
  }
1689
+ if (!trackingFired.impression && !adVideoElement.paused && adVideoElement.currentTime >= BLACKFRAME_MIN_PLAYBACK_S && (sawDecodedVideoFrame || !canDetectBlackFrames())) {
1690
+ markCreativeRendered(sawDecodedVideoFrame ? "decoded_frames" : "sustained_playback");
1691
+ }
1670
1692
  if (adVideoElement.currentTime > lastAdProgressPosition + 0.05) {
1671
1693
  noteAdProgress();
1672
1694
  return;
@@ -1805,11 +1827,9 @@ function createHlsAdPlayer(contentVideo, options) {
1805
1827
  podAds = ads;
1806
1828
  podIndex = 0;
1807
1829
  currentAd = ads[0];
1830
+ currentAdMediaUrl = void 0;
1831
+ resetQuartileTracking();
1808
1832
  console.log("[HlsAdPlayer] Pod parsed: ".concat(ads.length, ' ad(s), first="').concat(currentAd === null || currentAd === void 0 ? void 0 : currentAd.title, '", duration=').concat(currentAd === null || currentAd === void 0 ? void 0 : currentAd.duration, "s"));
1809
- if (currentAd) {
1810
- fireTrackingPixels(currentAd.trackingUrls.impression);
1811
- trackingFired.impression = true;
1812
- }
1813
1833
  return [
1814
1834
  2,
1815
1835
  Promise.resolve()
@@ -1849,7 +1869,7 @@ function createHlsAdPlayer(contentVideo, options) {
1849
1869
  contentVideo[AD_VIDEO_PROP] = adVideoElement;
1850
1870
  }
1851
1871
  setupAdEventListeners();
1852
- resetQuartileTracking(true);
1872
+ resetQuartileTracking();
1853
1873
  contentVolume = contentVideo.volume;
1854
1874
  originalVolume = Math.max(0, Math.min(1, contentVolume || originalVolume));
1855
1875
  if (!(options === null || options === void 0 ? void 0 : options.continueLiveStreamDuringAds)) {
@@ -1939,6 +1959,7 @@ function createHlsAdPlayer(contentVideo, options) {
1939
1959
  }
1940
1960
  }
1941
1961
  currentAd = void 0;
1962
+ currentAdMediaUrl = void 0;
1942
1963
  podAds = [];
1943
1964
  podIndex = 0;
1944
1965
  return [
@@ -3253,7 +3274,7 @@ function buildPlayerMetricEvent() {
3253
3274
  if (debugAdTiming) {
3254
3275
  console.log("[StormcloudVideoPlayer] playerId: ", playerId);
3255
3276
  }
3256
- captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : /* @__PURE__ */ new Date().toISOString();
3277
+ captureAt = (_flags_captureAt = flags.captureAt) !== null && _flags_captureAt !== void 0 ? _flags_captureAt : (/* @__PURE__ */ new Date()).toISOString();
3257
3278
  return [
3258
3279
  2,
3259
3280
  _object_spread({
@@ -3272,8 +3293,19 @@ function buildPlayerMetricEvent() {
3272
3293
  }).apply(this, arguments);
3273
3294
  }
3274
3295
  function publishTracking(licenseKey, channel, body) {
3296
+ var debug = arguments.length > 3 && arguments[3] !== void 0 ? arguments[3] : false;
3275
3297
  ensureMQTTClient();
3276
- publishMQTT(buildPlayerTopic(licenseKey, channel), body);
3298
+ var topic = buildPlayerTopic(licenseKey, channel);
3299
+ var published = publishMQTT(topic, body);
3300
+ if (debug) {
3301
+ console.log("[StormcloudVideoPlayer] publishTracking:", JSON.stringify({
3302
+ licenseKey: licenseKey,
3303
+ channel: channel,
3304
+ topic: topic,
3305
+ body: body,
3306
+ published: published
3307
+ }, null, 2));
3308
+ }
3277
3309
  }
3278
3310
  function sendInitialTracking(_0) {
3279
3311
  return _async_to_generator(function(licenseKey) {
@@ -3307,7 +3339,7 @@ function sendInitialTracking(_0) {
3307
3339
  events: [
3308
3340
  metricEvent
3309
3341
  ]
3310
- });
3342
+ }, !!context.debugAdTiming);
3311
3343
  return [
3312
3344
  3,
3313
3345
  4
@@ -3417,7 +3449,7 @@ function sendAdLoadedTracking(_0, _1) {
3417
3449
  }
3418
3450
  function sendAdImpressionTracking(_0, _1) {
3419
3451
  return _async_to_generator(function(licenseKey, adImpressionInfo) {
3420
- var context, metricEvent, error;
3452
+ var context, _adImpressionInfo_adUrl, metricEvent, error;
3421
3453
  var _arguments = arguments;
3422
3454
  return _ts_generator(this, function(_state) {
3423
3455
  switch(_state.label){
@@ -3442,17 +3474,18 @@ function sendAdImpressionTracking(_0, _1) {
3442
3474
  ];
3443
3475
  case 2:
3444
3476
  metricEvent = _state.sent();
3445
- publishTracking(licenseKey, "heartbeat", metricEvent);
3477
+ publishTracking(licenseKey, "heartbeat", metricEvent, !!context.debugAdTiming);
3446
3478
  publishTracking(licenseKey, "impressions", {
3447
3479
  events: [
3448
3480
  {
3481
+ event_id: createUuid(),
3449
3482
  player_id: metricEvent.player_id,
3450
3483
  ad_played_count: 1,
3451
- ad_url: adImpressionInfo.adUrl,
3484
+ ad_url: (_adImpressionInfo_adUrl = adImpressionInfo.adUrl) !== null && _adImpressionInfo_adUrl !== void 0 ? _adImpressionInfo_adUrl : adImpressionInfo.adId,
3452
3485
  capture_at: adImpressionInfo.timestamp
3453
3486
  }
3454
3487
  ]
3455
- });
3488
+ }, !!context.debugAdTiming);
3456
3489
  return [
3457
3490
  3,
3458
3491
  4
@@ -3497,7 +3530,7 @@ function sendHeartbeat(_0) {
3497
3530
  ];
3498
3531
  case 2:
3499
3532
  heartbeatData = _state.sent();
3500
- publishTracking(licenseKey, "heartbeat", heartbeatData);
3533
+ publishTracking(licenseKey, "heartbeat", heartbeatData, !!context.debugAdTiming);
3501
3534
  return [
3502
3535
  3,
3503
3536
  4
@@ -6330,7 +6363,7 @@ var AdTimingService = /*#__PURE__*/ function() {
6330
6363
  var _this_callbacks_getAdState = this.callbacks.getAdState(), inAdBreak = _this_callbacks_getAdState.inAdBreak, showAds = _this_callbacks_getAdState.showAds, adPlaying = _this_callbacks_getAdState.adPlaying;
6331
6364
  console.log("[StormcloudVideoPlayer][AdState]", _object_spread({
6332
6365
  event: event,
6333
- timestamp: /* @__PURE__ */ new Date().toISOString(),
6366
+ timestamp: (/* @__PURE__ */ new Date()).toISOString(),
6334
6367
  showAds: showAds,
6335
6368
  adPlaying: adPlaying,
6336
6369
  inAdBreak: inAdBreak,
@@ -7291,27 +7324,22 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
7291
7324
  console.log("[POD] Playing pod ad ".concat((payload === null || payload === void 0 ? void 0 : payload.index) != null ? payload.index + 1 : "?", "/").concat((_ref = payload === null || payload === void 0 ? void 0 : payload.total) !== null && _ref !== void 0 ? _ref : "?"));
7292
7325
  }
7293
7326
  });
7294
- adPlayer.on("all_ads_completed", function() {
7295
- sendAdImpressionTracking(_this.host.config.licenseKey, {
7327
+ adPlayer.on("ad_impression", function(payload) {
7328
+ var impressionInfo = {
7296
7329
  source: "hls",
7297
7330
  adIndex: _this.timing.currentAdIndex,
7298
- timestamp: /* @__PURE__ */ new Date().toISOString()
7299
- }, _this.analyticsContext).catch(function() {});
7300
- _this.timing.recordPlayedAdDuration(_this.host.getAdPlayer());
7301
- var remaining = _this.timing.getRemainingAdMs();
7302
- _this.timing.consecutiveFailures = 0;
7303
- if (_this.debug) {
7304
- console.log("[StormcloudVideoPlayer] all_ads_completed event received - remaining=".concat(remaining, "ms, queued ads=").concat(_this.adRequestQueue.length), _this.adRequestQueue.length > 0 ? {
7305
- queuedUrls: _to_consumable_array(_this.adRequestQueue)
7306
- } : {});
7331
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
7332
+ };
7333
+ if (payload === null || payload === void 0 ? void 0 : payload.adId) impressionInfo.adId = payload.adId;
7334
+ if (payload === null || payload === void 0 ? void 0 : payload.mediaUrl) impressionInfo.adUrl = payload.mediaUrl;
7335
+ if ((payload === null || payload === void 0 ? void 0 : payload.durationSeconds) != null) {
7336
+ impressionInfo.durationSeconds = payload.durationSeconds;
7307
7337
  }
7308
- if (_this.inAdBreak) {
7309
- if (_this.timing.hasTimeToStartAnotherAd()) {
7310
- _this.tryNextAvailableAdWithRateLimit();
7311
- } else {
7312
- _this.handleAdPodComplete();
7338
+ sendAdImpressionTracking(_this.host.config.licenseKey, impressionInfo, _this.analyticsContext).catch(function(error) {
7339
+ if (_this.debug) {
7340
+ console.warn("[AdBreakOrchestrator] Failed to send ad impression tracking:", error);
7313
7341
  }
7314
- }
7342
+ });
7315
7343
  });
7316
7344
  adPlayer.on("ad_error", function(errorPayload) {
7317
7345
  var errorMessage = "Ad playback failed";
@@ -7354,11 +7382,6 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
7354
7382
  }
7355
7383
  });
7356
7384
  adPlayer.on("content_resume", function() {
7357
- sendAdImpressionTracking(_this.host.config.licenseKey, {
7358
- source: "hls",
7359
- adIndex: _this.timing.currentAdIndex,
7360
- timestamp: /* @__PURE__ */ new Date().toISOString()
7361
- }, _this.analyticsContext).catch(function() {});
7362
7385
  if (!_this.host.video.muted) {
7363
7386
  _this.host.video.muted = true;
7364
7387
  if (_this.debug) {
@@ -7596,7 +7619,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
7596
7619
  sendAdLoadedTracking(this.host.config.licenseKey, {
7597
7620
  source: "hls",
7598
7621
  vastUrl: podUrl,
7599
- timestamp: /* @__PURE__ */ new Date().toISOString()
7622
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
7600
7623
  }, this.analyticsContext).catch(function() {});
7601
7624
  this.timing.startAdFailsafeTimer(requestToken);
7602
7625
  return [
@@ -8116,7 +8139,7 @@ var AdBreakOrchestrator = /*#__PURE__*/ function() {
8116
8139
  sendAdLoadedTracking(this.host.config.licenseKey, {
8117
8140
  source: "hls",
8118
8141
  vastUrl: vastTagUrl,
8119
- timestamp: /* @__PURE__ */ new Date().toISOString()
8142
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
8120
8143
  }, this.analyticsContext).catch(function() {});
8121
8144
  this.timing.clearAdRequestWatchdog();
8122
8145
  if (this.timing.activeAdRequestToken !== requestToken) return [
@@ -9097,7 +9120,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
9097
9120
  if (marker.ptsSeconds != null) detectPayload.ptsSeconds = marker.ptsSeconds;
9098
9121
  sendAdDetectTracking(this.config.licenseKey, _object_spread({
9099
9122
  source: "scte35",
9100
- timestamp: /* @__PURE__ */ new Date().toISOString()
9123
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
9101
9124
  }, detectPayload), buildAnalyticsContext(this.config)).catch(function() {});
9102
9125
  }
9103
9126
  var hasPrefetchedAds = this.adBreak.pendingAdBreak && this.adBreak.pendingAdBreak.vastUrls.length > 0;
@@ -9273,7 +9296,7 @@ var StormcloudVideoPlayer = /*#__PURE__*/ function() {
9273
9296
  if (fragmentSn !== void 0) detectPayload.detectedAtFragmentSn = fragmentSn;
9274
9297
  sendAdDetectTracking(this.config.licenseKey, _object_spread({
9275
9298
  source: "scte35",
9276
- timestamp: /* @__PURE__ */ new Date().toISOString()
9299
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
9277
9300
  }, detectPayload), buildAnalyticsContext(this.config)).catch(function() {});
9278
9301
  if (this.debug) {
9279
9302
  console.log("[PREFETCH] Starting ad prefetch for upcoming ad break");