stormcloud-video-player 0.8.60 → 0.8.62

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 (54) hide show
  1. package/dist/stormcloud-vp.min.js +1 -1
  2. package/lib/Player.cjs.map +1 -1
  3. package/lib/StormcloudPlayer.cjs +83 -29
  4. package/lib/StormcloudPlayer.cjs.map +1 -1
  5. package/lib/index.cjs +87 -31
  6. package/lib/index.cjs.map +1 -1
  7. package/lib/index.d.ts +4034 -0
  8. package/lib/index.js +13001 -0
  9. package/lib/index.js.map +1 -0
  10. package/lib/patterns.cjs.map +1 -1
  11. package/lib/player/AdBreakOrchestrator.cjs +3 -2
  12. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.cjs +53 -11
  14. package/lib/player/AdConfigManager.cjs.map +1 -1
  15. package/lib/player/AdTimingService.cjs.map +1 -1
  16. package/lib/player/HlsEngine.cjs.map +1 -1
  17. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  18. package/lib/player/PlayerControls.cjs.map +1 -1
  19. package/lib/player/Scte35CueManager.cjs.map +1 -1
  20. package/lib/player/Scte35Parser.cjs.map +1 -1
  21. package/lib/player/StormcloudVideoPlayer.cjs +83 -29
  22. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  23. package/lib/player/playerTypes.cjs.map +1 -1
  24. package/lib/players/FilePlayer.cjs.map +1 -1
  25. package/lib/players/HlsPlayer.cjs +83 -29
  26. package/lib/players/HlsPlayer.cjs.map +1 -1
  27. package/lib/players/index.cjs +83 -29
  28. package/lib/players/index.cjs.map +1 -1
  29. package/lib/props.cjs.map +1 -1
  30. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  31. package/lib/sdk/pal.cjs +9 -5
  32. package/lib/sdk/pal.cjs.map +1 -1
  33. package/lib/sdk/pal.d.cts +1 -0
  34. package/lib/types.cjs.map +1 -1
  35. package/lib/types.d.cts +1 -0
  36. package/lib/ui/StormcloudVideoPlayer.cjs +87 -31
  37. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  38. package/lib/utils/browserCompat.cjs.map +1 -1
  39. package/lib/utils/ctvVastSignals.cjs +25 -4
  40. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  41. package/lib/utils/devUrl.cjs.map +1 -1
  42. package/lib/utils/polyfills.cjs.map +1 -1
  43. package/lib/utils/tracking.cjs +3 -2
  44. package/lib/utils/tracking.cjs.map +1 -1
  45. package/lib/utils/trackingIngest.cjs.map +1 -1
  46. package/lib/utils/vastEnvironmentSignals.cjs +27 -5
  47. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  48. package/lib/utils/vastEnvironmentSignals.d.cts +1 -1
  49. package/lib/utils/vastMacros.cjs +24 -4
  50. package/lib/utils/vastMacros.cjs.map +1 -1
  51. package/lib/utils/vastMacros.d.cts +2 -0
  52. package/lib/utils/vastTrackingMacros.cjs.map +1 -1
  53. package/lib/utils.cjs.map +1 -1
  54. package/package.json +5 -3
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\patterns.cjs"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","__getOwnPropNames","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IACA,EAAIA,KAAAA,MAAAA,GAAAA,qBAAAA,IAAAA,MAAAA,IAAYC,IAAAA,GAAOC,CAAAA,aAAc;MACrC,EAAIC,EAAAA,IAAAA,EAAAA,CAAAA,OAAAA,qCAAAA,MAAAA,GAAAA,KACAC,MAAAA,CAD0BC,GAC1BD,QAAAA,EAAoBH,IAAAA,CAAAA,MAD8B,GAAA,YAAA;;;;;;;gBACvBK,IAAAA,GAAAA,CAAAA;kBAAAA,EAAAA,CAAAA,CAAmB,KAAA,GAAA,IAAA,IAAA,CAAA,IAAA,QAAA,QAAA,QAAA,UAAA,IAAA,KAAA;sBAAA,KAAA;eAAA,QAAA;;;qBAAA,IAAA,CAAA,IAAA;;;;;;gBAAA,YAAA,CAAA,CAAA,OAAA,iBAAA,MAAA,IAAA,KAAA,KAAA,UAAA;;sBAAA,uBAAA;eAAA;;;;;gBAA1BL,gBAAOK,EAAAA,gBAAAA;;;;;;;;;;;;;;;MAC/B,EAAIC,eAAeN,OAAOO,SAAS,CAACC,cAAc;WAC9CC,WAAJ,EAAIA,EAAAA,CAAAA,MAAW,GAAA,qBAAA,IAAA,MAAA,IAACC,IAAAA,IAAQC;UACtB,EAAA,CAAA,CAAK,IAAIC,EAAAA,CAAAA,MAAAA,CAAQD,OAAAA,UAAAA,OAAAA,aAARC,MAAQD,GAAAA,KACfZ,MAAAA,IAAUW,QAAQE,MAAM,CAAA,SAAA,YAAA;gBAAEC,OAAAA,SAAAA,IAAAA,CAAAA,QAAAA;aAAAA,YAAAA,MAAAA,IAAAA,CAAAA,GAAAA,cAAAA;WAAAA,eAAAA,CAAAA,IAAAA;QAAAA,IAAAA,CAAAA,OAAAA,OAAAA,QAAAA,UAAAA,OAAAA;;;+BAAAA,IAAKF,GAAG,CAACC,EAATC;sBAAgBC,EAAAA,CAAAA,EAAAA,IAAAA,GAAY,CAAA,GAAA,IAAA,CAAA,EAAA,EAAA,KAAA,GAAA,QAAA,QAAK,UAAA,IAAA,KAAA;0BAAA,KAAA,CAAA,IAAA,CAAA,QAAA,iBAAA,IAAA,CAAA;iBAAA,QAAA;;;qBAAA,EAAA,EAAA,CAAA,IAAA;;;;;;2BAAA,YAAA,CAAA,CAAA,OAAA,iBAAA,MAAA,IAAA,KAAA,KAAA,UAAA","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/patterns.ts\nvar patterns_exports = {};\n__export(patterns_exports, {\n AUDIO_EXTENSIONS: () => AUDIO_EXTENSIONS,\n DASH_EXTENSIONS: () => DASH_EXTENSIONS,\n HLS_EXTENSIONS: () => HLS_EXTENSIONS,\n HLS_PATHS: () => HLS_PATHS,\n VIDEO_EXTENSIONS: () => VIDEO_EXTENSIONS,\n canPlay: () => canPlay\n});\nmodule.exports = __toCommonJS(patterns_exports);\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// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n AUDIO_EXTENSIONS,\n DASH_EXTENSIONS,\n HLS_EXTENSIONS,\n HLS_PATHS,\n VIDEO_EXTENSIONS,\n canPlay\n});\n"]}
1
+ {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\patterns.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","patterns_exports","AUDIO_EXTENSIONS","DASH_EXTENSIONS","HLS_EXTENSIONS","HLS_PATHS","VIDEO_EXTENSIONS","canPlay","module","exports","hls","url","test","dash","video","audio","file"],"mappings":"AAAA;;;;;AACA,IAAIA,YAAYC,OAAOC,cAAc;AACrC,IAAIC,mBAAmBF,OAAOG,wBAAwB;AACtD,IAAIC,oBAAoBJ,OAAOK,mBAAmB;AAClD,IAAIC,eAAeN,OAAOO,SAAS,CAACC,cAAc;AAClD,IAAIC,WAAW,kBAACC,QAAQC;IACtB,IAAK,IAAIC,QAAQD,IACfZ,UAAUW,QAAQE,MAAM;QAAEC,KAAKF,GAAG,CAACC,KAAK;QAAEE,YAAY;IAAK;AAC/D;AACA,IAAIC,cAAc,qBAACC,IAAIC,MAAMC,QAAQC;IACnC,IAAIF,QAAQ,CAAA,OAAOA,qCAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;YAC7D,kCAAA,2BAAA;;;gBAAA,IAAIG,MAAJ;gBACH,IAAI,CAACd,aAAae,IAAI,CAACL,IAAII,QAAQA,QAAQF,QACzCnB,UAAUiB,IAAII,KAAK;oBAAEP,KAAK,SAALA;+BAAWI,IAAI,CAACG,IAAI;;oBAAEN,YAAY,CAAEK,CAAAA,OAAOjB,iBAAiBe,MAAMG,IAAG,KAAMD,KAAKL,UAAU;gBAAC;;YAFpH,QAAK,YAAWV,kBAAkBa,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;YAAA;YAAA;;;qBAAA,6BAAA;oBAAA;;;oBAAA;0BAAA;;;;IAGP;IACA,OAAOD;AACT;AACA,IAAIM,eAAe,sBAACC;WAAQR,YAAYhB,UAAU,CAAC,GAAG,cAAc;QAAEyB,OAAO;IAAK,IAAID;;AAEtF,kBAAkB;AAClB,IAAIE,mBAAmB,CAAC;AACxBhB,SAASgB,kBAAkB;IACzBC,kBAAkB,SAAlBA;eAAwBA;;IACxBC,iBAAiB,SAAjBA;eAAuBA;;IACvBC,gBAAgB,SAAhBA;eAAsBA;;IACtBC,WAAW,SAAXA;eAAiBA;;IACjBC,kBAAkB,SAAlBA;eAAwBA;;IACxBC,SAAS,SAATA;eAAeA;;AACjB;AACAC,OAAOC,OAAO,GAAGX,aAAaG;AAC9B,IAAIG,iBAAiB;AACrB,IAAIC,YAAY;AAChB,IAAIF,kBAAkB;AACtB,IAAIG,mBAAmB;AACvB,IAAIJ,mBAAmB;AACvB,IAAIK,UAAU;IACZG,KAAK,SAALA,IAAMC;QACJ,IAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU,OAAO;QAC5C,OAAOP,eAAeQ,IAAI,CAACD,QAAQN,UAAUO,IAAI,CAACD;IACpD;IACAE,MAAM,SAANA,KAAOF;QACL,IAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU,OAAO;QAC5C,OAAOR,gBAAgBS,IAAI,CAACD;IAC9B;IACAG,OAAO,SAAPA,MAAQH;QACN,IAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU,OAAO;QAC5C,OAAOL,iBAAiBM,IAAI,CAACD;IAC/B;IACAI,OAAO,SAAPA,MAAQJ;QACN,IAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU,OAAO;QAC5C,OAAOT,iBAAiBU,IAAI,CAACD;IAC/B;IACAK,MAAM,SAANA,KAAOL;QACL,IAAI,CAACA,OAAO,OAAOA,QAAQ,UAAU,OAAO;QAC5C,OAAOL,iBAAiBM,IAAI,CAACD,QAAQT,iBAAiBU,IAAI,CAACD;IAC7D;AACF;AACA,6DAA6D;AAC7D,KAAMH,CAAAA,OAAOC,OAAO,GAAG;IACrBP,kBAAAA;IACAC,iBAAAA;IACAC,gBAAAA;IACAC,WAAAA;IACAC,kBAAAA;IACAC,SAAAA;AACF,CAAA","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/patterns.ts\nvar patterns_exports = {};\n__export(patterns_exports, {\n AUDIO_EXTENSIONS: () => AUDIO_EXTENSIONS,\n DASH_EXTENSIONS: () => DASH_EXTENSIONS,\n HLS_EXTENSIONS: () => HLS_EXTENSIONS,\n HLS_PATHS: () => HLS_PATHS,\n VIDEO_EXTENSIONS: () => VIDEO_EXTENSIONS,\n canPlay: () => canPlay\n});\nmodule.exports = __toCommonJS(patterns_exports);\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// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n AUDIO_EXTENSIONS,\n DASH_EXTENSIONS,\n HLS_EXTENSIONS,\n HLS_PATHS,\n VIDEO_EXTENSIONS,\n canPlay\n});\n"]}
@@ -405,9 +405,10 @@ function inferDeviceIdType() {
405
405
  return void 0;
406
406
  }
407
407
  function resolveNativeDeviceId() {
408
+ var includeStored = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : true;
408
409
  var bridgeSignals = readNativeBridgeSignals();
409
410
  var platformDevice = readPlatformNativeDeviceId();
410
- var deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;
411
+ var deviceId = bridgeSignals.deviceId || (includeStored ? readStoredDeviceId() : void 0) || platformDevice.deviceId;
411
412
  if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {
412
413
  return void 0;
413
414
  }
@@ -1024,7 +1025,7 @@ function sha256Hex(input) {
1024
1025
  })();
1025
1026
  }
1026
1027
  function resolvePlayerIdentitySeed(clientInfo) {
1027
- var nativeDeviceId = resolveNativeDeviceId();
1028
+ var nativeDeviceId = resolveNativeDeviceId(clientInfo.isSmartTV);
1028
1029
  if (nativeDeviceId) {
1029
1030
  return "device:".concat(nativeDeviceId);
1030
1031
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\AdBreakOrchestrator.cjs"],"names":["get","__getOwnPropDesc","__getOwnPropNames","Object","__copyProps","getOwnPropertyNames","__defProp","defineProperty","getOwnPropertyDescriptor","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","enumerable","to","from","except","desc","key","call","AdBreakOrchestrator_exports","exports","__toCommonJS","mod","value","AdBreakOrchestrator","enabled","trackingIngestConfig","DEFAULT_TRACKING_INGEST_CONFIG","isTrackingIngestEnabled","normalizeIngestBaseUrl","baseUrl","replace","buildTrackingIngestUrl","channel","base","ingestPlayerTracking","licenseKey","body","response","error","ok","fetch","method","headers","Authorization","JSON","stringify","console","warn","status","DEVICE_ID_STORAGE_KEYS","TABLET","desktop","pc","DEVICE_TYPE_HINT","DESKTOP","FEATURE_PHONE","SMARTPHONE","CONNECTED_TV","GAME_CONSOLE","SET_TOP_BOX","DEVICE_TYPE_HINT_ALIASES","featurephone","mobile","phone","tablet","ctv","connectedtv","smarttv","gameconsole","settopbox","navigator","ua","userAgent","test","resolveNativeDeviceId","platformDevice","readPlatformNativeDeviceId","deviceId","bridgeSignals","readStoredDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","window","existing","readPersistentId","readStoredString","writePersistentId","webOSDev","roku","id","createUuid","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","document","prefix","encodeURIComponent","parts","cookie","split","entry","part","trim","startsWith","decodeURIComponent","slice","length","bytes","crypto","randomUUID","Uint8Array","getRandomValues","seed","Date","now","Math","floor","performanceNow","i","random","hex","toString","padStart","performance","deviceIdType","adinfo","tifa","getTIFA","lat","isLATEnabled","limitAdTracking","lgudid","LGUDID","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","t","has","toLowerCase","appId","readBridgeValue","source","appName"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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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/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator_exports = {};\n__export(AdBreakOrchestrator_exports, {\n AdBreakOrchestrator: () => AdBreakOrchestrator\n});\nmodule.exports = __toCommonJS(AdBreakOrchestrator_exports);\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\nfunction isTrackingIngestEnabled() {\n return trackingIngestConfig.enabled === true;\n}\nfunction normalizeIngestBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildTrackingIngestUrl(channel) {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\nasync function ingestPlayerTracking(licenseKey, channel, body) {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`\n },\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\"\n];\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};\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction resolveNativeDeviceId() {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId = bridgeSignals.deviceId || readStoredDeviceId() || platformDevice.deviceId;\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return void 0;\n }\n return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\nfunction readPersistentId(storageKey) {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {\n }\n writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n if (typeof document === \"undefined\") {\n return void 0;\n }\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n }\n }\n } catch {\n }\n return void 0;\n}\nfunction writeCookie(name, value) {\n if (typeof document === \"undefined\") {\n return;\n }\n try {\n document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n } catch {\n }\n}\nfunction createUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = seed * 1103515245 + 12345 & 2147483647;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n }\n }\n bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n }\n return 0;\n}\nfunction readPlatformNativeDeviceId() {\n if (typeof window === \"undefined\") return {};\n try {\n const adinfo = window.webapis?.adinfo;\n if (adinfo) {\n const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n };\n }\n }\n } catch {\n }\n try {\n const webOSDev = window.webOSDev;\n if (webOSDev) {\n const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {\n }\n try {\n const roku = window.Roku;\n if (roku) {\n const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {\n }\n return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n const t = value.trim();\n return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n for (const source of getNativeBridgeSources()) {\n const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n const deviceId = readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\"\n ]) || void 0;\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n const deviceIdType = readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\"\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\"\n ]);\n return {\n ...contentUrl ? { contentUrl } : {},\n ...appId ? { appId } : {},\n ...appName ? { appName } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n }\n return {};\n}\nfunction getNativeBridgeSources() {\n if (typeof window === \"undefined\") {\n return [];\n }\n return [\n window.__STORMCLOUD_CTV_AD_INFO__,\n window.__STORMCLOUD_CTV__,\n window.stormcloudCtv,\n window.AiryTV,\n window.Android,\n window.webOS,\n window.tizen,\n window.amazon\n ].filter(Boolean);\n}\nfunction readBridgeValue(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readStoredDeviceId() {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return void 0;\n}\nfunction readStoredString(key) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n try {\n const value = window.localStorage?.getItem(key);\n return value || void 0;\n } catch {\n return void 0;\n }\n}\nfunction normalizeBoolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n const context = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== void 0) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function sha256Hex(input) {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n const nativeDeviceId = resolveNativeDeviceId();\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n const playerId = await getBrowserID(clientInfo);\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData]\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n constructor(host, timing, adConfig, cueManager, placeholder) {\n this.inAdBreak = false;\n this.showAds = false;\n this.isShowingPlaceholder = false;\n this.adDetectSentForCurrentBreak = false;\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.adRequestQueue = [];\n this.adPodQueue = [];\n this.maxPlaceholderDurationMs = 5e3;\n this.pendingAdBreak = null;\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n get debug() {\n return !!this.host.config.debugAdTiming;\n }\n get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n nextAdRequestUrl(baseVastUrl) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : void 0;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n attachImaEventListeners() {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"ad_click\", () => {\n this.host.onAdClick();\n });\n adPlayer.on(\"ad_interaction\", (event) => {\n if (event) this.host.onAdInteraction(event);\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n this.timing.consecutiveFailures = 0;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload) => {\n let errorMessage = \"Ad playback failed\";\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n if (!this.inAdBreak) {\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n recreateAdController() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n clearPendingAdBreak() {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = void 0;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = void 0;\n this.adConfig.podAssignedByPrefetch = false;\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n async handleAdStart(_marker) {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1e3\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n let podUrl;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n if (!podUrl) {\n return false;\n }\n this.continuousFetchingActive = false;\n this.recreateAdController();\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n if (this.debug) {\n console.log(\n podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n startContinuousFetching(baseVastUrl) {\n if (!this.continuousFetchingActive) {\n return;\n }\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n async continuousFetchLoop(baseVastUrl) {\n const epoch = this.timing.adBreakEpoch;\n while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n continue;\n }\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n continue;\n }\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n this.adRequestQueue.push(newAdUrl);\n const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n await new Promise((resolve) => setTimeout(resolve, generationDelay));\n }\n this.continuousFetchLoopRunning = false;\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n stopContinuousFetching() {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.placeholder.hide();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n async tryNextAvailableAdWithRateLimit() {\n if (!this.inAdBreak) {\n return;\n }\n const epoch = this.timing.adBreakEpoch;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n return this.tryNextAvailableAd(0);\n }\n async tryNextAvailableAd(retryCount = 0) {\n if (!this.inAdBreak) {\n return;\n }\n const remaining = this.timing.getRemainingAdMs();\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n this.timing.cleanupTemporaryFailures();\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n if (!this.isShowingPlaceholder && remaining > 1e3) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n async playSingleAd(vastTagUrl) {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n this.recreateAdController();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) return;\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n if (this.timing.isTemporaryAdError(playError)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = error?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n async showPlaceholderAndWaitForAds() {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n if (waitTime < 1e3) {\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n for (let i = 0; i < maxChecks; i++) {\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n if (!this.inAdBreak) return;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n handleAdPodComplete() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n this.timing.resetForBreakEnd();\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n this.adRequestQueue = [];\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = void 0;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.adPodQueue = [];\n this.showAds = false;\n this.host.getAdPlayer().stop().catch(() => {\n });\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end \\u2014 hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n this.resumeContentPlayback();\n }\n getBufferedAhead() {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n describeVideoState() {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\"\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}` : \"none\";\n const ranges = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}\\u2013${v.buffered.end(i).toFixed(2)}]`);\n }\n return `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} readyState=${ready} networkState=${net} error=${err} buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`;\n }\n monitorLiveResumeStall(resumeBaseline) {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1e3;\n const graceMs = needsReset ? 8e3 : 5e3;\n const recoveryCooldownMs = needsReset ? 7e3 : 5e3;\n const maxRecoveries = 3;\n const maxMonitorMs = 45e3;\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\"\n ];\n if (this.debug) {\n onMediaEvent = (e) => {\n const dt = ((Date.now() - startTime) / 1e3).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} \\u2014 ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start \\u2014 ${this.describeVideoState()}`\n );\n }\n const cleanup = () => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n const poll = () => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1e3).toFixed(0)}s \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n const canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n window.setTimeout(poll, pollIntervalMs);\n };\n window.setTimeout(poll, pollIntervalMs);\n }\n resumeContentPlayback(attempt = 0) {\n const maxAttempts = 5;\n const video = this.host.video;\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {\n });\n return;\n }\n const onReady = () => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n handleAdFailure() {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n AdBreakOrchestrator\n});\n"]}
1
+ {"version":3,"sources":["d:\\project\\stormcloud-vp\\lib\\player\\AdBreakOrchestrator.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","AdBreakOrchestrator_exports","AdBreakOrchestrator","module","exports","DEFAULT_TRACKING_INGEST_CONFIG","enabled","baseUrl","trackingIngestConfig","isTrackingIngestEnabled","normalizeIngestBaseUrl","replace","buildTrackingIngestUrl","channel","base","ingestPlayerTracking","licenseKey","body","response","error","fetch","method","headers","Authorization","JSON","stringify","ok","console","warn","status","PLAYER_ID_STORAGE_KEY","DEVICE_ID_STORAGE_KEYS","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","gameconsole","stb","settopbox","inferDeviceIdType","navigator","ua","userAgent","test","resolveNativeDeviceId","includeStored","bridgeSignals","readNativeBridgeSignals","platformDevice","readPlatformNativeDeviceId","deviceId","readStoredDeviceId","isMacroPlaceholder","isZeroedAdId","getOrCreateStoredUuid","storageKey","window","existing","readPersistentId","writePersistentId","id","createUuid","readStoredString","readCookie","localStorage","setItem","writeCookie","PERSISTENT_ID_COOKIE_MAX_AGE","document","prefix","encodeURIComponent","parts","cookie","split","part","entry","trim","startsWith","decodeURIComponent","slice","length","bytes","crypto","randomUUID","Uint8Array","getRandomValues","seed","Date","now","Math","floor","performanceNow","i","random","hex","toString","padStart","performance","adinfo","webapis","tifa","getTIFA","lat","isLATEnabled","deviceIdType","limitAdTracking","webOSDev","lgudid","LGUDID","roku","Roku","rida","getPublisherUniqueId","ZEROED_AD_ID_PATTERNS","Set","t","has","toLowerCase","getNativeBridgeSources","source","contentUrl","readBridgeValue","appId","appName","readBridgeBoolean","__STORMCLOUD_CTV_AD_INFO__","__STORMCLOUD_CTV__","stormcloudCtv","AiryTV","Android","webOS","tizen","amazon","filter","Boolean","keys","result","normalized","normalizeBoolean","getItem","cachedBrowserId","buildAnalyticsContext","config","context","debugAdTiming","isLiveStream","inputStreamType","getClientInfo","screen","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","screenInfo","width","height","availWidth","availHeight","orientation","type","pixelDepth","deviceType","brand","os","model","isSmartTV","isAndroid","isWebView","isWebApp","includes","webosMatch","match","tizenMatch","tvMatch","androidModelMatch","outerHeight","outerWidth","matchMedia","matches","standalone","angle","substring","domain","location","hostname","origin","path","pathname","language","languages","join","cookieEnabled","doNotTrack","referrer","visibilityState","sha256Hex","input","encodedData","utf8","buffer","hashBuffer","hash","char","fallbackHash","timestamp","subtle","digest","TextEncoder","encode","unescape","charCodeAt","Array","map","b","abs","padEnd","resolvePlayerIdentitySeed","clientInfo","nativeDeviceId","persistedId","getBrowserID","canPublish","buildPlayerMetricEvent","flags","playerId","captureAt","log","toISOString","player_id","device_type","ad_loaded","adLoaded","ad_detect","adDetect","capture_at","input_stream_type","sendAdLoadedTracking","adLoadedInfo","sendHeartbeat","sendAdImpressionTracking","adImpressionInfo","metricEvent","events","ad_played_count","ad_url","adUrl","heartbeatData","getAdAudioVolume","adPlayer","getOriginalMutedState","getOriginalVolume","host","timing","adConfig","cueManager","placeholder","inAdBreak","showAds","isShowingPlaceholder","adDetectSentForCurrentBreak","continuousFetchingActive","continuousFetchLoopRunning","adRequestQueue","adPodQueue","maxPlaceholderDurationMs","pendingAdBreak","debug","analyticsContext","nextAdRequestUrl","baseVastUrl","remaining","min","getWallClockRemainingAdMs","getDurationBudgetRemainingMs","breakDurationMs","generatePodVastUrl","attachImaEventListeners","getAdPlayer","on","payload","notePodAdStarted","index","total","onAdClick","event","onAdInteraction","adIndex","currentAdIndex","catch","recordPlayedAdDuration","getRemainingAdMs","consecutiveFailures","queuedUrls","hasTimeToStartAnotherAd","tryNextAvailableAdWithRateLimit","handleAdPodComplete","errorPayload","errorMessage","errorCode","code","vastErrorCode","message","cause","innerError","causeMessage","String","handleAdFailure","clearAdFailsafeTimer","clearAdRequestWatchdog","activeAdRequestToken","resetGamNoFillCounter","expectedAdBreakDurationMs","getAdBreakEndWallClockMs","scheduleAdStopAtBreakBoundary","setAdVolume","hidePlaceholder","video","muted","recreateAdController","shouldShowPlaceholder","show","showPlaceholder","preservedMutedState","preservedVolumeState","destroy","continueLiveStreamDuringAds","shouldContinueLiveStreamDuringAds","newAdPlayer","createAdPlayer","setAdPlayer","initialize","updateOriginalMutedState","clearPendingAdBreak","prefetchTimerId","clearTimeout","pendingScte35CueKey","podAssignedByPrefetch","handleAdStart","_marker","scheduled","tags","adBreakDurationMs","mode","currentMuted","currentVolume","podPlayed","findCurrentOrNextBreak","currentTime","consumedVmapBreakIds","add","getAdBreakKey","selectVastTagsForBreak","apiVastTagUrl","durationSeconds","durationMs","failedVastUrls","clear","temporaryFailureUrls","totalAdRequestsInBreak","beginNewAdPod","volume","adBreakPlayedDurationMs","totalAdsInBreak","startOptimizedPod","startContinuousFetching","podUrl","requestToken","podCount","vastUrls","adRequestTokenCounter","startAdRequestWatchdog","enforceGlobalRateLimit","lastAdRequestTime","requestAds","getPodAdCount","vastUrl","startAdFailsafeTimer","play","markAdStarted","isTemporaryAdError","set","continuousFetchLoop","epoch","maxQueueSize","newAdUrl","queuedUrlsPreview","generationDelay","getMinRemainingMsToStartAd","isGamInCooldown","maxConsecutiveFailures","maxTotalAdRequestsPerBreak","Promise","resolve","setTimeout","isUrlInCooldown","push","pow","adBreakEpoch","stopContinuousFetching","hide","backoffMultiplier","backoffDelay","effectiveMinInterval","timeSinceLastRequest","waitTime","backoffBaseMs","maxBackoffMs","minAdRequestIntervalMs","tryNextAvailableAd","retryCount","nextAdUrl","maxRetries","cleanupTemporaryFailures","shift","playSingleAd","showPlaceholderAndWaitForAds","vastTagUrl","ap","playError","isAdPlaying","Error","ensureLoadedAdFitsBudget","rejectLoadedAdForDuration","delete","checkInterval","maxChecks","resetForBreakEnd","activeScte35BreakKey","scheduledScte35BreakKey","stop","restoredMuted","restoredVolume","style","visibility","opacity","requiresMediaPipelineResetAfterAds","reloadLiveStream","monitorLiveResumeStall","liveSyncPos","getLiveSyncPosition","toFixed","restartHlsLoad","resumeContentPlayback","getBufferedAhead","ranges","buffered","start","end","describeVideoState","networkStates","readyStates","v","net","networkState","ready","readyState","err","paused","ended","seeking","resumeBaseline","needsReset","pollIntervalMs","graceMs","recoveryCooldownMs","maxRecoveries","maxMonitorMs","startTime","baseline","recoveries","lastRecoveryAt","listenersAttached","onMediaEvent","diagEvents","e","dt","addEventListener","cleanup","removeEventListener","poll","advanced","playing","elapsed","bufferedAhead","wedged","canRecover","recoverMediaError","reloadPos","attempt","maxAttempts","onReady","backoffMs","playResult","recordGamNoFill","size"],"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/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator_exports = {};\n__export(AdBreakOrchestrator_exports, {\n AdBreakOrchestrator: () => AdBreakOrchestrator\n});\nmodule.exports = __toCommonJS(AdBreakOrchestrator_exports);\n\n// src/utils/trackingIngest.ts\nvar DEFAULT_TRACKING_INGEST_CONFIG = {\n enabled: true,\n baseUrl: \"https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking\"\n};\nvar trackingIngestConfig = {\n ...DEFAULT_TRACKING_INGEST_CONFIG\n};\nfunction isTrackingIngestEnabled() {\n return trackingIngestConfig.enabled === true;\n}\nfunction normalizeIngestBaseUrl(baseUrl) {\n return baseUrl.replace(/\\/+$/, \"\");\n}\nfunction buildTrackingIngestUrl(channel) {\n const base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);\n if (channel === \"impressions\") {\n return `${base}/impressions/ingest`;\n }\n return `${base}/metrics/ingest`;\n}\nasync function ingestPlayerTracking(licenseKey, channel, body) {\n if (!isTrackingIngestEnabled() || !licenseKey) {\n return false;\n }\n try {\n const response = await fetch(buildTrackingIngestUrl(channel), {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: `License-Key ${licenseKey}`\n },\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest failed (${response.status}) for ${channel}`\n );\n return false;\n }\n return true;\n } catch (error) {\n console.warn(\n `[StormcloudVideoPlayer] Tracking ingest error for ${channel}:`,\n error\n );\n return false;\n }\n}\n\n// src/utils/vastEnvironmentSignals.ts\nvar PLAYER_ID_STORAGE_KEY = \"stormcloud.player.id\";\nvar DEVICE_ID_STORAGE_KEYS = [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"advertising_id\",\n \"deviceAdvertisingId\",\n \"aaid\",\n \"adid\",\n \"rida\",\n \"tifa\",\n \"lgudid\"\n];\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};\nfunction inferDeviceIdType() {\n if (typeof navigator === \"undefined\") {\n return void 0;\n }\n const ua = navigator.userAgent;\n if (/Roku/i.test(ua)) return \"rida\";\n if (/Tizen|Samsung/i.test(ua)) return \"tifa\";\n if (/AppleTV|Apple TV/i.test(ua)) return \"tvOS\";\n if (/AFT|Fire TV|Amazon/i.test(ua)) return \"afai\";\n if (/Web0S|webOS|LG Browser|LGSTB|LGE/i.test(ua)) return \"lgudid\";\n if (/Android|Google TV/i.test(ua)) return \"aaid\";\n if (/iPhone|iPad|iPod/i.test(ua)) return \"idfa\";\n return void 0;\n}\nfunction resolveNativeDeviceId(includeStored = true) {\n const bridgeSignals = readNativeBridgeSignals();\n const platformDevice = readPlatformNativeDeviceId();\n const deviceId = bridgeSignals.deviceId || (includeStored ? readStoredDeviceId() : void 0) || platformDevice.deviceId;\n if (!deviceId || isMacroPlaceholder(deviceId) || isZeroedAdId(deviceId)) {\n return void 0;\n }\n return deviceId;\n}\nfunction getOrCreateStoredUuid(storageKey) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n const existing = readPersistentId(storageKey);\n if (existing) {\n writePersistentId(storageKey, existing);\n return existing;\n }\n const id = createUuid();\n writePersistentId(storageKey, id);\n return id;\n}\nfunction readPersistentId(storageKey) {\n return readStoredString(storageKey) || readCookie(storageKey);\n}\nfunction writePersistentId(storageKey, value) {\n try {\n window.localStorage?.setItem(storageKey, value);\n } catch {\n }\n writeCookie(storageKey, value);\n}\nvar PERSISTENT_ID_COOKIE_MAX_AGE = 60 * 60 * 24 * 365 * 5;\nfunction readCookie(name) {\n if (typeof document === \"undefined\") {\n return void 0;\n }\n try {\n const prefix = encodeURIComponent(name) + \"=\";\n const parts = document.cookie ? document.cookie.split(\";\") : [];\n for (const part of parts) {\n const entry = part.trim();\n if (entry.startsWith(prefix)) {\n return decodeURIComponent(entry.slice(prefix.length)) || void 0;\n }\n }\n } catch {\n }\n return void 0;\n}\nfunction writeCookie(name, value) {\n if (typeof document === \"undefined\") {\n return;\n }\n try {\n document.cookie = encodeURIComponent(name) + \"=\" + encodeURIComponent(value) + \";path=/;max-age=\" + PERSISTENT_ID_COOKIE_MAX_AGE + \";SameSite=Lax\";\n } catch {\n }\n}\nfunction createUuid() {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return crypto.randomUUID();\n }\n const bytes = new Uint8Array(16);\n if (typeof crypto !== \"undefined\" && typeof crypto.getRandomValues === \"function\") {\n crypto.getRandomValues(bytes);\n } else {\n let seed = Date.now() ^ Math.floor(performanceNow() * 1e3);\n for (let i = 0; i < 16; i++) {\n seed = seed * 1103515245 + 12345 & 2147483647;\n bytes[i] = (seed ^ Math.floor(Math.random() * 256)) & 255;\n }\n }\n bytes[6] = (bytes[6] ?? 0) & 15 | 64;\n bytes[8] = (bytes[8] ?? 0) & 63 | 128;\n let hex = \"\";\n for (let i = 0; i < 16; i++) {\n hex += (bytes[i] ?? 0).toString(16).padStart(2, \"0\");\n }\n return hex.slice(0, 8) + \"-\" + hex.slice(8, 12) + \"-\" + hex.slice(12, 16) + \"-\" + hex.slice(16, 20) + \"-\" + hex.slice(20, 32);\n}\nfunction performanceNow() {\n try {\n if (typeof performance !== \"undefined\" && typeof performance.now === \"function\") {\n return performance.now();\n }\n } catch {\n }\n return 0;\n}\nfunction readPlatformNativeDeviceId() {\n if (typeof window === \"undefined\") return {};\n try {\n const adinfo = window.webapis?.adinfo;\n if (adinfo) {\n const tifa = typeof adinfo.getTIFA === \"function\" ? adinfo.getTIFA() : adinfo.tifa;\n if (typeof tifa === \"string\" && tifa && !isMacroPlaceholder(tifa)) {\n const lat = typeof adinfo.isLATEnabled === \"function\" ? adinfo.isLATEnabled() : void 0;\n return {\n deviceId: tifa,\n deviceIdType: \"tifa\",\n ...typeof lat === \"boolean\" ? { limitAdTracking: lat } : {}\n };\n }\n }\n } catch {\n }\n try {\n const webOSDev = window.webOSDev;\n if (webOSDev) {\n const lgudid = typeof webOSDev.LGUDID === \"function\" ? webOSDev.LGUDID() : webOSDev.lgudid ?? webOSDev.LGUDID;\n if (typeof lgudid === \"string\" && lgudid) {\n if (isZeroedAdId(lgudid)) {\n return { deviceIdType: \"lgudid\", limitAdTracking: true };\n }\n if (!isMacroPlaceholder(lgudid)) {\n return { deviceId: lgudid, deviceIdType: \"lgudid\", limitAdTracking: false };\n }\n }\n }\n } catch {\n }\n try {\n const roku = window.Roku;\n if (roku) {\n const rida = typeof roku.getPublisherUniqueId === \"function\" ? roku.getPublisherUniqueId() : roku.rida;\n if (typeof rida === \"string\" && rida && !isMacroPlaceholder(rida)) {\n return { deviceId: rida, deviceIdType: \"rida\", limitAdTracking: false };\n }\n }\n } catch {\n }\n return {};\n}\nvar ZEROED_AD_ID_PATTERNS = /* @__PURE__ */ new Set([\n \"38400000-8cf0-11bd-b23e-10b96e40000d\",\n \"00000000-0000-0000-0000-000000000000\"\n]);\nfunction isMacroPlaceholder(value) {\n const t = value.trim();\n return !t || /^(\\[[^\\]]*\\]|\\{[^}]*\\}|%%[^%]*%%)$/.test(t) || /^(unknown|null|undefined|none|n\\/a|\\$\\{[^}]+\\})$/i.test(t) || ZEROED_AD_ID_PATTERNS.has(t.toLowerCase());\n}\nfunction isZeroedAdId(value) {\n return ZEROED_AD_ID_PATTERNS.has(value.trim().toLowerCase());\n}\nfunction readNativeBridgeSignals() {\n for (const source of getNativeBridgeSources()) {\n const contentUrl = readBridgeValue(source, [\"contentUrl\", \"url\", \"videoUrl\", \"canonicalUrl\"]) || void 0;\n const appId = readBridgeValue(source, [\"appId\", \"msid\", \"applicationId\", \"packageName\"]) || void 0;\n const appName = readBridgeValue(source, [\"appName\", \"an\", \"applicationName\"]) || void 0;\n const deviceId = readBridgeValue(source, [\n \"rdid\",\n \"ifa\",\n \"advertisingId\",\n \"adId\",\n \"deviceId\",\n \"lgudid\",\n \"LGUDID\",\n \"tifa\",\n \"rida\",\n \"afai\",\n \"aaid\"\n ]) || void 0;\n if (!contentUrl && !deviceId && !appId && !appName) continue;\n const deviceIdType = readBridgeValue(source, [\n \"idtype\",\n \"deviceIdType\",\n \"advertisingIdType\",\n \"idType\"\n ]) || inferDeviceIdType();\n const limitAdTracking = readBridgeBoolean(source, [\n \"is_lat\",\n \"limitAdTracking\",\n \"limitedAdTracking\",\n \"lat\"\n ]);\n return {\n ...contentUrl ? { contentUrl } : {},\n ...appId ? { appId } : {},\n ...appName ? { appName } : {},\n ...deviceId ? { deviceId } : {},\n ...deviceId && deviceIdType ? { deviceIdType } : {},\n ...deviceId && limitAdTracking != null ? { limitAdTracking } : {}\n };\n }\n return {};\n}\nfunction getNativeBridgeSources() {\n if (typeof window === \"undefined\") {\n return [];\n }\n return [\n window.__STORMCLOUD_CTV_AD_INFO__,\n window.__STORMCLOUD_CTV__,\n window.stormcloudCtv,\n window.AiryTV,\n window.Android,\n window.webOS,\n window.tizen,\n window.amazon\n ].filter(Boolean);\n}\nfunction readBridgeValue(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n if (typeof value === \"string\" && value) {\n return value;\n }\n if (typeof value === \"function\") {\n try {\n const result = value.call(source);\n if (typeof result === \"string\" && result) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readBridgeBoolean(source, keys) {\n for (const key of keys) {\n const value = source?.[key];\n const normalized = normalizeBoolean(value);\n if (normalized != null) {\n return normalized;\n }\n if (typeof value === \"function\") {\n try {\n const result = normalizeBoolean(value.call(source));\n if (result != null) {\n return result;\n }\n } catch {\n }\n }\n }\n return void 0;\n}\nfunction readStoredDeviceId() {\n for (const key of DEVICE_ID_STORAGE_KEYS) {\n const value = readStoredString(key);\n if (value) {\n return value;\n }\n }\n return void 0;\n}\nfunction readStoredString(key) {\n if (typeof window === \"undefined\") {\n return void 0;\n }\n try {\n const value = window.localStorage?.getItem(key);\n return value || void 0;\n } catch {\n return void 0;\n }\n}\nfunction normalizeBoolean(value) {\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"number\") {\n return value === 1;\n }\n if (typeof value === \"string\") {\n const normalized = value.toLowerCase();\n if (normalized === \"1\" || normalized === \"true\" || normalized === \"yes\") {\n return true;\n }\n if (normalized === \"0\" || normalized === \"false\" || normalized === \"no\") {\n return false;\n }\n }\n return void 0;\n}\n\n// src/utils/tracking.ts\nvar cachedBrowserId = null;\nfunction buildAnalyticsContext(config) {\n const context = {};\n if (config.debugAdTiming) {\n context.debugAdTiming = true;\n }\n if (config.isLiveStream !== void 0) {\n context.inputStreamType = config.isLiveStream ? \"live\" : \"vod\";\n }\n return context;\n}\nfunction getClientInfo() {\n const ua = navigator.userAgent;\n const platform = navigator.platform;\n const vendor = navigator.vendor || \"\";\n const maxTouchPoints = navigator.maxTouchPoints || 0;\n const memory = navigator.deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: screen?.orientation?.type || \"\",\n pixelDepth: screen?.pixelDepth\n };\n let deviceType = \"desktop\";\n let brand = \"Unknown\";\n let os = \"Unknown\";\n let model = \"\";\n let isSmartTV = false;\n let isAndroid = false;\n let isWebView = false;\n let isWebApp = false;\n if (ua.includes(\"Web0S\")) {\n brand = \"LG\";\n os = \"webOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n const webosMatch = ua.match(/Web0S\\/([^\\s]+)/);\n model = webosMatch ? `webOS ${webosMatch[1]}` : \"webOS TV\";\n } else if (ua.includes(\"Tizen\")) {\n brand = \"Samsung\";\n os = \"Tizen\";\n isSmartTV = true;\n deviceType = \"tv\";\n const tizenMatch = ua.match(/Tizen\\/([^\\s]+)/);\n const tvMatch = ua.match(/(?:Smart-TV|SMART-TV|TV)/i) ? \"Smart TV\" : \"\";\n model = tizenMatch ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim() : \"Tizen TV\";\n } else if (ua.includes(\"Philips\")) {\n brand = \"Philips\";\n os = \"Saphi\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Sharp\") || ua.includes(\"AQUOS\")) {\n brand = \"Sharp\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"Android\") && (ua.includes(\"NetCast\") || ua.includes(\"LG\"))) {\n brand = \"LG\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\" Roku\") || ua.includes(\"Roku/\")) {\n brand = \"Roku\";\n os = \"Roku OS\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (ua.includes(\"AppleTV\")) {\n brand = \"Apple\";\n os = \"tvOS\";\n isSmartTV = true;\n deviceType = \"tv\";\n }\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n if (ua.includes(\"Android\") && (maxTouchPoints === 0 || ua.includes(\"Google TV\") || ua.includes(\"XiaoMi\"))) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\n }\n if (/iPad|iPhone|iPod/.test(ua)) {\n os = \"iOS\";\n deviceType = \"mobile\";\n brand = \"Apple\";\n if (navigator.maxTouchPoints > 1 && /iPad/.test(ua)) {\n deviceType = \"tablet\";\n }\n }\n if (!isAndroid && !isSmartTV && !/Mobile/.test(ua)) {\n if (ua.includes(\"Windows\")) {\n os = \"Windows\";\n deviceType = \"desktop\";\n } else if (ua.includes(\"Mac\") && !/iPhone/.test(ua)) {\n os = \"macOS\";\n deviceType = \"desktop\";\n if (maxTouchPoints > 1) deviceType = \"tablet\";\n } else if (ua.includes(\"Linux\")) {\n os = \"Linux\";\n deviceType = \"desktop\";\n }\n }\n if (brand === \"Unknown\") {\n if (vendor.includes(\"Google\") || ua.includes(\"Chrome\")) brand = \"Google\";\n if (vendor.includes(\"Apple\")) brand = \"Apple\";\n if (vendor.includes(\"Samsung\") || ua.includes(\"SM-\")) brand = \"Samsung\";\n }\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n isWebApp = window.matchMedia(\"(display-mode: standalone)\").matches || window.navigator.standalone === true || window.screen?.orientation?.angle !== void 0;\n return {\n brand,\n os,\n model: model || ua.substring(0, 50) + \"...\",\n deviceType,\n isSmartTV,\n isAndroid,\n isWebView,\n isWebApp,\n domain: window.location.hostname,\n origin: window.location.origin,\n path: window.location.pathname,\n userAgent: ua,\n vendor,\n platform,\n screen: screenInfo,\n hardwareConcurrency,\n deviceMemory: memory,\n maxTouchPoints,\n language: navigator.language,\n languages: navigator.languages?.join(\",\") || \"\",\n cookieEnabled: navigator.cookieEnabled,\n doNotTrack: navigator.doNotTrack || \"\",\n referrer: document.referrer,\n visibilityState: document.visibilityState\n };\n}\nasync function sha256Hex(input) {\n if (typeof crypto !== \"undefined\" && crypto.subtle?.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n let encodedData;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(input);\n } else {\n const utf8 = unescape(encodeURIComponent(input));\n const buffer = new Uint8Array(utf8.length);\n for (let i = 0; i < utf8.length; i++) {\n buffer[i] = utf8.charCodeAt(i);\n }\n encodedData = buffer;\n }\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n return Array.from(new Uint8Array(hashBuffer)).map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } catch {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < input.length; i++) {\n const char = input.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\n const fallbackHash = Math.abs(hash).toString(16).padStart(8, \"0\");\n const timestamp = Date.now().toString(16).padStart(12, \"0\");\n const random = Math.random().toString(16).substring(2, 14).padStart(12, \"0\");\n return (fallbackHash + timestamp + random).padEnd(64, \"0\");\n}\nfunction resolvePlayerIdentitySeed(clientInfo) {\n const nativeDeviceId = resolveNativeDeviceId(clientInfo.isSmartTV);\n if (nativeDeviceId) {\n return `device:${nativeDeviceId}`;\n }\n const persistedId = getOrCreateStoredUuid(PLAYER_ID_STORAGE_KEY);\n if (persistedId) {\n return `persisted:${persistedId}`;\n }\n return `fingerprint:${JSON.stringify(clientInfo)}`;\n}\nasync function getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n cachedBrowserId = await sha256Hex(resolvePlayerIdentitySeed(clientInfo));\n return cachedBrowserId;\n}\nfunction canPublish(licenseKey) {\n return Boolean(isTrackingIngestEnabled() && licenseKey);\n}\nasync function buildPlayerMetricEvent(context = {}, flags = {}) {\n const clientInfo = getClientInfo();\n const debugAdTiming = !!context.debugAdTiming;\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] clientInfo: \", JSON.stringify(clientInfo, null, 2));\n }\n const playerId = await getBrowserID(clientInfo);\n if (debugAdTiming) {\n console.log(\"[StormcloudVideoPlayer] playerId: \", playerId);\n }\n const captureAt = flags.captureAt ?? (/* @__PURE__ */ new Date()).toISOString();\n return {\n player_id: playerId,\n device_type: clientInfo.deviceType,\n os: clientInfo.os.toLowerCase(),\n ad_loaded: flags.adLoaded ?? false,\n ad_detect: flags.adDetect ?? false,\n capture_at: captureAt,\n ...context.inputStreamType ? { input_stream_type: context.inputStreamType } : {}\n };\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo, context = {}) {\n try {\n await sendHeartbeat(licenseKey, context, {\n adLoaded: true,\n captureAt: adLoadedInfo.timestamp\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo, context = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const metricEvent = await buildPlayerMetricEvent(context, {\n captureAt: adImpressionInfo.timestamp\n });\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [metricEvent]\n });\n await ingestPlayerTracking(licenseKey, \"impressions\", {\n events: [\n {\n player_id: metricEvent.player_id,\n ad_played_count: 1,\n ad_url: adImpressionInfo.adUrl,\n capture_at: adImpressionInfo.timestamp\n }\n ]\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey, context = {}, flags = {}) {\n if (!canPublish(licenseKey)) return;\n try {\n const heartbeatData = await buildPlayerMetricEvent(context, flags);\n await ingestPlayerTracking(licenseKey, \"metrics\", {\n events: [heartbeatData]\n });\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n\n// src/player/PlayerControls.ts\nfunction getAdAudioVolume(adPlayer) {\n return adPlayer.getOriginalMutedState() ? 0 : adPlayer.getOriginalVolume();\n}\n\n// src/player/AdBreakOrchestrator.ts\nvar AdBreakOrchestrator = class {\n constructor(host, timing, adConfig, cueManager, placeholder) {\n this.inAdBreak = false;\n this.showAds = false;\n this.isShowingPlaceholder = false;\n this.adDetectSentForCurrentBreak = false;\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.adRequestQueue = [];\n this.adPodQueue = [];\n this.maxPlaceholderDurationMs = 5e3;\n this.pendingAdBreak = null;\n this.host = host;\n this.timing = timing;\n this.adConfig = adConfig;\n this.cueManager = cueManager;\n this.placeholder = placeholder;\n }\n get debug() {\n return !!this.host.config.debugAdTiming;\n }\n get analyticsContext() {\n return buildAnalyticsContext(this.host.config);\n }\n // ───────────────────────────────────────────────────────────────\n // IMA event listeners\n // ───────────────────────────────────────────────────────────────\n nextAdRequestUrl(baseVastUrl) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n const breakDurationMs = remaining > 0 ? remaining : void 0;\n return this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n attachImaEventListeners() {\n const adPlayer = this.host.getAdPlayer();\n adPlayer.on(\"pod_ad_started\", (payload) => {\n this.timing.notePodAdStarted();\n if (this.debug) {\n console.log(\n `[POD] Playing pod ad ${payload?.index != null ? payload.index + 1 : \"?\"}/${payload?.total ?? \"?\"}`\n );\n }\n });\n adPlayer.on(\"ad_click\", () => {\n this.host.onAdClick();\n });\n adPlayer.on(\"ad_interaction\", (event) => {\n if (event) this.host.onAdInteraction(event);\n });\n adPlayer.on(\"all_ads_completed\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n this.timing.consecutiveFailures = 0;\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] all_ads_completed event received - remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.inAdBreak) {\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n }\n });\n adPlayer.on(\"ad_error\", (errorPayload) => {\n let errorMessage = \"Ad playback failed\";\n if (errorPayload) {\n const errorCode = errorPayload.code || errorPayload.errorCode || \"unknown\";\n const vastErrorCode = errorPayload.vastErrorCode;\n const message = errorPayload.message || errorPayload.errorMessage || \"Unknown error\";\n const cause = errorPayload.cause || errorPayload.innerError || errorPayload.error;\n errorMessage = `Ad error: AdError ${errorCode}: ${message}`;\n if (vastErrorCode && vastErrorCode !== \"N/A\" && vastErrorCode !== errorCode) {\n errorMessage += ` (VAST Error Code: ${vastErrorCode})`;\n }\n if (cause) {\n const causeMessage = typeof cause === \"string\" ? cause : cause.message || String(cause);\n errorMessage += `. Caused by: ${causeMessage}`;\n }\n }\n console.error(\"[AD-ERROR]\", errorMessage, errorPayload || \"\");\n this.handleAdFailure();\n });\n adPlayer.on(\"content_pause\", () => {\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = true;\n this.timing.resetGamNoFillCounter();\n if (this.inAdBreak && this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Starting ad break timer on content_pause (first ad starting)\");\n }\n }\n this.host.getAdPlayer().setAdVolume(getAdAudioVolume(this.host.getAdPlayer()));\n if (this.isShowingPlaceholder) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Hiding placeholder - new ads starting\");\n }\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n });\n adPlayer.on(\"content_resume\", () => {\n sendAdImpressionTracking(\n this.host.config.licenseKey,\n { source: \"hls\", adIndex: this.timing.currentAdIndex, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n if (!this.host.video.muted) {\n this.host.video.muted = true;\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Muted video on content_resume (ad ended, gap between ads)\");\n }\n }\n this.timing.clearAdFailsafeTimer();\n this.timing.clearAdRequestWatchdog();\n this.timing.activeAdRequestToken = null;\n this.showAds = false;\n if (!this.inAdBreak) {\n return;\n }\n this.timing.consecutiveFailures = 0;\n this.timing.recordPlayedAdDuration(this.host.getAdPlayer());\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] content_resume event: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n this.handleAdPodComplete();\n }\n });\n }\n recreateAdController() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Recreating AdController for new ad\");\n }\n const shouldShowPlaceholder = this.inAdBreak && this.showAds;\n const adPlayer = this.host.getAdPlayer();\n if (shouldShowPlaceholder && adPlayer) {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Showing placeholder before destroying old AdController\");\n }\n this.placeholder.show();\n adPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n const preservedMutedState = adPlayer.getOriginalMutedState();\n const preservedVolumeState = adPlayer.getOriginalVolume();\n if (adPlayer) {\n try {\n adPlayer.destroy();\n this.host.video.muted = true;\n } catch (error) {\n if (this.debug) {\n console.warn(\"[StormcloudVideoPlayer] Error destroying old AdController:\", error);\n }\n }\n }\n const continueLiveStreamDuringAds = this.host.shouldContinueLiveStreamDuringAds();\n const newAdPlayer = this.host.createAdPlayer(continueLiveStreamDuringAds);\n this.host.setAdPlayer(newAdPlayer);\n newAdPlayer.initialize();\n newAdPlayer.updateOriginalMutedState(preservedMutedState, preservedVolumeState);\n this.attachImaEventListeners();\n if (shouldShowPlaceholder) {\n this.placeholder.show();\n newAdPlayer.showPlaceholder();\n this.isShowingPlaceholder = true;\n }\n }\n clearPendingAdBreak() {\n if (this.prefetchTimerId != null) {\n clearTimeout(this.prefetchTimerId);\n this.prefetchTimerId = void 0;\n }\n this.pendingAdBreak = null;\n this.cueManager.pendingScte35CueKey = void 0;\n this.adConfig.podAssignedByPrefetch = false;\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break start\n // ───────────────────────────────────────────────────────────────\n async handleAdStart(_marker) {\n const scheduled = this.adConfig.findCurrentOrNextBreak(\n this.host.video.currentTime * 1e3\n );\n if (scheduled) {\n this.adConfig.consumedVmapBreakIds.add(this.adConfig.getAdBreakKey(scheduled));\n }\n const tags = this.adConfig.selectVastTagsForBreak(scheduled);\n let baseVastUrl;\n if (tags && tags.length > 0 && tags[0]) {\n baseVastUrl = tags[0];\n } else if (this.adConfig.apiVastTagUrl) {\n baseVastUrl = this.adConfig.apiVastTagUrl;\n } else {\n this.clearPendingAdBreak();\n return;\n }\n const adBreakDurationMs = _marker.durationSeconds != null ? _marker.durationSeconds * 1e3 : scheduled?.durationMs;\n if (this.debug) {\n const mode = this.host.config.isLiveStream ? \"LIVE\" : \"VOD\";\n console.log(\n `[CONTINUOUS-FETCH] ${mode} MODE: Target duration=${adBreakDurationMs}ms`\n );\n }\n this.timing.failedVastUrls.clear();\n this.timing.temporaryFailureUrls.clear();\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.isShowingPlaceholder = false;\n this.timing.totalAdRequestsInBreak = 0;\n if (this.adConfig.podAssignedByPrefetch) {\n this.adConfig.podAssignedByPrefetch = false;\n } else {\n this.adConfig.beginNewAdPod();\n }\n const currentMuted = this.host.video.muted;\n const currentVolume = this.host.video.volume;\n this.host.getAdPlayer().updateOriginalMutedState(currentMuted, currentVolume);\n this.inAdBreak = true;\n this.timing.adBreakPlayedDurationMs = 0;\n this.timing.currentAdIndex = 0;\n this.timing.totalAdsInBreak = 0;\n this.adPodQueue = [];\n this.showAds = false;\n if (this.timing.expectedAdBreakDurationMs == null && adBreakDurationMs != null) {\n this.timing.expectedAdBreakDurationMs = adBreakDurationMs;\n }\n const podPlayed = await this.startOptimizedPod(\n baseVastUrl,\n adBreakDurationMs,\n currentMuted,\n currentVolume\n );\n if (!podPlayed) {\n if (this.debug) {\n console.log(\"[POD] Initial pod request did not fill; attempting top-up pod request\");\n }\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n await this.tryNextAvailableAdWithRateLimit();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Optimized pod (single multi-ad request)\n // ───────────────────────────────────────────────────────────────\n async startOptimizedPod(baseVastUrl, breakDurationMs, currentMuted, currentVolume) {\n let podUrl;\n if (this.pendingAdBreak && this.pendingAdBreak.vastUrls.length > 0) {\n podUrl = this.pendingAdBreak.vastUrls[0];\n this.clearPendingAdBreak();\n } else {\n podUrl = this.host.generatePodVastUrl(baseVastUrl, breakDurationMs);\n }\n if (!podUrl) {\n return false;\n }\n this.continuousFetchingActive = false;\n this.recreateAdController();\n const adPlayer = this.host.getAdPlayer();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n await adPlayer.requestAds(podUrl);\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) {\n return true;\n }\n const podCount = adPlayer.getPodAdCount?.() ?? 1;\n if (podCount < 1) {\n return false;\n }\n if (this.debug) {\n console.log(\n podCount === 1 ? \"[POD] Response contained a single ad; playing it and enabling pod top-up\" : `[POD] Optimized pod returned ${podCount} ads; playing pod in one controller`\n );\n }\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: podUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.startAdFailsafeTimer(requestToken);\n await adPlayer.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n adPlayer.setAdVolume(currentMuted ? 0 : currentVolume);\n this.timing.consecutiveFailures = 0;\n this.continuousFetchingActive = true;\n this.startContinuousFetching(baseVastUrl);\n return true;\n } catch (error) {\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n if (this.debug) {\n console.warn(\"[POD] Optimized pod request/play failed:\", error);\n }\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(podUrl, Date.now());\n }\n this.continuousFetchingActive = true;\n this.recreateAdController();\n return false;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Continuous fetching\n // ───────────────────────────────────────────────────────────────\n startContinuousFetching(baseVastUrl) {\n if (!this.continuousFetchingActive) {\n return;\n }\n if (this.continuousFetchLoopRunning) {\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Fetch loop already running, skipping duplicate start\");\n }\n return;\n }\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Starting continuous ad fetching loop\");\n }\n this.continuousFetchLoopRunning = true;\n this.continuousFetchLoop(baseVastUrl);\n }\n async continuousFetchLoop(baseVastUrl) {\n const epoch = this.timing.adBreakEpoch;\n while (this.continuousFetchingActive && this.inAdBreak && epoch === this.timing.adBreakEpoch) {\n const remaining = Math.min(\n this.timing.getWallClockRemainingAdMs(),\n this.timing.getDurationBudgetRemainingMs()\n );\n if (remaining <= this.timing.getMinRemainingMsToStartAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough ad break time left (wall=${this.timing.getWallClockRemainingAdMs()}ms, budget=${this.timing.getDurationBudgetRemainingMs()}ms), stopping URL generation`);\n }\n break;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, stopping URL generation\");\n }\n break;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), stopping URL generation`);\n }\n break;\n }\n if (this.timing.totalAdRequestsInBreak >= this.timing.maxTotalAdRequestsPerBreak) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Maximum ad requests reached (${this.timing.maxTotalAdRequestsPerBreak}), stopping`);\n }\n break;\n }\n const maxQueueSize = 5;\n if (this.adRequestQueue.length >= maxQueueSize) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] URL queue full (${this.adRequestQueue.length}), waiting...`);\n }\n await new Promise((resolve) => setTimeout(resolve, 1e3));\n continue;\n }\n const newAdUrl = this.nextAdRequestUrl(baseVastUrl);\n if (!newAdUrl || this.timing.failedVastUrls.has(newAdUrl) || this.timing.isUrlInCooldown(newAdUrl)) {\n await new Promise((resolve) => setTimeout(resolve, 500));\n continue;\n }\n if (this.debug) {\n const queuedUrlsPreview = [...this.adRequestQueue, newAdUrl];\n console.log(\n `[CONTINUOUS-FETCH] Queued VAST URL (queue size: ${queuedUrlsPreview.length})`,\n { queuedUrls: queuedUrlsPreview }\n );\n }\n this.adRequestQueue.push(newAdUrl);\n const generationDelay = this.timing.consecutiveFailures > 0 ? Math.min(1e3 * Math.pow(2, this.timing.consecutiveFailures), 5e3) : 500;\n await new Promise((resolve) => setTimeout(resolve, generationDelay));\n }\n this.continuousFetchLoopRunning = false;\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] URL generation loop ended (queued: ${this.adRequestQueue.length})`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n }\n stopContinuousFetching() {\n this.continuousFetchingActive = false;\n this.continuousFetchLoopRunning = false;\n this.placeholder.hide();\n if (this.debug) {\n console.log(\"[CONTINUOUS-FETCH] Stopping continuous ad fetching\");\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Ad iteration\n // ───────────────────────────────────────────────────────────────\n async tryNextAvailableAdWithRateLimit() {\n if (!this.inAdBreak) {\n return;\n }\n const epoch = this.timing.adBreakEpoch;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n }\n this.handleAdPodComplete();\n return;\n }\n const backoffMultiplier = Math.pow(2, this.timing.consecutiveFailures);\n const backoffDelay = Math.min(this.timing.backoffBaseMs * backoffMultiplier, this.timing.maxBackoffMs);\n const effectiveMinInterval = this.timing.minAdRequestIntervalMs + (this.timing.consecutiveFailures > 0 ? backoffDelay : 0);\n const timeSinceLastRequest = Date.now() - this.timing.lastAdRequestTime;\n if (timeSinceLastRequest < effectiveMinInterval) {\n const waitTime = effectiveMinInterval - timeSinceLastRequest;\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Rate limiting: waiting ${waitTime}ms before next request (backoff: ${this.timing.consecutiveFailures} failures)`);\n }\n await new Promise((resolve) => setTimeout(resolve, waitTime));\n }\n if (!this.inAdBreak || epoch !== this.timing.adBreakEpoch) {\n return;\n }\n return this.tryNextAvailableAd(0);\n }\n async tryNextAvailableAd(retryCount = 0) {\n if (!this.inAdBreak) {\n return;\n }\n const remaining = this.timing.getRemainingAdMs();\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Not enough time remaining (${remaining}ms) to start another ad, ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) {\n console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, ending ad break gracefully\");\n }\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Too many consecutive failures (${this.timing.consecutiveFailures}), ending ad break`);\n }\n this.handleAdPodComplete();\n return;\n }\n this.timing.cleanupTemporaryFailures();\n while (this.adRequestQueue.length > 0) {\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping permanently-failed URL, trying next...\");\n continue;\n }\n if (this.timing.isUrlInCooldown(nextAdUrl)) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping URL in cooldown (recent no-fill), trying next...\");\n continue;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Requesting next ad via HLS ad player (${this.timing.currentAdIndex + 1}, ${this.adRequestQueue.length} remaining in queue)`);\n }\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad request failed:\", errorMessage);\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n const maxRetries = 3;\n if (this.continuousFetchingActive && retryCount < maxRetries && remaining > 2e3) {\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Queue empty, waiting for URLs... (${retryCount + 1}/${maxRetries})`);\n }\n await new Promise((resolve) => setTimeout(resolve, 500));\n await this.tryNextAvailableAd(retryCount + 1);\n return;\n }\n if (!this.isShowingPlaceholder && remaining > 1e3) {\n this.showPlaceholderAndWaitForAds();\n } else {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] No more ads available, ending ad break\");\n this.handleAdPodComplete();\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Single ad playback\n // ───────────────────────────────────────────────────────────────\n async playSingleAd(vastTagUrl) {\n const adPlayer = this.host.getAdPlayer();\n if (adPlayer.isAdPlaying()) return;\n if (this.timing.failedVastUrls.has(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping permanently-failed VAST URL:\", vastTagUrl);\n throw new Error(\"VAST URL permanently failed\");\n }\n if (this.timing.isUrlInCooldown(vastTagUrl)) {\n if (this.debug) console.warn(\"[AD-ERROR] Skipping URL in cooldown (recent no-fill):\", vastTagUrl);\n throw new Error(\"VAST URL in cooldown after no-fill\");\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.warn(\"[AD-ERROR] Too many consecutive failures, not requesting more ads\");\n throw new Error(\"Too many consecutive failures\");\n }\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.warn(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping ad request\");\n throw new Error(\"GAM in cooldown\");\n }\n this.recreateAdController();\n const requestToken = ++this.timing.adRequestTokenCounter;\n this.timing.activeAdRequestToken = requestToken;\n this.timing.startAdRequestWatchdog(requestToken);\n try {\n await this.timing.enforceGlobalRateLimit();\n this.timing.lastAdRequestTime = Date.now();\n const ap = this.host.getAdPlayer();\n await ap.requestAds(vastTagUrl);\n sendAdLoadedTracking(\n this.host.config.licenseKey,\n { source: \"hls\", vastUrl: vastTagUrl, timestamp: (/* @__PURE__ */ new Date()).toISOString() },\n this.analyticsContext\n ).catch(() => {\n });\n this.timing.clearAdRequestWatchdog();\n if (this.timing.activeAdRequestToken !== requestToken) return;\n if (!this.timing.ensureLoadedAdFitsBudget(ap)) {\n this.timing.rejectLoadedAdForDuration(ap);\n this.recreateAdController();\n throw new Error(\"ad_duration_exceeds_budget\");\n }\n try {\n this.timing.startAdFailsafeTimer(requestToken);\n await ap.play();\n this.timing.markAdStarted();\n if (this.timing.expectedAdBreakDurationMs != null && this.timing.getAdBreakEndWallClockMs() == null) {\n this.timing.scheduleAdStopAtBreakBoundary();\n }\n ap.setAdVolume(getAdAudioVolume(ap));\n this.timing.consecutiveFailures = 0;\n this.timing.temporaryFailureUrls.delete(vastTagUrl);\n } catch (playError) {\n if (this.debug) console.error(\"[AD-ERROR] Failed to play ad:\", playError);\n if (this.timing.isTemporaryAdError(playError)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary play error - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent play error - URL blacklisted\");\n }\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw playError;\n }\n } catch (error) {\n const errorMessage = error?.message || \"\";\n if (this.debug) console.error(\"[AD-ERROR] Ad request failed:\", errorMessage);\n if (this.timing.isTemporaryAdError(error)) {\n this.timing.temporaryFailureUrls.set(vastTagUrl, Date.now());\n if (this.debug) console.log(\"[AD-ERROR] Temporary error (no-fill/timeout) - URL can be retried after cooldown\");\n } else {\n this.timing.failedVastUrls.add(vastTagUrl);\n if (this.debug) console.log(\"[AD-ERROR] Permanent error - URL blacklisted:\", errorMessage);\n }\n this.timing.clearAdRequestWatchdog();\n this.timing.clearAdFailsafeTimer();\n if (this.timing.activeAdRequestToken === requestToken) {\n this.timing.activeAdRequestToken = null;\n }\n throw error;\n }\n }\n // ───────────────────────────────────────────────────────────────\n // Placeholder wait\n // ───────────────────────────────────────────────────────────────\n async showPlaceholderAndWaitForAds() {\n const remaining = this.timing.getRemainingAdMs();\n const waitTime = Math.min(this.maxPlaceholderDurationMs, remaining);\n if (this.timing.isGamInCooldown()) {\n if (this.debug) console.log(\"[CIRCUIT-BREAKER] GAM in cooldown, skipping placeholder wait\");\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Skipping placeholder - too many consecutive failures\");\n this.handleAdPodComplete();\n return;\n }\n if (waitTime < 1e3) {\n this.handleAdPodComplete();\n return;\n }\n if (this.debug) {\n console.log(`[CONTINUOUS-FETCH] Showing placeholder for ${waitTime}ms while waiting for ad URLs`);\n }\n this.isShowingPlaceholder = true;\n this.host.getAdPlayer().showPlaceholder();\n const checkInterval = 300;\n const maxChecks = Math.floor(waitTime / checkInterval);\n for (let i = 0; i < maxChecks; i++) {\n await new Promise((resolve) => setTimeout(resolve, checkInterval));\n if (!this.inAdBreak) return;\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Too many failures during placeholder wait\");\n break;\n }\n if (!this.timing.hasTimeToStartAnotherAd()) {\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Not enough time remaining during placeholder wait, ending ad break\");\n break;\n }\n while (this.adRequestQueue.length > 0) {\n if (!this.timing.hasTimeToStartAnotherAd()) break;\n const nextAdUrl = this.adRequestQueue.shift();\n if (!nextAdUrl) continue;\n if (this.timing.failedVastUrls.has(nextAdUrl)) continue;\n if (this.timing.isUrlInCooldown(nextAdUrl)) continue;\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Ad URL available, requesting via HLS ad player\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n try {\n await this.playSingleAd(nextAdUrl);\n this.timing.consecutiveFailures = 0;\n } catch (error) {\n const errorMessage = error.message;\n if (errorMessage.includes(\"ad_duration_exceeds_budget\")) {\n await this.tryNextAvailableAdWithRateLimit();\n return;\n }\n if (!errorMessage.includes(\"permanently failed\") && !errorMessage.includes(\"in cooldown\")) {\n this.timing.consecutiveFailures++;\n }\n await this.tryNextAvailableAdWithRateLimit();\n }\n return;\n }\n }\n if (this.debug) console.log(\"[CONTINUOUS-FETCH] Placeholder timeout, ending ad break\");\n this.isShowingPlaceholder = false;\n this.host.getAdPlayer().hidePlaceholder();\n this.handleAdPodComplete();\n }\n // ───────────────────────────────────────────────────────────────\n // Ad break completion\n // ───────────────────────────────────────────────────────────────\n handleAdPodComplete() {\n if (this.debug) {\n console.log(\"[StormcloudVideoPlayer] Ad pod complete - cleaning up\");\n }\n this.timing.resetForBreakEnd();\n this.stopContinuousFetching();\n this.clearPendingAdBreak();\n if (this.isShowingPlaceholder) {\n this.host.getAdPlayer().hidePlaceholder();\n this.isShowingPlaceholder = false;\n }\n this.adRequestQueue = [];\n this.inAdBreak = false;\n this.adDetectSentForCurrentBreak = false;\n this.cueManager.activeScte35BreakKey = void 0;\n this.cueManager.scheduledScte35BreakKey = void 0;\n this.adPodQueue = [];\n this.showAds = false;\n this.host.getAdPlayer().stop().catch(() => {\n });\n const restoredMuted = this.host.getAdPlayer().getOriginalMutedState();\n const restoredVolume = this.host.getAdPlayer().getOriginalVolume();\n if (this.host.video.muted !== restoredMuted) {\n this.host.video.muted = restoredMuted;\n }\n if (Math.abs(this.host.video.volume - restoredVolume) > 0.01) {\n this.host.video.volume = restoredVolume;\n }\n this.host.video.style.visibility = \"visible\";\n this.host.video.style.opacity = \"1\";\n if (this.host.isLiveStream()) {\n if (this.host.requiresMediaPipelineResetAfterAds()) {\n if (this.debug) {\n console.log(\n \"[StormcloudVideoPlayer] Live break end \\u2014 hard-reloading stream to reacquire decoder (single-decoder platform)\"\n );\n }\n this.host.reloadLiveStream();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n const liveSyncPos = this.host.getLiveSyncPosition();\n if (liveSyncPos != null && liveSyncPos > this.host.video.currentTime) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live break end \\u2014 snapping to live edge: ${this.host.video.currentTime.toFixed(2)}s \\u2192 ${liveSyncPos.toFixed(2)}s`\n );\n }\n this.host.video.currentTime = liveSyncPos;\n this.host.restartHlsLoad(liveSyncPos);\n }\n this.resumeContentPlayback();\n this.monitorLiveResumeStall(this.host.video.currentTime);\n return;\n }\n this.resumeContentPlayback();\n }\n getBufferedAhead() {\n const video = this.host.video;\n const t = video.currentTime;\n const ranges = video.buffered;\n for (let i = 0; i < ranges.length; i++) {\n if (t >= ranges.start(i) - 0.5 && t <= ranges.end(i)) {\n return ranges.end(i) - t;\n }\n }\n return 0;\n }\n describeVideoState() {\n const v = this.host.video;\n const networkStates = [\"EMPTY\", \"IDLE\", \"LOADING\", \"NO_SOURCE\"];\n const readyStates = [\n \"HAVE_NOTHING\",\n \"HAVE_METADATA\",\n \"HAVE_CURRENT_DATA\",\n \"HAVE_FUTURE_DATA\",\n \"HAVE_ENOUGH_DATA\"\n ];\n const net = networkStates[v.networkState] ?? String(v.networkState);\n const ready = readyStates[v.readyState] ?? String(v.readyState);\n const err = v.error ? `code=${v.error.code}${v.error.message ? ` (${v.error.message})` : \"\"}` : \"none\";\n const ranges = [];\n for (let i = 0; i < v.buffered.length; i++) {\n ranges.push(`[${v.buffered.start(i).toFixed(2)}\\u2013${v.buffered.end(i).toFixed(2)}]`);\n }\n return `t=${v.currentTime.toFixed(2)}s paused=${v.paused} ended=${v.ended} seeking=${v.seeking} readyState=${ready} networkState=${net} error=${err} buffered=${ranges.length ? ranges.join(\",\") : \"none\"}`;\n }\n monitorLiveResumeStall(resumeBaseline) {\n const needsReset = this.host.requiresMediaPipelineResetAfterAds();\n const pollIntervalMs = 1e3;\n const graceMs = needsReset ? 8e3 : 5e3;\n const recoveryCooldownMs = needsReset ? 7e3 : 5e3;\n const maxRecoveries = 3;\n const maxMonitorMs = 45e3;\n const startTime = Date.now();\n let baseline = resumeBaseline;\n let recoveries = 0;\n let lastRecoveryAt = 0;\n const video = this.host.video;\n let listenersAttached = false;\n let onMediaEvent;\n const diagEvents = [\n \"loadstart\",\n \"loadedmetadata\",\n \"loadeddata\",\n \"canplay\",\n \"canplaythrough\",\n \"play\",\n \"playing\",\n \"pause\",\n \"waiting\",\n \"stalled\",\n \"suspend\",\n \"seeking\",\n \"seeked\",\n \"emptied\",\n \"error\",\n \"ended\"\n ];\n if (this.debug) {\n onMediaEvent = (e) => {\n const dt = ((Date.now() - startTime) / 1e3).toFixed(1);\n console.log(\n `[ResumeDiag] +${dt}s event=${e.type} \\u2014 ${this.describeVideoState()}`\n );\n };\n for (const name of diagEvents) {\n video.addEventListener(name, onMediaEvent);\n }\n listenersAttached = true;\n console.log(\n `[ResumeDiag] +0.0s monitor start \\u2014 ${this.describeVideoState()}`\n );\n }\n const cleanup = () => {\n if (listenersAttached && onMediaEvent) {\n for (const name of diagEvents) {\n video.removeEventListener(name, onMediaEvent);\n }\n listenersAttached = false;\n }\n };\n const poll = () => {\n if (this.inAdBreak) {\n cleanup();\n return;\n }\n const currentTime = video.currentTime;\n const advanced = currentTime > baseline + 0.5;\n const playing = !video.paused && video.readyState >= 3;\n if (advanced && playing) {\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Live stream resumed successfully after ad break \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n const elapsed = Date.now() - startTime;\n const bufferedAhead = this.getBufferedAhead();\n const wedged = bufferedAhead < 0.5 && !advanced;\n if (elapsed >= maxMonitorMs) {\n if (this.debug && !advanced) {\n console.warn(\n `[StormcloudVideoPlayer] Live stream failed to resume after ${(maxMonitorMs / 1e3).toFixed(0)}s \\u2014 ${this.describeVideoState()}`\n );\n }\n cleanup();\n return;\n }\n const canRecover = wedged && elapsed >= graceMs && Date.now() - lastRecoveryAt >= recoveryCooldownMs && recoveries < maxRecoveries;\n if (canRecover) {\n recoveries++;\n lastRecoveryAt = Date.now();\n if (needsReset) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n } else if (recoveries === 1) {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 calling recoverMediaError() (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.recoverMediaError();\n } else if (recoveries === 2) {\n const liveSyncPos = this.host.getLiveSyncPosition();\n const reloadPos = liveSyncPos != null && liveSyncPos > currentTime ? liveSyncPos : currentTime;\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content wedged after ad break \\u2014 restarting HLS load at ${reloadPos.toFixed(2)}s (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n if (liveSyncPos != null && liveSyncPos > currentTime) {\n video.currentTime = liveSyncPos;\n }\n this.host.restartHlsLoad(reloadPos);\n } else {\n if (this.debug) {\n console.warn(\n `[StormcloudVideoPlayer] Content still wedged after ad break \\u2014 hard-reloading live stream (recovery ${recoveries}/${maxRecoveries}) \\u2014 ${this.describeVideoState()}`\n );\n }\n this.host.reloadLiveStream();\n }\n baseline = video.currentTime;\n if (video.paused) {\n video.play()?.catch(() => {\n });\n }\n }\n window.setTimeout(poll, pollIntervalMs);\n };\n window.setTimeout(poll, pollIntervalMs);\n }\n resumeContentPlayback(attempt = 0) {\n const maxAttempts = 5;\n const video = this.host.video;\n if (!video.paused) {\n if (this.debug && attempt === 0) {\n console.log(\"[StormcloudVideoPlayer] Content video already playing after ads\");\n }\n return;\n }\n if (this.debug) {\n console.log(\n `[StormcloudVideoPlayer] Resuming content playback after ads (attempt ${attempt + 1}/${maxAttempts}, readyState=${video.readyState})`\n );\n }\n if (video.readyState < 3) {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] readyState never reached HAVE_FUTURE_DATA, forcing play()\"\n );\n }\n video.play()?.catch(() => {\n });\n return;\n }\n const onReady = () => {\n video.removeEventListener(\"canplay\", onReady);\n this.resumeContentPlayback(attempt + 1);\n };\n video.addEventListener(\"canplay\", onReady);\n const backoffMs = 500 * (attempt + 1);\n window.setTimeout(() => {\n video.removeEventListener(\"canplay\", onReady);\n if (video.paused) {\n this.resumeContentPlayback(attempt + 1);\n }\n }, backoffMs);\n return;\n }\n const playResult = video.play();\n if (playResult && typeof playResult.catch === \"function\") {\n playResult.catch((error) => {\n if (attempt + 1 >= maxAttempts) {\n if (this.debug) {\n console.warn(\n \"[StormcloudVideoPlayer] Failed to resume content playback after ads:\",\n error\n );\n }\n return;\n }\n const backoffMs = 250 * (attempt + 1);\n window.setTimeout(() => {\n this.resumeContentPlayback(attempt + 1);\n }, backoffMs);\n });\n }\n }\n handleAdFailure() {\n this.timing.consecutiveFailures++;\n this.timing.recordGamNoFill();\n const remaining = this.timing.getRemainingAdMs();\n if (this.debug) {\n console.log(\n `[CONTINUOUS-FETCH] Ad failure: remaining=${remaining}ms, queued ads=${this.adRequestQueue.length}, consecutiveFailures=${this.timing.consecutiveFailures}`,\n this.adRequestQueue.length > 0 ? { queuedUrls: [...this.adRequestQueue] } : {}\n );\n }\n if (this.timing.consecutiveFailures >= this.timing.maxConsecutiveFailures) {\n if (this.debug) console.log(`[CONTINUOUS-FETCH] Max consecutive failures reached (${this.timing.consecutiveFailures}), ending ad break gracefully`);\n this.handleAdPodComplete();\n return;\n }\n if (this.timing.hasTimeToStartAnotherAd()) {\n this.tryNextAvailableAdWithRateLimit();\n } else {\n if (this.debug) console.log(\"[AD-ERROR] Ad failed and not enough time remaining for another ad. Failed URLs:\", this.timing.failedVastUrls.size);\n this.handleAdPodComplete();\n }\n }\n};\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n AdBreakOrchestrator\n});\n"]}