stormcloud-video-player 0.8.56 → 0.8.57

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 (51) hide show
  1. package/README.md +2 -2
  2. package/dist/stormcloud-vp.min.js +1 -3
  3. package/lib/index.cjs +161 -283
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +12 -29
  6. package/lib/index.d.ts +12 -29
  7. package/lib/index.js +141 -227
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/AdBreakOrchestrator.cjs +118 -188
  10. package/lib/player/AdBreakOrchestrator.cjs.map +1 -1
  11. package/lib/player/AdConfigManager.cjs +103 -200
  12. package/lib/player/AdConfigManager.cjs.map +1 -1
  13. package/lib/player/AdConfigManager.d.cts +0 -1
  14. package/lib/player/AdTimingService.cjs.map +1 -1
  15. package/lib/player/HlsEngine.cjs.map +1 -1
  16. package/lib/player/PlaceholderLayer.cjs.map +1 -1
  17. package/lib/player/PlayerControls.cjs.map +1 -1
  18. package/lib/player/Scte35CueManager.cjs.map +1 -1
  19. package/lib/player/Scte35Parser.cjs.map +1 -1
  20. package/lib/player/StormcloudVideoPlayer.cjs +134 -205
  21. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  22. package/lib/player/playerTypes.cjs.map +1 -1
  23. package/lib/players/FilePlayer.cjs.map +1 -1
  24. package/lib/players/HlsPlayer.cjs +134 -205
  25. package/lib/players/HlsPlayer.cjs.map +1 -1
  26. package/lib/players/index.cjs +134 -205
  27. package/lib/players/index.cjs.map +1 -1
  28. package/lib/sdk/hlsAdPlayer.cjs.map +1 -1
  29. package/lib/sdk/pal.cjs.map +1 -1
  30. package/lib/ui/StormcloudVideoPlayer.cjs +134 -205
  31. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  32. package/lib/utils/browserCompat.cjs.map +1 -1
  33. package/lib/utils/ctvVastSignals.cjs.map +1 -1
  34. package/lib/utils/devUrl.cjs.map +1 -1
  35. package/lib/utils/polyfills.cjs.map +1 -1
  36. package/lib/utils/tracking.cjs +134 -199
  37. package/lib/utils/tracking.cjs.map +1 -1
  38. package/lib/utils/trackingIngest.cjs +322 -0
  39. package/lib/utils/trackingIngest.cjs.map +1 -0
  40. package/lib/utils/trackingIngest.d.cts +14 -0
  41. package/lib/utils/vastEnvironmentSignals.cjs.map +1 -1
  42. package/lib/utils/vastMacros.cjs.map +1 -1
  43. package/lib/utils/vastTrackingMacros.cjs.map +1 -1
  44. package/package.json +1 -3
  45. package/lib/utils/mqttClient.cjs +0 -305
  46. package/lib/utils/mqttClient.cjs.map +0 -1
  47. package/lib/utils/mqttClient.d.cts +0 -13
  48. package/lib/utils/mqttConfig.cjs +0 -139
  49. package/lib/utils/mqttConfig.cjs.map +0 -1
  50. package/lib/utils/mqttConfig.d.cts +0 -20
  51. package/src/certs/emqxsl-ca.crt +0 -22
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/pal.cjs"],"names":[],"mappings":"AAAA","sourcesContent":["\"use strict\";\nvar __defProp = Object.defineProperty;\nvar __getOwnPropDesc = Object.getOwnPropertyDescriptor;\nvar __getOwnPropNames = Object.getOwnPropertyNames;\nvar __hasOwnProp = Object.prototype.hasOwnProperty;\nvar __export = (target, all) => {\n for (var name in all)\n __defProp(target, name, { get: all[name], enumerable: true });\n};\nvar __copyProps = (to, from, except, desc) => {\n if (from && typeof from === \"object\" || typeof from === \"function\") {\n for (let key of __getOwnPropNames(from))\n if (!__hasOwnProp.call(to, key) && key !== except)\n __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });\n }\n return to;\n};\nvar __toCommonJS = (mod) => __copyProps(__defProp({}, \"__esModule\", { value: true }), mod);\n\n// src/sdk/pal.ts\nvar pal_exports = {};\n__export(pal_exports, {\n createPalNonceManager: () => createPalNonceManager\n});\nmodule.exports = __toCommonJS(pal_exports);\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createPalNonceManager\n});\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/sdk/pal.cjs","../../src/sdk/pal.ts","../../src/utils/devUrl.ts"],"names":["__defProp","Object","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","__getOwnPropNames","getOwnPropertyNames","__export","target","all","name","get","enumerable","__copyProps","to","from","except","desc","key","__hasOwnProp","call","__toCommonJS","mod","value","pal_exports","createPalNonceManager","module","exports","PRIVATE_HOST_PATTERNS","isLocalDevHost","host","hostname","replace","toLowerCase","endsWith","some","pattern","test","toDevSafeUrl","rawUrl","url","URL","protocol","cleanPath","pathname"],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4BACIA,QAAYC,OAAOC,cAAc,CAAA,GAAA;4BACjCC,QAAAA,GAAAA,GAAAA,CAAmBF,OAAOG,KAC1BC,QAAAA,MAAoBJ,KAD8B,EACvBK,CAAAA,IAAAA,CAAAA,OAAAA,MAAmB,KAAA,cAAA,OAAA,QAAA,CAAA,IAAA,GAAA,EAAA;4BAE9CC,OAAW,CAAA,UAAA,GAAA,IAACC,IAAAA,IAAQC,MAAAA,IAAAA;4BACjB,IAAIC,IAAAA,IAAQD,IACfT,GAAAA,GAAAA,IAAUQ,IAAAA,IAAQE,MAAM,CAAA,IAAA;4BAAEC,IAAAA,CAAKF,GAAG,CAACC,GAAAA,EAAK,EAAA,EAAA,QAAA,IAAA,GAAA,QAAA,IAAA;4BAAEE,IAAAA,QAAY,SAAA,EAAA,QAAA,SAAA,GAAA,QAAA,SAAA;4BAAK,QAAA,GAAA,CAC/D,4CACIC,KAAAA,GAAc,MAAA,CAAA,cAACC,IAAIC,MAAMC,QAAQC;gCAC/BF,IAAQ,CAAA,OAAOA,IAAAA,QAAAA,cAAAA,WAAP,SAAOA,KAAG,MAAM,YAAY,OAAOA,SAAS,YAAY;gCAC7D,iBAAA,QAAA,SAAA,MAAA,qBAAA;;;oCAAA,IAAIG,MAAJ,EAAA,QAAA,cAAA;oCACH,IAAI,CAACC,OAAAA,MAAaC,EAAAA,EAAI,CAACN,IAAII,OAAAA,CAAQA,QAAQF,QACzChB,UAAUc,IAAII,KAAK;wCAAEP,IAAAA,CAAK,OAAA,EAALA,QAAAA;mDAAWI,IAAI,CAACG,IAAI,QAAA;;wCAAEN,KAAAA,GAAAA,IAAY,CAAEK,CAAAA,OAAOd,iBAAiBY,MAAMG,IAAG,KAAMD,KAAKL,UAAU;oCAAC,QAAA,QAAA,UAAA;;gCAFpH,MAAA,EAAK,MAAA,IAAA,EAAWP,kBAAkBU,0BAA7B,SAAA,6BAAA,QAAA,yBAAA;;8BAAA,CAAA,MAAA;;;;;;;;yCAAA,EAAA,QAAA,QAAA,WAAA;wCAAA;;;;;;;wCAAA,CAAA,mCAAA;8CAAA;;;;;;;;;;;;YAGP;;kCACA,OAAOD;YACT,OAAA;QACIO,eAAe,sBAACC;qCAAQT,KAAAA,OAAYb,GAAAA,OAAU,CAAC,GAAG,cAAc;cAAEuB,EAAAA,CAAAA,IAAO,YAAA,CAAA,YAAA,OAAA;YAAK,EAAID,EAAAA;;gBAEtF,IAAA,KAAiB,OAAA,CAAA,MAAA,CAAA;gBCnBjBE,IAAAA,MAAA,CAAA,KAAA,CAAA,GAAA,CAAA,QAAA;gBAAAjB,CAAAiB,MAAAA,IAAAA,GAAA,KAAA;YAAAC,EAAAA,eAAAA,aAAA,SAAAA;uBAAAA,IAAAA,WAAAA,OAAAA,CAAAA,qBAAAA,IAAAA,OAAAA,CAAAA,SAAAA;;gBAAA,OAAA,GAAA,OAAA,MAAA,OAAA,KAAA,SAAA,OAAA,mBAAA;YAAAC,CAAAC,OAAA,GAAAN,aAAAG;QD0BA,kBAAsB;oCE1BhBI,wBAAkC;YACtC,IAAA;gBACA,gCAAA,0CAAA,oBAAA,iBAAA;YACA,EAAA,eAAA,CACA;QACA;kCACA;YACA,IAAA;gBACF,gCAAA,0CAAA,oBAAA,eAAA;YAEO,EAAA,CAASC,cAAAA,CACd,EAAMC,OADuBC,AAChBA,QADgB,CACPC,OAAA,CAAQ,OAAO,IAAIA,OAAA,CAAQ,OAAO,IAAIC,WAAA;QAC5D,IAAI,CAACH,MAAM,OAAO;8BAClB,IAAIA,KAAKI,QAAA,CAAS,aAAaJ,KAAKI,QAAA,CAAS,eAAe,OAAO;YACnE,IAAA,CAAON,sBAAsBO,IAAA,CAAK,SAACC;iGAAYA,QAAQC,IAAA,CAAKP,WAAAA;8BAC9D;QAEO,KAASQ,aAAaC,MAAA;8BAC3B,IAAI,CAACA,OAAAA,CAAQ,IAAA,GAAOA,mBAAAA,oBAAAA,SAAU;YAE9B,EAAIC,EAAAA;0FACA,oBAAA,WAAA,CAAA;cACFA,eAAM,CACR,GADYC,IAAIF,QACR;YACN,OAAOA;wBACT;YAEA,EAAIC,IAAIE,QAAA,CAAA,IAAa,WAAWF,IAAIE,QAAA,KAAa,UAAU;cACzD,OAAOH,aAAAA,KAAAA;QACT;MAEA,IAAI,CAACV,eAAeW,IAAIT,QAAQ,GAAG;QACjC,OAAOQ;IACT,yDAAA;IAEA,CAAA,CAAA,EAAMI,KAAAA,OAAYH,GAAAA,CAAII,QAAA,CAASZ,OAAA,CAAQ,WAAW,QAAQ;6BAC1D,OAAO,UAAmB,OAATW;CACnB","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/sdk/pal.ts\nvar pal_exports = {};\n__export(pal_exports, {\n createPalNonceManager: () => createPalNonceManager\n});\nmodule.exports = __toCommonJS(pal_exports);\n\n// src/utils/devUrl.ts\nvar PRIVATE_HOST_PATTERNS = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/\n];\nfunction isLocalDevHost(hostname) {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\nfunction toDevSafeUrl(rawUrl) {\n if (!rawUrl) return rawUrl ?? \"\";\n let url;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n\n// src/sdk/pal.ts\nvar PAL_SDK_URL = \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\nvar _nonceLoader;\nvar _palLoadPromise;\nfunction loadPalSdk() {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n if (_palLoadPromise) return _palLoadPromise;\n _palLoadPromise = new Promise((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n );\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 1e4\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n return _palLoadPromise;\n}\nfunction getOrCreateNonceLoader() {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\nfunction createPalNonceManager() {\n let currentNonce = \"\";\n let currentNonceManager;\n return {\n async generateNonce(options = {}) {\n try {\n await loadPalSdk();\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume = options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl || (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId\n }, null, 2)\n );\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce();\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = void 0;\n return \"\";\n }\n },\n getCurrentNonce() {\n return currentNonce;\n },\n injectNonce(vastTagUrl) {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl.replace(/([?&])paln=[^&]*/g, \"\").replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n sendPlaybackStart() {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {\n }\n },\n sendPlaybackEnd() {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {\n }\n },\n sendAdClick() {\n try {\n currentNonceManager?.sendAdClick();\n } catch {\n }\n },\n sendAdTouch(event) {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {\n }\n },\n reset() {\n currentNonce = \"\";\n currentNonceManager = void 0;\n }\n };\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n createPalNonceManager\n});\n","import { toDevSafeUrl } from \"../utils/devUrl\";\n\ndeclare global {\n interface Window {\n goog?: any;\n }\n}\n\nconst PAL_SDK_URL =\n \"https://imasdk.googleapis.com/pal/sdkloader/pal.js\";\n\nlet _nonceLoader: any | undefined;\nlet _palLoadPromise: Promise<void> | undefined;\n\nfunction loadPalSdk(): Promise<void> {\n if (typeof window !== \"undefined\" && window.goog?.pal) {\n return Promise.resolve();\n }\n\n if (_palLoadPromise) return _palLoadPromise;\n\n _palLoadPromise = new Promise<void>((resolve, reject) => {\n const existing = document.querySelector(\n 'script[data-pal=\"true\"]'\n ) as HTMLScriptElement | null;\n\n if (existing) {\n if (window.goog?.pal) {\n resolve();\n return;\n }\n const timeout = setTimeout(\n () => reject(new Error(\"PAL SDK load timeout\")),\n 10000\n );\n existing.addEventListener(\"load\", () => {\n clearTimeout(timeout);\n resolve();\n });\n existing.addEventListener(\"error\", () => {\n clearTimeout(timeout);\n reject(new Error(\"PAL SDK load failed\"));\n });\n return;\n }\n\n const script = document.createElement(\"script\");\n script.src = PAL_SDK_URL;\n script.async = true;\n script.setAttribute(\"data-pal\", \"true\");\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"PAL SDK load failed\"));\n document.head.appendChild(script);\n });\n\n return _palLoadPromise;\n}\n\nfunction getOrCreateNonceLoader(): any {\n if (_nonceLoader) return _nonceLoader;\n const goog = window.goog;\n const consentSettings = new goog.pal.ConsentSettings();\n consentSettings.allowStorage = true;\n _nonceLoader = new goog.pal.NonceLoader(consentSettings);\n return _nonceLoader;\n}\n\nexport interface PalNonceOptions {\n videoWidth?: number;\n videoHeight?: number;\n descriptionUrl?: string;\n ppid?: string;\n sessionId?: string;\n adWillAutoPlay?: boolean;\n adWillPlayMuted?: boolean;\n playerVolume?: number;\n continuousPlayback?: boolean;\n}\n\nexport interface PalNonceManager {\n generateNonce(options?: PalNonceOptions): Promise<string>;\n\n getCurrentNonce(): string;\n\n injectNonce(vastTagUrl: string): string;\n\n sendPlaybackStart(): void;\n\n sendPlaybackEnd(): void;\n\n sendAdClick(): void;\n\n sendAdTouch(event: MouseEvent | TouchEvent): void;\n\n reset(): void;\n}\n\nexport function createPalNonceManager(): PalNonceManager {\n let currentNonce = \"\";\n let currentNonceManager: any | undefined;\n\n return {\n async generateNonce(options: PalNonceOptions = {}): Promise<string> {\n try {\n await loadPalSdk();\n\n const loader = getOrCreateNonceLoader();\n const goog = window.goog;\n\n const request = new goog.pal.NonceRequest();\n request.adWillAutoPlay = options.adWillAutoPlay ?? true;\n request.adWillPlayMuted = options.adWillPlayMuted ?? false;\n request.playerVolume =\n options.playerVolume ?? (request.adWillPlayMuted ? 0 : 1);\n request.continuousPlayback = options.continuousPlayback ?? true;\n request.descriptionUrl = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.iconsSupported = true;\n request.playerType = \"StormcloudVideoPlayer\";\n request.playerVersion = \"1.0\";\n request.supportedApiFrameworks = \"2,7,9\";\n request.url = toDevSafeUrl(\n options.descriptionUrl ||\n (typeof window !== \"undefined\" ? window.location.href : \"\")\n );\n request.videoWidth = options.videoWidth || 640;\n request.videoHeight = options.videoHeight || 480;\n\n if (options.ppid) request.ppid = options.ppid;\n if (options.sessionId) request.sessionId = options.sessionId;\n\n console.log(\n \"[PAL] NonceRequest before generateNonce:\",\n JSON.stringify({\n adWillAutoPlay: request.adWillAutoPlay,\n adWillPlayMuted: request.adWillPlayMuted,\n playerVolume: request.playerVolume,\n continuousPlayback: request.continuousPlayback,\n descriptionUrl: request.descriptionUrl,\n iconsSupported: request.iconsSupported,\n playerType: request.playerType,\n playerVersion: request.playerVersion,\n supportedApiFrameworks: request.supportedApiFrameworks,\n url: request.url,\n videoWidth: request.videoWidth,\n videoHeight: request.videoHeight,\n ppid: request.ppid,\n sessionId: request.sessionId,\n }, null, 2)\n );\n\n const manager = await loader.loadNonceManager(request);\n currentNonceManager = manager;\n currentNonce = manager.getNonce() as string;\n\n console.log(\"[PAL] Nonce generated successfully\");\n return currentNonce;\n } catch (error) {\n console.warn(\"[PAL] Failed to generate nonce:\", error);\n currentNonce = \"\";\n currentNonceManager = undefined;\n return \"\";\n }\n },\n\n getCurrentNonce(): string {\n return currentNonce;\n },\n\n injectNonce(vastTagUrl: string): string {\n if (!currentNonce || !vastTagUrl) return vastTagUrl;\n\n try {\n const url = new URL(vastTagUrl);\n url.searchParams.delete(\"paln\");\n url.searchParams.set(\"givn\", currentNonce);\n return url.toString();\n } catch {\n let base = vastTagUrl\n .replace(/([?&])paln=[^&]*/g, \"\")\n .replace(/[?&]$/, \"\");\n const sep = base.includes(\"?\") ? \"&\" : \"?\";\n return `${base}${sep}givn=${encodeURIComponent(currentNonce)}`;\n }\n },\n\n sendPlaybackStart(): void {\n try {\n currentNonceManager?.sendPlaybackStart();\n } catch {}\n },\n\n sendPlaybackEnd(): void {\n try {\n currentNonceManager?.sendPlaybackEnd();\n } catch {}\n },\n\n sendAdClick(): void {\n try {\n currentNonceManager?.sendAdClick();\n } catch {}\n },\n\n sendAdTouch(event: MouseEvent | TouchEvent): void {\n try {\n currentNonceManager?.sendAdTouch(event);\n } catch {}\n },\n\n reset(): void {\n currentNonce = \"\";\n currentNonceManager = undefined;\n },\n };\n}\n","const PRIVATE_HOST_PATTERNS: RegExp[] = [\n /^localhost$/i,\n /^127\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^0\\.0\\.0\\.0$/,\n /^::1$/,\n /^10\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/,\n /^192\\.168\\.\\d{1,3}\\.\\d{1,3}$/,\n /^172\\.(1[6-9]|2\\d|3[0-1])\\.\\d{1,3}\\.\\d{1,3}$/,\n];\n\nexport function isLocalDevHost(hostname: string): boolean {\n const host = hostname.replace(/^\\[/, \"\").replace(/\\]$/, \"\").toLowerCase();\n if (!host) return false;\n if (host.endsWith(\".local\") || host.endsWith(\".localhost\")) return true;\n return PRIVATE_HOST_PATTERNS.some((pattern) => pattern.test(host));\n}\n\nexport function toDevSafeUrl(rawUrl: string | undefined): string {\n if (!rawUrl) return rawUrl ?? \"\";\n\n let url: URL;\n try {\n url = new URL(rawUrl);\n } catch {\n return rawUrl;\n }\n\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n return rawUrl;\n }\n\n if (!isLocalDevHost(url.hostname)) {\n return rawUrl;\n }\n\n const cleanPath = url.pathname.replace(/\\/{2,}/g, \"/\") || \"/index.html\";\n return `file://${cleanPath}`;\n}\n"]}
@@ -2455,163 +2455,83 @@ function createPalNonceManager() {
2455
2455
  }
2456
2456
  };
2457
2457
  }
2458
- // src/utils/mqttConfig.ts
2459
- var DEFAULT_MQTT_CONFIG = {
2458
+ // src/utils/trackingIngest.ts
2459
+ var DEFAULT_TRACKING_INGEST_CONFIG = {
2460
2460
  enabled: true,
2461
- brokerAddress: "vecbae77.ala.us-east-1.emqxsl.com",
2462
- brokerPort: 8883,
2463
- wsPort: 8084,
2464
- username: "for-sonifi",
2465
- password: "sonifi-mqtt",
2466
- topicPrefix: "adstorm/players",
2467
- qos: 1
2461
+ baseUrl: "https://player-analytics-ingest-api-760490581852.us-central1.run.app/api/adstorm/player-tracking"
2468
2462
  };
2469
- var mqttConfig = _object_spread({}, DEFAULT_MQTT_CONFIG);
2470
- function applyMQTTConfig(overrides) {
2471
- Object.assign(mqttConfig, overrides);
2472
- }
2473
- function isMQTTEnabled() {
2474
- return mqttConfig.enabled;
2475
- }
2476
- function buildMQTTBrokerUrl() {
2477
- if (mqttConfig.brokerUrl) return mqttConfig.brokerUrl;
2478
- return "wss://".concat(mqttConfig.brokerAddress, ":").concat(mqttConfig.wsPort, "/mqtt");
2479
- }
2480
- function buildPlayerTopic(licenseKey, channel) {
2481
- return "".concat(mqttConfig.topicPrefix, "/").concat(licenseKey, "/").concat(channel);
2482
- }
2483
- // src/utils/mqttClient.ts
2484
- var import_mqtt = __toESM(require("mqtt"), 1);
2485
- var LOG = "[StormcloudVideoPlayer][MQTT]";
2486
- var KEEPALIVE_SECONDS = 30;
2487
- var CONNECT_TIMEOUT_MS = 1e4;
2488
- var RECONNECT_BASE_MS = 5e3;
2489
- var RECONNECT_MAX_MS = 6e4;
2490
- var MAX_RECONNECT_ATTEMPTS = 8;
2491
- var COOLDOWN_MS = 10 * 6e4;
2492
- var client = null;
2493
- var status = "disconnected";
2494
- var reconnectAttempts = 0;
2495
- var reconnectTimer = null;
2496
- var stopped = false;
2497
- function clearReconnectTimer() {
2498
- if (reconnectTimer) {
2499
- clearTimeout(reconnectTimer);
2500
- reconnectTimer = null;
2501
- }
2502
- }
2503
- function teardownClient() {
2504
- if (client) {
2505
- try {
2506
- client.removeAllListeners();
2507
- client.end(true);
2508
- } catch (unused) {}
2509
- client = null;
2510
- }
2511
- }
2512
- function scheduleReconnect() {
2513
- if (stopped || !isMQTTEnabled() || reconnectTimer) return;
2514
- if (reconnectAttempts >= MAX_RECONNECT_ATTEMPTS) {
2515
- console.warn("".concat(LOG, " giving up after ").concat(reconnectAttempts, " attempts; cooling down for ").concat(COOLDOWN_MS / 6e4, "m"));
2516
- teardownClient();
2517
- status = "disconnected";
2518
- reconnectTimer = setTimeout(function() {
2519
- reconnectTimer = null;
2520
- reconnectAttempts = 0;
2521
- openConnection();
2522
- }, COOLDOWN_MS);
2523
- return;
2524
- }
2525
- var delay = Math.min(RECONNECT_MAX_MS, RECONNECT_BASE_MS * Math.pow(2, reconnectAttempts));
2526
- var jitter = Math.floor(Math.random() * 1e3);
2527
- reconnectAttempts += 1;
2528
- reconnectTimer = setTimeout(function() {
2529
- reconnectTimer = null;
2530
- openConnection();
2531
- }, delay + jitter);
2532
- }
2533
- function openConnection() {
2534
- if (stopped || !isMQTTEnabled()) return;
2535
- teardownClient();
2536
- var url = buildMQTTBrokerUrl();
2537
- status = "connecting";
2538
- var clientId = "stormcloud-vp-".concat(Math.random().toString(36).slice(2, 9));
2539
- try {
2540
- client = import_mqtt.default.connect(url, {
2541
- clientId: clientId,
2542
- username: mqttConfig.username,
2543
- password: mqttConfig.password,
2544
- keepalive: KEEPALIVE_SECONDS,
2545
- clean: true,
2546
- // Disable MQTT.js internal reconnect; we manage reconnection ourselves.
2547
- reconnectPeriod: 0,
2548
- connectTimeout: CONNECT_TIMEOUT_MS,
2549
- queueQoSZero: false,
2550
- reschedulePings: true,
2551
- // Root-cause fix for the Tizen 4.0 "Keepalive timeout" loop: MQTT.js's
2552
- // default timerVariant "auto" runs the keepalive interval inside a
2553
- // Blob-URL Web Worker (via worker-timers). On Samsung Tizen 4.0 (old
2554
- // WebKit) served from a file:// origin that worker can't tick reliably,
2555
- // so the keepalive counter trips onKeepaliveTimeout almost immediately
2556
- // after connect. Force the native setInterval timer instead; the main
2557
- // thread is free because video is decoded by the native AVPlay pipeline.
2558
- timerVariant: "native"
2559
- });
2560
- } catch (err) {
2561
- status = "error";
2562
- console.warn("".concat(LOG, " connect() threw:"), err);
2563
- scheduleReconnect();
2564
- return;
2565
- }
2566
- client.on("connect", function() {
2567
- status = "connected";
2568
- reconnectAttempts = 0;
2569
- clearReconnectTimer();
2570
- console.info("".concat(LOG, " connected to ").concat(url));
2571
- });
2572
- client.on("offline", function() {
2573
- if (status === "connected") status = "disconnected";
2574
- console.warn("".concat(LOG, " offline"));
2575
- scheduleReconnect();
2576
- });
2577
- client.on("error", function(err) {
2578
- status = "error";
2579
- console.warn("".concat(LOG, " error:"), err.message);
2580
- scheduleReconnect();
2581
- });
2582
- client.on("close", function() {
2583
- if (status === "connected") status = "disconnected";
2584
- scheduleReconnect();
2585
- });
2463
+ var trackingIngestConfig = _object_spread({}, DEFAULT_TRACKING_INGEST_CONFIG);
2464
+ function isTrackingIngestEnabled() {
2465
+ return trackingIngestConfig.enabled === true;
2586
2466
  }
2587
- function initMQTTClient() {
2588
- if (client || !isMQTTEnabled()) return;
2589
- stopped = false;
2590
- reconnectAttempts = 0;
2591
- openConnection();
2467
+ function normalizeIngestBaseUrl(baseUrl) {
2468
+ return baseUrl.replace(/\/+$/, "");
2592
2469
  }
2593
- function ensureMQTTClient() {
2594
- if (isMQTTEnabled() && !client && !reconnectTimer) {
2595
- initMQTTClient();
2470
+ function buildTrackingIngestUrl(channel) {
2471
+ var base = normalizeIngestBaseUrl(trackingIngestConfig.baseUrl);
2472
+ if (channel === "impressions") {
2473
+ return "".concat(base, "/impressions/ingest");
2596
2474
  }
2475
+ return "".concat(base, "/metrics/ingest");
2597
2476
  }
2598
- function publishMQTT(topic, payload) {
2599
- if (!isMQTTEnabled()) {
2600
- return false;
2601
- }
2602
- ensureMQTTClient();
2603
- if (!client || !client.connected) {
2604
- return false;
2605
- }
2606
- try {
2607
- client.publish(topic, JSON.stringify(payload), {
2608
- qos: mqttConfig.qos
2477
+ function ingestPlayerTracking(licenseKey, channel, body) {
2478
+ return _async_to_generator(function() {
2479
+ var response, error;
2480
+ return _ts_generator(this, function(_state) {
2481
+ switch(_state.label){
2482
+ case 0:
2483
+ if (!isTrackingIngestEnabled() || !licenseKey) {
2484
+ return [
2485
+ 2,
2486
+ false
2487
+ ];
2488
+ }
2489
+ _state.label = 1;
2490
+ case 1:
2491
+ _state.trys.push([
2492
+ 1,
2493
+ 3,
2494
+ ,
2495
+ 4
2496
+ ]);
2497
+ return [
2498
+ 4,
2499
+ fetch(buildTrackingIngestUrl(channel), {
2500
+ method: "POST",
2501
+ headers: {
2502
+ "Content-Type": "application/json",
2503
+ Authorization: "License-Key ".concat(licenseKey)
2504
+ },
2505
+ body: JSON.stringify(body)
2506
+ })
2507
+ ];
2508
+ case 2:
2509
+ response = _state.sent();
2510
+ if (!response.ok) {
2511
+ console.warn("[StormcloudVideoPlayer] Tracking ingest failed (".concat(response.status, ") for ").concat(channel));
2512
+ return [
2513
+ 2,
2514
+ false
2515
+ ];
2516
+ }
2517
+ return [
2518
+ 2,
2519
+ true
2520
+ ];
2521
+ case 3:
2522
+ error = _state.sent();
2523
+ console.warn("[StormcloudVideoPlayer] Tracking ingest error for ".concat(channel, ":"), error);
2524
+ return [
2525
+ 2,
2526
+ false
2527
+ ];
2528
+ case 4:
2529
+ return [
2530
+ 2
2531
+ ];
2532
+ }
2609
2533
  });
2610
- return true;
2611
- } catch (err) {
2612
- console.warn("".concat(LOG, " publish failed on ").concat(topic, ":"), err);
2613
- return false;
2614
- }
2534
+ })();
2615
2535
  }
2616
2536
  // src/utils/vastEnvironmentSignals.ts
2617
2537
  var AIRY_ANDROID_APP_ID = "com.freeairytv.android";
@@ -3382,7 +3302,7 @@ function getBrowserID(clientInfo) {
3382
3302
  })();
3383
3303
  }
3384
3304
  function canPublish(licenseKey) {
3385
- return Boolean(isMQTTEnabled() && licenseKey);
3305
+ return Boolean(isTrackingIngestEnabled() && licenseKey);
3386
3306
  }
3387
3307
  function buildPlayerMetricEvent() {
3388
3308
  return _async_to_generator(function() {
@@ -3424,10 +3344,6 @@ function buildPlayerMetricEvent() {
3424
3344
  });
3425
3345
  }).apply(this, arguments);
3426
3346
  }
3427
- function publishTracking(licenseKey, channel, body) {
3428
- ensureMQTTClient();
3429
- publishMQTT(buildPlayerTopic(licenseKey, channel), body);
3430
- }
3431
3347
  function sendInitialTracking(_0) {
3432
3348
  return _async_to_generator(function(licenseKey) {
3433
3349
  var context, metricEvent, error;
@@ -3443,9 +3359,9 @@ function sendInitialTracking(_0) {
3443
3359
  case 1:
3444
3360
  _state.trys.push([
3445
3361
  1,
3446
- 3,
3362
+ 4,
3447
3363
  ,
3448
- 4
3364
+ 5
3449
3365
  ]);
3450
3366
  return [
3451
3367
  4,
@@ -3456,23 +3372,28 @@ function sendInitialTracking(_0) {
3456
3372
  ];
3457
3373
  case 2:
3458
3374
  metricEvent = _state.sent();
3459
- publishTracking(licenseKey, "metrics", {
3460
- events: [
3461
- metricEvent
3462
- ]
3463
- });
3464
3375
  return [
3465
- 3,
3466
- 4
3376
+ 4,
3377
+ ingestPlayerTracking(licenseKey, "metrics", {
3378
+ events: [
3379
+ metricEvent
3380
+ ]
3381
+ })
3467
3382
  ];
3468
3383
  case 3:
3384
+ _state.sent();
3385
+ return [
3386
+ 3,
3387
+ 5
3388
+ ];
3389
+ case 4:
3469
3390
  error = _state.sent();
3470
3391
  console.error("[StormcloudVideoPlayer] Error sending initial tracking data:", error);
3471
3392
  return [
3472
3393
  3,
3473
- 4
3394
+ 5
3474
3395
  ];
3475
- case 4:
3396
+ case 5:
3476
3397
  return [
3477
3398
  2
3478
3399
  ];
@@ -3583,9 +3504,9 @@ function sendAdImpressionTracking(_0, _1) {
3583
3504
  case 1:
3584
3505
  _state.trys.push([
3585
3506
  1,
3586
- 3,
3507
+ 5,
3587
3508
  ,
3588
- 4
3509
+ 6
3589
3510
  ]);
3590
3511
  return [
3591
3512
  4,
@@ -3595,29 +3516,43 @@ function sendAdImpressionTracking(_0, _1) {
3595
3516
  ];
3596
3517
  case 2:
3597
3518
  metricEvent = _state.sent();
3598
- publishTracking(licenseKey, "heartbeat", metricEvent);
3599
- publishTracking(licenseKey, "impressions", {
3600
- events: [
3601
- {
3602
- player_id: metricEvent.player_id,
3603
- ad_played_count: 1,
3604
- ad_url: adImpressionInfo.adUrl,
3605
- capture_at: adImpressionInfo.timestamp
3606
- }
3607
- ]
3608
- });
3609
3519
  return [
3610
- 3,
3611
- 4
3520
+ 4,
3521
+ ingestPlayerTracking(licenseKey, "metrics", {
3522
+ events: [
3523
+ metricEvent
3524
+ ]
3525
+ })
3612
3526
  ];
3613
3527
  case 3:
3528
+ _state.sent();
3529
+ return [
3530
+ 4,
3531
+ ingestPlayerTracking(licenseKey, "impressions", {
3532
+ events: [
3533
+ {
3534
+ player_id: metricEvent.player_id,
3535
+ ad_played_count: 1,
3536
+ ad_url: adImpressionInfo.adUrl,
3537
+ capture_at: adImpressionInfo.timestamp
3538
+ }
3539
+ ]
3540
+ })
3541
+ ];
3542
+ case 4:
3543
+ _state.sent();
3544
+ return [
3545
+ 3,
3546
+ 6
3547
+ ];
3548
+ case 5:
3614
3549
  error = _state.sent();
3615
3550
  console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
3616
3551
  return [
3617
3552
  3,
3618
- 4
3553
+ 6
3619
3554
  ];
3620
- case 4:
3555
+ case 6:
3621
3556
  return [
3622
3557
  2
3623
3558
  ];
@@ -3640,9 +3575,9 @@ function sendHeartbeat(_0) {
3640
3575
  case 1:
3641
3576
  _state.trys.push([
3642
3577
  1,
3643
- 3,
3578
+ 4,
3644
3579
  ,
3645
- 4
3580
+ 5
3646
3581
  ]);
3647
3582
  return [
3648
3583
  4,
@@ -3650,19 +3585,28 @@ function sendHeartbeat(_0) {
3650
3585
  ];
3651
3586
  case 2:
3652
3587
  heartbeatData = _state.sent();
3653
- publishTracking(licenseKey, "heartbeat", heartbeatData);
3654
3588
  return [
3655
- 3,
3656
- 4
3589
+ 4,
3590
+ ingestPlayerTracking(licenseKey, "metrics", {
3591
+ events: [
3592
+ heartbeatData
3593
+ ]
3594
+ })
3657
3595
  ];
3658
3596
  case 3:
3597
+ _state.sent();
3598
+ return [
3599
+ 3,
3600
+ 5
3601
+ ];
3602
+ case 4:
3659
3603
  error = _state.sent();
3660
3604
  console.error("[StormcloudVideoPlayer] Error sending heartbeat:", error);
3661
3605
  return [
3662
3606
  3,
3663
- 4
3607
+ 5
3664
3608
  ];
3665
- case 4:
3609
+ case 5:
3666
3610
  return [
3667
3611
  2
3668
3612
  ];
@@ -5536,7 +5480,6 @@ var AdConfigManager = /*#__PURE__*/ function() {
5536
5480
  ];
5537
5481
  case 4:
5538
5482
  data = _state.sent();
5539
- this.applyMqttConfigFromResponse(data);
5540
5483
  imaPayload = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : (_data_response_ima = _data_response.ima) === null || _data_response_ima === void 0 ? void 0 : (_data_response_ima_publisherdeskima = _data_response_ima["publisherdesk.ima"]) === null || _data_response_ima_publisherdeskima === void 0 ? void 0 : _data_response_ima_publisherdeskima.payload;
5541
5484
  if (imaPayload) {
5542
5485
  decodedPayload = imaPayload;
@@ -5570,20 +5513,6 @@ var AdConfigManager = /*#__PURE__*/ function() {
5570
5513
  }).call(this);
5571
5514
  }
5572
5515
  },
5573
- {
5574
- key: "applyMqttConfigFromResponse",
5575
- value: function applyMqttConfigFromResponse(data) {
5576
- var _data_response;
5577
- var mqttConfig2 = (_data_response = data.response) === null || _data_response === void 0 ? void 0 : _data_response.mqtt_config;
5578
- if (!mqttConfig2 || (typeof mqttConfig2 === "undefined" ? "undefined" : _type_of(mqttConfig2)) !== "object") {
5579
- return;
5580
- }
5581
- applyMQTTConfig(mqttConfig2);
5582
- if (this.debug) {
5583
- console.log("[StormcloudVideoPlayer] Applied MQTT config from /ads/web:", mqttConfig2);
5584
- }
5585
- }
5586
- },
5587
5516
  {
5588
5517
  key: "fetchAndParseVmap",
5589
5518
  value: function fetchAndParseVmap(vmapUrl) {