stormcloud-video-player 0.5.5 → 0.5.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/README.md +28 -40
  2. package/dist/stormcloud-vp.min.js +1 -1
  3. package/lib/index.cjs +1075 -3918
  4. package/lib/index.cjs.map +1 -1
  5. package/lib/index.d.cts +8 -67
  6. package/lib/index.d.ts +8 -67
  7. package/lib/index.js +1076 -3903
  8. package/lib/index.js.map +1 -1
  9. package/lib/player/StormcloudVideoPlayer.cjs +1063 -3876
  10. package/lib/player/StormcloudVideoPlayer.cjs.map +1 -1
  11. package/lib/player/StormcloudVideoPlayer.d.cts +4 -37
  12. package/lib/players/HlsPlayer.cjs +1063 -3876
  13. package/lib/players/HlsPlayer.cjs.map +1 -1
  14. package/lib/players/HlsPlayer.d.cts +1 -1
  15. package/lib/players/index.cjs +1063 -3876
  16. package/lib/players/index.cjs.map +1 -1
  17. package/lib/sdk/prebid.cjs +114 -43
  18. package/lib/sdk/prebid.cjs.map +1 -1
  19. package/lib/sdk/prebid.d.cts +1 -1
  20. package/lib/sdk/prebidController.cjs +124 -71
  21. package/lib/sdk/prebidController.cjs.map +1 -1
  22. package/lib/sdk/prebidController.d.cts +2 -2
  23. package/lib/{types-CRi_KrjM.d.cts → types-BOJiWNWa.d.cts} +23 -7
  24. package/lib/ui/StormcloudVideoPlayer.cjs +1063 -3886
  25. package/lib/ui/StormcloudVideoPlayer.cjs.map +1 -1
  26. package/lib/ui/StormcloudVideoPlayer.d.cts +1 -1
  27. package/lib/utils/browserCompat.cjs +0 -3
  28. package/lib/utils/browserCompat.cjs.map +1 -1
  29. package/lib/utils/browserCompat.d.cts +0 -1
  30. package/lib/utils/tracking.cjs +226 -1
  31. package/lib/utils/tracking.cjs.map +1 -1
  32. package/lib/utils/tracking.d.cts +5 -2
  33. package/package.json +1 -1
  34. package/lib/sdk/hlsAdPlayer.cjs +0 -1052
  35. package/lib/sdk/hlsAdPlayer.cjs.map +0 -1
  36. package/lib/sdk/hlsAdPlayer.d.cts +0 -10
  37. package/lib/sdk/ima.cjs +0 -1383
  38. package/lib/sdk/ima.cjs.map +0 -1
  39. package/lib/sdk/ima.d.cts +0 -12
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import { StormcloudVideoPlayer } from '../player/StormcloudVideoPlayer.cjs';
3
- import { S as StormcloudVideoPlayerConfig } from '../types-CRi_KrjM.cjs';
3
+ import { S as StormcloudVideoPlayerConfig } from '../types-BOJiWNWa.cjs';
4
4
 
5
5
  type StormcloudVideoPlayerProps = Omit<StormcloudVideoPlayerConfig, "videoElement"> & React.VideoHTMLAttributes<HTMLVideoElement> & {
6
6
  onReady?: (player: StormcloudVideoPlayer) => void;
@@ -388,9 +388,6 @@ function logBrowserInfo() {
388
388
  function getBrowserConfigOverrides() {
389
389
  var browser = detectBrowser();
390
390
  var overrides = {};
391
- if (browser.isLegacyTV || !browser.supportsIMA) {
392
- overrides.adPlayerType = "hls";
393
- }
394
391
  if (browser.isSmartTV) {
395
392
  overrides.allowNativeHls = true;
396
393
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/browserCompat.cjs","../../src/utils/browserCompat.ts"],"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","browserCompat_exports","detectBrowser","getBrowserConfigOverrides","getRecommendedAdPlayer","logBrowserInfo","supportsFeature","supportsGoogleIMA","supportsModernJS","module","exports","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","version","majorVersion","isSmartTV","isLegacyTV","supportsIMA","recommendedAdPlayer","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams"],"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/utils/browserCompat.ts\nvar browserCompat_exports = {};\n__export(browserCompat_exports, {\n detectBrowser: () => detectBrowser,\n getBrowserConfigOverrides: () => getBrowserConfigOverrides,\n getRecommendedAdPlayer: () => getRecommendedAdPlayer,\n logBrowserInfo: () => logBrowserInfo,\n supportsFeature: () => supportsFeature,\n supportsGoogleIMA: () => supportsGoogleIMA,\n supportsModernJS: () => supportsModernJS\n});\nmodule.exports = __toCommonJS(browserCompat_exports);\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS2 = true;\n let recommendedAdPlayer = \"ima\";\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n if (webOSVersion !== void 0 && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (webOSVersion !== void 0 && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n if (tizenVersion !== void 0 && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (tizenVersion !== void 0 && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS2 = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS2 = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS2 = false;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS2 = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS: supportsModernJS2,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction supportsGoogleIMA() {\n const browser = detectBrowser();\n if (browser.isLegacyTV) {\n return false;\n }\n if (typeof document === \"undefined\" || typeof document.createElement !== \"function\") {\n return false;\n }\n try {\n const video = document.createElement(\"video\");\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n if (typeof Promise === \"undefined\") {\n return false;\n }\n return browser.supportsIMA;\n}\nfunction getRecommendedAdPlayer() {\n const browser = detectBrowser();\n return browser.recommendedAdPlayer;\n}\nfunction supportsModernJS() {\n try {\n return typeof Promise !== \"undefined\" && typeof Map !== \"undefined\" && typeof Set !== \"undefined\" && typeof Array.from !== \"undefined\" && typeof Object.assign !== \"undefined\" && typeof Array.prototype.forEach !== \"undefined\" && typeof String.prototype.includes !== \"undefined\";\n } catch (e) {\n return false;\n }\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n const imaSupport = supportsGoogleIMA();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsIMA: imaSupport,\n supportsModernJS: browser.supportsModernJS,\n recommendedAdPlayer: browser.recommendedAdPlayer,\n ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n userAgent: navigator.userAgent\n });\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isLegacyTV || !browser.supportsIMA) {\n overrides.adPlayerType = \"hls\";\n }\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n return overrides;\n}\nfunction supportsFeature(feature) {\n switch (feature) {\n case \"ima\":\n return supportsGoogleIMA();\n case \"urlsearchparams\":\n return typeof URLSearchParams !== \"undefined\";\n case \"textencoder\":\n return typeof TextEncoder !== \"undefined\";\n case \"promises\":\n return typeof Promise !== \"undefined\";\n case \"fetch\":\n return typeof fetch !== \"undefined\";\n case \"crypto\":\n return typeof crypto !== \"undefined\" && typeof crypto.subtle !== \"undefined\";\n default:\n return false;\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n detectBrowser,\n getBrowserConfigOverrides,\n getRecommendedAdPlayer,\n logBrowserInfo,\n supportsFeature,\n supportsGoogleIMA,\n supportsModernJS\n});\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsIMA: boolean;\n supportsModernJS: boolean;\n recommendedAdPlayer: 'ima' | 'hls';\n webOSVersion?: number | undefined;\n tizenVersion?: number | undefined;\n chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS = true;\n let recommendedAdPlayer: 'ima' | 'hls' = 'ima';\n let webOSVersion: number | undefined;\n let tizenVersion: number | undefined;\n let chromeVersionNum: number | undefined;\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n \n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n \n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n \n if (match && match[1]) {\n version = match[1];\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = '6.0';\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = '5.0';\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = '4.0';\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = '3.0';\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = '2.0';\n majorVersion = 2;\n }\n } else {\n version = 'Unknown';\n webOSVersion = undefined;\n }\n\n if (webOSVersion !== undefined && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (webOSVersion !== undefined && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n \n if (tizenVersion !== undefined && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (tizenVersion !== undefined && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n recommendedAdPlayer = 'hls';\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum,\n };\n}\n\nexport function supportsGoogleIMA(): boolean {\n const browser = detectBrowser();\n\n if (browser.isLegacyTV) {\n return false;\n }\n\n if (typeof document === 'undefined' ||\n typeof document.createElement !== 'function') {\n return false;\n }\n\n try {\n const video = document.createElement('video');\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n\n if (typeof Promise === 'undefined') {\n return false;\n }\n\n return browser.supportsIMA;\n}\n\nexport function getRecommendedAdPlayer(): 'ima' | 'hls' {\n const browser = detectBrowser();\n return browser.recommendedAdPlayer;\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n const imaSupport = supportsGoogleIMA();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsIMA: imaSupport,\n supportsModernJS: browser.supportsModernJS,\n recommendedAdPlayer: browser.recommendedAdPlayer,\n ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n adPlayerType?: 'ima' | 'hls';\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { adPlayerType?: 'ima' | 'hls'; allowNativeHls?: boolean } = {};\n\n if (browser.isLegacyTV || !browser.supportsIMA) {\n overrides.adPlayerType = 'hls';\n }\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n\n return overrides;\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'ima':\n return supportsGoogleIMA();\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/browserCompat.cjs","../../src/utils/browserCompat.ts"],"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","browserCompat_exports","detectBrowser","getBrowserConfigOverrides","getRecommendedAdPlayer","logBrowserInfo","supportsFeature","supportsGoogleIMA","supportsModernJS","module","exports","getChromeVersion","ua","match","parseInt","getWebKitVersion","getPlatform","navigator","userAgentData","platform","userAgent","test","version","majorVersion","isSmartTV","isLegacyTV","supportsIMA","recommendedAdPlayer","webOSVersion","tizenVersion","chromeVersionNum","chromeVersion","webkitVersion","parts","split","toString","Promise","Map","Set","URLSearchParams"],"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/utils/browserCompat.ts\nvar browserCompat_exports = {};\n__export(browserCompat_exports, {\n detectBrowser: () => detectBrowser,\n getBrowserConfigOverrides: () => getBrowserConfigOverrides,\n getRecommendedAdPlayer: () => getRecommendedAdPlayer,\n logBrowserInfo: () => logBrowserInfo,\n supportsFeature: () => supportsFeature,\n supportsGoogleIMA: () => supportsGoogleIMA,\n supportsModernJS: () => supportsModernJS\n});\nmodule.exports = __toCommonJS(browserCompat_exports);\nfunction getChromeVersion(ua) {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getWebKitVersion(ua) {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\nfunction getPlatform() {\n if (\"userAgentData\" in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? \"iPhone\" : \"MacIntel\";\n }\n if (/Win/i.test(ua)) {\n return \"Win32\";\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? \"Linux armv8l\" : \"Linux x86_64\";\n }\n if (/CrOS/i.test(ua)) {\n return \"CrOS\";\n }\n return navigator.platform || \"Unknown\";\n}\nfunction detectBrowser() {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n let name = \"Unknown\";\n let version = \"0\";\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS2 = true;\n let recommendedAdPlayer = \"ima\";\n let webOSVersion;\n let tizenVersion;\n let chromeVersionNum;\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : void 0;\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = \"LG WebOS\";\n isSmartTV = true;\n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n if (match && match[1]) {\n version = match[1];\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = \"6.0\";\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = \"5.0\";\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = \"4.0\";\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = \"3.0\";\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = \"2.0\";\n majorVersion = 2;\n }\n } else {\n version = \"Unknown\";\n webOSVersion = void 0;\n }\n if (webOSVersion !== void 0 && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (webOSVersion !== void 0 && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = \"Samsung Tizen\";\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : \"Unknown\";\n if (version !== \"Unknown\") {\n const parts = version.split(\".\");\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n if (tizenVersion !== void 0 && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (tizenVersion !== void 0 && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = \"Smart TV\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = \"LG NetCast\";\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n } else if (/BRAVIA/i.test(ua)) {\n name = \"Sony BRAVIA\";\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = \"ima\";\n } else {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = \"Chrome\";\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS2 = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS2 = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n }\n }\n if (typeof Promise === \"undefined\" || typeof Map === \"undefined\" || typeof Set === \"undefined\") {\n supportsModernJS2 = false;\n supportsIMA = false;\n recommendedAdPlayer = \"hls\";\n }\n if (typeof URLSearchParams === \"undefined\") {\n supportsModernJS2 = false;\n }\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS: supportsModernJS2,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum\n };\n}\nfunction supportsGoogleIMA() {\n const browser = detectBrowser();\n if (browser.isLegacyTV) {\n return false;\n }\n if (typeof document === \"undefined\" || typeof document.createElement !== \"function\") {\n return false;\n }\n try {\n const video = document.createElement(\"video\");\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n if (typeof Promise === \"undefined\") {\n return false;\n }\n return browser.supportsIMA;\n}\nfunction getRecommendedAdPlayer() {\n const browser = detectBrowser();\n return browser.recommendedAdPlayer;\n}\nfunction supportsModernJS() {\n try {\n return typeof Promise !== \"undefined\" && typeof Map !== \"undefined\" && typeof Set !== \"undefined\" && typeof Array.from !== \"undefined\" && typeof Object.assign !== \"undefined\" && typeof Array.prototype.forEach !== \"undefined\" && typeof String.prototype.includes !== \"undefined\";\n } catch (e) {\n return false;\n }\n}\nfunction logBrowserInfo(debug = false) {\n if (!debug) return;\n const browser = detectBrowser();\n const imaSupport = supportsGoogleIMA();\n console.log(\"[StormcloudVideoPlayer] Browser Compatibility Info:\", {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsIMA: imaSupport,\n supportsModernJS: browser.supportsModernJS,\n recommendedAdPlayer: browser.recommendedAdPlayer,\n ...browser.webOSVersion !== void 0 ? { webOSVersion: browser.webOSVersion } : {},\n ...browser.tizenVersion !== void 0 ? { tizenVersion: browser.tizenVersion } : {},\n ...browser.chromeVersion !== void 0 ? { chromeVersion: browser.chromeVersion } : {},\n userAgent: navigator.userAgent\n });\n}\nfunction getBrowserConfigOverrides() {\n const browser = detectBrowser();\n const overrides = {};\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n return overrides;\n}\nfunction supportsFeature(feature) {\n switch (feature) {\n case \"ima\":\n return supportsGoogleIMA();\n case \"urlsearchparams\":\n return typeof URLSearchParams !== \"undefined\";\n case \"textencoder\":\n return typeof TextEncoder !== \"undefined\";\n case \"promises\":\n return typeof Promise !== \"undefined\";\n case \"fetch\":\n return typeof fetch !== \"undefined\";\n case \"crypto\":\n return typeof crypto !== \"undefined\" && typeof crypto.subtle !== \"undefined\";\n default:\n return false;\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n detectBrowser,\n getBrowserConfigOverrides,\n getRecommendedAdPlayer,\n logBrowserInfo,\n supportsFeature,\n supportsGoogleIMA,\n supportsModernJS\n});\n","interface NavigatorUAData {\n platform?: string;\n brands?: Array<{ brand: string; version: string }>;\n mobile?: boolean;\n}\n\ndeclare global {\n interface Navigator {\n userAgentData?: NavigatorUAData;\n }\n}\n\nexport interface BrowserInfo {\n name: string;\n version: string;\n majorVersion: number;\n isSmartTV: boolean;\n isLegacyTV: boolean;\n platform: string;\n supportsIMA: boolean;\n supportsModernJS: boolean;\n recommendedAdPlayer: 'ima' | 'hls';\n webOSVersion?: number | undefined;\n tizenVersion?: number | undefined;\n chromeVersion?: number | undefined;\n}\n\nfunction getChromeVersion(ua: string): number {\n const match = ua.match(/Chrome\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getWebKitVersion(ua: string): number {\n const match = ua.match(/AppleWebKit\\/(\\d+)/);\n return match && match[1] ? parseInt(match[1], 10) : 0;\n}\n\nfunction getPlatform(): string {\n if ('userAgentData' in navigator && navigator.userAgentData?.platform) {\n return navigator.userAgentData.platform;\n }\n\n const ua = navigator.userAgent;\n if (/Mac|iPhone|iPad|iPod/i.test(ua)) {\n return /iPhone|iPad|iPod/i.test(ua) ? 'iPhone' : 'MacIntel';\n }\n if (/Win/i.test(ua)) {\n return 'Win32';\n }\n if (/Linux/i.test(ua)) {\n return /Android/i.test(ua) ? 'Linux armv8l' : 'Linux x86_64';\n }\n if (/CrOS/i.test(ua)) {\n return 'CrOS';\n }\n\n // eslint-disable-next-line deprecation/deprecation\n return (navigator as any).platform || 'Unknown';\n}\n\nexport function detectBrowser(): BrowserInfo {\n const ua = navigator.userAgent;\n const platform = getPlatform();\n\n let name = 'Unknown';\n let version = '0';\n let majorVersion = 0;\n let isSmartTV = false;\n let isLegacyTV = false;\n let supportsIMA = true;\n let supportsModernJS = true;\n let recommendedAdPlayer: 'ima' | 'hls' = 'ima';\n let webOSVersion: number | undefined;\n let tizenVersion: number | undefined;\n let chromeVersionNum: number | undefined;\n\n const chromeVersion = getChromeVersion(ua);\n const webkitVersion = getWebKitVersion(ua);\n chromeVersionNum = chromeVersion > 0 ? chromeVersion : undefined;\n\n if (/Web0S|webOS|LG Browser|LGSTB/i.test(ua)) {\n name = 'LG WebOS';\n isSmartTV = true;\n \n let match = ua.match(/Web0S[/\\s]*([\\d.]+)/i) || ua.match(/webOS[/\\s]*([\\d.]+)/i);\n \n if (!match || !match[1]) {\n match = ua.match(/webOSTV[/\\s-]*([\\d.]+)/i) || ua.match(/webOS\\.TV[/\\s-]*([\\d.]+)/i);\n }\n \n if (match && match[1]) {\n version = match[1];\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n webOSVersion = majorVersion;\n } else if (chromeVersion > 0) {\n if (chromeVersion >= 79) {\n webOSVersion = 6;\n version = '6.0';\n majorVersion = 6;\n } else if (chromeVersion >= 68) {\n webOSVersion = 5;\n version = '5.0';\n majorVersion = 5;\n } else if (chromeVersion >= 53) {\n webOSVersion = 4;\n version = '4.0';\n majorVersion = 4;\n } else if (chromeVersion >= 38) {\n webOSVersion = 3;\n version = '3.0';\n majorVersion = 3;\n } else {\n webOSVersion = 2;\n version = '2.0';\n majorVersion = 2;\n }\n } else {\n version = 'Unknown';\n webOSVersion = undefined;\n }\n\n if (webOSVersion !== undefined && webOSVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (webOSVersion !== undefined && webOSVersion >= 3) {\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/Tizen/i.test(ua)) {\n name = 'Samsung Tizen';\n isSmartTV = true;\n const match = ua.match(/Tizen[/\\s]*([\\d.]+)/i);\n version = match && match[1] ? match[1] : 'Unknown';\n if (version !== 'Unknown') {\n const parts = version.split('.');\n majorVersion = parts[0] ? parseInt(parts[0], 10) : 0;\n tizenVersion = majorVersion;\n }\n \n if (tizenVersion !== undefined && tizenVersion >= 4) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (tizenVersion !== undefined && tizenVersion >= 3 && chromeVersion >= 47) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n isLegacyTV = false;\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/SMART-TV|SmartTV/i.test(ua)) {\n name = 'Smart TV';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else if (/NetCast/i.test(ua)) {\n name = 'LG NetCast';\n isSmartTV = true;\n isLegacyTV = true;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n } else if (/BRAVIA/i.test(ua)) {\n name = 'Sony BRAVIA';\n isSmartTV = true;\n if (chromeVersion >= 53) {\n supportsIMA = true;\n recommendedAdPlayer = 'ima';\n } else {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n isLegacyTV = true;\n }\n } else {\n if (chromeVersion > 0) {\n name = 'Chrome';\n version = chromeVersion.toString();\n majorVersion = chromeVersion;\n\n if (chromeVersion < 50) {\n supportsIMA = false;\n supportsModernJS = false;\n recommendedAdPlayer = 'hls';\n }\n }\n\n if (webkitVersion > 0 && webkitVersion < 600) {\n supportsModernJS = false;\n if (chromeVersion < 50) {\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n }\n }\n\n if (typeof Promise === 'undefined' ||\n typeof Map === 'undefined' ||\n typeof Set === 'undefined') {\n supportsModernJS = false;\n supportsIMA = false;\n recommendedAdPlayer = 'hls';\n }\n\n if (typeof URLSearchParams === 'undefined') {\n supportsModernJS = false;\n }\n\n return {\n name,\n version,\n majorVersion,\n isSmartTV,\n isLegacyTV,\n platform,\n supportsIMA,\n supportsModernJS,\n recommendedAdPlayer,\n webOSVersion,\n tizenVersion,\n chromeVersion: chromeVersionNum,\n };\n}\n\nexport function supportsGoogleIMA(): boolean {\n const browser = detectBrowser();\n\n if (browser.isLegacyTV) {\n return false;\n }\n\n if (typeof document === 'undefined' ||\n typeof document.createElement !== 'function') {\n return false;\n }\n\n try {\n const video = document.createElement('video');\n if (!video) {\n return false;\n }\n } catch (e) {\n return false;\n }\n\n if (typeof Promise === 'undefined') {\n return false;\n }\n\n return browser.supportsIMA;\n}\n\nexport function getRecommendedAdPlayer(): 'ima' | 'hls' {\n const browser = detectBrowser();\n return browser.recommendedAdPlayer;\n}\n\nexport function supportsModernJS(): boolean {\n try {\n return (\n typeof Promise !== 'undefined' &&\n typeof Map !== 'undefined' &&\n typeof Set !== 'undefined' &&\n typeof Array.from !== 'undefined' &&\n typeof Object.assign !== 'undefined' &&\n typeof Array.prototype.forEach !== 'undefined' &&\n typeof String.prototype.includes !== 'undefined'\n );\n } catch (e) {\n return false;\n }\n}\n\nexport function logBrowserInfo(debug: boolean = false): void {\n if (!debug) return;\n\n const browser = detectBrowser();\n const imaSupport = supportsGoogleIMA();\n\n console.log('[StormcloudVideoPlayer] Browser Compatibility Info:', {\n browser: `${browser.name} ${browser.version}`,\n platform: browser.platform,\n isSmartTV: browser.isSmartTV,\n isLegacyTV: browser.isLegacyTV,\n supportsIMA: imaSupport,\n supportsModernJS: browser.supportsModernJS,\n recommendedAdPlayer: browser.recommendedAdPlayer,\n ...(browser.webOSVersion !== undefined ? { webOSVersion: browser.webOSVersion } : {}),\n ...(browser.tizenVersion !== undefined ? { tizenVersion: browser.tizenVersion } : {}),\n ...(browser.chromeVersion !== undefined ? { chromeVersion: browser.chromeVersion } : {}),\n userAgent: navigator.userAgent,\n });\n}\n\nexport function getBrowserConfigOverrides(): {\n allowNativeHls?: boolean;\n} {\n const browser = detectBrowser();\n const overrides: { allowNativeHls?: boolean } = {};\n\n if (browser.isSmartTV) {\n overrides.allowNativeHls = true;\n }\n\n return overrides;\n}\n\nexport function supportsFeature(feature: string): boolean {\n switch (feature) {\n case 'ima':\n return supportsGoogleIMA();\n case 'urlsearchparams':\n return typeof URLSearchParams !== 'undefined';\n case 'textencoder':\n return typeof TextEncoder !== 'undefined';\n case 'promises':\n return typeof Promise !== 'undefined';\n case 'fetch':\n return typeof fetch !== 'undefined';\n case 'crypto':\n return typeof crypto !== 'undefined' && typeof crypto.subtle !== 'undefined';\n default:\n return false;\n }\n}\n\n"]}
@@ -31,7 +31,6 @@ declare function getRecommendedAdPlayer(): 'ima' | 'hls';
31
31
  declare function supportsModernJS(): boolean;
32
32
  declare function logBrowserInfo(debug?: boolean): void;
33
33
  declare function getBrowserConfigOverrides(): {
34
- adPlayerType?: 'ima' | 'hls';
35
34
  allowNativeHls?: boolean;
36
35
  };
37
36
  declare function supportsFeature(feature: string): boolean;
@@ -56,6 +56,30 @@ function _object_spread(target) {
56
56
  }
57
57
  return target;
58
58
  }
59
+ function ownKeys(object, enumerableOnly) {
60
+ var keys = Object.keys(object);
61
+ if (Object.getOwnPropertySymbols) {
62
+ var symbols = Object.getOwnPropertySymbols(object);
63
+ if (enumerableOnly) {
64
+ symbols = symbols.filter(function(sym) {
65
+ return Object.getOwnPropertyDescriptor(object, sym).enumerable;
66
+ });
67
+ }
68
+ keys.push.apply(keys, symbols);
69
+ }
70
+ return keys;
71
+ }
72
+ function _object_spread_props(target, source) {
73
+ source = source != null ? source : {};
74
+ if (Object.getOwnPropertyDescriptors) {
75
+ Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));
76
+ } else {
77
+ ownKeys(Object(source)).forEach(function(key) {
78
+ Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));
79
+ });
80
+ }
81
+ return target;
82
+ }
59
83
  function _type_of(obj) {
60
84
  "@swc/helpers - typeof";
61
85
  return obj && typeof Symbol !== "undefined" && obj.constructor === Symbol ? "symbol" : typeof obj;
@@ -214,6 +238,15 @@ __export(tracking_exports, {
214
238
  getClientInfo: function getClientInfo1() {
215
239
  return getClientInfo;
216
240
  },
241
+ sendAdDetectTracking: function sendAdDetectTracking1() {
242
+ return sendAdDetectTracking;
243
+ },
244
+ sendAdImpressionTracking: function sendAdImpressionTracking1() {
245
+ return sendAdImpressionTracking;
246
+ },
247
+ sendAdLoadedTracking: function sendAdLoadedTracking1() {
248
+ return sendAdLoadedTracking;
249
+ },
217
250
  sendHeartbeat: function sendHeartbeat1() {
218
251
  return sendHeartbeat;
219
252
  },
@@ -451,6 +484,45 @@ function getBrowserID(clientInfo) {
451
484
  });
452
485
  })();
453
486
  }
487
+ var TRACK_URL = "https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track";
488
+ function sendTrackRequest(licenseKey, body) {
489
+ return _async_to_generator(function() {
490
+ var headers, response;
491
+ return _ts_generator(this, function(_state) {
492
+ switch(_state.label){
493
+ case 0:
494
+ headers = {
495
+ "Content-Type": "application/json"
496
+ };
497
+ if (licenseKey) {
498
+ headers["Authorization"] = "Bearer ".concat(licenseKey);
499
+ }
500
+ return [
501
+ 4,
502
+ fetch(TRACK_URL, {
503
+ method: "POST",
504
+ headers: headers,
505
+ body: JSON.stringify(body)
506
+ })
507
+ ];
508
+ case 1:
509
+ response = _state.sent();
510
+ if (!response.ok) {
511
+ throw new Error("HTTP error! status: ".concat(response.status));
512
+ }
513
+ return [
514
+ 4,
515
+ response.json()
516
+ ];
517
+ case 2:
518
+ _state.sent();
519
+ return [
520
+ 2
521
+ ];
522
+ }
523
+ });
524
+ })();
525
+ }
454
526
  function sendInitialTracking(licenseKey) {
455
527
  return _async_to_generator(function() {
456
528
  var clientInfo, browserId, trackingData, headers, response, error;
@@ -481,7 +553,7 @@ function sendInitialTracking(licenseKey) {
481
553
  }
482
554
  return [
483
555
  4,
484
- fetch("https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track", {
556
+ fetch(TRACK_URL, {
485
557
  method: "POST",
486
558
  headers: headers,
487
559
  body: JSON.stringify(trackingData)
@@ -517,6 +589,156 @@ function sendInitialTracking(licenseKey) {
517
589
  });
518
590
  })();
519
591
  }
592
+ function sendAdDetectTracking(licenseKey, adDetectInfo) {
593
+ return _async_to_generator(function() {
594
+ var clientInfo, browserId, trackingData, error;
595
+ return _ts_generator(this, function(_state) {
596
+ switch(_state.label){
597
+ case 0:
598
+ _state.trys.push([
599
+ 0,
600
+ 3,
601
+ ,
602
+ 4
603
+ ]);
604
+ clientInfo = getClientInfo();
605
+ return [
606
+ 4,
607
+ getBrowserID(clientInfo)
608
+ ];
609
+ case 1:
610
+ browserId = _state.sent();
611
+ trackingData = _object_spread({
612
+ browserId: browserId
613
+ }, clientInfo);
614
+ return [
615
+ 4,
616
+ sendTrackRequest(licenseKey, _object_spread_props(_object_spread({}, trackingData), {
617
+ licenseKey: licenseKey,
618
+ adDetectInfo: adDetectInfo
619
+ }))
620
+ ];
621
+ case 2:
622
+ _state.sent();
623
+ return [
624
+ 3,
625
+ 4
626
+ ];
627
+ case 3:
628
+ error = _state.sent();
629
+ console.error("[StormcloudVideoPlayer] Error sending ad detect tracking:", error);
630
+ return [
631
+ 3,
632
+ 4
633
+ ];
634
+ case 4:
635
+ return [
636
+ 2
637
+ ];
638
+ }
639
+ });
640
+ })();
641
+ }
642
+ function sendAdLoadedTracking(licenseKey, adLoadedInfo) {
643
+ return _async_to_generator(function() {
644
+ var clientInfo, browserId, trackingData, error;
645
+ return _ts_generator(this, function(_state) {
646
+ switch(_state.label){
647
+ case 0:
648
+ _state.trys.push([
649
+ 0,
650
+ 3,
651
+ ,
652
+ 4
653
+ ]);
654
+ clientInfo = getClientInfo();
655
+ return [
656
+ 4,
657
+ getBrowserID(clientInfo)
658
+ ];
659
+ case 1:
660
+ browserId = _state.sent();
661
+ trackingData = _object_spread({
662
+ browserId: browserId
663
+ }, clientInfo);
664
+ return [
665
+ 4,
666
+ sendTrackRequest(licenseKey, _object_spread_props(_object_spread({}, trackingData), {
667
+ licenseKey: licenseKey,
668
+ adLoadedInfo: adLoadedInfo
669
+ }))
670
+ ];
671
+ case 2:
672
+ _state.sent();
673
+ return [
674
+ 3,
675
+ 4
676
+ ];
677
+ case 3:
678
+ error = _state.sent();
679
+ console.error("[StormcloudVideoPlayer] Error sending ad loaded tracking:", error);
680
+ return [
681
+ 3,
682
+ 4
683
+ ];
684
+ case 4:
685
+ return [
686
+ 2
687
+ ];
688
+ }
689
+ });
690
+ })();
691
+ }
692
+ function sendAdImpressionTracking(licenseKey, adImpressionInfo) {
693
+ return _async_to_generator(function() {
694
+ var clientInfo, browserId, trackingData, error;
695
+ return _ts_generator(this, function(_state) {
696
+ switch(_state.label){
697
+ case 0:
698
+ _state.trys.push([
699
+ 0,
700
+ 3,
701
+ ,
702
+ 4
703
+ ]);
704
+ clientInfo = getClientInfo();
705
+ return [
706
+ 4,
707
+ getBrowserID(clientInfo)
708
+ ];
709
+ case 1:
710
+ browserId = _state.sent();
711
+ trackingData = _object_spread({
712
+ browserId: browserId
713
+ }, clientInfo);
714
+ return [
715
+ 4,
716
+ sendTrackRequest(licenseKey, _object_spread_props(_object_spread({}, trackingData), {
717
+ licenseKey: licenseKey,
718
+ adImpressionInfo: adImpressionInfo
719
+ }))
720
+ ];
721
+ case 2:
722
+ _state.sent();
723
+ return [
724
+ 3,
725
+ 4
726
+ ];
727
+ case 3:
728
+ error = _state.sent();
729
+ console.error("[StormcloudVideoPlayer] Error sending ad impression tracking:", error);
730
+ return [
731
+ 3,
732
+ 4
733
+ ];
734
+ case 4:
735
+ return [
736
+ 2
737
+ ];
738
+ }
739
+ });
740
+ })();
741
+ }
520
742
  function sendHeartbeat(licenseKey) {
521
743
  return _async_to_generator(function() {
522
744
  var clientInfo, browserId, heartbeatData, headers, response, error;
@@ -588,6 +810,9 @@ function sendHeartbeat(licenseKey) {
588
810
  0 && (module.exports = {
589
811
  getBrowserID: getBrowserID,
590
812
  getClientInfo: getClientInfo,
813
+ sendAdDetectTracking: sendAdDetectTracking,
814
+ sendAdImpressionTracking: sendAdImpressionTracking,
815
+ sendAdLoadedTracking: sendAdLoadedTracking,
591
816
  sendHeartbeat: sendHeartbeat,
592
817
  sendInitialTracking: sendInitialTracking
593
818
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/tracking.ts"],"names":["__getOwnPropNames","Object","__defProp","defineProperty","__getOwnPropDesc","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","enumerable","__toCommonJS","tracking_exports","__copyProps","to","from","except","desc","call","key","mod","value","getBrowserID","sendHeartbeat","screen","orientation","type","getClientInfo","sendInitialTracking","module","exports","cachedBrowserId","ua","navigator","userAgent","window","platform","vendor","maxTouchPoints","memory","deviceMemory","hardwareConcurrency","width","height","availWidth","availHeight","pixelDepth","deviceType","model","isSmartTV","isWebView","isWebApp","os","includes","brand","webosMatch","match","tizenMatch","tvMatch","trim"],"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/utils/tracking.ts\nvar tracking_exports = {};\n__export(tracking_exports, {\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\n sendHeartbeat: () => sendHeartbeat,\n sendInitialTracking: () => sendInitialTracking\n});\nmodule.exports = __toCommonJS(tracking_exports);\nvar cachedBrowserId = null;\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 getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n const fingerprintString = JSON.stringify(clientInfo);\n if (typeof crypto !== \"undefined\" && crypto.subtle && 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(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\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 const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.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 cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\nasync function sendInitialTracking(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = {\n browserId,\n ...clientInfo\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const heartbeatData = {\n browserId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n getBrowserID,\n getClientInfo,\n sendHeartbeat,\n sendInitialTracking\n});\n","import type { ClientInfo, TrackingData, HeartbeatData } from \"../types\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function getClientInfo(): ClientInfo {\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 as any).deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: (screen?.orientation as any)?.type || \"\",\n pixelDepth: screen?.pixelDepth,\n };\n\n let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"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\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\n ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n : \"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 (\n ua.includes(\"Android\") &&\n (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n ) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n ) {\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\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n if (\n ua.includes(\"Android\") &&\n (maxTouchPoints === 0 ||\n ua.includes(\"Google TV\") ||\n ua.includes(\"XiaoMi\"))\n ) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\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\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\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\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n\n isWebApp =\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n (window.navigator as any).standalone === true ||\n window.screen?.orientation?.angle !== undefined;\n\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}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n\n const fingerprintString = JSON.stringify(clientInfo);\n\n if (typeof crypto !== \"undefined\" && crypto.subtle && crypto.subtle.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n let encodedData: BufferSource;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\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\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash\"\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\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\n cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\n\nexport async function sendInitialTracking(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const trackingData: TrackingData = {\n browserId,\n ...clientInfo,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const heartbeatData: HeartbeatData = {\n browserId,\n timestamp: new Date().toISOString(),\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"]}
1
+ {"version":3,"sources":["/home/ubuntu24-new/Dev/stormcloud-vp/lib/utils/tracking.cjs","../../src/utils/tracking.ts"],"names":["__defProp","Object","__getOwnPropDesc","__getOwnPropNames","enumerable","defineProperty","getOwnPropertyDescriptor","getOwnPropertyNames","__hasOwnProp","prototype","hasOwnProperty","__export","target","all","name","get","__copyProps","to","from","except","desc","key","__toCommonJS","mod","value","tracking_exports","getClientInfo","exports","getBrowserID","sendAdDetectTracking","sendAdImpressionTracking","sendAdLoadedTracking","sendHeartbeat","sendInitialTracking","cachedBrowserId","screen","window","navigator","vendor","maxTouchPoints","hardwareConcurrency","screenInfo","width","height","availWidth","availHeight","orientation","type","deviceType","brand","os","isAndroid","isWebView","ua","includes","isSmartTV","webosMatch","match","model","tizenMatch","tvMatch","trim","test","androidModelMatch"],"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/utils/tracking.ts\nvar tracking_exports = {};\n__export(tracking_exports, {\n getBrowserID: () => getBrowserID,\n getClientInfo: () => getClientInfo,\n sendAdDetectTracking: () => sendAdDetectTracking,\n sendAdImpressionTracking: () => sendAdImpressionTracking,\n sendAdLoadedTracking: () => sendAdLoadedTracking,\n sendHeartbeat: () => sendHeartbeat,\n sendInitialTracking: () => sendInitialTracking\n});\nmodule.exports = __toCommonJS(tracking_exports);\nvar cachedBrowserId = null;\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 getBrowserID(clientInfo) {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n const fingerprintString = JSON.stringify(clientInfo);\n if (typeof crypto !== \"undefined\" && crypto.subtle && 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(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\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 const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash\"\n );\n }\n }\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.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 cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\nvar TRACK_URL = \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\";\nasync function sendTrackRequest(licenseKey, body) {\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body)\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n}\nasync function sendInitialTracking(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = {\n browserId,\n ...clientInfo\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData)\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\nasync function sendAdDetectTracking(licenseKey, adDetectInfo) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = { browserId, ...clientInfo };\n await sendTrackRequest(licenseKey, {\n ...trackingData,\n licenseKey,\n adDetectInfo\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\nasync function sendAdLoadedTracking(licenseKey, adLoadedInfo) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = { browserId, ...clientInfo };\n await sendTrackRequest(licenseKey, {\n ...trackingData,\n licenseKey,\n adLoadedInfo\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\nasync function sendAdImpressionTracking(licenseKey, adImpressionInfo) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData = { browserId, ...clientInfo };\n await sendTrackRequest(licenseKey, {\n ...trackingData,\n licenseKey,\n adImpressionInfo\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\nasync function sendHeartbeat(licenseKey) {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const heartbeatData = {\n browserId,\n timestamp: (/* @__PURE__ */ new Date()).toISOString()\n };\n const headers = {\n \"Content-Type\": \"application/json\"\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData)\n }\n );\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n// Annotate the CommonJS export names for ESM import in node:\n0 && (module.exports = {\n getBrowserID,\n getClientInfo,\n sendAdDetectTracking,\n sendAdImpressionTracking,\n sendAdLoadedTracking,\n sendHeartbeat,\n sendInitialTracking\n});\n","import type {\n ClientInfo,\n TrackingData,\n HeartbeatData,\n AdDetectInfo,\n AdLoadedInfo,\n AdImpressionInfo,\n} from \"../types\";\n\nlet cachedBrowserId: string | null = null;\n\nexport function getClientInfo(): ClientInfo {\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 as any).deviceMemory || null;\n const hardwareConcurrency = navigator.hardwareConcurrency || 1;\n\n const screenInfo = {\n width: screen?.width,\n height: screen?.height,\n availWidth: screen?.availWidth,\n availHeight: screen?.availHeight,\n orientation: (screen?.orientation as any)?.type || \"\",\n pixelDepth: screen?.pixelDepth,\n };\n\n let deviceType: \"tv\" | \"mobile\" | \"tablet\" | \"desktop\" = \"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\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\n ? `Tizen ${tizenMatch[1]} ${tvMatch}`.trim()\n : \"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 (\n ua.includes(\"Android\") &&\n (ua.includes(\"Sony\") || vendor.includes(\"Sony\"))\n ) {\n brand = \"Sony\";\n os = \"Android TV\";\n isSmartTV = true;\n deviceType = \"tv\";\n } else if (\n ua.includes(\"Android\") &&\n (ua.includes(\"NetCast\") || ua.includes(\"LG\"))\n ) {\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\n if (ua.includes(\"Android\")) {\n isAndroid = true;\n os = \"Android\";\n deviceType = /Mobile/.test(ua) ? \"mobile\" : \"tablet\";\n\n if (\n ua.includes(\"Android\") &&\n (maxTouchPoints === 0 ||\n ua.includes(\"Google TV\") ||\n ua.includes(\"XiaoMi\"))\n ) {\n deviceType = \"tv\";\n isSmartTV = true;\n brand = brand === \"Unknown\" ? \"Android TV\" : brand;\n }\n\n const androidModelMatch = ua.match(/\\(([^)]*Android[^)]*)\\)/);\n if (androidModelMatch && androidModelMatch[1]) {\n model = androidModelMatch[1];\n }\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\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\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\n isWebView = /wv|WebView|Linux; U;/.test(ua);\n\n if (window?.outerHeight === 0 && window?.outerWidth === 0) {\n isWebView = true;\n }\n\n isWebApp =\n window.matchMedia(\"(display-mode: standalone)\").matches ||\n (window.navigator as any).standalone === true ||\n window.screen?.orientation?.angle !== undefined;\n\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}\n\nexport async function getBrowserID(clientInfo: ClientInfo): Promise<string> {\n if (cachedBrowserId) {\n return cachedBrowserId;\n }\n\n const fingerprintString = JSON.stringify(clientInfo);\n\n if (typeof crypto !== \"undefined\" && crypto.subtle && crypto.subtle.digest) {\n try {\n await crypto.subtle.digest(\"SHA-256\", new Uint8Array([1, 2, 3]));\n\n let encodedData: BufferSource;\n if (typeof TextEncoder !== \"undefined\") {\n encodedData = new TextEncoder().encode(fingerprintString);\n } else {\n const utf8 = unescape(encodeURIComponent(fingerprintString));\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\n const hashBuffer = await crypto.subtle.digest(\"SHA-256\", encodedData);\n const hashArray = Array.from(new Uint8Array(hashBuffer));\n const hashHex = hashArray\n .map((b) => b.toString(16).padStart(2, \"0\"))\n .join(\"\");\n cachedBrowserId = hashHex;\n return hashHex;\n } catch (error) {\n console.warn(\n \"[StormcloudVideoPlayer] crypto.subtle.digest not supported, using fallback hash\"\n );\n }\n }\n\n let hash = 0;\n for (let i = 0; i < fingerprintString.length; i++) {\n const char = fingerprintString.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash;\n }\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\n cachedBrowserId = (fallbackHash + timestamp + random).padEnd(64, \"0\");\n return cachedBrowserId;\n}\n\nconst TRACK_URL =\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/track\";\n\nasync function sendTrackRequest(\n licenseKey: string | undefined,\n body: Record<string, unknown>\n): Promise<void> {\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n });\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n await response.json();\n}\n\nexport async function sendInitialTracking(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const trackingData: TrackingData = {\n browserId,\n ...clientInfo,\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(TRACK_URL, {\n method: \"POST\",\n headers,\n body: JSON.stringify(trackingData),\n });\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending initial tracking data:\",\n error\n );\n }\n}\n\nexport async function sendAdDetectTracking(\n licenseKey: string | undefined,\n adDetectInfo: AdDetectInfo\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData: TrackingData = { browserId, ...clientInfo };\n await sendTrackRequest(licenseKey, {\n ...trackingData,\n licenseKey,\n adDetectInfo,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad detect tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdLoadedTracking(\n licenseKey: string | undefined,\n adLoadedInfo: AdLoadedInfo\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData: TrackingData = { browserId, ...clientInfo };\n await sendTrackRequest(licenseKey, {\n ...trackingData,\n licenseKey,\n adLoadedInfo,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad loaded tracking:\",\n error\n );\n }\n}\n\nexport async function sendAdImpressionTracking(\n licenseKey: string | undefined,\n adImpressionInfo: AdImpressionInfo\n): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n const trackingData: TrackingData = { browserId, ...clientInfo };\n await sendTrackRequest(licenseKey, {\n ...trackingData,\n licenseKey,\n adImpressionInfo,\n });\n } catch (error) {\n console.error(\n \"[StormcloudVideoPlayer] Error sending ad impression tracking:\",\n error\n );\n }\n}\n\nexport async function sendHeartbeat(licenseKey?: string): Promise<void> {\n try {\n const clientInfo = getClientInfo();\n const browserId = await getBrowserID(clientInfo);\n\n const heartbeatData: HeartbeatData = {\n browserId,\n timestamp: new Date().toISOString(),\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (licenseKey) {\n headers[\"Authorization\"] = `Bearer ${licenseKey}`;\n }\n\n const response = await fetch(\n \"https://adstorm.co/api-adstorm-dev/adstorm/player-tracking/heartbeat\",\n {\n method: \"POST\",\n headers,\n body: JSON.stringify(heartbeatData),\n }\n );\n\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n await response.json();\n } catch (error) {\n console.error(\"[StormcloudVideoPlayer] Error sending heartbeat:\", error);\n }\n}\n"]}
@@ -1,8 +1,11 @@
1
- import { C as ClientInfo } from '../types-CRi_KrjM.cjs';
1
+ import { C as ClientInfo, a as AdDetectInfo, b as AdImpressionInfo, c as AdLoadedInfo } from '../types-BOJiWNWa.cjs';
2
2
 
3
3
  declare function getClientInfo(): ClientInfo;
4
4
  declare function getBrowserID(clientInfo: ClientInfo): Promise<string>;
5
5
  declare function sendInitialTracking(licenseKey?: string): Promise<void>;
6
+ declare function sendAdDetectTracking(licenseKey: string | undefined, adDetectInfo: AdDetectInfo): Promise<void>;
7
+ declare function sendAdLoadedTracking(licenseKey: string | undefined, adLoadedInfo: AdLoadedInfo): Promise<void>;
8
+ declare function sendAdImpressionTracking(licenseKey: string | undefined, adImpressionInfo: AdImpressionInfo): Promise<void>;
6
9
  declare function sendHeartbeat(licenseKey?: string): Promise<void>;
7
10
 
8
- export { getBrowserID, getClientInfo, sendHeartbeat, sendInitialTracking };
11
+ export { getBrowserID, getClientInfo, sendAdDetectTracking, sendAdImpressionTracking, sendAdLoadedTracking, sendHeartbeat, sendInitialTracking };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "stormcloud-video-player",
3
- "version": "0.5.5",
3
+ "version": "0.5.7",
4
4
  "main": "lib/index.js",
5
5
  "typings": "lib/index.d.ts",
6
6
  "scripts": {